diff options
-rw-r--r-- | berry_fix/asm/loader.s | 2 | ||||
-rw-r--r-- | berry_fix/payload/include/gba/m4a_internal.h | 34 | ||||
-rwxr-xr-x | common_syms/battle_anim_special.txt | 3 | ||||
-rwxr-xr-x | common_syms/battle_anim_throw.txt | 3 | ||||
-rw-r--r-- | constants/gba_constants.inc | 6 | ||||
-rw-r--r-- | data/battle_anim_scripts.s | 6 | ||||
-rw-r--r-- | data/event_scripts.s | 14 | ||||
-rw-r--r-- | data/layouts/Underwater_Route105/border.bin (renamed from data/layouts/Underwater1/border.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route105/map.bin (renamed from data/layouts/Underwater6/map.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route124/border.bin (renamed from data/layouts/Underwater2/border.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route124/map.bin (renamed from data/layouts/Underwater1/map.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route125/border.bin (renamed from data/layouts/Underwater3/border.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route125/map.bin (renamed from data/layouts/Underwater7/map.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route126/border.bin (renamed from data/layouts/Underwater4/border.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route126/map.bin (renamed from data/layouts/Underwater2/map.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route127/border.bin (renamed from data/layouts/Underwater5/border.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route127/map.bin (renamed from data/layouts/Underwater3/map.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route128/border.bin (renamed from data/layouts/Underwater6/border.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route128/map.bin (renamed from data/layouts/Underwater4/map.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route129/border.bin (renamed from data/layouts/Underwater7/border.bin) | 0 | ||||
-rw-r--r-- | data/layouts/Underwater_Route129/map.bin (renamed from data/layouts/Underwater5/map.bin) | 0 | ||||
-rw-r--r-- | data/layouts/layouts.json | 56 | ||||
-rw-r--r-- | data/maps/MtChimney_CableCarStation/scripts.inc | 2 | ||||
-rw-r--r-- | data/maps/Route105/map.json | 2 | ||||
-rw-r--r-- | data/maps/Route112_CableCarStation/scripts.inc | 2 | ||||
-rw-r--r-- | data/maps/Route124/map.json | 2 | ||||
-rw-r--r-- | data/maps/Route125/map.json | 2 | ||||
-rw-r--r-- | data/maps/Route126/map.json | 2 | ||||
-rw-r--r-- | data/maps/Route127/map.json | 2 | ||||
-rw-r--r-- | data/maps/Route128/map.json | 2 | ||||
-rw-r--r-- | data/maps/Route129/map.json | 2 | ||||
-rw-r--r-- | data/maps/SeafloorCavern_Entrance/map.json | 2 | ||||
-rw-r--r-- | data/maps/SootopolisCity/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater1/scripts.inc | 3 | ||||
-rw-r--r-- | data/maps/Underwater2/scripts.inc | 3 | ||||
-rw-r--r-- | data/maps/Underwater3/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater4/scripts.inc | 3 | ||||
-rw-r--r-- | data/maps/Underwater5/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater6/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater7/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater_Route105/map.json (renamed from data/maps/Underwater6/map.json) | 8 | ||||
-rw-r--r-- | data/maps/Underwater_Route105/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater_Route124/map.json (renamed from data/maps/Underwater1/map.json) | 22 | ||||
-rw-r--r-- | data/maps/Underwater_Route124/scripts.inc | 3 | ||||
-rw-r--r-- | data/maps/Underwater_Route125/map.json (renamed from data/maps/Underwater7/map.json) | 8 | ||||
-rw-r--r-- | data/maps/Underwater_Route125/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater_Route126/map.json (renamed from data/maps/Underwater2/map.json) | 28 | ||||
-rw-r--r-- | data/maps/Underwater_Route126/scripts.inc | 3 | ||||
-rw-r--r-- | data/maps/Underwater_Route127/map.json (renamed from data/maps/Underwater3/map.json) | 20 | ||||
-rw-r--r-- | data/maps/Underwater_Route127/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater_Route128/map.json (renamed from data/maps/Underwater4/map.json) | 14 | ||||
-rw-r--r-- | data/maps/Underwater_Route128/scripts.inc | 3 | ||||
-rw-r--r-- | data/maps/Underwater_Route129/map.json (renamed from data/maps/Underwater5/map.json) | 6 | ||||
-rw-r--r-- | data/maps/Underwater_Route129/scripts.inc | 8 | ||||
-rw-r--r-- | data/maps/Underwater_SeafloorCavern/map.json | 4 | ||||
-rw-r--r-- | data/maps/Underwater_SootopolisCity/map.json | 4 | ||||
-rw-r--r-- | data/maps/map_groups.json | 28 | ||||
-rw-r--r-- | data/scripts/berry_blender.inc | 15 | ||||
-rw-r--r-- | gflib/bg.c | 112 | ||||
-rw-r--r-- | gflib/text.c | 10 | ||||
-rw-r--r-- | gflib/text.h | 6 | ||||
-rw-r--r-- | gflib/window.c | 36 | ||||
-rw-r--r-- | graphics/berry_blender/score_symbols.png (renamed from graphics/berry_blender/marubatsu.png) | bin | 293 -> 293 bytes | |||
-rw-r--r-- | graphics/berry_blender/unused.pal (renamed from graphics/unknown/unknown_339514.pal) | 0 | ||||
-rw-r--r-- | graphics/cable_car/bg.pal (renamed from graphics/misc/cable_car_bg.pal) | 0 | ||||
-rw-r--r-- | graphics/cable_car/bg.png (renamed from graphics/misc/cable_car_bg.png) | bin | 4982 -> 4982 bytes | |||
-rw-r--r-- | graphics/cable_car/bg_mountains.bin (renamed from graphics/misc/cable_car_mountain_map.bin) | 0 | ||||
-rw-r--r-- | graphics/cable_car/cable.png (renamed from graphics/misc/cable_car_cord.png) | bin | 147 -> 147 bytes | |||
-rw-r--r-- | graphics/cable_car/cable_car.png (renamed from graphics/misc/cable_car.png) | bin | 556 -> 556 bytes | |||
-rw-r--r-- | graphics/cable_car/door.png (renamed from graphics/misc/cable_car_door.png) | bin | 155 -> 155 bytes | |||
-rw-r--r-- | graphics/cable_car/ground.bin (renamed from graphics/misc/cable_car_mt_chimney_map.bin) | bin | 360 -> 360 bytes | |||
-rw-r--r-- | graphics/cable_car/pylons.bin (renamed from graphics/misc/cable_car_pylon_stem_map.bin) | 0 | ||||
-rw-r--r-- | graphics/cable_car/trees.bin (renamed from graphics/misc/cable_car_tree_map.bin) | bin | 960 -> 960 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/kyogre.png | bin | 1110 -> 0 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/clouds.pal (renamed from graphics/rayquaza_scene/clouds.pal) | 0 | ||||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/clouds.png (renamed from graphics/rayquaza_scene/clouds.png) | bin | 964 -> 964 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/clouds1.bin (renamed from graphics/rayquaza_scene/clouds1.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/clouds2.bin (renamed from graphics/rayquaza_scene/clouds2.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/clouds3.bin (renamed from graphics/rayquaza_scene/clouds3.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/groudon.png (renamed from graphics/rayquaza_scene/groudon.png) | bin | 1578 -> 1578 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/groudon_claw.png (renamed from graphics/rayquaza_scene/groudon_claw.png) | bin | 445 -> 445 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/groudon_shoulder.png (renamed from graphics/rayquaza_scene/groudon_shoulder.png) | bin | 259 -> 259 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/kyogre.png | bin | 0 -> 1076 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.png (renamed from graphics/rayquaza_scene/kyogre_fin.png) | bin | 261 -> 261 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.png (renamed from graphics/rayquaza_scene/kyogre_shoulder.png) | bin | 179 -> 179 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_2/bg.bin (renamed from graphics/rayquaza_scene/overcast.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_2/bg.png (renamed from graphics/rayquaza_scene/overcast.png) | bin | 3705 -> 3705 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_2/rayquaza.bin (renamed from graphics/rayquaza_scene/rayquaza.bin) | bin | 1024 -> 1024 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_2/rayquaza.png (renamed from graphics/rayquaza_scene/rayquaza.png) | bin | 3187 -> 3187 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_2/smoke.png (renamed from graphics/rayquaza_scene/smoke.png) | bin | 242 -> 242 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_3/bg.bin (renamed from graphics/rayquaza_scene/overcast2.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_3/bg.pal (renamed from graphics/rayquaza_scene/overcast2.pal) | 0 | ||||
-rw-r--r-- | graphics/rayquaza_scene/scene_3/bg.png (renamed from graphics/rayquaza_scene/overcast2.png) | bin | 2408 -> 2408 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_3/light.bin (renamed from graphics/rayquaza_scene/rayquaza_light.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_3/light.png (renamed from graphics/rayquaza_scene/rayquaza_light.png) | bin | 534 -> 534 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_3/rayquaza.png (renamed from graphics/rayquaza_scene/rayquaza_fly1.png) | bin | 815 -> 815 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_3/rayquaza_tail.png (renamed from graphics/rayquaza_scene/rayquaza_tail.png) | bin | 264 -> 264 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/bg.bin (renamed from graphics/rayquaza_scene/chase_bg.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/bg.pal (renamed from graphics/rayquaza_scene/chase.pal) | 0 | ||||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/bg.png (renamed from graphics/rayquaza_scene/chase_bg.png) | bin | 336 -> 336 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/orbs.bin (renamed from graphics/rayquaza_scene/rayquaza_chase2.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/rayquaza.bin (renamed from graphics/rayquaza_scene/rayquaza_chase.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/rayquaza.png (renamed from graphics/rayquaza_scene/rayquaza_chase.png) | bin | 2184 -> 2184 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/streaks.bin (renamed from graphics/rayquaza_scene/chase_streaks.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_4/streaks.png (renamed from graphics/rayquaza_scene/chase_streaks.png) | bin | 279 -> 279 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/bg.bin (renamed from graphics/rayquaza_scene/hush_ring.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/bg.pal (renamed from graphics/rayquaza_scene/hush_bg.pal) | 0 | ||||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/groudon.png (renamed from graphics/rayquaza_scene/groudon_left.png) | bin | 1153 -> 1153 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/groudon_tail.png (renamed from graphics/rayquaza_scene/groudon_tail.png) | bin | 168 -> 168 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/kyogre.png (renamed from graphics/rayquaza_scene/kyogre_right.png) | bin | 505 -> 505 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/kyogre_splash.png (renamed from graphics/rayquaza_scene/splash.png) | bin | 205 -> 205 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/light.bin (renamed from graphics/rayquaza_scene/hush_bg.bin) | bin | 2048 -> 2048 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/light.png (renamed from graphics/rayquaza_scene/hush_bg.png) | bin | 339 -> 339 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/rayquaza.png (renamed from graphics/rayquaza_scene/rayquaza_hover.png) | bin | 2370 -> 2370 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/rayquaza_tail.png (renamed from graphics/rayquaza_scene/rayquaza_flyin.png) | bin | 391 -> 391 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/ring.bin (renamed from graphics/rayquaza_scene/hush_ring_map.bin) | bin | 256 -> 256 bytes | |||
-rw-r--r-- | graphics/rayquaza_scene/scene_5/ring.png (renamed from graphics/rayquaza_scene/hush_ring.png) | bin | 385 -> 385 bytes | |||
-rw-r--r-- | graphics_file_rules.mk | 12 | ||||
-rw-r--r-- | include/battle.h | 10 | ||||
-rw-r--r-- | include/battle_anim.h | 4 | ||||
-rw-r--r-- | include/battle_main.h | 2 | ||||
-rw-r--r-- | include/berry_blender.h | 10 | ||||
-rw-r--r-- | include/constants/battle_anim.h | 2 | ||||
-rw-r--r-- | include/constants/daycare.h | 2 | ||||
-rw-r--r-- | include/constants/flags.h | 42 | ||||
-rwxr-xr-x | include/constants/layouts.h | 14 | ||||
-rwxr-xr-x | include/constants/map_groups.h | 114 | ||||
-rw-r--r-- | include/constants/pokemon.h | 2 | ||||
-rw-r--r-- | include/constants/region_map_sections.h | 12 | ||||
-rw-r--r-- | include/gba/io_reg.h | 10 | ||||
-rw-r--r-- | include/gba/m4a_internal.h | 92 | ||||
-rw-r--r-- | include/global.h | 1 | ||||
-rw-r--r-- | include/global.tv.h | 82 | ||||
-rw-r--r-- | include/graphics.h | 124 | ||||
-rw-r--r-- | include/item_menu.h | 2 | ||||
-rw-r--r-- | include/item_menu_icons.h | 2 | ||||
-rw-r--r-- | include/link.h | 104 | ||||
-rw-r--r-- | include/link_rfu.h | 32 | ||||
-rw-r--r-- | include/list_menu.h | 4 | ||||
-rw-r--r-- | include/palette.h | 2 | ||||
-rw-r--r-- | include/pokeball.h | 8 | ||||
-rw-r--r-- | include/pokeblock.h | 13 | ||||
-rw-r--r-- | include/rayquaza_scene.h | 13 | ||||
-rw-r--r-- | include/rom_8011DC0.h | 4 | ||||
-rw-r--r-- | include/strings.h | 5 | ||||
-rw-r--r-- | ld_script.txt | 4 | ||||
-rw-r--r-- | libagbsyscall/libagbsyscall.s | 19 | ||||
-rw-r--r-- | src/AgbRfu_LinkManager.c | 4 | ||||
-rw-r--r-- | src/agb_flash.c | 30 | ||||
-rwxr-xr-x | src/battle_anim_throw.c (renamed from src/battle_anim_special.c) | 1292 | ||||
-rw-r--r-- | src/battle_controller_link_opponent.c | 50 | ||||
-rw-r--r-- | src/battle_controller_link_partner.c | 10 | ||||
-rw-r--r-- | src/battle_controller_opponent.c | 62 | ||||
-rw-r--r-- | src/battle_controller_player.c | 35 | ||||
-rw-r--r-- | src/battle_controller_player_partner.c | 10 | ||||
-rw-r--r-- | src/battle_controller_recorded_opponent.c | 45 | ||||
-rw-r--r-- | src/battle_controller_recorded_player.c | 37 | ||||
-rw-r--r-- | src/battle_controller_safari.c | 4 | ||||
-rw-r--r-- | src/battle_controller_wally.c | 27 | ||||
-rw-r--r-- | src/battle_dome.c | 87 | ||||
-rw-r--r-- | src/battle_main.c | 9 | ||||
-rw-r--r-- | src/battle_message.c | 2 | ||||
-rw-r--r-- | src/battle_records.c | 2 | ||||
-rw-r--r-- | src/battle_script_commands.c | 3 | ||||
-rw-r--r-- | src/berry_blender.c | 3023 | ||||
-rwxr-xr-x | src/berry_crush.c | 8 | ||||
-rw-r--r-- | src/cable_car.c | 666 | ||||
-rw-r--r-- | src/confetti_util.c | 6 | ||||
-rw-r--r-- | src/contest.c | 6 | ||||
-rw-r--r-- | src/contest_util.c | 120 | ||||
-rw-r--r-- | src/credits.c | 2 | ||||
-rw-r--r-- | src/data/graphics/rayquaza_scene.h | 135 | ||||
-rw-r--r-- | src/data/region_map/region_map_entries.h | 426 | ||||
-rwxr-xr-x | src/data/wild_encounters.json | 8 | ||||
-rw-r--r-- | src/daycare.c | 2 | ||||
-rw-r--r-- | src/dodrio_berry_picking.c | 16 | ||||
-rw-r--r-- | src/field_specials.c | 14 | ||||
-rw-r--r-- | src/frontier_util.c | 7 | ||||
-rw-r--r-- | src/graphics.c | 40 | ||||
-rw-r--r-- | src/item.c | 3 | ||||
-rwxr-xr-x | src/item_menu.c | 6 | ||||
-rw-r--r-- | src/item_menu_icons.c | 97 | ||||
-rw-r--r-- | src/link.c | 48 | ||||
-rw-r--r-- | src/link_rfu_2.c | 104 | ||||
-rw-r--r-- | src/list_menu.c | 2 | ||||
-rw-r--r-- | src/m4a.c | 111 | ||||
-rw-r--r-- | src/m4a_1.s | 456 | ||||
-rw-r--r-- | src/map_name_popup.c | 8 | ||||
-rw-r--r-- | src/match_call.c | 2 | ||||
-rw-r--r-- | src/menu.c | 26 | ||||
-rw-r--r-- | src/minigame_countdown.c | 6 | ||||
-rw-r--r-- | src/mirage_tower.c | 7 | ||||
-rw-r--r-- | src/move_relearner.c | 24 | ||||
-rw-r--r-- | src/palette.c | 86 | ||||
-rw-r--r-- | src/pokeball.c | 50 | ||||
-rw-r--r-- | src/pokeblock.c | 42 | ||||
-rw-r--r-- | src/pokeblock_feed.c | 29 | ||||
-rw-r--r-- | src/pokedex.c | 45 | ||||
-rw-r--r-- | src/pokemon.c | 8 | ||||
-rwxr-xr-x | src/pokemon_jump.c | 18 | ||||
-rw-r--r-- | src/pokemon_storage_system.c | 4 | ||||
-rw-r--r-- | src/pokenav.c | 4 | ||||
-rw-r--r-- | src/pokenav_main_menu.c | 9 | ||||
-rw-r--r-- | src/rayquaza_scene.c | 2130 | ||||
-rw-r--r-- | src/region_map.c | 52 | ||||
-rw-r--r-- | src/sound.c | 36 | ||||
-rw-r--r-- | src/start_menu.c | 1 | ||||
-rw-r--r-- | src/task.c | 4 | ||||
-rw-r--r-- | src/trade.c | 1 | ||||
-rw-r--r-- | src/tv.c | 8 | ||||
-rw-r--r-- | src/union_room.c | 18 | ||||
-rwxr-xr-x | src/union_room_chat.c | 2 | ||||
-rw-r--r-- | src/wireless_communication_status_screen.c | 6 | ||||
-rw-r--r-- | sym_common.txt | 2 |
214 files changed, 5845 insertions, 5100 deletions
diff --git a/berry_fix/asm/loader.s b/berry_fix/asm/loader.s index a78014078..24eb2df55 100644 --- a/berry_fix/asm/loader.s +++ b/berry_fix/asm/loader.s @@ -109,7 +109,7 @@ _1a0: strh r1, [r0, 0xa] @ SIOMLT_SEND ldr r0, =_data_2f0 ldr r1, =gCode - swi 0x11 << 16 + svc 0x11 << 16 ldr lr, =gCode bx lr .pool diff --git a/berry_fix/payload/include/gba/m4a_internal.h b/berry_fix/payload/include/gba/m4a_internal.h index 339a0774e..494d31f93 100644 --- a/berry_fix/payload/include/gba/m4a_internal.h +++ b/berry_fix/payload/include/gba/m4a_internal.h @@ -100,12 +100,12 @@ struct CgbChannel u8 le; u8 sw; u32 fr; - u32 wp; - u32 cp; - u32 tp; - u32 pp; - u32 np; - u8 d4[8]; + u32 *wp; + u32 *cp; + void *tp; + void *pp; + void *np; + u32 d4[2]; }; struct MusicPlayerTrack; @@ -138,10 +138,10 @@ struct SoundChannel u32 fw; u32 freq; struct WaveData *wav; - u32 cp; + s8 *cp; struct MusicPlayerTrack *track; - u32 pp; - u32 np; + void *pp; + void *np; u32 d4; u16 xpi; u16 xpc; @@ -172,11 +172,11 @@ struct SoundInfo u8 pcmDmaPeriod; // number of V-blanks per PCM DMA u8 maxLines; u8 gap[3]; - s32 pcmSamplesPerVBlank; - s32 pcmFreq; - s32 divFreq; + u32 pcmSamplesPerVBlank; + u32 pcmFreq; + u32 divFreq; struct CgbChannel *cgbChans; - u32 func; + void (*func)(); u32 intp; void (*CgbSound)(void); void (*CgbOscOff)(u8); @@ -184,7 +184,7 @@ struct SoundInfo u32 MPlayJumpTable; u32 plynote; u32 ExtVolPit; - u8 gap2[16]; + u32 gap2[4]; struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; }; @@ -248,7 +248,7 @@ struct MusicPlayerTrack u8 key; u8 velocity; u8 runningStatus; - u8 keyM; + s8 keyM; u8 pitM; s8 keyShift; s8 keyShiftX; @@ -312,7 +312,7 @@ struct MusicPlayerInfo struct MusicPlayerTrack *tracks; struct ToneData *tone; u32 ident; - u32 func; + void (*func)(); u32 intp; }; @@ -447,7 +447,7 @@ void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *); -void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_note(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *); // extended sound command handler functions void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *); diff --git a/common_syms/battle_anim_special.txt b/common_syms/battle_anim_special.txt deleted file mode 100755 index 2fc194df7..000000000 --- a/common_syms/battle_anim_special.txt +++ /dev/null @@ -1,3 +0,0 @@ -gUnknown_030062DC -gUnknown_030062E0 -gUnknown_030062E4 diff --git a/common_syms/battle_anim_throw.txt b/common_syms/battle_anim_throw.txt new file mode 100755 index 000000000..5e2e8b3ff --- /dev/null +++ b/common_syms/battle_anim_throw.txt @@ -0,0 +1,3 @@ +gMonShrinkDuration +gMonShrinkDelta +gMonShrinkDistance diff --git a/constants/gba_constants.inc b/constants/gba_constants.inc index 3ff857ee8..13cbadf80 100644 --- a/constants/gba_constants.inc +++ b/constants/gba_constants.inc @@ -26,9 +26,9 @@ .set OAM, 0x7000000 - .set SOUND_INFO_PTR, 0x3007FF0 - .set INTR_CHECK, 0x3007FF8 - .set INTR_VECTOR, 0x3007FFC + .set SOUND_INFO_PTR, IWRAM_END - 0x10 + .set INTR_CHECK, IWRAM_END - 0x8 + .set INTR_VECTOR, IWRAM_END - 0x4 .set INTR_FLAG_VBLANK, 1 << 0 .set INTR_FLAG_HBLANK, 1 << 1 diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 89da7b9a5..b4bb33993 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -416,7 +416,7 @@ gBattleAnims_Special:: .4byte Special_SwitchOutPlayerMon @ B_ANIM_SWITCH_OUT_PLAYER_MON .4byte Special_SwitchOutOpponentMon @ B_ANIM_SWITCH_OUT_OPPONENT_MON .4byte Special_BallThrow @ B_ANIM_BALL_THROW - .4byte Special_SafariBallThrow @ B_ANIM_SAFARI_BALL_THROW + .4byte Special_BallThrowWithTrainer @ B_ANIM_BALL_THROW_WITH_TRAINER .4byte Special_SubstituteToMon @ B_ANIM_SUBSTITUTE_TO_MON .4byte Special_MonToSubstitute @ B_ANIM_MON_TO_SUBSTITUTE @@ -10738,10 +10738,10 @@ BallThrowTrainerBlock: blendoff goto BallThrowEnd -Special_SafariBallThrow: +Special_BallThrowWithTrainer: createvisualtask AnimTask_LoadBallGfx, 2 delay 0 - createvisualtask AnimTask_ThrowBallSpecial, 2 + createvisualtask AnimTask_ThrowBall_StandingTrainer, 2 waitforvisualfinish createvisualtask AnimTask_FreeBallGfx, 2 end diff --git a/data/event_scripts.s b/data/event_scripts.s index f8348d0b0..8039be687 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -151,13 +151,13 @@ gStdScripts_End:: @ 81DC2CC .include "data/maps/Route132/scripts.inc" .include "data/maps/Route133/scripts.inc" .include "data/maps/Route134/scripts.inc" - .include "data/maps/Underwater1/scripts.inc" - .include "data/maps/Underwater2/scripts.inc" - .include "data/maps/Underwater3/scripts.inc" - .include "data/maps/Underwater4/scripts.inc" - .include "data/maps/Underwater5/scripts.inc" - .include "data/maps/Underwater6/scripts.inc" - .include "data/maps/Underwater7/scripts.inc" + .include "data/maps/Underwater_Route124/scripts.inc" + .include "data/maps/Underwater_Route126/scripts.inc" + .include "data/maps/Underwater_Route127/scripts.inc" + .include "data/maps/Underwater_Route128/scripts.inc" + .include "data/maps/Underwater_Route129/scripts.inc" + .include "data/maps/Underwater_Route105/scripts.inc" + .include "data/maps/Underwater_Route125/scripts.inc" .include "data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc" .include "data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc" .include "data/maps/LittlerootTown_MaysHouse_1F/scripts.inc" diff --git a/data/layouts/Underwater1/border.bin b/data/layouts/Underwater_Route105/border.bin index b15c94f96..b15c94f96 100644 --- a/data/layouts/Underwater1/border.bin +++ b/data/layouts/Underwater_Route105/border.bin diff --git a/data/layouts/Underwater6/map.bin b/data/layouts/Underwater_Route105/map.bin index 92bd56031..92bd56031 100644 --- a/data/layouts/Underwater6/map.bin +++ b/data/layouts/Underwater_Route105/map.bin diff --git a/data/layouts/Underwater2/border.bin b/data/layouts/Underwater_Route124/border.bin index b15c94f96..b15c94f96 100644 --- a/data/layouts/Underwater2/border.bin +++ b/data/layouts/Underwater_Route124/border.bin diff --git a/data/layouts/Underwater1/map.bin b/data/layouts/Underwater_Route124/map.bin index 230e3dcd2..230e3dcd2 100644 --- a/data/layouts/Underwater1/map.bin +++ b/data/layouts/Underwater_Route124/map.bin diff --git a/data/layouts/Underwater3/border.bin b/data/layouts/Underwater_Route125/border.bin index b15c94f96..b15c94f96 100644 --- a/data/layouts/Underwater3/border.bin +++ b/data/layouts/Underwater_Route125/border.bin diff --git a/data/layouts/Underwater7/map.bin b/data/layouts/Underwater_Route125/map.bin index 660f585ae..660f585ae 100644 --- a/data/layouts/Underwater7/map.bin +++ b/data/layouts/Underwater_Route125/map.bin diff --git a/data/layouts/Underwater4/border.bin b/data/layouts/Underwater_Route126/border.bin index b15c94f96..b15c94f96 100644 --- a/data/layouts/Underwater4/border.bin +++ b/data/layouts/Underwater_Route126/border.bin diff --git a/data/layouts/Underwater2/map.bin b/data/layouts/Underwater_Route126/map.bin index 0c6377c30..0c6377c30 100644 --- a/data/layouts/Underwater2/map.bin +++ b/data/layouts/Underwater_Route126/map.bin diff --git a/data/layouts/Underwater5/border.bin b/data/layouts/Underwater_Route127/border.bin index b15c94f96..b15c94f96 100644 --- a/data/layouts/Underwater5/border.bin +++ b/data/layouts/Underwater_Route127/border.bin diff --git a/data/layouts/Underwater3/map.bin b/data/layouts/Underwater_Route127/map.bin index fc5c331a5..fc5c331a5 100644 --- a/data/layouts/Underwater3/map.bin +++ b/data/layouts/Underwater_Route127/map.bin diff --git a/data/layouts/Underwater6/border.bin b/data/layouts/Underwater_Route128/border.bin index b15c94f96..b15c94f96 100644 --- a/data/layouts/Underwater6/border.bin +++ b/data/layouts/Underwater_Route128/border.bin diff --git a/data/layouts/Underwater4/map.bin b/data/layouts/Underwater_Route128/map.bin index 23f987681..23f987681 100644 --- a/data/layouts/Underwater4/map.bin +++ b/data/layouts/Underwater_Route128/map.bin diff --git a/data/layouts/Underwater7/border.bin b/data/layouts/Underwater_Route129/border.bin index b15c94f96..b15c94f96 100644 --- a/data/layouts/Underwater7/border.bin +++ b/data/layouts/Underwater_Route129/border.bin diff --git a/data/layouts/Underwater5/map.bin b/data/layouts/Underwater_Route129/map.bin index 902f0dbdc..902f0dbdc 100644 --- a/data/layouts/Underwater5/map.bin +++ b/data/layouts/Underwater_Route129/map.bin diff --git a/data/layouts/layouts.json b/data/layouts/layouts.json index b2ebeb5c6..9292e10af 100644 --- a/data/layouts/layouts.json +++ b/data/layouts/layouts.json @@ -502,34 +502,34 @@ "blockdata_filepath": "data/layouts/Route134/map.bin" }, { - "id": "LAYOUT_UNDERWATER2", - "name": "Underwater2_Layout", + "id": "LAYOUT_UNDERWATER_ROUTE126", + "name": "Underwater_Route126_Layout", "width": 80, "height": 80, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", - "border_filepath": "data/layouts/Underwater2/border.bin", - "blockdata_filepath": "data/layouts/Underwater2/map.bin" + "border_filepath": "data/layouts/Underwater_Route126/border.bin", + "blockdata_filepath": "data/layouts/Underwater_Route126/map.bin" }, { - "id": "LAYOUT_UNDERWATER3", - "name": "Underwater3_Layout", + "id": "LAYOUT_UNDERWATER_ROUTE127", + "name": "Underwater_Route127_Layout", "width": 80, "height": 80, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", - "border_filepath": "data/layouts/Underwater3/border.bin", - "blockdata_filepath": "data/layouts/Underwater3/map.bin" + "border_filepath": "data/layouts/Underwater_Route127/border.bin", + "blockdata_filepath": "data/layouts/Underwater_Route127/map.bin" }, { - "id": "LAYOUT_UNDERWATER4", - "name": "Underwater4_Layout", + "id": "LAYOUT_UNDERWATER_ROUTE128", + "name": "Underwater_Route128_Layout", "width": 120, "height": 40, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", - "border_filepath": "data/layouts/Underwater4/border.bin", - "blockdata_filepath": "data/layouts/Underwater4/map.bin" + "border_filepath": "data/layouts/Underwater_Route128/border.bin", + "blockdata_filepath": "data/layouts/Underwater_Route128/map.bin" }, { "id": "LAYOUT_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F", @@ -2732,14 +2732,14 @@ "blockdata_filepath": "data/layouts/LilycoveCity_DepartmentStoreElevator/map.bin" }, { - "id": "LAYOUT_UNDERWATER1", - "name": "Underwater1_Layout", + "id": "LAYOUT_UNDERWATER_ROUTE124", + "name": "Underwater_Route124_Layout", "width": 80, "height": 80, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", - "border_filepath": "data/layouts/Underwater1/border.bin", - "blockdata_filepath": "data/layouts/Underwater1/map.bin" + "border_filepath": "data/layouts/Underwater_Route124/border.bin", + "blockdata_filepath": "data/layouts/Underwater_Route124/map.bin" }, { "id": "LAYOUT_MOSSDEEP_CITY_SPACE_CENTER_1F", @@ -4092,34 +4092,34 @@ "blockdata_filepath": "data/layouts/TerraCave_End/map.bin" }, { - "id": "LAYOUT_UNDERWATER6", - "name": "Underwater6_Layout", + "id": "LAYOUT_UNDERWATER_ROUTE105", + "name": "Underwater_Route105_Layout", "width": 40, "height": 80, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", - "border_filepath": "data/layouts/Underwater6/border.bin", - "blockdata_filepath": "data/layouts/Underwater6/map.bin" + "border_filepath": "data/layouts/Underwater_Route105/border.bin", + "blockdata_filepath": "data/layouts/Underwater_Route105/map.bin" }, { - "id": "LAYOUT_UNDERWATER7", - "name": "Underwater7_Layout", + "id": "LAYOUT_UNDERWATER_ROUTE125", + "name": "Underwater_Route125_Layout", "width": 80, "height": 40, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", - "border_filepath": "data/layouts/Underwater7/border.bin", - "blockdata_filepath": "data/layouts/Underwater7/map.bin" + "border_filepath": "data/layouts/Underwater_Route125/border.bin", + "blockdata_filepath": "data/layouts/Underwater_Route125/map.bin" }, { - "id": "LAYOUT_UNDERWATER5", - "name": "Underwater5_Layout", + "id": "LAYOUT_UNDERWATER_ROUTE129", + "name": "Underwater_Route129_Layout", "width": 80, "height": 40, "primary_tileset": "gTileset_General", "secondary_tileset": "gTileset_Underwater", - "border_filepath": "data/layouts/Underwater5/border.bin", - "blockdata_filepath": "data/layouts/Underwater5/map.bin" + "border_filepath": "data/layouts/Underwater_Route129/border.bin", + "blockdata_filepath": "data/layouts/Underwater_Route129/map.bin" }, { "id": "LAYOUT_MARINE_CAVE_END", diff --git a/data/maps/MtChimney_CableCarStation/scripts.inc b/data/maps/MtChimney_CableCarStation/scripts.inc index 6ce84933f..5eebdb767 100644 --- a/data/maps/MtChimney_CableCarStation/scripts.inc +++ b/data/maps/MtChimney_CableCarStation/scripts.inc @@ -46,7 +46,7 @@ MtChimney_CableCarStation_EventScript_RideCableCar:: @ 822AC6C applymovement LOCALID_ATTENDANT, MtChimney_CableCarStation_Movement_LeadPlayerToCableCar applymovement OBJ_EVENT_ID_PLAYER, MtChimney_CableCarStation_Movement_BoardCableCar waitmovement 0 - setvar VAR_0x8004, 1 + setvar VAR_0x8004, TRUE @ Going down setvar VAR_CABLE_CAR_STATION_STATE, 2 incrementgamestat GAME_STAT_RODE_CABLE_CAR special CableCarWarp diff --git a/data/maps/Route105/map.json b/data/maps/Route105/map.json index bb6c7a653..bd951f62c 100644 --- a/data/maps/Route105/map.json +++ b/data/maps/Route105/map.json @@ -26,7 +26,7 @@ { "direction": "dive", "offset": 0, - "map": "MAP_UNDERWATER6" + "map": "MAP_UNDERWATER_ROUTE105" } ], "object_events": [ diff --git a/data/maps/Route112_CableCarStation/scripts.inc b/data/maps/Route112_CableCarStation/scripts.inc index b1da3e3cb..6781b154c 100644 --- a/data/maps/Route112_CableCarStation/scripts.inc +++ b/data/maps/Route112_CableCarStation/scripts.inc @@ -47,7 +47,7 @@ Route112_CableCarStation_EventScript_RideCableCar:: @ 822AB38 applymovement LOCALID_ATTENDANT, Route112_CableCarStation_Movement_LeadPlayerToCableCar applymovement OBJ_EVENT_ID_PLAYER, Route112_CableCarStation_Movement_BoardCableCar waitmovement 0 - setvar VAR_0x8004, 0 + setvar VAR_0x8004, FALSE @ Going up setvar VAR_CABLE_CAR_STATION_STATE, 1 incrementgamestat GAME_STAT_RODE_CABLE_CAR special CableCarWarp diff --git a/data/maps/Route124/map.json b/data/maps/Route124/map.json index cb075d29a..370a5f4e4 100644 --- a/data/maps/Route124/map.json +++ b/data/maps/Route124/map.json @@ -36,7 +36,7 @@ { "direction": "dive", "offset": 0, - "map": "MAP_UNDERWATER1" + "map": "MAP_UNDERWATER_ROUTE124" } ], "object_events": [ diff --git a/data/maps/Route125/map.json b/data/maps/Route125/map.json index 984a554e4..719e6b699 100644 --- a/data/maps/Route125/map.json +++ b/data/maps/Route125/map.json @@ -26,7 +26,7 @@ { "direction": "dive", "offset": 0, - "map": "MAP_UNDERWATER7" + "map": "MAP_UNDERWATER_ROUTE125" } ], "object_events": [ diff --git a/data/maps/Route126/map.json b/data/maps/Route126/map.json index 60b439066..bf7d7027c 100644 --- a/data/maps/Route126/map.json +++ b/data/maps/Route126/map.json @@ -26,7 +26,7 @@ { "direction": "dive", "offset": 0, - "map": "MAP_UNDERWATER2" + "map": "MAP_UNDERWATER_ROUTE126" } ], "object_events": [ diff --git a/data/maps/Route127/map.json b/data/maps/Route127/map.json index 0e6d78da7..6ef7022f4 100644 --- a/data/maps/Route127/map.json +++ b/data/maps/Route127/map.json @@ -31,7 +31,7 @@ { "direction": "dive", "offset": 0, - "map": "MAP_UNDERWATER3" + "map": "MAP_UNDERWATER_ROUTE127" } ], "object_events": [ diff --git a/data/maps/Route128/map.json b/data/maps/Route128/map.json index d8fbb249a..0bed932d5 100644 --- a/data/maps/Route128/map.json +++ b/data/maps/Route128/map.json @@ -31,7 +31,7 @@ { "direction": "dive", "offset": 0, - "map": "MAP_UNDERWATER4" + "map": "MAP_UNDERWATER_ROUTE128" } ], "object_events": [ diff --git a/data/maps/Route129/map.json b/data/maps/Route129/map.json index ca814b465..d5383eb50 100644 --- a/data/maps/Route129/map.json +++ b/data/maps/Route129/map.json @@ -26,7 +26,7 @@ { "direction": "dive", "offset": 0, - "map": "MAP_UNDERWATER5" + "map": "MAP_UNDERWATER_ROUTE129" } ], "object_events": [ diff --git a/data/maps/SeafloorCavern_Entrance/map.json b/data/maps/SeafloorCavern_Entrance/map.json index a80fce6c1..1f7095def 100644 --- a/data/maps/SeafloorCavern_Entrance/map.json +++ b/data/maps/SeafloorCavern_Entrance/map.json @@ -33,7 +33,7 @@ "x": 10, "y": 18, "elevation": 3, - "dest_map": "MAP_UNDERWATER4", + "dest_map": "MAP_UNDERWATER_ROUTE128", "dest_warp_id": 0 }, { diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index 6ef9c3d57..e6ceb6418 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -235,7 +235,7 @@ SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: @ 81E5946 fadescreenspeed FADE_TO_BLACK, 8 setweather WEATHER_ABNORMAL doweather - setvar VAR_0x8004, 0 + setvar VAR_0x8004, FALSE @ Just do Groudon/Kyogre fight scene special Script_DoRayquazaScene waitstate applymovement LOCALID_KYOGRE, Common_Movement_WalkInPlaceFastestLeft @@ -335,7 +335,7 @@ SootopolisCity_EventScript_LegendariesSceneFromDive:: @ 81E5A82 fadescreenspeed FADE_TO_BLACK, 8 setweather WEATHER_ABNORMAL doweather - setvar VAR_0x8004, 0 + setvar VAR_0x8004, FALSE @ Just do Groudon/Kyogre fight scene special Script_DoRayquazaScene waitstate applymovement LOCALID_KYOGRE, Common_Movement_WalkInPlaceFastestLeft @@ -528,7 +528,7 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: @ 81E5C1E removeobject LOCALID_GROUDON removeobject LOCALID_KYOGRE addobject LOCALID_RAYQUAZA - setvar VAR_0x8004, 1 + setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate playse SE_THUNDER @@ -581,7 +581,7 @@ SootopolisCity_EventScript_RayquazaSceneFromDive:: @ 81E5CCE removeobject LOCALID_GROUDON removeobject LOCALID_KYOGRE addobject LOCALID_RAYQUAZA - setvar VAR_0x8004, 1 + setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate special SpawnCameraObject diff --git a/data/maps/Underwater1/scripts.inc b/data/maps/Underwater1/scripts.inc deleted file mode 100644 index 107a038a8..000000000 --- a/data/maps/Underwater1/scripts.inc +++ /dev/null @@ -1,3 +0,0 @@ -Underwater1_MapScripts:: @ 81F7722 - .byte 0 - diff --git a/data/maps/Underwater2/scripts.inc b/data/maps/Underwater2/scripts.inc deleted file mode 100644 index 80c854c63..000000000 --- a/data/maps/Underwater2/scripts.inc +++ /dev/null @@ -1,3 +0,0 @@ -Underwater2_MapScripts:: @ 81F7723 - .byte 0 - diff --git a/data/maps/Underwater3/scripts.inc b/data/maps/Underwater3/scripts.inc deleted file mode 100644 index e75acd635..000000000 --- a/data/maps/Underwater3/scripts.inc +++ /dev/null @@ -1,8 +0,0 @@ -Underwater3_MapScripts:: @ 81F7724 - map_script MAP_SCRIPT_ON_RESUME, Underwater3_OnResume - .byte 0 - -Underwater3_OnResume: @ 81F772A - call AbnormalWeather_Underwater_SetupEscapeWarp - end - diff --git a/data/maps/Underwater4/scripts.inc b/data/maps/Underwater4/scripts.inc deleted file mode 100644 index 295c27356..000000000 --- a/data/maps/Underwater4/scripts.inc +++ /dev/null @@ -1,3 +0,0 @@ -Underwater4_MapScripts:: @ 81F7730 - .byte 0 - diff --git a/data/maps/Underwater5/scripts.inc b/data/maps/Underwater5/scripts.inc deleted file mode 100644 index 235d25aba..000000000 --- a/data/maps/Underwater5/scripts.inc +++ /dev/null @@ -1,8 +0,0 @@ -Underwater5_MapScripts:: @ 81F7731 - map_script MAP_SCRIPT_ON_RESUME, Underwater5_OnResume - .byte 0 - -Underwater5_OnResume: @ 81F7737 - call AbnormalWeather_Underwater_SetupEscapeWarp - end - diff --git a/data/maps/Underwater6/scripts.inc b/data/maps/Underwater6/scripts.inc deleted file mode 100644 index 21b639cd8..000000000 --- a/data/maps/Underwater6/scripts.inc +++ /dev/null @@ -1,8 +0,0 @@ -Underwater6_MapScripts:: @ 81F773D - map_script MAP_SCRIPT_ON_RESUME, Underwater6_OnResume - .byte 0 - -Underwater6_OnResume: @ 81F7743 - call AbnormalWeather_Underwater_SetupEscapeWarp - end - diff --git a/data/maps/Underwater7/scripts.inc b/data/maps/Underwater7/scripts.inc deleted file mode 100644 index 4215dced9..000000000 --- a/data/maps/Underwater7/scripts.inc +++ /dev/null @@ -1,8 +0,0 @@ -Underwater7_MapScripts:: @ 81F7749 - map_script MAP_SCRIPT_ON_RESUME, Underwater7_OnResume - .byte 0 - -Underwater7_OnResume: @ 81F774F - call AbnormalWeather_Underwater_SetupEscapeWarp - end - diff --git a/data/maps/Underwater6/map.json b/data/maps/Underwater_Route105/map.json index 2a021f77f..890ccb2a8 100644 --- a/data/maps/Underwater6/map.json +++ b/data/maps/Underwater_Route105/map.json @@ -1,9 +1,9 @@ { - "id": "MAP_UNDERWATER6", - "name": "Underwater6", - "layout": "LAYOUT_UNDERWATER6", + "id": "MAP_UNDERWATER_ROUTE105", + "name": "Underwater_Route105", + "layout": "LAYOUT_UNDERWATER_ROUTE105", "music": "MUS_UNDERWATER", - "region_map_section": "MAPSEC_UNDERWATER_TERRA_CAVE", + "region_map_section": "MAPSEC_UNDERWATER_105", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", diff --git a/data/maps/Underwater_Route105/scripts.inc b/data/maps/Underwater_Route105/scripts.inc new file mode 100644 index 000000000..41cd8bfbe --- /dev/null +++ b/data/maps/Underwater_Route105/scripts.inc @@ -0,0 +1,8 @@ +Underwater_Route105_MapScripts:: @ 81F773D + map_script MAP_SCRIPT_ON_RESUME, Underwater_Route105_OnResume + .byte 0 + +Underwater_Route105_OnResume: @ 81F7743 + call AbnormalWeather_Underwater_SetupEscapeWarp + end + diff --git a/data/maps/Underwater1/map.json b/data/maps/Underwater_Route124/map.json index 71752745d..46bc141a8 100644 --- a/data/maps/Underwater1/map.json +++ b/data/maps/Underwater_Route124/map.json @@ -1,7 +1,7 @@ { - "id": "MAP_UNDERWATER1", - "name": "Underwater1", - "layout": "LAYOUT_UNDERWATER1", + "id": "MAP_UNDERWATER_ROUTE124", + "name": "Underwater_Route124", + "layout": "LAYOUT_UNDERWATER_ROUTE124", "music": "MUS_UNDERWATER", "region_map_section": "MAPSEC_UNDERWATER_124", "requires_flash": false, @@ -16,7 +16,7 @@ { "direction": "down", "offset": 0, - "map": "MAP_UNDERWATER2" + "map": "MAP_UNDERWATER_ROUTE126" }, { "direction": "emerge", @@ -34,7 +34,7 @@ "y": 51, "elevation": 0, "item": "ITEM_CARBOS", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_1_CARBOS" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS" }, { "type": "hidden_item", @@ -42,7 +42,7 @@ "y": 40, "elevation": 0, "item": "ITEM_GREEN_SHARD", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_1_GREEN_SHARD" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD" }, { "type": "hidden_item", @@ -50,7 +50,7 @@ "y": 34, "elevation": 3, "item": "ITEM_PEARL", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_1_PEARL" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL" }, { "type": "hidden_item", @@ -58,7 +58,7 @@ "y": 54, "elevation": 3, "item": "ITEM_BIG_PEARL", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_1_BIG_PEARL" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL" }, { "type": "hidden_item", @@ -66,7 +66,7 @@ "y": 64, "elevation": 3, "item": "ITEM_HEART_SCALE", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_1_HEART_SCALE_1" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1" }, { "type": "hidden_item", @@ -74,7 +74,7 @@ "y": 5, "elevation": 3, "item": "ITEM_CALCIUM", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_1_CALCIUM" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM" }, { "type": "hidden_item", @@ -82,7 +82,7 @@ "y": 36, "elevation": 3, "item": "ITEM_HEART_SCALE", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_1_HEART_SCALE_2" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2" } ] } diff --git a/data/maps/Underwater_Route124/scripts.inc b/data/maps/Underwater_Route124/scripts.inc new file mode 100644 index 000000000..2a72dfb11 --- /dev/null +++ b/data/maps/Underwater_Route124/scripts.inc @@ -0,0 +1,3 @@ +Underwater_Route124_MapScripts:: @ 81F7722 + .byte 0 + diff --git a/data/maps/Underwater7/map.json b/data/maps/Underwater_Route125/map.json index 5155fc6ba..c32bb57e8 100644 --- a/data/maps/Underwater7/map.json +++ b/data/maps/Underwater_Route125/map.json @@ -1,9 +1,9 @@ { - "id": "MAP_UNDERWATER7", - "name": "Underwater7", - "layout": "LAYOUT_UNDERWATER7", + "id": "MAP_UNDERWATER_ROUTE125", + "name": "Underwater_Route125", + "layout": "LAYOUT_UNDERWATER_ROUTE125", "music": "MUS_UNDERWATER", - "region_map_section": "MAPSEC_UNDERWATER_UNK1", + "region_map_section": "MAPSEC_UNDERWATER_125", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", diff --git a/data/maps/Underwater_Route125/scripts.inc b/data/maps/Underwater_Route125/scripts.inc new file mode 100644 index 000000000..662120e5e --- /dev/null +++ b/data/maps/Underwater_Route125/scripts.inc @@ -0,0 +1,8 @@ +Underwater_Route125_MapScripts:: @ 81F7749 + map_script MAP_SCRIPT_ON_RESUME, Underwater_Route125_OnResume + .byte 0 + +Underwater_Route125_OnResume: @ 81F774F + call AbnormalWeather_Underwater_SetupEscapeWarp + end + diff --git a/data/maps/Underwater2/map.json b/data/maps/Underwater_Route126/map.json index 5ecdc402a..993bb7907 100644 --- a/data/maps/Underwater2/map.json +++ b/data/maps/Underwater_Route126/map.json @@ -1,9 +1,9 @@ { - "id": "MAP_UNDERWATER2", - "name": "Underwater2", - "layout": "LAYOUT_UNDERWATER2", + "id": "MAP_UNDERWATER_ROUTE126", + "name": "Underwater_Route126", + "layout": "LAYOUT_UNDERWATER_ROUTE126", "music": "MUS_UNDERWATER", - "region_map_section": "MAPSEC_UNDERWATER_125", + "region_map_section": "MAPSEC_UNDERWATER_126", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", @@ -16,12 +16,12 @@ { "direction": "up", "offset": 0, - "map": "MAP_UNDERWATER1" + "map": "MAP_UNDERWATER_ROUTE124" }, { "direction": "right", "offset": 0, - "map": "MAP_UNDERWATER3" + "map": "MAP_UNDERWATER_ROUTE127" }, { "direction": "emerge", @@ -47,7 +47,7 @@ "y": 17, "elevation": 3, "item": "ITEM_HEART_SCALE", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_HEART_SCALE" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE" }, { "type": "hidden_item", @@ -55,7 +55,7 @@ "y": 19, "elevation": 3, "item": "ITEM_ULTRA_BALL", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_ULTRA_BALL" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL" }, { "type": "hidden_item", @@ -63,7 +63,7 @@ "y": 19, "elevation": 3, "item": "ITEM_STARDUST", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_STARDUST" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST" }, { "type": "hidden_item", @@ -71,7 +71,7 @@ "y": 36, "elevation": 3, "item": "ITEM_PEARL", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_PEARL" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL" }, { "type": "hidden_item", @@ -79,7 +79,7 @@ "y": 39, "elevation": 3, "item": "ITEM_IRON", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_IRON" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON" }, { "type": "hidden_item", @@ -87,7 +87,7 @@ "y": 35, "elevation": 3, "item": "ITEM_YELLOW_SHARD", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_YELLOW_SHARD" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD" }, { "type": "hidden_item", @@ -95,7 +95,7 @@ "y": 60, "elevation": 3, "item": "ITEM_BIG_PEARL", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_BIG_PEARL" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL" }, { "type": "hidden_item", @@ -103,7 +103,7 @@ "y": 77, "elevation": 3, "item": "ITEM_BLUE_SHARD", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_2_BLUE_SHARD" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD" } ] } diff --git a/data/maps/Underwater_Route126/scripts.inc b/data/maps/Underwater_Route126/scripts.inc new file mode 100644 index 000000000..71d43e141 --- /dev/null +++ b/data/maps/Underwater_Route126/scripts.inc @@ -0,0 +1,3 @@ +Underwater_Route126_MapScripts:: @ 81F7723 + .byte 0 + diff --git a/data/maps/Underwater3/map.json b/data/maps/Underwater_Route127/map.json index 43df933a0..b96f79c5d 100644 --- a/data/maps/Underwater3/map.json +++ b/data/maps/Underwater_Route127/map.json @@ -1,9 +1,9 @@ { - "id": "MAP_UNDERWATER3", - "name": "Underwater3", - "layout": "LAYOUT_UNDERWATER3", + "id": "MAP_UNDERWATER_ROUTE127", + "name": "Underwater_Route127", + "layout": "LAYOUT_UNDERWATER_ROUTE127", "music": "MUS_UNDERWATER", - "region_map_section": "MAPSEC_UNDERWATER_126", + "region_map_section": "MAPSEC_UNDERWATER_127", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", @@ -21,12 +21,12 @@ { "direction": "left", "offset": 0, - "map": "MAP_UNDERWATER2" + "map": "MAP_UNDERWATER_ROUTE126" }, { "direction": "down", "offset": 0, - "map": "MAP_UNDERWATER4" + "map": "MAP_UNDERWATER_ROUTE128" } ], "object_events": [], @@ -54,7 +54,7 @@ "y": 42, "elevation": 3, "item": "ITEM_STAR_PIECE", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_3_STAR_PIECE" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE" }, { "type": "hidden_item", @@ -62,7 +62,7 @@ "y": 36, "elevation": 3, "item": "ITEM_HP_UP", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_3_HP_UP" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP" }, { "type": "hidden_item", @@ -70,7 +70,7 @@ "y": 72, "elevation": 3, "item": "ITEM_HEART_SCALE", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_3_HEART_SCALE" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE" }, { "type": "hidden_item", @@ -78,7 +78,7 @@ "y": 20, "elevation": 3, "item": "ITEM_RED_SHARD", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_3_RED_SHARD" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD" } ] } diff --git a/data/maps/Underwater_Route127/scripts.inc b/data/maps/Underwater_Route127/scripts.inc new file mode 100644 index 000000000..552b9aab8 --- /dev/null +++ b/data/maps/Underwater_Route127/scripts.inc @@ -0,0 +1,8 @@ +Underwater_Route127_MapScripts:: @ 81F7724 + map_script MAP_SCRIPT_ON_RESUME, Underwater_Route127_OnResume + .byte 0 + +Underwater_Route127_OnResume: @ 81F772A + call AbnormalWeather_Underwater_SetupEscapeWarp + end + diff --git a/data/maps/Underwater4/map.json b/data/maps/Underwater_Route128/map.json index 4b0fc6d3b..f80cf41a6 100644 --- a/data/maps/Underwater4/map.json +++ b/data/maps/Underwater_Route128/map.json @@ -1,9 +1,9 @@ { - "id": "MAP_UNDERWATER4", - "name": "Underwater4", - "layout": "LAYOUT_UNDERWATER4", + "id": "MAP_UNDERWATER_ROUTE128", + "name": "Underwater_Route128", + "layout": "LAYOUT_UNDERWATER_ROUTE128", "music": "MUS_UNDERWATER", - "region_map_section": "MAPSEC_UNDERWATER_127", + "region_map_section": "MAPSEC_UNDERWATER_128", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", @@ -16,7 +16,7 @@ { "direction": "up", "offset": 0, - "map": "MAP_UNDERWATER3" + "map": "MAP_UNDERWATER_ROUTE127" }, { "direction": "emerge", @@ -42,7 +42,7 @@ "y": 19, "elevation": 3, "item": "ITEM_PROTEIN", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_4_PROTEIN" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN" }, { "type": "hidden_item", @@ -50,7 +50,7 @@ "y": 18, "elevation": 3, "item": "ITEM_PEARL", - "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_4_PEARL" + "flag": "FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL" } ] } diff --git a/data/maps/Underwater_Route128/scripts.inc b/data/maps/Underwater_Route128/scripts.inc new file mode 100644 index 000000000..a050afd93 --- /dev/null +++ b/data/maps/Underwater_Route128/scripts.inc @@ -0,0 +1,3 @@ +Underwater_Route128_MapScripts:: @ 81F7730 + .byte 0 + diff --git a/data/maps/Underwater5/map.json b/data/maps/Underwater_Route129/map.json index 909591f11..45775bd6b 100644 --- a/data/maps/Underwater5/map.json +++ b/data/maps/Underwater_Route129/map.json @@ -1,7 +1,7 @@ { - "id": "MAP_UNDERWATER5", - "name": "Underwater5", - "layout": "LAYOUT_UNDERWATER5", + "id": "MAP_UNDERWATER_ROUTE129", + "name": "Underwater_Route129", + "layout": "LAYOUT_UNDERWATER_ROUTE129", "music": "MUS_UNDERWATER", "region_map_section": "MAPSEC_UNDERWATER_129", "requires_flash": false, diff --git a/data/maps/Underwater_Route129/scripts.inc b/data/maps/Underwater_Route129/scripts.inc new file mode 100644 index 000000000..f9f84841e --- /dev/null +++ b/data/maps/Underwater_Route129/scripts.inc @@ -0,0 +1,8 @@ +Underwater_Route129_MapScripts:: @ 81F7731 + map_script MAP_SCRIPT_ON_RESUME, Underwater_Route129_OnResume + .byte 0 + +Underwater_Route129_OnResume: @ 81F7737 + call AbnormalWeather_Underwater_SetupEscapeWarp + end + diff --git a/data/maps/Underwater_SeafloorCavern/map.json b/data/maps/Underwater_SeafloorCavern/map.json index efcb3c291..d25a3600d 100644 --- a/data/maps/Underwater_SeafloorCavern/map.json +++ b/data/maps/Underwater_SeafloorCavern/map.json @@ -3,7 +3,7 @@ "name": "Underwater_SeafloorCavern", "layout": "LAYOUT_UNDERWATER_SEAFLOOR_CAVERN", "music": "MUS_UNDERWATER", - "region_map_section": "MAPSEC_UNDERWATER_128", + "region_map_section": "MAPSEC_UNDERWATER_SEAFLOOR_CAVERN", "requires_flash": false, "weather": "WEATHER_UNDERWATER_BUBBLES", "map_type": "MAP_TYPE_UNDERWATER", @@ -72,7 +72,7 @@ "x": 6, "y": 7, "elevation": 0, - "dest_map": "MAP_UNDERWATER4", + "dest_map": "MAP_UNDERWATER_ROUTE128", "dest_warp_id": 0 } ], diff --git a/data/maps/Underwater_SootopolisCity/map.json b/data/maps/Underwater_SootopolisCity/map.json index 90e5e97fc..0d1363ff6 100644 --- a/data/maps/Underwater_SootopolisCity/map.json +++ b/data/maps/Underwater_SootopolisCity/map.json @@ -19,14 +19,14 @@ "x": 9, "y": 8, "elevation": 0, - "dest_map": "MAP_UNDERWATER2", + "dest_map": "MAP_UNDERWATER_ROUTE126", "dest_warp_id": 0 }, { "x": 10, "y": 8, "elevation": 0, - "dest_map": "MAP_UNDERWATER2", + "dest_map": "MAP_UNDERWATER_ROUTE126", "dest_warp_id": 0 } ], diff --git a/data/maps/map_groups.json b/data/maps/map_groups.json index 2821ad20f..4201e814f 100644 --- a/data/maps/map_groups.json +++ b/data/maps/map_groups.json @@ -86,13 +86,13 @@ "Route132", "Route133", "Route134", - "Underwater1", - "Underwater2", - "Underwater3", - "Underwater4", - "Underwater5", - "Underwater6", - "Underwater7" + "Underwater_Route124", + "Underwater_Route126", + "Underwater_Route127", + "Underwater_Route128", + "Underwater_Route129", + "Underwater_Route105", + "Underwater_Route125" ], "gMapGroup1": [ "LittlerootTown_BrendansHouse_1F", @@ -672,13 +672,13 @@ "Route132", "Route133", "Route134", - "Underwater6", - "Underwater1", - "Underwater7", - "Underwater2", - "Underwater3", - "Underwater4", - "Underwater5", + "Underwater_Route105", + "Underwater_Route124", + "Underwater_Route125", + "Underwater_Route126", + "Underwater_Route127", + "Underwater_Route128", + "Underwater_Route129", "SafariZone_Northwest", "SafariZone_North", "SafariZone_Southwest", diff --git a/data/scripts/berry_blender.inc b/data/scripts/berry_blender.inc index d98add74d..7ad8e9e3a 100644 --- a/data/scripts/berry_blender.inc +++ b/data/scripts/berry_blender.inc @@ -6,6 +6,8 @@ .set LOCALID_EXPERT_M, 16 .set LOCALID_GIRL, 17 +.set NUM_OPPONENTS, VAR_0x8009 + BerryBlender_Text_WantToMakePokeblocks: @ 8292DEE .string "Oh? Did you want to make some {POKEBLOCK}S\n" .string "with this old-timer?$" @@ -243,7 +245,7 @@ BerryBlender_Text_DontHaveAnyBerriesNoneToSpare: @ 8293BB4 BerryBlender_EventScript_BerryBlender1:: @ 8293C3E lockall goto_if_unset FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER, BerryBlender_EventScript_BlendMasterPresent - setvar VAR_0x8009, 1 + setvar NUM_OPPONENTS, 1 applymovement LOCALID_EXPERT_M, BerryBlender_Movement_BlendLeaderWalkInPlace waitmovement 0 msgbox BerryBlender_Text_WantToMakePokeblocks, MSGBOX_YESNO @@ -307,9 +309,8 @@ BerryBlender_EventScript_TryUseBerryBlender1: @ 8293CEE goto BerryBlender_EventScript_UseBerryBlender1 end -@ VAR_0x8009 here is the Blender number. 1 is top right, 2 is bottom right, 3 is bottom left BerryBlender_EventScript_DoBerryBlending: @ 8293D2C - copyvar VAR_0x8004, VAR_0x8009 + copyvar VAR_0x8004, NUM_OPPONENTS fadescreen FADE_TO_BLACK special DoBerryBlending waitstate @@ -328,7 +329,7 @@ BerryBlender_EventScript_Blender1NoCase: @ 8293D43 BerryBlender_EventScript_BerryBlender2:: @ 8293D4D lockall - setvar VAR_0x8009, 2 + setvar NUM_OPPONENTS, 2 applymovement LOCALID_TWIN, Common_Movement_FaceOriginalDirection applymovement LOCALID_MAN, BerryBlender_Movement_BlendLeaderWalkInPlace waitmovement 0 @@ -393,7 +394,7 @@ BerryBlender_EventScript_Blender2NoCase: @ 8293E14 BerryBlender_EventScript_BerryBlender3:: @ 8293E1E lockall setvar VAR_0x8008, LOCALID_POKEFAN_F - setvar VAR_0x8009, 3 + setvar NUM_OPPONENTS, 3 applymovement LOCALID_BOY, Common_Movement_FaceOriginalDirection applymovement LOCALID_GIRL, Common_Movement_FaceOriginalDirection applymovement VAR_0x8008, BerryBlender_Movement_BlendLeaderWalkInPlace @@ -458,7 +459,7 @@ BerryBlender_EventScript_Blender3NoCase: @ 8293EF1 BerryBlender_EventScript_BlendMasterPresent: @ 8293EFB lockall - setvar VAR_0x8009, 1 + setvar NUM_OPPONENTS, 1 msgbox BerryBlender_Text_SeeMyMasteryInAction, MSGBOX_YESNO compare VAR_RESULT, YES goto_if_eq BerryBlender_EventScript_TryBlendWithBlendMaster @@ -636,7 +637,7 @@ BerryBlender_EventScript_FourPlayerLink: @ 8294139 end BerryBlender_EventScript_DoLinkBerryBlending: @ 8294147 - setvar VAR_0x8004, 0 + setvar VAR_0x8004, 0 @ number of opponents, 0 indicates Link fadescreen FADE_TO_BLACK removeobject 240 @ Unclear where these local IDs come from, removeobject 239 @ but presumably they'd be the 4 link players diff --git a/gflib/bg.c b/gflib/bg.c index 66dd81a25..12c42d124 100644 --- a/gflib/bg.c +++ b/gflib/bg.c @@ -34,8 +34,8 @@ struct BgConfig2 u32 unk_3:18; void* tilemap; - s32 bg_x; - s32 bg_y; + s32 bg_x; // Maybe unsigned, but game treats it as if it is signed a LOT. + s32 bg_y; // Same for this variable. }; static struct BgControl sGpuBgConfigs; @@ -621,17 +621,15 @@ s32 GetBgX(u8 bg) { if (IsInvalidBg32(bg)) return -1; - else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) + if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return -1; - else - return sGpuBgConfigs2[bg].bg_x; + return sGpuBgConfigs2[bg].bg_x; } s32 ChangeBgY(u8 bg, s32 value, u8 op) { u8 mode; - u16 temp1; - u16 temp2; + u16 temp1, temp2; if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { @@ -700,8 +698,7 @@ s32 ChangeBgY(u8 bg, s32 value, u8 op) s32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) { u8 mode; - u16 temp1; - u16 temp2; + u16 temp1, temp2; if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { @@ -772,10 +769,9 @@ s32 GetBgY(u8 bg) { if (IsInvalidBg32(bg)) return -1; - else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) + if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return -1; - else - return sGpuBgConfigs2[bg].bg_y; + return sGpuBgConfigs2[bg].bg_y; } void SetBgAffine(u8 bg, s32 srcCenterX, s32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) @@ -874,81 +870,77 @@ void* GetBgTilemapBuffer(u8 bg) { if (IsInvalidBg32(bg)) return NULL; - else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) + if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return NULL; - else - return sGpuBgConfigs2[bg].tilemap; + return sGpuBgConfigs2[bg].tilemap; } void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset) { - if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) - { - if (mode != 0) - CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode); - else - LZ77UnCompWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2))); - } + if (IsInvalidBg32(bg) || IsTileMapOutsideWram(bg)) + return; + if (mode != 0) + CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode); + else + LZ77UnCompWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2))); } void CopyBgTilemapBufferToVram(u8 bg) { u16 sizeToLoad; - if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) + if (IsInvalidBg32(bg) || IsTileMapOutsideWram(bg)) + return; + + switch (GetBgType(bg)) { - switch (GetBgType(bg)) - { - case 0: - sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800; - break; - case 1: - sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100; - break; - default: - sizeToLoad = 0; - break; - } - LoadBgVram(bg, sGpuBgConfigs2[bg].tilemap, sizeToLoad, 0, 2); + case 0: + sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800; + break; + case 1: + sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100; + break; + default: + sizeToLoad = 0; + break; } + LoadBgVram(bg, sGpuBgConfigs2[bg].tilemap, sizeToLoad, 0, 2); } -void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 width, u8 height) +void CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 width, u8 height) { - u16 destX16; - u16 destY16; + u16 destX16, destY16; u16 mode; - if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) + if (IsInvalidBg32(bg) || IsTileMapOutsideWram(bg)) + return; + switch (GetBgType(bg)) { - switch (GetBgType(bg)) - { - case 0: + case 0: + { + const u16 *srcCopy = src; + for (destY16 = destY; destY16 < (destY + height); destY16++) { - const u16 * srcCopy = src; - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (destX16 = destX; destX16 < (destX + width); destX16++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) - { - ((u16*)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *srcCopy++; - } + ((u16 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *srcCopy++; } - break; } - case 1: + break; + } + case 1: + { + const u8 *srcCopy = src; + mode = GetBgMetricAffineMode(bg, 0x1); + for (destY16 = destY; destY16 < (destY + height); destY16++) { - const u8 * srcCopy = src; - mode = GetBgMetricAffineMode(bg, 0x1); - for (destY16 = destY; destY16 < (destY + height); destY16++) + for (destX16 = destX; destX16 < (destX + width); destX16++) { - for (destX16 = destX; destX16 < (destX + width); destX16++) - { - ((u8*)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *srcCopy++; - } + ((u8 *)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *srcCopy++; } - break; - } } + break; + } } } diff --git a/gflib/text.c b/gflib/text.c index 636fe50a9..2f4dc4f19 100644 --- a/gflib/text.c +++ b/gflib/text.c @@ -154,7 +154,7 @@ u16 AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 printerTemplate.currentY = y; printerTemplate.letterSpacing = gFonts[fontId].letterSpacing; printerTemplate.lineSpacing = gFonts[fontId].lineSpacing; - printerTemplate.unk = gFonts[fontId].unk; + printerTemplate.style = gFonts[fontId].style; printerTemplate.fgColor = gFonts[fontId].fgColor; printerTemplate.bgColor = gFonts[fontId].bgColor; printerTemplate.shadowColor = gFonts[fontId].shadowColor; @@ -484,7 +484,7 @@ u8 GetLastTextColor(u8 colorType) { \ dst = windowTiles + ((j / 8) * 32) + ((j & 7) >> 1) + ((i / 8) * widthOffset) + ((i & 7) * 4); \ bits = ((j & 1) * 4); \ - *dst = (toOrr << bits) | ((0xF0 >> bits) & *dst); \ + *dst = (toOrr << bits) | (*dst & (0xF0 >> bits)); \ } \ r5 >>= 4; \ } \ @@ -1567,7 +1567,7 @@ void SetDefaultFontsPointer(void) u8 GetFontAttribute(u8 fontId, u8 attributeId) { - int result = 0; + u8 result = 0; switch (attributeId) { case FONTATTR_MAX_LETTER_WIDTH: @@ -1582,8 +1582,8 @@ u8 GetFontAttribute(u8 fontId, u8 attributeId) case FONTATTR_LINE_SPACING: result = gFontInfos[fontId].lineSpacing; break; - case FONTATTR_UNKNOWN: - result = gFontInfos[fontId].unk; + case FONTATTR_STYLE: + result = gFontInfos[fontId].style; break; case FONTATTR_COLOR_FOREGROUND: result = gFontInfos[fontId].fgColor; diff --git a/gflib/text.h b/gflib/text.h index 0829d748f..b76897757 100644 --- a/gflib/text.h +++ b/gflib/text.h @@ -282,7 +282,7 @@ enum FONTATTR_MAX_LETTER_HEIGHT, FONTATTR_LETTER_SPACING, FONTATTR_LINE_SPACING, - FONTATTR_UNKNOWN, // dunno what this is yet + FONTATTR_STYLE, FONTATTR_COLOR_FOREGROUND, FONTATTR_COLOR_BACKGROUND, FONTATTR_COLOR_SHADOW @@ -310,7 +310,7 @@ struct TextPrinterTemplate u8 currentY; u8 letterSpacing; u8 lineSpacing; - u8 unk:4; // 0xC + u8 style:4; // 0xC u8 fgColor:4; u8 bgColor:4; u8 shadowColor:4; @@ -339,7 +339,7 @@ struct FontInfo u8 maxLetterHeight; u8 letterSpacing; u8 lineSpacing; - u8 unk:4; + u8 style:4; //unused u8 fgColor:4; u8 bgColor:4; u8 shadowColor:4; diff --git a/gflib/window.c b/gflib/window.c index 7c87ea86d..0be59773c 100644 --- a/gflib/window.c +++ b/gflib/window.c @@ -30,21 +30,18 @@ static void nullsub_8(void) bool16 InitWindows(const struct WindowTemplate *templates) { - int i; - void *bgTilemapBuffer; - int j; - u8 bgLayer; - u16 attrib; + int i, j; u8* allocatedTilemapBuffer; + u16 attrib; int allocatedBaseBlock; + u8 bgLayer; for (i = 0; i < 0x4; ++i) { - bgTilemapBuffer = GetBgTilemapBuffer(i); - if (bgTilemapBuffer != NULL) + if (GetBgTilemapBuffer(i) != NULL) gUnknown_03002F70[i] = nullsub_8; else - gUnknown_03002F70[i] = bgTilemapBuffer; + gUnknown_03002F70[i] = NULL; } for (i = 0; i < 0x20; ++i) @@ -567,19 +564,19 @@ u32 GetWindowAttribute(u8 windowId, u8 attributeId) switch (attributeId) { case WINDOW_BG: - return gWindows[windowId].window.bg; + return (u32)gWindows[windowId].window.bg; case WINDOW_TILEMAP_LEFT: - return gWindows[windowId].window.tilemapLeft; + return (u32)gWindows[windowId].window.tilemapLeft; case WINDOW_TILEMAP_TOP: - return gWindows[windowId].window.tilemapTop; + return (u32)gWindows[windowId].window.tilemapTop; case WINDOW_WIDTH: - return gWindows[windowId].window.width; + return (u32)gWindows[windowId].window.width; case WINDOW_HEIGHT: - return gWindows[windowId].window.height; + return (u32)gWindows[windowId].window.height; case WINDOW_PALETTE_NUM: - return gWindows[windowId].window.paletteNum; + return (u32)gWindows[windowId].window.paletteNum; case WINDOW_BASE_BLOCK: - return gWindows[windowId].window.baseBlock; + return (u32)gWindows[windowId].window.baseBlock; case WINDOW_TILE_DATA: return (u32)(gWindows[windowId].tileData); default: @@ -643,12 +640,9 @@ u16 AddWindow8Bit(const struct WindowTemplate *template) } return 0xFF; } - else - { - gWindows[windowId].tileData = memAddress; - gWindows[windowId].window = *template; - return windowId; - } + gWindows[windowId].tileData = memAddress; + gWindows[windowId].window = *template; + return windowId; } void FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue) diff --git a/graphics/berry_blender/marubatsu.png b/graphics/berry_blender/score_symbols.png Binary files differindex f927bbce9..f927bbce9 100644 --- a/graphics/berry_blender/marubatsu.png +++ b/graphics/berry_blender/score_symbols.png diff --git a/graphics/unknown/unknown_339514.pal b/graphics/berry_blender/unused.pal index b87f25a6c..b87f25a6c 100644 --- a/graphics/unknown/unknown_339514.pal +++ b/graphics/berry_blender/unused.pal diff --git a/graphics/misc/cable_car_bg.pal b/graphics/cable_car/bg.pal index d543b4cce..d543b4cce 100644 --- a/graphics/misc/cable_car_bg.pal +++ b/graphics/cable_car/bg.pal diff --git a/graphics/misc/cable_car_bg.png b/graphics/cable_car/bg.png Binary files differindex f268ea990..f268ea990 100644 --- a/graphics/misc/cable_car_bg.png +++ b/graphics/cable_car/bg.png diff --git a/graphics/misc/cable_car_mountain_map.bin b/graphics/cable_car/bg_mountains.bin index 3d4e092bc..3d4e092bc 100644 --- a/graphics/misc/cable_car_mountain_map.bin +++ b/graphics/cable_car/bg_mountains.bin diff --git a/graphics/misc/cable_car_cord.png b/graphics/cable_car/cable.png Binary files differindex b8176d3ca..b8176d3ca 100644 --- a/graphics/misc/cable_car_cord.png +++ b/graphics/cable_car/cable.png diff --git a/graphics/misc/cable_car.png b/graphics/cable_car/cable_car.png Binary files differindex 67f581fb9..67f581fb9 100644 --- a/graphics/misc/cable_car.png +++ b/graphics/cable_car/cable_car.png diff --git a/graphics/misc/cable_car_door.png b/graphics/cable_car/door.png Binary files differindex a61b3f504..a61b3f504 100644 --- a/graphics/misc/cable_car_door.png +++ b/graphics/cable_car/door.png diff --git a/graphics/misc/cable_car_mt_chimney_map.bin b/graphics/cable_car/ground.bin Binary files differindex 8ae7818bf..8ae7818bf 100644 --- a/graphics/misc/cable_car_mt_chimney_map.bin +++ b/graphics/cable_car/ground.bin diff --git a/graphics/misc/cable_car_pylon_stem_map.bin b/graphics/cable_car/pylons.bin index e6f12efc6..e6f12efc6 100644 --- a/graphics/misc/cable_car_pylon_stem_map.bin +++ b/graphics/cable_car/pylons.bin diff --git a/graphics/misc/cable_car_tree_map.bin b/graphics/cable_car/trees.bin Binary files differindex 1e9b7a8f8..1e9b7a8f8 100644 --- a/graphics/misc/cable_car_tree_map.bin +++ b/graphics/cable_car/trees.bin diff --git a/graphics/rayquaza_scene/kyogre.png b/graphics/rayquaza_scene/kyogre.png Binary files differdeleted file mode 100644 index 0f2e27e4e..000000000 --- a/graphics/rayquaza_scene/kyogre.png +++ /dev/null diff --git a/graphics/rayquaza_scene/clouds.pal b/graphics/rayquaza_scene/scene_1/clouds.pal index 4b1a354ce..4b1a354ce 100644 --- a/graphics/rayquaza_scene/clouds.pal +++ b/graphics/rayquaza_scene/scene_1/clouds.pal diff --git a/graphics/rayquaza_scene/clouds.png b/graphics/rayquaza_scene/scene_1/clouds.png Binary files differindex a253f47cc..a253f47cc 100644 --- a/graphics/rayquaza_scene/clouds.png +++ b/graphics/rayquaza_scene/scene_1/clouds.png diff --git a/graphics/rayquaza_scene/clouds1.bin b/graphics/rayquaza_scene/scene_1/clouds1.bin Binary files differindex 57a939ad8..57a939ad8 100644 --- a/graphics/rayquaza_scene/clouds1.bin +++ b/graphics/rayquaza_scene/scene_1/clouds1.bin diff --git a/graphics/rayquaza_scene/clouds2.bin b/graphics/rayquaza_scene/scene_1/clouds2.bin Binary files differindex 073c45ac7..073c45ac7 100644 --- a/graphics/rayquaza_scene/clouds2.bin +++ b/graphics/rayquaza_scene/scene_1/clouds2.bin diff --git a/graphics/rayquaza_scene/clouds3.bin b/graphics/rayquaza_scene/scene_1/clouds3.bin Binary files differindex 9b9eb4611..9b9eb4611 100644 --- a/graphics/rayquaza_scene/clouds3.bin +++ b/graphics/rayquaza_scene/scene_1/clouds3.bin diff --git a/graphics/rayquaza_scene/groudon.png b/graphics/rayquaza_scene/scene_1/groudon.png Binary files differindex 5ac84d51a..5ac84d51a 100644 --- a/graphics/rayquaza_scene/groudon.png +++ b/graphics/rayquaza_scene/scene_1/groudon.png diff --git a/graphics/rayquaza_scene/groudon_claw.png b/graphics/rayquaza_scene/scene_1/groudon_claw.png Binary files differindex c960a9779..c960a9779 100644 --- a/graphics/rayquaza_scene/groudon_claw.png +++ b/graphics/rayquaza_scene/scene_1/groudon_claw.png diff --git a/graphics/rayquaza_scene/groudon_shoulder.png b/graphics/rayquaza_scene/scene_1/groudon_shoulder.png Binary files differindex c4c5f08b6..c4c5f08b6 100644 --- a/graphics/rayquaza_scene/groudon_shoulder.png +++ b/graphics/rayquaza_scene/scene_1/groudon_shoulder.png diff --git a/graphics/rayquaza_scene/scene_1/kyogre.png b/graphics/rayquaza_scene/scene_1/kyogre.png Binary files differnew file mode 100644 index 000000000..7ed02a134 --- /dev/null +++ b/graphics/rayquaza_scene/scene_1/kyogre.png diff --git a/graphics/rayquaza_scene/kyogre_fin.png b/graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.png Binary files differindex 9d4f62da9..9d4f62da9 100644 --- a/graphics/rayquaza_scene/kyogre_fin.png +++ b/graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.png diff --git a/graphics/rayquaza_scene/kyogre_shoulder.png b/graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.png Binary files differindex 16b221f97..16b221f97 100644 --- a/graphics/rayquaza_scene/kyogre_shoulder.png +++ b/graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.png diff --git a/graphics/rayquaza_scene/overcast.bin b/graphics/rayquaza_scene/scene_2/bg.bin Binary files differindex 82b9e5067..82b9e5067 100644 --- a/graphics/rayquaza_scene/overcast.bin +++ b/graphics/rayquaza_scene/scene_2/bg.bin diff --git a/graphics/rayquaza_scene/overcast.png b/graphics/rayquaza_scene/scene_2/bg.png Binary files differindex 4ad9be8d2..4ad9be8d2 100644 --- a/graphics/rayquaza_scene/overcast.png +++ b/graphics/rayquaza_scene/scene_2/bg.png diff --git a/graphics/rayquaza_scene/rayquaza.bin b/graphics/rayquaza_scene/scene_2/rayquaza.bin Binary files differindex 1a6d89234..1a6d89234 100644 --- a/graphics/rayquaza_scene/rayquaza.bin +++ b/graphics/rayquaza_scene/scene_2/rayquaza.bin diff --git a/graphics/rayquaza_scene/rayquaza.png b/graphics/rayquaza_scene/scene_2/rayquaza.png Binary files differindex 6198b945d..6198b945d 100644 --- a/graphics/rayquaza_scene/rayquaza.png +++ b/graphics/rayquaza_scene/scene_2/rayquaza.png diff --git a/graphics/rayquaza_scene/smoke.png b/graphics/rayquaza_scene/scene_2/smoke.png Binary files differindex 4aaa6ae75..4aaa6ae75 100644 --- a/graphics/rayquaza_scene/smoke.png +++ b/graphics/rayquaza_scene/scene_2/smoke.png diff --git a/graphics/rayquaza_scene/overcast2.bin b/graphics/rayquaza_scene/scene_3/bg.bin Binary files differindex 0c2e5ec45..0c2e5ec45 100644 --- a/graphics/rayquaza_scene/overcast2.bin +++ b/graphics/rayquaza_scene/scene_3/bg.bin diff --git a/graphics/rayquaza_scene/overcast2.pal b/graphics/rayquaza_scene/scene_3/bg.pal index 6987c2cc1..6987c2cc1 100644 --- a/graphics/rayquaza_scene/overcast2.pal +++ b/graphics/rayquaza_scene/scene_3/bg.pal diff --git a/graphics/rayquaza_scene/overcast2.png b/graphics/rayquaza_scene/scene_3/bg.png Binary files differindex c9dea2002..c9dea2002 100644 --- a/graphics/rayquaza_scene/overcast2.png +++ b/graphics/rayquaza_scene/scene_3/bg.png diff --git a/graphics/rayquaza_scene/rayquaza_light.bin b/graphics/rayquaza_scene/scene_3/light.bin Binary files differindex 97808b8b9..97808b8b9 100644 --- a/graphics/rayquaza_scene/rayquaza_light.bin +++ b/graphics/rayquaza_scene/scene_3/light.bin diff --git a/graphics/rayquaza_scene/rayquaza_light.png b/graphics/rayquaza_scene/scene_3/light.png Binary files differindex 4640149f3..4640149f3 100644 --- a/graphics/rayquaza_scene/rayquaza_light.png +++ b/graphics/rayquaza_scene/scene_3/light.png diff --git a/graphics/rayquaza_scene/rayquaza_fly1.png b/graphics/rayquaza_scene/scene_3/rayquaza.png Binary files differindex 40dd0a6e3..40dd0a6e3 100644 --- a/graphics/rayquaza_scene/rayquaza_fly1.png +++ b/graphics/rayquaza_scene/scene_3/rayquaza.png diff --git a/graphics/rayquaza_scene/rayquaza_tail.png b/graphics/rayquaza_scene/scene_3/rayquaza_tail.png Binary files differindex 7e0577df1..7e0577df1 100644 --- a/graphics/rayquaza_scene/rayquaza_tail.png +++ b/graphics/rayquaza_scene/scene_3/rayquaza_tail.png diff --git a/graphics/rayquaza_scene/chase_bg.bin b/graphics/rayquaza_scene/scene_4/bg.bin Binary files differindex c2daff206..c2daff206 100644 --- a/graphics/rayquaza_scene/chase_bg.bin +++ b/graphics/rayquaza_scene/scene_4/bg.bin diff --git a/graphics/rayquaza_scene/chase.pal b/graphics/rayquaza_scene/scene_4/bg.pal index 960724b94..960724b94 100644 --- a/graphics/rayquaza_scene/chase.pal +++ b/graphics/rayquaza_scene/scene_4/bg.pal diff --git a/graphics/rayquaza_scene/chase_bg.png b/graphics/rayquaza_scene/scene_4/bg.png Binary files differindex 896c0b046..896c0b046 100644 --- a/graphics/rayquaza_scene/chase_bg.png +++ b/graphics/rayquaza_scene/scene_4/bg.png diff --git a/graphics/rayquaza_scene/rayquaza_chase2.bin b/graphics/rayquaza_scene/scene_4/orbs.bin Binary files differindex 37416ac1b..37416ac1b 100644 --- a/graphics/rayquaza_scene/rayquaza_chase2.bin +++ b/graphics/rayquaza_scene/scene_4/orbs.bin diff --git a/graphics/rayquaza_scene/rayquaza_chase.bin b/graphics/rayquaza_scene/scene_4/rayquaza.bin Binary files differindex 51307a4c1..51307a4c1 100644 --- a/graphics/rayquaza_scene/rayquaza_chase.bin +++ b/graphics/rayquaza_scene/scene_4/rayquaza.bin diff --git a/graphics/rayquaza_scene/rayquaza_chase.png b/graphics/rayquaza_scene/scene_4/rayquaza.png Binary files differindex 154a105a8..154a105a8 100644 --- a/graphics/rayquaza_scene/rayquaza_chase.png +++ b/graphics/rayquaza_scene/scene_4/rayquaza.png diff --git a/graphics/rayquaza_scene/chase_streaks.bin b/graphics/rayquaza_scene/scene_4/streaks.bin Binary files differindex cabc53fec..cabc53fec 100644 --- a/graphics/rayquaza_scene/chase_streaks.bin +++ b/graphics/rayquaza_scene/scene_4/streaks.bin diff --git a/graphics/rayquaza_scene/chase_streaks.png b/graphics/rayquaza_scene/scene_4/streaks.png Binary files differindex a7e216259..a7e216259 100644 --- a/graphics/rayquaza_scene/chase_streaks.png +++ b/graphics/rayquaza_scene/scene_4/streaks.png diff --git a/graphics/rayquaza_scene/hush_ring.bin b/graphics/rayquaza_scene/scene_5/bg.bin Binary files differindex 22f5530ba..22f5530ba 100644 --- a/graphics/rayquaza_scene/hush_ring.bin +++ b/graphics/rayquaza_scene/scene_5/bg.bin diff --git a/graphics/rayquaza_scene/hush_bg.pal b/graphics/rayquaza_scene/scene_5/bg.pal index b0b0602dd..b0b0602dd 100644 --- a/graphics/rayquaza_scene/hush_bg.pal +++ b/graphics/rayquaza_scene/scene_5/bg.pal diff --git a/graphics/rayquaza_scene/groudon_left.png b/graphics/rayquaza_scene/scene_5/groudon.png Binary files differindex 582336d46..582336d46 100644 --- a/graphics/rayquaza_scene/groudon_left.png +++ b/graphics/rayquaza_scene/scene_5/groudon.png diff --git a/graphics/rayquaza_scene/groudon_tail.png b/graphics/rayquaza_scene/scene_5/groudon_tail.png Binary files differindex 38f6a41b2..38f6a41b2 100644 --- a/graphics/rayquaza_scene/groudon_tail.png +++ b/graphics/rayquaza_scene/scene_5/groudon_tail.png diff --git a/graphics/rayquaza_scene/kyogre_right.png b/graphics/rayquaza_scene/scene_5/kyogre.png Binary files differindex d5e1749e9..d5e1749e9 100644 --- a/graphics/rayquaza_scene/kyogre_right.png +++ b/graphics/rayquaza_scene/scene_5/kyogre.png diff --git a/graphics/rayquaza_scene/splash.png b/graphics/rayquaza_scene/scene_5/kyogre_splash.png Binary files differindex 406af9da3..406af9da3 100644 --- a/graphics/rayquaza_scene/splash.png +++ b/graphics/rayquaza_scene/scene_5/kyogre_splash.png diff --git a/graphics/rayquaza_scene/hush_bg.bin b/graphics/rayquaza_scene/scene_5/light.bin Binary files differindex b9e86b907..b9e86b907 100644 --- a/graphics/rayquaza_scene/hush_bg.bin +++ b/graphics/rayquaza_scene/scene_5/light.bin diff --git a/graphics/rayquaza_scene/hush_bg.png b/graphics/rayquaza_scene/scene_5/light.png Binary files differindex 7ead765b9..7ead765b9 100644 --- a/graphics/rayquaza_scene/hush_bg.png +++ b/graphics/rayquaza_scene/scene_5/light.png diff --git a/graphics/rayquaza_scene/rayquaza_hover.png b/graphics/rayquaza_scene/scene_5/rayquaza.png Binary files differindex 269d7dd2d..269d7dd2d 100644 --- a/graphics/rayquaza_scene/rayquaza_hover.png +++ b/graphics/rayquaza_scene/scene_5/rayquaza.png diff --git a/graphics/rayquaza_scene/rayquaza_flyin.png b/graphics/rayquaza_scene/scene_5/rayquaza_tail.png Binary files differindex f1b44c104..f1b44c104 100644 --- a/graphics/rayquaza_scene/rayquaza_flyin.png +++ b/graphics/rayquaza_scene/scene_5/rayquaza_tail.png diff --git a/graphics/rayquaza_scene/hush_ring_map.bin b/graphics/rayquaza_scene/scene_5/ring.bin Binary files differindex 812fda11d..812fda11d 100644 --- a/graphics/rayquaza_scene/hush_ring_map.bin +++ b/graphics/rayquaza_scene/scene_5/ring.bin diff --git a/graphics/rayquaza_scene/hush_ring.png b/graphics/rayquaza_scene/scene_5/ring.png Binary files differindex 93d734e03..93d734e03 100644 --- a/graphics/rayquaza_scene/hush_ring.png +++ b/graphics/rayquaza_scene/scene_5/ring.png diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 019f382eb..630aaa3fc 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -457,23 +457,23 @@ $(TYPESGFXDIR)/move_types.gbapal: $(TYPESGFXDIR)/move_types_1.gbapal \ $(INTERFACEGFXDIR)/bag_screen.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 53 -$(RAYQUAZAGFXDIR)/rayquaza.8bpp: %.8bpp: %.png +$(RAYQUAZAGFXDIR)/scene_2/rayquaza.8bpp: %.8bpp: %.png $(GFX) $< $@ -num_tiles 227 -$(RAYQUAZAGFXDIR)/overcast.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_2/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 313 -$(RAYQUAZAGFXDIR)/rayquaza_fly1.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_3/rayquaza.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 124 -$(RAYQUAZAGFXDIR)/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/rayquaza_tail.4bpp +$(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail.4bpp cp $< $@ head -c 12 /dev/zero >> $@ -$(RAYQUAZAGFXDIR)/chase_streaks.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_4/streaks.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 19 -$(RAYQUAZAGFXDIR)/rayquaza_chase.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_4/rayquaza.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 155 graphics/picture_frame/frame5.4bpp: %.4bpp: %.png diff --git a/include/battle.h b/include/battle.h index 78e7b809a..5a04c1eec 100644 --- a/include/battle.h +++ b/include/battle.h @@ -523,14 +523,14 @@ struct BattleAnimationInfo u8 field_7; u8 ballThrowCaseId; u8 field_9_x1:1; - u8 field_9_x2:1; + u8 wildMonInvisible:1; u8 field_9_x1C:3; u8 field_9_x20:1; u8 field_9_x40:1; u8 field_9_x80:1; - u8 field_A; + u8 numBallParticles; u8 field_B; - s16 field_C; + s16 ballSubpx; u8 field_E; u8 field_F; }; @@ -544,8 +544,8 @@ struct BattleHealthboxInfo u8 statusAnimActive:1; // x10 u8 animFromTableActive:1; // x20 u8 specialAnimActive:1; // x40 - u8 flag_x80:1; - u8 field_1_x1:1; + u8 triedShinyMonAnim:1; + u8 finishedShinyMonAnim:1; u8 field_1_x1E:4; u8 field_1_x20:1; u8 field_1_x40:1; diff --git a/include/battle_anim.h b/include/battle_anim.h index 18727cc73..096d533e2 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -207,8 +207,8 @@ void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId); // battle_anim_ground.c void AnimTask_HorizontalShake(u8 taskId); -// battle_anim_special.c -void sub_8172EF0(u8 battler, struct Pokemon *mon); +// battle_anim_throw.c +void TryShinyAnimation(u8 battler, struct Pokemon *mon); u8 ItemIdToBallId(u16 itemId); u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId); u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 selectedPalettes, u8 ballId); diff --git a/include/battle_main.h b/include/battle_main.h index 217b10b39..890e47f39 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -67,7 +67,7 @@ void DoBounceEffect(u8 battlerId, u8 b, s8 c, s8 d); void EndBounceEffect(u8 battlerId, bool8 b); void SpriteCb_PlayerMonFromBall(struct Sprite *sprite); void sub_8039E60(struct Sprite *sprite); -void sub_8039E84(struct Sprite *sprite); +void SpriteCB_TrainerThrowObject(struct Sprite *sprite); void sub_8039E9C(struct Sprite *sprite); void nullsub_20(void); void BeginBattleIntro(void); diff --git a/include/berry_blender.h b/include/berry_blender.h index e8f7bb83d..66d839389 100644 --- a/include/berry_blender.h +++ b/include/berry_blender.h @@ -1,6 +1,16 @@ #ifndef GUARD_BERRY_BLENDER_H #define GUARD_BERRY_BLENDER_H +// Indices into gSendCmd / gRecvCmds +#define BLENDER_COMM_INPUT_STATE 0 +#define BLENDER_COMM_RESP 1 +#define BLENDER_COMM_SCORE 2 +#define BLENDER_COMM_STOP_TYPE 2 // re-used +#define BLENDER_COMM_PLAYER_ID 3 +#define BLENDER_COMM_UNUSED 4 +#define BLENDER_COMM_PROGRESS_BAR 5 +#define BLENDER_COMM_ARROW_POS 6 + extern u8 gInGameOpponentsNo; void DoBerryBlending(void); diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index dfdd9f912..ebc422b18 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -376,7 +376,7 @@ #define B_ANIM_SWITCH_OUT_PLAYER_MON 0x1 #define B_ANIM_SWITCH_OUT_OPPONENT_MON 0x2 #define B_ANIM_BALL_THROW 0x3 -#define B_ANIM_SAFARI_BALL_THROW 0x4 +#define B_ANIM_BALL_THROW_WITH_TRAINER 0x4 #define B_ANIM_SUBSTITUTE_TO_MON 0x5 #define B_ANIM_MON_TO_SUBSTITUTE 0x6 diff --git a/include/constants/daycare.h b/include/constants/daycare.h index 103f920f2..adb62fab5 100644 --- a/include/constants/daycare.h +++ b/include/constants/daycare.h @@ -22,6 +22,6 @@ // Array buffers #define EGG_MOVES_ARRAY_COUNT 10 -#define EGG_LVL_UP_MOVES_ARRAY_COUNT 50 +#define EGG_LVL_UP_MOVES_ARRAY_COUNT (MAX_LEVEL_UP_MOVES > 50 ? MAX_LEVEL_UP_MOVES : 50) #endif //GUARD_DAYCARE_CONSTANTS_H diff --git a/include/constants/flags.h b/include/constants/flags.h index 2490a6244..a562b0670 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -538,27 +538,27 @@ // Hidden Items -- sorted by location #define FLAG_HIDDEN_ITEMS_START 0x1F4 #define FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET (FLAG_HIDDEN_ITEMS_START + 0x01) -#define FLAG_HIDDEN_ITEM_UNDERWATER_1_CARBOS (FLAG_HIDDEN_ITEMS_START + 0x08) -#define FLAG_HIDDEN_ITEM_UNDERWATER_1_GREEN_SHARD (FLAG_HIDDEN_ITEMS_START + 0x09) -#define FLAG_HIDDEN_ITEM_UNDERWATER_1_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0A) -#define FLAG_HIDDEN_ITEM_UNDERWATER_1_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0B) -#define FLAG_HIDDEN_ITEM_UNDERWATER_1_HEART_SCALE_1 (FLAG_HIDDEN_ITEMS_START + 0x0D) -#define FLAG_HIDDEN_ITEM_UNDERWATER_1_CALCIUM (FLAG_HIDDEN_ITEMS_START + 0x24) -#define FLAG_HIDDEN_ITEM_UNDERWATER_1_HEART_SCALE_2 (FLAG_HIDDEN_ITEMS_START + 0x26) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x0E) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 0x0F) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_STARDUST (FLAG_HIDDEN_ITEMS_START + 0x10) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_PEARL (FLAG_HIDDEN_ITEMS_START + 0x11) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_IRON (FLAG_HIDDEN_ITEMS_START + 0x13) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_YELLOW_SHARD (FLAG_HIDDEN_ITEMS_START + 0x12) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x14) -#define FLAG_HIDDEN_ITEM_UNDERWATER_2_BLUE_SHARD (FLAG_HIDDEN_ITEMS_START + 0x0C) -#define FLAG_HIDDEN_ITEM_UNDERWATER_3_STAR_PIECE (FLAG_HIDDEN_ITEMS_START + 0x15) -#define FLAG_HIDDEN_ITEM_UNDERWATER_3_HP_UP (FLAG_HIDDEN_ITEMS_START + 0x16) -#define FLAG_HIDDEN_ITEM_UNDERWATER_3_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x17) -#define FLAG_HIDDEN_ITEM_UNDERWATER_3_RED_SHARD (FLAG_HIDDEN_ITEMS_START + 0x18) -#define FLAG_HIDDEN_ITEM_UNDERWATER_4_PROTEIN (FLAG_HIDDEN_ITEMS_START + 0x19) -#define FLAG_HIDDEN_ITEM_UNDERWATER_4_PEARL (FLAG_HIDDEN_ITEMS_START + 0x1A) +#define FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS (FLAG_HIDDEN_ITEMS_START + 0x08) +#define FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD (FLAG_HIDDEN_ITEMS_START + 0x09) +#define FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0A) +#define FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x0B) +#define FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1 (FLAG_HIDDEN_ITEMS_START + 0x0D) +#define FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM (FLAG_HIDDEN_ITEMS_START + 0x24) +#define FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2 (FLAG_HIDDEN_ITEMS_START + 0x26) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x0E) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL (FLAG_HIDDEN_ITEMS_START + 0x0F) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST (FLAG_HIDDEN_ITEMS_START + 0x10) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL (FLAG_HIDDEN_ITEMS_START + 0x11) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON (FLAG_HIDDEN_ITEMS_START + 0x13) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD (FLAG_HIDDEN_ITEMS_START + 0x12) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL (FLAG_HIDDEN_ITEMS_START + 0x14) +#define FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD (FLAG_HIDDEN_ITEMS_START + 0x0C) +#define FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE (FLAG_HIDDEN_ITEMS_START + 0x15) +#define FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP (FLAG_HIDDEN_ITEMS_START + 0x16) +#define FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE (FLAG_HIDDEN_ITEMS_START + 0x17) +#define FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD (FLAG_HIDDEN_ITEMS_START + 0x18) +#define FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN (FLAG_HIDDEN_ITEMS_START + 0x19) +#define FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL (FLAG_HIDDEN_ITEMS_START + 0x1A) #define FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET (FLAG_HIDDEN_ITEMS_START + 0x1C) #define FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL (FLAG_HIDDEN_ITEMS_START + 0x00) #define FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY (FLAG_HIDDEN_ITEMS_START + 0x1F) diff --git a/include/constants/layouts.h b/include/constants/layouts.h index 500b82cd4..9d5e877b0 100755 --- a/include/constants/layouts.h +++ b/include/constants/layouts.h @@ -55,9 +55,9 @@ #define LAYOUT_ROUTE132 48 #define LAYOUT_ROUTE133 49 #define LAYOUT_ROUTE134 50 -#define LAYOUT_UNDERWATER2 51 -#define LAYOUT_UNDERWATER3 52 -#define LAYOUT_UNDERWATER4 53 +#define LAYOUT_UNDERWATER_ROUTE126 51 +#define LAYOUT_UNDERWATER_ROUTE127 52 +#define LAYOUT_UNDERWATER_ROUTE128 53 #define LAYOUT_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F 54 #define LAYOUT_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F 55 #define LAYOUT_LITTLEROOT_TOWN_MAYS_HOUSE_1F 56 @@ -278,7 +278,7 @@ #define LAYOUT_ROUTE119_WEATHER_INSTITUTE_1F 271 #define LAYOUT_ROUTE119_WEATHER_INSTITUTE_2F 272 #define LAYOUT_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR 273 -#define LAYOUT_UNDERWATER1 274 +#define LAYOUT_UNDERWATER_ROUTE124 274 #define LAYOUT_MOSSDEEP_CITY_SPACE_CENTER_1F 275 #define LAYOUT_MOSSDEEP_CITY_SPACE_CENTER_2F 276 #define LAYOUT_SS_TIDAL_CORRIDOR 277 @@ -414,9 +414,9 @@ #define LAYOUT_MARINE_CAVE_ENTRANCE 407 #define LAYOUT_TERRA_CAVE_ENTRANCE 408 #define LAYOUT_TERRA_CAVE_END 409 -#define LAYOUT_UNDERWATER6 410 -#define LAYOUT_UNDERWATER7 411 -#define LAYOUT_UNDERWATER5 412 +#define LAYOUT_UNDERWATER_ROUTE105 410 +#define LAYOUT_UNDERWATER_ROUTE125 411 +#define LAYOUT_UNDERWATER_ROUTE129 412 #define LAYOUT_MARINE_CAVE_END 413 #define LAYOUT_TRAINER_HILL_ENTRANCE 414 #define LAYOUT_TRAINER_HILL_1F 415 diff --git a/include/constants/map_groups.h b/include/constants/map_groups.h index aef9924fa..69355635b 100755 --- a/include/constants/map_groups.h +++ b/include/constants/map_groups.h @@ -6,63 +6,63 @@ // // Map Group 0 -#define MAP_PETALBURG_CITY (0 | (0 << 8)) -#define MAP_SLATEPORT_CITY (1 | (0 << 8)) -#define MAP_MAUVILLE_CITY (2 | (0 << 8)) -#define MAP_RUSTBORO_CITY (3 | (0 << 8)) -#define MAP_FORTREE_CITY (4 | (0 << 8)) -#define MAP_LILYCOVE_CITY (5 | (0 << 8)) -#define MAP_MOSSDEEP_CITY (6 | (0 << 8)) -#define MAP_SOOTOPOLIS_CITY (7 | (0 << 8)) -#define MAP_EVER_GRANDE_CITY (8 | (0 << 8)) -#define MAP_LITTLEROOT_TOWN (9 | (0 << 8)) -#define MAP_OLDALE_TOWN (10 | (0 << 8)) -#define MAP_DEWFORD_TOWN (11 | (0 << 8)) -#define MAP_LAVARIDGE_TOWN (12 | (0 << 8)) -#define MAP_FALLARBOR_TOWN (13 | (0 << 8)) -#define MAP_VERDANTURF_TOWN (14 | (0 << 8)) -#define MAP_PACIFIDLOG_TOWN (15 | (0 << 8)) -#define MAP_ROUTE101 (16 | (0 << 8)) -#define MAP_ROUTE102 (17 | (0 << 8)) -#define MAP_ROUTE103 (18 | (0 << 8)) -#define MAP_ROUTE104 (19 | (0 << 8)) -#define MAP_ROUTE105 (20 | (0 << 8)) -#define MAP_ROUTE106 (21 | (0 << 8)) -#define MAP_ROUTE107 (22 | (0 << 8)) -#define MAP_ROUTE108 (23 | (0 << 8)) -#define MAP_ROUTE109 (24 | (0 << 8)) -#define MAP_ROUTE110 (25 | (0 << 8)) -#define MAP_ROUTE111 (26 | (0 << 8)) -#define MAP_ROUTE112 (27 | (0 << 8)) -#define MAP_ROUTE113 (28 | (0 << 8)) -#define MAP_ROUTE114 (29 | (0 << 8)) -#define MAP_ROUTE115 (30 | (0 << 8)) -#define MAP_ROUTE116 (31 | (0 << 8)) -#define MAP_ROUTE117 (32 | (0 << 8)) -#define MAP_ROUTE118 (33 | (0 << 8)) -#define MAP_ROUTE119 (34 | (0 << 8)) -#define MAP_ROUTE120 (35 | (0 << 8)) -#define MAP_ROUTE121 (36 | (0 << 8)) -#define MAP_ROUTE122 (37 | (0 << 8)) -#define MAP_ROUTE123 (38 | (0 << 8)) -#define MAP_ROUTE124 (39 | (0 << 8)) -#define MAP_ROUTE125 (40 | (0 << 8)) -#define MAP_ROUTE126 (41 | (0 << 8)) -#define MAP_ROUTE127 (42 | (0 << 8)) -#define MAP_ROUTE128 (43 | (0 << 8)) -#define MAP_ROUTE129 (44 | (0 << 8)) -#define MAP_ROUTE130 (45 | (0 << 8)) -#define MAP_ROUTE131 (46 | (0 << 8)) -#define MAP_ROUTE132 (47 | (0 << 8)) -#define MAP_ROUTE133 (48 | (0 << 8)) -#define MAP_ROUTE134 (49 | (0 << 8)) -#define MAP_UNDERWATER1 (50 | (0 << 8)) -#define MAP_UNDERWATER2 (51 | (0 << 8)) -#define MAP_UNDERWATER3 (52 | (0 << 8)) -#define MAP_UNDERWATER4 (53 | (0 << 8)) -#define MAP_UNDERWATER5 (54 | (0 << 8)) -#define MAP_UNDERWATER6 (55 | (0 << 8)) -#define MAP_UNDERWATER7 (56 | (0 << 8)) +#define MAP_PETALBURG_CITY (0 | (0 << 8)) +#define MAP_SLATEPORT_CITY (1 | (0 << 8)) +#define MAP_MAUVILLE_CITY (2 | (0 << 8)) +#define MAP_RUSTBORO_CITY (3 | (0 << 8)) +#define MAP_FORTREE_CITY (4 | (0 << 8)) +#define MAP_LILYCOVE_CITY (5 | (0 << 8)) +#define MAP_MOSSDEEP_CITY (6 | (0 << 8)) +#define MAP_SOOTOPOLIS_CITY (7 | (0 << 8)) +#define MAP_EVER_GRANDE_CITY (8 | (0 << 8)) +#define MAP_LITTLEROOT_TOWN (9 | (0 << 8)) +#define MAP_OLDALE_TOWN (10 | (0 << 8)) +#define MAP_DEWFORD_TOWN (11 | (0 << 8)) +#define MAP_LAVARIDGE_TOWN (12 | (0 << 8)) +#define MAP_FALLARBOR_TOWN (13 | (0 << 8)) +#define MAP_VERDANTURF_TOWN (14 | (0 << 8)) +#define MAP_PACIFIDLOG_TOWN (15 | (0 << 8)) +#define MAP_ROUTE101 (16 | (0 << 8)) +#define MAP_ROUTE102 (17 | (0 << 8)) +#define MAP_ROUTE103 (18 | (0 << 8)) +#define MAP_ROUTE104 (19 | (0 << 8)) +#define MAP_ROUTE105 (20 | (0 << 8)) +#define MAP_ROUTE106 (21 | (0 << 8)) +#define MAP_ROUTE107 (22 | (0 << 8)) +#define MAP_ROUTE108 (23 | (0 << 8)) +#define MAP_ROUTE109 (24 | (0 << 8)) +#define MAP_ROUTE110 (25 | (0 << 8)) +#define MAP_ROUTE111 (26 | (0 << 8)) +#define MAP_ROUTE112 (27 | (0 << 8)) +#define MAP_ROUTE113 (28 | (0 << 8)) +#define MAP_ROUTE114 (29 | (0 << 8)) +#define MAP_ROUTE115 (30 | (0 << 8)) +#define MAP_ROUTE116 (31 | (0 << 8)) +#define MAP_ROUTE117 (32 | (0 << 8)) +#define MAP_ROUTE118 (33 | (0 << 8)) +#define MAP_ROUTE119 (34 | (0 << 8)) +#define MAP_ROUTE120 (35 | (0 << 8)) +#define MAP_ROUTE121 (36 | (0 << 8)) +#define MAP_ROUTE122 (37 | (0 << 8)) +#define MAP_ROUTE123 (38 | (0 << 8)) +#define MAP_ROUTE124 (39 | (0 << 8)) +#define MAP_ROUTE125 (40 | (0 << 8)) +#define MAP_ROUTE126 (41 | (0 << 8)) +#define MAP_ROUTE127 (42 | (0 << 8)) +#define MAP_ROUTE128 (43 | (0 << 8)) +#define MAP_ROUTE129 (44 | (0 << 8)) +#define MAP_ROUTE130 (45 | (0 << 8)) +#define MAP_ROUTE131 (46 | (0 << 8)) +#define MAP_ROUTE132 (47 | (0 << 8)) +#define MAP_ROUTE133 (48 | (0 << 8)) +#define MAP_ROUTE134 (49 | (0 << 8)) +#define MAP_UNDERWATER_ROUTE124 (50 | (0 << 8)) +#define MAP_UNDERWATER_ROUTE126 (51 | (0 << 8)) +#define MAP_UNDERWATER_ROUTE127 (52 | (0 << 8)) +#define MAP_UNDERWATER_ROUTE128 (53 | (0 << 8)) +#define MAP_UNDERWATER_ROUTE129 (54 | (0 << 8)) +#define MAP_UNDERWATER_ROUTE105 (55 | (0 << 8)) +#define MAP_UNDERWATER_ROUTE125 (56 | (0 << 8)) // Map Group 1 #define MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F (0 | (1 << 8)) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index f026fa0e3..52eabe71b 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -204,6 +204,8 @@ #define LEVEL_UP_MOVE_LV 0xFE00 #define LEVEL_UP_END 0xFFFF +#define MAX_LEVEL_UP_MOVES 20 + #define MON_MALE 0x00 #define MON_FEMALE 0xFE #define MON_GENDERLESS 0xFF diff --git a/include/constants/region_map_sections.h b/include/constants/region_map_sections.h index 5e64048dd..65aa3e1ca 100644 --- a/include/constants/region_map_sections.h +++ b/include/constants/region_map_sections.h @@ -52,9 +52,9 @@ #define MAPSEC_ROUTE_133 0x30 #define MAPSEC_ROUTE_134 0x31 #define MAPSEC_UNDERWATER_124 0x32 -#define MAPSEC_UNDERWATER_125 0x33 -#define MAPSEC_UNDERWATER_126 0x34 -#define MAPSEC_UNDERWATER_127 0x35 +#define MAPSEC_UNDERWATER_126 0x33 +#define MAPSEC_UNDERWATER_127 0x34 +#define MAPSEC_UNDERWATER_128 0x35 #define MAPSEC_UNDERWATER_SOOTOPOLIS 0x36 #define MAPSEC_GRANITE_CAVE 0x37 #define MAPSEC_MT_CHIMNEY 0x38 @@ -70,7 +70,7 @@ #define MAPSEC_AQUA_HIDEOUT_OLD 0x42 #define MAPSEC_SHOAL_CAVE 0x43 #define MAPSEC_SEAFLOOR_CAVERN 0x44 -#define MAPSEC_UNDERWATER_128 0x45 +#define MAPSEC_UNDERWATER_SEAFLOOR_CAVERN 0x45 #define MAPSEC_VICTORY_ROAD 0x46 #define MAPSEC_MIRAGE_ISLAND 0x47 #define MAPSEC_CAVE_OF_ORIGIN 0x48 @@ -207,8 +207,8 @@ #define MAPSEC_MARINE_CAVE 0xCB #define MAPSEC_UNDERWATER_MARINE_CAVE 0xCC #define MAPSEC_TERRA_CAVE 0xCD -#define MAPSEC_UNDERWATER_TERRA_CAVE 0xCE -#define MAPSEC_UNDERWATER_UNK1 0xCF +#define MAPSEC_UNDERWATER_105 0xCE +#define MAPSEC_UNDERWATER_125 0xCF #define MAPSEC_UNDERWATER_129 0xD0 #define MAPSEC_DESERT_UNDERPASS 0xD1 #define MAPSEC_ALTERING_CAVE 0xD2 diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 071a89bc5..1daa99e1d 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -553,6 +553,7 @@ #define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) #define WININ_WIN0_OBJ (1 << 4) #define WININ_WIN0_CLR (1 << 5) +#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) #define WININ_WIN1_BG0 (1 << 8) #define WININ_WIN1_BG1 (1 << 9) #define WININ_WIN1_BG2 (1 << 10) @@ -560,6 +561,7 @@ #define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) #define WININ_WIN1_OBJ (1 << 12) #define WININ_WIN1_CLR (1 << 13) +#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR) #define WINOUT_WIN01_BG0 (1 << 0) #define WINOUT_WIN01_BG1 (1 << 1) @@ -568,6 +570,7 @@ #define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) #define WINOUT_WIN01_OBJ (1 << 4) #define WINOUT_WIN01_CLR (1 << 5) +#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR) #define WINOUT_WINOBJ_BG0 (1 << 8) #define WINOUT_WINOBJ_BG1 (1 << 9) #define WINOUT_WINOBJ_BG2 (1 << 10) @@ -575,6 +578,7 @@ #define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) #define WINOUT_WINOBJ_OBJ (1 << 12) #define WINOUT_WINOBJ_CLR (1 << 13) +#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR) #define WIN_RANGE(a, b) (((a) << 8) | (b)) #define WIN_RANGE2(a, b) ((b) | ((a) << 8)) @@ -585,9 +589,10 @@ #define BLDCNT_TGT1_BG1 (1 << 1) #define BLDCNT_TGT1_BG2 (1 << 2) #define BLDCNT_TGT1_BG3 (1 << 3) +#define BLDCNT_TGT1_BG_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3) #define BLDCNT_TGT1_OBJ (1 << 4) #define BLDCNT_TGT1_BD (1 << 5) -#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) +#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG_ALL | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) // Bits 6-7 select the special effect #define BLDCNT_EFFECT_NONE (0 << 6) // no special effect #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) @@ -598,9 +603,10 @@ #define BLDCNT_TGT2_BG1 (1 << 9) #define BLDCNT_TGT2_BG2 (1 << 10) #define BLDCNT_TGT2_BG3 (1 << 11) +#define BLDCNT_TGT2_BG_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3) #define BLDCNT_TGT2_OBJ (1 << 12) #define BLDCNT_TGT2_BD (1 << 13) -#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) +#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG_ALL | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) // BLDALPHA #define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index e2836c6f6..bdff1b865 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -140,55 +140,13 @@ struct SoundChannel struct WaveData *wav; u32 cp; struct MusicPlayerTrack *track; - u32 pp; - u32 np; - u32 d4; + void *pp; + void *np; + void *d4; u16 xpi; u16 xpc; }; -#define MAX_DIRECTSOUND_CHANNELS 12 - -#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer - -struct SoundInfo -{ - // This field is normally equal to ID_NUMBER but it is set to other - // values during sensitive operations for locking purposes. - // This field should be volatile but isn't. This could potentially cause - // race conditions. - u32 ident; - - vu8 pcmDmaCounter; - - // Direct Sound - u8 reverb; - u8 maxChans; - u8 masterVolume; - u8 freq; - - u8 mode; - u8 c15; - u8 pcmDmaPeriod; // number of V-blanks per PCM DMA - u8 maxLines; - u8 gap[3]; - s32 pcmSamplesPerVBlank; - s32 pcmFreq; - s32 divFreq; - struct CgbChannel *cgbChans; - u32 func; - u32 intp; - void (*CgbSound)(void); - void (*CgbOscOff)(u8); - u32 (*MidiKeyToCgbFreq)(u8, u8, u8); - u32 MPlayJumpTable; - u32 plynote; - u32 ExtVolPit; - u8 gap2[16]; - struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; - s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; -}; - struct SongHeader { u8 trackCount; @@ -312,7 +270,7 @@ struct MusicPlayerInfo struct MusicPlayerTrack *tracks; struct ToneData *tone; u32 ident; - u32 func; + void (*func)(); u32 intp; }; @@ -334,7 +292,47 @@ struct Song extern const struct MusicPlayer gMPlayTable[]; extern const struct Song gSongTable[]; +#define MAX_DIRECTSOUND_CHANNELS 12 + +#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer + +struct SoundInfo +{ + // This field is normally equal to ID_NUMBER but it is set to other + // values during sensitive operations for locking purposes. + // This field should be volatile but isn't. This could potentially cause + // race conditions. + u32 ident; + + vu8 pcmDmaCounter; + + // Direct Sound + u8 reverb; + u8 maxChans; + u8 masterVolume; + u8 freq; + u8 mode; + u8 c15; + u8 pcmDmaPeriod; // number of V-blanks per PCM DMA + u8 maxLines; + u8 gap[3]; + s32 pcmSamplesPerVBlank; + s32 pcmFreq; + s32 divFreq; + struct CgbChannel *cgbChans; + void (*func)(); + u32 intp; + void (*CgbSound)(); + void (*CgbOscOff)(u8); + u32 (*MidiKeyToCgbFreq)(u8, u8, u8); + void (**MPlayJumpTable)(); + void (*plynote)(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *); + void (*ExtVolPit)(struct MusicPlayerInfo *, struct MusicPlayerTrack *); + u32 gap2[4]; + struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; + s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; +}; extern u8 gMPlayMemAccArea[]; @@ -448,7 +446,7 @@ void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *); void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *); -void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_note(u8, struct MusicPlayerInfo *, struct MusicPlayerTrack *); // extended sound command handler functions void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *); diff --git a/include/global.h b/include/global.h index 7de8d1eb3..08988eac7 100644 --- a/include/global.h +++ b/include/global.h @@ -102,6 +102,7 @@ #define TEST_BUTTON(field, button) ({(field) & (button);}) #define JOY_NEW(button) TEST_BUTTON(gMain.newKeys, button) #define JOY_HELD(button) TEST_BUTTON(gMain.heldKeys, button) +#define JOY_HELD_RAW(button) TEST_BUTTON(gMain.heldKeysRaw, button) #define JOY_REPEAT(button) TEST_BUTTON(gMain.newAndRepeatedKeys, button) #define S16TOPOSFLOAT(val) \ diff --git a/include/global.tv.h b/include/global.tv.h index b211052e0..8e1a898b6 100644 --- a/include/global.tv.h +++ b/include/global.tv.h @@ -32,7 +32,7 @@ typedef union // size = 0x24 /*0x01*/ bool8 active; /*0x02*/ u16 species; /*0x04*/ u16 words[6]; - /*0x10*/ u8 playerName[8]; + /*0x10*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x18*/ u8 language; } fanclubLetter; @@ -42,7 +42,7 @@ typedef union // size = 0x24 /*0x01*/ bool8 active; /*0x02*/ u16 var02; /*0x04*/ u16 words[6]; - /*0x10*/ u8 playerName[8]; + /*0x10*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x18*/ u8 language; } recentHappenings; @@ -53,11 +53,11 @@ typedef union // size = 0x24 /*0x02*/ u16 species; /*0x04*/ u8 friendshipHighNybble:4; /*0x04*/ u8 questionAsked:4; - /*0x05*/ u8 playerName[8]; + /*0x05*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x0D*/ u8 language; /*0x0E*/ u8 pokemonNameLanguage; /*0x0F*/ u8 filler_0F[1]; - /*0x10*/ u8 nickname[8]; + /*0x10*/ u8 nickname[PLAYER_NAME_LENGTH + 1]; /*0x18*/ u16 words18[2]; /*0x1C*/ u16 words[4]; } fanclubOpinions; @@ -78,7 +78,7 @@ typedef union // size = 0x24 /*0x00*/ u8 kind; /*0x01*/ bool8 active; /*0x02*/ u16 species; - /*0x04*/ u8 pokemonName[11]; + /*0x04*/ u8 pokemonName[POKEMON_NAME_LENGTH + 1]; /*0x0F*/ u8 trainerName[11]; /*0x1A*/ u8 random; /*0x1B*/ u8 random2; @@ -93,12 +93,12 @@ typedef union // size = 0x24 /*0x01*/ bool8 active; /*0x02*/ u16 species; /*0x04*/ u16 words[2]; - /*0x08*/ u8 pokemonNickname[11]; + /*0x08*/ u8 pokemonNickname[POKEMON_NAME_LENGTH + 1]; /*0x13*/ u8 contestCategory:3; /*0x13*/ u8 contestRank:2; /*0x13*/ u8 contestResult:2; /*0x14*/ u16 move; - /*0x16*/ u8 playerName[8]; + /*0x16*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x1E*/ u8 language; /*0x1F*/ u8 pokemonNameLanguage; } bravoTrainer; @@ -107,7 +107,7 @@ typedef union // size = 0x24 struct { /*0x00*/ u8 kind; /*0x01*/ bool8 active; - /*0x02*/ u8 trainerName[8]; + /*0x02*/ u8 trainerName[PLAYER_NAME_LENGTH + 1]; /*0x0A*/ u16 species; /*0x0C*/ u8 pokemonName[8]; /*0x14*/ u16 defeatedSpecies; @@ -125,14 +125,14 @@ typedef union // size = 0x24 /*0x00*/ u8 kind; /*0x01*/ bool8 active; /*0x02*/ u16 losingSpecies; - /*0x04*/ u8 losingTrainerName[8]; + /*0x04*/ u8 losingTrainerName[PLAYER_NAME_LENGTH + 1]; /*0x0C*/ u8 loserAppealFlag; /*0x0D*/ u8 round1Placing; /*0x0e*/ u8 round2Placing; /*0x0f*/ u8 winnerAppealFlag; /*0x10*/ u16 move; /*0x12*/ u16 winningSpecies; - /*0x14*/ u8 winningTrainerName[8]; + /*0x14*/ u8 winningTrainerName[PLAYER_NAME_LENGTH + 1]; /*0x1C*/ u8 category; /*0x1D*/ u8 winningTrainerLanguage; /*0x1E*/ u8 losingTrainerLanguage; @@ -144,9 +144,9 @@ typedef union // size = 0x24 /*0x01*/ bool8 active; /*0x02*/ u8 sheen; /*0x03*/ u8 flavor:3; - /*0x03*/ u8 unk_03_3:2; - /*0x04*/ u8 worstBlenderName[8]; - /*0x0C*/ u8 playerName[8]; + /*0x03*/ u8 color:2; + /*0x04*/ u8 worstBlenderName[PLAYER_NAME_LENGTH + 1]; + /*0x0C*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x14*/ u8 language; /*0x15*/ u8 worstBlenderLanguage; } threeCheers; @@ -156,8 +156,8 @@ typedef union // size = 0x24 /*0x00*/ u8 kind; /*0x01*/ bool8 active; /*0x02*/ u16 speciesOpponent; - /*0x04*/ u8 playerName[8]; - /*0x0C*/ u8 linkOpponentName[8]; + /*0x04*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; + /*0x0C*/ u8 linkOpponentName[PLAYER_NAME_LENGTH + 1]; /*0x14*/ u16 move; /*0x16*/ u16 speciesPlayer; /*0x18*/ u8 battleType; @@ -169,10 +169,10 @@ typedef union // size = 0x24 struct { /*0x00*/ u8 kind; /*0x01*/ bool8 active; - /*0x02*/ u8 playerName[8]; + /*0x02*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x0a*/ u8 idLo; /*0x0b*/ u8 idHi; - /*0x0c*/ u8 idolName[8]; + /*0x0c*/ u8 idolName[PLAYER_NAME_LENGTH + 1]; /*0x14*/ u16 words[1]; /*0x16*/ u8 score; /*0x17*/ u8 language; @@ -183,9 +183,9 @@ typedef union // size = 0x24 struct { /*0x00*/ u8 kind; /*0x01*/ bool8 active; - /*0x02*/ u8 playerName[8]; + /*0x02*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x0a*/ u8 contestCategory; - /*0x0b*/ u8 nickname[11]; + /*0x0b*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x16*/ u8 pokeblockState; /*0x17*/ u8 language; /*0x18*/ u8 pokemonNameLanguage; @@ -198,11 +198,11 @@ typedef union // size = 0x24 /*0x01*/ bool8 active; /*0x02*/ u8 language; /*0x03*/ u8 language2; - /*0x04*/ u8 nickname[11]; + /*0x04*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x0F*/ u8 ball; /*0x10*/ u16 species; /*0x12*/ u8 nBallsUsed; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } pokemonToday; // TVSHOW_SMART_SHOPPER @@ -215,7 +215,7 @@ typedef union // size = 0x24 /*0x06*/ u16 itemIds[3]; /*0x0C*/ u16 itemAmounts[3]; /*0x12*/ u8 shopLocation; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } smartshopperShow; // TVSHOW_POKEMON_TODAY_FAILED @@ -229,7 +229,7 @@ typedef union // size = 0x24 /*0x10*/ u8 nBallsUsed; /*0x11*/ u8 outcome; /*0x12*/ u8 location; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } pokemonTodayFailed; // TVSHOW_FISHING_ADVICE @@ -241,7 +241,7 @@ typedef union // size = 0x24 /*0x04*/ u16 species; /*0x06*/ u8 language; /*0x07*/ u8 pad07[12]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } pokemonAngler; // TVSHOW_WORLD_OF_MASTERS @@ -255,7 +255,7 @@ typedef union // size = 0x24 /*0x0a*/ u8 location; /*0x0b*/ u8 language; /*0x0c*/ u8 pad0c[7]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } worldOfMasters; // TVSHOW_TODAYS_RIVAL_TRAINER @@ -271,7 +271,7 @@ typedef union // size = 0x24 /*0x0a*/ u16 mapLayoutId; /*0x0c*/ u8 language; /*0x0d*/ u8 filler_0d[6]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } rivalTrainer; // TVSHOW_TREND_WATCHER @@ -283,7 +283,7 @@ typedef union // size = 0x24 /*0x08*/ u8 gender; /*0x09*/ u8 language; /*0x0a*/ u8 filler_0a[9]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } trendWatcher; // TVSHOW_TREASURE_INVESTIGATORS @@ -295,7 +295,7 @@ typedef union // size = 0x24 /*0x05*/ u8 language; /*0x06*/ u16 mapLayoutId; /*0x08*/ u8 filler_08[11]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } treasureInvestigators; // TVSHOW_FIND_THAT_GAMER @@ -308,7 +308,7 @@ typedef union // size = 0x24 /*0x06*/ u8 filler_06[2]; /*0x08*/ u8 language; /*0x09*/ u8 filler_09[10]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } findThatGamer; // TVSHOW_BREAKING_NEWS @@ -324,7 +324,7 @@ typedef union // size = 0x24 /*0x0c*/ u16 lastUsedMove; /*0x0e*/ u8 language; /*0x0f*/ u8 filler_0f[4]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } breakingNews; // TVSHOW_SECRET_BASE_VISIT @@ -338,7 +338,7 @@ typedef union // size = 0x24 /*0x0a*/ u16 move; /*0x0c*/ u8 language; /*0x0d*/ u8 filler_0d[6]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } secretBaseVisit; // TVSHOW_LOTTO_WINNER @@ -349,7 +349,7 @@ typedef union // size = 0x24 /*0x04*/ u8 whichPrize; /*0x05*/ u8 language; /*0x06*/ u8 filler_06[13]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } lottoWinner; // TVSHOW_BATTLE_SEMINAR @@ -364,7 +364,7 @@ typedef union // size = 0x24 /*0x10*/ u8 nOtherMoves; /*0x11*/ u8 language; /*0x12*/ u8 filler_12[1]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } battleSeminar; // TVSHOW_TRAINER_FAN_CLUB @@ -375,7 +375,7 @@ typedef union // size = 0x24 /*0x04*/ u16 words[2]; /*0x08*/ u8 language; /*0x09*/ u8 filler_09[10]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } trainerFanClub; // TVSHOW_CUTIES @@ -384,11 +384,11 @@ typedef union // size = 0x24 /*0x01*/ bool8 active; /*0x02*/ u8 nRibbons; /*0x03*/ u8 selectedRibbon; - /*0x04*/ u8 nickname[11]; + /*0x04*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x0f*/ u8 language; /*0x10*/ u8 pokemonNameLanguage; /*0x11*/ u8 filler_12[2]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } cuties; // TVSHOW_FRONTIER @@ -403,7 +403,7 @@ typedef union // size = 0x24 /*0x0c*/ u8 language; /*0x0d*/ u8 facility; /*0x0e*/ u8 filler_0e[5]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } frontier; // TVSHOW_NUMBER_ONE @@ -414,7 +414,7 @@ typedef union // size = 0x24 /*0x04*/ u8 actionIdx; /*0x05*/ u8 language; /*0x06*/ u8 filler_06[13]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } numberOne; // TVSHOW_SECRET_BASE_SECRETS @@ -422,11 +422,11 @@ typedef union // size = 0x24 /*0x00*/ u8 kind; /*0x01*/ bool8 active; /*0x02*/ u16 stepsInBase; - /*0x04*/ u8 baseOwnersName[8]; + /*0x04*/ u8 baseOwnersName[PLAYER_NAME_LENGTH + 1]; /*0x0c*/ u32 flags; /*0x10*/ u16 item; /*0x12*/ u8 savedState; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x1b*/ u8 language; /*0x1c*/ u8 baseOwnersNameLanguage; } secretBaseSecrets; @@ -439,7 +439,7 @@ typedef union // size = 0x24 /*0x03*/ u8 nPkblkUsed; /*0x04*/ u8 language; /*0x05*/ u8 filler_05[14]; - /*0x13*/ u8 playerName[8]; + /*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; } safariFanClub; // Mass Outbreak diff --git a/include/graphics.h b/include/graphics.h index 158697af0..32268d6db 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3310,57 +3310,57 @@ extern const u32 gBerryTag_Gfx[]; extern const u32 gBerryTag_Pal[]; // rayquaza scene gfx -extern const u32 gRaySceneGroudon_Gfx[]; -extern const u32 gRaySceneGroudon2_Gfx[]; -extern const u32 gRaySceneGroudon3_Gfx[]; -extern const u32 gRaySceneKyogre_Gfx[]; -extern const u32 gRaySceneKyogre2_Gfx[]; -extern const u32 gRaySceneKyogre3_Gfx[]; -extern const u32 gRaySceneGroudon_Pal[]; -extern const u32 gRaySceneKyogre_Pal[]; -extern const u32 gRaySceneSmoke_Gfx[]; -extern const u32 gRaySceneSmoke_Pal[]; -extern const u32 gRaySceneRayquaza_Pal[]; -extern const u32 gRaySceneRayquazaFly1_Gfx[]; -extern const u32 gRaySceneRayquazaTail_Gfx[]; -extern const u32 gRaySceneGroudonLeft_Gfx[]; -extern const u32 gRaySceneGroudonTail_Gfx[]; -extern const u32 gRaySceneKyogreRight_Gfx[]; -extern const u32 gRaySceneRayquazaHover_Gfx[]; -extern const u32 gRaySceneRayquazaFlyIn_Gfx[]; -extern const u32 gRaySceneOvercast_Gfx[]; -extern const u32 gRaySceneOvercast_Tilemap[]; -extern const u32 gRaySceneRayquaza_Gfx[]; -extern const u32 gRaySceneRayquaza_Tilemap[]; -extern const u32 gRaySceneSplash_Gfx[]; -extern const u32 gRaySceneGroudonLeft_Pal[]; -extern const u32 gRaySceneKyogreRight_Pal[]; -extern const u32 gRaySceneRayquazaHover_Pal[]; -extern const u32 gRaySceneSplash_Pal[]; -extern const u32 gRaySceneClouds_Gfx[]; -extern const u32 gRaySceneClouds_Pal[]; -extern const u32 gRaySceneClouds2_Tilemap[]; -extern const u32 gRaySceneClouds1_Tilemap[]; -extern const u32 gRaySceneClouds3_Tilemap[]; -extern const u32 gRaySceneRayquazaLight_Gfx[]; -extern const u32 gRaySceneRayquazaLight_Tilemap[]; -extern const u32 gRaySceneOvercast2_Gfx[]; -extern const u32 gRaySceneOvercast2_Tilemap[]; -extern const u32 gRaySceneOvercast2_Pal[]; -extern const u32 gRaySceneRayquazaChase_Gfx[]; -extern const u32 gRaySceneChaseStreaks_Gfx[]; -extern const u32 gRaySceneChaseBg_Gfx[]; -extern const u32 gRayChaseRayquazaChase2_Tilemap[]; -extern const u32 gRayChaseRayquazaChase_Tilemap[]; -extern const u32 gRaySceneChaseStreaks_Tilemap[]; -extern const u32 gRaySceneChaseBg_Tilemap[]; -extern const u32 gRaySceneChase_Pal[]; -extern const u32 gRaySceneHushRing_Tilemap[]; -extern const u32 gRaySceneHushBg_Tilemap[]; -extern const u32 gRaySceneHushRing_Map[]; -extern const u32 gRaySceneHushBg_Pal[]; -extern const u32 gRaySceneHushBg_Gfx[]; -extern const u32 gRaySceneHushRing_Gfx[]; +extern const u32 gRaySceneDuoFight_Groudon_Gfx[]; +extern const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[]; +extern const u32 gRaySceneDuoFight_GroudonClaw_Gfx[]; +extern const u32 gRaySceneDuoFight_Kyogre_Gfx[]; +extern const u32 gRaySceneDuoFight_KyogrePectoralFin_Gfx[]; +extern const u32 gRaySceneDuoFight_KyogreDorsalFin_Gfx[]; +extern const u32 gRaySceneDuoFight_Groudon_Pal[]; +extern const u32 gRaySceneDuoFight_Kyogre_Pal[]; +extern const u32 gRaySceneDuoFight_Clouds_Gfx[]; +extern const u32 gRaySceneDuoFight_Clouds_Pal[]; +extern const u32 gRaySceneDuoFight_Clouds1_Tilemap[]; +extern const u32 gRaySceneDuoFight_Clouds2_Tilemap[]; +extern const u32 gRaySceneDuoFight_Clouds3_Tilemap[]; +extern const u32 gRaySceneTakesFlight_Smoke_Gfx[]; +extern const u32 gRaySceneTakesFlight_Smoke_Pal[]; +extern const u32 gRaySceneTakesFlight_Rayquaza_Pal[]; +extern const u32 gRaySceneTakesFlight_Bg_Gfx[]; +extern const u32 gRaySceneTakesFlight_Bg_Tilemap[]; +extern const u32 gRaySceneTakesFlight_Rayquaza_Gfx[]; +extern const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[]; +extern const u32 gRaySceneDescends_Rayquaza_Gfx[]; +extern const u32 gRaySceneDescends_RayquazaTail_Gfx[]; +extern const u32 gRaySceneDescends_Light_Gfx[]; +extern const u32 gRaySceneDescends_Light_Tilemap[]; +extern const u32 gRaySceneDescends_Bg_Gfx[]; +extern const u32 gRaySceneDescends_Bg_Tilemap[]; +extern const u32 gRaySceneDescends_Bg_Pal[]; +extern const u32 gRaySceneCharges_Rayquaza_Gfx[]; +extern const u32 gRaySceneCharges_Streaks_Gfx[]; +extern const u32 gRaySceneCharges_Bg_Gfx[]; +extern const u32 gRaySceneCharges_Orbs_Tilemap[]; +extern const u32 gRaySceneCharges_Rayquaza_Tilemap[]; +extern const u32 gRaySceneCharges_Streaks_Tilemap[]; +extern const u32 gRaySceneCharges_Bg_Tilemap[]; +extern const u32 gRaySceneCharges_Bg_Pal[]; +extern const u32 gRaySceneChasesAway_Groudon_Gfx[]; +extern const u32 gRaySceneChasesAway_GroudonTail_Gfx[]; +extern const u32 gRaySceneChasesAway_Kyogre_Gfx[]; +extern const u32 gRaySceneChasesAway_Rayquaza_Gfx[]; +extern const u32 gRaySceneChasesAway_RayquazaTail_Gfx[]; +extern const u32 gRaySceneChasesAway_KyogreSplash_Gfx[]; +extern const u32 gRaySceneChasesAway_Groudon_Pal[]; +extern const u32 gRaySceneChasesAway_Kyogre_Pal[]; +extern const u32 gRaySceneChasesAway_Rayquaza_Pal[]; +extern const u32 gRaySceneChasesAway_KyogreSplash_Pal[]; +extern const u32 gRaySceneChasesAway_Bg_Tilemap[]; +extern const u32 gRaySceneChasesAway_Light_Tilemap[]; +extern const u32 gRaySceneChasesAway_Ring_Tilemap[]; +extern const u32 gRaySceneChasesAway_Bg_Pal[]; +extern const u32 gRaySceneChasesAway_Light_Gfx[]; +extern const u32 gRaySceneChasesAway_Ring_Gfx[]; // Pokeballs extern const u32 gItemIcon_MasterBall[]; @@ -4813,16 +4813,16 @@ extern const u16 gUsePokeblockGraph_Pal[]; extern const u16 gUsePokeblockNatureWin_Pal[]; // Berry blender -extern const u32 gBerryBlenderArrowTiles[]; -extern const u32 gBerryBlenderStartTiles[]; -extern const u32 gBerryBlenderMarubatsuTiles[]; -extern const u32 gBerryBlenderParticlesTiles[]; -extern const u32 gBerryBlenderCountdownNumbersTiles[]; +extern const u32 gBerryBlenderPlayerArrow_Gfx[]; +extern const u32 gBerryBlenderStart_Gfx[]; +extern const u32 gBerryBlenderScoreSymbols_Gfx[]; +extern const u32 gBerryBlenderParticles_Gfx[]; +extern const u32 gBerryBlenderCountdownNumbers_Gfx[]; extern const u16 gBerryBlenderMiscPalette[]; extern const u16 gBerryBlenderArrowPalette[]; -extern const u32 sBlenderCenterGfx[]; -extern const u32 gUnknown_08D91DB8[]; -extern const u32 gUnknown_08D927EC[]; +extern const u32 gBerryBlenderCenter_Gfx[]; +extern const u32 gBerryBlenderOuter_Gfx[]; +extern const u32 gBerryBlenderOuter_Tilemap[]; // Slot Machine extern const u32 gSlotMachineDigitalDisplay_Gfx[]; @@ -4894,11 +4894,11 @@ extern const u32 gWallpaperTilemap_Horizontal[]; extern const u16 gWallpaperPalettes_Horizontal[][16]; // Cable Car -extern const u32 gUnknown_08DBA5B8[]; -extern const u16 gUnknown_08DBA518[]; +extern const u32 gCableCarBg_Gfx[]; +extern const u16 gCableCarBg_Pal[]; extern const u32 gCableCar_Gfx[]; extern const u32 gCableCarDoor_Gfx[]; -extern const u32 gCableCarCord_Gfx[]; +extern const u32 gCableCarCable_Gfx[]; extern const u16 gCableCar_Pal[]; // Trade diff --git a/include/item_menu.h b/include/item_menu.h index edfb986f7..a99272b0c 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -93,7 +93,7 @@ void CB2_GoToSellMenu(void); void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *postExitMenuMainCallback2)()); void DoWallyTutorialBagMenu(void); void ResetBagScrollPositions(void); -void ChooseBerrySetCallback(void (*callback)(void)); +void ChooseBerryForMachine(void (*exitCallback)(void)); void CB2_ChooseBerry(void); void Task_FadeAndCloseBagMenu(u8 taskId); void BagMenu_YesNo(u8, u8, const struct YesNoFuncTable*); diff --git a/include/item_menu_icons.h b/include/item_menu_icons.h index 75e9100d2..e061149fc 100644 --- a/include/item_menu_icons.h +++ b/include/item_menu_icons.h @@ -19,7 +19,7 @@ void sub_80D4FC8(u8 arg0); void sub_80D4FEC(u8 arg0); u8 CreateBerryTagSprite(u8 id, s16 x, s16 y); void FreeBerryTagSpritePalette(void); -u8 LoadSpinningBerryPicGfx(u8 berryId, u8 x, u8 y, bool8 startAffine); +u8 CreateSpinningBerrySprite(u8 berryId, u8 x, u8 y, bool8 startAffine); u8 CreateBerryFlavorCircleSprite(s16 x); #define TAG_BAG_GFX 100 diff --git a/include/link.h b/include/link.h index de10bb8dc..086bf787b 100644 --- a/include/link.h +++ b/include/link.h @@ -48,52 +48,60 @@ #define EXTRACT_LINK_ERRORS(status) \ (((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT) -#define LINKCMD_SEND_LINK_TYPE 0x2222 -#define LINKCMD_READY_EXIT_STANDBY 0x2FFE -#define LINKCMD_SEND_HELD_KEYS 0x4444 -#define LINKCMD_0x5555 0x5555 -#define LINKCMD_0x5566 0x5566 -#define LINKCMD_READY_CLOSE_LINK 0x5FFF -#define LINKCMD_0x6666 0x6666 -#define LINKCMD_0x7777 0x7777 -#define LINKCMD_CONT_BLOCK 0x8888 -#define LINKCMD_0xAAAA 0xAAAA -#define LINKCMD_0xAAAB 0xAAAB -#define LINKCMD_READY_TO_TRADE 0xAABB -#define LINKCMD_READY_FINISH_TRADE 0xABCD -#define LINKCMD_INIT_BLOCK 0xBBBB -#define LINKCMD_READY_CANCEL_TRADE 0xBBCC -#define LINKCMD_SEND_HELD_KEYS_2 0xCAFE -#define LINKCMD_SEND_BLOCK_REQ 0xCCCC -#define LINKCMD_START_TRADE 0xCCDD -#define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA -#define LINKCMD_SET_MONS_TO_TRADE 0xDDDD -#define LINKCMD_0xDDEE 0xDDEE -#define LINKCMD_REQUEST_CANCEL 0xEEAA -#define LINKCMD_CANCEL_TRADE 0xEEBB -#define LINKCMD_0xEECC 0xEECC - -#define LINKTYPE_TRADE 0x1111 -#define LINKTYPE_TRADE_CONNECTING 0x1122 -#define LINKTYPE_TRADE_SETUP 0x1133 -#define LINKTYPE_TRADE_DISCONNECTED 0x1144 -#define LINKTYPE_BATTLE 0x2211 -#define LINKTYPE_0x2222 0x2222 // unused battle? -#define LINKTYPE_SINGLE_BATTLE 0x2233 -#define LINKTYPE_DOUBLE_BATTLE 0x2244 -#define LINKTYPE_MULTI_BATTLE 0x2255 -#define LINKTYPE_BATTLE_TOWER_50 0x2266 -#define LINKTYPE_BATTLE_TOWER_OPEN 0x2277 -#define LINKTYPE_BATTLE_TOWER 0x2288 -#define LINKTYPE_RECORD_MIX_BEFORE 0x3311 -#define LINKTYPE_RECORD_MIX_AFTER 0x3322 -#define LINKTYPE_BERRY_BLENDER_SETUP 0x4411 -#define LINKTYPE_BERRY_BLENDER 0x4422 -#define LINKTYPE_MYSTERY_EVENT 0x5501 -#define LINKTYPE_0x5502 0x5502 // unused? -#define LINKTYPE_EREADER 0x5503 -#define LINKTYPE_CONTEST_GMODE 0x6601 -#define LINKTYPE_CONTEST_EMODE 0x6602 +#define LINKCMD_BLENDER_STOP 0x1111 +#define LINKCMD_SEND_LINK_TYPE 0x2222 +#define LINKCMD_BLENDER_SCORE_MISS 0x2345 +#define LINKCMD_READY_EXIT_STANDBY 0x2FFE +#define LINKCMD_SEND_PACKET 0x2FFF +#define LINKCMD_BLENDER_SEND_KEYS 0x4444 +#define LINKCMD_BLENDER_SCORE_BEST 0x4523 +#define LINKCMD_BLENDER_SCORE_GOOD 0x5432 +#define LINKCMD_0x5555 0x5555 +#define LINKCMD_0x5566 0x5566 +#define LINKCMD_READY_CLOSE_LINK 0x5FFF +#define LINKCMD_0x6666 0x6666 +#define LINKCMD_0x7777 0x7777 +#define LINKCMD_BLENDER_PLAY_AGAIN 0x7779 +#define LINKCMD_0x7FFF 0x7FFF +#define LINKCMD_CONT_BLOCK 0x8888 +#define LINKCMD_BLENDER_NO_BERRIES 0x9999 +#define LINKCMD_BLENDER_NO_PBLOCK_SPACE 0xAAAA +#define LINKCMD_0xAAAB 0xAAAB +#define LINKCMD_READY_TO_TRADE 0xAABB +#define LINKCMD_READY_FINISH_TRADE 0xABCD +#define LINKCMD_INIT_BLOCK 0xBBBB +#define LINKCMD_READY_CANCEL_TRADE 0xBBCC +#define LINKCMD_SEND_HELD_KEYS 0xCAFE +#define LINKCMD_SEND_BLOCK_REQ 0xCCCC +#define LINKCMD_START_TRADE 0xCCDD +#define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA +#define LINKCMD_SET_MONS_TO_TRADE 0xDDDD +#define LINKCMD_0xDDEE 0xDDEE +#define LINKCMD_REQUEST_CANCEL 0xEEAA +#define LINKCMD_CANCEL_TRADE 0xEEBB +#define LINKCMD_0xEECC 0xEECC + +#define LINKTYPE_TRADE 0x1111 +#define LINKTYPE_TRADE_CONNECTING 0x1122 +#define LINKTYPE_TRADE_SETUP 0x1133 +#define LINKTYPE_TRADE_DISCONNECTED 0x1144 +#define LINKTYPE_BATTLE 0x2211 +#define LINKTYPE_0x2222 0x2222 // unused battle? +#define LINKTYPE_SINGLE_BATTLE 0x2233 +#define LINKTYPE_DOUBLE_BATTLE 0x2244 +#define LINKTYPE_MULTI_BATTLE 0x2255 +#define LINKTYPE_BATTLE_TOWER_50 0x2266 +#define LINKTYPE_BATTLE_TOWER_OPEN 0x2277 +#define LINKTYPE_BATTLE_TOWER 0x2288 +#define LINKTYPE_RECORD_MIX_BEFORE 0x3311 +#define LINKTYPE_RECORD_MIX_AFTER 0x3322 +#define LINKTYPE_BERRY_BLENDER_SETUP 0x4411 +#define LINKTYPE_BERRY_BLENDER 0x4422 +#define LINKTYPE_MYSTERY_EVENT 0x5501 +#define LINKTYPE_0x5502 0x5502 // unused? +#define LINKTYPE_EREADER 0x5503 +#define LINKTYPE_CONTEST_GMODE 0x6601 +#define LINKTYPE_CONTEST_EMODE 0x6602 struct LinkStatus { @@ -230,7 +238,7 @@ extern u16 gSendCmd[CMD_LENGTH]; extern struct LinkPlayer gLinkPlayers[5]; extern u16 word_3002910[]; extern bool8 gReceivedRemoteLinkPlayers; -extern u32 gUnknown_020223C0; +extern u32 gBerryBlenderKeySendAttempts; extern bool8 gLinkVSyncDisabled; extern u32 gLinkStatus; @@ -280,7 +288,7 @@ u8 IsLinkMaster(void); void SetCloseLinkCallback(void); bool8 HandleLinkConnection(void); void SetLinkDebugValues(u32 seed, u32 flags); -void sub_800A418(void); +void SetBerryBlenderLinkCallback(void); void SetSuppressLinkErrorMessage(bool8 flag); void sub_800B524(struct LinkPlayer *linkPlayer); u8 GetSioMultiSI(void); diff --git a/include/link_rfu.h b/include/link_rfu.h index 4d00039eb..9476da6b7 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -5,18 +5,18 @@ #include "link.h" #include "AgbRfu_LinkManager.h" -#define RFU_COMMAND_0x4400 0x4400 -#define RFU_COMMAND_0x8800 0x8800 -#define RFU_COMMAND_0x8900 0x8900 -#define RFU_COMMAND_SEND_BLOCK_REQ 0xA100 -#define RFU_COMMAND_0x7700 0x7700 -#define RFU_COMMAND_0x7800 0x7800 -#define RFU_COMMAND_READY_EXIT_STANDBY 0x6600 -#define RFU_COMMAND_READY_CLOSE_LINK 0x5F00 -#define RFU_COMMAND_0x2F00 0x2F00 -#define RFU_COMMAND_0xBE00 0xBE00 -#define RFU_COMMAND_0xEE00 0xEE00 -#define RFU_COMMAND_0xED00 0xED00 +#define RFUCMD_SEND_PACKET 0x2F00 +#define RFUCMD_BLENDER_SEND_KEYS 0x4400 +#define RFUCMD_READY_CLOSE_LINK 0x5F00 +#define RFUCMD_READY_EXIT_STANDBY 0x6600 +#define RFUCMD_0x7700 0x7700 +#define RFUCMD_0x7800 0x7800 +#define RFUCMD_0x8800 0x8800 +#define RFUCMD_0x8900 0x8900 +#define RFUCMD_SEND_BLOCK_REQ 0xA100 +#define RFUCMD_SEND_HELD_KEYS 0xBE00 +#define RFUCMD_0xED00 0xED00 +#define RFUCMD_0xEE00 0xEE00 #define RFU_SERIAL_7F7D 0x7F7D @@ -29,6 +29,8 @@ #define BACKUP_QUEUE_NUM_SLOTS 2 #define BACKUP_QUEUE_SLOT_LENGTH 14 +#define RFU_PACKET_SIZE 6 + #define RFU_STATUS_OK 0 #define RFU_STATUS_FATAL_ERROR 1 #define RFU_STATUS_CONNECTION_ERROR 2 @@ -140,7 +142,7 @@ struct GFRfuManager /* 0x0ef */ bool8 isShuttingDown; /* 0x0f0 */ u8 linkLossRecoveryState; /* 0x0f1 */ u8 status; - /* 0x0f2 */ u16 unk_f2[6]; + /* 0x0f2 */ u16 packet[RFU_PACKET_SIZE]; /* 0x0fe */ u16 resendExitStandbyTimer; /* 0x100 */ u16 unk_100; /* 0x102 */ u8 unk_102; @@ -197,7 +199,7 @@ void Rfu_SetBlockReceivedFlag(u8 who); void Rfu_ResetBlockReceivedFlag(u8 who); bool32 IsSendingKeysToRfu(void); void StartSendingKeysToRfu(void); -void sub_800F850(void); +void Rfu_SetBerryBlenderLinkCallback(void); u8 Rfu_GetBlockReceivedStatus(void); bool32 Rfu_InitBlockSend(const u8 *src, size_t size); void ClearLinkRfuCallback(void); @@ -250,7 +252,7 @@ void SetTradeBoardRegisteredMonInfo(u32 type, u32 species, u32 level); void InitializeRfuLinkManager_EnterUnionRoom(void); void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 a2); bool32 IsUnionRoomListenTaskActive(void); -void sub_800FE50(void *a0); +void Rfu_SendPacket(void *data); bool32 PlayerHasMetTrainerBefore(u16 id, u8 *name); void sub_8011DE0(u32 arg0); u8 sub_801100C(s32 a0); diff --git a/include/list_menu.h b/include/list_menu.h index 0a54a069a..4697ba5aa 100644 --- a/include/list_menu.h +++ b/include/list_menu.h @@ -24,7 +24,7 @@ struct ListMenu; struct ListMenuItem { const u8 *name; - s32 id; + u32 id; }; struct ListMenuTemplate @@ -98,7 +98,7 @@ struct CursorStruct extern struct ScrollArrowsTemplate gTempScrollArrowTemplate; extern struct ListMenuTemplate gMultiuseListMenuTemplate; -s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum); +u32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum); u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow); u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *arg1, u16 scrollOffset, u16 selectedRow); s32 ListMenu_ProcessInput(u8 listTaskId); diff --git a/include/palette.h b/include/palette.h index 8d16270aa..f874bcd74 100644 --- a/include/palette.h +++ b/include/palette.h @@ -70,7 +70,7 @@ void BeginFastPaletteFade(u8); void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); -void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7); +void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/include/pokeball.h b/include/pokeball.h index 12b9b1eff..1cdb08f94 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -18,6 +18,14 @@ enum POKEBALL_COUNT }; +enum { + BALL_AFFINE_ANIM_0, + BALL_ROTATE_RIGHT, + BALL_ROTATE_LEFT, + BALL_AFFINE_ANIM_3, + BALL_AFFINE_ANIM_4 +}; + extern const struct SpriteTemplate gBallSpriteTemplates[]; #define POKEBALL_PLAYER_SENDOUT 0xFF diff --git a/include/pokeblock.h b/include/pokeblock.h index 0d413a810..c82e99d8f 100644 --- a/include/pokeblock.h +++ b/include/pokeblock.h @@ -9,12 +9,21 @@ enum { - PBLOCK_CLR_BLACK, + PBLOCK_CLR_NONE, PBLOCK_CLR_RED, PBLOCK_CLR_BLUE, PBLOCK_CLR_PINK, PBLOCK_CLR_GREEN, - PBLOCK_CLR_YELLOW + PBLOCK_CLR_YELLOW, + PBLOCK_CLR_PURPLE, + PBLOCK_CLR_INDIGO, + PBLOCK_CLR_BROWN, + PBLOCK_CLR_LITE_BLUE, + PBLOCK_CLR_OLIVE, + PBLOCK_CLR_GRAY, + PBLOCK_CLR_BLACK, + PBLOCK_CLR_WHITE, + PBLOCK_CLR_GOLD, }; enum diff --git a/include/rayquaza_scene.h b/include/rayquaza_scene.h index fe66b3df0..5aa21981e 100644 --- a/include/rayquaza_scene.h +++ b/include/rayquaza_scene.h @@ -1,17 +1,6 @@ #ifndef GUARD_RAYQUAZA_SCENE_H #define GUARD_RAYQUAZA_SCENE_H -void DoRayquazaScene(u8 animId, bool8 onlyOneAnim, void (*callback)(void)); - -enum -{ - RAY_ANIM_DUO_FIGHT_PRE, - RAY_ANIM_DUO_FIGHT, - RAY_ANIM_TAKES_FLIGHT, - RAY_ANIM_DESCENDS, - RAY_ANIM_CHARGES, - RAY_ANIM_CHACES_AWAY, - RAY_ANIM_END -}; +void DoRayquazaScene(u8 animId, bool8 endEarly, void (*callback)(void)); #endif // GUARD_RAYQUAZA_SCENE_H diff --git a/include/rom_8011DC0.h b/include/rom_8011DC0.h deleted file mode 100644 index ee7397320..000000000 --- a/include/rom_8011DC0.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef GUARD_rom_8011DC0_H -#define GUARD_rom_8011DC0_H - -#endif //GUARD_rom_8011DC0_H diff --git a/include/strings.h b/include/strings.h index 1f2920140..7018f9e0d 100644 --- a/include/strings.h +++ b/include/strings.h @@ -2983,4 +2983,9 @@ extern const u8 gText_Smartness[]; extern const u8 gText_Cuteness[]; extern const u8 gText_Beauty3[]; +// Berry Blender +extern const u8 gText_SavingDontTurnOff2[]; +extern const u8 gText_BlenderMaxSpeedRecord[]; +extern const u8 gText_234Players[]; + #endif // GUARD_STRINGS_H diff --git a/ld_script.txt b/ld_script.txt index 9be5e4db3..0b8702d96 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -258,7 +258,7 @@ SECTIONS { src/intro.o(.text); src/reset_save_heap.o(.text); src/field_region_map.o(.text); - src/battle_anim_special.o(.text); + src/battle_anim_throw.o(.text); src/hall_of_fame.o(.text); src/credits.o(.text); src/lottery_corner.o(.text); @@ -616,7 +616,7 @@ SECTIONS { src/player_pc.o(.rodata); src/intro.o(.rodata); src/field_region_map.o(.rodata); - src/battle_anim_special.o(.rodata); + src/battle_anim_throw.o(.rodata); src/hall_of_fame.o(.rodata); src/credits.o(.rodata); src/lottery_corner.o(.rodata); diff --git a/libagbsyscall/libagbsyscall.s b/libagbsyscall/libagbsyscall.s index 00c40d08e..0c90da9ed 100644 --- a/libagbsyscall/libagbsyscall.s +++ b/libagbsyscall/libagbsyscall.s @@ -1,9 +1,12 @@ .include "../constants/gba_constants.inc" .include "../asm/macros/function.inc" + + .syntax unified .text .set SOFT_RESET_DIRECT_BUF, 0x03007FFA + .set USER_STACK, 0x03007F00 .set RESET_EX_WRAM_FLAG, 0x1 .ifdef NO_GRANULAR_AGBSYSCALL @@ -106,7 +109,7 @@ SoundDriverVSyncOn: thumb_func_start Mod Mod: svc #6 - mov r0, r1 + adds r0, r1, #0 bx lr thumb_func_end Mod .endif @@ -145,7 +148,7 @@ HuffUnComp: .endif .ifdef L_SoftResetExram - arm_func_start SoftResetExram + thumb_func_start SoftResetExram SoftResetExram: ldr r3, =REG_IME movs r2, #0 @@ -153,14 +156,14 @@ SoftResetExram: ldr r3, =SOFT_RESET_DIRECT_BUF movs r2, #1 strb r2, [r3, #0] - subs r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00 + subs r3, #SOFT_RESET_DIRECT_BUF - USER_STACK mov sp, r3 movs r2, #RESET_EX_WRAM_FLAG bics r0, r2 svc #1 svc #0 .pool - arm_func_end SoftResetExram + thumb_func_end SoftResetExram .endif .ifdef L_MusicPlayerFadeOut @@ -231,7 +234,7 @@ DivArm: thumb_func_start ModArm ModArm: svc #7 - mov r0, r1 + adds r0, r1, #0 bx lr thumb_func_end ModArm .endif @@ -271,7 +274,7 @@ Diff8bitUnFilterWram: .ifdef L_MultiBoot thumb_func_start MultiBoot MultiBoot: - mov r1, #1 + movs r1, #1 svc #37 bx lr thumb_func_end MultiBoot @@ -326,7 +329,7 @@ SoftResetRom: ldr r3, =SOFT_RESET_DIRECT_BUF movs r2, #0 strb r2, [r3, #0] - sub r3, #SOFT_RESET_DIRECT_BUF - 0x3007f00 + subs r3, #SOFT_RESET_DIRECT_BUF - USER_STACK mov sp, r3 svc #1 svc #0 @@ -413,7 +416,7 @@ SoftReset: ldr r3, =REG_IME movs r2, #0 strb r2, [r3, #0] - ldr r1, =0x3007f00 + ldr r1, =USER_STACK mov sp, r1 svc #1 svc #0 diff --git a/src/AgbRfu_LinkManager.c b/src/AgbRfu_LinkManager.c index f6ebcc726..42cc9aea3 100644 --- a/src/AgbRfu_LinkManager.c +++ b/src/AgbRfu_LinkManager.c @@ -352,7 +352,7 @@ static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((bm_linkLossSlot >> i) & 1) + if (bm_linkLossSlot & (1 << i)) { lman.linkRecoveryTimer.active |= (1 << i); lman.linkRecoveryTimer.count[i] = lman.linkRecoveryTimer.count_max; @@ -396,7 +396,7 @@ static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID) bm_disconnectSlot = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((lman.linkRecoveryTimer.active >> i) & 1 && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0) + if ((lman.linkRecoveryTimer.active) & (1 << i) && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0) { lman.linkRecoveryTimer.active &= ~(1 << i); bm_disconnectSlot |= (1 << i); diff --git a/src/agb_flash.c b/src/agb_flash.c index 15ab0932d..f63f84509 100644 --- a/src/agb_flash.c +++ b/src/agb_flash.c @@ -140,9 +140,9 @@ void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size) { u8 *src; u16 i; - u16 readFlash_Core_Buffer[0x40]; - u16 *funcSrc; - u16 *funcDest; + vu16 readFlash_Core_Buffer[0x40]; + vu16 *funcSrc; + vu16 *funcDest; void (*readFlash_Core)(vu8 *, u8 *, u32); REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; @@ -153,8 +153,8 @@ void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size) sectorNum %= SECTORS_PER_BANK; } - funcSrc = (u16 *)ReadFlash_Core; - funcSrc = (u16 *)((uintptr_t)funcSrc ^ 1); + funcSrc = (vu16 *)ReadFlash_Core; + funcSrc = (vu16 *)((uintptr_t)funcSrc ^ 1); funcDest = readFlash_Core_Buffer; i = ((uintptr_t)ReadFlash - (uintptr_t)ReadFlash_Core) >> 1; @@ -186,9 +186,9 @@ u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size) u32 VerifyFlashSector(u16 sectorNum, u8 *src) { u16 i; - u16 verifyFlashSector_Core_Buffer[0x80]; - u16 *funcSrc; - u16 *funcDest; + vu16 verifyFlashSector_Core_Buffer[0x80]; + vu16 *funcSrc; + vu16 *funcDest; u8 *tgt; u16 size; u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); @@ -201,8 +201,8 @@ u32 VerifyFlashSector(u16 sectorNum, u8 *src) sectorNum %= SECTORS_PER_BANK; } - funcSrc = (u16 *)VerifyFlashSector_Core; - funcSrc = (u16 *)((uintptr_t)funcSrc ^ 1); + funcSrc = (vu16 *)VerifyFlashSector_Core; + funcSrc = (vu16 *)((uintptr_t)funcSrc ^ 1); funcDest = verifyFlashSector_Core_Buffer; i = (u16)(((uintptr_t)VerifyFlashSector - (uintptr_t)VerifyFlashSector_Core) >> 1); @@ -224,9 +224,9 @@ u32 VerifyFlashSector(u16 sectorNum, u8 *src) u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) { u16 i; - u16 verifyFlashSector_Core_Buffer[0x80]; - u16 *funcSrc; - u16 *funcDest; + vu16 verifyFlashSector_Core_Buffer[0x80]; + vu16 *funcSrc; + vu16 *funcDest; u8 *tgt; u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); @@ -238,8 +238,8 @@ u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; - funcSrc = (u16 *)VerifyFlashSector_Core; - funcSrc = (u16 *)((uintptr_t)funcSrc ^ 1); + funcSrc = (vu16 *)VerifyFlashSector_Core; + funcSrc = (vu16 *)((uintptr_t)funcSrc ^ 1); funcDest = verifyFlashSector_Core_Buffer; i = ((uintptr_t)VerifyFlashSector - (uintptr_t)VerifyFlashSector_Core) >> 1; diff --git a/src/battle_anim_special.c b/src/battle_anim_throw.c index 3deb2065e..fef301326 100755 --- a/src/battle_anim_special.c +++ b/src/battle_anim_throw.c @@ -22,51 +22,73 @@ #include "constants/rgb.h" // iwram -int gUnknown_030062DC; -u16 gUnknown_030062E0; -u16 gUnknown_030062E4; +u32 gMonShrinkDuration; +u16 gMonShrinkDelta; +u16 gMonShrinkDistance; + +enum { + BALL_ROLL_1, + BALL_PIVOT_1, + BALL_ROLL_2, + BALL_PIVOT_2, + BALL_ROLL_3, + BALL_NEXT_MOVE, + BALL_WAIT_NEXT_SHAKE +}; + +enum { + MON_SHRINK, + MON_SHRINK_STEP, + MON_SHRINK_INVISIBLE, + MON_SHRINK_FREE +}; + +enum { + SHINY_STAR_ENCIRCLE, + SHINY_STAR_DIAGONAL, +}; static void sub_8170660(u8); -static void sub_8170A38(u8); -static void sub_8170EF0(u8); -static void sub_8171104(struct Sprite *); -static void sub_8171030(u8); -static void sub_81710A8(u8); -static void sub_8171134(struct Sprite *); -static void sub_8171CAC(struct Sprite *); -static void sub_81711E8(struct Sprite *); -static void sub_8171240(struct Sprite *); -static void sub_817138C(struct Sprite *); -static void sub_81713D0(struct Sprite *); -static void sub_81717B4(struct Sprite *); -static void sub_81714D4(struct Sprite *); -static void sub_8171520(struct Sprite *); -static void sub_81717D8(struct Sprite *); -static void sub_8171AE4(struct Sprite *); -static void sub_81717F8(struct Sprite *); -static void sub_81719EC(struct Sprite *); -static void sub_81718D8(struct Sprite *); -static void sub_81719C0(struct Sprite *); -static void sub_8171D60(u8); -static void sub_8171AAC(struct Sprite *); -static void sub_8171BAC(struct Sprite *); -static void sub_8171CE8(struct Sprite *); +static void AnimTask_FlashHealthboxOnLevelUp_Step(u8); +static void AnimTask_ThrowBall_Step(u8); +static void SpriteCB_Ball_Throw(struct Sprite *); +static void AnimTask_ThrowBall_StandingTrainer_Step(u8); +static void Task_PlayerThrow_Wait(u8); +static void SpriteCB_Ball_Arc(struct Sprite *); +static void SpriteCB_Ball_Block(struct Sprite *); +static void SpriteCB_Ball_MonShrink(struct Sprite *); +static void SpriteCB_Ball_MonShrink_Step(struct Sprite *); +static void SpriteCB_Ball_Bounce(struct Sprite *); +static void SpriteCB_Ball_Bounce_Step(struct Sprite *); +static void SpriteCB_Ball_Release(struct Sprite *); +static void SpriteCB_Ball_Wobble(struct Sprite *); +static void SpriteCB_Ball_Wobble_Step(struct Sprite *); +static void SpriteCB_Ball_Capture(struct Sprite *); +static void SpriteCB_Ball_Release_Step(struct Sprite *); +static void SpriteCB_Ball_Capture_Step(struct Sprite *); +static void MakeCaptureStars(struct Sprite *); +static void SpriteCB_Ball_FadeOut(struct Sprite *); +static void DestroySpriteAfterOneFrame(struct Sprite *); +static void LoadBallParticleGfx(u8); +static void SpriteCB_CaptureStar_Flicker(struct Sprite *); +static void SpriteCB_Ball_Release_Wait(struct Sprite *); +static void SpriteCB_Ball_Block_Step(struct Sprite *); static void PokeBallOpenParticleAnimation_Step1(struct Sprite *); static void PokeBallOpenParticleAnimation_Step2(struct Sprite *); static void DestroyBallOpenAnimationParticle(struct Sprite *); static void FanOutBallOpenParticles_Step1(struct Sprite *); static void RepeatBallOpenParticleAnimation_Step1(struct Sprite *); static void PremierBallOpenParticleAnimation_Step1(struct Sprite *); -static void sub_8172AB0(u8); -static void sub_8172B40(u8); -static void sub_8172B90(u8); -static void sub_8172FEC(u8); -static void sub_81731FC(struct Sprite *); -static void sub_8173250(struct Sprite *); -static void sub_81731B0(u8); -static void sub_817339C(struct Sprite *); -static void sub_81733D4(struct Sprite *); -static void sub_8173400(struct Sprite *); +static void Task_FadeMon_ToBallColor(u8); +static void Task_FadeMon_ToNormal(u8); +static void Task_FadeMon_ToNormal_Step(u8); +static void Task_ShinyStars(u8); +static void SpriteCB_ShinyStars_Encircle(struct Sprite *); +static void SpriteCB_ShinyStars_Diagonal(struct Sprite *); +static void Task_ShinyStars_Wait(u8); +static void SpriteCB_PokeBlock_LiftArm(struct Sprite *); +static void SpriteCB_PokeBlock_Arc(struct Sprite *); +static void SpriteCB_ThrowPokeBlock_Free(struct Sprite *); static void PokeBallOpenParticleAnimation(u8); static void GreatBallOpenParticleAnimation(u8); static void SafariBallOpenParticleAnimation(u8); @@ -76,31 +98,31 @@ static void DiveBallOpenParticleAnimation(u8); static void RepeatBallOpenParticleAnimation(u8); static void TimerBallOpenParticleAnimation(u8); static void PremierBallOpenParticleAnimation(u8); -static void sub_817330C(struct Sprite *); +static void SpriteCB_PokeBlock_Throw(struct Sprite *); -struct BallCaptureSuccessStarData +struct CaptureStar { s8 xOffset; s8 yOffset; - s8 unk2; + s8 amplitude; }; -static const struct BallCaptureSuccessStarData sBallCaptureSuccessStarData[] = +static const struct CaptureStar sCaptureStars[] = { { .xOffset = 10, .yOffset = 2, - .unk2 = -3, + .amplitude = -3, }, { .xOffset = 15, .yOffset = 0, - .unk2 = -4, + .amplitude = -4, }, { .xOffset = -10, .yOffset = 2, - .unk2 = -4, + .amplitude = -4, }, }; @@ -117,39 +139,39 @@ static const struct BallCaptureSuccessStarData sBallCaptureSuccessStarData[] = #define TAG_PARTICLES_LUXURYBALL 55030 #define TAG_PARTICLES_PREMIERBALL 55031 -const struct CompressedSpriteSheet gBallParticleSpritesheets[] = -{ - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_GREATBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL}, - {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL}, +static const struct CompressedSpriteSheet sBallParticleSpriteSheets[POKEBALL_COUNT] = +{ + [BALL_POKE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL}, + [BALL_GREAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_GREATBALL}, + [BALL_SAFARI] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL}, + [BALL_ULTRA] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL}, + [BALL_MASTER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL}, + [BALL_NET] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL}, + [BALL_DIVE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL}, + [BALL_NEST] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL}, + [BALL_REPEAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL}, + [BALL_TIMER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL}, + [BALL_LUXURY] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL}, + [BALL_PREMIER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL}, }; -const struct CompressedSpritePalette gBallParticlePalettes[] = -{ - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_POKEBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_GREATBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL}, - {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL}, +static const struct CompressedSpritePalette sBallParticlePalettes[POKEBALL_COUNT] = +{ + [BALL_POKE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_POKEBALL}, + [BALL_GREAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_GREATBALL}, + [BALL_SAFARI] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL}, + [BALL_ULTRA] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL}, + [BALL_MASTER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL}, + [BALL_NET] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL}, + [BALL_DIVE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL}, + [BALL_NEST] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL}, + [BALL_REPEAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL}, + [BALL_TIMER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL}, + [BALL_LUXURY] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL}, + [BALL_PREMIER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL}, }; -const union AnimCmd gAnim_RegularBall[] = +static const union AnimCmd sAnim_RegularBall[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(1, 1), @@ -160,185 +182,185 @@ const union AnimCmd gAnim_RegularBall[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gAnim_MasterBall[] = +static const union AnimCmd sAnim_MasterBall[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_END, }; -const union AnimCmd gAnim_NetDiveBall[] = +static const union AnimCmd sAnim_NetDiveBall[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; -const union AnimCmd gAnim_NestBall[] = +static const union AnimCmd sAnim_NestBall[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_END, }; -const union AnimCmd gAnim_LuxuryPremierBall[] = +static const union AnimCmd sAnim_LuxuryPremierBall[] = { ANIMCMD_FRAME(6, 4), ANIMCMD_FRAME(7, 4), ANIMCMD_JUMP(0), }; -const union AnimCmd gAnim_UltraRepeatTimerBall[] = +static const union AnimCmd sAnim_UltraRepeatTimerBall[] = { ANIMCMD_FRAME(7, 4), ANIMCMD_END, }; -const union AnimCmd *const gAnims_BallParticles[] = +static const union AnimCmd *const sAnims_BallParticles[] = { - gAnim_RegularBall, - gAnim_MasterBall, - gAnim_NetDiveBall, - gAnim_NestBall, - gAnim_LuxuryPremierBall, - gAnim_UltraRepeatTimerBall, + sAnim_RegularBall, + sAnim_MasterBall, + sAnim_NetDiveBall, + sAnim_NestBall, + sAnim_LuxuryPremierBall, + sAnim_UltraRepeatTimerBall, }; -const u8 gBallParticleAnimNums[] = -{ - [BALL_POKE] = 0, - [BALL_GREAT] = 0, - [BALL_SAFARI] = 0, - [BALL_ULTRA] = 5, - [BALL_MASTER] = 1, - [BALL_NET] = 2, - [BALL_DIVE] = 2, - [BALL_NEST] = 3, - [BALL_REPEAT] = 5, - [BALL_TIMER] = 5, - [BALL_LUXURY] = 4, +static const u8 sBallParticleAnimNums[POKEBALL_COUNT] = +{ + [BALL_POKE] = 0, + [BALL_GREAT] = 0, + [BALL_SAFARI] = 0, + [BALL_ULTRA] = 5, + [BALL_MASTER] = 1, + [BALL_NET] = 2, + [BALL_DIVE] = 2, + [BALL_NEST] = 3, + [BALL_REPEAT] = 5, + [BALL_TIMER] = 5, + [BALL_LUXURY] = 4, [BALL_PREMIER] = 4, }; -const TaskFunc gBallParticleAnimationFuncs[] = -{ - PokeBallOpenParticleAnimation, - GreatBallOpenParticleAnimation, - SafariBallOpenParticleAnimation, - UltraBallOpenParticleAnimation, - MasterBallOpenParticleAnimation, - SafariBallOpenParticleAnimation, - DiveBallOpenParticleAnimation, - UltraBallOpenParticleAnimation, - RepeatBallOpenParticleAnimation, - TimerBallOpenParticleAnimation, - GreatBallOpenParticleAnimation, - PremierBallOpenParticleAnimation, +static const TaskFunc sBallParticleAnimationFuncs[POKEBALL_COUNT] = +{ + [BALL_POKE] = PokeBallOpenParticleAnimation, + [BALL_GREAT] = GreatBallOpenParticleAnimation, + [BALL_SAFARI] = SafariBallOpenParticleAnimation, + [BALL_ULTRA] = UltraBallOpenParticleAnimation, + [BALL_MASTER] = MasterBallOpenParticleAnimation, + [BALL_NET] = SafariBallOpenParticleAnimation, + [BALL_DIVE] = DiveBallOpenParticleAnimation, + [BALL_NEST] = UltraBallOpenParticleAnimation, + [BALL_REPEAT] = RepeatBallOpenParticleAnimation, + [BALL_TIMER] = TimerBallOpenParticleAnimation, + [BALL_LUXURY] = GreatBallOpenParticleAnimation, + [BALL_PREMIER] = PremierBallOpenParticleAnimation, }; -const struct SpriteTemplate gBallParticlesSpriteTemplates[] = +static const struct SpriteTemplate sBallParticleSpriteTemplates[POKEBALL_COUNT] = { - { + [BALL_POKE] = { .tileTag = TAG_PARTICLES_POKEBALL, .paletteTag = TAG_PARTICLES_POKEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_GREAT] = { .tileTag = TAG_PARTICLES_GREATBALL, .paletteTag = TAG_PARTICLES_GREATBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_SAFARI] = { .tileTag = TAG_PARTICLES_SAFARIBALL, .paletteTag = TAG_PARTICLES_SAFARIBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_ULTRA] = { .tileTag = TAG_PARTICLES_ULTRABALL, .paletteTag = TAG_PARTICLES_ULTRABALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_MASTER] = { .tileTag = TAG_PARTICLES_MASTERBALL, .paletteTag = TAG_PARTICLES_MASTERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_NET] = { .tileTag = TAG_PARTICLES_NETBALL, .paletteTag = TAG_PARTICLES_NETBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_DIVE] = { .tileTag = TAG_PARTICLES_DIVEBALL, .paletteTag = TAG_PARTICLES_DIVEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_NEST] = { .tileTag = TAG_PARTICLES_NESTBALL, .paletteTag = TAG_PARTICLES_NESTBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_REPEAT] = { .tileTag = TAG_PARTICLES_REPEATBALL, .paletteTag = TAG_PARTICLES_REPEATBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_TIMER] = { .tileTag = TAG_PARTICLES_TIMERBALL, .paletteTag = TAG_PARTICLES_TIMERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_LUXURY] = { .tileTag = TAG_PARTICLES_LUXURYBALL, .paletteTag = TAG_PARTICLES_LUXURYBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, - { + [BALL_PREMIER] = { .tileTag = TAG_PARTICLES_PREMIERBALL, .paletteTag = TAG_PARTICLES_PREMIERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, - .anims = gAnims_BallParticles, + .anims = sAnims_BallParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, @@ -379,28 +401,29 @@ const struct SpriteTemplate gPokeblockSpriteTemplate = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_817330C, + .callback = SpriteCB_PokeBlock_Throw, }; -const union AnimCmd gUnknown_085E5350[] = +static const union AnimCmd sAnim_SafariRock[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END, }; -const union AnimCmd *const gUnknown_085E5358[] = { - gUnknown_085E5350, +static const union AnimCmd *const sAnims_SafariRock[] = { + sAnim_SafariRock, }; -const struct SpriteTemplate gBattleAnimSpriteTemplate_085E535C = +// Unused, leftover from FRLG +static const struct SpriteTemplate sSafariRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_085E5358, + .anims = sAnims_SafariRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_817330C, + .callback = SpriteCB_PokeBlock_Throw, }; extern const struct SpriteTemplate gWishStarSpriteTemplate; @@ -572,13 +595,13 @@ void AnimTask_FlashHealthboxOnLevelUp(u8 taskId) { gTasks[taskId].data[10] = gBattleAnimArgs[0]; gTasks[taskId].data[11] = gBattleAnimArgs[1]; - gTasks[taskId].func = sub_8170A38; + gTasks[taskId].func = AnimTask_FlashHealthboxOnLevelUp_Step; } -static void sub_8170A38(u8 taskId) +static void AnimTask_FlashHealthboxOnLevelUp_Step(u8 taskId) { u8 paletteNum; - int paletteOffset, colorOffset; + u32 paletteOffset, colorOffset; gTasks[taskId].data[0]++; if (gTasks[taskId].data[0]++ >= gTasks[taskId].data[11]) @@ -658,13 +681,13 @@ void AnimTask_SwitchOutBallEffect(u8 taskId) switch (gTasks[taskId].data[0]) { case 0: - x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); - y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); + x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); + y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); priority = gSprites[spriteId].oam.priority; subpriority = gSprites[spriteId].subpriority; gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballId); selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); - gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId); + gTasks[taskId].data[11] = LaunchBallFadeMonTask(FALSE, gBattleAnimAttacker, selectedPalettes, ballId); gTasks[taskId].data[0]++; break; case 1: @@ -730,6 +753,12 @@ u8 ItemIdToBallId(u16 ballItem) } } +#define tSpriteId data[0] + +#define sDuration data[0] +#define sTargetX data[1] +#define sTargetY data[2] + void AnimTask_ThrowBall(u8 taskId) { u8 ballId; @@ -737,26 +766,26 @@ void AnimTask_ThrowBall(u8 taskId) ballId = ItemIdToBallId(gLastUsedItem); spriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29); - gSprites[spriteId].data[0] = 34; - gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 0); - gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) - 16; - gSprites[spriteId].callback = sub_8171104; - gBattleSpritesDataPtr->animationData->field_9_x2 = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible; - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].func = sub_8170EF0; + gSprites[spriteId].sDuration = 34; + gSprites[spriteId].sTargetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); + gSprites[spriteId].sTargetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16; + gSprites[spriteId].callback = SpriteCB_Ball_Throw; + gBattleSpritesDataPtr->animationData->wildMonInvisible = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible; + gTasks[taskId].tSpriteId = spriteId; + gTasks[taskId].func = AnimTask_ThrowBall_Step; } -static void sub_8170EF0(u8 taskId) +static void AnimTask_ThrowBall_Step(u8 taskId) { - u8 spriteId = gTasks[taskId].data[0]; - if ((u16)gSprites[spriteId].data[0] == 0xFFFF) + u8 spriteId = gTasks[taskId].tSpriteId; + if ((u16)gSprites[spriteId].sDuration == 0xFFFF) DestroyAnimVisualTask(taskId); } -// Safari Ball / Wally's ball throw -void AnimTask_ThrowBallSpecial(u8 taskId) +// Safari Zone throw / Wally's throw +void AnimTask_ThrowBall_StandingTrainer(u8 taskId) { - int x, y; + s16 x, y; u8 ballId; u8 subpriority; u8 spriteId; @@ -775,27 +804,33 @@ void AnimTask_ThrowBallSpecial(u8 taskId) ballId = ItemIdToBallId(gLastUsedItem); subpriority = GetBattlerSpriteSubpriority(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + 1; spriteId = CreateSprite(&gBallSpriteTemplates[ballId], x + 32, y | 80, subpriority); - gSprites[spriteId].data[0] = 34; - gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 0); - gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) - 16; + gSprites[spriteId].sDuration = 34; + gSprites[spriteId].sTargetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); + gSprites[spriteId].sTargetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16; gSprites[spriteId].callback = SpriteCallbackDummy; - gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].callback = sub_8039E84; - gTasks[taskId].data[0] = spriteId; - gTasks[taskId].func = sub_8171030; + gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].callback = SpriteCB_TrainerThrowObject; + gTasks[taskId].tSpriteId = spriteId; + gTasks[taskId].func = AnimTask_ThrowBall_StandingTrainer_Step; } -static void sub_8171030(u8 taskId) +static void AnimTask_ThrowBall_StandingTrainer_Step(u8 taskId) { if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animCmdIndex == 1) { PlaySE12WithPanning(SE_BALL_THROW, 0); - gSprites[gTasks[taskId].data[0]].callback = sub_8171104; - CreateTask(sub_81710A8, 10); - gTasks[taskId].func = sub_8170EF0; + gSprites[gTasks[taskId].tSpriteId].callback = SpriteCB_Ball_Throw; + CreateTask(Task_PlayerThrow_Wait, 10); + gTasks[taskId].func = AnimTask_ThrowBall_Step; } } -static void sub_81710A8(u8 taskId) +#undef sDuration +#undef sTargetX +#undef sTargetY + +#undef tSpriteId + +static void Task_PlayerThrow_Wait(u8 taskId) { if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animEnded) { @@ -804,29 +839,50 @@ static void sub_81710A8(u8 taskId) } } -static void sub_8171104(struct Sprite *sprite) +#define sTargetXArg data[1] +#define sTargetYArg data[2] + +#define sOffsetX data[1] // re-use +#define sTargetX data[2] // re-use +#define sOffsetY data[3] +#define sTargetY data[4] +#define sAmplitude data[5] + +static void SpriteCB_Ball_Throw(struct Sprite *sprite) { - u16 temp = sprite->data[1]; - u16 temp2 = sprite->data[2]; - sprite->data[1] = sprite->pos1.x; - sprite->data[2] = temp; - sprite->data[3] = sprite->pos1.y; - sprite->data[4] = temp2; - sprite->data[5] = -40; + u16 targetX = sprite->sTargetXArg; + u16 targetY = sprite->sTargetYArg; + + sprite->sOffsetX = sprite->pos1.x; + sprite->sTargetX = targetX; + sprite->sOffsetY = sprite->pos1.y; + sprite->sTargetY = targetY; + sprite->sAmplitude = -40; InitAnimArcTranslation(sprite); - sprite->callback = sub_8171134; + sprite->callback = SpriteCB_Ball_Arc; } -static void sub_8171134(struct Sprite *sprite) +#undef sTargetXArg +#undef sTargetYArg +#undef sOffsetX +#undef sTargetX +#undef sOffsetY +#undef sTargetY +#undef sAmplitude + +#define sTimer data[5] +#define sTaskId data[5] // re-use + +static void SpriteCB_Ball_Arc(struct Sprite *sprite) { - int i; + s32 i; u8 ballId; if (TranslateAnimHorizontalArc(sprite)) { if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_TRAINER_BLOCK) { - sprite->callback = sub_8171CAC; + sprite->callback = SpriteCB_Ball_Block; } else { @@ -839,116 +895,151 @@ static void sub_8171134(struct Sprite *sprite) for (i = 0; i < 8; i++) sprite->data[i] = 0; - sprite->data[5] = 0; - sprite->callback = sub_81711E8; + sprite->sTimer = 0; + sprite->callback = SpriteCB_Ball_MonShrink; ballId = ItemIdToBallId(gLastUsedItem); switch (ballId) { case 0 ... POKEBALL_COUNT - 1: AnimateBallOpenParticles(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballId); - LaunchBallFadeMonTask(0, gBattleAnimTarget, 14, ballId); + LaunchBallFadeMonTask(FALSE, gBattleAnimTarget, 14, ballId); break; } } } } -static void sub_81711E8(struct Sprite *sprite) +static void SpriteCB_Ball_MonShrink(struct Sprite *sprite) { - if (++sprite->data[5] == 10) + if (++sprite->sTimer == 10) { - sprite->data[5] = CreateTask(TaskDummy, 50); - sprite->callback = sub_8171240; + sprite->sTaskId = CreateTask(TaskDummy, 50); + sprite->callback = SpriteCB_Ball_MonShrink_Step; gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0; } } -static void sub_8171240(struct Sprite *sprite) +#undef sTimer +#undef sTaskId + +#define tState data[0] +#define sTimer data[1] +#define sTaskId data[5] + +static void SpriteCB_Ball_MonShrink_Step(struct Sprite *sprite) { u8 spriteId; u8 taskId; spriteId = gBattlerSpriteIds[gBattleAnimTarget]; - taskId = sprite->data[5]; + taskId = sprite->sTaskId; - if (++gTasks[taskId].data[1] == 11) + if (++gTasks[taskId].sTimer == 11) PlaySE(SE_BALL_TRADE); - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 0: + case MON_SHRINK: PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL); gTasks[taskId].data[10] = 256; - gUnknown_030062DC = 28; - gUnknown_030062E4 = (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) - (sprite->pos1.y + sprite->pos2.y); - gUnknown_030062E0 = (u32)(gUnknown_030062E4 * 256) / 28; - gTasks[taskId].data[2] = gUnknown_030062E0; - gTasks[taskId].data[0]++; + gMonShrinkDuration = 28; + gMonShrinkDistance = (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) - (sprite->pos1.y + sprite->pos2.y); + gMonShrinkDelta = (u32)(gMonShrinkDistance * 256) / gMonShrinkDuration; + gTasks[taskId].data[2] = gMonShrinkDelta; + gTasks[taskId].tState++; // MON_SHRINK_STEP break; - case 1: - gTasks[taskId].data[10] += 0x20; + case MON_SHRINK_STEP: + gTasks[taskId].data[10] += 32; SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0); gTasks[taskId].data[3] += gTasks[taskId].data[2]; gSprites[spriteId].pos2.y = -gTasks[taskId].data[3] >> 8; - if (gTasks[taskId].data[10] >= 0x480) - gTasks[taskId].data[0]++; + if (gTasks[taskId].data[10] >= 1152) + gTasks[taskId].tState++; // MON_SHRINK_INVISIBLE break; - case 2: + case MON_SHRINK_INVISIBLE: ResetSpriteRotScale(spriteId); gSprites[spriteId].invisible = TRUE; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; // MON_SHRINK_FREE break; + case MON_SHRINK_FREE: default: if (gTasks[taskId].data[1] > 10) { DestroyTask(taskId); StartSpriteAnim(sprite, 2); sprite->data[5] = 0; - sprite->callback = sub_817138C; + sprite->callback = SpriteCB_Ball_Bounce; } break; } } -static void sub_817138C(struct Sprite *sprite) +#undef sTimer +#undef tState +#undef sTaskId + +#define sState data[3] +#define sAmplitude data[4] +#define sPhase data[5] + +static void SpriteCB_Ball_Bounce(struct Sprite *sprite) { - int angle; + s16 phase; if (sprite->animEnded) { - sprite->data[3] = 0; - sprite->data[4] = 40; - sprite->data[5] = 0; - angle = 0; - sprite->pos1.y += Cos(angle, 40); - sprite->pos2.y = -Cos(angle, sprite->data[4]); - sprite->callback = sub_81713D0; + sprite->sState = 0; + sprite->sAmplitude = 40; + sprite->sPhase = 0; + phase = 0; + sprite->pos1.y += Cos(phase, 40); + sprite->pos2.y = -Cos(phase, sprite->sAmplitude); + sprite->callback = SpriteCB_Ball_Bounce_Step; } } -static void sub_81713D0(struct Sprite *sprite) +#undef sState +#undef sAmplitude +#undef sPhase + +#define DIRECTION(state) (state & 0xFF) +#define PHASE_DELTA(state) (state >> 8) +#define BOUNCES(state) (state >> 8) +#define FALL(state) (state &= -0x100) +#define RISE_FASTER(state) (state += 257) + +#define BALL_FALLING 0 +#define BALL_RISING 1 + +#define sState data[3] +#define sAmplitude data[4] +#define sPhase data[5] +#define sTimer data[5] // re-use + +// Animates the Poké Ball dropping to ground and bouncing. +static void SpriteCB_Ball_Bounce_Step(struct Sprite *sprite) { bool8 lastBounce; - int bounceCount; + s16 bounceCount; - lastBounce = 0; + lastBounce = FALSE; - switch (sprite->data[3] & 0xFF) + switch (DIRECTION(sprite->sState)) { - case 0: - sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); - sprite->data[5] += (sprite->data[3] >> 8) + 4; - if (sprite->data[5] >= 64) + case BALL_FALLING: + sprite->pos2.y = -Cos(sprite->sPhase, sprite->sAmplitude); + sprite->sPhase += PHASE_DELTA(sprite->sState) + 4; + // Once the ball touches the ground + if (sprite->sPhase >= 64) { - sprite->data[4] -= 10; - sprite->data[3] += 257; + sprite->sAmplitude -= 10; + RISE_FASTER(sprite->sState); - bounceCount = sprite->data[3] >> 8; + bounceCount = BOUNCES(sprite->sState); if (bounceCount == 4) - lastBounce = 1; + lastBounce = TRUE; - // Play a different sound effect for each pokeball bounce. switch (bounceCount) { case 1: @@ -966,186 +1057,207 @@ static void sub_81713D0(struct Sprite *sprite) } } break; - case 1: - sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); - sprite->data[5] -= (sprite->data[3] >> 8) + 4; - if (sprite->data[5] <= 0) + case BALL_RISING: + sprite->pos2.y = -Cos(sprite->sPhase, sprite->sAmplitude); + sprite->sPhase -= PHASE_DELTA(sprite->sState) + 4; + // Once ball reaches max height + if (sprite->sPhase <= 0) { - sprite->data[5] = 0; - sprite->data[3] &= -0x100; + // Set to BALL_FALLING + sprite->sPhase = 0; + FALL(sprite->sState); } break; } if (lastBounce) { - sprite->data[3] = 0; + sprite->sState = 0; sprite->pos1.y += Cos(64, 40); sprite->pos2.y = 0; if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_NO_SHAKES) { - sprite->data[5] = 0; - sprite->callback = sub_81717B4; + sprite->sTimer = 0; + sprite->callback = SpriteCB_Ball_Release; } else { - sprite->callback = sub_81714D4; + sprite->callback = SpriteCB_Ball_Wobble; sprite->data[4] = 1; sprite->data[5] = 0; } } } -static void sub_81714D4(struct Sprite *sprite) +#undef sState +#undef sAmplitude +#undef sPhase +#undef sTimer + +#undef DIRECTION +#undef PHASE_DELTA +#undef BOUNCES +#undef FALL +#undef RISE_FASTER + +#define sTimer data[3] +#define sState data[3] // re-use + +static void SpriteCB_Ball_Wobble(struct Sprite *sprite) { - if (++sprite->data[3] == 31) + if (++sprite->sTimer == 31) { - sprite->data[3] = 0; - sprite->affineAnimPaused = 1; - StartSpriteAffineAnim(sprite, 1); - gBattleSpritesDataPtr->animationData->field_C = 0; - sprite->callback = sub_8171520; + sprite->sState = 0; + sprite->affineAnimPaused = TRUE; + StartSpriteAffineAnim(sprite, BALL_ROTATE_RIGHT); + gBattleSpritesDataPtr->animationData->ballSubpx = 0; + sprite->callback = SpriteCB_Ball_Wobble_Step; PlaySE(SE_BALL); } } -static void sub_8171520(struct Sprite *sprite) +#undef sTimer +#undef sState + +#define sState data[3] +#define sDirection data[4] +#define sTimer data[5] + +#define STATE(state) (state & 0xFF) +#define SHAKES(state) (state >> 8) +#define SHAKE_INC(state) (state += 0x100) +#define RESET_STATE(state) (state &= -0x100) + +static void SpriteCB_Ball_Wobble_Step(struct Sprite *sprite) { - s8 state; - u16 var0; + s8 shakes; + u16 frame; - switch (sprite->data[3] & 0xFF) + switch (STATE(sprite->sState)) { - case 0: - if (gBattleSpritesDataPtr->animationData->field_C > 0xFF) + case BALL_ROLL_1: + // Rolling effect: every frame in the rotation, the sprite shifts 176/256 of a pixel. + if (gBattleSpritesDataPtr->animationData->ballSubpx > 255) { - sprite->pos2.x += sprite->data[4]; - gBattleSpritesDataPtr->animationData->field_C &= 0xFF; + sprite->pos2.x += sprite->sDirection; + gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF; } else - { - gBattleSpritesDataPtr->animationData->field_C += 0xB0; - } + gBattleSpritesDataPtr->animationData->ballSubpx += 176; - sprite->data[5]++; - sprite->affineAnimPaused = 0; - var0 = sprite->data[5] + 7; - if (var0 > 14) + sprite->sTimer++; + sprite->affineAnimPaused = FALSE; + frame = sprite->sTimer + 7; + if (frame > 14) { - gBattleSpritesDataPtr->animationData->field_C = 0; - sprite->data[3]++; - sprite->data[5] = 0; + gBattleSpritesDataPtr->animationData->ballSubpx = 0; + sprite->sState++; // BALL_PIVOT_1 + sprite->sTimer = 0; } break; - case 1: - if (++sprite->data[5] == 1) + case BALL_PIVOT_1: + if (++sprite->sTimer == 1) { - sprite->data[5] = 0; - sprite->data[4] = -sprite->data[4]; - sprite->data[3]++; - sprite->affineAnimPaused = 0; - if (sprite->data[4] < 0) - ChangeSpriteAffineAnim(sprite, 2); + sprite->sTimer = 0; + sprite->sDirection = -sprite->sDirection; + sprite->sState++; // BALL_ROLL_2 + sprite->affineAnimPaused = FALSE; + if (sprite->sDirection < 0) + ChangeSpriteAffineAnim(sprite, BALL_ROTATE_LEFT); else - ChangeSpriteAffineAnim(sprite, 1); + ChangeSpriteAffineAnim(sprite, BALL_ROTATE_RIGHT); } else - { - sprite->affineAnimPaused = 1; - } + sprite->affineAnimPaused = TRUE; break; - case 2: - if (gBattleSpritesDataPtr->animationData->field_C > 0xFF) + case BALL_ROLL_2: + if (gBattleSpritesDataPtr->animationData->ballSubpx > 255) { - sprite->pos2.x += sprite->data[4]; - gBattleSpritesDataPtr->animationData->field_C &= 0xFF; + sprite->pos2.x += sprite->sDirection; + gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF; } else - { - gBattleSpritesDataPtr->animationData->field_C += 0xB0; - } + gBattleSpritesDataPtr->animationData->ballSubpx += 176; - sprite->data[5]++; - sprite->affineAnimPaused = 0; - var0 = sprite->data[5] + 12; - if (var0 > 24) + sprite->sTimer++; + sprite->affineAnimPaused = FALSE; + frame = sprite->sTimer + 12; + if (frame > 24) { - gBattleSpritesDataPtr->animationData->field_C = 0; - sprite->data[3]++; - sprite->data[5] = 0; + gBattleSpritesDataPtr->animationData->ballSubpx = 0; + sprite->sState++; // BALL_PIVOT_2 + sprite->sTimer = 0; } break; - case 3: - if (sprite->data[5]++ < 0) + case BALL_PIVOT_2: + if (sprite->sTimer++ < 0) { - sprite->affineAnimPaused = 1; + sprite->affineAnimPaused = TRUE; break; } - sprite->data[5] = 0; - sprite->data[4] = -sprite->data[4]; - sprite->data[3]++; - sprite->affineAnimPaused = 0; - if (sprite->data[4] < 0) - ChangeSpriteAffineAnim(sprite, 2); + sprite->sTimer = 0; + sprite->sDirection = -sprite->sDirection; + sprite->sState++; // BALL_ROLL_3 + sprite->affineAnimPaused = FALSE; + if (sprite->sDirection < 0) + ChangeSpriteAffineAnim(sprite, BALL_ROTATE_LEFT); else - ChangeSpriteAffineAnim(sprite, 1); + ChangeSpriteAffineAnim(sprite, BALL_ROTATE_RIGHT); // fall through - case 4: - if (gBattleSpritesDataPtr->animationData->field_C > 0xFF) + case BALL_ROLL_3: + if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF) { - sprite->pos2.x += sprite->data[4]; - gBattleSpritesDataPtr->animationData->field_C &= 0xFF; + sprite->pos2.x += sprite->sDirection; + gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF; } else - { - gBattleSpritesDataPtr->animationData->field_C += 0xB0; - } + gBattleSpritesDataPtr->animationData->ballSubpx += 176; - sprite->data[5]++; - sprite->affineAnimPaused = 0; - var0 = sprite->data[5] + 4; - if (var0 > 8) + sprite->sTimer++; + sprite->affineAnimPaused = FALSE; + frame = sprite->sTimer + 4; + if (frame > 8) { - gBattleSpritesDataPtr->animationData->field_C = 0; - sprite->data[3]++; - sprite->data[5] = 0; - sprite->data[4] = -sprite->data[4]; + gBattleSpritesDataPtr->animationData->ballSubpx = 0; + sprite->sState++; // BALL_NEXT_MOVE + sprite->sTimer = 0; + sprite->sDirection = -sprite->sDirection; } break; - case 5: - sprite->data[3] += 0x100; - state = sprite->data[3] >> 8; - if (state == gBattleSpritesDataPtr->animationData->ballThrowCaseId) + case BALL_NEXT_MOVE: + SHAKE_INC(sprite->sState); + shakes = SHAKES(sprite->sState); + if (shakes == gBattleSpritesDataPtr->animationData->ballThrowCaseId) { - sprite->affineAnimPaused = 1; - sprite->callback = sub_81717B4; + sprite->affineAnimPaused = TRUE; + sprite->callback = SpriteCB_Ball_Release; } else { - if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && state == 3) + if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && shakes == 3) { - sprite->callback = sub_81717D8; - sprite->affineAnimPaused = 1; + sprite->callback = SpriteCB_Ball_Capture; + sprite->affineAnimPaused = TRUE; } else { - sprite->data[3]++; - sprite->affineAnimPaused = 1; + sprite->sState++; // BALL_WAIT_NEXT_SHAKE + sprite->affineAnimPaused = TRUE; } } break; - case 6: + case BALL_WAIT_NEXT_SHAKE: default: - if (++sprite->data[5] == 31) + if (++sprite->sTimer == 31) { - sprite->data[5] = 0; - sprite->data[3] &= -0x100; + sprite->sTimer = 0; + RESET_STATE(sprite->sState); StartSpriteAffineAnim(sprite, 3); - if (sprite->data[4] < 0) - StartSpriteAffineAnim(sprite, 2); + if (sprite->sDirection < 0) + StartSpriteAffineAnim(sprite, BALL_ROTATE_LEFT); else - StartSpriteAffineAnim(sprite, 1); + StartSpriteAffineAnim(sprite, BALL_ROTATE_RIGHT); PlaySE(SE_BALL); } @@ -1153,60 +1265,81 @@ static void sub_8171520(struct Sprite *sprite) } } -static void sub_81717B4(struct Sprite *sprite) +#undef STATE +#undef SHAKES +#undef SHAKE_INC +#undef RESET_STATE + +#undef sState + +#define sTimer data[5] + +static void SpriteCB_Ball_Release(struct Sprite *sprite) { - if (++sprite->data[5] == 31) + if (++sprite->sTimer == 31) { sprite->data[5] = 0; - sprite->callback = sub_8171AE4; + sprite->callback = SpriteCB_Ball_Release_Step; } } +#undef sTimer -static void sub_81717D8(struct Sprite *sprite) +#define sState data[0] +#define sTimer data[4] + +static void SpriteCB_Ball_Capture(struct Sprite *sprite) { - sprite->animPaused = 1; - sprite->callback = sub_81717F8; + sprite->animPaused = TRUE; + sprite->callback = SpriteCB_Ball_Capture_Step; sprite->data[3] = 0; - sprite->data[4] = 0; + sprite->sTimer = 0; sprite->data[5] = 0; } -static void sub_81717F8(struct Sprite *sprite) +// Fade and unfade ball, create star animations, play sound effects +static void SpriteCB_Ball_Capture_Step(struct Sprite *sprite) { u8 *battler = &gBattleAnimTarget; - sprite->data[4]++; - if (sprite->data[4] == 40) + sprite->sTimer++; + if (sprite->sTimer == 40) { PlaySE(SE_RG_BALL_CLICK); BlendPalettes(0x10000 << sprite->oam.paletteNum, 6, RGB(0, 0, 0)); - sub_81719EC(sprite); + MakeCaptureStars(sprite); } - else if (sprite->data[4] == 60) + else if (sprite->sTimer == 60) { BeginNormalPaletteFade(0x10000 << sprite->oam.paletteNum, 2, 6, 0, RGB(0, 0, 0)); } - else if (sprite->data[4] == 95) + else if (sprite->sTimer == 95) { - gDoingBattleAnim = 0; + gDoingBattleAnim = FALSE; UpdateOamPriorityInAllHealthboxes(1); m4aMPlayAllStop(); PlaySE(MUS_RG_CAUGHT_INTRO); } - else if (sprite->data[4] == 315) + else if (sprite->sTimer == 315) { FreeOamMatrix(gSprites[gBattlerSpriteIds[*battler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[*battler]]); - sprite->data[0] = 0; - sprite->callback = sub_81718D8; + + sprite->sState = 0; + sprite->callback = SpriteCB_Ball_FadeOut; } } -static void sub_81718D8(struct Sprite *sprite) +#undef sTimer +#undef sState + +#define sState data[0] +#define sFrame data[0] // re-use + +static void SpriteCB_Ball_FadeOut(struct Sprite *sprite) { u8 paletteIndex; - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->data[1] = 0; @@ -1216,7 +1349,7 @@ static void sub_81718D8(struct Sprite *sprite) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); paletteIndex = IndexOfSpritePaletteTag(sprite->template->paletteTag); BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB(31, 31, 31)); - sprite->data[0]++; + sprite->sState++; break; case 1: if (sprite->data[1]++ > 0) @@ -1225,103 +1358,124 @@ static void sub_81718D8(struct Sprite *sprite) sprite->data[2]++; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[2], sprite->data[2])); if (sprite->data[2] == 16) - sprite->data[0]++; + sprite->sState++; } break; case 2: sprite->invisible = TRUE; - sprite->data[0]++; + sprite->sState++; break; default: if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); - sprite->data[0] = 0; - sprite->callback = sub_81719C0; + + sprite->sFrame = 0; + sprite->callback = DestroySpriteAfterOneFrame; } break; } } -static void sub_81719C0(struct Sprite *sprite) +#undef sState +#undef sFrame + +#define sFrame data[0] + +static void DestroySpriteAfterOneFrame(struct Sprite *sprite) { - if (sprite->data[0] == 0) - { - sprite->data[0] = -1; - } + if (sprite->sFrame == 0) + sprite->sFrame = -1; else { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } +#undef sFrame -static void sub_81719EC(struct Sprite *sprite) +#define sDuration data[0] +#define sTargetX data[2] +#define sTargetY data[4] +#define sAmplitude data[5] + +static void MakeCaptureStars(struct Sprite *sprite) { u32 i; u8 subpriority; if (sprite->subpriority) - { subpriority = sprite->subpriority - 1; - } else { subpriority = 0; sprite->subpriority = 1; } - sub_8171D60(4); - for (i = 0; i < 3; i++) + LoadBallParticleGfx(BALL_MASTER); + for (i = 0; i < ARRAY_COUNT(sCaptureStars); i++) { - u8 spriteId = CreateSprite(&gBallParticlesSpriteTemplates[4], sprite->pos1.x, sprite->pos1.y, subpriority); + u8 spriteId = CreateSprite(&sBallParticleSpriteTemplates[4], sprite->pos1.x, sprite->pos1.y, subpriority); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].data[0] = 24; - gSprites[spriteId].data[2] = sprite->pos1.x + sBallCaptureSuccessStarData[i].xOffset; - gSprites[spriteId].data[4] = sprite->pos1.y + sBallCaptureSuccessStarData[i].yOffset; - gSprites[spriteId].data[5] = sBallCaptureSuccessStarData[i].unk2; + gSprites[spriteId].sDuration = 24; + gSprites[spriteId].sTargetX = sprite->pos1.x + sCaptureStars[i].xOffset; + gSprites[spriteId].sTargetY = sprite->pos1.y + sCaptureStars[i].yOffset; + gSprites[spriteId].sAmplitude = sCaptureStars[i].amplitude; InitAnimArcTranslation(&gSprites[spriteId]); - gSprites[spriteId].callback = sub_8171AAC; - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[4]); + gSprites[spriteId].callback = SpriteCB_CaptureStar_Flicker; + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[BALL_MASTER]); } } } -static void sub_8171AAC(struct Sprite *sprite) +#undef sDuration +#undef sTargetX +#undef sTargetY +#undef sAmplitude + +static void SpriteCB_CaptureStar_Flicker(struct Sprite *sprite) { sprite->invisible = !sprite->invisible; if (TranslateAnimHorizontalArc(sprite)) DestroySprite(sprite); } -static void sub_8171AE4(struct Sprite *sprite) +#define sFrame data[0] +#define sOffsetY data[1] + +// Poké Ball didn't catch - starts: +// - Ball particle animations +// - Wild mon fade to normal color +// - Wild mon emerge from Poké Ball +static void SpriteCB_Ball_Release_Step(struct Sprite *sprite) { u8 ballId; StartSpriteAnim(sprite, 1); StartSpriteAffineAnim(sprite, 0); - sprite->callback = sub_8171BAC; + sprite->callback = SpriteCB_Ball_Release_Wait; ballId = ItemIdToBallId(gLastUsedItem); switch (ballId) { case 0 ... POKEBALL_COUNT - 1: AnimateBallOpenParticles(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballId); - LaunchBallFadeMonTask(1, gBattleAnimTarget, 14, ballId); + LaunchBallFadeMonTask(TRUE, gBattleAnimTarget, 14, ballId); break; } + // Animate Pokémon emerging from Poké Ball gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = FALSE; StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 1); AnimateSprite(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]]); - gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0x1000; + gSprites[gBattlerSpriteIds[gBattleAnimTarget]].sOffsetY = 4096; } -static void sub_8171BAC(struct Sprite *sprite) +static void SpriteCB_Ball_Release_Wait(struct Sprite *sprite) { - int next = FALSE; + bool8 released = FALSE; if (sprite->animEnded) sprite->invisible = TRUE; @@ -1329,28 +1483,31 @@ static void sub_8171BAC(struct Sprite *sprite) if (gSprites[gBattlerSpriteIds[gBattleAnimTarget]].affineAnimEnded) { StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 0); - next = TRUE; + released = TRUE; } else { - gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] -= 288; - gSprites[gBattlerSpriteIds[gBattleAnimTarget]].pos2.y = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] >> 8; + gSprites[gBattlerSpriteIds[gBattleAnimTarget]].sOffsetY -= 288; + gSprites[gBattlerSpriteIds[gBattleAnimTarget]].pos2.y = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].sOffsetY >> 8; } - if (sprite->animEnded && next) + if (sprite->animEnded && released) { gSprites[gBattlerSpriteIds[gBattleAnimTarget]].pos2.y = 0; - gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = gBattleSpritesDataPtr->animationData->field_9_x2; - sprite->data[0] = 0; - sprite->callback = sub_81719C0; + gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = gBattleSpritesDataPtr->animationData->wildMonInvisible; + sprite->sFrame = 0; + sprite->callback = DestroySpriteAfterOneFrame; gDoingBattleAnim = 0; UpdateOamPriorityInAllHealthboxes(1); } } -static void sub_8171CAC(struct Sprite *sprite) +#undef sFrame +#undef sOffsetY + +static void SpriteCB_Ball_Block(struct Sprite *sprite) { - int i; + s32 i; sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; @@ -1359,36 +1516,47 @@ static void sub_8171CAC(struct Sprite *sprite) for (i = 0; i < 6; i++) sprite->data[i] = 0; - sprite->callback = sub_8171CE8; + sprite->callback = SpriteCB_Ball_Block_Step; } -static void sub_8171CE8(struct Sprite *sprite) +#define sDy data[0] +#define sDx data[1] + +#define sFrame data[0] // re-use + +// Poké Ball moves down off screen after being blocked. The x-speed oscillates. +static void SpriteCB_Ball_Block_Step(struct Sprite *sprite) { - s16 var0 = sprite->data[0] + 0x800; - s16 var1 = sprite->data[1] + 0x680; - sprite->pos2.x -= var1 >> 8; - sprite->pos2.y += var0 >> 8; - sprite->data[0] = (sprite->data[0] + 0x800) & 0xFF; - sprite->data[1] = (sprite->data[1] + 0x680) & 0xFF; + s16 dy = sprite->sDy + 0x800; + s16 dx = sprite->sDx + 0x680; + sprite->pos2.x -= dx >> 8; + sprite->pos2.y += dy >> 8; + sprite->sDy = (sprite->sDy + 0x800) & 0xFF; + sprite->sDx = (sprite->sDx + 0x680) & 0xFF; if (sprite->pos1.y + sprite->pos2.y > 160 || sprite->pos1.x + sprite->pos2.x < -8) { - sprite->data[0] = 0; - sprite->callback = sub_81719C0; + sprite->sFrame = 0; + sprite->callback = DestroySpriteAfterOneFrame; gDoingBattleAnim = 0; UpdateOamPriorityInAllHealthboxes(1); } } -static void sub_8171D60(u8 ballId) +#undef sDy +#undef sDx + +#undef sFrame + +static void LoadBallParticleGfx(u8 ballId) { u8 taskId; - if (GetSpriteTileStartByTag(gBallParticleSpritesheets[ballId].tag) == 0xFFFF) + if (GetSpriteTileStartByTag(sBallParticleSpriteSheets[ballId].tag) == 0xFFFF) { - LoadCompressedSpriteSheetUsingHeap(&gBallParticleSpritesheets[ballId]); - LoadCompressedSpritePaletteUsingHeap(&gBallParticlePalettes[ballId]); + LoadCompressedSpriteSheetUsingHeap(&sBallParticleSpriteSheets[ballId]); + LoadCompressedSpritePaletteUsingHeap(&sBallParticlePalettes[ballId]); } } @@ -1396,8 +1564,8 @@ u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId) { u8 taskId; - sub_8171D60(ballId); - taskId = CreateTask(gBallParticleAnimationFuncs[ballId], 5); + LoadBallParticleGfx(ballId); + taskId = CreateTask(sBallParticleAnimationFuncs[ballId], 5); gTasks[taskId].data[1] = x; gTasks[taskId].data[2] = y; gTasks[taskId].data[3] = priority; @@ -1408,10 +1576,10 @@ u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId) return taskId; } -void sub_8171E20(void) +static void IncrBallParticleCount(void) { if (gMain.inBattle) - gBattleSpritesDataPtr->animationData->field_A++; + gBattleSpritesDataPtr->animationData->numBallParticles++; } static void PokeBallOpenParticleAnimation(u8 taskId) @@ -1430,11 +1598,11 @@ static void PokeBallOpenParticleAnimation(u8 taskId) priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = PokeBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; @@ -1489,11 +1657,11 @@ static void TimerBallOpenParticleAnimation(u8 taskId) for (i = 0; i < 8; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; @@ -1523,11 +1691,11 @@ static void DiveBallOpenParticleAnimation(u8 taskId) for (i = 0; i < 8; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; @@ -1558,11 +1726,11 @@ static void SafariBallOpenParticleAnimation(u8 taskId) for (i = 0; i < 8; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; @@ -1593,11 +1761,11 @@ static void UltraBallOpenParticleAnimation(u8 taskId) for (i = 0; i < 10; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 25; @@ -1634,11 +1802,11 @@ static void GreatBallOpenParticleAnimation(u8 taskId) for (i = 0; i < 8; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; @@ -1684,11 +1852,11 @@ static void RepeatBallOpenParticleAnimation(u8 taskId) for (i = 0; i < POKEBALL_COUNT; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = RepeatBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 21; @@ -1728,11 +1896,11 @@ static void MasterBallOpenParticleAnimation(u8 taskId) { for (i = 0; i < 8; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; @@ -1772,11 +1940,11 @@ static void PremierBallOpenParticleAnimation(u8 taskId) for (i = 0; i < 8; i++) { - spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); + spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); - StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); + IncrBallParticleCount(); + StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]); gSprites[spriteId].callback = PremierBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; gSprites[spriteId].data[0] = i * 32; @@ -1802,7 +1970,7 @@ static void PremierBallOpenParticleAnimation_Step1(struct Sprite *sprite) static void DestroyBallOpenAnimationParticle(struct Sprite *sprite) { - int i, j; + s32 i, j; if (!gMain.inBattle) { @@ -1813,12 +1981,12 @@ static void DestroyBallOpenAnimationParticle(struct Sprite *sprite) } else { - gBattleSpritesDataPtr->animationData->field_A--; - if (gBattleSpritesDataPtr->animationData->field_A == 0) + gBattleSpritesDataPtr->animationData->numBallParticles--; + if (gBattleSpritesDataPtr->animationData->numBallParticles == 0) { for (i = 0; i < POKEBALL_COUNT; i++) { - if (FuncIsActiveTask(gBallParticleAnimationFuncs[i]) == TRUE) + if (FuncIsActiveTask(sBallParticleAnimationFuncs[i]) == TRUE) break; } @@ -1826,8 +1994,8 @@ static void DestroyBallOpenAnimationParticle(struct Sprite *sprite) { for (j = 0; j < POKEBALL_COUNT; j++) { - FreeSpriteTilesByTag(gBallParticleSpritesheets[j].tag); - FreeSpritePaletteByTag(gBallParticlePalettes[j].tag); + FreeSpriteTilesByTag(sBallParticleSpriteSheets[j].tag); + FreeSpritePaletteByTag(sBallParticlePalettes[j].tag); } } @@ -1840,70 +2008,78 @@ static void DestroyBallOpenAnimationParticle(struct Sprite *sprite) } } -u8 LaunchBallFadeMonTask(u8 unfadeLater, u8 battler, u32 selectedPalettes, u8 ballId) +#define tCoeff data[0] +#define tdCoeff data[1] +#define tTimer data[2] +#define tPalOffset data[3] +#define tPaletteLo data[10] +#define tPaletteHi data[11] +#define tBallId data[15] + +u8 LaunchBallFadeMonTask(bool8 unfadeLater, u8 battler, u32 selectedPalettes, u8 ballId) { u8 taskId; - taskId = CreateTask(sub_8172AB0, 5); - gTasks[taskId].data[15] = ballId; - gTasks[taskId].data[3] = battler; - gTasks[taskId].data[10] = selectedPalettes; - gTasks[taskId].data[11] = selectedPalettes >> 16; + taskId = CreateTask(Task_FadeMon_ToBallColor, 5); + gTasks[taskId].tBallId = ballId; + gTasks[taskId].tPalOffset = battler; + gTasks[taskId].tPaletteLo = selectedPalettes; + gTasks[taskId].tPaletteHi = selectedPalettes >> 16; if (!unfadeLater) { BlendPalette(battler * 16 + 0x100, 16, 0, gBallOpenFadeColors[ballId]); - gTasks[taskId].data[1] = 1; + gTasks[taskId].tdCoeff = 1; } else { BlendPalette(battler * 16 + 0x100, 16, 16, gBallOpenFadeColors[ballId]); - gTasks[taskId].data[0] = 16; - gTasks[taskId].data[1] = -1; - gTasks[taskId].func = sub_8172B40; + gTasks[taskId].tCoeff = 16; + gTasks[taskId].tdCoeff = -1; + gTasks[taskId].func = Task_FadeMon_ToNormal; } BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB(31, 31, 31)); return taskId; } -static void sub_8172AB0(u8 taskId) +static void Task_FadeMon_ToBallColor(u8 taskId) { - u8 ballId = gTasks[taskId].data[15]; + u8 ballId = gTasks[taskId].tBallId; - if (gTasks[taskId].data[2] <= 16) + if (gTasks[taskId].tTimer <= 16) { - BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], gBallOpenFadeColors[ballId]); - gTasks[taskId].data[0] += gTasks[taskId].data[1]; - gTasks[taskId].data[2]++; + BlendPalette(gTasks[taskId].tPalOffset * 16 + 0x100, 16, gTasks[taskId].tCoeff, gBallOpenFadeColors[ballId]); + gTasks[taskId].tCoeff += gTasks[taskId].tdCoeff; + gTasks[taskId].tTimer++; } else if (!gPaletteFade.active) { - u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); - BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB(31, 31, 31)); + u32 selectedPalettes = (u16)gTasks[taskId].tPaletteLo | ((u16)gTasks[taskId].tPaletteHi << 16); + BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE); DestroyTask(taskId); } } -static void sub_8172B40(u8 taskId) +static void Task_FadeMon_ToNormal(u8 taskId) { if (!gPaletteFade.active) { - u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); - BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB(31, 31, 31)); - gTasks[taskId].func = sub_8172B90; + u32 selectedPalettes = (u16)gTasks[taskId].tPaletteLo | ((u16)gTasks[taskId].tPaletteHi << 16); + BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE); + gTasks[taskId].func = Task_FadeMon_ToNormal_Step; } } -static void sub_8172B90(u8 taskId) +static void Task_FadeMon_ToNormal_Step(u8 taskId) { - u8 ballId = gTasks[taskId].data[15]; + u8 ballId = gTasks[taskId].tBallId; - if (gTasks[taskId].data[2] <= 16) + if (gTasks[taskId].tTimer <= 16) { - BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], gBallOpenFadeColors[ballId]); - gTasks[taskId].data[0] += gTasks[taskId].data[1]; - gTasks[taskId].data[2]++; + BlendPalette(gTasks[taskId].tPalOffset * 16 + 0x100, 16, gTasks[taskId].tCoeff, gBallOpenFadeColors[ballId]); + gTasks[taskId].tCoeff += gTasks[taskId].tdCoeff; + gTasks[taskId].tTimer++; } else { @@ -1911,6 +2087,14 @@ static void sub_8172B90(u8 taskId) } } +#undef tCoeff +#undef tdCoeff +#undef tTimer +#undef tPalOffset +#undef tPaletteLo +#undef tPaletteHi +#undef tBallId + // arg0: TRUE to swap to mon, FALSE to swap to substitute void AnimTask_SwapMonSpriteToFromSubstitute(u8 taskId) { @@ -2016,15 +2200,26 @@ void AnimTask_SetTargetToEffectBattler(u8 taskId) DestroyAnimVisualTask(taskId); } -void sub_8172EF0(u8 battler, struct Pokemon *mon) +#define tBattler data[0] +#define tStarMove data[1] +#define tStarTimer data[10] +#define tStarIdx data[11] +#define tNumStars data[12] +#define tTimer data[13] + +#define sTaskId data[0] +#define sPhase data[1] // For encircling stars +#define sTimer data[1] // For diagnoal stars + +void TryShinyAnimation(u8 battler, struct Pokemon *mon) { - int isShiny; + bool8 isShiny; u32 otId, personality; u32 shinyValue; - u8 taskId1, taskId2; + u8 taskCirc, taskDgnl; - isShiny = 0; - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x80 = 1; + isShiny = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = TRUE; otId = GetMonData(mon, MON_DATA_OT_ID); personality = GetMonData(mon, MON_DATA_PERSONALITY); @@ -2042,71 +2237,73 @@ void sub_8172EF0(u8 battler, struct Pokemon *mon) LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_GOLD_STARS - ANIM_SPRITES_START]); } - taskId1 = CreateTask(sub_8172FEC, 10); - taskId2 = CreateTask(sub_8172FEC, 10); - gTasks[taskId1].data[0] = battler; - gTasks[taskId2].data[0] = battler; - gTasks[taskId1].data[1] = 0; - gTasks[taskId2].data[1] = 1; + taskCirc = CreateTask(Task_ShinyStars, 10); + taskDgnl = CreateTask(Task_ShinyStars, 10); + gTasks[taskCirc].tBattler = battler; + gTasks[taskDgnl].tBattler = battler; + gTasks[taskCirc].tStarMove = SHINY_STAR_ENCIRCLE; + gTasks[taskDgnl].tStarMove = SHINY_STAR_DIAGONAL; return; } } - gBattleSpritesDataPtr->healthBoxesData[battler].field_1_x1 = 1; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE; } -static void sub_8172FEC(u8 taskId) +static void Task_ShinyStars(u8 taskId) { u8 battler; u8 x, y; u8 spriteId; - u16 counter; - s16 state; + u16 timer; + s16 starIdx; u8 pan; - if (gTasks[taskId].data[13] < 60) + if (gTasks[taskId].tTimer < 60) { - gTasks[taskId].data[13]++; + gTasks[taskId].tTimer++; return; } - if (gBattleSpritesDataPtr->animationData->field_A) + // Wait until the ball particles have despawned + if (gBattleSpritesDataPtr->animationData->numBallParticles) return; - counter = gTasks[taskId].data[10]++; - if (counter & 3) + timer = gTasks[taskId].tStarTimer++; + if (timer % 4) // Create sprite 1 of every 4 frames return; - battler = gTasks[taskId].data[0]; - x = GetBattlerSpriteCoord(battler, 0); - y = GetBattlerSpriteCoord(battler, 1); - state = gTasks[taskId].data[11]; - if (state == 0) + battler = gTasks[taskId].tBattler; + x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); + y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y); + + starIdx = gTasks[taskId].tStarIdx; + if (starIdx == 0) // Big star { spriteId = CreateSprite(&gWishStarSpriteTemplate, x, y, 5); } - else if (state >= 0 && gTasks[taskId].data[11] < 4) + else if (starIdx >= 0 && gTasks[taskId].tStarIdx < 4) // Medium star { spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5); gSprites[spriteId].oam.tileNum += 4; } - else + else // Small star { spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5); gSprites[spriteId].oam.tileNum += 5; } - if (gTasks[taskId].data[1] == 0) + if (gTasks[taskId].tStarMove == SHINY_STAR_ENCIRCLE) { - gSprites[spriteId].callback = sub_81731FC; + gSprites[spriteId].callback = SpriteCB_ShinyStars_Encircle; } else { - gSprites[spriteId].callback = sub_8173250; + gSprites[spriteId].callback = SpriteCB_ShinyStars_Diagonal; gSprites[spriteId].pos2.x = -32; gSprites[spriteId].pos2.y = 32; gSprites[spriteId].invisible = TRUE; - if (gTasks[taskId].data[11] == 0) + if (gTasks[taskId].tStarIdx == 0) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) pan = -64; @@ -2117,50 +2314,49 @@ static void sub_8172FEC(u8 taskId) } } - gSprites[spriteId].data[0] = taskId; - gTasks[taskId].data[11]++; + gSprites[spriteId].sTaskId = taskId; + gTasks[taskId].tStarIdx++; if (spriteId != MAX_SPRITES) - gTasks[taskId].data[12]++; + gTasks[taskId].tNumStars++; - if (gTasks[taskId].data[11] == 5) - gTasks[taskId].func = sub_81731B0; + if (gTasks[taskId].tStarIdx == 5) + gTasks[taskId].func = Task_ShinyStars_Wait; } -static void sub_81731B0(u8 taskId) +static void Task_ShinyStars_Wait(u8 taskId) { u8 battler; - if (gTasks[taskId].data[12] == 0) + if (gTasks[taskId].tNumStars == 0) { - if (gTasks[taskId].data[1] == 1) + if (gTasks[taskId].tStarMove == SHINY_STAR_DIAGONAL) { - battler = gTasks[taskId].data[0]; - gBattleSpritesDataPtr->healthBoxesData[battler].field_1_x1 = 1; + battler = gTasks[taskId].tBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE; } DestroyTask(taskId); } } -static void sub_81731FC(struct Sprite *sprite) +static void SpriteCB_ShinyStars_Encircle(struct Sprite *sprite) { - sprite->pos2.x = Sin(sprite->data[1], 24); - sprite->pos2.y = Cos(sprite->data[1], 24); - sprite->data[1] += 12; - if (sprite->data[1] > 0xFF) + sprite->pos2.x = Sin(sprite->sPhase, 24); + sprite->pos2.y = Cos(sprite->sPhase, 24); + sprite->sPhase += 12; + if (sprite->sPhase > 255) { - gTasks[sprite->data[0]].data[12]--; + gTasks[sprite->sTaskId].tNumStars--; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } -static void sub_8173250(struct Sprite *sprite) +static void SpriteCB_ShinyStars_Diagonal(struct Sprite *sprite) { - if (sprite->data[1] < 4) - { - sprite->data[1]++; - } + // Delayed four frames to de-sync from encircling stars + if (sprite->sTimer < 4) + sprite->sTimer++; else { sprite->invisible = FALSE; @@ -2168,13 +2364,24 @@ static void sub_8173250(struct Sprite *sprite) sprite->pos2.y -= 5; if (sprite->pos2.x > 32) { - gTasks[sprite->data[0]].data[12]--; + gTasks[sprite->sTaskId].tNumStars--; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } } +#undef tBattler +#undef tStarMove +#undef tStarTimer +#undef tStarIdx +#undef tNumStars +#undef tTimer + +#undef sTaskId +#undef sPhase +#undef sTimer + void AnimTask_LoadPokeblockGfx(u8 taskId) { u8 paletteIndex; @@ -2192,35 +2399,46 @@ void AnimTask_FreePokeblockGfx(u8 taskId) DestroyAnimVisualTask(taskId); } -static void sub_817330C(struct Sprite *sprite) +#define sDuration data[0] +#define sTargetX data[2] +#define sTargetY data[4] +#define sAmplitude data[5] + +static void SpriteCB_PokeBlock_Throw(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 0); - sprite->data[0] = 30; - sprite->data[2] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), 0) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), 1) + gBattleAnimArgs[3]; - sprite->data[5] = -32; + sprite->sDuration = 30; + sprite->sTargetX = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_X) + gBattleAnimArgs[2]; + sprite->sTargetY = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_Y) + gBattleAnimArgs[3]; + sprite->sAmplitude = -32; InitAnimArcTranslation(sprite); - gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].callback = sub_8039E84; - sprite->callback = sub_817339C; + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].callback = SpriteCB_TrainerThrowObject; + sprite->callback = SpriteCB_PokeBlock_LiftArm; } -static void sub_817339C(struct Sprite *sprite) +#undef sDuration +#undef sTargetX +#undef sTargetY +#undef sAmplitude + +static void SpriteCB_PokeBlock_LiftArm(struct Sprite *sprite) { if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animCmdIndex == 1) - sprite->callback = sub_81733D4; + sprite->callback = SpriteCB_PokeBlock_Arc; } -static void sub_81733D4(struct Sprite *sprite) +static void SpriteCB_PokeBlock_Arc(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { sprite->data[0] = 0; sprite->invisible = TRUE; - sprite->callback = sub_8173400; + sprite->callback = SpriteCB_ThrowPokeBlock_Free; } } -static void sub_8173400(struct Sprite *sprite) +// Destroy after end of player animation +static void SpriteCB_ThrowPokeBlock_Free(struct Sprite *sprite) { if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animEnded) { diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 9bc4713cd..1041f6fda 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -239,27 +239,27 @@ static void sub_8064520(void) { if (r4 || !IsBattlerSpriteVisible(BATTLE_PARTNER(gActiveBattler))) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) return; - if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x1) + if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) return; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); } else { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) return; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { @@ -278,17 +278,17 @@ static void sub_8064734(void) bool32 r10 = FALSE; if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x1) + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) { - sub_8172EF0(BATTLE_PARTNER(gActiveBattler), &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); + TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); } @@ -367,16 +367,16 @@ static void sub_8064B04(void) if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } else { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); LinkOpponentBufferExecCompleted(); @@ -473,11 +473,11 @@ static void sub_8064DD0(void) static void sub_8064E50(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -495,9 +495,9 @@ static void sub_8064E50(void) static void sub_8064F40(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 79f56aaed..af81b06d5 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -359,10 +359,10 @@ static void sub_814B554(void) static void sub_814B5A8(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -380,10 +380,10 @@ static void sub_814B5A8(void) static void sub_814B69C(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); } if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index a82351ed7..f186bf3ff 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -249,23 +249,25 @@ static void sub_805F2F0(void) { if (var2 == TRUE) { - if (var2 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); } else return; } - else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + else if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { if (GetBattlerPosition(gActiveBattler) == 3) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 == 0 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 == 0) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -273,8 +275,8 @@ static void sub_805F2F0(void) else return; } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; } else return; @@ -289,10 +291,19 @@ static void sub_805F560(void) bool32 sp = FALSE; bool32 r10 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) && IsDoubleBattle() && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) - sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + + if (!(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + && !(gBattleTypeFlags & BATTLE_TYPE_MULTI) + && IsDoubleBattle() + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80) @@ -368,13 +379,16 @@ static void sub_805F560(void) static void sub_805F994(void) { - if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0 + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); OpponentBufferExecCompleted(); @@ -463,10 +477,11 @@ static void sub_805FC80(void) static void sub_805FD00(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); @@ -480,8 +495,9 @@ static void sub_805FD00(void) static void sub_805FDF0(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 259b20035..d8005e808 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -951,13 +951,13 @@ static void sub_805896C(void) var = TRUE; } - if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) + if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -976,10 +976,13 @@ static void sub_8058B40(void) bool32 r9 = FALSE; bool32 r8 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) - sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { @@ -1050,12 +1053,12 @@ static void sub_8058B40(void) static void sub_8058EDC(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { CopyBattleSpriteInvisibility(gActiveBattler); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -1079,11 +1082,9 @@ static void sub_8058FC0(void) static void sub_805902C(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - { - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - } + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index fd6616746..af6b739cc 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -544,10 +544,10 @@ static void sub_81BB9A0(void) static void sub_81BB9F4(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -565,10 +565,10 @@ static void sub_81BB9F4(void) static void sub_81BBAE8(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); } if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 92e8d2386..ca7cd4adc 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -239,15 +239,15 @@ static void sub_8186678(void) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) return; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) return; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); } @@ -262,10 +262,13 @@ static void sub_818686C(void) bool32 r9 = FALSE; bool32 r8 = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) - sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { @@ -348,16 +351,16 @@ static void sub_8186C48(void) if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } else { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); RecordedOpponentBufferExecCompleted(); @@ -455,11 +458,11 @@ static void sub_8186F14(void) static void sub_8186F94(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -477,10 +480,8 @@ static void sub_8186F94(void) static void sub_8187084(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) - { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - } + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 2362e3c84..72af27d5e 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -224,14 +224,14 @@ static void sub_8189AA0(void) } } - if (r6 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) + if (r6 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -277,16 +277,13 @@ static void sub_8189D40(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - { - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) - { - sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); - } + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); } if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive @@ -439,10 +436,10 @@ static void sub_818A328(void) static void sub_818A37C(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -460,10 +457,10 @@ static void sub_818A37C(void) static void sub_818A470(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); } if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index c39b904c9..70e41cf8d 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -389,7 +389,7 @@ static void SafariHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } @@ -399,7 +399,7 @@ static void SafariHandleBallThrowAnim(void) gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone; } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index a5b1ae2f7..aa50bc159 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -285,10 +285,13 @@ static void CompleteOnChosenItem(void) static void sub_816864C(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) - sub_8172EF0(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive @@ -320,14 +323,14 @@ static void sub_8168818(void) if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) r4 = TRUE; - if (r4 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1) + if (r4 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].flag_x80 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); @@ -1076,7 +1079,7 @@ static void WallyHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation; } @@ -1086,7 +1089,7 @@ static void WallyHandleBallThrowAnim(void) gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation; } diff --git a/src/battle_dome.c b/src/battle_dome.c index 3654d2ccf..452997ebd 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -49,7 +49,7 @@ // An 'Info Card' is a trainer or match information page that can be viewed on the Tourney Tree struct TourneyTreeInfoCard { - u8 spriteIds[NUM_INFOCARD_SPRITES]; + u8 spriteIds[NUM_INFOCARD_SPRITES]; u8 pos; u8 tournamentIds[NUM_INFOCARD_TRAINERS]; }; @@ -499,7 +499,7 @@ static const u8 sBattleStyleMovePoints[MOVES_COUNT][NUM_MOVE_POINT_TYPES] = [MOVE_PSYCHO_BOOST] = {[MOVE_POINTS_DMG] = 1, [MOVE_POINTS_POWERFUL] = 1, [MOVE_POINTS_STRONG] = 1, [MOVE_POINTS_LOW_PP] = 1, [MOVE_POINTS_EFFECT] = 1}, }; -// This array is searched in-order to determine what battle style a tourney trainer uses. +// This array is searched in-order to determine what battle style a tourney trainer uses. // If the sum of the points for the party's moves meets/exceeds all the point totals of an element, then they use that battle style static const u8 sBattleStyleThresholds[NUM_BATTLE_STYLES - 1][NUM_MOVE_POINT_TYPES] = { @@ -1188,11 +1188,11 @@ static const u8 sIdToMatchNumber[DOME_TOURNAMENT_TRAINERS_COUNT][DOME_ROUNDS_COU { 7, 11, 13, 14}, }; -static const u8 sLastMatchCardNum[DOME_ROUNDS_COUNT] = +static const u8 sLastMatchCardNum[DOME_ROUNDS_COUNT] = { - [DOME_ROUND1] = 23, - [DOME_ROUND2] = 27, - [DOME_SEMIFINAL] = 29, + [DOME_ROUND1] = 23, + [DOME_ROUND2] = 27, + [DOME_SEMIFINAL] = 29, [DOME_FINAL] = 30 }; @@ -1324,12 +1324,12 @@ static const u8 sSpeciesNameTextYCoords[] = {0, 4, 0}; // Offsets within sBattleDomeOpponentStatsTexts for stat combinations // SPDEF has no offset because by then all stat combinations have been reached, so it has no combination texts -static const u8 sStatTextOffsets[NUM_STATS - 1] = +static const u8 sStatTextOffsets[NUM_STATS - 1] = { - DOME_TEXT_HP, - DOME_TEXT_ATK, - DOME_TEXT_DEF, - DOME_TEXT_SPEED, + DOME_TEXT_HP, + DOME_TEXT_ATK, + DOME_TEXT_DEF, + DOME_TEXT_SPEED, DOME_TEXT_SPATK }; @@ -1421,7 +1421,7 @@ static const u8 sTrainerNamePositions[DOME_TOURNAMENT_TRAINERS_COUNT][2] = static const u8 sTourneyTreePokeballCoords[DOME_TOURNAMENT_TRAINERS_COUNT + DOME_TOURNAMENT_MATCHES_COUNT][2] = { { 68, 33}, // Left side trainers - { 68, 49}, + { 68, 49}, { 68, 65}, { 68, 81}, { 68, 97}, @@ -1495,7 +1495,7 @@ static const u8 sTourneyTreePokeballCoords[DOME_TOURNAMENT_TRAINERS_COUNT + DOME {.src = 0x6021, .y = 0x10, .x = 0x09}, \ {.src = 0x6023, .y = 0x10, .x = 0x0a}, \ {.src = 0x6047, .y = 0x11, .x = 0x0a}, \ - {.src = lastSrc, .y = 0x11, .x = 0x0b}, + {.src = lastSrc, .y = 0x11, .x = 0x0b}, #define LINESECTION_ROUND1_TRAINER4(lastSrc) \ {.src = 0x602b, .y = 0x12, .x = 0x09}, \ @@ -2395,7 +2395,7 @@ static void InitDomeTrainers(void) rankingScores[i] += (monTypesCount * monLevel) / 20; } - // Seed tourney trainers according to their ranking + // Seed tourney trainers according to their ranking for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT - 1; i++) { for (j = i + 1; j < DOME_TOURNAMENT_TRAINERS_COUNT; j++) @@ -2676,7 +2676,7 @@ static int SelectOpponentMonsFromParty(int *partyMovePoints, bool8 allowRandom) partyPositions[i] = i; // All party mons have equal move score totals, choose randomly - if (partyMovePoints[0] == partyMovePoints[1] + if (partyMovePoints[0] == partyMovePoints[1] && partyMovePoints[0] == partyMovePoints[2]) { if (allowRandom) @@ -2852,8 +2852,8 @@ static int GetTypeEffectivenessPoints(int move, int targetSpecies, int arg2) NAKED static int GetTypeEffectivenessPoints(int move, int species, int arg2) { - asm_unified("\n\ - push {r4-r7,lr}\n\ + asm_unified( + "push {r4-r7,lr}\n\ mov r7, r10\n\ mov r6, r9\n\ mov r5, r8\n\ @@ -3085,8 +3085,7 @@ _08190156:\n\ mov r10, r5\n\ pop {r4-r7}\n\ pop {r1}\n\ - bx r1\n\ - "); + bx r1"); } #endif // NONMATCHING @@ -4538,7 +4537,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) if (flags & MOVE_CARD) gSprites[sInfoCard->spriteIds[2 + i + arrId]].invisible = TRUE; } - + // Initialize the text printer textPrinter.fontId = 2; textPrinter.x = 0; @@ -4547,7 +4546,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) textPrinter.currentY = textPrinter.y; textPrinter.letterSpacing = 2; textPrinter.lineSpacing = 0; - textPrinter.unk = 0; + textPrinter.style = 0; textPrinter.fgColor = TEXT_DYNAMIC_COLOR_5; textPrinter.bgColor = TEXT_COLOR_TRANSPARENT; textPrinter.shadowColor = TEXT_DYNAMIC_COLOR_4; @@ -4776,7 +4775,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) // If 2 good stats have been found already, choose which to use if (i == 2) { - + if (allocatedArray[6] < allocatedArray[k]) { if (allocatedArray[7] < allocatedArray[k]) @@ -4893,7 +4892,7 @@ static int BufferDomeWinString(u8 matchNum, u8 *tournamentIds) for (i = sCompetitorRangeByMatch[matchNum][0]; i < sCompetitorRangeByMatch[matchNum][0] + sCompetitorRangeByMatch[matchNum][1]; i++) { tournamentId = sTourneyTreeTrainerIds2[i]; - + if (DOME_TRAINERS[tournamentId].isEliminated && DOME_TRAINERS[tournamentId].eliminatedAt >= sCompetitorRangeByMatch[matchNum][2]) { @@ -5080,7 +5079,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) textPrinter.currentY = textPrinter.y; textPrinter.letterSpacing = 0; textPrinter.lineSpacing = 0; - textPrinter.unk = 0; + textPrinter.style = 0; textPrinter.fgColor = TEXT_DYNAMIC_COLOR_5; textPrinter.bgColor = TEXT_COLOR_TRANSPARENT; textPrinter.shadowColor = TEXT_DYNAMIC_COLOR_4; @@ -5353,7 +5352,7 @@ static void ResolveDomeRoundWinners(void) DOME_TRAINERS[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].isEliminated = TRUE; DOME_TRAINERS[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum; gSaveBlock2Ptr->frontier.domeWinningMoves[TrainerIdToTournamentId(gTrainerBattleOpponent_A)] = gBattleResults.lastUsedMovePlayer; - + // If the player's match was the final one, no NPC vs NPC matches to decide if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < DOME_FINAL) DecideRoundWinners(gSaveBlock2Ptr->frontier.curChallengeBattleNum); @@ -5363,7 +5362,7 @@ static void ResolveDomeRoundWinners(void) DOME_TRAINERS[TrainerIdToTournamentId(TRAINER_PLAYER)].isEliminated = TRUE; DOME_TRAINERS[TrainerIdToTournamentId(TRAINER_PLAYER)].eliminatedAt = gSaveBlock2Ptr->frontier.curChallengeBattleNum; gSaveBlock2Ptr->frontier.domeWinningMoves[TrainerIdToTournamentId(TRAINER_PLAYER)] = gBattleResults.lastUsedMoveOpponent; - + if (gBattleOutcome == B_OUTCOME_FORFEITED || gSpecialVar_0x8005 == DOME_PLAYER_RETIRED) DOME_TRAINERS[TrainerIdToTournamentId(TRAINER_PLAYER)].forfeited = TRUE; @@ -5401,7 +5400,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun movePower = 40; else if (movePower == 1) movePower = 60; - else if (moveIds[i * MAX_MON_MOVES + j] == MOVE_SELF_DESTRUCT + else if (moveIds[i * MAX_MON_MOVES + j] == MOVE_SELF_DESTRUCT || moveIds[i * MAX_MON_MOVES + j] == MOVE_EXPLOSION) movePower /= 2; @@ -5534,7 +5533,7 @@ static void Task_ShowTourneyTree(u8 taskId) gTasks[taskId].tState++; break; case 2: - sTilemapBuffer = AllocZeroed(0x800); + sTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); LZDecompressWram(gDomeTourneyLineMask_Tilemap, sTilemapBuffer); SetBgTilemapBuffer(1, sTilemapBuffer); CopyBgTilemapBufferToVram(1); @@ -5558,7 +5557,7 @@ static void Task_ShowTourneyTree(u8 taskId) { for (i = 0; i < ARRAY_COUNT(sTourneyTreePokeballCoords); i++) CreateSprite(&sTourneyTreePokeballSpriteTemplate, sTourneyTreePokeballCoords[i][0], sTourneyTreePokeballCoords[i][1], 0); - + if (gTasks[taskId].tIsPrevTourneyTree) CreateSprite(&sExitButtonSpriteTemplate, 218, 12, 0); else @@ -5578,7 +5577,7 @@ static void Task_ShowTourneyTree(u8 taskId) textPrinter.lineSpacing = 0; textPrinter.currentX = GetStringCenterAlignXOffsetWithLetterSpacing(textPrinter.fontId, textPrinter.currentChar, 0x70, textPrinter.letterSpacing); textPrinter.currentY = 1; - textPrinter.unk = 0; + textPrinter.style = 0; textPrinter.fgColor = TEXT_DYNAMIC_COLOR_5; textPrinter.bgColor = TEXT_COLOR_TRANSPARENT; textPrinter.shadowColor = TEXT_DYNAMIC_COLOR_4; @@ -5698,7 +5697,7 @@ static void Task_ShowTourneyTree(u8 taskId) gTasks[i].tState = 0; } ScanlineEffect_Clear(); - + i = 0; while (i < 91) { @@ -5713,7 +5712,7 @@ static void Task_ShowTourneyTree(u8 taskId) gScanlineEffectRegBuffers[1][i] = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_CHARBASE(2) | BGCNT_TXT256x256; i++; } - + ScanlineEffect_SetParams(sTourneyTreeScanlineEffectParams); DestroyTask(taskId); break; @@ -5759,7 +5758,7 @@ static void Task_HandleStaticTourneyTreeInput(u8 taskId) textPrinter.y = 0; textPrinter.letterSpacing = 2; textPrinter.lineSpacing = 0; - textPrinter.unk = 0; + textPrinter.style = 0; textPrinter.fgColor = TEXT_DYNAMIC_COLOR_2; textPrinter.bgColor = TEXT_COLOR_TRANSPARENT; textPrinter.shadowColor = TEXT_DYNAMIC_COLOR_4; @@ -5851,67 +5850,67 @@ static void HblankCb_TourneyTree(void) if (vCount < 42) { - REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ + REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_CLR | WININ_WIN1_OBJ; SET_WIN0H_WIN1H(0, 0); } else if (vCount < 50) { - REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR + REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG3 | WININ_WIN1_OBJ | WININ_WIN1_CLR; SET_WIN0H_WIN1H(WIN_RANGE(152, 155), WIN_RANGE(85, 88)); } else if (vCount < 58) { - REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ + REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_CLR | WININ_WIN1_OBJ; SET_WIN0H_WIN1H(0, 0); } else if (vCount < 75) { - REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR + REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG3 | WININ_WIN1_OBJ | WININ_WIN1_CLR; SET_WIN0H_WIN1H(WIN_RANGE(144, 152), WIN_RANGE(88, 96)); } else if (vCount < 82) { - REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR + REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG3 | WININ_WIN1_OBJ | WININ_WIN1_CLR; SET_WIN0H_WIN1H(WIN_RANGE(152, 155), WIN_RANGE(85, 88)); } else if (vCount < 95) { - REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ + REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_CLR | WININ_WIN1_OBJ; SET_WIN0H_WIN1H(0, 0); } else if (vCount < 103) { - REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR + REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_OBJ | WININ_WIN1_CLR; SET_WIN0H_WIN1H(WIN_RANGE(152, 155), WIN_RANGE(85, 88)); } else if (vCount < 119) { - REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR + REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_OBJ | WININ_WIN1_CLR; SET_WIN0H_WIN1H(WIN_RANGE(144, 152), WIN_RANGE(88, 96)); } else if (vCount < 127) { - REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ + REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_CLR | WININ_WIN1_OBJ; SET_WIN0H_WIN1H(0, 0); } else if (vCount < 135) { - REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR + REG_WININ = WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_OBJ | WININ_WIN1_CLR; SET_WIN0H_WIN1H(WIN_RANGE(152, 155), WIN_RANGE(85, 88)); } else { - REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ + REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_CLR | WININ_WIN1_OBJ; SET_WIN0H_WIN1H(0, 0); } diff --git a/src/battle_main.c b/src/battle_main.c index 935a53ffe..2c3df2e34 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2978,7 +2978,7 @@ void sub_8039E60(struct Sprite *sprite) sprite->callback = SpriteCallbackDummy_3; } -void sub_8039E84(struct Sprite *sprite) +void SpriteCB_TrainerThrowObject(struct Sprite *sprite) { StartSpriteAnim(sprite, 1); sprite->callback = sub_8039E60; @@ -3649,8 +3649,8 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void) NAKED static void BattleIntroOpponent1SendsOutMonAnimation(void) { - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ + asm_unified( + "push {r4-r6,lr}\n\ ldr r0, =gBattleTypeFlags\n\ ldr r2, [r0]\n\ movs r0, 0x80\n\ @@ -3728,8 +3728,7 @@ _0803B2F2:\n\ pop {r4-r6}\n\ pop {r0}\n\ bx r0\n\ - .pool\n\ - .syntax divided"); + .pool"); } #endif // NONMATCHING diff --git a/src/battle_message.c b/src/battle_message.c index 59ad0cee4..c004665d7 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2995,7 +2995,7 @@ void BattlePutTextOnWindow(const u8 *text, u8 windowId) printerTemplate.currentY = printerTemplate.y; printerTemplate.letterSpacing = textInfo[windowId].letterSpacing; printerTemplate.lineSpacing = textInfo[windowId].lineSpacing; - printerTemplate.unk = 0; + printerTemplate.style = 0; printerTemplate.fgColor = textInfo[windowId].fgColor; printerTemplate.bgColor = textInfo[windowId].bgColor; printerTemplate.shadowColor = textInfo[windowId].shadowColor; diff --git a/src/battle_records.c b/src/battle_records.c index c6363a6ed..680733527 100644 --- a/src/battle_records.c +++ b/src/battle_records.c @@ -485,7 +485,7 @@ static void CB2_ShowTrainerHillRecords(void) gMain.state++; break; case 2: - sTilemapBuffer = AllocZeroed(0x800); + sTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sTrainerHillRecordsBgTemplates, ARRAY_COUNT(sTrainerHillRecordsBgTemplates)); SetBgTilemapBuffer(3, sTilemapBuffer); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a41d52845..9ff5e8fc6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6036,7 +6036,7 @@ static void PutLevelAndGenderOnLvlUpBox(void) printerTemplate.currentY = 0; printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; - printerTemplate.unk = 0; + printerTemplate.style = 0; printerTemplate.fgColor = TEXT_COLOR_WHITE; printerTemplate.bgColor = TEXT_COLOR_TRANSPARENT; printerTemplate.shadowColor = TEXT_COLOR_DARK_GREY; @@ -9893,6 +9893,7 @@ static void Cmd_handleballthrow(void) else // not caught { gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + // Maybe inject SpriteCB_TestBallThrow here gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } diff --git a/src/berry_blender.c b/src/berry_blender.c index 399a9e7b8..2cdb841ee 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -1,5 +1,4 @@ #include "global.h" -#include "constants/game_stat.h" #include "overworld.h" #include "berry_blender.h" #include "bg.h" @@ -7,7 +6,6 @@ #include "task.h" #include "sprite.h" #include "sound.h" -#include "constants/songs.h" #include "m4a.h" #include "bg.h" #include "palette.h" @@ -19,10 +17,10 @@ #include "event_data.h" #include "main.h" #include "link.h" +#include "link_rfu.h" #include "item_menu_icons.h" #include "berry.h" #include "item.h" -#include "constants/items.h" #include "string_util.h" #include "international_string_util.h" #include "random.h" @@ -35,43 +33,97 @@ #include "graphics.h" #include "new_game.h" #include "save.h" -#include "link.h" +#include "strings.h" #include "constants/berry.h" +#include "constants/game_stat.h" +#include "constants/items.h" #include "constants/rgb.h" +#include "constants/songs.h" + +enum { + SCORE_BEST, + SCORE_GOOD, + SCORE_MISS, + NUM_SCORE_TYPES, +}; -#define BLENDER_SCORE_BEST 0 -#define BLENDER_SCORE_GOOD 1 -#define BLENDER_SCORE_MISS 2 +// Redundant with the above. Reversed +enum { + PROXIMITY_MISS, + PROXIMITY_GOOD, + PROXIMITY_BEST, +}; -#define BLENDER_MAX_PLAYERS 4 -#define BLENDER_SCORES_NO 3 +enum { + SCOREANIM_GOOD, + SCOREANIM_MISS, + SCOREANIM_BEST_FLASH, + SCOREANIM_BEST_STATIC, +}; -enum -{ - PLAY_AGAIN_OK, - DONT_PLAY_AGAIN, +enum { + PLAY_AGAIN_YES, + PLAY_AGAIN_NO, CANT_PLAY_NO_BERRIES, CANT_PLAY_NO_PKBLCK_SPACE }; +enum { + BLENDER_MISTER, + BLENDER_LADDIE, + BLENDER_LASSIE, + BLENDER_MASTER, + BLENDER_DUDE, + BLENDER_MISS +}; + +#define BLENDER_MAX_PLAYERS MAX_LINK_PLAYERS + +#define NO_PLAYER 0xFF + +#define MAX_PROGRESS_BAR 1000 + +#define MAX_ARROW_POS 0x10000 // By virtue of being u16 +#define MIN_ARROW_SPEED 0x80 +#define ARROW_FALL_ROTATION 0x5800 // The amount the arrow spins as it falls in at the start + +// Tile offsets +#define PROGRESS_BAR_FILLED_TOP 0x80E9 +#define PROGRESS_BAR_FILLED_BOTTOM 0x80F9 +#define PROGRESS_BAR_EMPTY_TOP 0x80E1 +#define PROGRESS_BAR_EMPTY_BOTTOM 0x80F1 +#define RPM_DIGIT 0x8072 + +// Tile and palette tags +#define GFXTAG_COUNTDOWN_NUMBERS 12345 +#define GFXTAG_START 12346 +#define GFXTAG_PARTICLES 23456 +#define GFXTAG_PLAYER_ARROW 46545 +#define GFXTAG_SCORE_SYMBOLS 48888 + +#define PALTAG_PLAYER_ARROW 12312 +#define PALTAG_MISC 46546 + +// Last berry that an NPC can put in +#define NUM_NPC_BERRIES ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) + struct BlenderBerry { u16 itemId; u8 name[BERRY_NAME_LENGTH + 1]; - u8 flavors[FLAVOR_COUNT]; - u8 smoothness; + u8 flavors[FLAVOR_COUNT + 1]; // 5 flavors, + 1 for feel }; struct TimeAndRPM { u32 time; - u16 max_RPM; + u16 maxRPM; }; struct BlenderGameBlock { struct TimeAndRPM timeRPM; - u16 scores[BLENDER_MAX_PLAYERS][BLENDER_SCORES_NO]; + u16 scores[BLENDER_MAX_PLAYERS][NUM_SCORE_TYPES]; }; struct TvBlenderStruct @@ -82,138 +134,122 @@ struct TvBlenderStruct u8 pokeblockSheen; }; -struct BerryBlenderData +struct BerryBlender { u8 mainState; u8 loadGfxState; - u8 unused_02[0x42]; - u16 field_44; - u8 scoreIconIds[BLENDER_SCORES_NO]; + u8 unused0[66]; + u16 unk0; // never read + u8 scoreIconIds[NUM_SCORE_TYPES]; u16 arrowPos; - s16 field_4C; - u16 max_RPM; - u8 syncArrowSpriteIds[BLENDER_MAX_PLAYERS]; - u8 syncArrowSprite2Ids[BLENDER_MAX_PLAYERS]; - u8 unused_57[0xB]; + s16 speed; + u16 maxRPM; + u8 playerArrowSpriteIds[BLENDER_MAX_PLAYERS]; + u8 playerArrowSpriteIds2[BLENDER_MAX_PLAYERS]; + u8 unused1[11]; u8 gameEndState; - u16 field_64[BLENDER_MAX_PLAYERS]; - u16 field_6C; - u16 field_6E; + u16 playerContinueResponses[BLENDER_MAX_PLAYERS]; + u16 canceledPlayerCmd; + u16 canceledPlayerId; u16 playAgainState; - u8 field_72; + u8 slowdownTimer; u16 chosenItemId[BLENDER_MAX_PLAYERS]; - u8 playersNo; - u8 unused_7D[0x10]; - u16 field_8E[BLENDER_MAX_PLAYERS]; - u16 field_96[BLENDER_MAX_PLAYERS]; + u8 numPlayers; + u8 unused2[16]; + u16 arrowIdToPlayerId[BLENDER_MAX_PLAYERS]; + u16 playerIdToArrowId[BLENDER_MAX_PLAYERS]; u8 yesNoAnswer; u8 stringVar[100]; u32 gameFrameTime; s32 framesToWait; - u32 field_10C; - u8 unused_110[4]; - u8 field_114; - u16 field_116; - u16 field_118; - u16 field_11A; + u32 unk1; // never read + u8 unused3[4]; + u8 playerToThrowBerry; + u16 progressBarValue; + u16 maxProgressBarValue; + u16 centerScale; s16 bg_X; s16 bg_Y; - u8 field_120[3]; - u8 field_123; - u16 scores[BLENDER_MAX_PLAYERS][BLENDER_SCORES_NO]; + u8 opponentTaskIds[BLENDER_MAX_PLAYERS - 1]; + u8 perfectOpponents; // for debugging, NPCs will always hit Best + u16 scores[BLENDER_MAX_PLAYERS][NUM_SCORE_TYPES]; u8 playerPlaces[BLENDER_MAX_PLAYERS]; struct BgAffineSrcData bgAffineSrc; - u16 field_154; + u16 savedMusic; struct BlenderBerry blendedBerries[BLENDER_MAX_PLAYERS]; struct TimeAndRPM smallBlock; - u32 field_1A0; - u8 field_1A4; + u32 linkPlayAgainState; + u8 ownRanking; struct TvBlenderStruct tvBlender; - u8 tilemapBuffers[2][0x800]; + u8 tilemapBuffers[2][BG_SCREEN_SIZE]; s16 textState; void *tilesBuffer; struct BlenderGameBlock gameBlock; }; -extern struct MusicPlayerInfo gMPlayInfo_SE2; -extern struct MusicPlayerInfo gMPlayInfo_BGM; - -// text -extern const u8 gText_SavingDontTurnOff2[]; -extern const u8 gText_Space[]; -extern const u8 gText_BlenderMaxSpeedRecord[]; -extern const u8 gText_234Players[]; - -// this file's functions -static void BerryBlender_SetBackgroundsPos(void); -static void sub_8080EA4(u8 taskId); -static void sub_8080FD0(u8 taskId); -static void sub_80810F8(u8 taskId); -static void sub_8081224(u8 taskId); -static void sub_8083F3C(u8 taskId); -static void sub_80833F8(struct Sprite *sprite); -static void sub_8082F68(struct Sprite *sprite); -static void sub_8083010(struct Sprite *sprite); -static void sub_80830C0(struct Sprite *sprite); -static void sub_8082F9C(struct Sprite *sprite); -static void Blender_SetPlayerNamesLocal(u8 opponentsNum); -static void sub_807FAC8(void); -static void sub_8082D28(void); -static bool32 Blender_PrintText(s16 *textState, const u8 *string, s32 textSpeed); -static void sub_807FFA4(void); -static void sub_8080018(void); -static void sub_80808D4(void); -static void Blender_DummiedOutFunc(s16 a0, s16 a1); -static void sub_8081898(void); -static void sub_8082CB4(struct BgAffineSrcData *bgAffineSrc); -static bool8 sub_8083380(void); -static void sub_808074C(void); -static void Blender_PrintPlayerNames(void); -static void sub_8080588(void); -static void Blender_SetParticipantBerryData(u8 participantId, u16 itemId); -static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s32 speed, s32 caseId); -static void sub_8080DF8(void); -static void sub_8082E84(void); -static void sub_80832BC(s16* a0, u16 a1); -static void sub_8083140(u16 a0, u16 a2); -static void sub_8083230(u16 a0); -static void sub_808330C(void); -static void sub_8082AD4(void); -static void CB2_HandleBlenderEndGame(void); -static bool8 Blender_PrintBlendingRanking(void); -static bool8 Blender_PrintBlendingResults(void); -static void CB2_HandlePlayerPlayAgainChoice(void); -static void CB2_HandlePlayerLinkPlayAgainChoice(void); -static void sub_8083170(u16 a0, u16 a1); -static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst); -static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlenderStruct *a1); - -// EWRAM -EWRAM_DATA static struct BerryBlenderData *sBerryBlenderData = NULL; -EWRAM_DATA static s32 sUnknown_020322A8[5] = {0}; -EWRAM_DATA static s32 sUnknown_020322BC[5] = {0}; -EWRAM_DATA static u32 sUnknown_020322D0 = 0; - -// IWRAM bss -static s16 sUnknown_03000DE8[8]; -static s16 sUnknown_03000DF8[6]; -static s16 sUnknown_03000E04; -static s16 sUnknown_03000E06; - -// IWRAM common -u8 gInGameOpponentsNo; +static void SetBgPos(void); +static void Task_HandleOpponent1(u8); +static void Task_HandleOpponent2(u8); +static void Task_HandleOpponent3(u8); +static void Task_HandleBerryMaster(u8); +static void Task_PlayPokeblockFanfare(u8); +static void SpriteCB_PlayerArrow(struct Sprite *); +static void SpriteCB_ScoreSymbol(struct Sprite *); +static void SpriteCB_CountdownNumber(struct Sprite *); +static void SpriteCB_Start(struct Sprite *); +static void SpriteCB_ScoreSymbolBest(struct Sprite *); +static void InitLocalPlayers(u8); +static void CB2_LoadBerryBlender(void); +static void UpdateBlenderCenter(void); +static bool32 Blender_PrintText(s16 *, const u8 *, s32 ); +static void StartBlender(void); +static void CB2_StartBlenderLink(void); +static void CB2_StartBlenderLocal(void); +static void Blender_DummiedOutFunc(s16, s16); +static void CB2_PlayBlender(void); +static void DrawBlenderCenter(struct BgAffineSrcData *); +static bool8 UpdateBlenderLandScreenShake(void); +static void SetPlayerIdMaps(void); +static void PrintPlayerNames(void); +static void InitBlenderBgs(void); +static void SetPlayerBerryData(u8, u16); +static void Blender_AddTextPrinter(u8, const u8 *, u8, u8, s32, s32); +static void ResetLinkCmds(void); +static void CreateParticleSprites(void); +static void ShakeBgCoordForHit(s16*, u16); +static void TryUpdateProgressBar(u16, u16); +static void UpdateRPM(u16); +static void RestoreBgCoords(void); +static void ProcessLinkPlayerCmds(void); +static void CB2_EndBlenderGame(void); +static bool8 PrintBlendingRanking(void); +static bool8 PrintBlendingResults(void); +static void CB2_CheckPlayAgainLocal(void); +static void CB2_CheckPlayAgainLink(void); +static void UpdateProgressBar(u16, u16); +static void PrintMadePokeblockString(struct Pokeblock *, u8 *); +static bool32 TryAddContestLinkTvShow(struct Pokeblock *, struct TvBlenderStruct *); + +EWRAM_DATA static struct BerryBlender *sBerryBlender = NULL; +EWRAM_DATA static s32 sDebug_PokeblockFactorFlavors[FLAVOR_COUNT] = {0}; +EWRAM_DATA static s32 sDebug_PokeblockFactorFlavorsAfterRPM[FLAVOR_COUNT] = {0}; +EWRAM_DATA static u32 sDebug_PokeblockFactorRPM = 0; + +static s16 sPokeblockFlavors[FLAVOR_COUNT + 1]; // + 1 for feel +static s16 sPokeblockPresentFlavors[FLAVOR_COUNT + 1]; +static s16 sDebug_MaxRPMStage; +static s16 sDebug_GameTimeStage; -// rom +u8 gInGameOpponentsNo; -static const u16 sBlenderCenterPal[] = INCBIN_U16("graphics/berry_blender/center.gbapal"); -static const u8 sBlenderCenterMap[] = INCBIN_U8("graphics/berry_blender/center_map.bin"); -static const u16 sBlenderOuterPal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal"); +static const u16 sBlenderCenter_Pal[] = INCBIN_U16("graphics/berry_blender/center.gbapal"); +static const u8 sBlenderCenter_Tilemap[] = INCBIN_U8("graphics/berry_blender/center_map.bin"); +static const u16 sBlenderOuter_Pal[] = INCBIN_U16("graphics/berry_blender/outer.gbapal"); -// unreferenced pals? -static const u16 sUnknownPal_0[] = INCBIN_U16("graphics/unknown/unknown_339514.gbapal"); -static const u16 sUnknownArray_1[224] = {0}; +static const u16 sUnused_Pal[] = INCBIN_U16("graphics/berry_blender/unused.gbapal"); +static const u16 sEmpty_Pal[16 * 14] = {0}; -// unused text? +// unused text static const u8 sUnusedText_YesNo[] = _("YES\nNO"); static const u8 sUnusedText_2[] = _("▶"); static const u8 sUnusedText_Space[] = _(" "); @@ -232,22 +268,12 @@ static const u8 sText_Miss[] = _("MISS"); static const u8* const sBlenderOpponentsNames[] = { - sText_Mister, - sText_Laddie, - sText_Lassie, - sText_Master, - sText_Dude, - sText_Miss -}; - -enum -{ - BLENDER_MISTER, - BLENDER_LADDIE, - BLENDER_LASSIE, - BLENDER_MASTER, - BLENDER_DUDE, - BLENDER_MISS + [BLENDER_MISTER] = sText_Mister, + [BLENDER_LADDIE] = sText_Laddie, + [BLENDER_LASSIE] = sText_Lassie, + [BLENDER_MASTER] = sText_Master, + [BLENDER_DUDE] = sText_Dude, + [BLENDER_MISS] = sText_Miss }; static const u8 sText_PressAToStart[] = _("Press the A Button to start."); @@ -274,7 +300,7 @@ static const u8 sText_TheLevelIs[] = _("The level is "); static const u8 sText_TheFeelIs[] = _(", and the feel is "); static const u8 sText_Dot2[] = _("."); -static const struct BgTemplate sBerryBlenderBgTemplates[3] = +static const struct BgTemplate sBgTemplates[3] = { { .bg = 0, @@ -305,7 +331,7 @@ static const struct BgTemplate sBerryBlenderBgTemplates[3] = } }; -static const struct WindowTemplate sBerryBlender_WindowTemplates[] = +static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, @@ -364,7 +390,7 @@ static const struct WindowTemplate sBerryBlender_WindowTemplates[] = DUMMY_WIN_TEMPLATE }; -static const struct WindowTemplate sBlender_YesNoWindowTemplate = +static const struct WindowTemplate sYesNoWindowTemplate_ContinuePlaying = { .bg = 0, .tilemapLeft = 21, @@ -375,31 +401,58 @@ static const struct WindowTemplate sBlender_YesNoWindowTemplate = .baseBlock = 0xCC }; -static const s8 sUnknown_083399C0[][2] = +static const s8 sPlayerArrowQuadrant[BLENDER_MAX_PLAYERS][2] = { - {-1, -1}, {1, -1}, {-1, 1}, {1, 1} + {-1, -1}, + { 1, -1}, + {-1, 1}, + { 1, 1} }; -static const u8 sBlenderSyncArrowsPos[BLENDER_MAX_PLAYERS][2] = +static const u8 sPlayerArrowPos[BLENDER_MAX_PLAYERS][2] = { - {72, 32}, {168, 32}, {72, 128}, {168, 128} + { 72, 32}, + {168, 32}, + { 72, 128}, + {168, 128} }; -static const u8 sUnknown_083399D0[3][4] = +static const u8 sPlayerIdMap[BLENDER_MAX_PLAYERS - 1][BLENDER_MAX_PLAYERS] = { - {-1, 0, 1, -1}, {-1, 0, 1, 2}, {0, 1, 2, 3} + {NO_PLAYER, 0, 1, NO_PLAYER}, // 2 Players + {NO_PLAYER, 0, 1, 2}, // 3 Players + { 0, 1, 2, 3} // 4 Players }; -static const u16 sUnknown_083399DC[] = {0, 0xC000, 0x4000, 0x8000}; -static const u8 sUnknown_083399E4[] = {1, 1, 0}; -static const u8 sUnknown_083399E7[] = {32, 224, 96, 160, 0}; -static const TaskFunc sUnknown_083399EC[] = +// Blender arrow positions: +// +// 0x0000 (limit 0x10000) +// . . +// . . +// 0x4000 . . 0xC000 +// . . +// . . +// . . +// 0x8000 +// +static const u16 sArrowStartPos[] = { + 0, + MAX_ARROW_POS / 4 * 3, // 0xC000 + MAX_ARROW_POS / 4, // 0x4000 + MAX_ARROW_POS / 4 * 2 // 0x8000 +}; +static const u8 sArrowStartPosIds[BLENDER_MAX_PLAYERS - 1] = {1, 1, 0}; +static const u8 sArrowHitRangeStart[BLENDER_MAX_PLAYERS] = {32, 224, 96, 160}; + +static const TaskFunc sLocalOpponentTasks[] = { - sub_8080EA4, sub_8080FD0, sub_80810F8 + Task_HandleOpponent1, + Task_HandleOpponent2, + Task_HandleOpponent3 }; -static const struct OamData sOamData_8216314 = +static const struct OamData sOam_PlayerArrow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -416,40 +469,40 @@ static const struct OamData sOamData_8216314 = .affineParam = 0, }; -static const union AnimCmd sSpriteAnim_821631C[] = +static const union AnimCmd sAnim_PlayerArrow_TopLeft[] = { - ANIMCMD_FRAME(16, 5, 1, 1), + ANIMCMD_FRAME(16, 5, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216324[] = +static const union AnimCmd sAnim_PlayerArrow_TopRight[] = { ANIMCMD_FRAME(16, 5, .vFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_821632C[] = +static const union AnimCmd sAnim_PlayerArrow_BottomLeft[] = { ANIMCMD_FRAME(16, 5, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216334[] = +static const union AnimCmd sAnim_PlayerArrow_BottomRight[] = { ANIMCMD_FRAME(16, 5, 0, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_821633C[] = +static const union AnimCmd sAnim_PlayerArrow_TopLeft_Flash[] = { - ANIMCMD_FRAME(48, 2, 1, 1), - ANIMCMD_FRAME(32, 5, 1, 1), - ANIMCMD_FRAME(48, 3, 1, 1), - ANIMCMD_FRAME(16, 5, 1, 1), + ANIMCMD_FRAME(48, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 5, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(48, 3, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(16, 5, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216350[] = +static const union AnimCmd sAnim_PlayerArrow_TopRight_Flash[] = { ANIMCMD_FRAME(48, 2, .vFlip = TRUE), ANIMCMD_FRAME(32, 5, .vFlip = TRUE), @@ -458,7 +511,7 @@ static const union AnimCmd sSpriteAnim_8216350[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216364[] = +static const union AnimCmd sAnim_PlayerArrow_BottomLeft_Flash[] = { ANIMCMD_FRAME(48, 2, .hFlip = TRUE), ANIMCMD_FRAME(32, 5, .hFlip = TRUE), @@ -467,7 +520,7 @@ static const union AnimCmd sSpriteAnim_8216364[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216378[] = +static const union AnimCmd sAnim_PlayerArrow_BottomRight_Flash[] = { ANIMCMD_FRAME(48, 2, 0, 0), ANIMCMD_FRAME(32, 5, 0, 0), @@ -476,73 +529,73 @@ static const union AnimCmd sSpriteAnim_8216378[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_821638C[] = +static const union AnimCmd sAnim_PlayerArrow_TopLeft_Off[] = { - ANIMCMD_FRAME(0, 5, 1, 1), + ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216394[] = +static const union AnimCmd sAnim_PlayerArrow_TopRight_Off[] = { ANIMCMD_FRAME(0, 5, .vFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_821639C[] = +static const union AnimCmd sAnim_PlayerArrow_BottomLeft_Off[] = { ANIMCMD_FRAME(0, 5, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82163A4[] = +static const union AnimCmd sAnim_PlayerArrow_BottomRight_Off[] = { ANIMCMD_FRAME(0, 5, 0, 0), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_82163AC[] = +static const union AnimCmd *const sAnims_PlayerArrow[] = { - sSpriteAnim_821631C, - sSpriteAnim_8216324, - sSpriteAnim_821632C, - sSpriteAnim_8216334, - sSpriteAnim_821633C, - sSpriteAnim_8216350, - sSpriteAnim_8216364, - sSpriteAnim_8216378, - sSpriteAnim_821638C, - sSpriteAnim_8216394, - sSpriteAnim_821639C, - sSpriteAnim_82163A4 + sAnim_PlayerArrow_TopLeft, + sAnim_PlayerArrow_TopRight, + sAnim_PlayerArrow_BottomLeft, + sAnim_PlayerArrow_BottomRight, + sAnim_PlayerArrow_TopLeft_Flash, + sAnim_PlayerArrow_TopRight_Flash, + sAnim_PlayerArrow_BottomLeft_Flash, + sAnim_PlayerArrow_BottomRight_Flash, + sAnim_PlayerArrow_TopLeft_Off, + sAnim_PlayerArrow_TopRight_Off, + sAnim_PlayerArrow_BottomLeft_Off, + sAnim_PlayerArrow_BottomRight_Off }; -static const struct SpriteSheet sSpriteSheet_BlenderArrow = +static const struct SpriteSheet sSpriteSheet_PlayerArrow = { - gBerryBlenderArrowTiles, 0x800, 46545 + gBerryBlenderPlayerArrow_Gfx, 0x800, GFXTAG_PLAYER_ARROW }; static const struct SpritePalette sSpritePal_BlenderMisc = { - gBerryBlenderMiscPalette, 46546 + gBerryBlenderMiscPalette, PALTAG_MISC }; -static const struct SpritePalette sSpritePal_BlenderArrow = +static const struct SpritePalette sSpritePal_PlayerArrow = { - gBerryBlenderArrowPalette, 12312 + gBerryBlenderArrowPalette, PALTAG_PLAYER_ARROW }; -static const struct SpriteTemplate sBlenderSyncArrow_SpriteTemplate = +static const struct SpriteTemplate sSpriteTemplate_PlayerArrow = { - .tileTag = 46545, - .paletteTag = 12312, - .oam = &sOamData_8216314, - .anims = sSpriteAnimTable_82163AC, + .tileTag = GFXTAG_PLAYER_ARROW, + .paletteTag = PALTAG_PLAYER_ARROW, + .oam = &sOam_PlayerArrow, + .anims = sAnims_PlayerArrow, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80833F8 + .callback = SpriteCB_PlayerArrow }; -static const struct OamData sOamData_821640C = +static const struct OamData sOam_ScoreSymbols = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -559,19 +612,19 @@ static const struct OamData sOamData_821640C = .affineParam = 0, }; -static const union AnimCmd sSpriteAnim_8216414[] = +static const union AnimCmd sAnim_ScoreSymbols_Good[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_821641C[] = +static const union AnimCmd sAnim_ScoreSymbols_Miss[] = { ANIMCMD_FRAME(4, 20, 1, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216424[] = +static const union AnimCmd sAnim_ScoreSymbols_BestFlash[] = { ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(12, 4), @@ -581,37 +634,37 @@ static const union AnimCmd sSpriteAnim_8216424[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_821643C[] = +static const union AnimCmd sAnim_ScoreSymbols_BestStatic[] = { ANIMCMD_FRAME(8, 4), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_8216444[] = +static const union AnimCmd *const sAnims_ScoreSymbols[] = { - sSpriteAnim_8216414, - sSpriteAnim_821641C, - sSpriteAnim_8216424, - sSpriteAnim_821643C, + [SCOREANIM_GOOD] = sAnim_ScoreSymbols_Good, + [SCOREANIM_MISS] = sAnim_ScoreSymbols_Miss, + [SCOREANIM_BEST_FLASH] = sAnim_ScoreSymbols_BestFlash, + [SCOREANIM_BEST_STATIC] = sAnim_ScoreSymbols_BestStatic, }; -static const struct SpriteSheet sUnknown_08339B38 = +static const struct SpriteSheet sSpriteSheet_ScoreSymbols = { - gBerryBlenderMarubatsuTiles, 0x200, 48888 + gBerryBlenderScoreSymbols_Gfx, 0x200, GFXTAG_SCORE_SYMBOLS }; -static const struct SpriteTemplate sUnknown_08339B40 = +static const struct SpriteTemplate sSpriteTemplate_ScoreSymbols = { - .tileTag = 48888, - .paletteTag = 46546, - .oam = &sOamData_821640C, - .anims = sSpriteAnimTable_8216444, + .tileTag = GFXTAG_SCORE_SYMBOLS, + .paletteTag = PALTAG_MISC, + .oam = &sOam_ScoreSymbols, + .anims = sAnims_ScoreSymbols, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8082F68 + .callback = SpriteCB_ScoreSymbol }; -static const struct OamData sOamData_8216474 = +static const struct OamData sOam_Particles = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -628,7 +681,7 @@ static const struct OamData sOamData_8216474 = .affineParam = 0, }; -static const union AnimCmd sSpriteAnim_821647C[] = +static const union AnimCmd sAnim_SparkleCrossToX[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(1, 4), @@ -638,7 +691,7 @@ static const union AnimCmd sSpriteAnim_821647C[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216494[] = +static const union AnimCmd sAnim_SparkleXToCross[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(2, 4), @@ -648,7 +701,7 @@ static const union AnimCmd sSpriteAnim_8216494[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82164AC[] = +static const union AnimCmd sAnim_SparkleFull[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(1, 2), @@ -661,44 +714,44 @@ static const union AnimCmd sSpriteAnim_82164AC[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82164D0[] = +static const union AnimCmd sAnim_GreenArrow[] = { ANIMCMD_FRAME(5, 5, 1, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82164D8[] = +static const union AnimCmd sAnim_GreenDot[] = { ANIMCMD_FRAME(6, 5, 1, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_82164E0[] = +static const union AnimCmd *const sAnims_Particles[] = { - sSpriteAnim_821647C, - sSpriteAnim_8216494, - sSpriteAnim_82164AC, - sSpriteAnim_82164D0, - sSpriteAnim_82164D8, + sAnim_SparkleCrossToX, // Only this effect is ever used, rest go unused + sAnim_SparkleXToCross, + sAnim_SparkleFull, + sAnim_GreenArrow, + sAnim_GreenDot, }; -static const struct SpriteSheet sUnknown_08339BD8 = +static const struct SpriteSheet sSpriteSheet_Particles = { - gBerryBlenderParticlesTiles, 0xE0, 23456 + gBerryBlenderParticles_Gfx, 0xE0, GFXTAG_PARTICLES }; -static const struct SpriteTemplate sUnknown_08339BE0 = +static const struct SpriteTemplate sSpriteTemplate_Particles = { - .tileTag = 23456, - .paletteTag = 46546, - .oam = &sOamData_8216474, - .anims = sSpriteAnimTable_82164E0, + .tileTag = GFXTAG_PARTICLES, + .paletteTag = PALTAG_MISC, + .oam = &sOam_Particles, + .anims = sAnims_Particles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct OamData sOamData_8216514 = +static const struct OamData sOam_CountdownNumbers = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -715,48 +768,48 @@ static const struct OamData sOamData_8216514 = .affineParam = 0, }; -static const union AnimCmd sSpriteAnim_821651C[] = +static const union AnimCmd sAnim_CountdownNumbers_3[] = { ANIMCMD_FRAME(32, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8216524[] = +static const union AnimCmd sAnim_CountdownNumbers_2[] = { ANIMCMD_FRAME(16, 30), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_821652C[] = +static const union AnimCmd sAnim_CountdownNumbers_1[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_8216534[] = +static const union AnimCmd *const sAnims_CountdownNumbers[] = { - sSpriteAnim_821651C, - sSpriteAnim_8216524, - sSpriteAnim_821652C, + sAnim_CountdownNumbers_3, + sAnim_CountdownNumbers_2, + sAnim_CountdownNumbers_1, }; -static const struct SpriteSheet sUnknown_08339C24 = +static const struct SpriteSheet sSpriteSheet_CountdownNumbers = { - gBerryBlenderCountdownNumbersTiles, 0x600, 12345 + gBerryBlenderCountdownNumbers_Gfx, 0x600, GFXTAG_COUNTDOWN_NUMBERS }; -static const struct SpriteTemplate sUnknown_08339C2C = +static const struct SpriteTemplate sSpriteTemplate_CountdownNumbers = { - .tileTag = 12345, - .paletteTag = 46546, - .oam = &sOamData_8216514, - .anims = sSpriteAnimTable_8216534, + .tileTag = GFXTAG_COUNTDOWN_NUMBERS, + .paletteTag = PALTAG_MISC, + .oam = &sOam_CountdownNumbers, + .anims = sAnims_CountdownNumbers, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8083010 + .callback = SpriteCB_CountdownNumber }; -static const struct OamData sOamData_8216560 = +static const struct OamData sOam_Start = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -773,34 +826,36 @@ static const struct OamData sOamData_8216560 = .affineParam = 0, }; -static const union AnimCmd sSpriteAnim_8216568[] = +static const union AnimCmd sAnim_Start[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_8216570[] = +static const union AnimCmd *const sAnims_Start[] = { - sSpriteAnim_8216568, + sAnim_Start, }; -static const struct SpriteSheet sUnknown_08339C58 = +static const struct SpriteSheet sSpriteSheet_Start = { - gBerryBlenderStartTiles, 0x400, 12346 + gBerryBlenderStart_Gfx, 0x400, GFXTAG_START }; -static const struct SpriteTemplate sUnknown_08339C60 = +static const struct SpriteTemplate sSpriteTemplate_Start = { - .tileTag = 12346, - .paletteTag = 46546, - .oam = &sOamData_8216560, - .anims = sSpriteAnimTable_8216570, + .tileTag = GFXTAG_START, + .paletteTag = PALTAG_MISC, + .oam = &sOam_Start, + .anims = sAnims_Start, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80830C0 + .callback = SpriteCB_Start }; -static const s16 sUnknown_08339C78[][5] = +// Data for throwing the berries in at the start +// x, y, bounce speed, x speed, y speed +static const s16 sBerrySpriteData[][5] = { {-10, 20, 10, 2, 1}, {250, 20, 10, -2, 1}, @@ -808,18 +863,54 @@ static const s16 sUnknown_08339C78[][5] = {250, 140, 10, -2, -1}, }; -static const u8 sOpponentBerrySets[][3] = -{ - {4, 3, 2}, {0, 4, 3}, {1, 0, 4}, {2, 1, 0}, {3, 2, 1}, {0, 2, 3}, {1, 3, 4}, {2, 4, 0}, {3, 0, 1}, {4, 1, 2}, -}; - -static const u8 sSpecialOpponentBerrySets[] = {30, 31, 32, 33, 34}; - -static const u8 sUnknown_08339CC3[] = {1, 1, 2, 3, 4}; - -static const u8 sUnknown_08339CC8[] = {0x1C, 0x16, 0x13, 0x1A, 0x19, 0x0E, 0x0D, 0x0B, 0x07, 0x15}; - -static const u8 sUnknown_08339CD2[] = +// There are only 5 different berries the NPCs will ever use +// Each of these sets represents 3 berries chosen to be used by the NPCs +// If the player's berry is one of the 5 possible berries, a set is chosen that excludes it +static const u8 sOpponentBerrySets[NUM_NPC_BERRIES * 2][3] = +{ + // These sets are used if the player chose one of the 5 NPC berries + {ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) - 1, ITEM_TO_BERRY(ITEM_RAWST_BERRY) - 1, ITEM_TO_BERRY(ITEM_PECHA_BERRY) - 1}, // player chose Cheri Berry + {ITEM_TO_BERRY(ITEM_CHERI_BERRY) - 1, ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) - 1, ITEM_TO_BERRY(ITEM_RAWST_BERRY) - 1}, // player chose Chesto Berry + {ITEM_TO_BERRY(ITEM_CHESTO_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHERI_BERRY) - 1, ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) - 1}, // player chose Pecha Berry + {ITEM_TO_BERRY(ITEM_PECHA_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHESTO_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHERI_BERRY) - 1}, // player chose Rawst Berry + {ITEM_TO_BERRY(ITEM_RAWST_BERRY) - 1, ITEM_TO_BERRY(ITEM_PECHA_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHESTO_BERRY) - 1}, // player chose Aspear Berry + + // These sets are used if the player chose a different berry (set is selected by player's berry % 5) + {ITEM_TO_BERRY(ITEM_CHERI_BERRY) - 1, ITEM_TO_BERRY(ITEM_PECHA_BERRY) - 1, ITEM_TO_BERRY(ITEM_RAWST_BERRY) - 1}, // player chose Leppa, Figy, ... + {ITEM_TO_BERRY(ITEM_CHESTO_BERRY) - 1, ITEM_TO_BERRY(ITEM_RAWST_BERRY) - 1, ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) - 1}, // player chose Oran, Wiki, ... + {ITEM_TO_BERRY(ITEM_PECHA_BERRY) - 1, ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHERI_BERRY) - 1}, // player chose Persim, Mago, ... + {ITEM_TO_BERRY(ITEM_RAWST_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHERI_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHESTO_BERRY) - 1}, // player chose Lum, Aguav, ... + {ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) - 1, ITEM_TO_BERRY(ITEM_CHESTO_BERRY) - 1, ITEM_TO_BERRY(ITEM_PECHA_BERRY) - 1}, // player chose Sitrus, Iapapa, ... +}; + +// Berry master's berries follow the same rules as above, but instead of explicitly listing +// the alternate sets if the player chooses one of these berries, it implicitly uses these berries - 5, i.e. Tamato - Nomel +static const u8 sBerryMasterBerries[] = { + ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1, + ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1, + ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1, + ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1, + ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1 +}; + +// "0 players" is link +static const u8 sNumPlayersToSpeedDivisor[] = {1, 1, 2, 3, 4}; + +// Black pokeblocks will use one of these random combinations of flavors +static const u8 sBlackPokeblockFlavorFlags[] = { + (1 << FLAVOR_SOUR) | (1 << FLAVOR_BITTER) | (1 << FLAVOR_SWEET), + (1 << FLAVOR_SOUR) | (1 << FLAVOR_SWEET) | (1 << FLAVOR_DRY), + (1 << FLAVOR_SOUR) | (1 << FLAVOR_DRY) | (1 << FLAVOR_SPICY), + (1 << FLAVOR_SOUR) | (1 << FLAVOR_BITTER) | (1 << FLAVOR_DRY), + (1 << FLAVOR_SOUR) | (1 << FLAVOR_BITTER) | (1 << FLAVOR_SPICY), + (1 << FLAVOR_BITTER) | (1 << FLAVOR_SWEET) | (1 << FLAVOR_DRY), + (1 << FLAVOR_BITTER) | (1 << FLAVOR_SWEET) | (1 << FLAVOR_SPICY), + (1 << FLAVOR_BITTER) | (1 << FLAVOR_DRY) | (1 << FLAVOR_SPICY), + (1 << FLAVOR_SWEET) | (1 << FLAVOR_DRY) | (1 << FLAVOR_SPICY), + (1 << FLAVOR_SOUR) | (1 << FLAVOR_SWEET) | (1 << FLAVOR_SPICY), +}; + +static const u8 sUnused[] = { 0xfe, 0x02, 0x02, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f, 0x0c, 0x10, 0x00, 0xff, 0xfe, 0x91, 0x72, 0xce, 0xd0, 0x37, 0x44, 0x07, 0x1f, @@ -840,20 +931,18 @@ static const struct WindowTemplate sBlenderRecordWindowTemplate = .baseBlock = 8 }; -// code - -static void Blender_ControlHitPitch(void) +static void UpdateHitPitch(void) { - m4aMPlayPitchControl(&gMPlayInfo_SE2, 0xFFFF, 2 * (sBerryBlenderData->field_4C - 128)); + m4aMPlayPitchControl(&gMPlayInfo_SE2, 0xFFFF, 2 * (sBerryBlender->speed - MIN_ARROW_SPEED)); } -static void VBlankCB0_BerryBlender(void) +static void VBlankCB_BerryBlender(void) { - BerryBlender_SetBackgroundsPos(); - SetBgAffine(2, sBerryBlenderData->bgAffineSrc.texX, sBerryBlenderData->bgAffineSrc.texY, - sBerryBlenderData->bgAffineSrc.scrX, sBerryBlenderData->bgAffineSrc.scrY, - sBerryBlenderData->bgAffineSrc.sx, sBerryBlenderData->bgAffineSrc.sy, - sBerryBlenderData->bgAffineSrc.alpha); + SetBgPos(); + SetBgAffine(2, sBerryBlender->bgAffineSrc.texX, sBerryBlender->bgAffineSrc.texY, + sBerryBlender->bgAffineSrc.scrX, sBerryBlender->bgAffineSrc.scrY, + sBerryBlender->bgAffineSrc.sx, sBerryBlender->bgAffineSrc.sy, + sBerryBlender->bgAffineSrc.alpha); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); @@ -861,64 +950,64 @@ static void VBlankCB0_BerryBlender(void) static bool8 LoadBerryBlenderGfx(void) { - switch (sBerryBlenderData->loadGfxState) + switch (sBerryBlender->loadGfxState) { case 0: - sBerryBlenderData->tilesBuffer = AllocZeroed(GetDecompressedDataSize(sBlenderCenterGfx) + 100); - LZDecompressWram(sBlenderCenterGfx, sBerryBlenderData->tilesBuffer); - sBerryBlenderData->loadGfxState++; + sBerryBlender->tilesBuffer = AllocZeroed(GetDecompressedDataSize(gBerryBlenderCenter_Gfx) + 100); + LZDecompressWram(gBerryBlenderCenter_Gfx, sBerryBlender->tilesBuffer); + sBerryBlender->loadGfxState++; break; case 1: - CopyToBgTilemapBuffer(2, sBlenderCenterMap, 0x400, 0); + CopyToBgTilemapBuffer(2, sBlenderCenter_Tilemap, 0x400, 0); CopyBgTilemapBufferToVram(2); - LoadPalette(sBlenderCenterPal, 0, 0x100); - sBerryBlenderData->loadGfxState++; + LoadPalette(sBlenderCenter_Pal, 0, 0x100); + sBerryBlender->loadGfxState++; break; case 2: - LoadBgTiles(2, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(sBlenderCenterGfx), 0); - sBerryBlenderData->loadGfxState++; + LoadBgTiles(2, sBerryBlender->tilesBuffer, GetDecompressedDataSize(gBerryBlenderCenter_Gfx), 0); + sBerryBlender->loadGfxState++; break; case 3: - LZDecompressWram(gUnknown_08D91DB8, sBerryBlenderData->tilesBuffer); - sBerryBlenderData->loadGfxState++; + LZDecompressWram(gBerryBlenderOuter_Gfx, sBerryBlender->tilesBuffer); + sBerryBlender->loadGfxState++; break; case 4: - LoadBgTiles(1, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(gUnknown_08D91DB8), 0); - sBerryBlenderData->loadGfxState++; + LoadBgTiles(1, sBerryBlender->tilesBuffer, GetDecompressedDataSize(gBerryBlenderOuter_Gfx), 0); + sBerryBlender->loadGfxState++; break; case 5: - LZDecompressWram(gUnknown_08D927EC, sBerryBlenderData->tilesBuffer); - sBerryBlenderData->loadGfxState++; + LZDecompressWram(gBerryBlenderOuter_Tilemap, sBerryBlender->tilesBuffer); + sBerryBlender->loadGfxState++; break; case 6: - CopyToBgTilemapBuffer(1, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(gUnknown_08D927EC), 0); + CopyToBgTilemapBuffer(1, sBerryBlender->tilesBuffer, GetDecompressedDataSize(gBerryBlenderOuter_Tilemap), 0); CopyBgTilemapBufferToVram(1); - sBerryBlenderData->loadGfxState++; + sBerryBlender->loadGfxState++; break; case 7: - LoadPalette(sBlenderOuterPal, 0x80, 0x20); - sBerryBlenderData->loadGfxState++; + LoadPalette(sBlenderOuter_Pal, 0x80, 0x20); + sBerryBlender->loadGfxState++; break; case 8: - LoadSpriteSheet(&sSpriteSheet_BlenderArrow); - LoadSpriteSheet(&sUnknown_08339BD8); - LoadSpriteSheet(&sUnknown_08339B38); - sBerryBlenderData->loadGfxState++; + LoadSpriteSheet(&sSpriteSheet_PlayerArrow); + LoadSpriteSheet(&sSpriteSheet_Particles); + LoadSpriteSheet(&sSpriteSheet_ScoreSymbols); + sBerryBlender->loadGfxState++; break; case 9: - LoadSpriteSheet(&sUnknown_08339C24); - LoadSpriteSheet(&sUnknown_08339C58); - LoadSpritePalette(&sSpritePal_BlenderArrow); + LoadSpriteSheet(&sSpriteSheet_CountdownNumbers); + LoadSpriteSheet(&sSpriteSheet_Start); + LoadSpritePalette(&sSpritePal_PlayerArrow); LoadSpritePalette(&sSpritePal_BlenderMisc); - Free(sBerryBlenderData->tilesBuffer); - sBerryBlenderData->loadGfxState = 0; + Free(sBerryBlender->tilesBuffer); + sBerryBlender->loadGfxState = 0; return TRUE; } return FALSE; } -static void sub_807F9D0(void) +static void DrawBlenderBg(void) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14); CopyBgTilemapBufferToVram(0); @@ -933,7 +1022,7 @@ static void sub_807F9D0(void) static void InitBerryBlenderWindows(void) { - if (InitWindows(sBerryBlender_WindowTemplates)) + if (InitWindows(sWindowTemplates)) { s32 i; @@ -946,24 +1035,27 @@ static void InitBerryBlenderWindows(void) } } +// gSpecialVar_0x8004 is the number of NPC opponents +// Set to 0 indicates it's a link blender void DoBerryBlending(void) { - if (sBerryBlenderData == NULL) - sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData)); + if (sBerryBlender == NULL) + sBerryBlender = AllocZeroed(sizeof(*sBerryBlender)); - sBerryBlenderData->gameEndState = 0; - sBerryBlenderData->mainState = 0; - sBerryBlenderData->gameEndState = 0; + sBerryBlender->gameEndState = 0; + sBerryBlender->mainState = 0; + sBerryBlender->gameEndState = 0; - Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); - SetMainCallback2(sub_807FAC8); + InitLocalPlayers(gSpecialVar_0x8004); + SetMainCallback2(CB2_LoadBerryBlender); } -static void sub_807FAC8(void) +// Show the blender screen initially and prompt to choose a berry +static void CB2_LoadBerryBlender(void) { s32 i; - switch (sBerryBlenderData->mainState) + switch (sBerryBlender->mainState) { case 0: SetGpuReg(REG_OFFSET_DISPCNT, 0); @@ -971,68 +1063,69 @@ static void sub_807FAC8(void) FreeAllSpritePalettes(); SetVBlankCallback(NULL); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates)); - SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]); - SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]); + InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + SetBgTilemapBuffer(1, sBerryBlender->tilemapBuffers[0]); + SetBgTilemapBuffer(2, sBerryBlender->tilemapBuffers[1]); LoadUserWindowBorderGfx(0, 1, 0xD0); LoadMessageBoxGfx(0, 0x14, 0xF0); InitBerryBlenderWindows(); - sBerryBlenderData->mainState++; - sBerryBlenderData->field_118 = 0; - sBerryBlenderData->field_116 = 0; - sBerryBlenderData->field_11A = 0x50; - sBerryBlenderData->bg_X = 0; - sBerryBlenderData->bg_Y = 0; - sBerryBlenderData->loadGfxState = 0; + sBerryBlender->mainState++; + sBerryBlender->maxProgressBarValue = 0; + sBerryBlender->progressBarValue = 0; + sBerryBlender->centerScale = 80; + sBerryBlender->bg_X = 0; + sBerryBlender->bg_Y = 0; + sBerryBlender->loadGfxState = 0; - sub_8082D28(); + UpdateBlenderCenter(); break; case 1: if (LoadBerryBlenderGfx()) { for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - sBerryBlenderData->syncArrowSpriteIds[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); - StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[i]], i + 8); + sBerryBlender->playerArrowSpriteIds[i] = CreateSprite(&sSpriteTemplate_PlayerArrow, sPlayerArrowPos[i][0], sPlayerArrowPos[i][1], 1); + StartSpriteAnim(&gSprites[sBerryBlender->playerArrowSpriteIds[i]], i + 8); } - if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType) + if (gReceivedRemoteLinkPlayers && gWirelessCommType) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } - SetVBlankCallback(VBlankCB0_BerryBlender); - sBerryBlenderData->mainState++; + SetVBlankCallback(VBlankCB_BerryBlender); + sBerryBlender->mainState++; } break; case 2: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - sub_8082D28(); - sBerryBlenderData->mainState++; + UpdateBlenderCenter(); + sBerryBlender->mainState++; break; case 3: - sub_807F9D0(); + DrawBlenderBg(); if (!gPaletteFade.active) - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 4: - if (Blender_PrintText(&sBerryBlenderData->textState, sText_BerryBlenderStart, GetPlayerTextSpeedDelay())) - sBerryBlenderData->mainState++; + if (Blender_PrintText(&sBerryBlender->textState, sText_BerryBlenderStart, GetPlayerTextSpeedDelay())) + sBerryBlender->mainState++; break; case 5: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 6: if (!gPaletteFade.active) { + // Go to bag menu to choose berry, set callback to StartBlender FreeAllWindowBuffers(); UnsetBgTilemapBuffer(2); UnsetBgTilemapBuffer(1); SetVBlankCallback(NULL); - ChooseBerrySetCallback(sub_807FFA4); + ChooseBerryForMachine(StartBlender); - sBerryBlenderData->mainState = 0; + sBerryBlender->mainState = 0; } break; } @@ -1043,47 +1136,71 @@ static void sub_807FAC8(void) UpdatePaletteFade(); } -static void sub_807FD08(struct Sprite* sprite) +#define sTargetY data[0] +#define sX data[1] +#define sY data[2] +#define sBounceSpeed data[3] +#define sYUpSpeed data[4] +#define sBounces data[5] +#define sXSpeed data[6] +#define sYDownSpeed data[7] + +// For throwing berries into the machine +static void SpriteCB_Berry(struct Sprite* sprite) { - sprite->data[1] += sprite->data[6]; - sprite->data[2] -= sprite->data[4]; - sprite->data[2] += sprite->data[7]; - sprite->data[0] += sprite->data[7]; - sprite->data[4]--; + sprite->sX += sprite->sXSpeed; + sprite->sY -= sprite->sYUpSpeed; + sprite->sY += sprite->sYDownSpeed; + sprite->sTargetY += sprite->sYDownSpeed; + sprite->sYUpSpeed--; - if (sprite->data[0] < sprite->data[2]) + if (sprite->sTargetY < sprite->sY) { - sprite->data[3] = sprite->data[4] = sprite->data[3] - 1; + sprite->sBounceSpeed = sprite->sYUpSpeed = sprite->sBounceSpeed - 1; - if (++sprite->data[5] > 3) + if (++sprite->sBounces > 3) DestroySprite(sprite); else PlaySE(SE_BALL_TRAY_EXIT); } - sprite->pos1.x = sprite->data[1]; - sprite->pos1.y = sprite->data[2]; + sprite->pos1.x = sprite->sX; + sprite->pos1.y = sprite->sY; } -static void sub_807FD64(struct Sprite* sprite, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6) +static void SetBerrySpriteData(struct Sprite* sprite, s16 x, s16 y, s16 bounceSpeed, s16 xSpeed, s16 ySpeed) { - sprite->data[0] = a3; - sprite->data[1] = a2; - sprite->data[2] = a3; - sprite->data[3] = a4; - sprite->data[4] = 10; - sprite->data[5] = 0; - sprite->data[6] = a5; - sprite->data[7] = a6; - sprite->callback = sub_807FD08; + sprite->sTargetY = y; + sprite->sX = x; + sprite->sY = y; + sprite->sBounceSpeed = bounceSpeed; + sprite->sYUpSpeed = 10; + sprite->sBounces = 0; + sprite->sXSpeed = xSpeed; + sprite->sYDownSpeed = ySpeed; + sprite->callback = SpriteCB_Berry; } -static void sub_807FD90(u16 a0, u8 a1) +#undef sTargetY +#undef sX +#undef sY +#undef sBounceSpeed +#undef sYUpSpeed +#undef sBounces +#undef sXSpeed +#undef sYDownSpeed + +static void CreateBerrySprite(u16 a0, u8 playerId) { - u8 spriteId = LoadSpinningBerryPicGfx(a0 + 123, 0, 80, a1 & 1); - sub_807FD64(&gSprites[spriteId], sUnknown_08339C78[a1][0], sUnknown_08339C78[a1][1], sUnknown_08339C78[a1][2], sUnknown_08339C78[a1][3], sUnknown_08339C78[a1][4]); + u8 spriteId = CreateSpinningBerrySprite(a0 + FIRST_BERRY_INDEX - 10, 0, 80, playerId & 1); + SetBerrySpriteData(&gSprites[spriteId], + sBerrySpriteData[playerId][0], + sBerrySpriteData[playerId][1], + sBerrySpriteData[playerId][2], + sBerrySpriteData[playerId][3], + sBerrySpriteData[playerId][4]); } -static void Blender_CopyBerryData(struct BlenderBerry* berry, u16 itemId) +static void ConvertItemToBlenderBerry(struct BlenderBerry* berry, u16 itemId) { const struct Berry *berryInfo = GetBerryInfo(ITEM_TO_BERRY(itemId)); @@ -1094,19 +1211,19 @@ static void Blender_CopyBerryData(struct BlenderBerry* berry, u16 itemId) berry->flavors[FLAVOR_SWEET] = berryInfo->sweet; berry->flavors[FLAVOR_BITTER] = berryInfo->bitter; berry->flavors[FLAVOR_SOUR] = berryInfo->sour; - berry->smoothness = berryInfo->smoothness; + berry->flavors[FLAVOR_COUNT] = berryInfo->smoothness; } -static void Blender_SetPlayerNamesLocal(u8 opponentsNum) +static void InitLocalPlayers(u8 opponentsNum) { switch (opponentsNum) { - case 0: + case 0: // Link games have 0 in-game opponents gInGameOpponentsNo = 0; break; case 1: gInGameOpponentsNo = 1; - sBerryBlenderData->playersNo = 2; + sBerryBlender->numPlayers = 2; StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); if (!FlagGet(FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER)) @@ -1119,7 +1236,7 @@ static void Blender_SetPlayerNamesLocal(u8 opponentsNum) break; case 2: gInGameOpponentsNo = 2; - sBerryBlenderData->playersNo = 3; + sBerryBlender->numPlayers = 3; StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_DUDE]); StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LASSIE]); @@ -1130,7 +1247,7 @@ static void Blender_SetPlayerNamesLocal(u8 opponentsNum) break; case 3: gInGameOpponentsNo = 3; - sBerryBlenderData->playersNo = 4; + sBerryBlender->numPlayers = 4; StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); StringCopy(gLinkPlayers[1].name, sBlenderOpponentsNames[BLENDER_MISS]); StringCopy(gLinkPlayers[2].name, sBlenderOpponentsNames[BLENDER_LADDIE]); @@ -1144,94 +1261,95 @@ static void Blender_SetPlayerNamesLocal(u8 opponentsNum) } } -static void sub_807FFA4(void) +static void StartBlender(void) { s32 i; SetGpuReg(REG_OFFSET_DISPCNT, 0); - if (sBerryBlenderData == NULL) - sBerryBlenderData = AllocZeroed(sizeof(*sBerryBlenderData)); + if (sBerryBlender == NULL) + sBerryBlender = AllocZeroed(sizeof(*sBerryBlender)); - sBerryBlenderData->mainState = 0; - sBerryBlenderData->field_10C = 0; + sBerryBlender->mainState = 0; + sBerryBlender->unk1 = 0; for (i = 0; i < BLENDER_MAX_PLAYERS; i++) - sBerryBlenderData->chosenItemId[i] = ITEM_NONE; + sBerryBlender->chosenItemId[i] = ITEM_NONE; - Blender_SetPlayerNamesLocal(gSpecialVar_0x8004); + InitLocalPlayers(gSpecialVar_0x8004); if (gSpecialVar_0x8004 == 0) - SetMainCallback2(sub_8080018); + SetMainCallback2(CB2_StartBlenderLink); else - SetMainCallback2(sub_80808D4); + SetMainCallback2(CB2_StartBlenderLocal); } -static void sub_8080018(void) +static void CB2_StartBlenderLink(void) { s32 i, j; - switch (sBerryBlenderData->mainState) + switch (sBerryBlender->mainState) { case 0: - sub_8080588(); + InitBlenderBgs(); gLinkType = LINKTYPE_BERRY_BLENDER; - sBerryBlenderData->field_72 = 0; + sBerryBlender->slowdownTimer = 0; for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - sBerryBlenderData->field_64[i] = 0; - for (j = 0; j < 3; j++) + sBerryBlender->playerContinueResponses[i] = 0; + for (j = 0; j < NUM_SCORE_TYPES; j++) { - sBerryBlenderData->scores[i][j] = 0; + sBerryBlender->scores[i][j] = 0; } } - sBerryBlenderData->playAgainState = 0; - sBerryBlenderData->max_RPM = 0; - sBerryBlenderData->loadGfxState = 0; - sBerryBlenderData->mainState++; + sBerryBlender->playAgainState = 0; + sBerryBlender->maxRPM = 0; + sBerryBlender->loadGfxState = 0; + sBerryBlender->mainState++; break; case 1: if (LoadBerryBlenderGfx()) { - sBerryBlenderData->mainState++; - sub_8082D28(); + sBerryBlender->mainState++; + UpdateBlenderCenter(); } break; case 2: for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - sBerryBlenderData->syncArrowSprite2Ids[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); - StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSprite2Ids[i]], i + 8); + sBerryBlender->playerArrowSpriteIds2[i] = CreateSprite(&sSpriteTemplate_PlayerArrow, sPlayerArrowPos[i][0], sPlayerArrowPos[i][1], 1); + StartSpriteAnim(&gSprites[sBerryBlender->playerArrowSpriteIds2[i]], i + 8); } - if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType) + if (gReceivedRemoteLinkPlayers && gWirelessCommType) { LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 3: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 4: - sub_807F9D0(); + DrawBlenderBg(); if (!gPaletteFade.active) { - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; } break; case 5: - Blender_PrintText(&sBerryBlenderData->textState, sText_CommunicationStandby, 0); - sBerryBlenderData->mainState = 8; - sBerryBlenderData->framesToWait = 0; + Blender_PrintText(&sBerryBlender->textState, sText_CommunicationStandby, 0); + sBerryBlender->mainState = 8; + sBerryBlender->framesToWait = 0; break; case 8: - sBerryBlenderData->mainState++; - sBerryBlenderData->field_114 = 0; - Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); - memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry)); + // Send berry choice to link partners + sBerryBlender->mainState++; + sBerryBlender->playerToThrowBerry = 0; + ConvertItemToBlenderBerry(&sBerryBlender->blendedBerries[0], gSpecialVar_ItemId); + memcpy(gBlockSendBuffer, &sBerryBlender->blendedBerries[0], sizeof(struct BlenderBerry)); SetLinkStandbyCallback(); - sBerryBlenderData->framesToWait = 0; + sBerryBlender->framesToWait = 0; break; case 9: if (IsLinkTaskFinished()) @@ -1239,122 +1357,130 @@ static void sub_8080018(void) ResetBlockReceivedFlags(); if (GetMultiplayerId() == 0) SendBlockRequest(4); - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; } break; case 10: - if (++sBerryBlenderData->framesToWait > 20) + if (++sBerryBlender->framesToWait > 20) { + // Wait for partners' berries ClearDialogWindowAndFrameToTransparent(4, TRUE); if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags()) { for (i = 0; i < GetLinkPlayerCount(); i++) { - memcpy(&sBerryBlenderData->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry)); - sBerryBlenderData->chosenItemId[i] = sBerryBlenderData->blendedBerries[i].itemId; + memcpy(&sBerryBlender->blendedBerries[i], &gBlockRecvBuffer[i][0], sizeof(struct BlenderBerry)); + sBerryBlender->chosenItemId[i] = sBerryBlender->blendedBerries[i].itemId; } ResetBlockReceivedFlags(); - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; } } break; case 11: - sBerryBlenderData->playersNo = GetLinkPlayerCount(); + sBerryBlender->numPlayers = GetLinkPlayerCount(); + // Throw 1 player's berry in for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - if (sBerryBlenderData->field_114 == sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i]) + if (sBerryBlender->playerToThrowBerry == sPlayerIdMap[sBerryBlender->numPlayers - 2][i]) { - sub_807FD90(sBerryBlenderData->chosenItemId[sBerryBlenderData->field_114], i); + CreateBerrySprite(sBerryBlender->chosenItemId[sBerryBlender->playerToThrowBerry], i); break; } } - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; - sBerryBlenderData->field_114++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; + sBerryBlender->playerToThrowBerry++; break; case 12: - if (++sBerryBlenderData->framesToWait > 60) + if (++sBerryBlender->framesToWait > 60) { - if (sBerryBlenderData->field_114 >= sBerryBlenderData->playersNo) + if (sBerryBlender->playerToThrowBerry >= sBerryBlender->numPlayers) { - sBerryBlenderData->mainState++; - sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]] - 22528; + // Finished throwing berries in + sBerryBlender->mainState++; + sBerryBlender->arrowPos = sArrowStartPos[sArrowStartPosIds[sBerryBlender->numPlayers - 2]] - ARROW_FALL_ROTATION; } else { - sBerryBlenderData->mainState--; + // Haven't finished throwing berries in, go back to prev step + sBerryBlender->mainState--; } - sBerryBlenderData->framesToWait = 0; + sBerryBlender->framesToWait = 0; } break; case 13: if (IsLinkTaskFinished()) { - sBerryBlenderData->mainState++; - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + sBerryBlender->mainState++; + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); PlaySE(SE_FALL); ShowBg(2); } break; case 14: SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); - sBerryBlenderData->arrowPos += 0x200; - sBerryBlenderData->field_11A += 4; - if (sBerryBlenderData->field_11A > 0xFF) + sBerryBlender->arrowPos += 0x200; + sBerryBlender->centerScale += 4; + if (sBerryBlender->centerScale > 255) { SetGpuRegBits(REG_OFFSET_BG2CNT, 2); - sBerryBlenderData->mainState++; - sBerryBlenderData->field_11A = 0x100; - sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]]; - sBerryBlenderData->framesToWait = 0; + sBerryBlender->mainState++; + sBerryBlender->centerScale = 256; + sBerryBlender->arrowPos = sArrowStartPos[sArrowStartPosIds[sBerryBlender->numPlayers - 2]]; + sBerryBlender->framesToWait = 0; PlaySE(SE_TRUCK_DOOR); - sub_808074C(); - Blender_PrintPlayerNames(); + SetPlayerIdMaps(); + PrintPlayerNames(); } - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); break; case 15: - if (sub_8083380()) + if (UpdateBlenderLandScreenShake()) { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; } - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); break; case 16: - CreateSprite(&sUnknown_08339C2C, 120, -16, 3); - sBerryBlenderData->mainState++; + CreateSprite(&sSpriteTemplate_CountdownNumbers, 120, -16, 3); + sBerryBlender->mainState++; + break; + case 17: + // Wait here for the countdown + // State is progressed in SpriteCB_Start break; case 18: - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 19: SetLinkStandbyCallback(); - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 20: if (IsLinkTaskFinished()) { - sub_800A418(); - sBerryBlenderData->mainState++; + SetBerryBlenderLinkCallback(); + sBerryBlender->mainState++; } break; case 21: - sBerryBlenderData->field_4C = 128; - sBerryBlenderData->gameFrameTime = 0; - SetMainCallback2(sub_8081898); + sBerryBlender->speed = MIN_ARROW_SPEED; + sBerryBlender->gameFrameTime = 0; + SetMainCallback2(CB2_PlayBlender); if (GetCurrentMapMusic() != MUS_CYCLING) { - sBerryBlenderData->field_154 = GetCurrentMapMusic(); + sBerryBlender->savedMusic = GetCurrentMapMusic(); } PlayBGM(MUS_CYCLING); break; } - Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + Blender_DummiedOutFunc(sBerryBlender->bg_X, sBerryBlender->bg_Y); RunTasks(); AnimateSprites(); BuildOamBuffer(); @@ -1362,7 +1488,7 @@ static void sub_8080018(void) UpdatePaletteFade(); } -static void sub_8080588(void) +static void InitBlenderBgs(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); @@ -1370,47 +1496,47 @@ static void sub_8080588(void) FreeAllSpritePalettes(); ResetTasks(); - SetVBlankCallback(VBlankCB0_BerryBlender); + SetVBlankCallback(VBlankCB_BerryBlender); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates)); + InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); - SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]); - SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]); + SetBgTilemapBuffer(1, sBerryBlender->tilemapBuffers[0]); + SetBgTilemapBuffer(2, sBerryBlender->tilemapBuffers[1]); LoadUserWindowBorderGfx(0, 1, 0xD0); LoadMessageBoxGfx(0, 0x14, 0xF0); InitBerryBlenderWindows(); - sBerryBlenderData->field_44 = 0; - sBerryBlenderData->field_4C = 0; - sBerryBlenderData->arrowPos = 0; - sBerryBlenderData->max_RPM = 0; - sBerryBlenderData->bg_X = 0; - sBerryBlenderData->bg_Y = 0; + sBerryBlender->unk0 = 0; + sBerryBlender->speed = 0; + sBerryBlender->arrowPos = 0; + sBerryBlender->maxRPM = 0; + sBerryBlender->bg_X = 0; + sBerryBlender->bg_Y = 0; } -static u8 sub_8080624(u16 arrowPos, u8 playerId) +static u8 GetArrowProximity(u16 arrowPos, u8 playerId) { - u32 var1 = (arrowPos / 0x100) + 0x18; - u8 arrID = sBerryBlenderData->field_96[playerId]; - u32 var2 = sUnknown_083399E7[arrID]; + u32 pos = (arrowPos / 256) + 24; + u8 arrowId = sBerryBlender->playerIdToArrowId[playerId]; + u32 hitRangeStart = sArrowHitRangeStart[arrowId]; - if (var1 >= var2 && var1 < var2 + 0x30) + if (pos >= hitRangeStart && pos < hitRangeStart + 48) { - if (var1 >= var2 + 20 && var1 < var2 + 28) - return 2; + if (pos >= hitRangeStart + 20 && pos < hitRangeStart + 28) + return PROXIMITY_BEST; else - return 1; + return PROXIMITY_GOOD; } - return 0; + return PROXIMITY_MISS; } -static void Blender_SetOpponentsBerryData(u16 playerBerryItemId, u8 playersNum, struct BlenderBerry* playerBerry) +static void SetOpponentsBerryData(u16 playerBerryItemId, u8 playersNum, struct BlenderBerry* playerBerry) { u16 opponentSetId = 0; u16 opponentBerryId; - u16 var; + u16 berryMasterDiff; u16 i; if (playerBerryItemId == ITEM_ENIGMA_BERRY) @@ -1420,70 +1546,73 @@ static void Blender_SetOpponentsBerryData(u16 playerBerryItemId, u8 playersNum, if (playerBerry->flavors[opponentSetId] > playerBerry->flavors[i]) opponentSetId = i; } - opponentSetId += 5; + opponentSetId += NUM_NPC_BERRIES; } else { - opponentSetId = playerBerryItemId - FIRST_BERRY_INDEX; - if (opponentSetId >= 5) - opponentSetId = (opponentSetId % 5) + 5; + opponentSetId = ITEM_TO_BERRY(playerBerryItemId) - 1; + if (opponentSetId >= NUM_NPC_BERRIES) + opponentSetId = (opponentSetId % NUM_NPC_BERRIES) + NUM_NPC_BERRIES; } for (i = 0; i < playersNum - 1; i++) { opponentBerryId = sOpponentBerrySets[opponentSetId][i]; - var = playerBerryItemId - 163; + berryMasterDiff = ITEM_TO_BERRY(playerBerryItemId) - ITEM_TO_BERRY(ITEM_SPELON_BERRY); if (!FlagGet(FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER) && gSpecialVar_0x8004 == 1) { - opponentSetId %= 5; - opponentBerryId = sSpecialOpponentBerrySets[opponentSetId]; - if (var <= 4) - opponentBerryId -= 5; + opponentSetId %= ARRAY_COUNT(sBerryMasterBerries); + opponentBerryId = sBerryMasterBerries[opponentSetId]; + + // If the player's berry is any of the Berry Master's berries, + // then use the next lower set of berries + if (berryMasterDiff < ARRAY_COUNT(sBerryMasterBerries)) + opponentBerryId -= ARRAY_COUNT(sBerryMasterBerries); } - Blender_SetParticipantBerryData(i + 1, opponentBerryId + FIRST_BERRY_INDEX); + SetPlayerBerryData(i + 1, opponentBerryId + FIRST_BERRY_INDEX); } } -static void sub_808074C(void) +static void SetPlayerIdMaps(void) { s32 i, j; for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - sBerryBlenderData->field_96[i] = 0xFF; - sBerryBlenderData->field_8E[i] = sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i]; + sBerryBlender->playerIdToArrowId[i] = NO_PLAYER; + sBerryBlender->arrowIdToPlayerId[i] = sPlayerIdMap[sBerryBlender->numPlayers - 2][i]; } for (j = 0; j < BLENDER_MAX_PLAYERS; j++) { for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - if (sBerryBlenderData->field_8E[i] == j) - sBerryBlenderData->field_96[j] = i; + if (sBerryBlender->arrowIdToPlayerId[i] == j) + sBerryBlender->playerIdToArrowId[j] = i; } } } -static void Blender_PrintPlayerNames(void) +static void PrintPlayerNames(void) { s32 i, xPos; - u32 multiplayerId = 0; + u32 playerId = 0; u8 text[20]; if (gReceivedRemoteLinkPlayers) - multiplayerId = GetMultiplayerId(); + playerId = GetMultiplayerId(); for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - if (sBerryBlenderData->field_8E[i] != 0xFF) + if (sBerryBlender->arrowIdToPlayerId[i] != NO_PLAYER) { - sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[i]] = sBerryBlenderData->syncArrowSprite2Ids[i]; - StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[i]]], i); + sBerryBlender->playerArrowSpriteIds[sBerryBlender->arrowIdToPlayerId[i]] = sBerryBlender->playerArrowSpriteIds2[i]; + StartSpriteAnim(&gSprites[sBerryBlender->playerArrowSpriteIds[sBerryBlender->arrowIdToPlayerId[i]]], i); text[0] = EOS; - StringCopy(text, gLinkPlayers[sBerryBlenderData->field_8E[i]].name); + StringCopy(text, gLinkPlayers[sBerryBlender->arrowIdToPlayerId[i]].name); xPos = GetStringCenterAlignXOffset(1, text, 0x38); - if (multiplayerId == sBerryBlenderData->field_8E[i]) - Blender_AddTextPrinter(i, text, xPos, 1, 0, 2); + if (playerId == sBerryBlender->arrowIdToPlayerId[i]) + Blender_AddTextPrinter(i, text, xPos, 1, 0, 2); // Highlight player's name in red else Blender_AddTextPrinter(i, text, xPos, 1, 0, 1); @@ -1493,167 +1622,174 @@ static void Blender_PrintPlayerNames(void) } } -static void sub_80808D4(void) +static void CB2_StartBlenderLocal(void) { s32 i, j; - switch (sBerryBlenderData->mainState) + switch (sBerryBlender->mainState) { case 0: SetWirelessCommType0(); - sub_8080588(); - Blender_SetParticipantBerryData(0, gSpecialVar_ItemId); - Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId); - Blender_SetOpponentsBerryData(gSpecialVar_ItemId, sBerryBlenderData->playersNo, &sBerryBlenderData->blendedBerries[0]); + InitBlenderBgs(); + SetPlayerBerryData(0, gSpecialVar_ItemId); + ConvertItemToBlenderBerry(&sBerryBlender->blendedBerries[0], gSpecialVar_ItemId); + SetOpponentsBerryData(gSpecialVar_ItemId, sBerryBlender->numPlayers, &sBerryBlender->blendedBerries[0]); for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - sBerryBlenderData->field_64[i] = 0; - for (j = 0; j < 3; j++) + sBerryBlender->playerContinueResponses[i] = 0; + for (j = 0; j < NUM_SCORE_TYPES; j++) { - sBerryBlenderData->scores[i][j] = 0; + sBerryBlender->scores[i][j] = 0; } } - sBerryBlenderData->playAgainState = 0; - sBerryBlenderData->loadGfxState = 0; + sBerryBlender->playAgainState = 0; + sBerryBlender->loadGfxState = 0; gLinkType = LINKTYPE_BERRY_BLENDER; - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 1: if (LoadBerryBlenderGfx()) { - sBerryBlenderData->mainState++; - sub_8082D28(); + sBerryBlender->mainState++; + UpdateBlenderCenter(); } break; case 2: for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - sBerryBlenderData->syncArrowSprite2Ids[i] = CreateSprite(&sBlenderSyncArrow_SpriteTemplate, sBlenderSyncArrowsPos[i][0], sBlenderSyncArrowsPos[i][1], 1); - StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSprite2Ids[i]], i + 8); + sBerryBlender->playerArrowSpriteIds2[i] = CreateSprite(&sSpriteTemplate_PlayerArrow, sPlayerArrowPos[i][0], sPlayerArrowPos[i][1], 1); + StartSpriteAnim(&gSprites[sBerryBlender->playerArrowSpriteIds2[i]], i + 8); } - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 3: BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - sBerryBlenderData->mainState++; - sBerryBlenderData->framesToWait = 0; + sBerryBlender->mainState++; + sBerryBlender->framesToWait = 0; break; case 4: - if (++sBerryBlenderData->framesToWait == 2) - sub_807F9D0(); + if (++sBerryBlender->framesToWait == 2) + DrawBlenderBg(); if (!gPaletteFade.active) - sBerryBlenderData->mainState = 8; + sBerryBlender->mainState = 8; break; case 8: - sBerryBlenderData->mainState = 11; - sBerryBlenderData->field_114 = 0; + sBerryBlender->mainState = 11; + sBerryBlender->playerToThrowBerry = 0; break; case 11: for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - u32 var = sUnknown_083399D0[sBerryBlenderData->playersNo - 2][i]; - if (sBerryBlenderData->field_114 == var) + // Throw 1 player's berry in + u32 playerId = sPlayerIdMap[sBerryBlender->numPlayers - 2][i]; + if (sBerryBlender->playerToThrowBerry == playerId) { - sub_807FD90(sBerryBlenderData->chosenItemId[sBerryBlenderData->field_114], i); + CreateBerrySprite(sBerryBlender->chosenItemId[sBerryBlender->playerToThrowBerry], i); break; } } - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; - sBerryBlenderData->field_114++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; + sBerryBlender->playerToThrowBerry++; break; case 12: - if (++sBerryBlenderData->framesToWait > 60) + if (++sBerryBlender->framesToWait > 60) { - if (sBerryBlenderData->field_114 >= sBerryBlenderData->playersNo) + if (sBerryBlender->playerToThrowBerry >= sBerryBlender->numPlayers) { - sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]] - 22528; - sBerryBlenderData->mainState++; + // Finished throwing berries in + sBerryBlender->arrowPos = sArrowStartPos[sArrowStartPosIds[sBerryBlender->numPlayers - 2]] - ARROW_FALL_ROTATION; + sBerryBlender->mainState++; } else { - sBerryBlenderData->mainState--; + // Haven't finished throwing berries in, go back to prev step + sBerryBlender->mainState--; } - sBerryBlenderData->framesToWait = 0; + sBerryBlender->framesToWait = 0; } break; case 13: - sBerryBlenderData->mainState++; - sub_808074C(); + sBerryBlender->mainState++; + SetPlayerIdMaps(); PlaySE(SE_FALL); - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); ShowBg(2); break; case 14: SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); - sBerryBlenderData->arrowPos += 0x200; - sBerryBlenderData->field_11A += 4; - if (sBerryBlenderData->field_11A > 0xFF) + sBerryBlender->arrowPos += 0x200; + sBerryBlender->centerScale += 4; + if (sBerryBlender->centerScale > 255) { - sBerryBlenderData->mainState++; - sBerryBlenderData->field_11A = 0x100; - sBerryBlenderData->arrowPos = sUnknown_083399DC[sUnknown_083399E4[sBerryBlenderData->playersNo - 2]]; + sBerryBlender->mainState++; + sBerryBlender->centerScale = 256; + sBerryBlender->arrowPos = sArrowStartPos[sArrowStartPosIds[sBerryBlender->numPlayers - 2]]; SetGpuRegBits(REG_OFFSET_BG2CNT, 2); - sBerryBlenderData->framesToWait = 0; + sBerryBlender->framesToWait = 0; PlaySE(SE_TRUCK_DOOR); - Blender_PrintPlayerNames(); + PrintPlayerNames(); } - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); break; case 15: - if (sub_8083380()) + if (UpdateBlenderLandScreenShake()) { - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; } - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); break; case 16: - CreateSprite(&sUnknown_08339C2C, 120, -16, 3); - sBerryBlenderData->mainState++; + CreateSprite(&sSpriteTemplate_CountdownNumbers, 120, -16, 3); + sBerryBlender->mainState++; + break; + case 17: + // Wait here for the countdown + // State is progressed in SpriteCB_Start break; case 18: - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 19: - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 20: - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; break; case 21: - sub_8080DF8(); - sBerryBlenderData->field_4C = 0x80; - sBerryBlenderData->gameFrameTime = 0; - sBerryBlenderData->field_123 = 0; - sBerryBlenderData->field_72 = 0; - SetMainCallback2(sub_8081898); + ResetLinkCmds(); + sBerryBlender->speed = MIN_ARROW_SPEED; + sBerryBlender->gameFrameTime = 0; + sBerryBlender->perfectOpponents = FALSE; + sBerryBlender->slowdownTimer = 0; + SetMainCallback2(CB2_PlayBlender); if (gSpecialVar_0x8004 == 1) { if (!FlagGet(FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER)) - sBerryBlenderData->field_120[0] = CreateTask(sub_8081224, 10); + sBerryBlender->opponentTaskIds[0] = CreateTask(Task_HandleBerryMaster, 10); else - sBerryBlenderData->field_120[0] = CreateTask(sUnknown_083399EC[0], 10); + sBerryBlender->opponentTaskIds[0] = CreateTask(sLocalOpponentTasks[0], 10); } if (gSpecialVar_0x8004 > 1) { for (i = 0; i < gSpecialVar_0x8004; i++) - sBerryBlenderData->field_120[i] = CreateTask(sUnknown_083399EC[i], 10 + i); + sBerryBlender->opponentTaskIds[i] = CreateTask(sLocalOpponentTasks[i], 10 + i); } if (GetCurrentMapMusic() != MUS_CYCLING) - sBerryBlenderData->field_154 = GetCurrentMapMusic(); + sBerryBlender->savedMusic = GetCurrentMapMusic(); PlayBGM(MUS_CYCLING); PlaySE(SE_BERRY_BLENDER); - Blender_ControlHitPitch(); + UpdateHitPitch(); break; } - Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + Blender_DummiedOutFunc(sBerryBlender->bg_X, sBerryBlender->bg_Y); RunTasks(); AnimateSprites(); BuildOamBuffer(); @@ -1661,410 +1797,433 @@ static void sub_80808D4(void) UpdatePaletteFade(); } -static void sub_8080DF8(void) +static void ResetLinkCmds(void) { s32 i; - for (i = 0; i < CMD_LENGTH / 2; i++) + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - gSendCmd[0] = 0; - gSendCmd[2] = 0; - gRecvCmds[i][0] = 0; - gRecvCmds[i][2] = 0; + gSendCmd[BLENDER_COMM_INPUT_STATE] = 0; + gSendCmd[BLENDER_COMM_SCORE] = 0; + gRecvCmds[i][BLENDER_COMM_INPUT_STATE] = 0; + gRecvCmds[i][BLENDER_COMM_SCORE] = 0; } } -static void sub_8080E20(u8 taskId) +#define tTimer data[0] +#define tDelay data[1] +#define tPlayerId data[2] + +static void Task_OpponentMiss(u8 taskId) { - if(++gTasks[taskId].data[0] > gTasks[taskId].data[1]) + if(++gTasks[taskId].tTimer > gTasks[taskId].tDelay) { - gRecvCmds[gTasks[taskId].data[2]][2] = 0x2345; + gRecvCmds[gTasks[taskId].tPlayerId][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_MISS; DestroyTask(taskId); } } -static void sub_8080E6C(u8 a0, u8 a1) +static void CreateOpponentMissTask(u8 playerId, u8 delay) { - u8 taskId = CreateTask(sub_8080E20, 80); - gTasks[taskId].data[1] = a1; - gTasks[taskId].data[2] = a0; + u8 taskId = CreateTask(Task_OpponentMiss, 80); + gTasks[taskId].tDelay = delay; + gTasks[taskId].tPlayerId = playerId; } -static void sub_8080EA4(u8 taskId) +#undef tTimer +#undef tDelay +#undef tPlayerId + +#define tDidInput data[0] + +static void Task_HandleOpponent1(u8 taskId) { - if (sub_8080624(sBerryBlenderData->arrowPos, 1) == 2) + if (GetArrowProximity(sBerryBlender->arrowPos, 1) == PROXIMITY_BEST) { - if (gTasks[taskId].data[0] == 0) + if (!gTasks[taskId].tDidInput) { - if (sBerryBlenderData->field_123 == 0) + if (!sBerryBlender->perfectOpponents) { u8 rand = Random() / 655; - if (sBerryBlenderData->field_4C < 500) + if (sBerryBlender->speed < 500) { if (rand > 75) - gRecvCmds[1][2] = 0x4523; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; else - gRecvCmds[1][2] = 0x5432; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; - gRecvCmds[1][2] = 0x5432; + // BUG: Overrwrote above assignment. Opponent 1 can't get Best at low speed + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; } - else if (sBerryBlenderData->field_4C < 1500) + else if (sBerryBlender->speed < 1500) { if (rand > 80) { - gRecvCmds[1][2] = 0x4523; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; } else { u8 value = rand - 21; if (value < 60) - gRecvCmds[1][2] = 0x5432; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; else if (rand < 10) - sub_8080E6C(1, 5); + CreateOpponentMissTask(1, 5); } } else if (rand <= 90) { u8 value = rand - 71; if (value < 20) - gRecvCmds[1][2] = 0x5432; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; else if (rand < 30) - sub_8080E6C(1, 5); + CreateOpponentMissTask(1, 5); } else { - gRecvCmds[1][2] = 0x4523; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; } } else { - gRecvCmds[1][2] = 0x4523; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; } - gTasks[taskId].data[0] = 1; + gTasks[taskId].tDidInput = TRUE; } } else { - gTasks[taskId].data[0] = 0; + gTasks[taskId].tDidInput = FALSE; } } -static void sub_8080FD0(u8 taskId) +static void Task_HandleOpponent2(u8 taskId) { - u32 var1 = (sBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; - u32 var2 = sBerryBlenderData->field_96[2] & 0xFF; - if ((var1 >> 8) > sUnknown_083399E7[var2] + 20 && (var1 >> 8) < sUnknown_083399E7[var2] + 40) + u32 var1 = (sBerryBlender->arrowPos + 0x1800) & 0xFFFF; + u32 arrowId = sBerryBlender->playerIdToArrowId[2] & 0xFF; + if ((var1 >> 8) > sArrowHitRangeStart[arrowId] + 20 && (var1 >> 8) < sArrowHitRangeStart[arrowId] + 40) { - if (gTasks[taskId].data[0] == 0) + if (!gTasks[taskId].tDidInput) { - if (sBerryBlenderData->field_123 == 0) + if (!sBerryBlender->perfectOpponents) { u8 rand = Random() / 655; - if (sBerryBlenderData->field_4C < 500) + if (sBerryBlender->speed < 500) { if (rand > 66) - gRecvCmds[2][2] = 0x4523; + gRecvCmds[2][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; else - gRecvCmds[2][2] = 0x5432; + gRecvCmds[2][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; } else { u8 value; if (rand > 65) - gRecvCmds[2][2] = 0x4523; + gRecvCmds[2][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; value = rand - 41; if (value < 25) - gRecvCmds[2][2] = 0x5432; + gRecvCmds[2][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; if (rand < 10) - sub_8080E6C(2, 5); + CreateOpponentMissTask(2, 5); } - gTasks[taskId].data[0] = 1; + gTasks[taskId].tDidInput = TRUE; } else { - gRecvCmds[2][2] = 0x4523; - gTasks[taskId].data[0] = 1; + gRecvCmds[2][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; + gTasks[taskId].tDidInput = TRUE; } } } else { - gTasks[taskId].data[0] = 0; + gTasks[taskId].tDidInput = FALSE; } } -static void sub_80810F8(u8 taskId) +static void Task_HandleOpponent3(u8 taskId) { - u32 var1, var2; - - var1 = (sBerryBlenderData->arrowPos + 0x1800) & 0xFFFF; - var2 = sBerryBlenderData->field_96[3] & 0xFF; - if ((var1 >> 8) > sUnknown_083399E7[var2] + 20 && (var1 >> 8) < sUnknown_083399E7[var2] + 40) + u32 var1 = (sBerryBlender->arrowPos + 0x1800) & 0xFFFF; + u32 arrowId = sBerryBlender->playerIdToArrowId[3] & 0xFF; + if ((var1 >> 8) > sArrowHitRangeStart[arrowId] + 20 && (var1 >> 8) < sArrowHitRangeStart[arrowId] + 40) { if (gTasks[taskId].data[0] == 0) { - if (sBerryBlenderData->field_123 == 0) + if (!sBerryBlender->perfectOpponents) { u8 rand = (Random() / 655); - if (sBerryBlenderData->field_4C < 500) + if (sBerryBlender->speed < 500) { if (rand > 88) - gRecvCmds[3][2] = 0x4523; + gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; else - gRecvCmds[3][2] = 0x5432; + gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; } else { if (rand > 60) { - gRecvCmds[3][2] = 0x4523; + gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; } else { s8 value = rand - 56; // makes me wonder what the original code was u8 value2 = value; if (value2 < 5) - gRecvCmds[3][2] = 0x5432; + gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; } if (rand < 5) - sub_8080E6C(3, 5); + CreateOpponentMissTask(3, 5); } - gTasks[taskId].data[0] = 1; + gTasks[taskId].tDidInput = TRUE; } else { - gRecvCmds[3][2] = 0x4523; - gTasks[taskId].data[0] = 1; + gRecvCmds[3][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; + gTasks[taskId].tDidInput = TRUE; } } } else { - gTasks[taskId].data[0] = 0; + gTasks[taskId].tDidInput = FALSE; } } -static void sub_8081224(u8 taskId) +static void Task_HandleBerryMaster(u8 taskId) { - if (sub_8080624(sBerryBlenderData->arrowPos, 1) == 2) + if (GetArrowProximity(sBerryBlender->arrowPos, 1) == PROXIMITY_BEST) { - if (gTasks[taskId].data[0] == 0) + if (!gTasks[taskId].tDidInput) { - gRecvCmds[1][2] = 0x4523; - gTasks[taskId].data[0] = 1; + gRecvCmds[1][BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; + gTasks[taskId].tDidInput = TRUE; } } else { - gTasks[taskId].data[0] = 0; + gTasks[taskId].tDidInput = FALSE; } } -static void sub_8081288(u16 a0, u8 a1) +#undef tDidInput + +static void CreateScoreSymbolSprite(u16 cmd, u8 arrowId) { u8 spriteId; - spriteId = CreateSprite(&sUnknown_08339B40, - sBlenderSyncArrowsPos[a1][0] - (10 * sUnknown_083399C0[a1][0]), - sBlenderSyncArrowsPos[a1][1] - (10 * sUnknown_083399C0[a1][1]), + spriteId = CreateSprite(&sSpriteTemplate_ScoreSymbols, + sPlayerArrowPos[arrowId][0] - (10 * sPlayerArrowQuadrant[arrowId][0]), + sPlayerArrowPos[arrowId][1] - (10 * sPlayerArrowQuadrant[arrowId][1]), 1); - if (a0 == 0x4523) + if (cmd == LINKCMD_BLENDER_SCORE_BEST) { - StartSpriteAnim(&gSprites[spriteId], 2); - gSprites[spriteId].callback = sub_8082F9C; + StartSpriteAnim(&gSprites[spriteId], SCOREANIM_BEST_FLASH); + gSprites[spriteId].callback = SpriteCB_ScoreSymbolBest; PlaySE(SE_ICE_STAIRS); } - else if (a0 == 0x5432) + else if (cmd == LINKCMD_BLENDER_SCORE_GOOD) { - StartSpriteAnim(&gSprites[spriteId], 0); + StartSpriteAnim(&gSprites[spriteId], SCOREANIM_GOOD); PlaySE(SE_SUCCESS); } - else if (a0 == 0x2345) + else if (cmd == LINKCMD_BLENDER_SCORE_MISS) { - StartSpriteAnim(&gSprites[spriteId], 1); + StartSpriteAnim(&gSprites[spriteId], SCOREANIM_MISS); PlaySE(SE_FAILURE); } - sub_8082E84(); + CreateParticleSprites(); } -static void sub_8081370(u16 a0) +static void UpdateSpeedFromHit(u16 cmd) { - Blender_ControlHitPitch(); - switch (a0) + UpdateHitPitch(); + switch (cmd) { - case 0x4523: - if (sBerryBlenderData->field_4C < 1500) - sBerryBlenderData->field_4C += (0x180 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); + case LINKCMD_BLENDER_SCORE_BEST: + if (sBerryBlender->speed < 1500) { + sBerryBlender->speed += (384 / sNumPlayersToSpeedDivisor[sBerryBlender->numPlayers]); + } else { - sBerryBlenderData->field_4C += (128 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); - sub_80832BC(&sBerryBlenderData->bg_X, (sBerryBlenderData->field_4C / 100) - 10); - sub_80832BC(&sBerryBlenderData->bg_Y, (sBerryBlenderData->field_4C / 100) - 10); + sBerryBlender->speed += (128 / sNumPlayersToSpeedDivisor[sBerryBlender->numPlayers]); + ShakeBgCoordForHit(&sBerryBlender->bg_X, (sBerryBlender->speed / 100) - 10); + ShakeBgCoordForHit(&sBerryBlender->bg_Y, (sBerryBlender->speed / 100) - 10); } break; - case 0x5432: - if (sBerryBlenderData->field_4C < 1500) - sBerryBlenderData->field_4C += (0x100 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); + case LINKCMD_BLENDER_SCORE_GOOD: + if (sBerryBlender->speed < 1500) + sBerryBlender->speed += (256 / sNumPlayersToSpeedDivisor[sBerryBlender->numPlayers]); break; - case 0x2345: - sBerryBlenderData->field_4C -= (0x100 / sUnknown_08339CC3[sBerryBlenderData->playersNo]); - if (sBerryBlenderData->field_4C < 0x80) - sBerryBlenderData->field_4C = 0x80; + case LINKCMD_BLENDER_SCORE_MISS: + sBerryBlender->speed -= (256 / sNumPlayersToSpeedDivisor[sBerryBlender->numPlayers]); + if (sBerryBlender->speed < MIN_ARROW_SPEED) + sBerryBlender->speed = MIN_ARROW_SPEED; break; } } -static bool32 sub_80814B0(u16 arg0, u16 arg1, u16 arg2) +// Return TRUE if the received command matches the corresponding Link or RFU command +static bool32 CheckRecvCmdMatches(u16 recvCmd, u16 linkCmd, u16 rfuCmd) { - if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType) + if (gReceivedRemoteLinkPlayers && gWirelessCommType) { - if ((arg0 & 0xFF00) == arg2) + if ((recvCmd & 0xFF00) == rfuCmd) return TRUE; } else { - if (arg0 == arg1) + if (recvCmd == linkCmd) return TRUE; } return FALSE; } -static void sub_80814F4(void) +static void UpdateOpponentScores(void) { s32 i; if (gSpecialVar_0x8004 != 0) { - if (gSendCmd[2] != 0) + // Local game, "send" players score to itself + if (gSendCmd[BLENDER_COMM_SCORE] != 0) { - gRecvCmds[0][2] = gSendCmd[2]; - gRecvCmds[0][0] = 0x4444; - gSendCmd[2] = 0; + gRecvCmds[0][BLENDER_COMM_SCORE] = gSendCmd[BLENDER_COMM_SCORE]; + gRecvCmds[0][BLENDER_COMM_INPUT_STATE] = LINKCMD_BLENDER_SEND_KEYS; + gSendCmd[BLENDER_COMM_SCORE] = 0; } - for (i = 1; i < 4; i++) + + // Local game, simulate NPCs sending keys + // Their actual inputs are handled by Task_HandleOpponent + for (i = 1; i < BLENDER_MAX_PLAYERS; i++) { - if (gRecvCmds[i][2] != 0) - gRecvCmds[i][0] = 0x4444; + if (gRecvCmds[i][BLENDER_COMM_SCORE] != 0) + gRecvCmds[i][BLENDER_COMM_INPUT_STATE] = LINKCMD_BLENDER_SEND_KEYS; } } - for (i = 0; i < sBerryBlenderData->playersNo; i++) + for (i = 0; i < sBerryBlender->numPlayers; i++) { - if (sub_80814B0(gRecvCmds[i][0], 0x4444, 0x4400)) + if (CheckRecvCmdMatches(gRecvCmds[i][BLENDER_COMM_INPUT_STATE], LINKCMD_BLENDER_SEND_KEYS, RFUCMD_BLENDER_SEND_KEYS)) { - u32 var = sBerryBlenderData->field_96[i]; - if (gRecvCmds[i][2] == 0x4523) + u32 arrowId = sBerryBlender->playerIdToArrowId[i]; + if (gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_BEST) { - sub_8081370(0x4523); - sBerryBlenderData->field_116 += (sBerryBlenderData->field_4C / 55); - if (sBerryBlenderData->field_116 >= 1000) - sBerryBlenderData->field_116 = 1000; - sub_8081288(0x4523, var); - sBerryBlenderData->scores[i][BLENDER_SCORE_BEST]++; + UpdateSpeedFromHit(LINKCMD_BLENDER_SCORE_BEST); + sBerryBlender->progressBarValue += (sBerryBlender->speed / 55); + if (sBerryBlender->progressBarValue >= MAX_PROGRESS_BAR) + sBerryBlender->progressBarValue = MAX_PROGRESS_BAR; + CreateScoreSymbolSprite(LINKCMD_BLENDER_SCORE_BEST, arrowId); + sBerryBlender->scores[i][SCORE_BEST]++; } - else if (gRecvCmds[i][2] == 0x5432) + else if (gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_GOOD) { - sub_8081370(0x5432); - sBerryBlenderData->field_116 += (sBerryBlenderData->field_4C / 70); - sub_8081288(0x5432, var); - sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]++; + UpdateSpeedFromHit(LINKCMD_BLENDER_SCORE_GOOD); + sBerryBlender->progressBarValue += (sBerryBlender->speed / 70); + CreateScoreSymbolSprite(LINKCMD_BLENDER_SCORE_GOOD, arrowId); + sBerryBlender->scores[i][SCORE_GOOD]++; } - else if (gRecvCmds[i][2] == 0x2345) + else if (gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_MISS) { - sub_8081288(0x2345, var); - sub_8081370(0x2345); - if (sBerryBlenderData->scores[i][BLENDER_SCORE_MISS] < 999) - sBerryBlenderData->scores[i][BLENDER_SCORE_MISS]++; + CreateScoreSymbolSprite(LINKCMD_BLENDER_SCORE_MISS, arrowId); + UpdateSpeedFromHit(LINKCMD_BLENDER_SCORE_MISS); + if (sBerryBlender->scores[i][SCORE_MISS] < 999) + sBerryBlender->scores[i][SCORE_MISS]++; } - if (gRecvCmds[i][2] == 0x2345 || gRecvCmds[2][i] == 0x4523 || gRecvCmds[2][i] == 0x5432) // could be a bug, 2 and i are reversed + + // BUG: Should [i][BLENDER_COMM_SCORE] below, not [BLENDER_COMM_SCORE][i] + // As a result the music tempo updates if any player misses, but only if 1 specific player hits + if (gRecvCmds[i][BLENDER_COMM_SCORE] == LINKCMD_BLENDER_SCORE_MISS + || gRecvCmds[BLENDER_COMM_SCORE][i] == LINKCMD_BLENDER_SCORE_BEST + || gRecvCmds[BLENDER_COMM_SCORE][i] == LINKCMD_BLENDER_SCORE_GOOD) { - if (sBerryBlenderData->field_4C > 1500) - m4aMPlayTempoControl(&gMPlayInfo_BGM, ((sBerryBlenderData->field_4C - 750) / 20) + 256); + if (sBerryBlender->speed > 1500) + m4aMPlayTempoControl(&gMPlayInfo_BGM, ((sBerryBlender->speed - 750) / 20) + 256); else - m4aMPlayTempoControl(&gMPlayInfo_BGM, 0x100); + m4aMPlayTempoControl(&gMPlayInfo_BGM, 256); } } } if (gSpecialVar_0x8004 != 0) { - for (i = 0; i < sBerryBlenderData->playersNo; i++) + for (i = 0; i < sBerryBlender->numPlayers; i++) { - gRecvCmds[i][0] = 0; - gRecvCmds[i][2] = 0; + gRecvCmds[i][BLENDER_COMM_INPUT_STATE] = 0; + gRecvCmds[i][BLENDER_COMM_SCORE] = 0; } } } -static void sub_8081744(void) +static void HandlePlayerInput(void) { - u8 var2; - bool8 A_pressed = FALSE; + u8 arrowId; + bool8 pressedA = FALSE; u8 playerId = 0; - if (gReceivedRemoteLinkPlayers != 0) + if (gReceivedRemoteLinkPlayers) playerId = GetMultiplayerId(); - var2 = sBerryBlenderData->field_96[playerId]; + arrowId = sBerryBlender->playerIdToArrowId[playerId]; - if (sBerryBlenderData->gameEndState == 0) + if (sBerryBlender->gameEndState == 0) { - if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A && gMain.newKeys & A_BUTTON) + if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A && JOY_NEW(A_BUTTON)) { - if ((gMain.heldKeysRaw & (A_BUTTON | L_BUTTON)) != (A_BUTTON | L_BUTTON)) - A_pressed = TRUE; + if (JOY_HELD_RAW(A_BUTTON | L_BUTTON) != (A_BUTTON | L_BUTTON)) + pressedA = TRUE; } - else if (gMain.newKeys & A_BUTTON) + else if (JOY_NEW(A_BUTTON)) { - A_pressed = TRUE; + pressedA = TRUE; } - if (A_pressed) + if (pressedA) { - u8 var3; - StartSpriteAnim(&gSprites[sBerryBlenderData->syncArrowSpriteIds[sBerryBlenderData->field_8E[var2]]], var2 + 4); - var3 = sub_8080624(sBerryBlenderData->arrowPos, playerId); + u8 proximity; + StartSpriteAnim(&gSprites[sBerryBlender->playerArrowSpriteIds[sBerryBlender->arrowIdToPlayerId[arrowId]]], arrowId + 4); + proximity = GetArrowProximity(sBerryBlender->arrowPos, playerId); - if (var3 == 2) - gSendCmd[2] = 0x4523; - else if (var3 == 1) - gSendCmd[2] = 0x5432; + if (proximity == PROXIMITY_BEST) + gSendCmd[BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_BEST; + else if (proximity == PROXIMITY_GOOD) + gSendCmd[BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_GOOD; else - gSendCmd[2] = 0x2345; + gSendCmd[BLENDER_COMM_SCORE] = LINKCMD_BLENDER_SCORE_MISS; } } - if (++sBerryBlenderData->field_72 > 5) + if (++sBerryBlender->slowdownTimer > 5) { - if (sBerryBlenderData->field_4C > 128) - sBerryBlenderData->field_4C--; - sBerryBlenderData->field_72 = 0; + if (sBerryBlender->speed > MIN_ARROW_SPEED) + sBerryBlender->speed--; + sBerryBlender->slowdownTimer = 0; } - if (gEnableContestDebugging && gMain.newKeys & L_BUTTON) - sBerryBlenderData->field_123 ^= 1; + + if (gEnableContestDebugging && JOY_NEW(L_BUTTON)) + sBerryBlender->perfectOpponents ^= 1; } -static void sub_8081898(void) +static void CB2_PlayBlender(void) { - sub_8082D28(); + UpdateBlenderCenter(); - if (sBerryBlenderData->gameFrameTime < (99 * 60 * 60) + (59 * 60)) // game time can't be longer than 99 minutes and 59 seconds, can't print 3 digits - sBerryBlenderData->gameFrameTime++; + if (sBerryBlender->gameFrameTime < (99 * 60 * 60) + (59 * 60)) // game time can't be longer than 99 minutes and 59 seconds, can't print 3 digits + sBerryBlender->gameFrameTime++; - sub_8081744(); - SetLinkDebugValues((u16)(sBerryBlenderData->field_4C), sBerryBlenderData->field_116); - sub_80814F4(); - sub_8083140(sBerryBlenderData->field_116, 1000); - sub_8083230(sBerryBlenderData->field_4C); - sub_808330C(); - sub_8082AD4(); - if (sBerryBlenderData->gameEndState == 0 && sBerryBlenderData->field_118 >= 1000) + HandlePlayerInput(); + SetLinkDebugValues((u16)(sBerryBlender->speed), sBerryBlender->progressBarValue); + UpdateOpponentScores(); + TryUpdateProgressBar(sBerryBlender->progressBarValue, MAX_PROGRESS_BAR); + UpdateRPM(sBerryBlender->speed); + RestoreBgCoords(); + ProcessLinkPlayerCmds(); + if (sBerryBlender->gameEndState == 0 && sBerryBlender->maxProgressBarValue >= MAX_PROGRESS_BAR) { - sBerryBlenderData->field_116 = 1000; - sBerryBlenderData->gameEndState = 1; - SetMainCallback2(CB2_HandleBlenderEndGame); + sBerryBlender->progressBarValue = MAX_PROGRESS_BAR; + sBerryBlender->gameEndState = 1; + SetMainCallback2(CB2_EndBlenderGame); } - Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + Blender_DummiedOutFunc(sBerryBlender->bg_X, sBerryBlender->bg_Y); RunTasks(); AnimateSprites(); BuildOamBuffer(); @@ -2077,362 +2236,380 @@ static void Blender_DummiedOutFunc(s16 a0, s16 a1) } -static bool8 sub_8081964(struct BlenderBerry* berries, u8 index1, u8 index2) +static bool8 AreBlenderBerriesSame(struct BlenderBerry* berries, u8 a, u8 b) { - if (berries[index1].itemId != berries[index2].itemId - || (StringCompare(berries[index1].name, berries[index2].name) == 0 - && (berries[index1].flavors[FLAVOR_SPICY] == berries[index2].flavors[FLAVOR_SPICY] - && berries[index1].flavors[FLAVOR_DRY] == berries[index2].flavors[FLAVOR_DRY] - && berries[index1].flavors[FLAVOR_SWEET] == berries[index2].flavors[FLAVOR_SWEET] - && berries[index1].flavors[FLAVOR_BITTER] == berries[index2].flavors[FLAVOR_BITTER] - && berries[index1].flavors[FLAVOR_SOUR] == berries[index2].flavors[FLAVOR_SOUR] - && berries[index1].smoothness == berries[index2].smoothness))) + // First check to itemId is pointless (and wrong anyway?), always false when this is called + // Only used to determine if two enigma berries are equivalent + if (berries[a].itemId != berries[b].itemId + || (StringCompare(berries[a].name, berries[b].name) == 0 + && (berries[a].flavors[FLAVOR_SPICY] == berries[b].flavors[FLAVOR_SPICY] + && berries[a].flavors[FLAVOR_DRY] == berries[b].flavors[FLAVOR_DRY] + && berries[a].flavors[FLAVOR_SWEET] == berries[b].flavors[FLAVOR_SWEET] + && berries[a].flavors[FLAVOR_BITTER] == berries[b].flavors[FLAVOR_BITTER] + && berries[a].flavors[FLAVOR_SOUR] == berries[b].flavors[FLAVOR_SOUR] + && berries[a].flavors[FLAVOR_COUNT] == berries[b].flavors[FLAVOR_COUNT]))) return TRUE; else return FALSE; } -static u32 Blender_GetPokeblockColor(struct BlenderBerry* berries, s16* a1, u8 playersNo, u8 a3) +static u32 CalculatePokeblockColor(struct BlenderBerry* berries, s16* _flavors, u8 numPlayers, u8 negativeFlavors) { - s16 vars[6]; - s32 i; - s32 r6; - u8 r2; + s16 flavors[FLAVOR_COUNT + 1]; + s32 i, j; + u8 numFlavors; - for (i = 0; i < 6; i++) - vars[i] = a1[i]; + for (i = 0; i < FLAVOR_COUNT + 1; i++) + flavors[i] = _flavors[i]; - r6 = 0; - for (i = 0; i < 5; i++) + j = 0; + for (i = 0; i < FLAVOR_COUNT; i++) { - if (vars[i] == 0) - r6++; + if (flavors[i] == 0) + j++; } - if (r6 == 5 || a3 > 3) - return 12; - for (i = 0; i < playersNo; i++) + + // If all flavors are 0, or at least 3 were negative/0 + // or if players used the same berry, color is black + if (j == 5 || negativeFlavors > 3) + return PBLOCK_CLR_BLACK; + + for (i = 0; i < numPlayers; i++) { - for (r6 = 0; r6 < playersNo; r6++) + for (j = 0; j < numPlayers; j++) { - if (berries[i].itemId == berries[r6].itemId && i != r6 - && (berries[i].itemId != ITEM_ENIGMA_BERRY || sub_8081964(berries, i, r6))) - return 12; + if (berries[i].itemId == berries[j].itemId && i != j + && (berries[i].itemId != ITEM_ENIGMA_BERRY || AreBlenderBerriesSame(berries, i, j))) + return PBLOCK_CLR_BLACK; } } - r2 = 0; - for (r2 = 0, i = 0; i < 5; i++) + + numFlavors = 0; + for (numFlavors = 0, i = 0; i < FLAVOR_COUNT; i++) { - if (vars[i] > 0) - r2++; + if (flavors[i] > 0) + numFlavors++; } - if (r2 > 3) - return 13; - if (r2 == 3) - return 11; - for (i = 0; i < 5; i++) + + // Check for special colors (White/Gray/Gold) + if (numFlavors > 3) + return PBLOCK_CLR_WHITE; + + if (numFlavors == 3) + return PBLOCK_CLR_GRAY; + + for (i = 0; i < FLAVOR_COUNT; i++) { - if (vars[i] > 50) - return 14; - } - if (r2 == 1 && vars[0] > 0) - return 1; - if (r2 == 1 && vars[1] > 0) - return 2; - if (r2 == 1 && vars[2] > 0) - return 3; - if (r2 == 1 && vars[3] > 0) - return 4; - if (r2 == 1 && vars[4] > 0) - return 5; - if (r2 == 2) - { - s32 var = 0; - for (i = 0; i < 5; i++) + if (flavors[i] > 50) + return PBLOCK_CLR_GOLD; + } + + // Only 1 flavor present, return corresponding color + if (numFlavors == 1 && flavors[FLAVOR_SPICY] > 0) + return PBLOCK_CLR_RED; + if (numFlavors == 1 && flavors[FLAVOR_DRY] > 0) + return PBLOCK_CLR_BLUE; + if (numFlavors == 1 && flavors[FLAVOR_SWEET] > 0) + return PBLOCK_CLR_PINK; + if (numFlavors == 1 && flavors[FLAVOR_BITTER] > 0) + return PBLOCK_CLR_GREEN; + if (numFlavors == 1 && flavors[FLAVOR_SOUR] > 0) + return PBLOCK_CLR_YELLOW; + + if (numFlavors == 2) + { + // Determine which 2 flavors are present + s32 idx = 0; + for (i = 0; i < FLAVOR_COUNT; i++) { - if (vars[i] > 0) - sUnknown_03000DF8[var++] = i; + if (flavors[i] > 0) + sPokeblockPresentFlavors[idx++] = i; } - if (vars[sUnknown_03000DF8[0]] >= vars[sUnknown_03000DF8[1]]) + // Use the stronger flavor to determine color + // The weaker flavor is returned in the upper 16 bits, but this is ignored in the color assignment + if (flavors[sPokeblockPresentFlavors[0]] >= flavors[sPokeblockPresentFlavors[1]]) { - if (sUnknown_03000DF8[0] == 0) - return (sUnknown_03000DF8[1] << 16) | 6; - if (sUnknown_03000DF8[0] == 1) - return (sUnknown_03000DF8[1] << 16) | 7; - if (sUnknown_03000DF8[0] == 2) - return (sUnknown_03000DF8[1] << 16) | 8; - if (sUnknown_03000DF8[0] == 3) - return (sUnknown_03000DF8[1] << 16) | 9; - if (sUnknown_03000DF8[0] == 4) - return (sUnknown_03000DF8[1] << 16) | 10; + if (sPokeblockPresentFlavors[0] == FLAVOR_SPICY) + return (sPokeblockPresentFlavors[1] << 16) | PBLOCK_CLR_PURPLE; + if (sPokeblockPresentFlavors[0] == FLAVOR_DRY) + return (sPokeblockPresentFlavors[1] << 16) | PBLOCK_CLR_INDIGO; + if (sPokeblockPresentFlavors[0] == FLAVOR_SWEET) + return (sPokeblockPresentFlavors[1] << 16) | PBLOCK_CLR_BROWN; + if (sPokeblockPresentFlavors[0] == FLAVOR_BITTER) + return (sPokeblockPresentFlavors[1] << 16) | PBLOCK_CLR_LITE_BLUE; + if (sPokeblockPresentFlavors[0] == FLAVOR_SOUR) + return (sPokeblockPresentFlavors[1] << 16) | PBLOCK_CLR_OLIVE; } else { - if (sUnknown_03000DF8[1] == 0) - return (sUnknown_03000DF8[0] << 16) | 6; - if (sUnknown_03000DF8[1] == 1) - return (sUnknown_03000DF8[0] << 16) | 7; - if (sUnknown_03000DF8[1] == 2) - return (sUnknown_03000DF8[0] << 16) | 8; - if (sUnknown_03000DF8[1] == 3) - return (sUnknown_03000DF8[0] << 16) | 9; - if (sUnknown_03000DF8[1] == 4) - return (sUnknown_03000DF8[0] << 16) | 10; + if (sPokeblockPresentFlavors[1] == FLAVOR_SPICY) + return (sPokeblockPresentFlavors[0] << 16) | PBLOCK_CLR_PURPLE; + if (sPokeblockPresentFlavors[1] == FLAVOR_DRY) + return (sPokeblockPresentFlavors[0] << 16) | PBLOCK_CLR_INDIGO; + if (sPokeblockPresentFlavors[1] == FLAVOR_SWEET) + return (sPokeblockPresentFlavors[0] << 16) | PBLOCK_CLR_BROWN; + if (sPokeblockPresentFlavors[1] == FLAVOR_BITTER) + return (sPokeblockPresentFlavors[0] << 16) | PBLOCK_CLR_LITE_BLUE; + if (sPokeblockPresentFlavors[1] == FLAVOR_SOUR) + return (sPokeblockPresentFlavors[0] << 16) | PBLOCK_CLR_OLIVE; } } - return 0; + return PBLOCK_CLR_NONE; } -static void sub_8081BB0(s16 value) +static void Debug_SetMaxRPMStage(s16 value) { - sUnknown_03000E04 = value; + sDebug_MaxRPMStage = value; } -static s16 sub_8081BBC(void) +// Unused +static s16 Debug_GetMaxRPMStage(void) { - return sUnknown_03000E04; + return sDebug_MaxRPMStage; } -static void sub_8081BC8(s16 value) +static void Debug_SetGameTimeStage(s16 value) { - sUnknown_03000E06 = value; + sDebug_GameTimeStage = value; } -static s16 sub_8081BD4(void) +// Unued +static s16 Debug_GetGameTimeStage(void) { - return sUnknown_03000E06; + return sDebug_GameTimeStage; } -#if MODERN -// TODO remove this as soon as the code below is understood -// add a UBFIX if required (code buggy?) -__attribute__((optimize("no-aggressive-loop-optimizations"))) -#endif -static void Blender_CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *pokeblock, u8 playersNo, u8 *flavors, u16 maxRPM) +static void CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *pokeblock, u8 numPlayers, u8 *flavors, u16 maxRPM) { s32 i, j; s32 multiuseVar, var2; - u8 var3; + u8 numNegatives; - for (i = 0; i < 6; i++) - sUnknown_03000DE8[i] = 0; + for (i = 0; i < FLAVOR_COUNT + 1; i++) + sPokeblockFlavors[i] = 0; - for (i = 0; i < playersNo; i++) + // Add up the flavor + feel of each players berry + for (i = 0; i < numPlayers; i++) { - for (j = 0; j < 6; j++) - sUnknown_03000DE8[j] += berries[i].flavors[j]; + for (j = 0; j < FLAVOR_COUNT + 1; j++) + sPokeblockFlavors[j] += berries[i].flavors[j]; } - multiuseVar = sUnknown_03000DE8[0]; - sUnknown_03000DE8[0] -= sUnknown_03000DE8[1]; - sUnknown_03000DE8[1] -= sUnknown_03000DE8[2]; - sUnknown_03000DE8[2] -= sUnknown_03000DE8[3]; - sUnknown_03000DE8[3] -= sUnknown_03000DE8[4]; - sUnknown_03000DE8[4] -= multiuseVar; + // Subtract each flavor total from the prev one + // The idea is to focus on only the flavors with the highest totals + // Bad way to do it though (order matters here) + multiuseVar = sPokeblockFlavors[0]; + sPokeblockFlavors[FLAVOR_SPICY] -= sPokeblockFlavors[FLAVOR_DRY]; + sPokeblockFlavors[FLAVOR_DRY] -= sPokeblockFlavors[FLAVOR_SWEET]; + sPokeblockFlavors[FLAVOR_SWEET] -= sPokeblockFlavors[FLAVOR_BITTER]; + sPokeblockFlavors[FLAVOR_BITTER] -= sPokeblockFlavors[FLAVOR_SOUR]; + sPokeblockFlavors[FLAVOR_SOUR] -= multiuseVar; + // Count (and reset) the resulting negative flavors multiuseVar = 0; - for (i = 0; i < 5; i++) + for (i = 0; i < FLAVOR_COUNT; i++) { - if (sUnknown_03000DE8[i] < 0) + if (sPokeblockFlavors[i] < 0) { - sUnknown_03000DE8[i] = 0; + sPokeblockFlavors[i] = 0; multiuseVar++; } } - var3 = multiuseVar; - for (i = 0; i < 5; i++) + numNegatives = multiuseVar; + + // Subtract the number of negative flavor totals from each positive total (without going below 0) + for (i = 0; i < FLAVOR_COUNT; i++) { - if (sUnknown_03000DE8[i] > 0) + if (sPokeblockFlavors[i] > 0) { - if (sUnknown_03000DE8[i] < multiuseVar) - sUnknown_03000DE8[i] = 0; + if (sPokeblockFlavors[i] < multiuseVar) + sPokeblockFlavors[i] = 0; else - sUnknown_03000DE8[i] -= multiuseVar; + sPokeblockFlavors[i] -= multiuseVar; } } - for (i = 0; i < 5; i++) - { - sUnknown_020322A8[i] = sUnknown_03000DE8[i]; - } - multiuseVar = maxRPM / 333 + 100; - sUnknown_020322D0 = multiuseVar; + for (i = 0; i < FLAVOR_COUNT; i++) + sDebug_PokeblockFactorFlavors[i] = sPokeblockFlavors[i]; - for (i = 0; i < 5; i++) + // Factor in max RPM and round + sDebug_PokeblockFactorRPM = multiuseVar = maxRPM / 333 + 100; + for (i = 0; i < FLAVOR_COUNT; i++) { - s32 r4; - s32 r5 = sUnknown_03000DE8[i]; - r5 = (r5 * multiuseVar) / 10; - r4 = r5 % 10; - r5 /= 10; - if (r4 > 4) - r5++; - sUnknown_03000DE8[i] = r5; - } - for (i = 0; i < 5; i++) - { - sUnknown_020322BC[i] = sUnknown_03000DE8[i]; + s32 remainder; + s32 flavor = sPokeblockFlavors[i]; + flavor = (flavor * multiuseVar) / 10; + remainder = flavor % 10; + flavor /= 10; + if (remainder > 4) + flavor++; + sPokeblockFlavors[i] = flavor; } - pokeblock->color = Blender_GetPokeblockColor(berries, &sUnknown_03000DE8[0], playersNo, var3); - sUnknown_03000DE8[5] = (sUnknown_03000DE8[5] / playersNo) - playersNo; + for (i = 0; i < FLAVOR_COUNT; i++) + sDebug_PokeblockFactorFlavorsAfterRPM[i] = sPokeblockFlavors[i]; - if (sUnknown_03000DE8[5] < 0) - sUnknown_03000DE8[5] = 0; + // Calculate color and feel of pokeblock + pokeblock->color = CalculatePokeblockColor(berries, &sPokeblockFlavors[0], numPlayers, numNegatives); + sPokeblockFlavors[FLAVOR_COUNT] = (sPokeblockFlavors[FLAVOR_COUNT] / numPlayers) - numPlayers; - if (pokeblock->color == 12) + if (sPokeblockFlavors[FLAVOR_COUNT] < 0) + sPokeblockFlavors[FLAVOR_COUNT] = 0; + + if (pokeblock->color == PBLOCK_CLR_BLACK) { - multiuseVar = Random() % 10; - for (i = 0; i < 5; i++) + // Black pokeblocks get their flavors randomly reassigned + multiuseVar = Random() % ARRAY_COUNT(sBlackPokeblockFlavorFlags); + for (i = 0; i < FLAVOR_COUNT; i++) { - if ((sUnknown_08339CC8[multiuseVar] >> i) & 1) - sUnknown_03000DE8[i] = 2; + if ((sBlackPokeblockFlavorFlags[multiuseVar] >> i) & 1) + sPokeblockFlavors[i] = 2; else - sUnknown_03000DE8[i] = 0; + sPokeblockFlavors[i] = 0; } } - for (i = 0; i < 6; i++) + for (i = 0; i < FLAVOR_COUNT + 1; i++) { - if (sUnknown_03000DE8[i] > 255) - sUnknown_03000DE8[i] = 255; + if (sPokeblockFlavors[i] > 255) + sPokeblockFlavors[i] = 255; } - pokeblock->spicy = sUnknown_03000DE8[0]; - pokeblock->dry = sUnknown_03000DE8[1]; - pokeblock->sweet = sUnknown_03000DE8[2]; - pokeblock->bitter = sUnknown_03000DE8[3]; - pokeblock->sour = sUnknown_03000DE8[4]; - pokeblock->feel = sUnknown_03000DE8[5]; + pokeblock->spicy = sPokeblockFlavors[FLAVOR_SPICY]; + pokeblock->dry = sPokeblockFlavors[FLAVOR_DRY]; + pokeblock->sweet = sPokeblockFlavors[FLAVOR_SWEET]; + pokeblock->bitter = sPokeblockFlavors[FLAVOR_BITTER]; + pokeblock->sour = sPokeblockFlavors[FLAVOR_SOUR]; + pokeblock->feel = sPokeblockFlavors[FLAVOR_COUNT]; - for (i = 0; i < 6; i++) - { - flavors[i] = sUnknown_03000DE8[i]; - } + for (i = 0; i < FLAVOR_COUNT + 1; i++) + flavors[i] = sPokeblockFlavors[i]; } -static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavors, u16 a4) +// Unused +static void Debug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 numPlayers, u8* flavors, u16 maxRPM) { - Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavors, a4); + CalculatePokeblock(berries, pokeblock, numPlayers, flavors, maxRPM); } -static void sub_8081E20(void) +static void Debug_SetStageVars(void) { - u32 frames = (u16)(sBerryBlenderData->gameFrameTime); - u16 max_RPM = sBerryBlenderData->max_RPM; - s16 var = 0; + u32 frames = (u16)(sBerryBlender->gameFrameTime); + u16 maxRPM = sBerryBlender->maxRPM; + s16 stage = 0; if (frames < 900) - var = 5; + stage = 5; else if ((u16)(frames - 900) < 600) - var = 4; + stage = 4; else if ((u16)(frames - 1500) < 600) - var = 3; + stage = 3; else if ((u16)(frames - 2100) < 900) - var = 2; + stage = 2; else if ((u16)(frames - 3300) < 300) - var = 1; - - sub_8081BC8(var); - - var = 0; - if (max_RPM <= 64) - { - if (max_RPM >= 50 && max_RPM < 100) - var = -1; - else if (max_RPM >= 100 && max_RPM < 150) - var = -2; - else if (max_RPM >= 150 && max_RPM < 200) - var = -3; - else if (max_RPM >= 200 && max_RPM < 250) - var = -4; - else if (max_RPM >= 250 && max_RPM < 300) - var = -5; - else if (max_RPM >= 350 && max_RPM < 400) - var = -6; - else if (max_RPM >= 400 && max_RPM < 450) - var = -7; - else if (max_RPM >= 500 && max_RPM < 550) - var = -8; - else if (max_RPM >= 550 && max_RPM < 600) - var = -9; - else if (max_RPM >= 600) - var = -10; - } - - sub_8081BB0(var); -} - -static void sub_8081F94(u16 *a0) -{ - if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType) - *a0 = 0x2F00; + stage = 1; + + Debug_SetGameTimeStage(stage); + + stage = 0; + if (maxRPM <= 64) + { + if (maxRPM >= 50 && maxRPM < 100) + stage = -1; + else if (maxRPM >= 100 && maxRPM < 150) + stage = -2; + else if (maxRPM >= 150 && maxRPM < 200) + stage = -3; + else if (maxRPM >= 200 && maxRPM < 250) + stage = -4; + else if (maxRPM >= 250 && maxRPM < 300) + stage = -5; + else if (maxRPM >= 350 && maxRPM < 400) + stage = -6; + else if (maxRPM >= 400 && maxRPM < 450) + stage = -7; + else if (maxRPM >= 500 && maxRPM < 550) + stage = -8; + else if (maxRPM >= 550 && maxRPM < 600) + stage = -9; + else if (maxRPM >= 600) + stage = -10; + } + + Debug_SetMaxRPMStage(stage); +} + +static void SendContinuePromptResponse(u16 *cmd) +{ + if (gReceivedRemoteLinkPlayers && gWirelessCommType) + *cmd = RFUCMD_SEND_PACKET; else - *a0 = 0x2FFF; + *cmd = LINKCMD_SEND_PACKET; } -static void CB2_HandleBlenderEndGame(void) +static void CB2_EndBlenderGame(void) { u8 i, j; - if (sBerryBlenderData->gameEndState < 3) - sub_8082D28(); + if (sBerryBlender->gameEndState < 3) + UpdateBlenderCenter(); GetMultiplayerId(); // unused return value - switch (sBerryBlenderData->gameEndState) + switch (sBerryBlender->gameEndState) { case 1: m4aMPlayTempoControl(&gMPlayInfo_BGM, 256); for (i = 0; i < gSpecialVar_0x8004; i++) { - DestroyTask(sBerryBlenderData->field_120[i]); + DestroyTask(sBerryBlender->opponentTaskIds[i]); } - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; break; case 2: - sBerryBlenderData->field_4C -= 32; - if (sBerryBlenderData->field_4C <= 0) + sBerryBlender->speed -= 32; + if (sBerryBlender->speed <= 0) { ClearLinkCallback(); - sBerryBlenderData->field_4C = 0; + sBerryBlender->speed = 0; - if (gReceivedRemoteLinkPlayers != 0) - sBerryBlenderData->gameEndState++; + if (gReceivedRemoteLinkPlayers) + sBerryBlender->gameEndState++; else - sBerryBlenderData->gameEndState = 5; + sBerryBlender->gameEndState = 5; - sBerryBlenderData->mainState = 0; + sBerryBlender->mainState = 0; m4aMPlayStop(&gMPlayInfo_SE2); } - Blender_ControlHitPitch(); + UpdateHitPitch(); break; case 3: if (GetMultiplayerId() != 0) { - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; } else if (IsLinkTaskFinished()) { - if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType) + if (gReceivedRemoteLinkPlayers && gWirelessCommType) { - sBerryBlenderData->gameBlock.timeRPM.time = sBerryBlenderData->gameFrameTime; - sBerryBlenderData->gameBlock.timeRPM.max_RPM = sBerryBlenderData->max_RPM; + sBerryBlender->gameBlock.timeRPM.time = sBerryBlender->gameFrameTime; + sBerryBlender->gameBlock.timeRPM.maxRPM = sBerryBlender->maxRPM; for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - for (j = 0; j < BLENDER_SCORES_NO; j++) - sBerryBlenderData->gameBlock.scores[i][j] = sBerryBlenderData->scores[i][j]; + for (j = 0; j < NUM_SCORE_TYPES; j++) + sBerryBlender->gameBlock.scores[i][j] = sBerryBlender->scores[i][j]; } - if (SendBlock(0, &sBerryBlenderData->gameBlock, sizeof(sBerryBlenderData->gameBlock))) - sBerryBlenderData->gameEndState++; + if (SendBlock(0, &sBerryBlender->gameBlock, sizeof(sBerryBlender->gameBlock))) + sBerryBlender->gameEndState++; } else { - sBerryBlenderData->smallBlock.time = sBerryBlenderData->gameFrameTime; - sBerryBlenderData->smallBlock.max_RPM = sBerryBlenderData->max_RPM; - if (SendBlock(0, &sBerryBlenderData->smallBlock, sizeof(sBerryBlenderData->smallBlock) + 32)) - sBerryBlenderData->gameEndState++; + sBerryBlender->smallBlock.time = sBerryBlender->gameFrameTime; + sBerryBlender->smallBlock.maxRPM = sBerryBlender->maxRPM; + if (SendBlock(0, &sBerryBlender->smallBlock, sizeof(sBerryBlender->smallBlock) + 32)) + sBerryBlender->gameEndState++; } } break; @@ -2440,64 +2617,64 @@ static void CB2_HandleBlenderEndGame(void) if (GetBlockReceivedStatus()) { ResetBlockReceivedFlags(); - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; - if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType) + if (gReceivedRemoteLinkPlayers && gWirelessCommType) { struct BlenderGameBlock *receivedBlock = (struct BlenderGameBlock*)(&gBlockRecvBuffer); - sBerryBlenderData->max_RPM = receivedBlock->timeRPM.max_RPM; - sBerryBlenderData->gameFrameTime = receivedBlock->timeRPM.time; + sBerryBlender->maxRPM = receivedBlock->timeRPM.maxRPM; + sBerryBlender->gameFrameTime = receivedBlock->timeRPM.time; for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - for (j = 0; j < BLENDER_SCORES_NO; j++) - sBerryBlenderData->scores[i][j] = receivedBlock->scores[i][j]; + for (j = 0; j < NUM_SCORE_TYPES; j++) + sBerryBlender->scores[i][j] = receivedBlock->scores[i][j]; } } else { struct TimeAndRPM *receivedBlock = (struct TimeAndRPM*)(&gBlockRecvBuffer); - sBerryBlenderData->max_RPM = receivedBlock->max_RPM; - sBerryBlenderData->gameFrameTime = receivedBlock->time; + sBerryBlender->maxRPM = receivedBlock->maxRPM; + sBerryBlender->gameFrameTime = receivedBlock->time; } } break; case 5: - if (Blender_PrintBlendingRanking()) - sBerryBlenderData->gameEndState++; + if (PrintBlendingRanking()) + sBerryBlender->gameEndState++; break; case 6: - if (Blender_PrintBlendingResults()) + if (PrintBlendingResults()) { if (gInGameOpponentsNo == 0) IncrementGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS); else IncrementGameStat(GAME_STAT_POKEBLOCKS); - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; } break; case 7: - if (Blender_PrintText(&sBerryBlenderData->textState, sText_WouldLikeToBlendAnotherBerry, GetPlayerTextSpeedDelay())) - sBerryBlenderData->gameEndState++; + if (Blender_PrintText(&sBerryBlender->textState, sText_WouldLikeToBlendAnotherBerry, GetPlayerTextSpeedDelay())) + sBerryBlender->gameEndState++; break; case 9: - sBerryBlenderData->yesNoAnswer = 0; - CreateYesNoMenu(&sBlender_YesNoWindowTemplate, 1, 0xD, 0); - sBerryBlenderData->gameEndState++; + sBerryBlender->yesNoAnswer = 0; + CreateYesNoMenu(&sYesNoWindowTemplate_ContinuePlaying, 1, 0xD, 0); + sBerryBlender->gameEndState++; break; case 10: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case 1: case -1: - sBerryBlenderData->yesNoAnswer = 1; - sBerryBlenderData->gameEndState++; - for (i = 0; i <BLENDER_MAX_PLAYERS; i++) + sBerryBlender->yesNoAnswer = 1; + sBerryBlender->gameEndState++; + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - if (sBerryBlenderData->field_8E[i] != 0xFF) + if (sBerryBlender->arrowIdToPlayerId[i] != NO_PLAYER) { PutWindowTilemap(i); CopyWindowToVram(i, 3); @@ -2505,11 +2682,11 @@ static void CB2_HandleBlenderEndGame(void) } break; case 0: - sBerryBlenderData->yesNoAnswer = 0; - sBerryBlenderData->gameEndState++; - for (i = 0; i <BLENDER_MAX_PLAYERS; i++) + sBerryBlender->yesNoAnswer = 0; + sBerryBlender->gameEndState++; + for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - if (sBerryBlenderData->field_8E[i] != 0xFF) + if (sBerryBlender->arrowIdToPlayerId[i] != NO_PLAYER) { PutWindowTilemap(i); CopyWindowToVram(i, 3); @@ -2519,62 +2696,64 @@ static void CB2_HandleBlenderEndGame(void) } break; case 11: - sub_8081F94(&gSendCmd[0]); - if (sBerryBlenderData->yesNoAnswer == 0) + SendContinuePromptResponse(&gSendCmd[BLENDER_COMM_INPUT_STATE]); + if (sBerryBlender->yesNoAnswer == 0) { - if (IsBagPocketNonEmpty(POCKET_BERRIES) == FALSE) // no berries + if (IsBagPocketNonEmpty(POCKET_BERRIES) == FALSE) { - sBerryBlenderData->playAgainState = CANT_PLAY_NO_BERRIES; - gSendCmd[1] = 0x9999; + // No berries + sBerryBlender->playAgainState = CANT_PLAY_NO_BERRIES; + gSendCmd[BLENDER_COMM_RESP] = LINKCMD_BLENDER_NO_BERRIES; } - else if (GetFirstFreePokeblockSlot() == -1) // no space for pokeblocks + else if (GetFirstFreePokeblockSlot() == -1) { - sBerryBlenderData->playAgainState = CANT_PLAY_NO_PKBLCK_SPACE; - gSendCmd[1] = 0xAAAA; + // No space for pokeblocks + sBerryBlender->playAgainState = CANT_PLAY_NO_PKBLCK_SPACE; + gSendCmd[BLENDER_COMM_RESP] = LINKCMD_BLENDER_NO_PBLOCK_SPACE; } else { - sBerryBlenderData->playAgainState = PLAY_AGAIN_OK; - gSendCmd[1] = 0x7779; + sBerryBlender->playAgainState = PLAY_AGAIN_YES; + gSendCmd[BLENDER_COMM_RESP] = LINKCMD_BLENDER_PLAY_AGAIN; } - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; } else { - sBerryBlenderData->playAgainState = DONT_PLAY_AGAIN; - gSendCmd[1] = 0x8888; - sBerryBlenderData->gameEndState++; + sBerryBlender->playAgainState = PLAY_AGAIN_NO; + gSendCmd[BLENDER_COMM_RESP] = LINKCMD_CONT_BLOCK; + sBerryBlender->gameEndState++; } break; case 12: if (gInGameOpponentsNo) { - SetMainCallback2(CB2_HandlePlayerPlayAgainChoice); - sBerryBlenderData->gameEndState = 0; - sBerryBlenderData->mainState = 0; + SetMainCallback2(CB2_CheckPlayAgainLocal); + sBerryBlender->gameEndState = 0; + sBerryBlender->mainState = 0; } else { - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; } break; case 8: - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; break; case 13: - if (Blender_PrintText(&sBerryBlenderData->textState, sText_CommunicationStandby, GetPlayerTextSpeedDelay())) + if (Blender_PrintText(&sBerryBlender->textState, sText_CommunicationStandby, GetPlayerTextSpeedDelay())) { - SetMainCallback2(CB2_HandlePlayerLinkPlayAgainChoice); - sBerryBlenderData->gameEndState = 0; - sBerryBlenderData->mainState = 0; + SetMainCallback2(CB2_CheckPlayAgainLink); + sBerryBlender->gameEndState = 0; + sBerryBlender->mainState = 0; } break; } - sub_808330C(); - sub_8083230(sBerryBlenderData->field_4C); - sub_8082AD4(); - Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + RestoreBgCoords(); + UpdateRPM(sBerryBlender->speed); + ProcessLinkPlayerCmds(); + Blender_DummiedOutFunc(sBerryBlender->bg_X, sBerryBlender->bg_Y); RunTasks(); AnimateSprites(); BuildOamBuffer(); @@ -2584,30 +2763,30 @@ static void CB2_HandleBlenderEndGame(void) static bool8 LinkPlayAgainHandleSaving(void) { - switch (sBerryBlenderData->field_1A0) + switch (sBerryBlender->linkPlayAgainState) { case 0: SetLinkStandbyCallback(); - sBerryBlenderData->field_1A0 = 1; - sBerryBlenderData->framesToWait = 0; + sBerryBlender->linkPlayAgainState = 1; + sBerryBlender->framesToWait = 0; break; case 1: if (IsLinkTaskFinished()) { - sBerryBlenderData->field_1A0++; + sBerryBlender->linkPlayAgainState++; gSoftResetDisabled = TRUE; } break; case 2: FullSaveGame(); - sBerryBlenderData->field_1A0++; - sBerryBlenderData->framesToWait = 0; + sBerryBlender->linkPlayAgainState++; + sBerryBlender->framesToWait = 0; break; case 3: - if (++sBerryBlenderData->framesToWait == 10) + if (++sBerryBlender->framesToWait == 10) { SetLinkStandbyCallback(); - sBerryBlenderData->field_1A0++; + sBerryBlender->linkPlayAgainState++; } break; case 4: @@ -2615,21 +2794,21 @@ static bool8 LinkPlayAgainHandleSaving(void) { if (CheckSaveFile()) { - sBerryBlenderData->field_1A0 = 5; + sBerryBlender->linkPlayAgainState = 5; } else { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->field_1A0 = 3; + sBerryBlender->framesToWait = 0; + sBerryBlender->linkPlayAgainState = 3; } } break; case 5: - sBerryBlenderData->field_1A0++; - sBerryBlenderData->framesToWait = 0; + sBerryBlender->linkPlayAgainState++; + sBerryBlender->framesToWait = 0; break; case 6: - if (++sBerryBlenderData->framesToWait > 5) + if (++sBerryBlender->framesToWait > 5) { gSoftResetDisabled = FALSE; return TRUE; @@ -2640,113 +2819,115 @@ static bool8 LinkPlayAgainHandleSaving(void) return FALSE; } -static void CB2_HandlePlayerLinkPlayAgainChoice(void) +static void CB2_CheckPlayAgainLink(void) { - switch (sBerryBlenderData->gameEndState) + switch (sBerryBlender->gameEndState) { case 0: - if (sBerryBlenderData->field_64[0] == 0x2222) + if (sBerryBlender->playerContinueResponses[0] == LINKCMD_SEND_LINK_TYPE) { - sBerryBlenderData->gameEndState = 5; + // Link leader says game will continue + sBerryBlender->gameEndState = 5; } - else if (sBerryBlenderData->field_64[0] == 0x1111) + else if (sBerryBlender->playerContinueResponses[0] == LINKCMD_BLENDER_STOP) { - if (sBerryBlenderData->field_6C == 0x9999) - sBerryBlenderData->gameEndState = 2; - else if (sBerryBlenderData->field_6C == 0xAAAA) - sBerryBlenderData->gameEndState = 1; + // Link leader says game will stop, if necessary print why + if (sBerryBlender->canceledPlayerCmd == LINKCMD_BLENDER_NO_BERRIES) + sBerryBlender->gameEndState = 2; + else if (sBerryBlender->canceledPlayerCmd == LINKCMD_BLENDER_NO_PBLOCK_SPACE) + sBerryBlender->gameEndState = 1; else - sBerryBlenderData->gameEndState = 5; + sBerryBlender->gameEndState = 5; } break; case 1: - sBerryBlenderData->gameEndState = 3; - StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_6E].name); + sBerryBlender->gameEndState = 3; + StringCopy(gStringVar4, gLinkPlayers[sBerryBlender->canceledPlayerId].name); StringAppend(gStringVar4, sText_ApostropheSPokeblockCaseIsFull); break; case 2: - sBerryBlenderData->gameEndState++; - StringCopy(gStringVar4, gLinkPlayers[sBerryBlenderData->field_6E].name); + sBerryBlender->gameEndState++; + StringCopy(gStringVar4, gLinkPlayers[sBerryBlender->canceledPlayerId].name); StringAppend(gStringVar4, sText_HasNoBerriesToPut); break; case 3: - if (Blender_PrintText(&sBerryBlenderData->textState, gStringVar4, GetPlayerTextSpeedDelay())) + if (Blender_PrintText(&sBerryBlender->textState, gStringVar4, GetPlayerTextSpeedDelay())) { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->gameEndState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->gameEndState++; } break; case 4: - if (++sBerryBlenderData->framesToWait > 60) - sBerryBlenderData->gameEndState = 5; + if (++sBerryBlender->framesToWait > 60) + sBerryBlender->gameEndState = 5; break; case 5: - Blender_PrintText(&sBerryBlenderData->textState, gText_SavingDontTurnOff2, 0); + Blender_PrintText(&sBerryBlender->textState, gText_SavingDontTurnOff2, 0); SetLinkStandbyCallback(); - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; break; case 6: if (IsLinkTaskFinished()) { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->gameEndState++; - sBerryBlenderData->field_1A0 = 0; + sBerryBlender->framesToWait = 0; + sBerryBlender->gameEndState++; + sBerryBlender->linkPlayAgainState = 0; } break; case 7: if (LinkPlayAgainHandleSaving()) { PlaySE(SE_SAVE); - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; } break; case 8: - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; SetLinkStandbyCallback(); break; case 9: if (IsLinkTaskFinished()) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; } break; case 10: if (!gPaletteFade.active) { - if (sBerryBlenderData->field_64[0] == 0x2222) + if (sBerryBlender->playerContinueResponses[0] == LINKCMD_SEND_LINK_TYPE) { FreeAllWindowBuffers(); UnsetBgTilemapBuffer(2); UnsetBgTilemapBuffer(1); - FREE_AND_SET_NULL(sBerryBlenderData); + FREE_AND_SET_NULL(sBerryBlender); SetMainCallback2(DoBerryBlending); } else { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->gameEndState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->gameEndState++; } } break; case 11: - if (++sBerryBlenderData->framesToWait > 30) + if (++sBerryBlender->framesToWait > 30) { SetCloseLinkCallback(); - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; } break; case 12: - if (gReceivedRemoteLinkPlayers == 0) + if (!gReceivedRemoteLinkPlayers) { - FREE_AND_SET_NULL(sBerryBlenderData); + FREE_AND_SET_NULL(sBerryBlender); SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } break; } - sub_8082AD4(); - Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + ProcessLinkPlayerCmds(); + Blender_DummiedOutFunc(sBerryBlender->bg_X, sBerryBlender->bg_Y); RunTasks(); AnimateSprites(); BuildOamBuffer(); @@ -2754,40 +2935,40 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void) UpdatePaletteFade(); } -static void CB2_HandlePlayerPlayAgainChoice(void) +static void CB2_CheckPlayAgainLocal(void) { - switch (sBerryBlenderData->gameEndState) + switch (sBerryBlender->gameEndState) { case 0: - if (sBerryBlenderData->playAgainState == PLAY_AGAIN_OK || sBerryBlenderData->playAgainState == DONT_PLAY_AGAIN) - sBerryBlenderData->gameEndState = 9; - if (sBerryBlenderData->playAgainState == CANT_PLAY_NO_BERRIES) - sBerryBlenderData->gameEndState = 2; - if (sBerryBlenderData->playAgainState == CANT_PLAY_NO_PKBLCK_SPACE) - sBerryBlenderData->gameEndState = 1; + if (sBerryBlender->playAgainState == PLAY_AGAIN_YES || sBerryBlender->playAgainState == PLAY_AGAIN_NO) + sBerryBlender->gameEndState = 9; + if (sBerryBlender->playAgainState == CANT_PLAY_NO_BERRIES) + sBerryBlender->gameEndState = 2; + if (sBerryBlender->playAgainState == CANT_PLAY_NO_PKBLCK_SPACE) + sBerryBlender->gameEndState = 1; break; case 1: - sBerryBlenderData->gameEndState = 3; - sBerryBlenderData->textState = 0; + sBerryBlender->gameEndState = 3; + sBerryBlender->textState = 0; StringCopy(gStringVar4, sText_YourPokeblockCaseIsFull); break; case 2: - sBerryBlenderData->gameEndState++; - sBerryBlenderData->textState = 0; + sBerryBlender->gameEndState++; + sBerryBlender->textState = 0; StringCopy(gStringVar4, sText_RunOutOfBerriesForBlending); break; case 3: - if (Blender_PrintText(&sBerryBlenderData->textState, gStringVar4, GetPlayerTextSpeedDelay())) - sBerryBlenderData->gameEndState = 9; + if (Blender_PrintText(&sBerryBlender->textState, gStringVar4, GetPlayerTextSpeedDelay())) + sBerryBlender->gameEndState = 9; break; case 9: BeginFastPaletteFade(3); - sBerryBlenderData->gameEndState++; + sBerryBlender->gameEndState++; break; case 10: if (!gPaletteFade.active) { - if (sBerryBlenderData->playAgainState == PLAY_AGAIN_OK) + if (sBerryBlender->playAgainState == PLAY_AGAIN_YES) SetMainCallback2(DoBerryBlending); else SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); @@ -2795,13 +2976,13 @@ static void CB2_HandlePlayerPlayAgainChoice(void) FreeAllWindowBuffers(); UnsetBgTilemapBuffer(2); UnsetBgTilemapBuffer(1); - FREE_AND_SET_NULL(sBerryBlenderData); + FREE_AND_SET_NULL(sBerryBlender); } break; } - sub_8082AD4(); - Blender_DummiedOutFunc(sBerryBlenderData->bg_X, sBerryBlenderData->bg_Y); + ProcessLinkPlayerCmds(); + Blender_DummiedOutFunc(sBerryBlender->bg_X, sBerryBlender->bg_Y); RunTasks(); AnimateSprites(); BuildOamBuffer(); @@ -2809,152 +2990,169 @@ static void CB2_HandlePlayerPlayAgainChoice(void) UpdatePaletteFade(); } -static void sub_8082AD4(void) +static void ProcessLinkPlayerCmds(void) { if (gReceivedRemoteLinkPlayers) { - if (sub_80814B0(gRecvCmds[0][0], 0x2FFF, 0x2F00)) + if (CheckRecvCmdMatches(gRecvCmds[0][BLENDER_COMM_INPUT_STATE], LINKCMD_SEND_PACKET, RFUCMD_SEND_PACKET)) { - if (gRecvCmds[0][1] == 0x1111) + if (gRecvCmds[0][BLENDER_COMM_RESP] == LINKCMD_BLENDER_STOP) { - switch (gRecvCmds[0][2]) + // Link leader has indicated play is stopping, read signal to determine why + switch (gRecvCmds[0][BLENDER_COMM_STOP_TYPE]) { - case 0x8888: - sBerryBlenderData->field_6C = 0x8888; - sBerryBlenderData->field_6E = gRecvCmds[0][3]; + case LINKCMD_CONT_BLOCK: // Someone selected "No" to continue playing + sBerryBlender->canceledPlayerCmd = LINKCMD_CONT_BLOCK; + sBerryBlender->canceledPlayerId = gRecvCmds[0][BLENDER_COMM_PLAYER_ID]; break; - case 0x9999: - sBerryBlenderData->field_6C = 0x9999; - sBerryBlenderData->field_6E = gRecvCmds[0][3]; + case LINKCMD_BLENDER_NO_BERRIES: + sBerryBlender->canceledPlayerCmd = LINKCMD_BLENDER_NO_BERRIES; + sBerryBlender->canceledPlayerId = gRecvCmds[0][BLENDER_COMM_PLAYER_ID]; break; - case 0xAAAA: - sBerryBlenderData->field_6C = 0xAAAA; - sBerryBlenderData->field_6E = gRecvCmds[0][3]; + case LINKCMD_BLENDER_NO_PBLOCK_SPACE: + sBerryBlender->canceledPlayerCmd = LINKCMD_BLENDER_NO_PBLOCK_SPACE; + sBerryBlender->canceledPlayerId = gRecvCmds[0][BLENDER_COMM_PLAYER_ID]; break; } - sBerryBlenderData->field_64[0] = 0x1111; + sBerryBlender->playerContinueResponses[0] = LINKCMD_BLENDER_STOP; } - else if (gRecvCmds[0][1] == 0x2222) + else if (gRecvCmds[0][BLENDER_COMM_RESP] == LINKCMD_SEND_LINK_TYPE) { - sBerryBlenderData->field_64[0] = 0x2222; + // Link leader has indicated play will continue + sBerryBlender->playerContinueResponses[0] = LINKCMD_SEND_LINK_TYPE; } } - if (GetMultiplayerId() == 0 && sBerryBlenderData->field_64[0] != 0x1111 && sBerryBlenderData->field_64[0] != 0x2222) + + // If player is link leader, check for responses to the "Continue playing" prompt (even if it's not up yet) + if (GetMultiplayerId() == 0 + && sBerryBlender->playerContinueResponses[0] != LINKCMD_BLENDER_STOP + && sBerryBlender->playerContinueResponses[0] != LINKCMD_SEND_LINK_TYPE) { u8 i; + + // Try to gather responses for (i = 0; i < GetLinkPlayerCount(); i++) { - if (sub_80814B0(gRecvCmds[i][0], 0x2FFF, 0x2F00)) + if (CheckRecvCmdMatches(gRecvCmds[i][BLENDER_COMM_INPUT_STATE], LINKCMD_SEND_PACKET, RFUCMD_SEND_PACKET)) { - switch (gRecvCmds[i][1]) + switch (gRecvCmds[i][BLENDER_COMM_RESP]) { - case 0x8888: - sBerryBlenderData->field_64[i] = 0x8888; + case LINKCMD_CONT_BLOCK: // Selected "No" + sBerryBlender->playerContinueResponses[i] = LINKCMD_CONT_BLOCK; break; - case 0x7779: - sBerryBlenderData->field_64[i] = 0x7779; + case LINKCMD_BLENDER_PLAY_AGAIN: // Selected "Yes" + sBerryBlender->playerContinueResponses[i] = LINKCMD_BLENDER_PLAY_AGAIN; break; - case 0x9999: - sBerryBlenderData->field_64[i] = 0x9999; + case LINKCMD_BLENDER_NO_BERRIES: + sBerryBlender->playerContinueResponses[i] = LINKCMD_BLENDER_NO_BERRIES; break; - case 0xAAAA: - sBerryBlenderData->field_64[i] = 0xAAAA; + case LINKCMD_BLENDER_NO_PBLOCK_SPACE: + sBerryBlender->playerContinueResponses[i] = LINKCMD_BLENDER_NO_PBLOCK_SPACE; break; } } } + + // Count players that have responded, stopping at first non-response for (i = 0; i < GetLinkPlayerCount(); i++) { - if (sBerryBlenderData->field_64[i] == 0) + if (sBerryBlender->playerContinueResponses[i] == 0) break; } + + // If all players responded, handle response if (i == GetLinkPlayerCount()) { + // Count players that decided to play again, stopping at first negative response for (i = 0; i < GetLinkPlayerCount(); i++) { - if (sBerryBlenderData->field_64[i] != 0x7779) + if (sBerryBlender->playerContinueResponses[i] != LINKCMD_BLENDER_PLAY_AGAIN) break; } - sub_8081F94(&gSendCmd[0]); + + // Schedule signal to other players about whether or not play will continue + SendContinuePromptResponse(&gSendCmd[BLENDER_COMM_INPUT_STATE]); if (i == GetLinkPlayerCount()) { - gSendCmd[1] = 0x2222; + // All players chose to continue playing + gSendCmd[BLENDER_COMM_RESP] = LINKCMD_SEND_LINK_TYPE; } else { - gSendCmd[1] = 0x1111; - gSendCmd[2] = sBerryBlenderData->field_64[i]; - gSendCmd[3] = i; + // At least 1 player decided to stop playing, or can't continue playing + gSendCmd[BLENDER_COMM_RESP] = LINKCMD_BLENDER_STOP; + gSendCmd[BLENDER_COMM_STOP_TYPE] = sBerryBlender->playerContinueResponses[i]; + gSendCmd[BLENDER_COMM_PLAYER_ID] = i; } } } } } -static void sub_8082CB4(struct BgAffineSrcData *dest) +static void DrawBlenderCenter(struct BgAffineSrcData *dest) { struct BgAffineSrcData affineSrc; affineSrc.texX = 0x7800; affineSrc.texY = 0x5000; - affineSrc.scrX = 0x78 - sBerryBlenderData->bg_X; - affineSrc.scrY = 0x50 - sBerryBlenderData->bg_Y; - affineSrc.sx = sBerryBlenderData->field_11A; - affineSrc.sy = sBerryBlenderData->field_11A; - affineSrc.alpha = sBerryBlenderData->arrowPos; + affineSrc.scrX = 0x78 - sBerryBlender->bg_X; + affineSrc.scrY = 0x50 - sBerryBlender->bg_Y; + affineSrc.sx = sBerryBlender->centerScale; + affineSrc.sy = sBerryBlender->centerScale; + affineSrc.alpha = sBerryBlender->arrowPos; *dest = affineSrc; } u16 GetBlenderArrowPosition(void) { - return sBerryBlenderData->arrowPos; + return sBerryBlender->arrowPos; } -static void sub_8082D28(void) +static void UpdateBlenderCenter(void) { u8 playerId = 0; - if (gReceivedRemoteLinkPlayers != 0) + if (gReceivedRemoteLinkPlayers) playerId = GetMultiplayerId(); - if (gWirelessCommType && gReceivedRemoteLinkPlayers != 0) + if (gWirelessCommType && gReceivedRemoteLinkPlayers) { if (playerId == 0) { - sBerryBlenderData->arrowPos += sBerryBlenderData->field_4C; - gSendCmd[5] = sBerryBlenderData->field_116; - gSendCmd[6] = sBerryBlenderData->arrowPos; - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + sBerryBlender->arrowPos += sBerryBlender->speed; + gSendCmd[BLENDER_COMM_PROGRESS_BAR] = sBerryBlender->progressBarValue; + gSendCmd[BLENDER_COMM_ARROW_POS] = sBerryBlender->arrowPos; + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); } else { - if ((gRecvCmds[0][0] & 0xFF00) == 0x4400) + if ((gRecvCmds[0][BLENDER_COMM_INPUT_STATE] & 0xFF00) == RFUCMD_BLENDER_SEND_KEYS) { - sBerryBlenderData->field_116 = gRecvCmds[0][5]; - sBerryBlenderData->arrowPos = gRecvCmds[0][6]; - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + sBerryBlender->progressBarValue = gRecvCmds[0][BLENDER_COMM_PROGRESS_BAR]; + sBerryBlender->arrowPos = gRecvCmds[0][BLENDER_COMM_ARROW_POS]; + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); } } } else { - sBerryBlenderData->arrowPos += sBerryBlenderData->field_4C; - sub_8082CB4(&sBerryBlenderData->bgAffineSrc); + sBerryBlender->arrowPos += sBerryBlender->speed; + DrawBlenderCenter(&sBerryBlender->bgAffineSrc); } } -static void BerryBlender_SetBackgroundsPos(void) +static void SetBgPos(void) { - SetGpuReg(REG_OFFSET_BG1HOFS, sBerryBlenderData->bg_X); - SetGpuReg(REG_OFFSET_BG1VOFS, sBerryBlenderData->bg_Y); + SetGpuReg(REG_OFFSET_BG1HOFS, sBerryBlender->bg_X); + SetGpuReg(REG_OFFSET_BG1VOFS, sBerryBlender->bg_Y); - SetGpuReg(REG_OFFSET_BG0HOFS, sBerryBlenderData->bg_X); - SetGpuReg(REG_OFFSET_BG0VOFS, sBerryBlenderData->bg_Y); + SetGpuReg(REG_OFFSET_BG0HOFS, sBerryBlender->bg_X); + SetGpuReg(REG_OFFSET_BG0VOFS, sBerryBlender->bg_Y); } -static void sub_8082E3C(struct Sprite* sprite) +static void SpriteCB_Particle(struct Sprite* sprite) { sprite->data[2] += sprite->data[0]; sprite->data[3] += sprite->data[1]; @@ -2965,7 +3163,7 @@ static void sub_8082E3C(struct Sprite* sprite) DestroySprite(sprite); } -static void sub_8082E84(void) +static void CreateParticleSprites(void) { s32 limit = (Random() % 2) + 1; s32 i; @@ -2976,20 +3174,20 @@ static void sub_8082E84(void) s32 x, y; u8 spriteId; - rand = sBerryBlenderData->arrowPos + (Random() % 20); + rand = sBerryBlender->arrowPos + (Random() % 20); x = gSineTable[(rand & 0xFF) + 64] / 4; y = gSineTable[(rand & 0xFF)] / 4; - spriteId = CreateSprite(&sUnknown_08339BE0, x + 120, y + 80, 1); + spriteId = CreateSprite(&sSpriteTemplate_Particles, x + 120, y + 80, 1); gSprites[spriteId].data[0] = 16 - (Random() % 32); gSprites[spriteId].data[1] = 16 - (Random() % 32); - gSprites[spriteId].callback = sub_8082E3C; + gSprites[spriteId].callback = SpriteCB_Particle; } } -static void sub_8082F68(struct Sprite* sprite) +static void SpriteCB_ScoreSymbol(struct Sprite* sprite) { sprite->data[0]++; sprite->pos2.y = -(sprite->data[0] / 3); @@ -2998,7 +3196,7 @@ static void sub_8082F68(struct Sprite* sprite) DestroySprite(sprite); } -static void sub_8082F9C(struct Sprite* sprite) +static void SpriteCB_ScoreSymbolBest(struct Sprite* sprite) { sprite->data[0]++; sprite->pos2.y = -(sprite->data[0] * 2); @@ -3009,56 +3207,65 @@ static void sub_8082F9C(struct Sprite* sprite) DestroySprite(sprite); } -static void Blender_SetParticipantBerryData(u8 participantId, u16 itemId) +static void SetPlayerBerryData(u8 playerId, u16 itemId) { - sBerryBlenderData->chosenItemId[participantId] = itemId; - Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[participantId], itemId); + sBerryBlender->chosenItemId[playerId] = itemId; + ConvertItemToBlenderBerry(&sBerryBlender->blendedBerries[playerId], itemId); } -static void sub_8083010(struct Sprite* sprite) +#define sState data[0] +#define sYPos data[1] +#define sDelay data[2] +#define sAnimId data[3] + +static void SpriteCB_CountdownNumber(struct Sprite* sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - sprite->data[1] += 8; - if (sprite->data[1] > 88) + sprite->sYPos += 8; + if (sprite->sYPos > DISPLAY_HEIGHT / 2 + 8) { - sprite->data[1] = 88; - sprite->data[0]++; + sprite->sYPos = DISPLAY_HEIGHT / 2 + 8; + sprite->sState++; PlaySE(SE_BALL_BOUNCE_1); } break; case 1: - sprite->data[2] += 1; - if (sprite->data[2] > 20) + if (++sprite->sDelay > 20) { - sprite->data[0]++; - sprite->data[2] = 0; + sprite->sState++; + sprite->sDelay = 0; } break; case 2: - sprite->data[1] += 4; - if (sprite->data[1] > 176) + sprite->sYPos += 4; + if (sprite->sYPos > DISPLAY_HEIGHT + 16) { - if (++sprite->data[3] == 3) + if (++sprite->sAnimId == 3) { DestroySprite(sprite); - CreateSprite(&sUnknown_08339C60, 120, -20, 2); + CreateSprite(&sSpriteTemplate_Start, 120, -20, 2); } else { - sprite->data[0] = 0; - sprite->data[1] = -16; - StartSpriteAnim(sprite, sprite->data[3]); + sprite->sState = 0; + sprite->sYPos = -16; + StartSpriteAnim(sprite, sprite->sAnimId); } } break; } - sprite->pos2.y = sprite->data[1]; + sprite->pos2.y = sprite->sYPos; } -static void sub_80830C0(struct Sprite* sprite) +#undef sState +#undef sYPos +#undef sDelay +#undef sAnimId + +static void SpriteCB_Start(struct Sprite* sprite) { switch (sprite->data[0]) { @@ -3078,9 +3285,9 @@ static void sub_80830C0(struct Sprite* sprite) break; case 2: sprite->data[1] += 4; - if (sprite->data[1] > 176) + if (sprite->data[1] > DISPLAY_HEIGHT + 16) { - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; DestroySprite(sprite); } break; @@ -3089,175 +3296,190 @@ static void sub_80830C0(struct Sprite* sprite) sprite->pos2.y = sprite->data[1]; } -static void sub_8083140(u16 a0, u16 a1) +static void TryUpdateProgressBar(u16 current, u16 limit) { - if (sBerryBlenderData->field_118 < a0) + // Progress bar doesn't move unless it's going up + if (sBerryBlender->maxProgressBarValue < current) { - sBerryBlenderData->field_118 += 2; - sub_8083170(sBerryBlenderData->field_118, a1); + sBerryBlender->maxProgressBarValue += 2; + UpdateProgressBar(sBerryBlender->maxProgressBarValue, limit); } } -static void sub_8083170(u16 a0, u16 a1) +static void UpdateProgressBar(u16 value, u16 limit) { - s32 var1, var2, var3, var4; + s32 amountFilled, maxFilledSegment, subSegmentsFilled, i; u16 *vram; vram = (u16*)(BG_SCREEN_ADDR(12)); - var1 = (a0 * 64) / a1; - var2 = var1 / 8; - for (var4 = 0; var4 < var2; var4++) + amountFilled = (value * 64) / limit; + maxFilledSegment = amountFilled / 8; + + // Set filled progress bar tiles in full segments + for (i = 0; i < maxFilledSegment; i++) { - vram[11 + var4] = 0x80E9; - vram[43 + var4] = 0x80F9; + vram[11 + i] = PROGRESS_BAR_FILLED_TOP; + vram[43 + i] = PROGRESS_BAR_FILLED_BOTTOM; } - var3 = var1 % 8; - if (var3 != 0) + + // If progress bar between segments, fill with the corresponding partial segment tiles + subSegmentsFilled = amountFilled % 8; + if (subSegmentsFilled != 0) { - vram[11 + var4] = var3 + 0x80E1; - vram[43 + var4] = var3 + 0x80F1; - var4++; + vram[11 + i] = subSegmentsFilled + PROGRESS_BAR_EMPTY_TOP; + vram[43 + i] = subSegmentsFilled + PROGRESS_BAR_EMPTY_BOTTOM; + i++; } - for (; var4 < 8; var4++) + + // Fill the remaining full segments with empty progress tiles + // Essentially unnecessary, given that it starts empty and progress only goes up + for (; i < 8; i++) { - vram[11 + var4] = 0x80E1; - vram[43 + var4] = 0x80F1; + vram[11 + i] = PROGRESS_BAR_EMPTY_TOP; + vram[43 + i] = PROGRESS_BAR_EMPTY_BOTTOM; } } -static u32 sub_8083210(u16 a0) +static u32 ArrowSpeedToRPM(u16 speed) { - return 0x57E40 * a0 / 0x10000; + return 60 * 60 * 100 * speed / MAX_ARROW_POS; } -static void sub_8083230(u16 a0) +static void UpdateRPM(u16 speed) { u8 i; - u8 palAdders[5]; + u8 digits[5]; - u32 var = sub_8083210(a0); - if (sBerryBlenderData->max_RPM < var) - sBerryBlenderData->max_RPM = var; + // Check if new max RPM has been reached + u32 currentRPM = ArrowSpeedToRPM(speed); + if (sBerryBlender->maxRPM < currentRPM) + sBerryBlender->maxRPM = currentRPM; + + // Draw the current RPM number at the bottom of the screen for (i = 0; i < 5; i++) { - palAdders[i] = var % 10; - var /= 10; + digits[i] = currentRPM % 10; + currentRPM /= 10; } - *((u16*)(VRAM + 0x6458)) = palAdders[4] + 0x8072; - *((u16*)(VRAM + 0x645A)) = palAdders[3] + 0x8072; - *((u16*)(VRAM + 0x645C)) = palAdders[2] + 0x8072; - *((u16*)(VRAM + 0x6460)) = palAdders[1] + 0x8072; - *((u16*)(VRAM + 0x6462)) = palAdders[0] + 0x8072; + *((u16*)(BG_SCREEN_ADDR(12) + 0x458)) = digits[4] + RPM_DIGIT; + *((u16*)(BG_SCREEN_ADDR(12) + 0x45A)) = digits[3] + RPM_DIGIT; + *((u16*)(BG_SCREEN_ADDR(12) + 0x45C)) = digits[2] + RPM_DIGIT; + *((u16*)(BG_SCREEN_ADDR(12) + 0x460)) = digits[1] + RPM_DIGIT; + *((u16*)(BG_SCREEN_ADDR(12) + 0x462)) = digits[0] + RPM_DIGIT; } -static void sub_80832BC(s16* a0, u16 a1) +// Passed a pointer to the bg x/y +// Used when hitting a Best at high RPM +static void ShakeBgCoordForHit(s16* coord, u16 speed) { - if (*a0 == 0) - *a0 = (Random() % a1) - (a1 / 2); + if (*coord == 0) + *coord = (Random() % speed) - (speed / 2); } -static void sub_80832E8(s16* a0) +static void RestoreBgCoord(s16* coord) { - if (*a0 < 0) - (*a0)++; - if (*a0 > 0) - (*a0)--; + if (*coord < 0) + (*coord)++; + if (*coord > 0) + (*coord)--; } -static void sub_808330C(void) +// For "unshaking" the screen after ShakeBgCoordForHit is called +static void RestoreBgCoords(void) { - sub_80832E8((s16 *)&sBerryBlenderData->bg_X); - sub_80832E8((s16 *)&sBerryBlenderData->bg_Y); + RestoreBgCoord((s16 *)&sBerryBlender->bg_X); + RestoreBgCoord((s16 *)&sBerryBlender->bg_Y); } -static void sub_8083334(s16* a0, u16 a1) +static void BlenderLandShakeBgCoord(s16* coord, u16 timer) { - u8 var; + u8 strength; - if (a1 < 10) - var = 16; + if (timer < 10) + strength = 16; else - var = 8; + strength = 8; - if (*a0 == 0) + if (*coord == 0) { - *a0 = (Random() % var) - (var / 2); + *coord = (Random() % strength) - (strength / 2); } else { - if (*a0 < 0) - (*a0)++; - if (*a0 > 0) - (*a0)--; + if (*coord < 0) + (*coord)++; + if (*coord > 0) + (*coord)--; } } -static bool8 sub_8083380(void) +// For shaking the screen when the blender lands after falling in at the start +static bool8 UpdateBlenderLandScreenShake(void) { - if (sBerryBlenderData->framesToWait == 0) + if (sBerryBlender->framesToWait == 0) { - sBerryBlenderData->bg_X = 0; - sBerryBlenderData->bg_Y = 0; + sBerryBlender->bg_X = 0; + sBerryBlender->bg_Y = 0; } - sBerryBlenderData->framesToWait++; - sub_8083334(&sBerryBlenderData->bg_X, sBerryBlenderData->framesToWait); - sub_8083334(&sBerryBlenderData->bg_Y, sBerryBlenderData->framesToWait); + sBerryBlender->framesToWait++; + BlenderLandShakeBgCoord(&sBerryBlender->bg_X, sBerryBlender->framesToWait); + BlenderLandShakeBgCoord(&sBerryBlender->bg_Y, sBerryBlender->framesToWait); - if (sBerryBlenderData->framesToWait == 20) + if (sBerryBlender->framesToWait == 20) { - sBerryBlenderData->bg_X = 0; - sBerryBlenderData->bg_Y = 0; + sBerryBlender->bg_X = 0; + sBerryBlender->bg_Y = 0; return TRUE; } return FALSE; } -static void sub_80833F8(struct Sprite* sprite) +static void SpriteCB_PlayerArrow(struct Sprite* sprite) { - sprite->pos2.x = -(sBerryBlenderData->bg_X); - sprite->pos2.y = -(sBerryBlenderData->bg_Y); + sprite->pos2.x = -(sBerryBlender->bg_X); + sprite->pos2.y = -(sBerryBlender->bg_Y); } static void TryUpdateBerryBlenderRecord(void) { - if (gSaveBlock1Ptr->berryBlenderRecords[sBerryBlenderData->playersNo - 2] < sBerryBlenderData->max_RPM) - gSaveBlock1Ptr->berryBlenderRecords[sBerryBlenderData->playersNo - 2] = sBerryBlenderData->max_RPM; + if (gSaveBlock1Ptr->berryBlenderRecords[sBerryBlender->numPlayers - 2] < sBerryBlender->maxRPM) + gSaveBlock1Ptr->berryBlenderRecords[sBerryBlender->numPlayers - 2] = sBerryBlender->maxRPM; } -static bool8 Blender_PrintBlendingResults(void) +static bool8 PrintBlendingResults(void) { u16 i; s32 xPos, yPos; struct Pokeblock pokeblock; - u8 flavors[6]; + u8 flavors[FLAVOR_COUNT + 1]; u8 text[40]; u16 berryIds[4]; // unused - switch (sBerryBlenderData->mainState) + switch (sBerryBlender->mainState) { case 0: - sBerryBlenderData->mainState++; - sBerryBlenderData->framesToWait = 17; + sBerryBlender->mainState++; + sBerryBlender->framesToWait = 17; break; case 1: - sBerryBlenderData->framesToWait -= 10; - if (sBerryBlenderData->framesToWait < 0) + sBerryBlender->framesToWait -= 10; + if (sBerryBlender->framesToWait < 0) { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; } break; case 2: - if (++sBerryBlenderData->framesToWait > 20) + if (++sBerryBlender->framesToWait > 20) { - for (i = 0; i < BLENDER_SCORES_NO; i++) - DestroySprite(&gSprites[sBerryBlenderData->scoreIconIds[i]]); + for (i = 0; i < NUM_SCORE_TYPES; i++) + DestroySprite(&gSprites[sBerryBlender->scoreIconIds[i]]); - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; } break; case 3: @@ -3268,92 +3490,91 @@ static bool8 Blender_PrintBlendingResults(void) xPos = GetStringCenterAlignXOffset(1, sText_BlendingResults, 0xA8); Blender_AddTextPrinter(5, sText_BlendingResults, xPos, 1, TEXT_SPEED_FF, 0); - if (sBerryBlenderData->playersNo == 4) + if (sBerryBlender->numPlayers == BLENDER_MAX_PLAYERS) yPos = 17; else yPos = 21; - for (i = 0; i < sBerryBlenderData->playersNo; yPos += 16, i++) + for (i = 0; i < sBerryBlender->numPlayers; yPos += 16, i++) { - u8 place = sBerryBlenderData->playerPlaces[i]; - - ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1); - StringAppend(sBerryBlenderData->stringVar, sText_Dot); - StringAppend(sBerryBlenderData->stringVar, gText_Space); - StringAppend(sBerryBlenderData->stringVar, gLinkPlayers[place].name); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 8, yPos, TEXT_SPEED_FF, 3); - - StringCopy(sBerryBlenderData->stringVar, sBerryBlenderData->blendedBerries[place].name); - ConvertInternationalString(sBerryBlenderData->stringVar, gLinkPlayers[place].language); - StringAppend(sBerryBlenderData->stringVar, sText_SpaceBerry); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x54, yPos, TEXT_SPEED_FF, 3); + u8 place = sBerryBlender->playerPlaces[i]; + + ConvertIntToDecimalStringN(sBerryBlender->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1); + StringAppend(sBerryBlender->stringVar, sText_Dot); + StringAppend(sBerryBlender->stringVar, gText_Space); + StringAppend(sBerryBlender->stringVar, gLinkPlayers[place].name); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, 8, yPos, TEXT_SPEED_FF, 3); + + StringCopy(sBerryBlender->stringVar, sBerryBlender->blendedBerries[place].name); + ConvertInternationalString(sBerryBlender->stringVar, gLinkPlayers[place].language); + StringAppend(sBerryBlender->stringVar, sText_SpaceBerry); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, 0x54, yPos, TEXT_SPEED_FF, 3); } Blender_AddTextPrinter(5, sText_MaximumSpeed, 0, 0x51, TEXT_SPEED_FF, 3); - ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->max_RPM / 100, STR_CONV_MODE_RIGHT_ALIGN, 3); - StringAppend(sBerryBlenderData->stringVar, sText_Dot); + ConvertIntToDecimalStringN(sBerryBlender->stringVar, sBerryBlender->maxRPM / 100, STR_CONV_MODE_RIGHT_ALIGN, 3); + StringAppend(sBerryBlender->stringVar, sText_Dot); - ConvertIntToDecimalStringN(text, sBerryBlenderData->max_RPM % 100, STR_CONV_MODE_LEADING_ZEROS, 2); - StringAppend(sBerryBlenderData->stringVar, text); - StringAppend(sBerryBlenderData->stringVar, sText_RPM); + ConvertIntToDecimalStringN(text, sBerryBlender->maxRPM % 100, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(sBerryBlender->stringVar, text); + StringAppend(sBerryBlender->stringVar, sText_RPM); - xPos = GetStringRightAlignXOffset(1, sBerryBlenderData->stringVar, 0xA8); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, xPos, 0x51, TEXT_SPEED_FF, 3); + xPos = GetStringRightAlignXOffset(1, sBerryBlender->stringVar, 0xA8); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, xPos, 0x51, TEXT_SPEED_FF, 3); Blender_AddTextPrinter(5, sText_Time, 0, 0x61, TEXT_SPEED_FF, 3); - seconds = (sBerryBlenderData->gameFrameTime / 60) % 60; - minutes = (sBerryBlenderData->gameFrameTime / (60 * 60)); + seconds = (sBerryBlender->gameFrameTime / 60) % 60; + minutes = (sBerryBlender->gameFrameTime / (60 * 60)); - ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); - txtPtr = StringAppend(sBerryBlenderData->stringVar, sText_Min); + ConvertIntToDecimalStringN(sBerryBlender->stringVar, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); + txtPtr = StringAppend(sBerryBlender->stringVar, sText_Min); ConvertIntToDecimalStringN(txtPtr, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); - StringAppend(sBerryBlenderData->stringVar, sText_Sec); + StringAppend(sBerryBlender->stringVar, sText_Sec); - xPos = GetStringRightAlignXOffset(1, sBerryBlenderData->stringVar, 0xA8); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, xPos, 0x61, TEXT_SPEED_FF, 3); + xPos = GetStringRightAlignXOffset(1, sBerryBlender->stringVar, 0xA8); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, xPos, 0x61, TEXT_SPEED_FF, 3); - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; CopyWindowToVram(5, 2); } break; case 4: - if (gMain.newKeys & A_BUTTON) - sBerryBlenderData->mainState++; + if (JOY_NEW(A_BUTTON)) + sBerryBlender->mainState++; break; case 5: ClearStdWindowAndFrameToTransparent(5, 1); for (i = 0; i < BLENDER_MAX_PLAYERS; i++) { - if (sBerryBlenderData->chosenItemId[i] != 0) - berryIds[i] = sBerryBlenderData->chosenItemId[i] - FIRST_BERRY_INDEX; - if (sBerryBlenderData->field_8E[i] != 0xFF) + if (sBerryBlender->chosenItemId[i] != 0) + berryIds[i] = sBerryBlender->chosenItemId[i] - FIRST_BERRY_INDEX; + if (sBerryBlender->arrowIdToPlayerId[i] != NO_PLAYER) { PutWindowTilemap(i); CopyWindowToVram(i, 3); } } - sub_8081E20(); - - Blender_CalculatePokeblock(sBerryBlenderData->blendedBerries, &pokeblock, sBerryBlenderData->playersNo, flavors, sBerryBlenderData->max_RPM); - Blender_PrintMadePokeblockString(&pokeblock, sBerryBlenderData->stringVar); - TryAddContestLinkTvShow(&pokeblock, &sBerryBlenderData->tvBlender); + Debug_SetStageVars(); + CalculatePokeblock(sBerryBlender->blendedBerries, &pokeblock, sBerryBlender->numPlayers, flavors, sBerryBlender->maxRPM); + PrintMadePokeblockString(&pokeblock, sBerryBlender->stringVar); + TryAddContestLinkTvShow(&pokeblock, &sBerryBlender->tvBlender); - CreateTask(sub_8083F3C, 6); + CreateTask(Task_PlayPokeblockFanfare, 6); IncrementDailyBerryBlender(); RemoveBagItem(gSpecialVar_ItemId, 1); AddPokeblock(&pokeblock); - sBerryBlenderData->textState = 0; - sBerryBlenderData->mainState++; + sBerryBlender->textState = 0; + sBerryBlender->mainState++; break; case 6: - if (Blender_PrintText(&sBerryBlenderData->textState, sBerryBlenderData->stringVar, GetPlayerTextSpeedDelay())) + if (Blender_PrintText(&sBerryBlender->textState, sBerryBlender->stringVar, GetPlayerTextSpeedDelay())) { TryUpdateBerryBlenderRecord(); return TRUE; @@ -3364,7 +3585,7 @@ static bool8 Blender_PrintBlendingResults(void) return FALSE; } -static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst) +static void PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *dst) { u8 text[12]; u8 flavorLvl, feel; @@ -3389,7 +3610,7 @@ static void Blender_PrintMadePokeblockString(struct Pokeblock *pokeblock, u8 *ds StringAppend(dst, sText_NewParagraph); } -static void Blender_SortBasedOnPoints(u8 *places, u8 playersNum, u32 *scores) +static void SortBasedOnPoints(u8 *places, u8 playersNum, u32 *scores) { s32 i, j; @@ -3399,128 +3620,128 @@ static void Blender_SortBasedOnPoints(u8 *places, u8 playersNum, u32 *scores) { if (scores[places[i]] > scores[places[j]]) { - u8 temp = places[i]; - places[i] = places[j]; - places[j] = temp; + u8 temp; + SWAP(places[i], places[j], temp); } } } } -static void Blender_SortScores(void) +static void SortScores(void) { u8 playerId; u8 i; u8 places[BLENDER_MAX_PLAYERS]; u32 points[BLENDER_MAX_PLAYERS]; - for (i = 0; i < sBerryBlenderData->playersNo; i++) + for (i = 0; i < sBerryBlender->numPlayers; i++) places[i] = i; - for (i = 0; i < sBerryBlenderData->playersNo; i++) + for (i = 0; i < sBerryBlender->numPlayers; i++) { - points[i] = 1000000 * sBerryBlenderData->scores[i][BLENDER_SCORE_BEST]; - points[i] += 1000 * sBerryBlenderData->scores[i][BLENDER_SCORE_GOOD]; - points[i] += 1000 - sBerryBlenderData->scores[i][BLENDER_SCORE_MISS]; + points[i] = 1000000 * sBerryBlender->scores[i][SCORE_BEST]; + points[i] += 1000 * sBerryBlender->scores[i][SCORE_GOOD]; + points[i] += 1000 - sBerryBlender->scores[i][SCORE_MISS]; } - Blender_SortBasedOnPoints(places, sBerryBlenderData->playersNo, points); - for (i = 0; i < sBerryBlenderData->playersNo; i++) - sBerryBlenderData->playerPlaces[i] = places[i]; + SortBasedOnPoints(places, sBerryBlender->numPlayers, points); + for (i = 0; i < sBerryBlender->numPlayers; i++) + sBerryBlender->playerPlaces[i] = places[i]; - if (gReceivedRemoteLinkPlayers == 0) + if (!gReceivedRemoteLinkPlayers) playerId = 0; else playerId = GetMultiplayerId(); - for (i = 0; i < sBerryBlenderData->playersNo; i++) + for (i = 0; i < sBerryBlender->numPlayers; i++) { - if (sBerryBlenderData->playerPlaces[i] == playerId) - sBerryBlenderData->field_1A4 = i; + if (sBerryBlender->playerPlaces[i] == playerId) + sBerryBlender->ownRanking = i; } } -static bool8 Blender_PrintBlendingRanking(void) +static bool8 PrintBlendingRanking(void) { u16 i; s32 xPos, yPos; - switch (sBerryBlenderData->mainState) + switch (sBerryBlender->mainState) { case 0: - sBerryBlenderData->mainState++; - sBerryBlenderData->framesToWait = 255; + sBerryBlender->mainState++; + sBerryBlender->framesToWait = 255; break; case 1: - sBerryBlenderData->framesToWait -= 10; - if (sBerryBlenderData->framesToWait < 0) + sBerryBlender->framesToWait -= 10; + if (sBerryBlender->framesToWait < 0) { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; } break; case 2: - if (++sBerryBlenderData->framesToWait > 20) + if (++sBerryBlender->framesToWait > 20) { - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; } break; case 3: DrawStdFrameWithCustomTileAndPalette(5, 0, 1, 0xD); - xPos = GetStringCenterAlignXOffset(1, sText_Ranking, 0xA8); + xPos = GetStringCenterAlignXOffset(1, sText_Ranking, 168); Blender_AddTextPrinter(5, sText_Ranking, xPos, 1, TEXT_SPEED_FF, 0); - sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST] = CreateSprite(&sUnknown_08339B40, 128, 52, 0); - StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST]], 3); - gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_BEST]].callback = SpriteCallbackDummy; + sBerryBlender->scoreIconIds[SCORE_BEST] = CreateSprite(&sSpriteTemplate_ScoreSymbols, 128, 52, 0); + StartSpriteAnim(&gSprites[sBerryBlender->scoreIconIds[SCORE_BEST]], SCOREANIM_BEST_STATIC); + gSprites[sBerryBlender->scoreIconIds[SCORE_BEST]].callback = SpriteCallbackDummy; - sBerryBlenderData->scoreIconIds[BLENDER_SCORE_GOOD] = CreateSprite(&sUnknown_08339B40, 160, 52, 0); - gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_GOOD]].callback = SpriteCallbackDummy; + sBerryBlender->scoreIconIds[SCORE_GOOD] = CreateSprite(&sSpriteTemplate_ScoreSymbols, 160, 52, 0); + // implicitly uses SCOREANIM_GOOD, no need to assign + gSprites[sBerryBlender->scoreIconIds[SCORE_GOOD]].callback = SpriteCallbackDummy; - sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS] = CreateSprite(&sUnknown_08339B40, 192, 52, 0); - StartSpriteAnim(&gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS]], 1); - gSprites[sBerryBlenderData->scoreIconIds[BLENDER_SCORE_MISS]].callback = SpriteCallbackDummy; + sBerryBlender->scoreIconIds[SCORE_MISS] = CreateSprite(&sSpriteTemplate_ScoreSymbols, 192, 52, 0); + StartSpriteAnim(&gSprites[sBerryBlender->scoreIconIds[SCORE_MISS]], SCOREANIM_MISS); + gSprites[sBerryBlender->scoreIconIds[SCORE_MISS]].callback = SpriteCallbackDummy; - Blender_SortScores(); + SortScores(); - for (yPos = 0x29, i = 0; i < sBerryBlenderData->playersNo; yPos += 0x10, i++) + for (yPos = 41, i = 0; i < sBerryBlender->numPlayers; yPos += 16, i++) { - u8 place = sBerryBlenderData->playerPlaces[i]; + u8 place = sBerryBlender->playerPlaces[i]; - ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1); - StringAppend(sBerryBlenderData->stringVar, sText_Dot); - StringAppend(sBerryBlenderData->stringVar, gText_Space); - StringAppend(sBerryBlenderData->stringVar, gLinkPlayers[place].name); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0, yPos, TEXT_SPEED_FF, 3); + ConvertIntToDecimalStringN(sBerryBlender->stringVar, i + 1, STR_CONV_MODE_LEFT_ALIGN, 1); + StringAppend(sBerryBlender->stringVar, sText_Dot); + StringAppend(sBerryBlender->stringVar, gText_Space); + StringAppend(sBerryBlender->stringVar, gLinkPlayers[place].name); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, 0, yPos, TEXT_SPEED_FF, 3); - ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_BEST], STR_CONV_MODE_RIGHT_ALIGN, 3); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x4E, yPos, TEXT_SPEED_FF, 3); + ConvertIntToDecimalStringN(sBerryBlender->stringVar, sBerryBlender->scores[place][SCORE_BEST], STR_CONV_MODE_RIGHT_ALIGN, 3); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, 78, yPos, TEXT_SPEED_FF, 3); - ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_GOOD], STR_CONV_MODE_RIGHT_ALIGN, 3); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x6E, yPos, TEXT_SPEED_FF, 3); + ConvertIntToDecimalStringN(sBerryBlender->stringVar, sBerryBlender->scores[place][SCORE_GOOD], STR_CONV_MODE_RIGHT_ALIGN, 3); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, 78 + 32, yPos, TEXT_SPEED_FF, 3); - ConvertIntToDecimalStringN(sBerryBlenderData->stringVar, sBerryBlenderData->scores[place][BLENDER_SCORE_MISS], STR_CONV_MODE_RIGHT_ALIGN, 3); - Blender_AddTextPrinter(5, sBerryBlenderData->stringVar, 0x8E, yPos, TEXT_SPEED_FF, 3); + ConvertIntToDecimalStringN(sBerryBlender->stringVar, sBerryBlender->scores[place][SCORE_MISS], STR_CONV_MODE_RIGHT_ALIGN, 3); + Blender_AddTextPrinter(5, sBerryBlender->stringVar, 78 + 64, yPos, TEXT_SPEED_FF, 3); } PutWindowTilemap(5); CopyWindowToVram(5, 3); - sBerryBlenderData->framesToWait = 0; - sBerryBlenderData->mainState++; + sBerryBlender->framesToWait = 0; + sBerryBlender->mainState++; break; case 4: - if (++sBerryBlenderData->framesToWait > 20) - sBerryBlenderData->mainState++; + if (++sBerryBlender->framesToWait > 20) + sBerryBlender->mainState++; break; case 5: - if (gMain.newKeys & A_BUTTON) + if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - sBerryBlenderData->mainState++; + sBerryBlender->mainState++; } break; case 6: - sBerryBlenderData->mainState = 0; + sBerryBlender->mainState = 0; return TRUE; } @@ -3539,11 +3760,11 @@ void ShowBerryBlenderRecordWindow(void) DrawStdWindowFrame(gRecordsWindowId, 0); FillWindowPixelBuffer(gRecordsWindowId, PIXEL_FILL(1)); - xPos = GetStringCenterAlignXOffset(1, gText_BlenderMaxSpeedRecord, 0x90); + xPos = GetStringCenterAlignXOffset(1, gText_BlenderMaxSpeedRecord, 144); AddTextPrinterParameterized(gRecordsWindowId, 1, gText_BlenderMaxSpeedRecord, xPos, 1, 0, NULL); - AddTextPrinterParameterized(gRecordsWindowId, 1, gText_234Players, 4, 0x29, 0, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_234Players, 4, 41, 0, NULL); - for (i = 0, yPos = 0x29; i < BLENDER_SCORES_NO; i++) + for (i = 0, yPos = 41; i < NUM_SCORE_TYPES; i++) { u8 *txtPtr; u32 record; @@ -3555,7 +3776,7 @@ void ShowBerryBlenderRecordWindow(void) txtPtr = ConvertIntToDecimalStringN(txtPtr, record % 100, STR_CONV_MODE_LEADING_ZEROS, 2); txtPtr = StringAppend(txtPtr, sText_RPM); - xPos = GetStringRightAlignXOffset(1, text, 0x8C); + xPos = GetStringRightAlignXOffset(1, text, 140); AddTextPrinterParameterized(gRecordsWindowId, 1, text, xPos, yPos + (i * 16), 0, NULL); } @@ -3563,7 +3784,7 @@ void ShowBerryBlenderRecordWindow(void) CopyWindowToVram(gRecordsWindowId, 3); } -static void sub_8083F3C(u8 taskId) +static void Task_PlayPokeblockFanfare(u8 taskId) { if (gTasks[taskId].data[0] == 0) { @@ -3572,7 +3793,7 @@ static void sub_8083F3C(u8 taskId) } if (IsFanfareTaskInactive()) { - PlayBGM(sBerryBlenderData->field_154); + PlayBGM(sBerryBlender->savedMusic); DestroyTask(taskId); } } @@ -3586,28 +3807,30 @@ static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlen tvBlender->pokeblockColor = pokeblock->color; tvBlender->name[0] = EOS; - if (gReceivedRemoteLinkPlayers != 0) + if (gReceivedRemoteLinkPlayers) { - if (sBerryBlenderData->field_1A4 == 0 && sheen > 20) + if (sBerryBlender->ownRanking == 0 && sheen > 20) { - StringCopy(tvBlender->name, gLinkPlayers[sBerryBlenderData->playerPlaces[sBerryBlenderData->playersNo - 1]].name); + // Player came first, try to put on air + StringCopy(tvBlender->name, gLinkPlayers[sBerryBlender->playerPlaces[sBerryBlender->numPlayers - 1]].name); tvBlender->pokeblockFlavor = GetPokeblocksFlavor(pokeblock); if (Put3CheersForPokeblocksOnTheAir(tvBlender->name, tvBlender->pokeblockFlavor, tvBlender->pokeblockColor, tvBlender->pokeblockSheen, - gLinkPlayers[sBerryBlenderData->playerPlaces[sBerryBlenderData->playersNo - 1]].language)) + gLinkPlayers[sBerryBlender->playerPlaces[sBerryBlender->numPlayers - 1]].language)) { return TRUE; } return FALSE; } - else if (sBerryBlenderData->field_1A4 == sBerryBlenderData->playersNo - 1 && sheen <= 20) + else if (sBerryBlender->ownRanking == sBerryBlender->numPlayers - 1 && sheen <= 20) { - StringCopy(tvBlender->name, gLinkPlayers[sBerryBlenderData->playerPlaces[0]].name); + // Player came last, try to put on air + StringCopy(tvBlender->name, gLinkPlayers[sBerryBlender->playerPlaces[0]].name); tvBlender->pokeblockFlavor = GetPokeblocksFlavor(pokeblock); if (Put3CheersForPokeblocksOnTheAir(tvBlender->name, tvBlender->pokeblockFlavor, tvBlender->pokeblockColor, tvBlender->pokeblockSheen, - gLinkPlayers[sBerryBlenderData->playerPlaces[0]].language)) + gLinkPlayers[sBerryBlender->playerPlaces[0]].language)) { return TRUE; } @@ -3628,19 +3851,19 @@ static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s3 { case 0: case 3: - txtColor[0] = 1; - txtColor[1] = 2; - txtColor[2] = 3; + txtColor[0] = TEXT_COLOR_WHITE; + txtColor[1] = TEXT_COLOR_DARK_GREY; + txtColor[2] = TEXT_COLOR_LIGHT_GREY; break; case 1: - txtColor[0] = 0; - txtColor[1] = 2; - txtColor[2] = 3; + txtColor[0] = TEXT_COLOR_TRANSPARENT; + txtColor[1] = TEXT_COLOR_DARK_GREY; + txtColor[2] = TEXT_COLOR_LIGHT_GREY; break; case 2: - txtColor[0] = 0; - txtColor[1] = 4; - txtColor[2] = 5; + txtColor[0] = TEXT_COLOR_TRANSPARENT; + txtColor[1] = TEXT_COLOR_RED; + txtColor[2] = TEXT_COLOR_LIGHT_RED; break; } diff --git a/src/berry_crush.c b/src/berry_crush.c index 6269f0ad9..d753e603c 100755 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -900,7 +900,7 @@ static void sub_8020D8C(void) void sub_8020E1C(void) { DestroyTask(gUnknown_02022C90->unkA); - ChooseBerrySetCallback(sub_8020D8C); + ChooseBerryForMachine(sub_8020D8C); } static void sub_8020E3C(void) @@ -2357,7 +2357,7 @@ void sub_802339C(struct BerryCrushGame *r4) for (r7 = 0; r7 < r4->unk9; ++r7) { r2 = gRecvCmds[r7]; - if ((r2[0] & 0xFF00) == 0x2F00 + if ((r2[0] & 0xFF00) == RFUCMD_SEND_PACKET && r2[1] == 2) { if ((u8)r2[2] & 4) @@ -2559,7 +2559,7 @@ void sub_80236B8(struct BerryCrushGame *r5) r5->unk5C.unk02_1 = r5->unk25_4; r5->unk5C.unk0A = r5->unk25_5; memcpy(r5->unk40.unk2, &r5->unk5C, sizeof(r5->unk40.unk2)); - sub_800FE50(r5->unk40.unk2); + Rfu_SendPacket(r5->unk40.unk2); } void sub_802385C(struct BerryCrushGame *r5) @@ -2580,7 +2580,7 @@ void sub_802385C(struct BerryCrushGame *r5) for (r4 = 0; r4 < r5->unk9; ++r4) r5->unk68.as_four_players.others[r4].unk4.as_2d_bytes[1][5] = 0; #endif - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00 + if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET || gRecvCmds[0][1] != 2) { r5->unk25_2 = 0; diff --git a/src/cable_car.c b/src/cable_car.c index fc161284f..acd0bc7a5 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -22,66 +22,74 @@ #include "constants/songs.h" #include "constants/weather.h" +#define GOING_DOWN gSpecialVar_0x8004 + +#define STATE_END 0xFF + +#define TAG_CABLE_CAR 1 +#define TAG_DOOR 2 +#define TAG_CABLE 3 + struct CableCar { - u8 taskId; + u8 bgTaskId; u8 state; u8 weather; - u16 unk4; + u16 weatherDelay; u16 timer; u8 bg0HorizontalOffset; u8 bg0VerticalOffset; - u8 fillerA[0x2]; + u8 unused0[2]; u8 bg1HorizontalOffset; u8 bg1VerticalOffset; - u8 fillerE[0x6]; + u8 unused1[6]; u8 bg3HorizontalOffset; u8 bg3VerticalOffset; - u8 filler16[0x2]; - u8 unk18; - u8 unk19; - u8 unk1A; - u8 unk1B; - u8 unk1C; - u8 unk1D; - u8 unk1E; - u8 unk1F; - u8 unk20; - u16 unk22[9][12]; - u8 fillerFA[0x2]; - /*0x00FC*/ u16 bgTilemapBuffers[4][0x800]; - /*0x40FC*/ u16 *mtChimneyTilemap; - /*0x4100*/ u16 *treeTilemap; - /*0x4104*/ u16 *mountainTilemap; - /*0x4108*/ const u16 *pylonHookTilemapEntries; - /*0x410C*/ u8 *pylonStemTilemap; + u8 unused2[2]; + u8 groundTileIdx; + u8 groundSegmentXStart; + u8 groundSegmentYStart; + u8 groundTilemapOffset; + u8 groundTimer; // Incremented, but does nothing + u8 groundXOffset; + u8 groundYOffset; + u8 groundXBase; + u8 groundYBase; + u16 groundTileBuffer[9][12]; + u8 unused3[2]; + u16 bgTilemapBuffers[4][BG_SCREEN_SIZE]; + u16 *groundTilemap; + u16 *treesTilemap; + u16 *bgMountainsTilemap; + const u16 *pylonHookTilemapEntries; + u8 *pylonStemTilemap; }; static EWRAM_DATA struct CableCar *sCableCar = NULL; -EWRAM_DATA u8 gUnknown_0203ABB0 = 0; -EWRAM_DATA u8 gUnknown_0203ABB1 = 0; -EWRAM_DATA u8 gUnknown_0203ABB2 = 0; -EWRAM_DATA u8 gUnknown_0203ABB3 = 0; -EWRAM_DATA u8 gUnknown_0203ABB4 = 0; -EWRAM_DATA u8 gUnknown_0203ABB5 = 0; - -static void CableCarMainCallback_Setup(void); -static void sub_8150B6C(u8); -static void LoadCableCarSprites(void); -static void sub_81514C8(u8); -static void sub_81503E4(u8); -static void sub_8150550(u8); -static void sub_8150664(u8); -static void CableCarVblankCallback(void); -static void CableCarMainCallback_Run(void); -static void sub_815115C(void); -static void sub_81511B8(void); -static void sub_8150868(struct Sprite *); -static void nullsub_58(struct Sprite *); -static void sub_8151214(void); -static void sub_8151388(void); - -const struct BgTemplate gCableCarBgTemplates[4] = { +static EWRAM_DATA u8 sGroundX_Up = 0; +static EWRAM_DATA u8 sGroundY_Up = 0; +static EWRAM_DATA u8 sGroundSegmentY_Up = 0; +static EWRAM_DATA u8 sGroundX_Down = 0; +static EWRAM_DATA u8 sGroundY_Down = 0; +static EWRAM_DATA u8 sGroundSegmentY_Down = 0; + +static void CB2_LoadCableCar(void); +static void SetBgRegs(bool8); +static void CreateCableCarSprites(void); +static void InitGroundTilemapData(bool8); +static void Task_CableCar(u8); +static void Task_AnimateBgGoingUp(u8); +static void Task_AnimateBgGoingDown(u8); +static void VBlankCB_CableCar(void); +static void CB2_CableCar(void); +static void AnimateGroundGoingUp(void); +static void AnimateGroundGoingDown(void); +static void SpriteCB_CableCar(struct Sprite *); +static void SpriteCB_Cable(struct Sprite *); +static void DrawNextGroundSegmentGoingUp(void); +static void DrawNextGroundSegmentGoingDown(void); + +static const struct BgTemplate sBgTemplates[4] = { { .bg = 0, .charBaseIndex = 0, @@ -120,11 +128,11 @@ const struct BgTemplate gCableCarBgTemplates[4] = { }, }; -const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz"); -const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz"); -const u8 gCableCarMountainTilemap[] = INCBIN_U8("graphics/misc/cable_car_mountain_map.bin.lz"); +static const u8 sGround_Tilemap[] = INCBIN_U8("graphics/cable_car/ground.bin.lz"); +static const u8 sTrees_Tilemap[] = INCBIN_U8("graphics/cable_car/trees.bin.lz"); +static const u8 sBgMountains_Tilemap[] = INCBIN_U8("graphics/cable_car/bg_mountains.bin.lz"); -const u16 gCableCarPylonHookTilemapEntries[] = { +static const u16 sPylonHook_TilemapEntries[] = { 0x3000, 0x3001, 0x3002, @@ -137,21 +145,21 @@ const u16 gCableCarPylonHookTilemapEntries[] = { 0x3009, }; -const u8 gCableCarPylonStemTilemap[] = INCBIN_U8("graphics/misc/cable_car_pylon_stem_map.bin.lz"); +static const u8 sPylonStems_Tilemap[] = INCBIN_U8("graphics/cable_car/pylons.bin.lz"); -const struct CompressedSpriteSheet gUnknown_085CDB54[] = { - { gCableCar_Gfx, 0x800, 1 }, - { gCableCarDoor_Gfx, 0x40, 2 }, - { gCableCarCord_Gfx, 0x80, 3 }, +static const struct CompressedSpriteSheet sSpriteSheets[] = { + { gCableCar_Gfx, 0x800, TAG_CABLE_CAR }, + { gCableCarDoor_Gfx, 0x40, TAG_DOOR }, + { gCableCarCable_Gfx, 0x80, TAG_CABLE }, { }, }; -const struct SpritePalette gUnknown_085CDB74[] = { - { gCableCar_Pal, 1 }, +static const struct SpritePalette sSpritePalettes[] = { + { gCableCar_Pal, TAG_CABLE_CAR }, { } }; -const struct OamData gOamData_85CDB84 = +static const struct OamData sOam_CableCar = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, @@ -165,7 +173,7 @@ const struct OamData gOamData_85CDB84 = .paletteNum = 0, }; -const struct OamData gOamData_85CDB8C = +static const struct OamData sOam_CableCarDoor = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, @@ -179,7 +187,7 @@ const struct OamData gOamData_85CDB8C = .paletteNum = 0, }; -const struct OamData gOamData_85CDB94 = +static const struct OamData sOam_Cable = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, @@ -193,43 +201,43 @@ const struct OamData gOamData_85CDB94 = .paletteNum = 0, }; -const struct SpriteTemplate gSpriteTemplate_85CDB9C[] = +static const struct SpriteTemplate sSpriteTemplate_CableCar[] = { { - .tileTag = 1, - .paletteTag = 1, - .oam = &gOamData_85CDB84, + .tileTag = TAG_CABLE_CAR, + .paletteTag = TAG_CABLE_CAR, + .oam = &sOam_CableCar, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8150868, + .callback = SpriteCB_CableCar, }, { - .tileTag = 2, - .paletteTag = 1, - .oam = &gOamData_85CDB8C, + .tileTag = TAG_DOOR, + .paletteTag = TAG_CABLE_CAR, + .oam = &sOam_CableCarDoor, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8150868, + .callback = SpriteCB_CableCar, }, }; -const struct SpriteTemplate gSpriteTemplate_85CDBCC = { - .tileTag = 3, - .paletteTag = 1, - .oam = &gOamData_85CDB94, +static const struct SpriteTemplate sSpriteTemplate_Cable = { + .tileTag = TAG_CABLE, + .paletteTag = TAG_CABLE_CAR, + .oam = &sOam_Cable, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_58, + .callback = SpriteCB_Cable, }; -static void CableCarTask1(u8 taskId) +static void Task_LoadCableCar(u8 taskId) { if (!gPaletteFade.active) { - SetMainCallback2(CableCarMainCallback_Setup); + SetMainCallback2(CB2_LoadCableCar); DestroyTask(taskId); } } @@ -237,11 +245,11 @@ static void CableCarTask1(u8 taskId) void CableCar(void) { ScriptContext2_Enable(); - CreateTask(CableCarTask1, 1); + CreateTask(Task_LoadCableCar, 1); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); } -static void CableCarMainCallback_Setup(void) +static void CB2_LoadCableCar(void) { u16 imebak; u8 i = 0; @@ -252,7 +260,7 @@ static void CableCarMainCallback_Setup(void) case 0: default: SetVBlankCallback(NULL); - sub_8150B6C(0); + SetBgRegs(FALSE); ScanlineEffect_Stop(); DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE); @@ -267,13 +275,13 @@ static void CableCarMainCallback_Setup(void) ResetPaletteFade(); ResetTempTileDataBuffers(); StartWeather(); - for (i = 0; i < 20; i++) + for (i = 0; i < NUM_ASH_SPRITES; i++) gWeatherPtr->sprites.s2.ashSprites[i] = NULL; InitMapMusic(); ResetMapMusic(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gCableCarBgTemplates, ARRAY_COUNT(gCableCarBgTemplates)); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(0, sCableCar->bgTilemapBuffers[0]); SetBgTilemapBuffer(1, sCableCar->bgTilemapBuffers[1]); SetBgTilemapBuffer(2, sCableCar->bgTilemapBuffers[2]); @@ -282,27 +290,27 @@ static void CableCarMainCallback_Setup(void) gMain.state++; break; case 2: - for (i = 0; i < 3; i++) - LoadCompressedSpriteSheet(&gUnknown_085CDB54[i]); - - LoadSpritePalettes(gUnknown_085CDB74); - sCableCar->mtChimneyTilemap = malloc_and_decompress(gCableCarMtChimneyTilemap, &sizeOut); - sCableCar->treeTilemap = malloc_and_decompress(gCableCarTreeTilemap, &sizeOut); - sCableCar->mountainTilemap = malloc_and_decompress(gCableCarMountainTilemap, &sizeOut); - sCableCar->pylonStemTilemap = malloc_and_decompress(gCableCarPylonStemTilemap, &sizeOut); - sCableCar->pylonHookTilemapEntries = gCableCarPylonHookTilemapEntries; - DecompressAndCopyTileDataToVram(0, gUnknown_08DBA5B8, 0, 0, 0); + for (i = 0; i < ARRAY_COUNT(sSpriteSheets) - 1; i++) + LoadCompressedSpriteSheet(&sSpriteSheets[i]); + + LoadSpritePalettes(sSpritePalettes); + sCableCar->groundTilemap = malloc_and_decompress(sGround_Tilemap, &sizeOut); + sCableCar->treesTilemap = malloc_and_decompress(sTrees_Tilemap, &sizeOut); + sCableCar->bgMountainsTilemap = malloc_and_decompress(sBgMountains_Tilemap, &sizeOut); + sCableCar->pylonStemTilemap = malloc_and_decompress(sPylonStems_Tilemap, &sizeOut); + sCableCar->pylonHookTilemapEntries = sPylonHook_TilemapEntries; + DecompressAndCopyTileDataToVram(0, gCableCarBg_Gfx, 0, 0, 0); gMain.state++; break; case 3: if (!FreeTempTileDataBuffersIfPossible()) { - LoadPalette(gUnknown_08DBA518, 0, 0x80); + LoadPalette(gCableCarBg_Pal, 0, 0x80); gMain.state++; } break; case 4: - LoadCableCarSprites(); + CreateCableCarSprites(); RunTasks(); gMain.state++; break; @@ -313,7 +321,7 @@ static void CableCarMainCallback_Setup(void) } else if (gWeatherPtr->sprites.s2.ashSprites[0]) { - for (i = 0; i < 20; i++) + for (i = 0; i < NUM_ASH_SPRITES; i++) { if (gWeatherPtr->sprites.s2.ashSprites[i]) gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0; @@ -323,28 +331,28 @@ static void CableCarMainCallback_Setup(void) } break; case 6: - CopyToBgTilemapBufferRect_ChangePalette(1, sCableCar->treeTilemap, 0, 17, 32, 15, 17); - CopyToBgTilemapBufferRect_ChangePalette(2, sCableCar->mountainTilemap, 0, 0, 30, 20, 17); + CopyToBgTilemapBufferRect_ChangePalette(1, sCableCar->treesTilemap, 0, 17, 32, 15, 17); + CopyToBgTilemapBufferRect_ChangePalette(2, sCableCar->bgMountainsTilemap, 0, 0, 30, 20, 17); CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonHookTilemapEntries, 0, 0, 5, 2, 17); CopyToBgTilemapBufferRect_ChangePalette(3, sCableCar->pylonStemTilemap, 0, 2, 2, 20, 17); gMain.state++; break; case 7: - sub_81514C8(gSpecialVar_0x8004); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x48, 0, 14, 12, 3, 17); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x6C, 12, 17, 12, 3, 17); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x90, 24, 20, 12, 3, 17); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x0, 0, 17, 12, 3, 17); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x24, 0, 20, 12, 3, 17); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x0, 12, 20, 12, 3, 17); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x24, 12, 23, 12, 3, 17); - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x0, 24, 23, 12, 3, 17); + InitGroundTilemapData(GOING_DOWN); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x48, 0, 14, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x6C, 12, 17, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x90, 24, 20, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x0, 0, 17, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x24, 0, 20, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x0, 12, 20, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x24, 12, 23, 12, 3, 17); + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x0, 24, 23, 12, 3, 17); gMain.state++; break; case 8: BeginNormalPaletteFade(0xFFFFFFFF, 3, 16, 0, RGB(0, 0, 0)); FadeInNewBGM(MUS_CABLE_CAR, 1); - sub_8150B6C(1); + SetBgRegs(TRUE); gMain.state++; break; case 9: @@ -352,18 +360,18 @@ static void CableCarMainCallback_Setup(void) REG_IME = 0; REG_IE |= INTR_FLAG_VBLANK; REG_IME = imebak; - SetVBlankCallback(CableCarVblankCallback); - SetMainCallback2(CableCarMainCallback_Run); - CreateTask(sub_81503E4, 0); - if (gSpecialVar_0x8004 == 0) - sCableCar->taskId = CreateTask(sub_8150550, 1); + SetVBlankCallback(VBlankCB_CableCar); + SetMainCallback2(CB2_CableCar); + CreateTask(Task_CableCar, 0); + if (!GOING_DOWN) + sCableCar->bgTaskId = CreateTask(Task_AnimateBgGoingUp, 1); else - sCableCar->taskId = CreateTask(sub_8150664, 1); + sCableCar->bgTaskId = CreateTask(Task_AnimateBgGoingDown, 1); break; } } -static void CableCarMainCallback_Run(void) +static void CB2_CableCar(void) { RunTasks(); AnimateSprites(); @@ -372,7 +380,7 @@ static void CableCarMainCallback_Run(void) MapMusicMain(); } -static void CleanupCableCar(void) +static void CB2_EndCableCar(void) { u8 i = 0; @@ -380,10 +388,10 @@ static void CleanupCableCar(void) HideBg(1); HideBg(2); HideBg(3); - sub_8150B6C(0); + SetBgRegs(FALSE); gSpriteCoordOffsetX = 0; SetCurrentAndNextWeatherNoDelay(WEATHER_NONE); - for (i = 0; i < 20; i++) + for (i = 0; i < NUM_ASH_SPRITES; i++) gWeatherPtr->sprites.s2.ashSprites[i] = NULL; ResetTasks(); @@ -396,9 +404,9 @@ static void CleanupCableCar(void) ResetBgsAndClearDma3BusyFlags(0); sCableCar->pylonHookTilemapEntries = NULL; FREE_AND_SET_NULL(sCableCar->pylonStemTilemap); - FREE_AND_SET_NULL(sCableCar->mountainTilemap); - FREE_AND_SET_NULL(sCableCar->treeTilemap); - FREE_AND_SET_NULL(sCableCar->mtChimneyTilemap); + FREE_AND_SET_NULL(sCableCar->bgMountainsTilemap); + FREE_AND_SET_NULL(sCableCar->treesTilemap); + FREE_AND_SET_NULL(sCableCar->groundTilemap); FREE_AND_SET_NULL(sCableCar); DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE); @@ -408,7 +416,7 @@ static void CleanupCableCar(void) SetMainCallback2(CB2_LoadMap); } -static void sub_81503E4(u8 taskId) +static void Task_CableCar(u8 taskId) { u8 i = 0; @@ -416,13 +424,15 @@ static void sub_81503E4(u8 taskId) switch (sCableCar->state) { case 0: - if (sCableCar->timer == sCableCar->unk4) + // Wait to change weather + if (sCableCar->timer == sCableCar->weatherDelay) { SetNextWeather(sCableCar->weather); sCableCar->state = 1; } break; case 1: + // Update ash sprites switch (sCableCar->weather) { case WEATHER_VOLCANIC_ASH: @@ -442,7 +452,7 @@ static void sub_81503E4(u8 taskId) { sCableCar->state = 2; } - else if (sCableCar->timer >= sCableCar->unk4 + 8) + else if (sCableCar->timer >= sCableCar->weatherDelay + 8) { for (; i < NUM_ASH_SPRITES; i++) { @@ -454,6 +464,7 @@ static void sub_81503E4(u8 taskId) } break; case 2: + // Wait to fade out if (sCableCar->timer == 570) { sCableCar->state = 3; @@ -462,21 +473,22 @@ static void sub_81503E4(u8 taskId) } break; case 3: + // Wait for fade out if (!gPaletteFade.active) - sCableCar->state = 0xFF; + sCableCar->state = STATE_END; break; - case 0xFF: + case STATE_END: SetVBlankCallback(NULL); DestroyTask(taskId); - DestroyTask(sCableCar->taskId); - SetMainCallback2(CleanupCableCar); + DestroyTask(sCableCar->bgTaskId); + SetMainCallback2(CB2_EndCableCar); break; } } -static void sub_8150550(u8 taskId) +static void Task_AnimateBgGoingUp(u8 taskId) { - if (sCableCar->state != 0xFF) + if (sCableCar->state != STATE_END) { sCableCar->bg3HorizontalOffset--; if ((sCableCar->timer % 2) == 0) @@ -507,13 +519,13 @@ static void sub_8150550(u8 taskId) } } - sub_815115C(); + AnimateGroundGoingUp(); gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128; } -static void sub_8150664(u8 taskId) +static void Task_AnimateBgGoingDown(u8 taskId) { - if (sCableCar->state != 0xFF) + if (sCableCar->state != STATE_END) { sCableCar->bg3HorizontalOffset++; if ((sCableCar->timer % 2) == 0) @@ -548,14 +560,14 @@ static void sub_8150664(u8 taskId) } } - sub_81511B8(); - if (sCableCar->timer < sCableCar->unk4) + AnimateGroundGoingDown(); + if (sCableCar->timer < sCableCar->weatherDelay) gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248; else gWeatherPtr->ashBaseSpritesX = (gWeatherPtr->ashBaseSpritesX + 247) % 248; } -static void CableCarVblankCallback(void) +static void VBlankCB_CableCar(void) { CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); @@ -570,83 +582,100 @@ static void CableCarVblankCallback(void) TransferPlttBuffer(); } -static void nullsub_58(struct Sprite *sprite) +static void SpriteCB_Cable(struct Sprite *sprite) { + } -static void sub_8150868(struct Sprite *sprite) +#define sXPos data[0] +#define sYPos data[1] + +static void SpriteCB_CableCar(struct Sprite *sprite) { - if (sCableCar->state != 0xFF) + if (sCableCar->state != STATE_END) { - if (gSpecialVar_0x8004 == 0) + if (!GOING_DOWN) { - sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); - sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.x = sprite->sXPos - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.y = sprite->sYPos - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } else { - sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); - sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.x = sprite->sXPos + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.y = sprite->sYPos + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } } } -void sub_8150948(struct Sprite *sprite) +#define sState data[2] +#define sTimer data[3] + +static void SpriteCB_Player(struct Sprite *sprite) { - if (sCableCar->state != 255) + if (sCableCar->state != STATE_END) { - if (!gSpecialVar_0x8004) + // Move along with cable car + if (!GOING_DOWN) { - sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); - sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.x = sprite->sXPos - (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.y = sprite->sYPos - (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } else { - sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); - sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.x = sprite->sXPos + (u8)(0.14f * S16TOPOSFLOAT(sCableCar->timer)); + sprite->pos1.y = sprite->sYPos + (u8)(0.067f * S16TOPOSFLOAT(sCableCar->timer)); } - switch (sprite->data[2]) + // Bounce up and down + switch (sprite->sState) { case 0: sprite->pos2.y = 17; - if (sprite->data[3] ++ > 9) + if (sprite->sTimer++ > 9) { - sprite->data[3] = 0; - sprite->data[2] ++; + sprite->sTimer = 0; + sprite->sState++; } break; default: sprite->pos2.y = 16; - if (sprite->data[3] ++ > 9) + if (sprite->sTimer++ > 9) { - sprite->data[3] = 0; - sprite->data[2] = 0; + sprite->sTimer = 0; + sprite->sState = 0; } break; } } } -static void sub_8150A68(struct Sprite *sprite) +#undef sState +#undef sTimer + +#define sTimer data[0] +#define sSameDir data[1] // Whether or not the hiker is headed the same dir as the Cable Car +#define sDelay data[2] + +static void SpriteCB_HikerGoingUp(struct Sprite *sprite) { - if (sprite->data[0] == 0) + if (sprite->sTimer == 0) { sprite->pos1.x += 2 * sprite->centerToCornerVecX; sprite->pos1.y += 16 + sprite->centerToCornerVecY; } - if (++sprite->data[0] >= sprite->data[2]) + if (++sprite->sTimer >= sprite->sDelay) { - switch (sprite->data[1]) + switch (sprite->sSameDir) { - case 0: + case FALSE: sprite->pos1.x++; - if ((sprite->data[0] % 4) == 0) + if ((sprite->sTimer % 4) == 0) sprite->pos1.y++; break; - case 1: - if ((sprite->data[0] % 2) != 0) + case TRUE: + // Hiker moves slower if travelling with the Cable Car + if ((sprite->sTimer % 2) != 0) { sprite->pos1.x++; if ((sprite->pos1.x % 4) == 0) @@ -660,22 +689,23 @@ static void sub_8150A68(struct Sprite *sprite) } } -static void sub_8150AF4(struct Sprite *sprite) +static void SpriteCB_HikerGoingDown(struct Sprite *sprite) { - if (sprite->data[0] == 0) + if (sprite->sTimer == 0) sprite->pos1.y += 16 + sprite->centerToCornerVecY; - if (++sprite->data[0] >= sprite->data[2]) + if (++sprite->sTimer >= sprite->sDelay) { - switch (sprite->data[1]) + switch (sprite->sSameDir) { - case 0: + case FALSE: sprite->pos1.x--; - if ((sprite->data[0] % 4) == 0) + if ((sprite->sTimer % 4) == 0) sprite->pos1.y--; break; - case 1: - if ((sprite->data[0] % 2) != 0) + case TRUE: + // Hiker moves slower if travelling with the Cable Car + if ((sprite->sTimer % 2) != 0) { sprite->pos1.x--; if ((sprite->pos1.x % 4) == 0) @@ -689,9 +719,11 @@ static void sub_8150AF4(struct Sprite *sprite) } } -static void sub_8150B6C(bool8 which) +#undef sTimer + +static void SetBgRegs(bool8 active) { - switch (which) + switch (active) { case FALSE: default: @@ -723,7 +755,7 @@ static void sub_8150B6C(bool8 which) SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); - if (gSpecialVar_0x8004 == 0) + if (!GOING_DOWN) { sCableCar->bg3HorizontalOffset = 176; sCableCar->bg3VerticalOffset = 16; @@ -762,14 +794,14 @@ static void sub_8150B6C(bool8 which) } } -static void LoadCableCarSprites(void) +static void CreateCableCarSprites(void) { u8 spriteId; u8 i; u8 playerGraphicsIds[2] = { - OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, - OBJ_EVENT_GFX_RIVAL_MAY_NORMAL + [MALE] = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, + [FEMALE] = OBJ_EVENT_GFX_RIVAL_MAY_NORMAL }; u16 rval = Random(); u8 hikerGraphicsIds[4] = { @@ -779,248 +811,264 @@ static void LoadCableCarSprites(void) OBJ_EVENT_GFX_ZIGZAGOON_1 }; s16 hikerCoords[2][2] = { - { 0, 80 }, - { 240, 146 } - }; - u8 hikerMovementDelayTable[4] = { - 0, - 60, - 120, - 170 + { 0, 80 }, // Going up + { 240, 146 } // Going down }; - void (*callbacks[2])(struct Sprite *) = { - sub_8150A68, - sub_8150AF4 + u8 hikerMovementDelayTable[4] = { 0, 60, 120, 170}; + void (*hikerCallbacks[2])(struct Sprite *) = { + SpriteCB_HikerGoingUp, + SpriteCB_HikerGoingDown }; - switch (gSpecialVar_0x8004) + switch (GOING_DOWN) { - case 0: + case FALSE: default: - spriteId = AddPseudoObjectEvent(playerGraphicsIds[gSaveBlock2Ptr->playerGender], sub_8150948, 200, 73, 102); + // Create player sprite + spriteId = AddPseudoObjectEvent(playerGraphicsIds[gSaveBlock2Ptr->playerGender], SpriteCB_Player, 200, 73, 102); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = 2; gSprites[spriteId].pos2.x = 8; gSprites[spriteId].pos2.y = 16; - gSprites[spriteId].data[0] = 0xc8; - gSprites[spriteId].data[1] = 0x49; + gSprites[spriteId].sXPos = 200; + gSprites[spriteId].sYPos = 73; } - spriteId = CreateSprite(&gSpriteTemplate_85CDB9C[0], 176, 43, 0x67); + // Create car sprite + spriteId = CreateSprite(&sSpriteTemplate_CableCar[0], 176, 43, 0x67); gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 32; - gSprites[spriteId].data[0] = 176; - gSprites[spriteId].data[1] = 43; - spriteId = CreateSprite(&gSpriteTemplate_85CDB9C[1], 200, 99, 0x65); + gSprites[spriteId].sXPos = 176; + gSprites[spriteId].sYPos = 43; + // Create door sprite + spriteId = CreateSprite(&sSpriteTemplate_CableCar[1], 200, 99, 0x65); gSprites[spriteId].pos2.x = 8; gSprites[spriteId].pos2.y = 4; - gSprites[spriteId].data[0] = 200; - gSprites[spriteId].data[1] = 99; + gSprites[spriteId].sXPos = 200; + gSprites[spriteId].sYPos = 99; + // Init weather sCableCar->weather = WEATHER_VOLCANIC_ASH; - sCableCar->unk4 = 0x15e; + sCableCar->weatherDelay = 350; SetCurrentAndNextWeatherNoDelay(WEATHER_SUNNY); break; - case 1: - CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->mtChimneyTilemap + 0x24, 24, 26, 12, 3, 17); - spriteId = AddPseudoObjectEvent(playerGraphicsIds[gSaveBlock2Ptr->playerGender], sub_8150948, 128, 39, 102); + case TRUE: + CopyToBgTilemapBufferRect_ChangePalette(0, sCableCar->groundTilemap + 0x24, 24, 26, 12, 3, 17); + // Create player sprite + spriteId = AddPseudoObjectEvent(playerGraphicsIds[gSaveBlock2Ptr->playerGender], SpriteCB_Player, 128, 39, 102); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = 2; gSprites[spriteId].pos2.x = 8; gSprites[spriteId].pos2.y = 16; - gSprites[spriteId].data[0] = 0x80; - gSprites[spriteId].data[1] = 0x27; + gSprites[spriteId].sXPos = 128; + gSprites[spriteId].sYPos = 39; } - spriteId = CreateSprite(&gSpriteTemplate_85CDB9C[0], 104, 9, 0x67); - gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20; - gSprites[spriteId].data[0] = 104; - gSprites[spriteId].data[1] = 9; - spriteId = CreateSprite(&gSpriteTemplate_85CDB9C[1], 128, 65, 0x65); + // Create car sprite + spriteId = CreateSprite(&sSpriteTemplate_CableCar[0], 104, 9, 0x67); + gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 32; + gSprites[spriteId].sXPos = 104; + gSprites[spriteId].sYPos = 9; + // Create door sprite + spriteId = CreateSprite(&sSpriteTemplate_CableCar[1], 128, 65, 0x65); gSprites[spriteId].pos2.x = 8; gSprites[spriteId].pos2.y = 4; - gSprites[spriteId].data[0] = 0x80; - gSprites[spriteId].data[1] = 0x41; + gSprites[spriteId].sXPos = 128; + gSprites[spriteId].sYPos = 65; + // Init weather sCableCar->weather = WEATHER_SUNNY; - sCableCar->unk4 = 0x109; + sCableCar->weatherDelay = 265; SetCurrentAndNextWeatherNoDelay(WEATHER_VOLCANIC_ASH); break; } for (i = 0; i < 9; i++) { - spriteId = CreateSprite(&gSpriteTemplate_85CDBCC, 16 * i + 96, 8 * i - 8, 0x68); + spriteId = CreateSprite(&sSpriteTemplate_Cable, 16 * i + 96, 8 * i - 8, 0x68); gSprites[spriteId].pos2.x = 8; gSprites[spriteId].pos2.y = 8; } + + // 1/64 chance for an NPC to appear hiking on the ground below the Cable Car if ((rval % 64) == 0) { - spriteId = AddPseudoObjectEvent(hikerGraphicsIds[rval % 3], callbacks[gSpecialVar_0x8004], hikerCoords[gSpecialVar_0x8004][0], hikerCoords[gSpecialVar_0x8004][1], 0x6a); + // Unclear if this was intentional, but the - 1 in the below ARRAY_COUNT means the Zigzagoon is never used + spriteId = AddPseudoObjectEvent(hikerGraphicsIds[rval % (ARRAY_COUNT(hikerGraphicsIds) - 1)], hikerCallbacks[GOING_DOWN], hikerCoords[GOING_DOWN][0], hikerCoords[GOING_DOWN][1], 106); if (spriteId != MAX_SPRITES) { gSprites[spriteId].oam.priority = 2; gSprites[spriteId].pos2.x = -gSprites[spriteId].centerToCornerVecX; gSprites[spriteId].pos2.y = -gSprites[spriteId].centerToCornerVecY; - if (gSpecialVar_0x8004 == 0) + + // Randomly choose which direction the NPC is going + if (!GOING_DOWN) { if (rval % 2) { + // Do walking west anim StartSpriteAnim(&gSprites[spriteId], 6); - gSprites[spriteId].data[1] = 1; + gSprites[spriteId].sSameDir = TRUE; gSprites[spriteId].pos1.y += 2; } else { + // Do walking east anim StartSpriteAnim(&gSprites[spriteId], 7); - gSprites[spriteId].data[1] = 0; + gSprites[spriteId].sSameDir = FALSE; } } else { if (rval % 2) { + // Do walking east anim StartSpriteAnim(&gSprites[spriteId], 7); - gSprites[spriteId].data[1] = 1; + gSprites[spriteId].sSameDir = TRUE; gSprites[spriteId].pos1.y += 2; } else { + // Do walking west anim StartSpriteAnim(&gSprites[spriteId], 6); - gSprites[spriteId].data[1] = 0; + gSprites[spriteId].sSameDir = FALSE; } } - gSprites[spriteId].data[2] = hikerMovementDelayTable[rval % 4]; + gSprites[spriteId].sDelay = hikerMovementDelayTable[rval % ARRAY_COUNT(hikerMovementDelayTable)]; } } } -void sub_8151088(void) +static void BufferNextGroundSegment(void) { - u8 i; - u8 j; - u8 k; + u8 i, j, k; u8 offset; - for (i = 0, k = 0, offset = 0x24 * (sCableCar->unk1B + 2); i < 3; i++) + for (i = 0, k = 0, offset = 0x24 * (sCableCar->groundTilemapOffset + 2); i < 3; i++) { - for (j = 0; j < 12; j++) + for (j = 0; j < ARRAY_COUNT(sCableCar->groundTileBuffer[0]); j++) { - sCableCar->unk22[i][j] = sCableCar->mtChimneyTilemap[offset++]; - sCableCar->unk22[i + 3][j] = sCableCar->mtChimneyTilemap[k]; - sCableCar->unk22[i + 6][j] = (sCableCar->mtChimneyTilemap + 0x24)[k]; + sCableCar->groundTileBuffer[i][j] = sCableCar->groundTilemap[offset++]; + sCableCar->groundTileBuffer[i + 3][j] = sCableCar->groundTilemap[k]; + sCableCar->groundTileBuffer[i + 6][j] = (sCableCar->groundTilemap + 0x24)[k]; k++; } } - sCableCar->unk1B = (sCableCar->unk1B + 1) % 3; + sCableCar->groundTilemapOffset = (sCableCar->groundTilemapOffset + 1) % 3; } -static void sub_815115C(void) +static void AnimateGroundGoingUp(void) { - sCableCar->unk1C = (sCableCar->unk1C + 1) % 0x60; - sCableCar->bg0HorizontalOffset = sCableCar->unk1F - sCableCar->unk1D; - sCableCar->bg0VerticalOffset = sCableCar->unk20 - sCableCar->unk1E; - sCableCar->unk1D++; - if ((sCableCar->unk1D % 4) == 0) - sCableCar->unk1E++; - - if (sCableCar->unk1D > 16) - sub_8151214(); + sCableCar->groundTimer = (sCableCar->groundTimer + 1) % 96; + sCableCar->bg0HorizontalOffset = sCableCar->groundXBase - sCableCar->groundXOffset; + sCableCar->bg0VerticalOffset = sCableCar->groundYBase - sCableCar->groundYOffset; + sCableCar->groundXOffset++; + if ((sCableCar->groundXOffset % 4) == 0) + sCableCar->groundYOffset++; + + if (sCableCar->groundXOffset > 16) + DrawNextGroundSegmentGoingUp(); } -static void sub_81511B8(void) +static void AnimateGroundGoingDown(void) { - sCableCar->unk1C = (sCableCar->unk1C + 1) % 0x60; - sCableCar->bg0HorizontalOffset = sCableCar->unk1F + sCableCar->unk1D; - sCableCar->bg0VerticalOffset = sCableCar->unk20 + sCableCar->unk1E; - sCableCar->unk1D++; - if ((sCableCar->unk1D % 4) == 0) - sCableCar->unk1E++; - - if (sCableCar->unk1D > 16) - sub_8151388(); + sCableCar->groundTimer = (sCableCar->groundTimer + 1) % 96; + sCableCar->bg0HorizontalOffset = sCableCar->groundXBase + sCableCar->groundXOffset; + sCableCar->bg0VerticalOffset = sCableCar->groundYBase + sCableCar->groundYOffset; + sCableCar->groundXOffset++; + if ((sCableCar->groundXOffset % 4) == 0) + sCableCar->groundYOffset++; + + if (sCableCar->groundXOffset > 16) + DrawNextGroundSegmentGoingDown(); } -static void sub_8151214(void) +static void DrawNextGroundSegmentGoingUp(void) { u8 i = 0; - sCableCar->unk1D = sCableCar->unk1E = 0; - sCableCar->unk1F = sCableCar->bg0HorizontalOffset; - sCableCar->unk20 = sCableCar->bg0VerticalOffset; - sCableCar->unk19 = (sCableCar->unk19 + 30) % 32; - sCableCar->unk18 -= 2; - gUnknown_0203ABB2 = (sCableCar->unk1A + 23) % 32; - for (i = 0; i < 9; i++) + sCableCar->groundXOffset = sCableCar->groundYOffset = 0; + sCableCar->groundXBase = sCableCar->bg0HorizontalOffset; + sCableCar->groundYBase = sCableCar->bg0VerticalOffset; + sCableCar->groundSegmentXStart = (sCableCar->groundSegmentXStart + 30) % 32; + sCableCar->groundTileIdx -= 2; + sGroundSegmentY_Up = (sCableCar->groundSegmentYStart + 23) % 32; + + // Draw next segment + for (i = 0; i < ARRAY_COUNT(sCableCar->groundTileBuffer); i++) { - gUnknown_0203ABB0 = sCableCar->unk19; - gUnknown_0203ABB1 = (gUnknown_0203ABB2 + i) % 32; - FillBgTilemapBufferRect(0, sCableCar->unk22[i][sCableCar->unk18], gUnknown_0203ABB0, gUnknown_0203ABB1, 1, 1, 17); - gUnknown_0203ABB0 = (gUnknown_0203ABB0 + 1) % 32; - FillBgTilemapBufferRect(0, sCableCar->unk22[i][sCableCar->unk18 + 1], gUnknown_0203ABB0, gUnknown_0203ABB1, 1, 1, 17); + sGroundX_Up = sCableCar->groundSegmentXStart; + sGroundY_Up = (sGroundSegmentY_Up + i) % 32; + FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx], sGroundX_Up, sGroundY_Up, 1, 1, 17); + sGroundX_Up = (sGroundX_Up + 1) % 32; + FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx + 1], sGroundX_Up, sGroundY_Up, 1, 1, 17); } - gUnknown_0203ABB0 = (sCableCar->unk19 + 30) % 32; - FillBgTilemapBufferRect(0, 0, gUnknown_0203ABB0, 0, 2, 32, 17); - if (sCableCar->unk18 == 0) + // Erase old segment + sGroundX_Up = (sCableCar->groundSegmentXStart + 30) % 32; + FillBgTilemapBufferRect(0, 0, sGroundX_Up, 0, 2, 32, 17); + if (sCableCar->groundTileIdx == 0) { - sCableCar->unk1A = (sCableCar->unk1A + 29) % 32; - sCableCar->unk18 = 12; - sub_8151088(); - gUnknown_0203ABB0 = (sCableCar->unk1A + 1) % 32; - FillBgTilemapBufferRect(0, 0, 0, gUnknown_0203ABB0, 32, 9, 17); + sCableCar->groundSegmentYStart = (sCableCar->groundSegmentYStart + 29) % 32; + sCableCar->groundTileIdx = 12; + BufferNextGroundSegment(); + sGroundX_Up = (sCableCar->groundSegmentYStart + 1) % 32; + FillBgTilemapBufferRect(0, 0, 0, sGroundX_Up, 32, 9, 17); } } -static void sub_8151388(void) +static void DrawNextGroundSegmentGoingDown(void) { u8 i = 0; - sCableCar->unk1D = sCableCar->unk1E = 0; - sCableCar->unk1F = sCableCar->bg0HorizontalOffset; - sCableCar->unk20 = sCableCar->bg0VerticalOffset; - sCableCar->unk19 = (sCableCar->unk19 + 2) % 32; - sCableCar->unk18 += 2; - gUnknown_0203ABB5 = sCableCar->unk1A; - for (i = 0; i < 9; i++) + sCableCar->groundXOffset = sCableCar->groundYOffset = 0; + sCableCar->groundXBase = sCableCar->bg0HorizontalOffset; + sCableCar->groundYBase = sCableCar->bg0VerticalOffset; + sCableCar->groundSegmentXStart = (sCableCar->groundSegmentXStart + 2) % 32; + sCableCar->groundTileIdx += 2; + sGroundSegmentY_Down = sCableCar->groundSegmentYStart; + + // Draw next segment + for (i = 0; i < ARRAY_COUNT(sCableCar->groundTileBuffer); i++) { - gUnknown_0203ABB3 = sCableCar->unk19; - gUnknown_0203ABB4 = (gUnknown_0203ABB5 + i) % 32; - FillBgTilemapBufferRect(0, sCableCar->unk22[i][sCableCar->unk18], gUnknown_0203ABB3, gUnknown_0203ABB4, 1, 1, 17); - gUnknown_0203ABB3 = (gUnknown_0203ABB3 + 1) % 32; - FillBgTilemapBufferRect(0, sCableCar->unk22[i][sCableCar->unk18 + 1], gUnknown_0203ABB3, gUnknown_0203ABB4, 1, 1, 17); + sGroundX_Down = sCableCar->groundSegmentXStart; + sGroundY_Down = (sGroundSegmentY_Down + i) % 32; + FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx], sGroundX_Down, sGroundY_Down, 1, 1, 17); + sGroundX_Down = (sGroundX_Down + 1) % 32; + FillBgTilemapBufferRect(0, sCableCar->groundTileBuffer[i][sCableCar->groundTileIdx + 1], sGroundX_Down, sGroundY_Down, 1, 1, 17); } - gUnknown_0203ABB4 = (sCableCar->unk1A + 23) % 32; - FillBgTilemapBufferRect(0, 0, sCableCar->unk19, gUnknown_0203ABB4, 2, 9, 17); - if (sCableCar->unk18 == 10) + // Erase old segment + sGroundY_Down = (sCableCar->groundSegmentYStart + 23) % 32; + FillBgTilemapBufferRect(0, 0, sCableCar->groundSegmentXStart, sGroundY_Down, 2, 9, 17); + if (sCableCar->groundTileIdx == 10) { - sCableCar->unk1A = (sCableCar->unk1A + 3) % 32; - sCableCar->unk18 = 0xfe; - sub_8151088(); + sCableCar->groundSegmentYStart = (sCableCar->groundSegmentYStart + 3) % 32; + sCableCar->groundTileIdx = -2; + BufferNextGroundSegment(); } } -static void sub_81514C8(u8 arg0) +static void InitGroundTilemapData(bool8 goingDown) { - switch (arg0) + switch (goingDown) { - case 0: + case FALSE: default: - sCableCar->unk1B = 2; - sCableCar->unk19 = 0; - sCableCar->unk1A = 20; - sCableCar->unk18 = 12; - sub_8151088(); - sub_8151214(); + sCableCar->groundTilemapOffset = 2; + sCableCar->groundSegmentXStart = 0; + sCableCar->groundSegmentYStart = 20; + sCableCar->groundTileIdx = 12; + BufferNextGroundSegment(); + DrawNextGroundSegmentGoingUp(); break; - case 1: - sCableCar->unk1B = 2; - sCableCar->unk19 = 28; - sCableCar->unk1A = 20; - sCableCar->unk18 = 4; - sub_8151088(); - sub_8151388(); + case TRUE: + sCableCar->groundTilemapOffset = 2; + sCableCar->groundSegmentXStart = 28; + sCableCar->groundSegmentYStart = 20; + sCableCar->groundTileIdx = 4; + BufferNextGroundSegment(); + DrawNextGroundSegmentGoingDown(); break; } - sCableCar->unk1C = 0; + sCableCar->groundTimer = 0; } diff --git a/src/confetti_util.c b/src/confetti_util.c index 3bda3ab53..6d4770056 100644 --- a/src/confetti_util.c +++ b/src/confetti_util.c @@ -30,10 +30,8 @@ static void sub_81520A8(void *dest, u16 value, u8 left, u8 top, u8 width, u8 hei static void sub_8152134(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height) // Unused. { - u8 i; - u8 j; - u8 x; - u8 y; + u8 i, j; + u8 x, y; const u16 *_src; for (i = 0, _src = src, y = top; i < height; i++) diff --git a/src/contest.c b/src/contest.c index fbd42a007..a84d72aa9 100644 --- a/src/contest.c +++ b/src/contest.c @@ -5411,7 +5411,7 @@ static void Contest_PrintTextToBg0WindowStd(u32 windowId, const u8 *b) printerTemplate.currentY = 1; printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; - printerTemplate.unk = 0; + printerTemplate.style = 0; printerTemplate.fgColor = 15; printerTemplate.bgColor = 0; printerTemplate.shadowColor = 8; @@ -5434,7 +5434,7 @@ void Contest_PrintTextToBg0WindowAt(u32 windowId, u8 *currChar, s32 x, s32 y, s3 printerTemplate.currentY = y; printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; - printerTemplate.unk = 0; + printerTemplate.style = 0; printerTemplate.fgColor = 15; printerTemplate.bgColor = 0; printerTemplate.shadowColor = 8; @@ -5458,7 +5458,7 @@ static void Contest_StartTextPrinter(const u8 *currChar, bool32 b) printerTemplate.currentY = 1; printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; - printerTemplate.unk = 0; + printerTemplate.style = 0; printerTemplate.fgColor = 1; printerTemplate.bgColor = 0; printerTemplate.shadowColor = 8; diff --git a/src/contest_util.c b/src/contest_util.c index c60e885f2..123d3e8eb 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -192,18 +192,18 @@ static const struct OamData sOamData_858D7F0 = .affineParam = 0, }; -static const struct SpriteTemplate sSpriteTemplate_858D7F8 = -{ - .tileTag = 3009, - .paletteTag = 3009, - .oam = &sOamData_858D7F0, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, +static const struct SpriteTemplate sSpriteTemplate_858D7F8 = +{ + .tileTag = 3009, + .paletteTag = 3009, + .oam = &sOamData_858D7F0, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteSheet sUnknown_0858D810[] = +static const struct SpriteSheet sUnknown_0858D810[] = { { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 }, { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 }, @@ -240,26 +240,26 @@ static const struct OamData sOamData_Confetti = static const struct SpriteTemplate sSpriteTemplate_Confetti = { - .tileTag = TAG_CONFETTI, - .paletteTag = TAG_CONFETTI, - .oam = &sOamData_Confetti, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, + .tileTag = TAG_CONFETTI, + .paletteTag = TAG_CONFETTI, + .oam = &sOamData_Confetti, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Confetti }; static const struct CompressedSpriteSheet sSpriteSheet_Confetti = { - .data = gConfetti_Gfx, - .size = 0x220, + .data = gConfetti_Gfx, + .size = 0x220, .tag = TAG_CONFETTI }; static const struct CompressedSpritePalette sSpritePalette_Confetti = { - .data = gConfetti_Pal, + .data = gConfetti_Pal, .tag = TAG_CONFETTI }; @@ -282,7 +282,7 @@ static const struct BgTemplate sBgTemplates[] = .paletteMode = 0, .priority = 3, .baseTile = 0, - }, + }, { .bg = 2, .charBaseIndex = 0, @@ -291,7 +291,7 @@ static const struct BgTemplate sBgTemplates[] = .paletteMode = 0, .priority = 3, .baseTile = 0, - }, + }, { .bg = 3, .charBaseIndex = 0, @@ -306,39 +306,39 @@ static const struct BgTemplate sBgTemplates[] = static const struct WindowTemplate sWindowTemplates[] = { { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 4, - .width = 12, - .height = 2, - .paletteNum = 15, + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 4, + .width = 12, + .height = 2, + .paletteNum = 15, .baseBlock = 770 }, { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 7, - .width = 12, - .height = 2, - .paletteNum = 15, + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 7, + .width = 12, + .height = 2, + .paletteNum = 15, .baseBlock = 794 }, { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 10, - .width = 12, - .height = 2, - .paletteNum = 15, + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 10, + .width = 12, + .height = 2, + .paletteNum = 15, .baseBlock = 818 }, { - .bg = 1, - .tilemapLeft = 7, - .tilemapTop = 13, - .width = 12, - .height = 2, - .paletteNum = 15, + .bg = 1, + .tilemapLeft = 7, + .tilemapTop = 13, + .width = 12, + .height = 2, + .paletteNum = 15, .baseBlock = 842 }, DUMMY_WIN_TEMPLATE, @@ -364,19 +364,19 @@ static const struct OamData sUnknown_0858D8C0 = static const struct SpriteTemplate sSpriteTemplate_858D8C8 = { - .tileTag = 22222, - .paletteTag = 0, - .oam = &sUnknown_0858D8C0, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, + .tileTag = 22222, + .paletteTag = 0, + .oam = &sUnknown_0858D8C0, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteSheet sUnknown_0858D8E0 = +static const struct SpriteSheet sUnknown_0858D8E0 = { - .data = gMiscBlank_Gfx, - .size = 0x200, + .data = gMiscBlank_Gfx, + .size = 0x200, .tag = 22222 }; @@ -1219,8 +1219,8 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) NAKED static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) { - asm_unified("\n\ - push {r4-r7,lr}\n\ + asm_unified( + "push {r4-r7,lr}\n\ mov r7, r10\n\ mov r6, r9\n\ mov r5, r8\n\ @@ -2201,7 +2201,7 @@ static void AddContestTextPrinter(int windowId, u8 *str, int x) textPrinter.currentY = 2; textPrinter.letterSpacing = 0; textPrinter.lineSpacing = 0; - textPrinter.unk = 0; + textPrinter.style = 0; textPrinter.fgColor = 1; textPrinter.bgColor = 0; textPrinter.shadowColor = 8; @@ -2787,8 +2787,8 @@ bool8 GiveMonArtistRibbon(void) u8 hasArtistRibbon; hasArtistRibbon = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON); - if (!hasArtistRibbon - && gContestFinalStandings[gContestPlayerMonIndex] == 0 + if (!hasArtistRibbon + && gContestFinalStandings[gContestPlayerMonIndex] == 0 && gSpecialVar_ContestRank == CONTEST_RANK_MASTER && gContestMonTotalPoints[gContestPlayerMonIndex] >= 800) { @@ -2905,8 +2905,8 @@ static void Task_ShowContestEntryMonPic(u8 taskId) void GetContestMultiplayerId(void) { - if ((gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) - && gNumLinkContestPlayers == CONTESTANT_COUNT + if ((gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) + && gNumLinkContestPlayers == CONTESTANT_COUNT && !(gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)) gSpecialVar_Result = GetMultiplayerId(); else diff --git a/src/credits.c b/src/credits.c index 020221f30..5f331097b 100644 --- a/src/credits.c +++ b/src/credits.c @@ -1160,7 +1160,7 @@ static void sub_8175548(void) { ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBackgroundTemplates, 1); - SetBgTilemapBuffer(0, AllocZeroed(0x800)); + SetBgTilemapBuffer(0, AllocZeroed(BG_SCREEN_SIZE)); LoadPalette(gUnknown_085E56F0, 0x80, 0x40); InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h index d0269980c..633213db8 100644 --- a/src/data/graphics/rayquaza_scene.h +++ b/src/data/graphics/rayquaza_scene.h @@ -1,73 +1,62 @@ -const u32 gRaySceneGroudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon.4bpp.lz"); -const u32 gRaySceneGroudon2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_shoulder.4bpp.lz"); -const u32 gRaySceneGroudon3_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_claw.4bpp.lz"); - -const u32 gRaySceneKyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre.4bpp.lz"); -const u32 gRaySceneKyogre2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_shoulder.4bpp.lz"); -const u32 gRaySceneKyogre3_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_fin.4bpp.lz"); - -const u32 gRaySceneGroudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/groudon.gbapal.lz"); -const u32 gRaySceneKyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/kyogre.gbapal.lz"); - -const u32 gRaySceneClouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/clouds.4bpp.lz"); -const u32 gRaySceneClouds_Pal[] = INCBIN_U32("graphics/rayquaza_scene/clouds.gbapal.lz"); // pal 1 clouds, pal 2 rain -const u32 gRaySceneClouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/clouds1.bin.lz"); -const u32 gRaySceneClouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/clouds2.bin.lz"); -const u32 gRaySceneClouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/clouds3.bin.lz"); - -const u32 gRaySceneSmoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/smoke.4bpp.lz"); -const u32 gRaySceneSmoke_Pal[] = INCBIN_U32("graphics/rayquaza_scene/smoke.gbapal.lz"); - -const u32 gRaySceneRayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza.8bpp.lz"); -const u32 gRaySceneRayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza.gbapal.lz"); -const u32 gRaySceneRayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza.bin.lz"); - -const u32 gRaySceneOvercast_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/overcast.4bpp.lz"); // uses pal 2 of gRaySceneRayquaza_Pal -const u32 gRaySceneOvercast_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/overcast.bin.lz"); - -const u32 gRaySceneRayquazaFly1_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_fly1.4bpp.lz"); -const u32 gRaySceneRayquazaTail_Gfx[] = INCBIN_U32( "graphics/rayquaza_scene/rayquaza_tail_fix.4bpp.lz"); // for some reason there are an extra 0xC bytes at the end of the original 4bpp, so in order to produce the correct lz, we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software. - -const u32 gRaySceneOvercast2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/overcast2.4bpp.lz"); - -const u32 gRaySceneRayquazaLight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_light.4bpp.lz"); // uses pal 2 of gRaySceneOvercast2_Pal - -const u32 gRaySceneOvercast2_Pal[] = INCBIN_U32("graphics/rayquaza_scene/overcast2.gbapal.lz"); -const u32 gRaySceneOvercast2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/overcast2.bin.lz"); - -const u32 gRaySceneRayquazaLight_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_light.bin.lz"); - -const u32 gRaySceneChaseBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/chase_bg.4bpp.lz"); -const u32 gRaySceneChaseBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/chase_bg.bin.lz"); - -const u32 gRaySceneChaseStreaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/chase_streaks.4bpp.lz"); -const u32 gRaySceneChaseStreaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/chase_streaks.bin.lz"); - -const u32 gRaySceneRayquazaChase_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_chase.4bpp.lz"); -const u32 gRayChaseRayquazaChase_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_chase.bin.lz"); -const u32 gRayChaseRayquazaChase2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_chase2.bin.lz"); - -const u32 gRaySceneChase_Pal[] = INCBIN_U32("graphics/rayquaza_scene/chase.gbapal.lz"); - -const u32 gRaySceneGroudonLeft_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_left.4bpp.lz"); -const u32 gRaySceneGroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_tail.4bpp.lz"); - -const u32 gRaySceneKyogreRight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_right.4bpp.lz"); - -const u32 gRaySceneRayquazaHover_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_hover.4bpp.lz"); -const u32 gRaySceneRayquazaFlyIn_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_flyin.4bpp.lz"); - -const u32 gRaySceneSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/splash.4bpp.lz"); - -const u32 gRaySceneGroudonLeft_Pal[] = INCBIN_U32("graphics/rayquaza_scene/groudon_left.gbapal.lz"); -const u32 gRaySceneKyogreRight_Pal[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_right.gbapal.lz"); -const u32 gRaySceneRayquazaHover_Pal[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_hover.gbapal.lz"); - -const u32 gRaySceneSplash_Pal[] = INCBIN_U32("graphics/rayquaza_scene/splash.gbapal.lz"); - -const u32 gRaySceneHushBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/hush_bg.4bpp.lz"); -const u32 gRaySceneHushRing_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/hush_ring.8bpp.lz"); -const u32 gRaySceneHushBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/hush_bg.bin.lz"); -const u32 gRaySceneHushRing_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/hush_ring.bin.lz"); -const u32 gRaySceneHushRing_Map[] = INCBIN_U32("graphics/rayquaza_scene/hush_ring_map.bin.lz"); -const u32 gRaySceneHushBg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/hush_bg.gbapal.lz"); +// Scene 1 (RAY_ANIM_DUO_FIGHT / RAY_ANIM_DUO_FIGHT_PRE) +const u32 gRaySceneDuoFight_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.lz"); +const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.lz"); +const u32 gRaySceneDuoFight_GroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.lz"); +const u32 gRaySceneDuoFight_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.lz"); +const u32 gRaySceneDuoFight_KyogrePectoralFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.4bpp.lz"); +const u32 gRaySceneDuoFight_KyogreDorsalFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.4bpp.lz"); +const u32 gRaySceneDuoFight_Groudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.gbapal.lz"); +const u32 gRaySceneDuoFight_Kyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.gbapal.lz"); +const u32 gRaySceneDuoFight_Clouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.lz"); +const u32 gRaySceneDuoFight_Clouds_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.gbapal.lz"); // pal 1 clouds, pal 2 rain +const u32 gRaySceneDuoFight_Clouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.lz"); +const u32 gRaySceneDuoFight_Clouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.lz"); +const u32 gRaySceneDuoFight_Clouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.lz"); + +// Scene 2 (RAY_ANIM_TAKES_FLIGHT) +const u32 gRaySceneTakesFlight_Smoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.lz"); +const u32 gRaySceneTakesFlight_Smoke_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.gbapal.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.gbapal.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.lz"); +const u32 gRaySceneTakesFlight_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.lz"); // uses pal 2 of gRaySceneTakesFlight_Rayquaza_Pal +const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.lz"); + +// Scene 3 (RAY_ANIM_DESCENDS) +const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); +// for some reason there are an extra 0xC bytes at the end of the original rayquaza_tail.4bpp, so in order to produce the correct lz, +// we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software. +const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz"); +const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); +const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneDescends_Bg_Pal +const u32 gRaySceneDescends_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.gbapal.lz"); +const u32 gRaySceneDescends_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.lz"); +const u32 gRaySceneDescends_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.lz"); + +// Scene 4 (RAY_ANIM_CHARGES) +const u32 gRaySceneCharges_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.lz"); +const u32 gRaySceneCharges_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.lz"); +const u32 gRaySceneCharges_Streaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.lz"); +const u32 gRaySceneCharges_Streaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.lz"); +const u32 gRaySceneCharges_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.lz"); +const u32 gRaySceneCharges_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.lz"); +const u32 gRaySceneCharges_Orbs_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/orbs.bin.lz"); +const u32 gRaySceneCharges_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.gbapal.lz"); + +// Scene 5 (RAY_ANIM_CHASES_AWAY) +const u32 gRaySceneChasesAway_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.lz"); +const u32 gRaySceneChasesAway_GroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.lz"); +const u32 gRaySceneChasesAway_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.lz"); +const u32 gRaySceneChasesAway_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.lz"); +const u32 gRaySceneChasesAway_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.lz"); +const u32 gRaySceneChasesAway_KyogreSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.lz"); +const u32 gRaySceneChasesAway_Groudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.gbapal.lz"); +const u32 gRaySceneChasesAway_Kyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.gbapal.lz"); +const u32 gRaySceneChasesAway_Rayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.gbapal.lz"); +const u32 gRaySceneChasesAway_KyogreSplash_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.gbapal.lz"); +const u32 gRaySceneChasesAway_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.4bpp.lz"); +const u32 gRaySceneChasesAway_Ring_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.lz"); +const u32 gRaySceneChasesAway_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/light.bin.lz"); +const u32 gRaySceneChasesAway_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.lz"); +const u32 gRaySceneChasesAway_Ring_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.lz"); +const u32 gRaySceneChasesAway_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.gbapal.lz"); diff --git a/src/data/region_map/region_map_entries.h b/src/data/region_map/region_map_entries.h index 1d503d72f..6b433f90f 100644 --- a/src/data/region_map/region_map_entries.h +++ b/src/data/region_map/region_map_entries.h @@ -200,219 +200,219 @@ static const u8 sMapName_DesertUnderpass[] = _("DESERT UNDERPASS"); static const u8 sMapName_TrainerHill[] = _("TRAINER HILL"); const struct RegionMapLocation gRegionMapEntries[] = { - [MAPSEC_LITTLEROOT_TOWN] = { 4, 11, 1, 1, sMapName_LittlerootTown}, - [MAPSEC_OLDALE_TOWN] = { 4, 9, 1, 1, sMapName_OldaleTown}, - [MAPSEC_DEWFORD_TOWN] = { 2, 14, 1, 1, sMapName_DewfordTown}, - [MAPSEC_LAVARIDGE_TOWN] = { 5, 3, 1, 1, sMapName_LavaridgeTown}, - [MAPSEC_FALLARBOR_TOWN] = { 3, 0, 1, 1, sMapName_FallarborTown}, - [MAPSEC_VERDANTURF_TOWN] = { 4, 6, 1, 1, sMapName_VerdanturfTown}, - [MAPSEC_PACIFIDLOG_TOWN] = {17, 10, 1, 1, sMapName_PacifidlogTown}, - [MAPSEC_PETALBURG_CITY] = { 1, 9, 1, 1, sMapName_PetalburgCity}, - [MAPSEC_SLATEPORT_CITY] = { 8, 10, 1, 2, sMapName_SlateportCity}, - [MAPSEC_MAUVILLE_CITY] = { 8, 6, 2, 1, sMapName_MauvilleCity}, - [MAPSEC_RUSTBORO_CITY] = { 0, 5, 1, 2, sMapName_RustboroCity}, - [MAPSEC_FORTREE_CITY] = {12, 0, 1, 1, sMapName_FortreeCity}, - [MAPSEC_LILYCOVE_CITY] = {18, 3, 2, 1, sMapName_LilycoveCity}, - [MAPSEC_MOSSDEEP_CITY] = {24, 5, 2, 1, sMapName_MossdeepCity}, - [MAPSEC_SOOTOPOLIS_CITY] = {21, 7, 1, 1, sMapName_SootopolisCity}, - [MAPSEC_EVER_GRANDE_CITY] = {27, 8, 1, 2, sMapName_EverGrandeCity}, - [MAPSEC_ROUTE_101] = { 4, 10, 1, 1, sMapName_Route101}, - [MAPSEC_ROUTE_102] = { 2, 9, 2, 1, sMapName_Route102}, - [MAPSEC_ROUTE_103] = { 4, 8, 4, 1, sMapName_Route103}, - [MAPSEC_ROUTE_104] = { 0, 7, 1, 3, sMapName_Route104}, - [MAPSEC_ROUTE_105] = { 0, 10, 1, 3, sMapName_Route105}, - [MAPSEC_ROUTE_106] = { 0, 13, 2, 1, sMapName_Route106}, - [MAPSEC_ROUTE_107] = { 3, 14, 3, 1, sMapName_Route107}, - [MAPSEC_ROUTE_108] = { 6, 14, 2, 1, sMapName_Route108}, - [MAPSEC_ROUTE_109] = { 8, 12, 1, 3, sMapName_Route109}, - [MAPSEC_ROUTE_110] = { 8, 7, 1, 3, sMapName_Route110}, - [MAPSEC_ROUTE_111] = { 8, 0, 1, 6, sMapName_Route111}, - [MAPSEC_ROUTE_112] = { 6, 3, 2, 1, sMapName_Route112}, - [MAPSEC_ROUTE_113] = { 4, 0, 4, 1, sMapName_Route113}, - [MAPSEC_ROUTE_114] = { 1, 0, 2, 3, sMapName_Route114}, - [MAPSEC_ROUTE_115] = { 0, 2, 1, 3, sMapName_Route115}, - [MAPSEC_ROUTE_116] = { 1, 5, 4, 1, sMapName_Route116}, - [MAPSEC_ROUTE_117] = { 5, 6, 3, 1, sMapName_Route117}, - [MAPSEC_ROUTE_118] = {10, 6, 2, 1, sMapName_Route118}, - [MAPSEC_ROUTE_119] = {11, 0, 1, 6, sMapName_Route119}, - [MAPSEC_ROUTE_120] = {13, 0, 1, 4, sMapName_Route120}, - [MAPSEC_ROUTE_121] = {14, 3, 4, 1, sMapName_Route121}, - [MAPSEC_ROUTE_122] = {16, 4, 1, 2, sMapName_Route122}, - [MAPSEC_ROUTE_123] = {12, 6, 5, 1, sMapName_Route123}, - [MAPSEC_ROUTE_124] = {20, 3, 4, 3, sMapName_Route124}, - [MAPSEC_ROUTE_125] = {24, 3, 2, 2, sMapName_Route125}, - [MAPSEC_ROUTE_126] = {20, 6, 3, 3, sMapName_Route126}, - [MAPSEC_ROUTE_127] = {23, 6, 3, 3, sMapName_Route127}, - [MAPSEC_ROUTE_128] = {23, 9, 4, 1, sMapName_Route128}, - [MAPSEC_ROUTE_129] = {24, 10, 2, 1, sMapName_Route129}, - [MAPSEC_ROUTE_130] = {21, 10, 3, 1, sMapName_Route130}, - [MAPSEC_ROUTE_131] = {18, 10, 3, 1, sMapName_Route131}, - [MAPSEC_ROUTE_132] = {15, 10, 2, 1, sMapName_Route132}, - [MAPSEC_ROUTE_133] = {12, 10, 3, 1, sMapName_Route133}, - [MAPSEC_ROUTE_134] = { 9, 10, 3, 1, sMapName_Route134}, - [MAPSEC_UNDERWATER_124] = {20, 3, 4, 3, sMapName_Underwater}, - [MAPSEC_UNDERWATER_125] = {20, 6, 3, 3, sMapName_Underwater}, - [MAPSEC_UNDERWATER_126] = {23, 6, 3, 3, sMapName_Underwater}, - [MAPSEC_UNDERWATER_127] = {23, 9, 4, 1, sMapName_Underwater}, - [MAPSEC_UNDERWATER_SOOTOPOLIS] = {21, 7, 1, 1, sMapName_Underwater}, - [MAPSEC_GRANITE_CAVE] = { 1, 13, 1, 1, sMapName_GraniteCave}, - [MAPSEC_MT_CHIMNEY] = { 6, 2, 1, 1, sMapName_MtChimney}, - [MAPSEC_SAFARI_ZONE] = {16, 2, 1, 1, sMapName_SafariZone}, - [MAPSEC_BATTLE_FRONTIER] = {22, 12, 1, 1, sMapName_BattleFrontier}, - [MAPSEC_PETALBURG_WOODS] = { 0, 8, 1, 1, sMapName_PetalburgWoods}, - [MAPSEC_RUSTURF_TUNNEL] = { 2, 5, 1, 1, sMapName_RusturfTunnel}, - [MAPSEC_ABANDONED_SHIP] = { 6, 14, 1, 1, sMapName_AbandonedShip}, - [MAPSEC_NEW_MAUVILLE] = { 8, 7, 1, 1, sMapName_NewMauville}, - [MAPSEC_METEOR_FALLS] = { 0, 3, 1, 1, sMapName_MeteorFalls}, - [MAPSEC_METEOR_FALLS2] = { 1, 2, 1, 1, sMapName_MeteorFalls}, - [MAPSEC_MT_PYRE] = {16, 4, 1, 1, sMapName_MtPyre}, - [MAPSEC_AQUA_HIDEOUT_OLD] = {19, 3, 1, 1, sMapName_AquaHideoutOld}, - [MAPSEC_SHOAL_CAVE] = {24, 4, 1, 1, sMapName_ShoalCave}, - [MAPSEC_SEAFLOOR_CAVERN] = {24, 9, 1, 1, sMapName_SeafloorCavern}, - [MAPSEC_UNDERWATER_128] = {24, 9, 1, 1, sMapName_Underwater}, - [MAPSEC_VICTORY_ROAD] = {27, 9, 1, 1, sMapName_VictoryRoad}, - [MAPSEC_MIRAGE_ISLAND] = {17, 10, 1, 1, sMapName_MirageIsland}, - [MAPSEC_CAVE_OF_ORIGIN] = {21, 7, 1, 1, sMapName_CaveOfOrigin}, - [MAPSEC_SOUTHERN_ISLAND] = {12, 14, 1, 1, sMapName_SouthernIsland}, - [MAPSEC_FIERY_PATH] = { 6, 3, 1, 1, sMapName_FieryPath}, - [MAPSEC_FIERY_PATH2] = { 7, 3, 1, 1, sMapName_FieryPath}, - [MAPSEC_JAGGED_PASS] = { 6, 3, 1, 1, sMapName_JaggedPass}, - [MAPSEC_JAGGED_PASS2] = { 7, 2, 1, 1, sMapName_JaggedPass}, - [MAPSEC_SEALED_CHAMBER] = {11, 10, 1, 1, sMapName_SealedChamber}, - [MAPSEC_UNDERWATER_SEALED_CHAMBER] = {11, 10, 1, 1, sMapName_Underwater}, - [MAPSEC_SCORCHED_SLAB] = {13, 0, 1, 1, sMapName_ScorchedSlab}, - [MAPSEC_ISLAND_CAVE] = { 0, 10, 1, 1, sMapName_IslandCave}, - [MAPSEC_DESERT_RUINS] = { 8, 3, 1, 1, sMapName_DesertRuins}, - [MAPSEC_ANCIENT_TOMB] = {13, 2, 1, 1, sMapName_AncientTomb}, - [MAPSEC_INSIDE_OF_TRUCK] = { 0, 0, 1, 1, sMapName_InsideOfTruck}, - [MAPSEC_SKY_PILLAR] = {19, 10, 1, 1, sMapName_SkyPillar}, - [MAPSEC_SECRET_BASE] = { 0, 0, 1, 1, sMapName_SecretBase}, - [MAPSEC_DYNAMIC] = { 0, 0, 1, 1, sMapName_None}, - [MAPSEC_PALLET_TOWN] = { 0, 0, 1, 1, sMapName_PalletTown}, - [MAPSEC_VIRIDIAN_CITY] = { 0, 0, 1, 1, sMapName_ViridianCity}, - [MAPSEC_PEWTER_CITY] = { 0, 0, 1, 1, sMapName_PewterCity}, - [MAPSEC_CERULEAN_CITY] = { 0, 0, 1, 1, sMapName_CeruleanCity}, - [MAPSEC_LAVENDER_TOWN] = { 0, 0, 1, 1, sMapName_LavenderTown}, - [MAPSEC_VERMILION_CITY] = { 0, 0, 1, 1, sMapName_VermilionCity}, - [MAPSEC_CELADON_CITY] = { 0, 0, 1, 1, sMapName_CeladonCity}, - [MAPSEC_FUCHSIA_CITY] = { 0, 0, 1, 1, sMapName_FuchsiaCity}, - [MAPSEC_CINNABAR_ISLAND] = { 0, 0, 1, 1, sMapName_CinnabarIsland}, - [MAPSEC_INDIGO_PLATEAU] = { 0, 0, 1, 1, sMapName_IndigoPlateau}, - [MAPSEC_SAFFRON_CITY] = { 0, 0, 1, 1, sMapName_SaffronCity}, - [MAPSEC_ROUTE_4_FLYDUP] = { 0, 0, 1, 1, sMapName_Route4}, - [MAPSEC_ROUTE_10_FLYDUP] = { 0, 0, 1, 1, sMapName_Route10}, - [MAPSEC_ROUTE_1] = { 0, 0, 1, 1, sMapName_Route1}, - [MAPSEC_ROUTE_2] = { 0, 0, 1, 1, sMapName_Route2}, - [MAPSEC_ROUTE_3] = { 0, 0, 1, 1, sMapName_Route3}, - [MAPSEC_ROUTE_4] = { 0, 0, 1, 1, sMapName_Route4_2}, - [MAPSEC_ROUTE_5] = { 0, 0, 1, 1, sMapName_Route5}, - [MAPSEC_ROUTE_6] = { 0, 0, 1, 1, sMapName_Route6}, - [MAPSEC_ROUTE_7] = { 0, 0, 1, 1, sMapName_Route7}, - [MAPSEC_ROUTE_8] = { 0, 0, 1, 1, sMapName_Route8}, - [MAPSEC_ROUTE_9] = { 0, 0, 1, 1, sMapName_Route9}, - [MAPSEC_ROUTE_10] = { 0, 0, 1, 1, sMapName_Route10_2}, - [MAPSEC_ROUTE_11] = { 0, 0, 1, 1, sMapName_Route11}, - [MAPSEC_ROUTE_12] = { 0, 0, 1, 1, sMapName_Route12}, - [MAPSEC_ROUTE_13] = { 0, 0, 1, 1, sMapName_Route13}, - [MAPSEC_ROUTE_14] = { 0, 0, 1, 1, sMapName_Route14}, - [MAPSEC_ROUTE_15] = { 0, 0, 1, 1, sMapName_Route15}, - [MAPSEC_ROUTE_16] = { 0, 0, 1, 1, sMapName_Route16}, - [MAPSEC_ROUTE_17] = { 0, 0, 1, 1, sMapName_Route17}, - [MAPSEC_ROUTE_18] = { 0, 0, 1, 1, sMapName_Route18}, - [MAPSEC_ROUTE_19] = { 0, 0, 1, 1, sMapName_Route19}, - [MAPSEC_ROUTE_20] = { 0, 0, 1, 1, sMapName_Route20}, - [MAPSEC_ROUTE_21] = { 0, 0, 1, 1, sMapName_Route21}, - [MAPSEC_ROUTE_22] = { 0, 0, 1, 1, sMapName_Route22}, - [MAPSEC_ROUTE_23] = { 0, 0, 1, 1, sMapName_Route23}, - [MAPSEC_ROUTE_24] = { 0, 0, 1, 1, sMapName_Route24}, - [MAPSEC_ROUTE_25] = { 0, 0, 1, 1, sMapName_Route25}, - [MAPSEC_VIRIDIAN_FOREST] = { 0, 0, 1, 1, sMapName_ViridianForest}, - [MAPSEC_MT_MOON] = { 0, 0, 1, 1, sMapName_MtMoon}, - [MAPSEC_S_S_ANNE] = { 0, 0, 1, 1, sMapName_SSAnne}, - [MAPSEC_UNDERGROUND_PATH] = { 0, 0, 1, 1, sMapName_UndergroundPath}, - [MAPSEC_UNDERGROUND_PATH_2] = { 0, 0, 1, 1, sMapName_UndergroundPath2}, - [MAPSEC_DIGLETTS_CAVE] = { 0, 0, 1, 1, sMapName_DiglettsCave}, - [MAPSEC_KANTO_VICTORY_ROAD] = { 0, 0, 1, 1, sMapName_KantoVictoryRoad}, - [MAPSEC_ROCKET_HIDEOUT] = { 0, 0, 1, 1, sMapName_RocketHideout}, - [MAPSEC_SILPH_CO] = { 0, 0, 1, 1, sMapName_SilphCo}, - [MAPSEC_POKEMON_MANSION] = { 0, 0, 1, 1, sMapName_PokemonMansion}, - [MAPSEC_KANTO_SAFARI_ZONE] = { 0, 0, 1, 1, sMapName_KantoSafariZone}, - [MAPSEC_POKEMON_LEAGUE] = { 0, 0, 1, 1, sMapName_PokemonLeague}, - [MAPSEC_ROCK_TUNNEL] = { 0, 0, 1, 1, sMapName_RockTunnel}, - [MAPSEC_SEAFOAM_ISLANDS] = { 0, 0, 1, 1, sMapName_SeafoamIslands}, - [MAPSEC_POKEMON_TOWER] = { 0, 0, 1, 1, sMapName_PokemonTower}, - [MAPSEC_CERULEAN_CAVE] = { 0, 0, 1, 1, sMapName_CeruleanCave}, - [MAPSEC_POWER_PLANT] = { 0, 0, 1, 1, sMapName_PowerPlant}, - [MAPSEC_ONE_ISLAND] = { 0, 0, 1, 1, sMapName_OneIsland}, - [MAPSEC_TWO_ISLAND] = { 0, 0, 1, 1, sMapName_TwoIsland}, - [MAPSEC_THREE_ISLAND] = { 0, 0, 1, 1, sMapName_ThreeIsland}, - [MAPSEC_FOUR_ISLAND] = { 0, 0, 1, 1, sMapName_FourIsland}, - [MAPSEC_FIVE_ISLAND] = { 0, 0, 1, 1, sMapName_FiveIsland}, - [MAPSEC_SEVEN_ISLAND] = { 0, 0, 1, 1, sMapName_SevenIsland}, - [MAPSEC_SIX_ISLAND] = { 0, 0, 1, 1, sMapName_SixIsland}, - [MAPSEC_KINDLE_ROAD] = { 0, 0, 1, 1, sMapName_KindleRoad}, - [MAPSEC_TREASURE_BEACH] = { 0, 0, 1, 1, sMapName_TreasureBeach}, - [MAPSEC_CAPE_BRINK] = { 0, 0, 1, 1, sMapName_CapeBrink}, - [MAPSEC_BOND_BRIDGE] = { 0, 0, 1, 1, sMapName_BondBridge}, - [MAPSEC_THREE_ISLE_PORT] = { 0, 0, 1, 1, sMapName_ThreeIslePort}, - [MAPSEC_SEVII_ISLE_6] = { 0, 0, 1, 1, sMapName_SeviiIsle6}, - [MAPSEC_SEVII_ISLE_7] = { 0, 0, 1, 1, sMapName_SeviiIsle7}, - [MAPSEC_SEVII_ISLE_8] = { 0, 0, 1, 1, sMapName_SeviiIsle8}, - [MAPSEC_SEVII_ISLE_9] = { 0, 0, 1, 1, sMapName_SeviiIsle9}, - [MAPSEC_RESORT_GORGEOUS] = { 0, 0, 1, 1, sMapName_ResortGorgeous}, - [MAPSEC_WATER_LABYRINTH] = { 0, 0, 1, 1, sMapName_WaterLabyrinth}, - [MAPSEC_FIVE_ISLE_MEADOW] = { 0, 0, 1, 1, sMapName_FiveIsleMeadow}, - [MAPSEC_MEMORIAL_PILLAR] = { 0, 0, 1, 1, sMapName_MemorialPillar}, - [MAPSEC_OUTCAST_ISLAND] = { 0, 0, 1, 1, sMapName_OutcastIsland}, - [MAPSEC_GREEN_PATH] = { 0, 0, 1, 1, sMapName_GreenPath}, - [MAPSEC_WATER_PATH] = { 0, 0, 1, 1, sMapName_WaterPath}, - [MAPSEC_RUIN_VALLEY] = { 0, 0, 1, 1, sMapName_RuinValley}, - [MAPSEC_TRAINER_TOWER] = { 0, 0, 1, 1, sMapName_TrainerTower}, - [MAPSEC_CANYON_ENTRANCE] = { 0, 0, 1, 1, sMapName_CanyonEntrance}, - [MAPSEC_SEVAULT_CANYON] = { 0, 0, 1, 1, sMapName_SevaultCanyon}, - [MAPSEC_TANOBY_RUINS] = { 0, 0, 1, 1, sMapName_TanobyRuins}, - [MAPSEC_SEVII_ISLE_22] = { 0, 0, 1, 1, sMapName_SeviiIsle22}, - [MAPSEC_SEVII_ISLE_23] = { 0, 0, 1, 1, sMapName_SeviiIsle23}, - [MAPSEC_SEVII_ISLE_24] = { 0, 0, 1, 1, sMapName_SeviiIsle24}, - [MAPSEC_NAVEL_ROCK_FRLG] = { 0, 0, 1, 1, sMapName_NavelRock}, - [MAPSEC_MT_EMBER] = { 0, 0, 1, 1, sMapName_MtEmber}, - [MAPSEC_BERRY_FOREST] = { 0, 0, 1, 1, sMapName_BerryForest}, - [MAPSEC_ICEFALL_CAVE] = { 0, 0, 1, 1, sMapName_IcefallCave}, - [MAPSEC_ROCKET_WAREHOUSE] = { 0, 0, 1, 1, sMapName_RocketWarehouse}, - [MAPSEC_TRAINER_TOWER_2] = { 0, 0, 1, 1, sMapName_TrainerTower2}, - [MAPSEC_DOTTED_HOLE] = { 0, 0, 1, 1, sMapName_DottedHole}, - [MAPSEC_LOST_CAVE] = { 0, 0, 1, 1, sMapName_LostCave}, - [MAPSEC_PATTERN_BUSH] = { 0, 0, 1, 1, sMapName_PatternBush}, - [MAPSEC_ALTERING_CAVE_FRLG] = { 0, 0, 1, 1, sMapName_AlteringCave}, - [MAPSEC_TANOBY_CHAMBERS] = { 0, 0, 1, 1, sMapName_TanobyChambers}, - [MAPSEC_THREE_ISLE_PATH] = { 0, 0, 1, 1, sMapName_ThreeIslePath}, - [MAPSEC_TANOBY_KEY] = { 0, 0, 1, 1, sMapName_TanobyKey}, - [MAPSEC_BIRTH_ISLAND_FRLG] = { 0, 0, 1, 1, sMapName_BirthIsland}, - [MAPSEC_MONEAN_CHAMBER] = { 0, 0, 1, 1, sMapName_MoneanChamber}, - [MAPSEC_LIPTOO_CHAMBER] = { 0, 0, 1, 1, sMapName_LiptooChamber}, - [MAPSEC_WEEPTH_CHAMBER] = { 0, 0, 1, 1, sMapName_WeepthChamber}, - [MAPSEC_DILFORD_CHAMBER] = { 0, 0, 1, 1, sMapName_DilfordChamber}, - [MAPSEC_SCUFIB_CHAMBER] = { 0, 0, 1, 1, sMapName_ScufibChamber}, - [MAPSEC_RIXY_CHAMBER] = { 0, 0, 1, 1, sMapName_RixyChamber}, - [MAPSEC_VIAPOIS_CHAMBER] = { 0, 0, 1, 1, sMapName_ViapoisChamber}, - [MAPSEC_EMBER_SPA] = { 0, 0, 1, 1, sMapName_EmberSpa}, - [MAPSEC_SPECIAL_AREA] = { 0, 0, 1, 1, sMapName_SpecialArea}, - [MAPSEC_AQUA_HIDEOUT] = {19, 3, 1, 1, sMapName_AquaHideout}, - [MAPSEC_MAGMA_HIDEOUT] = { 6, 3, 1, 1, sMapName_MagmaHideout}, - [MAPSEC_MIRAGE_TOWER] = { 8, 2, 1, 1, sMapName_MirageTower}, - [MAPSEC_BIRTH_ISLAND] = { 0, 0, 1, 1, sMapName_BirthIsland}, - [MAPSEC_FARAWAY_ISLAND] = { 0, 0, 1, 1, sMapName_FarawayIsland}, - [MAPSEC_ARTISAN_CAVE] = {22, 12, 1, 1, sMapName_ArtisanCave}, - [MAPSEC_MARINE_CAVE] = { 0, 0, 1, 1, sMapName_MarineCave}, - [MAPSEC_UNDERWATER_MARINE_CAVE] = { 0, 0, 1, 1, sMapName_Underwater}, - [MAPSEC_TERRA_CAVE] = { 0, 0, 1, 1, sMapName_TerraCave}, - [MAPSEC_UNDERWATER_TERRA_CAVE] = { 0, 10, 1, 3, sMapName_Underwater}, - [MAPSEC_UNDERWATER_UNK1] = {24, 3, 2, 2, sMapName_Underwater}, - [MAPSEC_UNDERWATER_129] = {24, 10, 2, 1, sMapName_Underwater}, - [MAPSEC_DESERT_UNDERPASS] = { 2, 0, 1, 1, sMapName_DesertUnderpass}, - [MAPSEC_ALTERING_CAVE] = { 6, 8, 1, 1, sMapName_AlteringCave}, - [MAPSEC_NAVEL_ROCK] = { 0, 0, 1, 1, sMapName_NavelRock}, - [MAPSEC_TRAINER_HILL] = { 8, 4, 1, 1, sMapName_TrainerHill} + [MAPSEC_LITTLEROOT_TOWN] = { 4, 11, 1, 1, sMapName_LittlerootTown}, + [MAPSEC_OLDALE_TOWN] = { 4, 9, 1, 1, sMapName_OldaleTown}, + [MAPSEC_DEWFORD_TOWN] = { 2, 14, 1, 1, sMapName_DewfordTown}, + [MAPSEC_LAVARIDGE_TOWN] = { 5, 3, 1, 1, sMapName_LavaridgeTown}, + [MAPSEC_FALLARBOR_TOWN] = { 3, 0, 1, 1, sMapName_FallarborTown}, + [MAPSEC_VERDANTURF_TOWN] = { 4, 6, 1, 1, sMapName_VerdanturfTown}, + [MAPSEC_PACIFIDLOG_TOWN] = {17, 10, 1, 1, sMapName_PacifidlogTown}, + [MAPSEC_PETALBURG_CITY] = { 1, 9, 1, 1, sMapName_PetalburgCity}, + [MAPSEC_SLATEPORT_CITY] = { 8, 10, 1, 2, sMapName_SlateportCity}, + [MAPSEC_MAUVILLE_CITY] = { 8, 6, 2, 1, sMapName_MauvilleCity}, + [MAPSEC_RUSTBORO_CITY] = { 0, 5, 1, 2, sMapName_RustboroCity}, + [MAPSEC_FORTREE_CITY] = {12, 0, 1, 1, sMapName_FortreeCity}, + [MAPSEC_LILYCOVE_CITY] = {18, 3, 2, 1, sMapName_LilycoveCity}, + [MAPSEC_MOSSDEEP_CITY] = {24, 5, 2, 1, sMapName_MossdeepCity}, + [MAPSEC_SOOTOPOLIS_CITY] = {21, 7, 1, 1, sMapName_SootopolisCity}, + [MAPSEC_EVER_GRANDE_CITY] = {27, 8, 1, 2, sMapName_EverGrandeCity}, + [MAPSEC_ROUTE_101] = { 4, 10, 1, 1, sMapName_Route101}, + [MAPSEC_ROUTE_102] = { 2, 9, 2, 1, sMapName_Route102}, + [MAPSEC_ROUTE_103] = { 4, 8, 4, 1, sMapName_Route103}, + [MAPSEC_ROUTE_104] = { 0, 7, 1, 3, sMapName_Route104}, + [MAPSEC_ROUTE_105] = { 0, 10, 1, 3, sMapName_Route105}, + [MAPSEC_ROUTE_106] = { 0, 13, 2, 1, sMapName_Route106}, + [MAPSEC_ROUTE_107] = { 3, 14, 3, 1, sMapName_Route107}, + [MAPSEC_ROUTE_108] = { 6, 14, 2, 1, sMapName_Route108}, + [MAPSEC_ROUTE_109] = { 8, 12, 1, 3, sMapName_Route109}, + [MAPSEC_ROUTE_110] = { 8, 7, 1, 3, sMapName_Route110}, + [MAPSEC_ROUTE_111] = { 8, 0, 1, 6, sMapName_Route111}, + [MAPSEC_ROUTE_112] = { 6, 3, 2, 1, sMapName_Route112}, + [MAPSEC_ROUTE_113] = { 4, 0, 4, 1, sMapName_Route113}, + [MAPSEC_ROUTE_114] = { 1, 0, 2, 3, sMapName_Route114}, + [MAPSEC_ROUTE_115] = { 0, 2, 1, 3, sMapName_Route115}, + [MAPSEC_ROUTE_116] = { 1, 5, 4, 1, sMapName_Route116}, + [MAPSEC_ROUTE_117] = { 5, 6, 3, 1, sMapName_Route117}, + [MAPSEC_ROUTE_118] = {10, 6, 2, 1, sMapName_Route118}, + [MAPSEC_ROUTE_119] = {11, 0, 1, 6, sMapName_Route119}, + [MAPSEC_ROUTE_120] = {13, 0, 1, 4, sMapName_Route120}, + [MAPSEC_ROUTE_121] = {14, 3, 4, 1, sMapName_Route121}, + [MAPSEC_ROUTE_122] = {16, 4, 1, 2, sMapName_Route122}, + [MAPSEC_ROUTE_123] = {12, 6, 5, 1, sMapName_Route123}, + [MAPSEC_ROUTE_124] = {20, 3, 4, 3, sMapName_Route124}, + [MAPSEC_ROUTE_125] = {24, 3, 2, 2, sMapName_Route125}, + [MAPSEC_ROUTE_126] = {20, 6, 3, 3, sMapName_Route126}, + [MAPSEC_ROUTE_127] = {23, 6, 3, 3, sMapName_Route127}, + [MAPSEC_ROUTE_128] = {23, 9, 4, 1, sMapName_Route128}, + [MAPSEC_ROUTE_129] = {24, 10, 2, 1, sMapName_Route129}, + [MAPSEC_ROUTE_130] = {21, 10, 3, 1, sMapName_Route130}, + [MAPSEC_ROUTE_131] = {18, 10, 3, 1, sMapName_Route131}, + [MAPSEC_ROUTE_132] = {15, 10, 2, 1, sMapName_Route132}, + [MAPSEC_ROUTE_133] = {12, 10, 3, 1, sMapName_Route133}, + [MAPSEC_ROUTE_134] = { 9, 10, 3, 1, sMapName_Route134}, + [MAPSEC_UNDERWATER_124] = {20, 3, 4, 3, sMapName_Underwater}, + [MAPSEC_UNDERWATER_126] = {20, 6, 3, 3, sMapName_Underwater}, + [MAPSEC_UNDERWATER_127] = {23, 6, 3, 3, sMapName_Underwater}, + [MAPSEC_UNDERWATER_128] = {23, 9, 4, 1, sMapName_Underwater}, + [MAPSEC_UNDERWATER_SOOTOPOLIS] = {21, 7, 1, 1, sMapName_Underwater}, + [MAPSEC_GRANITE_CAVE] = { 1, 13, 1, 1, sMapName_GraniteCave}, + [MAPSEC_MT_CHIMNEY] = { 6, 2, 1, 1, sMapName_MtChimney}, + [MAPSEC_SAFARI_ZONE] = {16, 2, 1, 1, sMapName_SafariZone}, + [MAPSEC_BATTLE_FRONTIER] = {22, 12, 1, 1, sMapName_BattleFrontier}, + [MAPSEC_PETALBURG_WOODS] = { 0, 8, 1, 1, sMapName_PetalburgWoods}, + [MAPSEC_RUSTURF_TUNNEL] = { 2, 5, 1, 1, sMapName_RusturfTunnel}, + [MAPSEC_ABANDONED_SHIP] = { 6, 14, 1, 1, sMapName_AbandonedShip}, + [MAPSEC_NEW_MAUVILLE] = { 8, 7, 1, 1, sMapName_NewMauville}, + [MAPSEC_METEOR_FALLS] = { 0, 3, 1, 1, sMapName_MeteorFalls}, + [MAPSEC_METEOR_FALLS2] = { 1, 2, 1, 1, sMapName_MeteorFalls}, + [MAPSEC_MT_PYRE] = {16, 4, 1, 1, sMapName_MtPyre}, + [MAPSEC_AQUA_HIDEOUT_OLD] = {19, 3, 1, 1, sMapName_AquaHideoutOld}, + [MAPSEC_SHOAL_CAVE] = {24, 4, 1, 1, sMapName_ShoalCave}, + [MAPSEC_SEAFLOOR_CAVERN] = {24, 9, 1, 1, sMapName_SeafloorCavern}, + [MAPSEC_UNDERWATER_SEAFLOOR_CAVERN] = {24, 9, 1, 1, sMapName_Underwater}, + [MAPSEC_VICTORY_ROAD] = {27, 9, 1, 1, sMapName_VictoryRoad}, + [MAPSEC_MIRAGE_ISLAND] = {17, 10, 1, 1, sMapName_MirageIsland}, + [MAPSEC_CAVE_OF_ORIGIN] = {21, 7, 1, 1, sMapName_CaveOfOrigin}, + [MAPSEC_SOUTHERN_ISLAND] = {12, 14, 1, 1, sMapName_SouthernIsland}, + [MAPSEC_FIERY_PATH] = { 6, 3, 1, 1, sMapName_FieryPath}, + [MAPSEC_FIERY_PATH2] = { 7, 3, 1, 1, sMapName_FieryPath}, + [MAPSEC_JAGGED_PASS] = { 6, 3, 1, 1, sMapName_JaggedPass}, + [MAPSEC_JAGGED_PASS2] = { 7, 2, 1, 1, sMapName_JaggedPass}, + [MAPSEC_SEALED_CHAMBER] = {11, 10, 1, 1, sMapName_SealedChamber}, + [MAPSEC_UNDERWATER_SEALED_CHAMBER] = {11, 10, 1, 1, sMapName_Underwater}, + [MAPSEC_SCORCHED_SLAB] = {13, 0, 1, 1, sMapName_ScorchedSlab}, + [MAPSEC_ISLAND_CAVE] = { 0, 10, 1, 1, sMapName_IslandCave}, + [MAPSEC_DESERT_RUINS] = { 8, 3, 1, 1, sMapName_DesertRuins}, + [MAPSEC_ANCIENT_TOMB] = {13, 2, 1, 1, sMapName_AncientTomb}, + [MAPSEC_INSIDE_OF_TRUCK] = { 0, 0, 1, 1, sMapName_InsideOfTruck}, + [MAPSEC_SKY_PILLAR] = {19, 10, 1, 1, sMapName_SkyPillar}, + [MAPSEC_SECRET_BASE] = { 0, 0, 1, 1, sMapName_SecretBase}, + [MAPSEC_DYNAMIC] = { 0, 0, 1, 1, sMapName_None}, + [MAPSEC_PALLET_TOWN] = { 0, 0, 1, 1, sMapName_PalletTown}, + [MAPSEC_VIRIDIAN_CITY] = { 0, 0, 1, 1, sMapName_ViridianCity}, + [MAPSEC_PEWTER_CITY] = { 0, 0, 1, 1, sMapName_PewterCity}, + [MAPSEC_CERULEAN_CITY] = { 0, 0, 1, 1, sMapName_CeruleanCity}, + [MAPSEC_LAVENDER_TOWN] = { 0, 0, 1, 1, sMapName_LavenderTown}, + [MAPSEC_VERMILION_CITY] = { 0, 0, 1, 1, sMapName_VermilionCity}, + [MAPSEC_CELADON_CITY] = { 0, 0, 1, 1, sMapName_CeladonCity}, + [MAPSEC_FUCHSIA_CITY] = { 0, 0, 1, 1, sMapName_FuchsiaCity}, + [MAPSEC_CINNABAR_ISLAND] = { 0, 0, 1, 1, sMapName_CinnabarIsland}, + [MAPSEC_INDIGO_PLATEAU] = { 0, 0, 1, 1, sMapName_IndigoPlateau}, + [MAPSEC_SAFFRON_CITY] = { 0, 0, 1, 1, sMapName_SaffronCity}, + [MAPSEC_ROUTE_4_FLYDUP] = { 0, 0, 1, 1, sMapName_Route4}, + [MAPSEC_ROUTE_10_FLYDUP] = { 0, 0, 1, 1, sMapName_Route10}, + [MAPSEC_ROUTE_1] = { 0, 0, 1, 1, sMapName_Route1}, + [MAPSEC_ROUTE_2] = { 0, 0, 1, 1, sMapName_Route2}, + [MAPSEC_ROUTE_3] = { 0, 0, 1, 1, sMapName_Route3}, + [MAPSEC_ROUTE_4] = { 0, 0, 1, 1, sMapName_Route4_2}, + [MAPSEC_ROUTE_5] = { 0, 0, 1, 1, sMapName_Route5}, + [MAPSEC_ROUTE_6] = { 0, 0, 1, 1, sMapName_Route6}, + [MAPSEC_ROUTE_7] = { 0, 0, 1, 1, sMapName_Route7}, + [MAPSEC_ROUTE_8] = { 0, 0, 1, 1, sMapName_Route8}, + [MAPSEC_ROUTE_9] = { 0, 0, 1, 1, sMapName_Route9}, + [MAPSEC_ROUTE_10] = { 0, 0, 1, 1, sMapName_Route10_2}, + [MAPSEC_ROUTE_11] = { 0, 0, 1, 1, sMapName_Route11}, + [MAPSEC_ROUTE_12] = { 0, 0, 1, 1, sMapName_Route12}, + [MAPSEC_ROUTE_13] = { 0, 0, 1, 1, sMapName_Route13}, + [MAPSEC_ROUTE_14] = { 0, 0, 1, 1, sMapName_Route14}, + [MAPSEC_ROUTE_15] = { 0, 0, 1, 1, sMapName_Route15}, + [MAPSEC_ROUTE_16] = { 0, 0, 1, 1, sMapName_Route16}, + [MAPSEC_ROUTE_17] = { 0, 0, 1, 1, sMapName_Route17}, + [MAPSEC_ROUTE_18] = { 0, 0, 1, 1, sMapName_Route18}, + [MAPSEC_ROUTE_19] = { 0, 0, 1, 1, sMapName_Route19}, + [MAPSEC_ROUTE_20] = { 0, 0, 1, 1, sMapName_Route20}, + [MAPSEC_ROUTE_21] = { 0, 0, 1, 1, sMapName_Route21}, + [MAPSEC_ROUTE_22] = { 0, 0, 1, 1, sMapName_Route22}, + [MAPSEC_ROUTE_23] = { 0, 0, 1, 1, sMapName_Route23}, + [MAPSEC_ROUTE_24] = { 0, 0, 1, 1, sMapName_Route24}, + [MAPSEC_ROUTE_25] = { 0, 0, 1, 1, sMapName_Route25}, + [MAPSEC_VIRIDIAN_FOREST] = { 0, 0, 1, 1, sMapName_ViridianForest}, + [MAPSEC_MT_MOON] = { 0, 0, 1, 1, sMapName_MtMoon}, + [MAPSEC_S_S_ANNE] = { 0, 0, 1, 1, sMapName_SSAnne}, + [MAPSEC_UNDERGROUND_PATH] = { 0, 0, 1, 1, sMapName_UndergroundPath}, + [MAPSEC_UNDERGROUND_PATH_2] = { 0, 0, 1, 1, sMapName_UndergroundPath2}, + [MAPSEC_DIGLETTS_CAVE] = { 0, 0, 1, 1, sMapName_DiglettsCave}, + [MAPSEC_KANTO_VICTORY_ROAD] = { 0, 0, 1, 1, sMapName_KantoVictoryRoad}, + [MAPSEC_ROCKET_HIDEOUT] = { 0, 0, 1, 1, sMapName_RocketHideout}, + [MAPSEC_SILPH_CO] = { 0, 0, 1, 1, sMapName_SilphCo}, + [MAPSEC_POKEMON_MANSION] = { 0, 0, 1, 1, sMapName_PokemonMansion}, + [MAPSEC_KANTO_SAFARI_ZONE] = { 0, 0, 1, 1, sMapName_KantoSafariZone}, + [MAPSEC_POKEMON_LEAGUE] = { 0, 0, 1, 1, sMapName_PokemonLeague}, + [MAPSEC_ROCK_TUNNEL] = { 0, 0, 1, 1, sMapName_RockTunnel}, + [MAPSEC_SEAFOAM_ISLANDS] = { 0, 0, 1, 1, sMapName_SeafoamIslands}, + [MAPSEC_POKEMON_TOWER] = { 0, 0, 1, 1, sMapName_PokemonTower}, + [MAPSEC_CERULEAN_CAVE] = { 0, 0, 1, 1, sMapName_CeruleanCave}, + [MAPSEC_POWER_PLANT] = { 0, 0, 1, 1, sMapName_PowerPlant}, + [MAPSEC_ONE_ISLAND] = { 0, 0, 1, 1, sMapName_OneIsland}, + [MAPSEC_TWO_ISLAND] = { 0, 0, 1, 1, sMapName_TwoIsland}, + [MAPSEC_THREE_ISLAND] = { 0, 0, 1, 1, sMapName_ThreeIsland}, + [MAPSEC_FOUR_ISLAND] = { 0, 0, 1, 1, sMapName_FourIsland}, + [MAPSEC_FIVE_ISLAND] = { 0, 0, 1, 1, sMapName_FiveIsland}, + [MAPSEC_SEVEN_ISLAND] = { 0, 0, 1, 1, sMapName_SevenIsland}, + [MAPSEC_SIX_ISLAND] = { 0, 0, 1, 1, sMapName_SixIsland}, + [MAPSEC_KINDLE_ROAD] = { 0, 0, 1, 1, sMapName_KindleRoad}, + [MAPSEC_TREASURE_BEACH] = { 0, 0, 1, 1, sMapName_TreasureBeach}, + [MAPSEC_CAPE_BRINK] = { 0, 0, 1, 1, sMapName_CapeBrink}, + [MAPSEC_BOND_BRIDGE] = { 0, 0, 1, 1, sMapName_BondBridge}, + [MAPSEC_THREE_ISLE_PORT] = { 0, 0, 1, 1, sMapName_ThreeIslePort}, + [MAPSEC_SEVII_ISLE_6] = { 0, 0, 1, 1, sMapName_SeviiIsle6}, + [MAPSEC_SEVII_ISLE_7] = { 0, 0, 1, 1, sMapName_SeviiIsle7}, + [MAPSEC_SEVII_ISLE_8] = { 0, 0, 1, 1, sMapName_SeviiIsle8}, + [MAPSEC_SEVII_ISLE_9] = { 0, 0, 1, 1, sMapName_SeviiIsle9}, + [MAPSEC_RESORT_GORGEOUS] = { 0, 0, 1, 1, sMapName_ResortGorgeous}, + [MAPSEC_WATER_LABYRINTH] = { 0, 0, 1, 1, sMapName_WaterLabyrinth}, + [MAPSEC_FIVE_ISLE_MEADOW] = { 0, 0, 1, 1, sMapName_FiveIsleMeadow}, + [MAPSEC_MEMORIAL_PILLAR] = { 0, 0, 1, 1, sMapName_MemorialPillar}, + [MAPSEC_OUTCAST_ISLAND] = { 0, 0, 1, 1, sMapName_OutcastIsland}, + [MAPSEC_GREEN_PATH] = { 0, 0, 1, 1, sMapName_GreenPath}, + [MAPSEC_WATER_PATH] = { 0, 0, 1, 1, sMapName_WaterPath}, + [MAPSEC_RUIN_VALLEY] = { 0, 0, 1, 1, sMapName_RuinValley}, + [MAPSEC_TRAINER_TOWER] = { 0, 0, 1, 1, sMapName_TrainerTower}, + [MAPSEC_CANYON_ENTRANCE] = { 0, 0, 1, 1, sMapName_CanyonEntrance}, + [MAPSEC_SEVAULT_CANYON] = { 0, 0, 1, 1, sMapName_SevaultCanyon}, + [MAPSEC_TANOBY_RUINS] = { 0, 0, 1, 1, sMapName_TanobyRuins}, + [MAPSEC_SEVII_ISLE_22] = { 0, 0, 1, 1, sMapName_SeviiIsle22}, + [MAPSEC_SEVII_ISLE_23] = { 0, 0, 1, 1, sMapName_SeviiIsle23}, + [MAPSEC_SEVII_ISLE_24] = { 0, 0, 1, 1, sMapName_SeviiIsle24}, + [MAPSEC_NAVEL_ROCK_FRLG] = { 0, 0, 1, 1, sMapName_NavelRock}, + [MAPSEC_MT_EMBER] = { 0, 0, 1, 1, sMapName_MtEmber}, + [MAPSEC_BERRY_FOREST] = { 0, 0, 1, 1, sMapName_BerryForest}, + [MAPSEC_ICEFALL_CAVE] = { 0, 0, 1, 1, sMapName_IcefallCave}, + [MAPSEC_ROCKET_WAREHOUSE] = { 0, 0, 1, 1, sMapName_RocketWarehouse}, + [MAPSEC_TRAINER_TOWER_2] = { 0, 0, 1, 1, sMapName_TrainerTower2}, + [MAPSEC_DOTTED_HOLE] = { 0, 0, 1, 1, sMapName_DottedHole}, + [MAPSEC_LOST_CAVE] = { 0, 0, 1, 1, sMapName_LostCave}, + [MAPSEC_PATTERN_BUSH] = { 0, 0, 1, 1, sMapName_PatternBush}, + [MAPSEC_ALTERING_CAVE_FRLG] = { 0, 0, 1, 1, sMapName_AlteringCave}, + [MAPSEC_TANOBY_CHAMBERS] = { 0, 0, 1, 1, sMapName_TanobyChambers}, + [MAPSEC_THREE_ISLE_PATH] = { 0, 0, 1, 1, sMapName_ThreeIslePath}, + [MAPSEC_TANOBY_KEY] = { 0, 0, 1, 1, sMapName_TanobyKey}, + [MAPSEC_BIRTH_ISLAND_FRLG] = { 0, 0, 1, 1, sMapName_BirthIsland}, + [MAPSEC_MONEAN_CHAMBER] = { 0, 0, 1, 1, sMapName_MoneanChamber}, + [MAPSEC_LIPTOO_CHAMBER] = { 0, 0, 1, 1, sMapName_LiptooChamber}, + [MAPSEC_WEEPTH_CHAMBER] = { 0, 0, 1, 1, sMapName_WeepthChamber}, + [MAPSEC_DILFORD_CHAMBER] = { 0, 0, 1, 1, sMapName_DilfordChamber}, + [MAPSEC_SCUFIB_CHAMBER] = { 0, 0, 1, 1, sMapName_ScufibChamber}, + [MAPSEC_RIXY_CHAMBER] = { 0, 0, 1, 1, sMapName_RixyChamber}, + [MAPSEC_VIAPOIS_CHAMBER] = { 0, 0, 1, 1, sMapName_ViapoisChamber}, + [MAPSEC_EMBER_SPA] = { 0, 0, 1, 1, sMapName_EmberSpa}, + [MAPSEC_SPECIAL_AREA] = { 0, 0, 1, 1, sMapName_SpecialArea}, + [MAPSEC_AQUA_HIDEOUT] = {19, 3, 1, 1, sMapName_AquaHideout}, + [MAPSEC_MAGMA_HIDEOUT] = { 6, 3, 1, 1, sMapName_MagmaHideout}, + [MAPSEC_MIRAGE_TOWER] = { 8, 2, 1, 1, sMapName_MirageTower}, + [MAPSEC_BIRTH_ISLAND] = { 0, 0, 1, 1, sMapName_BirthIsland}, + [MAPSEC_FARAWAY_ISLAND] = { 0, 0, 1, 1, sMapName_FarawayIsland}, + [MAPSEC_ARTISAN_CAVE] = {22, 12, 1, 1, sMapName_ArtisanCave}, + [MAPSEC_MARINE_CAVE] = { 0, 0, 1, 1, sMapName_MarineCave}, + [MAPSEC_UNDERWATER_MARINE_CAVE] = { 0, 0, 1, 1, sMapName_Underwater}, + [MAPSEC_TERRA_CAVE] = { 0, 0, 1, 1, sMapName_TerraCave}, + [MAPSEC_UNDERWATER_105] = { 0, 10, 1, 3, sMapName_Underwater}, + [MAPSEC_UNDERWATER_125] = {24, 3, 2, 2, sMapName_Underwater}, + [MAPSEC_UNDERWATER_129] = {24, 10, 2, 1, sMapName_Underwater}, + [MAPSEC_DESERT_UNDERPASS] = { 2, 0, 1, 1, sMapName_DesertUnderpass}, + [MAPSEC_ALTERING_CAVE] = { 6, 8, 1, 1, sMapName_AlteringCave}, + [MAPSEC_NAVEL_ROCK] = { 0, 0, 1, 1, sMapName_NavelRock}, + [MAPSEC_TRAINER_HILL] = { 8, 4, 1, 1, sMapName_TrainerHill} }; #endif //GUARD_DATA_REGION_MAP_REGION_MAP_ENTRIES_H diff --git a/src/data/wild_encounters.json b/src/data/wild_encounters.json index b27de4513..0b30c0f65 100755 --- a/src/data/wild_encounters.json +++ b/src/data/wild_encounters.json @@ -2265,8 +2265,8 @@ } }, { - "map": "MAP_UNDERWATER2", - "base_label": "gUnderwater2", + "map": "MAP_UNDERWATER_ROUTE126", + "base_label": "gUnderwater_Route126", "water_mons": { "encounter_rate": 4, "mons": [ @@ -9075,8 +9075,8 @@ } }, { - "map": "MAP_UNDERWATER1", - "base_label": "gUnderwater1", + "map": "MAP_UNDERWATER_ROUTE124", + "base_label": "gUnderwater_Route124", "water_mons": { "encounter_rate": 4, "mons": [ diff --git a/src/daycare.c b/src/daycare.c index 5d4480403..b87c326e9 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1186,7 +1186,7 @@ static void DaycareAddTextPrinter(u8 windowId, const u8 *text, u32 x, u32 y) printer.y = y; printer.currentX = x; printer.currentY = y; - printer.unk = 0; + printer.style = 0; gTextFlags.useAlternateDownArrow = 0; printer.letterSpacing = 0; printer.lineSpacing = 1; diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index f44ecb31c..34f73126b 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -2748,14 +2748,14 @@ static void sub_8027DD0(u32 arg0) struct UnkPacket1 packet; packet.id = 1; packet.unk4 = arg0; - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } static u32 sub_8027DFC(u32 arg0) { struct UnkPacket1 *packet; - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) return 0; packet = (void *)&gRecvCmds[arg0][1]; @@ -2857,7 +2857,7 @@ static void sub_8027E30(struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruc packet.unkA_3 = arg6; packet.unkB_1 = arg7; packet.unkB_0 = arg8; - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } static u32 sub_8028164(u32 unused, struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 *arg6, u32 *arg7, u32 *arg8) @@ -2865,7 +2865,7 @@ static u32 sub_8028164(u32 unused, struct DodrioSubstruct_31A0 *arg0, struct Dod struct UnkPacket2 *packet; struct DodrioSubstruct_31A0_14 *ptr = &arg0->unk14; - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) return 0; packet = (void *)&gRecvCmds[0][1]; @@ -2935,14 +2935,14 @@ static void sub_80282EC(u8 arg0) struct UnkPacket3 packet; packet.id = 3; packet.unk4 = arg0; - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } static u32 sub_8028318(u32 arg0, u8 *arg1) { struct UnkPacket3 *packet; - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) return 0; packet = (void *)&gRecvCmds[arg0][1]; @@ -2966,14 +2966,14 @@ static void sub_8028350(u32 arg0) struct UnkPacket4 packet; packet.id = 4; packet.unk4 = arg0; - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } static u32 sub_8028374(u32 arg0) { struct UnkPacket4 *packet; - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) return 0; packet = (void *)&gRecvCmds[arg0][1]; diff --git a/src/field_specials.c b/src/field_specials.c index c1fc92dbe..57b750145 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -3649,14 +3649,14 @@ bool8 AbnormalWeatherHasExpired(void) } } - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNDERWATER3)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNDERWATER_ROUTE127)) { switch (gSaveBlock1Ptr->location.mapNum) { - case MAP_NUM(UNDERWATER3): - case MAP_NUM(UNDERWATER5): - case MAP_NUM(UNDERWATER6): - case MAP_NUM(UNDERWATER7): + case MAP_NUM(UNDERWATER_ROUTE127): + case MAP_NUM(UNDERWATER_ROUTE129): + case MAP_NUM(UNDERWATER_ROUTE105): + case MAP_NUM(UNDERWATER_ROUTE125): VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 1); return FALSE; default: @@ -3888,12 +3888,14 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId) void Script_DoRayquazaScene(void) { - if (gSpecialVar_0x8004 == 0) + if (!gSpecialVar_0x8004) { + // Groudon/Kyogre fight scene DoRayquazaScene(0, TRUE, CB2_ReturnToFieldContinueScriptPlayMapMusic); } else { + // Rayquaza arrives scene DoRayquazaScene(1, FALSE, CB2_ReturnToFieldContinueScriptPlayMapMusic); } } diff --git a/src/frontier_util.c b/src/frontier_util.c index c741a64fe..3e7fecb48 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -2539,8 +2539,8 @@ void CreateFrontierBrainPokemon(void) NAKED void CreateFrontierBrainPokemon(void) { - asm_unified("\n\ - push {r4-r7,lr}\n\ + asm_unified( + "push {r4-r7,lr}\n\ mov r7, r10\n\ mov r6, r9\n\ mov r5, r8\n\ @@ -2768,8 +2768,7 @@ _081A4FD0:\n\ pop {r4-r7}\n\ pop {r0}\n\ bx r0\n\ - .pool\n\ -"); + .pool"); } #endif diff --git a/src/graphics.c b/src/graphics.c index 5b95ed016..3973c1507 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1067,10 +1067,9 @@ const u32 gBattleAnimBgPalette_Solarbeam[] = INCBIN_U32("graphics/battle_anims/b const u32 gUnknown_E6BC04[] = INCBIN_U32("graphics/unknown/unknown_E6BC04.bin.lz"); -const u32 sBlenderCenterGfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); - -const u32 gUnknown_08D91DB8[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.lz"); -const u32 gUnknown_08D927EC[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.lz"); +const u32 gBerryBlenderCenter_Gfx[] = INCBIN_U32("graphics/berry_blender/center.8bpp.lz"); +const u32 gBerryBlenderOuter_Gfx[] = INCBIN_U32("graphics/berry_blender/outer.4bpp.lz"); +const u32 gBerryBlenderOuter_Tilemap[] = INCBIN_U32("graphics/berry_blender/outer_map.bin.lz"); const u32 gBattleAnimBgPalette_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.gbapal.lz"); const u32 gBattleAnimBgImage_Cosmic[] = INCBIN_U32("graphics/battle_anims/backgrounds/cosmic.4bpp.lz"); @@ -1218,13 +1217,12 @@ const u32 gBattleAnimSpriteGfx_WhiteFeather[] = INCBIN_U32("graphics/battle_anim const u32 gBattleAnimSpritePal_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Sparkle6[] = INCBIN_U32("graphics/battle_anims/sprites/sparkle_6.4bpp.lz"); -const u16 gUnknown_08DBA518[] = INCBIN_U16("graphics/misc/cable_car_bg.gbapal"); -const u16 gCableCar_Pal[] = INCBIN_U16("graphics/misc/cable_car.gbapal"); - -const u32 gUnknown_08DBA5B8[] = INCBIN_U32("graphics/misc/cable_car_bg.4bpp.lz"); -const u32 gCableCar_Gfx[] = INCBIN_U32("graphics/misc/cable_car.4bpp.lz"); -const u32 gCableCarDoor_Gfx[] = INCBIN_U32("graphics/misc/cable_car_door.4bpp.lz"); -const u32 gCableCarCord_Gfx[] = INCBIN_U32("graphics/misc/cable_car_cord.4bpp.lz"); +const u16 gCableCarBg_Pal[] = INCBIN_U16("graphics/cable_car/bg.gbapal"); +const u16 gCableCar_Pal[] = INCBIN_U16("graphics/cable_car/cable_car.gbapal"); +const u32 gCableCarBg_Gfx[] = INCBIN_U32("graphics/cable_car/bg.4bpp.lz"); +const u32 gCableCar_Gfx[] = INCBIN_U32("graphics/cable_car/cable_car.4bpp.lz"); +const u32 gCableCarDoor_Gfx[] = INCBIN_U32("graphics/cable_car/door.4bpp.lz"); +const u32 gCableCarCable_Gfx[] = INCBIN_U32("graphics/cable_car/cable.4bpp.lz"); // Roulette const u32 gRouletteMenu_Gfx[] = INCBIN_U32("graphics/roulette/window.4bpp.lz"); @@ -1352,25 +1350,15 @@ const u16 gPokenavConditionMarker_Pal[] = INCBIN_U16("graphics/pokenav/condition const u8 gPokenavConditionMarker_Gfx[] = INCBIN_U8("graphics/pokenav/condition/marker.4bpp"); const u16 gBerryBlenderMiscPalette[] = INCBIN_U16("graphics/berry_blender/misc.gbapal"); - const u16 gBerryBlenderArrowPalette[] = INCBIN_U16("graphics/berry_blender/arrow.gbapal"); - const u8 gBerryBlenderBetaArrow_Gfx[] = INCBIN_U8("graphics/berry_blender/arrow_old.4bpp"); //unused - -const u8 gBerryBlenderMarubatsuTiles[] = INCBIN_U8("graphics/berry_blender/marubatsu.4bpp"); - -const u8 gBerryBlenderParticlesTiles[] = INCBIN_U8("graphics/berry_blender/particles.4bpp"); - +const u8 gBerryBlenderScoreSymbols_Gfx[] = INCBIN_U8("graphics/berry_blender/score_symbols.4bpp"); +const u8 gBerryBlenderParticles_Gfx[] = INCBIN_U8("graphics/berry_blender/particles.4bpp"); static const u8 sEmpty0[0x120] = {0}; - -const u8 gBerryBlenderCountdownNumbersTiles[] = INCBIN_U8("graphics/berry_blender/countdown_numbers.4bpp"); - -const u8 gBerryBlenderStartTiles[] = INCBIN_U8("graphics/berry_blender/start.4bpp"); - +const u8 gBerryBlenderCountdownNumbers_Gfx[] = INCBIN_U8("graphics/berry_blender/countdown_numbers.4bpp"); +const u8 gBerryBlenderStart_Gfx[] = INCBIN_U8("graphics/berry_blender/start.4bpp"); static const u8 sEmpty1[0x200] = {0}; - -const u8 gBerryBlenderArrowTiles[] = INCBIN_U8("graphics/berry_blender/arrow.4bpp"); - +const u8 gBerryBlenderPlayerArrow_Gfx[] = INCBIN_U8("graphics/berry_blender/arrow.4bpp"); static const u8 sEmpty2[0x2C0] = {0}; const u16 gEasyChatCursor_Pal[] = INCBIN_U16("graphics/easy_chat/cursor.gbapal"); diff --git a/src/item.c b/src/item.c index 44b73802b..5a77d363e 100644 --- a/src/item.c +++ b/src/item.c @@ -247,7 +247,8 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) NAKED bool8 CheckBagHasSpace(u16 itemId, u16 count) { - asm_unified("push {r4-r7,lr}\n\ + asm_unified( + "push {r4-r7,lr}\n\ mov r7, r10\n\ mov r6, r9\n\ mov r5, r8\n\ diff --git a/src/item_menu.c b/src/item_menu.c index f2c7b25d8..ace2fd11e 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -534,14 +534,16 @@ void CB2_BagMenuFromBattle(void) GoToBattlePyramidBagMenu(1, CB2_SetUpReshowBattleScreenAfterMenu2); } +// Choosing berry to plant void CB2_ChooseBerry(void) { GoToBagMenu(ITEMMENULOCATION_BERRY_TREE, BERRIES_POCKET, CB2_ReturnToFieldContinueScript); } -void ChooseBerrySetCallback(void (*callback)(void)) +// Choosing berry for Berry Blender or Berry Crush +void ChooseBerryForMachine(void (*exitCallback)(void)) { - GoToBagMenu(ITEMMENULOCATION_BERRY_BLENDER_CRUSH, BERRIES_POCKET, callback); + GoToBagMenu(ITEMMENULOCATION_BERRY_BLENDER_CRUSH, BERRIES_POCKET, exitCallback); } void CB2_GoToSellMenu(void) diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index cfafcbb75..cc51236c8 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -310,51 +310,51 @@ static const struct SpriteTemplate gBerryPicRotatingSpriteTemplate = .callback = SpriteCallbackDummy, }; -static const struct CompressedTilesPal gBerryPicTable[] = -{ - {gBerryPic_Cheri, gBerryPalette_Cheri}, - {gBerryPic_Chesto, gBerryPalette_Chesto}, - {gBerryPic_Pecha, gBerryPalette_Pecha}, - {gBerryPic_Rawst, gBerryPalette_Rawst}, - {gBerryPic_Aspear, gBerryPalette_Aspear}, - {gBerryPic_Leppa, gBerryPalette_Leppa}, - {gBerryPic_Oran, gBerryPalette_Oran}, - {gBerryPic_Persim, gBerryPalette_Persim}, - {gBerryPic_Lum, gBerryPalette_Lum}, - {gBerryPic_Sitrus, gBerryPalette_Sitrus}, - {gBerryPic_Figy, gBerryPalette_Figy}, - {gBerryPic_Wiki, gBerryPalette_Wiki}, - {gBerryPic_Mago, gBerryPalette_Mago}, - {gBerryPic_Aguav, gBerryPalette_Aguav}, - {gBerryPic_Iapapa, gBerryPalette_Iapapa}, - {gBerryPic_Razz, gBerryPalette_Razz}, - {gBerryPic_Bluk, gBerryPalette_Bluk}, - {gBerryPic_Nanab, gBerryPalette_Nanab}, - {gBerryPic_Wepear, gBerryPalette_Wepear}, - {gBerryPic_Pinap, gBerryPalette_Pinap}, - {gBerryPic_Pomeg, gBerryPalette_Pomeg}, - {gBerryPic_Kelpsy, gBerryPalette_Kelpsy}, - {gBerryPic_Qualot, gBerryPalette_Qualot}, - {gBerryPic_Hondew, gBerryPalette_Hondew}, - {gBerryPic_Grepa, gBerryPalette_Grepa}, - {gBerryPic_Tamato, gBerryPalette_Tamato}, - {gBerryPic_Cornn, gBerryPalette_Cornn}, - {gBerryPic_Magost, gBerryPalette_Magost}, - {gBerryPic_Rabuta, gBerryPalette_Rabuta}, - {gBerryPic_Nomel, gBerryPalette_Nomel}, - {gBerryPic_Spelon, gBerryPalette_Spelon}, - {gBerryPic_Pamtre, gBerryPalette_Pamtre}, - {gBerryPic_Watmel, gBerryPalette_Watmel}, - {gBerryPic_Durin, gBerryPalette_Durin}, - {gBerryPic_Belue, gBerryPalette_Belue}, - {gBerryPic_Liechi, gBerryPalette_Liechi}, - {gBerryPic_Ganlon, gBerryPalette_Ganlon}, - {gBerryPic_Salac, gBerryPalette_Salac}, - {gBerryPic_Petaya, gBerryPalette_Petaya}, - {gBerryPic_Apicot, gBerryPalette_Apicot}, - {gBerryPic_Lansat, gBerryPalette_Lansat}, - {gBerryPic_Starf, gBerryPalette_Starf}, - {gBerryPic_Enigma, gBerryPalette_Enigma}, +static const struct CompressedTilesPal sBerryPicTable[] = +{ + [ITEM_TO_BERRY(ITEM_CHERI_BERRY) - 1] = {gBerryPic_Cheri, gBerryPalette_Cheri}, + [ITEM_TO_BERRY(ITEM_CHESTO_BERRY) - 1] = {gBerryPic_Chesto, gBerryPalette_Chesto}, + [ITEM_TO_BERRY(ITEM_PECHA_BERRY) - 1] = {gBerryPic_Pecha, gBerryPalette_Pecha}, + [ITEM_TO_BERRY(ITEM_RAWST_BERRY) - 1] = {gBerryPic_Rawst, gBerryPalette_Rawst}, + [ITEM_TO_BERRY(ITEM_ASPEAR_BERRY) - 1] = {gBerryPic_Aspear, gBerryPalette_Aspear}, + [ITEM_TO_BERRY(ITEM_LEPPA_BERRY) - 1] = {gBerryPic_Leppa, gBerryPalette_Leppa}, + [ITEM_TO_BERRY(ITEM_ORAN_BERRY) - 1] = {gBerryPic_Oran, gBerryPalette_Oran}, + [ITEM_TO_BERRY(ITEM_PERSIM_BERRY) - 1] = {gBerryPic_Persim, gBerryPalette_Persim}, + [ITEM_TO_BERRY(ITEM_LUM_BERRY) - 1] = {gBerryPic_Lum, gBerryPalette_Lum}, + [ITEM_TO_BERRY(ITEM_SITRUS_BERRY) - 1] = {gBerryPic_Sitrus, gBerryPalette_Sitrus}, + [ITEM_TO_BERRY(ITEM_FIGY_BERRY) - 1] = {gBerryPic_Figy, gBerryPalette_Figy}, + [ITEM_TO_BERRY(ITEM_WIKI_BERRY) - 1] = {gBerryPic_Wiki, gBerryPalette_Wiki}, + [ITEM_TO_BERRY(ITEM_MAGO_BERRY) - 1] = {gBerryPic_Mago, gBerryPalette_Mago}, + [ITEM_TO_BERRY(ITEM_AGUAV_BERRY) - 1] = {gBerryPic_Aguav, gBerryPalette_Aguav}, + [ITEM_TO_BERRY(ITEM_IAPAPA_BERRY) - 1] = {gBerryPic_Iapapa, gBerryPalette_Iapapa}, + [ITEM_TO_BERRY(ITEM_RAZZ_BERRY) - 1] = {gBerryPic_Razz, gBerryPalette_Razz}, + [ITEM_TO_BERRY(ITEM_BLUK_BERRY) - 1] = {gBerryPic_Bluk, gBerryPalette_Bluk}, + [ITEM_TO_BERRY(ITEM_NANAB_BERRY) - 1] = {gBerryPic_Nanab, gBerryPalette_Nanab}, + [ITEM_TO_BERRY(ITEM_WEPEAR_BERRY) - 1] = {gBerryPic_Wepear, gBerryPalette_Wepear}, + [ITEM_TO_BERRY(ITEM_PINAP_BERRY) - 1] = {gBerryPic_Pinap, gBerryPalette_Pinap}, + [ITEM_TO_BERRY(ITEM_POMEG_BERRY) - 1] = {gBerryPic_Pomeg, gBerryPalette_Pomeg}, + [ITEM_TO_BERRY(ITEM_KELPSY_BERRY) - 1] = {gBerryPic_Kelpsy, gBerryPalette_Kelpsy}, + [ITEM_TO_BERRY(ITEM_QUALOT_BERRY) - 1] = {gBerryPic_Qualot, gBerryPalette_Qualot}, + [ITEM_TO_BERRY(ITEM_HONDEW_BERRY) - 1] = {gBerryPic_Hondew, gBerryPalette_Hondew}, + [ITEM_TO_BERRY(ITEM_GREPA_BERRY) - 1] = {gBerryPic_Grepa, gBerryPalette_Grepa}, + [ITEM_TO_BERRY(ITEM_TAMATO_BERRY) - 1] = {gBerryPic_Tamato, gBerryPalette_Tamato}, + [ITEM_TO_BERRY(ITEM_CORNN_BERRY) - 1] = {gBerryPic_Cornn, gBerryPalette_Cornn}, + [ITEM_TO_BERRY(ITEM_MAGOST_BERRY) - 1] = {gBerryPic_Magost, gBerryPalette_Magost}, + [ITEM_TO_BERRY(ITEM_RABUTA_BERRY) - 1] = {gBerryPic_Rabuta, gBerryPalette_Rabuta}, + [ITEM_TO_BERRY(ITEM_NOMEL_BERRY) - 1] = {gBerryPic_Nomel, gBerryPalette_Nomel}, + [ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1] = {gBerryPic_Spelon, gBerryPalette_Spelon}, + [ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1] = {gBerryPic_Pamtre, gBerryPalette_Pamtre}, + [ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1] = {gBerryPic_Watmel, gBerryPalette_Watmel}, + [ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1] = {gBerryPic_Durin, gBerryPalette_Durin}, + [ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1] = {gBerryPic_Belue, gBerryPalette_Belue}, + [ITEM_TO_BERRY(ITEM_LIECHI_BERRY) - 1] = {gBerryPic_Liechi, gBerryPalette_Liechi}, + [ITEM_TO_BERRY(ITEM_GANLON_BERRY) - 1] = {gBerryPic_Ganlon, gBerryPalette_Ganlon}, + [ITEM_TO_BERRY(ITEM_SALAC_BERRY) - 1] = {gBerryPic_Salac, gBerryPalette_Salac}, + [ITEM_TO_BERRY(ITEM_PETAYA_BERRY) - 1] = {gBerryPic_Petaya, gBerryPalette_Petaya}, + [ITEM_TO_BERRY(ITEM_APICOT_BERRY) - 1] = {gBerryPic_Apicot, gBerryPalette_Apicot}, + [ITEM_TO_BERRY(ITEM_LANSAT_BERRY) - 1] = {gBerryPic_Lansat, gBerryPalette_Lansat}, + [ITEM_TO_BERRY(ITEM_STARF_BERRY) - 1] = {gBerryPic_Starf, gBerryPalette_Starf}, + [ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) - 1] = {gBerryPic_Enigma, gBerryPalette_Enigma}, }; const struct CompressedSpriteSheet gBerryCheckCircleSpriteSheet = @@ -581,10 +581,10 @@ static void LoadBerryGfx(u8 berryId) // unknown empty if statement } - pal.data = gBerryPicTable[berryId].pal; + pal.data = sBerryPicTable[berryId].pal; pal.tag = TAG_BERRY_PIC_PAL; LoadCompressedSpritePalette(&pal); - LZDecompressWram(gBerryPicTable[berryId].tiles, &gDecompressionBuffer[0x1000]); + LZDecompressWram(sBerryPicTable[berryId].tiles, &gDecompressionBuffer[0x1000]); sub_80D5018(&gDecompressionBuffer[0x1000], &gDecompressionBuffer[0]); } @@ -599,7 +599,8 @@ void FreeBerryTagSpritePalette(void) FreeSpritePaletteByTag(TAG_BERRY_PIC_PAL); } -u8 LoadSpinningBerryPicGfx(u8 berryId, u8 x, u8 y, bool8 startAffine) +// For throwing berries into the Berry Blender +u8 CreateSpinningBerrySprite(u8 berryId, u8 x, u8 y, bool8 startAffine) { u8 spriteId; diff --git a/src/link.c b/src/link.c index 62a9e4151..cdaf58469 100644 --- a/src/link.c +++ b/src/link.c @@ -99,7 +99,7 @@ u16 gLinkSavedIme; EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0; EWRAM_DATA u8 gUnknown_020223BD = 0; -EWRAM_DATA u32 gUnknown_020223C0 = 0; +EWRAM_DATA u32 gBerryBlenderKeySendAttempts = 0; EWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {}; EWRAM_DATA u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE] = {}; EWRAM_DATA bool8 gLinkOpen = FALSE; @@ -552,7 +552,7 @@ static void ProcessRecvCmds(u8 unused) InitBlockSend(block, sizeof(*block)); break; } - case LINKCMD_SEND_HELD_KEYS: + case LINKCMD_BLENDER_SEND_KEYS: gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; case LINKCMD_0x5555: @@ -636,13 +636,13 @@ static void ProcessRecvCmds(u8 unused) case LINKCMD_READY_EXIT_STANDBY: gReadyToExitStandby[i] = TRUE; break; - case LINKCMD_0xAAAA: - sub_800A418(); + case LINKCMD_BLENDER_NO_PBLOCK_SPACE: + SetBerryBlenderLinkCallback(); break; case LINKCMD_SEND_BLOCK_REQ: SendBlock(0, sBlockRequests[gRecvCmds[i][1]].address, sBlockRequests[gRecvCmds[i][1]].size); break; - case LINKCMD_SEND_HELD_KEYS_2: + case LINKCMD_SEND_HELD_KEYS: gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; } @@ -660,8 +660,8 @@ static void BuildSendCmd(u16 command) case LINKCMD_READY_EXIT_STANDBY: gSendCmd[0] = LINKCMD_READY_EXIT_STANDBY; break; - case LINKCMD_SEND_HELD_KEYS: - gSendCmd[0] = LINKCMD_SEND_HELD_KEYS; + case LINKCMD_BLENDER_SEND_KEYS: + gSendCmd[0] = LINKCMD_BLENDER_SEND_KEYS; gSendCmd[1] = gMain.heldKeys; break; case LINKCMD_0x5555: @@ -687,8 +687,8 @@ static void BuildSendCmd(u16 command) gSendCmd[1] = sBlockSend.size; gSendCmd[2] = sBlockSend.multiplayerId + 0x80; break; - case LINKCMD_0xAAAA: - gSendCmd[0] = LINKCMD_0xAAAA; + case LINKCMD_BLENDER_NO_PBLOCK_SPACE: + gSendCmd[0] = LINKCMD_BLENDER_NO_PBLOCK_SPACE; break; case LINKCMD_0xAAAB: gSendCmd[0] = LINKCMD_0xAAAB; @@ -705,12 +705,12 @@ static void BuildSendCmd(u16 command) case LINKCMD_0x5566: gSendCmd[0] = LINKCMD_0x5566; break; - case LINKCMD_SEND_HELD_KEYS_2: + case LINKCMD_SEND_HELD_KEYS: if (gHeldKeyCodeToSend == 0 || gLinkTransferringData) { break; } - gSendCmd[0] = LINKCMD_SEND_HELD_KEYS_2; + gSendCmd[0] = LINKCMD_SEND_HELD_KEYS; gSendCmd[1] = gHeldKeyCodeToSend; break; } @@ -738,7 +738,7 @@ bool32 IsSendingKeysToLink(void) static void LinkCB_SendHeldKeys(void) { if (gReceivedRemoteLinkPlayers == TRUE) - BuildSendCmd(LINKCMD_SEND_HELD_KEYS_2); + BuildSendCmd(LINKCMD_SEND_HELD_KEYS); } void ClearLinkCallback(void) @@ -1009,34 +1009,36 @@ static void LinkCB_BlockSendEnd(void) gLinkCallback = NULL; } -static void sub_800A3F8(void) +static void LinkCB_BerryBlenderSendHeldKeys(void) { GetMultiplayerId(); - BuildSendCmd(LINKCMD_SEND_HELD_KEYS); - gUnknown_020223C0++; + BuildSendCmd(LINKCMD_BLENDER_SEND_KEYS); + gBerryBlenderKeySendAttempts++; } -void sub_800A418(void) +void SetBerryBlenderLinkCallback(void) { - gUnknown_020223C0 = 0; + gBerryBlenderKeySendAttempts = 0; if (gWirelessCommType) { - sub_800F850(); + Rfu_SetBerryBlenderLinkCallback(); } else { - gLinkCallback = sub_800A3F8; + gLinkCallback = LinkCB_BerryBlenderSendHeldKeys; } } -u32 sub_800A44C(void) +// Unused +static u32 GetBerryBlenderKeySendAttempts(void) { - return gUnknown_020223C0; + return gBerryBlenderKeySendAttempts; } -void sub_800A458(void) +// Unused +static void SendBerryBlenderNoSpaceForPokeblocks(void) { - BuildSendCmd(LINKCMD_0xAAAA); + BuildSendCmd(LINKCMD_BLENDER_NO_PBLOCK_SPACE); } u8 GetMultiplayerId(void) diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index a8ead95d6..1ea6f4fce 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -929,7 +929,7 @@ static void HandleSendFailure(u8 unused, u32 flags) { if (!(flags & 1)) { - sResendBlock16[0] = RFU_COMMAND_0x8900 | i; + sResendBlock16[0] = RFUCMD_0x8900 | i; for (j = 0; j < 7; j++) { temp = j << 1; @@ -984,7 +984,7 @@ static void RfuFunc_SendKeysToRfu(void) { sHeldKeyCount++; gHeldKeyCodeToSend |= (sHeldKeyCount << 8); - RfuPrepareSendBuffer(RFU_COMMAND_0xBE00); + RfuPrepareSendBuffer(RFUCMD_SEND_HELD_KEYS); } } @@ -1008,18 +1008,18 @@ void ClearLinkRfuCallback(void) Rfu.callback = NULL; } -void sub_800F820(void) +static void Rfu_BerryBlenderSendHeldKeys(void) { - RfuPrepareSendBuffer(RFU_COMMAND_0x4400); + RfuPrepareSendBuffer(RFUCMD_BLENDER_SEND_KEYS); if (GetMultiplayerId() == 0) - gSendCmd[6] = GetBlenderArrowPosition(); - gUnknown_020223C0++; + gSendCmd[BLENDER_COMM_ARROW_POS] = GetBlenderArrowPosition(); + gBerryBlenderKeySendAttempts++; } -void sub_800F850(void) +void Rfu_SetBerryBlenderLinkCallback(void) { if (Rfu.callback == NULL) - Rfu.callback = sub_800F820; + Rfu.callback = Rfu_BerryBlenderSendHeldKeys; } static void RfuHandleReceiveCommand(u8 unused) @@ -1030,18 +1030,18 @@ static void RfuHandleReceiveCommand(u8 unused) { switch (gRecvCmds[i][0] & 0xff00) { - case RFU_COMMAND_0x7800: + case RFUCMD_0x7800: if (Rfu.parentChild == MODE_CHILD && gReceivedRemoteLinkPlayers) return; // fallthrough - case RFU_COMMAND_0x7700: + case RFUCMD_0x7700: if (gRfuLinkStatus->parentChild == MODE_CHILD) { Rfu.playerCount = gRecvCmds[i][1]; Rfu.multiplayerId = sub_800F74C((u8 *)(&gRecvCmds[i][2])); } break; - case RFU_COMMAND_0x8800: + case RFUCMD_0x8800: if (Rfu.recvBlock[i].receiving == 0) { Rfu.recvBlock[i].next = 0; @@ -1052,7 +1052,7 @@ static void RfuHandleReceiveCommand(u8 unused) Rfu.blockReceived[i] = FALSE; } break; - case RFU_COMMAND_0x8900: + case RFUCMD_0x8900: if (Rfu.recvBlock[i].receiving == 1) { Rfu.recvBlock[i].next = gRecvCmds[i][0] & 0xff; @@ -1068,17 +1068,17 @@ static void RfuHandleReceiveCommand(u8 unused) } } break; - case RFU_COMMAND_SEND_BLOCK_REQ: + case RFUCMD_SEND_BLOCK_REQ: Rfu_InitBlockSend(sBlockRequests[gRecvCmds[i][1]].address, (u16)sBlockRequests[gRecvCmds[i][1]].size); break; - case RFU_COMMAND_READY_CLOSE_LINK: + case RFUCMD_READY_CLOSE_LINK: Rfu.readyCloseLink[i] = TRUE; break; - case RFU_COMMAND_READY_EXIT_STANDBY: + case RFUCMD_READY_EXIT_STANDBY: if (Rfu.unk_100 == gRecvCmds[i][1]) Rfu.readyExitStandby[i] = TRUE; break; - case RFU_COMMAND_0xED00: + case RFUCMD_0xED00: if (Rfu.parentChild == MODE_CHILD) { if (gReceivedRemoteLinkPlayers) @@ -1095,13 +1095,13 @@ static void RfuHandleReceiveCommand(u8 unused) } else { - RfuPrepareSendBuffer(RFU_COMMAND_0xEE00); + RfuPrepareSendBuffer(RFUCMD_0xEE00); gSendCmd[1] = gRecvCmds[i][1]; gSendCmd[2] = gRecvCmds[i][2]; gSendCmd[3] = gRecvCmds[i][3]; } break; - case RFU_COMMAND_0xEE00: + case RFUCMD_0xEE00: if (Rfu.parentChild == MODE_PARENT) { Rfu.unk_ce3 |= gRecvCmds[i][1]; @@ -1109,8 +1109,8 @@ static void RfuHandleReceiveCommand(u8 unused) ClearSelectedLinkPlayerIds(gRecvCmds[i][1]); } break; - case RFU_COMMAND_0x4400: - case RFU_COMMAND_0xBE00: + case RFUCMD_BLENDER_SEND_KEYS: + case RFUCMD_SEND_HELD_KEYS: gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; } @@ -1186,16 +1186,16 @@ static void RfuPrepareSendBuffer(u16 command) gSendCmd[0] = command; switch (command) { - case RFU_COMMAND_0x8800: + case RFUCMD_0x8800: gSendCmd[1] = Rfu.sendBlock.count; gSendCmd[2] = Rfu.sendBlock.owner + 0x80; break; - case RFU_COMMAND_SEND_BLOCK_REQ: + case RFUCMD_SEND_BLOCK_REQ: if (AreNoPlayersReceiving()) gSendCmd[1] = Rfu.blockRequestType; break; - case RFU_COMMAND_0x7700: - case RFU_COMMAND_0x7800: + case RFUCMD_0x7700: + case RFUCMD_0x7800: tmp = Rfu.unk_ce2 ^ Rfu.unk_ce3; Rfu.playerCount = sUnknown_082ED695[tmp] + 1; gSendCmd[1] = Rfu.playerCount; @@ -1203,34 +1203,34 @@ static void RfuPrepareSendBuffer(u16 command) for (i = 0; i < RFU_CHILD_MAX; i++) buff[i] = Rfu.linkPlayerIdx[i]; break; - case RFU_COMMAND_READY_EXIT_STANDBY: - case RFU_COMMAND_READY_CLOSE_LINK: + case RFUCMD_READY_EXIT_STANDBY: + case RFUCMD_READY_CLOSE_LINK: gSendCmd[1] = Rfu.unk_100; break; - case RFU_COMMAND_0x4400: + case RFUCMD_BLENDER_SEND_KEYS: gSendCmd[0] = command; gSendCmd[1] = gMain.heldKeys; break; - case RFU_COMMAND_0x2F00: - for (i = 0; i < 6; i++) - gSendCmd[1 + i] = Rfu.unk_f2[i]; + case RFUCMD_SEND_PACKET: + for (i = 0; i < RFU_PACKET_SIZE; i++) + gSendCmd[1 + i] = Rfu.packet[i]; break; - case RFU_COMMAND_0xBE00: + case RFUCMD_SEND_HELD_KEYS: gSendCmd[1] = gHeldKeyCodeToSend; break; - case RFU_COMMAND_0xEE00: + case RFUCMD_0xEE00: break; - case RFU_COMMAND_0xED00: + case RFUCMD_0xED00: break; } } -void sub_800FE50(void *a0) +void Rfu_SendPacket(void *data) { if (gSendCmd[0] == 0 && !RfuHasErrored()) { - memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2)); - RfuPrepareSendBuffer(RFU_COMMAND_0x2F00); + memcpy(Rfu.packet, data, sizeof(Rfu.packet)); + RfuPrepareSendBuffer(RFUCMD_SEND_PACKET); } } @@ -1258,7 +1258,7 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size) memcpy(gBlockSendBuffer, src, size); Rfu.sendBlock.payload = gBlockSendBuffer; } - RfuPrepareSendBuffer(RFU_COMMAND_0x8800); + RfuPrepareSendBuffer(RFUCMD_0x8800); Rfu.callback = HandleBlockSend; Rfu.unk_5b = 0; return TRUE; @@ -1268,7 +1268,7 @@ static void HandleBlockSend(void) { if (gSendCmd[0] == 0) { - RfuPrepareSendBuffer(RFU_COMMAND_0x8800); + RfuPrepareSendBuffer(RFUCMD_0x8800); if (Rfu.parentChild == MODE_PARENT) { if (++Rfu.unk_5b > 2) @@ -1276,7 +1276,7 @@ static void HandleBlockSend(void) } else { - if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == RFU_COMMAND_0x8800) + if ((gRecvCmds[GetMultiplayerId()][0] & 0xff00) == RFUCMD_0x8800) Rfu.callback = SendNextBlock; } } @@ -1286,7 +1286,7 @@ static void SendNextBlock(void) { s32 i; const u8 *src = Rfu.sendBlock.payload; - gSendCmd[0] = RFU_COMMAND_0x8900 | Rfu.sendBlock.next; + gSendCmd[0] = RFUCMD_0x8900 | Rfu.sendBlock.next; for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i + 1] = (src[(i << 1) + Rfu.sendBlock.next * 12 + 1] << 8) | src[(i << 1) + Rfu.sendBlock.next * 12 + 0]; Rfu.sendBlock.next++; @@ -1304,7 +1304,7 @@ static void SendLastBlock(void) s32 i; if (Rfu.parentChild == MODE_CHILD) { - gSendCmd[0] = RFU_COMMAND_0x8900 | (Rfu.sendBlock.count - 1); + gSendCmd[0] = RFUCMD_0x8900 | (Rfu.sendBlock.count - 1); for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i + 1] = (src[(i << 1) + (Rfu.sendBlock.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.sendBlock.count - 1) * 12 + 0]; if ((u8)gRecvCmds[mpId][0] == Rfu.sendBlock.count - 1) @@ -1325,7 +1325,7 @@ static void SendLastBlock(void) bool8 Rfu_SendBlockRequest(u8 type) { Rfu.blockRequestType = type; - RfuPrepareSendBuffer(RFU_COMMAND_SEND_BLOCK_REQ); + RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_REQ); return TRUE; } @@ -1394,7 +1394,7 @@ static void SendReadyCloseLink(void) { if (gSendCmd[0] == 0 && Rfu.unk_ce8 == 0) { - RfuPrepareSendBuffer(RFU_COMMAND_READY_CLOSE_LINK); + RfuPrepareSendBuffer(RFUCMD_READY_CLOSE_LINK); Rfu.callback = WaitAllReadyToCloseLink; } } @@ -1421,7 +1421,7 @@ static void SendReadyExitStandbyUntilAllReady(void) if (GetMultiplayerId() != 0 && Rfu.recvQueue.count == 0 && Rfu.resendExitStandbyTimer > 60) { - RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY); + RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); Rfu.resendExitStandbyTimer = 0; } playerCount = GetLinkPlayerCount(); @@ -1444,7 +1444,7 @@ static void LinkLeaderReadyToExitStandby(void) { if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0) { - RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY); + RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); Rfu.callback = SendReadyExitStandbyUntilAllReady; } } @@ -1459,7 +1459,7 @@ static void Rfu_LinkStandby(void) // Not link leader, send exit standby when ready if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0) { - RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY); + RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); Rfu.callback = SendReadyExitStandbyUntilAllReady; } } @@ -1476,7 +1476,7 @@ static void Rfu_LinkStandby(void) { if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0) { - RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY); + RfuPrepareSendBuffer(RFUCMD_READY_EXIT_STANDBY); Rfu.callback = LinkLeaderReadyToExitStandby; } } @@ -1699,9 +1699,9 @@ static void sub_801084C(u8 taskId) if (Rfu.parentChild == MODE_PARENT) { if (gReceivedRemoteLinkPlayers) - RfuPrepareSendBuffer(RFU_COMMAND_0x7800); + RfuPrepareSendBuffer(RFUCMD_0x7800); else - RfuPrepareSendBuffer(RFU_COMMAND_0x7700); + RfuPrepareSendBuffer(RFUCMD_0x7700); gTasks[taskId].data[0] = 101; } else @@ -1721,7 +1721,7 @@ static void sub_801084C(u8 taskId) if (AreNoPlayersReceiving()) { Rfu.blockRequestType = 0; - RfuPrepareSendBuffer(RFU_COMMAND_SEND_BLOCK_REQ); + RfuPrepareSendBuffer(RFUCMD_SEND_BLOCK_REQ); gTasks[taskId].data[0]++; } } @@ -1811,7 +1811,7 @@ static void Task_ExchangeLinkPlayers(u8 taskId) if (gSendCmd[0] == 0) { ResetBlockReceivedFlag(r4); - RfuPrepareSendBuffer(RFU_COMMAND_0x7800); + RfuPrepareSendBuffer(RFUCMD_0x7800); gTasks[taskId].data[0]++; } break; @@ -2624,7 +2624,7 @@ static void sub_8011E2C(u8 taskId) { if (gSendCmd[0] == 0 && Rfu.unk_ce8 == 0) { - RfuPrepareSendBuffer(RFU_COMMAND_0xED00); + RfuPrepareSendBuffer(RFUCMD_0xED00); gSendCmd[1] = gTasks[taskId].data[0]; gSendCmd[2] = gTasks[taskId].data[1]; Rfu.playerCount -= sUnknown_082ED695[gTasks[taskId].data[0]]; diff --git a/src/list_menu.c b/src/list_menu.c index ef55f5872..1e549a34a 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -312,7 +312,7 @@ static void ListMenuDummyTask(u8 taskId) } -s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum) +u32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum) { switch (sMysteryGiftLinkMenu.state) { @@ -22,8 +22,7 @@ u8 gMPlayMemAccArea[0x10]; u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) { - u32 val1; - u32 val2; + u32 val1, val2; u32 fineAdjustShifted = fineAdjust << 24; if (key > 178) @@ -315,7 +314,7 @@ void MPlayExtender(struct CgbChannel *cgbChans) void MusicPlayerJumpTableCopy(void) { - asm("swi 0x2A"); + asm("svc 0x2A"); } void ClearChain(void *x) @@ -352,25 +351,25 @@ void SoundInit(struct SoundInfo *soundInfo) | SOUND_ALL_MIX_FULL; REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; - REG_DMA1SAD = (s32)soundInfo->pcmBuffer; - REG_DMA1DAD = (s32)®_FIFO_A; - REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; - REG_DMA2DAD = (s32)®_FIFO_B; + REG_DMA1SAD = (u32)soundInfo->pcmBuffer; + REG_DMA1DAD = (u32)®_FIFO_A; + REG_DMA2SAD = (u32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; + REG_DMA2DAD = (u32)®_FIFO_B; SOUND_INFO_PTR = soundInfo; CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); soundInfo->maxChans = 8; soundInfo->masterVolume = 15; - soundInfo->plynote = (u32)ply_note; + soundInfo->plynote = ply_note; soundInfo->CgbSound = DummyFunc; soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; - soundInfo->ExtVolPit = (u32)DummyFunc; + soundInfo->ExtVolPit = (void (*)(struct MusicPlayerInfo *, struct MusicPlayerTrack *))DummyFunc; MPlayJumpTableCopy(gMPlayJumpTable); - soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; + soundInfo->MPlayJumpTable = (void (**)())gMPlayJumpTable; SampleFreqSet(SOUND_MODE_FREQ_13379); @@ -381,7 +380,7 @@ void SampleFreqSet(u32 freq) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; - freq = (freq & 0xF0000) >> 16; + freq = (freq & SOUND_MODE_FREQ) >> SOUND_MODE_FREQ_SHIFT; soundInfo->freq = freq; soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; @@ -432,14 +431,9 @@ void m4aSoundMode(u32 mode) soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; - temp = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (temp != 0) + for (temp = MAX_DIRECTSOUND_CHANNELS, chan = soundInfo->chans; temp != 0; temp--,chan++) { chan->status = 0; - temp--; - chan++; } } @@ -469,37 +463,28 @@ void m4aSoundMode(u32 mode) void SoundClear(void) { - struct SoundInfo *soundInfo = SOUND_INFO_PTR; s32 i; - void *chan; + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + struct SoundChannel *chan; if (soundInfo->ident != ID_NUMBER) return; soundInfo->ident++; - i = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (i > 0) + for (i = MAX_DIRECTSOUND_CHANNELS, chan = soundInfo->chans; i > 0; i--,chan++) { - ((struct SoundChannel *)chan)->status = 0; - i--; - chan = (void *)((s32)chan + sizeof(struct SoundChannel)); + chan->status = 0; } - chan = soundInfo->cgbChans; + chan = (struct SoundChannel *)soundInfo->cgbChans; if (chan) { - i = 1; - - while (i <= 4) + for (i=1; i<=4; i++,chan++) { soundInfo->CgbOscOff(i); - ((struct CgbChannel *)chan)->sf = 0; - i++; - chan = (void *)((s32)chan + sizeof(struct CgbChannel)); + chan->status = 0; } } @@ -510,21 +495,20 @@ void m4aSoundVSyncOff(void) { struct SoundInfo *soundInfo = SOUND_INFO_PTR; - if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) - { - soundInfo->ident += 10; + if (soundInfo->ident < ID_NUMBER || soundInfo->ident > ID_NUMBER + 1) + return; + soundInfo->ident += 10; - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; - CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); - } + CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); } void m4aSoundVSyncOn(void) @@ -580,7 +564,7 @@ void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track } soundInfo->intp = (u32)mplayInfo; - soundInfo->func = (u32)MPlayMain; + soundInfo->func = MPlayMain; soundInfo->ident = ID_NUMBER; mplayInfo->ident = ID_NUMBER; } @@ -614,28 +598,21 @@ void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader mplayInfo->tempoC = 0; mplayInfo->fadeOI = 0; - i = 0; - track = mplayInfo->tracks; - - while (i < songHeader->trackCount && i < mplayInfo->trackCount) + for (i = 0, track = mplayInfo->tracks; i < songHeader->trackCount && i < mplayInfo->trackCount; i++, track++) { TrackStop(mplayInfo, track); track->flags = MPT_FLG_EXIST | MPT_FLG_START; track->chan = 0; track->cmdPtr = songHeader->part[i]; - i++; - track++; } - while (i < mplayInfo->trackCount) + for (; i < mplayInfo->trackCount; i++, track++) { TrackStop(mplayInfo, track); track->flags = 0; - i++; - track++; } - if (songHeader->reverb & 0x80) + if (songHeader->reverb & SOUND_MODE_REVERB_SET) m4aSoundMode(songHeader->reverb); mplayInfo->ident = ID_NUMBER; @@ -653,14 +630,9 @@ void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) mplayInfo->ident++; mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++) { TrackStop(mplayInfo, track); - i--; - track++; } mplayInfo->ident = ID_NUMBER; @@ -704,10 +676,8 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) if ((s16)(mplayInfo->fadeOV & mask) <= 0) { - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++) { u32 val; @@ -719,9 +689,6 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) if (!val) track->flags = 0; - - i--; - track++; } if (mplayInfo->fadeOV & TEMPORARY_FADE) @@ -734,10 +701,7 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) } } - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) + for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++) { if (track->flags & MPT_FLG_EXIST) { @@ -746,9 +710,6 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo) track->volX = (fadeOV >> FADE_VOL_SHIFT); track->flags |= MPT_FLG_VOLCHG; } - - i--; - track++; } } @@ -756,7 +717,7 @@ void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tr { if (track->flags & MPT_FLG_VOLSET) { - s32 x; + u32 x; s32 y; x = (u32)(track->vol * track->volX) >> 5; diff --git a/src/m4a_1.s b/src/m4a_1.s index cab4ed174..eace09b05 100644 --- a/src/m4a_1.s +++ b/src/m4a_1.s @@ -22,13 +22,13 @@ SoundMain: ldr r0, lt_SOUND_INFO_PTR ldr r0, [r0] ldr r2, lt_ID_NUMBER - ldr r3, [r0, o_SoundInfo_ident] + ldr r3, [r0, #o_SoundInfo_ident] cmp r2, r3 beq SoundMain_1 bx lr @ Exit the function if ident doesn't match ID_NUMBER. SoundMain_1: adds r3, 1 - str r3, [r0, o_SoundInfo_ident] + str r3, [r0, #o_SoundInfo_ident] push {r4-r7,lr} mov r1, r8 mov r2, r9 @@ -36,7 +36,7 @@ SoundMain_1: mov r4, r11 push {r0-r4} sub sp, 0x18 - ldrb r1, [r0, o_SoundInfo_maxLines] + ldrb r1, [r0, #o_SoundInfo_maxLines] cmp r1, 0 @ if maxLines is 0, there is no maximum beq SoundMain_3 ldr r2, lt_REG_VCOUNT @@ -48,24 +48,24 @@ SoundMain_2: adds r1, r2 SoundMain_3: str r1, [sp, 0x14] - ldr r3, [r0, o_SoundInfo_func] + ldr r3, [r0, #o_SoundInfo_func] cmp r3, 0 beq SoundMain_4 - ldr r0, [r0, o_SoundInfo_intp] + ldr r0, [r0, #o_SoundInfo_intp] bl _081DD25E ldr r0, [sp, 0x18] SoundMain_4: - ldr r3, [r0, o_SoundInfo_CgbSound] + ldr r3, [r0, #o_SoundInfo_CgbSound] bl _081DD25E ldr r0, [sp, 0x18] - ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank] + ldr r3, [r0, #o_SoundInfo_pcmSamplesPerVBlank] mov r8, r3 ldr r5, lt_o_SoundInfo_pcmBuffer adds r5, r0 - ldrb r4, [r0, o_SoundInfo_pcmDmaCounter] + ldrb r4, [r0, #o_SoundInfo_pcmDmaCounter] subs r7, r4, 1 bls SoundMain_5 - ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] + ldrb r1, [r0, #o_SoundInfo_pcmDmaPeriod] subs r1, r7 mov r2, r8 muls r2, r1 @@ -87,7 +87,7 @@ lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE thumb_func_start SoundMainRAM SoundMainRAM: - ldrb r3, [r0, o_SoundInfo_reverb] + ldrb r3, [r0, #o_SoundInfo_reverb] cmp r3, 0 beq SoundMainRAM_NoReverb adr r1, SoundMainRAM_Reverb @@ -95,7 +95,7 @@ SoundMainRAM: .arm SoundMainRAM_Reverb: cmp r4, 0x2 - addeq r7, r0, o_SoundInfo_pcmBuffer + addeq r7, r0, #o_SoundInfo_pcmBuffer addne r7, r5, r8 mov r4, r8 _081DCEC4: @@ -145,14 +145,14 @@ SoundMainRAM_NoReverb_Loop: bgt SoundMainRAM_NoReverb_Loop _081DCF36: ldr r4, [sp, 0x18] - ldr r0, [r4, o_SoundInfo_divFreq] + ldr r0, [r4, #o_SoundInfo_divFreq] mov r12, r0 - ldrb r0, [r4, o_SoundInfo_maxChans] - adds r4, o_SoundInfo_chans + ldrb r0, [r4, #o_SoundInfo_maxChans] + adds r4, #o_SoundInfo_chans SoundMainRAM_ChanLoop: str r0, [sp, 0x4] - ldr r3, [r4, o_SoundChannel_wav] + ldr r3, [r4, #o_SoundChannel_wav] ldr r0, [sp, 0x14] cmp r0, 0 beq _081DCF60 @@ -169,7 +169,7 @@ _081DCF54: .pool _081DCF60: - ldrb r6, [r4, o_SoundChannel_status] + ldrb r6, [r4, #o_SoundChannel_status] movs r0, 0xC7 tst r0, r6 bne _081DCF6A @@ -182,99 +182,99 @@ _081DCF6A: tst r0, r6 bne _081DCFB0 movs r6, 0x3 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, #o_SoundChannel_status] adds r0, r3, 0 adds r0, 0x10 - ldr r1, [r4, o_SoundChannel_ct] + ldr r1, [r4, #o_SoundChannel_ct] adds r0, r1 - str r0, [r4, o_SoundChannel_cp] + str r0, [r4, #o_SoundChannel_cp] ldr r0, [r3, 0xC] subs r0, r1 - str r0, [r4, o_SoundChannel_ct] + str r0, [r4, #o_SoundChannel_ct] movs r5, 0 - strb r5, [r4, o_SoundChannel_ev] - str r5, [r4, o_SoundChannel_fw] + strb r5, [r4, #o_SoundChannel_ev] + str r5, [r4, #o_SoundChannel_fw] ldrb r2, [r3, 0x3] movs r0, 0xC0 tst r0, r2 beq _081DCFF8 movs r0, 0x10 orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, #o_SoundChannel_status] b _081DCFF8 _081DCFA0: - ldrb r5, [r4, o_SoundChannel_ev] + ldrb r5, [r4, #o_SoundChannel_ev] movs r0, 0x4 tst r0, r6 beq _081DCFB6 - ldrb r0, [r4, o_SoundChannel_iel] + ldrb r0, [r4, #o_SoundChannel_iel] subs r0, 1 - strb r0, [r4, o_SoundChannel_iel] + strb r0, [r4, #o_SoundChannel_iel] bhi _081DD006 _081DCFB0: movs r0, 0 - strb r0, [r4, o_SoundChannel_status] + strb r0, [r4, #o_SoundChannel_status] b _081DD240 _081DCFB6: movs r0, 0x40 tst r0, r6 beq _081DCFD6 - ldrb r0, [r4, o_SoundChannel_release] + ldrb r0, [r4, #o_SoundChannel_release] muls r5, r0 lsrs r5, 8 - ldrb r0, [r4, o_SoundChannel_iev] + ldrb r0, [r4, #o_SoundChannel_iev] cmp r5, r0 bhi _081DD006 _081DCFC8: - ldrb r5, [r4, o_SoundChannel_iev] + ldrb r5, [r4, #o_SoundChannel_iev] cmp r5, 0 beq _081DCFB0 movs r0, 0x4 orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, #o_SoundChannel_status] b _081DD006 _081DCFD6: movs r2, 0x3 ands r2, r6 cmp r2, 0x2 bne _081DCFF4 - ldrb r0, [r4, o_SoundChannel_decay] + ldrb r0, [r4, #o_SoundChannel_decay] muls r5, r0 lsrs r5, 8 - ldrb r0, [r4, o_SoundChannel_sustain] + ldrb r0, [r4, #o_SoundChannel_sustain] cmp r5, r0 bhi _081DD006 adds r5, r0, 0 beq _081DCFC8 subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, #o_SoundChannel_status] b _081DD006 _081DCFF4: cmp r2, 0x3 bne _081DD006 _081DCFF8: - ldrb r0, [r4, o_SoundChannel_attack] + ldrb r0, [r4, #o_SoundChannel_attack] adds r5, r0 cmp r5, 0xFF bcc _081DD006 movs r5, 0xFF subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, #o_SoundChannel_status] _081DD006: - strb r5, [r4, o_SoundChannel_ev] + strb r5, [r4, #o_SoundChannel_ev] ldr r0, [sp, 0x18] - ldrb r0, [r0, o_SoundChannel_release] + ldrb r0, [r0, #o_SoundChannel_release] adds r0, 0x1 muls r0, r5 lsrs r5, r0, 4 - ldrb r0, [r4, o_SoundChannel_rightVolume] + ldrb r0, [r4, #o_SoundChannel_rightVolume] muls r0, r5 lsrs r0, 8 - strb r0, [r4, o_SoundChannel_er] - ldrb r0, [r4, o_SoundChannel_leftVolume] + strb r0, [r4, #o_SoundChannel_er] + ldrb r0, [r4, #o_SoundChannel_leftVolume] muls r0, r5 lsrs r0, 8 - strb r0, [r4, o_SoundChannel_el] + strb r0, [r4, #o_SoundChannel_el] movs r0, 0x10 ands r0, r6 str r0, [sp, 0x10] @@ -289,17 +289,17 @@ _081DD006: str r0, [sp, 0x10] _081DD03A: ldr r5, [sp, 0x8] - ldr r2, [r4, o_SoundChannel_ct] - ldr r3, [r4, o_SoundChannel_cp] + ldr r2, [r4, #o_SoundChannel_ct] + ldr r3, [r4, #o_SoundChannel_cp] adr r0, _081DD044 bx r0 .arm _081DD044: str r8, [sp] - ldr r9, [r4, o_SoundChannel_fw] - ldrb r10, [r4, o_SoundChannel_er] - ldrb r11, [r4, o_SoundChannel_el] - ldrb r0, [r4, o_SoundChannel_type] + ldr r9, [r4, #o_SoundChannel_fw] + ldrb r10, [r4, #o_SoundChannel_er] + ldrb r11, [r4, #o_SoundChannel_el] + ldrb r0, [r4, #o_SoundChannel_type] tst r0, 0x30 beq _081DD068 bl sub_82DF49C @@ -307,7 +307,7 @@ _081DD044: _081DD068: mov r10, r10, lsl 16 mov r11, r11, lsl 16 - ldrb r0, [r4, o_SoundChannel_type] + ldrb r0, [r4, #o_SoundChannel_type] tst r0, 0x8 beq _081DD19C _081DD07C: @@ -383,7 +383,7 @@ _081DD164: ldrne r3, [sp, 0xC] bne _081DD118 _081DD174: - strb r2, [r4, o_SoundChannel_status] + strb r2, [r4, #o_SoundChannel_status] mov r0, r5, lsr 30 bic r5, r5, 0xC0000000 rsb r0, r0, 0x3 @@ -395,7 +395,7 @@ _081DD174: b _081DD234 _081DD19C: push {r4,r12} - ldr r1, [r4, o_SoundChannel_freq] + ldr r1, [r4, #o_SoundChannel_freq] mul r4, r12, r1 ldrsb r0, [r3] ldrsb r1, [r3, 0x1]! @@ -434,10 +434,10 @@ _081DD208: sub r3, r3, 0x1 pop {r4,r12} _081DD228: - str r9, [r4, o_SoundChannel_fw] + str r9, [r4, #o_SoundChannel_fw] _081DD22C: - str r2, [r4, o_SoundChannel_ct] - str r3, [r4, o_SoundChannel_cp] + str r2, [r4, #o_SoundChannel_ct] + str r3, [r4, #o_SoundChannel_cp] _081DD234: ldr r8, [sp] add r0, pc, 0x1 @@ -467,33 +467,33 @@ _081DD25E: arm_func_start sub_82DF49C sub_82DF49C: - ldr r6, [r4, o_SoundChannel_wav] - ldrb r0, [r4, o_SoundChannel_status] + ldr r6, [r4, #o_SoundChannel_wav] + ldrb r0, [r4, #o_SoundChannel_status] tst r0, 0x20 bne _081DD2B4 orr r0, r0, 0x20 - strb r0, [r4, o_SoundChannel_status] - ldrb r0, [r4, o_SoundChannel_type] + strb r0, [r4, #o_SoundChannel_status] + ldrb r0, [r4, #o_SoundChannel_type] tst r0, 0x10 beq _081DD29C ldr r1, [r6, 0xC] add r1, r1, r6, lsl 1 add r1, r1, 0x20 sub r3, r1, r3 - str r3, [r4, o_SoundChannel_cp] + str r3, [r4, #o_SoundChannel_cp] _081DD29C: ldrh r0, [r6] cmp r0, 0 beq _081DD2B4 sub r3, r3, r6 sub r3, r3, 0x10 - str r3, [r4, o_SoundChannel_cp] + str r3, [r4, #o_SoundChannel_cp] _081DD2B4: push {r8,r12,lr} mov r10, r10, lsl 16 mov r11, r11, lsl 16 - ldr r1, [r4, o_SoundChannel_freq] - ldrb r0, [r4, o_SoundChannel_type] + ldr r1, [r4, #o_SoundChannel_freq] + ldrb r0, [r4, #o_SoundChannel_type] tst r0, 0x8 movne r8, 0x800000 muleq r8, r12, r1 @@ -501,8 +501,8 @@ _081DD2B4: cmp r0, 0 beq _081DD468 mov r0, 0xFF000000 - str r0, [r4, o_SoundChannel_xpi] - ldrb r0, [r4, o_SoundChannel_type] + str r0, [r4, #o_SoundChannel_xpi] + ldrb r0, [r4, #o_SoundChannel_type] tst r0, 0x10 bne _081DD3C0 bl sub_82DF758 @@ -555,7 +555,7 @@ _081DD398: ldr r0, [sp, 0x1C] cmp r0, 0 beq _081DD4F4 - ldr r3, [r4, o_SoundChannel_wav] + ldr r3, [r4, #o_SoundChannel_wav] ldr r3, [r3, 0x8] rsb lr, r2, 0 _081DD3B0: @@ -612,7 +612,7 @@ _081DD440: add r3, r3, 0x2 b _081DD4F0 _081DD468: - ldrb r0, [r4, o_SoundChannel_type] + ldrb r0, [r4, #o_SoundChannel_type] tst r0, 0x10 beq _081DD4F0 ldrsb r0, [r3, -0x1]! @@ -653,7 +653,7 @@ _081DD4F0: pop {r8,r12,pc} _081DD4F4: mov r2, 0 - strb r2, [r4, o_SoundChannel_status] + strb r2, [r4, #o_SoundChannel_status] mov r0, r5, lsr 30 bic r5, r5, 0xC0000000 rsb r0, r0, 0x3 @@ -669,13 +669,13 @@ _081DD4F4: sub_82DF758: push {r0,r2,r5-r7,lr} mov r0, r3, lsr 6 - ldr r1, [r4, o_SoundChannel_xpi] + ldr r1, [r4, #o_SoundChannel_xpi] cmp r0, r1 beq _081DD594 - str r0, [r4, o_SoundChannel_xpi] + str r0, [r4, #o_SoundChannel_xpi] mov r1, 0x21 mul r2, r1, r0 - ldr r1, [r4, o_SoundChannel_wav] + ldr r1, [r4, #o_SoundChannel_wav] add r2, r2, r1 add r2, r2, 0x10 ldr r5, =gUnknown_03001300 @@ -749,7 +749,7 @@ _081DD5E2: ply_fine: push {r4,r5,lr} adds r5, r1, 0 - ldr r4, [r5, o_MusicPlayerTrack_chan] + ldr r4, [r5, #o_MusicPlayerTrack_chan] cmp r4, 0 beq ply_fine_done ply_fine_loop: @@ -830,7 +830,7 @@ _081DD64A: ply_goto: push {lr} ply_goto_1: - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r1, #o_MusicPlayerTrack_cmdPtr] ldrb r0, [r2, 0x3] lsls r0, 8 ldrb r3, [r2, 0x2] @@ -841,24 +841,24 @@ ply_goto_1: lsls r0, 8 bl ldrb_r3_r2 orrs r0, r3 - str r0, [r1, o_MusicPlayerTrack_cmdPtr] + str r0, [r1, #o_MusicPlayerTrack_cmdPtr] pop {r0} bx r0 thumb_func_end ply_goto thumb_func_start ply_patt ply_patt: - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] + ldrb r2, [r1, #o_MusicPlayerTrack_patternLevel] cmp r2, 3 bhs ply_patt_done lsls r2, 2 adds r3, r1, r2 - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r1, #o_MusicPlayerTrack_cmdPtr] adds r2, 0x4 - str r2, [r3, o_MusicPlayerTrack_patternStack] - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] + str r2, [r3, #o_MusicPlayerTrack_patternStack] + ldrb r2, [r1, #o_MusicPlayerTrack_patternLevel] adds r2, 1 - strb r2, [r1, o_MusicPlayerTrack_patternLevel] + strb r2, [r1, #o_MusicPlayerTrack_patternLevel] b ply_goto ply_patt_done: b ply_fine @@ -866,15 +866,15 @@ ply_patt_done: thumb_func_start ply_pend ply_pend: - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] + ldrb r2, [r1, #o_MusicPlayerTrack_patternLevel] cmp r2, 0 beq ply_pend_done subs r2, 1 - strb r2, [r1, o_MusicPlayerTrack_patternLevel] + strb r2, [r1, #o_MusicPlayerTrack_patternLevel] lsls r2, 2 adds r3, r1, r2 - ldr r2, [r3, o_MusicPlayerTrack_patternStack] - str r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r3, #o_MusicPlayerTrack_patternStack] + str r2, [r1, #o_MusicPlayerTrack_cmdPtr] ply_pend_done: bx lr thumb_func_end ply_pend @@ -882,17 +882,17 @@ ply_pend_done: thumb_func_start ply_rept ply_rept: push {lr} - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r1, #o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] cmp r3, 0 bne ply_rept_1 adds r2, 1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] + str r2, [r1, #o_MusicPlayerTrack_cmdPtr] b ply_goto_1 ply_rept_1: - ldrb r3, [r1, o_MusicPlayerTrack_repN] + ldrb r3, [r1, #o_MusicPlayerTrack_repN] adds r3, 1 - strb r3, [r1, o_MusicPlayerTrack_repN] + strb r3, [r1, #o_MusicPlayerTrack_repN] mov r12, r3 bl ld_r3_tp_adr_i cmp r12, r3 @@ -900,9 +900,9 @@ ply_rept_1: b ply_goto_1 ply_rept_2: movs r3, 0 - strb r3, [r1, o_MusicPlayerTrack_repN] + strb r3, [r1, #o_MusicPlayerTrack_repN] adds r2, 5 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] + str r2, [r1, #o_MusicPlayerTrack_cmdPtr] pop {r0} bx r0 thumb_func_end ply_rept @@ -911,7 +911,7 @@ ply_rept_2: ply_prio: mov r12, lr bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_priority] + strb r3, [r1, #o_MusicPlayerTrack_priority] bx r12 thumb_func_end ply_prio @@ -920,11 +920,11 @@ ply_tempo: mov r12, lr bl ld_r3_tp_adr_i lsls r3, 1 - strh r3, [r0, o_MusicPlayerInfo_tempoD] - ldrh r2, [r0, o_MusicPlayerInfo_tempoU] + strh r3, [r0, #o_MusicPlayerInfo_tempoD] + ldrh r2, [r0, #o_MusicPlayerInfo_tempoU] muls r3, r2 lsrs r3, 8 - strh r3, [r0, o_MusicPlayerInfo_tempoI] + strh r3, [r0, #o_MusicPlayerInfo_tempoI] bx r12 thumb_func_end ply_tempo @@ -932,35 +932,35 @@ ply_tempo: ply_keysh: mov r12, lr bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_keyShift] - ldrb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_keyShift] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] movs r2, 0xC orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_keysh thumb_func_start ply_voice ply_voice: mov r12, lr - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r1, #o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] adds r2, 1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] + str r2, [r1, #o_MusicPlayerTrack_cmdPtr] lsls r2, r3, 1 adds r2, r3 lsls r2, 2 - ldr r3, [r0, o_MusicPlayerInfo_tone] + ldr r3, [r0, #o_MusicPlayerInfo_tone] adds r2, r3 ldr r3, [r2] bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_type] + str r3, [r1, #o_MusicPlayerTrack_ToneData_type] ldr r3, [r2, 0x4] bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_wav] + str r3, [r1, #o_MusicPlayerTrack_ToneData_wav] ldr r3, [r2, 0x8] bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_attack] + str r3, [r1, #o_MusicPlayerTrack_ToneData_attack] bx r12 thumb_func_end ply_voice @@ -968,11 +968,11 @@ ply_voice: ply_vol: mov r12, lr bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_vol] - ldrb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_vol] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] movs r2, 0x3 orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_vol @@ -981,11 +981,11 @@ ply_pan: mov r12, lr bl ld_r3_tp_adr_i subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_pan] - ldrb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_pan] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] movs r2, 0x3 orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_pan @@ -994,11 +994,11 @@ ply_bend: mov r12, lr bl ld_r3_tp_adr_i subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_bend] - ldrb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_bend] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] movs r2, 0xC orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_bend @@ -1006,11 +1006,11 @@ ply_bend: ply_bendr: mov r12, lr bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_bendRange] - ldrb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_bendRange] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] movs r2, 0xC orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_bendr @@ -1018,7 +1018,7 @@ ply_bendr: ply_lfodl: mov r12, lr bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_lfoDelay] + strb r3, [r1, #o_MusicPlayerTrack_lfoDelay] bx r12 thumb_func_end ply_lfodl @@ -1026,14 +1026,14 @@ ply_lfodl: ply_modt: mov r12, lr bl ld_r3_tp_adr_i - ldrb r0, [r1, o_MusicPlayerTrack_modT] + ldrb r0, [r1, #o_MusicPlayerTrack_modT] cmp r0, r3 beq _081DD7AA - strb r3, [r1, o_MusicPlayerTrack_modT] - ldrb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_modT] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] movs r2, 0xF orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] _081DD7AA: bx r12 thumb_func_end ply_modt @@ -1043,18 +1043,18 @@ ply_tune: mov r12, lr bl ld_r3_tp_adr_i subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_tune] - ldrb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_tune] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] movs r2, 0xC orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] bx r12 thumb_func_end ply_tune thumb_func_start ply_port ply_port: mov r12, lr - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r1, #o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] adds r2, 1 ldr r0, =REG_SOUND1CNT_L @ sound register base address @@ -1072,20 +1072,20 @@ m4aSoundVSync: @ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1. ldr r2, lt2_ID_NUMBER - ldr r3, [r0, o_SoundInfo_ident] + ldr r3, [r0, #o_SoundInfo_ident] subs r3, r2 cmp r3, 1 bhi m4aSoundVSync_Done @ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA. - ldrb r1, [r0, o_SoundInfo_pcmDmaCounter] + ldrb r1, [r0, #o_SoundInfo_pcmDmaCounter] subs r1, 1 - strb r1, [r0, o_SoundInfo_pcmDmaCounter] + strb r1, [r0, #o_SoundInfo_pcmDmaCounter] bgt m4aSoundVSync_Done @ Reload the PCM DMA counter. - ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] - strb r1, [r0, o_SoundInfo_pcmDmaCounter] + ldrb r1, [r0, #o_SoundInfo_pcmDmaPeriod] + strb r1, [r0, #o_SoundInfo_pcmDmaCounter] ldr r2, =REG_DMA1 @@ -1127,18 +1127,18 @@ m4aSoundVSync_Done: thumb_func_start MPlayMain MPlayMain: ldr r2, lt2_ID_NUMBER - ldr r3, [r0, o_MusicPlayerInfo_ident] + ldr r3, [r0, #o_MusicPlayerInfo_ident] cmp r2, r3 beq _081DD82E bx lr _081DD82E: adds r3, 0x1 - str r3, [r0, o_MusicPlayerInfo_ident] + str r3, [r0, #o_MusicPlayerInfo_ident] push {r0,lr} - ldr r3, [r0, o_MusicPlayerInfo_func] + ldr r3, [r0, #o_MusicPlayerInfo_func] cmp r3, 0 beq _081DD840 - ldr r0, [r0, o_MusicPlayerInfo_intp] + ldr r0, [r0, #o_MusicPlayerInfo_intp] bl call_r3 _081DD840: pop {r0} @@ -1149,7 +1149,7 @@ _081DD840: mov r7, r11 push {r4-r7} adds r7, r0, 0 - ldr r0, [r7, o_MusicPlayerInfo_status] + ldr r0, [r7, #o_MusicPlayerInfo_status] cmp r0, 0 bge _081DD858 b _081DDA6C @@ -1159,18 +1159,18 @@ _081DD858: mov r8, r0 adds r0, r7, 0 bl FadeOutBody - ldr r0, [r7, o_MusicPlayerInfo_status] + ldr r0, [r7, #o_MusicPlayerInfo_status] cmp r0, 0 bge _081DD86C b _081DDA6C _081DD86C: - ldrh r0, [r7, o_MusicPlayerInfo_tempoC] - ldrh r1, [r7, o_MusicPlayerInfo_tempoI] + ldrh r0, [r7, #o_MusicPlayerInfo_tempoC] + ldrh r1, [r7, #o_MusicPlayerInfo_tempoI] adds r0, r1 b _081DD9BC _081DD874: - ldrb r6, [r7, o_MusicPlayerInfo_trackCount] - ldr r5, [r7, o_MusicPlayerInfo_tracks] + ldrb r6, [r7, #o_MusicPlayerInfo_trackCount] + ldr r5, [r7, #o_MusicPlayerInfo_tracks] movs r3, 0x1 movs r4, 0 _081DD87C: @@ -1183,7 +1183,7 @@ _081DD886: mov r10, r3 orrs r4, r3 mov r11, r4 - ldr r4, [r5, o_MusicPlayerTrack_chan] + ldr r4, [r5, #o_MusicPlayerTrack_chan] cmp r4, 0 beq _081DD8BA _081DD892: @@ -1209,7 +1209,7 @@ _081DD8B4: cmp r4, 0 bne _081DD892 _081DD8BA: - ldrb r3, [r5, o_MusicPlayerTrack_flags] + ldrb r3, [r5, #o_MusicPlayerTrack_flags] movs r0, 0x40 tst r0, r3 beq _081DD938 @@ -1218,33 +1218,33 @@ _081DD8BA: movs r0, 0x80 strb r0, [r5] movs r0, 0x2 - strb r0, [r5, o_MusicPlayerTrack_bendRange] + strb r0, [r5, #o_MusicPlayerTrack_bendRange] movs r0, 0x40 - strb r0, [r5, o_MusicPlayerTrack_volX] + strb r0, [r5, #o_MusicPlayerTrack_volX] movs r0, 0x16 - strb r0, [r5, o_MusicPlayerTrack_lfoSpeed] + strb r0, [r5, #o_MusicPlayerTrack_lfoSpeed] movs r0, 0x1 adds r1, r5, 0x6 - strb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6] + strb r0, [r1, #o_MusicPlayerTrack_ToneData_type - 0x6] b _081DD938 _081DD8E0: - ldr r2, [r5, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r5, #o_MusicPlayerTrack_cmdPtr] ldrb r1, [r2] cmp r1, 0x80 bhs _081DD8EC - ldrb r1, [r5, o_MusicPlayerTrack_runningStatus] + ldrb r1, [r5, #o_MusicPlayerTrack_runningStatus] b _081DD8F6 _081DD8EC: adds r2, 0x1 - str r2, [r5, o_MusicPlayerTrack_cmdPtr] + str r2, [r5, #o_MusicPlayerTrack_cmdPtr] cmp r1, 0xBD bcc _081DD8F6 - strb r1, [r5, o_MusicPlayerTrack_runningStatus] + strb r1, [r5, #o_MusicPlayerTrack_runningStatus] _081DD8F6: cmp r1, 0xCF bcc _081DD90C mov r0, r8 - ldr r3, [r0, o_SoundInfo_plynote] + ldr r3, [r0, #o_SoundInfo_plynote] adds r0, r1, 0 subs r0, 0xCF adds r1, r7, 0 @@ -1256,15 +1256,15 @@ _081DD90C: bls _081DD92E adds r0, r1, 0 subs r0, 0xB1 - strb r0, [r7, o_MusicPlayerInfo_cmd] + strb r0, [r7, #o_MusicPlayerInfo_cmd] mov r3, r8 - ldr r3, [r3, o_SoundInfo_MPlayJumpTable] + ldr r3, [r3, #o_SoundInfo_MPlayJumpTable] lsls r0, 2 ldr r3, [r3, r0] adds r0, r7, 0 adds r1, r5, 0 bl call_r3 - ldrb r0, [r5, o_MusicPlayerTrack_flags] + ldrb r0, [r5, #o_MusicPlayerTrack_flags] cmp r0, 0 beq _081DD994 b _081DD938 @@ -1273,29 +1273,29 @@ _081DD92E: subs r1, 0x80 adds r1, r0 ldrb r0, [r1] - strb r0, [r5, o_MusicPlayerTrack_wait] + strb r0, [r5, #o_MusicPlayerTrack_wait] _081DD938: - ldrb r0, [r5, o_MusicPlayerTrack_wait] + ldrb r0, [r5, #o_MusicPlayerTrack_wait] cmp r0, 0 beq _081DD8E0 subs r0, 0x1 - strb r0, [r5, o_MusicPlayerTrack_wait] - ldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed] + strb r0, [r5, #o_MusicPlayerTrack_wait] + ldrb r1, [r5, #o_MusicPlayerTrack_lfoSpeed] cmp r1, 0 beq _081DD994 - ldrb r0, [r5, o_MusicPlayerTrack_mod] + ldrb r0, [r5, #o_MusicPlayerTrack_mod] cmp r0, 0 beq _081DD994 - ldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC] + ldrb r0, [r5, #o_MusicPlayerTrack_lfoDelayC] cmp r0, 0 beq _081DD95A subs r0, 0x1 - strb r0, [r5, o_MusicPlayerTrack_lfoDelayC] + strb r0, [r5, #o_MusicPlayerTrack_lfoDelayC] b _081DD994 _081DD95A: - ldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] + ldrb r0, [r5, #o_MusicPlayerTrack_lfoSpeedC] adds r0, r1 - strb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] + strb r0, [r5, #o_MusicPlayerTrack_lfoSpeedC] adds r1, r0, 0 subs r0, 0x40 lsls r0, 24 @@ -1307,16 +1307,16 @@ _081DD96E: movs r0, 0x80 subs r2, r0, r1 _081DD972: - ldrb r0, [r5, o_MusicPlayerTrack_mod] + ldrb r0, [r5, #o_MusicPlayerTrack_mod] muls r0, r2 asrs r2, r0, 6 - ldrb r0, [r5, o_MusicPlayerTrack_modM] + ldrb r0, [r5, #o_MusicPlayerTrack_modM] eors r0, r2 lsls r0, 24 beq _081DD994 - strb r2, [r5, o_MusicPlayerTrack_modM] + strb r2, [r5, #o_MusicPlayerTrack_modM] ldrb r0, [r5] - ldrb r1, [r5, o_MusicPlayerTrack_modT] + ldrb r1, [r5, #o_MusicPlayerTrack_modT] cmp r1, 0 bne _081DD98E movs r1, 0xC @@ -1325,7 +1325,7 @@ _081DD98E: movs r1, 0x3 _081DD990: orrs r0, r1 - strb r0, [r5, o_MusicPlayerTrack_flags] + strb r0, [r5, #o_MusicPlayerTrack_flags] _081DD994: mov r3, r10 mov r4, r11 @@ -1337,29 +1337,29 @@ _081DD998: lsls r3, 1 b _081DD87C _081DD9A4: - ldr r0, [r7, o_MusicPlayerInfo_clock] + ldr r0, [r7, #o_MusicPlayerInfo_clock] adds r0, 0x1 - str r0, [r7, o_MusicPlayerInfo_clock] + str r0, [r7, #o_MusicPlayerInfo_clock] cmp r4, 0 bne _081DD9B6 movs r0, 0x80 lsls r0, 24 - str r0, [r7, o_MusicPlayerInfo_status] + str r0, [r7, #o_MusicPlayerInfo_status] b _081DDA6C _081DD9B6: - str r4, [r7, o_MusicPlayerInfo_status] - ldrh r0, [r7, o_MusicPlayerInfo_tempoC] + str r4, [r7, #o_MusicPlayerInfo_status] + ldrh r0, [r7, #o_MusicPlayerInfo_tempoC] subs r0, 0x96 _081DD9BC: - strh r0, [r7, o_MusicPlayerInfo_tempoC] + strh r0, [r7, #o_MusicPlayerInfo_tempoC] cmp r0, 0x96 bcc _081DD9C4 b _081DD874 _081DD9C4: - ldrb r2, [r7, o_MusicPlayerInfo_trackCount] - ldr r5, [r7, o_MusicPlayerInfo_tracks] + ldrb r2, [r7, #o_MusicPlayerInfo_trackCount] + ldr r5, [r7, #o_MusicPlayerInfo_tracks] _081DD9C8: - ldrb r0, [r5, o_MusicPlayerTrack_flags] + ldrb r0, [r5, #o_MusicPlayerTrack_flags] movs r1, 0x80 tst r1, r0 beq _081DDA62 @@ -1370,11 +1370,11 @@ _081DD9C8: adds r0, r7, 0 adds r1, r5, 0 bl TrkVolPitSet - ldr r4, [r5, o_MusicPlayerTrack_chan] + ldr r4, [r5, #o_MusicPlayerTrack_chan] cmp r4, 0 beq _081DDA58 _081DD9E6: - ldrb r1, [r4, o_SoundChannel_status] + ldrb r1, [r4, #o_SoundChannel_status] movs r0, 0xC7 tst r0, r1 bne _081DD9F6 @@ -1382,10 +1382,10 @@ _081DD9E6: bl ClearChain b _081DDA52 _081DD9F6: - ldrb r0, [r4, o_SoundChannel_type] + ldrb r0, [r4, #o_SoundChannel_type] movs r6, 0x7 ands r6, r0 - ldrb r3, [r5, o_MusicPlayerTrack_flags] + ldrb r3, [r5, #o_MusicPlayerTrack_flags] movs r0, 0x3 tst r0, r3 beq _081DDA14 @@ -1397,11 +1397,11 @@ _081DD9F6: orrs r0, r1 strb r0, [r4, o_CgbChannel_mo] _081DDA14: - ldrb r3, [r5, o_MusicPlayerTrack_flags] + ldrb r3, [r5, #o_MusicPlayerTrack_flags] movs r0, 0xC tst r0, r3 beq _081DDA52 - ldrb r1, [r4, o_SoundChannel_ky] + ldrb r1, [r4, #o_SoundChannel_ky] movs r0, 0x8 ldrsb r0, [r5, r0] adds r2, r1, r0 @@ -1411,9 +1411,9 @@ _081DDA28: cmp r6, 0 beq _081DDA46 mov r0, r8 - ldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq] + ldr r3, [r0, #o_SoundInfo_MidiKeyToCgbFreq] adds r1, r2, 0 - ldrb r2, [r5, o_MusicPlayerTrack_pitM] + ldrb r2, [r5, #o_MusicPlayerTrack_pitM] adds r0, r6, 0 bl call_r3 str r0, [r4, o_CgbChannel_fr] @@ -1424,19 +1424,19 @@ _081DDA28: b _081DDA52 _081DDA46: adds r1, r2, 0 - ldrb r2, [r5, o_MusicPlayerTrack_pitM] - ldr r0, [r4, o_SoundChannel_wav] + ldrb r2, [r5, #o_MusicPlayerTrack_pitM] + ldr r0, [r4, #o_SoundChannel_wav] bl MidiKeyToFreq - str r0, [r4, o_SoundChannel_freq] + str r0, [r4, #o_SoundChannel_freq] _081DDA52: - ldr r4, [r4, o_SoundChannel_np] + ldr r4, [r4, #o_SoundChannel_np] cmp r4, 0 bne _081DD9E6 _081DDA58: - ldrb r0, [r5, o_MusicPlayerTrack_flags] + ldrb r0, [r5, #o_MusicPlayerTrack_flags] movs r1, 0xF0 ands r0, r1 - strb r0, [r5, o_MusicPlayerTrack_flags] + strb r0, [r5, #o_MusicPlayerTrack_flags] mov r2, r9 _081DDA62: subs r2, 0x1 @@ -1446,7 +1446,7 @@ _081DDA62: bgt _081DD9C8 _081DDA6C: ldr r0, lt2_ID_NUMBER - str r0, [r7, o_MusicPlayerInfo_ident] + str r0, [r7, #o_MusicPlayerInfo_ident] pop {r0-r7} mov r8, r0 mov r9, r1 @@ -1467,35 +1467,35 @@ lt2_ID_NUMBER: .word ID_NUMBER TrackStop: push {r4-r6,lr} adds r5, r1, 0 - ldrb r1, [r5, o_MusicPlayerTrack_flags] + ldrb r1, [r5, #o_MusicPlayerTrack_flags] movs r0, 0x80 tst r0, r1 beq TrackStop_Done - ldr r4, [r5, o_MusicPlayerTrack_chan] + ldr r4, [r5, #o_MusicPlayerTrack_chan] cmp r4, 0 beq TrackStop_3 movs r6, 0 TrackStop_Loop: - ldrb r0, [r4, o_SoundChannel_status] + ldrb r0, [r4, #o_SoundChannel_status] cmp r0, 0 beq TrackStop_2 - ldrb r0, [r4, o_SoundChannel_type] + ldrb r0, [r4, #o_SoundChannel_type] movs r3, 0x7 ands r0, r3 beq TrackStop_1 ldr r3, =SOUND_INFO_PTR ldr r3, [r3] - ldr r3, [r3, o_SoundInfo_CgbOscOff] + ldr r3, [r3, #o_SoundInfo_CgbOscOff] bl call_r3 TrackStop_1: - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, #o_SoundChannel_status] TrackStop_2: - str r6, [r4, o_SoundChannel_track] - ldr r4, [r4, o_SoundChannel_np] + str r6, [r4, #o_SoundChannel_track] + ldr r4, [r4, #o_SoundChannel_np] cmp r4, 0 bne TrackStop_Loop TrackStop_3: - str r4, [r5, o_MusicPlayerTrack_chan] + str r4, [r5, #o_MusicPlayerTrack_chan] TrackStop_Done: pop {r4-r6} pop {r0} @@ -1550,41 +1550,41 @@ ply_note: ldr r1, =gClockTable adds r0, r1 ldrb r0, [r0] - strb r0, [r5, o_MusicPlayerTrack_gateTime] - ldr r3, [r5, o_MusicPlayerTrack_cmdPtr] + strb r0, [r5, #o_MusicPlayerTrack_gateTime] + ldr r3, [r5, #o_MusicPlayerTrack_cmdPtr] ldrb r0, [r3] cmp r0, 0x80 bhs _081DDB46 - strb r0, [r5, o_MusicPlayerTrack_key] + strb r0, [r5, #o_MusicPlayerTrack_key] adds r3, 0x1 ldrb r0, [r3] cmp r0, 0x80 bhs _081DDB44 - strb r0, [r5, o_MusicPlayerTrack_velocity] + strb r0, [r5, #o_MusicPlayerTrack_velocity] adds r3, 0x1 ldrb r0, [r3] cmp r0, 0x80 bhs _081DDB44 - ldrb r1, [r5, o_MusicPlayerTrack_gateTime] + ldrb r1, [r5, #o_MusicPlayerTrack_gateTime] adds r1, r0 - strb r1, [r5, o_MusicPlayerTrack_gateTime] + strb r1, [r5, #o_MusicPlayerTrack_gateTime] adds r3, 0x1 _081DDB44: - str r3, [r5, o_MusicPlayerTrack_cmdPtr] + str r3, [r5, #o_MusicPlayerTrack_cmdPtr] _081DDB46: movs r0, 0 str r0, [sp, 0x14] adds r4, r5, 0 - adds r4, o_MusicPlayerTrack_ToneData_type + adds r4, #o_MusicPlayerTrack_ToneData_type ldrb r2, [r4] movs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL tst r0, r2 beq _081DDB98 - ldrb r3, [r5, o_MusicPlayerTrack_key] + ldrb r3, [r5, #o_MusicPlayerTrack_key] movs r0, TONEDATA_TYPE_SPL tst r0, r2 beq _081DDB66 - ldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable] + ldr r1, [r5, #o_MusicPlayerTrack_ToneData_keySplitTable] adds r1, r3 ldrb r0, [r1] b _081DDB68 @@ -1594,7 +1594,7 @@ _081DDB68: lsls r1, r0, 1 adds r1, r0 lsls r1, 2 - ldr r0, [r5, o_MusicPlayerTrack_ToneData_wav] + ldr r0, [r5, #o_MusicPlayerTrack_ToneData_wav] adds r1, r0 mov r9, r1 mov r6, r9 @@ -1787,7 +1787,7 @@ _081DDCBC: bl call_r3 b _081DDCDC _081DDCCE: - ldr r0, [r5, o_MusicPlayerTrack_unk_3C] + ldr r0, [r5, #o_MusicPlayerTrack_unk_3C] str r0, [r4, 0x18] ldrb r2, [r5, 0x9] adds r1, r3, 0 @@ -1816,37 +1816,37 @@ _081DDCEA: thumb_func_start ply_endtie ply_endtie: push {r4,r5} - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r1, #o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] cmp r3, 0x80 bhs _081DDD16 - strb r3, [r1, o_MusicPlayerTrack_key] + strb r3, [r1, #o_MusicPlayerTrack_key] adds r2, 0x1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] + str r2, [r1, #o_MusicPlayerTrack_cmdPtr] b _081DDD18 _081DDD16: - ldrb r3, [r1, o_MusicPlayerTrack_key] + ldrb r3, [r1, #o_MusicPlayerTrack_key] _081DDD18: - ldr r1, [r1, o_MusicPlayerTrack_chan] + ldr r1, [r1, #o_MusicPlayerTrack_chan] cmp r1, 0 beq _081DDD40 movs r4, 0x83 movs r5, 0x40 _081DDD22: - ldrb r2, [r1, o_SoundChannel_status] + ldrb r2, [r1, #o_SoundChannel_status] tst r2, r4 beq _081DDD3A tst r2, r5 bne _081DDD3A - ldrb r0, [r1, o_SoundChannel_mk] + ldrb r0, [r1, #o_SoundChannel_mk] cmp r0, r3 bne _081DDD3A movs r0, 0x40 orrs r2, r0 - strb r2, [r1, o_SoundChannel_status] + strb r2, [r1, #o_SoundChannel_status] b _081DDD40 _081DDD3A: - ldr r1, [r1, o_SoundChannel_np] + ldr r1, [r1, #o_SoundChannel_np] cmp r1, 0 bne _081DDD22 _081DDD40: @@ -1857,9 +1857,9 @@ _081DDD40: thumb_func_start clear_modM clear_modM: movs r2, 0 - strb r2, [r1, o_MusicPlayerTrack_modM] - strb r2, [r1, o_MusicPlayerTrack_lfoSpeedC] - ldrb r2, [r1, o_MusicPlayerTrack_modT] + strb r2, [r1, #o_MusicPlayerTrack_modM] + strb r2, [r1, #o_MusicPlayerTrack_lfoSpeedC] + ldrb r2, [r1, #o_MusicPlayerTrack_modT] cmp r2, 0 bne _081DDD54 movs r2, 0xC @@ -1867,17 +1867,17 @@ clear_modM: _081DDD54: movs r2, 0x3 _081DDD56: - ldrb r3, [r1, o_MusicPlayerTrack_flags] + ldrb r3, [r1, #o_MusicPlayerTrack_flags] orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] + strb r3, [r1, #o_MusicPlayerTrack_flags] bx lr thumb_func_end clear_modM thumb_func_start ld_r3_tp_adr_i ld_r3_tp_adr_i_unchecked: - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldr r2, [r1, #o_MusicPlayerTrack_cmdPtr] adds r3, r2, 1 - str r3, [r1, o_MusicPlayerTrack_cmdPtr] + str r3, [r1, #o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] bx lr thumb_func_end ld_r3_tp_adr_i @@ -1886,7 +1886,7 @@ ld_r3_tp_adr_i_unchecked: ply_lfos: mov r12, lr bl ld_r3_tp_adr_i_unchecked - strb r3, [r1, o_MusicPlayerTrack_lfoSpeed] + strb r3, [r1, #o_MusicPlayerTrack_lfoSpeed] cmp r3, 0 bne _081DDD7C bl clear_modM @@ -1898,7 +1898,7 @@ _081DDD7C: ply_mod: mov r12, lr bl ld_r3_tp_adr_i_unchecked - strb r3, [r1, o_MusicPlayerTrack_mod] + strb r3, [r1, #o_MusicPlayerTrack_mod] cmp r3, 0 bne _081DDD90 bl clear_modM diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 32da4d0b4..8939edd90 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -121,9 +121,9 @@ static const u8 gRegionMapSectionId_To_PopUpThemeIdMapping[] = [MAPSEC_ROUTE_133] = MAPPOPUP_THEME_UNDERWATER, [MAPSEC_ROUTE_134] = MAPPOPUP_THEME_UNDERWATER, [MAPSEC_UNDERWATER_124] = MAPPOPUP_THEME_STONE2, - [MAPSEC_UNDERWATER_125] = MAPPOPUP_THEME_STONE2, [MAPSEC_UNDERWATER_126] = MAPPOPUP_THEME_STONE2, [MAPSEC_UNDERWATER_127] = MAPPOPUP_THEME_STONE2, + [MAPSEC_UNDERWATER_128] = MAPPOPUP_THEME_STONE2, [MAPSEC_UNDERWATER_SOOTOPOLIS] = MAPPOPUP_THEME_STONE2, [MAPSEC_GRANITE_CAVE] = MAPPOPUP_THEME_STONE, [MAPSEC_MT_CHIMNEY] = MAPPOPUP_THEME_STONE, @@ -139,7 +139,7 @@ static const u8 gRegionMapSectionId_To_PopUpThemeIdMapping[] = [MAPSEC_AQUA_HIDEOUT_OLD] = MAPPOPUP_THEME_STONE, [MAPSEC_SHOAL_CAVE] = MAPPOPUP_THEME_STONE, [MAPSEC_SEAFLOOR_CAVERN] = MAPPOPUP_THEME_STONE, - [MAPSEC_UNDERWATER_128] = MAPPOPUP_THEME_STONE2, + [MAPSEC_UNDERWATER_SEAFLOOR_CAVERN] = MAPPOPUP_THEME_STONE2, [MAPSEC_VICTORY_ROAD] = MAPPOPUP_THEME_STONE, [MAPSEC_MIRAGE_ISLAND] = MAPPOPUP_THEME_WOOD, [MAPSEC_CAVE_OF_ORIGIN] = MAPPOPUP_THEME_STONE, @@ -167,8 +167,8 @@ static const u8 gRegionMapSectionId_To_PopUpThemeIdMapping[] = [MAPSEC_MARINE_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE, [MAPSEC_UNDERWATER_MARINE_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2, [MAPSEC_TERRA_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE, - [MAPSEC_UNDERWATER_TERRA_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2, - [MAPSEC_UNDERWATER_UNK1 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2, + [MAPSEC_UNDERWATER_105 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2, + [MAPSEC_UNDERWATER_125 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2, [MAPSEC_UNDERWATER_129 - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE2, [MAPSEC_DESERT_UNDERPASS - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE, [MAPSEC_ALTERING_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE, diff --git a/src/match_call.c b/src/match_call.c index 2b3f6df8d..aaf6f29d2 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1335,7 +1335,7 @@ static void InitMatchCallTextPrinter(int windowId, const u8 *str) printerTemplate.currentY = 1; printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; - printerTemplate.unk = 0; + printerTemplate.style = 0; printerTemplate.fgColor = 10; printerTemplate.bgColor = 8; printerTemplate.shadowColor = 14; diff --git a/src/menu.c b/src/menu.c index f3334919c..85275b6bc 100644 --- a/src/menu.c +++ b/src/menu.c @@ -180,7 +180,7 @@ u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed printer.currentY = 1; printer.letterSpacing = 0; printer.lineSpacing = 0; - printer.unk = 0; + printer.style = 0; printer.fgColor = fgColor; printer.bgColor = bgColor; printer.shadowColor = shadowColor; @@ -1075,17 +1075,17 @@ s8 Menu_ProcessInputNoWrapAround_other(void) PlaySE(SE_SELECT); return sMenu.cursorPos; } - else if (gMain.newKeys & B_BUTTON) + if (gMain.newKeys & B_BUTTON) { return MENU_B_PRESSED; } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) { if (oldPos != Menu_MoveCursorNoWrapAround(-1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } - else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) { if (oldPos != Menu_MoveCursorNoWrapAround(1)) PlaySE(SE_SELECT); @@ -1130,7 +1130,7 @@ void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 l printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); - printer.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN); + printer.style = GetFontAttribute(fontId, FONTATTR_STYLE); printer.letterSpacing = letterSpacing; printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); printer.x = left; @@ -1194,7 +1194,7 @@ void sub_8198AF8(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); - printer.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN); + printer.style = GetFontAttribute(fontId, FONTATTR_STYLE); printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); @@ -1252,7 +1252,7 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); - printer.unk = GetFontAttribute(fontId, FONTATTR_UNKNOWN); + printer.style = GetFontAttribute(fontId, FONTATTR_STYLE); printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); @@ -1616,7 +1616,7 @@ void sub_81995E4(u8 windowId, u8 itemCount, const struct MenuAction *strs, const printer.fgColor = GetFontAttribute(1, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(1, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(1, FONTATTR_COLOR_SHADOW); - printer.unk = GetFontAttribute(1, FONTATTR_UNKNOWN); + printer.style = GetFontAttribute(1, FONTATTR_STYLE); printer.letterSpacing = 0; printer.lineSpacing = 0; printer.x = 8; @@ -1650,7 +1650,7 @@ void CreateYesNoMenu(const struct WindowTemplate *window, u16 baseTileNum, u8 pa printer.fgColor = GetFontAttribute(1, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(1, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(1, FONTATTR_COLOR_SHADOW); - printer.unk = GetFontAttribute(1, FONTATTR_UNKNOWN); + printer.style = GetFontAttribute(1, FONTATTR_STYLE); printer.letterSpacing = 0; printer.lineSpacing = 0; @@ -1681,7 +1681,7 @@ void sub_819983C(u8 windowId, u8 a4, u8 itemCount, u8 itemCount2, const struct M printer.fgColor = GetFontAttribute(1, FONTATTR_COLOR_FOREGROUND); printer.bgColor = GetFontAttribute(1, FONTATTR_COLOR_BACKGROUND); printer.shadowColor = GetFontAttribute(1, FONTATTR_COLOR_SHADOW); - printer.unk = GetFontAttribute(1, FONTATTR_UNKNOWN); + printer.style = GetFontAttribute(1, FONTATTR_STYLE); printer.letterSpacing = 0; printer.lineSpacing = 0; @@ -1949,7 +1949,7 @@ void AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 left, u8 top, const printer.currentY = printer.y; printer.letterSpacing = GetFontAttribute(fontId, 2); printer.lineSpacing = GetFontAttribute(fontId, 3); - printer.unk = 0; + printer.style = 0; printer.fgColor = color[1]; printer.bgColor = color[0]; printer.shadowColor = color[2]; @@ -1970,7 +1970,7 @@ void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 left, u8 top, u8 le printer.currentY = printer.y; printer.letterSpacing = letterSpacing; printer.lineSpacing = lineSpacing; - printer.unk = 0; + printer.style = 0; printer.fgColor = color[1]; printer.bgColor = color[0]; printer.shadowColor = color[2]; @@ -1991,7 +1991,7 @@ void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 left printer.currentY = top; printer.letterSpacing = letterSpacing; printer.lineSpacing = lineSpacing; - printer.unk = 0; + printer.style = 0; printer.fgColor = GetFontAttribute(fontId, 5); printer.bgColor = GetFontAttribute(fontId, 6); diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c index f5ef09cac..cd5710d44 100644 --- a/src/minigame_countdown.c +++ b/src/minigame_countdown.c @@ -262,15 +262,15 @@ static void sub_802EAB0(u8 taskId) if (gReceivedRemoteLinkPlayers != 0) { - if (gRecvCmds[0][1] == 0x7FFF) + if (gRecvCmds[0][1] == LINKCMD_0x7FFF) data[11] = gRecvCmds[0][2]; if (GetMultiplayerId() == 0) { data[12]++; memset(packet, 0, sizeof(packet)); - packet[0] = 0x7FFF; + packet[0] = LINKCMD_0x7FFF; packet[1] = data[12]; - sub_800FE50(packet); + Rfu_SendPacket(packet); } } else diff --git a/src/mirage_tower.c b/src/mirage_tower.c index fb3a0a374..c980d76df 100644 --- a/src/mirage_tower.c +++ b/src/mirage_tower.c @@ -762,8 +762,8 @@ static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) NAKED static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) { - asm_unified("\n\ - push {r4-r7,lr}\n\ + asm_unified( + "push {r4-r7,lr}\n\ mov r7, r10\n\ mov r6, r9\n\ mov r5, r8\n\ @@ -861,7 +861,6 @@ static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) pop {r4-r7}\n\ pop {r0}\n\ bx r0\n\ - .pool\n\ - "); + .pool"); } #endif // NONMATCHING diff --git a/src/move_relearner.c b/src/move_relearner.c index 5f2123362..3e7caf133 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -150,20 +150,22 @@ #define JAM_HEART_EMPTY 2 #define JAM_HEART_FULL 3 +#define MAX_RELEARNER_MOVES (MAX_LEVEL_UP_MOVES > 25 ? MAX_LEVEL_UP_MOVES : 25) + static EWRAM_DATA struct { u8 state; - u8 heartSpriteIds[16]; /*0x001*/ - u16 movesToLearn[25]; /*0x01A*/ - u8 partyMon; /*0x044*/ - u8 moveSlot; /*0x045*/ - struct ListMenuItem menuItems[25]; /*0x0E8*/ - u8 numMenuChoices; /*0x110*/ - u8 numToShowAtOnce; /*0x111*/ - u8 moveListMenuTask; /*0x112*/ - u8 moveListScrollArrowTask; /*0x113*/ - u8 moveDisplayArrowTask; /*0x114*/ - u16 scrollOffset; /*0x116*/ + u8 heartSpriteIds[16]; /*0x001*/ + u16 movesToLearn[MAX_RELEARNER_MOVES]; /*0x01A*/ + u8 partyMon; /*0x044*/ + u8 moveSlot; /*0x045*/ + struct ListMenuItem menuItems[MAX_RELEARNER_MOVES]; /*0x0E8*/ + u8 numMenuChoices; /*0x110*/ + u8 numToShowAtOnce; /*0x111*/ + u8 moveListMenuTask; /*0x112*/ + u8 moveListScrollArrowTask; /*0x113*/ + u8 moveDisplayArrowTask; /*0x114*/ + u16 scrollOffset; /*0x116*/ } *sMoveRelearnerStruct = {0}; static EWRAM_DATA struct { diff --git a/src/palette.c b/src/palette.c index eb49ce4c6..320e11ecc 100644 --- a/src/palette.c +++ b/src/palette.c @@ -52,7 +52,7 @@ static u8 UpdateFastPaletteFade(void); static u8 UpdateHardwarePaletteFade(void); static void UpdateBlendRegisters(void); static bool8 IsSoftwarePaletteFadeFinishing(void); -static void sub_80A2D54(u8 taskId); +static void Task_BlendPalettesGradually(u8 taskId); // palette buffers require alignment with agbcc because // unaligned word reads are issued in BlendPalette otherwise @@ -940,91 +940,105 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b } } -void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7) +#define tCoeff data[0] +#define tCoeffTarget data[1] +#define tCoeffDelta data[2] +#define tDelay data[3] +#define tDelayTimer data[4] +#define tPalettes 5 // data[5] and data[6], set/get via Set/GetWordTaskArg +#define tColor data[7] +#define tId data[8] + +// Blend the selected palettes in a series of steps toward or away from the color. +// Only used by the Groudon/Kyogre fight scene to flash the screen for lightning +// One call is used to fade the bg from white, while another fades the duo from black +void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id) { u8 taskId; - taskId = CreateTask((void *)sub_80A2D54, a6); - gTasks[taskId].data[0] = a3; - gTasks[taskId].data[1] = a4; + taskId = CreateTask((void *)Task_BlendPalettesGradually, priority); + gTasks[taskId].tCoeff = coeff; + gTasks[taskId].tCoeffTarget = coeffTarget; - if (a2 >= 0) + if (delay >= 0) { - gTasks[taskId].data[3] = a2; - gTasks[taskId].data[2] = 1; + gTasks[taskId].tDelay = delay; + gTasks[taskId].tCoeffDelta = 1; } else { - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[2] = -a2 + 1; + gTasks[taskId].tDelay = 0; + gTasks[taskId].tCoeffDelta = -delay + 1; } - if (a4 < a3) - gTasks[taskId].data[2] *= -1; + if (coeffTarget < coeff) + gTasks[taskId].tCoeffDelta *= -1; - SetWordTaskArg(taskId, 5, a1); - gTasks[taskId].data[7] = a5; - gTasks[taskId].data[8] = a7; + SetWordTaskArg(taskId, tPalettes, selectedPalettes); + gTasks[taskId].tColor = color; + gTasks[taskId].tId = id; gTasks[taskId].func(taskId); } -bool32 sub_80A2CF8(u8 var) +// Unused +static bool32 IsBlendPalettesGraduallyTaskActive(u8 id) { int i; - for (i = 0; i < NUM_TASKS; i++) // check all the tasks. - if ((gTasks[i].isActive == TRUE) && (gTasks[i].func == sub_80A2D54) && (gTasks[i].data[8] == var)) + for (i = 0; i < NUM_TASKS; i++) + if ((gTasks[i].isActive == TRUE) + && (gTasks[i].func == Task_BlendPalettesGradually) + && (gTasks[i].tId == id)) return TRUE; return FALSE; } -void sub_80A2D34(void) +// Unused +static void DestroyBlendPalettesGraduallyTask(void) { u8 taskId; while (1) { - taskId = FindTaskIdByFunc(sub_80A2D54); + taskId = FindTaskIdByFunc(Task_BlendPalettesGradually); if (taskId == 0xFF) break; DestroyTask(taskId); } } -void sub_80A2D54(u8 taskId) +static void Task_BlendPalettesGradually(u8 taskId) { - u32 wordVar; + u32 palettes; s16 *data; - s16 temp; + s16 target; data = gTasks[taskId].data; - wordVar = GetWordTaskArg(taskId, 5); + palettes = GetWordTaskArg(taskId, tPalettes); - if (++data[4] > data[3]) + if (++tDelayTimer > tDelay) { - data[4] = 0; - BlendPalettes(wordVar, data[0], data[7]); - temp = data[1]; - if (data[0] == temp) + tDelayTimer = 0; + BlendPalettes(palettes, tCoeff, tColor); + target = tCoeffTarget; + if (tCoeff == target) { DestroyTask(taskId); } else { - data[0] += data[2]; - if (data[2] >= 0) + tCoeff += tCoeffDelta; + if (tCoeffDelta >= 0) { - if (data[0] < temp) - { + if (tCoeff < target) return; - } } - else if (data[0] > temp) + else if (tCoeff > target) { return; } - data[0] = temp; + tCoeff = target; } } } diff --git a/src/pokeball.c b/src/pokeball.c index 829d22863..b176677bd 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -166,43 +166,43 @@ static const union AnimCmd *const sBallAnimSequences[] = sBallAnimSeq6, }; -static const union AffineAnimCmd sBallAffineAnimSeq0[] = +static const union AffineAnimCmd sAffineAnim_BallRotate_0[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd sBallAffineAnimSeq1[] = +static const union AffineAnimCmd sAffineAnim_BallRotate_Right[] = { AFFINEANIMCMD_FRAME(0, 0, -3, 1), AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd sBallAffineAnimSeq2[] = +static const union AffineAnimCmd sAffineAnim_BallRotate_Left[] = { AFFINEANIMCMD_FRAME(0, 0, 3, 1), AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd sBallAffineAnimSeq3[] = +static const union AffineAnimCmd sAffineAnim_BallRotate_3[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd sBallAffineAnimSeq4[] = +static const union AffineAnimCmd sAffineAnim_BallRotate_4[] = { AFFINEANIMCMD_FRAME(0, 0, 25, 1), AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd *const sBallAffineAnimSequences[] = +static const union AffineAnimCmd *const sAffineAnim_BallRotate[] = { - sBallAffineAnimSeq0, - sBallAffineAnimSeq1, - sBallAffineAnimSeq2, - sBallAffineAnimSeq3, - sBallAffineAnimSeq4, + [BALL_AFFINE_ANIM_0] = sAffineAnim_BallRotate_0, + [BALL_ROTATE_RIGHT] = sAffineAnim_BallRotate_Right, + [BALL_ROTATE_LEFT] = sAffineAnim_BallRotate_Left, + [BALL_AFFINE_ANIM_3] = sAffineAnim_BallRotate_3, + [BALL_AFFINE_ANIM_4] = sAffineAnim_BallRotate_4, }; const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = @@ -213,7 +213,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -222,7 +222,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -231,7 +231,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -240,7 +240,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -249,7 +249,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -258,7 +258,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -267,7 +267,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -276,7 +276,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -285,7 +285,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -294,7 +294,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -303,7 +303,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, { @@ -312,7 +312,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, - .affineAnims = sBallAffineAnimSequences, + .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_TestBallThrow, }, }; @@ -446,6 +446,7 @@ static void sub_80756D4(struct Sprite *sprite) sprite->callback = sub_80756E0; } +// Start something for battler static void sub_80756E0(struct Sprite *sprite) { if (++sprite->data[5] == 10) @@ -458,6 +459,7 @@ static void sub_80756E0(struct Sprite *sprite) } } +// Shrink player static void sub_807574C(struct Sprite *sprite) { sprite->data[5]++; @@ -738,7 +740,7 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) StartSpriteAnim(sprite, 1); ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId)); AnimateBallOpenParticles(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, ballId); - sprite->data[0] = LaunchBallFadeMonTask(1, sprite->sBattler, 14, ballId); + sprite->data[0] = LaunchBallFadeMonTask(TRUE, sprite->sBattler, 14, ballId); sprite->callback = HandleBallAnimEnd; if (gMain.inBattle) diff --git a/src/pokeblock.c b/src/pokeblock.c index 025adf875..fc5451b0a 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -180,21 +180,21 @@ static const struct BgTemplate sBgTemplatesForPokeblockMenu[] = const u8 *const gPokeblockNames[] = { - NULL, - gText_RedPokeblock, - gText_BluePokeblock, - gText_PinkPokeblock, - gText_GreenPokeblock, - gText_YellowPokeblock, - gText_PurplePokeblock, - gText_IndigoPokeblock, - gText_BrownPokeblock, - gText_LiteBluePokeblock, - gText_OlivePokeblock, - gText_GrayPokeblock, - gText_BlackPokeblock, - gText_WhitePokeblock, - gText_GoldPokeblock + [PBLOCK_CLR_NONE] = NULL, + [PBLOCK_CLR_RED] = gText_RedPokeblock, + [PBLOCK_CLR_BLUE] = gText_BluePokeblock, + [PBLOCK_CLR_PINK] = gText_PinkPokeblock, + [PBLOCK_CLR_GREEN] = gText_GreenPokeblock, + [PBLOCK_CLR_YELLOW] = gText_YellowPokeblock, + [PBLOCK_CLR_PURPLE] = gText_PurplePokeblock, + [PBLOCK_CLR_INDIGO] = gText_IndigoPokeblock, + [PBLOCK_CLR_BROWN] = gText_BrownPokeblock, + [PBLOCK_CLR_LITE_BLUE] = gText_LiteBluePokeblock, + [PBLOCK_CLR_OLIVE] = gText_OlivePokeblock, + [PBLOCK_CLR_GRAY] = gText_GrayPokeblock, + [PBLOCK_CLR_BLACK] = gText_BlackPokeblock, + [PBLOCK_CLR_WHITE] = gText_WhitePokeblock, + [PBLOCK_CLR_GOLD] = gText_GoldPokeblock }; static const struct MenuAction sPokeblockMenuActions[] = @@ -430,7 +430,7 @@ static const struct ListMenuTemplate sPokeblockListMenuTemplate = // code void OpenPokeblockCase(u8 caseId, void (*callback)(void)) { - sPokeblockMenu = Alloc(sizeof(*sPokeblockMenu)); + sPokeblockMenu = Alloc(sizeof(struct PokeblockMenuStruct)); sPokeblockMenu->caseId = caseId; sPokeblockMenu->callbackOnUse = NULL; sPokeblockMenu->unkTaskId = 0xFF; @@ -726,7 +726,7 @@ static void PutPokeblockListMenuString(u8 *dst, u16 pkblId) *(txtPtr++) = EXT_CTRL_CODE_BEGIN; *(txtPtr++) = EXT_CTRL_CODE_SKIP; - *(txtPtr++) = 87; + *(txtPtr++) = CHAR_BLOCK_1; ConvertIntToDecimalStringN(gStringVar1, GetHighestPokeblocksFlavorLevel(pkblock), STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(txtPtr, gText_LvVar1); @@ -804,7 +804,7 @@ static void CompactPokeblockSlots(void) { for (j = i + 1; j < POKEBLOCKS_COUNT; j++) { - if (gSaveBlock1Ptr->pokeblocks[i].color == 0) + if (gSaveBlock1Ptr->pokeblocks[i].color == PBLOCK_CLR_NONE) { struct Pokeblock temp = gSaveBlock1Ptr->pokeblocks[i]; gSaveBlock1Ptr->pokeblocks[i] = gSaveBlock1Ptr->pokeblocks[j]; @@ -856,7 +856,7 @@ static void SetMenuItemsCountAndMaxShowed(void) for (sPokeblockMenu->itemsNo = 0, i = 0; i < POKEBLOCKS_COUNT; i++) { - if (gSaveBlock1Ptr->pokeblocks[i].color != 0) + if (gSaveBlock1Ptr->pokeblocks[i].color != PBLOCK_CLR_NONE) sPokeblockMenu->itemsNo++; } @@ -1322,7 +1322,7 @@ s8 GetFirstFreePokeblockSlot(void) for (i = 0; i < POKEBLOCKS_COUNT; i++) { - if (gSaveBlock1Ptr->pokeblocks[i].color == 0) + if (gSaveBlock1Ptr->pokeblocks[i].color == PBLOCK_CLR_NONE) return i; } @@ -1346,7 +1346,7 @@ bool32 AddPokeblock(const struct Pokeblock *pokeblock) bool32 TryClearPokeblock(u8 pkblId) { - if (gSaveBlock1Ptr->pokeblocks[pkblId].color == 0) + if (gSaveBlock1Ptr->pokeblocks[pkblId].color == PBLOCK_CLR_NONE) { return FALSE; } diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c index e15a005e6..797771f80 100644 --- a/src/pokeblock_feed.c +++ b/src/pokeblock_feed.c @@ -382,22 +382,23 @@ static const struct WindowTemplate sWindowTemplates[] = DUMMY_WIN_TEMPLATE }; +// - 1 excludes PBLOCK_CLR_NONE static const u32* const sPokeblocksPals[] = { - gPokeblockRed_Pal, - gPokeblockBlue_Pal, - gPokeblockPink_Pal, - gPokeblockGreen_Pal, - gPokeblockYellow_Pal, - gPokeblockPurple_Pal, - gPokeblockIndigo_Pal, - gPokeblockBrown_Pal, - gPokeblockLiteBlue_Pal, - gPokeblockOlive_Pal, - gPokeblockGray_Pal, - gPokeblockBlack_Pal, - gPokeblockWhite_Pal, - gPokeblockGold_Pal + [PBLOCK_CLR_RED - 1] = gPokeblockRed_Pal, + [PBLOCK_CLR_BLUE - 1] = gPokeblockBlue_Pal, + [PBLOCK_CLR_PINK - 1] = gPokeblockPink_Pal, + [PBLOCK_CLR_GREEN - 1] = gPokeblockGreen_Pal, + [PBLOCK_CLR_YELLOW - 1] = gPokeblockYellow_Pal, + [PBLOCK_CLR_PURPLE - 1] = gPokeblockPurple_Pal, + [PBLOCK_CLR_INDIGO - 1] = gPokeblockIndigo_Pal, + [PBLOCK_CLR_BROWN - 1] = gPokeblockBrown_Pal, + [PBLOCK_CLR_LITE_BLUE - 1] = gPokeblockLiteBlue_Pal, + [PBLOCK_CLR_OLIVE - 1] = gPokeblockOlive_Pal, + [PBLOCK_CLR_GRAY - 1] = gPokeblockGray_Pal, + [PBLOCK_CLR_BLACK - 1] = gPokeblockBlack_Pal, + [PBLOCK_CLR_WHITE - 1] = gPokeblockWhite_Pal, + [PBLOCK_CLR_GOLD - 1] = gPokeblockGold_Pal }; static const union AffineAnimCmd sSpriteAffineAnim_84120DC[] = diff --git a/src/pokedex.c b/src/pokedex.c index a86c22153..4f41c5557 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -172,16 +172,16 @@ struct PokedexView u16 ownCount; u16 monSpriteIds[MAX_MONS_ON_SCREEN]; u16 selectedMonSpriteId; - u16 pokeBallRotationStep; - u16 pokeBallRotationBackup; + s16 pokeBallRotationStep; + s16 pokeBallRotationBackup; u8 pokeBallRotation; u8 initialVOffset; u8 scrollTimer; u8 scrollDirection; s16 listVOffset; s16 listMovingVOffset; - u16 scrollMonIncrement; - u16 maxScrollTimer; + s16 scrollMonIncrement; + s16 maxScrollTimer; u16 scrollSpeed; u16 unkArr1[4]; // Cleared, never read u8 filler[8]; @@ -2060,10 +2060,10 @@ static bool8 LoadPokedexListPage(u8 page) SetGpuReg(REG_OFFSET_BG2VOFS, sPokedexView->initialVOffset); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sPokedex_BgTemplate, ARRAY_COUNT(sPokedex_BgTemplate)); - SetBgTilemapBuffer(3, AllocZeroed(0x800)); - SetBgTilemapBuffer(2, AllocZeroed(0x800)); - SetBgTilemapBuffer(1, AllocZeroed(0x800)); - SetBgTilemapBuffer(0, AllocZeroed(0x800)); + SetBgTilemapBuffer(3, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(2, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(1, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(0, AllocZeroed(BG_SCREEN_SIZE)); DecompressAndLoadBgGfxUsingHeap(3, gPokedexMenu_Gfx, 0x2000, 0, 0); CopyToBgTilemapBuffer(1, gPokedexList_Tilemap, 0, 0); CopyToBgTilemapBuffer(3, gPokedexListUnderlay_Tilemap, 0, 0); @@ -3186,10 +3186,10 @@ static u8 LoadInfoScreen(struct PokedexListItem* item, u8 monSpriteId) gTasks[taskId].data[5] = 255; ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sInfoScreen_BgTemplate, ARRAY_COUNT(sInfoScreen_BgTemplate)); - SetBgTilemapBuffer(3, AllocZeroed(0x800)); - SetBgTilemapBuffer(2, AllocZeroed(0x800)); - SetBgTilemapBuffer(1, AllocZeroed(0x800)); - SetBgTilemapBuffer(0, AllocZeroed(0x800)); + SetBgTilemapBuffer(3, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(2, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(1, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(0, AllocZeroed(BG_SCREEN_SIZE)); InitWindows(sInfoScreen_WindowTemplates); DeactivateAllTextPrinters(); @@ -3951,8 +3951,8 @@ static void Task_DisplayCaughtMonDexPage(u8 taskId) ResetOtherVideoRegisters(DISPCNT_BG0_ON); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sNewEntryInfoScreen_BgTemplate, ARRAY_COUNT(sNewEntryInfoScreen_BgTemplate)); - SetBgTilemapBuffer(3, AllocZeroed(0x800)); - SetBgTilemapBuffer(2, AllocZeroed(0x800)); + SetBgTilemapBuffer(3, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(2, AllocZeroed(BG_SCREEN_SIZE)); InitWindows(sNewEntryInfoScreen_WindowTemplates); DeactivateAllTextPrinters(); gTasks[taskId].tState = 1; @@ -4820,10 +4820,10 @@ static void Task_LoadSearchMenu(u8 taskId) ResetOtherVideoRegisters(0); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sSearchMenu_BgTemplate, ARRAY_COUNT(sSearchMenu_BgTemplate)); - SetBgTilemapBuffer(3, AllocZeroed(0x800)); - SetBgTilemapBuffer(2, AllocZeroed(0x800)); - SetBgTilemapBuffer(1, AllocZeroed(0x800)); - SetBgTilemapBuffer(0, AllocZeroed(0x800)); + SetBgTilemapBuffer(3, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(2, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(1, AllocZeroed(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(0, AllocZeroed(BG_SCREEN_SIZE)); InitWindows(sSearchMenu_WindowTemplate); DeactivateAllTextPrinters(); PutWindowTilemap(0); @@ -5258,11 +5258,11 @@ void SetSearchRectHighlight(u8 flags, u8 x, u8 y, u8 width) } } #else -__attribute__((naked)) +NAKED void SetSearchRectHighlight(u8 flags, u8 x, u8 y, u8 width) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ + asm_unified( + "push {r4-r7,lr}\n\ mov r7, r8\n\ push {r7}\n\ adds r4, r3, 0\n\ @@ -5310,8 +5310,7 @@ _080C1DEC:\n\ pop {r4-r7}\n\ pop {r0}\n\ bx r0\n\ - .pool\n\ - .syntax divided\n"); + .pool"); } #endif diff --git a/src/pokemon.c b/src/pokemon.c index 7cde8e0a6..188624d6a 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -6138,7 +6138,7 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) for (i = 0; i < MAX_MON_MOVES; i++) learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - for (i = 0; i < 20; i++) + for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) { u16 moveLevel; @@ -6171,7 +6171,7 @@ u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) u8 numMoves = 0; int i; - for (i = 0; i < 20 && gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++) + for (i = 0; i < MAX_LEVEL_UP_MOVES && gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++) moves[numMoves++] = gLevelUpLearnsets[species][i] & LEVEL_UP_MOVE_ID; return numMoves; @@ -6180,7 +6180,7 @@ u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) { u16 learnedMoves[MAX_MON_MOVES]; - u16 moves[20]; + u16 moves[MAX_LEVEL_UP_MOVES]; u8 numMoves = 0; u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); @@ -6192,7 +6192,7 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) for (i = 0; i < MAX_MON_MOVES; i++) learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - for (i = 0; i < 20; i++) + for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) { u16 moveLevel; diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index 96774c0bb..07f6bc54b 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -406,7 +406,7 @@ void StartPokemonJump(u16 partyIndex, MainCallback callback) if (gReceivedRemoteLinkPlayers) { - gUnknown_02022CFC = Alloc(sizeof(*gUnknown_02022CFC)); + gUnknown_02022CFC = Alloc(sizeof(struct PokemonJump1)); if (gUnknown_02022CFC) { ResetTasks(); @@ -3684,14 +3684,14 @@ static void sub_802E0AC(struct PokemonJump1_MonInfo *arg0) packet.species = arg0->species, packet.otId = arg0->otId, packet.personality = arg0->personality, - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } static bool32 sub_802E0D0(int multiplayerId, struct PokemonJump1_MonInfo *arg0) { struct MonInfoPacket packet; - if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); @@ -3718,7 +3718,7 @@ static void sub_802E120(u32 arg0) struct UnkPacket2 packet; packet.id = 2; packet.unk4 = arg0; - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } struct UnkPacket3 @@ -3746,14 +3746,14 @@ static void sub_802E138(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub * packet.unk2 = arg0->unk10; packet.unk3_1 = arg0->unk14; packet.unk4 = arg0->unkE; - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } static bool32 sub_802E1BC(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1) { struct UnkPacket3 packet; - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[0][1], sizeof(packet)); @@ -3792,14 +3792,14 @@ static void sub_802E234(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2) packet.unk4 = arg0->unkE; packet.unk6 = arg1; packet.unk8 = arg2; - sub_800FE50(&packet); + Rfu_SendPacket(&packet); } static bool32 sub_802E264(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3) { struct UnkPacket4 packet; - if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); @@ -3819,7 +3819,7 @@ static bool32 sub_802E2D0(struct PokemonJump1_82E4 *arg0, int multiplayerId) { struct UnkPacket4 packet; - if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) + if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 546f50dce..fcca744c2 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -2157,7 +2157,7 @@ static void Cb2_EnterPSS(u8 boxOption) { ResetTasks(); sCurrentBoxOption = boxOption; - sPSSData = Alloc(sizeof(*sPSSData)); + sPSSData = Alloc(sizeof(struct PokemonStorageSystemData)); if (sPSSData == NULL) { SetMainCallback2(Cb2_ExitPSS); @@ -2177,7 +2177,7 @@ static void Cb2_EnterPSS(u8 boxOption) static void Cb2_ReturnToPSS(void) { ResetTasks(); - sPSSData = Alloc(sizeof(*sPSSData)); + sPSSData = Alloc(sizeof(struct PokemonStorageSystemData)); if (sPSSData == NULL) { SetMainCallback2(Cb2_ExitPSS); diff --git a/src/pokenav.c b/src/pokenav.c index 8ea33575a..30dc001c3 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -317,7 +317,7 @@ static void Task_RunLoopedTask_LinkMode(u8 taskId) void CB2_InitPokeNav(void) { - gPokenavResources = Alloc(sizeof(*gPokenavResources)); + gPokenavResources = Alloc(sizeof(struct PokenavResources)); if (gPokenavResources == NULL) { SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); @@ -345,7 +345,7 @@ static void CB2_InitPokenavForTutorial(void) if (gPaletteFade.active) return; - gPokenavResources = Alloc(sizeof(*gPokenavResources)); + gPokenavResources = Alloc(sizeof(struct PokenavResources)); if (gPokenavResources == NULL) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index 155e30939..0e2425d4e 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -293,7 +293,7 @@ static const struct SpriteTemplate sUnknown_0861FB44 = bool32 InitPokenavMainMenu(void) { struct PokenavMainMenuResources *structPtr; - + structPtr = AllocSubstruct(0, sizeof(struct PokenavMainMenuResources)); if (structPtr == NULL) return FALSE; @@ -474,8 +474,8 @@ void sub_81C7990(u32 a0, u16 a1) NAKED void sub_81C79BC(const u16 *a0, const u16 *a1, u32 a2, u32 a3, u32 a4, u16 *a5) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ + asm_unified( + "push {r4-r7,lr}\n\ mov r7, r10\n\ mov r6, r9\n\ mov r5, r8\n\ @@ -603,8 +603,7 @@ _081C7AAE:\n\ mov r10, r5\n\ pop {r4-r7}\n\ pop {r0}\n\ - bx r0\n\ - .syntax divided"); + bx r0"); } void PokenavFadeScreen(s32 fadeType) diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index f47ab5e89..063e6f324 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -18,87 +18,139 @@ #include "constants/rgb.h" #include "random.h" -struct RaySceneStruct -{ - MainCallback callback; - u8 tilemapBuffers[4][0x800]; - u16 field_2004; // set but unused +/* + This file handles the cutscene showing Rayquaza arriving to settle the Groudon/Kyogre fight + It consists of 5 separate scenes: + - Groudon and Kyogre facing one another in a thunderstorm (RAY_ANIM_DUO_FIGHT) + - Over-the-shoulder of Rayquaza flying (RAY_ANIM_TAKES_FLIGHT) + - Rayquaza emerging from a spotlight down through the clouds (RAY_ANIM_DESCENDS) + - A close-up of Rayquaza flying down (RAY_ANIM_CHARGES) + - Rayquaza floating above Groudon/Kyogre as they back away offscreen (RAY_ANIM_CHASES_AWAY) + + A shortened version of the first scene is used when the player first arrives + in Sootopolis during the Groudon/Kyogre conflict, before awakening Rayquaza (RAY_ANIM_DUO_FIGHT_PRE) + This is indicated with the first two arguments to DoRayquazaScene +*/ + +enum +{ + RAY_ANIM_DUO_FIGHT_PRE, + RAY_ANIM_DUO_FIGHT, + RAY_ANIM_TAKES_FLIGHT, + RAY_ANIM_DESCENDS, + RAY_ANIM_CHARGES, + RAY_ANIM_CHASES_AWAY, + RAY_ANIM_END +}; + +#define TAG_DUOFIGHT_GROUDON 30505 +#define TAG_DUOFIGHT_GROUDON_SHOULDER 30506 +#define TAG_DUOFIGHT_GROUDON_CLAW 30507 +#define TAG_DUOFIGHT_KYOGRE 30508 +#define TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN 30509 +#define TAG_DUOFIGHT_KYOGRE_DORSAL_FIN 30510 +#define TAG_FLIGHT_SMOKE 30555 +#define TAG_DESCENDS_RAYQUAZA 30556 +#define TAG_DESCENDS_RAYQUAZA_TAIL 30557 +#define TAG_CHASE_GROUDON 30565 +#define TAG_CHASE_GROUDON_TAIL 30566 +#define TAG_CHASE_KYOGRE 30568 +#define TAG_CHASE_RAYQUAZA 30569 +#define TAG_CHASE_RAYQUAZA_TAIL 30570 +#define TAG_CHASE_SPLASH 30571 + +#define MAX_SMOKE 10 + +struct RayquazaScene +{ + MainCallback exitCallback; + u8 tilemapBuffers[4][BG_SCREEN_SIZE]; + u16 unk; // never read u8 animId; - bool8 onlyOneAnim; - s16 field_2008; - s16 field_200A; - u8 unusedFields[12]; // completely unused -}; - -// EWRAM vars -static EWRAM_DATA struct RaySceneStruct *sRayScene = NULL; - -// this file's functions -static void Task_DuoFightAnim(u8 taskId); -static void Task_RayTakesFlightAnim(u8 taskId); -static void Task_RayDescendsAnim(u8 taskId); -static void Task_RayChargesAnim(u8 taskId); -static void Task_RayChasesAwayAnim(u8 taskId); -static void Task_HandleRayDescends(u8 taskId); -static void Task_RayDescendsEnd(u8 taskId); -static void Task_HandleRayCharges(u8 taskId); -static void sub_81D8AD8(u8 taskId); -static void sub_81D8B2C(u8 taskId); -static void Task_RayChargesEnd(u8 taskId); -static void Task_HandleRayChasesAway(u8 taskId); -static void sub_81D8FB0(u8 taskId); -static void sub_81D7228(u8 taskId); -static void Task_HandleDuoFight(u8 taskId); -static void sub_81D752C(u8 taskId); -static void Task_DuoFightEnd(u8 taskId); -static void Task_HandleRayTakesFlight(u8 taskId); -static void sub_81D81A4(u8 taskId); -static void Task_RayTakesFlightEnd(u8 taskId); -static void sub_81D94D4(u8 taskId); -static void sub_81D93D8(u8 taskId); -static void Task_RayChasesAwayEnd(u8 taskId); -static void sub_81D90A8(u8 taskId); -static void sub_81D98B4(u8 taskId); -static void Task_EndAfterFadeScreen(u8 taskId); + bool8 endEarly; + s16 revealedLightLine; + s16 revealedLightTimer; + u8 unused[12]; +}; + +static EWRAM_DATA struct RayquazaScene *sRayScene = NULL; + static void CB2_InitRayquazaScene(void); static void CB2_RayquazaScene(void); -static void sub_81D750C(void); -static void sub_81D7438(void); -static void sub_81D7480(void); -static void sub_81D74C8(void); -static void sub_81D8BB4(void); -static void sub_81D6A20(struct Sprite *sprite); -static void sub_81D6D20(struct Sprite *sprite); -static void sub_81D7860(struct Sprite *sprite); -static void sub_81D7D14(struct Sprite *sprite); -static void sub_81D7700(struct Sprite *sprite); -static void sub_81D7A60(struct Sprite *sprite); -static void sub_81D874C(struct Sprite *sprite); -static void sub_81D9338(struct Sprite *sprite); -static void sub_81D9420(struct Sprite *sprite); -static void sub_81D8260(struct Sprite *sprite); -static void sub_81D961C(struct Sprite *sprite); -static void sub_81D97E0(struct Sprite *sprite); -static void sub_81D9528(struct Sprite *sprite); -static u8 sub_81D7664(void); -static u8 sub_81D78BC(void); -static u8 sub_81D86CC(void); -static void DuoFightEnd(u8 taskId, s8 palDelay); -static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y); - -// const rom data +static void Task_EndAfterFadeScreen(u8); + +// RAY_ANIM_DUO_FIGHT_PRE / RAY_ANIM_DUO_FIGHT +static void Task_DuoFightAnim(u8); +static void Task_HandleDuoFight(u8); +static void Task_DuoFightEnd(u8); +static void DuoFightEnd(u8, s8); +static void Task_DuoFight_AnimateClouds(u8); +static void DuoFight_PanOffScene(u8); +static void DuoFight_AnimateRain(void); +static void DuoFight_Lightning1(void); +static void DuoFight_Lightning2(void); +static void DuoFight_LightningLong(void); +static u8 DuoFightPre_CreateGroudonSprites(void); +static u8 DuoFightPre_CreateKyogreSprites(void); +static u8 DuoFight_CreateGroudonSprites(void); +static u8 DuoFight_CreateKyogreSprites(void); +static void SpriteCB_DuoFightPre_Groudon(struct Sprite *); +static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *); +static void SpriteCB_DuoFight_Groudon(struct Sprite *); +static void SpriteCB_DuoFight_Kyogre(struct Sprite *); +static void DuoFight_SlideGroudonDown(struct Sprite *); +static void DuoFight_SlideKyogreDown(struct Sprite *); + +// RAY_ANIM_TAKES_FLIGHT +static void Task_RayTakesFlightAnim(u8); +static void Task_HandleRayTakesFlight(u8); +static void Task_RayTakesFlightEnd(u8); +static void Task_TakesFlight_CreateSmoke(u8); +static void SpriteCB_TakesFlight_Smoke(struct Sprite *); + +// RAY_ANIM_DESCENDS +static void Task_RayDescendsAnim(u8); +static void Task_HandleRayDescends(u8); +static void Task_RayDescendsEnd(u8); +static u8 CreateDescendsRayquazaSprite(void); +static void SpriteCB_Descends_Rayquaza(struct Sprite *); + +// RAY_ANIM_CHARGES +static void Task_RayChargesAnim(u8); +static void Task_HandleRayCharges(u8); +static void Task_RayChargesEnd(u8); +static void Task_RayCharges_ShakeRayquaza(u8); +static void Task_RayCharges_FlyOffscreen(u8); +static void RayCharges_AnimateBg(void); + +// RAY_ANIM_CHASES_AWAY +static void Task_RayChasesAwayAnim(u8); +static void Task_HandleRayChasesAway(u8); +static void Task_RayChasesAwayEnd(u8); +static void Task_ChasesAway_AnimateBg(u8); +static void ChasesAway_KyogreStartLeave(u8); +static void ChasesAway_GroudonStartLeave(u8); +static void ChasesAway_CreateTrioSprites(u8); +static void Task_ChasesAway_AnimateRing(u8); +static void SpriteCB_ChasesAway_GroudonLeave(struct Sprite *); +static void SpriteCB_ChasesAway_KyogreLeave(struct Sprite *); +static void SpriteCB_ChasesAway_RayquazaFloat(struct Sprite *); +static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *); +static void SpriteCB_ChasesAway_DuoRingPush(struct Sprite *); +static void ChasesAway_SetRayquazaAnim(struct Sprite *, u8, s16, s16); + static const TaskFunc sTasksForAnimations[] = { [RAY_ANIM_DUO_FIGHT_PRE] = Task_DuoFightAnim, - [RAY_ANIM_DUO_FIGHT] = Task_DuoFightAnim, - [RAY_ANIM_TAKES_FLIGHT] = Task_RayTakesFlightAnim, - [RAY_ANIM_DESCENDS] = Task_RayDescendsAnim, - [RAY_ANIM_CHARGES] = Task_RayChargesAnim, - [RAY_ANIM_CHACES_AWAY] = Task_RayChasesAwayAnim, - [RAY_ANIM_END] = Task_EndAfterFadeScreen, + [RAY_ANIM_DUO_FIGHT] = Task_DuoFightAnim, + [RAY_ANIM_TAKES_FLIGHT] = Task_RayTakesFlightAnim, + [RAY_ANIM_DESCENDS] = Task_RayDescendsAnim, + [RAY_ANIM_CHARGES] = Task_RayChargesAnim, + [RAY_ANIM_CHASES_AWAY] = Task_RayChasesAwayAnim, + [RAY_ANIM_END] = Task_EndAfterFadeScreen, }; -static const struct OamData sOamData_862A6BC = +static const struct OamData sOam_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -115,7 +167,7 @@ static const struct OamData sOamData_862A6BC = .affineParam = 0 }; -static const struct OamData sOamData_862A6C4 = +static const struct OamData sOam_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -132,7 +184,7 @@ static const struct OamData sOamData_862A6C4 = .affineParam = 0 }; -static const struct OamData sOamData_862A6CC = +static const struct OamData sOam_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -149,7 +201,7 @@ static const struct OamData sOamData_862A6CC = .affineParam = 0 }; -static const struct OamData sOamData_862A6D4 = +static const struct OamData sOam_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -166,7 +218,7 @@ static const struct OamData sOamData_862A6D4 = .affineParam = 0 }; -static const struct OamData sOamData_862A6DC = +static const struct OamData sOam_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -183,7 +235,7 @@ static const struct OamData sOamData_862A6DC = .affineParam = 0 }; -static const struct OamData sOamData_862A6E4 = +static const struct OamData sOam_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -200,7 +252,7 @@ static const struct OamData sOamData_862A6E4 = .affineParam = 0 }; -static const struct OamData sOamData_862A6EC = +static const struct OamData sOam_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -217,7 +269,7 @@ static const struct OamData sOamData_862A6EC = .affineParam = 0 }; -static const struct OamData sOamData_862A6F4 = +static const struct OamData sOam_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -234,7 +286,7 @@ static const struct OamData sOamData_862A6F4 = .affineParam = 0 }; -static const union AnimCmd sSpriteAnim_862A6FC[] = +static const union AnimCmd sAnim_DuoFightPre_Groudon_Head[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(64, 30), @@ -243,7 +295,7 @@ static const union AnimCmd sSpriteAnim_862A6FC[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A710[] = +static const union AnimCmd sAnim_DuoFightPre_Groudon_Body[] = { ANIMCMD_FRAME(192, 30), ANIMCMD_FRAME(256, 30), @@ -252,104 +304,104 @@ static const union AnimCmd sSpriteAnim_862A710[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A724[] = +static const union AnimCmd *const sAnims_DuoFightPre_Groudon[] = { - sSpriteAnim_862A6FC, - sSpriteAnim_862A710 + sAnim_DuoFightPre_Groudon_Head, + sAnim_DuoFightPre_Groudon_Body }; -static const struct SpriteTemplate sUnknown_0862A72C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_Groudon = { - .tileTag = 30505, - .paletteTag = 30505, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862A724, + .tileTag = TAG_DUOFIGHT_GROUDON, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x64, + .anims = sAnims_DuoFightPre_Groudon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A744[] = +static const union AnimCmd sAnim_DuoFightPre_GroudonShoulderKyogreDorsalFin[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A74C[] = +static const union AnimCmd *const sAnims_DuoFightPre_GroudonShoulderKyogreDorsalFin[] = { - sSpriteAnim_862A744 + sAnim_DuoFightPre_GroudonShoulderKyogreDorsalFin }; -static const struct SpriteTemplate sUnknown_0862A750 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_GroudonShoulder = { - .tileTag = 30506, - .paletteTag = 30505, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A74C, + .tileTag = TAG_DUOFIGHT_GROUDON_SHOULDER, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_32x32, + .anims = sAnims_DuoFightPre_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A768[] = +static const union AnimCmd sAnim_DuoFightPre_GroudonClaw[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A770[] = +static const union AnimCmd *const sAnims_DuoFightPre_GroudonClaw[] = { - sSpriteAnim_862A768 + sAnim_DuoFightPre_GroudonClaw }; -static const struct SpriteTemplate sUnknown_0862A774 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_GroudonClaw = { - .tileTag = 30507, - .paletteTag = 30505, - .oam = &sOamData_862A6CC, - .anims = sSpriteAnimTable_862A770, + .tileTag = TAG_DUOFIGHT_GROUDON_CLAW, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x32, + .anims = sAnims_DuoFightPre_GroudonClaw, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A78C[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_TopLeft[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A794[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_TopRight[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A79C[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_FaceLeft[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7A4[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_FaceRight[] = { ANIMCMD_FRAME(24, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7AC[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_ChinLeft[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7B4[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_ChinRight[] = { ANIMCMD_FRAME(40, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7BC[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_LeftPectoralFin[] = { ANIMCMD_FRAME(48, 36), ANIMCMD_FRAME(64, 36), @@ -358,7 +410,7 @@ static const union AnimCmd sSpriteAnim_862A7BC[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A7D0[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_LeftShoulder[] = { ANIMCMD_FRAME(56, 36), ANIMCMD_FRAME(72, 36), @@ -367,7 +419,7 @@ static const union AnimCmd sSpriteAnim_862A7D0[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A7E4[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_RightShoulder[] = { ANIMCMD_FRAME(96, 36), ANIMCMD_FRAME(104, 36), @@ -376,31 +428,32 @@ static const union AnimCmd sSpriteAnim_862A7E4[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A7F8[] = +// Edge of the right pectoral fin is its own sprite (see KyogrePectoralFin) +static const union AnimCmd *const sAnims_DuoFightPre_Kyogre[] = { - sSpriteAnim_862A78C, - sSpriteAnim_862A794, - sSpriteAnim_862A79C, - sSpriteAnim_862A7A4, - sSpriteAnim_862A7AC, - sSpriteAnim_862A7B4, - sSpriteAnim_862A7BC, - sSpriteAnim_862A7D0, - sSpriteAnim_862A7E4 + sAnim_DuoFightPre_Kyogre_TopLeft, + sAnim_DuoFightPre_Kyogre_TopRight, + sAnim_DuoFightPre_Kyogre_FaceLeft, + sAnim_DuoFightPre_Kyogre_FaceRight, + sAnim_DuoFightPre_Kyogre_ChinLeft, + sAnim_DuoFightPre_Kyogre_ChinRight, + sAnim_DuoFightPre_Kyogre_LeftPectoralFin, + sAnim_DuoFightPre_Kyogre_LeftShoulder, + sAnim_DuoFightPre_Kyogre_RightShoulder }; -static const struct SpriteTemplate sUnknown_0862A81C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_Kyogre = { - .tileTag = 30508, - .paletteTag = 30508, - .oam = &sOamData_862A6D4, - .anims = sSpriteAnimTable_862A7F8, + .tileTag = TAG_DUOFIGHT_KYOGRE, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x16, + .anims = sAnims_DuoFightPre_Kyogre, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A834[] = +static const union AnimCmd sAnim_DuoFightPre_KyogrePectoralFin[] = { ANIMCMD_FRAME(0, 36), ANIMCMD_FRAME(2, 36), @@ -409,41 +462,41 @@ static const union AnimCmd sSpriteAnim_862A834[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A848[] = +static const union AnimCmd *const sAnims_DuoFightPre_KyogrePectoralFin[] = { - sSpriteAnim_862A834 + sAnim_DuoFightPre_KyogrePectoralFin }; -static const struct SpriteTemplate sUnknown_0862A84C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogrePectoralFin = { - .tileTag = 30509, - .paletteTag = 30508, - .oam = &sOamData_862A6DC, - .anims = sSpriteAnimTable_862A848, + .tileTag = TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_16x8, + .anims = sAnims_DuoFightPre_KyogrePectoralFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862A864 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogreDorsalFin = { - .tileTag = 30510, - .paletteTag = 30508, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A74C, + .tileTag = TAG_DUOFIGHT_KYOGRE_DORSAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_DuoFightPre_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct ScanlineEffectParams sUnknown_0862A87C = +static const struct ScanlineEffectParams sScanlineParams_DuoFight_Clouds = { .dmaDest = (vu16 *)REG_ADDR_BG1HOFS, - .dmaControl = 0xA2600001, + .dmaControl = SCANLINE_EFFECT_DMACNT_16BIT, .initState = 1 }; -static const struct BgTemplate sUnknown_0862A888[] = +static const struct BgTemplate sBgTemplates_DuoFight[] = { { .bg = 0, @@ -474,7 +527,7 @@ static const struct BgTemplate sUnknown_0862A888[] = }, }; -static const union AnimCmd sSpriteAnim_862A894[] = +static const union AnimCmd sAnim_DuoFight_Groudon_Head[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_FRAME(64, 20), @@ -483,7 +536,7 @@ static const union AnimCmd sSpriteAnim_862A894[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A8A8[] = +static const union AnimCmd sAnim_DuoFight_Groudon_Body[] = { ANIMCMD_FRAME(192, 20), ANIMCMD_FRAME(256, 20), @@ -492,124 +545,124 @@ static const union AnimCmd sSpriteAnim_862A8A8[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A8BC[] = +static const union AnimCmd *const sAnims_DuoFight_Groudon[] = { - sSpriteAnim_862A894, - sSpriteAnim_862A8A8 + sAnim_DuoFight_Groudon_Head, + sAnim_DuoFight_Groudon_Body }; -static const struct CompressedSpriteSheet sUnknown_0862A8C4 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_Groudon = { - gRaySceneGroudon_Gfx, 0x3000, 30505 + gRaySceneDuoFight_Groudon_Gfx, 0x3000, TAG_DUOFIGHT_GROUDON }; -static const struct CompressedSpritePalette sUnknown_0862A8CC = +static const struct CompressedSpritePalette sSpritePal_DuoFight_Groudon = { - gRaySceneGroudon_Pal, 30505 + gRaySceneDuoFight_Groudon_Pal, TAG_DUOFIGHT_GROUDON }; -static const struct SpriteTemplate sUnknown_0862A8D4 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_Groudon = { - .tileTag = 30505, - .paletteTag = 30505, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862A8BC, + .tileTag = TAG_DUOFIGHT_GROUDON, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x64, + .anims = sAnims_DuoFight_Groudon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A8EC[] = +static const union AnimCmd sAnim_DuoFight_GroudonShoulderKyogreDorsalFin[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A8F4[] = +static const union AnimCmd *const sAnims_DuoFight_GroudonShoulderKyogreDorsalFin[] = { - sSpriteAnim_862A8EC + sAnim_DuoFight_GroudonShoulderKyogreDorsalFin }; -static const struct CompressedSpriteSheet sUnknown_0862A8F8 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_GroudonShoulder = { - gRaySceneGroudon2_Gfx, 0x200, 30506 + gRaySceneDuoFight_GroudonShoulder_Gfx, 0x200, TAG_DUOFIGHT_GROUDON_SHOULDER }; -static const struct SpriteTemplate sUnknown_0862A900 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_GroudonShoulder = { - .tileTag = 30506, - .paletteTag = 30505, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A8F4, + .tileTag = TAG_DUOFIGHT_GROUDON_SHOULDER, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_32x32, + .anims = sAnims_DuoFight_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A918[] = +static const union AnimCmd sAnim_DuoFight_GroudonClaw[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A920[] = +static const union AnimCmd *const sAnims_DuoFight_GroudonClaw[] = { - sSpriteAnim_862A918 + sAnim_DuoFight_GroudonClaw }; -static const struct CompressedSpriteSheet sUnknown_0862A924 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_GroudonClaw = { - gRaySceneGroudon3_Gfx, 0x400, 30507 + gRaySceneDuoFight_GroudonClaw_Gfx, 0x400, TAG_DUOFIGHT_GROUDON_CLAW }; -static const struct SpriteTemplate sUnknown_0862A92C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_GroudonClaw = { - .tileTag = 30507, - .paletteTag = 30505, - .oam = &sOamData_862A6CC, - .anims = sSpriteAnimTable_862A920, + .tileTag = TAG_DUOFIGHT_GROUDON_CLAW, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x32, + .anims = sAnims_DuoFight_GroudonClaw, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A944[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_TopLeft[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A94C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_TopRight[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A954[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_FaceLeft[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A95C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_FaceRight[] = { ANIMCMD_FRAME(24, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A964[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_ChinLeft[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A96C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_ChinRight[] = { ANIMCMD_FRAME(40, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A974[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_LeftPectoralFin[] = { ANIMCMD_FRAME(48, 24), ANIMCMD_FRAME(64, 24), @@ -618,7 +671,7 @@ static const union AnimCmd sSpriteAnim_862A974[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A988[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_LeftShoulder[] = { ANIMCMD_FRAME(56, 24), ANIMCMD_FRAME(72, 24), @@ -627,7 +680,7 @@ static const union AnimCmd sSpriteAnim_862A988[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A99C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_RightShoulder[] = { ANIMCMD_FRAME(96, 24), ANIMCMD_FRAME(104, 24), @@ -636,41 +689,41 @@ static const union AnimCmd sSpriteAnim_862A99C[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A9B0[] = +static const union AnimCmd *const sAnims_DuoFight_Kyogre[] = { - sSpriteAnim_862A944, - sSpriteAnim_862A94C, - sSpriteAnim_862A954, - sSpriteAnim_862A95C, - sSpriteAnim_862A964, - sSpriteAnim_862A96C, - sSpriteAnim_862A974, - sSpriteAnim_862A988, - sSpriteAnim_862A99C + sAnim_DuoFight_Kyogre_TopLeft, + sAnim_DuoFight_Kyogre_TopRight, + sAnim_DuoFight_Kyogre_FaceLeft, + sAnim_DuoFight_Kyogre_FaceRight, + sAnim_DuoFight_Kyogre_ChinLeft, + sAnim_DuoFight_Kyogre_ChinRight, + sAnim_DuoFight_Kyogre_LeftPectoralFin, + sAnim_DuoFight_Kyogre_LeftShoulder, + sAnim_DuoFight_Kyogre_RightShoulder }; -static const struct CompressedSpriteSheet sUnknown_0862A9D4 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_Kyogre = { - gRaySceneKyogre_Gfx, 0xF00, 30508 + gRaySceneDuoFight_Kyogre_Gfx, 0xF00, TAG_DUOFIGHT_KYOGRE }; -static const struct CompressedSpritePalette sUnknown_0862A9DC = +static const struct CompressedSpritePalette sSpritePal_DuoFight_Kyogre = { - gRaySceneKyogre_Pal, 30508 + gRaySceneDuoFight_Kyogre_Pal, TAG_DUOFIGHT_KYOGRE }; -static const struct SpriteTemplate sUnknown_0862A9E4 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_Kyogre = { - .tileTag = 30508, - .paletteTag = 30508, - .oam = &sOamData_862A6D4, - .anims = sSpriteAnimTable_862A9B0, + .tileTag = TAG_DUOFIGHT_KYOGRE, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x16, + .anims = sAnims_DuoFight_Kyogre, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A9FC[] = +static const union AnimCmd sAnim_DuoFight_KyogrePectoralFin[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_FRAME(2, 24), @@ -679,44 +732,44 @@ static const union AnimCmd sSpriteAnim_862A9FC[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862AA10[] = +static const union AnimCmd *const sAnims_DuoFight_KyogrePectoralFin[] = { - sSpriteAnim_862A9FC + sAnim_DuoFight_KyogrePectoralFin }; -static const struct CompressedSpriteSheet sUnknown_0862AA14 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_KyogrePectoralFin = { - gRaySceneKyogre2_Gfx, 0xC0, 30509 + gRaySceneDuoFight_KyogrePectoralFin_Gfx, 0xC0, TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN }; -static const struct SpriteTemplate sUnknown_0862AA1C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_KyogrePectoralFin = { - .tileTag = 30509, - .paletteTag = 30508, - .oam = &sOamData_862A6DC, - .anims = sSpriteAnimTable_862AA10, + .tileTag = TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_16x8, + .anims = sAnims_DuoFight_KyogrePectoralFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct CompressedSpriteSheet sUnknown_0862AA34 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_KyogreDorsalFin = { - gRaySceneKyogre3_Gfx, 0x200, 30510 + gRaySceneDuoFight_KyogreDorsalFin_Gfx, 0x200, TAG_DUOFIGHT_KYOGRE_DORSAL_FIN }; -static const struct SpriteTemplate sUnknown_0862AA3C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_KyogreDorsalFin = { - .tileTag = 30510, - .paletteTag = 30508, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A8F4, + .tileTag = TAG_DUOFIGHT_KYOGRE_DORSAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_DuoFight_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct BgTemplate sUnknown_0862AA54[] = +static const struct BgTemplate sBgTemplates_TakesFlight[] = { { .bg = 0, @@ -747,18 +800,18 @@ static const struct BgTemplate sUnknown_0862AA54[] = } }; -static const union AnimCmd sSpriteAnim_862AA60[] = +static const union AnimCmd sAnim_TakesFlight_Smoke[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862AA68[] = +static const union AnimCmd *const sAnims_TakesFlight_Smoke[] = { - sSpriteAnim_862AA60 + sAnim_TakesFlight_Smoke }; -static const union AffineAnimCmd sSpriteAffineAnim_862AA6C[] = +static const union AffineAnimCmd sAffineAnim_TakesFlight_Smoke[] = { AFFINEANIMCMD_FRAME(-64, -64, 0, 1), AFFINEANIMCMD_FRAME(32, 32, 0, 14), @@ -766,47 +819,47 @@ static const union AffineAnimCmd sSpriteAffineAnim_862AA6C[] = AFFINEANIMCMD_JUMP(0) }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_862AA8C[] = +static const union AffineAnimCmd *const sAffineAnims_TakesFlight_Smoke[] = { - sSpriteAffineAnim_862AA6C + sAffineAnim_TakesFlight_Smoke }; -static const struct CompressedSpriteSheet sUnknown_0862AA90 = +static const struct CompressedSpriteSheet sSpriteSheet_TakesFlight_Smoke = { - gRaySceneSmoke_Gfx, 0x100, 30555 + gRaySceneTakesFlight_Smoke_Gfx, 0x100, TAG_FLIGHT_SMOKE }; -static const struct CompressedSpritePalette sUnknown_0862AA98 = +static const struct CompressedSpritePalette sSpritePal_TakesFlight_Smoke = { - gRaySceneSmoke_Pal, 30555 + gRaySceneTakesFlight_Smoke_Pal, TAG_FLIGHT_SMOKE }; -static const struct SpriteTemplate sUnknown_0862AAA0 = +static const struct SpriteTemplate sSpriteTemplate_TakesFlight_Smoke = { - .tileTag = 30555, - .paletteTag = 30555, - .oam = &sOamData_862A6D4, - .anims = sSpriteAnimTable_862AA68, + .tileTag = TAG_FLIGHT_SMOKE, + .paletteTag = TAG_FLIGHT_SMOKE, + .oam = &sOam_32x16, + .anims = sAnims_TakesFlight_Smoke, .images = NULL, - .affineAnims = sSpriteAffineAnimTable_862AA8C, - .callback = sub_81D8260, + .affineAnims = sAffineAnims_TakesFlight_Smoke, + .callback = SpriteCB_TakesFlight_Smoke, }; -static const s8 sUnknown_0862AAB8[][2] = +static const s8 sTakesFlight_SmokeCoords[MAX_SMOKE][2] = { - {-1, 5}, - {-3, -4}, - {5, -3}, - {-7, 2}, - {-9, -1}, - {1, -5}, - {3, 4}, - {-5, 3}, - {7, -2}, - {9, 1} + {-1, 5}, + {-3, -4}, + { 5, -3}, + {-7, 2}, + {-9, -1}, + { 1, -5}, + { 3, 4}, + {-5, 3}, + { 7, -2}, + { 9, 1} }; -static const struct BgTemplate sUnknown_0862AACC[] = +static const struct BgTemplate sBgTemplates_Descends[] = { { .bg = 0, @@ -846,68 +899,68 @@ static const struct BgTemplate sUnknown_0862AACC[] = } }; -static const union AnimCmd sSpriteAnim_862AADC[] = +static const union AnimCmd sAnim_Descends_Rayquaza[] = { ANIMCMD_FRAME(0, 32), ANIMCMD_FRAME(64, 32), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862AAE8[] = +static const union AnimCmd *const sAnims_Descends_Rayquaza[] = { - sSpriteAnim_862AADC + sAnim_Descends_Rayquaza }; -static const union AnimCmd sSpriteAnim_862AAEC[] = +static const union AnimCmd sAnim_Descends_RayquazaTail[] = { ANIMCMD_FRAME(0, 32), ANIMCMD_FRAME(8, 32), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862AAF8[] = +static const union AnimCmd *const sAnims_Descends_RayquazaTail[] = { - sSpriteAnim_862AAEC + sAnim_Descends_RayquazaTail }; -static const struct CompressedSpriteSheet sUnknown_0862AAFC = +static const struct CompressedSpriteSheet sSpriteSheet_Descends_Rayquaza = { - gRaySceneRayquazaFly1_Gfx, 0x1000, 30556 + gRaySceneDescends_Rayquaza_Gfx, 0x1000, TAG_DESCENDS_RAYQUAZA }; -static const struct CompressedSpriteSheet sUnknown_0862AB04 = +static const struct CompressedSpriteSheet sSpriteSheet_Descends_RayquazaTail = { - gRaySceneRayquazaTail_Gfx, 0x200, 30557 + gRaySceneDescends_RayquazaTail_Gfx, 0x200, TAG_DESCENDS_RAYQUAZA_TAIL }; -static const struct CompressedSpritePalette sUnknown_0862AB0C = +static const struct CompressedSpritePalette sSpritePal_Descends_Rayquaza = { - gRaySceneRayquaza_Pal, 30556 + gRaySceneTakesFlight_Rayquaza_Pal, TAG_DESCENDS_RAYQUAZA // "Takes flight" palette re-used here }; -static const struct SpriteTemplate sUnknown_0862AB14 = +static const struct SpriteTemplate sSpriteTemplate_Descends_Rayquaza = { - .tileTag = 30556, - .paletteTag = 30556, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862AAE8, + .tileTag = TAG_DESCENDS_RAYQUAZA, + .paletteTag = TAG_DESCENDS_RAYQUAZA, + .oam = &sOam_64x64, + .anims = sAnims_Descends_Rayquaza, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862AB2C = +static const struct SpriteTemplate sSpriteTemplate_Descends_RayquazaTail = { - .tileTag = 30557, - .paletteTag = 30556, - .oam = &sOamData_862A6E4, - .anims = sSpriteAnimTable_862AAF8, + .tileTag = TAG_DESCENDS_RAYQUAZA_TAIL, + .paletteTag = TAG_DESCENDS_RAYQUAZA, + .oam = &sOam_16x32, + .anims = sAnims_Descends_RayquazaTail, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct BgTemplate sUnknown_0862AB44[] = +static const struct BgTemplate sBgTemplates_Charges[] = { { .bg = 0, @@ -947,13 +1000,13 @@ static const struct BgTemplate sUnknown_0862AB44[] = } }; -static const union AnimCmd sSpriteAnim_862AB54[] = +static const union AnimCmd sAnim_ChasesAway_Groudon_Still[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862AB5C[] = +static const union AnimCmd sAnim_ChasesAway_Groudon_Moving[] = { ANIMCMD_FRAME(0, 48), ANIMCMD_FRAME(64, 32), @@ -962,113 +1015,113 @@ static const union AnimCmd sSpriteAnim_862AB5C[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_862AB70[] = +static const union AnimCmd *const sAnims_ChasesAway_Groudon[] = { - sSpriteAnim_862AB54, - sSpriteAnim_862AB5C + sAnim_ChasesAway_Groudon_Still, + sAnim_ChasesAway_Groudon_Moving }; -static const union AnimCmd sSpriteAnim_862AB78[] = +static const union AnimCmd sAnim_ChasesAway_GroudonTail[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862AB80[] = +static const union AnimCmd *const sAnims_ChasesAway_GroudonTail[] = { - sSpriteAnim_862AB78, + sAnim_ChasesAway_GroudonTail, }; -static const union AnimCmd sSpriteAnim_862AB84[] = +static const union AnimCmd sAnim_ChasesAway_Kyogre_Front[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862AB8C[] = +static const union AnimCmd sAnim_ChasesAway_Kyogre_Back[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862AB94[] = +static const union AnimCmd sAnim_ChasesAway_Kyogre_Tail[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862AB9C[] = +static const union AnimCmd *const sAnims_ChasesAway_Kyogre[] = { - sSpriteAnim_862AB84, - sSpriteAnim_862AB8C, - sSpriteAnim_862AB94 + sAnim_ChasesAway_Kyogre_Front, + sAnim_ChasesAway_Kyogre_Back, + sAnim_ChasesAway_Kyogre_Tail }; -static const union AnimCmd sSpriteAnim_862ABA8[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_FlyingDown[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABB0[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_Arriving[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABB8[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_Floating[] = { ANIMCMD_FRAME(128, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABC0[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_Shouting[] = { ANIMCMD_FRAME(192, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862ABC8[] = +static const union AnimCmd *const sAnims_ChasesAway_Rayquaza[] = { - sSpriteAnim_862ABA8, - sSpriteAnim_862ABB0, - sSpriteAnim_862ABB8, - sSpriteAnim_862ABC0 + sAnim_ChasesAway_Rayquaza_FlyingDown, + sAnim_ChasesAway_Rayquaza_Arriving, + sAnim_ChasesAway_Rayquaza_Floating, + sAnim_ChasesAway_Rayquaza_Shouting }; -static const union AnimCmd sSpriteAnim_862ABD8[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_FlyingDown[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABE0[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_Arriving[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABE8[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_Floating[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABF0[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_Shouting[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862ABF8[] = +static const union AnimCmd *const sAnims_ChasesAway_RayquazaTail[] = { - sSpriteAnim_862ABD8, - sSpriteAnim_862ABE0, - sSpriteAnim_862ABE8, - sSpriteAnim_862ABF0 + sAnim_ChasesAway_RayquazaTail_FlyingDown, + sAnim_ChasesAway_RayquazaTail_Arriving, + sAnim_ChasesAway_RayquazaTail_Floating, + sAnim_ChasesAway_RayquazaTail_Shouting }; -static const union AnimCmd sSpriteAnim_862AC08[] = +static const union AnimCmd sAnim_ChasesAway_KyogreSplash[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), @@ -1079,128 +1132,128 @@ static const union AnimCmd sSpriteAnim_862AC08[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_862AC24[] = +static const union AnimCmd *const sAnims_ChasesAway_KyogreSplash[] = { - sSpriteAnim_862AC08 + sAnim_ChasesAway_KyogreSplash }; -static const struct CompressedSpriteSheet sUnknown_0862AC28 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_Groudon = { - gRaySceneGroudonLeft_Gfx, 0x1800, 30565 + gRaySceneChasesAway_Groudon_Gfx, 0x1800, TAG_CHASE_GROUDON }; -static const struct CompressedSpriteSheet sUnknown_0862AC30 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_GroudonTail = { - gRaySceneGroudonTail_Gfx, 0x80, 30566 + gRaySceneChasesAway_GroudonTail_Gfx, 0x80, TAG_CHASE_GROUDON_TAIL }; -static const struct CompressedSpriteSheet sUnknown_0862AC38 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_Kyogre = { - gRaySceneKyogreRight_Gfx, 0x600, 30568 + gRaySceneChasesAway_Kyogre_Gfx, 0x600, TAG_CHASE_KYOGRE }; -static const struct CompressedSpriteSheet sUnknown_0862AC40 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_Rayquaza = { - gRaySceneRayquazaHover_Gfx, 0x2000, 30569 + gRaySceneChasesAway_Rayquaza_Gfx, 0x2000, TAG_CHASE_RAYQUAZA }; -static const struct CompressedSpriteSheet sUnknown_0862AC48 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_RayquazaTail = { - gRaySceneRayquazaFlyIn_Gfx, 0x800, 30570 + gRaySceneChasesAway_RayquazaTail_Gfx, 0x800, TAG_CHASE_RAYQUAZA_TAIL }; -static const struct CompressedSpriteSheet sUnknown_0862AC50 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_KyogreSplash = { - gRaySceneSplash_Gfx, 0x300, 30571 + gRaySceneChasesAway_KyogreSplash_Gfx, 0x300, TAG_CHASE_SPLASH }; -static const struct CompressedSpritePalette sUnknown_0862AC58 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_Groudon = { - gRaySceneGroudonLeft_Pal, 30565 + gRaySceneChasesAway_Groudon_Pal, TAG_CHASE_GROUDON }; -static const struct CompressedSpritePalette sUnknown_0862AC60 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_Kyogre = { - gRaySceneKyogreRight_Pal, 30568 + gRaySceneChasesAway_Kyogre_Pal, TAG_CHASE_KYOGRE }; -static const struct CompressedSpritePalette sUnknown_0862AC68 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_Rayquaza = { - gRaySceneRayquazaHover_Pal, 30569 + gRaySceneChasesAway_Rayquaza_Pal, TAG_CHASE_RAYQUAZA }; -static const struct CompressedSpritePalette sUnknown_0862AC70 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_KyogreSplash = { - gRaySceneSplash_Pal, 30571 + gRaySceneChasesAway_KyogreSplash_Pal, TAG_CHASE_SPLASH }; -static const struct SpriteTemplate sUnknown_0862AC78 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_Groudon = { - .tileTag = 30565, - .paletteTag = 30565, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862AB70, + .tileTag = TAG_CHASE_GROUDON, + .paletteTag = TAG_CHASE_GROUDON, + .oam = &sOam_64x64, + .anims = sAnims_ChasesAway_Groudon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862AC90 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_GroudonTail = { - .tileTag = 30566, - .paletteTag = 30565, - .oam = &sOamData_862A6EC, - .anims = sSpriteAnimTable_862AB80, + .tileTag = TAG_CHASE_GROUDON_TAIL, + .paletteTag = TAG_CHASE_GROUDON, + .oam = &sOam_16x16, + .anims = sAnims_ChasesAway_GroudonTail, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862ACA8 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_Kyogre = { - .tileTag = 30568, - .paletteTag = 30568, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862AB9C, + .tileTag = TAG_CHASE_KYOGRE, + .paletteTag = TAG_CHASE_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_ChasesAway_Kyogre, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862ACC0 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_Rayquaza = { - .tileTag = 30569, - .paletteTag = 30569, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862ABC8, + .tileTag = TAG_CHASE_RAYQUAZA, + .paletteTag = TAG_CHASE_RAYQUAZA, + .oam = &sOam_64x64, + .anims = sAnims_ChasesAway_Rayquaza, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81D961C, + .callback = SpriteCB_ChasesAway_Rayquaza, }; -static const struct SpriteTemplate sUnknown_0862ACD8 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_RayquazaTail = { - .tileTag = 30570, - .paletteTag = 30569, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862ABF8, + .tileTag = TAG_CHASE_RAYQUAZA_TAIL, + .paletteTag = TAG_CHASE_RAYQUAZA, + .oam = &sOam_32x32, + .anims = sAnims_ChasesAway_RayquazaTail, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862ACF0 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_KyogreSplash = { - .tileTag = 30571, - .paletteTag = 30571, - .oam = &sOamData_862A6F4, - .anims = sSpriteAnimTable_862AC24, + .tileTag = TAG_CHASE_SPLASH, + .paletteTag = TAG_CHASE_SPLASH, + .oam = &sOam_32x8, + .anims = sAnims_ChasesAway_KyogreSplash, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct BgTemplate sUnknown_0862AD08[] = +static const struct BgTemplate sBgTemplates_ChasesAway[] = { { .bg = 0, @@ -1231,13 +1284,12 @@ static const struct BgTemplate sUnknown_0862AD08[] = } }; -// code -void DoRayquazaScene(u8 animId, bool8 onlyOneAnim, void (*callback)(void)) +void DoRayquazaScene(u8 animId, bool8 endEarly, void (*exitCallback)(void)) { sRayScene = AllocZeroed(sizeof(*sRayScene)); sRayScene->animId = animId; - sRayScene->callback = callback; - sRayScene->onlyOneAnim = onlyOneAnim; + sRayScene->exitCallback = exitCallback; + sRayScene->endEarly = endEarly; SetMainCallback2(CB2_InitRayquazaScene); } @@ -1250,7 +1302,7 @@ static void CB2_InitRayquazaScene(void) ResetPaletteFade(); ResetSpriteData(); ResetTasks(); - FillPalette(0, 0xF0, 0x20); + FillPalette(RGB_BLACK, 0xF0, 32); CreateTask(sTasksForAnimations[sRayScene->animId], 0); SetMainCallback2(CB2_RayquazaScene); } @@ -1277,7 +1329,7 @@ static void Task_EndAfterFadeScreen(u8 taskId) { ResetSpriteData(); FreeAllSpritePalettes(); - SetMainCallback2(sRayScene->callback); + SetMainCallback2(sRayScene->exitCallback); Free(sRayScene); DestroyTask(taskId); } @@ -1287,83 +1339,97 @@ static void Task_SetNextAnim(u8 taskId) { if (!gPaletteFade.active) { - if (sRayScene->onlyOneAnim == TRUE) + if (sRayScene->endEarly == TRUE) { gTasks[taskId].func = Task_EndAfterFadeScreen; } else { sRayScene->animId++; - sRayScene->field_2004 = 0; + sRayScene->unk = 0; gTasks[taskId].func = sTasksForAnimations[sRayScene->animId]; } } } -static void sub_81D68C8(void) +// The cutscene window is cropped to a narrower view, with black borders on each vertical edge +// This function is used in scenes where sprites in these borders need to be hidden +static void SetWindowsHideVertBorders(void) { - SetGpuReg(REG_OFFSET_WININ, 0x3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WINOUT, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0xF0); - SetGpuReg(REG_OFFSET_WIN0V, 0x1888); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(24, DISPLAY_HEIGHT - 24)); gPlttBufferUnfaded[0] = 0; gPlttBufferFaded[0] = 0; } -static void sub_81D6904(void) +static void ResetWindowDimensions(void) { - SetGpuReg(REG_OFFSET_WININ, 0x3F); - SetGpuReg(REG_OFFSET_WINOUT, 0x3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL); } + +// RAY_ANIM_DUO_FIGHT / RAY_ANIM_DUO_FIGHT_PRE + +#define tTimer data[0] +#define tHelperTaskId data[1] +#define tGroudonSpriteId data[2] +#define tKyogreSpriteId data[3] + +#define sGroudonBodySpriteId data[0] +#define sGroudonShoulderSpriteId data[1] +#define sGroudonClawSpriteId data[2] + static void Task_HandleDuoFightPre(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D750C(); + DuoFight_AnimateRain(); if (!gPaletteFade.active) { - s16 counter = data[0]; - if (counter == 64) + s16 frame = tTimer; + if (frame == 64) { - sub_81D7438(); + DuoFight_Lightning1(); } - else if (counter == 144) + else if (frame == 144) { - sub_81D7480(); + DuoFight_Lightning2(); } else { - switch (counter) + switch (frame) { case 328: DuoFightEnd(taskId, 0); return; case 148: - sub_81D74C8(); + DuoFight_LightningLong(); break; } } - data[0]++; + tTimer++; } } -static u8 sub_81D6984(void) +static u8 DuoFightPre_CreateGroudonSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A72C, 88, 72, 3); - gSprites[spriteId].callback = sub_81D6A20; + spriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_Groudon, 88, 72, 3); + gSprites[spriteId].callback = SpriteCB_DuoFightPre_Groudon; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A72C, 56, 104, 3); - data[1] = CreateSprite(&sUnknown_0862A750, 75, 101, 0); - data[2] = CreateSprite(&sUnknown_0862A774, 109, 114, 1); - StartSpriteAnim(&gSprites[data[0]], 1); + sGroudonBodySpriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_Groudon, 56, 104, 3); + sGroudonShoulderSpriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_GroudonShoulder, 75, 101, 0); + sGroudonClawSpriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_GroudonClaw, 109, 114, 1); + StartSpriteAnim(&gSprites[sGroudonBodySpriteId], 1); return spriteId; } -static void sub_81D6A20(struct Sprite *sprite) +static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1371,54 +1437,54 @@ static void sub_81D6A20(struct Sprite *sprite) if (data[5] == 0 && sprite->pos1.x != 72) { sprite->pos1.x--; - gSprites[sprite->data[0]].pos1.x--; - gSprites[data[1]].pos1.x--; - gSprites[data[2]].pos1.x--; + gSprites[sprite->sGroudonBodySpriteId].pos1.x--; + gSprites[sGroudonShoulderSpriteId].pos1.x--; + gSprites[sGroudonClawSpriteId].pos1.x--; } switch (sprite->animCmdIndex) { case 0: - gSprites[data[1]].pos2.x = 0; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = 0; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = 0; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = 0; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 1: case 3: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = -1; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = -1; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 2: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 1; - gSprites[data[2]].pos2.x = -2; - gSprites[data[2]].pos2.y = 1; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 1; + gSprites[sGroudonClawSpriteId].pos2.x = -2; + gSprites[sGroudonClawSpriteId].pos2.y = 1; break; } } -static u8 sub_81D6B7C(void) +static u8 DuoFightPre_CreateKyogreSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A81C, 136, 96, 1); - gSprites[spriteId].callback = sub_81D6D20; + spriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 96, 1); + gSprites[spriteId].callback = SpriteCB_DuoFightPre_Kyogre; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A81C, 168, 96, 1) << 8; - data[0] |= CreateSprite(&sUnknown_0862A81C, 136, 112, 1); - data[1] = CreateSprite(&sUnknown_0862A81C, 168, 112, 1) << 8; - data[1] |= CreateSprite(&sUnknown_0862A81C, 136, 128, 1); - data[2] = CreateSprite(&sUnknown_0862A81C, 168, 128, 1) << 8; - data[2] |= CreateSprite(&sUnknown_0862A81C, 104, 128, 2); - data[3] = CreateSprite(&sUnknown_0862A81C, 136, 128, 2) << 8; - data[3] |= CreateSprite(&sUnknown_0862A81C, 184, 128, 0); - data[4] = CreateSprite(&sUnknown_0862A84C, 208, 132, 0) << 8; - data[4] |= CreateSprite(&sUnknown_0862A864, 200, 120, 1); + data[0] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 168, 96, 1) << 8; + data[0] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 112, 1); + data[1] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 168, 112, 1) << 8; + data[1] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 128, 1); + data[2] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 168, 128, 1) << 8; + data[2] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 104, 128, 2); + data[3] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 128, 2) << 8; + data[3] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 184, 128, 0); + data[4] = CreateSprite(&sSpriteTemplate_DuoFightPre_KyogrePectoralFin, 208, 132, 0) << 8; + data[4] |= CreateSprite(&sSpriteTemplate_DuoFightPre_KyogreDorsalFin, 200, 120, 1); StartSpriteAnim(&gSprites[data[0] >> 8], 1); StartSpriteAnim(&gSprites[data[0] & 0xFF], 2); @@ -1432,7 +1498,7 @@ static u8 sub_81D6B7C(void) return spriteId; } -static void sub_81D6D20(struct Sprite *sprite) +static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1499,11 +1565,11 @@ static void VBlankCB_DuoFight(void) ScanlineEffect_InitHBlankDmaTransfer(); } -static void sub_81D6FE0(void) +static void InitDuoFightSceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0862A888, ARRAY_COUNT(sUnknown_0862A888)); + InitBgsFromTemplates(0, sBgTemplates_DuoFight, ARRAY_COUNT(sBgTemplates_DuoFight)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -1518,46 +1584,46 @@ static void sub_81D6FE0(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D706C(void) +static void LoadDuoFightSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(0, gRaySceneClouds_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneClouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneClouds1_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneClouds3_Tilemap, sRayScene->tilemapBuffers[2]); - LoadCompressedPalette(gRaySceneClouds_Pal, 0, 0x40); - LoadCompressedSpriteSheet(&sUnknown_0862A8C4); - LoadCompressedSpriteSheet(&sUnknown_0862A8F8); - LoadCompressedSpriteSheet(&sUnknown_0862A924); - LoadCompressedSpriteSheet(&sUnknown_0862A9D4); - LoadCompressedSpriteSheet(&sUnknown_0862AA14); - LoadCompressedSpriteSheet(&sUnknown_0862AA34); - LoadCompressedSpritePalette(&sUnknown_0862A8CC); - LoadCompressedSpritePalette(&sUnknown_0862A9DC); + DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneDuoFight_Clouds1_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneDuoFight_Clouds3_Tilemap, sRayScene->tilemapBuffers[2]); + LoadCompressedPalette(gRaySceneDuoFight_Clouds_Pal, 0, 0x40); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_Groudon); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonShoulder); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonClaw); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_Kyogre); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogrePectoralFin); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogreDorsalFin); + LoadCompressedSpritePalette(&sSpritePal_DuoFight_Groudon); + LoadCompressedSpritePalette(&sSpritePal_DuoFight_Kyogre); } static void Task_DuoFightAnim(u8 taskId) { s16 *data = gTasks[taskId].data; ScanlineEffect_Clear(); - sub_81D6FE0(); - sub_81D706C(); + InitDuoFightSceneBgs(); + LoadDuoFightSceneGfx(); CpuFastFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers)); - ScanlineEffect_SetParams(sUnknown_0862A87C); - data[0] = 0; - data[1] = CreateTask(sub_81D7228, 0); + ScanlineEffect_SetParams(sScanlineParams_DuoFight_Clouds); + tTimer = 0; + tHelperTaskId = CreateTask(Task_DuoFight_AnimateClouds, 0); if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE) { - data[2] = sub_81D6984(); - data[3] = sub_81D6B7C(); + tGroudonSpriteId = DuoFightPre_CreateGroudonSprites(); + tKyogreSpriteId = DuoFightPre_CreateKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFightPre; } else { - data[2] = sub_81D7664(); - data[3] = sub_81D78BC(); + tGroudonSpriteId = DuoFight_CreateGroudonSprites(); + tKyogreSpriteId = DuoFight_CreateKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFight; StopMapMusic(); } @@ -1568,7 +1634,7 @@ static void Task_DuoFightAnim(u8 taskId) PlaySE(SE_DOWNPOUR); } -static void sub_81D7228(u8 taskId) +static void Task_DuoFight_AnimateClouds(u8 taskId) { s16 i; u16 *data = gTasks[taskId].data; @@ -1630,85 +1696,89 @@ static void sub_81D7228(u8 taskId) static void Task_HandleDuoFight(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D750C(); + DuoFight_AnimateRain(); if (!gPaletteFade.active) { - s16 counter = data[0]; - if (counter == 32 || counter == 112) + s16 frame = tTimer; + if (frame == 32 || frame == 112) { - sub_81D7438(); + DuoFight_Lightning1(); } - else if (counter == 216) + else if (frame == 216) { - sub_81D7480(); + DuoFight_Lightning2(); } - else if (counter == 220) + else if (frame == 220) { - sub_81D74C8(); + DuoFight_LightningLong(); } else { - switch (counter) + switch (frame) { case 412: DuoFightEnd(taskId, 2); return; case 380: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); - gTasks[data[1]].func = sub_81D752C; - gTasks[data[1]].data[0] = 0; - gTasks[data[1]].data[2] = data[2]; - gTasks[data[1]].data[3] = data[3]; + gTasks[tHelperTaskId].func = DuoFight_PanOffScene; + gTasks[tHelperTaskId].data[0] = 0; + gTasks[tHelperTaskId].data[2] = data[2]; + gTasks[tHelperTaskId].data[3] = data[3]; ScanlineEffect_Stop(); break; } } - data[0]++; + tTimer++; } } -static void sub_81D7438(void) +// In the below functions, BlendPalettesGradually flashes the bg white and the duo black +// and gradually fades them back to original color to simulate lightning +static void DuoFight_Lightning1(void) { PlaySE(SE_THUNDER); - sub_80A2C44(0x7FFF, 0, 0x10, 0, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 0, 0x10, 0, 0, 0, 1); + BlendPalettesGradually(0x00007FFF, 0, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1); } -static void sub_81D7480(void) +static void DuoFight_Lightning2(void) { PlaySE(SE_THUNDER); - sub_80A2C44(0x7FFF, 0, 0x10, 0x10, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 0, 0x10, 0x10, 0, 0, 1); + BlendPalettesGradually(0x00007FFF, 0, 16, 16, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 0, 16, 16, RGB_BLACK, 0, 1); } -static void sub_81D74C8(void) +static void DuoFight_LightningLong(void) { - sub_80A2C44(0x7FFF, 4, 0x10, 0, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 4, 0x10, 0, 0, 0, 1); + BlendPalettesGradually(0x00007FFF, 4, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 4, 16, 0, RGB_BLACK, 0, 1); } -static void sub_81D750C(void) +static void DuoFight_AnimateRain(void) { ChangeBgX(2, 0x400, 1); ChangeBgY(2, 0x800, 2); } -static void sub_81D752C(u8 taskId) +// Only used by the full version, which pans up at the end (so scene objects move down) +// DuoFightPre just fades to black with no pan +static void DuoFight_PanOffScene(u8 taskId) { u16 bgY; s16 *data = gTasks[taskId].data; - sub_81D7860(&gSprites[data[2]]); - sub_81D7D14(&gSprites[data[3]]); + DuoFight_SlideGroudonDown(&gSprites[tGroudonSpriteId]); + DuoFight_SlideKyogreDown(&gSprites[tKyogreSpriteId]); bgY = GetBgY(1); if (GetBgY(1) == 0 || bgY > 0x8000) ChangeBgY(1, 0x400, 2); - if (data[0] != 16) + if (tTimer != 16) { - data[0]++; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - data[0], data[0])); + tTimer++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - tTimer, tTimer)); } } @@ -1722,36 +1792,36 @@ static void DuoFightEnd(u8 taskId, s8 palDelay) static void Task_DuoFightEnd(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D750C(); + DuoFight_AnimateRain(); if (!gPaletteFade.active) { - DestroyTask(data[1]); + DestroyTask(tHelperTaskId); ChangeBgY(1, 0, 0); SetVBlankCallback(NULL); ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); - data[0] = 0; + tTimer = 0; gTasks[taskId].func = Task_SetNextAnim; } } -static u8 sub_81D7664(void) +static u8 DuoFight_CreateGroudonSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A8D4, 98, 72, 3); - gSprites[spriteId].callback = sub_81D7700; + spriteId = CreateSprite(&sSpriteTemplate_DuoFight_Groudon, 98, 72, 3); + gSprites[spriteId].callback = SpriteCB_DuoFight_Groudon; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A8D4, 66, 104, 3); - data[1] = CreateSprite(&sUnknown_0862A900, 85, 101, 0); - data[2] = CreateSprite(&sUnknown_0862A92C, 119, 114, 1); - StartSpriteAnim(&gSprites[data[0]], 1); + sGroudonBodySpriteId = CreateSprite(&sSpriteTemplate_DuoFight_Groudon, 66, 104, 3); + sGroudonShoulderSpriteId = CreateSprite(&sSpriteTemplate_DuoFight_GroudonShoulder, 85, 101, 0); + sGroudonClawSpriteId = CreateSprite(&sSpriteTemplate_DuoFight_GroudonClaw, 119, 114, 1); + StartSpriteAnim(&gSprites[sGroudonBodySpriteId], 1); return spriteId; } -static void sub_81D7700(struct Sprite *sprite) +static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1759,66 +1829,66 @@ static void sub_81D7700(struct Sprite *sprite) if (!(data[5] & 7) && sprite->pos1.x != 72) { sprite->pos1.x--; - gSprites[sprite->data[0]].pos1.x--; - gSprites[data[1]].pos1.x--; - gSprites[data[2]].pos1.x--; + gSprites[sprite->sGroudonBodySpriteId].pos1.x--; + gSprites[sGroudonShoulderSpriteId].pos1.x--; + gSprites[sGroudonClawSpriteId].pos1.x--; } switch (sprite->animCmdIndex) { case 0: - gSprites[data[1]].pos2.x = 0; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = 0; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = 0; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = 0; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 1: case 3: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = -1; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = -1; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 2: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 1; - gSprites[data[2]].pos2.x = -2; - gSprites[data[2]].pos2.y = 1; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 1; + gSprites[sGroudonClawSpriteId].pos2.x = -2; + gSprites[sGroudonClawSpriteId].pos2.y = 1; break; } } -static void sub_81D7860(struct Sprite *sprite) +static void DuoFight_SlideGroudonDown(struct Sprite *sprite) { s16 *data = sprite->data; if (sprite->pos1.y <= 160) { sprite->pos1.y += 8; - gSprites[sprite->data[0]].pos1.y += 8; - gSprites[data[1]].pos1.y += 8; - gSprites[data[2]].pos1.y += 8; + gSprites[sprite->sGroudonBodySpriteId].pos1.y += 8; + gSprites[sGroudonShoulderSpriteId].pos1.y += 8; + gSprites[sGroudonClawSpriteId].pos1.y += 8; } } -static u8 sub_81D78BC(void) +static u8 DuoFight_CreateKyogreSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A9E4, 126, 96, 1); - gSprites[spriteId].callback = sub_81D7A60; + spriteId = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 96, 1); + gSprites[spriteId].callback = SpriteCB_DuoFight_Kyogre; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A9E4, 158, 96, 1) << 8; - data[0] |= CreateSprite(&sUnknown_0862A9E4, 126, 112, 1); - data[1] = CreateSprite(&sUnknown_0862A9E4, 158, 112, 1) << 8; - data[1] |= CreateSprite(&sUnknown_0862A9E4, 126, 128, 1); - data[2] = CreateSprite(&sUnknown_0862A9E4, 158, 128, 1) << 8; - data[2] |= CreateSprite(&sUnknown_0862A9E4, 94, 128, 2); - data[3] = CreateSprite(&sUnknown_0862A9E4, 126, 128, 2) << 8; - data[3] |= CreateSprite(&sUnknown_0862A9E4, 174, 128, 0); - data[4] = CreateSprite(&sUnknown_0862AA1C, 198, 132, 0) << 8; - data[4] |= CreateSprite(&sUnknown_0862AA3C, 190, 120, 1); + data[0] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 158, 96, 1) << 8; + data[0] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 112, 1); + data[1] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 158, 112, 1) << 8; + data[1] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 128, 1); + data[2] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 158, 128, 1) << 8; + data[2] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 94, 128, 2); + data[3] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 128, 2) << 8; + data[3] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 174, 128, 0); + data[4] = CreateSprite(&sSpriteTemplate_DuoFight_KyogrePectoralFin, 198, 132, 0) << 8; + data[4] |= CreateSprite(&sSpriteTemplate_DuoFight_KyogreDorsalFin, 190, 120, 1); StartSpriteAnim(&gSprites[data[0] >> 8], 1); StartSpriteAnim(&gSprites[data[0] & 0xFF], 2); @@ -1832,7 +1902,7 @@ static u8 sub_81D78BC(void) return spriteId; } -static void sub_81D7A60(struct Sprite *sprite) +static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1893,7 +1963,7 @@ static void sub_81D7A60(struct Sprite *sprite) } } -static void sub_81D7D14(struct Sprite *sprite) +static void DuoFight_SlideKyogreDown(struct Sprite *sprite) { s16 *data = sprite->data; if (sprite->pos1.y <= 160) @@ -1912,11 +1982,32 @@ static void sub_81D7D14(struct Sprite *sprite) } } -static void sub_81D7E10(void) +#undef tTimer +#undef tHelperTaskId +#undef tGroudonSpriteId +#undef tKyogreSpriteId + +#undef sGroudonBodySpriteId +#undef sGroudonShoulderSpriteId +#undef sGroudonClawSpriteId + + +// RAY_ANIM_TAKES_FLIGHT + +#define tState data[0] +#define tTimer data[1] +#define tScale data[2] +#define tScaleSpeed data[3] +#define tYCoord data[4] +#define tYSpeed data[5] +#define tYOffset data[6] +#define tYOffsetDir data[7] + +static void InitTakesFlightSceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sUnknown_0862AA54, ARRAY_COUNT(sUnknown_0862AA54)); + InitBgsFromTemplates(1, sBgTemplates_TakesFlight, ARRAY_COUNT(sBgTemplates_TakesFlight)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -1931,99 +2022,117 @@ static void sub_81D7E10(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D7E9C(void) +static void LoadTakesFlightSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(0, gRaySceneClouds_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, gRaySceneOvercast_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, gRaySceneRayquaza_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneClouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneOvercast_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneRayquaza_Tilemap, sRayScene->tilemapBuffers[2]); - LoadCompressedPalette(gRaySceneRayquaza_Pal, 0, 0x40); - LoadCompressedSpriteSheet(&sUnknown_0862AA90); - LoadCompressedSpritePalette(&sUnknown_0862AA98); + DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); // Re-uses clouds from previous scene + DecompressAndCopyTileDataToVram(1, gRaySceneTakesFlight_Bg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(2, gRaySceneTakesFlight_Rayquaza_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]); + LoadCompressedPalette(gRaySceneTakesFlight_Rayquaza_Pal, 0, 64); + LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke); + LoadCompressedSpritePalette(&sSpritePal_TakesFlight_Smoke); } static void Task_RayTakesFlightAnim(u8 taskId) { s16 *data = gTasks[taskId].data; PlayNewMapMusic(MUS_RAYQUAZA_APPEARS); - sub_81D7E10(); - sub_81D7E9C(); + InitTakesFlightSceneBgs(); + LoadTakesFlightSceneGfx(); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); - BlendPalettes(-1, 0x10, 0); + BlendPalettes(-1, 16, 0); SetVBlankCallback(VBlankCB_RayquazaScene); - CreateTask(sub_81D81A4, 0); - data[0] = 0; - data[1] = 0; + CreateTask(Task_TakesFlight_CreateSmoke, 0); + tState = 0; + tTimer = 0; gTasks[taskId].func = Task_HandleRayTakesFlight; } +// Animate Rayquaza (flying up and down, and changing size as it gets further from the screen) +// In this scene Rayquaza is a bg tilemap on bg 2, not a sprite static void Task_HandleRayTakesFlight(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - if (data[1] == 8) + // Delay, then fade in + if (tTimer == 8) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - data[2] = 0; - data[3] = 30; - data[4] = 0; - data[5] = 7; - data[1] = 0; - data[0]++; + tScale = 0; + tScaleSpeed = 30; + tYCoord = 0; + tYSpeed = 7; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 1: - data[2] += data[3]; - data[4] += data[5]; - if (data[3] > 3) - data[3] -= 3; - if (data[5] != 0) - data[5]--; - if (data[2] > 255) + // Fly in + tScale += tScaleSpeed; + tYCoord += tYSpeed; + + if (tScaleSpeed > 3) + tScaleSpeed -= 3; + + if (tYSpeed != 0) + tYSpeed--; + + if (tScale > 255) { - data[2] = 256; - data[3] = 0; - data[6] = 12; - data[7] = -1; - data[1] = 0; - data[0]++; + tScale = 256; + tScaleSpeed = 0; + tYOffset = 12; + tYOffsetDir = -1; + tTimer = 0; + tState++; } - SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0); + SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32, tScale, tScale, 0); break; case 2: - data[1]++; - SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32 + (data[6] >> 2), data[2], data[2], 0); - data[6] += data[7]; - if (data[6] == 12 || data[6] == -12) + // Float up and down + tTimer++; + SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0); + tYOffset += tYOffsetDir; + if (tYOffset == 12 || tYOffset == -12) { - data[7] *= -1; - if (data[1] > 295) + tYOffsetDir *= -1; + if (tTimer > 295) { - data[0]++; + tState++; BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, RGB_BLACK); } } break; case 3: - data[2] += 16; - SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0); + // Fly away, fade out + tScale += 16; + SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32, tScale, tScale, 0); Task_RayTakesFlightEnd(taskId); break; } } +#undef tState +#undef tTimer +#undef tScale +#undef tScaleSpeed +#undef tYCoord +#undef tYSpeed +#undef tYOffset +#undef tYOffsetDir + static void Task_RayTakesFlightEnd(u8 taskId) { if (!gPaletteFade.active) @@ -2035,56 +2144,71 @@ static void Task_RayTakesFlightEnd(u8 taskId) } } -static void sub_81D81A4(u8 taskId) +#define tSmokeId data[0] +#define tTimer data[1] + +#define sSmokeId data[0] +#define sTimer data[1] + +static void Task_TakesFlight_CreateSmoke(u8 taskId) { s16 *data = gTasks[taskId].data; - if ((data[1] & 3) == 0) + if ((tTimer & 3) == 0) { - u8 spriteId = CreateSprite(&sUnknown_0862AAA0, - (sUnknown_0862AAB8[data[0]][0] * 4) + 120, - (sUnknown_0862AAB8[data[0]][1] * 4) + 80, + u8 spriteId = CreateSprite(&sSpriteTemplate_TakesFlight_Smoke, + (sTakesFlight_SmokeCoords[tSmokeId][0] * 4) + 120, + (sTakesFlight_SmokeCoords[tSmokeId][1] * 4) + 80, 0); - gSprites[spriteId].data[0] = (s8)(data[0]); + gSprites[spriteId].sSmokeId = (s8)(tSmokeId); gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.priority = 2; InitSpriteAffineAnim(&gSprites[spriteId]); - if (data[0] == 9) + if (tSmokeId == MAX_SMOKE - 1) { DestroyTask(taskId); return; } else { - data[0]++; + tSmokeId++; } } - data[1]++; + tTimer++; } -static void sub_81D8260(struct Sprite *sprite) +#undef tSmokeId +#undef tTimer + +static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite) { - if (sprite->data[1] == 0) + if (sprite->sTimer == 0) { sprite->pos2.x = 0; sprite->pos2.y = 0; } else { - sprite->pos2.x += sUnknown_0862AAB8[sprite->data[0]][0]; - sprite->pos2.y += sUnknown_0862AAB8[sprite->data[0]][1]; + sprite->pos2.x += sTakesFlight_SmokeCoords[sprite->sSmokeId][0]; + sprite->pos2.y += sTakesFlight_SmokeCoords[sprite->sSmokeId][1]; } - sprite->data[1]++; - sprite->data[1] &= 0xF; + sprite->sTimer++; + sprite->sTimer &= 0xF; } -static void sub_81D82B0(void) +#undef sSmokeId +#undef sTimer + + +// RAY_ANIM_DESCENDS + +static void InitDescendsSceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0862AACC, ARRAY_COUNT(sUnknown_0862AACC)); + InitBgsFromTemplates(0, sBgTemplates_Descends, ARRAY_COUNT(sBgTemplates_Descends)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -2102,65 +2226,72 @@ static void sub_81D82B0(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D8358(void) +static void LoadDescendsSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(0, gRaySceneRayquazaLight_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, gRaySceneOvercast2_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneRayquazaLight_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneOvercast2_Tilemap, sRayScene->tilemapBuffers[3]); - CpuFastFill16(0, sRayScene->tilemapBuffers[2], 0x800); - CpuFastCopy(sRayScene->tilemapBuffers[3], sRayScene->tilemapBuffers[1], 0x800); + DecompressAndCopyTileDataToVram(0, gRaySceneDescends_Light_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, gRaySceneDescends_Bg_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneDescends_Light_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneDescends_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + CpuFastFill16(0, sRayScene->tilemapBuffers[2], BG_SCREEN_SIZE); + CpuFastCopy(sRayScene->tilemapBuffers[3], sRayScene->tilemapBuffers[1], BG_SCREEN_SIZE); CpuFastFill16(0, &sRayScene->tilemapBuffers[1][0x100], 0x340); - LoadCompressedPalette(gRaySceneOvercast2_Pal, 0, 0x40); + LoadCompressedPalette(gRaySceneDescends_Bg_Pal, 0, 0x40); gPlttBufferUnfaded[0] = RGB_WHITE; gPlttBufferFaded[0] = RGB_WHITE; - LoadCompressedSpriteSheet(&sUnknown_0862AAFC); - LoadCompressedSpriteSheet(&sUnknown_0862AB04); - LoadCompressedSpritePalette(&sUnknown_0862AB0C); + LoadCompressedSpriteSheet(&sSpriteSheet_Descends_Rayquaza); + LoadCompressedSpriteSheet(&sSpriteSheet_Descends_RayquazaTail); + LoadCompressedSpritePalette(&sSpritePal_Descends_Rayquaza); } -static void sub_81D844C(void) +// Draw ray of light emerging from the clouds +static void HBlankCB_RayDescends(void) { - u16 VCOUNT = GetGpuReg(REG_OFFSET_VCOUNT); - if (VCOUNT >= 24 && VCOUNT <= 135 && VCOUNT - 24 <= sRayScene->field_2008) - REG_BLDALPHA = 0xD08; + u16 vcount = GetGpuReg(REG_OFFSET_VCOUNT); + if (vcount >= 24 && vcount <= 135 && vcount - 24 <= sRayScene->revealedLightLine) + REG_BLDALPHA = 0xD08; // This line is above where light has been revealed, draw it else - REG_BLDALPHA = 0x1000; + REG_BLDALPHA = 0x1000; // Below where light has been revealed, hide it - if (VCOUNT == 0) + if (vcount == 0) { - if (sRayScene->field_2008 <= 0x1FFF) + if (sRayScene->revealedLightLine <= 0x1FFF) { - if (sRayScene->field_2008 <= 39) - sRayScene->field_2008 += 4; - else if (sRayScene->field_2008 <= 79) - sRayScene->field_2008 += 2; + // Increase the number of pixel rows of the light that have been revealed + // Gradually slows as it reaches the bottom + if (sRayScene->revealedLightLine <= 39) + sRayScene->revealedLightLine += 4; + else if (sRayScene->revealedLightLine <= 79) + sRayScene->revealedLightLine += 2; else - sRayScene->field_2008 += 1; + sRayScene->revealedLightLine += 1; } - sRayScene->field_200A++; + // Pointless + sRayScene->revealedLightTimer++; } } +#define tState data[0] +#define tTimer data[1] + static void Task_RayDescendsAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D82B0(); - sub_81D8358(); + InitDescendsSceneBgs(); + LoadDescendsSceneGfx(); SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); - sRayScene->field_2008 = 0; - sRayScene->field_200A = 0; - data[0] = 0; - data[1] = 0; - data[2] = 0; + sRayScene->revealedLightLine = 0; + sRayScene->revealedLightTimer = 0; + tState = 0; + tTimer = 0; + data[2] = 0; // Below data assignments do nothing data[3] = 0; data[4] = 0x1000; gTasks[taskId].func = Task_HandleRayDescends; @@ -2169,56 +2300,61 @@ static void Task_RayDescendsAnim(u8 taskId) static void Task_HandleRayDescends(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - if (data[1] == 8) + // Delay, then fade in + if (tTimer == 8) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 1: if (!gPaletteFade.active) { - if (data[1] == 10) + // Delay, then start ray of light + if (tTimer == 10) { - data[1] = 0; - data[0]++; - SetHBlankCallback(sub_81D844C); + tTimer = 0; + tState++; + SetHBlankCallback(HBlankCB_RayDescends); EnableInterrupts(INTR_FLAG_HBLANK | INTR_FLAG_VBLANK); } else { - data[1]++; + tTimer++; } } break; case 2: - if (data[1] == 80) + // Delay, then start Rayquaza emerging from clouds + if (tTimer == 80) { - data[1] = 0; - data[0]++; - sub_81D86CC(); + tTimer = 0; + tState++; + CreateDescendsRayquazaSprite(); } else { - data[1]++; + tTimer++; } break; case 3: - if (++data[1] == 368) + // Wait while Rayquaza descends + if (++tTimer == 368) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } break; case 4: + // Fade out BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayDescendsEnd; break; @@ -2237,76 +2373,92 @@ static void Task_RayDescendsEnd(u8 taskId) } } -static u8 sub_81D86CC(void) +#define sTailSpriteId data[0] +#define sTimer data[2] +#define sXMovePeriod data[3] +#define sYMovePeriod data[4] + +static u8 CreateDescendsRayquazaSprite(void) { - u8 spriteId = CreateSprite(&sUnknown_0862AB14, 160, 0, 0); + u8 spriteId = CreateSprite(&sSpriteTemplate_Descends_Rayquaza, 160, 0, 0); s16 *data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862AB2C, 184, -48, 0); - gSprites[spriteId].callback = sub_81D874C; + sTailSpriteId = CreateSprite(&sSpriteTemplate_Descends_RayquazaTail, 184, -48, 0); + gSprites[spriteId].callback = SpriteCB_Descends_Rayquaza; gSprites[spriteId].oam.priority = 3; - gSprites[data[0]].oam.priority = 3; + gSprites[sTailSpriteId].oam.priority = 3; return spriteId; } -static void sub_81D874C(struct Sprite *sprite) +static void SpriteCB_Descends_Rayquaza(struct Sprite *sprite) { s16 *data = sprite->data; - s16 counter = data[2]; - if (counter == 0) + s16 frame = sTimer; + + // Updates to Rayquaza's coords occur more frequently + // as time goes on (it accelerates as it emerges) + if (frame == 0) { - data[3] = 12; - data[4] = 8; + sXMovePeriod = 12; + sYMovePeriod = 8; } - else if (counter == 256) + else if (frame == 256) { - data[3] = 9; - data[4] = 7; + sXMovePeriod = 9; + sYMovePeriod = 7; } - else if (counter == 268) + else if (frame == 268) { - data[3] = 8; - data[4] = 6; + sXMovePeriod = 8; + sYMovePeriod = 6; } - else if (counter == 280) + else if (frame == 280) { - data[3] = 7; - data[4] = 5; + sXMovePeriod = 7; + sYMovePeriod = 5; } - else if (counter == 292) + else if (frame == 292) { - data[3] = 6; - data[4] = 4; + sXMovePeriod = 6; + sYMovePeriod = 4; } - else if (counter == 304) + else if (frame == 304) { - data[3] = 5; - data[4] = 3; + sXMovePeriod = 5; + sYMovePeriod = 3; } - else if (counter == 320) + else if (frame == 320) { - data[3] = 4; - data[4] = 2; + sXMovePeriod = 4; + sYMovePeriod = 2; } - if (data[2] % data[3] == 0) + if (sTimer % sXMovePeriod == 0) { sprite->pos2.x--; - gSprites[data[0]].pos2.x--; + gSprites[sTailSpriteId].pos2.x--; } - if (data[2] % data[4] == 0) + if (sTimer % sYMovePeriod == 0) { sprite->pos2.y++; - gSprites[data[0]].pos2.y++; + gSprites[sTailSpriteId].pos2.y++; } - data[2]++; + sTimer++; } -static void sub_81D8828(void) +#undef sTailSpriteId +#undef sTimer +#undef sXMovePeriod +#undef sYMovePeriod + + +// RAY_ANIM_CHARGES + +static void InitChargesSceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0862AB44, ARRAY_COUNT(sUnknown_0862AB44)); + InitBgsFromTemplates(0, sBgTemplates_Charges, ARRAY_COUNT(sBgTemplates_Charges)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -2324,124 +2476,151 @@ static void sub_81D8828(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D88D0(void) +static void LoadChargesSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(1, gRaySceneRayquazaChase_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, gRaySceneChaseStreaks_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(3, gRaySceneChaseBg_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRayChaseRayquazaChase2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRayChaseRayquazaChase_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneChaseStreaks_Tilemap, sRayScene->tilemapBuffers[2]); - LZDecompressWram(gRaySceneChaseBg_Tilemap, sRayScene->tilemapBuffers[3]); - LoadCompressedPalette(gRaySceneChase_Pal, 0, 0x80); -} + DecompressAndCopyTileDataToVram(1, gRaySceneCharges_Rayquaza_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(2, gRaySceneCharges_Streaks_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(3, gRaySceneCharges_Bg_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneCharges_Orbs_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneCharges_Rayquaza_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneCharges_Streaks_Tilemap, sRayScene->tilemapBuffers[2]); + LZDecompressWram(gRaySceneCharges_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + LoadCompressedPalette(gRaySceneCharges_Bg_Pal, 0, 0x80); +} + +#define tState data[0] +#define tTimer data[1] +#define tRayquazaTaskId data[2] +#define tSoundTimer data[3] static void Task_RayChargesAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8828(); - sub_81D88D0(); - sub_81D68C8(); + InitChargesSceneBgs(); + LoadChargesSceneGfx(); + SetWindowsHideVertBorders(); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); - data[0] = 0; - data[1] = 0; - data[2] = CreateTask(sub_81D8AD8, 0); + tState = 0; + tTimer = 0; + tRayquazaTaskId = CreateTask(Task_RayCharges_ShakeRayquaza, 0); gTasks[taskId].func = Task_HandleRayCharges; } static void Task_HandleRayCharges(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8BB4(); - if ((data[3] & 7) == 0 && data[0] <= 1 && data[1] <= 89) + RayCharges_AnimateBg(); + if ((tSoundTimer & 7) == 0 && tState <= 1 && tTimer <= 89) PlaySE(SE_INTRO_BLAST); - data[3]++; - switch (data[0]) + tSoundTimer++; + switch (tState) { case 0: - if (data[1] == 8) + // Delay, then fade in + if (tTimer == 8) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 1: - if (data[1] == 127) + // Delay while Rayquaza shakes, then start Rayquaza moving offscreen + if (tTimer == 127) { - data[1] = 0; - data[0]++; - gTasks[data[2]].func = sub_81D8B2C; + tTimer = 0; + tState++; + gTasks[tRayquazaTaskId].func = Task_RayCharges_FlyOffscreen; } else { - data[1]++; + tTimer++; } break; case 2: - if (data[1] == 12) + // Delay for Rayquaza's flying animation + if (tTimer == 12) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 3: + // Fade out BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayChargesEnd; break; } } -static void sub_81D8AD8(u8 taskId) +#undef tState +#undef tTimer +#undef tSoundTimer + +#define tState data[0] +#define tOffset data[1] +#define tShakeDir data[2] +#define tTimer data[15] + +static void Task_RayCharges_ShakeRayquaza(u8 taskId) { s16 *data = gTasks[taskId].data; - if ((data[15] & 3) == 0) + if ((tTimer & 3) == 0) { ChangeBgX(1, (Random() % 8 - 4) << 8, 0); ChangeBgY(1, (Random() % 8 - 4) << 8, 0); } - data[15]++; + tTimer++; } -static void sub_81D8B2C(u8 taskId) +// Rayquaza backs up then launches forward +static void Task_RayCharges_FlyOffscreen(u8 taskId) { s16 *data = gTasks[taskId].data; - if (data[0] == 0) + if (tState == 0) { ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); - data[0]++; - data[1] = 10; - data[2] = -1; + tState++; + tOffset = 10; + tShakeDir = -1; } - else if (data[0] == 1) + else if (tState == 1) { - ChangeBgX(1, data[1] << 8, 2); - ChangeBgY(1, data[1] << 8, 1); - data[1] += data[2]; - if (data[1] == -10) - data[2] *= -1; + ChangeBgX(1, tOffset << 8, 2); + ChangeBgY(1, tOffset << 8, 1); + tOffset += tShakeDir; + if (tOffset == -10) + tShakeDir *= -1; } } -static void sub_81D8BB4(void) +#undef tState +#undef tOffset +#undef tShakeDir +#undef tTimer + +static void RayCharges_AnimateBg(void) { + // Update yellow orbs ChangeBgX(2, 0x400, 2); ChangeBgY(2, 0x400, 1); + + // Update blue streaks ChangeBgX(0, 0x800, 2); ChangeBgY(0, 0x800, 1); } @@ -2449,21 +2628,26 @@ static void sub_81D8BB4(void) static void Task_RayChargesEnd(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8BB4(); + RayCharges_AnimateBg(); if (!gPaletteFade.active) { SetVBlankCallback(NULL); - sub_81D6904(); - DestroyTask(data[2]); + ResetWindowDimensions(); + DestroyTask(tRayquazaTaskId); gTasks[taskId].func = Task_SetNextAnim; } } -static void sub_81D8C38(void) +#undef tRayquazaTaskId + + +// RAY_ANIM_CHASES_AWAY + +static void InitChasesAwaySceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sUnknown_0862AD08, ARRAY_COUNT(sUnknown_0862AD08)); + InitBgsFromTemplates(1, sBgTemplates_ChasesAway, ARRAY_COUNT(sBgTemplates_ChasesAway)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -2478,237 +2662,287 @@ static void sub_81D8C38(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D8CC4(void) +static void LoadChasesAwaySceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(2, gRaySceneHushRing_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(0, gRaySceneHushBg_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneHushRing_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneHushBg_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneHushRing_Map, sRayScene->tilemapBuffers[2]); - LoadCompressedPalette(gRaySceneHushBg_Pal, 0, 0x60); - LoadCompressedSpriteSheet(&sUnknown_0862AC28); - LoadCompressedSpriteSheet(&sUnknown_0862AC30); - LoadCompressedSpriteSheet(&sUnknown_0862AC38); - LoadCompressedSpriteSheet(&sUnknown_0862AC40); - LoadCompressedSpriteSheet(&sUnknown_0862AC48); - LoadCompressedSpriteSheet(&sUnknown_0862AC50); - LoadCompressedSpritePalette(&sUnknown_0862AC58); - LoadCompressedSpritePalette(&sUnknown_0862AC60); - LoadCompressedSpritePalette(&sUnknown_0862AC68); - LoadCompressedSpritePalette(&sUnknown_0862AC70); -} + DecompressAndCopyTileDataToVram(2, gRaySceneChasesAway_Ring_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Light_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneChasesAway_Light_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[2]); + LoadCompressedPalette(gRaySceneChasesAway_Bg_Pal, 0, 0x60); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Groudon); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_GroudonTail); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Kyogre); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Rayquaza); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_RayquazaTail); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_KyogreSplash); + LoadCompressedSpritePalette(&sSpritePal_ChasesAway_Groudon); + LoadCompressedSpritePalette(&sSpritePal_ChasesAway_Kyogre); + LoadCompressedSpritePalette(&sSpritePal_ChasesAway_Rayquaza); + LoadCompressedSpritePalette(&sSpritePal_ChasesAway_KyogreSplash); +} + +#define tState data[0] +#define tTimer data[1] +#define tBgTaskId data[2] static void Task_RayChasesAwayAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8C38(); - sub_81D8CC4(); - sub_81D68C8(); + InitChasesAwaySceneBgs(); + LoadChasesAwaySceneGfx(); + SetWindowsHideVertBorders(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 14)); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); - data[0] = 0; - data[1] = 0; + tState = 0; + tTimer = 0; gTasks[taskId].func = Task_HandleRayChasesAway; - data[2] = CreateTask(sub_81D8FB0, 0); - gTasks[data[2]].data[0] = 0; - gTasks[data[2]].data[1] = 0; - gTasks[data[2]].data[2] = 0; - gTasks[data[2]].data[3] = 1; - gTasks[data[2]].data[4] = 1; + tBgTaskId = CreateTask(Task_ChasesAway_AnimateBg, 0); + gTasks[tBgTaskId].data[0] = 0; + gTasks[tBgTaskId].data[1] = 0; + gTasks[tBgTaskId].data[2] = 0; + gTasks[tBgTaskId].data[3] = 1; + gTasks[tBgTaskId].data[4] = 1; } static void Task_HandleRayChasesAway(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - if (data[1] == 8) + // Delay, then fade in + if (tTimer == 8) { - sub_81D90A8(taskId); + ChasesAway_CreateTrioSprites(taskId); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 1: - if (gSprites[data[5]].callback == sub_81D97E0) + // Wait for Rayquaza to enter and finish shout anim + if (gSprites[data[5]].callback == SpriteCB_ChasesAway_RayquazaFloat) { - if (data[1] == 64) + // Delay, then start Groudon/Kyogre leaving + if (tTimer == 64) { - sub_81D94D4(taskId); - sub_81D93D8(taskId); - data[1] = 0; - data[0]++; + ChasesAway_KyogreStartLeave(taskId); + ChasesAway_GroudonStartLeave(taskId); + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } } break; case 2: - if (data[1] == 448) + // Wait for Groudon/Kyogre to leave + if (tTimer == 448) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; - if (data[1] % 144 == 0) + // Flash bg white and trio black a few times + tTimer++; + if (tTimer % 144 == 0) { - sub_80A2C44(0xFFFE, 0, 0x10, 0, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 0, 0x10, 0, 0, 0, 1); + BlendPalettesGradually(0x0000FFFE, 0, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1); } } break; case 3: + // Fade out BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayChasesAwayEnd; break; } } -static void sub_81D8FB0(u8 taskId) +#undef tState +#undef tTimer + +#define tTimer data[0] +#define tBlendHi data[1] +#define tBlendLo data[2] +#define tBlendHiDir data[3] +#define tBlendLoDir data[4] + +// Flickers the ray of light behind Rayquaza +static void Task_ChasesAway_AnimateBg(u8 taskId) { s16 *data = gTasks[taskId].data; - if ((data[0] & 0xF) == 0) + if ((tTimer & 0xF) == 0) { - SetGpuReg(REG_OFFSET_BLDALPHA, ((data[1] + 14) << 8 & 0x1F00) | ((data[2] + 9) & 0xF)); - data[1] -= data[3]; - data[2] += data[4]; - if (data[1] == -3 || data[1] == 0) - data[3] *= -1; - if (data[2] == 3 || data[2] == 0) - data[4] *= -1; + SetGpuReg(REG_OFFSET_BLDALPHA, ((tBlendHi + 14) << 8 & 0x1F00) | ((tBlendLo + 9) & 0xF)); + tBlendHi -= tBlendHiDir; + tBlendLo += tBlendLoDir; + if (tBlendHi == -3 || tBlendHi == 0) + tBlendHiDir *= -1; + if (tBlendLo == 3 || tBlendLo == 0) + tBlendLoDir *= -1; } - data[0]++; + tTimer++; } +#undef tTimer +#undef tBlendHi +#undef tBlendLo +#undef tBlendHiDir +#undef tBlendLoDir + +#define tTimer data[1] + static void Task_RayChasesAwayEnd(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { StopMapMusic(); - if (data[1] == 0) + if (tTimer == 0) { SetVBlankCallback(NULL); - sub_81D6904(); + ResetWindowDimensions(); ResetSpriteData(); FreeAllSpritePalettes(); - DestroyTask(data[2]); + DestroyTask(tBgTaskId); } - if (data[1] == 32) + if (tTimer == 32) { - data[1] = 0; + tTimer = 0; gTasks[taskId].func = Task_SetNextAnim; } else { - data[1]++; + tTimer++; } } } -static void sub_81D90A8(u8 taskId) +#undef tTimer +#undef tBgTaskId + +#define tGroudonSpriteId taskData[3] +#define tKyogreSpriteId taskData[4] +#define tRayquazaSpriteId taskData[5] + +static void ChasesAway_CreateTrioSprites(u8 taskId) { s16 *taskData, *spriteData; taskData = gTasks[taskId].data; - taskData[3] = CreateSprite(&sUnknown_0862AC78, 64, 120, 0); - spriteData = gSprites[taskData[3]].data; - spriteData[0] = CreateSprite(&sUnknown_0862AC90, 16, 130, 0); - gSprites[taskData[3]].oam.priority = 1; + tGroudonSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Groudon, 64, 120, 0); + spriteData = gSprites[tGroudonSpriteId].data; + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_GroudonTail, 16, 130, 0); + gSprites[tGroudonSpriteId].oam.priority = 1; gSprites[spriteData[0]].oam.priority = 1; - taskData[4] = CreateSprite(&sUnknown_0862ACA8, 160, 128, 1); - spriteData = gSprites[taskData[4]].data; - spriteData[0] = CreateSprite(&sUnknown_0862ACA8, 192, 128, 1); - spriteData[1] = CreateSprite(&sUnknown_0862ACA8, 224, 128, 1); - gSprites[taskData[4]].oam.priority = 1; + tKyogreSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 160, 128, 1); + spriteData = gSprites[tKyogreSpriteId].data; + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 192, 128, 1); + spriteData[1] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 224, 128, 1); + gSprites[tKyogreSpriteId].oam.priority = 1; gSprites[spriteData[0]].oam.priority = 1; gSprites[spriteData[1]].oam.priority = 1; StartSpriteAnim(&gSprites[spriteData[0]], 1); StartSpriteAnim(&gSprites[spriteData[1]], 2); - taskData[5] = CreateSprite(&sUnknown_0862ACC0, 120, -65, 0); - spriteData = gSprites[taskData[5]].data; - spriteData[0] = CreateSprite(&sUnknown_0862ACD8, 120, -113, 0); - gSprites[taskData[5]].oam.priority = 1; + tRayquazaSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Rayquaza, 120, -65, 0); + spriteData = gSprites[tRayquazaSpriteId].data; + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_RayquazaTail, 120, -113, 0); + gSprites[tRayquazaSpriteId].oam.priority = 1; gSprites[spriteData[0]].oam.priority = 1; } -static void sub_81D9274(u8 taskId) +#define sBodyPartSpriteId1 data[0] +#define sBodyPartSpriteId2 data[1] +#define sTimer data[4] +#define sDecel data[5] +#define sSpeed data[6] +#define sIsKyogre data[7] + +static void ChasesAway_PushDuoBack(u8 taskId) { s16 *taskData = gTasks[taskId].data; - gSprites[taskData[3]].callback = sub_81D9338; - gSprites[taskData[3]].data[4] = 0; - gSprites[taskData[3]].data[5] = 0; - gSprites[taskData[3]].data[6] = 4; - gSprites[taskData[3]].data[7] = 0; + gSprites[tGroudonSpriteId].callback = SpriteCB_ChasesAway_DuoRingPush; + gSprites[tGroudonSpriteId].sTimer = 0; + gSprites[tGroudonSpriteId].sDecel = 0; + gSprites[tGroudonSpriteId].sSpeed = 4; + gSprites[tGroudonSpriteId].sIsKyogre = FALSE; - gSprites[taskData[4]].callback = sub_81D9338; - gSprites[taskData[4]].data[4] = 0; - gSprites[taskData[4]].data[5] = 0; - gSprites[taskData[4]].data[6] = 4; - gSprites[taskData[4]].data[7] = 1; + gSprites[tKyogreSpriteId].callback = SpriteCB_ChasesAway_DuoRingPush; + gSprites[tKyogreSpriteId].sTimer = 0; + gSprites[tKyogreSpriteId].sDecel = 0; + gSprites[tKyogreSpriteId].sSpeed = 4; + gSprites[tKyogreSpriteId].sIsKyogre = TRUE; } -static void sub_81D9338(struct Sprite *sprite) +// Pushes Groudon/Kyogre back slightly, for when Rayquaza's hyper voice ring comes out +static void SpriteCB_ChasesAway_DuoRingPush(struct Sprite *sprite) { - if ((sprite->data[4] & 7) == 0) + if ((sprite->sTimer & 7) == 0) { - if (sprite->data[7] == 0) + if (!sprite->sIsKyogre) { - sprite->pos1.x -= sprite->data[6]; - gSprites[sprite->data[0]].pos1.x -= sprite->data[6]; + sprite->pos1.x -= sprite->sSpeed; + gSprites[sprite->sBodyPartSpriteId1].pos1.x -= sprite->sSpeed; } else { - sprite->pos1.x += sprite->data[6]; - gSprites[sprite->data[0]].pos1.x += sprite->data[6]; - gSprites[sprite->data[1]].pos1.x += sprite->data[6]; + sprite->pos1.x += sprite->sSpeed; + gSprites[sprite->sBodyPartSpriteId1].pos1.x += sprite->sSpeed; + gSprites[sprite->sBodyPartSpriteId2].pos1.x += sprite->sSpeed; } - sprite->data[5]++; - sprite->data[6] -= sprite->data[5]; - if (sprite->data[5] == 3) + sprite->sDecel++; + sprite->sSpeed -= sprite->sDecel; + if (sprite->sDecel == 3) { - sprite->data[4] = 0; - sprite->data[5] = 0; - sprite->data[6] = 0; + sprite->sTimer = 0; + sprite->sDecel = 0; + sprite->sSpeed = 0; sprite->callback = SpriteCallbackDummy; return; } } - sprite->data[4]++; + sprite->sTimer++; } -static void sub_81D93D8(u8 taskId) +#undef sBodyPartSpriteId1 +#undef sBodyPartSpriteId2 +#undef sTimer +#undef sDecel +#undef sSpeed +#undef sIsKyogre + +static void ChasesAway_GroudonStartLeave(u8 taskId) { s16 *taskData = gTasks[taskId].data; - gSprites[taskData[3]].callback = sub_81D9420; - StartSpriteAnim(&gSprites[taskData[3]], 1); + gSprites[tGroudonSpriteId].callback = SpriteCB_ChasesAway_GroudonLeave; + StartSpriteAnim(&gSprites[tGroudonSpriteId], 1); } -static void sub_81D9420(struct Sprite *sprite) +static void SpriteCB_ChasesAway_GroudonLeave(struct Sprite *sprite) { switch (sprite->animCmdIndex) { @@ -2733,19 +2967,19 @@ static void sub_81D9420(struct Sprite *sprite) } } -static void sub_81D94D4(u8 taskId) +static void ChasesAway_KyogreStartLeave(u8 taskId) { s16 *taskData, *spriteData; taskData = gTasks[taskId].data; - spriteData = gSprites[taskData[4]].data; + spriteData = gSprites[tKyogreSpriteId].data; - gSprites[taskData[4]].callback = sub_81D9528; - gSprites[spriteData[0]].callback = sub_81D9528; - gSprites[spriteData[1]].callback = sub_81D9528; + gSprites[tKyogreSpriteId].callback = SpriteCB_ChasesAway_KyogreLeave; + gSprites[spriteData[0]].callback = SpriteCB_ChasesAway_KyogreLeave; + gSprites[spriteData[1]].callback = SpriteCB_ChasesAway_KyogreLeave; } -static void sub_81D9528(struct Sprite *sprite) +static void SpriteCB_ChasesAway_KyogreLeave(struct Sprite *sprite) { if ((sprite->data[4] & 3) == 0) { @@ -2756,9 +2990,9 @@ static void sub_81D9528(struct Sprite *sprite) } if (sprite->data[5] == 128) { - sprite->data[7] = CreateSprite(&sUnknown_0862ACF0, 152, 132, 0); + sprite->data[7] = CreateSprite(&sSpriteTemplate_ChasesAway_KyogreSplash, 152, 132, 0); gSprites[sprite->data[7]].oam.priority = 1; - sprite->data[7] = CreateSprite(&sUnknown_0862ACF0, 224, 132, 0); + sprite->data[7] = CreateSprite(&sSpriteTemplate_ChasesAway_KyogreSplash, 224, 132, 0); gSprites[sprite->data[7]].oam.priority = 1; gSprites[sprite->data[7]].hFlip = 1; sprite->data[5]++; @@ -2782,145 +3016,169 @@ static void sub_81D9528(struct Sprite *sprite) sprite->data[4]++; } -static void sub_81D961C(struct Sprite *sprite) +#define sTailSpriteId data[0] +#define sYOffset data[4] +#define sYOffsetDir data[5] +#define sFloatTimer data[6] +#define sTimer data[7] + +#define sTailFloatDelay data[4] +#define sTailFloatPeak data[5] + +static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *sprite) { - s16 counter = sprite->data[7]; - if (counter <= 64) + s16 frame = sprite->sTimer; + if (frame <= 64) { sprite->pos2.y += 2; - gSprites[sprite->data[0]].pos2.y += 2; - if (sprite->data[7] == 64) + gSprites[sprite->sTailSpriteId].pos2.y += 2; + if (sprite->sTimer == 64) { - sub_81D9868(sprite, 1, 0, -48); - sprite->data[4] = 5; - sprite->data[5] = -1; - gSprites[sprite->data[0]].data[4] = 3; - gSprites[sprite->data[0]].data[5] = 5; + ChasesAway_SetRayquazaAnim(sprite, 1, 0, -48); + sprite->sYOffset = 5; + sprite->sYOffsetDir = -1; + gSprites[sprite->sTailSpriteId].sTailFloatDelay = 3; + gSprites[sprite->sTailSpriteId].sTailFloatPeak = 5; } } - else if (counter <= 111) + else if (frame <= 111) { - sub_81D97E0(sprite); - if (sprite->data[4] == 0) + SpriteCB_ChasesAway_RayquazaFloat(sprite); + if (sprite->sYOffset == 0) PlaySE(SE_MUGSHOT); - if (sprite->data[4] == -3) - sub_81D9868(sprite, 2, 48, 16); + if (sprite->sYOffset == -3) + ChasesAway_SetRayquazaAnim(sprite, 2, 48, 16); } - else if (counter == 112) + else if (frame == 112) { - gSprites[sprite->data[0]].data[4] = 7; - gSprites[sprite->data[0]].data[5] = 3; - sub_81D97E0(sprite); + gSprites[sprite->sTailSpriteId].sTailFloatDelay = 7; + gSprites[sprite->sTailSpriteId].sTailFloatPeak = 3; + SpriteCB_ChasesAway_RayquazaFloat(sprite); } - else if (counter <= 327) + else if (frame <= 327) { - sub_81D97E0(sprite); + SpriteCB_ChasesAway_RayquazaFloat(sprite); } - else if (counter == 328) + else if (frame == 328) { - sub_81D97E0(sprite); - sub_81D9868(sprite, 3, 48, 16); + SpriteCB_ChasesAway_RayquazaFloat(sprite); + ChasesAway_SetRayquazaAnim(sprite, 3, 48, 16); sprite->pos2.x = 1; - gSprites[sprite->data[0]].pos2.x = 1; + gSprites[sprite->sTailSpriteId].pos2.x = 1; PlayCry1(SPECIES_RAYQUAZA, 0); - CreateTask(sub_81D98B4, 0); + CreateTask(Task_ChasesAway_AnimateRing, 0); } else { - switch (counter) + switch (frame) { case 376: sprite->pos2.x = 0; - gSprites[sprite->data[0]].pos2.x = 0; - sub_81D97E0(sprite); - sub_81D9868(sprite, 2, 48, 16); - sprite->callback = sub_81D97E0; + gSprites[sprite->sTailSpriteId].pos2.x = 0; + SpriteCB_ChasesAway_RayquazaFloat(sprite); + ChasesAway_SetRayquazaAnim(sprite, 2, 48, 16); + sprite->callback = SpriteCB_ChasesAway_RayquazaFloat; return; case 352: - sub_81D9274(FindTaskIdByFunc(Task_HandleRayChasesAway)); + ChasesAway_PushDuoBack(FindTaskIdByFunc(Task_HandleRayChasesAway)); break; } } - if (sprite->data[7] > 328 && (sprite->data[7] & 1) == 0) + if (sprite->sTimer > 328 && (sprite->sTimer & 1) == 0) { sprite->pos2.x *= -1; - gSprites[sprite->data[0]].pos2.x = sprite->pos2.x; + gSprites[sprite->sTailSpriteId].pos2.x = sprite->pos2.x; } - sprite->data[7]++; + sprite->sTimer++; } -static void sub_81D97E0(struct Sprite *sprite) +static void SpriteCB_ChasesAway_RayquazaFloat(struct Sprite *body) { - struct Sprite *sprite2 = &gSprites[sprite->data[0]]; - if (!(sprite->data[6] & sprite2->data[4])) + struct Sprite *tail = &gSprites[body->sTailSpriteId]; + if (!(body->sFloatTimer & tail->sTailFloatDelay)) { - sprite->pos2.y += sprite->data[4]; - gSprites[sprite->data[0]].pos2.y += sprite->data[4]; - sprite->data[4] += sprite->data[5]; - if (sprite->data[4] >= sprite2->data[5] || sprite->data[4] <= -sprite2->data[5]) + body->pos2.y += body->sYOffset; + gSprites[body->sTailSpriteId].pos2.y += body->sYOffset; // why access gSprites again? tail->pos2.y would be sufficient + body->sYOffset += body->sYOffsetDir; + if (body->sYOffset >= tail->sTailFloatPeak || body->sYOffset <= -tail->sTailFloatPeak) { - if (sprite->data[4] > sprite2->data[5]) - sprite->data[4] = sprite2->data[5]; - else if (sprite->data[4] < -sprite2->data[5]) - sprite->data[4] = -sprite2->data[5]; + if (body->sYOffset > tail->sTailFloatPeak) + body->sYOffset = tail->sTailFloatPeak; + else if (body->sYOffset < -tail->sTailFloatPeak) + body->sYOffset = -tail->sTailFloatPeak; - sprite->data[5] *= -1; + body->sYOffsetDir *= -1; } } - sprite->data[6]++; + body->sFloatTimer++; } -static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y) +static void ChasesAway_SetRayquazaAnim(struct Sprite *body, u8 animNum, s16 x, s16 y) { - struct Sprite *sprite2 = &gSprites[sprite->data[0]]; + struct Sprite *tail = &gSprites[body->sTailSpriteId]; - sprite2->pos1.x = sprite->pos1.x + x; - sprite2->pos1.y = sprite->pos1.y + y; + tail->pos1.x = body->pos1.x + x; + tail->pos1.y = body->pos1.y + y; - sprite2->pos2.x = sprite->pos2.x; - sprite2->pos2.y = sprite->pos2.y; + tail->pos2.x = body->pos2.x; + tail->pos2.y = body->pos2.y; - StartSpriteAnim(sprite, animNum); - StartSpriteAnim(sprite2, animNum); + StartSpriteAnim(body, animNum); + StartSpriteAnim(tail, animNum); } -static void sub_81D98B4(u8 taskId) +#undef sTailSpriteId +#undef sYOffset +#undef sYOffsetDir +#undef sFloatTimer +#undef sTimer +#undef sTailFloatDelay +#undef sTailFloatPeak + +#define tState data[0] +#define tScale data[1] +#define tNumRings data[2] +#define tScaleTimer data[3] +#define tScaleSpeed data[4] +#define tSoundTimer data[5] + +static void Task_ChasesAway_AnimateRing(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - SetBgAffine(2, 0x4000, 0x4000, 0x78, 0x40, 0x100, 0x100, 0); + SetBgAffine(2, 0x4000, 0x4000, 120, 64, 256, 256, 0); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); - data[4] = 16; - data[0]++; + tScaleSpeed = 16; + tState++; break; case 1: - if (data[5] == 8) + if (tSoundTimer == 8) PlaySE(SE_SLIDING_DOOR); - if (data[2] == 2) + if (tNumRings == 2) { - data[0]++; + tState++; } else { - data[1] += data[4]; - data[5]++; - if (data[3] % 3 == 0 && data[4] != 4) - data[4] -= 2; - - data[3]++; - SetBgAffine(2, 0x4000, 0x4000, 0x78, 0x40, 0x100 - data[1], 0x100 - data[1], 0); - if (data[1] > 255) + tScale += tScaleSpeed; + tSoundTimer++; + if (tScaleTimer % 3 == 0 && tScaleSpeed != 4) + tScaleSpeed -= 2; + + tScaleTimer++; + SetBgAffine(2, 0x4000, 0x4000, 120, 64, 256 - tScale, 256 - tScale, 0); + if (tScale > 255) { - data[1] = 0; - data[3] = 0; - data[5] = 0; - data[4] = 16; - data[2]++; + tScale = 0; + tScaleTimer = 0; + tSoundTimer = 0; + tScaleSpeed = 16; + tNumRings++; } } break; diff --git a/src/region_map.c b/src/region_map.c index de3b04cb2..3438ea3ed 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -129,30 +129,30 @@ static const u8 sRegionMap_MapSectionLayout[] = INCBIN_U8("graphics/pokenav/regi static const u16 sRegionMap_SpecialPlaceLocations[][2] = { - {MAPSEC_UNDERWATER_TERRA_CAVE, MAPSEC_ROUTE_105}, - {MAPSEC_UNDERWATER_124, MAPSEC_ROUTE_124}, - {MAPSEC_UNDERWATER_UNK1, MAPSEC_ROUTE_129}, - {MAPSEC_UNDERWATER_125, MAPSEC_ROUTE_126}, - {MAPSEC_UNDERWATER_126, MAPSEC_ROUTE_127}, - {MAPSEC_UNDERWATER_127, MAPSEC_ROUTE_128}, - {MAPSEC_UNDERWATER_129, MAPSEC_ROUTE_129}, - {MAPSEC_UNDERWATER_SOOTOPOLIS, MAPSEC_SOOTOPOLIS_CITY}, - {MAPSEC_UNDERWATER_128, MAPSEC_ROUTE_128}, - {MAPSEC_AQUA_HIDEOUT, MAPSEC_LILYCOVE_CITY}, - {MAPSEC_AQUA_HIDEOUT_OLD, MAPSEC_LILYCOVE_CITY}, - {MAPSEC_MAGMA_HIDEOUT, MAPSEC_ROUTE_112}, - {MAPSEC_UNDERWATER_SEALED_CHAMBER, MAPSEC_ROUTE_134}, - {MAPSEC_PETALBURG_WOODS, MAPSEC_ROUTE_104}, - {MAPSEC_JAGGED_PASS, MAPSEC_ROUTE_112}, - {MAPSEC_MT_PYRE, MAPSEC_ROUTE_122}, - {MAPSEC_SKY_PILLAR, MAPSEC_ROUTE_131}, - {MAPSEC_MIRAGE_TOWER, MAPSEC_ROUTE_111}, - {MAPSEC_TRAINER_HILL, MAPSEC_ROUTE_111}, - {MAPSEC_DESERT_UNDERPASS, MAPSEC_ROUTE_114}, - {MAPSEC_ALTERING_CAVE, MAPSEC_ROUTE_103}, - {MAPSEC_ARTISAN_CAVE, MAPSEC_ROUTE_103}, - {MAPSEC_ABANDONED_SHIP, MAPSEC_ROUTE_108}, - {MAPSEC_NONE, MAPSEC_NONE} + {MAPSEC_UNDERWATER_105, MAPSEC_ROUTE_105}, + {MAPSEC_UNDERWATER_124, MAPSEC_ROUTE_124}, + {MAPSEC_UNDERWATER_125, MAPSEC_ROUTE_129}, // BUG: Map will incorrectly display the name of Route 129 when diving on Route 125 (for Marine Cave only) + {MAPSEC_UNDERWATER_126, MAPSEC_ROUTE_126}, + {MAPSEC_UNDERWATER_127, MAPSEC_ROUTE_127}, + {MAPSEC_UNDERWATER_128, MAPSEC_ROUTE_128}, + {MAPSEC_UNDERWATER_129, MAPSEC_ROUTE_129}, + {MAPSEC_UNDERWATER_SOOTOPOLIS, MAPSEC_SOOTOPOLIS_CITY}, + {MAPSEC_UNDERWATER_SEAFLOOR_CAVERN, MAPSEC_ROUTE_128}, + {MAPSEC_AQUA_HIDEOUT, MAPSEC_LILYCOVE_CITY}, + {MAPSEC_AQUA_HIDEOUT_OLD, MAPSEC_LILYCOVE_CITY}, + {MAPSEC_MAGMA_HIDEOUT, MAPSEC_ROUTE_112}, + {MAPSEC_UNDERWATER_SEALED_CHAMBER, MAPSEC_ROUTE_134}, + {MAPSEC_PETALBURG_WOODS, MAPSEC_ROUTE_104}, + {MAPSEC_JAGGED_PASS, MAPSEC_ROUTE_112}, + {MAPSEC_MT_PYRE, MAPSEC_ROUTE_122}, + {MAPSEC_SKY_PILLAR, MAPSEC_ROUTE_131}, + {MAPSEC_MIRAGE_TOWER, MAPSEC_ROUTE_111}, + {MAPSEC_TRAINER_HILL, MAPSEC_ROUTE_111}, + {MAPSEC_DESERT_UNDERPASS, MAPSEC_ROUTE_114}, + {MAPSEC_ALTERING_CAVE, MAPSEC_ROUTE_103}, + {MAPSEC_ARTISAN_CAVE, MAPSEC_ROUTE_103}, + {MAPSEC_ABANDONED_SHIP, MAPSEC_ROUTE_108}, + {MAPSEC_NONE, MAPSEC_NONE} }; static const u16 sMarineCaveMapSecIds[] = @@ -998,7 +998,7 @@ static void InitMapBasedOnPlayerLocation(void) mapHeight = gMapHeader.mapLayout->height; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; - if (gRegionMap->mapSecId == MAPSEC_UNDERWATER_128 || gRegionMap->mapSecId == MAPSEC_UNDERWATER_MARINE_CAVE) + if (gRegionMap->mapSecId == MAPSEC_UNDERWATER_SEAFLOOR_CAVERN || gRegionMap->mapSecId == MAPSEC_UNDERWATER_MARINE_CAVE) gRegionMap->playerIsInCave = TRUE; break; case MAP_TYPE_UNDERGROUND: @@ -1089,7 +1089,7 @@ static void InitMapBasedOnPlayerLocation(void) x = 0; break; case MAPSEC_ROUTE_126: - case MAPSEC_UNDERWATER_125: + case MAPSEC_UNDERWATER_126: x = 0; if (gSaveBlock1Ptr->pos.x > 32) x++; diff --git a/src/sound.c b/src/sound.c index 361624b44..ee1753bb3 100644 --- a/src/sound.c +++ b/src/sound.c @@ -41,24 +41,24 @@ static void Task_DuckBGMForPokemonCry(u8 taskId); static void RestoreBGMVolumeAfterPokemonCry(void); static const struct Fanfare sFanfares[] = { - { MUS_LEVEL_UP, 80 }, - { MUS_OBTAIN_ITEM, 160 }, - { MUS_EVOLVED, 220 }, - { MUS_OBTAIN_TMHM, 220 }, - { MUS_HEAL, 160 }, - { MUS_OBTAIN_BADGE, 340 }, - { MUS_MOVE_DELETED, 180 }, - { MUS_OBTAIN_BERRY, 120 }, - { MUS_AWAKEN_LEGEND, 710 }, - { MUS_SLOTS_JACKPOT, 250 }, - { MUS_SLOTS_WIN, 150 }, - { MUS_TOO_BAD, 160 }, - { MUS_RG_POKE_FLUTE, 450 }, - { MUS_RG_OBTAIN_KEY_ITEM, 170 }, - { MUS_RG_DEX_RATING, 196 }, - { MUS_OBTAIN_B_POINTS, 313 }, - { MUS_OBTAIN_SYMBOL, 318 }, - { MUS_REGISTER_MATCH_CALL, 135 }, + { MUS_LEVEL_UP, 80 }, + { MUS_OBTAIN_ITEM, 160 }, + { MUS_EVOLVED, 220 }, + { MUS_OBTAIN_TMHM, 220 }, + { MUS_HEAL, 160 }, + { MUS_OBTAIN_BADGE, 340 }, + { MUS_MOVE_DELETED, 180 }, + { MUS_OBTAIN_BERRY, 120 }, + { MUS_AWAKEN_LEGEND, 710 }, + { MUS_SLOTS_JACKPOT, 250 }, + { MUS_SLOTS_WIN, 150 }, + { MUS_TOO_BAD, 160 }, + { MUS_RG_POKE_FLUTE, 450 }, + { MUS_RG_OBTAIN_KEY_ITEM, 170 }, + { MUS_RG_DEX_RATING, 196 }, + { MUS_OBTAIN_B_POINTS, 313 }, + { MUS_OBTAIN_SYMBOL, 318 }, + { MUS_REGISTER_MATCH_CALL, 135 }, }; #define CRY_VOLUME 120 // was 125 in R/S diff --git a/src/start_menu.c b/src/start_menu.c index 68a316185..f470a58b2 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -43,7 +43,6 @@ #include "trainer_card.h" #include "window.h" #include "constants/songs.h" -#include "rom_8011DC0.h" #include "union_room.h" #include "constants/rgb.h" diff --git a/src/task.c b/src/task.c index a2df66de8..a97496009 100644 --- a/src/task.c +++ b/src/task.c @@ -200,7 +200,7 @@ u8 GetTaskCount(void) void SetWordTaskArg(u8 taskId, u8 dataElem, u32 value) { - if (dataElem <= 14) + if (dataElem < NUM_TASK_DATA - 1) { gTasks[taskId].data[dataElem] = value; gTasks[taskId].data[dataElem + 1] = value >> 16; @@ -209,7 +209,7 @@ void SetWordTaskArg(u8 taskId, u8 dataElem, u32 value) u32 GetWordTaskArg(u8 taskId, u8 dataElem) { - if (dataElem <= 14) + if (dataElem < NUM_TASK_DATA - 1) return (u16)gTasks[taskId].data[dataElem] | (gTasks[taskId].data[dataElem + 1] << 16); else return 0; diff --git a/src/trade.c b/src/trade.c index 6480f3594..3072b8585 100644 --- a/src/trade.c +++ b/src/trade.c @@ -30,7 +30,6 @@ #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" #include "random.h" -#include "rom_8011DC0.h" #include "save.h" #include "script.h" #include "sound.h" @@ -529,7 +529,7 @@ static const u8 *const sTVFindThatGamerTextGroup[] = { gTVFindThatGamerText03 }; -static const u8 *const sTVBreakinsNewsTextGroup[] = { +static const u8 *const sTVBreakingNewsTextGroup[] = { gTVBreakingNewsText00, gTVBreakingNewsText01, gTVBreakingNewsText02, @@ -1332,7 +1332,7 @@ void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlaye } } -bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unused, u8 sheen, u8 language) +bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 color, u8 sheen, u8 language) { TVShow *show; u8 name[32]; @@ -1355,7 +1355,7 @@ bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unus StripExtCtrlCodes(name); StringCopy(show->threeCheers.worstBlenderName, name); show->threeCheers.flavor = flavor; - show->threeCheers.unk_03_3 = unused; + show->threeCheers.color = color; show->threeCheers.sheen = sheen; tv_store_id_2x(show); show->threeCheers.language = gGameLanguage; @@ -6253,7 +6253,7 @@ static void DoTVShowBreakingNewsTV(void) TVShowDone(); break; } - ShowFieldMessage(sTVBreakinsNewsTextGroup[state]); + ShowFieldMessage(sTVBreakingNewsTextGroup[state]); } static void DoTVShowSecretBaseVisit(void) diff --git a/src/union_room.c b/src/union_room.c index f79dd9cc4..f886d0383 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -2677,7 +2677,7 @@ static void Task_RunUnionRoom(u8 taskId) if (input == -2 || input == IN_UNION_ROOM) { uroom->playerSendBuffer[0] = IN_UNION_ROOM; - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); StringCopy(gStringVar4, sIfYouWantToDoSomethingTexts[gLinkPlayers[0].gender]); uroom->state = UR_STATE_REQUEST_DECLINED; } @@ -2692,7 +2692,7 @@ static void Task_RunUnionRoom(u8 taskId) else { uroom->playerSendBuffer[0] = gPlayerCurrActivity | IN_UNION_ROOM; - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_SEND_ACTIVITY_REQUEST; } } @@ -2721,7 +2721,7 @@ static void Task_RunUnionRoom(u8 taskId) uroom->playerSendBuffer[0] = ACTIVITY_TRADE | IN_UNION_ROOM; uroom->playerSendBuffer[1] = sUnionRoomTrade.species; uroom->playerSendBuffer[2] = sUnionRoomTrade.level; - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST; break; case UR_STATE_WAIT_FOR_RESPONSE_TO_REQUEST: @@ -2908,32 +2908,32 @@ static void Task_RunUnionRoom(u8 taskId) if (!HasAtLeastTwoMonsOfLevel30OrLower()) { uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST; StringCopy(gStringVar4, sText_NeedTwoMonsOfLevel30OrLower2); } else { - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG; } } else if (gPlayerCurrActivity == (ACTIVITY_CARD | IN_UNION_ROOM)) { - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); ViewURoomPartnerTrainerCard(gStringVar4, uroom, TRUE); uroom->state = UR_STATE_PRINT_CARD_INFO; } else { - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_PRINT_START_ACTIVITY_MSG; } break; case 1: // DECLINE case -1: uroom->playerSendBuffer[0] = ACTIVITY_DECLINE | IN_UNION_ROOM; - sub_800FE50(uroom->playerSendBuffer); + Rfu_SendPacket(uroom->playerSendBuffer); uroom->state = UR_STATE_DECLINE_ACTIVITY_REQUEST; GetYouDeclinedTheOfferMessage(gStringVar4, gPlayerCurrActivity); break; @@ -3754,7 +3754,7 @@ static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str printerTemplate.y = y; printerTemplate.currentX = x; printerTemplate.currentY = y; - printerTemplate.unk = 0; + printerTemplate.style = 0; gTextFlags.useAlternateDownArrow = FALSE; switch (colorIdx) diff --git a/src/union_room_chat.c b/src/union_room_chat.c index fd2a95791..a7df14dd7 100755 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -2121,7 +2121,7 @@ static void Task_ReceiveChatMessage(u8 taskId) static bool8 TryAllocDisplay(void) { - sDisplay = Alloc(sizeof(*sDisplay)); + sDisplay = Alloc(sizeof(struct UnionRoomChatDisplay)); if (sDisplay && TryAllocSprites()) { ResetBgsAndClearDma3BusyFlags(0); diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 87b200f14..81fa16720 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -237,7 +237,7 @@ static void PrintHeaderTexts(void) FillWindowPixelBuffer(1, PIXEL_FILL(0)); FillWindowPixelBuffer(2, PIXEL_FILL(0)); WCSS_AddTextPrinterParameterized(0, 1, sHeaderTexts[0], GetStringCenterAlignXOffset(1, sHeaderTexts[0], 0xC0), 6, COLORMODE_GREEN); - for (i = 0; i < (int)ARRAY_COUNT(*sHeaderTexts) - 1; i++) + for (i = 0; i < (int)ARRAY_COUNT(sHeaderTexts[0]) - 1; i++) { WCSS_AddTextPrinterParameterized(1, 1, sHeaderTexts[i + 1], 0, 30 * i + 8, COLORMODE_WHITE_LGRAY); } @@ -362,12 +362,12 @@ static u32 CountPlayersInGroupAndGetActivity(struct UnkStruct_x20 * unk20, u32 * { if (group_players(i) == 0) { - k = 0; + k = 0; //Should just be 1 without the increment after the loop ends but that doesn't match. for (j = 0; j < RFU_CHILD_MAX; j++) { if (unk20->gname_uname.gname.child_sprite_gender[j] != 0) k++; } - k++; + k++; //See above comment. groupCounts[group_type(i)] += k; } else diff --git a/sym_common.txt b/sym_common.txt index e2c50fdaa..02fde8971 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -63,7 +63,7 @@ gReservedSpritePaletteCount: .include "save.o" .include "battle_tower.o" .include "intro.o" - .include "battle_anim_special.o" + .include "battle_anim_throw.o" .include "battle_factory_screen.o" .include "apprentice.o" |