diff options
137 files changed, 3695 insertions, 3263 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..f7aac71e8 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -10741,7 +10741,7 @@ BallThrowTrainerBlock: Special_SafariBallThrow: 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/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/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/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/include/battle.h b/include/battle.h index 78e7b809a..0ebc9fe01 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; }; 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/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/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/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 d4e4581c9..cb8708aeb 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4812,16 +4812,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[]; 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/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/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/battle_anim_special.c b/src/battle_anim_throw.c index 3deb2065e..7049931d3 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_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, }, }; @@ -379,7 +401,7 @@ const struct SpriteTemplate gPokeblockSpriteTemplate = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_817330C, + .callback = SpriteCB_PokeBlock_Throw, }; const union AnimCmd gUnknown_085E5350[] = @@ -400,7 +422,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_085E535C = .anims = gUnknown_085E5358, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_817330C, + .callback = SpriteCB_PokeBlock_Throw, }; extern const struct SpriteTemplate gWishStarSpriteTemplate; @@ -578,7 +600,7 @@ void AnimTask_FlashHealthboxOnLevelUp(u8 taskId) static void sub_8170A38(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 +680,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 +752,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 +765,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 +803,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; + 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 +838,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 +894,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 +1056,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 +1264,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 +1348,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 +1357,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 + +#define sDuration data[0] +#define sTargetX data[2] +#define sTargetY data[4] +#define sAmplitude data[5] -static void sub_81719EC(struct Sprite *sprite) +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); 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], gBallParticleAnimNums[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 +1482,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,29 +1515,40 @@ 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; @@ -1396,7 +1563,7 @@ u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId) { u8 taskId; - sub_8171D60(ballId); + LoadBallParticleGfx(ballId); taskId = CreateTask(gBallParticleAnimationFuncs[ballId], 5); gTasks[taskId].data[1] = x; gTasks[taskId].data[2] = y; @@ -1408,10 +1575,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) @@ -1433,7 +1600,7 @@ static void PokeBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = PokeBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; @@ -1492,7 +1659,7 @@ static void TimerBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; @@ -1526,7 +1693,7 @@ static void DiveBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; @@ -1561,7 +1728,7 @@ static void SafariBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; @@ -1596,7 +1763,7 @@ static void UltraBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; @@ -1637,7 +1804,7 @@ static void GreatBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; @@ -1687,7 +1854,7 @@ static void RepeatBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = RepeatBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; @@ -1731,7 +1898,7 @@ static void MasterBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = FanOutBallOpenParticles_Step1; gSprites[spriteId].oam.priority = priority; @@ -1775,7 +1942,7 @@ static void PremierBallOpenParticleAnimation(u8 taskId) spriteId = CreateSprite(&gBallParticlesSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) { - sub_8171E20(); + IncrBallParticleCount(); StartSpriteAnim(&gSprites[spriteId], gBallParticleAnimNums[ballId]); gSprites[spriteId].callback = PremierBallOpenParticleAnimation_Step1; gSprites[spriteId].oam.priority = priority; @@ -1802,7 +1969,7 @@ static void PremierBallOpenParticleAnimation_Step1(struct Sprite *sprite) static void DestroyBallOpenAnimationParticle(struct Sprite *sprite) { - int i, j; + s32 i, j; if (!gMain.inBattle) { @@ -1813,8 +1980,8 @@ 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++) { @@ -1840,70 +2007,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 +2086,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,14 +2199,25 @@ 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; + isShiny = FALSE; gBattleSpritesDataPtr->healthBoxesData[battler].flag_x80 = 1; otId = GetMonData(mon, MON_DATA_OT_ID); personality = GetMonData(mon, MON_DATA_PERSONALITY); @@ -2042,12 +2236,12 @@ 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; } } @@ -2055,58 +2249,60 @@ void sub_8172EF0(u8 battler, struct Pokemon *mon) gBattleSpritesDataPtr->healthBoxesData[battler].field_1_x1 = 1; } -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,24 +2313,24 @@ 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]; + battler = gTasks[taskId].tBattler; gBattleSpritesDataPtr->healthBoxesData[battler].field_1_x1 = 1; } @@ -2142,25 +2338,24 @@ static void sub_81731B0(u8 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 +2363,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 +2398,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; + 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..3461e9754 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -281,14 +281,14 @@ static void sub_8064734(void) && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) { - 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) { - sub_8172EF0(BATTLE_PARTNER(gActiveBattler), &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); + TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); } @@ -369,7 +369,7 @@ static void sub_8064B04(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } else { @@ -497,7 +497,7 @@ static void sub_8064F40(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) { - 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..63aa6eaea 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -383,7 +383,7 @@ static void sub_814B69C(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !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..858201b4b 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -290,9 +290,9 @@ static void sub_805F560(void) 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]]); + TryShinyAnimation(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]]); + 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) @@ -369,7 +369,7 @@ 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]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x1) { @@ -481,7 +481,7 @@ 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]]); + 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..c9a3bc2e0 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -977,9 +977,9 @@ static void sub_8058B40(void) bool32 r8 = FALSE; if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(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]]); + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { @@ -1082,7 +1082,7 @@ static void sub_805902C(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !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_player_partner.c b/src/battle_controller_player_partner.c index fd6616746..7796bef09 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -568,7 +568,7 @@ static void sub_81BBAE8(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !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..76e84da41 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -263,9 +263,9 @@ static void sub_818686C(void) bool32 r8 = FALSE; if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(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]]); + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { @@ -350,7 +350,7 @@ static void sub_8186C48(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } else { @@ -479,7 +479,7 @@ static void sub_8187084(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80) { - sub_8172EF0(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 2362e3c84..387586f88 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -280,12 +280,12 @@ static void sub_8189D40(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - sub_8172EF0(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(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]]); + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); } } @@ -463,7 +463,7 @@ static void sub_818A470(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x80 && !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_wally.c b/src/battle_controller_wally.c index a5b1ae2f7..a26694a8e 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -286,9 +286,9 @@ 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]]); + TryShinyAnimation(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]]); + TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive diff --git a/src/battle_dome.c b/src/battle_dome.c index 3654d2ccf..16798f46c 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -4547,7 +4547,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; @@ -5080,7 +5080,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; @@ -5534,7 +5534,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); @@ -5578,7 +5578,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; @@ -5759,7 +5759,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; 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/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..f0edc53dc 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -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; 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/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 b26e86209..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: diff --git a/src/graphics.c b/src/graphics.c index 9a8d9f845..21aa7b50f 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"); @@ -1352,25 +1351,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_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/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/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..458d6c94b 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); 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/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 @@ -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; 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" |