diff options
Diffstat (limited to 'src')
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 |