summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_ai_script_commands.c17
-rw-r--r--src/battle_ai_switch_items.c6
-rw-r--r--src/battle_anim.c21
-rw-r--r--src/battle_anim_80A5C6C.c12
-rw-r--r--src/battle_anim_80A9C70.c8
-rw-r--r--src/battle_anim_sound_tasks.c8
-rw-r--r--src/battle_arena.c928
-rw-r--r--src/battle_controller_link_opponent.c32
-rw-r--r--src/battle_controller_link_partner.c32
-rw-r--r--src/battle_controller_opponent.c47
-rw-r--r--src/battle_controller_player.c56
-rw-r--r--src/battle_controller_player_partner.c32
-rw-r--r--src/battle_controller_recorded_opponent.c36
-rw-r--r--src/battle_controller_recorded_player.c30
-rw-r--r--src/battle_controller_safari.c28
-rw-r--r--src/battle_controller_wally.c42
-rw-r--r--src/battle_controllers.c10
-rw-r--r--src/battle_dome.c36
-rw-r--r--src/battle_factory.c4397
-rw-r--r--src/battle_factory_screen.c4111
-rw-r--r--src/battle_frontier_1.c118
-rw-r--r--src/battle_interface.c4
-rw-r--r--src/battle_main.c88
-rw-r--r--src/battle_palace.c187
-rw-r--r--src/battle_pike.c1271
-rw-r--r--src/battle_pyramid_bag.c32
-rw-r--r--src/battle_script_commands.c43
-rw-r--r--src/battle_setup.c4
-rw-r--r--src/battle_tent.c256
-rw-r--r--src/battle_tower.c179
-rw-r--r--src/battle_transition.c26
-rw-r--r--src/battle_util.c4
-rw-r--r--src/berry.c87
-rw-r--r--src/bike.c4
-rw-r--r--src/braille_puzzles.c1
-rwxr-xr-xsrc/data/field_event_obj/field_effect_objects.h28
-rw-r--r--src/decoration.c20
-rw-r--r--src/event_object_movement.c399
-rw-r--r--src/field_camera.c376
-rw-r--r--src/field_control_avatar.c57
-rw-r--r--src/field_door.c6
-rw-r--r--src/field_effect.c646
-rwxr-xr-xsrc/field_effect_helpers.c77
-rw-r--r--src/field_player_avatar.c164
-rw-r--r--src/field_poison.c64
-rw-r--r--src/field_region_map.c18
-rw-r--r--src/field_specials.c11
-rw-r--r--src/field_tasks.c28
-rw-r--r--src/fieldmap.c6
-rw-r--r--src/fldeff_cut.c1
-rw-r--r--src/fldeff_escalator.c4
-rw-r--r--src/fldeff_flash.c7
-rw-r--r--src/fldeff_groundshake.c7
-rw-r--r--src/fldeff_softboiled.c2
-rw-r--r--src/fldeff_strength.c1
-rw-r--r--src/fldeff_sweetscent.c31
-rw-r--r--src/fldeff_teleport.c19
-rw-r--r--src/frontier_util.c4
-rw-r--r--src/hof_pc.c2
-rwxr-xr-xsrc/item_menu.c3
-rwxr-xr-xsrc/item_use.c4
-rw-r--r--src/metatile_behavior.c2
-rw-r--r--src/overworld.c82
-rw-r--r--src/pokeball.c20
-rw-r--r--src/pokeblock.c48
-rw-r--r--src/pokeblock_feed.c34
-rw-r--r--src/pokedex.c43
-rw-r--r--src/pokemon.c63
-rw-r--r--src/pokemon_animation.c6
-rw-r--r--src/pokemon_icon.c6
-rw-r--r--src/pokemon_size_record.c6
-rw-r--r--src/pokemon_storage_system.c30
-rw-r--r--src/rom6.c22
-rw-r--r--src/start_menu.c3
-rw-r--r--src/time_events.c2
-rw-r--r--src/trainer_see.c15
-rw-r--r--src/wallclock.c187
-rw-r--r--src/wild_encounter.c4
78 files changed, 8877 insertions, 5874 deletions
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index e89d308f5..3e7064eb5 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -1,17 +1,18 @@
#include "global.h"
-#include "battle_ai_script_commands.h"
-#include "pokemon.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_factory.h"
#include "battle_setup.h"
+#include "item.h"
+#include "pokemon.h"
+#include "random.h"
#include "recorded_battle.h"
-#include "constants/species.h"
+#include "util.h"
#include "constants/abilities.h"
-#include "random.h"
-#include "item.h"
+#include "constants/battle_ai.h"
#include "constants/battle_move_effects.h"
#include "constants/moves.h"
-#include "util.h"
-#include "constants/battle_ai.h"
+#include "constants/species.h"
#define AI_ACTION_DONE 0x0001
#define AI_ACTION_FLEE 0x0002
@@ -44,8 +45,6 @@ AI scripts.
extern const u8 *const gBattleAI_ScriptsTable[];
-extern u32 GetAiScriptsInBattleFactory();
-
static u8 ChooseMoveOrAction_Singles(void);
static u8 ChooseMoveOrAction_Doubles(void);
static void RecordLastUsedMoveByTarget(void);
diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c
index 40fffd6e5..71d0e8381 100644
--- a/src/battle_ai_switch_items.c
+++ b/src/battle_ai_switch_items.c
@@ -1,13 +1,13 @@
#include "global.h"
#include "battle.h"
#include "battle_controllers.h"
-#include "constants/abilities.h"
-#include "constants/moves.h"
#include "pokemon.h"
-#include "constants/species.h"
#include "random.h"
#include "util.h"
+#include "constants/abilities.h"
#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/species.h"
// this file's functions
static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng);
diff --git a/src/battle_anim.c b/src/battle_anim.c
index aa9637889..5c34d6a43 100644
--- a/src/battle_anim.c
+++ b/src/battle_anim.c
@@ -1,21 +1,22 @@
#include "global.h"
#include "battle.h"
#include "battle_anim.h"
-#include "constants/battle_anim.h"
-#include "sprite.h"
-#include "contest.h"
-#include "m4a.h"
-#include "pokemon.h"
+#include "battle_controllers.h"
#include "battle_interface.h"
-#include "task.h"
+#include "bg.h"
+#include "contest.h"
#include "decompress.h"
-#include "sound.h"
-#include "graphics.h"
#include "dma3.h"
-#include "bg.h"
#include "gpu_regs.h"
-#include "palette.h"
+#include "graphics.h"
#include "main.h"
+#include "m4a.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "constants/battle_anim.h"
#define ANIM_SPRITE_INDEX_COUNT 8
diff --git a/src/battle_anim_80A5C6C.c b/src/battle_anim_80A5C6C.c
index ebe1718b7..d213e4831 100644
--- a/src/battle_anim_80A5C6C.c
+++ b/src/battle_anim_80A5C6C.c
@@ -1,21 +1,21 @@
#include "global.h"
-#include "constants/battle_anim.h"
-#include "constants/species.h"
#include "battle.h"
#include "battle_anim.h"
+#include "bg.h"
#include "contest.h"
#include "data2.h"
#include "decompress.h"
+#include "dma3.h"
+#include "gpu_regs.h"
+#include "malloc.h"
#include "palette.h"
#include "pokemon_icon.h"
#include "sprite.h"
#include "task.h"
#include "trig.h"
#include "util.h"
-#include "gpu_regs.h"
-#include "bg.h"
-#include "malloc.h"
-#include "dma3.h"
+#include "constants/battle_anim.h"
+#include "constants/species.h"
#define GET_UNOWN_LETTER(personality) (( \
(((personality & 0x03000000) >> 24) << 6) \
diff --git a/src/battle_anim_80A9C70.c b/src/battle_anim_80A9C70.c
index 89c945ca4..5401247b8 100644
--- a/src/battle_anim_80A9C70.c
+++ b/src/battle_anim_80A9C70.c
@@ -1,15 +1,15 @@
#include "global.h"
#include "battle.h"
#include "battle_anim.h"
-#include "constants/battle_anim.h"
-#include "constants/rgb.h"
-#include "util.h"
#include "decompress.h"
+#include "gpu_regs.h"
#include "palette.h"
#include "sprite.h"
#include "task.h"
#include "trig.h"
-#include "gpu_regs.h"
+#include "util.h"
+#include "constants/battle_anim.h"
+#include "constants/rgb.h"
extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c
index 7b8eb4ed7..b49a6d03f 100644
--- a/src/battle_anim_sound_tasks.c
+++ b/src/battle_anim_sound_tasks.c
@@ -1,11 +1,11 @@
#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"
+#include "sound.h"
+#include "task.h"
+#include "constants/battle_anim.h"
+#include "constants/species.h"
// this file's functions
static void sub_8158B98(u8 taskId);
diff --git a/src/battle_arena.c b/src/battle_arena.c
new file mode 100644
index 000000000..4b47dcaf1
--- /dev/null
+++ b/src/battle_arena.c
@@ -0,0 +1,928 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_arena.h"
+#include "battle_message.h"
+#include "battle_setup.h"
+#include "battle_tower.h"
+#include "bg.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "frontier_util.h"
+#include "gpu_regs.h"
+#include "item.h"
+#include "m4a.h"
+#include "overworld.h"
+#include "palette.h"
+#include "random.h"
+#include "sound.h"
+#include "text.h"
+#include "util.h"
+#include "constants/songs.h"
+#include "constants/battle_string_ids.h"
+#include "constants/battle_frontier.h"
+#include "constants/moves.h"
+
+extern u16 gBattle_WIN0H;
+extern u16 gBattle_WIN0V;
+
+extern const u32 gUnknown_08D854E8[];
+extern const u16 gUnknown_08D855E8[];
+
+// This file's functions.
+static void sub_81A58B4(void);
+static void sub_81A5964(void);
+static void sub_81A59FC(void);
+static void sub_81A5AC4(void);
+static void sub_81A5B08(void);
+static void sub_81A5B88(void);
+static void sub_81A5BE0(void);
+static void SpriteCb_JudgmentIcon(struct Sprite *sprite);
+static void ShowJudgmentSprite(u8 x, u8 y, u8 arg2, u8 battler);
+
+// Const rom data.
+static const s8 sMindRatings[] =
+{
+ [MOVE_NONE] = 0,
+ [MOVE_POUND] = 1,
+ [MOVE_KARATE_CHOP] = 1,
+ [MOVE_DOUBLE_SLAP] = 1,
+ [MOVE_COMET_PUNCH] = 1,
+ [MOVE_MEGA_PUNCH] = 1,
+ [MOVE_PAY_DAY] = 1,
+ [MOVE_FIRE_PUNCH] = 1,
+ [MOVE_ICE_PUNCH] = 1,
+ [MOVE_THUNDER_PUNCH] = 1,
+ [MOVE_SCRATCH] = 1,
+ [MOVE_VICE_GRIP] = 1,
+ [MOVE_GUILLOTINE] = 1,
+ [MOVE_RAZOR_WIND] = 1,
+ [MOVE_SWORDS_DANCE] = 0,
+ [MOVE_CUT] = 1,
+ [MOVE_GUST] = 1,
+ [MOVE_WING_ATTACK] = 1,
+ [MOVE_WHIRLWIND] = 0,
+ [MOVE_FLY] = 1,
+ [MOVE_BIND] = 1,
+ [MOVE_SLAM] = 1,
+ [MOVE_VINE_WHIP] = 1,
+ [MOVE_STOMP] = 1,
+ [MOVE_DOUBLE_KICK] = 1,
+ [MOVE_MEGA_KICK] = 1,
+ [MOVE_JUMP_KICK] = 1,
+ [MOVE_ROLLING_KICK] = 1,
+ [MOVE_SAND_ATTACK] = 0,
+ [MOVE_HEADBUTT] = 1,
+ [MOVE_HORN_ATTACK] = 1,
+ [MOVE_FURY_ATTACK] = 1,
+ [MOVE_HORN_DRILL] = 1,
+ [MOVE_TACKLE] = 1,
+ [MOVE_BODY_SLAM] = 1,
+ [MOVE_WRAP] = 1,
+ [MOVE_TAKE_DOWN] = 1,
+ [MOVE_THRASH] = 1,
+ [MOVE_DOUBLE_EDGE] = 1,
+ [MOVE_TAIL_WHIP] = 0,
+ [MOVE_POISON_STING] = 1,
+ [MOVE_TWINEEDLE] = 1,
+ [MOVE_PIN_MISSILE] = 1,
+ [MOVE_LEER] = 0,
+ [MOVE_BITE] = 1,
+ [MOVE_GROWL] = 0,
+ [MOVE_ROAR] = 0,
+ [MOVE_SING] = 0,
+ [MOVE_SUPERSONIC] = 0,
+ [MOVE_SONIC_BOOM] = 1,
+ [MOVE_DISABLE] = 0,
+ [MOVE_ACID] = 1,
+ [MOVE_EMBER] = 1,
+ [MOVE_FLAMETHROWER] = 1,
+ [MOVE_MIST] = 0,
+ [MOVE_WATER_GUN] = 1,
+ [MOVE_HYDRO_PUMP] = 1,
+ [MOVE_SURF] = 1,
+ [MOVE_ICE_BEAM] = 1,
+ [MOVE_BLIZZARD] = 1,
+ [MOVE_PSYBEAM] = 1,
+ [MOVE_BUBBLE_BEAM] = 1,
+ [MOVE_AURORA_BEAM] = 1,
+ [MOVE_HYPER_BEAM] = 1,
+ [MOVE_PECK] = 1,
+ [MOVE_DRILL_PECK] = 1,
+ [MOVE_SUBMISSION] = 1,
+ [MOVE_LOW_KICK] = 1,
+ [MOVE_COUNTER] = 0,
+ [MOVE_SEISMIC_TOSS] = 1,
+ [MOVE_STRENGTH] = 1,
+ [MOVE_ABSORB] = 1,
+ [MOVE_MEGA_DRAIN] = 1,
+ [MOVE_LEECH_SEED] = 0,
+ [MOVE_GROWTH] = 0,
+ [MOVE_RAZOR_LEAF] = 1,
+ [MOVE_SOLAR_BEAM] = 1,
+ [MOVE_POISON_POWDER] = 0,
+ [MOVE_STUN_SPORE] = 0,
+ [MOVE_SLEEP_POWDER] = 0,
+ [MOVE_PETAL_DANCE] = 1,
+ [MOVE_STRING_SHOT] = 0,
+ [MOVE_DRAGON_RAGE] = 1,
+ [MOVE_FIRE_SPIN] = 1,
+ [MOVE_THUNDER_SHOCK] = 1,
+ [MOVE_THUNDERBOLT] = 1,
+ [MOVE_THUNDER_WAVE] = 0,
+ [MOVE_THUNDER] = 1,
+ [MOVE_ROCK_THROW] = 1,
+ [MOVE_EARTHQUAKE] = 1,
+ [MOVE_FISSURE] = 1,
+ [MOVE_DIG] = 1,
+ [MOVE_TOXIC] = 0,
+ [MOVE_CONFUSION] = 1,
+ [MOVE_PSYCHIC] = 1,
+ [MOVE_HYPNOSIS] = 0,
+ [MOVE_MEDITATE] = 0,
+ [MOVE_AGILITY] = 0,
+ [MOVE_QUICK_ATTACK] = 1,
+ [MOVE_RAGE] = 1,
+ [MOVE_TELEPORT] = 0,
+ [MOVE_NIGHT_SHADE] = 1,
+ [MOVE_MIMIC] = 0,
+ [MOVE_SCREECH] = 0,
+ [MOVE_DOUBLE_TEAM] = 0,
+ [MOVE_RECOVER] = 0,
+ [MOVE_HARDEN] = 0,
+ [MOVE_MINIMIZE] = 0,
+ [MOVE_SMOKESCREEN] = 0,
+ [MOVE_CONFUSE_RAY] = 0,
+ [MOVE_WITHDRAW] = 0,
+ [MOVE_DEFENSE_CURL] = 0,
+ [MOVE_BARRIER] = 0,
+ [MOVE_LIGHT_SCREEN] = 0,
+ [MOVE_HAZE] = 0,
+ [MOVE_REFLECT] = 0,
+ [MOVE_FOCUS_ENERGY] = 0,
+ [MOVE_BIDE] = 0,
+ [MOVE_METRONOME] = 0,
+ [MOVE_MIRROR_MOVE] = 0,
+ [MOVE_SELF_DESTRUCT] = 1,
+ [MOVE_EGG_BOMB] = 1,
+ [MOVE_LICK] = 1,
+ [MOVE_SMOG] = 1,
+ [MOVE_SLUDGE] = 1,
+ [MOVE_BONE_CLUB] = 1,
+ [MOVE_FIRE_BLAST] = 1,
+ [MOVE_WATERFALL] = 1,
+ [MOVE_CLAMP] = 1,
+ [MOVE_SWIFT] = 1,
+ [MOVE_SKULL_BASH] = 1,
+ [MOVE_SPIKE_CANNON] = 1,
+ [MOVE_CONSTRICT] = 1,
+ [MOVE_AMNESIA] = 0,
+ [MOVE_KINESIS] = 0,
+ [MOVE_SOFT_BOILED] = 0,
+ [MOVE_HI_JUMP_KICK] = 1,
+ [MOVE_GLARE] = 0,
+ [MOVE_DREAM_EATER] = 1,
+ [MOVE_POISON_GAS] = 0,
+ [MOVE_BARRAGE] = 1,
+ [MOVE_LEECH_LIFE] = 1,
+ [MOVE_LOVELY_KISS] = 0,
+ [MOVE_SKY_ATTACK] = 1,
+ [MOVE_TRANSFORM] = 0,
+ [MOVE_BUBBLE] = 1,
+ [MOVE_DIZZY_PUNCH] = 1,
+ [MOVE_SPORE] = 0,
+ [MOVE_FLASH] = 0,
+ [MOVE_PSYWAVE] = 1,
+ [MOVE_SPLASH] = 0,
+ [MOVE_ACID_ARMOR] = 0,
+ [MOVE_CRABHAMMER] = 1,
+ [MOVE_EXPLOSION] = 1,
+ [MOVE_FURY_SWIPES] = 1,
+ [MOVE_BONEMERANG] = 1,
+ [MOVE_REST] = 0,
+ [MOVE_ROCK_SLIDE] = 1,
+ [MOVE_HYPER_FANG] = 1,
+ [MOVE_SHARPEN] = 0,
+ [MOVE_CONVERSION] = 0,
+ [MOVE_TRI_ATTACK] = 1,
+ [MOVE_SUPER_FANG] = 1,
+ [MOVE_SLASH] = 1,
+ [MOVE_SUBSTITUTE] = 0,
+ [MOVE_STRUGGLE] = 1,
+ [MOVE_SKETCH] = 0,
+ [MOVE_TRIPLE_KICK] = 1,
+ [MOVE_THIEF] = 1,
+ [MOVE_SPIDER_WEB] = 0,
+ [MOVE_MIND_READER] = 0,
+ [MOVE_NIGHTMARE] = 0,
+ [MOVE_FLAME_WHEEL] = 1,
+ [MOVE_SNORE] = 1,
+ [MOVE_CURSE] = 0,
+ [MOVE_FLAIL] = 1,
+ [MOVE_CONVERSION_2] = 0,
+ [MOVE_AEROBLAST] = 1,
+ [MOVE_COTTON_SPORE] = 0,
+ [MOVE_REVERSAL] = 1,
+ [MOVE_SPITE] = 0,
+ [MOVE_POWDER_SNOW] = 1,
+ [MOVE_PROTECT] = -1,
+ [MOVE_MACH_PUNCH] = 1,
+ [MOVE_SCARY_FACE] = 0,
+ [MOVE_FAINT_ATTACK] = 1,
+ [MOVE_SWEET_KISS] = 0,
+ [MOVE_BELLY_DRUM] = 0,
+ [MOVE_SLUDGE_BOMB] = 1,
+ [MOVE_MUD_SLAP] = 1,
+ [MOVE_OCTAZOOKA] = 1,
+ [MOVE_SPIKES] = 0,
+ [MOVE_ZAP_CANNON] = 1,
+ [MOVE_FORESIGHT] = 0,
+ [MOVE_DESTINY_BOND] = 0,
+ [MOVE_PERISH_SONG] = 0,
+ [MOVE_ICY_WIND] = 1,
+ [MOVE_DETECT] = -1,
+ [MOVE_BONE_RUSH] = 1,
+ [MOVE_LOCK_ON] = 0,
+ [MOVE_OUTRAGE] = 1,
+ [MOVE_SANDSTORM] = 0,
+ [MOVE_GIGA_DRAIN] = 1,
+ [MOVE_ENDURE] = -1,
+ [MOVE_CHARM] = 0,
+ [MOVE_ROLLOUT] = 1,
+ [MOVE_FALSE_SWIPE] = 1,
+ [MOVE_SWAGGER] = 0,
+ [MOVE_MILK_DRINK] = 0,
+ [MOVE_SPARK] = 1,
+ [MOVE_FURY_CUTTER] = 1,
+ [MOVE_STEEL_WING] = 1,
+ [MOVE_MEAN_LOOK] = 0,
+ [MOVE_ATTRACT] = 0,
+ [MOVE_SLEEP_TALK] = 0,
+ [MOVE_HEAL_BELL] = 0,
+ [MOVE_RETURN] = 1,
+ [MOVE_PRESENT] = 1,
+ [MOVE_FRUSTRATION] = 1,
+ [MOVE_SAFEGUARD] = 0,
+ [MOVE_PAIN_SPLIT] = 0,
+ [MOVE_SACRED_FIRE] = 1,
+ [MOVE_MAGNITUDE] = 1,
+ [MOVE_DYNAMIC_PUNCH] = 1,
+ [MOVE_MEGAHORN] = 1,
+ [MOVE_DRAGON_BREATH] = 1,
+ [MOVE_BATON_PASS] = 0,
+ [MOVE_ENCORE] = 0,
+ [MOVE_PURSUIT] = 1,
+ [MOVE_RAPID_SPIN] = 1,
+ [MOVE_SWEET_SCENT] = 0,
+ [MOVE_IRON_TAIL] = 1,
+ [MOVE_METAL_CLAW] = 1,
+ [MOVE_VITAL_THROW] = 1,
+ [MOVE_MORNING_SUN] = 0,
+ [MOVE_SYNTHESIS] = 0,
+ [MOVE_MOONLIGHT] = 0,
+ [MOVE_HIDDEN_POWER] = 1,
+ [MOVE_CROSS_CHOP] = 1,
+ [MOVE_TWISTER] = 1,
+ [MOVE_RAIN_DANCE] = 0,
+ [MOVE_SUNNY_DAY] = 0,
+ [MOVE_CRUNCH] = 1,
+ [MOVE_MIRROR_COAT] = 0,
+ [MOVE_PSYCH_UP] = 0,
+ [MOVE_EXTREME_SPEED] = 1,
+ [MOVE_ANCIENT_POWER] = 1,
+ [MOVE_SHADOW_BALL] = 1,
+ [MOVE_FUTURE_SIGHT] = 1,
+ [MOVE_ROCK_SMASH] = 1,
+ [MOVE_WHIRLPOOL] = 1,
+ [MOVE_BEAT_UP] = 1,
+ [MOVE_FAKE_OUT] = -1,
+ [MOVE_UPROAR] = 1,
+ [MOVE_STOCKPILE] = 0,
+ [MOVE_SPIT_UP] = 1,
+ [MOVE_SWALLOW] = 0,
+ [MOVE_HEAT_WAVE] = 1,
+ [MOVE_HAIL] = 0,
+ [MOVE_TORMENT] = 0,
+ [MOVE_FLATTER] = 0,
+ [MOVE_WILL_O_WISP] = 0,
+ [MOVE_MEMENTO] = 0,
+ [MOVE_FACADE] = 1,
+ [MOVE_FOCUS_PUNCH] = 1,
+ [MOVE_SMELLING_SALT] = 1,
+ [MOVE_FOLLOW_ME] = 0,
+ [MOVE_NATURE_POWER] = 0,
+ [MOVE_CHARGE] = 0,
+ [MOVE_TAUNT] = 0,
+ [MOVE_HELPING_HAND] = 0,
+ [MOVE_TRICK] = 0,
+ [MOVE_ROLE_PLAY] = 0,
+ [MOVE_WISH] = 0,
+ [MOVE_ASSIST] = 0,
+ [MOVE_INGRAIN] = 0,
+ [MOVE_SUPERPOWER] = 1,
+ [MOVE_MAGIC_COAT] = 0,
+ [MOVE_RECYCLE] = 0,
+ [MOVE_REVENGE] = 1,
+ [MOVE_BRICK_BREAK] = 1,
+ [MOVE_YAWN] = 0,
+ [MOVE_KNOCK_OFF] = 1,
+ [MOVE_ENDEAVOR] = 1,
+ [MOVE_ERUPTION] = 1,
+ [MOVE_SKILL_SWAP] = 0,
+ [MOVE_IMPRISON] = 0,
+ [MOVE_REFRESH] = 0,
+ [MOVE_GRUDGE] = 0,
+ [MOVE_SNATCH] = 0,
+ [MOVE_SECRET_POWER] = 1,
+ [MOVE_DIVE] = 1,
+ [MOVE_ARM_THRUST] = 1,
+ [MOVE_CAMOUFLAGE] = 0,
+ [MOVE_TAIL_GLOW] = 0,
+ [MOVE_LUSTER_PURGE] = 1,
+ [MOVE_MIST_BALL] = 1,
+ [MOVE_FEATHER_DANCE] = 0,
+ [MOVE_TEETER_DANCE] = 0,
+ [MOVE_BLAZE_KICK] = 1,
+ [MOVE_MUD_SPORT] = 0,
+ [MOVE_ICE_BALL] = 1,
+ [MOVE_NEEDLE_ARM] = 1,
+ [MOVE_SLACK_OFF] = 0,
+ [MOVE_HYPER_VOICE] = 1,
+ [MOVE_POISON_FANG] = 1,
+ [MOVE_CRUSH_CLAW] = 1,
+ [MOVE_BLAST_BURN] = 1,
+ [MOVE_HYDRO_CANNON] = 1,
+ [MOVE_METEOR_MASH] = 1,
+ [MOVE_ASTONISH] = 1,
+ [MOVE_WEATHER_BALL] = 1,
+ [MOVE_AROMATHERAPY] = 0,
+ [MOVE_FAKE_TEARS] = 0,
+ [MOVE_AIR_CUTTER] = 1,
+ [MOVE_OVERHEAT] = 1,
+ [MOVE_ODOR_SLEUTH] = 0,
+ [MOVE_ROCK_TOMB] = 1,
+ [MOVE_SILVER_WIND] = 1,
+ [MOVE_METAL_SOUND] = 0,
+ [MOVE_GRASS_WHISTLE] = 0,
+ [MOVE_TICKLE] = 0,
+ [MOVE_COSMIC_POWER] = 0,
+ [MOVE_WATER_SPOUT] = 1,
+ [MOVE_SIGNAL_BEAM] = 1,
+ [MOVE_SHADOW_PUNCH] = 1,
+ [MOVE_EXTRASENSORY] = 1,
+ [MOVE_SKY_UPPERCUT] = 1,
+ [MOVE_SAND_TOMB] = 1,
+ [MOVE_SHEER_COLD] = 1,
+ [MOVE_MUDDY_WATER] = 1,
+ [MOVE_BULLET_SEED] = 1,
+ [MOVE_AERIAL_ACE] = 1,
+ [MOVE_ICICLE_SPEAR] = 1,
+ [MOVE_IRON_DEFENSE] = 0,
+ [MOVE_BLOCK] = 0,
+ [MOVE_HOWL] = 0,
+ [MOVE_DRAGON_CLAW] = 1,
+ [MOVE_FRENZY_PLANT] = 1,
+ [MOVE_BULK_UP] = 0,
+ [MOVE_BOUNCE] = 1,
+ [MOVE_MUD_SHOT] = 1,
+ [MOVE_POISON_TAIL] = 1,
+ [MOVE_COVET] = 1,
+ [MOVE_VOLT_TACKLE] = 1,
+ [MOVE_MAGICAL_LEAF] = 1,
+ [MOVE_WATER_SPORT] = 0,
+ [MOVE_CALM_MIND] = 0,
+ [MOVE_LEAF_BLADE] = 1,
+ [MOVE_DRAGON_DANCE] = 0,
+ [MOVE_ROCK_BLAST] = 1,
+ [MOVE_SHOCK_WAVE] = 1,
+ [MOVE_WATER_PULSE] = 1,
+ [MOVE_DOOM_DESIRE] = 1,
+ [MOVE_PSYCHO_BOOST] = 1,
+};
+
+static const struct OamData sOamData_8611F24 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 15,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_8611F2C[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8611F34[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8611F3C[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8611F44[] =
+{
+ ANIMCMD_FRAME(12, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8611F4C[] =
+{
+ sSpriteAnim_8611F2C,
+ sSpriteAnim_8611F34,
+ sSpriteAnim_8611F3C,
+ sSpriteAnim_8611F44
+};
+
+static const struct SpriteTemplate sSpriteTemplate_JudgmentIcon =
+{
+ .tileTag = 0x3E8,
+ .paletteTag = 0xFFFF,
+ .oam = &sOamData_8611F24,
+ .anims = sSpriteAnimTable_8611F4C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCb_JudgmentIcon,
+};
+
+static const struct CompressedSpriteSheet gUnknown_08611F74[] =
+{
+ {gUnknown_08D854E8, 0x200, 0x3E8},
+ {0}
+};
+
+static void (* const sArenaFunctions[])(void) =
+{
+ sub_81A58B4,
+ sub_81A5964,
+ sub_81A59FC,
+ sub_81A5AC4,
+ sub_81A5B08,
+ sub_81A5B88,
+ sub_81A5BE0,
+};
+
+static const u16 gUnknown_08611FA0[6] =
+{
+ 0x003f, 0x0040, 0x0041, 0x0043, 0x0042, 0x0046
+};
+
+static const u16 gUnknown_08611FAC[9] =
+{
+ 0x00b3, 0x00b4, 0x00b7, 0x00c8, 0x00b9, 0x00bb, 0x00c4, 0x00c6, 0x00ba
+};
+
+// code
+void CallBattleArenaFunction(void)
+{
+ sArenaFunctions[gSpecialVar_0x8004]();
+}
+
+u8 BattleArena_ShowJudgmentWindow(u8 *state)
+{
+ s32 i;
+ u8 ret = 0;
+ switch (*state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0x7FFFFF1C, 4, 0, 8, 0);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ LoadCompressedObjectPic(gUnknown_08611F74);
+ LoadCompressedPalette(gUnknown_08D855E8, 0x1F0, 0x20);
+ gBattle_WIN0H = 0xFF;
+ gBattle_WIN0V = 0x70;
+ (*state)++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ HandleBattleWindow(5, 0, 24, 13, 0);
+ (*state)++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ gBattleTextBuff1[0] = CHAR_0;
+ gBattleTextBuff1[1] = EOS;
+ gBattleTextBuff2[0] = CHAR_0;
+ gBattleTextBuff2[1] = EOS;
+ BattleStringExpandPlaceholdersToDisplayedString(gText_PlayerMon1Name);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 15);
+ BattlePutTextOnWindow(gText_Vs, 16);
+ BattleStringExpandPlaceholdersToDisplayedString(gText_OpponentMon1Name);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 17);
+ BattlePutTextOnWindow(gText_Mind, 18);
+ BattlePutTextOnWindow(gText_Skill, 19);
+ BattlePutTextOnWindow(gText_Body, 20);
+ BattleStringExpandPlaceholdersToDisplayedString(gText_Judgement);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 21);
+ (*state)++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ for (i = 0; i < 8; i++)
+ {
+ u8 spriteId = CreateSprite(&sSpriteTemplate_JudgmentIcon, 0x40 + (i * 0x10), 84, 0);
+ StartSpriteAnim(&gSprites[spriteId], 3);
+ }
+ ret = 1;
+ (*state)++;
+ }
+ break;
+ case 4:
+ PlaySE(SE_HANTEI1);
+ ShowJudgmentSprite(80, 40, 0, 0);
+ ShowJudgmentSprite(160, 40, 0, 1);
+ BattleStringExpandPlaceholdersToDisplayedString(gText_Judgement);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 21);
+ (*state)++;
+ ret = 1;
+ break;
+ case 5:
+ PlaySE(SE_HANTEI1);
+ ShowJudgmentSprite(80, 56, 1, 0);
+ ShowJudgmentSprite(160, 56, 1, 1);
+ BattleStringExpandPlaceholdersToDisplayedString(gText_Judgement);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 21);
+ (*state)++;
+ ret = 1;
+ break;
+ case 6:
+ PlaySE(SE_HANTEI1);
+ ShowJudgmentSprite(80, 72, 2, 0);
+ ShowJudgmentSprite(160, 72, 2, 1);
+ BattleStringExpandPlaceholdersToDisplayedString(gText_Judgement);
+ BattlePutTextOnWindow(gDisplayedStringBattle, 21);
+ (*state)++;
+ ret = 1;
+ break;
+ case 7:
+ PlaySE(SE_HANTEI2);
+ if (gBattleTextBuff1[0] > gBattleTextBuff2[0])
+ {
+ ret = 2;
+ gBattleScripting.battler = 0;
+ }
+ else if (gBattleTextBuff1[0] < gBattleTextBuff2[0])
+ {
+ ret = 3;
+ gBattleScripting.battler = 1;
+ }
+ else
+ {
+ ret = 4;
+ }
+ (*state)++;
+ break;
+ case 8:
+ (*state)++;
+ break;
+ case 9:
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ HandleBattleWindow(5, 0, 24, 13, WINDOW_CLEAR);
+ CopyBgTilemapBufferToVram(0);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256);
+ BeginNormalPaletteFade(0x7FFFFF1C, 4, 8, 0, 0);
+ (*state)++;
+ break;
+ case 10:
+ if (!gPaletteFade.active)
+ {
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ FreeSpriteTilesByTag(0x3E8);
+ ret = 1;
+ (*state)++;
+ }
+ break;
+ }
+
+ return ret;
+}
+
+static void ShowJudgmentSprite(u8 x, u8 y, u8 category, u8 battler)
+{
+ s32 animNum = 0;
+ s32 pointsPlayer = 0;
+ s32 pointsOpponent = 0;
+ s8 *mindPoints = gBattleStruct->arenaMindPoints;
+ s8 *skillPoints = gBattleStruct->arenaSkillPoints;
+ u16 *hpAtStart = gBattleStruct->arenaStartHp;
+
+ switch (category)
+ {
+ case 0:
+ pointsPlayer = mindPoints[battler];
+ pointsOpponent = mindPoints[BATTLE_OPPOSITE(battler)];
+ break;
+ case 1:
+ pointsPlayer = skillPoints[battler];
+ pointsOpponent = skillPoints[BATTLE_OPPOSITE(battler)];
+ break;
+ case 2:
+ pointsPlayer = (gBattleMons[battler].hp * 100) / hpAtStart[battler];
+ pointsOpponent = (gBattleMons[BATTLE_OPPOSITE(battler)].hp * 100) / hpAtStart[BATTLE_OPPOSITE(battler)];
+ break;
+ }
+
+ if (pointsPlayer > pointsOpponent)
+ {
+ animNum = 2;
+ if (battler != 0)
+ gBattleTextBuff2[0] += 2;
+ else
+ gBattleTextBuff1[0] += 2;
+ }
+ else if (pointsPlayer == pointsOpponent)
+ {
+ animNum = 1;
+ if (battler != 0)
+ gBattleTextBuff2[0] += 1;
+ else
+ gBattleTextBuff1[0] += 1;
+ }
+ else
+ {
+ animNum = 0;
+ }
+
+ pointsPlayer = CreateSprite(&sSpriteTemplate_JudgmentIcon, x, y, 0);
+ StartSpriteAnim(&gSprites[pointsPlayer], animNum);
+}
+
+static void SpriteCb_JudgmentIcon(struct Sprite *sprite)
+{
+ if (gBattleCommunication[0] > 8)
+ DestroySprite(sprite);
+}
+
+void BattleArena_InitPoints(void)
+{
+ s8 *mindPoints = gBattleStruct->arenaMindPoints;
+ s8 *skillPoints = gBattleStruct->arenaSkillPoints;
+ u16 *hpAtStart = gBattleStruct->arenaStartHp;
+
+ mindPoints[0] = 0;
+ mindPoints[1] = 0;
+ skillPoints[0] = 0;
+ skillPoints[1] = 0;
+ hpAtStart[0] = gBattleMons[0].hp;
+ hpAtStart[1] = gBattleMons[1].hp;
+}
+
+void BattleArena_AddMindPoints(u8 battler)
+{
+ s8 *mindPoints = gBattleStruct->arenaMindPoints;
+
+ mindPoints[battler] += sMindRatings[gCurrentMove];
+}
+
+void BattleArena_AddSkillPoints(u8 battler)
+{
+ s8 *skillPoints = gBattleStruct->arenaSkillPoints;
+
+ if (gHitMarker & HITMARKER_OBEYS)
+ {
+ u8 *failedMoveBits = &gBattleStruct->alreadyStatusedMoveAttempt;
+ if (*failedMoveBits & gBitTable[battler])
+ {
+ *failedMoveBits &= ~(gBitTable[battler]);
+ skillPoints[battler] -= 2;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ {
+ if (!(gMoveResultFlags & MOVE_RESULT_MISSED) || gBattleCommunication[6] != 1)
+ skillPoints[battler] -= 2;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE && gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
+ {
+ skillPoints[battler] += 1;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE)
+ {
+ skillPoints[battler] += 2;
+ }
+ else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE)
+ {
+ skillPoints[battler] -= 1;
+ }
+ else if (!gProtectStructs[battler].protected)
+ {
+ skillPoints[battler] += 1;
+ }
+ }
+}
+
+void BattleArena_DeductMindPoints(u8 battler, u16 stringId)
+{
+ s8 *skillPoints = gBattleStruct->arenaSkillPoints;
+
+ switch (stringId)
+ {
+ case STRINGID_PKMNSXMADEYUSELESS:
+ case STRINGID_PKMNSXMADEITINEFFECTIVE:
+ case STRINGID_PKMNSXPREVENTSFLINCHING:
+ case STRINGID_PKMNSXBLOCKSY2:
+ case STRINGID_PKMNSXPREVENTSYLOSS:
+ case STRINGID_PKMNSXMADEYINEFFECTIVE:
+ case STRINGID_PKMNSXPREVENTSBURNS:
+ case STRINGID_PKMNSXBLOCKSY:
+ case STRINGID_PKMNPROTECTEDBY:
+ case STRINGID_PKMNPREVENTSUSAGE:
+ case STRINGID_PKMNRESTOREDHPUSING:
+ case STRINGID_PKMNPREVENTSPARALYSISWITH:
+ case STRINGID_PKMNPREVENTSROMANCEWITH:
+ case STRINGID_PKMNPREVENTSPOISONINGWITH:
+ case STRINGID_PKMNPREVENTSCONFUSIONWITH:
+ case STRINGID_PKMNRAISEDFIREPOWERWITH:
+ case STRINGID_PKMNANCHORSITSELFWITH:
+ case STRINGID_PKMNPREVENTSSTATLOSSWITH:
+ case STRINGID_PKMNSTAYEDAWAKEUSING:
+ skillPoints[battler] -= 3;
+ break;
+ }
+}
+
+void sub_81A586C(u8 battler) // Unused.
+{
+ u16 *hpAtStart = gBattleStruct->arenaStartHp;
+
+ hpAtStart[battler] = gBattleMons[battler].hp;
+ if (hpAtStart[BATTLE_OPPOSITE(battler)] > gBattleMons[BATTLE_OPPOSITE(battler)].hp)
+ hpAtStart[BATTLE_OPPOSITE(battler)] = gBattleMons[BATTLE_OPPOSITE(battler)].hp;
+}
+
+static void sub_81A58B4(void)
+{
+ bool32 isCurrent;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 0;
+ if (lvlMode != FRONTIER_LVL_50)
+ isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x80;
+ else
+ isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x40;
+
+ if (!isCurrent)
+ gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0;
+
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ gTrainerBattleOpponent_A = 0;
+}
+
+static void sub_81A5964(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DD8;
+ break;
+ case 1:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode];
+ break;
+ case 2:
+ if (lvlMode != FRONTIER_LVL_50)
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x80;
+ else
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x40;
+ break;
+ }
+}
+
+static void sub_81A59FC(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSaveBlock2Ptr->frontier.field_DD8 = gSpecialVar_0x8006;
+ break;
+ case 1:
+ gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = gSpecialVar_0x8006;
+ break;
+ case 2:
+ if (lvlMode != FRONTIER_LVL_50)
+ {
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= 0x80;
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= ~(0x80);
+ }
+ else
+ {
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= 0x40;
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= ~(0x40);
+ }
+ break;
+ }
+}
+
+static void sub_81A5AC4(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = 1;
+ sub_81A4C30();
+}
+
+static void sub_81A5B08(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > 41)
+ gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FAC[Random() % ARRAY_COUNT(gUnknown_08611FAC)];
+ else
+ gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FA0[Random() % ARRAY_COUNT(gUnknown_08611FA0)];
+}
+
+static void sub_81A5B88(void)
+{
+ if (AddBagItem(gSaveBlock2Ptr->frontier.field_DD8, 1) == TRUE)
+ {
+ CopyItemName(gSaveBlock2Ptr->frontier.field_DD8, gStringVar1);
+ gSaveBlock2Ptr->frontier.field_DD8 = 0;
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+}
+
+static void sub_81A5BE0(void)
+{
+ GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A);
+}
+
+void sub_81A5BF8(void)
+{
+ u8 width = 27;
+ u8 palNum = 7;
+
+ FillBgTilemapBufferRect(0, 0, 254, 14, 1, 6, palNum);
+ FillBgTilemapBufferRect(0, 0, 32, 14, 1, 6, palNum);
+ FillBgTilemapBufferRect(0, 0x31, 0, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x33, 1, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x34, 2, 14, width, 1, palNum);
+ width++;
+ FillBgTilemapBufferRect(0, 0x35, 28, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x36, 29, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x37, 0, 15, 1, 5, palNum);
+ FillBgTilemapBufferRect(0, 0x39, 1, 15, width, 5, palNum);
+ FillBgTilemapBufferRect(0, 0x3A, 29, 15, 1, 5, palNum);
+ FillBgTilemapBufferRect(0, 0x831, 0, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x833, 1, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x834, 2, 19, width - 2, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x835, 28, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x836, 29, 19, 1, 1, palNum);
+}
+
+void sub_81A5D44(void)
+{
+ u8 width;
+ u8 height;
+ u8 palNum = 0;
+
+ FillBgTilemapBufferRect(0, 3, 0, 14, 1, 1, palNum);
+ height = 4;
+ FillBgTilemapBufferRect(0, 4, 1, 14, 1, 1, palNum);
+ width = 27;
+ FillBgTilemapBufferRect(0, 5, 2, 14, width, 1, palNum);
+ FillBgTilemapBufferRect(0, 6, 28, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 7, 29, 14, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 8, 0, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 9, 1, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 0xA, 2, 15, width, height, palNum);
+ FillBgTilemapBufferRect(0, 0xB, 28, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 0xC, 29, 15, 1, height, palNum);
+ FillBgTilemapBufferRect(0, 0xD, 0, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0xE, 1, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0xF, 2, 19, width, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x10, 28, 19, 1, 1, palNum);
+ FillBgTilemapBufferRect(0, 0x11, 29, 19, 1, 1, palNum);
+}
diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c
index 4fea3aca8..2b6a356dd 100644
--- a/src/battle_controller_link_opponent.c
+++ b/src/battle_controller_link_opponent.c
@@ -1,30 +1,30 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
-#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_message.h"
+#include "battle_setup.h"
#include "battle_tv.h"
-#include "pokemon.h"
+#include "bg.h"
+#include "data2.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "constants/songs.h"
-#include "constants/trainers.h"
-#include "sound.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "pokeball.h"
-#include "data2.h"
-#include "battle_setup.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c
index 51e26b620..203883c27 100644
--- a/src/battle_controller_link_partner.c
+++ b/src/battle_controller_link_partner.c
@@ -1,30 +1,30 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
-#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_message.h"
+#include "battle_setup.h"
#include "battle_tv.h"
-#include "pokemon.h"
+#include "bg.h"
+#include "data2.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "constants/songs.h"
-#include "constants/trainers.h"
-#include "sound.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "pokeball.h"
-#include "data2.h"
-#include "battle_setup.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index b8b5bd3b8..54726229d 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -1,34 +1,37 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_anim.h"
+#include "battle_arena.h"
#include "battle_controllers.h"
#include "battle_message.h"
#include "battle_interface.h"
-#include "battle_anim.h"
-#include "constants/battle_anim.h"
+#include "battle_setup.h"
+#include "battle_tower.h"
#include "battle_tv.h"
-#include "battle_ai_script_commands.h"
-#include "pokemon.h"
+#include "bg.h"
+#include "data2.h"
+#include "frontier_util.h"
+#include "item.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "item.h"
-#include "constants/items.h"
-#include "constants/songs.h"
-#include "sound.h"
-#include "constants/moves.h"
-#include "constants/trainers.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "random.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "random.h"
-#include "pokeball.h"
-#include "data2.h"
-#include "battle_setup.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
@@ -38,11 +41,7 @@ extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
-extern void sub_81A57E4(u8 battlerId, u16 stringId);
-extern u8 GetFrontierBrainTrainerPicIndex(void);
extern u8 GetTrainerHillTrainerFrontSpriteId(u16 trainerId);
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
-extern u8 GetEreaderTrainerFrontSpriteId(void);
// this file's functions
static void OpponentHandleGetMonData(void);
@@ -1513,7 +1512,7 @@ static void OpponentHandlePrintString(void)
BufferStringBattle(*stringId);
BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
- sub_81A57E4(gActiveBattler, *stringId);
+ BattleArena_DeductMindPoints(gActiveBattler, *stringId);
}
static void OpponentHandlePrintSelectionString(void)
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 6bc6c6f49..ad5ae2059 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -1,37 +1,38 @@
#include "global.h"
#include "battle.h"
+#include "battle_anim.h"
+#include "battle_arena.h"
#include "battle_controllers.h"
-#include "battle_message.h"
+#include "battle_dome.h"
#include "battle_interface.h"
-#include "battle_anim.h"
-#include "constants/battle_anim.h"
+#include "battle_message.h"
+#include "battle_setup.h"
#include "battle_tv.h"
-#include "pokemon.h"
+#include "bg.h"
+#include "data2.h"
+#include "item.h"
+#include "item_menu.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "item.h"
-#include "constants/items.h"
-#include "constants/songs.h"
-#include "sound.h"
-#include "constants/moves.h"
-#include "constants/trainers.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
-#include "task.h"
-#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "random.h"
+#include "party_menu.h"
#include "pokeball.h"
-#include "data2.h"
-#include "battle_setup.h"
-#include "item_menu.h"
+#include "pokemon.h"
+#include "random.h"
#include "recorded_battle.h"
-#include "party_menu.h"
-#include "battle_dome.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
extern u8 gUnknown_0203CEE8;
extern u8 gUnknown_0203CEE9;
@@ -46,7 +47,6 @@ extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
extern void sub_81AABB0(void);
-extern void sub_81A57E4(u8 battlerId, u16 stringId);
extern void sub_81851A8(u8 *);
// this file's functions
@@ -2537,7 +2537,7 @@ static void PlayerHandlePrintString(void)
BattlePutTextOnWindow(gDisplayedStringBattle, 0);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2;
BattleTv_SetDataBasedOnString(*stringId);
- sub_81A57E4(gActiveBattler, *stringId);
+ BattleArena_DeductMindPoints(gActiveBattler, *stringId);
}
static void PlayerHandlePrintSelectionString(void)
@@ -2600,9 +2600,11 @@ static void HandleChooseMoveAfterDma3(void)
}
}
+// arenaMindPoints is used here as a placeholder for a timer.
+
static void PlayerChooseMoveInBattlePalace(void)
{
- if (--*(gBattleStruct->field_298 + gActiveBattler) == 0)
+ if (--*(gBattleStruct->arenaMindPoints + gActiveBattler) == 0)
{
gBattlePalaceMoveSelectionRngValue = gRngValue;
BtlController_EmitTwoReturnValues(1, 10, ChooseMoveAndTargetInBattlePalace());
@@ -2614,7 +2616,7 @@ static void PlayerHandleChooseMove(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
{
- *(gBattleStruct->field_298 + gActiveBattler) = 8;
+ *(gBattleStruct->arenaMindPoints + gActiveBattler) = 8;
gBattlerControllerFuncs[gActiveBattler] = PlayerChooseMoveInBattlePalace;
}
else
diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c
index e893d2f3d..3572c1c69 100644
--- a/src/battle_controller_player_partner.c
+++ b/src/battle_controller_player_partner.c
@@ -1,30 +1,30 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
#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 "battle_setup.h"
+#include "bg.h"
+#include "data2.h"
+#include "item_use.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "constants/songs.h"
-#include "constants/trainers.h"
-#include "sound.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "pokeball.h"
-#include "data2.h"
-#include "battle_setup.h"
-#include "item_use.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c
index 57eb6842e..72667649f 100644
--- a/src/battle_controller_recorded_opponent.c
+++ b/src/battle_controller_recorded_opponent.c
@@ -1,32 +1,32 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
-#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_message.h"
+#include "battle_setup.h"
#include "battle_tv.h"
-#include "recorded_battle.h"
-#include "pokemon.h"
+#include "bg.h"
+#include "data2.h"
+#include "item_use.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "constants/songs.h"
-#include "constants/trainers.h"
-#include "sound.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "recorded_battle.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "pokeball.h"
-#include "data2.h"
-#include "item_use.h"
-#include "battle_setup.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c
index f6c19121d..b74d55cc8 100644
--- a/src/battle_controller_recorded_player.c
+++ b/src/battle_controller_recorded_player.c
@@ -1,29 +1,29 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
#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 "bg.h"
+#include "data2.h"
+#include "item_use.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "constants/songs.h"
-#include "sound.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "recorded_battle.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "pokeball.h"
-#include "data2.h"
-#include "item_use.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/songs.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c
index 148f13865..a7ea04515 100644
--- a/src/battle_controller_safari.c
+++ b/src/battle_controller_safari.c
@@ -1,27 +1,27 @@
#include "global.h"
#include "battle.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
-#include "battle_message.h"
#include "battle_interface.h"
-#include "battle_anim.h"
-#include "constants/battle_anim.h"
-#include "pokemon.h"
+#include "battle_message.h"
+#include "bg.h"
+#include "data2.h"
+#include "item_menu.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "constants/songs.h"
-#include "sound.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
-#include "task.h"
-#include "text.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
#include "pokeball.h"
-#include "data2.h"
#include "pokeblock.h"
-#include "item_menu.h"
+#include "pokemon.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "task.h"
+#include "text.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/songs.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c
index 80dd6d3bb..f7e9831a7 100644
--- a/src/battle_controller_wally.c
+++ b/src/battle_controller_wally.c
@@ -1,35 +1,35 @@
#include "global.h"
#include "battle.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
-#include "battle_message.h"
#include "battle_interface.h"
-#include "battle_anim.h"
-#include "constants/battle_anim.h"
+#include "battle_message.h"
+#include "battle_setup.h"
#include "battle_tv.h"
-#include "pokemon.h"
+#include "bg.h"
+#include "data2.h"
+#include "item.h"
+#include "item_menu.h"
#include "link.h"
-#include "util.h"
#include "main.h"
-#include "item.h"
-#include "constants/items.h"
-#include "constants/songs.h"
-#include "sound.h"
-#include "constants/moves.h"
-#include "constants/trainers.h"
-#include "window.h"
#include "m4a.h"
#include "palette.h"
+#include "party_menu.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "random.h"
+#include "reshow_battle_screen.h"
+#include "sound.h"
+#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "string_util.h"
-#include "bg.h"
-#include "reshow_battle_screen.h"
-#include "random.h"
-#include "pokeball.h"
-#include "data2.h"
-#include "party_menu.h"
-#include "battle_setup.h"
-#include "item_menu.h"
+#include "util.h"
+#include "window.h"
+#include "constants/battle_anim.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/trainers.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index 56ff34528..1c6942ead 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -1,17 +1,17 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
+#include "battle_anim.h"
#include "battle_controllers.h"
+#include "battle_message.h"
#include "cable_club.h"
#include "link.h"
-#include "task.h"
-#include "battle_ai_script_commands.h"
-#include "battle_anim.h"
#include "pokemon.h"
-#include "constants/species.h"
#include "recorded_battle.h"
+#include "task.h"
#include "util.h"
#include "constants/abilities.h"
-#include "battle_message.h"
+#include "constants/species.h"
extern u8 gUnknown_02022D08;
extern u8 gUnknown_02022D09;
diff --git a/src/battle_dome.c b/src/battle_dome.c
index b39162dda..2a77da180 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -2555,7 +2555,7 @@ static void InitDomeTrainers(void)
s32 species[3];
s32 monTypesBits, monTypesCount;
s32 trainerId;
- s32 monTournamentId;
+ s32 monSetId;
u16 *statSums;
s32 *statValues;
u8 ivs = 0;
@@ -2618,20 +2618,20 @@ static void InitDomeTrainers(void)
// Make sure the mon is valid.
do
{
- monTournamentId = RandomizeFacilityTrainerMonId(trainerId);
+ monSetId = RandomizeFacilityTrainerMonSet(trainerId);
for (k = 0; k < j; k++)
{
- s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k];
- if (checkingMonId == monTournamentId
- || species[0] == gFacilityTrainerMons[monTournamentId].species
- || species[1] == gFacilityTrainerMons[monTournamentId].species
- || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monTournamentId].itemTableId)
+ s32 checkingMonSetId = gSaveBlock2Ptr->frontier.domeMonIds[i][k];
+ if (checkingMonSetId == monSetId
+ || species[0] == gFacilityTrainerMons[monSetId].species
+ || species[1] == gFacilityTrainerMons[monSetId].species
+ || gFacilityTrainerMons[checkingMonSetId].itemTableId == gFacilityTrainerMons[monSetId].itemTableId)
break;
}
} while (k != j);
- gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId;
- species[j] = gFacilityTrainerMons[monTournamentId].species;
+ gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monSetId;
+ species[j] = gFacilityTrainerMons[monSetId].species;
}
gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0;
@@ -2828,7 +2828,7 @@ static void CreateDomeMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentM
u8 happiness = 0xFF;
u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Should be using trainerId instead of tournamentTrainerId. As a result, all Pokemon have ivs of 3.
u8 level = SetFacilityPtrsGetLevel();
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[monPartyId],
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[monPartyId],
gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].species,
level,
gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].nature,
@@ -6143,7 +6143,7 @@ static void sub_8194F58(void)
s32 species[3];
s32 monTypesBits;
s32 trainerId;
- s32 monTournamentId;
+ s32 monSetId;
u8 lvlMode;
u16 *statSums;
s32 *statValues;
@@ -6190,20 +6190,20 @@ static void sub_8194F58(void)
// Make sure the mon is valid.
do
{
- monTournamentId = RandomizeFacilityTrainerMonId(trainerId);
+ monSetId = RandomizeFacilityTrainerMonSet(trainerId);
for (k = 0; k < j; k++)
{
s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k];
- if (checkingMonId == monTournamentId
- || species[0] == gFacilityTrainerMons[monTournamentId].species
- || species[1] == gFacilityTrainerMons[monTournamentId].species
- || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monTournamentId].itemTableId)
+ if (checkingMonId == monSetId
+ || species[0] == gFacilityTrainerMons[monSetId].species
+ || species[1] == gFacilityTrainerMons[monSetId].species
+ || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monSetId].itemTableId)
break;
}
} while (k != j);
- gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId;
- species[j] = gFacilityTrainerMons[monTournamentId].species;
+ gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monSetId;
+ species[j] = gFacilityTrainerMons[monSetId].species;
}
gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0;
gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt = 0;
diff --git a/src/battle_factory.c b/src/battle_factory.c
index d7a2939b3..37abf6add 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -1,4114 +1,863 @@
#include "global.h"
#include "battle_factory.h"
-#include "sprite.h"
+#include "battle_factory_screen.h"
#include "event_data.h"
+#include "battle_setup.h"
#include "overworld.h"
-#include "random.h"
+#include "frontier_util.h"
#include "battle_tower.h"
-#include "text.h"
-#include "palette.h"
-#include "task.h"
-#include "main.h"
-#include "malloc.h"
-#include "bg.h"
-#include "gpu_regs.h"
-#include "string_util.h"
-#include "international_string_util.h"
-#include "window.h"
-#include "data2.h"
-#include "decompress.h"
-#include "pokemon_summary_screen.h"
-#include "sound.h"
-#include "pokedex.h"
-#include "util.h"
-#include "trainer_pokemon_sprites.h"
+#include "random.h"
+#include "constants/species.h"
+#include "constants/battle_ai.h"
#include "constants/battle_frontier.h"
-#include "constants/songs.h"
-#include "constants/rgb.h"
-
-// Select_ refers to the first Pokemon selection screen where you choose 3 Pokemon.
-// Swap_ refers to the consecutive selection screen where you can keep your Pokemon or swap one with beaten trainer's.
-
-#define MENU_SUMMARY 0
-#define MENU_RENT 1
-#define MENU_DESELECT 1
-#define MENU_OTHERS 2
-#define MENU_OPTIONS_COUNT 3
-
-#define SELECTABLE_MONS_COUNT 6
+#include "constants/trainers.h"
+#include "constants/moves.h"
-#define TAG_PAL_BALL_GREY 0x64
-#define TAG_PAL_BALL_SELECTED 0x65
-#define TAG_PAL_66 0x66
-#define TAG_PAL_67 0x67
-
-#define TAG_TILE_64 0x64
-#define TAG_TILE_65 0x65
-#define TAG_TILE_66 0x66
-#define TAG_TILE_67 0x67
-#define TAG_TILE_68 0x68
-#define TAG_TILE_69 0x69
-#define TAG_TILE_6A 0x6A
-#define TAG_TILE_6B 0x6B
-#define TAG_TILE_6C 0x6C
-#define TAG_TILE_6D 0x6D
-
-struct FactorySelecteableMon
-{
- u16 monSetId;
- u16 spriteId;
- u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon
- struct Pokemon monData;
-};
+extern u16 gUnknown_03006298[];
-struct UnkFactoryStruct
-{
- u8 field0;
- u8 field1;
-};
-
-struct FactorySelectMonsStruct
-{
- u8 menuCursorPos;
- u8 menuCursor1SpriteId;
- u8 menuCursor2SpriteId;
- u8 cursorPos;
- u8 cursorSpriteId;
- u8 selectingMonsState;
- bool8 fromSummaryScreen;
- u8 yesNoCursorPos;
- u8 unused8;
- struct FactorySelecteableMon mons[SELECTABLE_MONS_COUNT];
- struct UnkFactoryStruct unk294[3];
- bool8 unk2A0;
- u8 fadeSpeciesNameTaskId;
- bool8 unk2A2;
- u16 unk2A4;
- bool8 unk2A6;
- u8 unk2A7;
- u8 unk2A8;
- u8 unk2A9;
-};
-
-// 'Action' refers to the 3 Selectable mons, Cancel, Pknm for swap windows.
-#define ACTIONS_PLAYER_SCREEN 0
-#define ACTIONS_ENEMY_SCREEN 1
-
-struct SwapActionIdAndFunc
-{
- u8 id;
- void (*func)(u8 taskId);
-};
-
-struct FactorySwapMonsStruct
-{
- u8 menuCursorPos;
- u8 menuCursor1SpriteId;
- u8 menuCursor2SpriteId;
- u8 cursorPos;
- u8 cursorSpriteId;
- u8 ballSpriteIds[3];
- u8 unk8[2][3];
- u8 unkE[2][2];
- u8 playerMonId;
- u8 enemyMonId;
- bool8 inEnemyScreen;
- bool8 fromSummaryScreen;
- u8 yesNoCursorPos;
- u8 actionsCount;
- const struct SwapActionIdAndFunc *actionsData;
- u8 unused1C[4];
- bool8 monSwapped;
- u8 fadeSpeciesNameTaskId;
- bool8 unk22;
- u16 unk24;
- bool8 unk26;
- u8 unk27;
- u8 unk28;
- u8 unk29;
- struct UnkFactoryStruct unk2C;
- bool8 unk30;
-};
-
-extern u8 (*gUnknown_030062E8)(void);
-extern u8 gUnknown_0203CF20;
-
-extern const u16 gBattleFrontierHeldItems[];
extern const struct FacilityMon gBattleFrontierMons[];
extern const struct FacilityMon gSlateportBattleTentMons[];
extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
-extern const u32 gUnknown_085B18AC[];
+extern const u16 gBattleFrontierHeldItems[];
-extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot);
-extern u8 sub_81A6F70(u8 battleMode, u8 lvlMode);
-extern u8 sub_81A6CA8(u8 arg0, u8 arg1);
+// IWRAM bss
+static IWRAM_DATA bool8 gUnknown_03001288;
// This file's functions.
-static void sub_819A44C(struct Sprite *sprite);
-static void CB2_InitSelectScreen(void);
-static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V);
-static void Select_InitMonsData(void);
-static void Select_InitAllSprites(void);
-static void Select_ShowSummaryMonSprite(void);
-static void Select_PrintSelectMonString(void);
-static void Select_PrintMonSpecies(void);
-static void Select_PrintMonCategory(void);
-static void Select_PrintRentalPkmnString(void);
-static void Select_CopyMonsToPlayerParty(void);
-static void sub_819C4B4(void);
-static void Select_ShowYesNoOptions(void);
-static void sub_819C568(void);
-static void Select_ShowMenuOptions(void);
-static void Select_PrintMenuOptions(void);
-static void Select_PrintYesNoOptions(void);
-static void Task_SelectFadeSpeciesName(u8 taskId);
-static void sub_819C1D0(u8 taskId);
-static void Task_HandleSelectionScreenChooseMons(u8 taskId);
-static void Task_HandleSelectionScreenMenu(u8 taskId);
-static void CreateFrontierFactorySelectableMons(u8 firstMonId);
-static void CreateTentFactorySelectableMons(u8 firstMonId);
-static void Select_SetBallSpritePaletteNum(u8 id);
-static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1);
-static void sub_819B958(u8 windowId);
-static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen);
-static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen);
-static u8 Select_RunMenuOptionFunc(void);
-static u8 sub_819BC9C(void);
-static u8 Select_OptionSummary(void);
-static u8 Select_OptionOthers(void);
-static u8 Select_OptionRentDeselect(void);
-static bool32 Select_AreSpeciesValid(u16 monSetId);
-static void Swap_DestroyAllSprites(void);
-static void Swap_ShowYesNoOptions(void);
-static void sub_819E8EC(void);
-static void sub_819EAC0(void);
-static void Swap_UpdateYesNoCursorPosition(s8 direction);
-static void Swap_UpdateMenuCursorPosition(s8 direction);
-static void sub_819EA64(u8 windowId);
-static void sub_819D770(u8 taskId);
-static void Task_HandleSwapScreenChooseMons(u8 taskId);
-static void sub_819D588(u8 taskId);
-static void sub_819F7B4(u8 taskId);
-static void Swap_PrintOnInfoWindow(const u8 *str);
-static void Swap_ShowMenuOptions(void);
-static void Swap_PrintMenuOptions(void);
-static void Swap_PrintYesNoOptions(void);
-static void Swap_PrintMonSpecies(void);
-static void Swap_PrintMonSpecies2(void);
-static void Swap_PrintMonSpecies3(void);
-static void Swap_PrintMonCategory(void);
-static void Swap_InitAllSprites(void);
-static void Swap_PrintPkmnSwap(void);
-static void sub_819EADC(void);
-static void sub_819EAF8(void);
-static void CB2_InitSwapScreen(void);
-static void Swap_ShowSummaryMonSprite(void);
-static void Swap_UpdateActionCursorPosition(s8 direction);
-static void Swap_UpdateBallCursorPosition(s8 direction);
-static void Swap_RunMenuOptionFunc(u8 taskId);
-static void sub_819F0CC(u8 taskId);
-static void sub_819F114(u8 taskId);
-static void sub_819F134(u8 taskId);
-static void Swap_RunActionFunc(u8 taskId);
-static void sub_819F69C(u8 taskId);
-static void Task_SwapCantHaveSameMons(u8 taskId);
-static void Swap_ShowMonSprite(void);
-static void Swap_PrintActionStrings(void);
-static void Swap_PrintActionStrings2(void);
-static void Swap_PrintOneActionString(u8 which);
-static void Swap_InitActions(u8 id);
-static void sub_819E838(u8 arg0);
-static bool8 Swap_AlreadyHasSameSpecies(u8 monId);
-static void sub_819F600(struct Sprite *sprite);
-static void Swap_ActionMon(u8 taskId);
-static void Swap_ActionCancel(u8 taskId);
-static void Swap_ActionPkmnForSwap(u8 taskId);
-
-// Ewram variables
-static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSelectMonCardBgTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL;
-static EWRAM_DATA u8 *sSelectMonCardBgTilemapBuffer = NULL;
-static EWRAM_DATA struct Pokemon *sFactorySelectMons = NULL;
-static EWRAM_DATA u8 *sSwapMenuTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSwapMonCardBgTilesetBuffer = NULL;
-static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL;
-static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL;
-
-// IWRAM bss
-static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen;
-static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId);
-static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen;
+static void sub_81A5E94(void);
+static void sub_81A5FA8(void);
+static void sub_81A6054(void);
+static void sub_81A613C(void);
+static void nullsub_75(void);
+static void nullsub_123(void);
+static void sub_81A6188(void);
+static void sub_81A6198(void);
+static void sub_81A61A4(void);
+static void sub_81A63CC(void);
+static void sub_81A64C4(void);
+static void sub_81A63B8(void);
+static void sub_81A61B0(void);
+static void sub_81A67EC(void);
+static void sub_81A6A08(void);
+static void sub_81A6AEC(void);
+static void sub_81A6C1C(void);
+static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2);
+static u8 GetStyleForMove(u16 move);
// Const rom data.
-static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal");
-static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal");
-static const u16 gUnknown_0860F17C[] = INCBIN_U16("graphics/unknown/unknown_60F17C.gbapal");
-static const u8 gUnknown_0860F1BC[] = INCBIN_U8("graphics/unknown/unknown_60F1BC.4bpp");
-static const u8 gUnknown_0860F3BC[] = INCBIN_U8("graphics/unknown/unknown_60F3BC.4bpp");
-static const u8 gUnknown_0860F43C[] = INCBIN_U8("graphics/unknown/unknown_60F43C.4bpp");
-static const u8 gUnknown_0860F53C[] = INCBIN_U8("graphics/unknown/unknown_60F53C.4bpp");
-static const u8 gUnknown_0860F63C[] = INCBIN_U8("graphics/unknown/unknown_60F63C.4bpp");
-static const u8 gUnknown_0860F6BC[] = INCBIN_U8("graphics/unknown/unknown_60F6BC.4bpp");
-static const u8 gUnknown_0860F7BC[] = INCBIN_U8("graphics/unknown/unknown_60F7BC.4bpp");
-static const u8 gUnknown_0860F83C[] = INCBIN_U8("graphics/unknown/unknown_60F83C.4bpp");
-static const u8 gUnknown_0860F93C[] = INCBIN_U8("graphics/unknown/unknown_60F93C.4bpp");
-static const u8 gUnknown_0860FA3C[] = INCBIN_U8("graphics/unknown/unknown_60FA3C.4bpp");
-static const u8 gUnknown_0861023C[] = INCBIN_U8("graphics/unknown/unknown_61023C.bin");
-static const u8 gUnknown_0861033C[] = INCBIN_U8("graphics/unknown/unknown_61033C.4bpp");
-static const u16 gUnknown_0861039C[] = INCBIN_U16("graphics/unknown/unknown_61039C.gbapal");
-
-static const struct SpriteSheet gUnknown_086103BC[] =
-{
- {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
- {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
- {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
- {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
- {},
-};
-
-static const struct CompressedSpriteSheet gUnknown_086103E4[] =
-{
- {gUnknown_085B18AC, 0x800, TAG_TILE_64},
- {},
-};
-
-static const struct SpritePalette gUnknown_086103F4[] =
-{
- {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
- {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
- {gUnknown_0860F17C, TAG_PAL_66},
- {gUnknown_0861039C, TAG_PAL_67},
- {},
-};
-
-u8 static (* const sSelect_MenuOptionFuncs[])(void) =
-{
- [MENU_SUMMARY] = Select_OptionSummary,
- [MENU_RENT] /*Or Deselect*/ = Select_OptionRentDeselect,
- [MENU_OTHERS] = Select_OptionOthers
-};
-
-static const struct BgTemplate sSelect_BgTemplates[] =
-{
- {
- .bg = 0,
- .charBaseIndex = 0,
- .mapBaseIndex = 24,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
- {
- .bg = 1,
- .charBaseIndex = 1,
- .mapBaseIndex = 25,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 3,
- .baseTile = 0
- },
- {
- .bg = 3,
- .charBaseIndex = 2,
- .mapBaseIndex = 27,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 2,
- .baseTile = 0
- },
-};
-
-static const struct WindowTemplate sSelect_WindowTemplates[] =
-{
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 2,
- .width = 12,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x0001,
- },
- {
- .bg = 0,
- .tilemapLeft = 19,
- .tilemapTop = 2,
- .width = 11,
- .height = 2,
- .paletteNum = 14,
- .baseBlock = 0x0019,
- },
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 15,
- .width = 20,
- .height = 3,
- .paletteNum = 15,
- .baseBlock = 0x002f,
- },
- {
- .bg = 0,
- .tilemapLeft = 22,
- .tilemapTop = 14,
- .width = 8,
- .height = 6,
- .paletteNum = 15,
- .baseBlock = 0x006b,
- },
- {
- .bg = 0,
- .tilemapLeft = 22,
- .tilemapTop = 14,
- .width = 8,
- .height = 4,
- .paletteNum = 15,
- .baseBlock = 0x009b,
- },
- {
- .bg = 0,
- .tilemapLeft = 15,
- .tilemapTop = 0,
- .width = 15,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x00bb,
- },
- DUMMY_WIN_TEMPLATE,
-};
-
-static const u16 gUnknown_0861046C[] = INCBIN_U16("graphics/unknown/unknown_61046C.gbapal");
-
-static const u8 gUnknown_08610476[] = {0x00, 0x02, 0x00};
-static const u8 gUnknown_08610479[] = {0x00, 0x04, 0x00};
-
-static const struct OamData gUnknown_0861047C =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 2,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_08610484 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_0861048C =
-{
- .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 gUnknown_08610494 =
-{
- .y = 0,
- .affineMode = 3,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 0,
- .affineParam = 1,
-};
-
-static const union AnimCmd gUnknown_0861049C[] =
-{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
-};
+static const u8 sRequiredMoveCounts[] = {3, 3, 3, 2, 2, 2, 2};
-static const union AnimCmd gUnknown_086104A4[] =
+static const u16 sMoves_TotalPreparation[] =
{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
+ MOVE_SWORDS_DANCE, MOVE_GROWTH, MOVE_MEDITATE, MOVE_AGILITY, MOVE_DOUBLE_TEAM, MOVE_HARDEN,
+ MOVE_MINIMIZE, MOVE_WITHDRAW, MOVE_DEFENSE_CURL, MOVE_BARRIER, MOVE_FOCUS_ENERGY, MOVE_AMNESIA,
+ MOVE_ACID_ARMOR, MOVE_SHARPEN, MOVE_CONVERSION, MOVE_CONVERSION_2, MOVE_BELLY_DRUM, MOVE_PSYCH_UP,
+ MOVE_CHARGE, MOVE_SNATCH, MOVE_TAIL_GLOW, MOVE_COSMIC_POWER, MOVE_IRON_DEFENSE, MOVE_HOWL, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DRAGON_DANCE,
+ 0
};
-static const union AnimCmd gUnknown_086104AC[] =
+static const u16 sMoves_ImpossibleToPredict[] =
{
- ANIMCMD_FRAME(0, 30),
- ANIMCMD_END,
+ MOVE_MIMIC, MOVE_METRONOME, MOVE_MIRROR_MOVE, MOVE_TRANSFORM, MOVE_SUBSTITUTE, MOVE_SKETCH, MOVE_CURSE,
+ MOVE_PRESENT, MOVE_FOLLOW_ME, MOVE_TRICK, MOVE_ROLE_PLAY, MOVE_ASSIST, MOVE_SKILL_SWAP, MOVE_CAMOUFLAGE,
+ 0
};
-static const union AnimCmd gUnknown_086104B4[] =
+static const u16 sMoves_WeakeningTheFoe[] =
{
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(0, 32),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_END,
+ MOVE_SAND_ATTACK, MOVE_TAIL_WHIP, MOVE_LEER, MOVE_GROWL, MOVE_STRING_SHOT, MOVE_SCREECH, MOVE_SMOKESCREEN, MOVE_KINESIS,
+ MOVE_FLASH, MOVE_COTTON_SPORE, MOVE_SPITE, MOVE_SCARY_FACE, MOVE_CHARM, MOVE_KNOCK_OFF, MOVE_SWEET_SCENT, MOVE_FEATHER_DANCE,
+ MOVE_FAKE_TEARS, MOVE_METAL_SOUND, MOVE_TICKLE,
+ 0
};
-static const union AnimCmd * const gUnknown_086104FC[] =
+static const u16 sMoves_HighRiskHighReturn[] =
{
- gUnknown_0861049C,
+ MOVE_GUILLOTINE, MOVE_HORN_DRILL, MOVE_DOUBLE_EDGE, MOVE_HYPER_BEAM, MOVE_COUNTER, MOVE_FISSURE,
+ MOVE_BIDE, MOVE_SELF_DESTRUCT, MOVE_SKY_ATTACK, MOVE_EXPLOSION, MOVE_FLAIL, MOVE_REVERSAL, MOVE_DESTINY_BOND,
+ MOVE_PERISH_SONG, MOVE_PAIN_SPLIT, MOVE_MIRROR_COAT, MOVE_MEMENTO, MOVE_GRUDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH,
+ MOVE_BLAST_BURN, MOVE_HYDRO_CANNON, MOVE_OVERHEAT, MOVE_FRENZY_PLANT, MOVE_PSYCHO_BOOST, MOVE_VOLT_TACKLE,
+ 0
};
-static const union AnimCmd * const gUnknown_08610500[] =
+static const u16 sMoves_Endurance[] =
{
- gUnknown_086104A4,
+ MOVE_MIST, MOVE_RECOVER, MOVE_LIGHT_SCREEN, MOVE_HAZE, MOVE_REFLECT, MOVE_SOFT_BOILED, MOVE_REST, MOVE_PROTECT,
+ MOVE_DETECT, MOVE_ENDURE, MOVE_MILK_DRINK, MOVE_HEAL_BELL, MOVE_SAFEGUARD, MOVE_BATON_PASS, MOVE_MORNING_SUN,
+ MOVE_SYNTHESIS, MOVE_MOONLIGHT, MOVE_SWALLOW, MOVE_WISH, MOVE_INGRAIN, MOVE_MAGIC_COAT, MOVE_RECYCLE, MOVE_REFRESH,
+ MOVE_MUD_SPORT, MOVE_SLACK_OFF, MOVE_AROMATHERAPY, MOVE_WATER_SPORT,
+ 0
};
-static const union AnimCmd * const gUnknown_08610504[] =
+static const u16 sMoves_SlowAndSteady[] =
{
- gUnknown_086104AC,
- gUnknown_086104B4,
+ MOVE_SING, MOVE_SUPERSONIC, MOVE_DISABLE, MOVE_LEECH_SEED, MOVE_POISON_POWDER, MOVE_STUN_SPORE, MOVE_SLEEP_POWDER,
+ MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_HYPNOSIS, MOVE_CONFUSE_RAY, MOVE_GLARE, MOVE_POISON_GAS, MOVE_LOVELY_KISS, MOVE_SPORE,
+ MOVE_SPIDER_WEB, MOVE_SWEET_KISS, MOVE_SPIKES, MOVE_SWAGGER, MOVE_MEAN_LOOK, MOVE_ATTRACT, MOVE_ENCORE, MOVE_TORMENT,
+ MOVE_FLATTER, MOVE_WILL_O_WISP, MOVE_TAUNT, MOVE_YAWN, MOVE_IMPRISON, MOVE_SNATCH, MOVE_TEETER_DANCE, MOVE_GRASS_WHISTLE, MOVE_BLOCK,
+ 0
};
-static const union AffineAnimCmd gUnknown_0861050C[] =
+static const u16 sMoves_DependsOnTheBattlesFlow[] =
{
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(256, 5, 0, 0),
- AFFINEANIMCMD_END,
+ MOVE_SANDSTORM, MOVE_RAIN_DANCE, MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_WEATHER_BALL,
+ 0
};
-static const union AffineAnimCmd gUnknown_0861056C[] =
+static const u16 *const sMoveStyles[] =
{
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_END,
+ sMoves_TotalPreparation,
+ sMoves_SlowAndSteady,
+ sMoves_Endurance,
+ sMoves_HighRiskHighReturn,
+ sMoves_WeakeningTheFoe,
+ sMoves_ImpossibleToPredict,
+ sMoves_DependsOnTheBattlesFlow,
};
-static const union AffineAnimCmd gUnknown_086105BC[] =
+static void (* const gUnknown_08612120[])(void) =
{
- AFFINEANIMCMD_FRAME(256, 256, 0, 0),
- AFFINEANIMCMD_END,
+ sub_81A5E94,
+ sub_81A5FA8,
+ sub_81A6054,
+ sub_81A613C,
+ nullsub_75,
+ nullsub_123,
+ sub_81A6188,
+ sub_81A6198,
+ sub_81A61A4,
+ sub_81A63CC,
+ sub_81A64C4,
+ sub_81A63B8,
+ sub_81A61B0,
+ sub_81A67EC,
+ sub_81A6A08,
+ sub_81A6AEC,
+ sub_81A6C1C,
};
-static const union AffineAnimCmd * const gUnknown_086105CC[] =
+static const u32 gUnknown_08612164[][2] =
{
- gUnknown_0861050C,
- gUnknown_0861056C,
- gUnknown_086105BC,
+ {0x100, 0x200},
+ {0x1000000, 0x2000000},
};
-static const struct SpriteTemplate gUnknown_086105D8 =
+static const u32 gUnknown_08612174[][2] =
{
- .tileTag = TAG_TILE_64,
- .paletteTag = TAG_PAL_BALL_GREY,
- .oam = &gUnknown_0861047C,
- .anims = gUnknown_08610504,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_819A44C
+ {0xfffffeff, 0xfffffdff},
+ {0xfeffffff, 0xfdffffff},
};
-static const struct SpriteTemplate gUnknown_086105F0 =
+static const u8 sFixedIVTable[][2] =
{
- .tileTag = TAG_TILE_65,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_08610484,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
+ {3, 6},
+ {6, 9},
+ {9, 12},
+ {12, 15},
+ {15, 18},
+ {21, 31},
+ {31, 31},
+ {31, 31},
};
-static const struct SpriteTemplate gUnknown_08610608 =
+static const u16 sMonsToChooseFrom[][2] =
{
- .tileTag = TAG_TILE_66,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_0861048C,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
+ {0x006e, 0x00c7},
+ {0x00a2, 0x010a},
+ {0x010b, 0x0173},
+ {0x0174, 0x01d3},
+ {0x01d4, 0x0233},
+ {0x0234, 0x0293},
+ {0x0294, 0x02f3},
+ {0x0174, 0x0351},
+ {0x0174, 0x01d3},
+ {0x01d4, 0x0233},
+ {0x0234, 0x0293},
+ {0x0294, 0x02f3},
+ {0x0174, 0x0371},
+ {0x0174, 0x0371},
+ {0x0174, 0x0371},
+ {0x0174, 0x0371},
};
-static const struct SpriteTemplate gUnknown_08610620 =
-{
- .tileTag = TAG_TILE_67,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_0861048C,
- .anims = gUnknown_086104FC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610638 =
-{
- .tileTag = TAG_TILE_6D,
- .paletteTag = TAG_PAL_67,
- .oam = &gUnknown_08610494,
- .anims = gUnknown_08610500,
- .images = NULL,
- .affineAnims = gUnknown_086105CC,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteSheet gUnknown_08610650[] =
-{
- {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
- {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
- {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
- {gUnknown_0860F63C, sizeof(gUnknown_0860F63C), TAG_TILE_68},
- {gUnknown_0860F6BC, sizeof(gUnknown_0860F6BC), TAG_TILE_69},
- {gUnknown_0860F7BC, 0x100, TAG_TILE_6A},
- {gUnknown_0860F83C, sizeof(gUnknown_0860F83C), TAG_TILE_6B},
- {gUnknown_0860F93C, sizeof(gUnknown_0860F93C), TAG_TILE_6C},
- {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
- {},
-};
-
-static const struct CompressedSpriteSheet gUnknown_086106A0[] =
-{
- {gUnknown_085B18AC, 0x800, TAG_TILE_64},
- {},
-};
-
-static const struct SpritePalette gUnknown_086106B0[] =
-{
- {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
- {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
- {gUnknown_0860F17C, TAG_PAL_66},
- {gUnknown_0861039C, TAG_PAL_67},
- {},
-};
-
-static const struct OamData gUnknown_086106D8 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 2,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_086106E0 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct OamData gUnknown_086106E8 =
-{
- .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 gUnknown_086106F0 =
-{
- .y = 0,
- .affineMode = 3,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 0,
- .affineParam = 1,
-};
-
-static const union AnimCmd gUnknown_086106F8[] =
-{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
-};
-
-static const union AnimCmd gUnknown_08610700[] =
-{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
-};
-
-static const union AnimCmd gUnknown_08610708[] =
-{
- ANIMCMD_FRAME(0, 30),
- ANIMCMD_END,
-};
-
-static const union AnimCmd gUnknown_08610710[] =
-{
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(16, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(32, 4),
- ANIMCMD_FRAME(0, 4),
- ANIMCMD_FRAME(0, 32),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(16, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_FRAME(32, 8),
- ANIMCMD_FRAME(0, 8),
- ANIMCMD_END,
-};
-
-static const union AnimCmd * const gUnknown_08610758[] =
-{
- gUnknown_086106F8,
-};
-
-static const union AnimCmd * const gUnknown_0861075C[] =
-{
- gUnknown_08610700,
-};
-
-static const union AnimCmd * const gUnknown_08610760[] =
-{
- gUnknown_08610708,
- gUnknown_08610710,
-};
-
-static const union AffineAnimCmd gUnknown_08610768[] =
-{
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(256, 5, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd gUnknown_086107C8[] =
-{
- AFFINEANIMCMD_FRAME(128, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(64, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(32, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(16, 5, 0, 0),
- AFFINEANIMCMD_FRAME(0, 0, 0, 1),
- AFFINEANIMCMD_FRAME(5, 5, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd gUnknown_08610818[] =
-{
- AFFINEANIMCMD_FRAME(256, 256, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-static const union AffineAnimCmd * const gUnknown_08610828[] =
-{
- gUnknown_08610768,
- gUnknown_086107C8,
- gUnknown_08610818,
-};
-
-static const struct SpriteTemplate gUnknown_08610834 =
-{
- .tileTag = TAG_TILE_64,
- .paletteTag = TAG_PAL_BALL_GREY,
- .oam = &gUnknown_086106D8,
- .anims = gUnknown_08610760,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_819A44C
-};
-
-static const struct SpriteTemplate gUnknown_0861084C =
-{
- .tileTag = TAG_TILE_65,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_086106E0,
- .anims = gUnknown_08610758,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610864 =
-{
- .tileTag = TAG_TILE_66,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_086106E8,
- .anims = gUnknown_08610758,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_0861087C =
-{
- .tileTag = TAG_TILE_67,
- .paletteTag = TAG_PAL_66,
- .oam = &gUnknown_086106E8,
- .anims = gUnknown_08610758,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
-static const struct SpriteTemplate gUnknown_08610894 =
-{
- .tileTag = TAG_TILE_6D,
- .paletteTag = TAG_PAL_67,
- .oam = &gUnknown_086106F0,
- .anims = gUnknown_0861075C,
- .images = NULL,
- .affineAnims = gUnknown_08610828,
- .callback = SpriteCallbackDummy
-};
-
-void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) =
-{
- sub_819F114,
- sub_819F0CC,
- sub_819F134,
-};
-
-static const struct BgTemplate sSwap_BgTemplates[4] =
-{
- {
- .bg = 0,
- .charBaseIndex = 0,
- .mapBaseIndex = 24,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 1,
- .baseTile = 0
- },
- {
- .bg = 1,
- .charBaseIndex = 1,
- .mapBaseIndex = 25,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 3,
- .baseTile = 0
- },
- {
- .bg = 2,
- .charBaseIndex = 2,
- .mapBaseIndex = 26,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
- {
- .bg = 3,
- .charBaseIndex = 2,
- .mapBaseIndex = 27,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 2,
- .baseTile = 0
- },
-};
-
-static const struct WindowTemplate sSwap_WindowTemplates[] =
-{
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 2,
- .width = 12,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x0001,
- },
- {
- .bg = 2,
- .tilemapLeft = 19,
- .tilemapTop = 2,
- .width = 11,
- .height = 2,
- .paletteNum = 14,
- .baseBlock = 0x0019,
- },
- {
- .bg = 0,
- .tilemapLeft = 0,
- .tilemapTop = 15,
- .width = 20,
- .height = 3,
- .paletteNum = 15,
- .baseBlock = 0x002f,
- },
- {
- .bg = 0,
- .tilemapLeft = 21,
- .tilemapTop = 14,
- .width = 9,
- .height = 6,
- .paletteNum = 15,
- .baseBlock = 0x006b,
- },
- {
- .bg = 0,
- .tilemapLeft = 22,
- .tilemapTop = 14,
- .width = 8,
- .height = 4,
- .paletteNum = 15,
- .baseBlock = 0x00a1,
- },
- {
- .bg = 2,
- .tilemapLeft = 21,
- .tilemapTop = 15,
- .width = 9,
- .height = 5,
- .paletteNum = 14,
- .baseBlock = 0x006b,
- },
- {
- .bg = 2,
- .tilemapLeft = 10,
- .tilemapTop = 2,
- .width = 4,
- .height = 2,
- .paletteNum = 14,
- .baseBlock = 0x00c1,
- },
- {
- .bg = 0,
- .tilemapLeft = 19,
- .tilemapTop = 2,
- .width = 11,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x00c9,
- },
- {
- .bg = 0,
- .tilemapLeft = 15,
- .tilemapTop = 0,
- .width = 15,
- .height = 2,
- .paletteNum = 15,
- .baseBlock = 0x00df,
- },
- DUMMY_WIN_TEMPLATE,
-};
-
-static const u16 gUnknown_08610918[] = {RGB_BLACK, RGB_BLACK, RGB_WHITE, RGB_BLACK, RGB_RED}; // Palette.
-static const u8 gUnknown_08610922[] = {0x0, 0x02, 0x0};
-static const u8 gUnknown_08610925[] = {0x0, 0x04, 0x0};
-
-static const struct SwapActionIdAndFunc sSwap_PlayerScreenActions[] =
+// code
+void CallBattleFactoryFunction(void)
{
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {3, Swap_ActionCancel},
-};
+ gUnknown_08612120[gSpecialVar_0x8004]();
+}
-static const struct SwapActionIdAndFunc sSwap_EnemyScreenActions[] =
+static void sub_81A5E94(void)
{
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {1, Swap_ActionMon},
- {2, Swap_ActionPkmnForSwap},
- {3, Swap_ActionCancel},
-};
-
-// gfx
-extern const u8 gFrontierFactorySelectMenu_Gfx[];
-extern const u8 gFrontierFactorySelectMenu_Tilemap[];
-extern const u16 gFrontierFactorySelectMenu_Pal[];
-
-// text
-extern const u8 gText_RentalPkmn2[];
-extern const u8 gText_SelectFirstPkmn[];
-extern const u8 gText_SelectSecondPkmn[];
-extern const u8 gText_SelectThirdPkmn[];
-extern const u8 gText_TheseThreePkmnOkay[];
-extern const u8 gText_CantSelectSamePkmn[];
-extern const u8 gText_Summary[];
-extern const u8 gText_Rechoose[];
-extern const u8 gText_Deselect[];
-extern const u8 gText_Rent[];
-extern const u8 gText_Others2[];
-extern const u8 gText_Yes2[];
-extern const u8 gText_Yes3[];
-extern const u8 gText_No2[];
-extern const u8 gText_No3[];
-extern const u8 gText_QuitSwapping[];
-extern const u8 gText_AcceptThisPkmn[];
-extern const u8 gText_SelectPkmnToAccept[];
-extern const u8 gText_SelectPkmnToSwap[];
-extern const u8 gText_PkmnSwap[];
-extern const u8 gText_Swap[];
-extern const u8 gText_Summary2[];
-extern const u8 gText_PkmnForSwap[];
-extern const u8 gText_SamePkmnInPartyAlready[];
-extern const u8 gText_Cancel3[];
+ u8 i;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
-// code
-static void sub_819A44C(struct Sprite *sprite)
-{
- if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED))
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 0;
+ if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612164[battleMode][lvlMode]))
{
- if (sprite->animEnded)
- {
- if (sprite->data[0] != 0)
- {
- sprite->data[0]--;
- }
- else if (Random() % 5 == 0)
- {
- StartSpriteAnim(sprite, 0);
- sprite->data[0] = 32;
- }
- else
- {
- StartSpriteAnim(sprite, 1);
- }
- }
- else
- {
- StartSpriteAnimIfDifferent(sprite, 1);
- }
- }
- else
- {
- StartSpriteAnimIfDifferent(sprite, 0);
+ gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = 0;
+ gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = 0;
}
-}
-static void Select_CB2(void)
-{
- AnimateSprites();
- BuildOamBuffer();
- RunTextPrinters();
- UpdatePaletteFade();
- RunTasks();
-}
-
-static void Select_VblankCb(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
+ gUnknown_03001288 = FALSE;
+ for (i = 0; i < 6; i++)
+ gSaveBlock2Ptr->frontier.field_E70[i].monId |= 0xFFFF;
+ for (i = 0; i < 3; i++)
+ gUnknown_03006298[i] |= 0xFFFF;
-void DoBattleFactorySelectScreen(void)
-{
- sFactorySelectScreen = NULL;
- SetMainCallback2(CB2_InitSelectScreen);
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ gTrainerBattleOpponent_A = 0;
}
-static void CB2_InitSelectScreen(void)
+static void sub_81A5FA8(void)
{
- u8 taskId;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- switch (gMain.state)
+ switch (gSpecialVar_0x8005)
{
- case 0:
- if (sFactorySelectMons != NULL)
- FREE_AND_SET_NULL(sFactorySelectMons);
- SetHBlankCallback(NULL);
- SetVBlankCallback(NULL);
- CpuFill32(0, (void *)VRAM, VRAM_SIZE);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sSelect_BgTemplates, ARRAY_COUNT(sSelect_BgTemplates));
- InitWindows(sSelect_WindowTemplates);
- DeactivateAllTextPrinters();
- gMain.state++;
- break;
case 1:
- sSelectMenuTilesetBuffer = Alloc(0x440);
- sSelectMonCardBgTilesetBuffer = AllocZeroed(0x440);
- sSelectMenuTilemapBuffer = Alloc(0x800);
- sSelectMonCardBgTilemapBuffer = AllocZeroed(0x800);
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- ChangeBgX(1, 0, 0);
- ChangeBgY(1, 0, 0);
- ChangeBgX(3, 0, 0);
- ChangeBgY(3, 0, 0);
- SetGpuReg(REG_OFFSET_BLDCNT, 0);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0);
- SetGpuReg(REG_OFFSET_BLDY, 0);
- SetGpuReg(REG_OFFSET_MOSAIC, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 0);
- SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_WIN1H, 0);
- SetGpuReg(REG_OFFSET_WIN1V, 0);
- SetGpuReg(REG_OFFSET_WININ, 0);
- SetGpuReg(REG_OFFSET_WINOUT, 0);
- gMain.state++;
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode];
break;
case 2:
- ResetPaletteFade();
- ResetSpriteData();
- ResetTasks();
- FreeAllSpritePalettes();
- CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440);
- CpuCopy16(gUnknown_0861033C, sSelectMonCardBgTilesetBuffer, 0x60);
- LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0);
- LoadBgTiles(3, sSelectMonCardBgTilesetBuffer, 0x60, 0);
- CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, 0x800);
- LoadBgTilemap(1, sSelectMenuTilemapBuffer, 0x800, 0);
- LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
- LoadPalette(gUnknown_0861046C, 0xF0, 8);
- LoadPalette(gUnknown_0861046C, 0xE0, 10);
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- gPlttBufferUnfaded[228] = sFactorySelectScreen->unk2A4;
- LoadPalette(gUnknown_0861039C, 0x20, 4);
- gMain.state++;
+ gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612164[battleMode][lvlMode]) != 0);
break;
case 3:
- SetBgTilemapBuffer(3, sSelectMonCardBgTilemapBuffer);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 2, 4, 8, 8);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 20, 4, 8, 8);
- CopyBgTilemapBufferToVram(3);
- gMain.state++;
- break;
- case 4:
- LoadSpritePalettes(gUnknown_086103F4);
- LoadSpriteSheets(gUnknown_086103BC);
- LoadCompressedObjectPic(gUnknown_086103E4);
- ShowBg(0);
- ShowBg(1);
- SetVBlankCallback(Select_VblankCb);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
- SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP);
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- {
- Select_SetWinRegs(88, 152, 32, 96);
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- }
- else
- {
- HideBg(3);
- }
- gMain.state++;
- break;
- case 5:
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- sFactorySelectScreen->cursorPos = gUnknown_0203CF20;
- Select_InitMonsData();
- Select_InitAllSprites();
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- Select_ShowSummaryMonSprite();
- gMain.state++;
- break;
- case 6:
- Select_PrintSelectMonString();
- PutWindowTilemap(2);
- gMain.state++;
- break;
- case 7:
- Select_PrintMonCategory();
- PutWindowTilemap(5);
- gMain.state++;
- break;
- case 8:
- Select_PrintMonSpecies();
- PutWindowTilemap(1);
- gMain.state++;
- break;
- case 9:
- Select_PrintRentalPkmnString();
- PutWindowTilemap(0);
- gMain.state++;
- break;
- case 10:
- sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Task_SelectFadeSpeciesName, 0);
- if (!sFactorySelectScreen->fromSummaryScreen)
- {
- gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 0;
- taskId = CreateTask(Task_HandleSelectionScreenChooseMons, 0);
- gTasks[taskId].data[0] = 0;
- }
- else
- {
- gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 1;
- sFactorySelectScreen->unk2A2 = FALSE;
- taskId = CreateTask(Task_HandleSelectionScreenMenu, 0);
- gTasks[taskId].data[0] = 13;
- }
- SetMainCallback2(Select_CB2);
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode];
break;
}
}
-static void Select_InitMonsData(void)
-{
- u8 i;
-
- if (sFactorySelectScreen != NULL)
- return;
-
- sFactorySelectScreen = AllocZeroed(sizeof(*sFactorySelectScreen));
- sFactorySelectScreen->cursorPos = 0;
- sFactorySelectScreen->selectingMonsState = 1;
- sFactorySelectScreen->fromSummaryScreen = FALSE;
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- sFactorySelectScreen->mons[i].selectedId = 0;
-
- if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
- CreateFrontierFactorySelectableMons(0);
- else
- CreateTentFactorySelectableMons(0);
-}
-
-static void Select_InitAllSprites(void)
-{
- u8 i, cursorPos;
- s16 x;
-
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- sFactorySelectScreen->mons[i].spriteId = CreateSprite(&gUnknown_086105D8, (35 * i) + 32, 64, 1);
- gSprites[sFactorySelectScreen->mons[i].spriteId].data[0] = 0;
- Select_SetBallSpritePaletteNum(i);
- }
- cursorPos = sFactorySelectScreen->cursorPos;
- x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
- sFactorySelectScreen->cursorSpriteId = CreateSprite(&gUnknown_086105F0, x, 88, 0);
- sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610608, 176, 112, 0);
- sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_08610620, 176, 144, 0);
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
-}
-
-static void Select_DestroyAllSprites(void)
-{
- u8 i;
-
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- DestroySprite(&gSprites[sFactorySelectScreen->mons[i].spriteId]);
-
- DestroySprite(&gSprites[sFactorySelectScreen->cursorSpriteId]);
- DestroySprite(&gSprites[sFactorySelectScreen->menuCursor1SpriteId]);
- DestroySprite(&gSprites[sFactorySelectScreen->menuCursor2SpriteId]);
-}
-
-static void Select_UpdateBallCursorPosition(s8 direction)
-{
- u8 cursorPos;
- if (direction > 0) // Move cursor right.
- {
- if (sFactorySelectScreen->cursorPos != SELECTABLE_MONS_COUNT - 1)
- sFactorySelectScreen->cursorPos++;
- else
- sFactorySelectScreen->cursorPos = 0;
- }
- else // Move cursor left.
- {
- if (sFactorySelectScreen->cursorPos != 0)
- sFactorySelectScreen->cursorPos--;
- else
- sFactorySelectScreen->cursorPos = SELECTABLE_MONS_COUNT - 1;
- }
-
- cursorPos = sFactorySelectScreen->cursorPos;
- gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
-}
-
-static void Select_UpdateMenuCursorPosition(s8 direction)
-{
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySelectScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
- sFactorySelectScreen->menuCursorPos++;
- else
- sFactorySelectScreen->menuCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySelectScreen->menuCursorPos != 0)
- sFactorySelectScreen->menuCursorPos--;
- else
- sFactorySelectScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
- }
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
-}
-
-static void Select_UpdateYesNoCursorPosition(s8 direction)
-{
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySelectScreen->yesNoCursorPos != 1)
- sFactorySelectScreen->yesNoCursorPos++;
- else
- sFactorySelectScreen->yesNoCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySelectScreen->yesNoCursorPos != 0)
- sFactorySelectScreen->yesNoCursorPos--;
- else
- sFactorySelectScreen->yesNoCursorPos = 1;
- }
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
-}
-
-static void Select_HandleMonSelectionChange(void)
-{
- u8 i, paletteNum;
- u8 cursorPos = sFactorySelectScreen->cursorPos;
- if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon.
- {
- paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
- if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1)
- {
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- if (sFactorySelectScreen->mons[i].selectedId == 2)
- break;
- }
- if (i == SELECTABLE_MONS_COUNT)
- return;
- else
- sFactorySelectScreen->mons[i].selectedId = 1;
- }
- sFactorySelectScreen->mons[cursorPos].selectedId = 0;
- sFactorySelectScreen->selectingMonsState--;
- }
- else // Select a mon.
- {
- paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
- sFactorySelectScreen->mons[cursorPos].selectedId = sFactorySelectScreen->selectingMonsState;
- sFactorySelectScreen->selectingMonsState++;
- }
-
- gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].oam.paletteNum = paletteNum;
-}
-
-static void Select_SetBallSpritePaletteNum(u8 id)
-{
- u8 palNum;
-
- if (sFactorySelectScreen->mons[id].selectedId)
- palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
- else
- palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
-
- gSprites[sFactorySelectScreen->mons[id].spriteId].oam.paletteNum = palNum;
-}
-
-static void Task_FromSelectScreenToSummaryScreen(u8 taskId)
+static void sub_81A6054(void)
{
- u8 i;
- u8 currMonId;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- switch (gTasks[taskId].data[0])
+ switch (gSpecialVar_0x8005)
{
- case 6:
- gPlttBufferUnfaded[228] = gPlttBufferFaded[228];
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0] = 7;
- break;
- case 7:
- if (!gPaletteFade.active)
- {
- DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
- sub_819F444(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0);
- Select_DestroyAllSprites();
- FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSelectMonCardBgTilesetBuffer);
- FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
- FreeAllWindowBuffers();
- gTasks[taskId].data[0] = 8;
- }
- break;
- case 8:
- sFactorySelectScreen->unk2A4 = gPlttBufferUnfaded[228];
- DestroyTask(taskId);
- sFactorySelectScreen->fromSummaryScreen = TRUE;
- currMonId = sFactorySelectScreen->cursorPos;
- sFactorySelectMons = AllocZeroed(sizeof(struct Pokemon) * SELECTABLE_MONS_COUNT);
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- sFactorySelectMons[i] = sFactorySelectScreen->mons[i].monData;
- ShowPokemonSummaryScreen(1, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen);
+ case 1:
+ gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
break;
- }
-}
-
-static void Task_CloseSelectionScreen(u8 taskId)
-{
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 0:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0]++;
- break;
- case 1:
- if (!UpdatePaletteFade())
- {
- Select_CopyMonsToPlayerParty();
- DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
- Select_DestroyAllSprites();
- FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
- FREE_AND_SET_NULL(sFactorySelectScreen);
- FreeAllWindowBuffers();
- SetMainCallback2(CB2_ReturnToFieldContinueScript);
- DestroyTask(taskId);
- }
- break;
- }
- }
-}
-
-static void Task_HandleSelectionScreenYesNo(u8 taskId)
-{
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 10:
- sub_819C4B4();
- gTasks[taskId].data[0] = 4;
- break;
- case 4:
- Select_ShowYesNoOptions();
- gTasks[taskId].data[0] = 5;
- break;
- case 5:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- if (sFactorySelectScreen->yesNoCursorPos == 0)
- {
- sub_819C568();
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = Task_CloseSelectionScreen;
- }
- else
- {
- sub_819B958(4);
- sub_819BC9C();
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819B958(4);
- sub_819BC9C();
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- PlaySE(SE_SELECT);
- Select_UpdateYesNoCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- PlaySE(SE_SELECT);
- Select_UpdateYesNoCursorPosition(1);
- }
- break;
- }
- }
-}
-
-static void Task_HandleSelectionScreenMenu(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
case 2:
- if (!sFactorySelectScreen->fromSummaryScreen)
- sub_819F2B4(&sFactorySelectScreen->unk294[1].field1, &sFactorySelectScreen->unk2A0, FALSE);
- gTasks[taskId].data[0] = 9;
- break;
- case 9:
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- Select_ShowMenuOptions();
- sFactorySelectScreen->fromSummaryScreen = FALSE;
- gTasks[taskId].data[0] = 3;
- }
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_08612164[battleMode][lvlMode];
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_08612174[battleMode][lvlMode];
break;
case 3:
- if (gMain.newKeys & A_BUTTON)
+ if (gUnknown_03001288 == TRUE)
{
- u8 retVal;
- PlaySE(SE_SELECT);
- retVal = Select_RunMenuOptionFunc();
- if (retVal == 1)
- {
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else if (retVal == 2)
- {
- gTasks[taskId].data[0] = 10;
- gTasks[taskId].func = Task_HandleSelectionScreenYesNo;
- }
- else if (retVal == 3)
- {
- gTasks[taskId].data[0] = 11;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else
- {
- gTasks[taskId].data[0] = 6;
- gTasks[taskId].func = Task_FromSelectScreenToSummaryScreen;
- }
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- sub_819B958(3);
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- PlaySE(SE_SELECT);
- Select_UpdateMenuCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- PlaySE(SE_SELECT);
- Select_UpdateMenuCursorPosition(1);
+ gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode] = gSpecialVar_0x8006;
+ gUnknown_03001288 = FALSE;
}
break;
- case 12:
- if (!gPaletteFade.active)
- {
- if (sFactorySelectScreen->fromSummaryScreen == TRUE)
- {
- gPlttBufferFaded[228] = sFactorySelectScreen->unk2A4;
- gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244];
- }
- sFactorySelectScreen->fromSummaryScreen = FALSE;
- gTasks[taskId].data[0] = 3;
- }
- break;
- case 13:
- Select_ShowMenuOptions();
- gTasks[taskId].data[0] = 12;
- break;
}
}
-static void Task_HandleSelectionScreenChooseMons(u8 taskId)
+static void sub_81A613C(void)
{
- if (sFactorySelectScreen->unk2A0 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 0:
- if (!gPaletteFade.active)
- {
- gTasks[taskId].data[0] = 1;
- sFactorySelectScreen->unk2A2 = TRUE;
- }
- break;
- case 1:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sFactorySelectScreen->unk2A2 = FALSE;
- gTasks[taskId].data[0] = 2;
- gTasks[taskId].func = Task_HandleSelectionScreenMenu;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
- {
- PlaySE(SE_SELECT);
- Select_UpdateBallCursorPosition(-1);
- Select_PrintMonCategory();
- Select_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
- {
- PlaySE(SE_SELECT);
- Select_UpdateBallCursorPosition(1);
- Select_PrintMonCategory();
- Select_PrintMonSpecies();
- }
- break;
- case 11:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- Select_PrintSelectMonString();
- sFactorySelectScreen->unk2A2 = TRUE;
- gTasks[taskId].data[0] = 1;
- }
- break;
- }
- }
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = 1;
+ sub_81A4C30();
}
-static void CreateFrontierFactorySelectableMons(u8 firstMonId)
+static void nullsub_75(void)
{
- u8 i, j = 0;
- u8 ivs = 0;
- u8 level = 0;
- u8 happiness = 0;
- u32 otId = 0;
- u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
- u8 var_2C = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
- u8 var_28 = 0;
-
- gFacilityTrainerMons = gBattleFrontierMons;
- if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
- level = 100;
- else
- level = 50;
- var_28 = sub_81A6F70(battleMode, lvlMode);
- otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
-
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
- sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
- if (i < var_28)
- ivs = sub_81A6CA8(var_2C + 1, 0);
- else
- ivs = sub_81A6CA8(var_2C, 0);
- CreateMonWithEVSpreadPersonalityOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
- gFacilityTrainerMons[monSetId].species,
- level,
- gFacilityTrainerMons[monSetId].nature,
- ivs,
- gFacilityTrainerMons[monSetId].evSpread,
- otId);
- happiness = 0;
- for (j = 0; j < 4; j++)
- SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
- }
}
-static void CreateTentFactorySelectableMons(u8 firstMonId)
+static void nullsub_123(void)
{
- u8 i, j;
- u8 ivs = 0;
- u8 level = 30;
- u8 happiness = 0;
- u32 otId = 0;
- gFacilityTrainerMons = gSlateportBattleTentMons;
- otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
-
- for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
- {
- u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
- sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
- CreateMonWithEVSpreadPersonalityOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
- gFacilityTrainerMons[monSetId].species,
- level,
- gFacilityTrainerMons[monSetId].nature,
- ivs,
- gFacilityTrainerMons[monSetId].evSpread,
- otId);
- happiness = 0;
- for (j = 0; j < 4; j++)
- SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
- }
}
-static void Select_CopyMonsToPlayerParty(void)
+static void sub_81A6188(void)
{
- u8 i, j;
-
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
- {
- if (sFactorySelectScreen->mons[j].selectedId == i + 1)
- {
- gPlayerParty[i] = sFactorySelectScreen->mons[j].monData;
- gSaveBlock2Ptr->frontier.field_E70[i].monId = sFactorySelectScreen->mons[j].monSetId;
- gSaveBlock2Ptr->frontier.field_E70[i].personality = GetMonData(&gPlayerParty[i].box, MON_DATA_PERSONALITY, NULL);
- gSaveBlock2Ptr->frontier.field_E70[i].abilityBit = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ALT_ABILITY, NULL);
- gSaveBlock2Ptr->frontier.field_E70[i].ivs = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ATK_IV, NULL);
- break;
- }
- }
- }
- CalculatePlayerPartyCount();
+ ZeroPlayerPartyMons();
+ DoBattleFactorySelectScreen();
}
-static void Select_ShowMenuOptions(void)
+static void sub_81A6198(void)
{
- if (!sFactorySelectScreen->fromSummaryScreen)
- sFactorySelectScreen->menuCursorPos = 0;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Select_PrintMenuOptions();
-}
-
-static void Select_ShowYesNoOptions(void)
-{
- sFactorySelectScreen->yesNoCursorPos = 0;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = 112;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = 112;
-
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Select_PrintYesNoOptions();
-}
-
-static void sub_819B958(u8 windowId)
-{
- gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
- FillWindowPixelBuffer(windowId, 0);
- CopyWindowToVram(windowId, 2);
- ClearWindowTilemap(windowId);
-}
-
-static void Select_PrintRentalPkmnString(void)
-{
- FillWindowPixelBuffer(0, 0);
- AddTextPrinterParameterized(0, 1, gText_RentalPkmn2, 2, 1, 0, NULL);
- CopyWindowToVram(0, 3);
-}
-
-static void Select_PrintMonSpecies(void)
-{
- u16 species;
- u8 x;
- u8 monId = sFactorySelectScreen->cursorPos;
-
- FillWindowPixelBuffer(1, 0);
- species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610479, 0, gStringVar4);
- CopyWindowToVram(1, 2);
-}
-
-static void Select_PrintSelectMonString(void)
-{
- const u8 *str = NULL;
-
- FillWindowPixelBuffer(2, 0);
- if (sFactorySelectScreen->selectingMonsState == 1)
- str = gText_SelectFirstPkmn;
- else if (sFactorySelectScreen->selectingMonsState == 2)
- str = gText_SelectSecondPkmn;
- else if (sFactorySelectScreen->selectingMonsState == 3)
- str = gText_SelectThirdPkmn;
- else
- str = gText_TheseThreePkmnOkay;
-
- AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
- CopyWindowToVram(2, 2);
-}
-
-static void Select_PrintCantSelectSameMon(void)
-{
- FillWindowPixelBuffer(2, 0);
- AddTextPrinterParameterized(2, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL);
- CopyWindowToVram(2, 2);
+ DoBattleFactorySwapScreen();
}
-static void Select_PrintMenuOptions(void)
+static void sub_81A61A4(void)
{
- u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
-
- PutWindowTilemap(3);
- FillWindowPixelBuffer(3, 0);
- AddTextPrinterParameterized3(3, 1, 7, 1, gUnknown_08610476, 0, gText_Summary);
- if (selectedId != 0)
- AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Deselect);
- else
- AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Rent);
-
- AddTextPrinterParameterized3(3, 1, 7, 33, gUnknown_08610476, 0, gText_Others2);
- CopyWindowToVram(3, 3);
+ gUnknown_03001288 = TRUE;
}
-static void Select_PrintYesNoOptions(void)
+static void sub_81A61B0(void)
{
- PutWindowTilemap(4);
- FillWindowPixelBuffer(4, 0);
- AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610476, 0, gText_Yes2);
- AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610476, 0, gText_No2);
- CopyWindowToVram(4, 3);
-}
+ s32 i, j, k;
+ u16 species[3];
+ u16 heldItems[3];
+ s32 firstMonId = 0;
+ u16 trainerId = 0;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u32 winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode];
+ u32 challengeNum = winStreak / 7;
+ gFacilityTrainers = gBattleFrontierTrainers;
-static u8 Select_RunMenuOptionFunc(void)
-{
- gUnknown_030062E8 = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos];
- return gUnknown_030062E8();
-}
-
-static u8 Select_OptionRentDeselect(void)
-{
- u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
- u16 monSetId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monSetId;
- if (selectedId == 0 && !Select_AreSpeciesValid(monSetId))
+ do
{
- Select_PrintCantSelectSameMon();
- sub_819B958(3);
- return 3;
- }
- else
- {
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- Select_HandleMonSelectionChange();
- Select_PrintSelectMonString();
- sub_819B958(3);
- if (sFactorySelectScreen->selectingMonsState > 3)
- return 2;
- else
- return 1;
- }
-}
-
-static u8 sub_819BC9C(void)
-{
- sub_819C568();
- Select_HandleMonSelectionChange();
- Select_PrintSelectMonString();
- sub_819B958(3);
- if (sFactorySelectScreen->selectingMonsState > 3)
- return 2;
- else
- return 1;
-}
-
-static u8 Select_OptionSummary(void)
-{
- return 0;
-}
-
-static u8 Select_OptionOthers(void)
-{
- sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
- sub_819B958(3);
- return 1;
-}
-
-static void Select_PrintMonCategory(void)
-{
- u16 species;
- u8 text[30];
- u8 x;
- u8 monId = sFactorySelectScreen->cursorPos;
- if (monId < SELECTABLE_MONS_COUNT)
- {
- PutWindowTilemap(5);
- FillWindowPixelBuffer(5, 0);
- species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
- CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
- x = GetStringRightAlignXOffset(1, text, 0x76);
- AddTextPrinterParameterized(5, 1, text, x, 1, 0, NULL);
- CopyWindowToVram(5, 2);
- }
-}
-
-static void Summary_ShowMonSprite(void)
-{
- u8 monId = sFactorySelectScreen->cursorPos;
- struct Pokemon *mon = &sFactorySelectScreen->mons[monId].monData;
- u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
-
- sFactorySelectScreen->unk2A0 = FALSE;
-}
-
-static void sub_819BE20(bool8 arg0)
-{
- sFactorySelectScreen->unk2A0 = arg0;
-}
-
-static void Select_ShowSummaryMonSprite(void)
-{
- struct Pokemon *mon;
- u16 species;
- u32 personality, otId;
-
- sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 2);
-
- mon = &sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monData;
- species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
-
- gSprites[sFactorySelectScreen->unk294[1].field1].invisible = TRUE;
-}
-
-static void Select_ShowChosenMonsSprites(void)
-{
- u8 i, j;
-
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ trainerId = sub_8162548(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum);
+ for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
{
- if (sFactorySelectScreen->mons[j].selectedId == i + 1)
- {
- struct Pokemon *mon = &sFactorySelectScreen->mons[j].monData;
- u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySelectScreen->unk294[i].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF);
- gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecX = 0;
- gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecY = 0;
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
break;
- }
}
- }
- sFactorySelectScreen->unk2A0 = FALSE;
-}
-
-static void sub_819C040(struct Sprite *sprite)
-{
- u8 taskId;
-
- if (sprite->affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
- {
- sprite->invisible = TRUE;
- gSprites[sFactorySelectScreen->unk294[0].field1].invisible = TRUE;
- gSprites[sFactorySelectScreen->unk294[2].field1].invisible = TRUE;
-
- taskId = CreateTask(sub_819C1D0, 1);
- gTasks[taskId].func(taskId);
-
- sprite->callback = SpriteCallbackDummy;
- }
-}
+ } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
-static void sub_819C100(struct Sprite *sprite)
-{
- if (sprite->affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
- && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
- {
- FreeOamMatrix(sprite->oam.matrixNum);
- FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[0].field1].oam.matrixNum);
- FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[2].field1].oam.matrixNum);
+ gTrainerBattleOpponent_A = trainerId;
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6)
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = trainerId;
- sFactorySelectScreen->unk2A0 = FALSE;
-
- DestroySprite(&gSprites[sFactorySelectScreen->unk294[0].field1]);
- DestroySprite(&gSprites[sFactorySelectScreen->unk294[2].field1]);
- DestroySprite(sprite);
- }
-}
-
-static void sub_819C1D0(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
+ i = 0;
+ while (i != 3)
{
- case 0:
- task->data[3] = 16;
- task->data[24] = 224; // BUG: writing outside the array's bounds.
- task->data[5] = 64;
- task->data[8] = 65;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- break;
- case 1:
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- break;
- case 2:
- task->data[5] -= 4;
- task->data[8] += 4;
- if (task->data[5] <= 32 || task->data[8] >= 96)
- {
- task->data[5] = 32;
- task->data[8] = 96;
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- }
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] != 32)
- return;
- break;
- default:
- DestroyTask(taskId);
- Select_ShowChosenMonsSprites();
- return;
- }
- task->data[0]++;
-}
+ u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
+ if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ continue;
-static void sub_819C2D4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
- {
- default:
- HideBg(3);
- gSprites[sFactorySelectScreen->unk294[1].field1].invisible = FALSE;
- gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C100;
- gSprites[sFactorySelectScreen->unk294[0].field1].invisible = FALSE;
- gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
- gSprites[sFactorySelectScreen->unk294[2].field1].invisible = FALSE;
- gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 1);
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[0].field1], 1);
- StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[2].field1], 1);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- DestroyTask(taskId);
- break;
- case 0:
- task->data[3] = 16;
- task->data[24] = 224; // BUG: writing outside the array's bounds.
- task->data[5] = 32;
- task->data[8] = 96;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- task->data[0]++;
- break;
- case 1:
- task->data[5] += 4;
- task->data[8] -= 4;
- if (task->data[5] >= 64 || task->data[8] <= 65)
+ for (j = 0; j < 6; j++)
{
- task->data[5] = 64;
- task->data[8] = 65;
+ if (gFacilityTrainerMons[monSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[j].monId].species)
+ break;
}
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] == 64)
- task->data[0]++;
- break;
- }
-}
+ if (j != 6)
+ continue;
-static void sub_819C4B4(void)
-{
- sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
- sFactorySelectScreen->unk294[0].field1 = CreateSprite(&gUnknown_08610638, 44, 64, 1);
- sFactorySelectScreen->unk294[2].field1 = CreateSprite(&gUnknown_08610638, 196, 64, 1);
-
- gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C040;
- gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
- gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
+ if (lvlMode == FRONTIER_LVL_50 && monSetId > 849)
+ continue;
- sFactorySelectScreen->unk2A0 = TRUE;
-}
-
-static void sub_819C568(void)
-{
- u8 taskId;
-
- FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[0].field0);
- FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[1].field0);
- FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[2].field0);
-
- taskId = CreateTask(sub_819C2D4, 1);
- gTasks[taskId].func(taskId);
-
- sFactorySelectScreen->unk2A0 = TRUE;
-}
-
-static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V)
-{
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(mWin0H, nWin0H));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(mWin0V, nWin0V));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
-}
-
-static bool32 Select_AreSpeciesValid(u16 monSetId)
-{
- u8 i, j;
- u32 species = gFacilityTrainerMons[monSetId].species;
- u8 selectState = sFactorySelectScreen->selectingMonsState;
-
- for (i = 1; i < selectState; i++)
- {
- for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ for (k = firstMonId; k < firstMonId + i; k++)
{
- if (sFactorySelectScreen->mons[j].selectedId == i)
- {
- if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monSetId].species == species)
- return FALSE;
-
+ if (species[k] == gFacilityTrainerMons[monSetId].species)
break;
- }
}
- }
-
- return TRUE;
-}
+ if (k != firstMonId + i)
+ continue;
-static void Task_SelectFadeSpeciesName(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 0:
- sFactorySelectScreen->unk2A7 = 0;
- sFactorySelectScreen->unk2A8 = 0;
- sFactorySelectScreen->unk2A6 = TRUE;
- gTasks[taskId].data[0] = 1;
- break;
- case 1:
- if (sFactorySelectScreen->unk2A2)
- {
- if (sFactorySelectScreen->unk2A9)
- {
- gTasks[taskId].data[0] = 2;
- }
- else
- {
- sFactorySelectScreen->unk2A7++;
- if (sFactorySelectScreen->unk2A7 > 6)
- {
- sFactorySelectScreen->unk2A7 = 0;
- if (!sFactorySelectScreen->unk2A6)
- sFactorySelectScreen->unk2A8--;
- else
- sFactorySelectScreen->unk2A8++;
- }
- BlendPalettes(0x4000, sFactorySelectScreen->unk2A8, 0);
- if (sFactorySelectScreen->unk2A8 > 5)
- {
- sFactorySelectScreen->unk2A6 = FALSE;
- }
- else if (sFactorySelectScreen->unk2A8 == 0)
- {
- gTasks[taskId].data[0] = 2;
- sFactorySelectScreen->unk2A6 = TRUE;
- }
- }
- }
- break;
- case 2:
- if (sFactorySelectScreen->unk2A9 > 14)
+ for (k = firstMonId; k < firstMonId + i; k++)
{
- sFactorySelectScreen->unk2A9 = 0;
- gTasks[taskId].data[0] = 1;
- }
- else
- {
- sFactorySelectScreen->unk2A9++;
+ if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ break;
}
- break;
- }
-}
-
-// Swap Screen's section begins here.
-
-static void Swap_CB2(void)
-{
- AnimateSprites();
- BuildOamBuffer();
- RunTextPrinters();
- UpdatePaletteFade();
- RunTasks();
-}
-
-static void Swap_VblankCb(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
-
-static void CopySwappedMonData(void)
-{
- u8 happiness;
-
- gPlayerParty[sFactorySwapScreen->playerMonId] = gEnemyParty[sFactorySwapScreen->enemyMonId];
- happiness = 0;
- SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &happiness);
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].monId;
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].ivs;
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].personality = GetMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId], MON_DATA_PERSONALITY, NULL);
- gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].abilityBit = GetBoxMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId].box, MON_DATA_ALT_ABILITY, NULL);
-}
+ if (k != firstMonId + i)
+ continue;
-static void Task_FromSwapScreenToSummaryScreen(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 6:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0] = 7;
- break;
- case 7:
- if (!gPaletteFade.active)
- {
- DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
- sub_819F444(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30);
- Swap_DestroyAllSprites();
- FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
- FreeAllWindowBuffers();
- gTasks[taskId].data[0] = 8;
- }
- break;
- case 8:
- DestroyTask(taskId);
- sFactorySwapScreen->fromSummaryScreen = TRUE;
- sFactorySwapScreen->unk24 = gPlttBufferUnfaded[244];
- ShowPokemonSummaryScreen(0, gPlayerParty, sFactorySwapScreen->cursorPos, 3 - 1, CB2_InitSwapScreen);
- break;
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ gUnknown_03006298[i] = monSetId;
+ i++;
}
}
-static void Task_CloseSwapScreen(u8 taskId)
+static void sub_81A63B8(void)
{
- if (sFactorySwapScreen->unk30 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 0:
- if (sFactorySwapScreen->monSwapped == TRUE)
- {
- gTasks[taskId].data[0]++;
- gSpecialVar_Result = 0;
- }
- else
- {
- gTasks[taskId].data[0] = 2;
- gSpecialVar_Result = 1;
- }
- break;
- case 1:
- if (sFactorySwapScreen->monSwapped == TRUE)
- {
- sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos;
- CopySwappedMonData();
- }
- gTasks[taskId].data[0]++;
- break;
- case 2:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- gTasks[taskId].data[0]++;
- break;
- case 3:
- if (!UpdatePaletteFade())
- {
- DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
- Swap_DestroyAllSprites();
- FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
- FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
- FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
- FREE_AND_SET_NULL(sFactorySwapScreen);
- FreeAllWindowBuffers();
- SetMainCallback2(CB2_ReturnToFieldContinueScript);
- DestroyTask(taskId);
- }
- break;
- }
- }
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
}
-static void Task_HandleSwapScreenYesNo(u8 taskId)
+static void sub_81A63CC(void)
{
- u16 loPtr, hiPtr;
-
- if (sFactorySwapScreen->unk30 != TRUE)
- {
- switch (gTasks[taskId].data[0])
- {
- case 4:
- Swap_ShowYesNoOptions();
- gTasks[taskId].data[0] = 5;
- break;
- case 5:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- if (sFactorySwapScreen->yesNoCursorPos == 0)
- {
- gTasks[taskId].data[1] = 1;
- hiPtr = gTasks[taskId].data[6];
- loPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
- }
- else
- {
- gTasks[taskId].data[1] = 0;
- sub_819EA64(4);
- hiPtr = gTasks[taskId].data[6];
- loPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
- }
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- gTasks[taskId].data[1] = 0;
- sub_819EA64(4);
- hiPtr = gTasks[taskId].data[6];
- loPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- PlaySE(SE_SELECT);
- Swap_UpdateYesNoCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- PlaySE(SE_SELECT);
- Swap_UpdateYesNoCursorPosition(1);
- }
- break;
- }
- }
-}
+ u8 i;
-static void sub_819CBDC(u8 taskId)
-{
- if (gTasks[taskId].data[1] == 1)
- {
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = Task_CloseSwapScreen;
- }
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
+ gFacilityTrainerMons = gBattleFrontierMons;
else
- {
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- }
-}
+ gFacilityTrainerMons = gSlateportBattleTentMons;
-static void sub_819CC24(u8 taskId)
-{
- if (gTasks[taskId].data[0] == 0)
+ for (i = 0; i < 3; i++)
{
- Swap_PrintOnInfoWindow(gText_QuitSwapping);
- sFactorySwapScreen->monSwapped = FALSE;
- gTasks[taskId].data[0] = 4;
- gTasks[taskId].data[6] = (u32)(sub_819CBDC) >> 16;
- gTasks[taskId].data[7] = (u32)(sub_819CBDC);
- gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].monId = gUnknown_03006298[i];
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].ivs = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ATK_IV, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].personality = GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ALT_ABILITY, NULL);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[gUnknown_03006298[i]].itemTableId]);
}
}
-static void sub_819CC74(u8 taskId)
+static void sub_81A64C4(void)
{
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- if (gTasks[taskId].data[1] == 1)
+ s32 i, j, k;
+ s32 count = 0;
+ u8 bits = 0;
+ u8 monLevel;
+ u16 monSetId;
+ u16 evs;
+ u8 ivs;
+ u8 friendship;
+
+ if (gSaveBlock2Ptr->frontier.lvlMode == FRONTIER_LVL_TENT)
{
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = Task_CloseSwapScreen;
+ gFacilityTrainerMons = gSlateportBattleTentMons;
+ monLevel = 30;
}
else
{
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- }
-}
-
-static void sub_819CCD4(u8 taskId)
-{
- if (gTasks[taskId].data[0] == 0)
- {
- sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
- Swap_PrintOnInfoWindow(gText_AcceptThisPkmn);
- sFactorySwapScreen->monSwapped = TRUE;
- gTasks[taskId].data[0] = 4;
- gTasks[taskId].data[6] = (u32)(sub_819CC74) >> 16;
- gTasks[taskId].data[7] = (u32)(sub_819CC74);
- gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ gFacilityTrainerMons = gBattleFrontierMons;
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
+ monLevel = 100;
+ else
+ monLevel = 50;
}
-}
-static void Task_HandleSwapScreenMenu(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
+ if (gSpecialVar_0x8005 < 2)
{
- case 2:
- if (!sFactorySwapScreen->fromSummaryScreen)
- sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
- gTasks[taskId].data[0] = 9;
- break;
- case 9:
- if (sFactorySwapScreen->unk30 != TRUE)
+ ZeroPlayerPartyMons();
+ for (i = 0; i < 3; i++)
{
- Swap_ShowMenuOptions();
- gTasks[taskId].data[0] = 3;
- }
- break;
- case 3:
- if (sFactorySwapScreen->unk30 != TRUE)
- {
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- Swap_RunMenuOptionFunc(taskId);
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- sub_819EA64(3);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- Swap_UpdateMenuCursorPosition(-1);
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- Swap_UpdateMenuCursorPosition(1);
- }
- }
- break;
- }
-}
+ monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
+ ivs = gSaveBlock2Ptr->frontier.field_E70[i].ivs;
+ CreateMon(&gPlayerParty[i],
+ gFacilityTrainerMons[monSetId].species,
+ monLevel,
+ ivs,
+ TRUE, gSaveBlock2Ptr->frontier.field_E70[i].personality,
+ 0, 0);
-static void Task_HandleSwapScreenChooseMons(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 0:
- if (!gPaletteFade.active)
- {
- sFactorySwapScreen->unk22 = TRUE;
- gTasks[taskId].data[0] = 1;
- }
- break;
- case 1:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sFactorySwapScreen->unk22 = FALSE;
- Swap_PrintMonSpecies2();
- sub_819EAC0();
- Swap_RunActionFunc(taskId);
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- sFactorySwapScreen->unk22 = FALSE;
- Swap_PrintMonSpecies2();
- sub_819EAC0();
- gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 16;
- gTasks[taskId].data[7] = (u32)(sub_819CC24);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].func = sub_819D588;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
- {
- Swap_UpdateBallCursorPosition(-1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
- {
- Swap_UpdateBallCursorPosition(1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- Swap_UpdateActionCursorPosition(1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- else if (gMain.newAndRepeatedKeys & DPAD_UP)
- {
- Swap_UpdateActionCursorPosition(-1);
- Swap_PrintMonCategory();
- Swap_PrintMonSpecies();
- }
- break;
- }
-}
-
-static void Task_SwapFadeSpeciesName(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
- {
- case 0:
- sFactorySwapScreen->unk27 = 0;
- sFactorySwapScreen->unk28 = 0;
- sFactorySwapScreen->unk26 = TRUE;
- gTasks[taskId].data[0] = 1;
- break;
- case 1:
- if (sFactorySwapScreen->unk22)
- {
- if (sFactorySwapScreen->unk29)
+ count = 0;
+ bits = gFacilityTrainerMons[monSetId].evSpread;
+ for (j = 0; j < NUM_STATS; bits >>= 1, j++)
{
- gTasks[taskId].data[0] = 2;
+ if (bits & 1)
+ count++;
}
- else
+
+ evs = MAX_TOTAL_EVS / count;
+ bits = 1;
+ for (j = 0; j < NUM_STATS; bits <<= 1, j++)
{
- sFactorySwapScreen->unk27++;
- if (sFactorySwapScreen->unk27 > 6)
- {
- sFactorySwapScreen->unk27 = 0;
- if (!sFactorySwapScreen->unk26)
- sFactorySwapScreen->unk28--;
- else
- sFactorySwapScreen->unk28++;
- }
- BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
- if (sFactorySwapScreen->unk28 > 5)
- {
- sFactorySwapScreen->unk26 = FALSE;
- }
- else if (sFactorySwapScreen->unk28 == 0)
- {
- gTasks[taskId].data[0] = 2;
- sFactorySwapScreen->unk26 = TRUE;
- }
+ if (gFacilityTrainerMons[monSetId].evSpread & bits)
+ SetMonData(&gPlayerParty[i], MON_DATA_HP_EV + j, &evs);
}
+
+ CalculateMonStats(&gPlayerParty[i]);
+ friendship = 0;
+ for (k = 0; k < 4; k++)
+ SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i].abilityBit);
}
- break;
- case 2:
- if (sFactorySwapScreen->unk29 > 14)
- {
- sFactorySwapScreen->unk29 = 0;
- gTasks[taskId].data[0] = 1;
- }
- else
- {
- sFactorySwapScreen->unk29++;
- }
- break;
}
-}
-static void Task_SwapFadeSpeciesName2(u8 taskId)
-{
- switch (gTasks[taskId].data[0])
+ switch (gSpecialVar_0x8005)
{
case 0:
- sFactorySwapScreen->unk27 = 0;
- gTasks[taskId].data[4] = 0;
- gTasks[taskId].data[0]++;
- break;
- case 1:
- LoadPalette(&gPlttBufferUnfaded[0xF0], 0xE0, 0xA);
- gTasks[taskId].data[0]++;
- break;
case 2:
- if (sFactorySwapScreen->unk28 > 15)
+ for (i = 0; i < 3; i++)
{
- gTasks[taskId].data[4] = 1;
- gTasks[taskId].data[0]++;
- }
- sFactorySwapScreen->unk27++;
- if (sFactorySwapScreen->unk27 > 3)
- {
- sFactorySwapScreen->unk27 = 0;
- gPlttBufferUnfaded[244] = gPlttBufferFaded[228];
- sFactorySwapScreen->unk28++;
- }
- BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
- break;
- }
-}
+ monSetId = gSaveBlock2Ptr->frontier.field_E70[i + 3].monId;
+ ivs = gSaveBlock2Ptr->frontier.field_E70[i + 3].ivs;
+ CreateMon(&gEnemyParty[i],
+ gFacilityTrainerMons[monSetId].species,
+ monLevel,
+ ivs,
+ TRUE, gSaveBlock2Ptr->frontier.field_E70[i + 3].personality,
+ 0, 0);
-static void sub_819D12C(u8 taskId)
-{
- s8 i;
- u8 var_2C;
- bool8 destroyTask;
-
- switch (gTasks[taskId].data[0])
- {
- case 0:
- gTasks[taskId].data[1] = 0;
- gTasks[taskId].data[2] = 0;
- gTasks[taskId].data[3] = 0;
- gTasks[taskId].data[0] = 1;
- break;
- case 1:
- var_2C = 0;
- for (i = 2; i >= 0; i--)
- {
- if (i != 2)
+ count = 0;
+ bits = gFacilityTrainerMons[monSetId].evSpread;
+ for (j = 0; j < NUM_STATS; bits >>= 1, j++)
{
- u8 posX = var_2C - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- if (posX == 16 || gTasks[taskId].data[i + 2] == 1)
- {
- var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
- }
- else if (posX > 16)
- {
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[i + 1]].pos1.x - 48;
- }
- }
- else
- {
- var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
+ if (bits & 1)
+ count++;
}
- if (gTasks[taskId].data[i + 1] == 1)
- {
- if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x > (i * 48) + 72)
- {
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = (i * 48) + 72;
- destroyTask = TRUE;
- }
- else if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x == (i * 48) + 72)
- {
- destroyTask = TRUE;
- }
- else
- {
- destroyTask = FALSE;
- }
- }
- else
+ evs = MAX_TOTAL_EVS / count;
+ bits = 1;
+ for (j = 0; j < NUM_STATS; bits <<= 1, j++)
{
- destroyTask = FALSE;
+ if (gFacilityTrainerMons[monSetId].evSpread & bits)
+ SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &evs);
}
- if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > 240)
- {
- var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = -16;
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
- else
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
-
- gTasks[taskId].data[i + 1] = 1;
- }
+ CalculateMonStats(&gEnemyParty[i]);
+ for (k = 0; k < 4; k++)
+ SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit);
}
- if (destroyTask == TRUE)
- DestroyTask(taskId);
break;
}
}
-static void sub_819D324(u8 taskId)
+static void sub_81A67EC(void)
{
- u8 i, j;
- s32 posX = 0;
- s8 r4 = gTasks[taskId].data[3];
- bool8 r1;
- s16 currPosX;
- u8 taskId2;
-
- if (gTasks[taskId].data[2] == 1)
- r4 *= -1;
+ s32 i, j;
+ u8 firstMonId;
+ u8 battleMode;
+ u8 lvlMode;
+ u8 challengeNum;
+ u8 factoryLvlMode;
+ u8 factoryBattleMode;
+ u8 var_40;
+ u16 monSetId;
+ u16 currSpecies;
+ u16 species[PARTY_SIZE];
+ u16 monIds[PARTY_SIZE];
+ u16 heldItems[PARTY_SIZE];
+
+ gFacilityTrainers = gBattleFrontierTrainers;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ species[i] = 0;
+ monIds[i] = 0;
+ heldItems[i] = 0;
+ }
+ lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+ if (VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_DOUBLES)
+ factoryBattleMode = FRONTIER_MODE_DOUBLES;
+ else
+ factoryBattleMode = FRONTIER_MODE_SINGLES;
- switch (gTasks[taskId].data[0])
+ gFacilityTrainerMons = gBattleFrontierMons;
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
{
- case 0:
- currPosX = gSprites[sFactorySwapScreen->unk8[0][0]].pos1.x;
- if (!gTasks[taskId].data[2])
- {
- if (currPosX + r4 < 240)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 240;
- }
- }
- else
- {
- if (currPosX + r4 > 160)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 160;
- }
- }
-
- if (r1 == TRUE)
- {
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 2; j++)
- gSprites[sFactorySwapScreen->unk8[j][i]].pos1.x += r4;
- }
- }
- else
- {
- for (j = 0; j < 2; j++)
- {
- gSprites[sFactorySwapScreen->unk8[j][0]].pos1.x = posX;
- gSprites[sFactorySwapScreen->unk8[j][1]].pos1.x = posX + 16;
- gSprites[sFactorySwapScreen->unk8[j][2]].pos1.x = posX + 48;
- }
- taskId2 = gTasks[taskId].data[1];
- gTasks[taskId2].data[3] = 1;
- DestroyTask(taskId);
- }
- break;
- case 1:
- currPosX = gSprites[sFactorySwapScreen->unkE[0][0]].pos1.x;
- if (!gTasks[taskId].data[2])
- {
- if (currPosX + r4 < 240)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 240;
- }
- }
- else
- {
- if (currPosX + r4 > 192)
- {
- r1 = TRUE;
- }
- else
- {
- r1 = FALSE;
- posX = 192;
- }
- }
-
- if (r1 == TRUE)
- {
- for (i = 0; i < 2; i++)
- {
- for (j = 0; j < 2; j++)
- gSprites[sFactorySwapScreen->unkE[j][i]].pos1.x += r4;
- }
- }
- else
- {
- for (j = 0; j < 2; j++)
- {
- gSprites[sFactorySwapScreen->unkE[j][0]].pos1.x = posX;
- gSprites[sFactorySwapScreen->unkE[j][1]].pos1.x = posX + 16;
- }
- taskId2 = gTasks[taskId].data[1];
- gTasks[taskId2].data[4] = 1;
- DestroyTask(taskId);
- }
- break;
+ factoryLvlMode = FRONTIER_LVL_OPEN;
+ firstMonId = 0;
}
-}
-
-static void sub_819D588(u8 taskId)
-{
- u8 anotherTaskId;
- u16 loPtr, hiPtr;
-
- switch (gTasks[taskId].data[0])
+ else
{
- case 0:
- LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
- Swap_PrintActionStrings();
- PutWindowTilemap(5);
- gTasks[taskId].data[0]++;
- break;
- case 1:
- sub_819EA64(3);
- gTasks[taskId].data[0]++;
- break;
- case 2:
- BeginNormalPaletteFade(0x4000, 0, 0, 0x10, gUnknown_0860F13C[37]);
- gTasks[taskId].data[0]++;
- break;
- case 3:
- if (!gPaletteFade.active)
- {
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 0;
- gTasks[anotherTaskId].data[2] = 0;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[2] = 5;
- gTasks[taskId].data[0]++;
- }
- else
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 1;
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 0;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0] += 2;
- }
- }
- break;
- case 4:
- if (gTasks[taskId].data[2] == 0)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 0;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0]++;
- }
- else
- {
- gTasks[taskId].data[2]--;
- }
- break;
- case 5:
- if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
- {
- gTasks[taskId].data[0] = gTasks[taskId].data[5];
- loPtr = gTasks[taskId].data[6];
- hiPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
- }
- break;
+ factoryLvlMode = FRONTIER_LVL_50;
+ firstMonId = 0;
}
-}
-
-static void sub_819D770(u8 taskId)
-{
- u8 anotherTaskId;
- u16 loPtr, hiPtr;
- if (sFactorySwapScreen->unk30 == TRUE)
- return;
+ var_40 = sub_81A6F70(factoryBattleMode, factoryLvlMode);
- switch (gTasks[taskId].data[0])
+ currSpecies = 0;
+ i = 0;
+ while (i != PARTY_SIZE)
{
- case 0:
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 0;
- gTasks[anotherTaskId].data[2] = 1;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[2] = 10;
- gTasks[taskId].data[0]++;
- }
- else
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[3] = 1;
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 1;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0] += 2;
- }
- break;
- case 1:
- if (gTasks[taskId].data[2] == 0)
- {
- anotherTaskId = CreateTask(sub_819D324, 0);
- gTasks[taskId].data[4] = 0;
- gTasks[anotherTaskId].data[1] = taskId;
- gTasks[anotherTaskId].data[0] = 1;
- gTasks[anotherTaskId].data[2] = 1;
- gTasks[anotherTaskId].data[3] = 6;
- gTasks[taskId].data[0]++;
- }
+ if (i < var_40)
+ monSetId = GetMonSetId(factoryLvlMode, challengeNum, TRUE);
else
- {
- gTasks[taskId].data[2]--;
- }
- break;
- case 2:
- if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
- {
- gPlttBufferFaded[226] = gUnknown_0860F13C[37];
- Swap_PrintActionStrings();
- PutWindowTilemap(5);
- gTasks[taskId].data[0]++;
- }
- break;
- case 3:
- BeginNormalPaletteFade(0x4000, 0, 0x10, 0, gUnknown_0860F13C[37]);
- gTasks[taskId].data[0]++;
- break;
- case 4:
- if (!gPaletteFade.active)
- {
- Swap_PrintOneActionString(0);
- gTasks[taskId].data[0]++;
- }
- break;
- case 5:
- Swap_PrintOneActionString(1);
- PutWindowTilemap(3);
- gTasks[taskId].data[0]++;
- break;
- case 6:
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
- gTasks[taskId].data[0]++;
- break;
- case 7:
- if (!sFactorySwapScreen->inEnemyScreen)
- Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
- else
- Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
- if (sFactorySwapScreen->cursorPos < 3)
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
- Swap_PrintMonCategory();
- gTasks[taskId].data[0]++;
- break;
- case 8:
- Swap_PrintMonSpecies3();
- sub_819EADC();
- sFactorySwapScreen->unk22 = TRUE;
- gTasks[taskId].data[0] = gTasks[taskId].data[5];
- loPtr = gTasks[taskId].data[6];
- hiPtr = gTasks[taskId].data[7];
- gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
- break;
- }
-}
+ monSetId = GetMonSetId(factoryLvlMode, challengeNum, FALSE);
-static void sub_819D9EC(u8 taskId)
-{
- u8 i;
- if (sFactorySwapScreen->unk30 == TRUE)
- return;
+ if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ continue;
- switch (gTasks[taskId].data[0])
- {
- case 0:
- Swap_PrintMonSpecies3();
- gTasks[taskId].data[0]++;
- break;
- case 1:
- sub_819EADC();
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
- gTasks[taskId].data[0]++;
- break;
- case 2:
- CreateTask(sub_819D12C, 0);
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName2;
- gTasks[taskId].data[0]++;
- break;
- case 3:
- if (!FuncIsActiveTask(sub_819D12C) && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[4] == 1)
+ // Cannot have two pokemon of the same species.
+ for (j = firstMonId; j < firstMonId + i; j++)
{
- sub_819EAC0();
- if (!sFactorySwapScreen->inEnemyScreen)
- {
- Swap_InitActions(ACTIONS_ENEMY_SCREEN);
- }
- else
+ u16 monId = monIds[j];
+ if (monId == monSetId)
+ break;
+ if (species[j] == gFacilityTrainerMons[monSetId].species)
{
- Swap_InitActions(ACTIONS_PLAYER_SCREEN);
- for (i = 0; i < 3; i++)
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ if (currSpecies == 0)
+ currSpecies = gFacilityTrainerMons[monSetId].species;
+ else
+ break;
}
- gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x;
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName;
- sFactorySwapScreen->unk27 = 0;
- sFactorySwapScreen->unk28 = 6;
- sFactorySwapScreen->unk26 = FALSE;
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
- gTasks[taskId].data[0]++;
}
- break;
- case 4:
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
- break;
- }
-}
-
-static void Swap_InitStruct(void)
-{
- if (sFactorySwapScreen == NULL)
- {
- sFactorySwapScreen = AllocZeroed(sizeof(*sFactorySwapScreen));
- sFactorySwapScreen->cursorPos = 0;
- sFactorySwapScreen->unk30 = FALSE;
- sFactorySwapScreen->fromSummaryScreen = FALSE;
- }
-}
+ if (j != firstMonId + i)
+ continue;
-void DoBattleFactorySwapScreen(void)
-{
- sFactorySwapScreen = NULL;
- SetMainCallback2(CB2_InitSwapScreen);
-}
-
-static void CB2_InitSwapScreen(void)
-{
- u8 taskId;
-
- switch (gMain.state)
- {
- case 0:
- SetHBlankCallback(NULL);
- SetVBlankCallback(NULL);
- CpuFill32(0, (void *)VRAM, VRAM_SIZE);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sSwap_BgTemplates, ARRAY_COUNT(sSwap_BgTemplates));
- InitWindows(sSwap_WindowTemplates);
- DeactivateAllTextPrinters();
- gMain.state++;
- break;
- case 1:
- sSwapMenuTilesetBuffer = Alloc(0x440);
- sSwapMonCardBgTilesetBuffer = AllocZeroed(0x440);
- sSwapMenuTilemapBuffer = Alloc(0x800);
- sSwapMonCardBgTilemapBuffer = AllocZeroed(0x800);
- 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_BLDY, 0);
- SetGpuReg(REG_OFFSET_MOSAIC, 0);
- SetGpuReg(REG_OFFSET_WIN0H, 0);
- SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_WIN1H, 0);
- SetGpuReg(REG_OFFSET_WIN1V, 0);
- SetGpuReg(REG_OFFSET_WININ, 0);
- SetGpuReg(REG_OFFSET_WINOUT, 0);
- gMain.state++;
- break;
- case 2:
- ResetPaletteFade();
- ResetSpriteData();
- ResetTasks();
- FreeAllSpritePalettes();
- ResetAllPicSprites();
- CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440);
- CpuCopy16(gUnknown_0861033C, sSwapMonCardBgTilesetBuffer, 0x60);
- LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0);
- LoadBgTiles(3, sSwapMonCardBgTilesetBuffer, 0x60, 0);
- CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, 0x800);
- LoadBgTilemap(1, sSwapMenuTilemapBuffer, 0x800, 0);
- LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
- LoadPalette(gUnknown_08610918, 0xF0, sizeof(gUnknown_08610918));
- LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
- LoadPalette(gUnknown_0861039C, 0x20, 4);
- gMain.state++;
- break;
- case 3:
- SetBgTilemapBuffer(3, sSwapMonCardBgTilemapBuffer);
- CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
- CopyBgTilemapBufferToVram(3);
- gMain.state++;
- break;
- case 4:
- LoadSpritePalettes(gUnknown_086106B0);
- LoadSpriteSheets(gUnknown_08610650);
- LoadCompressedObjectPic(gUnknown_086106A0);
- SetVBlankCallback(Swap_VblankCb);
- gMain.state++;
- break;
- case 5:
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- sFactorySwapScreen->cursorPos = gUnknown_0203CF20;
- gMain.state++;
- break;
- case 6:
- Swap_InitStruct();
- Swap_InitAllSprites();
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- Swap_ShowSummaryMonSprite();
- Swap_InitActions(ACTIONS_PLAYER_SCREEN);
- gMain.state++;
- break;
- case 7:
- Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
- PutWindowTilemap(2);
- gMain.state++;
- break;
- case 8:
- Swap_PrintMonCategory();
- PutWindowTilemap(8);
- gMain.state++;
- break;
- case 9:
- if (!sFactorySwapScreen->fromSummaryScreen)
- Swap_PrintMonSpecies();
- PutWindowTilemap(1);
- gMain.state++;
- break;
- case 10:
- Swap_PrintPkmnSwap();
- PutWindowTilemap(0);
- gMain.state++;
- break;
- case 11:
- gMain.state++;
- break;
- case 12:
- if (sFactorySwapScreen->fromSummaryScreen)
- Swap_PrintMonSpecies2();
- gMain.state++;
- break;
- case 13:
- Swap_PrintActionStrings2();
- PutWindowTilemap(3);
- gMain.state++;
- break;
- case 14:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
- SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
- ShowBg(0);
- ShowBg(1);
- ShowBg(2);
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ // Cannot have two same held items.
+ for (j = firstMonId; j < firstMonId + i; j++)
{
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- }
- else
- {
- HideBg(3);
- }
- gMain.state++;
- break;
- case 15:
- sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Task_SwapFadeSpeciesName, 0);
- if (!sFactorySwapScreen->fromSummaryScreen)
- {
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 0;
- taskId = CreateTask(Task_HandleSwapScreenChooseMons, 0);
- gTasks[taskId].data[0] = 0;
- }
- else
- {
- sub_819EAF8();
- gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
- sFactorySwapScreen->unk22 = FALSE;
- taskId = CreateTask(Task_HandleSwapScreenMenu, 0);
- gTasks[taskId].data[0] = 2;
+ if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ {
+ if (gFacilityTrainerMons[monSetId].species == currSpecies)
+ currSpecies = 0;
+ break;
+ }
}
- SetMainCallback2(Swap_CB2);
- break;
+ if (j != firstMonId + i)
+ continue;
+
+ gSaveBlock2Ptr->frontier.field_E70[i].monId = monSetId;
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ monIds[i] = monSetId;
+ i++;
}
}
-static void Swap_InitAllSprites(void)
+static void sub_81A6A08(void)
{
u8 i;
- u8 x;
- struct SpriteTemplate spriteTemplate;
-
- spriteTemplate = gUnknown_08610834;
- spriteTemplate.paletteTag = TAG_PAL_BALL_SELECTED;
+ u8 typesCount[18];
+ u8 usedType[2];
+ gFacilityTrainerMons = gBattleFrontierMons;
+ for (i = 0; i < NUMBER_OF_MON_TYPES; i++)
+ typesCount[i] = 0;
for (i = 0; i < 3; i++)
{
- sFactorySwapScreen->ballSpriteIds[i] = CreateSprite(&spriteTemplate, (48 * i) + 72, 64, 1);
- gSprites[sFactorySwapScreen->ballSpriteIds[i]].data[0] = 0;
- }
- sFactorySwapScreen->cursorSpriteId = CreateSprite(&gUnknown_0861084C, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0);
- sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610864, 176, 112, 0);
- sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_0861087C, 176, 144, 0);
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
-
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- x = 240;
- else
- x = 192;
+ u32 species = gFacilityTrainerMons[gUnknown_03006298[i]].species;
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_68;
- sFactorySwapScreen->unk8[0][0] = CreateSprite(&spriteTemplate, 240, 120, 10);
-
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_69;
- sFactorySwapScreen->unk8[0][1] = CreateSprite(&spriteTemplate, 256, 120, 10);
- sFactorySwapScreen->unk8[0][2] = CreateSprite(&spriteTemplate, 288, 120, 10);
-
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_6A;
- sFactorySwapScreen->unk8[1][0] = CreateSprite(&spriteTemplate, 240, 120, 1);
-
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_6B;
- sFactorySwapScreen->unk8[1][1] = CreateSprite(&spriteTemplate, 256, 120, 1);
- spriteTemplate.tileTag = TAG_TILE_6C;
- sFactorySwapScreen->unk8[1][2] = CreateSprite(&spriteTemplate, 288, 120, 1);
-
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_68;
- sFactorySwapScreen->unkE[0][0] = CreateSprite(&spriteTemplate, x, 144, 10);
-
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_69;
- sFactorySwapScreen->unkE[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10);
-
- spriteTemplate = gUnknown_0861084C;
- spriteTemplate.tileTag = TAG_TILE_6A;
- sFactorySwapScreen->unkE[1][0] = CreateSprite(&spriteTemplate, x, 144, 1);
-
- spriteTemplate = gUnknown_08610864;
- spriteTemplate.tileTag = TAG_TILE_6C;
- sFactorySwapScreen->unkE[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1);
-
- for (i = 0; i < 2; i++)
- {
- gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecY = 0;
- gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecY = 0;
-
- gSprites[sFactorySwapScreen->unk8[i][0]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unk8[i][1]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unk8[i][2]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unkE[i][0]].invisible = TRUE;
- gSprites[sFactorySwapScreen->unkE[i][1]].invisible = TRUE;
+ typesCount[gBaseStats[species].type1]++;
+ if (gBaseStats[species].type1 != gBaseStats[species].type2)
+ typesCount[gBaseStats[species].type2]++;
}
- gSprites[sFactorySwapScreen->unkE[0][0]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unkE[0][1]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[0][0]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[0][1]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[0][2]].invisible = FALSE;
-}
-
-static void Swap_DestroyAllSprites(void)
-{
- u8 i, j;
-
- for (i = 0; i < 3; i++)
- DestroySprite(&gSprites[sFactorySwapScreen->ballSpriteIds[i]]);
- DestroySprite(&gSprites[sFactorySwapScreen->cursorSpriteId]);
- DestroySprite(&gSprites[sFactorySwapScreen->menuCursor1SpriteId]);
- DestroySprite(&gSprites[sFactorySwapScreen->menuCursor2SpriteId]);
- for (i = 0; i < 2; i++)
- {
- for (j = 0; j < 3; j++)
- DestroySprite(&gSprites[sFactorySwapScreen->unk8[i][j]]);
- }
- for (i = 0; i < 2; i++)
+ usedType[0] = 0;
+ usedType[1] = 0;
+ for (i = 1; i < NUMBER_OF_MON_TYPES; i++)
{
- for (j = 0; j < 2; j++)
- DestroySprite(&gSprites[sFactorySwapScreen->unkE[i][j]]);
+ if (typesCount[usedType[0]] < typesCount[i])
+ usedType[0] = i;
+ else if (typesCount[usedType[0]] == typesCount[i])
+ usedType[1] = i;
}
-}
-static void Swap_HandleActionCursorChange(u8 cursorId)
-{
- if (cursorId < 3)
- {
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
- sub_819E8EC();
- gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].pos1.x;
- }
+ gSpecialVar_Result = gSpecialVar_Result; // Needed to match. Don't ask me why.
+ if (typesCount[usedType[0]] != 0 && (typesCount[usedType[0]] > typesCount[usedType[1]] || usedType[0] == usedType[1]))
+ gSpecialVar_Result = usedType[0];
else
- {
- gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
- sub_819E838(sFactorySwapScreen->actionsData[cursorId].id);
- }
+ gSpecialVar_Result = NUMBER_OF_MON_TYPES;
}
-static void Swap_UpdateBallCursorPosition(s8 direction)
+static void sub_81A6AEC(void)
{
- u8 cursorPos;
- PlaySE(SE_SELECT);
- if (direction > 0) // Move cursor right.
- {
- if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
- sFactorySwapScreen->cursorPos++;
- else
- sFactorySwapScreen->cursorPos = 0;
- }
- else // Move cursor left.
- {
- if (sFactorySwapScreen->cursorPos != 0)
- sFactorySwapScreen->cursorPos--;
- else
- sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
- }
-
- cursorPos = sFactorySwapScreen->cursorPos;
- Swap_HandleActionCursorChange(cursorPos);
-}
-
-static void Swap_UpdateActionCursorPosition(s8 direction)
-{
- u8 cursorPos;
- PlaySE(SE_SELECT);
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySwapScreen->cursorPos < 3)
- sFactorySwapScreen->cursorPos = 3;
- else if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
- sFactorySwapScreen->cursorPos++;
- else
- sFactorySwapScreen->cursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySwapScreen->cursorPos < 3)
- sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
- else if (sFactorySwapScreen->cursorPos != 0)
- sFactorySwapScreen->cursorPos--;
- else
- sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
- }
-
- cursorPos = sFactorySwapScreen->cursorPos;
- Swap_HandleActionCursorChange(cursorPos);
-}
-
-static void Swap_UpdateYesNoCursorPosition(s8 direction)
-{
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySwapScreen->yesNoCursorPos != 1)
- sFactorySwapScreen->yesNoCursorPos++;
- else
- sFactorySwapScreen->yesNoCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySwapScreen->yesNoCursorPos != 0)
- sFactorySwapScreen->yesNoCursorPos--;
- else
- sFactorySwapScreen->yesNoCursorPos = 1;
- }
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
-}
-
-static void Swap_UpdateMenuCursorPosition(s8 direction)
-{
- PlaySE(SE_SELECT);
- if (direction > 0) // Move cursor down.
- {
- if (sFactorySwapScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
- sFactorySwapScreen->menuCursorPos++;
- else
- sFactorySwapScreen->menuCursorPos = 0;
- }
- else // Move cursor up.
- {
- if (sFactorySwapScreen->menuCursorPos != 0)
- sFactorySwapScreen->menuCursorPos--;
- else
- sFactorySwapScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
- }
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
-}
-
-static void sub_819E838(u8 arg0)
-{
- u8 i;
+ u8 i, j, count;
+ u8 stylePoints[8];
+ count = 0;
+ gFacilityTrainerMons = gBattleFrontierMons;
+ for (i = 0; i < 8; i++)
+ stylePoints[i] = 0;
for (i = 0; i < 3; i++)
{
- if (arg0 == 2)
- {
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = FALSE;
- if (i < 2)
- gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
- }
- else if (arg0 == 3)
+ u16 monSetId = gUnknown_03006298[i];
+ for (j = 0; j < 4; j++)
{
- if (i < 2)
- gSprites[sFactorySwapScreen->unkE[1][i]].invisible = FALSE;
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ u8 id = GetStyleForMove(gFacilityTrainerMons[monSetId].moves[j]);
+ stylePoints[id]++;
}
}
-}
-static void sub_819E8EC(void)
-{
- u8 i;
-
- for (i = 0; i < 3; i++)
+ gSpecialVar_Result = 0;
+ for (i = 1; i < 8; i++)
{
- gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
- if (i < 2)
- gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
+ if (stylePoints[i] >= sRequiredMoveCounts[i - 1])
+ {
+ gSpecialVar_Result = i;
+ count++;
+ }
}
+ if (count > 2)
+ gSpecialVar_Result = 8;
}
-static void Swap_ShowMenuOptions(void)
-{
- if (sFactorySwapScreen->fromSummaryScreen == TRUE)
- sFactorySwapScreen->fromSummaryScreen = FALSE;
- else
- sFactorySwapScreen->menuCursorPos = 0;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Swap_PrintMenuOptions();
-}
-
-static void Swap_ShowYesNoOptions(void)
-{
- sFactorySwapScreen->yesNoCursorPos = 0;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = 112;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = 112;
-
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
-
- Swap_PrintYesNoOptions();
-}
-
-static void sub_819EA64(u8 windowId)
-{
- gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
- gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
- FillWindowPixelBuffer(windowId, 0);
- CopyWindowToVram(windowId, 2);
- ClearWindowTilemap(windowId);
-}
-
-static void sub_819EAC0(void)
+static u8 GetStyleForMove(u16 move)
{
- PutWindowTilemap(1);
- FillWindowPixelBuffer(1, 0);
- CopyWindowToVram(1, 2);
-}
-
-static void sub_819EADC(void)
-{
- PutWindowTilemap(7);
- FillWindowPixelBuffer(7, 0);
- CopyWindowToVram(7, 2);
-}
-
-static void sub_819EAF8(void)
-{
- sub_819EAC0();
- PutWindowTilemap(5);
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
-}
-
-static void Swap_PrintPkmnSwap(void)
-{
- FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized(0, 1, gText_PkmnSwap, 2, 1, 0, NULL);
- CopyWindowToVram(0, 3);
-}
-
-static void Swap_PrintMonSpecies(void)
-{
- u16 species;
- u8 x;
+ const u16 *moves;
+ u8 i, j;
- FillWindowPixelBuffer(1, 0);
- if (sFactorySwapScreen->cursorPos > 2)
+ for (i = 0; i < ARRAY_COUNT(sMoveStyles); i++)
{
- CopyWindowToVram(1, 2);
- }
- else
- {
- u8 monId = sFactorySwapScreen->cursorPos;
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
- CopyWindowToVram(1, 3);
+ for (j = 0, moves = sMoveStyles[i]; moves[j] != 0; j++)
+ {
+ if (moves[j] == move)
+ return i + 1;
+ }
}
+ return 0;
}
-static void Swap_PrintOnInfoWindow(const u8 *str)
-{
- FillWindowPixelBuffer(2, 0);
- AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
- CopyWindowToVram(2, 2);
-}
-
-static void Swap_PrintMenuOptions(void)
-{
- PutWindowTilemap(3);
- FillWindowPixelBuffer(3, 0);
- AddTextPrinterParameterized3(3, 1, 15, 1, gUnknown_08610922, 0, gText_Summary2);
- AddTextPrinterParameterized3(3, 1, 15, 17, gUnknown_08610922, 0, gText_Swap);
- AddTextPrinterParameterized3(3, 1, 15, 33, gUnknown_08610922, 0, gText_Rechoose);
- CopyWindowToVram(3, 3);
-}
-
-static void Swap_PrintYesNoOptions(void)
-{
- PutWindowTilemap(4);
- FillWindowPixelBuffer(4, 0);
- AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610922, 0, gText_Yes3);
- AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610922, 0, gText_No3);
- CopyWindowToVram(4, 3);
-}
-
-static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId)
+bool8 sub_81A6BF4(void)
{
- s32 x = GetStringRightAlignXOffset(0, str, 0x46);
- AddTextPrinterParameterized3(windowId, 0, x, y, gUnknown_08610922, 0, str);
+ return (gMapHeader.mapLayoutId == 347 || gMapHeader.mapLayoutId == 348);
}
-static void Swap_PrintActionStrings(void)
+static void sub_81A6C1C(void)
{
- FillWindowPixelBuffer(5, 0);
- switch (sFactorySwapScreen->inEnemyScreen)
- {
- case TRUE:
- Swap_PrintActionString(gText_PkmnForSwap, 0, 5);
- case FALSE:
- Swap_PrintActionString(gText_Cancel3, 24, 5);
- break;
- }
- CopyWindowToVram(5, 3);
-}
+ u8 i;
-static void Swap_PrintActionStrings2(void)
-{
- FillWindowPixelBuffer(3, 0);
- switch (sFactorySwapScreen->inEnemyScreen)
- {
- case TRUE:
- Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
- case FALSE:
- Swap_PrintActionString(gText_Cancel3, 32, 3);
- break;
- }
- CopyWindowToVram(3, 3);
-}
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
+ gFacilityTrainerMons = gBattleFrontierMons;
+ else
+ gFacilityTrainerMons = gSlateportBattleTentMons;
-static void Swap_PrintOneActionString(u8 which)
-{
- switch (which)
+ for (i = 0; i < 3; i++)
{
- case 0:
- if (sFactorySwapScreen->inEnemyScreen == TRUE)
- Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
- break;
- case 1:
- Swap_PrintActionString(gText_Cancel3, 32, 3);
- break;
+ SetMonData(&gPlayerParty[i],
+ MON_DATA_HELD_ITEM,
+ &gBattleFrontierHeldItems[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[i].monId].itemTableId]);
}
- CopyWindowToVram(3, 3);
}
-static void Swap_PrintMonSpecies2(void)
+u8 GetFactoryMonFixedIV(u8 arg0, u8 arg1)
{
- u16 species;
- u8 x;
- u16 pal[5];
+ u8 a1;
+ u8 a2 = (arg1 != 0) ? 1 : 0;
- CpuCopy16(gUnknown_08610918, pal, 8);
- if (!sFactorySwapScreen->fromSummaryScreen)
- pal[4] = gPlttBufferFaded[228];
+ if (arg0 > 8)
+ a1 = 7;
else
- pal[4] = sFactorySwapScreen->unk24;
- LoadPalette(pal, 0xF0, 0xA);
+ a1 = arg0;
- PutWindowTilemap(7);
- FillWindowPixelBuffer(7, 0);
- if (sFactorySwapScreen->cursorPos > 2)
- {
- CopyWindowToVram(7, 3);
- }
- else
- {
- u8 monId = sFactorySwapScreen->cursorPos;
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(7, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
- CopyWindowToVram(7, 3);
- }
+ return sFixedIVTable[a1][a2];
}
-static void Swap_PrintMonSpecies3(void)
+void FillFactoryBrainParty(void)
{
- u16 species;
- u8 x;
+ s32 i, j, k;
+ u16 species[3];
+ u16 heldItems[3];
+ u8 friendship;
+ s32 monLevel;
+ u8 fixedIV;
+ u32 otId;
- LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
- CpuCopy16(gPlttBufferUnfaded + 240, gPlttBufferFaded + 224, 10);
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+ fixedIV = GetFactoryMonFixedIV(challengeNum + 2, 0);
+ monLevel = SetFacilityPtrsGetLevel();
+ i = 0;
+ otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
- if (sFactorySwapScreen->cursorPos > 2)
+ while (i != 3)
{
- CopyWindowToVram(1, 2);
- }
- else
- {
- u8 monId = sFactorySwapScreen->cursorPos;
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- StringCopy(gStringVar4, gSpeciesNames[species]);
- x = GetStringRightAlignXOffset(1, gStringVar4, 86);
- AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
- CopyWindowToVram(1, 3);
- }
-}
-
-static void Swap_PrintMonCategory(void)
-{
- u16 species;
- u8 text[30];
- u8 x;
- u8 monId = sFactorySwapScreen->cursorPos;
+ u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
- FillWindowPixelBuffer(8, 0);
- if (monId > 2)
- {
- CopyWindowToVram(8, 2);
- }
- else
- {
- PutWindowTilemap(8);
- if (!sFactorySwapScreen->inEnemyScreen)
- species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
- else
- species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
- CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
- x = GetStringRightAlignXOffset(1, text, 0x76);
- AddTextPrinterParameterized(8, 1, text, x, 1, 0, NULL);
- CopyWindowToVram(8, 2);
- }
-}
+ if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ continue;
+ if (monLevel == 50 && monSetId > 849)
+ continue;
-static void Swap_InitActions(u8 id)
-{
- if (sFactorySwapScreen->fromSummaryScreen != TRUE)
- {
- switch (id)
+ for (j = 0; j < 6; j++)
{
- case ACTIONS_PLAYER_SCREEN:
- sFactorySwapScreen->inEnemyScreen = FALSE;
- sFactorySwapScreen->cursorPos = 0;
- sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_PlayerScreenActions);
- sFactorySwapScreen->actionsData = sSwap_PlayerScreenActions;
- break;
- case ACTIONS_ENEMY_SCREEN:
- sFactorySwapScreen->inEnemyScreen = TRUE;
- sFactorySwapScreen->cursorPos = 0;
- sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_EnemyScreenActions);
- sFactorySwapScreen->actionsData = sSwap_EnemyScreenActions;
- break;
+ if (monSetId == gSaveBlock2Ptr->frontier.field_E70[j].monId)
+ break;
}
- }
-}
-
-static void Swap_RunMenuOptionFunc(u8 taskId)
-{
- sSwap_CurrentTableFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos];
- sSwap_CurrentTableFunc(taskId);
-}
-
-static void sub_819F0CC(u8 taskId)
-{
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- sFactorySwapScreen->playerMonId = sFactorySwapScreen->cursorPos;
- sub_819EA64(3);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_819D9EC;
-}
+ if (j != 6)
+ continue;
-static void sub_819F114(u8 taskId)
-{
- gTasks[taskId].data[0] = 6;
- gTasks[taskId].func = Task_FromSwapScreenToSummaryScreen;
-}
-
-static void sub_819F134(u8 taskId)
-{
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- sub_819EA64(3);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = sub_819D770;
-}
-
-static void Swap_RunActionFunc(u8 taskId)
-{
- sSwap_CurrentTableFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func;
- sSwap_CurrentTableFunc(taskId);
-}
+ for (k = 0; k < i; k++)
+ {
+ if (species[k] == gFacilityTrainerMons[monSetId].species)
+ break;
+ }
+ if (k != i)
+ continue;
-static void Swap_ActionCancel(u8 taskId)
-{
- gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 0x10;
- gTasks[taskId].data[7] = (u32)(sub_819CC24);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].func = sub_819D588;
-}
+ for (k = 0; k < i; k++)
+ {
+ if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ break;
+ }
+ if (k != i)
+ continue;
-static void Swap_ActionPkmnForSwap(u8 taskId)
-{
- gTasks[taskId].data[6] = (u32)(sub_819D9EC) >> 0x10;
- gTasks[taskId].data[7] = (u32)(sub_819D9EC);
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_819D588;
-}
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i],
+ gFacilityTrainerMons[monSetId].species,
+ monLevel,
+ gFacilityTrainerMons[monSetId].nature,
+ fixedIV,
+ gFacilityTrainerMons[monSetId].evSpread,
+ otId);
-static void Swap_ActionMon(u8 taskId)
-{
- if (!sFactorySwapScreen->inEnemyScreen)
- {
- gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenMenu) >> 0x10;
- gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenMenu);
- gTasks[taskId].data[5] = 2;
- }
- else if (Swap_AlreadyHasSameSpecies(sFactorySwapScreen->cursorPos) == TRUE)
- {
- sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[5] = 1;
- gTasks[taskId].func = Task_SwapCantHaveSameMons;
- return;
- }
- else
- {
- gTasks[taskId].data[6] = (u32)(sub_819CCD4) >> 0x10;
- gTasks[taskId].data[7] = (u32)(sub_819CCD4);
- gTasks[taskId].data[5] = 0;
+ friendship = 0;
+ for (k = 0; k < 4; k++)
+ SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonData(&gEnemyParty[i], MON_DATA_FRIENDSHIP, &friendship);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ i++;
}
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_819D588;
-}
-
-static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen)
-{
- *arg0 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
- gSprites[*arg0].callback = sub_819F600;
- gSprites[*arg0].data[7] = swapScreen;
- *arg1 = TRUE;
}
-static void Swap_ShowSummaryMonSprite(void)
+static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2)
{
- struct Pokemon *mon;
- u16 species;
- u32 personality, otId;
-
- sFactorySwapScreen->unk2C.field1 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
- StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->unk2C.field1], 2);
-
- mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
- species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); // BUG: otId and personality should be switched.
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
-
- gSprites[sFactorySwapScreen->unk2C.field1].invisible = TRUE;
-}
+ u16 range, ret;
+ u16 adder;
-static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen)
-{
- u8 taskId;
-
- FreeAndDestroyMonPicSprite(arg0.field0);
- taskId = CreateTask(sub_819F7B4, 1);
- gTasks[taskId].data[7] = swapScreen;
- gTasks[taskId].data[6] = arg0.field1;
- gTasks[taskId].func(taskId);
- *arg1 = TRUE;
-}
-
-static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1)
-{
- FreeAndDestroyMonPicSprite(arg0.field0);
- FreeOamMatrix(gSprites[arg0.field1].oam.matrixNum);
- DestroySprite(&gSprites[arg0.field1]);
- *arg1 = FALSE;
-}
-
-static void Task_SwapCantHaveSameMons(u8 taskId)
-{
- if (sFactorySwapScreen->unk30 == TRUE)
- return;
+ if (lvlMode == FRONTIER_LVL_50)
+ adder = 0;
+ else
+ adder = 8;
- switch (gTasks[taskId].data[0])
+ if (challengeNum < 7)
{
- case 0:
- Swap_PrintOnInfoWindow(gText_SamePkmnInPartyAlready);
- sFactorySwapScreen->monSwapped = FALSE;
- gTasks[taskId].data[0]++;
- break;
- case 1:
- if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ if (arg2)
{
- PlaySE(SE_SELECT);
- sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
- gTasks[taskId].data[0]++;
+ range = (sMonsToChooseFrom[adder + challengeNum + 1][1] - sMonsToChooseFrom[adder + challengeNum + 1][0]) + 1;
+ ret = Random() % range;
+ ret += sMonsToChooseFrom[adder + challengeNum + 1][0];
}
- break;
- case 2:
- if (sFactorySwapScreen->unk30 != TRUE)
+ else
{
- FillWindowPixelBuffer(5, 0);
- CopyWindowToVram(5, 2);
- gTasks[taskId].data[0]++;
+ range = (sMonsToChooseFrom[adder + challengeNum][1] - sMonsToChooseFrom[adder + challengeNum][0]) + 1;
+ ret = Random() % range;
+ ret += sMonsToChooseFrom[adder + challengeNum][0];
}
- break;
- case 3:
- Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
- gTasks[taskId].data[0]++;
- break;
- case 4:
- Swap_PrintMonSpecies3();
- sub_819EADC();
- sFactorySwapScreen->unk22 = TRUE;
- gTasks[taskId].data[0] = gTasks[taskId].data[5];
- gTasks[taskId].func = Task_HandleSwapScreenChooseMons;
- break;
}
-}
-
-static bool8 Swap_AlreadyHasSameSpecies(u8 monId)
-{
- u8 i;
- u16 species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
-
- for (i = 0; i < 3; i++)
+ else
{
- if (i != sFactorySwapScreen->playerMonId && (u16)(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)) == species)
- return TRUE;
+ u16 num = challengeNum;
+ if (num != 7)
+ num = 7;
+ range = (sMonsToChooseFrom[adder + num][1] - sMonsToChooseFrom[adder + num][0]) + 1;
+ ret = Random() % range;
+ ret += sMonsToChooseFrom[adder + num][0];
}
- return FALSE;
+
+ return ret;
}
-static void sub_819F600(struct Sprite *sprite)
+u8 sub_81A6F70(u8 battleMode, u8 lvlMode)
{
- u8 taskId;
+ u8 ret;
+ u8 rents = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode];
- if (sprite->affineAnimEnded)
- {
- sprite->invisible = TRUE;
- taskId = CreateTask(sub_819F69C, 1);
- gTasks[taskId].data[7] = sprite->data[7];
- gTasks[taskId].func(taskId);
- sprite->callback = SpriteCallbackDummy;
- }
-}
+ if (rents < 15)
+ ret = 0;
+ else if (rents < 22)
+ ret = 1;
+ else if (rents < 29)
+ ret = 2;
+ else if (rents < 36)
+ ret = 3;
+ else if (rents < 43)
+ ret = 4;
+ else
+ ret = 5;
-static void sub_819F654(struct Sprite *sprite)
-{
- if (sprite->affineAnimEnded)
- {
- FreeOamMatrix(sprite->oam.matrixNum);
- if (sprite->data[7] == TRUE)
- sFactorySwapScreen->unk30 = FALSE;
- else
- sub_819BE20(FALSE);
- DestroySprite(sprite);
- }
+ return ret;
}
-static void sub_819F69C(u8 taskId)
+u32 GetAiScriptsInBattleFactory(void)
{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
+ s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ if (lvlMode == FRONTIER_LVL_TENT)
{
- case 0:
- task->data[3] = 88;
- task->data[24] = 152; // BUG: writing outside the array's bounds.
- task->data[5] = 64;
- task->data[8] = 65;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- break;
- case 1:
- ShowBg(3);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
- break;
- case 2:
- task->data[5] -= 4;
- task->data[8] += 4;
- if (task->data[5] <= 32 || task->data[8] >= 96)
- {
- task->data[5] = 32;
- task->data[8] = 96;
- }
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] != 32)
- return;
- break;
- default:
- DestroyTask(taskId);
- // UB: Should not use the task after it has been deleted.
- if (gTasks[taskId].data[7] == TRUE)
- Swap_ShowMonSprite();
- else
- Summary_ShowMonSprite();
- return;
+ return 0;
}
- task->data[0]++;
-}
-
-static void sub_819F7B4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- switch (task->data[0])
+ else
{
- default:
- HideBg(3);
- gSprites[task->data[6]].data[7] = task->data[7];
- gSprites[task->data[6]].invisible = FALSE;
- gSprites[task->data[6]].callback = sub_819F654;
- StartSpriteAffineAnim(&gSprites[task->data[6]], 1);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- DestroyTask(taskId);
- break;
- case 0:
- task->data[3] = 88;
- task->data[24] = 152; // BUG: writing outside the array's bounds.
- task->data[5] = 32;
- task->data[8] = 96;
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
- task->data[0]++;
- break;
- case 1:
- task->data[5] += 4;
- task->data[8] -= 4;
- if (task->data[5] >= 64 || task->data[8] <= 65)
- {
- task->data[5] = 64;
- task->data[8] = 65;
- }
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
- if (task->data[5] == 64)
- task->data[0]++;
- break;
+ s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ s32 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+
+ if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN)
+ return AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY;
+ else if (challengeNum < 2)
+ return 0;
+ else if (challengeNum < 4)
+ return AI_SCRIPT_CHECK_BAD_MOVE;
+ else
+ return AI_SCRIPT_CHECK_BAD_MOVE | AI_SCRIPT_TRY_TO_FAINT | AI_SCRIPT_CHECK_VIABILITY;
}
}
-static void Swap_ShowMonSprite(void)
+void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 moveArg, u8 moveSlot)
{
- struct Pokemon *mon;
- u16 species;
- u32 personality, otId;
-
- if (!sFactorySwapScreen->inEnemyScreen)
- mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
- else
- mon = &gEnemyParty[sFactorySwapScreen->cursorPos];
-
- species = GetMonData(mon, MON_DATA_SPECIES, NULL);
- personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
- otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
-
- sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
- gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
-
- sFactorySwapScreen->unk30 = FALSE;
+ u16 move = moveArg;
+ if (moveArg == MOVE_RETURN)
+ move = MOVE_FRUSTRATION;
+ SetMonMoveSlot(mon, move, moveSlot);
}
diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c
new file mode 100644
index 000000000..255cf5aa1
--- /dev/null
+++ b/src/battle_factory_screen.c
@@ -0,0 +1,4111 @@
+#include "global.h"
+#include "battle_factory_screen.h"
+#include "battle_factory.h"
+#include "sprite.h"
+#include "event_data.h"
+#include "overworld.h"
+#include "random.h"
+#include "battle_tower.h"
+#include "text.h"
+#include "palette.h"
+#include "task.h"
+#include "main.h"
+#include "malloc.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "string_util.h"
+#include "international_string_util.h"
+#include "window.h"
+#include "data2.h"
+#include "decompress.h"
+#include "pokemon_summary_screen.h"
+#include "sound.h"
+#include "pokedex.h"
+#include "util.h"
+#include "trainer_pokemon_sprites.h"
+#include "constants/battle_frontier.h"
+#include "constants/songs.h"
+#include "constants/rgb.h"
+
+// Select_ refers to the first Pokemon selection screen where you choose 3 Pokemon.
+// Swap_ refers to the consecutive selection screen where you can keep your Pokemon or swap one with beaten trainer's.
+
+#define MENU_SUMMARY 0
+#define MENU_RENT 1
+#define MENU_DESELECT 1
+#define MENU_OTHERS 2
+#define MENU_OPTIONS_COUNT 3
+
+#define SELECTABLE_MONS_COUNT 6
+
+#define TAG_PAL_BALL_GREY 0x64
+#define TAG_PAL_BALL_SELECTED 0x65
+#define TAG_PAL_66 0x66
+#define TAG_PAL_67 0x67
+
+#define TAG_TILE_64 0x64
+#define TAG_TILE_65 0x65
+#define TAG_TILE_66 0x66
+#define TAG_TILE_67 0x67
+#define TAG_TILE_68 0x68
+#define TAG_TILE_69 0x69
+#define TAG_TILE_6A 0x6A
+#define TAG_TILE_6B 0x6B
+#define TAG_TILE_6C 0x6C
+#define TAG_TILE_6D 0x6D
+
+struct FactorySelecteableMon
+{
+ u16 monSetId;
+ u16 spriteId;
+ u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon
+ struct Pokemon monData;
+};
+
+struct UnkFactoryStruct
+{
+ u8 field0;
+ u8 field1;
+};
+
+struct FactorySelectMonsStruct
+{
+ u8 menuCursorPos;
+ u8 menuCursor1SpriteId;
+ u8 menuCursor2SpriteId;
+ u8 cursorPos;
+ u8 cursorSpriteId;
+ u8 selectingMonsState;
+ bool8 fromSummaryScreen;
+ u8 yesNoCursorPos;
+ u8 unused8;
+ struct FactorySelecteableMon mons[SELECTABLE_MONS_COUNT];
+ struct UnkFactoryStruct unk294[3];
+ bool8 unk2A0;
+ u8 fadeSpeciesNameTaskId;
+ bool8 unk2A2;
+ u16 unk2A4;
+ bool8 unk2A6;
+ u8 unk2A7;
+ u8 unk2A8;
+ u8 unk2A9;
+};
+
+// 'Action' refers to the 3 Selectable mons, Cancel, Pknm for swap windows.
+#define ACTIONS_PLAYER_SCREEN 0
+#define ACTIONS_ENEMY_SCREEN 1
+
+struct SwapActionIdAndFunc
+{
+ u8 id;
+ void (*func)(u8 taskId);
+};
+
+struct FactorySwapMonsStruct
+{
+ u8 menuCursorPos;
+ u8 menuCursor1SpriteId;
+ u8 menuCursor2SpriteId;
+ u8 cursorPos;
+ u8 cursorSpriteId;
+ u8 ballSpriteIds[3];
+ u8 unk8[2][3];
+ u8 unkE[2][2];
+ u8 playerMonId;
+ u8 enemyMonId;
+ bool8 inEnemyScreen;
+ bool8 fromSummaryScreen;
+ u8 yesNoCursorPos;
+ u8 actionsCount;
+ const struct SwapActionIdAndFunc *actionsData;
+ u8 unused1C[4];
+ bool8 monSwapped;
+ u8 fadeSpeciesNameTaskId;
+ bool8 unk22;
+ u16 unk24;
+ bool8 unk26;
+ u8 unk27;
+ u8 unk28;
+ u8 unk29;
+ struct UnkFactoryStruct unk2C;
+ bool8 unk30;
+};
+
+extern u8 (*gUnknown_030062E8)(void);
+extern u8 gUnknown_0203CF20;
+
+extern const u16 gBattleFrontierHeldItems[];
+extern const struct FacilityMon gBattleFrontierMons[];
+extern const struct FacilityMon gSlateportBattleTentMons[];
+extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
+extern const u32 gUnknown_085B18AC[];
+
+// This file's functions.
+static void sub_819A44C(struct Sprite *sprite);
+static void CB2_InitSelectScreen(void);
+static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V);
+static void Select_InitMonsData(void);
+static void Select_InitAllSprites(void);
+static void Select_ShowSummaryMonSprite(void);
+static void Select_PrintSelectMonString(void);
+static void Select_PrintMonSpecies(void);
+static void Select_PrintMonCategory(void);
+static void Select_PrintRentalPkmnString(void);
+static void Select_CopyMonsToPlayerParty(void);
+static void sub_819C4B4(void);
+static void Select_ShowYesNoOptions(void);
+static void sub_819C568(void);
+static void Select_ShowMenuOptions(void);
+static void Select_PrintMenuOptions(void);
+static void Select_PrintYesNoOptions(void);
+static void Task_SelectFadeSpeciesName(u8 taskId);
+static void sub_819C1D0(u8 taskId);
+static void Task_HandleSelectionScreenChooseMons(u8 taskId);
+static void Task_HandleSelectionScreenMenu(u8 taskId);
+static void CreateFrontierFactorySelectableMons(u8 firstMonId);
+static void CreateTentFactorySelectableMons(u8 firstMonId);
+static void Select_SetBallSpritePaletteNum(u8 id);
+static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1);
+static void sub_819B958(u8 windowId);
+static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen);
+static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen);
+static u8 Select_RunMenuOptionFunc(void);
+static u8 sub_819BC9C(void);
+static u8 Select_OptionSummary(void);
+static u8 Select_OptionOthers(void);
+static u8 Select_OptionRentDeselect(void);
+static bool32 Select_AreSpeciesValid(u16 monSetId);
+static void Swap_DestroyAllSprites(void);
+static void Swap_ShowYesNoOptions(void);
+static void sub_819E8EC(void);
+static void sub_819EAC0(void);
+static void Swap_UpdateYesNoCursorPosition(s8 direction);
+static void Swap_UpdateMenuCursorPosition(s8 direction);
+static void sub_819EA64(u8 windowId);
+static void sub_819D770(u8 taskId);
+static void Task_HandleSwapScreenChooseMons(u8 taskId);
+static void sub_819D588(u8 taskId);
+static void sub_819F7B4(u8 taskId);
+static void Swap_PrintOnInfoWindow(const u8 *str);
+static void Swap_ShowMenuOptions(void);
+static void Swap_PrintMenuOptions(void);
+static void Swap_PrintYesNoOptions(void);
+static void Swap_PrintMonSpecies(void);
+static void Swap_PrintMonSpecies2(void);
+static void Swap_PrintMonSpecies3(void);
+static void Swap_PrintMonCategory(void);
+static void Swap_InitAllSprites(void);
+static void Swap_PrintPkmnSwap(void);
+static void sub_819EADC(void);
+static void sub_819EAF8(void);
+static void CB2_InitSwapScreen(void);
+static void Swap_ShowSummaryMonSprite(void);
+static void Swap_UpdateActionCursorPosition(s8 direction);
+static void Swap_UpdateBallCursorPosition(s8 direction);
+static void Swap_RunMenuOptionFunc(u8 taskId);
+static void sub_819F0CC(u8 taskId);
+static void sub_819F114(u8 taskId);
+static void sub_819F134(u8 taskId);
+static void Swap_RunActionFunc(u8 taskId);
+static void sub_819F69C(u8 taskId);
+static void Task_SwapCantHaveSameMons(u8 taskId);
+static void Swap_ShowMonSprite(void);
+static void Swap_PrintActionStrings(void);
+static void Swap_PrintActionStrings2(void);
+static void Swap_PrintOneActionString(u8 which);
+static void Swap_InitActions(u8 id);
+static void sub_819E838(u8 arg0);
+static bool8 Swap_AlreadyHasSameSpecies(u8 monId);
+static void sub_819F600(struct Sprite *sprite);
+static void Swap_ActionMon(u8 taskId);
+static void Swap_ActionCancel(u8 taskId);
+static void Swap_ActionPkmnForSwap(u8 taskId);
+
+// Ewram variables
+static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSelectMonCardBgTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL;
+static EWRAM_DATA u8 *sSelectMonCardBgTilemapBuffer = NULL;
+static EWRAM_DATA struct Pokemon *sFactorySelectMons = NULL;
+static EWRAM_DATA u8 *sSwapMenuTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSwapMonCardBgTilesetBuffer = NULL;
+static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL;
+static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL;
+
+// IWRAM bss
+static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen;
+static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId);
+static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen;
+
+// Const rom data.
+static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal");
+static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal");
+static const u16 gUnknown_0860F17C[] = INCBIN_U16("graphics/unknown/unknown_60F17C.gbapal");
+static const u8 gUnknown_0860F1BC[] = INCBIN_U8("graphics/unknown/unknown_60F1BC.4bpp");
+static const u8 gUnknown_0860F3BC[] = INCBIN_U8("graphics/unknown/unknown_60F3BC.4bpp");
+static const u8 gUnknown_0860F43C[] = INCBIN_U8("graphics/unknown/unknown_60F43C.4bpp");
+static const u8 gUnknown_0860F53C[] = INCBIN_U8("graphics/unknown/unknown_60F53C.4bpp");
+static const u8 gUnknown_0860F63C[] = INCBIN_U8("graphics/unknown/unknown_60F63C.4bpp");
+static const u8 gUnknown_0860F6BC[] = INCBIN_U8("graphics/unknown/unknown_60F6BC.4bpp");
+static const u8 gUnknown_0860F7BC[] = INCBIN_U8("graphics/unknown/unknown_60F7BC.4bpp");
+static const u8 gUnknown_0860F83C[] = INCBIN_U8("graphics/unknown/unknown_60F83C.4bpp");
+static const u8 gUnknown_0860F93C[] = INCBIN_U8("graphics/unknown/unknown_60F93C.4bpp");
+static const u8 gUnknown_0860FA3C[] = INCBIN_U8("graphics/unknown/unknown_60FA3C.4bpp");
+static const u8 gUnknown_0861023C[] = INCBIN_U8("graphics/unknown/unknown_61023C.bin");
+static const u8 gUnknown_0861033C[] = INCBIN_U8("graphics/unknown/unknown_61033C.4bpp");
+static const u16 gUnknown_0861039C[] = INCBIN_U16("graphics/unknown/unknown_61039C.gbapal");
+
+static const struct SpriteSheet gUnknown_086103BC[] =
+{
+ {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
+ {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
+ {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
+ {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
+ {},
+};
+
+static const struct CompressedSpriteSheet gUnknown_086103E4[] =
+{
+ {gUnknown_085B18AC, 0x800, TAG_TILE_64},
+ {},
+};
+
+static const struct SpritePalette gUnknown_086103F4[] =
+{
+ {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
+ {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
+ {gUnknown_0860F17C, TAG_PAL_66},
+ {gUnknown_0861039C, TAG_PAL_67},
+ {},
+};
+
+u8 static (* const sSelect_MenuOptionFuncs[])(void) =
+{
+ [MENU_SUMMARY] = Select_OptionSummary,
+ [MENU_RENT] /*Or Deselect*/ = Select_OptionRentDeselect,
+ [MENU_OTHERS] = Select_OptionOthers
+};
+
+static const struct BgTemplate sSelect_BgTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 24,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 25,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 27,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+};
+
+static const struct WindowTemplate sSelect_WindowTemplates[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 2,
+ .width = 12,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x0001,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 2,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 14,
+ .baseBlock = 0x0019,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 15,
+ .width = 20,
+ .height = 3,
+ .paletteNum = 15,
+ .baseBlock = 0x002f,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 14,
+ .width = 8,
+ .height = 6,
+ .paletteNum = 15,
+ .baseBlock = 0x006b,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 14,
+ .width = 8,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x009b,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 0,
+ .width = 15,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x00bb,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const u16 gUnknown_0861046C[] = INCBIN_U16("graphics/unknown/unknown_61046C.gbapal");
+
+static const u8 gUnknown_08610476[] = {0x00, 0x02, 0x00};
+static const u8 gUnknown_08610479[] = {0x00, 0x04, 0x00};
+
+static const struct OamData gUnknown_0861047C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_08610484 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_0861048C =
+{
+ .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 gUnknown_08610494 =
+{
+ .y = 0,
+ .affineMode = 3,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 1,
+};
+
+static const union AnimCmd gUnknown_0861049C[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_086104A4[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_086104AC[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_086104B4[] =
+{
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd * const gUnknown_086104FC[] =
+{
+ gUnknown_0861049C,
+};
+
+static const union AnimCmd * const gUnknown_08610500[] =
+{
+ gUnknown_086104A4,
+};
+
+static const union AnimCmd * const gUnknown_08610504[] =
+{
+ gUnknown_086104AC,
+ gUnknown_086104B4,
+};
+
+static const union AffineAnimCmd gUnknown_0861050C[] =
+{
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(256, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_0861056C[] =
+{
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_086105BC[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd * const gUnknown_086105CC[] =
+{
+ gUnknown_0861050C,
+ gUnknown_0861056C,
+ gUnknown_086105BC,
+};
+
+static const struct SpriteTemplate gUnknown_086105D8 =
+{
+ .tileTag = TAG_TILE_64,
+ .paletteTag = TAG_PAL_BALL_GREY,
+ .oam = &gUnknown_0861047C,
+ .anims = gUnknown_08610504,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_819A44C
+};
+
+static const struct SpriteTemplate gUnknown_086105F0 =
+{
+ .tileTag = TAG_TILE_65,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_08610484,
+ .anims = gUnknown_086104FC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610608 =
+{
+ .tileTag = TAG_TILE_66,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_0861048C,
+ .anims = gUnknown_086104FC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610620 =
+{
+ .tileTag = TAG_TILE_67,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_0861048C,
+ .anims = gUnknown_086104FC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610638 =
+{
+ .tileTag = TAG_TILE_6D,
+ .paletteTag = TAG_PAL_67,
+ .oam = &gUnknown_08610494,
+ .anims = gUnknown_08610500,
+ .images = NULL,
+ .affineAnims = gUnknown_086105CC,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteSheet gUnknown_08610650[] =
+{
+ {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65},
+ {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66},
+ {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67},
+ {gUnknown_0860F63C, sizeof(gUnknown_0860F63C), TAG_TILE_68},
+ {gUnknown_0860F6BC, sizeof(gUnknown_0860F6BC), TAG_TILE_69},
+ {gUnknown_0860F7BC, 0x100, TAG_TILE_6A},
+ {gUnknown_0860F83C, sizeof(gUnknown_0860F83C), TAG_TILE_6B},
+ {gUnknown_0860F93C, sizeof(gUnknown_0860F93C), TAG_TILE_6C},
+ {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D},
+ {},
+};
+
+static const struct CompressedSpriteSheet gUnknown_086106A0[] =
+{
+ {gUnknown_085B18AC, 0x800, TAG_TILE_64},
+ {},
+};
+
+static const struct SpritePalette gUnknown_086106B0[] =
+{
+ {gUnknown_0860F13C, TAG_PAL_BALL_GREY},
+ {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED},
+ {gUnknown_0860F17C, TAG_PAL_66},
+ {gUnknown_0861039C, TAG_PAL_67},
+ {},
+};
+
+static const struct OamData gUnknown_086106D8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_086106E0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct OamData gUnknown_086106E8 =
+{
+ .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 gUnknown_086106F0 =
+{
+ .y = 0,
+ .affineMode = 3,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 1,
+};
+
+static const union AnimCmd gUnknown_086106F8[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_08610700[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_08610708[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gUnknown_08610710[] =
+{
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd * const gUnknown_08610758[] =
+{
+ gUnknown_086106F8,
+};
+
+static const union AnimCmd * const gUnknown_0861075C[] =
+{
+ gUnknown_08610700,
+};
+
+static const union AnimCmd * const gUnknown_08610760[] =
+{
+ gUnknown_08610708,
+ gUnknown_08610710,
+};
+
+static const union AffineAnimCmd gUnknown_08610768[] =
+{
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(256, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_086107C8[] =
+{
+ AFFINEANIMCMD_FRAME(128, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(64, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(32, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(16, 5, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_FRAME(5, 5, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_08610818[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd * const gUnknown_08610828[] =
+{
+ gUnknown_08610768,
+ gUnknown_086107C8,
+ gUnknown_08610818,
+};
+
+static const struct SpriteTemplate gUnknown_08610834 =
+{
+ .tileTag = TAG_TILE_64,
+ .paletteTag = TAG_PAL_BALL_GREY,
+ .oam = &gUnknown_086106D8,
+ .anims = gUnknown_08610760,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_819A44C
+};
+
+static const struct SpriteTemplate gUnknown_0861084C =
+{
+ .tileTag = TAG_TILE_65,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_086106E0,
+ .anims = gUnknown_08610758,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610864 =
+{
+ .tileTag = TAG_TILE_66,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_086106E8,
+ .anims = gUnknown_08610758,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0861087C =
+{
+ .tileTag = TAG_TILE_67,
+ .paletteTag = TAG_PAL_66,
+ .oam = &gUnknown_086106E8,
+ .anims = gUnknown_08610758,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_08610894 =
+{
+ .tileTag = TAG_TILE_6D,
+ .paletteTag = TAG_PAL_67,
+ .oam = &gUnknown_086106F0,
+ .anims = gUnknown_0861075C,
+ .images = NULL,
+ .affineAnims = gUnknown_08610828,
+ .callback = SpriteCallbackDummy
+};
+
+void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) =
+{
+ sub_819F114,
+ sub_819F0CC,
+ sub_819F134,
+};
+
+static const struct BgTemplate sSwap_BgTemplates[4] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 24,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 25,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 26,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 27,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+};
+
+static const struct WindowTemplate sSwap_WindowTemplates[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 2,
+ .width = 12,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x0001,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 19,
+ .tilemapTop = 2,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 14,
+ .baseBlock = 0x0019,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 15,
+ .width = 20,
+ .height = 3,
+ .paletteNum = 15,
+ .baseBlock = 0x002f,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 14,
+ .width = 9,
+ .height = 6,
+ .paletteNum = 15,
+ .baseBlock = 0x006b,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 14,
+ .width = 8,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x00a1,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 21,
+ .tilemapTop = 15,
+ .width = 9,
+ .height = 5,
+ .paletteNum = 14,
+ .baseBlock = 0x006b,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 10,
+ .tilemapTop = 2,
+ .width = 4,
+ .height = 2,
+ .paletteNum = 14,
+ .baseBlock = 0x00c1,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 2,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x00c9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 0,
+ .width = 15,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x00df,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const u16 gUnknown_08610918[] = {RGB_BLACK, RGB_BLACK, RGB_WHITE, RGB_BLACK, RGB_RED}; // Palette.
+static const u8 gUnknown_08610922[] = {0x0, 0x02, 0x0};
+static const u8 gUnknown_08610925[] = {0x0, 0x04, 0x0};
+
+static const struct SwapActionIdAndFunc sSwap_PlayerScreenActions[] =
+{
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {3, Swap_ActionCancel},
+};
+
+static const struct SwapActionIdAndFunc sSwap_EnemyScreenActions[] =
+{
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {1, Swap_ActionMon},
+ {2, Swap_ActionPkmnForSwap},
+ {3, Swap_ActionCancel},
+};
+
+// gfx
+extern const u8 gFrontierFactorySelectMenu_Gfx[];
+extern const u8 gFrontierFactorySelectMenu_Tilemap[];
+extern const u16 gFrontierFactorySelectMenu_Pal[];
+
+// text
+extern const u8 gText_RentalPkmn2[];
+extern const u8 gText_SelectFirstPkmn[];
+extern const u8 gText_SelectSecondPkmn[];
+extern const u8 gText_SelectThirdPkmn[];
+extern const u8 gText_TheseThreePkmnOkay[];
+extern const u8 gText_CantSelectSamePkmn[];
+extern const u8 gText_Summary[];
+extern const u8 gText_Rechoose[];
+extern const u8 gText_Deselect[];
+extern const u8 gText_Rent[];
+extern const u8 gText_Others2[];
+extern const u8 gText_Yes2[];
+extern const u8 gText_Yes3[];
+extern const u8 gText_No2[];
+extern const u8 gText_No3[];
+extern const u8 gText_QuitSwapping[];
+extern const u8 gText_AcceptThisPkmn[];
+extern const u8 gText_SelectPkmnToAccept[];
+extern const u8 gText_SelectPkmnToSwap[];
+extern const u8 gText_PkmnSwap[];
+extern const u8 gText_Swap[];
+extern const u8 gText_Summary2[];
+extern const u8 gText_PkmnForSwap[];
+extern const u8 gText_SamePkmnInPartyAlready[];
+extern const u8 gText_Cancel3[];
+
+// code
+static void sub_819A44C(struct Sprite *sprite)
+{
+ if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED))
+ {
+ if (sprite->animEnded)
+ {
+ if (sprite->data[0] != 0)
+ {
+ sprite->data[0]--;
+ }
+ else if (Random() % 5 == 0)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[0] = 32;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ }
+ }
+ else
+ {
+ StartSpriteAnimIfDifferent(sprite, 1);
+ }
+ }
+ else
+ {
+ StartSpriteAnimIfDifferent(sprite, 0);
+ }
+}
+
+static void Select_CB2(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+static void Select_VblankCb(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void DoBattleFactorySelectScreen(void)
+{
+ sFactorySelectScreen = NULL;
+ SetMainCallback2(CB2_InitSelectScreen);
+}
+
+static void CB2_InitSelectScreen(void)
+{
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ if (sFactorySelectMons != NULL)
+ FREE_AND_SET_NULL(sFactorySelectMons);
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sSelect_BgTemplates, ARRAY_COUNT(sSelect_BgTemplates));
+ InitWindows(sSelect_WindowTemplates);
+ DeactivateAllTextPrinters();
+ gMain.state++;
+ break;
+ case 1:
+ sSelectMenuTilesetBuffer = Alloc(0x440);
+ sSelectMonCardBgTilesetBuffer = AllocZeroed(0x440);
+ sSelectMenuTilemapBuffer = Alloc(0x800);
+ sSelectMonCardBgTilemapBuffer = AllocZeroed(0x800);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, 0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440);
+ CpuCopy16(gUnknown_0861033C, sSelectMonCardBgTilesetBuffer, 0x60);
+ LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0);
+ LoadBgTiles(3, sSelectMonCardBgTilesetBuffer, 0x60, 0);
+ CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, 0x800);
+ LoadBgTilemap(1, sSelectMenuTilemapBuffer, 0x800, 0);
+ LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
+ LoadPalette(gUnknown_0861046C, 0xF0, 8);
+ LoadPalette(gUnknown_0861046C, 0xE0, 10);
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ gPlttBufferUnfaded[228] = sFactorySelectScreen->unk2A4;
+ LoadPalette(gUnknown_0861039C, 0x20, 4);
+ gMain.state++;
+ break;
+ case 3:
+ SetBgTilemapBuffer(3, sSelectMonCardBgTilemapBuffer);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 2, 4, 8, 8);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 20, 4, 8, 8);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 4:
+ LoadSpritePalettes(gUnknown_086103F4);
+ LoadSpriteSheets(gUnknown_086103BC);
+ LoadCompressedObjectPic(gUnknown_086103E4);
+ ShowBg(0);
+ ShowBg(1);
+ SetVBlankCallback(Select_VblankCb);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP);
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ {
+ Select_SetWinRegs(88, 152, 32, 96);
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ }
+ else
+ {
+ HideBg(3);
+ }
+ gMain.state++;
+ break;
+ case 5:
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ sFactorySelectScreen->cursorPos = gUnknown_0203CF20;
+ Select_InitMonsData();
+ Select_InitAllSprites();
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ Select_ShowSummaryMonSprite();
+ gMain.state++;
+ break;
+ case 6:
+ Select_PrintSelectMonString();
+ PutWindowTilemap(2);
+ gMain.state++;
+ break;
+ case 7:
+ Select_PrintMonCategory();
+ PutWindowTilemap(5);
+ gMain.state++;
+ break;
+ case 8:
+ Select_PrintMonSpecies();
+ PutWindowTilemap(1);
+ gMain.state++;
+ break;
+ case 9:
+ Select_PrintRentalPkmnString();
+ PutWindowTilemap(0);
+ gMain.state++;
+ break;
+ case 10:
+ sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Task_SelectFadeSpeciesName, 0);
+ if (!sFactorySelectScreen->fromSummaryScreen)
+ {
+ gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 0;
+ taskId = CreateTask(Task_HandleSelectionScreenChooseMons, 0);
+ gTasks[taskId].data[0] = 0;
+ }
+ else
+ {
+ gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 1;
+ sFactorySelectScreen->unk2A2 = FALSE;
+ taskId = CreateTask(Task_HandleSelectionScreenMenu, 0);
+ gTasks[taskId].data[0] = 13;
+ }
+ SetMainCallback2(Select_CB2);
+ break;
+ }
+}
+
+static void Select_InitMonsData(void)
+{
+ u8 i;
+
+ if (sFactorySelectScreen != NULL)
+ return;
+
+ sFactorySelectScreen = AllocZeroed(sizeof(*sFactorySelectScreen));
+ sFactorySelectScreen->cursorPos = 0;
+ sFactorySelectScreen->selectingMonsState = 1;
+ sFactorySelectScreen->fromSummaryScreen = FALSE;
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ sFactorySelectScreen->mons[i].selectedId = 0;
+
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT)
+ CreateFrontierFactorySelectableMons(0);
+ else
+ CreateTentFactorySelectableMons(0);
+}
+
+static void Select_InitAllSprites(void)
+{
+ u8 i, cursorPos;
+ s16 x;
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ sFactorySelectScreen->mons[i].spriteId = CreateSprite(&gUnknown_086105D8, (35 * i) + 32, 64, 1);
+ gSprites[sFactorySelectScreen->mons[i].spriteId].data[0] = 0;
+ Select_SetBallSpritePaletteNum(i);
+ }
+ cursorPos = sFactorySelectScreen->cursorPos;
+ x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
+ sFactorySelectScreen->cursorSpriteId = CreateSprite(&gUnknown_086105F0, x, 88, 0);
+ sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610608, 176, 112, 0);
+ sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_08610620, 176, 144, 0);
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
+}
+
+static void Select_DestroyAllSprites(void)
+{
+ u8 i;
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ DestroySprite(&gSprites[sFactorySelectScreen->mons[i].spriteId]);
+
+ DestroySprite(&gSprites[sFactorySelectScreen->cursorSpriteId]);
+ DestroySprite(&gSprites[sFactorySelectScreen->menuCursor1SpriteId]);
+ DestroySprite(&gSprites[sFactorySelectScreen->menuCursor2SpriteId]);
+}
+
+static void Select_UpdateBallCursorPosition(s8 direction)
+{
+ u8 cursorPos;
+ if (direction > 0) // Move cursor right.
+ {
+ if (sFactorySelectScreen->cursorPos != SELECTABLE_MONS_COUNT - 1)
+ sFactorySelectScreen->cursorPos++;
+ else
+ sFactorySelectScreen->cursorPos = 0;
+ }
+ else // Move cursor left.
+ {
+ if (sFactorySelectScreen->cursorPos != 0)
+ sFactorySelectScreen->cursorPos--;
+ else
+ sFactorySelectScreen->cursorPos = SELECTABLE_MONS_COUNT - 1;
+ }
+
+ cursorPos = sFactorySelectScreen->cursorPos;
+ gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x;
+}
+
+static void Select_UpdateMenuCursorPosition(s8 direction)
+{
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySelectScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
+ sFactorySelectScreen->menuCursorPos++;
+ else
+ sFactorySelectScreen->menuCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySelectScreen->menuCursorPos != 0)
+ sFactorySelectScreen->menuCursorPos--;
+ else
+ sFactorySelectScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
+ }
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+}
+
+static void Select_UpdateYesNoCursorPosition(s8 direction)
+{
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySelectScreen->yesNoCursorPos != 1)
+ sFactorySelectScreen->yesNoCursorPos++;
+ else
+ sFactorySelectScreen->yesNoCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySelectScreen->yesNoCursorPos != 0)
+ sFactorySelectScreen->yesNoCursorPos--;
+ else
+ sFactorySelectScreen->yesNoCursorPos = 1;
+ }
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->yesNoCursorPos * 16) + 112;
+}
+
+static void Select_HandleMonSelectionChange(void)
+{
+ u8 i, paletteNum;
+ u8 cursorPos = sFactorySelectScreen->cursorPos;
+ if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon.
+ {
+ paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
+ if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1)
+ {
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ if (sFactorySelectScreen->mons[i].selectedId == 2)
+ break;
+ }
+ if (i == SELECTABLE_MONS_COUNT)
+ return;
+ else
+ sFactorySelectScreen->mons[i].selectedId = 1;
+ }
+ sFactorySelectScreen->mons[cursorPos].selectedId = 0;
+ sFactorySelectScreen->selectingMonsState--;
+ }
+ else // Select a mon.
+ {
+ paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
+ sFactorySelectScreen->mons[cursorPos].selectedId = sFactorySelectScreen->selectingMonsState;
+ sFactorySelectScreen->selectingMonsState++;
+ }
+
+ gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].oam.paletteNum = paletteNum;
+}
+
+static void Select_SetBallSpritePaletteNum(u8 id)
+{
+ u8 palNum;
+
+ if (sFactorySelectScreen->mons[id].selectedId)
+ palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
+ else
+ palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
+
+ gSprites[sFactorySelectScreen->mons[id].spriteId].oam.paletteNum = palNum;
+}
+
+static void Task_FromSelectScreenToSummaryScreen(u8 taskId)
+{
+ u8 i;
+ u8 currMonId;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 6:
+ gPlttBufferUnfaded[228] = gPlttBufferFaded[228];
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0] = 7;
+ break;
+ case 7:
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
+ sub_819F444(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0);
+ Select_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSelectMonCardBgTilesetBuffer);
+ FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
+ FreeAllWindowBuffers();
+ gTasks[taskId].data[0] = 8;
+ }
+ break;
+ case 8:
+ sFactorySelectScreen->unk2A4 = gPlttBufferUnfaded[228];
+ DestroyTask(taskId);
+ sFactorySelectScreen->fromSummaryScreen = TRUE;
+ currMonId = sFactorySelectScreen->cursorPos;
+ sFactorySelectMons = AllocZeroed(sizeof(struct Pokemon) * SELECTABLE_MONS_COUNT);
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ sFactorySelectMons[i] = sFactorySelectScreen->mons[i].monData;
+ ShowPokemonSummaryScreen(1, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen);
+ break;
+ }
+}
+
+static void Task_CloseSelectionScreen(u8 taskId)
+{
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ Select_CopyMonsToPlayerParty();
+ DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId);
+ Select_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSelectMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSelectMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer);
+ FREE_AND_SET_NULL(sFactorySelectScreen);
+ FreeAllWindowBuffers();
+ SetMainCallback2(CB2_ReturnToFieldContinueScript);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+ }
+}
+
+static void Task_HandleSelectionScreenYesNo(u8 taskId)
+{
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 10:
+ sub_819C4B4();
+ gTasks[taskId].data[0] = 4;
+ break;
+ case 4:
+ Select_ShowYesNoOptions();
+ gTasks[taskId].data[0] = 5;
+ break;
+ case 5:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (sFactorySelectScreen->yesNoCursorPos == 0)
+ {
+ sub_819C568();
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_CloseSelectionScreen;
+ }
+ else
+ {
+ sub_819B958(4);
+ sub_819BC9C();
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819B958(4);
+ sub_819BC9C();
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateYesNoCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateYesNoCursorPosition(1);
+ }
+ break;
+ }
+ }
+}
+
+static void Task_HandleSelectionScreenMenu(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 2:
+ if (!sFactorySelectScreen->fromSummaryScreen)
+ sub_819F2B4(&sFactorySelectScreen->unk294[1].field1, &sFactorySelectScreen->unk2A0, FALSE);
+ gTasks[taskId].data[0] = 9;
+ break;
+ case 9:
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ Select_ShowMenuOptions();
+ sFactorySelectScreen->fromSummaryScreen = FALSE;
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 3:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ u8 retVal;
+ PlaySE(SE_SELECT);
+ retVal = Select_RunMenuOptionFunc();
+ if (retVal == 1)
+ {
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else if (retVal == 2)
+ {
+ gTasks[taskId].data[0] = 10;
+ gTasks[taskId].func = Task_HandleSelectionScreenYesNo;
+ }
+ else if (retVal == 3)
+ {
+ gTasks[taskId].data[0] = 11;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 6;
+ gTasks[taskId].func = Task_FromSelectScreenToSummaryScreen;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ sub_819B958(3);
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ gTasks[taskId].func = Task_HandleSelectionScreenChooseMons;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateMenuCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateMenuCursorPosition(1);
+ }
+ break;
+ case 12:
+ if (!gPaletteFade.active)
+ {
+ if (sFactorySelectScreen->fromSummaryScreen == TRUE)
+ {
+ gPlttBufferFaded[228] = sFactorySelectScreen->unk2A4;
+ gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244];
+ }
+ sFactorySelectScreen->fromSummaryScreen = FALSE;
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 13:
+ Select_ShowMenuOptions();
+ gTasks[taskId].data[0] = 12;
+ break;
+ }
+}
+
+static void Task_HandleSelectionScreenChooseMons(u8 taskId)
+{
+ if (sFactorySelectScreen->unk2A0 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].data[0] = 1;
+ sFactorySelectScreen->unk2A2 = TRUE;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sFactorySelectScreen->unk2A2 = FALSE;
+ gTasks[taskId].data[0] = 2;
+ gTasks[taskId].func = Task_HandleSelectionScreenMenu;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateBallCursorPosition(-1);
+ Select_PrintMonCategory();
+ Select_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ PlaySE(SE_SELECT);
+ Select_UpdateBallCursorPosition(1);
+ Select_PrintMonCategory();
+ Select_PrintMonSpecies();
+ }
+ break;
+ case 11:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ Select_PrintSelectMonString();
+ sFactorySelectScreen->unk2A2 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ }
+ break;
+ }
+ }
+}
+
+static void CreateFrontierFactorySelectableMons(u8 firstMonId)
+{
+ u8 i, j = 0;
+ u8 ivs = 0;
+ u8 level = 0;
+ u8 happiness = 0;
+ u32 otId = 0;
+ u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
+ u8 var_28 = 0;
+
+ gFacilityTrainerMons = gBattleFrontierMons;
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
+ level = 100;
+ else
+ level = 50;
+
+ var_28 = sub_81A6F70(battleMode, lvlMode);
+ otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
+ sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
+ if (i < var_28)
+ ivs = GetFactoryMonFixedIV(challengeNum + 1, 0);
+ else
+ ivs = GetFactoryMonFixedIV(challengeNum, 0);
+ CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
+ gFacilityTrainerMons[monSetId].species,
+ level,
+ gFacilityTrainerMons[monSetId].nature,
+ ivs,
+ gFacilityTrainerMons[monSetId].evSpread,
+ otId);
+ happiness = 0;
+ for (j = 0; j < 4; j++)
+ SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ }
+}
+
+static void CreateTentFactorySelectableMons(u8 firstMonId)
+{
+ u8 i, j;
+ u8 ivs = 0;
+ u8 level = 30;
+ u8 happiness = 0;
+ u32 otId = 0;
+
+ gFacilityTrainerMons = gSlateportBattleTentMons;
+ otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
+
+ for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
+ {
+ u16 monSetId = gSaveBlock2Ptr->frontier.field_E70[i].monId;
+ sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
+ CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
+ gFacilityTrainerMons[monSetId].species,
+ level,
+ gFacilityTrainerMons[monSetId].nature,
+ ivs,
+ gFacilityTrainerMons[monSetId].evSpread,
+ otId);
+ happiness = 0;
+ for (j = 0; j < 4; j++)
+ SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ }
+}
+
+static void Select_CopyMonsToPlayerParty(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ {
+ if (sFactorySelectScreen->mons[j].selectedId == i + 1)
+ {
+ gPlayerParty[i] = sFactorySelectScreen->mons[j].monData;
+ gSaveBlock2Ptr->frontier.field_E70[i].monId = sFactorySelectScreen->mons[j].monSetId;
+ gSaveBlock2Ptr->frontier.field_E70[i].personality = GetMonData(&gPlayerParty[i].box, MON_DATA_PERSONALITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i].abilityBit = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ALT_ABILITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[i].ivs = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ATK_IV, NULL);
+ break;
+ }
+ }
+ }
+ CalculatePlayerPartyCount();
+}
+
+static void Select_ShowMenuOptions(void)
+{
+ if (!sFactorySelectScreen->fromSummaryScreen)
+ sFactorySelectScreen->menuCursorPos = 0;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Select_PrintMenuOptions();
+}
+
+static void Select_ShowYesNoOptions(void)
+{
+ sFactorySelectScreen->yesNoCursorPos = 0;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = 112;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].pos1.y = 112;
+
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Select_PrintYesNoOptions();
+}
+
+static void sub_819B958(u8 windowId)
+{
+ gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE;
+ FillWindowPixelBuffer(windowId, 0);
+ CopyWindowToVram(windowId, 2);
+ ClearWindowTilemap(windowId);
+}
+
+static void Select_PrintRentalPkmnString(void)
+{
+ FillWindowPixelBuffer(0, 0);
+ AddTextPrinterParameterized(0, 1, gText_RentalPkmn2, 2, 1, 0, NULL);
+ CopyWindowToVram(0, 3);
+}
+
+static void Select_PrintMonSpecies(void)
+{
+ u16 species;
+ u8 x;
+ u8 monId = sFactorySelectScreen->cursorPos;
+
+ FillWindowPixelBuffer(1, 0);
+ species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610479, 0, gStringVar4);
+ CopyWindowToVram(1, 2);
+}
+
+static void Select_PrintSelectMonString(void)
+{
+ const u8 *str = NULL;
+
+ FillWindowPixelBuffer(2, 0);
+ if (sFactorySelectScreen->selectingMonsState == 1)
+ str = gText_SelectFirstPkmn;
+ else if (sFactorySelectScreen->selectingMonsState == 2)
+ str = gText_SelectSecondPkmn;
+ else if (sFactorySelectScreen->selectingMonsState == 3)
+ str = gText_SelectThirdPkmn;
+ else
+ str = gText_TheseThreePkmnOkay;
+
+ AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
+ CopyWindowToVram(2, 2);
+}
+
+static void Select_PrintCantSelectSameMon(void)
+{
+ FillWindowPixelBuffer(2, 0);
+ AddTextPrinterParameterized(2, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL);
+ CopyWindowToVram(2, 2);
+}
+
+static void Select_PrintMenuOptions(void)
+{
+ u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
+
+ PutWindowTilemap(3);
+ FillWindowPixelBuffer(3, 0);
+ AddTextPrinterParameterized3(3, 1, 7, 1, gUnknown_08610476, 0, gText_Summary);
+ if (selectedId != 0)
+ AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Deselect);
+ else
+ AddTextPrinterParameterized3(3, 1, 7, 17, gUnknown_08610476, 0, gText_Rent);
+
+ AddTextPrinterParameterized3(3, 1, 7, 33, gUnknown_08610476, 0, gText_Others2);
+ CopyWindowToVram(3, 3);
+}
+
+static void Select_PrintYesNoOptions(void)
+{
+ PutWindowTilemap(4);
+ FillWindowPixelBuffer(4, 0);
+ AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610476, 0, gText_Yes2);
+ AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610476, 0, gText_No2);
+ CopyWindowToVram(4, 3);
+}
+
+static u8 Select_RunMenuOptionFunc(void)
+{
+ gUnknown_030062E8 = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos];
+ return gUnknown_030062E8();
+}
+
+static u8 Select_OptionRentDeselect(void)
+{
+ u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
+ u16 monSetId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monSetId;
+ if (selectedId == 0 && !Select_AreSpeciesValid(monSetId))
+ {
+ Select_PrintCantSelectSameMon();
+ sub_819B958(3);
+ return 3;
+ }
+ else
+ {
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ Select_HandleMonSelectionChange();
+ Select_PrintSelectMonString();
+ sub_819B958(3);
+ if (sFactorySelectScreen->selectingMonsState > 3)
+ return 2;
+ else
+ return 1;
+ }
+}
+
+static u8 sub_819BC9C(void)
+{
+ sub_819C568();
+ Select_HandleMonSelectionChange();
+ Select_PrintSelectMonString();
+ sub_819B958(3);
+ if (sFactorySelectScreen->selectingMonsState > 3)
+ return 2;
+ else
+ return 1;
+}
+
+static u8 Select_OptionSummary(void)
+{
+ return 0;
+}
+
+static u8 Select_OptionOthers(void)
+{
+ sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE);
+ sub_819B958(3);
+ return 1;
+}
+
+static void Select_PrintMonCategory(void)
+{
+ u16 species;
+ u8 text[30];
+ u8 x;
+ u8 monId = sFactorySelectScreen->cursorPos;
+ if (monId < SELECTABLE_MONS_COUNT)
+ {
+ PutWindowTilemap(5);
+ FillWindowPixelBuffer(5, 0);
+ species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL);
+ CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
+ x = GetStringRightAlignXOffset(1, text, 0x76);
+ AddTextPrinterParameterized(5, 1, text, x, 1, 0, NULL);
+ CopyWindowToVram(5, 2);
+ }
+}
+
+static void Summary_ShowMonSprite(void)
+{
+ u8 monId = sFactorySelectScreen->cursorPos;
+ struct Pokemon *mon = &sFactorySelectScreen->mons[monId].monData;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
+
+ sFactorySelectScreen->unk2A0 = FALSE;
+}
+
+static void sub_819BE20(bool8 arg0)
+{
+ sFactorySelectScreen->unk2A0 = arg0;
+}
+
+static void Select_ShowSummaryMonSprite(void)
+{
+ struct Pokemon *mon;
+ u16 species;
+ u32 personality, otId;
+
+ sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 2);
+
+ mon = &sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monData;
+ species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0;
+
+ gSprites[sFactorySelectScreen->unk294[1].field1].invisible = TRUE;
+}
+
+static void Select_ShowChosenMonsSprites(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ {
+ if (sFactorySelectScreen->mons[j].selectedId == i + 1)
+ {
+ struct Pokemon *mon = &sFactorySelectScreen->mons[j].monData;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySelectScreen->unk294[i].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF);
+ gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecX = 0;
+ gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecY = 0;
+ break;
+ }
+ }
+ }
+ sFactorySelectScreen->unk2A0 = FALSE;
+}
+
+static void sub_819C040(struct Sprite *sprite)
+{
+ u8 taskId;
+
+ if (sprite->affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ gSprites[sFactorySelectScreen->unk294[0].field1].invisible = TRUE;
+ gSprites[sFactorySelectScreen->unk294[2].field1].invisible = TRUE;
+
+ taskId = CreateTask(sub_819C1D0, 1);
+ gTasks[taskId].func(taskId);
+
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_819C100(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded
+ && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[0].field1].oam.matrixNum);
+ FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[2].field1].oam.matrixNum);
+
+ sFactorySelectScreen->unk2A0 = FALSE;
+
+ DestroySprite(&gSprites[sFactorySelectScreen->unk294[0].field1]);
+ DestroySprite(&gSprites[sFactorySelectScreen->unk294[2].field1]);
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_819C1D0(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[3] = 16;
+ task->data[24] = 224; // BUG: writing outside the array's bounds.
+ task->data[5] = 64;
+ task->data[8] = 65;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ break;
+ case 1:
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ break;
+ case 2:
+ task->data[5] -= 4;
+ task->data[8] += 4;
+ if (task->data[5] <= 32 || task->data[8] >= 96)
+ {
+ task->data[5] = 32;
+ task->data[8] = 96;
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] != 32)
+ return;
+ break;
+ default:
+ DestroyTask(taskId);
+ Select_ShowChosenMonsSprites();
+ return;
+ }
+ task->data[0]++;
+}
+
+static void sub_819C2D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ default:
+ HideBg(3);
+ gSprites[sFactorySelectScreen->unk294[1].field1].invisible = FALSE;
+ gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C100;
+ gSprites[sFactorySelectScreen->unk294[0].field1].invisible = FALSE;
+ gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
+ gSprites[sFactorySelectScreen->unk294[2].field1].invisible = FALSE;
+ gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[0].field1], 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[2].field1], 1);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ DestroyTask(taskId);
+ break;
+ case 0:
+ task->data[3] = 16;
+ task->data[24] = 224; // BUG: writing outside the array's bounds.
+ task->data[5] = 32;
+ task->data[8] = 96;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[5] += 4;
+ task->data[8] -= 4;
+ if (task->data[5] >= 64 || task->data[8] <= 65)
+ {
+ task->data[5] = 64;
+ task->data[8] = 65;
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] == 64)
+ task->data[0]++;
+ break;
+ }
+}
+
+static void sub_819C4B4(void)
+{
+ sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1);
+ sFactorySelectScreen->unk294[0].field1 = CreateSprite(&gUnknown_08610638, 44, 64, 1);
+ sFactorySelectScreen->unk294[2].field1 = CreateSprite(&gUnknown_08610638, 196, 64, 1);
+
+ gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C040;
+ gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy;
+ gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy;
+
+ sFactorySelectScreen->unk2A0 = TRUE;
+}
+
+static void sub_819C568(void)
+{
+ u8 taskId;
+
+ FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[0].field0);
+ FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[1].field0);
+ FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[2].field0);
+
+ taskId = CreateTask(sub_819C2D4, 1);
+ gTasks[taskId].func(taskId);
+
+ sFactorySelectScreen->unk2A0 = TRUE;
+}
+
+static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V)
+{
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(mWin0H, nWin0H));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(mWin0V, nWin0V));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+}
+
+static bool32 Select_AreSpeciesValid(u16 monSetId)
+{
+ u8 i, j;
+ u32 species = gFacilityTrainerMons[monSetId].species;
+ u8 selectState = sFactorySelectScreen->selectingMonsState;
+
+ for (i = 1; i < selectState; i++)
+ {
+ for (j = 0; j < SELECTABLE_MONS_COUNT; j++)
+ {
+ if (sFactorySelectScreen->mons[j].selectedId == i)
+ {
+ if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monSetId].species == species)
+ return FALSE;
+
+ break;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+static void Task_SelectFadeSpeciesName(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ sFactorySelectScreen->unk2A7 = 0;
+ sFactorySelectScreen->unk2A8 = 0;
+ sFactorySelectScreen->unk2A6 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 1:
+ if (sFactorySelectScreen->unk2A2)
+ {
+ if (sFactorySelectScreen->unk2A9)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ sFactorySelectScreen->unk2A7++;
+ if (sFactorySelectScreen->unk2A7 > 6)
+ {
+ sFactorySelectScreen->unk2A7 = 0;
+ if (!sFactorySelectScreen->unk2A6)
+ sFactorySelectScreen->unk2A8--;
+ else
+ sFactorySelectScreen->unk2A8++;
+ }
+ BlendPalettes(0x4000, sFactorySelectScreen->unk2A8, 0);
+ if (sFactorySelectScreen->unk2A8 > 5)
+ {
+ sFactorySelectScreen->unk2A6 = FALSE;
+ }
+ else if (sFactorySelectScreen->unk2A8 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ sFactorySelectScreen->unk2A6 = TRUE;
+ }
+ }
+ }
+ break;
+ case 2:
+ if (sFactorySelectScreen->unk2A9 > 14)
+ {
+ sFactorySelectScreen->unk2A9 = 0;
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ sFactorySelectScreen->unk2A9++;
+ }
+ break;
+ }
+}
+
+// Swap Screen's section begins here.
+
+static void Swap_CB2(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+static void Swap_VblankCb(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void CopySwappedMonData(void)
+{
+ u8 happiness;
+
+ gPlayerParty[sFactorySwapScreen->playerMonId] = gEnemyParty[sFactorySwapScreen->enemyMonId];
+ happiness = 0;
+ SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &happiness);
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].monId;
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->enemyMonId + 3].ivs;
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].personality = GetMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId], MON_DATA_PERSONALITY, NULL);
+ gSaveBlock2Ptr->frontier.field_E70[sFactorySwapScreen->playerMonId].abilityBit = GetBoxMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId].box, MON_DATA_ALT_ABILITY, NULL);
+}
+
+static void Task_FromSwapScreenToSummaryScreen(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 6:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0] = 7;
+ break;
+ case 7:
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
+ sub_819F444(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30);
+ Swap_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
+ FreeAllWindowBuffers();
+ gTasks[taskId].data[0] = 8;
+ }
+ break;
+ case 8:
+ DestroyTask(taskId);
+ sFactorySwapScreen->fromSummaryScreen = TRUE;
+ sFactorySwapScreen->unk24 = gPlttBufferUnfaded[244];
+ ShowPokemonSummaryScreen(0, gPlayerParty, sFactorySwapScreen->cursorPos, 3 - 1, CB2_InitSwapScreen);
+ break;
+ }
+}
+
+static void Task_CloseSwapScreen(u8 taskId)
+{
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (sFactorySwapScreen->monSwapped == TRUE)
+ {
+ gTasks[taskId].data[0]++;
+ gSpecialVar_Result = 0;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 2;
+ gSpecialVar_Result = 1;
+ }
+ break;
+ case 1:
+ if (sFactorySwapScreen->monSwapped == TRUE)
+ {
+ sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos;
+ CopySwappedMonData();
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (!UpdatePaletteFade())
+ {
+ DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId);
+ Swap_DestroyAllSprites();
+ FREE_AND_SET_NULL(sSwapMenuTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer);
+ FREE_AND_SET_NULL(sSwapMenuTilemapBuffer);
+ FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer);
+ FREE_AND_SET_NULL(sFactorySwapScreen);
+ FreeAllWindowBuffers();
+ SetMainCallback2(CB2_ReturnToFieldContinueScript);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+ }
+}
+
+static void Task_HandleSwapScreenYesNo(u8 taskId)
+{
+ u16 loPtr, hiPtr;
+
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 4:
+ Swap_ShowYesNoOptions();
+ gTasks[taskId].data[0] = 5;
+ break;
+ case 5:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (sFactorySwapScreen->yesNoCursorPos == 0)
+ {
+ gTasks[taskId].data[1] = 1;
+ hiPtr = gTasks[taskId].data[6];
+ loPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
+ }
+ else
+ {
+ gTasks[taskId].data[1] = 0;
+ sub_819EA64(4);
+ hiPtr = gTasks[taskId].data[6];
+ loPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gTasks[taskId].data[1] = 0;
+ sub_819EA64(4);
+ hiPtr = gTasks[taskId].data[6];
+ loPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Swap_UpdateYesNoCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Swap_UpdateYesNoCursorPosition(1);
+ }
+ break;
+ }
+ }
+}
+
+static void sub_819CBDC(u8 taskId)
+{
+ if (gTasks[taskId].data[1] == 1)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_CloseSwapScreen;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ }
+}
+
+static void sub_819CC24(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ Swap_PrintOnInfoWindow(gText_QuitSwapping);
+ sFactorySwapScreen->monSwapped = FALSE;
+ gTasks[taskId].data[0] = 4;
+ gTasks[taskId].data[6] = (u32)(sub_819CBDC) >> 16;
+ gTasks[taskId].data[7] = (u32)(sub_819CBDC);
+ gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ }
+}
+
+static void sub_819CC74(u8 taskId)
+{
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ if (gTasks[taskId].data[1] == 1)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = Task_CloseSwapScreen;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ }
+}
+
+static void sub_819CCD4(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
+ Swap_PrintOnInfoWindow(gText_AcceptThisPkmn);
+ sFactorySwapScreen->monSwapped = TRUE;
+ gTasks[taskId].data[0] = 4;
+ gTasks[taskId].data[6] = (u32)(sub_819CC74) >> 16;
+ gTasks[taskId].data[7] = (u32)(sub_819CC74);
+ gTasks[taskId].func = Task_HandleSwapScreenYesNo;
+ }
+}
+
+static void Task_HandleSwapScreenMenu(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 2:
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
+ gTasks[taskId].data[0] = 9;
+ break;
+ case 9:
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ Swap_ShowMenuOptions();
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 3:
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ Swap_RunMenuOptionFunc(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ sub_819EA64(3);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ Swap_UpdateMenuCursorPosition(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ Swap_UpdateMenuCursorPosition(1);
+ }
+ }
+ break;
+ }
+}
+
+static void Task_HandleSwapScreenChooseMons(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (!gPaletteFade.active)
+ {
+ sFactorySwapScreen->unk22 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sFactorySwapScreen->unk22 = FALSE;
+ Swap_PrintMonSpecies2();
+ sub_819EAC0();
+ Swap_RunActionFunc(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sFactorySwapScreen->unk22 = FALSE;
+ Swap_PrintMonSpecies2();
+ sub_819EAC0();
+ gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 16;
+ gTasks[taskId].data[7] = (u32)(sub_819CC24);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].func = sub_819D588;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ Swap_UpdateBallCursorPosition(-1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ Swap_UpdateBallCursorPosition(1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ Swap_UpdateActionCursorPosition(1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ Swap_UpdateActionCursorPosition(-1);
+ Swap_PrintMonCategory();
+ Swap_PrintMonSpecies();
+ }
+ break;
+ }
+}
+
+static void Task_SwapFadeSpeciesName(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ sFactorySwapScreen->unk27 = 0;
+ sFactorySwapScreen->unk28 = 0;
+ sFactorySwapScreen->unk26 = TRUE;
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 1:
+ if (sFactorySwapScreen->unk22)
+ {
+ if (sFactorySwapScreen->unk29)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ sFactorySwapScreen->unk27++;
+ if (sFactorySwapScreen->unk27 > 6)
+ {
+ sFactorySwapScreen->unk27 = 0;
+ if (!sFactorySwapScreen->unk26)
+ sFactorySwapScreen->unk28--;
+ else
+ sFactorySwapScreen->unk28++;
+ }
+ BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
+ if (sFactorySwapScreen->unk28 > 5)
+ {
+ sFactorySwapScreen->unk26 = FALSE;
+ }
+ else if (sFactorySwapScreen->unk28 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ sFactorySwapScreen->unk26 = TRUE;
+ }
+ }
+ }
+ break;
+ case 2:
+ if (sFactorySwapScreen->unk29 > 14)
+ {
+ sFactorySwapScreen->unk29 = 0;
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ sFactorySwapScreen->unk29++;
+ }
+ break;
+ }
+}
+
+static void Task_SwapFadeSpeciesName2(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ sFactorySwapScreen->unk27 = 0;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ LoadPalette(&gPlttBufferUnfaded[0xF0], 0xE0, 0xA);
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (sFactorySwapScreen->unk28 > 15)
+ {
+ gTasks[taskId].data[4] = 1;
+ gTasks[taskId].data[0]++;
+ }
+ sFactorySwapScreen->unk27++;
+ if (sFactorySwapScreen->unk27 > 3)
+ {
+ sFactorySwapScreen->unk27 = 0;
+ gPlttBufferUnfaded[244] = gPlttBufferFaded[228];
+ sFactorySwapScreen->unk28++;
+ }
+ BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0);
+ break;
+ }
+}
+
+static void sub_819D12C(u8 taskId)
+{
+ s8 i;
+ u8 var_2C;
+ bool8 destroyTask;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 1:
+ var_2C = 0;
+ for (i = 2; i >= 0; i--)
+ {
+ if (i != 2)
+ {
+ u8 posX = var_2C - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ if (posX == 16 || gTasks[taskId].data[i + 2] == 1)
+ {
+ var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
+ }
+ else if (posX > 16)
+ {
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[i + 1]].pos1.x - 48;
+ }
+ }
+ else
+ {
+ var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10;
+ }
+
+ if (gTasks[taskId].data[i + 1] == 1)
+ {
+ if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x > (i * 48) + 72)
+ {
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = (i * 48) + 72;
+ destroyTask = TRUE;
+ }
+ else if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x == (i * 48) + 72)
+ {
+ destroyTask = TRUE;
+ }
+ else
+ {
+ destroyTask = FALSE;
+ }
+ }
+ else
+ {
+ destroyTask = FALSE;
+ }
+
+ if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > 240)
+ {
+ var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x;
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = -16;
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED);
+ else
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY);
+
+ gTasks[taskId].data[i + 1] = 1;
+ }
+ }
+ if (destroyTask == TRUE)
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_819D324(u8 taskId)
+{
+ u8 i, j;
+ s32 posX = 0;
+ s8 r4 = gTasks[taskId].data[3];
+ bool8 r1;
+ s16 currPosX;
+ u8 taskId2;
+
+ if (gTasks[taskId].data[2] == 1)
+ r4 *= -1;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ currPosX = gSprites[sFactorySwapScreen->unk8[0][0]].pos1.x;
+ if (!gTasks[taskId].data[2])
+ {
+ if (currPosX + r4 < 240)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 240;
+ }
+ }
+ else
+ {
+ if (currPosX + r4 > 160)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 160;
+ }
+ }
+
+ if (r1 == TRUE)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 2; j++)
+ gSprites[sFactorySwapScreen->unk8[j][i]].pos1.x += r4;
+ }
+ }
+ else
+ {
+ for (j = 0; j < 2; j++)
+ {
+ gSprites[sFactorySwapScreen->unk8[j][0]].pos1.x = posX;
+ gSprites[sFactorySwapScreen->unk8[j][1]].pos1.x = posX + 16;
+ gSprites[sFactorySwapScreen->unk8[j][2]].pos1.x = posX + 48;
+ }
+ taskId2 = gTasks[taskId].data[1];
+ gTasks[taskId2].data[3] = 1;
+ DestroyTask(taskId);
+ }
+ break;
+ case 1:
+ currPosX = gSprites[sFactorySwapScreen->unkE[0][0]].pos1.x;
+ if (!gTasks[taskId].data[2])
+ {
+ if (currPosX + r4 < 240)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 240;
+ }
+ }
+ else
+ {
+ if (currPosX + r4 > 192)
+ {
+ r1 = TRUE;
+ }
+ else
+ {
+ r1 = FALSE;
+ posX = 192;
+ }
+ }
+
+ if (r1 == TRUE)
+ {
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 2; j++)
+ gSprites[sFactorySwapScreen->unkE[j][i]].pos1.x += r4;
+ }
+ }
+ else
+ {
+ for (j = 0; j < 2; j++)
+ {
+ gSprites[sFactorySwapScreen->unkE[j][0]].pos1.x = posX;
+ gSprites[sFactorySwapScreen->unkE[j][1]].pos1.x = posX + 16;
+ }
+ taskId2 = gTasks[taskId].data[1];
+ gTasks[taskId2].data[4] = 1;
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_819D588(u8 taskId)
+{
+ u8 anotherTaskId;
+ u16 loPtr, hiPtr;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
+ Swap_PrintActionStrings();
+ PutWindowTilemap(5);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ sub_819EA64(3);
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ BeginNormalPaletteFade(0x4000, 0, 0, 0x10, gUnknown_0860F13C[37]);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 0;
+ gTasks[anotherTaskId].data[2] = 0;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[2] = 5;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 1;
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 0;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0] += 2;
+ }
+ }
+ break;
+ case 4:
+ if (gTasks[taskId].data[2] == 0)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 0;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2]--;
+ }
+ break;
+ case 5:
+ if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
+ {
+ gTasks[taskId].data[0] = gTasks[taskId].data[5];
+ loPtr = gTasks[taskId].data[6];
+ hiPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
+ }
+ break;
+ }
+}
+
+static void sub_819D770(u8 taskId)
+{
+ u8 anotherTaskId;
+ u16 loPtr, hiPtr;
+ if (sFactorySwapScreen->unk30 == TRUE)
+ return;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 0;
+ gTasks[anotherTaskId].data[2] = 1;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[2] = 10;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[3] = 1;
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 1;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0] += 2;
+ }
+ break;
+ case 1:
+ if (gTasks[taskId].data[2] == 0)
+ {
+ anotherTaskId = CreateTask(sub_819D324, 0);
+ gTasks[taskId].data[4] = 0;
+ gTasks[anotherTaskId].data[1] = taskId;
+ gTasks[anotherTaskId].data[0] = 1;
+ gTasks[anotherTaskId].data[2] = 1;
+ gTasks[anotherTaskId].data[3] = 6;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2]--;
+ }
+ break;
+ case 2:
+ if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1)
+ {
+ gPlttBufferFaded[226] = gUnknown_0860F13C[37];
+ Swap_PrintActionStrings();
+ PutWindowTilemap(5);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ BeginNormalPaletteFade(0x4000, 0, 0x10, 0, gUnknown_0860F13C[37]);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ Swap_PrintOneActionString(0);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 5:
+ Swap_PrintOneActionString(1);
+ PutWindowTilemap(3);
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 7:
+ if (!sFactorySwapScreen->inEnemyScreen)
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
+ else
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
+ if (sFactorySwapScreen->cursorPos < 3)
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
+ Swap_PrintMonCategory();
+ gTasks[taskId].data[0]++;
+ break;
+ case 8:
+ Swap_PrintMonSpecies3();
+ sub_819EADC();
+ sFactorySwapScreen->unk22 = TRUE;
+ gTasks[taskId].data[0] = gTasks[taskId].data[5];
+ loPtr = gTasks[taskId].data[6];
+ hiPtr = gTasks[taskId].data[7];
+ gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr));
+ break;
+ }
+}
+
+static void sub_819D9EC(u8 taskId)
+{
+ u8 i;
+ if (sFactorySwapScreen->unk30 == TRUE)
+ return;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ Swap_PrintMonSpecies3();
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ sub_819EADC();
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ CreateTask(sub_819D12C, 0);
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName2;
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (!FuncIsActiveTask(sub_819D12C) && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[4] == 1)
+ {
+ sub_819EAC0();
+ if (!sFactorySwapScreen->inEnemyScreen)
+ {
+ Swap_InitActions(ACTIONS_ENEMY_SCREEN);
+ }
+ else
+ {
+ Swap_InitActions(ACTIONS_PLAYER_SCREEN);
+ for (i = 0; i < 3; i++)
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ }
+ gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x;
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName;
+ sFactorySwapScreen->unk27 = 0;
+ sFactorySwapScreen->unk28 = 6;
+ sFactorySwapScreen->unk26 = FALSE;
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+ break;
+ }
+}
+
+static void Swap_InitStruct(void)
+{
+ if (sFactorySwapScreen == NULL)
+ {
+ sFactorySwapScreen = AllocZeroed(sizeof(*sFactorySwapScreen));
+ sFactorySwapScreen->cursorPos = 0;
+ sFactorySwapScreen->unk30 = FALSE;
+ sFactorySwapScreen->fromSummaryScreen = FALSE;
+ }
+}
+
+void DoBattleFactorySwapScreen(void)
+{
+ sFactorySwapScreen = NULL;
+ SetMainCallback2(CB2_InitSwapScreen);
+}
+
+static void CB2_InitSwapScreen(void)
+{
+ u8 taskId;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sSwap_BgTemplates, ARRAY_COUNT(sSwap_BgTemplates));
+ InitWindows(sSwap_WindowTemplates);
+ DeactivateAllTextPrinters();
+ gMain.state++;
+ break;
+ case 1:
+ sSwapMenuTilesetBuffer = Alloc(0x440);
+ sSwapMonCardBgTilesetBuffer = AllocZeroed(0x440);
+ sSwapMenuTilemapBuffer = Alloc(0x800);
+ sSwapMonCardBgTilemapBuffer = AllocZeroed(0x800);
+ 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_BLDY, 0);
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, 0);
+ SetGpuReg(REG_OFFSET_WIN1V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ ResetAllPicSprites();
+ CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440);
+ CpuCopy16(gUnknown_0861033C, sSwapMonCardBgTilesetBuffer, 0x60);
+ LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0);
+ LoadBgTiles(3, sSwapMonCardBgTilesetBuffer, 0x60, 0);
+ CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, 0x800);
+ LoadBgTilemap(1, sSwapMenuTilemapBuffer, 0x800, 0);
+ LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40);
+ LoadPalette(gUnknown_08610918, 0xF0, sizeof(gUnknown_08610918));
+ LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
+ LoadPalette(gUnknown_0861039C, 0x20, 4);
+ gMain.state++;
+ break;
+ case 3:
+ SetBgTilemapBuffer(3, sSwapMonCardBgTilemapBuffer);
+ CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8);
+ CopyBgTilemapBufferToVram(3);
+ gMain.state++;
+ break;
+ case 4:
+ LoadSpritePalettes(gUnknown_086106B0);
+ LoadSpriteSheets(gUnknown_08610650);
+ LoadCompressedObjectPic(gUnknown_086106A0);
+ SetVBlankCallback(Swap_VblankCb);
+ gMain.state++;
+ break;
+ case 5:
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ sFactorySwapScreen->cursorPos = gUnknown_0203CF20;
+ gMain.state++;
+ break;
+ case 6:
+ Swap_InitStruct();
+ Swap_InitAllSprites();
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ Swap_ShowSummaryMonSprite();
+ Swap_InitActions(ACTIONS_PLAYER_SCREEN);
+ gMain.state++;
+ break;
+ case 7:
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap);
+ PutWindowTilemap(2);
+ gMain.state++;
+ break;
+ case 8:
+ Swap_PrintMonCategory();
+ PutWindowTilemap(8);
+ gMain.state++;
+ break;
+ case 9:
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ Swap_PrintMonSpecies();
+ PutWindowTilemap(1);
+ gMain.state++;
+ break;
+ case 10:
+ Swap_PrintPkmnSwap();
+ PutWindowTilemap(0);
+ gMain.state++;
+ break;
+ case 11:
+ gMain.state++;
+ break;
+ case 12:
+ if (sFactorySwapScreen->fromSummaryScreen)
+ Swap_PrintMonSpecies2();
+ gMain.state++;
+ break;
+ case 13:
+ Swap_PrintActionStrings2();
+ PutWindowTilemap(3);
+ gMain.state++;
+ break;
+ case 14:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ {
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ }
+ else
+ {
+ HideBg(3);
+ }
+ gMain.state++;
+ break;
+ case 15:
+ sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Task_SwapFadeSpeciesName, 0);
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ {
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 0;
+ taskId = CreateTask(Task_HandleSwapScreenChooseMons, 0);
+ gTasks[taskId].data[0] = 0;
+ }
+ else
+ {
+ sub_819EAF8();
+ gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1;
+ sFactorySwapScreen->unk22 = FALSE;
+ taskId = CreateTask(Task_HandleSwapScreenMenu, 0);
+ gTasks[taskId].data[0] = 2;
+ }
+ SetMainCallback2(Swap_CB2);
+ break;
+ }
+}
+
+static void Swap_InitAllSprites(void)
+{
+ u8 i;
+ u8 x;
+ struct SpriteTemplate spriteTemplate;
+
+ spriteTemplate = gUnknown_08610834;
+ spriteTemplate.paletteTag = TAG_PAL_BALL_SELECTED;
+
+ for (i = 0; i < 3; i++)
+ {
+ sFactorySwapScreen->ballSpriteIds[i] = CreateSprite(&spriteTemplate, (48 * i) + 72, 64, 1);
+ gSprites[sFactorySwapScreen->ballSpriteIds[i]].data[0] = 0;
+ }
+ sFactorySwapScreen->cursorSpriteId = CreateSprite(&gUnknown_0861084C, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0);
+ sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610864, 176, 112, 0);
+ sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_0861087C, 176, 144, 0);
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecY = 0;
+
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ x = 240;
+ else
+ x = 192;
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_68;
+ sFactorySwapScreen->unk8[0][0] = CreateSprite(&spriteTemplate, 240, 120, 10);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_69;
+ sFactorySwapScreen->unk8[0][1] = CreateSprite(&spriteTemplate, 256, 120, 10);
+ sFactorySwapScreen->unk8[0][2] = CreateSprite(&spriteTemplate, 288, 120, 10);
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_6A;
+ sFactorySwapScreen->unk8[1][0] = CreateSprite(&spriteTemplate, 240, 120, 1);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_6B;
+ sFactorySwapScreen->unk8[1][1] = CreateSprite(&spriteTemplate, 256, 120, 1);
+ spriteTemplate.tileTag = TAG_TILE_6C;
+ sFactorySwapScreen->unk8[1][2] = CreateSprite(&spriteTemplate, 288, 120, 1);
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_68;
+ sFactorySwapScreen->unkE[0][0] = CreateSprite(&spriteTemplate, x, 144, 10);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_69;
+ sFactorySwapScreen->unkE[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10);
+
+ spriteTemplate = gUnknown_0861084C;
+ spriteTemplate.tileTag = TAG_TILE_6A;
+ sFactorySwapScreen->unkE[1][0] = CreateSprite(&spriteTemplate, x, 144, 1);
+
+ spriteTemplate = gUnknown_08610864;
+ spriteTemplate.tileTag = TAG_TILE_6C;
+ sFactorySwapScreen->unkE[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1);
+
+ for (i = 0; i < 2; i++)
+ {
+ gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecY = 0;
+ gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecY = 0;
+
+ gSprites[sFactorySwapScreen->unk8[i][0]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unk8[i][1]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unk8[i][2]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unkE[i][0]].invisible = TRUE;
+ gSprites[sFactorySwapScreen->unkE[i][1]].invisible = TRUE;
+ }
+
+ gSprites[sFactorySwapScreen->unkE[0][0]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unkE[0][1]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[0][0]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[0][1]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[0][2]].invisible = FALSE;
+}
+
+static void Swap_DestroyAllSprites(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 3; i++)
+ DestroySprite(&gSprites[sFactorySwapScreen->ballSpriteIds[i]]);
+ DestroySprite(&gSprites[sFactorySwapScreen->cursorSpriteId]);
+ DestroySprite(&gSprites[sFactorySwapScreen->menuCursor1SpriteId]);
+ DestroySprite(&gSprites[sFactorySwapScreen->menuCursor2SpriteId]);
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 3; j++)
+ DestroySprite(&gSprites[sFactorySwapScreen->unk8[i][j]]);
+ }
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 2; j++)
+ DestroySprite(&gSprites[sFactorySwapScreen->unkE[i][j]]);
+ }
+}
+
+static void Swap_HandleActionCursorChange(u8 cursorId)
+{
+ if (cursorId < 3)
+ {
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE;
+ sub_819E8EC();
+ gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].pos1.x;
+ }
+ else
+ {
+ gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE;
+ sub_819E838(sFactorySwapScreen->actionsData[cursorId].id);
+ }
+}
+
+static void Swap_UpdateBallCursorPosition(s8 direction)
+{
+ u8 cursorPos;
+ PlaySE(SE_SELECT);
+ if (direction > 0) // Move cursor right.
+ {
+ if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
+ sFactorySwapScreen->cursorPos++;
+ else
+ sFactorySwapScreen->cursorPos = 0;
+ }
+ else // Move cursor left.
+ {
+ if (sFactorySwapScreen->cursorPos != 0)
+ sFactorySwapScreen->cursorPos--;
+ else
+ sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
+ }
+
+ cursorPos = sFactorySwapScreen->cursorPos;
+ Swap_HandleActionCursorChange(cursorPos);
+}
+
+static void Swap_UpdateActionCursorPosition(s8 direction)
+{
+ u8 cursorPos;
+ PlaySE(SE_SELECT);
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySwapScreen->cursorPos < 3)
+ sFactorySwapScreen->cursorPos = 3;
+ else if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount)
+ sFactorySwapScreen->cursorPos++;
+ else
+ sFactorySwapScreen->cursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySwapScreen->cursorPos < 3)
+ sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
+ else if (sFactorySwapScreen->cursorPos != 0)
+ sFactorySwapScreen->cursorPos--;
+ else
+ sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1;
+ }
+
+ cursorPos = sFactorySwapScreen->cursorPos;
+ Swap_HandleActionCursorChange(cursorPos);
+}
+
+static void Swap_UpdateYesNoCursorPosition(s8 direction)
+{
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySwapScreen->yesNoCursorPos != 1)
+ sFactorySwapScreen->yesNoCursorPos++;
+ else
+ sFactorySwapScreen->yesNoCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySwapScreen->yesNoCursorPos != 0)
+ sFactorySwapScreen->yesNoCursorPos--;
+ else
+ sFactorySwapScreen->yesNoCursorPos = 1;
+ }
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->yesNoCursorPos * 16) + 112;
+}
+
+static void Swap_UpdateMenuCursorPosition(s8 direction)
+{
+ PlaySE(SE_SELECT);
+ if (direction > 0) // Move cursor down.
+ {
+ if (sFactorySwapScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1)
+ sFactorySwapScreen->menuCursorPos++;
+ else
+ sFactorySwapScreen->menuCursorPos = 0;
+ }
+ else // Move cursor up.
+ {
+ if (sFactorySwapScreen->menuCursorPos != 0)
+ sFactorySwapScreen->menuCursorPos--;
+ else
+ sFactorySwapScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1;
+ }
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+}
+
+static void sub_819E838(u8 arg0)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (arg0 == 2)
+ {
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = FALSE;
+ if (i < 2)
+ gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
+ }
+ else if (arg0 == 3)
+ {
+ if (i < 2)
+ gSprites[sFactorySwapScreen->unkE[1][i]].invisible = FALSE;
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ }
+ }
+}
+
+static void sub_819E8EC(void)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE;
+ if (i < 2)
+ gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE;
+ }
+}
+
+static void Swap_ShowMenuOptions(void)
+{
+ if (sFactorySwapScreen->fromSummaryScreen == TRUE)
+ sFactorySwapScreen->fromSummaryScreen = FALSE;
+ else
+ sFactorySwapScreen->menuCursorPos = 0;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Swap_PrintMenuOptions();
+}
+
+static void Swap_ShowYesNoOptions(void)
+{
+ sFactorySwapScreen->yesNoCursorPos = 0;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.x = 176;
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = 112;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.x = 208;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = 112;
+
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = FALSE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = FALSE;
+
+ Swap_PrintYesNoOptions();
+}
+
+static void sub_819EA64(u8 windowId)
+{
+ gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE;
+ gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE;
+ FillWindowPixelBuffer(windowId, 0);
+ CopyWindowToVram(windowId, 2);
+ ClearWindowTilemap(windowId);
+}
+
+static void sub_819EAC0(void)
+{
+ PutWindowTilemap(1);
+ FillWindowPixelBuffer(1, 0);
+ CopyWindowToVram(1, 2);
+}
+
+static void sub_819EADC(void)
+{
+ PutWindowTilemap(7);
+ FillWindowPixelBuffer(7, 0);
+ CopyWindowToVram(7, 2);
+}
+
+static void sub_819EAF8(void)
+{
+ sub_819EAC0();
+ PutWindowTilemap(5);
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+}
+
+static void Swap_PrintPkmnSwap(void)
+{
+ FillWindowPixelBuffer(0, 0x11);
+ AddTextPrinterParameterized(0, 1, gText_PkmnSwap, 2, 1, 0, NULL);
+ CopyWindowToVram(0, 3);
+}
+
+static void Swap_PrintMonSpecies(void)
+{
+ u16 species;
+ u8 x;
+
+ FillWindowPixelBuffer(1, 0);
+ if (sFactorySwapScreen->cursorPos > 2)
+ {
+ CopyWindowToVram(1, 2);
+ }
+ else
+ {
+ u8 monId = sFactorySwapScreen->cursorPos;
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
+ CopyWindowToVram(1, 3);
+ }
+}
+
+static void Swap_PrintOnInfoWindow(const u8 *str)
+{
+ FillWindowPixelBuffer(2, 0);
+ AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL);
+ CopyWindowToVram(2, 2);
+}
+
+static void Swap_PrintMenuOptions(void)
+{
+ PutWindowTilemap(3);
+ FillWindowPixelBuffer(3, 0);
+ AddTextPrinterParameterized3(3, 1, 15, 1, gUnknown_08610922, 0, gText_Summary2);
+ AddTextPrinterParameterized3(3, 1, 15, 17, gUnknown_08610922, 0, gText_Swap);
+ AddTextPrinterParameterized3(3, 1, 15, 33, gUnknown_08610922, 0, gText_Rechoose);
+ CopyWindowToVram(3, 3);
+}
+
+static void Swap_PrintYesNoOptions(void)
+{
+ PutWindowTilemap(4);
+ FillWindowPixelBuffer(4, 0);
+ AddTextPrinterParameterized3(4, 1, 7, 1, gUnknown_08610922, 0, gText_Yes3);
+ AddTextPrinterParameterized3(4, 1, 7, 17, gUnknown_08610922, 0, gText_No3);
+ CopyWindowToVram(4, 3);
+}
+
+static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId)
+{
+ s32 x = GetStringRightAlignXOffset(0, str, 0x46);
+ AddTextPrinterParameterized3(windowId, 0, x, y, gUnknown_08610922, 0, str);
+}
+
+static void Swap_PrintActionStrings(void)
+{
+ FillWindowPixelBuffer(5, 0);
+ switch (sFactorySwapScreen->inEnemyScreen)
+ {
+ case TRUE:
+ Swap_PrintActionString(gText_PkmnForSwap, 0, 5);
+ case FALSE:
+ Swap_PrintActionString(gText_Cancel3, 24, 5);
+ break;
+ }
+ CopyWindowToVram(5, 3);
+}
+
+static void Swap_PrintActionStrings2(void)
+{
+ FillWindowPixelBuffer(3, 0);
+ switch (sFactorySwapScreen->inEnemyScreen)
+ {
+ case TRUE:
+ Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
+ case FALSE:
+ Swap_PrintActionString(gText_Cancel3, 32, 3);
+ break;
+ }
+ CopyWindowToVram(3, 3);
+}
+
+static void Swap_PrintOneActionString(u8 which)
+{
+ switch (which)
+ {
+ case 0:
+ if (sFactorySwapScreen->inEnemyScreen == TRUE)
+ Swap_PrintActionString(gText_PkmnForSwap, 8, 3);
+ break;
+ case 1:
+ Swap_PrintActionString(gText_Cancel3, 32, 3);
+ break;
+ }
+ CopyWindowToVram(3, 3);
+}
+
+static void Swap_PrintMonSpecies2(void)
+{
+ u16 species;
+ u8 x;
+ u16 pal[5];
+
+ CpuCopy16(gUnknown_08610918, pal, 8);
+ if (!sFactorySwapScreen->fromSummaryScreen)
+ pal[4] = gPlttBufferFaded[228];
+ else
+ pal[4] = sFactorySwapScreen->unk24;
+ LoadPalette(pal, 0xF0, 0xA);
+
+ PutWindowTilemap(7);
+ FillWindowPixelBuffer(7, 0);
+ if (sFactorySwapScreen->cursorPos > 2)
+ {
+ CopyWindowToVram(7, 3);
+ }
+ else
+ {
+ u8 monId = sFactorySwapScreen->cursorPos;
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(7, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
+ CopyWindowToVram(7, 3);
+ }
+}
+
+static void Swap_PrintMonSpecies3(void)
+{
+ u16 species;
+ u8 x;
+
+ LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918));
+ CpuCopy16(gPlttBufferUnfaded + 240, gPlttBufferFaded + 224, 10);
+
+ if (sFactorySwapScreen->cursorPos > 2)
+ {
+ CopyWindowToVram(1, 2);
+ }
+ else
+ {
+ u8 monId = sFactorySwapScreen->cursorPos;
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ StringCopy(gStringVar4, gSpeciesNames[species]);
+ x = GetStringRightAlignXOffset(1, gStringVar4, 86);
+ AddTextPrinterParameterized3(1, 1, x, 1, gUnknown_08610925, 0, gStringVar4);
+ CopyWindowToVram(1, 3);
+ }
+}
+
+static void Swap_PrintMonCategory(void)
+{
+ u16 species;
+ u8 text[30];
+ u8 x;
+ u8 monId = sFactorySwapScreen->cursorPos;
+
+ FillWindowPixelBuffer(8, 0);
+ if (monId > 2)
+ {
+ CopyWindowToVram(8, 2);
+ }
+ else
+ {
+ PutWindowTilemap(8);
+ if (!sFactorySwapScreen->inEnemyScreen)
+ species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL);
+ else
+ species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+ CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text);
+ x = GetStringRightAlignXOffset(1, text, 0x76);
+ AddTextPrinterParameterized(8, 1, text, x, 1, 0, NULL);
+ CopyWindowToVram(8, 2);
+ }
+}
+
+static void Swap_InitActions(u8 id)
+{
+ if (sFactorySwapScreen->fromSummaryScreen != TRUE)
+ {
+ switch (id)
+ {
+ case ACTIONS_PLAYER_SCREEN:
+ sFactorySwapScreen->inEnemyScreen = FALSE;
+ sFactorySwapScreen->cursorPos = 0;
+ sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_PlayerScreenActions);
+ sFactorySwapScreen->actionsData = sSwap_PlayerScreenActions;
+ break;
+ case ACTIONS_ENEMY_SCREEN:
+ sFactorySwapScreen->inEnemyScreen = TRUE;
+ sFactorySwapScreen->cursorPos = 0;
+ sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_EnemyScreenActions);
+ sFactorySwapScreen->actionsData = sSwap_EnemyScreenActions;
+ break;
+ }
+ }
+}
+
+static void Swap_RunMenuOptionFunc(u8 taskId)
+{
+ sSwap_CurrentTableFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos];
+ sSwap_CurrentTableFunc(taskId);
+}
+
+static void sub_819F0CC(u8 taskId)
+{
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ sFactorySwapScreen->playerMonId = sFactorySwapScreen->cursorPos;
+ sub_819EA64(3);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_819D9EC;
+}
+
+static void sub_819F114(u8 taskId)
+{
+ gTasks[taskId].data[0] = 6;
+ gTasks[taskId].func = Task_FromSwapScreenToSummaryScreen;
+}
+
+static void sub_819F134(u8 taskId)
+{
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ sub_819EA64(3);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons);
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = sub_819D770;
+}
+
+static void Swap_RunActionFunc(u8 taskId)
+{
+ sSwap_CurrentTableFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func;
+ sSwap_CurrentTableFunc(taskId);
+}
+
+static void Swap_ActionCancel(u8 taskId)
+{
+ gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(sub_819CC24);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].func = sub_819D588;
+}
+
+static void Swap_ActionPkmnForSwap(u8 taskId)
+{
+ gTasks[taskId].data[6] = (u32)(sub_819D9EC) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(sub_819D9EC);
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_819D588;
+}
+
+static void Swap_ActionMon(u8 taskId)
+{
+ if (!sFactorySwapScreen->inEnemyScreen)
+ {
+ gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenMenu) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenMenu);
+ gTasks[taskId].data[5] = 2;
+ }
+ else if (Swap_AlreadyHasSameSpecies(sFactorySwapScreen->cursorPos) == TRUE)
+ {
+ sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[5] = 1;
+ gTasks[taskId].func = Task_SwapCantHaveSameMons;
+ return;
+ }
+ else
+ {
+ gTasks[taskId].data[6] = (u32)(sub_819CCD4) >> 0x10;
+ gTasks[taskId].data[7] = (u32)(sub_819CCD4);
+ gTasks[taskId].data[5] = 0;
+ }
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_819D588;
+}
+
+static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen)
+{
+ *arg0 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
+ gSprites[*arg0].callback = sub_819F600;
+ gSprites[*arg0].data[7] = swapScreen;
+ *arg1 = TRUE;
+}
+
+static void Swap_ShowSummaryMonSprite(void)
+{
+ struct Pokemon *mon;
+ u16 species;
+ u32 personality, otId;
+
+ sFactorySwapScreen->unk2C.field1 = CreateSprite(&gUnknown_08610894, 120, 64, 1);
+ StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->unk2C.field1], 2);
+
+ mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
+ species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); // BUG: otId and personality should be switched.
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
+
+ gSprites[sFactorySwapScreen->unk2C.field1].invisible = TRUE;
+}
+
+static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen)
+{
+ u8 taskId;
+
+ FreeAndDestroyMonPicSprite(arg0.field0);
+ taskId = CreateTask(sub_819F7B4, 1);
+ gTasks[taskId].data[7] = swapScreen;
+ gTasks[taskId].data[6] = arg0.field1;
+ gTasks[taskId].func(taskId);
+ *arg1 = TRUE;
+}
+
+static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1)
+{
+ FreeAndDestroyMonPicSprite(arg0.field0);
+ FreeOamMatrix(gSprites[arg0.field1].oam.matrixNum);
+ DestroySprite(&gSprites[arg0.field1]);
+ *arg1 = FALSE;
+}
+
+static void Task_SwapCantHaveSameMons(u8 taskId)
+{
+ if (sFactorySwapScreen->unk30 == TRUE)
+ return;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ Swap_PrintOnInfoWindow(gText_SamePkmnInPartyAlready);
+ sFactorySwapScreen->monSwapped = FALSE;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ if (sFactorySwapScreen->unk30 != TRUE)
+ {
+ FillWindowPixelBuffer(5, 0);
+ CopyWindowToVram(5, 2);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ Swap_PrintMonSpecies3();
+ sub_819EADC();
+ sFactorySwapScreen->unk22 = TRUE;
+ gTasks[taskId].data[0] = gTasks[taskId].data[5];
+ gTasks[taskId].func = Task_HandleSwapScreenChooseMons;
+ break;
+ }
+}
+
+static bool8 Swap_AlreadyHasSameSpecies(u8 monId)
+{
+ u8 i;
+ u16 species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL);
+
+ for (i = 0; i < 3; i++)
+ {
+ if (i != sFactorySwapScreen->playerMonId && (u16)(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)) == species)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_819F600(struct Sprite *sprite)
+{
+ u8 taskId;
+
+ if (sprite->affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ taskId = CreateTask(sub_819F69C, 1);
+ gTasks[taskId].data[7] = sprite->data[7];
+ gTasks[taskId].func(taskId);
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_819F654(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ if (sprite->data[7] == TRUE)
+ sFactorySwapScreen->unk30 = FALSE;
+ else
+ sub_819BE20(FALSE);
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_819F69C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[3] = 88;
+ task->data[24] = 152; // BUG: writing outside the array's bounds.
+ task->data[5] = 64;
+ task->data[8] = 65;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ break;
+ case 1:
+ ShowBg(3);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ break;
+ case 2:
+ task->data[5] -= 4;
+ task->data[8] += 4;
+ if (task->data[5] <= 32 || task->data[8] >= 96)
+ {
+ task->data[5] = 32;
+ task->data[8] = 96;
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] != 32)
+ return;
+ break;
+ default:
+ DestroyTask(taskId);
+ // UB: Should not use the task after it has been deleted.
+ if (gTasks[taskId].data[7] == TRUE)
+ Swap_ShowMonSprite();
+ else
+ Summary_ShowMonSprite();
+ return;
+ }
+ task->data[0]++;
+}
+
+static void sub_819F7B4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ default:
+ HideBg(3);
+ gSprites[task->data[6]].data[7] = task->data[7];
+ gSprites[task->data[6]].invisible = FALSE;
+ gSprites[task->data[6]].callback = sub_819F654;
+ StartSpriteAffineAnim(&gSprites[task->data[6]], 1);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ DestroyTask(taskId);
+ break;
+ case 0:
+ task->data[3] = 88;
+ task->data[24] = 152; // BUG: writing outside the array's bounds.
+ task->data[5] = 32;
+ task->data[8] = 96;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[5] += 4;
+ task->data[8] -= 4;
+ if (task->data[5] >= 64 || task->data[8] <= 65)
+ {
+ task->data[5] = 64;
+ task->data[8] = 65;
+ }
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8]));
+ if (task->data[5] == 64)
+ task->data[0]++;
+ break;
+ }
+}
+
+static void Swap_ShowMonSprite(void)
+{
+ struct Pokemon *mon;
+ u16 species;
+ u32 personality, otId;
+
+ if (!sFactorySwapScreen->inEnemyScreen)
+ mon = &gPlayerParty[sFactorySwapScreen->cursorPos];
+ else
+ mon = &gEnemyParty[sFactorySwapScreen->cursorPos];
+
+ species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ otId = GetMonData(mon, MON_DATA_OT_ID, NULL);
+
+ sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF);
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0;
+ gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0;
+
+ sFactorySwapScreen->unk30 = FALSE;
+}
diff --git a/src/battle_frontier_1.c b/src/battle_frontier_1.c
deleted file mode 100644
index c53f10dca..000000000
--- a/src/battle_frontier_1.c
+++ /dev/null
@@ -1,118 +0,0 @@
-#include "global.h"
-#include "event_data.h"
-#include "battle_setup.h"
-#include "overworld.h"
-#include "random.h"
-#include "battle_tower.h"
-
-extern void SetBattleFacilityTrainerGfxId(u16, u8);
-
-extern void (* const gUnknown_0860DE50[])(void);
-extern const u32 gUnknown_0860DE98[][2];
-extern const u32 gUnknown_0860DEA8[][2];
-
-// code
-void sub_8195960(void)
-{
- gUnknown_0860DE50[gSpecialVar_0x8004]();
-}
-
-void sub_8195980(void)
-{
- u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
- u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
-
- gSaveBlock2Ptr->frontier.field_CA8 = 0;
- gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
- gSaveBlock2Ptr->frontier.field_CA9_a = 0;
- gSaveBlock2Ptr->frontier.field_CA9_b = 0;
- if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]))
- gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0;
-
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
- gTrainerBattleOpponent_A = 0;
-}
-
-void sub_8195A38(void)
-{
- u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
- u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
-
- switch (gSpecialVar_0x8005)
- {
- case 0:
- gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DC4[1];
- break;
- case 1:
- gSpecialVar_Result = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode];
- break;
- case 2:
- gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]) != 0);
- break;
- }
-}
-
-void sub_8195AE4(void)
-{
- u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
- u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
-
- switch (gSpecialVar_0x8005)
- {
- case 0:
- gSaveBlock2Ptr->frontier.field_DC4[1] = gSpecialVar_0x8006;
- break;
- case 1:
- gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
- break;
- case 2:
- if (gSpecialVar_0x8006)
- gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_0860DE98[battleMode][lvlMode];
- else
- gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_0860DEA8[battleMode][lvlMode];
- break;
- }
-}
-
-void sub_8195BB0(void)
-{
- u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
- u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
-
- if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 50)
- gSpecialVar_Result = Random() % 3;
- else if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 99)
- gSpecialVar_Result = 3;
- else
- gSpecialVar_Result = 4;
-}
-
-void sub_8195C20(void)
-{
- gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u;
- SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
-}
-
-void sub_8195C50(void)
-{
- if (gTrainerBattleOpponent_A < 300)
- FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
-}
-
-/*
-void sub_8195C7C(void)
-{
- u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
- u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
-
- if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 9999)
- {
- u16 wat = 0;
- gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]++;
- if (lvlMode < gSaveBlock2Ptr->frontier.field_DD0[battleMode][lvlMode])
- wat = 1;
- if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][wat] != 0)
- gSaveBlock2Ptr->frontier.field_DD0[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode];
- }
-}
-*/
diff --git a/src/battle_interface.c b/src/battle_interface.c
index d89d6164d..ec8a06094 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -1610,7 +1610,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
{
gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;
}
- else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_2A0 & gBitTable[j]) // hmm...?
+ else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostPlayerMons & gBitTable[j])
{
gSprites[ballIconSpritesIds[i]].oam.tileNum += 3;
}
@@ -1659,7 +1659,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
{
gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3;
}
- else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_2A1 & gBitTable[j]) // hmm...?
+ else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaLostOpponentMons & gBitTable[j]) // hmm...?
{
gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3;
}
diff --git a/src/battle_main.c b/src/battle_main.c
index e08e12194..f6c01aee2 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -1,58 +1,58 @@
#include "global.h"
#include "battle.h"
-#include "recorded_battle.h"
-#include "main.h"
-#include "load_save.h"
-#include "gpu_regs.h"
-#include "scanline_effect.h"
-#include "battle_setup.h"
-#include "battle_scripts.h"
+#include "battle_ai_script_commands.h"
+#include "battle_arena.h"
+#include "battle_controllers.h"
#include "battle_interface.h"
-#include "pokemon.h"
-#include "palette.h"
-#include "task.h"
-#include "event_data.h"
-#include "constants/species.h"
+#include "battle_message.h"
+#include "battle_scripts.h"
+#include "battle_setup.h"
+#include "battle_tower.h"
#include "berry.h"
-#include "text.h"
+#include "bg.h"
+#include "data2.h"
+#include "decompress.h"
+#include "dma3.h"
+#include "event_data.h"
+#include "evolution_scene.h"
+#include "gpu_regs.h"
+#include "international_string_util.h"
#include "item.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"
+#include "load_save.h"
+#include "main.h"
#include "malloc.h"
-#include "event_data.h"
#include "m4a.h"
-#include "window.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokeball.h"
+#include "pokedex.h"
+#include "pokemon.h"
#include "random.h"
-#include "constants/songs.h"
+#include "recorded_battle.h"
+#include "roamer.h"
+#include "safari_zone.h"
+#include "scanline_effect.h"
#include "sound.h"
-#include "battle_message.h"
#include "sprite.h"
-#include "util.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
#include "trig.h"
-#include "battle_ai_script_commands.h"
-#include "constants/battle_move_effects.h"
-#include "battle_controllers.h"
-#include "pokedex.h"
+#include "tv.h"
+#include "util.h"
+#include "window.h"
#include "constants/abilities.h"
+#include "constants/battle_move_effects.h"
+#include "constants/battle_string_ids.h"
+#include "constants/hold_effects.h"
+#include "constants/items.h"
#include "constants/moves.h"
#include "constants/rgb.h"
-#include "evolution_scene.h"
-#include "roamer.h"
-#include "tv.h"
-#include "safari_zone.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"
-#include "battle_tower.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "constants/trainers.h"
struct UnknownPokemonStruct4
{
@@ -109,9 +109,7 @@ extern const u8 gText_Love[];
// functions
extern void sub_81B9150(void);
extern void sub_80B3AF8(u8 taskId); // cable club
-extern void sub_81A56B4(void); // battle frontier 2
extern u8 sub_81A9E28(void); // 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);
@@ -3085,8 +3083,8 @@ static void BattleStartClearSetData(void)
gBattleResults.shinyWildMon = IsMonShiny(&gEnemyParty[0]);
- gBattleStruct->field_2A0 = 0;
- gBattleStruct->field_2A1 = 0;
+ gBattleStruct->arenaLostPlayerMons = 0;
+ gBattleStruct->arenaLostOpponentMons = 0;
}
void SwitchInClearSetData(void)
@@ -3423,7 +3421,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void)
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
- sub_81A56B4();
+ BattleArena_InitPoints();
}
gBattleMainFunc = BattleIntroDrawPartySummaryScreens;
}
@@ -5479,7 +5477,7 @@ static void HandleAction_UseMove(void)
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
- sub_81A56E8(gBattlerAttacker);
+ BattleArena_AddMindPoints(gBattlerAttacker);
gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
}
diff --git a/src/battle_palace.c b/src/battle_palace.c
new file mode 100644
index 000000000..d435f7e15
--- /dev/null
+++ b/src/battle_palace.c
@@ -0,0 +1,187 @@
+#include "global.h"
+#include "event_data.h"
+#include "battle_setup.h"
+#include "overworld.h"
+#include "random.h"
+#include "battle_tower.h"
+#include "frontier_util.h"
+#include "item.h"
+#include "constants/items.h"
+
+// This file's functions.
+static void sub_8195980(void);
+static void sub_8195A38(void);
+static void sub_8195AE4(void);
+static void sub_8195BB0(void);
+static void sub_8195C20(void);
+static void sub_8195C50(void);
+static void sub_8195C7C(void);
+static void sub_8195CE4(void);
+static void sub_8195D28(void);
+static void sub_8195DB8(void);
+
+// Const rom data.
+static void (* const sBattlePalaceFunctions[])(void) =
+{
+ sub_8195980,
+ sub_8195A38,
+ sub_8195AE4,
+ sub_8195BB0,
+ sub_8195C20,
+ sub_8195C50,
+ sub_8195C7C,
+ sub_8195CE4,
+ sub_8195D28,
+ sub_8195DB8,
+};
+
+static const u16 gUnknown_0860DE78[] = {ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, ITEM_CALCIUM, ITEM_CARBOS, ITEM_ZINC};
+static const u16 gUnknown_0860DE84[] = {ITEM_BRIGHT_POWDER, ITEM_WHITE_HERB, ITEM_QUICK_CLAW, ITEM_LEFTOVERS, ITEM_MENTAL_HERB, ITEM_KINGS_ROCK, ITEM_FOCUS_BAND, ITEM_SCOPE_LENS, ITEM_CHOICE_BAND};
+
+static const u32 gUnknown_0860DE98[][2] =
+{
+ {0x10, 0x20},
+ {0x400000, 0x800000},
+};
+
+static const u32 gUnknown_0860DEA8[][2] =
+{
+ {~0x10, ~0x20},
+ {~0x400000, ~0x800000},
+};
+
+// code
+void CallBattlePalaceFunction(void)
+{
+ sBattlePalaceFunctions[gSpecialVar_0x8004]();
+}
+
+static void sub_8195980(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_b = 0;
+ if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]))
+ gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0;
+
+ saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ gTrainerBattleOpponent_A = 0;
+}
+
+static void sub_8195A38(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DC6;
+ break;
+ case 1:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode];
+ break;
+ case 2:
+ gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]) != 0);
+ break;
+ }
+}
+
+static void sub_8195AE4(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSaveBlock2Ptr->frontier.field_DC6 = gSpecialVar_0x8006;
+ break;
+ case 1:
+ gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006;
+ break;
+ case 2:
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_0860DE98[battleMode][lvlMode];
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_0860DEA8[battleMode][lvlMode];
+ break;
+ }
+}
+
+static void sub_8195BB0(void)
+{
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 50)
+ gSpecialVar_Result = Random() % 3;
+ else if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 99)
+ gSpecialVar_Result = 3;
+ else
+ gSpecialVar_Result = 4;
+}
+
+static void sub_8195C20(void)
+{
+ gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u;
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
+}
+
+static void sub_8195C50(void)
+{
+ if (gTrainerBattleOpponent_A < 300)
+ FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
+}
+
+static void sub_8195C7C(void)
+{
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+
+ if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 9999)
+ {
+ gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]++;
+
+ // Whatever GF planned to do here, they messed up big time.
+ if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][(lvlMode > gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode]) ? 1 : 0])
+ gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode];
+ }
+}
+
+static void sub_8195CE4(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = 1;
+ sub_81A4C30();
+}
+
+static void sub_8195D28(void)
+{
+ u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] > 41)
+ gSaveBlock2Ptr->frontier.field_DC6 = gUnknown_0860DE84[Random() % ARRAY_COUNT(gUnknown_0860DE84)];
+ else
+ gSaveBlock2Ptr->frontier.field_DC6 = gUnknown_0860DE78[Random() % ARRAY_COUNT(gUnknown_0860DE78)];
+}
+
+static void sub_8195DB8(void)
+{
+ if (AddBagItem(gSaveBlock2Ptr->frontier.field_DC6, 1) == TRUE)
+ {
+ CopyItemName(gSaveBlock2Ptr->frontier.field_DC6, gStringVar1);
+ gSaveBlock2Ptr->frontier.field_DC6 = 0;
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+}
diff --git a/src/battle_pike.c b/src/battle_pike.c
new file mode 100644
index 000000000..a0a50d86e
--- /dev/null
+++ b/src/battle_pike.c
@@ -0,0 +1,1271 @@
+#include "global.h"
+#include "battle_pike.h"
+#include "event_data.h"
+#include "frontier_util.h"
+#include "fieldmap.h"
+#include "save.h"
+#include "battle.h"
+#include "random.h"
+#include "task.h"
+#include "battle_tower.h"
+#include "party_menu.h"
+#include "malloc.h"
+#include "palette.h"
+#include "script.h"
+#include "battle_setup.h"
+#include "constants/event_objects.h"
+#include "constants/battle_frontier.h"
+#include "constants/abilities.h"
+#include "constants/rgb.h"
+#include "constants/trainers.h"
+#include "constants/species.h"
+
+#define PIKE_ROOM_SINGLE_BATTLE 0
+#define PIKE_ROOM_HEAL_FULL 1
+#define PIKE_ROOM_NPC 2
+#define PIKE_ROOM_STATUS 3
+#define PIKE_ROOM_HEAL_PART 4
+#define PIKE_ROOM_WILD_MONS 5
+#define PIKE_ROOM_HARD_BATTLE 6
+#define PIKE_ROOM_DOUBLE_BATTLE 7
+#define PIKE_ROOM_BRAIN 8
+
+// For the room with a status effect.
+#define PIKE_STATUS_KIRLIA 0
+#define PIKE_STATUS_DUSCLOPS 1
+
+struct Unk0861231C
+{
+ u16 unk0;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ u8 unk5;
+};
+
+struct PikeWildMon
+{
+ u16 species;
+ u8 levelDelta;
+ u16 moves[4];
+};
+
+extern const struct Unk0861231C gUnknown_0861231C[];
+extern const struct PikeWildMon *const *const gUnknown_08612314[2];
+extern const u16 gUnknown_086123E4[][6];
+extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
+
+// IWRAM bss
+static IWRAM_DATA u8 sRoomType;
+static IWRAM_DATA u8 sStatusMon;
+static IWRAM_DATA bool8 sUnknown_0300128E;
+static IWRAM_DATA u32 sStatusFlags;
+static IWRAM_DATA u8 sUnknown_03001294;
+
+// This file's functions.
+static void sub_81A705C(void);
+static void sub_81A7140(void);
+static void sub_81A7248(void);
+static void sub_81A73B8(void);
+static void sub_81A7070(void);
+static void sub_81A73EC(void);
+static void sub_81A7400(void);
+static void sub_81A740C(void);
+static void sub_81A7418(void);
+static void nullsub_76(void);
+static void nullsub_124(void);
+static void sub_81A7468(void);
+static void sub_81A74CC(void);
+static void sub_81A74E0(void);
+static void sub_81A7508(void);
+static void sub_81A7580(void);
+static void sub_81A8090(void);
+static void sub_81A80DC(void);
+static void sub_81A825C(void);
+static void sub_81A827C(void);
+static void sub_81A84B4(void);
+static void sub_81A84EC(void);
+static void sub_81A863C(void);
+static void sub_81A8658(void);
+static void sub_81A869C(void);
+static void sub_81A86C0(void);
+static void sub_81A8794(void);
+static void sub_81A87E8(void);
+static void sub_81A8830(void);
+static u8 GetNextRoomType(void);
+static void PrepareOneTrainer(bool8 difficult);
+static u16 sub_81A7B58(void);
+static void PrepareTwoTrainers(void);
+static void TryHealMons(u8 healCount);
+static void sub_81A7EE4(u8 taskId);
+static bool8 AtLeastTwoAliveMons(void);
+static u8 SpeciesToPikeMonId(u16 species);
+static bool8 CanEncounterWildMon(u8 monLevel);
+static u8 sub_81A8590(u8);
+static bool8 sub_81A7D8C(struct Task *task);
+static bool8 sub_81A7DE8(struct Task *task);
+
+// Const rom data.
+static const u8 gUnknown_086125DC[][4] =
+{
+ {0x23, 0x46, 0x23, 0x01},
+ {0x04, 0x09, 0x05, 0x00},
+ {0x15, 0x2a, 0x15, 0x01},
+ {0x1c, 0x38, 0x1c, 0x01},
+ {0x15, 0x2a, 0x15, 0x01},
+ {0x1c, 0x8c, 0x38, 0x01},
+ {0x15, 0x46, 0x23, 0x00},
+};
+
+static void (* const sBattlePikeFunctions[])(void) =
+{
+ sub_81A705C,
+ sub_81A7140,
+ sub_81A7248,
+ sub_81A73B8,
+ sub_81A7070,
+ sub_81A73EC,
+ sub_81A7400,
+ sub_81A740C,
+ sub_81A7418,
+ nullsub_76,
+ nullsub_124,
+ sub_81A7468,
+ sub_81A74CC,
+ sub_81A74E0,
+ sub_81A7508,
+ sub_81A7580,
+ sub_81A8090,
+ sub_81A80DC,
+ sub_81A825C,
+ sub_81A827C,
+ sub_81A84B4,
+ sub_81A84EC,
+ sub_81A863C,
+ sub_81A8658,
+ sub_81A869C,
+ sub_81A86C0,
+ sub_81A8794,
+ sub_81A87E8,
+ sub_81A8830
+};
+
+static const u8 gUnknown_0861266C[] = {3, 3, 1, 0, 0, 2, 2, 1, 4};
+
+static const u8 gUnknown_08612675[][3] =
+{
+ {2, 1, 0},
+ {2, 0, 1},
+ {1, 2, 0},
+ {1, 0, 2},
+ {0, 2, 1},
+ {0, 1, 2},
+};
+
+static bool8 (* const gUnknown_08612688[])(struct Task *) =
+{
+ sub_81A7D8C, sub_81A7DE8
+};
+
+static const u32 gUnknown_08612690[] = {0x400, 0x800};
+
+// code
+void CallBattlePikeFunction(void)
+{
+ sBattlePikeFunctions[gSpecialVar_0x8004]();
+}
+
+static void sub_81A705C(void)
+{
+ u8 roomType = GetNextRoomType();
+ sRoomType = roomType;
+}
+
+static void sub_81A7070(void)
+{
+ bool32 setPerson1, setPerson2;
+ u32 person1;
+ u16 person2;
+
+ VarSet(VAR_OBJ_GFX_ID_0, EVENT_OBJ_GFX_LINK_RECEPTIONIST);
+ VarSet(VAR_OBJ_GFX_ID_1, EVENT_OBJ_GFX_DUSCLOPS);
+ setPerson1 = TRUE;
+ setPerson2 = FALSE;
+ person1 = 0;
+ person2 = 0;
+
+ switch (sRoomType)
+ {
+ case PIKE_ROOM_SINGLE_BATTLE:
+ PrepareOneTrainer(FALSE);
+ setPerson1 = FALSE;
+ break;
+ case PIKE_ROOM_HEAL_FULL:
+ person1 = EVENT_OBJ_GFX_LINK_RECEPTIONIST;
+ break;
+ case PIKE_ROOM_NPC:
+ person1 = (u8)(sub_81A7B58());
+ break;
+ case PIKE_ROOM_STATUS:
+ person1 = EVENT_OBJ_GFX_GENTLEMAN;
+ if (sStatusMon == PIKE_STATUS_DUSCLOPS)
+ person2 = EVENT_OBJ_GFX_DUSCLOPS;
+ else
+ person2 = EVENT_OBJ_GFX_KIRLIA;
+ setPerson2 = TRUE;
+ break;
+ case PIKE_ROOM_HEAL_PART:
+ person1 = EVENT_OBJ_GFX_GENTLEMAN;
+ break;
+ case PIKE_ROOM_WILD_MONS:
+ setPerson1 = FALSE;
+ break;
+ case PIKE_ROOM_HARD_BATTLE:
+ PrepareOneTrainer(TRUE);
+ person2 = EVENT_OBJ_GFX_LINK_RECEPTIONIST;
+ setPerson1 = FALSE;
+ setPerson2 = TRUE;
+ break;
+ case PIKE_ROOM_DOUBLE_BATTLE:
+ PrepareTwoTrainers();
+ setPerson1 = FALSE;
+ break;
+ case PIKE_ROOM_BRAIN:
+ SetFrontierBrainEventObjGfx(FRONTIER_FACILITY_PIKE);
+ person2 = EVENT_OBJ_GFX_LINK_RECEPTIONIST;
+ setPerson1 = FALSE;
+ setPerson2 = TRUE;
+ break;
+ default:
+ return;
+ }
+
+ if (setPerson1 == TRUE)
+ VarSet(VAR_OBJ_GFX_ID_0, person1);
+ if (setPerson2 == TRUE)
+ VarSet(VAR_OBJ_GFX_ID_1, person2);
+}
+
+static void sub_81A7140(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E02;
+ break;
+ case 1:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.pikeWinStreaks[gSaveBlock2Ptr->frontier.lvlMode];
+ break;
+ case 2:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.pikeRecordStreaks[gSaveBlock2Ptr->frontier.lvlMode];
+ break;
+ case 3:
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.pikeTotalStreaks[gSaveBlock2Ptr->frontier.lvlMode];
+ break;
+ case 4:
+ if (lvlMode != FRONTIER_LVL_50)
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x800;
+ else
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x400;
+ break;
+ }
+}
+
+static void sub_81A7248(void)
+{
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ switch (gSpecialVar_0x8005)
+ {
+ case 0:
+ gSaveBlock2Ptr->frontier.field_E02 = gSpecialVar_0x8006;
+ break;
+ case 1:
+ if (gSpecialVar_0x8006 <= 9999)
+ gSaveBlock2Ptr->frontier.pikeWinStreaks[gSaveBlock2Ptr->frontier.lvlMode] = gSpecialVar_0x8006;
+ break;
+ case 2:
+ if (gSpecialVar_0x8006 <= 9999 && gSaveBlock2Ptr->frontier.pikeRecordStreaks[gSaveBlock2Ptr->frontier.lvlMode] < gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.pikeRecordStreaks[gSaveBlock2Ptr->frontier.lvlMode] = gSpecialVar_0x8006;
+ break;
+ case 3:
+ if (gSpecialVar_0x8006 <= 9999)
+ gSaveBlock2Ptr->frontier.pikeTotalStreaks[gSaveBlock2Ptr->frontier.lvlMode] = gSpecialVar_0x8006;
+ break;
+ case 4:
+ if (lvlMode != FRONTIER_LVL_50)
+ {
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= 0x800;
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= ~(0x800);
+ }
+ else
+ {
+ if (gSpecialVar_0x8006)
+ gSaveBlock2Ptr->frontier.field_CDC |= 0x400;
+ else
+ gSaveBlock2Ptr->frontier.field_CDC &= ~(0x400);
+ }
+ break;
+ }
+}
+
+static void sub_81A73B8(void)
+{
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum >= 15)
+ gSpecialVar_Result = TRUE;
+ else
+ gSpecialVar_Result = FALSE;
+}
+
+static void sub_81A73EC(void)
+{
+ gSpecialVar_Result = sRoomType;
+}
+
+static void sub_81A7400(void)
+{
+ sUnknown_0300128E = TRUE;
+}
+
+static void sub_81A740C(void)
+{
+ sUnknown_0300128E = FALSE;
+}
+
+static void sub_81A7418(void)
+{
+ gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
+ VarSet(VAR_TEMP_0, 0);
+ gSaveBlock2Ptr->frontier.field_CA9_a = 1;
+ save_serialize_map();
+ TrySavingData(SAVE_LINK);
+}
+
+static void nullsub_76(void)
+{
+
+}
+
+static void nullsub_124(void)
+{
+
+}
+
+static void sub_81A7468(void)
+{
+ switch (sStatusFlags)
+ {
+ case STATUS1_FREEZE:
+ gSpecialVar_Result = 0;
+ break;
+ case STATUS1_BURN:
+ gSpecialVar_Result = 1;
+ break;
+ case STATUS1_TOXIC_POISON:
+ gSpecialVar_Result = 2;
+ break;
+ case STATUS1_PARALYSIS:
+ gSpecialVar_Result = 3;
+ break;
+ case STATUS1_SLEEP:
+ gSpecialVar_Result = 4;
+ break;
+ }
+}
+
+static void sub_81A74CC(void)
+{
+ gSpecialVar_Result = sStatusMon;
+}
+
+static void sub_81A74E0(void)
+{
+ u16 toHeal = (Random() % 2) + 1;
+ TryHealMons(toHeal);
+ gSpecialVar_Result = toHeal;
+}
+
+static void sub_81A7508(void)
+{
+ s32 id;
+
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= 4)
+ id = gUnknown_0861231C[sUnknown_03001294].unk2;
+ else if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= 10)
+ id = gUnknown_0861231C[sUnknown_03001294].unk3;
+ else
+ id = gUnknown_0861231C[sUnknown_03001294].unk4;
+
+ FrontierSpeechToString(gUnknown_086123E4[id]);
+}
+
+static void sub_81A7580(void)
+{
+ CreateTask(sub_81A7EE4, 2);
+}
+
+static void HealMon(struct Pokemon *mon)
+{
+ u8 i;
+ u16 hp;
+ u8 ppBonuses;
+ u8 data[4];
+
+ for (i = 0; i < 4; i++)
+ data[i] = 0;
+
+ hp = GetMonData(mon, MON_DATA_MAX_HP);
+ data[0] = hp;
+ data[1] = hp >> 8;
+ SetMonData(mon, MON_DATA_HP, data);
+
+ ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
+ for (i = 0; i < 4; i++)
+ {
+ u16 move = GetMonData(mon, MON_DATA_MOVE1 + i);
+ data[0] = CalculatePPWithBonus(move, ppBonuses, i);
+ SetMonData(mon, MON_DATA_PP1 + i, data);
+ }
+
+ data[0] = 0;
+ data[1] = 0;
+ data[2] = 0;
+ data[3] = 0;
+ SetMonData(mon, MON_DATA_STATUS, data);
+}
+
+static bool8 DoesAbilityPreventStatus(struct Pokemon *mon, u32 status)
+{
+ u8 ability = GetMonAbility(mon);
+ bool8 ret = FALSE;
+
+ switch (status)
+ {
+ case STATUS1_FREEZE:
+ if (ability == ABILITY_MAGMA_ARMOR)
+ ret = TRUE;
+ break;
+ case STATUS1_BURN:
+ if (ability == ABILITY_WATER_VEIL)
+ ret = TRUE;
+ break;
+ case STATUS1_PARALYSIS:
+ if (ability == ABILITY_LIMBER)
+ ret = TRUE;
+ break;
+ case STATUS1_SLEEP:
+ if (ability == ABILITY_INSOMNIA || ability == ABILITY_VITAL_SPIRIT)
+ ret = TRUE;
+ break;
+ case STATUS1_TOXIC_POISON:
+ if (ability == ABILITY_IMMUNITY)
+ ret = TRUE;
+ break;
+ }
+ return ret;
+}
+
+static bool8 DoesTypePreventStatus(u16 species, u32 status)
+{
+ bool8 ret = FALSE;
+
+ switch (status)
+ {
+ case STATUS1_TOXIC_POISON:
+ if (gBaseStats[species].type1 == TYPE_STEEL || gBaseStats[species].type1 == TYPE_POISON
+ || gBaseStats[species].type2 == TYPE_STEEL || gBaseStats[species].type2 == TYPE_POISON)
+ ret = TRUE;
+ break;
+ case STATUS1_FREEZE:
+ if (gBaseStats[species].type1 == TYPE_ICE || gBaseStats[species].type2 == TYPE_ICE)
+ ret = TRUE;
+ break;
+ case STATUS1_PARALYSIS:
+ if (gBaseStats[species].type1 == TYPE_GROUND || gBaseStats[species].type1 == TYPE_ELECTRIC
+ || gBaseStats[species].type2 == TYPE_GROUND || gBaseStats[species].type2 == TYPE_ELECTRIC)
+ ret = TRUE;
+ break;
+ case STATUS1_BURN:
+ if (gBaseStats[species].type1 == TYPE_FIRE || gBaseStats[species].type2 == TYPE_FIRE)
+ ret = TRUE;
+ break;
+ case STATUS1_SLEEP:
+ break;
+ }
+ return ret;
+}
+
+static bool8 TryInflictRandomStatus(void)
+{
+ u8 j, i;
+ u8 count;
+ u8 indices[3];
+ u32 status;
+ u16 species;
+ bool8 statusChosen;
+ struct Pokemon *mon;
+
+ for (i = 0; i < 3; i++)
+ indices[i] = i;
+ for (j = 0; j < 10; j++)
+ {
+ u8 temp, id;
+
+ i = Random() % 3;
+ id = Random() % 3;
+ SWAP(indices[i], indices[id], temp);
+ }
+
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= 4)
+ count = 1;
+ else if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= 9)
+ count = 2;
+ else
+ count = 3;
+
+ status = 0;
+ do
+ {
+ u8 rand;
+
+ statusChosen = FALSE;
+ rand = Random() % 100;
+
+ if (rand < 35)
+ sStatusFlags = STATUS1_TOXIC_POISON;
+ else if (rand < 60)
+ sStatusFlags = STATUS1_FREEZE;
+ else if (rand < 80)
+ sStatusFlags = STATUS1_PARALYSIS;
+ else if (rand < 90)
+ sStatusFlags = STATUS1_SLEEP;
+ else
+ sStatusFlags = STATUS1_BURN;
+
+ if (status != sStatusFlags)
+ {
+ status = sStatusFlags;
+ j = 0;
+ for (i = 0; i < 3; i++)
+ {
+ mon = &gPlayerParty[indices[i]];
+ if (pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)) == 0
+ && GetMonData(mon, MON_DATA_HP) != 0)
+ {
+ j++;
+ species = GetMonData(mon, MON_DATA_SPECIES);
+ if (!DoesTypePreventStatus(species, sStatusFlags))
+ {
+ statusChosen = TRUE;
+ break;
+ }
+ }
+ if (j == count)
+ break;
+ }
+ if (j == 0)
+ return FALSE;
+ }
+ } while (!statusChosen);
+
+ switch (sStatusFlags)
+ {
+ case STATUS1_FREEZE:
+ sStatusMon = PIKE_STATUS_DUSCLOPS;
+ break;
+ case STATUS1_BURN:
+ if (Random() % 2 != 0)
+ sStatusMon = PIKE_STATUS_DUSCLOPS;
+ else
+ sStatusMon = PIKE_STATUS_KIRLIA;
+ break;
+ case STATUS1_PARALYSIS:
+ case STATUS1_SLEEP:
+ case STATUS1_TOXIC_POISON:
+ default:
+ sStatusMon = PIKE_STATUS_KIRLIA;
+ break;
+ }
+
+ j = 0;
+ for (i = 0; i < 3; i++)
+ {
+ mon = &gPlayerParty[indices[i]];
+ if (pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)) == 0
+ && GetMonData(mon, MON_DATA_HP) != 0)
+ {
+ j++;
+ species = GetMonData(mon, MON_DATA_SPECIES);
+ if (!DoesAbilityPreventStatus(mon, sStatusFlags) && !DoesTypePreventStatus(species, sStatusFlags))
+ SetMonData(mon, MON_DATA_STATUS, &sStatusFlags);
+ }
+ if (j == count)
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool8 AtLeastOneHealthyMon(void)
+{
+ u8 i;
+ u8 healthyMonsCount;
+ u8 count;
+
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= 4)
+ count = 1;
+ else if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= 9)
+ count = 2;
+ else
+ count = 3;
+
+ healthyMonsCount = 0;
+ for (i = 0; i < 3; i++)
+ {
+ struct Pokemon *mon = &gPlayerParty[i];
+ if (pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)) == 0
+ && GetMonData(mon, MON_DATA_HP) != 0)
+ {
+ healthyMonsCount++;
+ }
+ if (healthyMonsCount == count)
+ break;
+ }
+
+ if (healthyMonsCount == 0)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static u8 GetNextRoomType(void)
+{
+ u8 sp[8];
+ u8 i;
+ u8 ret;
+ u8 var;
+ u8 count;
+ u8 *allocated;
+ u8 id;
+
+ if (gSaveBlock2Ptr->frontier.field_E10_2 == PIKE_ROOM_BRAIN)
+ return gSaveBlock2Ptr->frontier.field_E10_2;
+ if (gSpecialVar_0x8007 == gSaveBlock2Ptr->frontier.field_E10_1)
+ {
+ if (gSaveBlock2Ptr->frontier.field_E10_2 == PIKE_ROOM_STATUS)
+ TryInflictRandomStatus();
+ return gSaveBlock2Ptr->frontier.field_E10_2;
+ }
+
+ for (i = 0; i < 8; i++)
+ sp[i] = 0;
+
+ count = 8;
+ var = gUnknown_0861266C[gSaveBlock2Ptr->frontier.field_E10_2];
+ for (i = 0; i < 8; i++)
+ {
+ if (gUnknown_0861266C[i] == var)
+ {
+ sp[i] = 1;
+ count--;
+ }
+ }
+
+ if (sp[7] != 1 && !AtLeastTwoAliveMons())
+ {
+ sp[7] = 1;
+ count--;
+ }
+ if (sp[3] != 1 && !AtLeastOneHealthyMon())
+ {
+ sp[3] = 1;
+ count--;
+ }
+ if (gSaveBlock2Ptr->frontier.field_E10_3)
+ {
+ if (sp[1] != 1)
+ {
+ sp[1] = 1;
+ count--;
+ }
+ if (sp[4] != 1)
+ {
+ sp[4] = 1;
+ count--;
+ }
+ }
+
+ allocated = AllocZeroed(count);
+ id = 0;
+ for (i = 0; i < 8; i++)
+ {
+ if (sp[i] == 0)
+ allocated[id++] = i;
+ }
+
+ ret = allocated[Random() % count];
+ free(allocated);
+ if (ret == PIKE_ROOM_STATUS)
+ TryInflictRandomStatus();
+
+ return ret;
+}
+
+static u16 sub_81A7B58(void)
+{
+ sUnknown_03001294 = Random() % 25;
+ return gUnknown_0861231C[sUnknown_03001294].unk0;
+}
+
+static u8 sub_81A7B84(void)
+{
+ return sUnknown_0300128E;
+}
+
+bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate)
+{
+ s32 i;
+ s32 monLevel;
+ u8 headerId = GetBattlePikeWildMonHeaderId();
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ const struct PikeWildMon *const *const wildMons = gUnknown_08612314[lvlMode];
+ u32 abilityBit;
+ s32 pikeMonId = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL);
+ pikeMonId = SpeciesToPikeMonId(pikeMonId);
+
+ if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
+ {
+ monLevel = GetHighestLevelInPlayerParty();
+ if (monLevel < 60)
+ {
+ monLevel = 60;
+ }
+ else
+ {
+ monLevel -= wildMons[headerId][pikeMonId].levelDelta;
+ if (monLevel < 60)
+ monLevel = 60;
+ }
+ }
+ else
+ {
+ monLevel = 50 - wildMons[headerId][pikeMonId].levelDelta;
+ }
+
+ if (checkKeenEyeIntimidate == TRUE && !CanEncounterWildMon(monLevel))
+ return FALSE;
+
+ SetMonData(&gEnemyParty[0],
+ MON_DATA_EXP,
+ &gExperienceTables[gBaseStats[wildMons[headerId][pikeMonId].species].growthRate][monLevel]);
+
+ if (gBaseStats[wildMons[headerId][pikeMonId].species].ability2)
+ abilityBit = Random() % 2;
+ else
+ abilityBit = 0;
+ SetMonData(&gEnemyParty[0], MON_DATA_ALT_ABILITY, &abilityBit);
+ for (i = 0; i < 4; i++)
+ SetMonMoveSlot(&gEnemyParty[0], wildMons[headerId][pikeMonId].moves[i], i);
+
+ CalculateMonStats(&gEnemyParty[0]);
+ return TRUE;
+}
+
+u8 GetBattlePikeWildMonHeaderId(void)
+{
+ u8 headerId;
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u16 winStreak = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode];
+
+ if (winStreak <= 280)
+ headerId = 0;
+ else if (winStreak <= 560)
+ headerId = 1;
+ else if (winStreak <= 840)
+ headerId = 2;
+ else
+ headerId = 3;
+
+ return headerId;
+}
+
+static void sub_81A7D54(u8 taskId)
+{
+ while (gUnknown_08612688[gTasks[taskId].data[0]](&gTasks[taskId]));
+}
+
+static bool8 sub_81A7D8C(struct Task *task)
+{
+ if (task->data[6] == 0 || --task->data[6] == 0)
+ {
+ task->data[6] = task->data[1];
+ task->data[7] += task->data[4];
+ if (task->data[7] > 16)
+ task->data[7] = 16;
+ BlendPalettes(0xFFFFFFFF, task->data[7], RGB(11, 11, 11));
+ }
+
+ if (task->data[7] >= 16)
+ {
+ task->data[0]++;
+ task->data[6] = task->data[2];
+ }
+ return FALSE;
+}
+
+static bool8 sub_81A7DE8(struct Task *task)
+{
+ if (task->data[6] == 0 || --task->data[6] == 0)
+ {
+ task->data[6] = task->data[2];
+ task->data[7] -= task->data[5];
+ if (task->data[7] < 0)
+ task->data[7] = 0;
+ BlendPalettes(0xFFFFFFFF, task->data[7], RGB(11, 11, 11));
+ }
+
+ if (task->data[7] == 0)
+ {
+ if (--task->data[3] == 0)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_81A7D54));
+ }
+ else
+ {
+ task->data[6] = task->data[1];
+ task->data[0] = 0;
+ }
+ }
+ return FALSE;
+}
+
+static void sub_81A7E60(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4)
+{
+ u8 taskId = CreateTask(sub_81A7D54, 3);
+
+ gTasks[taskId].data[1] = a0;
+ gTasks[taskId].data[2] = a1;
+ gTasks[taskId].data[3] = a2;
+ gTasks[taskId].data[4] = a3;
+ gTasks[taskId].data[5] = a4;
+ gTasks[taskId].data[6] = a0;
+}
+
+static bool8 sub_81A7EC4(void)
+{
+ if (FindTaskIdByFunc(sub_81A7D54) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void sub_81A7EE4(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[0]++;
+ sub_81A7E60(0, 0, 3, 2, 2);
+ }
+ else
+ {
+ if (sub_81A7EC4())
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ }
+}
+
+static void TryHealMons(u8 healCount)
+{
+ u8 j, i, k;
+ u8 indices[3];
+
+ if (healCount == 0)
+ return;
+
+ for (i = 0; i < 3; i++)
+ indices[i] = i;
+ for (k = 0; k < 10; k++)
+ {
+ u8 temp;
+
+ i = Random() % 3;
+ j = Random() % 3;
+ SWAP(indices[i], indices[j], temp);
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ bool32 canBeHealed = FALSE;
+ struct Pokemon *mon = &gPlayerParty[indices[i]];
+ u16 curr = GetMonData(mon, MON_DATA_HP);
+ u16 max = GetMonData(mon, MON_DATA_MAX_HP);
+ if (curr < max)
+ {
+ canBeHealed = TRUE;
+ }
+ else if (pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)) != 0)
+ {
+ canBeHealed = TRUE;
+ }
+ else
+ {
+ u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
+ for (j = 0; j < 4; j++)
+ {
+ u16 move = GetMonData(mon, MON_DATA_MOVE1 + j);
+ max = CalculatePPWithBonus(move, ppBonuses, j);
+ curr = GetMonData(mon, MON_DATA_PP1 + j);
+ if (curr < max)
+ {
+ canBeHealed = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (canBeHealed == TRUE)
+ {
+ HealMon(&gPlayerParty[indices[i]]);
+ if (--healCount == 0)
+ break;
+ }
+ }
+}
+
+static void sub_81A8090(void)
+{
+ gSpecialVar_Result = InBattlePike();
+}
+
+bool8 InBattlePike(void)
+{
+ return (gMapHeader.mapLayoutId == 351 || gMapHeader.mapLayoutId == 352
+ || gMapHeader.mapLayoutId == 358 || gMapHeader.mapLayoutId == 359);
+}
+
+static void sub_81A80DC(void)
+{
+ u8 i, count, id;
+ u8 *allocated;
+
+ gSpecialVar_Result = 0;
+ if (sub_81A8590(1))
+ {
+ gSpecialVar_Result = 1;
+ gSaveBlock2Ptr->frontier.field_E10_1 = Random() % 6;
+ gSaveBlock2Ptr->frontier.field_E10_2 = PIKE_ROOM_BRAIN;
+ }
+ else
+ {
+ gSaveBlock2Ptr->frontier.field_E10_1 = Random() % 3;
+ if (gSaveBlock2Ptr->frontier.field_E10_3)
+ count = 6;
+ else
+ count = 8;
+
+ allocated = AllocZeroed(count);
+ for (i = 0, id = 0; i < count; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_E10_3)
+ {
+ if (i != PIKE_ROOM_HEAL_FULL && i != PIKE_ROOM_HEAL_PART)
+ allocated[id++] = i;
+ }
+ else
+ {
+ allocated[i] = i;
+ }
+ }
+ gSaveBlock2Ptr->frontier.field_E10_2 = allocated[Random() % count];
+ free(allocated);
+ if (gSaveBlock2Ptr->frontier.field_E10_2 == PIKE_ROOM_STATUS && !AtLeastOneHealthyMon())
+ gSaveBlock2Ptr->frontier.field_E10_2 = PIKE_ROOM_NPC;
+ if (gSaveBlock2Ptr->frontier.field_E10_2 == PIKE_ROOM_DOUBLE_BATTLE && !AtLeastTwoAliveMons())
+ gSaveBlock2Ptr->frontier.field_E10_2 = PIKE_ROOM_NPC;
+ }
+}
+
+static void sub_81A825C(void)
+{
+ gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E10_1;
+}
+
+static void sub_81A827C(void)
+{
+ gSpecialVar_Result = gUnknown_0861266C[gSaveBlock2Ptr->frontier.field_E10_2];
+}
+
+static void PrepareOneTrainer(bool8 difficult)
+{
+ s32 i;
+ u8 lvlMode;
+ u8 battleNum;
+ u16 challengeNum;
+ u16 trainerId;
+
+ if (!difficult)
+ battleNum = 1;
+ else
+ battleNum = 6;
+
+ lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ challengeNum = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] / 14;
+ do
+ {
+ trainerId = sub_8162548(challengeNum, battleNum);
+ for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
+ break;
+ }
+ } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1);
+
+ gTrainerBattleOpponent_A = trainerId;
+ gFacilityTrainers = gBattleFrontierTrainers;
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 14)
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = gTrainerBattleOpponent_A;
+}
+
+static void PrepareTwoTrainers(void)
+{
+ s32 i;
+ u16 trainerId;
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u16 challengeNum = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] / 14;
+
+ gFacilityTrainers = gBattleFrontierTrainers;
+ do
+ {
+ trainerId = sub_8162548(challengeNum, 1);
+ for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
+ break;
+ }
+ } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1);
+
+ gTrainerBattleOpponent_A = trainerId;
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0);
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum <= 14)
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 1] = gTrainerBattleOpponent_A;
+
+ do
+ {
+ trainerId = sub_8162548(challengeNum, 1);
+ for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
+ break;
+ }
+ } while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
+
+ gTrainerBattleOpponent_B = trainerId;
+ SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_B, 1);
+ if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 14)
+ gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum - 2] = gTrainerBattleOpponent_B;
+}
+
+static void sub_81A84B4(void)
+{
+ u8 i;
+
+ for (i = 0; i < 14; i++)
+ gSaveBlock2Ptr->frontier.field_CB4[i] |= 0xFFFF;
+}
+
+static void sub_81A84EC(void)
+{
+ if (gSpecialVar_0x8005 == 0)
+ {
+ if (gTrainerBattleOpponent_A < TRAINER_RECORD_MIXING_FRIEND)
+ FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
+ }
+ else if (gSpecialVar_0x8005 == 1)
+ {
+ if (gTrainerBattleOpponent_B < TRAINER_RECORD_MIXING_FRIEND)
+ FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_B].speechBefore);
+ }
+}
+
+static bool8 AtLeastTwoAliveMons(void)
+{
+ struct Pokemon *mon;
+ u8 i, countDead;
+
+ mon = &gPlayerParty[0];
+ countDead = 0;
+ for (i = 0; i < 3; i++, mon++)
+ {
+ if (GetMonData(mon, MON_DATA_HP) == 0)
+ countDead++;
+ }
+
+ if (countDead >= 2)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static u8 sub_81A8590(u8 arg0)
+{
+ u8 symbolsCount;
+
+ u8 var = 5;
+ u8 ret = 0;
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u16 wins = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode];
+ wins += arg0;
+ symbolsCount = GetPlayerSymbolCountForFacility(FRONTIER_FACILITY_PIKE);
+
+ switch (symbolsCount)
+ {
+ case 0:
+ case 1:
+ if (wins == gUnknown_086125DC[var][symbolsCount] - gUnknown_086125DC[var][3])
+ ret = symbolsCount + 1;
+ break;
+ case 2:
+ default:
+ if (wins == gUnknown_086125DC[var][0] - gUnknown_086125DC[var][3])
+ ret = 3;
+ else if (wins == gUnknown_086125DC[var][1] - gUnknown_086125DC[var][3]
+ || (wins > gUnknown_086125DC[var][1]
+ && (wins - gUnknown_086125DC[var][1] + gUnknown_086125DC[var][3]) % gUnknown_086125DC[var][2] == 0))
+ ret = 4;
+ break;
+ }
+
+ return ret;
+}
+
+static void sub_81A863C(void)
+{
+ gSpecialVar_Result = sub_81A8590(0);
+}
+
+static void sub_81A8658(void)
+{
+ u8 toHealCount = gUnknown_08612675[gSaveBlock2Ptr->frontier.field_E10_1][gSpecialVar_0x8007];
+
+ TryHealMons(toHealCount);
+ gSpecialVar_Result = toHealCount;
+}
+
+static void sub_81A869C(void)
+{
+ gSaveBlock2Ptr->frontier.field_E10_3 = gSpecialVar_0x8005;
+}
+
+static void sub_81A86C0(void)
+{
+ u8 i, j;
+
+ gSpecialVar_Result = TRUE;
+ for (i = 0; i < 3; i++)
+ {
+ bool32 canBeHealed = FALSE;
+ struct Pokemon *mon = &gPlayerParty[i];
+ u16 curr = GetMonData(mon, MON_DATA_HP);
+ u16 max = GetMonData(mon, MON_DATA_MAX_HP);
+ if (curr >= max && pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)) == 0)
+ {
+ u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
+ for (j = 0; j < 4; j++)
+ {
+ u16 move = GetMonData(mon, MON_DATA_MOVE1 + j);
+ max = CalculatePPWithBonus(move, ppBonuses, j);
+ curr = GetMonData(mon, MON_DATA_PP1 + j);
+ if (curr < max)
+ {
+ canBeHealed = TRUE;
+ break;
+ }
+ }
+ }
+ else
+ {
+ canBeHealed = TRUE;
+ }
+
+ if (canBeHealed == TRUE)
+ {
+ gSpecialVar_Result = FALSE;
+ break;
+ }
+ }
+}
+
+static void sub_81A8794(void)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ s32 heldItem = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1],
+ MON_DATA_HELD_ITEM);
+ gSaveBlock2Ptr->frontier.field_E12[i] = heldItem;
+ }
+}
+
+static void sub_81A87E8(void)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ SetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1],
+ MON_DATA_HELD_ITEM,
+ &gSaveBlock2Ptr->frontier.field_E12[i]);
+ }
+}
+
+static void sub_81A8830(void)
+{
+ u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+
+ gSaveBlock2Ptr->frontier.field_CA8 = 0;
+ gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
+ gSaveBlock2Ptr->frontier.field_CA9_a = 0;
+ if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_08612690[lvlMode]))
+ gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] = 0;
+
+ gTrainerBattleOpponent_A = 0;
+ gBattleOutcome = 0;
+}
+
+static bool8 CanEncounterWildMon(u8 enemyMonLevel)
+{
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ {
+ u8 monAbility = GetMonAbility(&gPlayerParty[0]);
+ if (monAbility == ABILITY_KEEN_EYE || monAbility == ABILITY_INTIMIDATE)
+ {
+ u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL);
+ if (playerMonLevel > 5 && enemyMonLevel <= playerMonLevel - 5 && Random() % 2 == 0)
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static u8 SpeciesToPikeMonId(u16 species)
+{
+ u8 ret;
+
+ if (species == SPECIES_SEVIPER)
+ ret = 0;
+ else if (species == SPECIES_MILOTIC)
+ ret = 1;
+ else
+ ret = 2;
+
+ return ret;
+}
diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c
index e0e35a69f..2225a3e55 100644
--- a/src/battle_pyramid_bag.c
+++ b/src/battle_pyramid_bag.c
@@ -1,35 +1,35 @@
#include "global.h"
-#include "battle_pyramid_bag.h"
-#include "main.h"
+#include "battle.h"
#include "battle_controllers.h"
+#include "battle_pyramid_bag.h"
#include "bg.h"
+#include "decompress.h"
+#include "event_data.h"
#include "field_effect.h"
#include "field_weather.h"
+#include "graphics.h"
#include "gpu_regs.h"
+#include "international_string_util.h"
+#include "item.h"
+#include "item_icon.h"
+#include "item_menu.h"
+#include "item_use.h"
+#include "list_menu.h"
+#include "mail.h"
+#include "main.h"
#include "malloc.h"
#include "menu.h"
-#include "overworld.h"
#include "menu_helpers.h"
#include "overworld.h"
#include "palette.h"
#include "party_menu.h"
+#include "task.h"
+#include "text_window.h"
#include "scanline_effect.h"
#include "script.h"
-#include "task.h"
-#include "decompress.h"
-#include "graphics.h"
+#include "sound.h"
#include "string_util.h"
-#include "list_menu.h"
#include "strings.h"
-#include "item.h"
-#include "sound.h"
-#include "item_menu.h"
-#include "mail.h"
-#include "item_use.h"
-#include "event_data.h"
-#include "text_window.h"
-#include "international_string_util.h"
-#include "item_icon.h"
#include "constants/items.h"
#include "constants/rgb.h"
#include "constants/songs.h"
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index b652049c4..665ee3750 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -43,6 +43,8 @@
#include "battle_setup.h"
#include "overworld.h"
#include "party_menu.h"
+#include "battle_arena.h"
+#include "battle_pike.h"
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
@@ -54,20 +56,15 @@ extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern const u8* const gBattleScriptsForMoveEffects[];
// functions
-extern void sub_81A5718(u8 battlerId); // battle frontier 2
-extern void sub_81A56B4(void); // battle frontier 2
extern void ShowSelectMovePokemonSummaryScreen(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 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
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 u8 BattleArena_ShowJudgmentWindow(u8* arg0); // battle frontier 2
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 sub_813B21C(void);
@@ -3549,7 +3546,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->arenaLostPlayerMons & gBitTable[i])))
{
HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);
}
@@ -3562,7 +3559,7 @@ static void atk24(void)
for (HP_count = 0, i = 0; i < 6; i++)
{
if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES) && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG)
- && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->field_2A1 & gBitTable[i])))
+ && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostOpponentMons & gBitTable[i])))
{
HP_count += GetMonData(&gEnemyParty[i], MON_DATA_HP);
}
@@ -4243,7 +4240,7 @@ static void atk3C_return(void)
static void atk3D_end(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
- sub_81A5718(gBattlerAttacker);
+ BattleArena_AddSkillPoints(gBattlerAttacker);
gMoveResultFlags = 0;
gActiveBattler = 0;
@@ -5000,7 +4997,7 @@ static void atk4E_switchinanim(void)
gBattlescriptCurrInstr += 3;
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
- sub_81A56B4();
+ BattleArena_InitPoints();
}
static void atk4F_jumpifcantswitch(void)
@@ -6697,34 +6694,34 @@ static void atk76_various(void)
gBattleCommunication[MULTISTRING_CHOOSER] = sUnknown_0831C4F8[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)];
}
break;
- case 9:
- i = sub_81A5258(gBattleCommunication);
+ case VARIOUS_ARENA_JUDGMENT_WINDOW:
+ i = BattleArena_ShowJudgmentWindow(&gBattleCommunication[0]);
if (i == 0)
return;
gBattleCommunication[1] = i;
break;
- case 10:
+ case VARIOUS_ARENA_OPPONENT_MON_LOST:
gBattleMons[1].hp = 0;
gHitMarker |= HITMARKER_FAINTED(1);
- gBattleStruct->field_2A1 |= gBitTable[gBattlerPartyIndexes[1]];
+ gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]];
gDisableStructs[1].truantUnknownBit = 1;
break;
- case 11:
+ case VARIOUS_ARENA_PLAYER_MON_LOST:
gBattleMons[0].hp = 0;
gHitMarker |= HITMARKER_FAINTED(0);
gHitMarker |= HITMARKER_x400000;
- gBattleStruct->field_2A0 |= gBitTable[gBattlerPartyIndexes[0]];
+ gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]];
gDisableStructs[0].truantUnknownBit = 1;
break;
- case 12:
+ case VARIOUS_ARENA_BOTH_MONS_LOST:
gBattleMons[0].hp = 0;
gBattleMons[1].hp = 0;
gHitMarker |= HITMARKER_FAINTED(0);
gHitMarker |= HITMARKER_FAINTED(1);
gHitMarker |= HITMARKER_x400000;
- gBattleStruct->field_2A0 |= gBitTable[gBattlerPartyIndexes[0]];
- gBattleStruct->field_2A1 |= gBitTable[gBattlerPartyIndexes[1]];
+ gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]];
+ gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]];
gDisableStructs[0].truantUnknownBit = 1;
gDisableStructs[1].truantUnknownBit = 1;
break;
@@ -6738,11 +6735,11 @@ static void atk76_various(void)
case 15:
sub_81A5D44();
break;
- case 16:
+ case VARIOUS_ARENA_JUDGMENT_STRING:
BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[gBattlescriptCurrInstr[1]]);
BattlePutTextOnWindow(gDisplayedStringBattle, 0x16);
break;
- case 17:
+ case VARIOUS_ARENA_WAIT_STRING:
if (IsTextPrinterActive(0x16))
return;
break;
@@ -6775,8 +6772,8 @@ static void atk76_various(void)
case VARIOUS_VOLUME_UP:
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
break;
- case 23:
- gBattleStruct->field_2A2 |= gBitTable[gActiveBattler];
+ case VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT:
+ gBattleStruct->alreadyStatusedMoveAttempt |= gBitTable[gActiveBattler];
break;
case 24:
if (sub_805725C(gActiveBattler))
diff --git a/src/battle_setup.c b/src/battle_setup.c
index c18176706..18998e564 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -33,6 +33,7 @@
#include "field_weather.h"
#include "battle_tower.h"
#include "gym_leader_rematch.h"
+#include "battle_pike.h"
#include "constants/map_types.h"
#include "constants/battle_frontier.h"
@@ -54,7 +55,6 @@ struct TrainerBattleParameter
};
extern bool8 InBattlePyramid(void);
-extern bool8 InBattlePike(void);
extern bool32 InTrainerHill(void);
extern bool32 FieldPoisonEffectIsRunning(void);
extern void RestartWildEncounterImmunitySteps(void);
@@ -664,7 +664,7 @@ u8 BattleSetup_GetTerrainId(void)
return BATTLE_TERRAIN_MOUNTAIN;
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
{
- if (MetatileBehavior_GetBridgeSth(tileBehavior))
+ if (MetatileBehavior_GetBridgeType(tileBehavior))
return BATTLE_TERRAIN_POND;
if (MetatileBehavior_IsBridge(tileBehavior) == TRUE)
return BATTLE_TERRAIN_WATER;
diff --git a/src/battle_tent.c b/src/battle_tent.c
index f3aec1345..678222ff5 100644
--- a/src/battle_tent.c
+++ b/src/battle_tent.c
@@ -8,7 +8,7 @@
#include "battle_tower.h"
#include "random.h"
#include "item.h"
-#include "battle_factory.h"
+#include "battle_factory_screen.h"
#include "frontier_util.h"
#include "constants/items.h"
#include "constants/region_map_sections.h"
@@ -280,17 +280,17 @@ bool8 sub_81B9E94(void)
&& ((gMapHeader.mapLayoutId == 385) | (gMapHeader.mapLayoutId == 386)));
}
-// This function was written very...oddly.
-#ifdef NONMATCHING
static void sub_81B9EC0(void)
{
s32 i, j;
- u16 currMonId = 0, currSpecies = 0;
+ u8 firstMonId;
+ u16 monSetId;
+ u16 currSpecies;
u16 species[PARTY_SIZE];
u16 monIds[PARTY_SIZE];
u16 heldItems[PARTY_SIZE];
- s32 zero = 0;
+ firstMonId = 0;
gFacilityTrainers = gSlateportBattleTentTrainers;
for (i = 0; i < PARTY_SIZE; i++)
{
@@ -300,250 +300,56 @@ static void sub_81B9EC0(void)
}
gFacilityTrainerMons = gSlateportBattleTentMons;
currSpecies = 0;
- for (i = 0; i != PARTY_SIZE;)
+ i = 0;
+ while (i != PARTY_SIZE)
{
// Cannot have two pokemon of the same species.
- currMonId = Random() % 70;
- for (j = zero; j < i + zero; j++)
+ monSetId = Random() % 70;
+ for (j = firstMonId; j < firstMonId + i; j++)
{
- if (monIds[j] == currMonId)
+ u16 monId = monIds[j];
+ if (monIds[j] == monSetId)
break;
- if (species[j] == gFacilityTrainerMons[currMonId].species)
+ if (species[j] == gFacilityTrainerMons[monSetId].species)
{
if (currSpecies == 0)
- currSpecies = gFacilityTrainerMons[currMonId].species;
+ currSpecies = gFacilityTrainerMons[monSetId].species;
else
break;
}
}
- if (j != i + zero)
+ if (j != i + firstMonId)
continue;
// Cannot have two same held items.
- for (j = zero; j < i + zero; j++)
+ for (j = firstMonId; j < i + firstMonId; j++)
{
- if (heldItems[j] == 0)
- continue;
- if (heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId])
+ if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
{
- if (gFacilityTrainerMons[currMonId].species == currSpecies)
+ if (gFacilityTrainerMons[monSetId].species == currSpecies)
currSpecies = 0;
- else
- break;
+ break;
}
}
- if (j != i + zero)
+ if (j != i + firstMonId)
continue;
- gSaveBlock2Ptr->frontier.field_E70[i].monId = currMonId;
- species[i] = gFacilityTrainerMons[currMonId].species;
- heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId];
- monIds[i] = currMonId;
+ gSaveBlock2Ptr->frontier.field_E70[i].monId = monSetId;
+ species[i] = gFacilityTrainerMons[monSetId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ monIds[i] = monSetId;
i++;
}
}
-#else
-NAKED
-static void sub_81B9EC0(void)
-{
- asm_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, 0x3C\n\
- ldr r1, =gFacilityTrainers\n\
- ldr r0, =gSlateportBattleTentTrainers\n\
- str r0, [r1]\n\
- add r0, sp, 0xC\n\
- mov r9, r0\n\
- mov r1, sp\n\
- adds r1, 0x18\n\
- str r1, [sp, 0x2C]\n\
- ldr r5, =gFacilityTrainerMons\n\
- ldr r4, =gSlateportBattleTentMons\n\
- movs r2, 0\n\
- adds r3, r1, 0\n\
- mov r1, r9\n\
- mov r0, sp\n\
- movs r6, 0x5\n\
- mov r8, r6\n\
-_081B9EEC:\n\
- strh r2, [r0]\n\
- strh r2, [r1]\n\
- strh r2, [r3]\n\
- adds r3, 0x2\n\
- adds r1, 0x2\n\
- adds r0, 0x2\n\
- movs r7, 0x1\n\
- negs r7, r7\n\
- add r8, r7\n\
- mov r6, r8\n\
- cmp r6, 0\n\
- bge _081B9EEC\n\
- str r4, [r5]\n\
- movs r7, 0\n\
- mov r10, r7\n\
- movs r0, 0\n\
- mov r8, r0\n\
- ldr r1, [sp, 0x2C]\n\
- str r1, [sp, 0x30]\n\
- mov r2, sp\n\
- str r2, [sp, 0x34]\n\
- lsls r6, r0, 1\n\
- str r6, [sp, 0x24]\n\
- add r6, r9\n\
- str r6, [sp, 0x28]\n\
-_081B9F1E:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x46\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- movs r2, 0\n\
- mov r7, r8\n\
- adds r6, r2, r7\n\
- cmp r2, r6\n\
- bge _081B9F7C\n\
- ldr r1, [sp, 0x28]\n\
- ldrh r0, [r1]\n\
- cmp r0, r5\n\
- beq _081B9F7C\n\
- ldr r0, =gFacilityTrainerMons\n\
- ldr r1, [r0]\n\
- lsls r0, r5, 4\n\
- adds r4, r0, r1\n\
- ldrh r7, [r4]\n\
- mov r12, r7\n\
- lsls r3, r2, 1\n\
- ldr r1, [sp, 0x24]\n\
- add r1, sp\n\
- str r6, [sp, 0x38]\n\
-_081B9F56:\n\
- ldrh r0, [r1]\n\
- cmp r0, r12\n\
- bne _081B9F66\n\
- mov r0, r10\n\
- cmp r0, 0\n\
- bne _081B9F7C\n\
- ldrh r7, [r4]\n\
- mov r10, r7\n\
-_081B9F66:\n\
- adds r3, 0x2\n\
- adds r1, 0x2\n\
- adds r2, 0x1\n\
- ldr r0, [sp, 0x38]\n\
- cmp r2, r0\n\
- bge _081B9F7C\n\
- mov r7, r9\n\
- adds r0, r7, r3\n\
- ldrh r0, [r0]\n\
- cmp r0, r5\n\
- bne _081B9F56\n\
-_081B9F7C:\n\
- cmp r2, r6\n\
- bne _081BA01C\n\
- movs r2, 0\n\
- cmp r2, r6\n\
- bge _081B9FD4\n\
- ldr r0, =gBattleFrontierHeldItems\n\
- mov r12, r0\n\
- ldr r7, =gFacilityTrainerMons\n\
- ldr r1, [sp, 0x24]\n\
- ldr r0, [sp, 0x2C]\n\
- adds r4, r1, r0\n\
-_081B9F92:\n\
- ldrh r3, [r4]\n\
- cmp r3, 0\n\
- beq _081B9FCC\n\
- ldr r1, [r7]\n\
- lsls r0, r5, 4\n\
- adds r1, r0, r1\n\
- ldrb r0, [r1, 0xA]\n\
- lsls r0, 1\n\
- add r0, r12\n\
- ldrh r0, [r0]\n\
- cmp r3, r0\n\
- bne _081B9FCC\n\
- ldrh r0, [r1]\n\
- cmp r0, r10\n\
- bne _081B9FD4\n\
- movs r1, 0\n\
- mov r10, r1\n\
- b _081B9FD4\n\
- .pool\n\
-_081B9FCC:\n\
- adds r4, 0x2\n\
- adds r2, 0x1\n\
- cmp r2, r6\n\
- blt _081B9F92\n\
-_081B9FD4:\n\
- cmp r2, r6\n\
- bne _081BA01C\n\
- ldr r0, =gSaveBlock2Ptr\n\
- ldr r1, [r0]\n\
- mov r2, r8\n\
- lsls r3, r2, 1\n\
- adds r0, r3, r2\n\
- lsls r0, 2\n\
- adds r1, r0\n\
- movs r6, 0xE7\n\
- lsls r6, 4\n\
- adds r1, r6\n\
- strh r5, [r1]\n\
- ldr r0, =gFacilityTrainerMons\n\
- ldr r0, [r0]\n\
- lsls r1, r5, 4\n\
- adds r1, r0\n\
- ldrh r0, [r1]\n\
- ldr r7, [sp, 0x34]\n\
- strh r0, [r7]\n\
- ldr r2, =gBattleFrontierHeldItems\n\
- ldrb r0, [r1, 0xA]\n\
- lsls r0, 1\n\
- adds r0, r2\n\
- ldrh r0, [r0]\n\
- ldr r1, [sp, 0x30]\n\
- strh r0, [r1]\n\
- add r3, r9\n\
- strh r5, [r3]\n\
- adds r1, 0x2\n\
- str r1, [sp, 0x30]\n\
- adds r2, r7, 0\n\
- adds r2, 0x2\n\
- str r2, [sp, 0x34]\n\
- movs r6, 0x1\n\
- add r8, r6\n\
-_081BA01C:\n\
- mov r7, r8\n\
- cmp r7, 0x6\n\
- beq _081BA024\n\
- b _081B9F1E\n\
-_081BA024:\n\
- add sp, 0x3C\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\
- ");
-}
-#endif // NONMATCHING
static void sub_81BA040(void)
{
u16 trainerId;
s32 i, j, k;
- register const u16 *monSetsPool asm("r9"); // Fix me. Compiler insists on moving that variable into stack.
+ register const u16 *monSets asm("r9"); // Fix me. Compiler insists on moving that variable into stack.
u16 species[3];
u16 heldItems[3];
- s32 monPoolCount = 0;
+ s32 setsCount = 0;
gFacilityTrainers = gSlateportBattleTentTrainers;
gFacilityTrainerMons = gSlateportBattleTentMons;
@@ -561,21 +367,21 @@ static void sub_81BA040(void)
} while (i != gSaveBlock2Ptr->frontier.curChallengeBattleNum);
gTrainerBattleOpponent_A = trainerId;
- while (gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool[monPoolCount] != 0xFFFF)
- monPoolCount++;
- if (monPoolCount > 8)
+ while (gFacilityTrainers[gTrainerBattleOpponent_A].monSets[setsCount] != 0xFFFF)
+ setsCount++;
+ if (setsCount > 8)
break;
- monPoolCount = 0;
+ setsCount = 0;
}
if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 2)
gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.curChallengeBattleNum] = gTrainerBattleOpponent_A;
- monSetsPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
+ monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
i = 0;
while (i != 3)
{
- sRandMonSetId = monSetsPool[Random() % monPoolCount];
+ sRandMonSetId = monSets[Random() % setsCount];
for (j = 0; j < 6; j++)
{
if (gFacilityTrainerMons[sRandMonSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_E70[j].monId].species)
diff --git a/src/battle_tower.c b/src/battle_tower.c
index e95eaf156..000a03a5b 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -21,6 +21,7 @@
#include "link.h"
#include "field_message_box.h"
#include "tv.h"
+#include "battle_factory.h"
#include "constants/battle_frontier.h"
#include "constants/trainers.h"
#include "constants/event_objects.h"
@@ -29,19 +30,16 @@
extern u16 gUnknown_03006298[];
-extern void sub_81A6CD0(void);
extern void sub_81A4C30(void);
-extern u8 sub_81A6CA8(u8, u8);
-extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot);
extern const u8 *const *const gUnknown_085DD690[];
extern const u16 gBattleFrontierHeldItems[];
extern const u8 sRubyFacilityClassToEmerald[82][2];
extern const u16 gUnknown_085DFA46[];
-extern const struct FacilityMon gBattleFrontierMons[];
extern const struct FacilityMon gSlateportBattleTentMons[];
extern const struct FacilityMon gVerdanturfBattleTentMons[];
extern const struct FacilityMon gFallarborBattleTentMons[];
+extern const struct FacilityMon gBattleFrontierMons[];
extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
extern const struct BattleFrontierTrainer gSlateportBattleTentTrainers[];
extern const struct BattleFrontierTrainer gVerdanturfBattleTentTrainers[];
@@ -983,14 +981,14 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
u8 level = SetFacilityPtrsGetLevel();
u8 fixedIV = 0;
u8 bfMonCount;
- const u16 *bfMonPool = NULL;
+ const u16 *monSets = NULL;
u32 otID = 0;
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
{
// Normal battle frontier trainer.
fixedIV = GetFrontierTrainerFixedIvs(trainerId);
- bfMonPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
+ monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
}
else if (trainerId == TRAINER_EREADER)
{
@@ -1028,20 +1026,20 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
// Attempt to fill the trainer's party with random Pokemon until 3 have been
// successfully chosen. The trainer's party may not have duplicate pokemon species
// or duplicate held items.
- for (bfMonCount = 0; bfMonPool[bfMonCount] != 0xFFFF; bfMonCount++)
+ for (bfMonCount = 0; monSets[bfMonCount] != 0xFFFF; bfMonCount++)
;
i = 0;
otID = Random32();
while (i != monCount)
{
- u16 monPoolId = bfMonPool[Random() % bfMonCount];
- if ((level == 50 || level == 20) && monPoolId > 849)
+ u16 monSetId = monSets[Random() % bfMonCount];
+ if ((level == 50 || level == 20) && monSetId > 849)
continue;
// Ensure this pokemon species isn't a duplicate.
for (j = 0; j < i + firstMonId; j++)
{
- if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monPoolId].species)
+ if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species)
break;
}
if (j != i + firstMonId)
@@ -1051,7 +1049,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
for (j = 0; j < i + firstMonId; j++)
{
if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0
- && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId])
+ && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
break;
}
if (j != i + firstMonId)
@@ -1061,34 +1059,34 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
// because the species and held items were already checked directly above.
for (j = 0; j < i; j++)
{
- if (chosenMonIndices[j] == monPoolId)
+ if (chosenMonIndices[j] == monSetId)
break;
}
if (j != i)
continue;
- chosenMonIndices[i] = monPoolId;
+ chosenMonIndices[i] = monSetId;
// Place the chosen pokemon into the trainer's party.
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[i + firstMonId],
- gFacilityTrainerMons[monPoolId].species,
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[monPoolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[monPoolId].evSpread,
+ gFacilityTrainerMons[monSetId].evSpread,
otID);
friendship = 255;
// Give the chosen pokemon its specified moves.
for (j = 0; j < 4; j++)
{
- SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monPoolId].moves[j], j);
- if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION)
+ SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is.
}
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]);
+ SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
// The pokemon was successfully added to the trainer's party, so it's safe to move on to
// the next party slot.
@@ -1129,27 +1127,27 @@ static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
}
}
-u16 RandomizeFacilityTrainerMonId(u16 trainerId)
+u16 RandomizeFacilityTrainerMonSet(u16 trainerId)
{
u8 level = SetFacilityPtrsGetLevel();
- const u16 *bfMonPool = gFacilityTrainers[trainerId].bfMonPool;
+ const u16 *monSets = gFacilityTrainers[trainerId].monSets;
u8 bfMonCount = 0;
- u32 monPoolId = bfMonPool[bfMonCount];
+ u32 monSetId = monSets[bfMonCount];
- while (monPoolId != 0xFFFF)
+ while (monSetId != 0xFFFF)
{
bfMonCount++;
- monPoolId = bfMonPool[bfMonCount];
- if (monPoolId == 0xFFFF)
+ monSetId = monSets[bfMonCount];
+ if (monSetId == 0xFFFF)
break;
}
do
{
- monPoolId = bfMonPool[Random() % bfMonCount];
- } while((level == 50 || level == 20) && monPoolId > 849);
+ monSetId = monSets[Random() % bfMonCount];
+ } while((level == 50 || level == 20) && monSetId > 849);
- return monPoolId;
+ return monSetId;
}
static void FillFactoryTrainerParty(void)
@@ -1175,9 +1173,9 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
u8 challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][0] / 7;
if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6)
- fixedIV = sub_81A6CA8(challengeNum, 0);
+ fixedIV = GetFactoryMonFixedIV(challengeNum, 0);
else
- fixedIV = sub_81A6CA8(challengeNum, 1);
+ fixedIV = GetFactoryMonFixedIV(challengeNum, 1);
}
else if (trainerId == TRAINER_EREADER)
{
@@ -1187,7 +1185,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
}
else if (trainerId == TRAINER_FRONTIER_BRAIN)
{
- sub_81A6CD0();
+ FillFactoryBrainParty();
return;
}
else
@@ -1195,26 +1193,25 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
fixedIV = 31;
}
-
level = SetFacilityPtrsGetLevel();
otID = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
for (i = 0; i < 3; i++)
{
- u16 poolId = gUnknown_03006298[i];
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i],
- gFacilityTrainerMons[poolId].species,
+ u16 monSetId = gUnknown_03006298[i];
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[poolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[poolId].evSpread,
+ gFacilityTrainerMons[monSetId].evSpread,
otID);
friendship = 0;
for (j = 0; j < 4; j++)
- SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[poolId].moves[j], j);
+ SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[poolId].itemTableId]);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
}
}
@@ -1228,25 +1225,25 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId)
for (i = 0; i < 3; i++)
{
- u16 poolId = gUnknown_03006298[i];
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[firstMonId + i],
- gFacilityTrainerMons[poolId].species,
+ u16 monSetId = gUnknown_03006298[i];
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[firstMonId + i],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[poolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[poolId].evSpread,
+ gFacilityTrainerMons[monSetId].evSpread,
otID);
friendship = 0;
for (j = 0; j < 4; j++)
{
- SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[poolId].moves[j], j);
- if (gFacilityTrainerMons[poolId].moves[j] == MOVE_FRUSTRATION)
+ SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
friendship = 0;
}
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[poolId].itemTableId]);
+ SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
}
}
@@ -1609,7 +1606,7 @@ static void sub_81642A0(void)
u32 spArray[5];
s32 r10;
u16 trainerId;
- u16 monPoolId;
+ u16 monSetId;
u32 lvlMode, battleMode;
s32 challengeNum;
u32 species1, species2;
@@ -1651,24 +1648,24 @@ static void sub_81642A0(void)
{
while (1)
{
- monPoolId = RandomizeFacilityTrainerMonId(trainerId);
- if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[r10 - 1]].itemTableId == gFacilityTrainerMons[monPoolId].itemTableId)
+ monSetId = RandomizeFacilityTrainerMonSet(trainerId);
+ if (j % 2 != 0 && gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[r10 - 1]].itemTableId == gFacilityTrainerMons[monSetId].itemTableId)
continue;
for (k = 8; k < r10; k++)
{
- if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[k]].species == gFacilityTrainerMons[monPoolId].species)
+ if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.field_CB4[k]].species == gFacilityTrainerMons[monSetId].species)
break;
- if (species1 == gFacilityTrainerMons[monPoolId].species)
+ if (species1 == gFacilityTrainerMons[monSetId].species)
break;
- if (species2 == gFacilityTrainerMons[monPoolId].species)
+ if (species2 == gFacilityTrainerMons[monSetId].species)
break;
}
if (k == r10)
break;
}
- gSaveBlock2Ptr->frontier.field_CB4[r10] = monPoolId;
+ gSaveBlock2Ptr->frontier.field_CB4[r10] = monSetId;
r10++;
}
}
@@ -1749,7 +1746,7 @@ static void sub_81642A0(void)
}
}
-static void sub_81646BC(u16 trainerId, u16 monPoolId)
+static void sub_81646BC(u16 trainerId, u16 monSetId)
{
u16 move = 0;
u16 species = 0;
@@ -1759,8 +1756,8 @@ static void sub_81646BC(u16 trainerId, u16 monPoolId)
{
if (trainerId < TRAINER_RECORD_MIXING_FRIEND)
{
- move = gFacilityTrainerMons[monPoolId].moves[0];
- species = gFacilityTrainerMons[monPoolId].species;
+ move = gFacilityTrainerMons[monSetId].moves[0];
+ species = gFacilityTrainerMons[monSetId].species;
}
else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE)
{
@@ -1787,7 +1784,7 @@ static void sub_81646BC(u16 trainerId, u16 monPoolId)
static void sub_8164828(void)
{
s32 i, j, arrId;
- s32 monPoolId;
+ s32 monSetId;
s32 level = SetFacilityPtrsGetLevel();
u16 winStreak = GetCurrentFacilityWinStreak();
s32 challengeNum = winStreak / 7;
@@ -1825,12 +1822,12 @@ static void sub_8164828(void)
}
break;
case 1:
- monPoolId = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2];
- sub_81646BC(trainerId, monPoolId);
+ monSetId = gSaveBlock2Ptr->frontier.field_CB4[8 + k * 2];
+ sub_81646BC(trainerId, monSetId);
break;
case 2:
- monPoolId = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2];
- sub_81646BC(trainerId, monPoolId);
+ monSetId = gSaveBlock2Ptr->frontier.field_CB4[9 + k * 2];
+ sub_81646BC(trainerId, monSetId);
break;
case 3:
gPartnerTrainerId = trainerId;
@@ -2280,7 +2277,7 @@ static void FillPartnerParty(u16 trainerId)
s32 i, j;
u32 ivs, level;
u32 friendship;
- u16 monPoolId;
+ u16 monSetId;
u32 otID;
u8 trainerName[PLAYER_NAME_LENGTH + 1];
SetFacilityPtrsGetLevel();
@@ -2321,23 +2318,23 @@ static void FillPartnerParty(u16 trainerId)
otID = Random32();
for (i = 0; i < 2; i++)
{
- monPoolId = gSaveBlock2Ptr->frontier.field_CB4[i + 18];
- CreateMonWithEVSpreadPersonalityOTID(&gPlayerParty[3 + i],
- gFacilityTrainerMons[monPoolId].species,
+ monSetId = gSaveBlock2Ptr->frontier.field_CB4[i + 18];
+ CreateMonWithEVSpreadNatureOTID(&gPlayerParty[3 + i],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[monPoolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
ivs,
- gFacilityTrainerMons[monPoolId].evSpread,
+ gFacilityTrainerMons[monSetId].evSpread,
otID);
friendship = 0xFF;
for (j = 0; j < 4; j++)
{
- SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monPoolId].moves[j], j);
- if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION)
+ SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
friendship = 0;
}
SetMonData(&gPlayerParty[3 + i], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]);
+ SetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
for (j = 0; j < PLAYER_NAME_LENGTH + 1; j++)
trainerName[j] = gFacilityTrainers[trainerId].trainerName[j];
SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, &trainerName);
@@ -2689,19 +2686,19 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
u8 level = SetTentPtrsGetLevel();
u8 fixedIV = 0;
u8 bfMonCount;
- const u16 *bfMonPool = NULL;
+ const u16 *monSets = NULL;
u32 otID = 0;
- u16 monPoolId;
+ u16 monSetId;
- bfMonPool = gFacilityTrainers[gTrainerBattleOpponent_A].bfMonPool;
+ monSets = gFacilityTrainers[gTrainerBattleOpponent_A].monSets;
bfMonCount = 0;
- monPoolId = bfMonPool[bfMonCount];
- while (monPoolId != 0xFFFF)
+ monSetId = monSets[bfMonCount];
+ while (monSetId != 0xFFFF)
{
bfMonCount++;
- monPoolId = bfMonPool[bfMonCount];
- if (monPoolId == 0xFFFF)
+ monSetId = monSets[bfMonCount];
+ if (monSetId == 0xFFFF)
break;
}
@@ -2709,12 +2706,12 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
otID = Random32();
while (i != monCount)
{
- u16 monPoolId = bfMonPool[Random() % bfMonCount];
+ u16 monSetId = monSets[Random() % bfMonCount];
// Ensure this pokemon species isn't a duplicate.
for (j = 0; j < i + firstMonId; j++)
{
- if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monPoolId].species)
+ if (GetMonData(&gEnemyParty[j], MON_DATA_SPECIES, NULL) == gFacilityTrainerMons[monSetId].species)
break;
}
if (j != i + firstMonId)
@@ -2724,7 +2721,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
for (j = 0; j < i + firstMonId; j++)
{
if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0
- && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId])
+ && GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
break;
}
if (j != i + firstMonId)
@@ -2734,34 +2731,34 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
// because the species and held items were already checked directly above.
for (j = 0; j < i; j++)
{
- if (chosenMonIndices[j] == monPoolId)
+ if (chosenMonIndices[j] == monSetId)
break;
}
if (j != i)
continue;
- chosenMonIndices[i] = monPoolId;
+ chosenMonIndices[i] = monSetId;
// Place the chosen pokemon into the trainer's party.
- CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[i + firstMonId],
- gFacilityTrainerMons[monPoolId].species,
+ CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i + firstMonId],
+ gFacilityTrainerMons[monSetId].species,
level,
- gFacilityTrainerMons[monPoolId].nature,
+ gFacilityTrainerMons[monSetId].nature,
fixedIV,
- gFacilityTrainerMons[monPoolId].evSpread,
+ gFacilityTrainerMons[monSetId].evSpread,
otID);
friendship = 255;
// Give the chosen pokemon its specified moves.
for (j = 0; j < 4; j++)
{
- SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monPoolId].moves[j], j);
- if (gFacilityTrainerMons[monPoolId].moves[j] == MOVE_FRUSTRATION)
+ SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
+ if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is.
}
SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monPoolId].itemTableId]);
+ SetMonData(&gEnemyParty[i + firstMonId], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
// The pokemon was successfully added to the trainer's party, so it's safe to move on to
// the next party slot.
diff --git a/src/battle_transition.c b/src/battle_transition.c
index fc8c0eeee..759f15eee 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -1,25 +1,25 @@
#include "global.h"
#include "battle_transition.h"
-#include "unk_transition.h"
+#include "bg.h"
+#include "decompress.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "gpu_regs.h"
#include "main.h"
+#include "malloc.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 "scanline_effect.h"
#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "unk_transition.h"
+#include "util.h"
+#include "constants/field_effects.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 "util.h"
struct TransitionData
{
diff --git a/src/battle_util.c b/src/battle_util.c
index 1aaffc053..6fb5f4bdc 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -1200,8 +1200,8 @@ bool8 HandleWishPerishSongOnTurnEnd(void)
for (i = 0; i < 2; i++)
CancelMultiTurnMoves(i);
- gBattlescriptCurrInstr = BattleScript_82DB8F3;
- BattleScriptExecute(BattleScript_82DB8F3);
+ gBattlescriptCurrInstr = BattleScript_ArenaDoJudgment;
+ BattleScriptExecute(BattleScript_ArenaDoJudgment);
gBattleStruct->wishPerishSongState++;
return TRUE;
}
diff --git a/src/berry.c b/src/berry.c
index 66cf91409..7cd28d69f 100644
--- a/src/berry.c
+++ b/src/berry.c
@@ -1,12 +1,13 @@
#include "global.h"
#include "berry.h"
-#include "main.h"
-#include "item.h"
-#include "constants/items.h"
-#include "text.h"
-#include "random.h"
#include "event_data.h"
#include "fieldmap.h"
+#include "item.h"
+#include "main.h"
+#include "random.h"
+#include "text.h"
+#include "constants/event_object_movement_constants.h"
+#include "constants/items.h"
extern u8 EventObjectGetBerryTreeId(u8 eventObjectId);
extern void sub_8092EF0(u8 mapId, u8 mapNumber, u8 mapGroup);
@@ -18,6 +19,17 @@ extern u16 gSpecialVar_ItemId;
extern const u8 BerryTreeScript[];
+static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry);
+static bool32 BerryTreeGrow(struct BerryTree *tree);
+static u16 BerryTypeToItemId(u16 berry);
+static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree);
+static u8 GetNumStagesWateredByBerryTreeId(u8 id);
+static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water);
+static u8 CalcBerryYield(struct BerryTree *tree);
+static u8 GetBerryCountByBerryTreeId(u8 id);
+static u16 GetStageDurationByBerryType(u8);
+
+//.rodata
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");
@@ -845,6 +857,7 @@ const struct UnkStruct_0858AB24 gUnknown_0858AB24[] = {
const struct BerryTree gBlankBerryTree = {};
+//.text
// unused
void ClearEnigmaBerries(void)
{
@@ -860,7 +873,7 @@ void SetEnigmaBerry(u8 *src)
dest[i] = src[i];
}
-u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
+static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
{
u32 i;
u32 checksum;
@@ -889,12 +902,12 @@ bool32 IsEnigmaBerryValid(void)
const struct Berry *GetBerryInfo(u8 berry)
{
- if (berry == 0x2B && IsEnigmaBerryValid())
+ if (berry == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid())
return (struct Berry*)(&gSaveBlock1Ptr->enigmaBerry.berry);
else
{
- if (berry == 0 || berry > 0x2B)
- berry = 1;
+ if (berry == BERRY_NONE || berry > ITEM_TO_BERRY(LAST_BERRY_INDEX))
+ berry = ITEM_TO_BERRY(FIRST_BERRY_INDEX);
return &gBerries[berry - 1];
}
}
@@ -910,16 +923,16 @@ bool32 EventObjectInteractionWaterBerryTree(void)
switch (tree->stage)
{
- case 1:
+ case BERRY_STAGE_PLANTED:
tree->watered1 = TRUE;
break;
- case 2:
+ case BERRY_STAGE_SPROUTED:
tree->watered2 = TRUE;
break;
- case 3:
+ case BERRY_STAGE_TALLER:
tree->watered3 = TRUE;
break;
- case 4:
+ case BERRY_STAGE_FLOWERING:
tree->watered4 = TRUE;
break;
default:
@@ -953,28 +966,28 @@ void ClearBerryTrees(void)
gSaveBlock1Ptr->berryTrees[i] = gBlankBerryTree;
}
-bool32 BerryTreeGrow(struct BerryTree *tree)
+static bool32 BerryTreeGrow(struct BerryTree *tree)
{
if (tree->growthSparkle)
return FALSE;
switch (tree->stage)
{
- case 0:
+ case BERRY_STAGE_NO_BERRY:
return FALSE;
- case 4:
+ case BERRY_STAGE_FLOWERING:
tree->berryYield = CalcBerryYield(tree);
- case 1:
- case 2:
- case 3:
+ case BERRY_STAGE_PLANTED:
+ case BERRY_STAGE_SPROUTED:
+ case BERRY_STAGE_TALLER:
tree->stage++;
break;
- case 5:
+ case BERRY_STAGE_BERRIES:
tree->watered1 = 0;
tree->watered2 = 0;
tree->watered3 = 0;
tree->watered4 = 0;
tree->berryYield = 0;
- tree->stage = 2;
+ tree->stage = BERRY_STAGE_SPROUTED;
if (++tree->regrowthCount == 10)
*tree = gBlankBerryTree;
break;
@@ -1012,7 +1025,7 @@ void BerryTreeTimeUpdate(s32 minutes)
tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry);
if (!BerryTreeGrow(tree))
break;
- if (tree->stage == 5)
+ if (tree->stage == BERRY_STAGE_BERRIES)
tree->minutesUntilNextStage *= 4;
}
}
@@ -1028,7 +1041,7 @@ void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle)
tree->berry = berry;
tree->minutesUntilNextStage = GetStageDurationByBerryType(berry);
tree->stage = stage;
- if (stage == 5)
+ if (stage == BERRY_STAGE_BERRIES)
{
tree->berryYield = CalcBerryYield(tree);
tree->minutesUntilNextStage *= 4;
@@ -1064,7 +1077,7 @@ u8 ItemIdToBerryType(u16 item)
return ITEM_TO_BERRY(item);
}
-u16 BerryTypeToItemId(u16 berry)
+static u16 BerryTypeToItemId(u16 berry)
{
u16 item = berry - 1;
@@ -1087,10 +1100,10 @@ void GetBerryCountStringByBerryType(u8 berry, u8* dest, u32 berryCount)
void ResetBerryTreeSparkleFlag(u8 id)
{
- GetBerryTreeInfo(id)->growthSparkle = 0;
+ GetBerryTreeInfo(id)->growthSparkle = FALSE;
}
-u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree)
+static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree)
{
u8 count = 0;
@@ -1105,12 +1118,12 @@ u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree)
return count;
}
-u8 GetNumStagesWateredByBerryTreeId(u8 id)
+static u8 GetNumStagesWateredByBerryTreeId(u8 id)
{
return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id));
}
-u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water)
+static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water)
{
u32 randMin;
u32 randMax;
@@ -1133,7 +1146,7 @@ u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water)
}
}
-u8 CalcBerryYield(struct BerryTree *tree)
+static u8 CalcBerryYield(struct BerryTree *tree)
{
const struct Berry *berry = GetBerryInfo(tree->berry);
u8 min = berry->minYield;
@@ -1142,12 +1155,12 @@ u8 CalcBerryYield(struct BerryTree *tree)
return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree));
}
-u8 GetBerryCountByBerryTreeId(u8 id)
+static u8 GetBerryCountByBerryTreeId(u8 id)
{
return gSaveBlock1Ptr->berryTrees[id].berryYield;
}
-u16 GetStageDurationByBerryType(u8 berry)
+static u16 GetStageDurationByBerryType(u8 berry)
{
return GetBerryInfo(berry)->stageDuration * 60;
}
@@ -1156,18 +1169,18 @@ void EventObjectInteractionGetBerryTreeData(void)
{
u8 id;
u8 berry;
- u8 unk;
+ u8 localId;
u8 group;
u8 num;
id = EventObjectGetBerryTreeId(gSelectedEventObject);
berry = GetBerryTypeByBerryTreeId(id);
ResetBerryTreeSparkleFlag(id);
- unk = gSpecialVar_LastTalked;
+ localId = gSpecialVar_LastTalked;
num = gSaveBlock1Ptr->location.mapNum;
group = gSaveBlock1Ptr->location.mapGroup;
- if (IsBerryTreeSparkling(unk, num, group))
- gSpecialVar_0x8004 = 0xFF;
+ if (IsBerryTreeSparkling(localId, num, group))
+ gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING;
else
gSpecialVar_0x8004 = GetStageByBerryTreeId(id);
gSpecialVar_0x8005 = GetNumStagesWateredByBerryTreeId(id);
@@ -1216,7 +1229,7 @@ void EventObjectInteractionRemoveBerryTree(void)
sub_8092EF0(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
-u8 PlayerHasBerries(void)
+bool8 PlayerHasBerries(void)
{
return IsBagPocketNonEmpty(POCKET_BERRIES);
}
@@ -1238,7 +1251,7 @@ void ResetBerryTreeSparkleFlags(void)
bottom = top + 8;
for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
- if (gEventObjects[i].active && gEventObjects[i].movementType == 12)
+ if (gEventObjects[i].active && gEventObjects[i].movementType == MOVEMENT_TYPE_BERRY_TREE_GROWTH)
{
cam_left = gEventObjects[i].currentCoords.x;
cam_top = gEventObjects[i].currentCoords.y;
diff --git a/src/bike.c b/src/bike.c
index 8ad771f51..b9d247c5d 100644
--- a/src/bike.c
+++ b/src/bike.c
@@ -3,13 +3,13 @@
#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/flags.h"
#include "constants/map_types.h"
+#include "constants/songs.h"
extern bool8 gBikeCyclingChallenge;
extern u8 gBikeCollisions;
diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c
index 76394e937..b17ffad33 100644
--- a/src/braille_puzzles.c
+++ b/src/braille_puzzles.c
@@ -5,6 +5,7 @@
#include "script.h"
#include "sound.h"
#include "task.h"
+#include "constants/field_effects.h"
#include "constants/flags.h"
#include "constants/maps.h"
#include "constants/songs.h"
diff --git a/src/data/field_event_obj/field_effect_objects.h b/src/data/field_event_obj/field_effect_objects.h
index 33fe66fe2..82fde1769 100755
--- a/src/data/field_event_obj/field_effect_objects.h
+++ b/src/data/field_event_obj/field_effect_objects.h
@@ -91,7 +91,7 @@ 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 SpriteTemplate gFieldEffectObjectTemplate_Ripple = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Ripple, gFieldEffectObjectPicTable_Ripple, gDummySpriteAffineAnimTable, WaitFieldEffectSpriteAnim};
const struct SpriteFrameImage gFieldEffectObjectPicTable_Ash[] = {
overworld_frame(gFieldEffectObjectPic_Ash, 2, 2, 0),
@@ -124,25 +124,25 @@ const struct SpriteFrameImage gFieldEffectObjectPicTable_SurfBlob[] = {
overworld_frame(gFieldEffectObjectPic_SurfBlob, 4, 4, 2),
};
-const union AnimCmd gFieldEffectObjectImageAnim_850CB94[] =
+const union AnimCmd gSurfBlobAnim_FaceSouth[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_JUMP(0),
};
-const union AnimCmd gFieldEffectObjectImageAnim_850CB9C[] =
+const union AnimCmd gSurfBlobAnim_FaceNorth[] =
{
ANIMCMD_FRAME(1, 1),
ANIMCMD_JUMP(0),
};
-const union AnimCmd gFieldEffectObjectImageAnim_850CBA4[] =
+const union AnimCmd gSurfBlobAnim_FaceWest[] =
{
ANIMCMD_FRAME(2, 1),
ANIMCMD_JUMP(0),
};
-const union AnimCmd gFieldEffectObjectImageAnim_850CBAC[] =
+const union AnimCmd gSurfBlobAnim_FaceEast[] =
{
ANIMCMD_FRAME(2, 1, .hFlip = TRUE),
ANIMCMD_JUMP(0),
@@ -150,10 +150,10 @@ const union AnimCmd gFieldEffectObjectImageAnim_850CBAC[] =
const union AnimCmd *const gFieldEffectObjectImageAnimTable_SurfBlob[] =
{
- gFieldEffectObjectImageAnim_850CB94,
- gFieldEffectObjectImageAnim_850CB9C,
- gFieldEffectObjectImageAnim_850CBA4,
- gFieldEffectObjectImageAnim_850CBAC,
+ gSurfBlobAnim_FaceSouth,
+ gSurfBlobAnim_FaceNorth,
+ gSurfBlobAnim_FaceWest,
+ gSurfBlobAnim_FaceEast,
};
const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x32, gFieldEffectObjectImageAnimTable_SurfBlob, gFieldEffectObjectPicTable_SurfBlob, gDummySpriteAffineAnimTable, UpdateSurfBlobFieldEffect};
@@ -562,7 +562,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 SpriteTemplate gFieldEffectObjectTemplate_Unknown17 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown17, gFieldEffectObjectPicTable_Unknown17, gDummySpriteAffineAnimTable, WaitFieldEffectSpriteAnim};
const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown18[] = {
overworld_frame(gFieldEffectObjectPic_Unknown18, 2, 2, 0),
@@ -587,7 +587,7 @@ 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 SpriteTemplate gFieldEffectObjectTemplate_Unknown18 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown18, gFieldEffectObjectPicTable_Unknown18, gDummySpriteAffineAnimTable, WaitFieldEffectSpriteAnim};
const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown19[] = {
overworld_frame(gFieldEffectObjectPic_Unknown19, 2, 2, 0),
@@ -610,7 +610,7 @@ 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 SpriteTemplate gFieldEffectObjectTemplate_Unknown19 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown19, gFieldEffectObjectPicTable_Unknown19, gDummySpriteAffineAnimTable, WaitFieldEffectSpriteAnim};
const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown29[] = {
overworld_frame(gFieldEffectObjectPic_Unknown29, 2, 1, 0),
@@ -656,7 +656,7 @@ 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 struct SpriteTemplate gFieldEffectObjectTemplate_Unknown20 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown20, gFieldEffectObjectPicTable_Unknown20, gDummySpriteAffineAnimTable, WaitFieldEffectSpriteAnim};
const union AffineAnimCmd gFieldEffectObjectRotScalAnim_850D1E4[] =
{
@@ -733,7 +733,7 @@ const union AnimCmd *const gFieldEffectObjectImageAnimTable_BerryTreeGrowthSpark
gFieldEffectObjectImageAnim_850D2D4,
};
-const struct SpriteTemplate gFieldEffectObjectTemplate_BerryTreeGrowthSparkle = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BerryTreeGrowthSparkle, gFieldEffectObjectPicTable_BerryTreeGrowthSparkle, gDummySpriteAffineAnimTable, sub_81561D0};
+const struct SpriteTemplate gFieldEffectObjectTemplate_BerryTreeGrowthSparkle = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BerryTreeGrowthSparkle, gFieldEffectObjectPicTable_BerryTreeGrowthSparkle, gDummySpriteAffineAnimTable, WaitFieldEffectSpriteAnim};
const struct SpriteFrameImage gFieldEffectObjectPicTable_TreeDisguise[] = {
overworld_frame(gFieldEffectObjectPic_TreeDisguise, 2, 4, 0),
diff --git a/src/decoration.c b/src/decoration.c
index de85df968..eb85b4f5c 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -1347,12 +1347,12 @@ void sub_8128060(u8 taskId)
void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor)
{
- 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;
+ sDecor_CameraSpriteObjectIdx1 = gSprites[gFieldCamera.spriteId].data[0];
+ gFieldCamera.spriteId = gpu_pal_decompress_alloc_tag_and_upload(data, decor);
+ gSprites[gFieldCamera.spriteId].oam.priority = 1;
+ gSprites[gFieldCamera.spriteId].callback = sub_81292D0;
+ gSprites[gFieldCamera.spriteId].pos1.x = gUnknown_085A7250[data->decoration->shape].x;
+ gSprites[gFieldCamera.spriteId].pos1.y = gUnknown_085A7250[data->decoration->shape].y;
}
void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphicsDataBuffer *data)
@@ -1374,7 +1374,7 @@ void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphic
}
gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1;
DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]);
- sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId;
+ sDecor_CameraSpriteObjectIdx1 = gFieldCamera.spriteId;
}
void sub_812826C(u8 taskId)
@@ -2293,9 +2293,9 @@ bool8 sub_81299AC(u8 taskId)
void SetUpPuttingAwayDecorationPlayerAvatar(void)
{
GetPlayerFacingDirection();
- sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.spriteId].data[0];
+ sDecor_CameraSpriteObjectIdx1 = gSprites[gFieldCamera.spriteId].data[0];
sub_812A39C();
- gUnknown_03005DD0.spriteId = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0);
+ gFieldCamera.spriteId = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0);
if (gSaveBlock2Ptr->playerGender == MALE)
{
sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0);
@@ -2306,7 +2306,7 @@ void SetUpPuttingAwayDecorationPlayerAvatar(void)
}
gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1;
DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]);
- sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId;
+ sDecor_CameraSpriteObjectIdx1 = gFieldCamera.spriteId;
gSprites[sDecor_CameraSpriteObjectIdx1].oam.priority = 1;
}
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index 57f72b284..93be006ea 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -18,10 +18,12 @@
#include "random.h"
#include "rom_818CFC8.h"
#include "sprite.h"
+#include "task.h"
#include "trainer_see.h"
#include "util.h"
#include "constants/event_object_movement_constants.h"
#include "constants/event_objects.h"
+#include "constants/field_effects.h"
// this file was known as evobjmv.c in Game Freak's original source
@@ -42,7 +44,7 @@ static bool8 IsCoordOutsideEventObjectMovementRange(struct EventObject *, s16, s
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 UpdateEventObjSpriteVisibility(struct EventObject *, struct Sprite *);
static void EventObjectUpdateMetatileBehaviors(struct EventObject*);
static void GetGroundEffectFlags_Reflection(struct EventObject*, u32*);
static void GetGroundEffectFlags_TallGrassOnSpawn(struct EventObject*, u32*);
@@ -73,7 +75,7 @@ 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 void CreateReflectionEffectSprites(void);
static u8 GetEventObjectIdByLocalId(u8);
static u8 GetEventObjectIdByLocalIdAndMapInternal(u8, u8, u8);
static bool8 GetAvailableEventObjectId(u16, u8, u8, u8 *);
@@ -84,7 +86,7 @@ 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 LoadEventObjectPalette(u16);
static void RemoveEventObjectIfOutsideView(struct EventObject *);
static void sub_808E1B8(u8, s16, s16);
static void SetPlayerAvatarEventObjectIdAndObjectId(u8, u8);
@@ -100,6 +102,8 @@ 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);
+static void oamt_npc_ministep_reset(struct Sprite *, u8, u8);
+static void UpdateEventObjectSpriteSubpriorityAndVisibility(struct Sprite *);
const u8 gReflectionEffectPaletteMap[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
@@ -625,7 +629,6 @@ const u16 gObjectPaletteTags3[] = {
EVENT_OBJ_PAL_TAG_7,
};
-
const u16 *const gObjectPaletteTagSets[] = {
gObjectPaletteTags0,
gObjectPaletteTags1,
@@ -1078,19 +1081,19 @@ static void ClearAllEventObjects(void)
{
u8 i;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
ClearEventObject(&gEventObjects[i]);
}
-void sub_808D438(void)
+void ResetEventObjects(void)
{
ClearLinkPlayerEventObjects();
ClearAllEventObjects();
ClearPlayerAvatarInfo();
- sub_808D450();
+ CreateReflectionEffectSprites();
}
-static void sub_808D450(void)
+static void CreateReflectionEffectSprites(void)
{
u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31);
gSprites[spriteId].oam.affineMode = 1;
@@ -1108,7 +1111,7 @@ static void sub_808D450(void)
u8 GetFirstInactiveEventObjectId(void)
{
u8 i;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (!gEventObjects[i].active)
break;
@@ -1119,7 +1122,7 @@ u8 GetFirstInactiveEventObjectId(void)
u8 GetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId)
{
- if (localId < 0xff)
+ if (localId < 0xFF)
{
return GetEventObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId);
}
@@ -1129,7 +1132,7 @@ u8 GetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId)
bool8 TryGetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u8 *eventObjectId)
{
*eventObjectId = GetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroupId);
- if (*eventObjectId == NUM_EVENT_OBJECTS)
+ if (*eventObjectId == EVENT_OBJECTS_COUNT)
return TRUE;
else
return FALSE;
@@ -1138,7 +1141,7 @@ bool8 TryGetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u
u8 GetEventObjectIdByXY(s16 x, s16 y)
{
u8 i;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (gEventObjects[i].active && gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y)
break;
@@ -1150,25 +1153,25 @@ u8 GetEventObjectIdByXY(s16 x, s16 y)
static u8 GetEventObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroupId)
{
u8 i;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroupId)
return i;
}
- return NUM_EVENT_OBJECTS;
+ return EVENT_OBJECTS_COUNT;
}
static u8 GetEventObjectIdByLocalId(u8 localId)
{
u8 i;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (gEventObjects[i].active && gEventObjects[i].localId == localId)
return i;
}
- return NUM_EVENT_OBJECTS;
+ return EVENT_OBJECTS_COUNT;
}
// This function has the same nonmatching quirk as in Ruby/Sapphire.
@@ -1183,7 +1186,7 @@ static u8 InitEventObjectStateFromTemplate(struct EventObjectTemplate *template,
// 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;
+ return EVENT_OBJECTS_COUNT;
}
eventObject = &gEventObjects[eventObjectId];
ClearEventObject(eventObject);
@@ -1387,24 +1390,24 @@ static NAKED u8 InitEventObjectStateFromTemplate(struct EventObjectTemplate *tem
u8 Unref_TryInitLocalEventObject(u8 localId)
{
u8 i;
- u8 nObjects;
+ u8 eventObjectCount;
struct EventObjectTemplate *template;
if (gMapHeader.events != NULL)
{
if (InBattlePyramid())
{
- nObjects = sub_81AAA40();
+ eventObjectCount = sub_81AAA40();
}
else if (InTrainerHill())
{
- nObjects = 2;
+ eventObjectCount = 2;
}
else
{
- nObjects = gMapHeader.events->eventObjectCount;
+ eventObjectCount = gMapHeader.events->eventObjectCount;
}
- for (i = 0; i < nObjects; i++)
+ for (i = 0; i < eventObjectCount; i++)
{
template = &gSaveBlock1Ptr->eventObjectTemplates[i];
if (template->localId == localId && !FlagGet(template->flagId))
@@ -1413,7 +1416,7 @@ u8 Unref_TryInitLocalEventObject(u8 localId)
}
}
}
- return NUM_EVENT_OBJECTS;
+ return EVENT_OBJECTS_COUNT;
}
static bool8 GetAvailableEventObjectId(u16 localId, u8 mapNum, u8 mapGroup, u8 *eventObjectId)
@@ -1425,14 +1428,14 @@ static bool8 GetAvailableEventObjectId(u16 localId, u8 mapNum, u8 mapGroup, u8 *
{
u8 i = 0;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; 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)
+ if (i >= EVENT_OBJECTS_COUNT)
return TRUE;
*eventObjectId = i;
do
@@ -1440,7 +1443,7 @@ static bool8 GetAvailableEventObjectId(u16 localId, u8 mapNum, u8 mapGroup, u8 *
if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup)
return TRUE;
i++;
- } while (i < NUM_EVENT_OBJECTS);
+ } while (i < EVENT_OBJECTS_COUNT);
return FALSE;
}
@@ -1472,7 +1475,7 @@ void RemoveAllEventObjectsExceptPlayer(void)
{
u8 i;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (i != gPlayerAvatar.eventObjectId)
RemoveEventObject(&gEventObjects[i]);
@@ -1481,16 +1484,16 @@ void RemoveAllEventObjectsExceptPlayer(void)
static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjectTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
{
+ u8 spriteId;
+ u8 paletteSlot;
+ u8 eventObjectId;
+ struct Sprite *sprite;
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;
+ if (eventObjectId == EVENT_OBJECTS_COUNT)
+ return EVENT_OBJECTS_COUNT;
eventObject = &gEventObjects[eventObjectId];
graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
@@ -1508,7 +1511,7 @@ static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjectTempl
paletteSlot -= 16;
sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
}
- if (eventObject->movementType == 0x4c)
+ if (eventObject->movementType == MOVEMENT_TYPE_INVISIBLE)
{
eventObject->invisible = TRUE;
}
@@ -1517,7 +1520,7 @@ static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjectTempl
if (spriteId == MAX_SPRITES)
{
gEventObjects[eventObjectId].active = FALSE;
- return NUM_EVENT_OBJECTS;
+ return EVENT_OBJECTS_COUNT;
}
sprite = &gSprites[spriteId];
sub_8092FF0(eventObject->currentCoords.x + cameraX, eventObject->currentCoords.y + cameraY, &sprite->pos1.x, &sprite->pos1.y);
@@ -1541,21 +1544,20 @@ static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjectTempl
static u8 TrySpawnEventObject(struct EventObjectTemplate *eventObjectTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
{
- const struct EventObjectGraphicsInfo *graphicsInfo;
+ u8 eventObjectId;
struct SpriteTemplate spriteTemplate;
- const struct SubspriteTable *subspriteTables;
struct SpriteFrameImage spriteFrameImage;
- u8 eventObjectId;
+ const struct EventObjectGraphicsInfo *graphicsInfo;
+ const struct SubspriteTable *subspriteTables = NULL;
- 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)
+ if (eventObjectId == EVENT_OBJECTS_COUNT)
{
- return NUM_EVENT_OBJECTS;
+ return EVENT_OBJECTS_COUNT;
}
gSprites[gEventObjects[eventObjectId].spriteId].images = graphicsInfo->images;
if (subspriteTables != NULL)
@@ -1603,29 +1605,29 @@ u8 show_sprite(u8 localId, u8 mapNum, u8 mapGroup)
eventObjectTemplate = GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup);
if (eventObjectTemplate == NULL)
{
- return NUM_EVENT_OBJECTS;
+ return EVENT_OBJECTS_COUNT;
}
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)
+static void MakeObjectTemplateFromEventObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)
{
- const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(graphicsId);
+ const struct EventObjectGraphicsInfo *graphicsInfo = 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;
+ spriteTemplate->tileTag = graphicsInfo->tileTag;
+ spriteTemplate->paletteTag = graphicsInfo->paletteTag1;
+ spriteTemplate->oam = graphicsInfo->oam;
+ spriteTemplate->anims = graphicsInfo->anims;
+ spriteTemplate->images = graphicsInfo->images;
+ spriteTemplate->affineAnims = graphicsInfo->affineAnims;
+ spriteTemplate->callback = callback;
+ *subspriteTables = graphicsInfo->subspriteTables;
}
-static void MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables)
+static void MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)
{
- MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, sMovementTypeCallbacks[callbackIndex], sprTemplate, subspriteTables);
+ MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, sMovementTypeCallbacks[callbackIndex], spriteTemplate, subspriteTables);
}
static void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *eventObjectTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables)
@@ -1638,37 +1640,37 @@ u8 AddPseudoEventObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x
struct SpriteTemplate *spriteTemplate;
const struct SubspriteTable *subspriteTables;
struct Sprite *sprite;
- u8 spriteIdx;
+ u8 spriteId;
spriteTemplate = malloc(sizeof(struct SpriteTemplate));
MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, callback, spriteTemplate, &subspriteTables);
- if (spriteTemplate->paletteTag != 0xffff)
+ if (spriteTemplate->paletteTag != 0xFFFF)
{
- sub_808E894(spriteTemplate->paletteTag);
+ LoadEventObjectPalette(spriteTemplate->paletteTag);
}
- spriteIdx = CreateSprite(spriteTemplate, x, y, subpriority);
+ spriteId = CreateSprite(spriteTemplate, x, y, subpriority);
free(spriteTemplate);
- if (spriteIdx != MAX_SPRITES && subspriteTables != NULL)
+ if (spriteId != MAX_SPRITES && subspriteTables != NULL)
{
- sprite = &gSprites[spriteIdx];
+ sprite = &gSprites[spriteId];
SetSubspriteTables(sprite, subspriteTables);
sprite->subspriteMode = 2;
}
- return spriteIdx;
+ return spriteId;
}
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;
+ struct SpriteTemplate spriteTemplate;
+ const struct SubspriteTable *subspriteTables;
+ const struct EventObjectGraphicsInfo *graphicsInfo;
graphicsInfo = GetEventObjectGraphicsInfo(graphicsId);
MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, UpdateEventObjectSpriteSubpriorityAndVisibility, &spriteTemplate, &subspriteTables);
- *(u16 *)&spriteTemplate.paletteTag = 0xffff;
+ *(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
x += 7;
y += 7;
sub_80930E0(&x, &y, 8, 16);
@@ -1710,20 +1712,14 @@ u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction)
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;
+ s16 left = gSaveBlock1Ptr->pos.x - 2;
+ s16 right = gSaveBlock1Ptr->pos.x + 17;
+ s16 top = gSaveBlock1Ptr->pos.y;
+ s16 bottom = gSaveBlock1Ptr->pos.y + 16;
if (InBattlePyramid())
{
@@ -1741,8 +1737,8 @@ void TrySpawnEventObjects(s16 cameraX, s16 cameraY)
for (i = 0; i < objectCount; i++)
{
struct EventObjectTemplate *template = &gSaveBlock1Ptr->eventObjectTemplates[i];
- npcX = template->x + 7;
- npcY = template->y + 7;
+ s16 npcX = template->x + 7;
+ s16 npcY = template->y + 7;
if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX
&& !FlagGet(template->flagId))
@@ -1753,12 +1749,10 @@ void TrySpawnEventObjects(s16 cameraX, s16 cameraY)
void RemoveEventObjectsOutsideView(void)
{
- u8 i;
- u8 j;
+ u8 i, j;
bool8 isActiveLinkPlayer;
- struct EventObject *eventObject;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
for (j = 0, isActiveLinkPlayer = FALSE; j < ARRAY_COUNT(gLinkPlayerEventObjects); j++)
{
@@ -1767,7 +1761,7 @@ void RemoveEventObjectsOutsideView(void)
}
if (!isActiveLinkPlayer)
{
- eventObject = &gEventObjects[i];
+ struct EventObject *eventObject = &gEventObjects[i];
if (eventObject->active && !eventObject->isPlayer)
RemoveEventObjectIfOutsideView(eventObject);
@@ -1777,21 +1771,16 @@ void RemoveEventObjectsOutsideView(void)
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;
+ s16 left = gSaveBlock1Ptr->pos.x - 2;
+ s16 right = gSaveBlock1Ptr->pos.x + 17;
+ s16 top = gSaveBlock1Ptr->pos.y;
+ s16 bottom = gSaveBlock1Ptr->pos.y + 16;
if (eventObject->currentCoords.x >= left && eventObject->currentCoords.x <= right
- && eventObject->currentCoords.y >= top && eventObject->currentCoords.y <= bottom)
+ && 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)
+ && eventObject->initialCoords.y >= top && eventObject->initialCoords.y <= bottom)
return;
RemoveEventObject(eventObject);
}
@@ -1801,26 +1790,26 @@ void sub_808E16C(s16 x, s16 y)
u8 i;
ClearPlayerAvatarInfo();
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (gEventObjects[i].active)
{
sub_808E1B8(i, x, y);
}
}
- sub_808D450();
+ CreateReflectionEffectSprites();
}
static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y)
{
u8 spriteId;
u8 paletteSlot;
+ struct Sprite *sprite;
struct EventObject *eventObject;
+ struct SpriteTemplate spriteTemplate;
+ struct SpriteFrameImage spriteFrameImage;
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++)
@@ -1838,7 +1827,7 @@ static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y)
spriteFrameImage.size = graphicsInfo->size;
MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(eventObject->graphicsId, eventObject->movementType, &spriteTemplate, &subspriteTables);
spriteTemplate.images = &spriteFrameImage;
- *(u16 *)&spriteTemplate.paletteTag = 0xffff;
+ *(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
paletteSlot = graphicsInfo->paletteSlot;
if (paletteSlot == 0)
{
@@ -1853,7 +1842,7 @@ static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y)
paletteSlot -= 16;
sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot);
}
- *(u16 *)&spriteTemplate.paletteTag = 0xffff;
+ *(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
spriteId = CreateSprite(&spriteTemplate, 0, 0, 0);
if (spriteId != MAX_SPRITES)
{
@@ -1864,7 +1853,7 @@ static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y)
sprite->pos1.x += 8;
sprite->pos1.y += 16 + sprite->centerToCornerVecY;
sprite->images = graphicsInfo->images;
- if (eventObject->movementType == 0x0b)
+ if (eventObject->movementType == MOVEMENT_TYPE_PLAYER)
{
SetPlayerAvatarEventObjectIdAndObjectId(eventObjectId, spriteId);
eventObject->warpArrowSpriteId = CreateWarpArrowSprite();
@@ -1877,7 +1866,7 @@ static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y)
sprite->coordOffsetEnabled = TRUE;
sprite->data[0] = eventObjectId;
eventObject->spriteId = spriteId;
- if (!eventObject->inanimate && eventObject->movementType != 0x0b)
+ if (!eventObject->inanimate && eventObject->movementType != MOVEMENT_TYPE_PLAYER)
{
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObject->facingDirection));
}
@@ -1888,7 +1877,7 @@ static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y)
static void sub_808E38C(struct EventObject *eventObject)
{
- eventObject->singleMovementActive = 0;
+ eventObject->singleMovementActive = FALSE;
eventObject->triggerGroundEffectsOnMove = TRUE;
eventObject->hasShadow = FALSE;
eventObject->hasReflection = FALSE;
@@ -1983,7 +1972,7 @@ void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction)
EventObjectTurn(&gEventObjects[playerAvatar->eventObjectId], direction);
}
-/*static*/ void get_berry_tree_graphics(struct EventObject *eventObject, struct Sprite *sprite)
+static void get_berry_tree_graphics(struct EventObject *eventObject, struct Sprite *sprite)
{
u8 berryStage;
u8 berryId;
@@ -1996,7 +1985,7 @@ void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction)
eventObject->invisible = FALSE;
sprite->invisible = FALSE;
berryId = GetBerryTypeByBerryTreeId(eventObject->trainerRange_berryTreeId) - 1;
- berryStage -= 1;
+ berryStage--;
if (berryId >= NUM_BERRIES)
{
berryId = 0;
@@ -2059,7 +2048,7 @@ void sub_808E75C(s16 x, s16 y)
struct EventObject *eventObject;
eventObjectId = GetEventObjectIdByXY(x, y);
- if (eventObjectId != NUM_EVENT_OBJECTS)
+ if (eventObjectId != EVENT_OBJECTS_COUNT)
{
eventObject = &gEventObjects[eventObjectId];
eventObject->triggerGroundEffectsOnMove = TRUE;
@@ -2113,42 +2102,40 @@ void FreeAndReserveObjectSpritePalettes(void)
gReservedSpritePaletteCount = 12;
}
-static void sub_808E894(u16 paletteTag)
+static void LoadEventObjectPalette(u16 paletteTag)
{
- u16 paletteSlot;
+ u16 i = FindEventObjectPaletteIndexByTag(paletteTag);
- paletteSlot = FindEventObjectPaletteIndexByTag(paletteTag);
- if (paletteSlot != EVENT_OBJ_PAL_TAG_NONE) // always true
+ if (i != EVENT_OBJ_PAL_TAG_NONE) // always true
{
- sub_808E8F4(&sEventObjectSpritePalettes[paletteSlot]);
+ sub_808E8F4(&sEventObjectSpritePalettes[i]);
}
}
-void sub_808E8C0(u16 *paletteTags)
+void Unused_LoadEventObjectPaletteSet(u16 *paletteTags)
{
u8 i;
for (i = 0; paletteTags[i] != EVENT_OBJ_PAL_TAG_NONE; i++)
{
- sub_808E894(paletteTags[i]);
+ LoadEventObjectPalette(paletteTags[i]);
}
}
static u8 sub_808E8F4(const struct SpritePalette *spritePalette)
{
- if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xff)
+ if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF)
{
- return 0xff;
+ return 0xFF;
}
return LoadSpritePalette(spritePalette);
}
void PatchObjectPalette(u16 paletteTag, u8 paletteSlot)
{
- u16 paletteIdx;
+ u8 paletteIndex = FindEventObjectPaletteIndexByTag(paletteTag);
- paletteIdx = FindEventObjectPaletteIndexByTag(paletteTag);
- LoadPalette(sEventObjectSpritePalettes[paletteIdx].data, 16 * paletteSlot + 256, 0x20);
+ LoadPalette(sEventObjectSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20);
}
void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot)
@@ -2172,7 +2159,7 @@ static u8 FindEventObjectPaletteIndexByTag(u16 tag)
return i;
}
}
- return 0xff;
+ return 0xFF;
}
void LoadPlayerObjectReflectionPalette(u16 tag, u8 slot)
@@ -2227,7 +2214,7 @@ void ShiftEventObjectCoords(struct EventObject *eventObject, s16 x, s16 y)
eventObject->currentCoords.y = y;
}
-/*static*/ void SetEventObjectCoords(struct EventObject *eventObject, s16 x, s16 y)
+static void SetEventObjectCoords(struct EventObject *eventObject, s16 x, s16 y)
{
eventObject->previousCoords.x = x;
eventObject->previousCoords.y = y;
@@ -2282,7 +2269,7 @@ void UpdateEventObjectCoordsForCameraUpdate(void)
{
dx = gCamera.x;
dy = gCamera.y;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (gEventObjects[i].active)
{
@@ -2300,7 +2287,8 @@ void UpdateEventObjectCoordsForCameraUpdate(void)
u8 GetEventObjectIdByXYZ(u16 x, u16 y, u8 z)
{
u8 i;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
if (gEventObjects[i].active)
{
@@ -2310,7 +2298,7 @@ u8 GetEventObjectIdByXYZ(u16 x, u16 y, u8 z)
}
}
}
- return NUM_EVENT_OBJECTS;
+ return EVENT_OBJECTS_COUNT;
}
static bool8 EventObjectDoesZCoordMatch(struct EventObject *eventObject, u8 z)
@@ -2331,9 +2319,8 @@ void UpdateEventObjectsForCameraUpdate(s16 x, s16 y)
u8 AddCameraObject(u8 linkedSpriteId)
{
- u8 spriteId;
+ u8 spriteId = CreateSprite(&gCameraSpriteTemplate, 0, 0, 4);
- spriteId = CreateSprite(&gCameraSpriteTemplate, 0, 0, 4);
gSprites[spriteId].invisible = TRUE;
gSprites[spriteId].data[0] = linkedSpriteId;
return spriteId;
@@ -2358,11 +2345,9 @@ static void CameraObject_0(struct Sprite *sprite)
static void CameraObject_1(struct Sprite *sprite)
{
- s16 x;
- s16 y;
+ s16 x = gSprites[sprite->data[0]].pos1.x;
+ s16 y = gSprites[sprite->data[0]].pos1.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;
@@ -2379,13 +2364,13 @@ static void CameraObject_2(struct Sprite *sprite)
static struct Sprite *FindCameraObject(void)
{
- u8 spriteId;
+ u8 i;
- for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++)
+ for (i = 0; i < MAX_SPRITES; i++)
{
- if (gSprites[spriteId].inUse && gSprites[spriteId].callback == ObjectCB_CameraObject)
+ if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject)
{
- return &gSprites[spriteId];
+ return &gSprites[i];
}
}
return NULL;
@@ -2454,7 +2439,7 @@ u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority)
{
s16 i;
- for (i = MAX_SPRITES - 1; i > -1; i --)
+ for (i = MAX_SPRITES - 1; i > -1; i--)
{
if (!gSprites[i].inUse)
{
@@ -2978,10 +2963,8 @@ u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy)
u8 TryGetTrainerEncounterDirection(struct EventObject *eventObject, u8 movementType)
{
- s16 dx;
- s16 dy;
- s16 absdx;
- s16 absdy;
+ s16 dx, dy;
+ s16 absdx, absdy;
if (!EventObjectIsTrainerAndCloseToPlayer(eventObject))
{
@@ -4449,7 +4432,7 @@ bool8 CopyablePlayerMovement_GoSpeed1(struct EventObject *eventObject, struct Sp
{
EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
}
- eventObject->singleMovementActive = 1;
+ eventObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
return TRUE;
}
@@ -4468,7 +4451,7 @@ bool8 CopyablePlayerMovement_GoSpeed2(struct EventObject *eventObject, struct Sp
{
EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
}
- eventObject->singleMovementActive = 1;
+ eventObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
return TRUE;
}
@@ -4487,7 +4470,7 @@ bool8 CopyablePlayerMovement_Slide(struct EventObject *eventObject, struct Sprit
{
EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
}
- eventObject->singleMovementActive = 1;
+ eventObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
return TRUE;
}
@@ -4499,7 +4482,7 @@ bool8 cph_IM_DIFFERENT(struct EventObject *eventObject, struct Sprite *sprite, u
direction = playerDirection;
direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction);
EventObjectSetSingleMovement(eventObject, sprite, GetJumpInPlaceMovementAction(direction));
- eventObject->singleMovementActive = 1;
+ eventObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
return TRUE;
}
@@ -4518,7 +4501,7 @@ bool8 CopyablePlayerMovement_GoSpeed4(struct EventObject *eventObject, struct Sp
{
EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
}
- eventObject->singleMovementActive = 1;
+ eventObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
return TRUE;
}
@@ -4539,7 +4522,7 @@ bool8 CopyablePlayerMovement_Jump(struct EventObject *eventObject, struct Sprite
{
EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction));
}
- eventObject->singleMovementActive = 1;
+ eventObject->singleMovementActive = TRUE;
sprite->data[1] = 2;
return TRUE;
}
@@ -4951,7 +4934,7 @@ static bool8 DoesObjectCollideWithObjectAt(struct EventObject *eventObject, s16
u8 i;
struct EventObject *curObject;
- for (i = 0; i < NUM_EVENT_OBJECTS; i++)
+ for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
{
curObject = &gEventObjects[i];
if (curObject->active && curObject != eventObject)
@@ -5022,8 +5005,8 @@ 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;
+ *dest_x -= gTotalCameraPixelOffsetX;
+ *dest_y -= gTotalCameraPixelOffsetY;
}
void sub_8093038(s16 x, s16 y, s16 *dest_x, s16 *dest_y)
@@ -5031,21 +5014,21 @@ 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 = -gTotalCameraPixelOffsetX - gFieldCamera.x;
+ dy = -gTotalCameraPixelOffsetY - gFieldCamera.y;
+ if (gFieldCamera.x > 0)
{
dx += 0x10;
}
- if (gUnknown_03005DD0.x < 0)
+ if (gFieldCamera.x < 0)
{
dx -= 0x10;
}
- if (gUnknown_03005DD0.y > 0)
+ if (gFieldCamera.y > 0)
{
dy += 0x10;
}
- if (gUnknown_03005DD0.y < 0)
+ if (gFieldCamera.y < 0)
{
dy -= 0x10;
}
@@ -5064,19 +5047,19 @@ static void GetEventObjectMovingCameraOffset(s16 *x, s16 *y)
{
*x = 0;
*y = 0;
- if (gUnknown_03005DD0.x > 0)
+ if (gFieldCamera.x > 0)
{
(*x)++;
}
- if (gUnknown_03005DD0.x < 0)
+ if (gFieldCamera.x < 0)
{
(*x) --;
}
- if (gUnknown_03005DD0.y > 0)
+ if (gFieldCamera.y > 0)
{
(*y)++;
}
- if (gUnknown_03005DD0.y < 0)
+ if (gFieldCamera.y < 0)
{
(*y) --;
}
@@ -5332,7 +5315,7 @@ void npc_apply_direction(struct EventObject *eventObject, struct Sprite *sprite,
ShiftEventObjectCoords(eventObject, x, y);
oamt_npc_ministep_reset(sprite, direction, speed);
sprite->animPaused = FALSE;
- if (gLockedAnimEventObjects != NULL && FindLockedEventObjectIndex(eventObject) != NUM_EVENT_OBJECTS)
+ if (gLockedAnimEventObjects != NULL && FindLockedEventObjectIndex(eventObject) != EVENT_OBJECTS_COUNT)
{
sprite->animPaused = TRUE;
}
@@ -7435,7 +7418,7 @@ bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct EventObject *eventObject,
bool8 MovementAction_AcroWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
{
- sub_8096200(eventObject, sprite, DIR_EAST, 1);
+ sub_8096200(eventObject, sprite, DIR_EAST, 1);
return MovementAction_AcroWheelieMoveRight_Step1(eventObject, sprite);
}
@@ -7490,7 +7473,7 @@ bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct EventObject *eventObject,
bool8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite)
{
- sub_8096330(eventObject, sprite, DIR_WEST, 1);
+ sub_8096330(eventObject, sprite, DIR_WEST, 1);
return MovementAction_AcroEndWheelieMoveLeft_Step1(eventObject, sprite);
}
@@ -7506,7 +7489,7 @@ bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct EventObject *eventObjec
bool8 MovementAction_AcroEndWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite)
{
- sub_8096330(eventObject, sprite, DIR_EAST, 1);
+ sub_8096330(eventObject, sprite, DIR_EAST, 1);
return MovementAction_AcroEndWheelieMoveRight_Step1(eventObject, sprite);
}
@@ -7578,15 +7561,13 @@ static void TryEnableEventObjectAnim(struct EventObject *eventObject, struct Spr
static void UpdateEventObjectVisibility(struct EventObject *eventObject, struct Sprite *sprite)
{
sub_8096530(eventObject, sprite);
- npc_update_obj_anim_flag(eventObject, sprite);
+ UpdateEventObjSpriteVisibility(eventObject, sprite);
}
static void sub_8096530(struct EventObject *eventObject, struct Sprite *sprite)
{
- u16 x;
- u16 y;
- u16 x2;
- u16 y2;
+ u16 x, y;
+ u16 x2, y2;
const struct EventObjectGraphicsInfo *graphicsInfo;
eventObject->offScreen = FALSE;
@@ -7615,7 +7596,7 @@ static void sub_8096530(struct EventObject *eventObject, struct Sprite *sprite)
}
}
-static void npc_update_obj_anim_flag(struct EventObject *eventObject, struct Sprite *sprite)
+static void UpdateEventObjSpriteVisibility(struct EventObject *eventObject, struct Sprite *sprite)
{
sprite->invisible = FALSE;
if (eventObject->invisible || eventObject->offScreen)
@@ -7624,7 +7605,7 @@ static void npc_update_obj_anim_flag(struct EventObject *eventObject, struct Spr
}
}
-/*static*/ void GetAllGroundEffectFlags_OnSpawn(struct EventObject *eventObj, u32 *flags)
+static void GetAllGroundEffectFlags_OnSpawn(struct EventObject *eventObj, u32 *flags)
{
EventObjectUpdateMetatileBehaviors(eventObj);
GetGroundEffectFlags_Reflection(eventObj, flags);
@@ -7650,7 +7631,7 @@ static void GetAllGroundEffectFlags_OnBeginStep(struct EventObject *eventObj, u3
GetGroundEffectFlags_HotSprings(eventObj, flags);
}
-/*static*/ void GetAllGroundEffectFlags_OnFinishStep(struct EventObject *eventObj, u32 *flags)
+static void GetAllGroundEffectFlags_OnFinishStep(struct EventObject *eventObj, u32 *flags)
{
EventObjectUpdateMetatileBehaviors(eventObj);
GetGroundEffectFlags_ShallowFlowingWater(eventObj, flags);
@@ -7930,7 +7911,7 @@ u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z)
return 0;
}
-void EventObjectSetSpriteOamTableForLongGrass(struct EventObject *eventObj, struct Sprite *sprite)
+static void SetEventObjectSpriteOamTableForLongGrass(struct EventObject *eventObj, struct Sprite *sprite)
{
if (eventObj->disableCoveringGroundEffects)
return;
@@ -7983,7 +7964,7 @@ 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)
+void UpdateEventObjectZCoordAndPriority(struct EventObject *eventObj, struct Sprite *sprite)
{
if (eventObj->fixedPriority)
return;
@@ -8206,7 +8187,11 @@ void GroundEffect_JumpOnTallGrass(struct EventObject *eventObj, struct Sprite *s
FieldEffectStart(FLDEFF_JUMP_TALL_GRASS);
spriteId = FindTallGrassFieldEffectSpriteId(
- eventObj->localId, eventObj->mapNum, eventObj->mapGroup, eventObj->currentCoords.x, eventObj->currentCoords.y);
+ eventObj->localId,
+ eventObj->mapNum,
+ eventObj->mapGroup,
+ eventObj->currentCoords.x,
+ eventObj->currentCoords.y);
if (spriteId == MAX_SPRITES)
GroundEffect_SpawnOnTallGrass(eventObj, sprite);
@@ -8288,7 +8273,7 @@ static void (*const sGroundEffectFuncs[])(struct EventObject *eventObj, struct S
GroundEffect_Seaweed
};
-/*static*/ void DoFlaggedGroundEffects(struct EventObject *eventObj, struct Sprite *sprite, u32 flags)
+static void DoFlaggedGroundEffects(struct EventObject *eventObj, struct Sprite *sprite, u32 flags)
{
u8 i;
@@ -8329,9 +8314,9 @@ static void DoGroundEffects_OnSpawn(struct EventObject *eventObj, struct Sprite
if (eventObj->triggerGroundEffectsOnMove)
{
flags = 0;
- EventObjectUpdateZCoordAndPriority(eventObj, sprite);
+ UpdateEventObjectZCoordAndPriority(eventObj, sprite);
GetAllGroundEffectFlags_OnSpawn(eventObj, &flags);
- EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite);
+ SetEventObjectSpriteOamTableForLongGrass(eventObj, sprite);
DoFlaggedGroundEffects(eventObj, sprite, flags);
eventObj->triggerGroundEffectsOnMove = 0;
eventObj->disableCoveringGroundEffects = 0;
@@ -8345,9 +8330,9 @@ static void DoGroundEffects_OnBeginStep(struct EventObject *eventObj, struct Spr
if (eventObj->triggerGroundEffectsOnMove)
{
flags = 0;
- EventObjectUpdateZCoordAndPriority(eventObj, sprite);
+ UpdateEventObjectZCoordAndPriority(eventObj, sprite);
GetAllGroundEffectFlags_OnBeginStep(eventObj, &flags);
- EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite);
+ SetEventObjectSpriteOamTableForLongGrass(eventObj, sprite);
filters_out_some_ground_effects(eventObj, &flags);
DoFlaggedGroundEffects(eventObj, sprite, flags);
eventObj->triggerGroundEffectsOnMove = 0;
@@ -8362,9 +8347,9 @@ static void DoGroundEffects_OnFinishStep(struct EventObject *eventObj, struct Sp
if (eventObj->triggerGroundEffectsOnStop)
{
flags = 0;
- EventObjectUpdateZCoordAndPriority(eventObj, sprite);
+ UpdateEventObjectZCoordAndPriority(eventObj, sprite);
GetAllGroundEffectFlags_OnFinishStep(eventObj, &flags);
- EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite);
+ SetEventObjectSpriteOamTableForLongGrass(eventObj, sprite);
FilterOutStepOnPuddleGroundEffectIfJumping(eventObj, &flags);
DoFlaggedGroundEffects(eventObj, sprite, flags);
eventObj->triggerGroundEffectsOnStop = 0;
@@ -8397,11 +8382,11 @@ void FreezeEventObjects(void)
FreezeEventObject(&gEventObjects[i]);
}
-void FreezeEventObjectsExceptOne(u8 a1)
+void FreezeEventObjectsExceptOne(u8 eventObjectId)
{
u8 i;
for (i = 0; i < EVENT_OBJECTS_COUNT; i++)
- if (i != a1 && gEventObjects[i].active && i != gPlayerAvatar.eventObjectId)
+ if (i != eventObjectId && gEventObjects[i].active && i != gPlayerAvatar.eventObjectId)
FreezeEventObject(&gEventObjects[i]);
}
@@ -8423,44 +8408,44 @@ void UnfreezeEventObjects(void)
UnfreezeEventObject(&gEventObjects[i]);
}
-void Step1(struct Sprite *sprite, u8 dir)
+static void Step1(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += sDirectionToVectors[dir].x;
sprite->pos1.y += sDirectionToVectors[dir].y;
}
-void Step2(struct Sprite *sprite, u8 dir)
+static void Step2(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 2 * (u16) sDirectionToVectors[dir].x;
sprite->pos1.y += 2 * (u16) sDirectionToVectors[dir].y;
}
-void Step3(struct Sprite *sprite, u8 dir)
+static void Step3(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 2 * (u16) sDirectionToVectors[dir].x + (u16) sDirectionToVectors[dir].x;
sprite->pos1.y += 2 * (u16) sDirectionToVectors[dir].y + (u16) sDirectionToVectors[dir].y;
}
-void Step4(struct Sprite *sprite, u8 dir)
+static void Step4(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 4 * (u16) sDirectionToVectors[dir].x;
sprite->pos1.y += 4 * (u16) sDirectionToVectors[dir].y;
}
-void Step8(struct Sprite *sprite, u8 dir)
+static void Step8(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 8 * (u16) sDirectionToVectors[dir].x;
sprite->pos1.y += 8 * (u16) sDirectionToVectors[dir].y;
}
-void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
+static void oamt_npc_ministep_reset(struct Sprite *sprite, u8 direction, u8 a3)
{
- sprite->data[3] = a2;
+ sprite->data[3] = direction;
sprite->data[4] = a3;
sprite->data[5] = 0;
}
-typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 direction);
static const SpriteStepFunc gUnknown_0850E6C4[] = {
Step1,
@@ -8540,9 +8525,9 @@ bool8 obj_npc_ministep(struct Sprite *sprite)
return TRUE;
}
-void sub_80976DC(struct Sprite *sprite, u8 a2)
+void sub_80976DC(struct Sprite *sprite, u8 direction)
{
- sprite->data[3] = a2;
+ sprite->data[3] = direction;
sprite->data[4] = 0;
sprite->data[5] = 0;
}
@@ -8563,7 +8548,7 @@ bool8 sub_80976EC(struct Sprite *sprite)
return FALSE;
}
-const s8 gUnknown_0850E772[] = {
+static 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,
@@ -8575,7 +8560,7 @@ const s8 gUnknown_0850E772[] = {
0, 1, 0, 0, 0, 0, 0, 0,
};
-const s8 gUnknown_0850E7BA[] = {
+static 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,
@@ -8745,7 +8730,7 @@ u8 sub_80978E4(struct Sprite *sprite)
return v2;
}
-void SetMovementDelay(struct Sprite *sprite, s16 timer)
+static void SetMovementDelay(struct Sprite *sprite, s16 timer)
{
sprite->data[3] = timer;
}
@@ -8760,11 +8745,11 @@ static bool8 WaitForMovementDelay(struct Sprite *sprite)
return FALSE;
}
-void SetAndStartSpriteAnim(struct Sprite *sprite, u8 a2, u8 a3)
+void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex)
{
- sprite->animNum = a2;
- sprite->animPaused = 0 ;
- SeekSpriteAnim(sprite, a3);
+ sprite->animNum = animNum;
+ sprite->animPaused = FALSE;
+ SeekSpriteAnim(sprite, animCmdIndex);
}
bool8 SpriteAnimEnded(struct Sprite *sprite)
@@ -8802,7 +8787,7 @@ void UpdateEventObjectSpriteVisibility(struct Sprite *sprite, bool8 invisible)
sprite->invisible = TRUE;
}
-void UpdateEventObjectSpriteSubpriorityAndVisibility(struct Sprite *sprite)
+static void UpdateEventObjectSpriteSubpriorityAndVisibility(struct Sprite *sprite)
{
sub_8097D68(sprite);
SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
@@ -8849,15 +8834,15 @@ void sub_8097BB4(u8 var1, u8 graphicsId)
if(spriteId != MAX_SPRITES)
{
struct Sprite *sprite = &gSprites[spriteId];
- const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(graphicsId);
+ const struct EventObjectGraphicsInfo *graphicsInfo = GetEventObjectGraphicsInfo(graphicsId);
u16 tileNum = sprite->oam.tileNum;
- sprite->oam = *gfxInfo->oam;
+ sprite->oam = *graphicsInfo->oam;
sprite->oam.tileNum = tileNum;
- sprite->oam.paletteNum = gfxInfo->paletteSlot;
- sprite->images = gfxInfo->images;
+ sprite->oam.paletteNum = graphicsInfo->paletteSlot;
+ sprite->images = graphicsInfo->images;
- if(gfxInfo->subspriteTables == NULL)
+ if(graphicsInfo->subspriteTables == NULL)
{
sprite->subspriteTables = NULL;
sprite->subspriteTableNum = 0;
@@ -8865,7 +8850,7 @@ void sub_8097BB4(u8 var1, u8 graphicsId)
}
else
{
- SetSubspriteTables(sprite, gfxInfo->subspriteTables);
+ SetSubspriteTables(sprite, graphicsInfo->subspriteTables);
sprite->subspriteMode = 2;
}
StartSpriteAnim(sprite, 0);
@@ -8990,9 +8975,9 @@ void DoShadowFieldEffect(struct EventObject *eventObject)
static void DoRippleFieldEffect(struct EventObject *eventObject, struct Sprite *sprite)
{
- const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
+ const struct EventObjectGraphicsInfo *graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId);
gFieldEffectArguments[0] = sprite->pos1.x;
- gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
+ gFieldEffectArguments[1] = sprite->pos1.y + (graphicsInfo->height >> 1) - 2;
gFieldEffectArguments[2] = 151;
gFieldEffectArguments[3] = 3;
FieldEffectStart(FLDEFF_RIPPLE);
diff --git a/src/field_camera.c b/src/field_camera.c
index e8900e06a..b976cf2ff 100644
--- a/src/field_camera.c
+++ b/src/field_camera.c
@@ -15,71 +15,71 @@
EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE;
// Static type declarations
-struct FieldCameraUnknownStruct
+struct FieldCameraOffset
{
- u8 unk0;
- u8 unk1;
- u8 unk2;
- u8 unk3;
- bool8 unk4;
+ u8 xPixelOffset;
+ u8 yPixelOffset;
+ u8 xTileOffset;
+ u8 yTileOffset;
+ bool8 copyBGToVRAM;
};
// 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 RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
+static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *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 struct FieldCameraOffset sFieldCameraOffset;
+static IWRAM_DATA s16 sHorizontalCameraPan;
+static IWRAM_DATA s16 sVerticalCameraPan;
static IWRAM_DATA u8 gUnknown_03000E2C;
-static IWRAM_DATA void (*gUnknown_03000E30)(void);
+static IWRAM_DATA void (*sFieldCameraPanningCallback)(void);
-struct CameraObject gUnknown_03005DD0;
-u16 gUnknown_03005DE8;
-u16 gUnknown_03005DEC;
+struct CameraObject gFieldCamera;
+u16 gTotalCameraPixelOffsetY;
+u16 gTotalCameraPixelOffsetX;
// text
-static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraUnknownStruct *a)
+static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraOffset *cameraOffset)
{
- a->unk2 = 0;
- a->unk3 = 0;
- a->unk0 = 0;
- a->unk1 = 0;
- a->unk4 = TRUE;
+ cameraOffset->xTileOffset = 0;
+ cameraOffset->yTileOffset = 0;
+ cameraOffset->xPixelOffset = 0;
+ cameraOffset->yPixelOffset = 0;
+ cameraOffset->copyBGToVRAM = TRUE;
}
-static void tilemap_move_something(struct FieldCameraUnknownStruct *a, u32 b, u32 c)
+static void tilemap_move_something(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)
{
- a->unk2 += b;
- a->unk2 %= 32;
- a->unk3 += c;
- a->unk3 %= 32;
+ cameraOffset->xTileOffset += b;
+ cameraOffset->xTileOffset %= 32;
+ cameraOffset->yTileOffset += c;
+ cameraOffset->yTileOffset %= 32;
}
-static void coords8_add(struct FieldCameraUnknownStruct *a, u32 b, u32 c)
+static void coords8_add(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)
{
- a->unk0 += b;
- a->unk1 += c;
+ cameraOffset->xPixelOffset += b;
+ cameraOffset->yPixelOffset += c;
}
void move_tilemap_camera_to_upper_left_corner(void)
{
- move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000E20);
+ move_tilemap_camera_to_upper_left_corner_(&sFieldCameraOffset);
}
void FieldUpdateBgTilemapScroll(void)
{
u32 r4, r5;
- r5 = gUnknown_03000E20.unk0 + gUnknown_03000E28;
- r4 = gUnknown_03000E2A + gUnknown_03000E20.unk1 + 8;
+ r5 = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;
+ r4 = sVerticalCameraPan + sFieldCameraOffset.yPixelOffset + 8;
SetGpuReg(REG_OFFSET_BG1HOFS, r5);
SetGpuReg(REG_OFFSET_BG1VOFS, r4);
@@ -91,14 +91,14 @@ void FieldUpdateBgTilemapScroll(void)
void sub_8089C08(s16 *a, s16 *b)
{
- *a = gUnknown_03000E20.unk0 + gUnknown_03000E28;
- *b = gUnknown_03000E20.unk1 + gUnknown_03000E2A + 8;
+ *a = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;
+ *b = sFieldCameraOffset.yPixelOffset + sVerticalCameraPan + 8;
}
void DrawWholeMapView(void)
{
DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapLayout);
- gUnknown_03000E20.unk4 = TRUE;
+ sFieldCameraOffset.copyBGToVRAM = TRUE;
}
static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout)
@@ -110,13 +110,13 @@ static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLa
for (i = 0; i < 32; i += 2)
{
- temp = gUnknown_03000E20.unk3 + i;
+ temp = sFieldCameraOffset.yTileOffset + i;
if (temp >= 32)
temp -= 32;
r6 = temp * 32;
for (j = 0; j < 32; j += 2)
{
- temp = gUnknown_03000E20.unk2 + j;
+ temp = sFieldCameraOffset.xTileOffset + j;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapLayout, r6 + temp, x + j / 2, y + i / 2);
@@ -124,112 +124,112 @@ static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLa
}
}
-static void RedrawMapSlicesForCameraUpdate(struct FieldCameraUnknownStruct *a, int x, int y)
+static void RedrawMapSlicesForCameraUpdate(struct FieldCameraOffset *cameraOffset, int x, int y)
{
const struct MapLayout *mapLayout = gMapHeader.mapLayout;
if (x > 0)
- RedrawMapSliceWest(a, mapLayout);
+ RedrawMapSliceWest(cameraOffset, mapLayout);
if (x < 0)
- RedrawMapSliceEast(a, mapLayout);
+ RedrawMapSliceEast(cameraOffset, mapLayout);
if (y > 0)
- RedrawMapSliceNorth(a, mapLayout);
+ RedrawMapSliceNorth(cameraOffset, mapLayout);
if (y < 0)
- RedrawMapSliceSouth(a, mapLayout);
- a->unk4 = TRUE;
+ RedrawMapSliceSouth(cameraOffset, mapLayout);
+ cameraOffset->copyBGToVRAM = TRUE;
}
-static void RedrawMapSliceNorth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout)
+static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
u32 r7;
- temp = a->unk3 + 28;
+ temp = cameraOffset->yTileOffset + 28;
if (temp >= 32)
temp -= 32;
r7 = temp * 32;
for (i = 0; i < 32; i += 2)
{
- temp = a->unk2 + i;
+ temp = cameraOffset->xTileOffset + 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)
+static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
- u32 r7 = a->unk3 * 32;
+ u32 r7 = cameraOffset->yTileOffset * 32;
for (i = 0; i < 32; i += 2)
{
- temp = a->unk2 + i;
+ temp = cameraOffset->xTileOffset + 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)
+static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
- u32 r6 = a->unk2;
+ u32 r6 = cameraOffset->xTileOffset;
for (i = 0; i < 32; i += 2)
{
- temp = a->unk3 + i;
+ temp = cameraOffset->yTileOffset + 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)
+static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
- u8 r5 = a->unk2 + 28;
+ u8 r5 = cameraOffset->xTileOffset + 28;
if (r5 >= 32)
r5 -= 32;
for (i = 0; i < 32; i += 2)
{
- temp = a->unk3 + i;
+ temp = cameraOffset->yTileOffset + 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)
+void CurrentMapDrawMetatileAt(int x, int y)
{
- int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, a, b);
+ int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);
if (offset >= 0)
{
- DrawMetatileAt(gMapHeader.mapLayout, offset, a, b);
- gUnknown_03000E20.unk4 = TRUE;
+ DrawMetatileAt(gMapHeader.mapLayout, offset, x, y);
+ sFieldCameraOffset.copyBGToVRAM = TRUE;
}
}
void DrawDoorMetatileAt(int x, int y, u16 *arr)
{
- int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, x, y);
+ int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);
if (offset >= 0)
{
DrawMetatile(1, arr, offset);
- gUnknown_03000E20.unk4 = TRUE;
+ sFieldCameraOffset.copyBGToVRAM = TRUE;
}
}
-static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 b, int c, int d)
+static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 offset, int x, int y)
{
- u16 metatileId = MapGridGetMetatileIdAt(c, d);
+ u16 metatileId = MapGridGetMetatileIdAt(x, y);
u16 *metatiles;
if (metatileId > NUM_METATILES_TOTAL)
@@ -241,60 +241,69 @@ static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 b, int c, int
metatiles = mapLayout->secondaryTileset->metatiles;
metatileId -= NUM_METATILES_IN_PRIMARY;
}
- DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b);
+ DrawMetatile(MapGridGetMetatileLayerTypeAt(x, y), metatiles + metatileId * 8, offset);
}
-static void DrawMetatile(s32 a, u16 *b, u16 c)
+static void DrawMetatile(s32 metatileLayerType, u16 *metatiles, u16 offset)
{
- switch (a)
+ switch (metatileLayerType)
{
- 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];
+ case 2: // LAYER_TYPE_
+ // Draw metatile's bottom layer to the bottom background layer.
+ gBGTilemapBuffers3[offset] = metatiles[0];
+ gBGTilemapBuffers3[offset + 1] = metatiles[1];
+ gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
+ gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
+
+ // Draw transparent tiles to the middle background layer.
+ gBGTilemapBuffers1[offset] = 0;
+ gBGTilemapBuffers1[offset + 1] = 0;
+ gBGTilemapBuffers1[offset + 0x20] = 0;
+ gBGTilemapBuffers1[offset + 0x21] = 0;
+
+ // Draw metatile's top layer to the top background layer.
+ gBGTilemapBuffers2[offset] = metatiles[4];
+ gBGTilemapBuffers2[offset + 1] = metatiles[5];
+ gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
+ gBGTilemapBuffers2[offset + 0x21] = metatiles[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;
+ case 1: // LAYER_TYPE_COVERED_BY_OBJECTS
+ // Draw metatile's bottom layer to the bottom background layer.
+ gBGTilemapBuffers3[offset] = metatiles[0];
+ gBGTilemapBuffers3[offset + 1] = metatiles[1];
+ gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
+ gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
+
+ // Draw metatile's top layer to the middle background layer.
+ gBGTilemapBuffers1[offset] = metatiles[4];
+ gBGTilemapBuffers1[offset + 1] = metatiles[5];
+ gBGTilemapBuffers1[offset + 0x20] = metatiles[6];
+ gBGTilemapBuffers1[offset + 0x21] = metatiles[7];
+
+ // Draw transparent tiles to the top background layer.
+ gBGTilemapBuffers2[offset] = 0;
+ gBGTilemapBuffers2[offset + 1] = 0;
+ gBGTilemapBuffers2[offset + 0x20] = 0;
+ gBGTilemapBuffers2[offset + 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];
+ case 0: // LAYER_TYPE_NORMAL
+ // Draw garbage to the bottom background layer.
+ gBGTilemapBuffers3[offset] = 0x3014;
+ gBGTilemapBuffers3[offset + 1] = 0x3014;
+ gBGTilemapBuffers3[offset + 0x20] = 0x3014;
+ gBGTilemapBuffers3[offset + 0x21] = 0x3014;
+
+ // Draw metatile's bottom layer to the middle background layer.
+ gBGTilemapBuffers1[offset] = metatiles[0];
+ gBGTilemapBuffers1[offset + 1] = metatiles[1];
+ gBGTilemapBuffers1[offset + 0x20] = metatiles[2];
+ gBGTilemapBuffers1[offset + 0x21] = metatiles[3];
+
+ // Draw metatile's top layer to the top background layer, which covers event object sprites.
+ gBGTilemapBuffers2[offset] = metatiles[4];
+ gBGTilemapBuffers2[offset + 1] = metatiles[5];
+ gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
+ gBGTilemapBuffers2[offset + 0x21] = metatiles[7];
break;
}
schedule_bg_copy_tilemap_to_vram(1);
@@ -302,51 +311,51 @@ static void DrawMetatile(s32 a, u16 *b, u16 c)
schedule_bg_copy_tilemap_to_vram(3);
}
-static s32 MapPosToBgTilemapOffset(struct FieldCameraUnknownStruct *a, s32 x, s32 y)
+static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *cameraOffset, s32 x, s32 y)
{
x -= gSaveBlock1Ptr->pos.x;
x *= 2;
if (x >= 32 || x < 0)
return -1;
- x = x + a->unk2;
+ x = x + cameraOffset->xTileOffset;
if (x >= 32)
x -= 32;
y = (y - gSaveBlock1Ptr->pos.y) * 2;
if (y >= 32 || y < 0)
return -1;
- y = y + a->unk3;
+ y = y + cameraOffset->yTileOffset;
if (y >= 32)
y -= 32;
return y * 32 + x;
}
-static void CameraUpdateCallback(struct CameraObject *a)
+static void CameraUpdateCallback(struct CameraObject *fieldCamera)
{
- if (a->spriteId != 0)
+ if (fieldCamera->spriteId != 0)
{
- a->unk8 = gSprites[a->spriteId].data[2];
- a->unkC = gSprites[a->spriteId].data[3];
+ fieldCamera->movementSpeedX = gSprites[fieldCamera->spriteId].data[2];
+ fieldCamera->movementSpeedY = gSprites[fieldCamera->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;
+ gFieldCamera.movementSpeedX = 0;
+ gFieldCamera.movementSpeedY = 0;
+ gFieldCamera.x = 0;
+ gFieldCamera.y = 0;
+ gFieldCamera.spriteId = 0;
+ gFieldCamera.callback = NULL;
}
-u32 InitCameraUpdateCallback(u8 a)
+u32 InitCameraUpdateCallback(u8 trackedSpriteId)
{
- if (gUnknown_03005DD0.spriteId != 0)
- DestroySprite(&gSprites[gUnknown_03005DD0.spriteId]);
- gUnknown_03005DD0.spriteId = AddCameraObject(a);
- gUnknown_03005DD0.callback = CameraUpdateCallback;
+ if (gFieldCamera.spriteId != 0)
+ DestroySprite(&gSprites[gFieldCamera.spriteId]);
+ gFieldCamera.spriteId = AddCameraObject(trackedSpriteId);
+ gFieldCamera.callback = CameraUpdateCallback;
return 0;
}
@@ -354,54 +363,54 @@ 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;
+ int curMovementOffsetY;
+ int curMovementOffsetX;
+ int movementSpeedX;
+ int movementSpeedY;
+
+ if (gFieldCamera.callback != NULL)
+ gFieldCamera.callback(&gFieldCamera);
+ movementSpeedX = gFieldCamera.movementSpeedX;
+ movementSpeedY = gFieldCamera.movementSpeedY;
deltaX = 0;
deltaY = 0;
- r1 = gUnknown_03005DD0.x;
- r0 = gUnknown_03005DD0.y;
+ curMovementOffsetX = gFieldCamera.x;
+ curMovementOffsetY = gFieldCamera.y;
- if (r1 == 0 && r7 != 0)
+ if (curMovementOffsetX == 0 && movementSpeedX != 0)
{
- if (r7 > 0)
+ if (movementSpeedX > 0)
deltaX = 1;
else
deltaX = -1;
}
- if (r0 == 0 && r8 != 0)
+ if (curMovementOffsetY == 0 && movementSpeedY != 0)
{
- if (r8 > 0)
+ if (movementSpeedY > 0)
deltaY = 1;
else
deltaY = -1;
}
- if (r1 != 0 && r1 == -r7)
+ if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX)
{
- if (r7 > 0)
+ if (movementSpeedX > 0)
deltaX = 1;
else
deltaX = -1;
}
- if (r0 != 0 && r0 == -r8)
+ if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY)
{
- if (r8 > 0)
+ if (movementSpeedY > 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);
+ gFieldCamera.x += movementSpeedX;
+ gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16);
+ gFieldCamera.y += movementSpeedY;
+ gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16);
if (deltaX != 0 || deltaY != 0)
{
@@ -409,50 +418,50 @@ void CameraUpdate(void)
UpdateEventObjectsForCameraUpdate(deltaX, deltaY);
RotatingGatePuzzleCameraUpdate(deltaX, deltaY);
ResetBerryTreeSparkleFlags();
- tilemap_move_something(&gUnknown_03000E20, deltaX * 2, deltaY * 2);
- RedrawMapSlicesForCameraUpdate(&gUnknown_03000E20, deltaX * 2, deltaY * 2);
+ tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
+ RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
}
- coords8_add(&gUnknown_03000E20, r7, r8);
- gUnknown_03005DEC -= r7;
- gUnknown_03005DE8 -= r8;
+ coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY);
+ gTotalCameraPixelOffsetX -= movementSpeedX;
+ gTotalCameraPixelOffsetY -= movementSpeedY;
}
-void camera_move_and_redraw(int a, int b) //unused
+void MoveCameraAndRedrawMap(int deltaX, int deltaY) //unused
{
- CameraMove(a, b);
- UpdateEventObjectsForCameraUpdate(a, b);
+ CameraMove(deltaX, deltaY);
+ UpdateEventObjectsForCameraUpdate(deltaX, deltaY);
DrawWholeMapView();
- gUnknown_03005DEC -= a * 16;
- gUnknown_03005DE8 -= b * 16;
+ gTotalCameraPixelOffsetX -= deltaX * 16;
+ gTotalCameraPixelOffsetY -= deltaY * 16;
}
void SetCameraPanningCallback(void (*a)(void))
{
- gUnknown_03000E30 = a;
+ sFieldCameraPanningCallback = a;
}
void SetCameraPanning(s16 a, s16 b)
{
- gUnknown_03000E28 = a;
- gUnknown_03000E2A = b + 32;
+ sHorizontalCameraPan = a;
+ sVerticalCameraPan = b + 32;
}
void InstallCameraPanAheadCallback(void)
{
- gUnknown_03000E30 = CameraPanningCB_PanAhead;
+ sFieldCameraPanningCallback = CameraPanningCB_PanAhead;
gUnknown_03000E2C = 0;
- gUnknown_03000E28 = 0;
- gUnknown_03000E2A = 32;
+ sHorizontalCameraPan = 0;
+ sVerticalCameraPan = 32;
}
void UpdateCameraPanning(void)
{
- if (gUnknown_03000E30 != NULL)
- gUnknown_03000E30();
+ if (sFieldCameraPanningCallback != NULL)
+ sFieldCameraPanningCallback();
//Update sprite offset of overworld objects
- gSpriteCoordOffsetX = gUnknown_03005DEC - gUnknown_03000E28;
- gSpriteCoordOffsetY = gUnknown_03005DE8 - gUnknown_03000E2A - 8;
+ gSpriteCoordOffsetX = gTotalCameraPixelOffsetX - sHorizontalCameraPan;
+ gSpriteCoordOffsetY = gTotalCameraPixelOffsetY - sVerticalCameraPan - 8;
}
static void CameraPanningCB_PanAhead(void)
@@ -480,22 +489,21 @@ static void CameraPanningCB_PanAhead(void)
var = GetPlayerMovementDirection();
if (var == 2)
{
- if (gUnknown_03000E2A > -8)
- gUnknown_03000E2A -= 2;
+ if (sVerticalCameraPan > -8)
+ sVerticalCameraPan -= 2;
}
else if (var == 1)
{
- if (gUnknown_03000E2A < 72)
- gUnknown_03000E2A += 2;
+ if (sVerticalCameraPan < 72)
+ sVerticalCameraPan += 2;
}
- else if (gUnknown_03000E2A < 32)
+ else if (sVerticalCameraPan < 32)
{
- gUnknown_03000E2A += 2;
+ sVerticalCameraPan += 2;
}
- else if (gUnknown_03000E2A > 32)
+ else if (sVerticalCameraPan > 32)
{
- gUnknown_03000E2A -= 2;
+ sVerticalCameraPan -= 2;
}
}
}
-
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index 738826020..c52f5190f 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -5,6 +5,7 @@
#include "daycare.h"
#include "event_data.h"
#include "event_object_movement.h"
+#include "event_scripts.h"
#include "fieldmap.h"
#include "field_control_avatar.h"
#include "field_fadetransition.h"
@@ -37,57 +38,6 @@ static EWRAM_DATA u16 sPreviousPlayerMetatileBehavior = 0;
u8 gSelectedEventObject;
-//scripts
-extern const u8 EventScript_PlayerPCMale[];
-extern const u8 EventScript_PlayerPCFemale[];
-extern const u8 EventScript_SecretBasePC[];
-extern const u8 EventScript_RecordMixingSecretBasePC[];
-extern const u8 EventScript_SecretPower1[];
-extern const u8 EventScript_SecretPower2[];
-extern const u8 EventScript_PC[];
-extern const u8 EventScript_TestSignpostMsg[];
-extern const u8 EventScript_HiddenItemScript[];
-extern const u8 EventScript_2759F1[];
-extern const u8 EventScript_TV[];
-extern const u8 EventScript_ClosedSootopolisDoor[];
-extern const u8 SkyPillar_Outside_EventScript_2393F9[];
-extern const u8 EventScript_CableBoxResults[];
-extern const u8 EventScript_2A4BAC[];
-extern const u8 Route110_TrickHouseEntrance_EventScript_26A22A[];
-extern const u8 EventScript_RegionMap[];
-extern const u8 EventScript_RunningShoesManual[];
-extern const u8 EventScript_PictureBookShelf[];
-extern const u8 EventScript_BookShelf[];
-extern const u8 EventScript_PokemonCenterBookshelf[];
-extern const u8 EventScript_Vase[];
-extern const u8 EventScript_TrashCan[];
-extern const u8 EventScript_ShopShelf[];
-extern const u8 EventScript_Blueprint[];
-extern const u8 EventScript_WirelessBoxResults[];
-extern const u8 EventScript_CableBoxResults[];
-extern const u8 EventScript_Questionnaire[];
-extern const u8 EventScript_TrainerHillTimer[];
-extern const u8 EventScript_SecretBaseSandOrnament[];
-extern const u8 EventScript_SecretBaseShieldOrToyTV[];
-extern const u8 EventScript_UseSurf[];
-extern const u8 EventScript_UseWaterfall[];
-extern const u8 EventScript_CannotUseWaterfall[];
-extern const u8 EventScript_UseDive[];
-extern const u8 EventScript_UseDiveUnderwater[];
-extern const u8 EventScript_FallDownHole[];
-extern const u8 BattleFrontier_BattlePyramidEmptySquare_EventScript_252BE8[];
-extern const u8 EventScript_Poison[];
-extern const u8 EventScript_EggHatch[];
-extern const u8 gUnknown_08273D1F[];
-extern const u8 IslandCave_EventScript_238EAF[];
-extern const u8 MauvilleCity_EventScript_1DF7BA[];
-extern const u8 Route119_EventScript_1F49EC[];
-extern const u8 LittlerootTown_ProfessorBirchsLab_EventScript_1FA4D6[];
-extern const u8 RustboroCity_Gym_EventScript_21307B[];
-extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_224175[];
-extern const u8 SSTidalCorridor_EventScript_23C050[];
-extern const u8 gUnknown_082A8350[];
-
static void GetPlayerPosition(struct MapPosition *);
static void GetInFrontOfPlayerPosition(struct MapPosition *);
static u16 GetPlayerCurMetatileBehavior(int);
@@ -179,7 +129,7 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)
input->dpadDirection = DIR_EAST;
}
-int sub_809C014(struct FieldInput *input)
+int ProcessPlayerFieldInput(struct FieldInput *input)
{
struct MapPosition position;
u8 playerDirection;
@@ -558,8 +508,7 @@ static bool8 TryStartCoordEventScript(struct MapPosition *position)
static bool8 TryStartMiscWalkingScripts(u16 metatileBehavior)
{
- s16 x;
- s16 y;
+ s16 x, y;
if (MetatileBehavior_IsCrackedFloorHole(metatileBehavior))
{
diff --git a/src/field_door.c b/src/field_door.c
index fe9de01fd..c197aca14 100644
--- a/src/field_door.c
+++ b/src/field_door.c
@@ -1,13 +1,13 @@
#include "global.h"
+#include "event_data.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 "task.h"
#include "constants/flags.h"
#include "constants/maps.h"
-#include "task.h"
+#include "constants/songs.h"
bool8 sub_808A964(void);
diff --git a/src/field_effect.c b/src/field_effect.c
index 467acb367..2ec5edf1e 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -1,10 +1,10 @@
#include "global.h"
-#include "field_effect.h"
-#include "trainer_pokemon_sprites.h"
#include "decompress.h"
+#include "event_object_movement.h"
#include "field_camera.h"
+#include "field_control_avatar.h"
+#include "field_effect.h"
#include "field_effect_helpers.h"
-#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "field_screen.h"
#include "field_weather.h"
@@ -22,8 +22,11 @@
#include "sound.h"
#include "sprite.h"
#include "task.h"
+#include "trainer_pokemon_sprites.h"
#include "trig.h"
#include "util.h"
+#include "constants/field_effects.h"
+#include "constants/event_object_movement_constants.h"
#include "constants/rgb.h"
#include "constants/songs.h"
@@ -33,13 +36,213 @@ EWRAM_DATA s32 gFieldEffectArguments[8] = {0};
// Static type declarations
+static void Task_PokecenterHeal(u8 taskId);
+static void PokecenterHealEffect_0(struct Task *);
+static void PokecenterHealEffect_1(struct Task *);
+static void PokecenterHealEffect_2(struct Task *);
+static void PokecenterHealEffect_3(struct Task *);
+
+static void Task_HallOfFameRecord(u8 taskId);
+static void HallOfFameRecordEffect_0(struct Task *);
+static void HallOfFameRecordEffect_1(struct Task *);
+static void HallOfFameRecordEffect_2(struct Task *);
+static void HallOfFameRecordEffect_3(struct Task *);
+
+static u8 CreatePokeballGlowSprite(s16, s16, s16, u16);
+static void SpriteCB_PokeballGlowEffect(struct Sprite *);
+static void PokeballGlowEffect_0(struct Sprite *);
+static void PokeballGlowEffect_1(struct Sprite *);
+static void PokeballGlowEffect_2(struct Sprite *);
+static void PokeballGlowEffect_3(struct Sprite *);
+static void PokeballGlowEffect_4(struct Sprite *);
+static void PokeballGlowEffect_5(struct Sprite *);
+static void PokeballGlowEffect_6(struct Sprite *);
+static void PokeballGlowEffect_7(struct Sprite *);
+
+static u8 PokecenterHealEffectHelper(s16, s16);
+static void HallOfFameRecordEffectHelper(s16, s16, s16, u8);
+
+static void mapldr_080842E8(void);
+static void task00_8084310(u8);
+static void mapldr_08084390(void);
+static void c3_080843F8(u8);
+
+static void sub_80B6B94(u8);
+static bool8 sub_80B6BCC(struct Task *);
+static bool8 sub_80B6C74(struct Task *);
+static bool8 sub_80B6C90(struct Task *);
+static bool8 sub_80B6D04(struct Task *);
+static bool8 sub_80B6DBC(struct Task *);
+static bool8 sub_80B6DD8(struct Task *);
+static bool8 sub_80B6E18(struct Task *);
+
+static void sub_80B6E88(u8);
+static bool8 sub_80B6EC0(struct Task *);
+static bool8 sub_80B6EE0(struct Task *);
+static bool8 sub_80B6F50(struct Task *);
+static bool8 sub_80B6F74(struct Task *);
+static bool8 sub_80B6F84(struct Task *);
+static bool8 sub_80B6FA8(struct Task *);
+
+static void sub_80B6FB8(struct Task *);
+static void sub_80B7004(struct Task *);
+static void sub_80B7050(void);
+static void sub_80B7060(void);
+static void sub_80B70B4(void);
+static void sub_80B70DC(u8);
+
+static bool8 sub_80B7114(struct Task *);
+static bool8 sub_80B7190(struct Task *);
+static bool8 sub_80B71D0(struct Task *);
+static bool8 sub_80B7230(struct Task *);
+static bool8 sub_80B7270(struct Task *);
+static bool8 sub_80B72D0(struct Task *);
+static bool8 sub_80B72F4(struct Task *);
+
+static void sub_80B7384(u8);
+static bool8 sub_80B73D0(struct Task *, struct EventObject *);
+static bool8 waterfall_1_do_anim_probably(struct Task *, struct EventObject *);
+static bool8 waterfall_2_wait_anim_finish_probably(struct Task *, struct EventObject *);
+static bool8 sub_80B7450(struct Task *, struct EventObject *);
+static bool8 sub_80B7478(struct Task *, struct EventObject *);
+
+static void Task_Dive(u8);
+static bool8 dive_1_lock(struct Task *);
+static bool8 dive_2_unknown(struct Task *);
+static bool8 dive_3_unknown(struct Task *);
+
+static void sub_80B75F0(u8);
+static bool8 sub_80B764C(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7684(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B76B8(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7704(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B77F8(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7814(struct Task *, struct EventObject *, struct Sprite *);
+
+static void mapldr_080851BC(void);
+static void sub_80B7890(u8);
+
+static bool8 sub_80B78EC(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B791C(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7968(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B79BC(struct Task *, struct EventObject *, struct Sprite *);
+
+static void sub_80B7A8C(u8);
+
+static bool8 sub_80B7AE8(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7B18(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7B94(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7BCC(struct Task *, struct EventObject *, struct Sprite *);
+static bool8 sub_80B7BF4(struct Task *, struct EventObject *, struct Sprite *);
+
+static void DoEscapeRopeFieldEffect(u8);
+static void EscapeRopeFieldEffect_Step0(struct Task *);
+static void EscapeRopeFieldEffect_Step1(struct Task *);
+
+static void mapldr_080859D4(void);
+static void sub_80B7E94(u8);
+
+static void sub_80B7EC4(struct Task *);
+static void sub_80B7EE8(struct Task *);
+
+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);
+static void sub_80B8250(u8);
+
+static void sub_80B8280(struct Task *);
+static void sub_80B830C(struct Task *);
+static void sub_80B8410(struct Task *);
+
+static void sub_80B8554(u8);
+static void sub_80B8584(struct Task *);
+static void sub_80B85F8(struct Task *);
+static void sub_80B8660(struct Task *);
+static void sub_80B86EC(struct Task *);
+static void sub_80B871C(struct Task *);
+static void sub_80B8770(struct Task *);
+static void overworld_bg_setup_2(struct Task *);
+
+static void sub_80B880C(void);
+static void sub_80B8874(u16);
+
+static void sub_80B88B4(u8);
+static void sub_80B88E4(struct Task *);
+static void sub_80B8920(struct Task *);
+static void sub_80B898C(struct Task *);
+static void sub_80B89DC(struct Task *);
+static void sub_80B8A0C(struct Task *);
+static void sub_80B8A44(struct Task *);
+static void sub_80B8A64(struct Task *);
+
+static void sub_80B8AE0(void);
+static void sub_80B8B28(struct Task *);
+static bool8 sub_80B8B38(struct Task *);
+static bool8 sub_80B8BF0(struct Task *);
+
+static u8 sub_80B8C60(u32, u32, u32);
+static void sub_80B8CC0(struct Sprite *);
+static void sub_80B8D04(struct Sprite *);
+static void sub_80B8D20(struct Sprite *);
+
+static void sub_80B8D84(u8);
+static void sub_80B8DB4(struct Task *);
+static void sub_80B8E14(struct Task *);
+static void sub_80B8E60(struct Task *);
+static void sub_80B8EA8(struct Task *);
+static void sub_80B8F24(struct Task *);
+
+static void sub_80B9128(struct Sprite *);
+
+static void sub_80B91D4(u8);
+static void sub_80B9204(struct Task *);
+static void sub_80B925C(struct Task *);
+static void sub_80B92A0(struct Task *);
+static void sub_80B92F8(struct Task *);
+static void sub_80B933C(struct Task *);
+static void sub_80B9390(struct Task *);
+static void sub_80B9418(struct Task *);
+static void sub_80B9474(struct Task *);
+static void sub_80B9494(struct Task *);
+
+static u8 sub_80B94C4(void);
+static u8 sub_80B9508(u8);
+static void sub_80B9524(u8);
+static void sub_80B9560(u8, u8);
+static void sub_80B957C(struct Sprite *);
+static void sub_80B963C(struct Sprite *);
+
+static void sub_80B97D4(u8);
+static void sub_80B9804(struct Task *);
+static void sub_80B98B8(struct Task *);
+static void sub_80B9924(struct Task *);
+static void sub_80B9978(struct Task *);
+static void sub_80B99F0(struct Task *);
+static void sub_80B9A28(struct Task *);
+static void sub_80B9A60(struct Task *);
+
+static void sub_80B9BE8(u8 taskId);
+static void sub_80B9DB8(struct Sprite* sprite);
+static void sub_80B9EDC(u8 taskId);
+
// Static RAM declarations
static IWRAM_DATA u8 sActiveList[32];
-// Static ROM declarations
+// External declarations
extern u8 *gFieldEffectScriptPointers[];
+extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[];
+extern void sub_81555D8(u8, u8);
+extern void pal_fill_for_maplights(void);
+extern void sub_80E1558(u8);
+extern void sub_80E1570(void);
+extern bool8 sub_80E1584(void);
+extern void sub_80AF0B4(void);
// .rodata
const u32 gNewGameBirchPic[] = INCBIN_U32("graphics/birch_speech/birch.4bpp");
@@ -322,9 +525,9 @@ bool8 (*const gUnknown_0855C460[])(struct Task *, struct EventObject *, struct S
sub_80B7BF4,
};
-void (*const gUnknown_0855C474[])(struct Task *) = {
- sub_80B7D14,
- sub_80B7D34,
+void (*const gEscapeRopeFieldEffectFuncs[])(struct Task *) = {
+ EscapeRopeFieldEffect_Step0,
+ EscapeRopeFieldEffect_Step1,
};
// .text
@@ -807,10 +1010,6 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
}
#endif
-void Task_PokecenterHeal(u8 taskId);
-u8 CreatePokeballGlowSprite(s16, s16, s16, u16);
-u8 PokecenterHealEffectHelper(s16, s16);
-
bool8 FldEff_PokecenterHeal(void)
{
u8 nPokemon;
@@ -826,21 +1025,21 @@ bool8 FldEff_PokecenterHeal(void)
return FALSE;
}
-void Task_PokecenterHeal(u8 taskId)
+static void Task_PokecenterHeal(u8 taskId)
{
struct Task *task;
task = &gTasks[taskId];
gUnknown_0855C364[task->data[0]](task);
}
-void PokecenterHealEffect_0(struct Task *task)
+static 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)
+static void PokecenterHealEffect_1(struct Task *task)
{
if (gSprites[task->data[6]].data[0] > 1)
{
@@ -849,7 +1048,7 @@ void PokecenterHealEffect_1(struct Task *task)
}
}
-void PokecenterHealEffect_2(struct Task *task)
+static void PokecenterHealEffect_2(struct Task *task)
{
if (gSprites[task->data[6]].data[0] > 4)
{
@@ -857,7 +1056,7 @@ void PokecenterHealEffect_2(struct Task *task)
}
}
-void PokecenterHealEffect_3(struct Task *task)
+static void PokecenterHealEffect_3(struct Task *task)
{
if (gSprites[task->data[6]].data[0] > 6)
{
@@ -867,9 +1066,6 @@ void PokecenterHealEffect_3(struct Task *task)
}
}
-void Task_HallOfFameRecord(u8 taskId);
-void HallOfFameRecordEffectHelper(s16, s16, s16, u8);
-
bool8 FldEff_HallOfFameRecord(void)
{
u8 nPokemon;
@@ -883,14 +1079,14 @@ bool8 FldEff_HallOfFameRecord(void)
return FALSE;
}
-void Task_HallOfFameRecord(u8 taskId)
+static void Task_HallOfFameRecord(u8 taskId)
{
struct Task *task;
task = &gTasks[taskId];
gUnknown_0855C374[task->data[0]](task);
}
-void HallOfFameRecordEffect_0(struct Task *task)
+static void HallOfFameRecordEffect_0(struct Task *task)
{
u8 taskId;
task->data[0]++;
@@ -903,7 +1099,7 @@ void HallOfFameRecordEffect_0(struct Task *task)
HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1);
}
-void HallOfFameRecordEffect_1(struct Task *task)
+static void HallOfFameRecordEffect_1(struct Task *task)
{
if (gSprites[task->data[6]].data[0] > 1)
{
@@ -912,7 +1108,7 @@ void HallOfFameRecordEffect_1(struct Task *task)
}
}
-void HallOfFameRecordEffect_2(struct Task *task)
+static void HallOfFameRecordEffect_2(struct Task *task)
{
if (gSprites[task->data[6]].data[0] > 4)
{
@@ -920,7 +1116,7 @@ void HallOfFameRecordEffect_2(struct Task *task)
}
}
-void HallOfFameRecordEffect_3(struct Task *task)
+static void HallOfFameRecordEffect_3(struct Task *task)
{
if (gSprites[task->data[6]].data[0] > 6)
{
@@ -930,9 +1126,8 @@ void HallOfFameRecordEffect_3(struct Task *task)
}
}
-void SpriteCB_PokeballGlowEffect(struct Sprite *);
-u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5)
+static u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5)
{
u8 spriteId;
struct Sprite *sprite;
@@ -946,12 +1141,12 @@ u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5)
return spriteId;
}
-void SpriteCB_PokeballGlowEffect(struct Sprite *sprite)
+static void SpriteCB_PokeballGlowEffect(struct Sprite *sprite)
{
gUnknown_0855C384[sprite->data[0]](sprite);
}
-void PokeballGlowEffect_0(struct Sprite *sprite)
+static void PokeballGlowEffect_0(struct Sprite *sprite)
{
u8 endSpriteId;
if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
@@ -971,7 +1166,7 @@ void PokeballGlowEffect_0(struct Sprite *sprite)
}
}
-void PokeballGlowEffect_1(struct Sprite *sprite)
+static void PokeballGlowEffect_1(struct Sprite *sprite)
{
if ((--sprite->data[1]) == 0)
{
@@ -986,7 +1181,7 @@ void PokeballGlowEffect_1(struct Sprite *sprite)
}
}
-void PokeballGlowEffect_2(struct Sprite *sprite)
+static void PokeballGlowEffect_2(struct Sprite *sprite)
{
u8 phase;
if ((--sprite->data[1]) == 0)
@@ -1016,7 +1211,7 @@ void PokeballGlowEffect_2(struct Sprite *sprite)
}
}
-void PokeballGlowEffect_3(struct Sprite *sprite)
+static void PokeballGlowEffect_3(struct Sprite *sprite)
{
u8 phase;
if ((--sprite->data[1]) == 0)
@@ -1038,7 +1233,7 @@ void PokeballGlowEffect_3(struct Sprite *sprite)
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
}
-void PokeballGlowEffect_4(struct Sprite *sprite)
+static void PokeballGlowEffect_4(struct Sprite *sprite)
{
if ((--sprite->data[1]) == 0)
{
@@ -1046,12 +1241,12 @@ void PokeballGlowEffect_4(struct Sprite *sprite)
}
}
-void PokeballGlowEffect_5(struct Sprite *sprite)
+static void PokeballGlowEffect_5(struct Sprite *sprite)
{
sprite->data[0]++;
}
-void PokeballGlowEffect_6(struct Sprite *sprite)
+static void PokeballGlowEffect_6(struct Sprite *sprite)
{
if (sprite->data[5] == 0 || IsFanfareTaskInactive())
{
@@ -1059,7 +1254,7 @@ void PokeballGlowEffect_6(struct Sprite *sprite)
}
}
-void PokeballGlowEffect_7(struct Sprite *sprite)
+static void PokeballGlowEffect_7(struct Sprite *sprite)
{
}
@@ -1071,7 +1266,7 @@ void SpriteCB_PokeballGlow(struct Sprite *sprite)
}
}
-u8 PokecenterHealEffectHelper(s16 x, s16 y)
+static u8 PokecenterHealEffectHelper(s16 x, s16 y)
{
u8 spriteIdAtEnd;
struct Sprite *sprite;
@@ -1097,7 +1292,7 @@ void SpriteCB_PokecenterMonitor(struct Sprite *sprite)
}
}
-void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3)
+static void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3)
{
u8 spriteIdAtEnd;
if (!a3)
@@ -1129,10 +1324,6 @@ void SpriteCB_HallOfFameMonitor(struct Sprite *sprite)
}
}
-void mapldr_080842E8(void);
-void mapldr_08084390(void);
-void task00_8084310(u8);
-void c3_080843F8(u8);
void sub_80B69DC(void)
{
@@ -1140,7 +1331,7 @@ void sub_80B69DC(void)
gFieldCallback = mapldr_080842E8;
}
-void mapldr_080842E8(void)
+static void mapldr_080842E8(void)
{
pal_fill_black();
CreateTask(task00_8084310, 0);
@@ -1149,7 +1340,7 @@ void mapldr_080842E8(void)
gFieldCallback = NULL;
}
-void task00_8084310(u8 taskId)
+static void task00_8084310(u8 taskId)
{
struct Task *task;
task = &gTasks[taskId];
@@ -1177,7 +1368,7 @@ void task00_8084310(u8 taskId)
}
}
-void mapldr_08084390(void)
+static void mapldr_08084390(void)
{
Overworld_PlaySpecialMapMusic();
pal_fill_black();
@@ -1192,7 +1383,7 @@ void mapldr_08084390(void)
gFieldCallback = NULL;
}
-void c3_080843F8(u8 taskId)
+static void c3_080843F8(u8 taskId)
{
struct Task *task;
task = &gTasks[taskId];
@@ -1213,11 +1404,6 @@ void c3_080843F8(u8 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();
@@ -1228,14 +1414,14 @@ void sub_80B6B68(void)
gFieldCallback = NULL;
}
-void sub_80B6B94(u8 taskId)
+static 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]
+static bool8 sub_80B6BCC(struct Task *task) // gUnknown_0855C3C8[0]
{
struct EventObject *playerObject;
struct Sprite *playerSprite;
@@ -1253,7 +1439,7 @@ bool8 sub_80B6BCC(struct Task *task) // gUnknown_0855C3C8[0]
return TRUE;
}
-bool8 sub_80B6C74(struct Task *task) // gUnknown_0855C3C8[1]
+static bool8 sub_80B6C74(struct Task *task) // gUnknown_0855C3C8[1]
{
if (IsWeatherNotFadingIn())
{
@@ -1262,7 +1448,7 @@ bool8 sub_80B6C74(struct Task *task) // gUnknown_0855C3C8[1]
return FALSE;
}
-bool8 sub_80B6C90(struct Task *task) // gUnknown_0855C3C8[2]
+static bool8 sub_80B6C90(struct Task *task) // gUnknown_0855C3C8[2]
{
struct Sprite *sprite;
s16 centerToCornerVecY;
@@ -1277,7 +1463,7 @@ bool8 sub_80B6C90(struct Task *task) // gUnknown_0855C3C8[2]
return FALSE;
}
-bool8 sub_80B6D04(struct Task *task)
+static bool8 sub_80B6D04(struct Task *task)
{
struct EventObject *eventObject;
struct Sprite *sprite;
@@ -1311,7 +1497,7 @@ bool8 sub_80B6D04(struct Task *task)
return FALSE;
}
-bool8 sub_80B6DBC(struct Task *task)
+static bool8 sub_80B6DBC(struct Task *task)
{
task->data[0]++;
task->data[1] = 4;
@@ -1320,7 +1506,7 @@ bool8 sub_80B6DBC(struct Task *task)
return TRUE;
}
-bool8 sub_80B6DD8(struct Task *task)
+static bool8 sub_80B6DD8(struct Task *task)
{
SetCameraPanning(0, task->data[1]);
task->data[1] = -task->data[1];
@@ -1336,7 +1522,7 @@ bool8 sub_80B6DD8(struct Task *task)
return FALSE;
}
-bool8 sub_80B6E18(struct Task *task)
+static bool8 sub_80B6E18(struct Task *task)
{
gPlayerAvatar.preventStep = FALSE;
ScriptContext2_Disable();
@@ -1347,19 +1533,6 @@ bool8 sub_80B6E18(struct Task *task)
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 BGMusicStopped(void);
-void sub_80B70B4(void);
-void sub_80E1570(void);
-void sub_80B70DC(u8);
-
void sub_80B6E4C(u8 a0, u8 priority)
{
u8 taskId;
@@ -1371,14 +1544,14 @@ void sub_80B6E4C(u8 a0, u8 priority)
}
}
-void sub_80B6E88(u8 taskId)
+static void sub_80B6E88(u8 taskId)
{
struct Task *task;
task = &gTasks[taskId];
while (gUnknown_0855C3E4[task->data[0]](task));
}
-bool8 sub_80B6EC0(struct Task *task)
+static bool8 sub_80B6EC0(struct Task *task)
{
FreezeEventObjects();
CameraObjectReset2();
@@ -1387,7 +1560,7 @@ bool8 sub_80B6EC0(struct Task *task)
return FALSE;
}
-bool8 sub_80B6EE0(struct Task *task)
+static bool8 sub_80B6EE0(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -1406,7 +1579,7 @@ bool8 sub_80B6EE0(struct Task *task)
return FALSE;
}
-bool8 sub_80B6F50(struct Task *task)
+static bool8 sub_80B6F50(struct Task *task)
{
sub_80B6FB8(task);
if (task->data[2] > 3)
@@ -1417,14 +1590,14 @@ bool8 sub_80B6F50(struct Task *task)
return FALSE;
}
-bool8 sub_80B6F74(struct Task *task)
+static bool8 sub_80B6F74(struct Task *task)
{
sub_80B6FB8(task);
sub_80B7060();
return FALSE;
}
-bool8 sub_80B6F84(struct Task *task)
+static bool8 sub_80B6F84(struct Task *task)
{
sub_80B7004(task);
if (task->data[2] > 3)
@@ -1435,14 +1608,14 @@ bool8 sub_80B6F84(struct Task *task)
return FALSE;
}
-bool8 sub_80B6FA8(struct Task *task)
+static bool8 sub_80B6FA8(struct Task *task)
{
sub_80B7004(task);
sub_80B7060();
return FALSE;
}
-void sub_80B6FB8(struct Task *task)
+static void sub_80B6FB8(struct Task *task)
{
struct Sprite *sprite;
sprite = &gSprites[gPlayerAvatar.spriteId];
@@ -1455,7 +1628,7 @@ void sub_80B6FB8(struct Task *task)
}
}
-void sub_80B7004(struct Task *task)
+static void sub_80B7004(struct Task *task)
{
struct Sprite *sprite;
sprite = &gSprites[gPlayerAvatar.spriteId];
@@ -1468,13 +1641,13 @@ void sub_80B7004(struct Task *task)
}
}
-void sub_80B7050(void)
+static void sub_80B7050(void)
{
music_something();
sub_80AF0B4();
}
-void sub_80B7060(void)
+static void sub_80B7060(void)
{
if (!gPaletteFade.active && BGMusicStopped() == TRUE)
{
@@ -1486,7 +1659,7 @@ void sub_80B7060(void)
}
}
-void sub_80B70B4(void)
+static void sub_80B70B4(void)
{
Overworld_PlaySpecialMapMusic();
pal_fill_for_maplights();
@@ -1495,14 +1668,14 @@ void sub_80B70B4(void)
gFieldCallback = NULL;
}
-void sub_80B70DC(u8 taskId)
+static void sub_80B70DC(u8 taskId)
{
struct Task *task;
task = &gTasks[taskId];
while (gUnknown_0855C3FC[task->data[0]](task));
}
-bool8 sub_80B7114(struct Task *task)
+static bool8 sub_80B7114(struct Task *task)
{
struct EventObject *eventObject;
s16 x;
@@ -1527,7 +1700,7 @@ bool8 sub_80B7114(struct Task *task)
return TRUE;
}
-bool8 sub_80B7190(struct Task *task)
+static bool8 sub_80B7190(struct Task *task)
{
struct Sprite *sprite;
sprite = &gSprites[gPlayerAvatar.spriteId];
@@ -1537,7 +1710,7 @@ bool8 sub_80B7190(struct Task *task)
return FALSE;
}
-bool8 sub_80B71D0(struct Task *task)
+static bool8 sub_80B71D0(struct Task *task)
{
struct Sprite *sprite;
sprite = &gSprites[gPlayerAvatar.spriteId];
@@ -1557,7 +1730,7 @@ bool8 sub_80B71D0(struct Task *task)
return FALSE;
}
-bool8 sub_80B7230(struct Task *task)
+static bool8 sub_80B7230(struct Task *task)
{
struct Sprite *sprite;
sprite = &gSprites[gPlayerAvatar.spriteId];
@@ -1567,7 +1740,7 @@ bool8 sub_80B7230(struct Task *task)
return FALSE;
}
-bool8 sub_80B7270(struct Task *task)
+static bool8 sub_80B7270(struct Task *task)
{
struct Sprite *sprite;
sprite = &gSprites[gPlayerAvatar.spriteId];
@@ -1587,9 +1760,7 @@ bool8 sub_80B7270(struct Task *task)
return FALSE;
}
-extern bool8 sub_80E1584(void);
-
-bool8 sub_80B72D0(struct Task *task)
+static bool8 sub_80B72D0(struct Task *task)
{
if (sub_80E1584())
{
@@ -1600,7 +1771,7 @@ bool8 sub_80B72D0(struct Task *task)
return TRUE;
}
-bool8 sub_80B72F4(struct Task *task)
+static bool8 sub_80B72F4(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -1614,8 +1785,6 @@ bool8 sub_80B72F4(struct Task *task)
return FALSE;
}
-void sub_80B7384(u8);
-
bool8 FldEff_UseWaterfall(void)
{
u8 taskId;
@@ -1625,12 +1794,12 @@ bool8 FldEff_UseWaterfall(void)
return FALSE;
}
-void sub_80B7384(u8 taskId)
+static 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)
+static bool8 sub_80B73D0(struct Task *task, struct EventObject *eventObject)
{
ScriptContext2_Enable();
gPlayerAvatar.preventStep = TRUE;
@@ -1638,7 +1807,7 @@ bool8 sub_80B73D0(struct Task *task, struct EventObject *eventObject)
return FALSE;
}
-bool8 waterfall_1_do_anim_probably(struct Task *task, struct EventObject *eventObject)
+static bool8 waterfall_1_do_anim_probably(struct Task *task, struct EventObject *eventObject)
{
ScriptContext2_Enable();
if (!EventObjectIsMovementOverridden(eventObject))
@@ -1651,7 +1820,7 @@ bool8 waterfall_1_do_anim_probably(struct Task *task, struct EventObject *eventO
return FALSE;
}
-bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct EventObject *eventObject)
+static bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct EventObject *eventObject)
{
if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
{
@@ -1661,14 +1830,14 @@ bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct EventObjec
return TRUE;
}
-bool8 sub_80B7450(struct Task *task, struct EventObject *eventObject)
+static 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)
+static bool8 sub_80B7478(struct Task *task, struct EventObject *eventObject)
{
if (!EventObjectClearHeldMovementIfFinished(eventObject))
{
@@ -1686,9 +1855,6 @@ bool8 sub_80B7478(struct Task *task, struct EventObject *eventObject)
return FALSE;
}
-void Task_Dive(u8);
-extern int dive_warp(struct MapPosition *, u16);
-
bool8 FldEff_UseDive(void)
{
u8 taskId;
@@ -1704,14 +1870,14 @@ void Task_Dive(u8 taskId)
while (gUnknown_0855C42C[gTasks[taskId].data[0]](&gTasks[taskId]));
}
-bool8 dive_1_lock(struct Task *task)
+static bool8 dive_1_lock(struct Task *task)
{
gPlayerAvatar.preventStep = TRUE;
task->data[0]++;
return FALSE;
}
-bool8 dive_2_unknown(struct Task *task)
+static bool8 dive_2_unknown(struct Task *task)
{
ScriptContext2_Enable();
gFieldEffectArguments[0] = task->data[15];
@@ -1720,7 +1886,7 @@ bool8 dive_2_unknown(struct Task *task)
return FALSE;
}
-bool8 dive_3_unknown(struct Task *task)
+static bool8 dive_3_unknown(struct Task *task)
{
struct MapPosition mapPosition;
PlayerGetDestCoords(&mapPosition.x, &mapPosition.y);
@@ -1733,20 +1899,17 @@ bool8 dive_3_unknown(struct Task *task)
return FALSE;
}
-void sub_80B75F0(u8);
-void mapldr_080851BC(void);
-
void sub_80B75D8(u8 priority)
{
CreateTask(sub_80B75F0, priority);
}
-void sub_80B75F0(u8 taskId)
+static 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)
+static bool8 sub_80B764C(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
FreezeEventObjects();
CameraObjectReset2();
@@ -1758,7 +1921,7 @@ bool8 sub_80B764C(struct Task *task, struct EventObject *eventObject, struct Spr
return TRUE;
}
-bool8 sub_80B7684(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7684(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
SetCameraPanning(0, task->data[1]);
task->data[1] = -task->data[1];
@@ -1771,7 +1934,7 @@ bool8 sub_80B7684(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B76B8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B76B8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
sprite->pos2.y = 0;
task->data[3] = 1;
@@ -1785,7 +1948,7 @@ bool8 sub_80B76B8(struct Task *task, struct EventObject *eventObject, struct Spr
return TRUE;
}
-bool8 sub_80B7704(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7704(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
s16 centerToCornerVecY;
SetCameraPanning(0, task->data[1]);
@@ -1828,7 +1991,7 @@ bool8 sub_80B7704(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B77F8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B77F8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
music_something();
sub_80AF0B4();
@@ -1836,7 +1999,7 @@ bool8 sub_80B77F8(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B7814(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7814(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
if (!gPaletteFade.active && BGMusicStopped() == TRUE)
{
@@ -1848,9 +2011,7 @@ bool8 sub_80B7814(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-void sub_80B7890(u8);
-
-void mapldr_080851BC(void)
+static void mapldr_080851BC(void)
{
Overworld_PlaySpecialMapMusic();
pal_fill_for_maplights();
@@ -1859,12 +2020,12 @@ void mapldr_080851BC(void)
CreateTask(sub_80B7890, 0);
}
-void sub_80B7890(u8 taskId)
+static 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)
+static bool8 sub_80B78EC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
CameraObjectReset2();
FreezeEventObjects();
@@ -1874,7 +2035,7 @@ bool8 sub_80B78EC(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B791C(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B791C(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
if (IsWeatherNotFadingIn())
{
@@ -1888,7 +2049,7 @@ bool8 sub_80B791C(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B7968(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7968(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
sprite = &gSprites[task->data[1]];
if (sprite->animCmdIndex > 1)
@@ -1902,7 +2063,7 @@ bool8 sub_80B7968(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B79BC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B79BC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
if (EventObjectClearHeldMovementIfFinished(eventObject))
{
@@ -1914,8 +2075,6 @@ bool8 sub_80B79BC(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36];
-
u8 FldEff_LavaridgeGymWarp(void)
{
u8 spriteId;
@@ -1934,19 +2093,17 @@ void sub_80B7A58(struct Sprite *sprite)
}
}
-void sub_80B7A8C(u8);
-
void sub_80B7A74(u8 priority)
{
CreateTask(sub_80B7A8C, priority);
}
-void sub_80B7A8C(u8 taskId)
+static 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)
+static bool8 sub_80B7AE8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
FreezeEventObjects();
CameraObjectReset2();
@@ -1956,7 +2113,7 @@ bool8 sub_80B7AE8(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B7B18(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7B18(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
if (EventObjectClearHeldMovementIfFinished(eventObject))
{
@@ -1978,7 +2135,7 @@ bool8 sub_80B7B18(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B7B94(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7B94(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
if (gSprites[task->data[1]].animCmdIndex == 2)
{
@@ -1988,7 +2145,7 @@ bool8 sub_80B7B94(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-bool8 sub_80B7BCC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7BCC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH))
{
@@ -1999,10 +2156,7 @@ bool8 sub_80B7BCC(struct Task *task, struct EventObject *eventObject, struct Spr
return FALSE;
}
-void sub_80B7CE4(u8);
-void mapldr_080859D4(void);
-
-bool8 sub_80B7BF4(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
+static bool8 sub_80B7BF4(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite)
{
if (!gPaletteFade.active && BGMusicStopped() == TRUE)
{
@@ -2032,29 +2186,29 @@ void sub_80B7CAC(struct Sprite *sprite)
}
}
-void sub_80B7CC8(void)
+void StartEscapeRopeFieldEffect(void)
{
ScriptContext2_Enable();
FreezeEventObjects();
- CreateTask(sub_80B7CE4, 0x50);
+ CreateTask(DoEscapeRopeFieldEffect, 0x50);
}
-void sub_80B7CE4(u8 taskId)
+static void DoEscapeRopeFieldEffect(u8 taskId)
{
- gUnknown_0855C474[gTasks[taskId].data[0]](&gTasks[taskId]);
+ gEscapeRopeFieldEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B7D14(struct Task *task)
+static void EscapeRopeFieldEffect_Step0(struct Task *task)
{
task->data[0]++;
task->data[14] = 64;
task->data[15] = GetPlayerFacingDirection();
}
-void sub_80B7D34(struct Task *task)
+static void EscapeRopeFieldEffect_Step1(struct Task *task)
{
struct EventObject *eventObject;
- u8 spinDirections[5] = {1, 3, 4, 2, 1};
+ u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
if (task->data[14] != 0 && (--task->data[14]) == 0)
{
music_something();
@@ -2070,7 +2224,7 @@ void sub_80B7D34(struct Task *task)
WarpIntoMap();
gFieldCallback = mapldr_080859D4;
SetMainCallback2(CB2_LoadMap);
- DestroyTask(FindTaskIdByFunc(sub_80B7CE4));
+ DestroyTask(FindTaskIdByFunc(DoEscapeRopeFieldEffect));
} else if (task->data[1] == 0 || (--task->data[1]) == 0)
{
EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(spinDirections[eventObject->facingDirection]));
@@ -2088,9 +2242,7 @@ void (*const gUnknown_0855C484[])(struct Task *) = {
sub_80B7EE8
};
-void sub_80B7E94(u8);
-
-void mapldr_080859D4(void)
+static void mapldr_080859D4(void)
{
Overworld_PlaySpecialMapMusic();
pal_fill_for_maplights();
@@ -2101,12 +2253,12 @@ void mapldr_080859D4(void)
CreateTask(sub_80B7E94, 0);
}
-void sub_80B7E94(u8 taskId)
+static void sub_80B7E94(u8 taskId)
{
gUnknown_0855C484[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B7EC4(struct Task *task)
+static void sub_80B7EC4(struct Task *task)
{
if (IsWeatherNotFadingIn())
{
@@ -2115,7 +2267,7 @@ void sub_80B7EC4(struct Task *task)
}
}
-void sub_80B7EE8(struct Task *task)
+static void sub_80B7EE8(struct Task *task)
{
u8 spinDirections[5] = {1, 3, 4, 2, 1};
struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -2143,13 +2295,6 @@ void sub_80B7EE8(struct Task *task)
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);
@@ -2245,8 +2390,6 @@ static void TeleportFieldEffectTask4(struct Task *task)
}
}
-void sub_80B8250(u8);
-
static void mapldr_08085D88(void)
{
Overworld_PlaySpecialMapMusic();
@@ -2265,12 +2408,12 @@ void (*const gUnknown_0855C49C[])(struct Task *) = {
sub_80B8410
};
-void sub_80B8250(u8 taskId)
+static void sub_80B8250(u8 taskId)
{
gUnknown_0855C49C[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B8280(struct Task *task)
+static void sub_80B8280(struct Task *task)
{
struct Sprite *sprite;
s16 centerToCornerVecY;
@@ -2289,7 +2432,7 @@ void sub_80B8280(struct Task *task)
}
}
-void sub_80B830C(struct Task *task)
+static void sub_80B830C(struct Task *task)
{
u8 spinDirections[5] = {1, 3, 4, 2, 1};
struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -2328,7 +2471,7 @@ void sub_80B830C(struct Task *task)
}
}
-void sub_80B8410(struct Task *task)
+static void sub_80B8410(struct Task *task)
{
u8 spinDirections[5] = {1, 3, 4, 2, 1};
struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -2346,13 +2489,6 @@ void sub_80B8410(struct Task *task)
}
}
-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;
@@ -2391,12 +2527,12 @@ void (*const gUnknown_0855C4A8[])(struct Task *) = {
overworld_bg_setup_2,
};
-void sub_80B8554(u8 taskId)
+static void sub_80B8554(u8 taskId)
{
gUnknown_0855C4A8[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B8584(struct Task *task)
+static void sub_80B8584(struct Task *task)
{
task->data[11] = REG_WININ;
task->data[12] = REG_WINOUT;
@@ -2413,7 +2549,7 @@ void sub_80B8584(struct Task *task)
task->data[0]++;
}
-void sub_80B85F8(struct Task *task)
+static void sub_80B85F8(struct Task *task)
{
u16 offset;
u16 delta;
@@ -2426,7 +2562,7 @@ void sub_80B85F8(struct Task *task)
task->data[0]++;
}
-void sub_80B8660(struct Task *task)
+static void sub_80B8660(struct Task *task)
{
s16 v0;
s16 v2;
@@ -2459,7 +2595,7 @@ void sub_80B8660(struct Task *task)
}
}
-void sub_80B86EC(struct Task *task)
+static void sub_80B86EC(struct Task *task)
{
task->data[5] -= 16;
if (gSprites[task->data[15]].data[7])
@@ -2468,7 +2604,7 @@ void sub_80B86EC(struct Task *task)
}
}
-void sub_80B871C(struct Task *task)
+static void sub_80B871C(struct Task *task)
{
s16 v2;
s16 v3;
@@ -2492,7 +2628,7 @@ void sub_80B871C(struct Task *task)
}
}
-void sub_80B8770(struct Task *task)
+static void sub_80B8770(struct Task *task)
{
u16 bg0cnt;
bg0cnt = (REG_BG0CNT >> 8) << 11;
@@ -2504,7 +2640,7 @@ void sub_80B8770(struct Task *task)
task->data[0]++;
}
-void overworld_bg_setup_2(struct Task *task)
+static void overworld_bg_setup_2(struct Task *task)
{
IntrCallback callback;
LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback);
@@ -2515,7 +2651,7 @@ void overworld_bg_setup_2(struct Task *task)
DestroyTask(FindTaskIdByFunc(sub_80B8554));
}
-void sub_80B880C(void)
+static void sub_80B880C(void)
{
struct Task *task;
IntrCallback callback;
@@ -2530,7 +2666,7 @@ void sub_80B880C(void)
SetGpuReg(REG_OFFSET_BG0VOFS, task->data[6]);
}
-void sub_80B8874(u16 offs)
+static void sub_80B8874(u16 offs)
{
u16 i;
u16 *dest;
@@ -2541,11 +2677,6 @@ void sub_80B8874(u16 offs)
}
}
-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,
@@ -2556,12 +2687,12 @@ void (*const gUnknown_0855C4C4[])(struct Task *) = {
sub_80B8A64,
};
-void sub_80B88B4(u8 taskId)
+static void sub_80B88B4(u8 taskId)
{
gUnknown_0855C4C4[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B88E4(struct Task *task)
+static void sub_80B88E4(struct Task *task)
{
SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]);
SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
@@ -2570,7 +2701,7 @@ void sub_80B88E4(struct Task *task)
task->data[0]++;
}
-void sub_80B8920(struct Task *task)
+static void sub_80B8920(struct Task *task)
{
u16 offset;
u16 delta;
@@ -2583,7 +2714,7 @@ void sub_80B8920(struct Task *task)
task->data[0]++;
}
-void sub_80B898C(struct Task *task)
+static void sub_80B898C(struct Task *task)
{
if (sub_80B8B38(task))
{
@@ -2595,7 +2726,7 @@ void sub_80B898C(struct Task *task)
sub_80B8B28(task);
}
-void sub_80B89DC(struct Task *task)
+static void sub_80B89DC(struct Task *task)
{
sub_80B8B28(task);
if (gSprites[task->data[15]].data[7])
@@ -2604,7 +2735,7 @@ void sub_80B89DC(struct Task *task)
}
}
-void sub_80B8A0C(struct Task *task)
+static void sub_80B8A0C(struct Task *task)
{
sub_80B8B28(task);
task->data[3] = task->data[1] & 7;
@@ -2614,7 +2745,7 @@ void sub_80B8A0C(struct Task *task)
task->data[0]++;
}
-void sub_80B8A44(struct Task *task)
+static void sub_80B8A44(struct Task *task)
{
sub_80B8B28(task);
if (sub_80B8BF0(task))
@@ -2623,7 +2754,7 @@ void sub_80B8A44(struct Task *task)
}
}
-void sub_80B8A64(struct Task *task)
+static void sub_80B8A64(struct Task *task)
{
IntrCallback intrCallback;
u16 bg0cnt;
@@ -2637,7 +2768,7 @@ void sub_80B8A64(struct Task *task)
DestroyTask(FindTaskIdByFunc(sub_80B88B4));
}
-void sub_80B8AE0(void)
+static void sub_80B8AE0(void)
{
IntrCallback intrCallback;
struct Task *task;
@@ -2648,14 +2779,14 @@ void sub_80B8AE0(void)
SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]);
}
-void sub_80B8B28(struct Task *task)
+static void sub_80B8B28(struct Task *task)
{
task->data[1] -= 16;
task->data[3] += 16;
}
#ifdef NONMATCHING
-bool8 sub_80B8B38(struct Task *task)
+static bool8 sub_80B8B38(struct Task *task)
{
u16 i;
u16 srcOffs;
@@ -2682,7 +2813,7 @@ bool8 sub_80B8B38(struct Task *task)
}
#else
NAKED
-bool8 sub_80B8B38(struct Task *task)
+static bool8 sub_80B8B38(struct Task *task)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmov r7, r10\n"
@@ -2782,7 +2913,7 @@ bool8 sub_80B8B38(struct Task *task)
}
#endif
-bool8 sub_80B8BF0(struct Task *task)
+static bool8 sub_80B8BF0(struct Task *task)
{
u16 i;
u16 dstOffs;
@@ -2806,7 +2937,7 @@ bool8 sub_80B8BF0(struct Task *task)
return FALSE;
}
-u8 sub_80B8C60(u32 a0, u32 a1, u32 a2)
+static u8 sub_80B8C60(u32 a0, u32 a1, u32 a2)
{
u16 v0;
u8 monSprite;
@@ -2822,9 +2953,7 @@ u8 sub_80B8C60(u32 a0, u32 a1, u32 a2)
return monSprite;
}
-void sub_80B8D04(struct Sprite *);
-
-void sub_80B8CC0(struct Sprite *sprite)
+static void sub_80B8CC0(struct Sprite *sprite)
{
if ((sprite->pos1.x -= 20) <= 0x78)
{
@@ -2841,9 +2970,7 @@ void sub_80B8CC0(struct Sprite *sprite)
}
}
-void sub_80B8D20(struct Sprite *);
-
-void sub_80B8D04(struct Sprite *sprite)
+static void sub_80B8D04(struct Sprite *sprite)
{
if ((--sprite->data[1]) == 0)
{
@@ -2851,7 +2978,7 @@ void sub_80B8D04(struct Sprite *sprite)
}
}
-void sub_80B8D20(struct Sprite *sprite)
+static void sub_80B8D20(struct Sprite *sprite)
{
if (sprite->pos1.x < -0x40)
{
@@ -2862,8 +2989,6 @@ void sub_80B8D20(struct Sprite *sprite)
}
}
-void sub_80B8D84(u8);
-
u8 FldEff_UseSurf(void)
{
u8 taskId;
@@ -2882,12 +3007,12 @@ void (*const gUnknown_0855C4E0[])(struct Task *) = {
sub_80B8F24,
};
-void sub_80B8D84(u8 taskId)
+static void sub_80B8D84(u8 taskId)
{
gUnknown_0855C4E0[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B8DB4(struct Task *task)
+static void sub_80B8DB4(struct Task *task)
{
ScriptContext2_Enable();
FreezeEventObjects();
@@ -2898,19 +3023,19 @@ void sub_80B8DB4(struct Task *task)
task->data[0]++;
}
-void sub_80B8E14(struct Task *task)
+static void sub_80B8E14(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject))
{
sub_808C114();
- EventObjectSetHeldMovement(eventObject, 0x39);
+ EventObjectSetHeldMovement(eventObject, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
task->data[0]++;
}
}
-void sub_80B8E60(struct Task *task)
+static void sub_80B8E60(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -2922,7 +3047,7 @@ void sub_80B8E60(struct Task *task)
}
}
-void sub_80B8EA8(struct Task *task)
+static void sub_80B8EA8(struct Task *task)
{
struct EventObject *eventObject;
if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
@@ -2939,7 +3064,7 @@ void sub_80B8EA8(struct Task *task)
}
}
-void sub_80B8F24(struct Task *task)
+static void sub_80B8F24(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -3129,8 +3254,6 @@ _080B9050:\n\
}
#endif // NONMATCHING
-void sub_80B9128(struct Sprite *);
-
u8 FldEff_NPCFlyOut(void)
{
u8 spriteId;
@@ -3145,7 +3268,7 @@ u8 FldEff_NPCFlyOut(void)
return spriteId;
}
-void sub_80B9128(struct Sprite *sprite)
+static void sub_80B9128(struct Sprite *sprite)
{
struct Sprite *npcSprite;
sprite->pos2.x = Cos(sprite->data[2], 0x8c);
@@ -3166,15 +3289,6 @@ void sub_80B9128(struct Sprite *sprite)
}
}
-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;
@@ -3195,12 +3309,12 @@ void (*const gUnknown_0855C4F4[])(struct Task *) = {
sub_80B9494,
};
-void sub_80B91D4(u8 taskId)
+static void sub_80B91D4(u8 taskId)
{
gUnknown_0855C4F4[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B9204(struct Task *task)
+static void sub_80B9204(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -3210,12 +3324,12 @@ void sub_80B9204(struct Task *task)
gPlayerAvatar.preventStep = TRUE;
SetPlayerAvatarStateMask(1);
sub_808C114();
- EventObjectSetHeldMovement(eventObject, 0x39);
+ EventObjectSetHeldMovement(eventObject, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
task->data[0]++;
}
}
-void sub_80B925C(struct Task *task)
+static void sub_80B925C(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -3227,7 +3341,7 @@ void sub_80B925C(struct Task *task)
}
}
-void sub_80B92A0(struct Task *task)
+static void sub_80B92A0(struct Task *task)
{
struct EventObject *eventObject;
if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
@@ -3243,18 +3357,18 @@ void sub_80B92A0(struct Task *task)
}
}
-void sub_80B92F8(struct Task *task)
+static 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);
+ EventObjectSetHeldMovement(&gEventObjects[gPlayerAvatar.eventObjectId], MOVEMENT_ACTION_FACE_LEFT);
}
}
-void sub_80B933C(struct Task *task)
+static void sub_80B933C(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -3266,7 +3380,7 @@ void sub_80B933C(struct Task *task)
}
}
-void sub_80B9390(struct Task *task)
+static void sub_80B9390(struct Task *task)
{
struct EventObject *eventObject;
if ((++task->data[2]) >= 8)
@@ -3275,7 +3389,7 @@ void sub_80B9390(struct Task *task)
EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(0x03));
StartSpriteAnim(&gSprites[eventObject->spriteId], 0x16);
eventObject->inanimate = 1;
- EventObjectSetHeldMovement(eventObject, 0x48);
+ EventObjectSetHeldMovement(eventObject, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT);
if (task->data[15] & 0x08)
{
DestroySprite(&gSprites[eventObject->fieldEffectSpriteId]);
@@ -3285,7 +3399,7 @@ void sub_80B9390(struct Task *task)
}
}
-void sub_80B9418(struct Task *task)
+static void sub_80B9418(struct Task *task)
{
struct EventObject *eventObject;
if ((++task->data[2]) >= 10)
@@ -3300,7 +3414,7 @@ void sub_80B9418(struct Task *task)
}
}
-void sub_80B9474(struct Task *task)
+static void sub_80B9474(struct Task *task)
{
if (sub_80B9508(task->data[1]))
{
@@ -3309,7 +3423,7 @@ void sub_80B9474(struct Task *task)
}
}
-void sub_80B9494(struct Task *task)
+static void sub_80B9494(struct Task *task)
{
if (!gPaletteFade.active)
{
@@ -3318,7 +3432,7 @@ void sub_80B9494(struct Task *task)
}
}
-u8 sub_80B94C4(void)
+static u8 sub_80B94C4(void)
{
u8 spriteId;
struct Sprite *sprite;
@@ -3330,12 +3444,12 @@ u8 sub_80B94C4(void)
return spriteId;
}
-u8 sub_80B9508(u8 spriteId)
+static u8 sub_80B9508(u8 spriteId)
{
return gSprites[spriteId].data[7];
}
-void sub_80B9524(u8 spriteId)
+static void sub_80B9524(u8 spriteId)
{
struct Sprite *sprite;
sprite = &gSprites[spriteId];
@@ -3348,7 +3462,7 @@ void sub_80B9524(u8 spriteId)
sprite->data[6] = 0x40;
}
-void sub_80B9560(u8 a0, u8 a1)
+static void sub_80B9560(u8 a0, u8 a1)
{
gSprites[a0].data[6] = a1;
}
@@ -3370,7 +3484,7 @@ const union AffineAnimCmd *const gSpriteAffineAnimTable_0855C548[] = {
SpriteAffineAnim_855C530
};
-void sub_80B957C(struct Sprite *sprite)
+static void sub_80B957C(struct Sprite *sprite)
{
if (sprite->data[7] == 0)
{
@@ -3403,7 +3517,7 @@ void sub_80B957C(struct Sprite *sprite)
}
}
-void sub_80B963C(struct Sprite *sprite)
+static void sub_80B963C(struct Sprite *sprite)
{
struct Sprite *sprite1;
sprite->pos2.x = Cos(sprite->data[2], 0x8c);
@@ -3474,8 +3588,6 @@ void sub_80B9794(u8 spriteId)
gSprites[spriteId].callback = sub_80B96B0;
}
-void sub_80B97D4(u8);
-
u8 FldEff_FlyIn(void)
{
CreateTask(sub_80B97D4, 0xfe);
@@ -3492,12 +3604,12 @@ void (*const gUnknown_0855C550[])(struct Task *) = {
sub_80B9A60,
};
-void sub_80B97D4(u8 taskId)
+static void sub_80B97D4(u8 taskId)
{
gUnknown_0855C550[gTasks[taskId].data[0]](&gTasks[taskId]);
}
-void sub_80B9804(struct Task *task)
+static void sub_80B9804(struct Task *task)
{
struct EventObject *eventObject;
eventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -3523,7 +3635,7 @@ void sub_80B9804(struct Task *task)
}
}
-void sub_80B98B8(struct Task *task)
+static void sub_80B98B8(struct Task *task)
{
struct EventObject *eventObject;
struct Sprite *sprite;
@@ -3541,7 +3653,7 @@ void sub_80B98B8(struct Task *task)
}
}
-void sub_80B9924(struct Task *task)
+static void sub_80B9924(struct Task *task)
{
s16 unknown_0855C56C[18] = {
-2,
@@ -3571,7 +3683,7 @@ void sub_80B9924(struct Task *task)
}
}
-void sub_80B9978(struct Task *task)
+static void sub_80B9978(struct Task *task)
{
struct EventObject *eventObject;
struct Sprite *sprite;
@@ -3585,12 +3697,12 @@ void sub_80B9978(struct Task *task)
sprite->pos2.y = 0;
sprite->coordOffsetEnabled = 1;
sub_808C114();
- EventObjectSetHeldMovement(eventObject, 0x39);
+ EventObjectSetHeldMovement(eventObject, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
task->data[0]++;
}
}
-void sub_80B99F0(struct Task *task)
+static void sub_80B99F0(struct Task *task)
{
if (EventObjectClearHeldMovementIfFinished(&gEventObjects[gPlayerAvatar.eventObjectId]))
{
@@ -3599,7 +3711,7 @@ void sub_80B99F0(struct Task *task)
}
}
-void sub_80B9A28(struct Task *task)
+static void sub_80B9A28(struct Task *task)
{
if (sub_80B9508(task->data[1]))
{
@@ -3609,7 +3721,7 @@ void sub_80B9A28(struct Task *task)
}
}
-void sub_80B9A60(struct Task *task)
+static void sub_80B9A60(struct Task *task)
{
u8 state;
struct EventObject *eventObject;
@@ -3631,8 +3743,6 @@ void sub_80B9A60(struct Task *task)
}
}
-void sub_80B9BE8(u8 taskId);
-
bool8 sub_80B9ADC(void)
{
u8 taskId;
@@ -3697,7 +3807,7 @@ void (*const gUnknown_0855C590[])(s16*, u8) = {
sub_80B9CDC,
};
-void sub_80B9BE8(u8 taskId)
+static void sub_80B9BE8(u8 taskId)
{
s16 *data = gTasks[taskId].data;
InstallCameraPanAheadCallback();
@@ -3742,8 +3852,6 @@ void sub_80B9CDC(s16* a0, u8 taskId)
}
}
-void sub_80B9DB8(struct Sprite* sprite);
-
const struct SpriteFrameImage gSpriteImageTable_855C59C[] = {
obj_frame_tiles(gUnknown_0855C170),
obj_frame_tiles(gUnknown_0855C190),
@@ -3791,8 +3899,8 @@ const struct SpriteTemplate gUnknown_0855C5EC = {
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;
+ int xPos = (s16)gTotalCameraPixelOffsetX + sprite->pos1.x + sprite->pos2.x;
+ int yPos = (s16)gTotalCameraPixelOffsetY + sprite->pos1.y + sprite->pos2.y - 4;
for (i = 0; i < 4; i++)
{
@@ -3806,7 +3914,7 @@ void sub_80B9D24(struct Sprite* sprite)
}
}
-void sub_80B9DB8(struct Sprite* sprite)
+static void sub_80B9DB8(struct Sprite* sprite)
{
switch (sprite->data[0])
{
@@ -3831,8 +3939,6 @@ void sub_80B9DB8(struct Sprite* sprite)
DestroySprite(sprite);
}
-void sub_80B9EDC(u8 taskId);
-
bool8 sub_80B9E28(struct Sprite* sprite)
{
u8 eventObjectIdBuffer;
@@ -3857,7 +3963,7 @@ bool8 sub_80B9E28(struct Sprite* sprite)
return FALSE;
}
-void sub_80B9EDC(u8 taskId)
+static void sub_80B9EDC(u8 taskId)
{
// BUG: Possible divide by zero
s16 *data = gTasks[taskId].data;
diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c
index 3534e0a71..856f7d5ef 100755
--- a/src/field_effect_helpers.c
+++ b/src/field_effect_helpers.c
@@ -10,26 +10,27 @@
#include "sound.h"
#include "sprite.h"
#include "trig.h"
+#include "constants/field_effects.h"
#include "constants/songs.h"
#define EVENT_OBJ_PAL_TAG_NONE 0x11FF // duplicate of define in event_object_movement.c
-void UpdateObjectReflectionSprite(struct Sprite *);
-void LoadObjectReflectionPalette(struct EventObject *eventObject, struct Sprite *sprite);
-void LoadObjectHighBridgeReflectionPalette(struct EventObject *, u8);
-void LoadObjectRegularReflectionPalette(struct EventObject *, u8);
-void sub_81561FC(struct Sprite *, u8, u8);
-void FadeFootprintsTireTracks_Step0(struct Sprite *);
-void FadeFootprintsTireTracks_Step1(struct Sprite *);
-void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *);
-void UpdateAshFieldEffect_Step0(struct Sprite *);
-void UpdateAshFieldEffect_Step1(struct Sprite *);
-void UpdateAshFieldEffect_Step2(struct Sprite *);
-void sub_81556B0(struct EventObject *, struct Sprite *);
-void sub_81556E8(struct EventObject *, struct Sprite *);
-void sub_815577C(struct EventObject *, struct Sprite *, struct Sprite *);
-void sub_8155850(struct Sprite *);
-u32 ShowDisguiseFieldEffect(u8, u8, u8);
+static void UpdateObjectReflectionSprite(struct Sprite *);
+static void LoadObjectReflectionPalette(struct EventObject *eventObject, struct Sprite *sprite);
+static void LoadObjectHighBridgeReflectionPalette(struct EventObject *, u8);
+static void LoadObjectRegularReflectionPalette(struct EventObject *, u8);
+static void sub_81561FC(struct Sprite *, u8, u8);
+static void FadeFootprintsTireTracks_Step0(struct Sprite *);
+static void FadeFootprintsTireTracks_Step1(struct Sprite *);
+static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *);
+static void UpdateAshFieldEffect_Step0(struct Sprite *);
+static void UpdateAshFieldEffect_Step1(struct Sprite *);
+static void UpdateAshFieldEffect_Step2(struct Sprite *);
+static void SynchroniseSurfAnim(struct EventObject *, struct Sprite *);
+static void sub_81556E8(struct EventObject *, struct Sprite *);
+static void CreateBobbingEffect(struct EventObject *, struct Sprite *, struct Sprite *);
+static void sub_8155850(struct Sprite *);
+static u32 ShowDisguiseFieldEffect(u8, u8, u8);
void SetUpReflection(struct EventObject *eventObject, struct Sprite *sprite, bool8 stillReflection)
{
@@ -59,12 +60,12 @@ static s16 GetReflectionVerticalOffset(struct EventObject *eventObject)
return GetEventObjectGraphicsInfo(eventObject->graphicsId)->height - 2;
}
-void LoadObjectReflectionPalette(struct EventObject *eventObject, struct Sprite *sprite)
+static void LoadObjectReflectionPalette(struct EventObject *eventObject, struct Sprite *sprite)
{
u8 bridgeType;
u16 bridgeReflectionVerticalOffsets[] = { 12, 28, 44 };
sprite->data[2] = 0;
- if (!GetEventObjectGraphicsInfo(eventObject->graphicsId)->disableReflectionPaletteLoad && ((bridgeType = MetatileBehavior_GetBridgeSth(eventObject->previousMetatileBehavior)) || (bridgeType = MetatileBehavior_GetBridgeSth(eventObject->currentMetatileBehavior))))
+ if (!GetEventObjectGraphicsInfo(eventObject->graphicsId)->disableReflectionPaletteLoad && ((bridgeType = MetatileBehavior_GetBridgeType(eventObject->previousMetatileBehavior)) || (bridgeType = MetatileBehavior_GetBridgeType(eventObject->currentMetatileBehavior))))
{
sprite->data[2] = bridgeReflectionVerticalOffsets[bridgeType - 1];
LoadObjectHighBridgeReflectionPalette(eventObject, sprite->oam.paletteNum);
@@ -75,7 +76,7 @@ void LoadObjectReflectionPalette(struct EventObject *eventObject, struct Sprite
}
}
-void LoadObjectRegularReflectionPalette(struct EventObject *eventObject, u8 paletteIndex)
+static void LoadObjectRegularReflectionPalette(struct EventObject *eventObject, u8 paletteIndex)
{
const struct EventObjectGraphicsInfo *graphicsInfo;
@@ -100,7 +101,7 @@ void LoadObjectRegularReflectionPalette(struct EventObject *eventObject, u8 pale
// When walking on a bridge high above water (Route 120), the reflection is a solid dark blue color.
// This is so the sprite blends in with the dark water metatile underneath the bridge.
-void LoadObjectHighBridgeReflectionPalette(struct EventObject *eventObject, u8 paletteNum)
+static void LoadObjectHighBridgeReflectionPalette(struct EventObject *eventObject, u8 paletteNum)
{
const struct EventObjectGraphicsInfo *graphicsInfo;
@@ -112,7 +113,7 @@ void LoadObjectHighBridgeReflectionPalette(struct EventObject *eventObject, u8 p
}
}
-void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite)
+static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite)
{
struct EventObject *eventObject;
struct Sprite *mainSprite;
@@ -579,7 +580,7 @@ void UpdateFootprintsTireTracksFieldEffect(struct Sprite *sprite)
gFadeFootprintsTireTracksFuncs[sprite->data[0]](sprite);
}
-void FadeFootprintsTireTracks_Step0(struct Sprite *sprite)
+static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite)
{
// Wait 40 frames before the flickering starts.
if (++sprite->data[1] > 40)
@@ -588,7 +589,7 @@ void FadeFootprintsTireTracks_Step0(struct Sprite *sprite)
UpdateEventObjectSpriteVisibility(sprite, FALSE);
}
-void FadeFootprintsTireTracks_Step1(struct Sprite *sprite)
+static void FadeFootprintsTireTracks_Step1(struct Sprite *sprite)
{
sprite->invisible ^= 1;
sprite->data[1]++;
@@ -708,7 +709,7 @@ u32 FldEff_FeetInFlowingWater(void)
return 0;
}
-void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite)
+static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite)
{
u8 eventObjectId;
struct Sprite *linkedSprite;
@@ -913,7 +914,7 @@ void UpdateAshFieldEffect(struct Sprite *sprite)
gAshFieldEffectFuncs[sprite->data[0]](sprite);
}
-void UpdateAshFieldEffect_Step0(struct Sprite *sprite)
+static void UpdateAshFieldEffect_Step0(struct Sprite *sprite)
{
sprite->invisible = TRUE;
sprite->animPaused = TRUE;
@@ -921,7 +922,7 @@ void UpdateAshFieldEffect_Step0(struct Sprite *sprite)
sprite->data[0] = 1;
}
-void UpdateAshFieldEffect_Step1(struct Sprite *sprite)
+static void UpdateAshFieldEffect_Step1(struct Sprite *sprite)
{
sprite->invisible = FALSE;
sprite->animPaused = FALSE;
@@ -931,7 +932,7 @@ void UpdateAshFieldEffect_Step1(struct Sprite *sprite)
sprite->data[0] = 2;
}
-void UpdateAshFieldEffect_Step2(struct Sprite *sprite)
+static void UpdateAshFieldEffect_Step2(struct Sprite *sprite)
{
UpdateEventObjectSpriteVisibility(sprite, FALSE);
if (sprite->animEnded)
@@ -975,17 +976,17 @@ void sub_8155604(u8 spriteId, u8 value, s16 data1)
gSprites[spriteId].data[1] = data1;
}
-u8 sub_8155638(struct Sprite *sprite)
+static u8 sub_8155638(struct Sprite *sprite)
{
return sprite->data[0] & 0xF;
}
-u8 sub_8155640(struct Sprite *sprite)
+static u8 sub_8155640(struct Sprite *sprite)
{
return (sprite->data[0] & 0xF0) >> 4;
}
-u8 sub_815564C(struct Sprite *sprite)
+static u8 sub_815564C(struct Sprite *sprite)
{
return (sprite->data[0] & 0xF00) >> 8;
}
@@ -997,13 +998,13 @@ void UpdateSurfBlobFieldEffect(struct Sprite *sprite)
eventObject = &gEventObjects[sprite->data[2]];
linkedSprite = &gSprites[eventObject->spriteId];
- sub_81556B0(eventObject, sprite);
+ SynchroniseSurfAnim(eventObject, sprite);
sub_81556E8(eventObject, sprite);
- sub_815577C(eventObject, linkedSprite, sprite);
+ CreateBobbingEffect(eventObject, linkedSprite, sprite);
sprite->oam.priority = linkedSprite->oam.priority;
}
-void sub_81556B0(struct EventObject *eventObject, struct Sprite *sprite)
+static void SynchroniseSurfAnim(struct EventObject *eventObject, struct Sprite *sprite)
{
u8 surfBlobDirectionAnims[] = {
0, // DIR_NONE
@@ -1126,7 +1127,7 @@ _08155770:\n\
}
#endif
-void sub_815577C(struct EventObject *eventObject, struct Sprite *linkedSprite, struct Sprite *sprite)
+static void CreateBobbingEffect(struct EventObject *eventObject, struct Sprite *linkedSprite, struct Sprite *sprite)
{
u16 unk_085CDC6A[] = {3, 7};
u8 v0 = sub_8155638(sprite);
@@ -1166,7 +1167,7 @@ u8 sub_8155800(u8 oldSpriteId)
return spriteId;
}
-void sub_8155850(struct Sprite *sprite)
+static void sub_8155850(struct Sprite *sprite)
{
struct Sprite *oldSprite;
@@ -1320,7 +1321,7 @@ u32 ShowSandDisguiseFieldEffect(void)
return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 28, 2);
}
-u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum)
+static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum)
{
u8 spriteId;
struct Sprite *sprite;
@@ -1619,7 +1620,7 @@ void sub_8156194(struct Sprite *sprite)
}
}
-void sub_81561D0(struct Sprite *sprite)
+void WaitFieldEffectSpriteAnim(struct Sprite *sprite)
{
if (sprite->animEnded)
FieldEffectStop(sprite, sprite->data[0]);
@@ -1628,7 +1629,7 @@ void sub_81561D0(struct Sprite *sprite)
}
#ifdef NONMATCHING
-void sub_81561FC(struct Sprite *sprite /*r6*/, u8 z, u8 offset)
+static void sub_81561FC(struct Sprite *sprite /*r6*/, u8 z, u8 offset)
{
u8 i;
s16 xlo;
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index cb2beacee..f0a8da7d7 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -4,11 +4,10 @@
#include "event_data.h"
#include "event_object_movement.h"
#include "field_camera.h"
-#include "field_player_avatar.h"
#include "field_effect.h"
#include "field_effect_helpers.h"
+#include "field_player_avatar.h"
#include "fieldmap.h"
-#include "global.fieldmap.h"
#include "menu.h"
#include "metatile_behavior.h"
#include "overworld.h"
@@ -25,6 +24,7 @@
#include "constants/abilities.h"
#include "constants/event_objects.h"
#include "constants/event_object_movement_constants.h"
+#include "constants/field_effects.h"
#include "constants/flags.h"
#include "constants/maps.h"
#include "constants/moves.h"
@@ -32,42 +32,18 @@
#include "constants/species.h"
static EWRAM_DATA u8 gUnknown_0203734C = 0;
-EWRAM_DATA struct EventObject gEventObjects[NUM_EVENT_OBJECTS] = {};
+EWRAM_DATA struct EventObject gEventObjects[EVENT_OBJECTS_COUNT] = {};
EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {};
-static void StartStrengthAnim(u8, u8);
-static bool8 ShouldJumpLedge(s16, s16, u8);
-static bool8 sub_808B1BC(s16, s16, u8);
-static u8 sub_808B164(struct EventObject *, s16, s16, u8, u8);
-static u8 sub_808B238(s16, s16, u8);
-static void check_acro_bike_metatile(s16, s16, u8, u8 *);
-static void PlayerNotOnBikeCollide(u8);
-static void PlayCollisionSoundIfNotFacingWarp(u8 a);
-static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8);
-static void PlayerRun(u8);
-static void MovePlayerNotOnBike(u8, u16);
-static u8 CheckMovementInputNotOnBike(u8);
-static void DoPlayerMatSpin(void);
-static void DoPlayerMatJump(void);
-static u8 CheckForPlayerAvatarCollision(u8);
+// static declarations
+
static u8 EventObjectCB2_NoMovement2();
-static void sub_808C280(struct EventObject *);
static bool8 TryInterruptEventObjectSpecialAnim(struct EventObject *, u8);
static void npc_clear_strange_bits(struct EventObject *);
-static void DoPlayerAvatarTransition(void);
-static bool8 player_is_anim_in_certain_ranges(void);
-static bool8 sub_808B618(void);
-static bool8 PlayerIsAnimActive(void);
-static bool8 PlayerCheckIfAnimFinishedOrInactive(void);
-static bool8 TryDoMetatileBehaviorForcedMovement();
static void MovePlayerAvatarUsingKeypadInput(u8, u16, u16);
static void PlayerAllowForcedMovementIfMovingSameDirection();
-static u8 sub_808B028(u8);
+static bool8 TryDoMetatileBehaviorForcedMovement();
static u8 GetForcedMovementByMetatileBehavior();
-static void PlayerNotOnBikeNotMoving(u8, u16);
-static void PlayerNotOnBikeTurningInPlace(u8, u16);
-static void PlayerNotOnBikeMoving(u8, u16);
-static void sub_808C750(u8);
static bool8 ForcedMovement_None(void);
static bool8 ForcedMovement_Slip(void);
@@ -87,25 +63,63 @@ static bool8 ForcedMovement_0xBB(void);
static bool8 ForcedMovement_0xBC(void);
static bool8 ForcedMovement_MuddySlope(void);
+static void MovePlayerNotOnBike(u8, u16);
+static u8 CheckMovementInputNotOnBike(u8);
+static void PlayerNotOnBikeNotMoving(u8, u16);
+static void PlayerNotOnBikeTurningInPlace(u8, u16);
+static void PlayerNotOnBikeMoving(u8, u16);
+static u8 CheckForPlayerAvatarCollision(u8);
+static u8 sub_808B028(u8);
+static u8 sub_808B164(struct EventObject *, s16, s16, u8, u8);
+static bool8 sub_808B1BC(s16, s16, u8);
+static bool8 ShouldJumpLedge(s16, s16, u8);
+static u8 sub_808B238(s16, s16, u8);
+static void check_acro_bike_metatile(s16, s16, u8, u8 *);
+
+static void DoPlayerAvatarTransition(void);
+static void PlayerAvatarTransition_Dummy(struct EventObject *a);
static void PlayerAvatarTransition_Normal(struct EventObject *a);
static void PlayerAvatarTransition_MachBike(struct EventObject *a);
static void PlayerAvatarTransition_AcroBike(struct EventObject *a);
static void PlayerAvatarTransition_Surfing(struct EventObject *a);
static void PlayerAvatarTransition_Underwater(struct EventObject *a);
static void PlayerAvatarTransition_ReturnToField(struct EventObject *a);
-static void PlayerAvatarTransition_Dummy(struct EventObject *a);
+static bool8 player_is_anim_in_certain_ranges(void);
+static bool8 sub_808B618(void);
+static bool8 PlayerIsAnimActive(void);
+static bool8 PlayerCheckIfAnimFinishedOrInactive(void);
+
+static void PlayerRun(u8);
+static void PlayerNotOnBikeCollide(u8);
+static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8);
+
+static void PlayCollisionSoundIfNotFacingWarp(u8 a);
+
+static void sub_808C280(struct EventObject *);
+
+static void StartStrengthAnim(u8, u8);
+static void Task_BumpBoulder(u8 taskId);
static u8 sub_808C3A4(struct Task *task, struct EventObject *playerObject, struct EventObject *strengthObject);
static u8 do_boulder_dust(struct Task *task, struct EventObject *playerObject, struct EventObject *strengthObject);
static u8 sub_808C484(struct Task *task, struct EventObject *playerObject, struct EventObject *strengthObject);
+static void DoPlayerMatJump(void);
+static void DoPlayerAvatarSecretBaseMatJump(u8 taskId);
static u8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct EventObject *eventObject);
+static void DoPlayerMatSpin(void);
+static void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId);
static bool8 PlayerAvatar_SecretBaseMatSpinStep0(struct Task *task, struct EventObject *eventObject);
static bool8 PlayerAvatar_SecretBaseMatSpinStep1(struct Task *task, struct EventObject *eventObject);
static bool8 PlayerAvatar_SecretBaseMatSpinStep2(struct Task *task, struct EventObject *eventObject);
static bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct EventObject *eventObject);
+static void sub_808C750(u8);
+static void taskFF_0805D1D4(u8 taskId);
+static void sub_808C814(u8 taskId);
+
+static void Task_Fishing(u8 taskId);
static u8 Fishing1(struct Task *task);
static u8 Fishing2(struct Task *task);
static u8 Fishing3(struct Task *task);
@@ -122,8 +136,13 @@ static u8 Fishing13(struct Task *task);
static u8 Fishing14(struct Task *task);
static u8 Fishing15(struct Task *task);
static u8 Fishing16(struct Task *task);
+static void AlignFishingAnimationFrames(void);
-static bool8 (*const gUnknown_084973FC[])(u8) =
+static u8 sub_808D38C(struct EventObject *object, s16 *a1);
+
+// .rodata
+
+static bool8 (*const sForcedMovementTestFuncs[])(u8) =
{
MetatileBehavior_IsTrickHouseSlipperyFloor,
MetatileBehavior_IsIce_2,
@@ -145,7 +164,7 @@ static bool8 (*const gUnknown_084973FC[])(u8) =
MetatileBehavior_IsMuddySlope,
};
-static bool8 (*const gUnknown_08497444[])(void) =
+static bool8 (*const sForcedMovementFuncs[])(void) =
{
ForcedMovement_None,
ForcedMovement_Slip,
@@ -283,14 +302,15 @@ static bool8 (*const sPlayerAvatarSecretBaseMatSpin[])(struct Task *, struct Eve
};
// .text
+
void MovementType_Player(struct Sprite *sprite)
{
- UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, EventObjectCB2_NoMovement2);
+ UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, EventObjectCB2_NoMovement2);
}
static u8 EventObjectCB2_NoMovement2(void)
{
- return 0;
+ return 0;
}
void player_step(u8 direction, u16 newKeys, u16 heldKeys)
@@ -380,7 +400,7 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void)
static bool8 TryDoMetatileBehaviorForcedMovement(void)
{
- return gUnknown_08497444[GetForcedMovementByMetatileBehavior()]();
+ return sForcedMovementFuncs[GetForcedMovementByMetatileBehavior()]();
}
static u8 GetForcedMovementByMetatileBehavior(void)
@@ -393,7 +413,7 @@ static u8 GetForcedMovementByMetatileBehavior(void)
for (i = 0; i < 18; i++)
{
- if (gUnknown_084973FC[i](metatileBehavior))
+ if (sForcedMovementTestFuncs[i](metatileBehavior))
return i + 1;
}
}
@@ -622,7 +642,7 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys)
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
{
- // speed 2 is fast, same speed as running
+ // speed 2 is fast, same speed as running
PlayerGoSpeed2(direction);
return;
}
@@ -728,18 +748,18 @@ static u8 sub_808B238(s16 x, s16 y, u8 direction)
{
u8 eventObjectId = GetEventObjectIdByXY(x, y);
- if (eventObjectId != 16 && gEventObjects[eventObjectId].graphicsId == 0x57)
+ if (eventObjectId != 16 && gEventObjects[eventObjectId].graphicsId == EVENT_OBJ_GFX_PUSHABLE_BOULDER)
+ {
+ x = gEventObjects[eventObjectId].currentCoords.x;
+ y = gEventObjects[eventObjectId].currentCoords.y;
+ MoveCoords(direction, &x, &y);
+ if (GetCollisionAtCoords(&gEventObjects[eventObjectId], x, y, direction) == 0
+ && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)) == 0)
{
- x = gEventObjects[eventObjectId].currentCoords.x;
- y = gEventObjects[eventObjectId].currentCoords.y;
- MoveCoords(direction, &x, &y);
- if (GetCollisionAtCoords(&gEventObjects[eventObjectId], x, y, direction) == 0
- && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)) == 0)
- {
- StartStrengthAnim(eventObjectId, direction);
- return 1;
- }
+ StartStrengthAnim(eventObjectId, direction);
+ return 1;
}
+ }
}
return 0;
}
@@ -981,7 +1001,7 @@ void PlayerGoSpeed4(u8 a)
PlayerSetAnimId(GetWalkFastestMovementAction(a), 2);
}
-void PlayerRun(u8 a)
+static void PlayerRun(u8 a)
{
PlayerSetAnimId(GetPlayerRunMovementAction(a), 2);
}
@@ -997,13 +1017,13 @@ void PlayerOnBikeCollideWithFarawayIslandMew(u8 a)
PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(a), 2);
}
-void PlayerNotOnBikeCollide(u8 a)
+static void PlayerNotOnBikeCollide(u8 a)
{
PlayCollisionSoundIfNotFacingWarp(a);
PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(a), 2);
}
-void PlayerNotOnBikeCollideWithFarawayIslandMew(u8 a)
+static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8 a)
{
PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(a), 2);
}
@@ -1450,8 +1470,6 @@ static void sub_808C280(struct EventObject *eventObject)
/* Strength */
-static void Task_BumpBoulder(u8 taskId);
-
static void StartStrengthAnim(u8 a, u8 b)
{
u8 taskId = CreateTask(Task_BumpBoulder, 0xFF);
@@ -1523,8 +1541,6 @@ static bool8 sub_808C484(struct Task *task, struct EventObject *playerObject, st
/* Some field effect */
-static void DoPlayerAvatarSecretBaseMatJump(u8 taskId);
-
static void DoPlayerMatJump(void)
{
DoPlayerAvatarSecretBaseMatJump(CreateTask(DoPlayerAvatarSecretBaseMatJump, 0xFF));
@@ -1557,8 +1573,6 @@ static u8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct EventObject
/* Some field effect */
-static void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId);
-
static void DoPlayerMatSpin(void)
{
u8 taskId = CreateTask(PlayerAvatar_DoSecretBaseMatSpin, 0xFF);
@@ -1632,9 +1646,6 @@ static bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct Event
/* Some Field effect */
-static void taskFF_0805D1D4(u8 taskId);
-static void sub_808C814(u8 taskId);
-
static void sub_808C750(u8 a)
{
u8 taskId;
@@ -1699,9 +1710,6 @@ static bool8 (*const sFishingStateFuncs[])(struct Task *) =
Fishing16,
};
-static void Task_Fishing(u8 taskId);
-static void sub_808CF78(void);
-
#define tStep data[0]
#define tFrameCounter data[1]
#define tNumDots data[2]
@@ -1759,7 +1767,7 @@ static bool8 Fishing2(struct Task *task)
static bool8 Fishing3(struct Task *task)
{
- sub_808CF78();
+ AlignFishingAnimationFrames();
// Wait one second
task->tFrameCounter++;
@@ -1791,7 +1799,7 @@ static bool8 Fishing5(struct Task *task)
{
const u8 dot[] = _("·");
- sub_808CF78();
+ AlignFishingAnimationFrames();
task->tFrameCounter++;
if (gMain.newKeys & A_BUTTON)
{
@@ -1827,7 +1835,7 @@ static bool8 Fishing6(struct Task *task)
{
bool8 bite;
- sub_808CF78();
+ AlignFishingAnimationFrames();
task->tStep++;
bite = FALSE;
@@ -1872,7 +1880,7 @@ static bool8 Fishing6(struct Task *task)
// Oh! A Bite!
static bool8 Fishing7(struct Task *task)
{
- sub_808CF78();
+ AlignFishingAnimationFrames();
AddTextPrinterParameterized(0, 1, gText_OhABite, 0, 17, 0, NULL);
task->tStep++;
task->tFrameCounter = 0;
@@ -1884,7 +1892,7 @@ static bool8 Fishing8(struct Task *task)
{
const s16 reelTimeouts[3] = {36, 33, 30};
- sub_808CF78();
+ AlignFishingAnimationFrames();
task->tFrameCounter++;
if (task->tFrameCounter >= reelTimeouts[task->tFishingRod])
task->tStep = FISHING_GOT_AWAY;
@@ -1903,7 +1911,7 @@ static bool8 Fishing9(struct Task *task)
{70, 30}
};
- sub_808CF78();
+ AlignFishingAnimationFrames();
task->tStep++;
if (task->tRoundsPlayed < task->tMinRoundsRequired)
{
@@ -1922,7 +1930,7 @@ static bool8 Fishing9(struct Task *task)
static bool8 Fishing10(struct Task *task)
{
- sub_808CF78();
+ AlignFishingAnimationFrames();
FillWindowPixelBuffer(0, 0x11);
AddTextPrinterParameterized2(0, 1, gText_PokemonOnHook, 1, 0, 2, 1, 3);
task->tStep++;
@@ -1933,7 +1941,7 @@ static bool8 Fishing10(struct Task *task)
static bool8 Fishing11(struct Task *task)
{
if (task->tFrameCounter == 0)
- sub_808CF78();
+ AlignFishingAnimationFrames();
RunTextPrinters();
@@ -1969,7 +1977,7 @@ static bool8 Fishing11(struct Task *task)
// Not even a nibble
static bool8 Fishing12(struct Task *task)
{
- sub_808CF78();
+ AlignFishingAnimationFrames();
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection()));
FillWindowPixelBuffer(0, 0x11);
AddTextPrinterParameterized2(0, 1, gText_NotEvenANibble, 1, 0, 2, 1, 3);
@@ -1980,7 +1988,7 @@ static bool8 Fishing12(struct Task *task)
// It got away
static bool8 Fishing13(struct Task *task)
{
- sub_808CF78();
+ AlignFishingAnimationFrames();
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection()));
FillWindowPixelBuffer(0, 0x11);
AddTextPrinterParameterized2(0, 1, gText_ItGotAway, 1, 0, 2, 1, 3);
@@ -1991,14 +1999,14 @@ static bool8 Fishing13(struct Task *task)
// Wait one second
static bool8 Fishing14(struct Task *task)
{
- sub_808CF78();
+ AlignFishingAnimationFrames();
task->tStep++;
return FALSE;
}
static bool8 Fishing15(struct Task *task)
{
- sub_808CF78();
+ AlignFishingAnimationFrames();
if (gSprites[gPlayerAvatar.spriteId].animEnded)
{
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -2033,7 +2041,7 @@ static bool8 Fishing16(struct Task *task)
#undef tFrameCounter
#undef tFishingRod
-static void sub_808CF78(void)
+static void AlignFishingAnimationFrames(void)
{
struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId];
u8 animCmdIndex;
@@ -2082,8 +2090,6 @@ static u8 sub_808D080(void)
return gUnknown_0203734C;
}
-static u8 sub_808D38C(struct EventObject *object, s16 *a1);
-
static void sub_808D094(u8 taskId)
{
struct EventObject *object = &gEventObjects[gPlayerAvatar.eventObjectId];
@@ -2114,7 +2120,7 @@ static void sub_808D094(u8 taskId)
data[3] -= data[2];
data[2] += 3;
sprite->pos1.y = data[3] >> 4;
- if (sprite->pos1.y + (s16)gUnknown_03005DE8 < -32)
+ if (sprite->pos1.y + (s16)gTotalCameraPixelOffsetY < -32)
{
data[0]++;
}
diff --git a/src/field_poison.c b/src/field_poison.c
index e2fd994fc..02f37f69f 100644
--- a/src/field_poison.c
+++ b/src/field_poison.c
@@ -1,22 +1,21 @@
#include "global.h"
-#include "string_util.h"
-#include "party_menu.h"
-#include "constants/species.h"
-#include "task.h"
+#include "battle.h"
+#include "battle_pike.h"
+#include "event_data.h"
#include "field_message_box.h"
-#include "strings.h"
-#include "rom_818CFC8.h"
+#include "field_poison.h"
+#include "fldeff_80F9BCC.h"
#include "frontier_util.h"
+#include "party_menu.h"
#include "pokenav.h"
-#include "event_data.h"
+#include "rom_818CFC8.h"
#include "script.h"
-#include "battle.h"
-#include "fldeff_80F9BCC.h"
-#include "field_poison.h"
-
-extern bool8 InBattlePike(void);
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "constants/species.h"
-static bool32 sub_80F9568(struct Pokemon *pokemon)
+static bool32 IsMonValidSpecies(struct Pokemon *pokemon)
{
u16 species = GetMonData(pokemon, MON_DATA_SPECIES2);
if (species == SPECIES_NONE || species == SPECIES_EGG)
@@ -26,14 +25,14 @@ static bool32 sub_80F9568(struct Pokemon *pokemon)
return TRUE;
}
-static bool32 sub_80F958C(void)
+static bool32 AllMonsFainted(void)
{
int i;
- struct Pokemon *pokemon;
+ struct Pokemon *pokemon = gPlayerParty;
- for (pokemon = gPlayerParty, i = 0; i < PARTY_SIZE; i++, pokemon++)
+ for (i = 0; i < PARTY_SIZE; i++, pokemon++)
{
- if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) != 0)
+ if (IsMonValidSpecies(pokemon) && GetMonData(pokemon, MON_DATA_HP) != 0)
{
return FALSE;
}
@@ -41,27 +40,28 @@ static bool32 sub_80F958C(void)
return TRUE;
}
-static void sub_80F95C0(u8 partyIdx)
+static void FaintFromFieldPoison(u8 partyIdx)
{
struct Pokemon *pokemon = gPlayerParty + partyIdx;
- unsigned int status = STATUS1_NONE;
+ u32 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)
+static bool32 MonFaintedFromPoison(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)
+ if (IsMonValidSpecies(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)
+static void Task_WhiteOut(u8 taskId)
{
s16 *data = gTasks[taskId].data;
switch (data[0])
@@ -69,9 +69,9 @@ static void sub_80F9654(u8 taskId)
case 0:
for (; data[1] < PARTY_SIZE; data[1]++)
{
- if (sub_80F960C(data[1]))
+ if (MonFaintedFromPoison(data[1]))
{
- sub_80F95C0(data[1]);
+ FaintFromFieldPoison(data[1]);
ShowFieldMessage(gText_PkmnFainted3);
data[0]++;
return;
@@ -86,7 +86,7 @@ static void sub_80F9654(u8 taskId)
}
break;
case 2:
- if (sub_80F958C())
+ if (AllMonsFainted())
{
if (InBattlePyramid() | InBattlePike() || sub_81D5C18())
{
@@ -107,19 +107,19 @@ static void sub_80F9654(u8 taskId)
}
}
-void sub_80F972C(void)
+void ExecuteWhiteOut(void)
{
- CreateTask(sub_80F9654, 80);
+ CreateTask(Task_WhiteOut, 80);
ScriptContext1_Stop();
}
-int DoPoisonFieldEffect(void)
+s32 DoPoisonFieldEffect(void)
{
int i;
- unsigned int hp;
+ u32 hp;
struct Pokemon *pokemon = gPlayerParty;
- unsigned int numPoisoned = 0;
- unsigned int numFainted = 0;
+ u32 numPoisoned = 0;
+ u32 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)
@@ -136,7 +136,7 @@ int DoPoisonFieldEffect(void)
}
if (numFainted != 0 || numPoisoned != 0)
{
- overworld_poison_effect();
+ FldeffPoison_Start();
}
if (numFainted != 0)
{
diff --git a/src/field_region_map.c b/src/field_region_map.c
index c15959afc..40f48e668 100644
--- a/src/field_region_map.c
+++ b/src/field_region_map.c
@@ -1,18 +1,16 @@
-
-// Includes
#include "global.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "international_string_util.h"
#include "main.h"
#include "malloc.h"
-#include "gpu_regs.h"
-#include "bg.h"
-#include "text.h"
-#include "window.h"
-#include "text_window.h"
-#include "palette.h"
#include "menu.h"
-#include "strings.h"
-#include "international_string_util.h"
+#include "palette.h"
#include "region_map.h"
+#include "strings.h"
+#include "text.h"
+#include "text_window.h"
+#include "window.h"
// Static type declarations
diff --git a/src/field_specials.c b/src/field_specials.c
index 522cbdf94..113f46922 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -1,5 +1,4 @@
#include "global.h"
-#include "main.h"
#include "battle.h"
#include "battle_tower.h"
#include "cable_club.h"
@@ -13,7 +12,6 @@
#include "field_effect.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
-#include "field_region_map.h"
#include "field_screen.h"
#include "field_specials.h"
#include "field_weather.h"
@@ -21,6 +19,7 @@
#include "item_icon.h"
#include "link.h"
#include "list_menu.h"
+#include "main.h"
#include "malloc.h"
#include "match_call.h"
#include "menu.h"
@@ -46,6 +45,7 @@
#include "wallclock.h"
#include "window.h"
#include "constants/event_objects.h"
+#include "constants/field_effects.h"
#include "constants/items.h"
#include "constants/maps.h"
#include "constants/songs.h"
@@ -80,6 +80,7 @@ extern const u16 gEventObjectPalette34[];
extern void LoadPalette(const void *src, u32 offset, u16 size); // incorrect signature, needed to match
extern void BlendPalettes(u32, u8, u16);
+extern void FieldInitRegionMap(MainCallback callback);
void UpdateMovedLilycoveFanClubMembers(void);
void sub_813BF60(void);
@@ -595,7 +596,7 @@ static void LoadLinkPartnerEventObjectSpritePalette(u8 graphicsId, u8 localEvent
graphicsId == EVENT_OBJ_GFX_RIVAL_MAY_NORMAL)
{
u8 obj = GetEventObjectIdByLocalIdAndMap(localEventId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
- if (obj != NUM_EVENT_OBJECTS)
+ if (obj != EVENT_OBJECTS_COUNT)
{
u8 spriteId = gEventObjects[obj].spriteId;
struct Sprite *sprite = &gSprites[spriteId];
@@ -1513,7 +1514,7 @@ bool8 FoundBlackGlasses(void)
void SetRoute119Weather(void)
{
- if (is_map_type_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE)
+ if (is_map_type_1_2_3_5_or_6(GetLastUsedWarpMapType()) != TRUE)
{
SetSav1Weather(20);
}
@@ -1521,7 +1522,7 @@ void SetRoute119Weather(void)
void SetRoute123Weather(void)
{
- if (is_map_type_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE)
+ if (is_map_type_1_2_3_5_or_6(GetLastUsedWarpMapType()) != TRUE)
{
SetSav1Weather(21);
}
diff --git a/src/field_tasks.c b/src/field_tasks.c
index 5fb23f536..7a7f49120 100644
--- a/src/field_tasks.c
+++ b/src/field_tasks.c
@@ -1,24 +1,24 @@
#include "global.h"
-#include "task.h"
-#include "main.h"
-#include "constants/vars.h"
#include "bike.h"
-#include "item.h"
-#include "constants/items.h"
+#include "clock.h"
#include "event_data.h"
+#include "field_camera.h"
+#include "field_effect_helpers.h"
+#include "field_player_avatar.h"
+#include "field_special_scene.h"
+#include "field_tasks.h"
+#include "fieldmap.h"
+#include "item.h"
+#include "main.h"
+#include "metatile_behavior.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"
+#include "task.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "constants/vars.h"
struct MetatileOffset
{
diff --git a/src/fieldmap.c b/src/fieldmap.c
index 5019b5dc7..0d8a706b1 100644
--- a/src/fieldmap.c
+++ b/src/fieldmap.c
@@ -1,18 +1,18 @@
#include "global.h"
-#include "overworld.h"
#include "bg.h"
-#include "frontier_util.h"
-#include "constants/rgb.h"
#include "fieldmap.h"
#include "fldeff_80F9BCC.h"
#include "fldeff_cut.h"
#include "fldeff_groundshake.h"
+#include "frontier_util.h"
#include "menu.h"
+#include "overworld.h"
#include "palette.h"
#include "pokenav.h"
#include "script.h"
#include "secret_base.h"
#include "tv.h"
+#include "constants/rgb.h"
extern void sub_81AA078(u16*, u8);
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
index 5a9181789..230a95e0b 100644
--- a/src/fldeff_cut.c
+++ b/src/fldeff_cut.c
@@ -18,6 +18,7 @@
#include "trig.h"
#include "constants/abilities.h"
#include "constants/event_objects.h"
+#include "constants/field_effects.h"
#include "constants/songs.h"
extern void ScriptUnfreezeEventObjects(void);
diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c
index b906225da..7d3e07123 100644
--- a/src/fldeff_escalator.c
+++ b/src/fldeff_escalator.c
@@ -1,8 +1,8 @@
#include "global.h"
-#include "task.h"
-#include "fieldmap.h"
#include "field_camera.h"
#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "task.h"
static EWRAM_DATA u8 sEscalatorAnim_TaskId = 0;
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
index 0c6fdd8b8..9771232f2 100644
--- a/src/fldeff_flash.c
+++ b/src/fldeff_flash.c
@@ -1,20 +1,19 @@
#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 "overworld.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"
+#include "constants/songs.h"
// structures
struct FlashStruct
@@ -156,7 +155,7 @@ void c2_change_map(void)
static bool8 sub_8137304(void)
{
u8 i;
- u8 v0 = get_map_light_from_warp0();
+ u8 v0 = GetLastUsedWarpMapType();
u8 v1 = Overworld_GetMapTypeOfSaveblockLocation();
for (i = 0; gUnknown_085B27C8[i].unk0; i++)
diff --git a/src/fldeff_groundshake.c b/src/fldeff_groundshake.c
index 60b078982..e9a46bb86 100644
--- a/src/fldeff_groundshake.c
+++ b/src/fldeff_groundshake.c
@@ -1,10 +1,7 @@
#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 "field_camera.h"
#include "malloc.h"
#include "random.h"
#include "roulette_util.h"
@@ -12,6 +9,8 @@
#include "sound.h"
#include "sprite.h"
#include "task.h"
+#include "constants/flags.h"
+#include "constants/songs.h"
// structures
struct Struct203CF18 {
diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c
index d0a40a9a9..471a83c61 100644
--- a/src/fldeff_softboiled.c
+++ b/src/fldeff_softboiled.c
@@ -2,12 +2,12 @@
#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"
+#include "constants/songs.h"
static void sub_816166C(u8 taskId);
static void sub_81616C0(u8 taskId);
diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c
index 74eb100bc..c9b91f97f 100644
--- a/src/fldeff_strength.c
+++ b/src/fldeff_strength.c
@@ -7,6 +7,7 @@
#include "script.h"
#include "task.h"
#include "constants/event_objects.h"
+#include "constants/field_effects.h"
// static functions
static void FldEff_UseStrength(void);
diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c
index f592ed532..9951fe581 100644
--- a/src/fldeff_sweetscent.c
+++ b/src/fldeff_sweetscent.c
@@ -1,6 +1,4 @@
#include "global.h"
-#include "constants/rgb.h"
-#include "constants/songs.h"
#include "event_data.h"
#include "event_scripts.h"
#include "field_effect.h"
@@ -14,22 +12,25 @@
#include "sprite.h"
#include "task.h"
#include "wild_encounter.h"
+#include "constants/field_effects.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
-void hm2_sweet_scent(void);
-void sub_8159F5C(void);
-void sub_8159FEC(u8 taskId);
-void sub_815A090(u8 taskId);
+static void FieldCallback_SweetScent(void);
+static void StartSweetScentFieldEffect(void);
+static void TrySweetScentEncounter(u8 taskId);
+static void FailSweetScentEncounter(u8 taskId);
void sub_81BE6B8(void);
void sub_81BE72C(void);
bool8 SetUpFieldMove_SweetScent(void)
{
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
- gPostMenuFieldCallback = hm2_sweet_scent;
+ gPostMenuFieldCallback = FieldCallback_SweetScent;
return TRUE;
}
-void hm2_sweet_scent(void)
+static void FieldCallback_SweetScent(void)
{
FieldEffectStart(FLDEFF_SWEET_SCENT);
gFieldEffectArguments[0] = GetCursorSelectionMonId();
@@ -41,12 +42,12 @@ bool8 FldEff_SweetScent(void)
sub_80AC3D0();
taskId = oei_task_add();
- gTasks[taskId].data[8] = (u32)sub_8159F5C >> 16;
- gTasks[taskId].data[9] = (u32)sub_8159F5C;
+ gTasks[taskId].data[8] = (u32)StartSweetScentFieldEffect >> 16;
+ gTasks[taskId].data[9] = (u32)StartSweetScentFieldEffect;
return FALSE;
}
-void sub_8159F5C(void)
+static void StartSweetScentFieldEffect(void)
{
u8 taskId;
@@ -54,12 +55,12 @@ void sub_8159F5C(void)
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);
+ taskId = CreateTask(TrySweetScentEncounter, 0);
gTasks[taskId].data[0] = 0;
FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT);
}
-void sub_8159FEC(u8 taskId)
+static void TrySweetScentEncounter(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -74,7 +75,7 @@ void sub_8159FEC(u8 taskId)
}
else
{
- gTasks[taskId].func = sub_815A090;
+ gTasks[taskId].func = FailSweetScentEncounter;
BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB_RED);
sub_81BE6B8();
}
@@ -86,7 +87,7 @@ void sub_8159FEC(u8 taskId)
}
}
-void sub_815A090(u8 taskId)
+static void FailSweetScentEncounter(u8 taskId)
{
if (!gPaletteFade.active)
{
diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c
index e82a26cd1..8562908bd 100644
--- a/src/fldeff_teleport.c
+++ b/src/fldeff_teleport.c
@@ -1,24 +1,27 @@
#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"
+#include "constants/field_effects.h"
+
+static void FieldCallback_Teleport(void);
+static void StartTeleportFieldEffect(void);
bool8 SetUpFieldMove_Teleport(void)
{
if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
- gPostMenuFieldCallback = hm_teleport_run_dp02scr;
+ gPostMenuFieldCallback = FieldCallback_Teleport;
return TRUE;
}
return FALSE;
}
-void hm_teleport_run_dp02scr(void)
+static void FieldCallback_Teleport(void)
{
Overworld_ResetStateAfterTeleport();
FieldEffectStart(FLDEFF_USE_TELEPORT);
@@ -28,16 +31,14 @@ void hm_teleport_run_dp02scr(void)
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);
+ gTasks[taskId].data[8] = (u32)StartTeleportFieldEffect >> 16;
+ gTasks[taskId].data[9] = (u32)StartTeleportFieldEffect;
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
return FALSE;
}
-void sub_817C94C(void)
+static void StartTeleportFieldEffect(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT);
CreateTeleportFieldEffectTask();
}
-
-
diff --git a/src/frontier_util.c b/src/frontier_util.c
index 39f472a60..a65d14784 100644
--- a/src/frontier_util.c
+++ b/src/frontier_util.c
@@ -336,7 +336,8 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][3] =
},
[FRONTIER_FACILITY_FACTORY] =
{
- // Silver Symbol.
+ // Because Factory's pokemon are random, this facility's Brain also uses random pokemon.
+ // What is interesting, this team is actually the one Steven uses in the multi tag battle alongside the player.
{
{
.species = SPECIES_METANG,
@@ -363,7 +364,6 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][3] =
.moves = {MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW},
},
},
- // Gold Symbol.
{
{
.species = SPECIES_METANG,
diff --git a/src/hof_pc.c b/src/hof_pc.c
index 44b929337..2cea5540a 100644
--- a/src/hof_pc.c
+++ b/src/hof_pc.c
@@ -7,8 +7,6 @@
#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);
diff --git a/src/item_menu.c b/src/item_menu.c
index 2c0ac09ef..1744a1bfa 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -47,8 +47,7 @@
#include "menu_helpers.h"
#include "window.h"
#include "apprentice.h"
-
-extern bool8 InBattlePike(void);
+#include "battle_pike.h"
void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *postExitMenuMainCallback2)());
void CB2_Bag(void);
diff --git a/src/item_use.c b/src/item_use.c
index 2a1c7883c..4ab9f6e23 100755
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -58,7 +58,7 @@ 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 StartEscapeRopeFieldEffect(void);
extern u8* sub_806CF78(u16);
extern void sub_81B89F0(void);
extern u8 GetItemEffectType(u16);
@@ -890,7 +890,7 @@ void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId)
void task08_080A1C44(u8 taskId)
{
ResetInitialPlayerAvatarState();
- sub_80B7CC8();
+ StartEscapeRopeFieldEffect();
DestroyTask(taskId);
}
diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c
index dd594f075..2bae89ecf 100644
--- a/src/metatile_behavior.c
+++ b/src/metatile_behavior.c
@@ -897,7 +897,7 @@ bool8 MetatileBehavior_IsBridge(u8 metatileBehavior)
return FALSE;
}
-u8 MetatileBehavior_GetBridgeSth(u8 metatileBehavior)
+u8 MetatileBehavior_GetBridgeType(u8 metatileBehavior)
{
u8 result = metatileBehavior - MB_WARP_OR_BRIDGE;
if (result < 4)
diff --git a/src/overworld.c b/src/overworld.c
index 4787a4344..69ac9c822 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -585,7 +585,7 @@ void set_warp2_warp3_to_neg_1(void)
gFixedHoleWarp = sDummyWarpData;
}
-void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
{
warp->mapGroup = mapGroup;
warp->mapNum = mapNum;
@@ -594,7 +594,7 @@ void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x,
warp->y = y;
}
-bool32 IsDummyWarp(struct WarpData *warp)
+static bool32 IsDummyWarp(struct WarpData *warp)
{
if (warp->mapGroup != -1)
return FALSE;
@@ -620,7 +620,7 @@ struct MapHeader const *const GetDestinationWarpMapHeader(void)
return Overworld_GetMapHeaderByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum);
}
-void LoadCurrentMapData(void)
+static void LoadCurrentMapData(void)
{
sLastMapSectionId = gMapHeader.regionMapSectionId;
gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);
@@ -628,13 +628,13 @@ void LoadCurrentMapData(void)
gMapHeader.mapLayout = GetMapLayout();
}
-void LoadSaveblockMapHeader(void)
+static void LoadSaveblockMapHeader(void)
{
gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum);
gMapHeader.mapLayout = GetMapLayout();
}
-void SetPlayerCoordsFromWarp(void)
+static void SetPlayerCoordsFromWarp(void)
{
if (gSaveBlock1Ptr->location.warpId >= 0 && gSaveBlock1Ptr->location.warpId < gMapHeader.events->warpCount)
{
@@ -729,7 +729,7 @@ void SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
SetWarpData(&gFixedDiveWarp, mapGroup, mapNum, warpId, x, y);
}
-void SetFixedDiveWarpAsDestination(void)
+static void SetFixedDiveWarpAsDestination(void)
{
sWarpDestination = gFixedDiveWarp;
}
@@ -785,7 +785,7 @@ const struct MapConnection *GetMapConnection(u8 dir)
return NULL;
}
-bool8 SetDiveWarp(u8 dir, u16 x, u16 y)
+static bool8 SetDiveWarp(u8 dir, u16 x, u16 y)
{
const struct MapConnection *connection = GetMapConnection(dir);
@@ -905,8 +905,8 @@ static void mli0_load_map(u32 a1)
void ResetInitialPlayerAvatarState(void)
{
- gInitialPlayerAvatarState.direction = 1;
- gInitialPlayerAvatarState.transitionFlags = 1;
+ gInitialPlayerAvatarState.direction = DIR_SOUTH;
+ gInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT;
}
void StoreInitialPlayerAvatarState(void)
@@ -914,15 +914,15 @@ void StoreInitialPlayerAvatarState(void)
gInitialPlayerAvatarState.direction = GetPlayerFacingDirection();
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE))
- gInitialPlayerAvatarState.transitionFlags = 2;
+ gInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_MACH_BIKE;
else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE))
- gInitialPlayerAvatarState.transitionFlags = 4;
+ gInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ACRO_BIKE;
else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
- gInitialPlayerAvatarState.transitionFlags = 8;
+ gInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_SURFING;
else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER))
- gInitialPlayerAvatarState.transitionFlags = 16;
+ gInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_UNDERWATER;
else
- gInitialPlayerAvatarState.transitionFlags = 1;
+ gInitialPlayerAvatarState.transitionFlags = PLAYER_AVATAR_FLAG_ON_FOOT;
}
static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void)
@@ -940,44 +940,44 @@ static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void)
static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 metatileBehavior, u8 mapType)
{
if (mapType != MAP_TYPE_INDOOR && FlagGet(FLAG_SYS_CRUISE_MODE))
- return 1;
+ return PLAYER_AVATAR_FLAG_ON_FOOT;
else if (mapType == MAP_TYPE_UNDERWATER)
- return 16;
+ return PLAYER_AVATAR_FLAG_UNDERWATER;
else if (MetatileBehavior_IsSurfableWaterOrUnderwater(metatileBehavior) == TRUE)
- return 8;
+ return PLAYER_AVATAR_FLAG_SURFING;
else if (Overworld_IsBikingAllowed() != TRUE)
- return 1;
- else if (playerStruct->transitionFlags == 2)
- return 2;
- else if (playerStruct->transitionFlags != 4)
- return 1;
+ return PLAYER_AVATAR_FLAG_ON_FOOT;
+ else if (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_MACH_BIKE)
+ return PLAYER_AVATAR_FLAG_MACH_BIKE;
+ else if (playerStruct->transitionFlags != PLAYER_AVATAR_FLAG_ACRO_BIKE)
+ return PLAYER_AVATAR_FLAG_ON_FOOT;
else
- return 4;
+ return PLAYER_AVATAR_FLAG_ACRO_BIKE;
}
static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 transitionFlags, u16 metatileBehavior, u8 mapType)
{
if (FlagGet(FLAG_SYS_CRUISE_MODE) && mapType == MAP_TYPE_6)
- return 4;
+ return DIR_EAST;
else if (MetatileBehavior_IsDeepSouthWarp(metatileBehavior) == TRUE)
- return 2;
+ return DIR_NORTH;
else if (MetatileBehavior_IsNonAnimDoor(metatileBehavior) == TRUE || MetatileBehavior_IsDoor(metatileBehavior) == TRUE)
- return 1;
+ return DIR_SOUTH;
else if (MetatileBehavior_IsSouthArrowWarp(metatileBehavior) == TRUE)
- return 2;
+ return DIR_NORTH;
else if (MetatileBehavior_IsNorthArrowWarp(metatileBehavior) == TRUE)
- return 1;
+ return DIR_SOUTH;
else if (MetatileBehavior_IsWestArrowWarp(metatileBehavior) == TRUE)
- return 4;
+ return DIR_EAST;
else if (MetatileBehavior_IsEastArrowWarp(metatileBehavior) == TRUE)
- return 3;
- else if ((playerStruct->transitionFlags == 16 && transitionFlags == 8)
- || (playerStruct->transitionFlags == 8 && transitionFlags == 16))
+ return DIR_WEST;
+ else if ((playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER && transitionFlags == PLAYER_AVATAR_FLAG_SURFING)
+ || (playerStruct->transitionFlags == PLAYER_AVATAR_FLAG_SURFING && transitionFlags == PLAYER_AVATAR_FLAG_UNDERWATER ))
return playerStruct->direction;
else if (MetatileBehavior_IsLadder(metatileBehavior) == TRUE)
return playerStruct->direction;
else
- return 1;
+ return DIR_SOUTH;
}
static u16 GetCenterScreenMetatileBehavior(void)
@@ -1357,7 +1357,7 @@ u8 Overworld_GetMapTypeOfSaveblockLocation(void)
return GetMapTypeByWarpData(&gSaveBlock1Ptr->location);
}
-u8 get_map_light_from_warp0(void)
+u8 GetLastUsedWarpMapType(void)
{
return GetMapTypeByWarpData(&gLastUsedWarp);
}
@@ -1458,7 +1458,7 @@ static void DoCB1_Overworld(u16 newKeys, u16 heldKeys)
FieldGetPlayerInput(&inputStruct, newKeys, heldKeys);
if (!ScriptContext2_IsEnabled())
{
- if (sub_809C014(&inputStruct) == 1)
+ if (ProcessPlayerFieldInput(&inputStruct) == 1)
{
ScriptContext2_Enable();
HideMapNamePopUpWindow();
@@ -2166,9 +2166,9 @@ static void sub_8086988(u32 a1)
static void sub_80869DC(void)
{
- gUnknown_03005DEC = 0;
- gUnknown_03005DE8 = 0;
- sub_808D438();
+ gTotalCameraPixelOffsetX = 0;
+ gTotalCameraPixelOffsetY = 0;
+ ResetEventObjects();
TrySpawnEventObjects(0, 0);
mapheader_run_first_tag4_script_list_match();
}
@@ -2178,9 +2178,9 @@ static void mli4_mapscripts_and_other(void)
s16 x, y;
struct InitialPlayerAvatarState *player;
- gUnknown_03005DEC = 0;
- gUnknown_03005DE8 = 0;
- sub_808D438();
+ gTotalCameraPixelOffsetX = 0;
+ gTotalCameraPixelOffsetY = 0;
+ ResetEventObjects();
sav1_camera_get_focus_coords(&x, &y);
player = GetInitialPlayerAvatarState();
InitPlayerAvatar(x, y, player->direction, gSaveBlock2Ptr->playerGender);
diff --git a/src/pokeball.c b/src/pokeball.c
index bb02a02ba..09e7ac639 100644
--- a/src/pokeball.c
+++ b/src/pokeball.c
@@ -1,19 +1,19 @@
#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 "decompress.h"
+#include "graphics.h"
#include "main.h"
#include "m4a.h"
-#include "decompress.h"
-#include "constants/species.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
#include "util.h"
-#include "graphics.h"
+#include "constants/songs.h"
+#include "constants/species.h"
extern struct MusicPlayerInfo gMPlayInfo_BGM;
diff --git a/src/pokeblock.c b/src/pokeblock.c
index c8f2c67ed..01343c6eb 100644
--- a/src/pokeblock.c
+++ b/src/pokeblock.c
@@ -1,35 +1,35 @@
#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 "battle_message.h"
+#include "berry.h"
+#include "bg.h"
#include "decompress.h"
+#include "event_data.h"
+#include "gpu_regs.h"
+#include "graphics.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 "list_menu.h"
+#include "main.h"
+#include "malloc.h"
+#include "menu.h"
+#include "menu_helpers.h"
#include "overworld.h"
+#include "palette.h"
+#include "pokeblock.h"
+#include "pokemon.h"
+#include "safari_zone.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.h"
+#include "constants/items.h"
+#include "constants/songs.h"
#define POKEBLOCK_MAX_FEEL 99
#define FIELD_E75_COUNT 7
diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c
index 6978f0715..0a8f1b8c2 100644
--- a/src/pokeblock_feed.c
+++ b/src/pokeblock_feed.c
@@ -1,28 +1,28 @@
#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 "util.h"
-#include "main.h"
-#include "menu_helpers.h"
+#include "battle.h" // to get rid of once gMonSpritesGfxPtr is put elsewhere
#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 "gpu_regs.h"
+#include "graphics.h"
+#include "main.h"
+#include "malloc.h"
+#include "menu.h"
+#include "menu_helpers.h"
#include "m4a.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokeblock.h"
+#include "pokemon.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
#include "sound.h"
-#include "trig.h"
-#include "graphics.h"
+#include "task.h"
#include "text_window.h"
-#include "battle.h" // to get rid of once gMonSpritesGfxPtr is put elsewhere
+#include "trig.h"
+#include "util.h"
struct PokeblockFeedStruct
{
diff --git a/src/pokedex.c b/src/pokedex.c
index 48bf64338..93ff06876 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -1,34 +1,33 @@
#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 "data2.h"
+#include "decompress.h"
#include "event_data.h"
-#include "palette.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "international_string_util.h"
#include "main.h"
-#include "sound.h"
-#include "task.h"
-#include "trainer_pokemon_sprites.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 "m4a.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokedex.h"
#include "pokedex_area_screen.h"
#include "pokedex_cry_screen.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
#include "strings.h"
-#include "m4a.h"
-#include "international_string_util.h"
+#include "task.h"
+#include "text_window.h"
+#include "trainer_pokemon_sprites.h"
+#include "trig.h"
+#include "window.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+#include "constants/species.h"
static EWRAM_DATA struct PokedexView *gUnknown_02039B4C = NULL;
static EWRAM_DATA u16 gUnknown_02039B50 = 0;
diff --git a/src/pokemon.c b/src/pokemon.c
index b858ee925..47c4f9217 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -1,41 +1,42 @@
#include "global.h"
-#include "pokemon.h"
+#include "apprentice.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 "constants/battle_frontier.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 "battle_pike.h"
+#include "battle_setup.h"
+#include "battle_tower.h"
+#include "event_data.h"
#include "evolution_scene.h"
-#include "pokemon_animation.h"
+#include "item.h"
+#include "link.h"
+#include "main.h"
+#include "malloc.h"
+#include "m4a.h"
#include "pokedex.h"
#include "pokeblock.h"
+#include "pokemon.h"
+#include "pokemon_animation.h"
+#include "pokemon_storage_system.h"
+#include "pokenav.h"
+#include "random.h"
+#include "recorded_battle.h"
+#include "rtc.h"
#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
#include "task.h"
-#include "rtc.h"
-#include "m4a.h"
-#include "malloc.h"
+#include "text.h"
#include "util.h"
-#include "strings.h"
-#include "pokenav.h"
-#include "pokemon_storage_system.h"
-#include "recorded_battle.h"
-#include "apprentice.h"
+#include "constants/abilities.h"
+#include "constants/battle_frontier.h"
+#include "constants/battle_move_effects.h"
+#include "constants/hold_effects.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "constants/trainers.h"
struct SpeciesItem
{
@@ -80,14 +81,10 @@ 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 u8 GetFrontierEnemyMonLevel(u8);
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 SummaryScreen_SetUnknownTaskId(u8);
// this file's functions
@@ -2904,7 +2901,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m
CalculateMonStats(mon);
}
-void CreateMonWithEVSpreadPersonalityOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId)
+void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId)
{
s32 i;
s32 statCount = 0;
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
index 90bba702e..989bce37d 100644
--- a/src/pokemon_animation.c
+++ b/src/pokemon_animation.c
@@ -1,12 +1,12 @@
#include "global.h"
#include "pokemon.h"
-#include "sprite.h"
#include "pokemon_animation.h"
-#include "trig.h"
+#include "sprite.h"
#include "task.h"
+#include "trig.h"
#include "util.h"
-#include "constants/rgb.h"
#include "constants/battle_anim.h"
+#include "constants/rgb.h"
#include "constants/species.h"
struct UnkAnimStruct
diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c
index e3b54058d..994cc520e 100644
--- a/src/pokemon_icon.c
+++ b/src/pokemon_icon.c
@@ -1,10 +1,10 @@
#include "global.h"
-#include "sprite.h"
-#include "mail.h"
#include "graphics.h"
-#include "constants/species.h"
+#include "mail.h"
#include "palette.h"
#include "pokemon_icon.h"
+#include "sprite.h"
+#include "constants/species.h"
#define POKE_ICON_BASE_PAL_TAG 56000
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index fe3b3e8dd..473bbee03 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -1,10 +1,10 @@
#include "global.h"
-#include "pokemon_size_record.h"
#include "event_data.h"
-#include "constants/species.h"
+#include "pokemon.h"
+#include "pokemon_size_record.h"
#include "string_util.h"
#include "text.h"
-#include "pokemon.h"
+#include "constants/species.h"
#define DEFAULT_MAX_SIZE 0x8000 // was 0x8100 in Ruby/Sapphire
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index c102b570a..465b97da2 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -1,25 +1,25 @@
#include "global.h"
-#include "pokemon_storage_system.h"
-#include "pokemon.h"
-#include "constants/species.h"
-#include "event_data.h"
-#include "string_util.h"
-#include "text.h"
-#include "strings.h"
-#include "window.h"
-#include "menu.h"
#include "bg.h"
-#include "main.h"
-#include "palette.h"
-#include "overworld.h"
+#include "event_data.h"
#include "field_screen.h"
#include "field_weather.h"
-#include "script.h"
+#include "gpu_regs.h"
#include "international_string_util.h"
-#include "walda_phrase.h"
+#include "main.h"
+#include "menu.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "pokemon_storage_system.h"
+#include "script.h"
#include "sound.h"
-#include "gpu_regs.h"
+#include "string_util.h"
+#include "strings.h"
+#include "text.h"
+#include "walda_phrase.h"
+#include "window.h"
#include "constants/songs.h"
+#include "constants/species.h"
IWRAM_DATA u8 gUnknown_03000F78[0x188];
diff --git a/src/rom6.c b/src/rom6.c
index cc146fc94..8043730d2 100644
--- a/src/rom6.c
+++ b/src/rom6.c
@@ -1,21 +1,23 @@
#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_object_movement.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 "party_menu.h"
+#include "rom6.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
+#include "constants/event_object_movement_constants.h"
+#include "constants/event_objects.h"
+#include "constants/field_effects.h"
#include "constants/map_types.h"
+#include "constants/songs.h"
// static functions
static void task08_080C9820(u8 taskId);
@@ -31,14 +33,14 @@ static void sub_8135780(void);
extern struct MapPosition gPlayerFacingPosition;
// text
-bool8 CheckObjectGraphicsInFrontOfPlayer(u8 a)
+bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId)
{
u8 eventObjId;
GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
gPlayerFacingPosition.height = PlayerGetZCoord();
eventObjId = GetEventObjectIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height);
- if (gEventObjects[eventObjId].graphicsId != a)
+ if (gEventObjects[eventObjId].graphicsId != graphicsId)
{
return FALSE;
}
@@ -73,7 +75,7 @@ static void task08_080C9820(u8 taskId)
else
{
sub_808C114();
- EventObjectSetHeldMovement(&gEventObjects[eventObjId], 0x39);
+ EventObjectSetHeldMovement(&gEventObjects[eventObjId], MOVEMENT_ACTION_START_ANIM_IN_DIRECTION);
gTasks[taskId].func = sub_813552C;
}
}
@@ -90,7 +92,7 @@ static void sub_813552C(u8 taskId)
static void sub_8135578(u8 taskId)
{
- if (!FieldEffectActiveListContains(6))
+ if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
{
gFieldEffectArguments[1] = GetPlayerFacingDirection();
if (gFieldEffectArguments[1] == 1)
@@ -189,7 +191,7 @@ bool8 FldEff_UseDig(void)
gTasks[taskId].data[8] = (u32)sub_8135780 >> 16;
gTasks[taskId].data[9] = (u32)sub_8135780;
if (!ShouldDoBrailleDigEffect())
- SetPlayerAvatarTransitionFlags(1);
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
return FALSE;
}
diff --git a/src/start_menu.c b/src/start_menu.c
index 217d7be6a..173d0a79f 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -34,8 +34,7 @@
#include "constants/songs.h"
#include "field_player_avatar.h"
#include "battle_pyramid_bag.h"
-
-extern bool8 InBattlePike(void);
+#include "battle_pike.h"
// Menu actions
enum
diff --git a/src/time_events.c b/src/time_events.c
index 1f46e7705..9702d321f 100644
--- a/src/time_events.c
+++ b/src/time_events.c
@@ -81,7 +81,7 @@ void UpdateShoalTideFlag(void)
1, // 23
};
- if (is_map_type_1_2_3_5_or_6(get_map_light_from_warp0()))
+ if (is_map_type_1_2_3_5_or_6(GetLastUsedWarpMapType()))
{
RtcCalcLocalTime();
if (tide[gLocalTime.hours])
diff --git a/src/trainer_see.c b/src/trainer_see.c
index f5e9c300e..726d89847 100644
--- a/src/trainer_see.c
+++ b/src/trainer_see.c
@@ -1,17 +1,18 @@
#include "global.h"
-#include "trainer_see.h"
#include "battle_setup.h"
-#include "pokemon.h"
-#include "sprite.h"
-#include "field_effect.h"
+#include "event_data.h"
#include "event_object_movement.h"
+#include "field_effect.h"
#include "field_player_avatar.h"
+#include "pokemon.h"
#include "pokenav.h"
-#include "task.h"
-#include "util.h"
#include "script.h"
-#include "event_data.h"
#include "script_movement.h"
+#include "sprite.h"
+#include "task.h"
+#include "trainer_see.h"
+#include "util.h"
+#include "constants/field_effects.h"
extern bool8 InBattlePyramid(void);
extern bool32 InTrainerHill(void);
diff --git a/src/wallclock.c b/src/wallclock.c
index 60a5fae07..e2e03ecba 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -1,37 +1,24 @@
#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 "decompress.h"
#include "event_data.h"
+#include "gpu_regs.h"
#include "graphics.h"
-#include "text.h"
-#include "window.h"
-#include "text_window.h"
+#include "main.h"
#include "menu.h"
+#include "palette.h"
+#include "rtc.h"
#include "scanline_effect.h"
-#include "task.h"
-#include "strings.h"
#include "sound.h"
-#include "constants/songs.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.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
+#include "wallclock.h"
+#include "window.h"
+#include "constants/songs.h"
// static declarations
@@ -46,15 +33,39 @@ 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 u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed);
+static bool32 AdvanceClock(u8 taskId, u8 direction);
+static void UpdateClockPeriod(u8 taskId, u8 direction);
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);
+#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
+
+enum
+{
+ PERIOD_AM,
+ PERIOD_PM,
+};
+
+enum
+{
+ MVMT_NONE,
+ MVMT_BACKWARD,
+ MVMT_FORWARD,
+};
+
// rodata
static const u32 sUnknown_085B1F58[] = INCBIN_U32("graphics/wallclock/graphics_85b1f58.4bpp.lz");
@@ -122,17 +133,17 @@ static const struct SpritePalette gUnknown_085B2218[] = {
{}
};
static const struct OamData Unknown_085B2230 = {
- .y = 0xa0,
+ .y = 160,
.size = 3,
- .priority = 1
+ .priority = 1,
};
static const union AnimCmd Unknown_085B2238[] = {
ANIMCMD_FRAME(0, 30),
- ANIMCMD_END
+ ANIMCMD_END,
};
static const union AnimCmd Unknown_085B2240[] = {
ANIMCMD_FRAME(64, 30),
- ANIMCMD_END
+ ANIMCMD_END,
};
static const union AnimCmd *const gUnknown_085B2248[] = {
Unknown_085B2238
@@ -148,7 +159,7 @@ static const struct SpriteTemplate gUnknown_085B2250 =
.anims = gUnknown_085B2248,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_MinuteHand
+ .callback = SpriteCB_MinuteHand,
};
static const struct SpriteTemplate gUnknown_085B2268 =
{
@@ -158,20 +169,20 @@ static const struct SpriteTemplate gUnknown_085B2268 =
.anims = gUnknown_085B224C,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_HourHand
+ .callback = SpriteCB_HourHand,
};
static const struct OamData Unknown_085B2280 = {
- .y = 0xa0,
+ .y = 160,
.size = 1,
- .priority = 3
+ .priority = 3,
};
static const union AnimCmd Unknown_085B2288[] = {
- ANIMCMD_FRAME(0x84, 30),
- ANIMCMD_END
+ ANIMCMD_FRAME(132, 30),
+ ANIMCMD_END,
};
static const union AnimCmd Unknown_085B2290[] = {
- ANIMCMD_FRAME(0x80, 30),
- ANIMCMD_END
+ ANIMCMD_FRAME(128, 30),
+ ANIMCMD_END,
};
static const union AnimCmd *const gUnknown_085B2298[] = {
Unknown_085B2288
@@ -648,21 +659,21 @@ void CB2_StartWallClock(void)
gTasks[taskId].tMinuteHandAngle = 0;
gTasks[taskId].tHourHandAngle = 300;
- spriteId = CreateSprite(&gUnknown_085B2250, 0x78, 0x50, 1);
+ spriteId = CreateSprite(&gUnknown_085B2250, 120, 80, 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);
+ spriteId = CreateSprite(&gUnknown_085B2268, 120, 80, 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);
+ spriteId = CreateSprite(&gUnknown_085B22A0, 120, 80, 2);
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = 45;
- spriteId = CreateSprite(&gUnknown_085B22B8, 0x78, 0x50, 2);
+ spriteId = CreateSprite(&gUnknown_085B22B8, 120, 80, 2);
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = 90;
@@ -696,21 +707,21 @@ void CB2_ViewWallClock(void)
angle2 = 135;
}
- spriteId = CreateSprite(&gUnknown_085B2250, 0x78, 0x50, 1);
+ spriteId = CreateSprite(&gUnknown_085B2250, 120, 80, 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);
+ spriteId = CreateSprite(&gUnknown_085B2268, 120, 80, 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);
+ spriteId = CreateSprite(&gUnknown_085B22A0, 120, 80, 2);
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = angle1;
- spriteId = CreateSprite(&gUnknown_085B22B8, 0x78, 0x50, 2);
+ spriteId = CreateSprite(&gUnknown_085B22B8, 120, 80, 2);
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = angle2;
@@ -757,11 +768,11 @@ static void Task_SetClock2(u8 taskId)
gTasks[taskId].tMvmtDir = 0;
if (gMain.heldKeys & DPAD_LEFT)
{
- gTasks[taskId].tMvmtDir = 1;
+ gTasks[taskId].tMvmtDir = MVMT_BACKWARD;
}
if (gMain.heldKeys & DPAD_RIGHT)
{
- gTasks[taskId].tMvmtDir = 2;
+ gTasks[taskId].tMvmtDir = MVMT_FORWARD;
}
if (gTasks[taskId].tMvmtDir != 0)
{
@@ -794,12 +805,12 @@ static void Task_SetClock4(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
+ case 0: //YES
PlaySE(SE_SELECT);
gTasks[taskId].func = Task_SetClock5;
break;
- case 1:
- case -1:
+ case 1: //B button
+ case -1: //NO
PlaySE(SE_SELECT);
sub_8198070(0, FALSE);
ClearWindowTilemap(0);
@@ -855,45 +866,49 @@ static void Task_ViewClock4(u8 taskId)
}
}
-static u8 CalcMinHandDelta(u16 a0)
+static u8 CalcMinHandDelta(u16 speed)
{
- if (a0 > 60)
+ if (speed > 60)
{
return 6;
}
- if (a0 > 30)
+ if (speed > 30)
{
return 3;
}
- if (a0 > 10)
+ if (speed > 10)
{
return 2;
}
return 1;
}
-static u16 CalcNewMinHandAngle(u16 a0, u8 command, u8 a2)
+static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed)
{
- u8 r1 = CalcMinHandDelta(a2);
- switch (command)
+ u8 delta = CalcMinHandDelta(speed);
+ switch (direction)
{
- case 1:
- if (a0) a0 -= r1;
- else a0 = 360 - r1;
+ case MVMT_BACKWARD:
+ if (angle)
+ angle -= delta ;
+ else
+ angle = 360 - delta ;
break;
- case 2:
- if (a0 < 360 - r1) a0 += r1;
- else a0 = 0;
+ case MVMT_FORWARD:
+ if (angle < 360 - delta )
+ angle += delta ;
+ else
+ angle = 0;
break;
}
- return a0;
+ return angle;
}
-static bool32 AdvanceClock(u8 taskId, u8 command)
+static bool32 AdvanceClock(u8 taskId, u8 direction)
{
- switch (command)
+ switch (direction)
{
- case 1:
+ case MVMT_BACKWARD:
if (gTasks[taskId].tMinutes > 0)
{
gTasks[taskId].tMinutes--;
@@ -909,10 +924,10 @@ static bool32 AdvanceClock(u8 taskId, u8 command)
{
gTasks[taskId].tHours = 23;
}
- UpdateClockPeriod(taskId, command);
+ UpdateClockPeriod(taskId, direction);
}
break;
- case 2:
+ case MVMT_FORWARD:
if (gTasks[taskId].tMinutes < 59)
{
gTasks[taskId].tMinutes++;
@@ -928,37 +943,37 @@ static bool32 AdvanceClock(u8 taskId, u8 command)
{
gTasks[taskId].tHours = 0;
}
- UpdateClockPeriod(taskId, command);
+ UpdateClockPeriod(taskId, direction);
}
break;
}
return FALSE;
}
-static void UpdateClockPeriod(u8 taskId, u8 command)
+static void UpdateClockPeriod(u8 taskId, u8 direction)
{
u8 hours = gTasks[taskId].tHours;
- switch (command)
+ switch (direction)
{
- case 1:
+ case MVMT_BACKWARD:
switch (hours)
{
case 11:
- gTasks[taskId].tPeriod = FALSE;
+ gTasks[taskId].tPeriod = PERIOD_AM;
break;
case 23:
- gTasks[taskId].tPeriod = TRUE;
+ gTasks[taskId].tPeriod = PERIOD_PM;
break;
}
break;
- case 2:
+ case MVMT_FORWARD:
switch (hours)
{
case 0:
- gTasks[taskId].tPeriod = FALSE;
+ gTasks[taskId].tPeriod = PERIOD_AM;
break;
case 12:
- gTasks[taskId].tPeriod = TRUE;
+ gTasks[taskId].tPeriod = PERIOD_PM;
break;
}
break;
@@ -974,11 +989,11 @@ static void InitClockWithRtc(u8 taskId)
gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5;
if (gLocalTime.hours < 12)
{
- gTasks[taskId].tPeriod = FALSE;
+ gTasks[taskId].tPeriod = PERIOD_AM;
}
else
{
- gTasks[taskId].tPeriod = TRUE;
+ gTasks[taskId].tPeriod = PERIOD_PM;
}
}
@@ -987,8 +1002,7 @@ 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;
+ u16 xhat, yhat;
SetOamMatrix(0, cos, sin, -sin, cos);
xhat = sClockHandCoords[angle][0];
@@ -1011,8 +1025,7 @@ 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;
+ u16 xhat, yhat;
SetOamMatrix(1, cos, sin, -sin, cos);
xhat = sClockHandCoords[angle][0];
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index ec69ad2b5..52dbdf65e 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -18,6 +18,7 @@
#include "tv.h"
#include "link.h"
#include "script.h"
+#include "battle_pike.h"
#include "constants/items.h"
#include "constants/maps.h"
@@ -25,10 +26,7 @@ extern const u8 EventScript_RepelWoreOff[];
#define NUM_FEEBAS_SPOTS 6
-extern u8 GetBattlePikeWildMonHeaderId(void);
-extern bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate);
extern void GenerateBattlePyramidWildMon(void);
-extern bool8 InBattlePike(void);
extern bool8 InBattlePyramid(void);
// this file's functions