From 56d3506a6ff29fbafe7178aeb2ede0e93e031488 Mon Sep 17 00:00:00 2001 From: Ninjdai Date: Sat, 11 Nov 2023 20:08:20 +0100 Subject: [PATCH] Added day/night system --- README.md | 5 +- asm/macros/map.inc | 3 +- common_syms/overworld.txt | 3 + data/layouts/BudportCity/map.bin | Bin 3680 -> 3680 bytes data/maps/BattleFrontier_OutsideEast/map.json | 26 + data/maps/BattleFrontier_OutsideWest/map.json | 26 + data/maps/BudportCity/map.json | 14 +- data/maps/DewfordTown/map.json | 13 + data/maps/EverGrandeCity/map.json | 14 +- data/maps/FallarborTown/map.json | 26 + data/maps/FortreeCity/map.json | 26 + data/maps/LavaridgeTown/map.json | 26 + data/maps/LilycoveCity/map.json | 13 + data/maps/MauvilleCity/map.json | 26 + data/maps/MossdeepCity/map.json | 26 + data/maps/OldaleTown/map.json | 26 + data/maps/PacifidlogTown/map.json | 13 + data/maps/PetalburgCity/map.json | 26 + data/maps/Route101/map.json | 13 + data/maps/Route102/map.json | 13 + data/maps/Route112/map.json | 13 + data/maps/Route113/map.json | 26 + data/maps/Route119/map.json | 26 + data/maps/RustboroCity/map.json | 247 + data/maps/SlateportCity/map.json | 26 + data/maps/SootopolisCity/map.json | 26 + data/maps/VerdanturfTown/map.json | 26 + .../primary/general/metatile_attributes.bin | Bin 1024 -> 1024 bytes data/tilesets/primary/general/metatiles.bin | Bin 8192 -> 8192 bytes data/tilesets/primary/general/palettes/04.pal | 14 +- data/tilesets/primary/general/palettes/04.pla | 6 + data/tilesets/primary/general/palettes/13.pal | 32 +- data/tilesets/primary/general/tiles.png | Bin 7657 -> 7718 bytes .../metatile_attributes.bin | Bin 1020 -> 1020 bytes .../metatiles.bin | Bin 8160 -> 8160 bytes .../battle_frontier_outside_east/tiles.png | Bin 3798 -> 3873 bytes .../metatile_attributes.bin | Bin 1020 -> 1020 bytes .../metatiles.bin | Bin 8160 -> 8160 bytes .../battle_frontier_outside_west/tiles.png | Bin 5544 -> 5535 bytes .../secondary/budport.bak/anim/balloons/0.png | Bin 0 -> 227 bytes .../secondary/budport.bak/anim/balloons/1.png | Bin 0 -> 234 bytes .../secondary/budport.bak/anim/balloons/2.png | Bin 0 -> 231 bytes .../secondary/budport.bak/anim/balloons/3.png | Bin 0 -> 234 bytes .../budport.bak/metatile_attributes.bin | Bin 0 -> 812 bytes .../secondary/budport.bak/metatiles.bin | Bin 0 -> 6496 bytes .../secondary/budport.bak/palettes/00.pal | 19 + .../secondary/budport.bak/palettes/01.pal | 19 + .../secondary/budport.bak/palettes/02.pal | 19 + .../secondary/budport.bak/palettes/03.pal | 19 + .../secondary/budport.bak/palettes/04.pal | 19 + .../secondary/budport.bak/palettes/05.pal | 19 + .../secondary/budport.bak/palettes/06.pal | 19 + .../secondary/budport.bak/palettes/07.pal | 19 + .../secondary/budport.bak/palettes/08.pal | 19 + .../secondary/budport.bak/palettes/09.pal | 19 + .../secondary/budport.bak/palettes/10.pal | 19 + .../secondary/budport.bak/palettes/11.pal | 19 + .../secondary/budport.bak/palettes/12.pal | 19 + .../secondary/budport.bak/palettes/13.pal | 19 + .../secondary/budport.bak/palettes/14.pal | 19 + .../secondary/budport.bak/palettes/15.pal | 19 + data/tilesets/secondary/budport.bak/tiles.png | Bin 0 -> 10642 bytes .../secondary/budport/metatile_attributes.bin | Bin 812 -> 812 bytes data/tilesets/secondary/budport/metatiles.bin | Bin 6496 -> 6496 bytes .../secondary/budport/palettes/06.pal | 4 +- .../secondary/budport/palettes/06.pla | 2 + .../secondary/budport/palettes/12.pal | 24 +- .../secondary/budport/palettes/12.pla | 6 + .../secondary/budport/palettes/15.pal | 30 +- data/tilesets/secondary/budport/tiles.png | Bin 10642 -> 6587 bytes .../secondary/dewford/metatile_attributes.bin | Bin 758 -> 758 bytes data/tilesets/secondary/dewford/metatiles.bin | Bin 6064 -> 6064 bytes data/tilesets/secondary/dewford/tiles.png | Bin 3810 -> 3917 bytes .../ever_grande/metatile_attributes.bin | Bin 336 -> 336 bytes .../secondary/ever_grande/palettes/01.pal | 24 +- .../secondary/ever_grande/palettes/08.pal | 2 +- .../secondary/ever_grande/palettes/08.pla | 3 + .../fallarbor/metatile_attributes.bin | Bin 734 -> 734 bytes .../secondary/fallarbor/metatiles.bin | Bin 5872 -> 5872 bytes .../secondary/fallarbor/palettes/00.pal | 26 +- .../secondary/fallarbor/palettes/07.pal | 6 +- .../secondary/fallarbor/palettes/07.pla | 3 + data/tilesets/secondary/fallarbor/tiles.png | Bin 4653 -> 4635 bytes data/tilesets/secondary/fortree/metatiles.bin | Bin 4480 -> 4480 bytes .../secondary/fortree/palettes/08.pal | 4 +- .../secondary/fortree/palettes/08.pla | 6 + data/tilesets/secondary/fortree/tiles.png | Bin 4414 -> 4433 bytes .../secondary/lavaridge/metatiles.bin | Bin 7056 -> 7056 bytes .../secondary/lavaridge/palettes/06.pal | 32 +- .../secondary/lavaridge/palettes/06.pla | 7 + data/tilesets/secondary/lavaridge/tiles.png | Bin 4087 -> 4087 bytes .../lilycove/metatile_attributes.bin | Bin 702 -> 702 bytes .../tilesets/secondary/lilycove/metatiles.bin | Bin 5616 -> 5616 bytes .../secondary/lilycove/palettes/06.pal | 22 +- .../secondary/lilycove/palettes/06.pla | 6 + .../secondary/lilycove/palettes/15.pal | 30 +- data/tilesets/secondary/lilycove/tiles.png | Bin 3652 -> 3728 bytes .../mauville/metatile_attributes.bin | Bin 1020 -> 1020 bytes .../tilesets/secondary/mauville/metatiles.bin | Bin 8160 -> 8160 bytes .../secondary/mauville/palettes/07.pal | 4 +- .../secondary/mauville/palettes/07.pla | 3 + .../secondary/mauville/palettes/08.pal | 10 +- .../secondary/mauville/palettes/09.pal | 12 +- .../secondary/mauville/palettes/10.pal | 4 +- .../secondary/mauville/palettes/10.pla | 4 + .../secondary/mauville/palettes/11.pal | 2 +- .../secondary/mauville/palettes/11.pla | 3 + data/tilesets/secondary/mauville/tiles.png | Bin 6069 -> 6025 bytes .../tilesets/secondary/mossdeep/metatiles.bin | Bin 7264 -> 7264 bytes .../secondary/mossdeep/palettes/01.pal | 24 +- .../secondary/mossdeep/palettes/02.pal | 32 +- .../secondary/mossdeep/palettes/08.pal | 2 +- .../secondary/mossdeep/palettes/08.pla | 3 + .../secondary/mossdeep/palettes/09.pal | 32 +- data/tilesets/secondary/mossdeep/tiles.png | Bin 4111 -> 4129 bytes .../secondary/pacifidlog/palettes/02.pal | 32 +- .../secondary/pacifidlog/palettes/09.pal | 2 +- .../secondary/pacifidlog/palettes/09.pla | 2 + data/tilesets/secondary/pacifidlog/tiles.png | Bin 4718 -> 12672 bytes .../secondary/petalburg/metatiles.bin | Bin 2304 -> 2304 bytes .../secondary/petalburg/palettes/02.pal | 32 +- .../secondary/petalburg/palettes/06.pal | 4 +- .../secondary/petalburg/palettes/06.pla | 3 + .../secondary/petalburg/palettes/07.pal | 26 +- .../secondary/petalburg/palettes/07.pla | 3 + .../secondary/petalburg/palettes/09.pal | 32 +- .../secondary/petalburg/palettes/09.pla | 3 + data/tilesets/secondary/petalburg/tiles.png | Bin 1740 -> 1738 bytes .../rustboro/metatile_attributes.bin | Bin 700 -> 700 bytes .../tilesets/secondary/rustboro/metatiles.bin | Bin 5600 -> 5616 bytes .../secondary/rustboro/palettes/06.pal | 26 +- .../secondary/rustboro/palettes/06.pla | 7 + .../secondary/rustboro/palettes/10.pal | 2 +- data/tilesets/secondary/rustboro/tiles.png | Bin 3938 -> 4057 bytes .../slateport/metatile_attributes.bin | Bin 812 -> 812 bytes .../secondary/slateport/metatiles.bin | Bin 6496 -> 6496 bytes .../secondary/slateport/palettes/06.pal | 4 +- .../secondary/slateport/palettes/06.pla | 2 + .../secondary/slateport/palettes/12.pal | 24 +- .../secondary/slateport/palettes/12.pla | 6 + .../secondary/slateport/palettes/15.pal | 30 +- data/tilesets/secondary/slateport/tiles.png | Bin 6559 -> 6587 bytes .../secondary/sootopolis/palettes/06.pal | 8 +- .../secondary/sootopolis/palettes/06.pla | 5 + .../secondary/sootopolis/palettes/10.pal | 4 +- .../secondary/sootopolis/palettes/10.pla | 8 + .../secondary/sootopolis/palettes/15.pal | 30 +- data/tilesets/secondary/sootopolis/tiles.png | Bin 2695 -> 13423 bytes gflib/sprite.c | 17 +- gflib/sprite.h | 1 + .../long_grass/palette_night.pal | 51 + .../battle_terrain/plain/palette_night.pal | 51 + .../pond_water/palette_cave.pal | 51 + .../pond_water/palette_night.pal | 51 + .../battle_terrain/rock/palette_night.pal | 51 + .../battle_terrain/sand/palette_night.pal | 51 + graphics/battle_terrain/sky/palette_night.pal | 51 + graphics/battle_terrain/sky/tiles.png | Bin 820 -> 821 bytes .../tall_grass/palette_night.pal | 51 + .../battle_terrain/water/palette_night.pal | 51 + .../field_effects/pics/shadow_extra_large.png | Bin 152 -> 5188 bytes graphics/field_effects/pics/shadow_large.png | Bin 144 -> 4911 bytes graphics/field_effects/pics/shadow_medium.png | Bin 143 -> 4767 bytes graphics/field_effects/pics/shadow_small.png | Bin 143 -> 4807 bytes graphics/object_events/palettes/light.pal | 19 + graphics/object_events/palettes/light2.pal | 19 + .../object_events/palettes/neon_light.pal | 19 + .../pics/misc/bike_tire_tracks.png | Bin 0 -> 2330 bytes graphics/object_events/pics/misc/light.png | Bin 0 -> 2330 bytes .../object_events/pics/misc/mart_light.png | Bin 0 -> 5395 bytes .../pics/misc/poke_center_light.png | Bin 0 -> 5378 bytes graphics/weather/fog.pal | 2 +- include/battle_tower.h | 4 +- include/constants/event_objects.h | 10 +- include/constants/field_effects.h | 9 + include/event_data.h | 2 +- include/event_object_movement.h | 20 +- include/field_effect.h | 1 + include/field_effect_helpers.h | 1 + include/field_player_avatar.h | 14 +- include/field_weather.h | 8 +- include/fieldmap.h | 2 +- include/fldeff.h | 2 +- include/global.fieldmap.h | 26 +- include/global.h | 1 + include/graphics.h | 9 + include/overworld.h | 19 + include/palette.h | 16 + pokeemerald-0.png | Bin 0 -> 9521 bytes src/battle_bg.c | 53 +- src/battle_tower.c | 6 +- src/battle_transition.c | 21 + src/cable_car.c | 5 +- src/contest_util.c | 15 +- src/data/field_effects/field_effect_objects.h | 76 +- src/data/graphics/battle_terrain.h | 9 + .../object_events/object_event_graphics.h | 6 + .../object_event_graphics_info.h | 52 +- .../object_event_graphics_info_pointers.h | 5 +- .../object_events/object_event_pic_tables.h | 2 + src/data/tilesets/graphics.h | 152 +- src/data/tilesets/headers.h | 15 + src/decoration.c | 9 +- src/event_data.c | 2 +- src/event_object_movement.c | 713 +- src/event_object_movement.c.orig | 9348 ----------------- src/faraway_island.c | 2 +- src/field_effect.c | 14 +- src/field_effect_helpers.c | 223 +- src/field_player_avatar.c | 65 +- src/field_screen_effect.c | 2 + src/field_specials.c | 19 +- src/field_weather.c | 135 +- src/field_weather_effect.c | 63 +- src/fieldmap.c | 49 +- src/fldeff_misc.c | 2 +- src/fldeff_rocksmash.c | 2 +- src/graphics.c | 2 +- src/load_save.c | 14 + src/mirage_tower.c | 9 +- src/naming_screen.c | 3 +- src/overworld.c | 164 +- src/palette.c | 365 +- src/palette_util.c | 5 +- src/pokemon.c | 10 +- src/rotating_gate.c | 8 +- src/scrcmd.c | 2 +- src/secret_base.c | 2 +- src/shop.c | 7 +- src/trainer_see.c | 14 +- src/union_room_player_avatar.c | 7 +- src/util.c | 2 +- tools/gbagfx/gfx.c | 4 +- tools/gbagfx/gfx.h | 1 + tools/gbagfx/jasc_pal.c | 33 +- tools/gbagfx/main.c | 8 +- 236 files changed, 3652 insertions(+), 10504 deletions(-) create mode 100644 data/tilesets/primary/general/palettes/04.pla create mode 100644 data/tilesets/secondary/budport.bak/anim/balloons/0.png create mode 100644 data/tilesets/secondary/budport.bak/anim/balloons/1.png create mode 100644 data/tilesets/secondary/budport.bak/anim/balloons/2.png create mode 100644 data/tilesets/secondary/budport.bak/anim/balloons/3.png create mode 100644 data/tilesets/secondary/budport.bak/metatile_attributes.bin create mode 100644 data/tilesets/secondary/budport.bak/metatiles.bin create mode 100644 data/tilesets/secondary/budport.bak/palettes/00.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/01.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/02.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/03.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/04.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/05.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/06.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/07.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/08.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/09.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/10.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/11.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/12.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/13.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/14.pal create mode 100644 data/tilesets/secondary/budport.bak/palettes/15.pal create mode 100644 data/tilesets/secondary/budport.bak/tiles.png create mode 100644 data/tilesets/secondary/budport/palettes/06.pla create mode 100644 data/tilesets/secondary/budport/palettes/12.pla create mode 100644 data/tilesets/secondary/ever_grande/palettes/08.pla create mode 100644 data/tilesets/secondary/fallarbor/palettes/07.pla create mode 100644 data/tilesets/secondary/fortree/palettes/08.pla create mode 100644 data/tilesets/secondary/lavaridge/palettes/06.pla create mode 100644 data/tilesets/secondary/lilycove/palettes/06.pla create mode 100644 data/tilesets/secondary/mauville/palettes/07.pla create mode 100644 data/tilesets/secondary/mauville/palettes/10.pla create mode 100644 data/tilesets/secondary/mauville/palettes/11.pla create mode 100644 data/tilesets/secondary/mossdeep/palettes/08.pla create mode 100644 data/tilesets/secondary/pacifidlog/palettes/09.pla create mode 100644 data/tilesets/secondary/petalburg/palettes/06.pla create mode 100644 data/tilesets/secondary/petalburg/palettes/07.pla create mode 100644 data/tilesets/secondary/petalburg/palettes/09.pla create mode 100644 data/tilesets/secondary/rustboro/palettes/06.pla create mode 100644 data/tilesets/secondary/slateport/palettes/06.pla create mode 100644 data/tilesets/secondary/slateport/palettes/12.pla create mode 100644 data/tilesets/secondary/sootopolis/palettes/06.pla create mode 100644 data/tilesets/secondary/sootopolis/palettes/10.pla create mode 100644 graphics/battle_terrain/long_grass/palette_night.pal create mode 100644 graphics/battle_terrain/plain/palette_night.pal create mode 100644 graphics/battle_terrain/pond_water/palette_cave.pal create mode 100644 graphics/battle_terrain/pond_water/palette_night.pal create mode 100644 graphics/battle_terrain/rock/palette_night.pal create mode 100644 graphics/battle_terrain/sand/palette_night.pal create mode 100644 graphics/battle_terrain/sky/palette_night.pal create mode 100644 graphics/battle_terrain/tall_grass/palette_night.pal create mode 100644 graphics/battle_terrain/water/palette_night.pal create mode 100644 graphics/object_events/palettes/light.pal create mode 100644 graphics/object_events/palettes/light2.pal create mode 100644 graphics/object_events/palettes/neon_light.pal create mode 100644 graphics/object_events/pics/misc/bike_tire_tracks.png create mode 100644 graphics/object_events/pics/misc/light.png create mode 100644 graphics/object_events/pics/misc/mart_light.png create mode 100644 graphics/object_events/pics/misc/poke_center_light.png create mode 100644 pokeemerald-0.png delete mode 100644 src/event_object_movement.c.orig diff --git a/README.md b/README.md index 91f45d6ff..b87596c78 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,13 @@ If you have suggestions, found bugs, or just want to talk, feel free to DM me on * Bigger bag (Up to 999 of each item) * X/Y-style wrapping summary screen ([Zeturic](https://www.pokecommunity.com/showpost.php?p=10060875&postcount=27)) * Options default to fast text speed and set battle type + * Day/Night system [by quocmanh94](https://github.com/quocmanh94/pokeemerald/commit/a0fd237009a1bd1f999e3ab25ca07508985b4435) **WIP** - Brand new region of ??????? -**For the future** -- D/N System with adapted encounters +**For the future (TODO list)** +- Adapt encounters to D/N system - Every pokemon obtainable, including mythicals/legendaries ------ diff --git a/asm/macros/map.inc b/asm/macros/map.inc index 21445138d..be3b09b49 100644 --- a/asm/macros/map.inc +++ b/asm/macros/map.inc @@ -22,9 +22,8 @@ @ Defines an object event template for map data, to be used by a normal object. Mirrors the struct layout of ObjectEventTemplate in include/global.fieldmap.h .macro object_event index:req, gfx:req, x:req, y:req, elevation:req, movement_type:req, x_radius:req, y_radius:req, trainer_type:req, sight_radius_tree_etc:req, script:req, event_flag:req .byte \index - .byte \gfx + .2byte \gfx .byte OBJ_KIND_NORMAL - .space 1 @ Padding .2byte \x, \y .byte \elevation .byte \movement_type diff --git a/common_syms/overworld.txt b/common_syms/overworld.txt index dcada0bbe..18df2d4eb 100644 --- a/common_syms/overworld.txt +++ b/common_syms/overworld.txt @@ -6,3 +6,6 @@ gFieldCallback gFieldCallback2 gLocalLinkPlayerId gFieldLinkPlayerCount +gTimeOfDay +currentTimeBlend +gTimeUpdateCounter diff --git a/data/layouts/BudportCity/map.bin b/data/layouts/BudportCity/map.bin index 9c5c2a030166d3008fd5e5104c635c89b3121184..c5fbddc9b5e019244067a335bb80cbd75d59c5d3 100644 GIT binary patch delta 21 ccmaDL^FU@p0~<$=bBlAUbFcH}4z?TY0Abq*g#Z8m delta 21 ccmaDL^FU@p0~?2jgQtU+gSW%x4z?TY09TO*eEF-1?~4RV{e+OJZvS|@px=! zHvt+s&``J02u_pf9h`8&vt-5CtqJ4W7`K?>iEoNWH59V18SyAA{WIUI8Z3u?p%0Ww zS7@*}7HeGwJXAQ~Q6C|;F;8m{xmpdqQhS0kAGqWNSD{VaHLpgjV#%|&JHxztFg3y7 zWbNpaylB~ip2wHgzT`x!S*e{EOf=4EPaCm!WTk1^%D1YOIA`_U82G5Z<5#@(p7u}f zl+nO<`(AiYzma?B^uv$wMv-Ie4C5v2g-gx-AJ%zu16Mgr7(Eho>{MYH`{#(U6|*`Y zqy*-i4>+DPc4M`wI#mAyyK2!+*Y78~z^73wo6j@!4EoL@!)H3+*0DZuPFaEzkB)b^ z*Q8cCzvBZQg>8!HdckW#tsSc%`0PDQ;y+IR9Q7y48~s<_^WSa#GaM?P@rlN9o1UdF M{gzwLogsb6-(yWcCIA2c literal 1024 zcmbVLNlpVn3^d`|hf1Pmu9IJYBEgyU4O}?nHz2V{EK;6C1ey0x<=%!!;ef54cD3!Y zdl|DVC`Oql#o&BEJse?c(O8+#olWf7-fK(*`U+@7#Qw!T>Qbx>D=@#J5-=}Dp5qR# z5Igw@&K4Bl%(M!7sq_n{c(W56W0^YfxHFtKOtR!hFBP-=s)3Z_{@YZm=DV8_bEqE; z+8WezT(DPwC*^XD8}c1ND!If}#Z0s%y9wDJ$dz!~qrSpspINu~R(Cc)`h~4`>0ep{ z@c`{eF-69B&BZZROv4ci_Wc*;ePeB6sU6DB(xD^6qE;7H#?()a8J;=AtYDv~=o%YW zlvUaHV6jFE94=nPbQ?KS{&a`Vrguu!ofaJY?IxVMjP9e~I^5d>iIt=H4v+Sf_sA8l pzuKEHccd4ukt=(SYB!zmA8Ls2dav-G`-j9n_8V-}w`c1m{{Y(oJ;49~ diff --git a/data/tilesets/primary/general/metatiles.bin b/data/tilesets/primary/general/metatiles.bin index b369fee08601125d6939c56b4268e9ea78968917..6290d4f413f71de40053d7388a9a104124314336 100644 GIT binary patch delta 646 zcmZutF=!M)6y4dm-4i|He7s#1Li`77)GBl4(14=5?m#M z8x`XerqR;0!h+Z(cq!6}U?*r51(Rs7NR!5yJ68~#$ME?7z5nJj?YJF3t#UX6i?w!X zC0>agb2e$SvA8;Zx+C6+&VRtMBV2RWjJ781)P~wnd$iZk=h??@!#01wPxvan361Xe zT7^kgWfg;AR{Mu*-mqu;J?2;+NRi-cS(Q`x)vxF%iNLih&i}iBObuaY@&O*)! z<2V8;NLcI{Zs=8h*K0V=Ttml&Up@v^kbxfYrcX_zPzMt=Q4i9f8}Ww|un{gM5C@K9 zBfOboGzu+hk^LHb#*C*$E;>%L8=l4f2VSIsF0v#0-!i-@Z^=H^#~zC(;)QrAX61~W zmo0fort-49BK6LJCJsOkxyeO0;>e={7NRniBRyAYqD`^3-1J;7$!AhaABz}b7-c&p z;3w3s^2qf7*u Xu7fiF+0!2yzY6Xff39ca{crehS+Jjj delta 646 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 Qy?(LAmuy^h6nLKH3+@UMNdN!< literal 1020 zcmb7DK@NZ*4D$(I{GV6<{{dHO?U)c1f~=)2)5K+ovBuOB_}_s0eIlPLwk`BKJny5b z`kUBw&5@__x{bV4Vzv9URmVJKbmIP)SFu@CN>DGr=3LVyECuktsT}Xw&%ByiadzZ> zugvRvQT6l|W~WPPoKj(3t3qcDYA(B3^(t`LB`oa>s|R?gX*uy`#MwWtzbnW78GGL! Re^4D@w0tI=J3_VMT~1XO53c|K diff --git a/data/tilesets/secondary/battle_frontier_outside_east/metatiles.bin b/data/tilesets/secondary/battle_frontier_outside_east/metatiles.bin index d2e3a6995d201699fa29319078db6216da6f5fca..fdda78e32e42caeb651053bb471050a302ac4b02 100644 GIT binary patch delta 634 zcma)3F-yZh6h1Fn#X-}%_^vG&PADCvlY@&1h_g8A6!8Z*IXO5xB*TG=L!A{`HQ?CW z+-&RSB&`K4Dpqt5tWsZEgBj&<9N&G9?|t99=2CO%G(}Z`PK6dV4Qj}+Fg7_|)XuPa zpv5<d{Eol#w?X3&HxM^@wK%M6el1$O zH4u*YhG>hXcpu}_r=2eJK|=s&2K9YJeHMTZN@h0gD3j;bp#)b@fmo*mWV8ZhP)C`CxjzMp zaSTc2z%lqZ#*lc_M`i<+lR`J68pmENgQx> zn_ZLf(=$B57xW;;PwbiX*cVf)xlKzu$2^(jaNKjl%Uq38TxD!{f*CQy z@9xk|8MpUqb-~`pzlqmMNJOcI{fdFLb8kMFFX?U?qmjtWaq*=1c-{>^&k6Yf4M^Q3 delta 569 zcmb7AJxoF|5UzcQsDq`gEf9IuND zo16SB%J`5(i3>&s6OF;^gQv5-G}rI$`rUWuWxecm7-PqBBY43wJ~cTrm$n>Z*!dDQ z`Ar)VJ6J(PRb`dcWt~~dQV>x!_C*`)Tj*`RsE_!iKIV~?E_-4F_Rg?hVyP}`0`^!n zJ+c;S$qwttAm5Z->B)hQ-M#t4iO7f^E8P<|!Ol<&DMAHm6k$gTnOXg>z#@DuQ|usg z4pfzZ>Qv?uSoOtF)I>o*TbMHsXh;hJg|v$8*dr|saW3vf1xktnt1=)Is+f|C*z(dJ zgV~AMjA6)&JRM{G5!;0AnM^>`CT-p$J&q6xnLDb~2l0&F=Thf5fjh0e_?q73Ngr<| z)_IAQ*x6h_0`IA_S@$kc$JkQ(G-(@mo7_lY1rw_>1)T_Vq9QHQG8i=TZQO3zJ|Vv; ikYSR#X}_rl@<^V^3o$Ws!ch?|rLWSjH+}c>2B9AaxtS;c diff --git a/data/tilesets/secondary/battle_frontier_outside_east/tiles.png b/data/tilesets/secondary/battle_frontier_outside_east/tiles.png index 59ac5b7e9a488751d4510d92e82594473344fae5..1b70f52f6b05c6c6c9320e52fbfad3a1f82cd131 100644 GIT binary patch delta 3869 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 bh+;c?tV099NyqFl;9m|~J6M%jP-6cF$`tpE delta 3778 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 diff --git a/data/tilesets/secondary/battle_frontier_outside_west/metatile_attributes.bin b/data/tilesets/secondary/battle_frontier_outside_west/metatile_attributes.bin index a4b865a317305665fbf2137c8ac5e9b8d28a1a33..8b31735aac660fa43a2cc60e476bedc1b29c43ca 100644 GIT binary patch literal 1020 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 literal 5544 zcmWkyc{G&&7yi8Oj4}3I$TA3#Wn?FeCCWOMkaa|M8bu`WTB5Rl2}w*!gqV^g>tsn~ zEs~`e*|kvCM1KALdhU77z31F}&%Mt*=iVe*nX)kpF#`bDPMD0g{2d*K_d=DfP4@d=T~=-uQ>GRLlGI)a^B4F(e`$+Y7W59 z)i`91sJ!6OJ*l89n`go$uKYdNX3S1n@! zSG#NqLL2ANo@c)7|9Kv8b$WHX)mMKo^1tWXiM|3E(>>GM!-GXf-wN5bTKXT^b;aYp zuP;8lU>Y!2igLdzuRY)$DxqD`#&|vX6xDM0o3j1p-zAqxE4ZHJh1(%kjoqYVdd3hF z^CPBWgtU06&^v~Q!J_&*)_@&arvUWdgSyi_SuFM!1YD85bjh|XBU&vl5sz<2A=-yn z9$*f+9%i1gc$kE225=)Xvf3u{BeS7L8|!Zp&R}gGGT``{KfYYSIAi~L2C0}LSkHSe z4R3t8AHf6pa<`L8y&wUT>V~0Cz;BrGa(x}ENhBdgPi>ZiMC0D+1PLS`g>~c*G%pq* zM7d$sI9GHps4`hZPMu=?W)80vJm613vWp^=ndn6VoZ*OChf9)kALn^Z|Kd4uGO454 z&m*-0kHOUtZRp*HAGeo}pFp!0Zp3Uk%9t8!(AJMia*=NFU(&)m#y+*dPz1q_4Fg^V zJmo;U>tB*l`un;~Qx3%=bMQ{@iZUiOIj4M>f2Xa`{|nUkb?)S3t}}$FmRir5}uP6l`3dgc$kojCL-F_f;&Uo3G| z;|MNR{$ZFapN^OWNzsNOUmt@5waKWQgLEcwdvF4cnZxVD(l95mh_tVFPnp*+&=f_r zALarzuzEhVa;D9u>K#0A$7EIc?Ns31{Ta7+Nq+!p zGhPtdUT1!O&ydxE|F>Q_^m=B{lam~9*}Waqfm-QaSIS?Q=YHo`YThH&`U`L+8p4q( z8pcPyPVRf&@TicywM5R0?Wh7|F)-Vvp|a@3J-@MtC2J0)C|Riy{?KP5->gd@1pz+Q zG$0pqE$&_wGwm9Y;TkrzhoB2PQn@urMqDeQ)$&K63C1){ccy$m5JZFGne+bv70AK? z6v>#lqUTI-`U8?Ox4Msj{!@Rji0sg|0T&@d1{&J}jX&nRS!u7f(+rhxlsN;|lGN9U z5h*A2b}h8WbWK0*py@>_Xyi8oiJP;CJgz2_oNW!0uX2`KgPg8ZEeRwZkRUFU*3tn{ zbAs^tZQEi1?rOCfKP`|PB)`3s%Vj|Fgd$Vv3O08zyt-H zjJ)$xCP)i*isxn3gS;dNslS9jJU=c3iH??Z8se`qHTKqcG2xi+!xV>&d-0ZBr@(pJ zrKP8yTab^$pT>&!2U;}eckAThejZr0{~>6tuc(M5vi1?B&h6fL^`03p5TUNqu2Qxj z1;qM}GQUV9O8UU%i+}}(p~y&(Cgs?CLq}Cf`PXj1IGQggvX`RcgfT8c1o2Z4 zZm1X0Vm{0fD5?{1mdbaIq5++PP9ec!?ZwdKtMmftASPUqJcU^tM03Q`vXEH;NK^sE z?82FEro~6z;K7%2<9+RF&*}f0w#r2T(0OG%<6|=y*+|1`4;G38@<^JafCsp=AA5rF zdP!heyyKo6eKF}`hXJWNEQ^8UrGEoj6rSSU_(FD1f@8(PKB3888hrr+`ZA#Oz{>vS zB_#=B;p?=E;MJ|>&Z zHJ^J6rd|uah<_YCz5QTD4n+>{Tn^j&@^eWsouhP~5XaNmb+R`5%X;lcxCKj9`>um32I!_R zL7?t<@X-Ly{XHTAwUdS4rANM+ezu3Eov!gvv&6VwS=NTct+~jD7qL_6^}0n~znOMU z?CeFwPA7{!+k;TKSFWJx|1_dqR)PR@c;*^xp>_TH7demG2)?=!6J(;QZvZ4?mUoY> zR&zol5{$gLVsRg5sDZHN&aGag`<6C|i%d#~TEtqQH6SPp9o7f@85f0Tq zybfshl)swuVqW0#c}Uohkcx8dpe=`HBZ4qK2Bdz}*EdTzjp@>)#G%T1 zEMN4CzAenBNKHky`eZBstj9rNfew^t`)p>TQFbrt=4~LJI?LTjpw(AG?^u+_Bcp;C zimd2HhXHxBZ4A8Ix*RcLd<} z9Ip;pXeA$du*NryMmlZI=B$9-{iE!5ZMf&<+-RJXzUV;b+ZNuJjTeSX+<76HQEtYL z<_n39Jk$GrnjCj;DQQS162KGx=2w2s$CN?HK_1m{ zuodcXvxh$~k9vJg1WC9tV-C|eu}gh~x9RWrE_PUV zktipg$bi{4hf)!6gz6RMbL?1FVgd5hnvYO<{j9dj*5DcFmTo#9zoKI86lT>19l%Ge zd&W)`@{?_8Y_x#eYCzDq2aA&zdg7J$za^H}*))E^Ek(lq(E>uS5$kIfprq#%HzKx> zAl2u@LqlbArT+P%xWJ*m*U6zZhaRb|x^ZzPq%79R8M>@z{<3S|cxSg_Vv|^n#&=1)Uf=m{MiZK-bQ&eP z3$YBYsPb##7WCS>9Ob^!ki-9NQdoaJ#V4lSnCCaS^vm{`3k&Hb1cp444=|6oZUE=|@GQP*sk0h*3JKYx`3yOds-Z zJsmjQU@Z+bo0rCrKZ}|(T7Bg>r2MVv&^_rJlzwqspl`P&LlW>O*tkEzG^MZ?-WDAn z6}f1AA%gB91;k15=l8xYBLi_E-QC58pCn+nFoQ0kWEQa}!}QEef11DBaDyFJlc$pF z^v~YQOQPhJ5qJ4n2iw5+mb5 zvT`V2`LFY4h=U&&d0`$)Y;pk4l#GF>SFRSR_==YEfoyn{;ITNSJ;gwi^JSaA%!RRo zEq(kGBSLPEX@Z4cYF`{7`_9;Xo4BR+vp}lIp#yKO07E_}(KFL!Cn;gquF^uWLuX^l zE9GH_wS!;Fx=f#5SUD(7y*)qL!0wp zebEu~3^O<`3-L2IiOQdgxm@hd6RC(4Dmahs*P-_|>^Q^j{StFIzH`2npRDjeZ8`QX zdc%SD=t1k5IFR=|gdx)(1N}NMqSwIQ2?u^K-LpZ3={W*^`#LflAADEf{3l$R$$O;V z=(nS8V{r38OgNsyIXZ;bT%?8l1u;$lnHtT1LzhoiVvV#2*5~i5W}w_ob!YG%5gXd~ zV&JT~jUMVk>gDLNYED&{3dwS&r2tN8&^b2YNmmdJ351HA=YY$wQYos6S+y$Bj9^NU zKRGl$_Mau=#QQjW;+|t(3HCh{8k@&Vk0xhgxE*kes+O>7aM>-M)TR{W)5rp<*8--l z3=81dYO_X{uB`!}KjcyY6>!L_K*BFYhf5kvX;w~kD9YF73aF4nUhj@KdMMZ5zfbiI zjluF7?aB!@`fnZ@-D~CATFn_4x1|u^B}7|S0jqTE>l2qfOkk&Zqk$Z4`tNMQf}Vh% zAWSt6wB_arL_0k~6V4&bvq5KQ$r{tXEYYJpUbqJ^7qsKv6Z2^F;UMKYElp|QD$8(f+~NS{ zX-Kum&c)rmt@WvKvEu8NS=Z~}g6+AvjV&d;%lCyZGWFNN)~@+2bGpZ``A^){D=wGB z$P2#cz8&|*KVtX&*;N}3^{s9Vc`oqrx+^EjGK%hKnAf7D#QS-@w_9dVNrfJm3qkpZ zZWr!A6&ULJ-V<}3G9`J-&R20Y?SFY5BJ&=6jdlCcvxla(wg)>LxS)T8Q%qpg;yBB} z@%`@W4WGQx^6mev&;BgJ2sh6KM+|zzt2e6Nxq&Qt@a+_vDxNrg?RRf)Q9W6U3mR+> z;QG7cGt1-N+hg5wrE+K17=3PM{^3_6A-YxIj}5Dci@T?{EitD&^w=za3m)iOm|5-) zJLSLs)^WZiNA=iHmR^4G!Aj*_4~4$zJ)fEBWx@w19coDXqAsuer@i(5J9nq|UhG}P zoHA6PHFw8Z;}Y+--#HlGb0qcYzm9YAle;?g&5Y(@gpEC`n3r(D$9FMyl?lgP@K#E2 zX!AI#9F6tHqkjgiz7*gzv>W$;1c;;ihm$zV1ja~M$`LsOOb8RLhqFXg5-NBJ>0=5c z=y=AJU0mYM#~ap5v=C!;nr*32a&TCZwhQFss)8q?1c;H6oTRmJ z#l+)l+{U1aq5b8ijDq3JKsGe5!-VthND82w%>tHi#}OJDgrsoO)y_-N0~iQ~%y{DA zu}m~^3`4U(q8?wRlupjQ4|TNsz?3p-KNl3 zS-8pHLiPJA;iEf$pV>1wYcM`9rbXF$iK{l*9p1MG1ERZ**#s4_ury)6E^MLQ;7M9N z8hB~4&Zf&lC77SrRv=$57_WVf&a5EpMZz(VHBNzCC`37%(AYvVqdkf@Bb;d{jha0Qwm*rCI?MXlUw0fr9oVWgBx6))_Xz81I`QU;30lu? zY?I5VCmgm~{uNx@cq7bP^y8+Rf=hQy13&q0@oQSK8lMnqoS7tIvZ&5$9V~~!o6{a} zaT;PrS?*Z)N}C(2QL8x^-{(w_&AwYh@qu`C0yIf?&jhv zgA%x9>Uv;=%vsc~q zYzWtkPbu4l@}rCX?qU!)yIqSay;zJ*&C1;v}F2m1QW4y zWo#TJjwL+(m7mjQdlbRcHTv6}MUK;+K7ZI%95kaC_3rbR5JUR)C-=|-V~<9EZ0-HH zT&lFjK)2%4aIHtse#1!Ok25__dV6nT4~Co- z;T^C1@Vx; zZ8njX(|m=q`Iov=z;hLfTHfK*xT8;f*b+3aN8mxkrDnDKH*@E3*@M3C5nMqh1F1r2 zBdb62624Xv{-xQ^dIoi(#y(!>s%TM%HmxdQ94pW@;r9e%(S%Vb2-T+gqEvs5aJdH6 z^C0aPg+;ptWoaz?VWT37r4b4rKWx)A$D@(lN+T@c+c9u;sY;kU%|K$@sO|6kHt@&| z7=3q2l$1q&v|Yj;@1|9Yyw&d2CPHiaXWo27kM%E=ZtE)5qP9E7$HW@E*VM8_yp2eH zYII$Qe&n(-#>u!Yg~$d%=MI=Cw7Ah#%+ar#;+Svy>BvRzYcdPH?9qow85^5Xp}N$K zIyFg*bsI_aq8M@T)c@Lbs2<7Y$NE4tV>TzMurtoM*V|&liB(~A294V zYMJRRLRMV5K~>l2LIGl6&HHfAq(R~!Y3SWeLcR1_>`D8Pirx>P>faX?oIYt~Ty02- F{~ujBvZMe2 diff --git a/data/tilesets/secondary/budport.bak/anim/balloons/0.png b/data/tilesets/secondary/budport.bak/anim/balloons/0.png new file mode 100644 index 0000000000000000000000000000000000000000..eb98084677b77d6e296fcd24f82bac82473877cf GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUmCy{jn)Uzx9EP)J?@j4m z;^+nB+`D&n%9XQsEz5a$0<%0F3*S5RxGr>DSg3I9((Z6q$F9Xm z>z^`xWfVPrZ||zv%eb!arD()98BTHF35yNoXjaq^StFql634Z1+SWZbEJ?K)8WR{9 Y_J36Rr>ApE4rnujr>mdKI;Vst07S`HyZ`_I literal 0 HcmV?d00001 diff --git a/data/tilesets/secondary/budport.bak/anim/balloons/1.png b/data/tilesets/secondary/budport.bak/anim/balloons/1.png new file mode 100644 index 0000000000000000000000000000000000000000..65df1eaa0dfb7703945f9a778692afbc96d291b4 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUmCy{jn)Uzx9EP)J?@j4m z;^+nB+`D&n%9 z)8kI>UA2VE=;^z=H%wF)=v~`g-mKRsxvRW+iUUvE0&m9zQ-{UQ2bp-*Jbk*5C%}#4 f$gc|l3d{^ap-PL~_@{9I9l+q}>gTe~DWM4f(HmM8 literal 0 HcmV?d00001 diff --git a/data/tilesets/secondary/budport.bak/anim/balloons/2.png b/data/tilesets/secondary/budport.bak/anim/balloons/2.png new file mode 100644 index 0000000000000000000000000000000000000000..47dd73ae4417fb91e78100d64df64877eeb31f92 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUmCy{jn)Uzx9EP)J?@j4m z;^+nB+`D&n%9_|Hw&WL|#)(~7D}!Qg1ut-!6&7&ET0z-M+eE{J??^<|_f;Amg;#EE z+3is4aCBq&`Z(_()+~0TlBo_o3wDQ3J-`zd8>%`%YC-5iuY}tXr%x+xW0F)9xb5uR a$iraMqWB|y`)6mM?F^o-elF{r5}E*2fm&Mt literal 0 HcmV?d00001 diff --git a/data/tilesets/secondary/budport.bak/anim/balloons/3.png b/data/tilesets/secondary/budport.bak/anim/balloons/3.png new file mode 100644 index 0000000000000000000000000000000000000000..65df1eaa0dfb7703945f9a778692afbc96d291b4 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUmCy{jn)Uzx9EP)J?@j4m z;^+nB+`D&n%9 z)8kI>UA2VE=;^z=H%wF)=v~`g-mKRsxvRW+iUUvE0&m9zQ-{UQ2bp-*Jbk*5C%}#4 f$gc|l3d{^ap-PL~_@{9I9l+q}>gTe~DWM4f(HmM8 literal 0 HcmV?d00001 diff --git a/data/tilesets/secondary/budport.bak/metatile_attributes.bin b/data/tilesets/secondary/budport.bak/metatile_attributes.bin new file mode 100644 index 0000000000000000000000000000000000000000..aa64d680e07aa4c040b3345f6350d9622b5bdd8f GIT binary patch literal 812 zcma)3K@!6t2;>Rea>ykz{;;t+UQKISM4-e-||8i9#27?Jv zM|ZvQN4fb{WvD)@|C*w3aWyrZ@`VaKP0{#p2T`lS$?D#gbM7-^?_cp#g{x#D;@VmB zfC6@oO;P#nT9#S22yx_KWoumi+yi#ew{!QigS2Vyoc-nT8ZB3$K#gN%8Eb>g&-0FiV{%hG>7@uA1UzUrF1Ial08j81B>(^b literal 0 HcmV?d00001 diff --git a/data/tilesets/secondary/budport.bak/metatiles.bin b/data/tilesets/secondary/budport.bak/metatiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..963d6749cdd9f2e0a37ea4e847f720c5bf889539 GIT binary patch literal 6496 zcmcJT33L_J8ONtDfB_`U%#aWX6Zq46<;FF+x}fL&4H zUVKnDmPZN*vJDUf6_~&)1*)tGcv=O*cG|kJ(?SGt3$LMIJ8Ep(=VQ&NZr$BbP ztB3Yx@n-S1P|%(R@iYf(h9`g2501;NO6rA;+$t}JqPbPUD$;LZ-C<=~?W8_&0mRb- z^iW$-?v7J@sGSET=cYbt-@PE&{}DEdO=Odp&`${(%w!f6if1%?icMk9FwzfLDVApG zQlB`Pe{%dW|K#|K{F{#dG&Y^hVRNM(W1P)namh2-3v52Cmio=C=2lxP!=m^q)b8rn z)&6QS{|IC_QRY7?ZpJ4;q5MaKbqdtSn#}JaLtLTpFNFTWc}QFU^WV$cLq*08sAL!O z2>V~?i}7w_kUq|%G^nJHs|yvWy;yCJNyhetK7EX*P}++O5dpOi!T5*V@oxdyWy<`? zo^w;b1&n>BXZ)AjD{QRPpDS%qh;4h7jWrMq+s)d zs7FEhlzq%TRp)OZPQ#UJHugQnfcN4-`Xi!GM8`(QNc|^_ z5ylu}tn7chcaA+*_BZl8d!CQu_IwYE`9=Pl&Znnhqhrs+ro_+=b0%oUjF<(5?jIG4 z#3sci#uO!6SCp>$NIe^BS3SEO5Y+5;Ku|Fb?~z>JG{41u(p3M2*o;_pY`)avF&2x* z=1HC&n--fJn~vO-XA7?oC^oS7>}Y5_)e$>I;kHjeE7#(2$>kt*> z)ff9E>Ct{kO#3D2MdG8}{hZj0kB(1Sfcv|69@F~)F})vNktD8w&Lerd9zES_8kqmMD7HdbQP#**awfRg&h z%@gK1^SsnQQF)^BypN9qpOgAc<3nvlc}?o~(;w7_=#NUh2Z0~;@ppi}EAvNfuRdyf z^-){si;OY83+4rgR}{Q=8x+d#`>>l}B_0X?V@dLpKu`MgZj@m{pQXTE3t&iuXXzjD1;pP-MI{)>UfySyQU_ZRCw0D4--^(poX zMHvt4)62MC{rt4c2i)~d>)E^C%nnh0V*hOI$#V0mUdb{H2-mb!~KMgV!Zdm>ng z_rU*HlDrpaujGbEL*!`5(Gv1QXYu}2WSlHHRdTiD^Ah4yC8vR|m4x7ZDFkn9bU*n& z4F0f<;FLV{zoul(FtRs9jzrK0@&v6)Lpz?4>(cAfk_I z3YZUgruayonDmn@^q^mFM+J)!7jyh7acOyh^w*E(-FUS8wW zNM7!&a5g%dB(F#;Pi#tTOwj!+;bqNnYNg#ytW4A<9BE(Wtadg#Tcmw;VpU>GVzX;U zA6uPYIatYG!uh3B=hVBru5^9rPG^^M&^hGt`r+$_?@H`U97-H?+oOHAv&T8?G)ViN z#O_2x;;^*ub@n+&oTJjdFR?dqG;t(>YY*#w=YWHKK>Ej=<1TM2-Cnw`Y<-!cyy^1x z;oF9{mP?BA-`bPk2ZsARBR1kqS$w}>jCgeBop}~inxExr-^_kmw@hJ8{>85Y z+(YOJelK{L+T*jw`~1OYkN5e5&mOGg2eq+K`(kZyX1P|DN!&_nt+m&(-SvU{U2EWM zFK4#O%+}gxVl1>i?%=81%Pnu=mOgtbZ_2G?JgAM8;zeyN_=b;f9jJ|!;%x`L*~ycS z=-p&~BHJwKziIwiygjt;BJHT%MeFM7WB#b!)n)N}2WofC>>~A1yA#Af@if)@vUt4X zkJ?#MKPA{#D_6T|{bc`_tL17xZHSMDcZKrDDik{_Q59%j;h`A*>7!25v@0v(MUc>7E+CYSBK4NCW$Y^ZT=HplhFxRV8Tk)^7FPOw z?Gx)$>!fu`_9tp%-S2*n)P?a~26OcD7t;S(b`G*r6pH6OyWrzLvOl@()%X5hhPiux zFGFqoy^Q>!Z_JSx`}RZjkz}+_<uz|C)~jFr&!dW$4Yn zvA;{bORSOogZ)$T%ls9-gugD^zshIxrF@y>KkyIvMSe;0NBm>n$Ul>u&Q%`dxso-| z{)SKg3d268cyMg7kBQ&pZ}A=c*RuWFd;@=nzw0v2{b_tUkYN12V4V9n#PfaJ1GIZW zy zZG8-L{PsQlZ|)@h&tPr+i(UM`={L?5g`#e(7KQY2ZPOZ~dv51U`)!KaOx4x4Dsi)n zl#I3+dItHp1p10{392|6t1m$z`s!!WLl5byD)o_7Ra5bd$3;+XoQr?yxLAD=`he)G ao{Nl8pgBp6fYL;$16{)R{|MwhG2`FHd7g{_ literal 0 HcmV?d00001 diff --git a/data/tilesets/secondary/budport.bak/palettes/00.pal b/data/tilesets/secondary/budport.bak/palettes/00.pal new file mode 100644 index 000000000..b330eaff8 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/00.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +255 255 255 +222 230 238 +189 205 230 +156 180 222 +131 131 139 +98 98 123 +65 74 106 +255 0 255 +115 189 246 +98 172 238 +115 189 246 +98 164 222 +82 139 197 +74 115 172 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/01.pal b/data/tilesets/secondary/budport.bak/palettes/01.pal new file mode 100644 index 000000000..3c6e40c2e --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/01.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +255 255 255 +222 230 238 +189 205 230 +156 180 222 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +115 189 246 +98 172 238 +255 189 131 +238 148 115 +222 106 98 +205 65 82 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/02.pal b/data/tilesets/secondary/budport.bak/palettes/02.pal new file mode 100644 index 000000000..4c41030f6 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/02.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +180 255 131 +131 197 98 +57 139 49 +57 82 0 +222 148 115 +106 90 90 +164 98 90 +65 57 49 +255 197 148 +222 106 98 +205 65 82 +164 213 197 +115 197 164 +65 180 131 +24 164 106 diff --git a/data/tilesets/secondary/budport.bak/palettes/03.pal b/data/tilesets/secondary/budport.bak/palettes/03.pal new file mode 100644 index 000000000..3760ac903 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/03.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +255 255 255 +213 213 213 +189 189 189 +164 164 164 +131 131 139 +255 0 255 +255 0 255 +65 49 65 +238 213 205 +222 180 164 +189 148 139 +156 115 115 +131 90 90 +98 65 82 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/04.pal b/data/tilesets/secondary/budport.bak/palettes/04.pal new file mode 100644 index 000000000..2eeaba630 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/04.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +255 255 255 +222 230 238 +255 0 255 +255 0 255 +255 0 255 +255 0 255 +82 106 213 +65 90 189 +57 82 164 +49 74 148 +172 197 230 +139 164 222 +106 131 213 +82 106 213 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/05.pal b/data/tilesets/secondary/budport.bak/palettes/05.pal new file mode 100644 index 000000000..90adedf53 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/05.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +255 255 255 +222 230 238 +189 205 230 +156 180 222 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +115 189 246 +98 172 238 +238 230 164 +222 205 131 +213 180 106 +205 156 82 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/06.pal b/data/tilesets/secondary/budport.bak/palettes/06.pal new file mode 100644 index 000000000..0c2d8d3ca --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/06.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +255 255 255 +230 230 238 +205 205 222 +197 180 222 +123 131 156 +98 98 123 +65 74 106 +41 49 90 +205 205 148 +172 148 90 +222 213 238 +197 180 189 +164 156 164 +131 106 172 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/07.pal b/data/tilesets/secondary/budport.bak/palettes/07.pal new file mode 100644 index 000000000..44fab8f63 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/07.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +213 106 255 +255 156 0 +205 205 222 +148 139 164 +65 74 106 +255 255 222 +222 205 148 +172 164 106 +139 115 74 +238 57 32 +197 82 16 +197 148 57 +230 222 57 +0 213 156 +65 164 115 diff --git a/data/tilesets/secondary/budport.bak/palettes/08.pal b/data/tilesets/secondary/budport.bak/palettes/08.pal new file mode 100644 index 000000000..61c92b5fd --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/08.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +230 230 205 +222 222 180 +189 189 156 +164 156 131 +131 131 90 +115 115 123 +65 74 106 +41 49 90 +115 189 246 +98 172 238 +189 230 222 +148 213 197 +98 172 180 +98 148 123 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/09.pal b/data/tilesets/secondary/budport.bak/palettes/09.pal new file mode 100644 index 000000000..adf3765e2 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/09.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +246 180 131 +230 139 98 +189 106 82 +123 98 65 +246 230 172 +222 180 115 +197 131 65 +205 222 172 +131 172 123 +238 246 230 +189 197 246 +123 148 246 +82 123 180 +90 115 98 +65 74 106 diff --git a/data/tilesets/secondary/budport.bak/palettes/10.pal b/data/tilesets/secondary/budport.bak/palettes/10.pal new file mode 100644 index 000000000..d2b04b760 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/10.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +222 205 148 +189 172 82 +156 131 32 +115 106 49 +148 148 156 +98 98 123 +65 74 106 +41 49 90 +238 246 246 +148 205 255 +222 222 189 +90 148 156 +156 197 90 +115 139 65 +115 197 164 diff --git a/data/tilesets/secondary/budport.bak/palettes/11.pal b/data/tilesets/secondary/budport.bak/palettes/11.pal new file mode 100644 index 000000000..4c25c67ba --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/11.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +24 41 82 +255 255 255 +222 230 238 +189 205 230 +156 180 222 +255 189 139 +246 115 74 +156 82 49 +189 246 197 +148 230 115 +8 139 65 +90 197 238 +98 164 172 +255 230 156 +230 197 65 +65 74 106 diff --git a/data/tilesets/secondary/budport.bak/palettes/12.pal b/data/tilesets/secondary/budport.bak/palettes/12.pal new file mode 100644 index 000000000..4b0812f09 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/12.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/data/tilesets/secondary/budport.bak/palettes/13.pal b/data/tilesets/secondary/budport.bak/palettes/13.pal new file mode 100644 index 000000000..4b0812f09 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/13.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/data/tilesets/secondary/budport.bak/palettes/14.pal b/data/tilesets/secondary/budport.bak/palettes/14.pal new file mode 100644 index 000000000..4b0812f09 --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/14.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/data/tilesets/secondary/budport.bak/palettes/15.pal b/data/tilesets/secondary/budport.bak/palettes/15.pal new file mode 100644 index 000000000..e7717d74e --- /dev/null +++ b/data/tilesets/secondary/budport.bak/palettes/15.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +115 197 164 +255 213 180 +255 197 148 +222 148 115 +123 65 65 +57 74 123 +41 57 98 +24 41 82 +16 32 57 +222 230 238 +255 197 90 +189 156 90 +255 98 90 +197 65 65 +255 255 255 +0 0 0 diff --git a/data/tilesets/secondary/budport.bak/tiles.png b/data/tilesets/secondary/budport.bak/tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb5f4e196c15c6564988aa228785ad088f34a5d GIT binary patch literal 10642 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 Q;%d&xT1-4_nIH`U0J6#qA^-pY delta 102 zcmZ3(wuWtkJR>8+WCg}%K?WcY073{2BsXtilxE}v3W*Cy1Mws#$;qCK+yLiZKhBoBA+rDxy9(k{gr{E2KslEFs^K>@qtZZsFF)m=jn!z-(4t&FHyPG6L$`UFC|f;EG~VhVnj>veyZt>p5i|LF ztgJ=-J*v>nNyns93K=00l@)bIDU$;k7qVv%a;YwL_TlUd@nsel(PuJ|OiU%%yiuB4;c-wrw^t8yRmL-$c~hNPw#^=_GS7wgz#XOysH=o%$}_ ze3HB5aQc8ut?pxwpyx%S57>eg@IfgAz^SG=Ksm6?>@(BvY>ufcer1L|N}AY$3)BHdACx+GOnt>v^+k%wX*bl3Js7OzTNHrgaw34@beu$Kbe)pTJWa zKZEBsM&RH~I`TJ&+{17RF2W_Q>8IfgT!t%x-@se=1fK=Z!909{uYx_`1r_|9$?N9u_MLG68*5N$;~*fkk>1tb8gH{VZ^D3N;EAXJ;9GoK$;USsp+43rRP_7Wn{6%u1Op>xn3wXjjund>u zI$SRjHQ@8O1(!%%AH}2cdTG7F`Mlg9mnbbFak*S3*UNQ0vAgz1{Ac__{G(X;7Q7Yj zz&k~OPFyYRbvBCvHByZdl0ph;^aV(P63}?1ZoCKg;UmJ>?`)HX@or&km)e!66jjLd pKgL7&Fh;0d7&qgCQU^XMjJ;B?GAIqwiUs-Et?YM;v>~*=?GJp0mmUBB delta 1263 zcmZvbO=uHA6vrn?3k_|sYnyh92(ut`3m!I6i{Qa*(VX`n^cuF1L%|^NqP3d3@9I|_ zdJ(@M(DvX*VWD{Ns~}aOYB7QrZPV65(IkRa5Kq3B?X0`tJT{Zxy!U_ecIIt0T}@w` zFrqw$7UkU5Y{O33k~QRXh%Gh+;v|i zSIJFV(P<2*5uKV(UA$bh~zQ7rvngT15zPQ17ip9 zIiw6K$Ca#d)*W-tx#O-p@ttlyV!bk7HxI60oHYJ8jLCu++r;mMG1^=nEV1-&&WMGc zLHuOAX5Fy9;J2}DN%wC|wd!m-7<5!D_ZXtotL*&m(;JhXQ9c@tDbJ*M+xg{ub-t0< z5E)hPsiT0gIzHZLOx4jSUkn$-b5&Ps=xj{VuN<|h8s?>-2ossUWV@2J8OtRZJC*zk D4V|6a diff --git a/data/tilesets/secondary/budport/palettes/06.pal b/data/tilesets/secondary/budport/palettes/06.pal index 0c2d8d3ca..1e7d9a822 100644 --- a/data/tilesets/secondary/budport/palettes/06.pal +++ b/data/tilesets/secondary/budport/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 41 82 +0 0 0 255 255 255 230 230 238 205 205 222 @@ -16,4 +16,4 @@ JASC-PAL 197 180 189 164 156 164 131 106 172 -115 197 164 +112 192 160 diff --git a/data/tilesets/secondary/budport/palettes/06.pla b/data/tilesets/secondary/budport/palettes/06.pla new file mode 100644 index 000000000..07f021d4b --- /dev/null +++ b/data/tilesets/secondary/budport/palettes/06.pla @@ -0,0 +1,2 @@ +# Color indices to set high bit +8 \ No newline at end of file diff --git a/data/tilesets/secondary/budport/palettes/12.pal b/data/tilesets/secondary/budport/palettes/12.pal index 4b0812f09..7ef1f4f2d 100644 --- a/data/tilesets/secondary/budport/palettes/12.pal +++ b/data/tilesets/secondary/budport/palettes/12.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 0 0 0 +222 205 148 +184 168 80 +168 224 200 +216 216 176 +148 148 156 +98 98 123 +64 72 104 +184 184 152 +0 0 0 +148 205 255 +184 224 216 0 0 0 0 0 0 0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +248 224 120 diff --git a/data/tilesets/secondary/budport/palettes/12.pla b/data/tilesets/secondary/budport/palettes/12.pla new file mode 100644 index 000000000..27f716b90 --- /dev/null +++ b/data/tilesets/secondary/budport/palettes/12.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +3 +4 +8 +10 +11 \ No newline at end of file diff --git a/data/tilesets/secondary/budport/palettes/15.pal b/data/tilesets/secondary/budport/palettes/15.pal index e7717d74e..25b623a26 100644 --- a/data/tilesets/secondary/budport/palettes/15.pal +++ b/data/tilesets/secondary/budport/palettes/15.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -115 197 164 -255 213 180 -255 197 148 -222 148 115 -123 65 65 -57 74 123 -41 57 98 -24 41 82 -16 32 57 -222 230 238 -255 197 90 -189 156 90 -255 98 90 -197 65 65 +0 32 0 255 255 255 -0 0 0 +230 230 238 +205 205 222 +197 180 222 +123 131 156 +98 98 123 +65 74 106 +255 231 138 +205 205 148 +172 148 90 +222 213 238 +197 180 189 +164 156 164 +131 106 172 +112 192 160 diff --git a/data/tilesets/secondary/budport/tiles.png b/data/tilesets/secondary/budport/tiles.png index 5fb5f4e196c15c6564988aa228785ad088f34a5d..c5f01eb1d0ac576f3699a534f73822ab554baa47 100644 GIT binary patch literal 6587 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

    VUHIcewn8hTAA3RQ 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 delta 3789 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 k+g~LUh68;qHdHpHvzEK;s6A literal 336 zcmZP&U?2`MfB}-)Oc)y^0b@gGh*}5<5`oEsL{L>?@*uj%Az@~L>_E2%W*%G(I|DmJ L3?c%ProI delta 16 Xcmcb|dXII3G~;A$MupARjEfloFcJji diff --git a/data/tilesets/secondary/fallarbor/metatiles.bin b/data/tilesets/secondary/fallarbor/metatiles.bin index a8781129b6fd08e6036db58511ecf42a4aa32de6..8872a2900c515654394352e0b46261b63eec25d1 100644 GIT binary patch delta 322 zcmeyM`$2a@6o<;WqO(Qku)y;`F&Lg)#}UJJujp;jsiMgbI3$3~`yl2&ju?egMSqJ< z139OPM2%RDK=f%a|2>qyxr%cex5j=42=o>96OI**6Nd5qh5g0jh2zCx{K*lbeqQ?> zvW0VmtA%TXS&c-EKvKEFdBU~Ab#QI@!ujI$!u8@X`8@Gl@jCHZD4*3RM?71+M!Z^l za-pbxAOkDdjQtMX!ac&Xh37y`VKwR%?h~FXJP&Sazi_|!eBt?U$MlK!iq8|D3*yQ(TM+XBhXjy$AH@8} z5u?Ds@VDr6(J3GlHDWaa={^nSzlZWSS8;CR)?hUf1wvLMUtvGtSm8Kf7~fymUp!to zUL3}s93krG#cGr-oFiND_jTX=L_eH*9+IfwdINDir0zP!udJk+2S?g z)#8&2MfE4I=jQb27VZ(AEj$NqK(BD0@Lb_}aDKmVzxaIN`EUdJ#Cyf(iO+@ed&IlN N=ZMdS7&u=n5CCPOQtki% diff --git a/data/tilesets/secondary/fallarbor/palettes/00.pal b/data/tilesets/secondary/fallarbor/palettes/00.pal index ede0c60a1..87f9999ae 100644 --- a/data/tilesets/secondary/fallarbor/palettes/00.pal +++ b/data/tilesets/secondary/fallarbor/palettes/00.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -115 197 164 -255 255 255 -222 230 238 -189 205 230 -156 180 222 +0 192 0 +222 230 164 +180 197 115 +148 156 82 +123 131 65 131 131 139 98 98 123 65 74 106 -189 189 131 -115 189 246 -98 172 238 -115 189 246 -98 164 222 -82 139 197 -74 115 172 -115 197 164 +88 168 168 +221 205 143 +244 226 171 +255 205 82 +230 156 49 +222 123 32 +156 98 41 +128 192 216 diff --git a/data/tilesets/secondary/fallarbor/palettes/07.pal b/data/tilesets/secondary/fallarbor/palettes/07.pal index 724a8f09d..6cb1ea50e 100644 --- a/data/tilesets/secondary/fallarbor/palettes/07.pal +++ b/data/tilesets/secondary/fallarbor/palettes/07.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 41 82 +0 0 0 222 230 164 180 197 115 148 156 82 @@ -9,11 +9,11 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -41 49 90 +88 168 168 90 172 172 131 197 222 255 205 82 230 156 49 222 123 32 156 98 41 -115 197 164 +128 192 216 diff --git a/data/tilesets/secondary/fallarbor/palettes/07.pla b/data/tilesets/secondary/fallarbor/palettes/07.pla new file mode 100644 index 000000000..5eb702de8 --- /dev/null +++ b/data/tilesets/secondary/fallarbor/palettes/07.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/fallarbor/tiles.png b/data/tilesets/secondary/fallarbor/tiles.png index 3582d1d030d978025a2de580831db536aa401cf9..5c3419bdb042ba90d13ddfb0084559e7a52090f7 100644 GIT binary patch delta 4616 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 Irb7+;9~q)uSpWb4 diff --git a/data/tilesets/secondary/fortree/metatiles.bin b/data/tilesets/secondary/fortree/metatiles.bin index ecc00d7e7092a272c134c4a9fdcaae507c44c11e..1b0958cbd1e07e44e47a8dc2a7f6e04356798110 100644 GIT binary patch delta 56 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 H!ZYrFhG_0n delta 4358 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 delta 30 kcmew^|6P7UDpN+|#`Fe$fosPnZ(;xfPgg&ebxsLQ0K`@cm;e9( diff --git a/data/tilesets/secondary/lilycove/metatile_attributes.bin b/data/tilesets/secondary/lilycove/metatile_attributes.bin index 0f4e01b923280efa5742e9a869e9d172da7fb119..f31cc9a047db711eaaa07a556400e4425abe0ad0 100644 GIT binary patch delta 35 icmdnTx{q~(H>02c0|NsHg8-O4IfijIqrl`JjK=_MNe03I delta 26 icmdnTx{q~(H{-;QB9r48XH3>-WSe}Ok!vzL({=!cBMCVG diff --git a/data/tilesets/secondary/lilycove/metatiles.bin b/data/tilesets/secondary/lilycove/metatiles.bin index 6018ac8ec361c2dd067a8a420e7cf0e6ae7b0925..f82bdff5c618f60de442abefd7d77737975195dc 100644 GIT binary patch delta 396 zcmeyM{Xu)e4W(I0v(gwC7+7XE&1_oTw6ckTVOA25&oHxXcGJqXwN10qHvURr6hanU z4HRTx*_^{PnUOJR5{o^560-sm5Hc$mHW@Yvr%m=_(Pd1UT*G2-niSAv+ys+VPICnE z0-Hc8L1KnYMnKh0NPM8~B%uBeESVs2Vb@B;Hb@C2kR)_}TFd#3@ zY4SV1Q!1fOVNR(|X-*)`pkVU}@(Gd<5(nysSfJ*l<~I2be;d?3U!Z-laQlE3IBl*H HC}RZxsJU!T delta 396 zcmYjNze~eV5Wc*;q6BT_DOkiIm_Q2Ep)JluSEJ}#t;JOcjt;@;hKHm0AXvIep%e$n zf8p#P;_N7yoxE!_^c~0j`0l%pcSXBs-@oqwfMg%z2xmA&%I9xn#yB<42=e9U(ou`e z88rd&L|Dhc2ib3+>kBg1?_dYljXjZj4%%DU-^WwzRcK%is5(QQWJU+OG<~>G6Px*k zyyAWjb%g~Om^`UHIoqTZ53iqDE4`-T;Vc=19B#IeA&x@A_+4-le2-9_v^) d)#m(OyrHEcWj`C{Pw$xYE-F2S^K|W|_6wZfSh4^B diff --git a/data/tilesets/secondary/lilycove/palettes/06.pal b/data/tilesets/secondary/lilycove/palettes/06.pal index 4b0812f09..a40ff7909 100644 --- a/data/tilesets/secondary/lilycove/palettes/06.pal +++ b/data/tilesets/secondary/lilycove/palettes/06.pal @@ -2,17 +2,17 @@ JASC-PAL 0100 16 0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +168 184 240 +112 144 208 +115 148 213 +90 115 189 +131 131 139 +216 208 216 +65 74 106 +222 213 222 +112 144 208 +131 197 213 +248 248 248 0 0 0 0 0 0 0 0 0 diff --git a/data/tilesets/secondary/lilycove/palettes/06.pla b/data/tilesets/secondary/lilycove/palettes/06.pla new file mode 100644 index 000000000..77b77f073 --- /dev/null +++ b/data/tilesets/secondary/lilycove/palettes/06.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +1 +2 +6 +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/lilycove/palettes/15.pal b/data/tilesets/secondary/lilycove/palettes/15.pal index e7717d74e..41c4142bb 100644 --- a/data/tilesets/secondary/lilycove/palettes/15.pal +++ b/data/tilesets/secondary/lilycove/palettes/15.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -115 197 164 -255 213 180 -255 197 148 -222 148 115 -123 65 65 -57 74 123 -41 57 98 -24 41 82 -16 32 57 -222 230 238 -255 197 90 -189 156 90 -255 98 90 -197 65 65 -255 255 255 +24 200 0 +244 226 171 +221 205 143 +115 148 213 +90 115 189 +131 131 139 +232 228 216 +65 74 106 +222 213 222 +221 205 143 +244 226 171 +248 248 248 +0 0 0 +0 0 0 +0 0 0 0 0 0 diff --git a/data/tilesets/secondary/lilycove/tiles.png b/data/tilesets/secondary/lilycove/tiles.png index 44111c4487a17f0f9a4f45cfbcc777f5ba539020..56be3ab4dcb2cc7ea93a8c0c83a5690136be4053 100644 GIT binary patch delta 3723 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 delta 3646 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 LCrryss4@QoGB9D( diff --git a/data/tilesets/secondary/mauville/metatile_attributes.bin b/data/tilesets/secondary/mauville/metatile_attributes.bin index 79e40abe28e2ed7f5e1618cbcca59faa21702ce0..e2b10eed5f770403c587e2b230499397d6862f30 100644 GIT binary patch literal 1020 zcmaKrJ#qpu424xevxS0y2U!Cn9F|F z#K!Uztd=l(#vRwu_(tTslPB~cg{Vu4@Yzq!&s_NC*TUU#wRNw(IcVVQS-m&g_Bg1_ z@2M02Fjw>QjPLi)k$df|qPmsGnVO5gsYl>P#5_WWSO{2X!sd58=~orL6FB~3&dkJx zRhcTq=q%Pm;{MYehwV&RVKp>-dCGORb>btVdoX` ziS(~~I3hUhv_ms%-R$}@)P<|~Q6+Y(e}#}8t2}qCMEw3m8{+NW$q_x)yoY^{Bd6|< g`~%nfID8|EFZCYchEyNDk6%Mr^`3H%B4??tf53M+Gynhq literal 1020 zcmah|yK=)Y4C9n69=LdK|DwI#CBKrjoBtrcUIHL2HRqhkvm}rd_=pm5%P6^0gJ<9q z$%;g*k?4h|Dg(h=U3v36u#%Ju`5_(b=Le$pn)C3s@xdz9?Gxm z_PW0RSXObsqt9#Ei$&hODkg)y6eCO=JQ?c@{aR+TpZ21cjqj6|CbNwl1u*|>VyNHNGD$S}wkC=#pWtK=9I5EK{`3{*VXNUD$H^=1g1d_wAl21qjq1_=iX zn+sbA!}uY>A>x+8mf|q}ef{RAaQVp<@(}_s!$1asFaY8Ewz2>K delta 447 zcmaE0|G<7j1UCl*0|OHXZ%*JgV`gGtnmmI~21sq*#`lkt#aAg-Y4Q#U4FzT(WCB8< zN-#j@Pm(lXiB1PoMfEj7~~KH(hnBiAsGRbg>V#t6oU+c4B?WFK>?_PG%m?TD3Hyoj3-iMb@)h?H=M(3J@;5(|@nZ5wGDrq{WZUNLn~!Ziz8S{fv3cj_ o6Pr)M`MWmn-h68FX*hrW=Kb5(Z+^NN9uO7s5dts{$RH2~0HDrm3jhEB diff --git a/data/tilesets/secondary/mauville/palettes/07.pal b/data/tilesets/secondary/mauville/palettes/07.pal index fa1dbd296..f3618ff71 100644 --- a/data/tilesets/secondary/mauville/palettes/07.pal +++ b/data/tilesets/secondary/mauville/palettes/07.pal @@ -9,11 +9,11 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -41 49 90 +40 48 88 213 213 213 164 164 172 230 197 246 213 139 222 197 115 164 148 98 106 -172 205 230 +168 200 224 diff --git a/data/tilesets/secondary/mauville/palettes/07.pla b/data/tilesets/secondary/mauville/palettes/07.pla new file mode 100644 index 000000000..5e51fe661 --- /dev/null +++ b/data/tilesets/secondary/mauville/palettes/07.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +1 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/palettes/08.pal b/data/tilesets/secondary/mauville/palettes/08.pal index bc7cb5c88..3742cfd9b 100644 --- a/data/tilesets/secondary/mauville/palettes/08.pal +++ b/data/tilesets/secondary/mauville/palettes/08.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 123 180 189 -115 189 246 +0 248 0 131 197 98 57 139 49 57 82 0 255 255 98 255 255 255 222 230 238 -189 205 230 +0 248 0 255 172 222 230 131 180 213 90 139 -164 213 197 +0 248 0 115 197 164 -65 180 131 -24 164 106 +0 248 0 +0 248 0 diff --git a/data/tilesets/secondary/mauville/palettes/09.pal b/data/tilesets/secondary/mauville/palettes/09.pal index 9c37027c3..312bb1aac 100644 --- a/data/tilesets/secondary/mauville/palettes/09.pal +++ b/data/tilesets/secondary/mauville/palettes/09.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 123 180 189 -255 255 255 +248 0 248 131 197 98 57 139 49 57 82 0 255 255 98 172 197 230 -139 164 222 -106 131 213 +248 0 248 +248 0 248 255 230 148 238 197 115 -230 172 82 +248 0 248 164 213 197 115 197 164 -65 180 131 -24 164 106 +248 0 248 +248 0 248 diff --git a/data/tilesets/secondary/mauville/palettes/10.pal b/data/tilesets/secondary/mauville/palettes/10.pal index a2e1cdc17..b0d6736e5 100644 --- a/data/tilesets/secondary/mauville/palettes/10.pal +++ b/data/tilesets/secondary/mauville/palettes/10.pal @@ -9,9 +9,9 @@ JASC-PAL 131 131 139 98 98 123 65 74 106 -41 49 90 +144 216 248 246 197 98 -148 222 255 +144 216 248 230 172 238 213 139 222 197 115 164 diff --git a/data/tilesets/secondary/mauville/palettes/10.pla b/data/tilesets/secondary/mauville/palettes/10.pla new file mode 100644 index 000000000..24701d55f --- /dev/null +++ b/data/tilesets/secondary/mauville/palettes/10.pla @@ -0,0 +1,4 @@ +# Color indices to set high bit +1 +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/palettes/11.pal b/data/tilesets/secondary/mauville/palettes/11.pal index c73ec2fe8..a48424b13 100644 --- a/data/tilesets/secondary/mauville/palettes/11.pal +++ b/data/tilesets/secondary/mauville/palettes/11.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -172 180 139 +123 180 189 255 255 255 222 230 238 164 180 197 diff --git a/data/tilesets/secondary/mauville/palettes/11.pla b/data/tilesets/secondary/mauville/palettes/11.pla new file mode 100644 index 000000000..0dcbee208 --- /dev/null +++ b/data/tilesets/secondary/mauville/palettes/11.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +7 +8 \ No newline at end of file diff --git a/data/tilesets/secondary/mauville/tiles.png b/data/tilesets/secondary/mauville/tiles.png index 208a052c538867a6cc6837f5ce270b8d959dee6f..9d2830b1864e12f04593dbf6ba50b9cecff54f47 100644 GIT binary patch literal 6025 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 Qe>XokW^PNXJ;I3nKPyfrPXGV_ literal 4111 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 AYybcN diff --git a/data/tilesets/secondary/petalburg/metatiles.bin b/data/tilesets/secondary/petalburg/metatiles.bin index 3711f4aeef135df2d52e729beee708e72769e30b..3ca46efec7868bb936838d926c003fd61abdf1cb 100644 GIT binary patch delta 35 rcmZn=Y7m<6mAPnY*~A}}%th16HkUBUGP4);70oT0SG0KsO9l%72__Cm delta 35 rcmZn=Y7m<6mAPqZ+r%H0%uUnUHkUBUGP5`JHO+0B*R**CO9l%75k?Nk diff --git a/data/tilesets/secondary/petalburg/palettes/02.pal b/data/tilesets/secondary/petalburg/palettes/02.pal index 4c41030f6..489761445 100644 --- a/data/tilesets/secondary/petalburg/palettes/02.pal +++ b/data/tilesets/secondary/petalburg/palettes/02.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 41 82 -180 255 131 -131 197 98 -57 139 49 -57 82 0 -222 148 115 -106 90 90 -164 98 90 -65 57 49 -255 197 148 -222 106 98 -205 65 82 -164 213 197 -115 197 164 -65 180 131 -24 164 106 +0 192 0 +232 224 200 +208 200 144 +200 176 120 +168 136 120 +128 128 136 +96 96 120 +64 72 104 +40 48 88 +244 226 171 +221 205 143 +248 224 176 +248 184 168 +240 160 128 +200 136 104 +248 192 32 diff --git a/data/tilesets/secondary/petalburg/palettes/06.pal b/data/tilesets/secondary/petalburg/palettes/06.pal index b893aa09e..f4190e865 100644 --- a/data/tilesets/secondary/petalburg/palettes/06.pal +++ b/data/tilesets/secondary/petalburg/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 41 82 +0 0 0 255 255 255 230 222 222 213 213 197 @@ -16,4 +16,4 @@ JASC-PAL 205 197 123 180 164 123 164 139 98 -115 197 164 +248 224 120 diff --git a/data/tilesets/secondary/petalburg/palettes/06.pla b/data/tilesets/secondary/petalburg/palettes/06.pla new file mode 100644 index 000000000..5eb702de8 --- /dev/null +++ b/data/tilesets/secondary/petalburg/palettes/06.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/petalburg/palettes/07.pal b/data/tilesets/secondary/petalburg/palettes/07.pal index 4b0812f09..41d133994 100644 --- a/data/tilesets/secondary/petalburg/palettes/07.pal +++ b/data/tilesets/secondary/petalburg/palettes/07.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 0 0 0 +213 222 172 0 0 0 +189 189 131 +164 172 123 +131 131 139 +98 106 123 +65 74 106 0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +164 213 230 +106 189 197 +112 192 160 +205 213 238 +156 156 180 +115 172 57 +248 224 120 diff --git a/data/tilesets/secondary/petalburg/palettes/07.pla b/data/tilesets/secondary/petalburg/palettes/07.pla new file mode 100644 index 000000000..5eb702de8 --- /dev/null +++ b/data/tilesets/secondary/petalburg/palettes/07.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/petalburg/palettes/09.pal b/data/tilesets/secondary/petalburg/palettes/09.pal index c4a6e250a..4d052b9c3 100644 --- a/data/tilesets/secondary/petalburg/palettes/09.pal +++ b/data/tilesets/secondary/petalburg/palettes/09.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 41 82 -238 230 205 -213 205 148 -205 180 123 -172 139 123 -131 131 139 -98 98 123 -65 74 106 -41 49 90 -156 205 246 -98 156 238 -255 230 180 -255 189 172 -246 164 131 -205 139 106 -115 197 164 +0 0 0 +232 224 200 +208 200 144 +200 176 120 +168 136 120 +128 128 136 +96 96 120 +64 72 104 +40 48 88 +152 200 240 +120 152 232 +248 224 176 +248 184 168 +240 160 128 +200 136 104 +248 192 32 diff --git a/data/tilesets/secondary/petalburg/palettes/09.pla b/data/tilesets/secondary/petalburg/palettes/09.pla new file mode 100644 index 000000000..5eb702de8 --- /dev/null +++ b/data/tilesets/secondary/petalburg/palettes/09.pla @@ -0,0 +1,3 @@ +# Color indices to set high bit +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/petalburg/tiles.png b/data/tilesets/secondary/petalburg/tiles.png index 00d6d94a4ef2f74d70ca5eb58cfe0497deeb66b5..c3ae46ad7cc2d244042381cb4d43a10ddf4c553f 100644 GIT binary patch delta 1626 zcmV-g2BrDT4ayCWU+WH0*O9gig`%8}EdPk!Q=y8G$9cX#g{Wf-54uc=|sSU=N|J}_c+{6xHV zL}{cnbz4aW@cZ#-KpCTywSwk1uh-X=)|>q(`lvKq|8af&dXv3_Zu0XSAo|Fne`v&_ zpK}1tKPnvp;QC3Qk2&YG05Cd^7$6t|tXN*x+v+CjJGg;71n>s@lLMTN7-J*G^A@CC zxDMk7)CItxz=d-jMVw#i!U>FQaqboZmT{p8-n&BZmh>S5@aTzhfl&u7U~dXssP)kS zAq0e>k+Y!Hr^-A!3Yt{Q!;A}*e`>&#^B}jhI_#Lz=37cfY)HRlvAhKr5((M6uJDj6 zL|6EXWdZ$=vF2OG+|lq+DUrI%5(!G*Gd7^G1YNYCRLTOzp%CsAlm`tfkvjcX9BYg5 z0WN3{0l6S{#txhJNl?L+_|#JSS2K9p+^$MdP<>|`yNMHeDM{WW}i+q5jD89--9Pr2F) zU=Mws0k|`M&Y>R{2q1*qKsD<)XR(HzvFFBsDfOtAvj6}b6#?1>yC7Q{gLg&G5dSOM?Ey~|>7L&tzX3?M})4H7`L0N_y_gI~h*QjVi8weyF% zxni28ZRY_FpTQaj^_UqYNEEhxFAGR_ zyymIJ0vGg6rvu|sfT1n-z zU>Hv}zI#YW?WfJU?6z_%mrSn=*jx%gsRW=4DF87Hf&lY}FSH=~REf}qsF1LP1z2fT zD)6>pewhUlK=A!Pe*-oOd{`Dx`C@>h0Jl`t&5WHGlL-JU1XyzbQbxcX5(75p0BcgR zfb=X_wMUj!yKBV&@@Eb(nH(KWzygn2xV|kMl(E37J&pl#9S{;_0BftO{r>8jahU}g z07;HuJ|usqEx@A{JCZSw7R<$<06@|f$kWRz#=v*aB6yR4f1m@er^^6Nlm$md-M2AW z*!~WtCl8V!D6}Cf!ru=30idb?l@wrATF_s^x=`9An^+ebw`&%Ef0L8D4Y`ML45qTg zf^<%p#1?dC7pEmcHnA==Zc_^n)N=sSBv=zjIw!35WekkY?3BX?1nU9@6AXAS^B9OF zlc;S&Hm_n$f2d}X%4j5K!K0l40vzthe25lkfVKd}notw0j0<`lcu*FwBZQ7_K`_C9 zn?6P^1wczyK&$B>PH-i{GQb%C12!;STb{PS*-pEFSF8!u%sP-80n#*lGXmhcEdhkz z)BtS(l!J-^McX9Vy&x|(0I(z7sc+{k&;T{y6EV{+f7~HTqHd^8$GhRSu|V_z`fhy9 z07N%bjqd*iupNC?_O1rd6*meOJkqA5@X>cCKFYw+=UnR|!0rs6eA=NNBX4%qxhYWR zBc+P~-6?i;gWdQUD!xhO`B$A0l`aOTz6hAnwgw!6xB=D$s0sE4*&yjbag0f90X$VH zKVy%+oYmjP5@Fb0s) z?PP&04Tz^v2NCjO=}G{veTK3aaB#5q^58%MJbKoiUbvx0Q-Fu%3zSd;NGUswVXyb< zMXx6TPs$hW?5rI=Dc`>j0JRbym({Amxqf+gfA|Uk_{2VhHm(V60T$F}*?ScYeC=q}`%mCtP#QR`+dj@;KqqYqIWr1GT7)c1$9(HU(q8~zA0ssVH34qNc z0l1m&^|rGBv;dygx3D9&htQq};3qMF<^b3MKB&td4Z!9hv`x#jau&>QXARIv0z0Dr zNJD5#Kq>}>06kF709Gdac4*`C6}E4wFZe5;jgpL{pRObToW}N0{=~q!F6p{1iIRF3v07*qoM6N<$f+}CvHvj+t delta 1628 zcmV-i2BZ1P4a^OYU+WN-T39gig`%8}EdPk!Q=y8G$9cX#g{Wf-53FR5YBSU=H`-ZNr#{6xHV zL}{cnbz4aW@Y~U7KpCTywSwkXuh!R<)|>q(dapEG|9*Y_YLmTzZu0XSAbQWDe`v&_ zA9DcC-zyyg;OcRok2&YG05Cd=7$6t|tXN*v+v+Cj8@Pcy1n>s@lLMTL7-J*G^A@CC zxC-M3)CItxz=bm&MVw#g!ZD0&aqboZmT{p8-n&BZmh>S5@aVB}fl&u7V80i*Q0t=u zLI?;$BWFRYPnCIe6f~)p`xzG~f7O5~=Rt01b=VQ5&DWHU*pPnBVtEZNBoeYWUEv{D zh_3J%%L4i#W6jr$xufBOQX+MiB@&drWo$rU3A$)OsgwnbLm}KLC=VJ|B6a$&IMx>9 z16Ir#XPX1=A=2Ek1UhX7>U(6^jT`yQbb6e^Yv<6mG*b z4)8XYmSg~c)!*Z9+lc@`h%=>OeJIx;j^|Uy*~wZki_S%a`g8d3rfFG9Gl0&Jo^Z7n zz#jTE18`^jj6**z5I_jIhHBPv&SDKaW6zBNQ|eJKX8`~>Dgv|zW+nyzpzaAD;P@hd z+)5F@z=bg^Kk5boLp7ZPe=HG$v0R7_#=1KX5KF{B1fBx;Vji$e3}74i0C0R!1Xv;l zun`3;l&&ZOEQo>f3pEA^u>#(SI~T>^nvMa17(j|p8YF;f0l=d=20w-Ar5s0HYUdAi zbHy}G+s*?VK7%z5>N%+$SoeM09ZC~GwOTCzP+iULrK;DjS5ob6e{9wlkSJ{XP8N{v zc*RqT1up2DP6x(?07F~u$w7sHq^MRZ6*TqIfLh$b?)sXZ$7*YQI;*;&VLTSo7Q7ya zz%U+dd~=_W+7Fv`*=^-UE}32$u(=d~QVBp8QUGEY1OeuEpJ_q#p%S4BQ6XUo3$W6x zRN!sH{5%UJfZ+Roe+Fz6_^>RX^4S1K0dAO-DBnE8G0oJ5s z0qI$=Y7Z={cH4>p;dx^H8$ zu>BoOPaY&eP-sI|gufm513*;)Dk;FKw4lF+b)mFLHnA==Zq_XR_BtoG8*&fh7))h} z1?ikHi7n{P&QD5&Y+_w#+@uyBsOJEtNw6l6bWT|9%NQ7)*$Iaa2-XD*CK&Km<}naU zCQ;jlY+l8he^AXNmC;Dff=4?81UTH0`4BD80Br$`HK8V085i_A@SrSUM+hC=f?$FH z*L{p!3V@cZfL7B%oZw1?Wq>mP25exuwmfZtvz>MUuUHeRnROsH0;Fm9W(2@>TLK8b zt^wKtC8paE*Y2V$mOf4D`IMBPxGj(5XtV}a-c^zHbX z0f=s>8r}a3U_1J(>|G9^D{d4nc%)59;iKM}x2D|YyRD6@l^RGH1DqRdveGxFDZ4Ed8aRaOiP!sG8vO&^=;uw?I0(h!Y zfZ9OYS%|mFLmTBcInBUGCppyi4 zN<{yM(3XHy3%SQF7OaLD*1F--A delta 13 UcmdnPx`%aw%ES*M8!cLx04BTzI{*Lx diff --git a/data/tilesets/secondary/rustboro/metatiles.bin b/data/tilesets/secondary/rustboro/metatiles.bin index 5a0d1b0d14d6f8fd5d408d19880e64b556a6cdd0..649b09fac9aa91854c7410881856a96aee8e5aca 100644 GIT binary patch delta 244 zcmaE${Xu(zBzw}?q&rD>lQt@FGKwcHOxlpNG3nu^2b&%N@d7A+vjbxW6UUU~smV){ zmnKi%z+AyGEqQwKvgGB-n+;gP7`bL7TL@VSd9}@Ko;-ooL~2H|XOksRU}iIjW>%Py zykEdl$O_1xe2-O0j)7rCG6N8JwXJN9YKv_0Y&y{t*>t06htW%aL@S8DIf`uso5ZxhM@On$iLCF!)T{bWYc6hHVKve0y~X%88I+KHr)hDgA{|zi);e%K|BzD la}?VOHi-vKkD4AdH3v=$Yz_ diff --git a/data/tilesets/secondary/rustboro/palettes/06.pal b/data/tilesets/secondary/rustboro/palettes/06.pal index 955b1d21a..1a3e98a28 100644 --- a/data/tilesets/secondary/rustboro/palettes/06.pal +++ b/data/tilesets/secondary/rustboro/palettes/06.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 115 197 164 +255 255 255 +216 224 232 +184 200 224 +136 144 152 +131 131 139 +98 98 123 +64 72 104 +40 48 88 +205 213 230 +139 180 213 +128 128 136 +216 224 232 0 0 0 0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +248 224 120 diff --git a/data/tilesets/secondary/rustboro/palettes/06.pla b/data/tilesets/secondary/rustboro/palettes/06.pla new file mode 100644 index 000000000..7fe6c388e --- /dev/null +++ b/data/tilesets/secondary/rustboro/palettes/06.pla @@ -0,0 +1,7 @@ +# Colors in palette to set high (alpha) bit +2 +3 +4 +5 +9 +10 \ No newline at end of file diff --git a/data/tilesets/secondary/rustboro/palettes/10.pal b/data/tilesets/secondary/rustboro/palettes/10.pal index 6f0bfa7ee..d68d54ce9 100644 --- a/data/tilesets/secondary/rustboro/palettes/10.pal +++ b/data/tilesets/secondary/rustboro/palettes/10.pal @@ -5,7 +5,7 @@ JASC-PAL 255 255 255 222 222 222 172 180 189 -139 148 156 +136 144 152 131 131 139 98 98 123 65 74 106 diff --git a/data/tilesets/secondary/rustboro/tiles.png b/data/tilesets/secondary/rustboro/tiles.png index c3a3bfbab469519db64233b1868d8c9370d06d49..1cf8473a20fa80111fa74681b1f66eebe1b5ef79 100644 GIT binary patch delta 4000 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 delta 3880 zcmXw*i8s`Jz{S768DoZwU3NxfFMEkFwo+LpYaym&O$;i#`C)8jE7XJ-vSpo;$Wr4W zWSt&ssf?XMk}aj)=Y7w4@44rmdp>`_J@>uzj8vvOnS1q&nX!FX{%W3;zj(J0yp!qN zyoporedporsh22@`Bd5|X25%}yEq4&@%ObVJ$3$0_I>5ligb%0PldA>g}d9lxQZ1T zZAd3|i8`?sdx|heK-1>{D%aJrIH|Lls!G%e;x?by@$w4we$Y~)C>i`NYbUAiVaB(% z@E^CxUbku#O}MGG`5ue6XCC#9zj?`@J&txgLk}6Id}{9$cW_#}&&{uCm8@qqazUS! zDMKl7Pl~%r1h@S3*l1P)t0W9eI>81P#@?ea0@N{ZZ>3&MWy(=N=+yScB7wNLcwXqS zZ;a`xe~pE-2@Sqh2TbYHFr6hA4+Vm~xd5WBi)2-n&y zanbxr9`m#k29vJgAd_fXabA7XISTTmfJrn{2zNrm6?t1TzU9Wa*UAi%tfigV+!cG9 zz2dvSE6?hIOS80+$_U5dnfLa}63ipqXDbuMmT1O$g1FE!f^>!1fFIkWj38rHmDV0S zAXFP$R(T#M6@`5Yf4O{CDhi1CI3E*1OW@`^y}tvDEQUGTk1hf;oHmt~AG86`(<~9X zJ(8mxzZ`+Vd&I8Xi6^I}y`GgUQAHk9|Da&k!~<+ujHW5dfQ_^|oUh86{LoV40?6#` z;^Tb)rbY(0COzNeQf9)dBMyn-?>whkcNnhf%z9aYII;C;XX`^nN?5R9vr1M$eag{R znO2*UH-v4Svg78=`hJbt7KX+Y4ONlbk=lOMfqk1%f_Oc0D75pnAtbEds3ybm>z+th z)7-?2j!qAkXAb>VqHQ7jB3+b^)QiIViLL-#{5^IZ8>BGpsoOl_f-EQFWHJx^VpStD z>@=0sOCMAP*i1ls$IberDdc6MPm?M(PArpIFo~vXVG-axS}m3h$XH*6QNqkOXbC#p zAr8n4nHq1mrXb&FWAvL7te=D6U#t{au2YyKSpGRQfL8(>117bK-V zHm->|?E{j3mZ5i@(>rbS!Jn;UWNzAGo+j;Q1KVyH5>I6~8?*05JSNRpLv^vcmKDeI zxH3Uw+hEq);#o6q!r>NS=(}~ z@^q$W-QHj(M1DzB$UB>j-*+7L+sC<2&K)1tllpoyMv7y1DpY)GFtBYuA!^kP`8CS9 z+ru>f^tJW!FGdUJ!V5We$Qe1Wp3L$I`mn+k@KvIqM;;?v3{CBqZW{kIBaWJg zsg6Uio!-2o@^kcAv5nl=_<;@|=%>Nn(cwkr=wFH_Fj{pnW za5u5Tz@4v3Iu(vODvu`>=}}3FUH1>_Lrl~eJw40=)ecu>B#|#W0Nr}K^yk#gmqJX` zV?KPw{w7J5-oQ9*R-rBi& z!yaizDhC3V&+L$mTD`-`Xvhd4NyF^>nMMfMd^T=IVBo1SFw^1$a~WANaE{V1=nL-A zN#o_K#sKGZMvV9e1F8Ys`E-wiEXGM#=^JrGz&i-oG%LG+dIJ)Eq#HK-`I!N_-KX{f z#88ohGLNAT_li`I9I&G1(K~0`vF*r+a&M1i7ifx#s#S?DcD; zE0c3`EtLFLE_c28?_KeEB}d!e7)^}P20e~Eq(oX*l|HE{lF3^SJarg+{uA^=q71r% z&AwpA@mu%2bYPXT+qr@&d<>QxcPX;wvWAva&Gu`q)#xZfBS$hb7^Kz9tb zuTcMR5vf@rdAR`glDKlZm3^}B!JF0TU22YVaEu zPO3l`RwaY%xN?(F210u30At_>E$)#0QWNjulYm{YaQ?SLnTh3E?;}B7*@py4{YXJz znUL}b(4@$&U%=AL`ys(vlgZ4ZCb1J2tCtY})?eVT*DcxGa7Uv8-im!J@qP8VcIciY zl_3bQ0WV=?wtN3LEVW7~D}gN=J7K~+C{-^ehaSKDj>U=J1h_~yUfn1(sJKc)G@_LZ z@LuMd`tO`R@G;KA+i&uhLP7NP;XDFRBp75EFu%fWTX+I%+kh=hlC%hn2J-Im^$x$k zS6LneKc#g$UE?`+O?20PAumvV;oR!LwIds;DU0z=wnu4hf!ZRhA3LJ7mkDrVF1dBg z?xfA^@;{|t16FvX#K&Fn^=|=>f205u7{oY;mRP(aBtdMFFWLNlew=cu?I1^(AD%s5 zX|O*vEr^kF_ZB?Lt!udc{AwKfg2bT12TQsM7)Az36I1^cJvk(2+Z|^eMSsf2P77#4 z&{+9dR}4qTQgz+9Ui`C(?_K?YA(I9N9vU6|?qiB-9Yrt_cbnrupWjir1@mNC8Yh_> zKN=2dghOUkkI@h%hp{?fe#SCh9+5jOrVHw|L;6u7iD;Z0_Na>m^^iAUDOU1ow`-p3 z7j}HxZ)zjm(EnRmPrPt;|HWRT&8Ep#R=S}@#(W4DEks(7s9Dy1(}0Yeor^1AZpDSA z9a=(0MIwiM-ziV?6&e!zvM1!yZKH~cEb7(Mg|&X&!m{B8uD5a(YP6f2he!~ zdyju%MQS>6OWnl0V6xi*j!|5gY`dK8-{1RP`mMntxV1f4#|3x5gPUQsZO%Zug`Ns( zu9wa5|7Exk8#>XMf8DN2G}ACrwNq%JAJM? z{^f^DT0}fDW);mAxX1-W-)6EoGoR;s-Eb?44I7$XVGCFySM$)h_FKd~FoY5(V*Zm? zo*R$vEsCZsbdFf*Slzc2o-jC+6+^5GP_8QYv;Bp?%DaveUT$5BuP;+2o(le*z`kvg zo)dG`WhX~S@uQQY|HrL67wZo2s_j!xXpq@tMc^axg2Ne(DBSBxRiy<#eSCisK0&pR zlHRF{bF}Or8(GeCk!sx^c3k2mkf0NWKV>VK4Ars$9P7UWC+B9OS-*hEOYX*m7W{t^AA@qz=BQn1W%9wvHQmCZ~oK{H4!iW}_7ptyl$tOs$c^Rz1cc7Ly-HHVh zTWUX{fvyMl8(h6FX{nSk%sS(Ez>%iTTn$XcWwQQQZmT&(*5gDymYD(nxrJXnx5?1d zYVW@tE-T6baN^Z?uG;E}1qn3uD2(PuuM>Oq+UKAW!V6^4@56xZ`zc$=#{}s7 zYjN^XhoNBJbP+U+(Y>pnop<>8;jBD*a5|F8ahP4??G@d7#;HjK&_={PenIjb|zdzttA z%bZ4+bM#3A)>||P+h|{dres->5Ua685;$5O7p|TN@5dtG(5`7oP~wWCAmu088jcH) z+Q-8A`e%+W4rZMjBC~zYF(3CD$8s+<_waH|Jcxe(f4++fsIH5_v^>sEcQ4(XEr3S9 z)YuIbcvihr`7zDjy0rh{!X!w6Y9tCjGjyV0w89Mco7XGo6OQf^Bd5{$X2V%qW_GPo_q z)Zevi*R@-bWN!1ma7roPoytH@)N@>#;`}DB6}4?N)^=48-rp&oaRVdT%LPEoLu{fv;6I%)w>GOaA;$d=He=>p diff --git a/data/tilesets/secondary/slateport/metatile_attributes.bin b/data/tilesets/secondary/slateport/metatile_attributes.bin index 496eb1a9c427d2f5df2f0869be5fce575eb78e77..0f311a694f316031fc8829b1d3c72ae7fa4d39be 100644 GIT binary patch delta 53 ycmZ3(wuWtkJR_sPWCg}%K>-E^1_2-h0Wf>>7Df-o$#0khCSDNd1j=NBWCZ{R6$x4Z delta 85 zcmZ3(wuWtkJR>8+WCg}%K?WcY073{2BsXti^k6jbWbgus!+|e@A4CO6Ef9J$_(1uY GU_JoJSO{$Z diff --git a/data/tilesets/secondary/slateport/metatiles.bin b/data/tilesets/secondary/slateport/metatiles.bin index d474c31f5593610437790bf77e91d4a280d7e483..81c28bc3c6104e5a8da3344bce8e14b65db96f88 100644 GIT binary patch delta 332 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
      VUHIcewn8hTAA3RQ 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 diff --git a/data/tilesets/secondary/sootopolis/palettes/06.pal b/data/tilesets/secondary/sootopolis/palettes/06.pal index b9e93fa5f..44cd60931 100644 --- a/data/tilesets/secondary/sootopolis/palettes/06.pal +++ b/data/tilesets/secondary/sootopolis/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -115 197 164 +248 240 176 255 255 255 238 238 213 222 222 180 @@ -10,10 +10,10 @@ JASC-PAL 98 98 123 65 74 106 41 49 90 -0 0 0 -0 0 0 +64 72 104 +80 88 80 156 164 156 123 131 123 98 106 98 82 90 82 -0 0 0 +248 240 176 diff --git a/data/tilesets/secondary/sootopolis/palettes/06.pla b/data/tilesets/secondary/sootopolis/palettes/06.pla new file mode 100644 index 000000000..82b8d1306 --- /dev/null +++ b/data/tilesets/secondary/sootopolis/palettes/06.pla @@ -0,0 +1,5 @@ +# Color indices to set high bit +0 +9 +10 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/sootopolis/palettes/10.pal b/data/tilesets/secondary/sootopolis/palettes/10.pal index 6ca963250..01d065e52 100644 --- a/data/tilesets/secondary/sootopolis/palettes/10.pal +++ b/data/tilesets/secondary/sootopolis/palettes/10.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -115 197 164 +246 74 65 139 115 106 115 90 82 90 65 65 @@ -16,4 +16,4 @@ JASC-PAL 148 74 41 82 139 197 74 115 172 -0 0 0 +246 74 65 diff --git a/data/tilesets/secondary/sootopolis/palettes/10.pla b/data/tilesets/secondary/sootopolis/palettes/10.pla new file mode 100644 index 000000000..2b4c8a150 --- /dev/null +++ b/data/tilesets/secondary/sootopolis/palettes/10.pla @@ -0,0 +1,8 @@ +# Color indices to set high bit +0 +8 +9 +10 +11 +12 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/sootopolis/palettes/15.pal b/data/tilesets/secondary/sootopolis/palettes/15.pal index e7717d74e..ee115befc 100644 --- a/data/tilesets/secondary/sootopolis/palettes/15.pal +++ b/data/tilesets/secondary/sootopolis/palettes/15.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -115 197 164 -255 213 180 -255 197 148 -222 148 115 -123 65 65 -57 74 123 -41 57 98 -24 41 82 -16 32 57 -222 230 238 -255 197 90 -189 156 90 -255 98 90 -197 65 65 +0 192 0 255 255 255 -0 0 0 +238 238 213 +222 222 180 +180 180 148 +131 131 139 +98 98 123 +65 74 106 +41 49 90 +244 226 171 +221 205 143 +156 164 156 +123 131 123 +98 106 98 +82 90 82 +248 240 176 diff --git a/data/tilesets/secondary/sootopolis/tiles.png b/data/tilesets/secondary/sootopolis/tiles.png index d27c817f005a35cbf3850b42bc10d5a612b3d1eb..f9a6be2154a278142a6091b064c224a6cb95d9cc 100644 GIT binary patch literal 13423 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 diff --git a/gflib/sprite.c b/gflib/sprite.c index d75f6f727..fbe1c8575 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1561,7 +1561,7 @@ void LoadSpritePalettes(const struct SpritePalette *palettes) void DoLoadSpritePalette(const u16 *src, u16 paletteOffset) { - LoadPalette(src, OBJ_PLTT_OFFSET + paletteOffset, PLTT_SIZE_4BPP); + LoadPaletteFast(src, paletteOffset + OBJ_PLTT_OFFSET, PLTT_SIZE_4BPP); } u8 AllocSpritePalette(u16 tag) @@ -1701,3 +1701,18 @@ bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u return 0; } + +u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u8 frame) +{ + u16 tileStart; + struct SpriteSheet tempSheet; + if (!template || template->tileTag == TAG_NONE || !template->images) + return TAG_NONE; + tileStart = GetSpriteTileStartByTag(template->tileTag); + if (tileStart != TAG_NONE) + return tileStart; + tempSheet.data = template->images[frame].data; + tempSheet.size = template->images[frame].size; + tempSheet.tag = template->tileTag; + return LoadSpriteSheet(&tempSheet); +} diff --git a/gflib/sprite.h b/gflib/sprite.h index 86527bc4c..222e8b4d3 100644 --- a/gflib/sprite.h +++ b/gflib/sprite.h @@ -322,5 +322,6 @@ void CopyFromSprites(u8 *dest); u8 SpriteTileAllocBitmapOp(u16 bit, u8 op); void ClearSpriteCopyRequests(void); void ResetAffineAnimData(void); +u16 LoadSpriteSheetByTemplate(const struct SpriteTemplate *template, u8 frame); #endif //GUARD_SPRITE_H diff --git a/graphics/battle_terrain/long_grass/palette_night.pal b/graphics/battle_terrain/long_grass/palette_night.pal new file mode 100644 index 000000000..f845c3129 --- /dev/null +++ b/graphics/battle_terrain/long_grass/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +60 98 69 +88 116 92 +70 114 79 +62 112 80 +69 95 71 +45 108 71 +45 83 50 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +60 98 69 +88 116 92 +70 114 79 +62 112 80 +69 95 71 +45 108 71 +45 83 50 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +115 213 82 +98 180 90 +90 148 74 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/plain/palette_night.pal b/graphics/battle_terrain/plain/palette_night.pal new file mode 100644 index 000000000..71830bbd8 --- /dev/null +++ b/graphics/battle_terrain/plain/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +60 99 93 +72 114 93 +78 57 66 +78 99 81 +75 57 66 +87 105 93 +72 114 93 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +60 99 93 +72 114 93 +78 57 66 +78 99 81 +75 57 66 +87 105 93 +72 114 93 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +246 205 139 +255 238 164 +246 222 156 +255 238 172 +255 246 180 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/pond_water/palette_cave.pal b/graphics/battle_terrain/pond_water/palette_cave.pal new file mode 100644 index 000000000..e0c7f688d --- /dev/null +++ b/graphics/battle_terrain/pond_water/palette_cave.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +197 180 131 +98 164 230 +205 197 90 +187 179 58 +115 205 180 +187 179 58 +197 189 68 +183 175 56 +139 213 255 +0 0 0 +172 139 82 +172 139 82 +189 156 106 +189 156 106 +197 172 115 +0 0 0 +197 180 131 +98 164 230 +205 197 90 +187 179 58 +115 205 180 +187 179 58 +197 189 68 +183 175 56 +139 213 255 +0 0 0 +172 139 82 +172 139 82 +189 156 106 +189 156 106 +197 172 115 +0 0 0 +205 246 255 +148 213 238 +123 189 230 +90 148 222 +49 106 189 +16 74 156 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/pond_water/palette_night.pal b/graphics/battle_terrain/pond_water/palette_night.pal new file mode 100644 index 000000000..faf83f50a --- /dev/null +++ b/graphics/battle_terrain/pond_water/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +61 103 143 +57 84 33 +40 53 77 +53 110 94 +34 55 68 +55 92 56 +39 51 60 +81 111 129 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +61 103 143 +57 84 33 +40 53 77 +53 110 94 +34 55 68 +55 92 56 +39 51 60 +81 111 129 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +205 246 255 +148 213 238 +123 189 230 +90 148 222 +49 106 189 +16 74 156 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/rock/palette_night.pal b/graphics/battle_terrain/rock/palette_night.pal new file mode 100644 index 000000000..d360a61ed --- /dev/null +++ b/graphics/battle_terrain/rock/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +106 96 78 +126 126 99 +39 70 83 +132 113 88 +32 70 76 +135 115 90 +49 61 68 +95 82 63 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +106 96 78 +126 126 99 +39 70 83 +132 113 88 +32 70 76 +135 115 90 +49 61 68 +95 82 63 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +131 98 90 +164 131 98 +197 156 106 +213 180 131 +230 213 156 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/sand/palette_night.pal b/graphics/battle_terrain/sand/palette_night.pal new file mode 100644 index 000000000..67d1ab72a --- /dev/null +++ b/graphics/battle_terrain/sand/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +87 81 57 +97 102 56 +48 72 63 +99 90 66 +63 60 66 +77 102 56 +48 60 36 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +87 81 57 +97 102 56 +48 72 63 +99 90 66 +63 60 66 +77 102 56 +48 60 36 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +197 197 74 +164 156 32 +222 222 131 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/sky/palette_night.pal b/graphics/battle_terrain/sky/palette_night.pal new file mode 100644 index 000000000..9d9364afd --- /dev/null +++ b/graphics/battle_terrain/sky/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +170 183 223 +89 153 207 +21 54 75 +140 175 222 +39 54 69 +129 173 218 +21 60 54 +148 175 214 +167 196 231 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +170 183 223 +89 153 207 +21 54 75 +140 175 222 +39 54 69 +129 173 218 +21 60 54 +148 175 214 +167 196 231 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +222 238 255 +230 238 255 +238 246 255 +246 246 255 +255 255 255 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +139 172 205 +197 230 255 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/sky/tiles.png b/graphics/battle_terrain/sky/tiles.png index 461bba6754ff5351700ef1a42a154ecdc46c90ba..782d32f03ed6dc1fc19ffe4c66b1ea80bbe150e5 100644 GIT binary patch delta 738 zcmV<80v-Ld2DJu|Bn<>-K}|sb0I`n?{9y%=AwPexNkl$Pu!STVm zuIqnQgu1qY-0fomos4mQvxVb)42#wJy9r}ZgFooJcBZ+Mo&I6Ii3B5AehX80K;I?j zqD34eAeWj57^KI6aoqU?%KeRU-WoK@4o#6sO5#==D@CzH0+old-}>flgLXhbM4HQl z2S?Y6LDv9ClznOK8(RVe`oU#Kr7#o=ih+NH_KjC`DWkW5&w|_#1M7cV`-abh$M6Me z00Ddg_Q%#95OFLH4KXwVj(=5UU>HCnMPP2q9YYubE+_ICg6+!>C`U4?c zvs)qvT%1nd^`^iah@hQYKJ$k4qb9hYO(0BmKEX8=u|0Ib%$y*=_;ETo6|u)04%C0F z!}f__X9P2VKKP(RKnBjupHl=Bz~{`ivcQ%%|DJ>mz_zj-1~+%7t3XrQ1;d04TSxEb z08i8;xYak03W{U{%7tKopeB=t1vGnmQDe%Mvu>l4ceHiYf?l>6Ke^ zJo>X`Mb)eaHrOd3>m{F*b+;G%jW~aIvG`k(g^TJ1t1VuZ7cbX-49Btcz8^ixvR7g} zf(!5;5d51OT=Ev)xDQ^?iDzd)Pvc_dER0N}Q8<#3@oA)Qd&w%fId2uk>;bOBi7#0L zMRL08RMuTp(goK2IgoK2IgoK2IgoK2IgoGLR3+yL8 Urqt8k+yDRo07*qoM6N<$g4*R-y#N3J delta 739 zcmV<90v!Fd2DAo{B#|^cf4@mYK~!jg?N+^t+dvT3D;N?8DHpDg+H>yeaN^p4gYg60 zA>5@1Ms*su2kPWf-R&#n74iysg;XJ2r|jMRT9L2J%whw)Th+toi+j^ASX@aMFe|BBh>j-ttf!sdC z1TGnJe!Vlt)fg_;o39kcpay@ydF@RLtvmOHK9K|>S$+vqxCh@WrScYV&<2HeM20~N z4v6Dc5?J@w)_F^4tR0vFlh(*>Io6h92?RC|Yrm7`Z3A|O0ErwIg=da#EQ70oA+h!= zwr{uu7WhT!4og84e-{`-7TPzW=vw3rf4KJ?-5^8O|7QC}&4Xb0WNKgn_+Z!{TRxD- zv3NAd(B$U$XIq900%&v|m{Yl9(4(1m&iR(~K zaYKRtddPxO2!evtfK`HTAPCBW^q`lLW)B7BVgl;cNYZE_fT$WlUWsx$jz>9LEUL5~ z{8ACJP8<=Wf2{kxAUERN#Ui(4uour-ZSk@^dAY`a5X*4A4{QfDI1A$uoPZZV@H{m* zGoo7X%Jzy^kAF|*>D3aGz zud@D8MGq9oC4!n*SVvM>SuUej0o?c%=mYr3SwYei*z`f`o*GgoK2IgoK2IgoK2IgoK0{_zNW& VK8AaZ+6Vvu002ovPDHLkV1mt0Rh|F< diff --git a/graphics/battle_terrain/tall_grass/palette_night.pal b/graphics/battle_terrain/tall_grass/palette_night.pal new file mode 100644 index 000000000..d4fa9cee8 --- /dev/null +++ b/graphics/battle_terrain/tall_grass/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +60 99 93 +72 114 93 +39 114 87 +78 99 81 +30 114 93 +87 105 93 +0 0 0 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +60 99 93 +72 114 93 +39 114 87 +78 99 81 +30 114 93 +87 105 93 +0 0 0 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +123 205 115 +164 222 148 +82 164 57 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/battle_terrain/water/palette_night.pal b/graphics/battle_terrain/water/palette_night.pal new file mode 100644 index 000000000..2b8f714ef --- /dev/null +++ b/graphics/battle_terrain/water/palette_night.pal @@ -0,0 +1,51 @@ +JASC-PAL +0100 +48 +0 0 0 +39 51 63 +35 76 128 +30 105 133 +34 99 119 +36 83 123 +21 69 84 +39 99 134 +21 51 84 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +39 51 63 +35 76 128 +30 105 133 +34 99 119 +36 83 123 +21 69 84 +39 99 134 +21 51 84 +0 0 0 +0 0 0 +21 33 21 +21 33 21 +48 33 63 +48 33 63 +33 57 66 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +197 238 255 +148 213 238 +123 189 230 +90 148 222 +49 106 189 +16 74 156 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/field_effects/pics/shadow_extra_large.png b/graphics/field_effects/pics/shadow_extra_large.png index 765a5291a8d9eb0f6508e5d9e223c421112ca56b..eb334a976c597db39f56470dcb6e90b9123a3dd4 100644 GIT binary patch literal 5188 zcmeHKX;@Ro8V*~56p&RAgM?regzO1fWDyCF2%#822#9c!oP+>bOacV#?R5i-OGO0{ z1r)HBi()Gvf-5MC3aGe%Wzn{X;tFU*tWfSr!0oyHDOh1N2xeK8d9#13B}1EQk5E zgu&E3Pa|WFI=h-oifpR&lW|#tBe_Du>IqubGU?9V&Kmk8kz)%tw;gPy-S)44ef4hJ zWabuD)s|9PUasfSDBf?ISz`|>PAzmyJNJ{i|NPX#`hi~4ESGqb2eOdvKlc?rgI@{7 z?=tkSkE8Uw*rq7BKT$eVg=lx)w>@Ziy|sZiWr!2{b(DABk?l@3=`E|b%-_Gi8gpNC z;@o890g8UA?h6xZ&kVCss`-;ZOn5LVqpx8p{N#g;-dPG)J*3b1OFrtsRowcktD-K+ zn8pu}$jv=B6g(T4H8>ypJgB7C+$YLxa_?w$;lA!}x%AxefYhW8tJrPEIfvZJW4>FH zm1&x@X)n>&2=T5U{ieaM_FL*Of`T#Mp(QU7p)%%&2IDZbdyZs<1N zyxUrSVNdnE!%K`Rd%bs>j#Qpm)sh6;Pz78u`uWe)a8gN<>=$qNzM-|5>qqa|KdiHc zp>EHn`stXAGkjfkL<+ys{eI3wxXb0;b4{&tjAp4X;Wz3l2>T?SWi{PZBNk=Cbw$%U_j@m0h}TZwUYTqhH3^Tj!Wt?L@8*2t51?A+y8r*GLlPRT!e?{2JOf0@#AHB>Zcij|tCw&s5FYA4O3|G^LTt6kz`ZHGT_qHo!c@--MOa79EMOiI5Ae z*@aOq@Mdq*bhl%F0ji(Y$2r8=u$z_)>dFIwh@O$f%ZE(QIb>CoR9%oqTwFS(E0r~2 z`+A(EPc2S3C3;}{`tYv}5W&w)DMWSawy^!j2E3MsHP%}s8K(Bzk6Wfq=~_Mx8P1uV zsPq^o>M~Sn%k_-T{OFKso1UN zQM}@zElJGetV9@euixOfCBo2F6zj0kz;{HisiT9{>A!3uj+0<9(74*?PXC&|GkT{x z7KNEi=^rRRR2a_*6!fzkX_6rKI4uP&$?Vf*mPDS_1X&_*RgC#yln#6{qdXIRnZIA z4$rCMEdDFnYR}~SGo78KflCtR*3~^rxIRx_ug54REw`0i3cL~Ht~)IHgPk5fGJ7aS znUOR+@Q2PtPGlRUq0tGqqV!2he%hRY)Ev5=*^M!>7)nkYa%sDw52`vE_bXf|!}10K+mu z!uc6Ve3}5|;|=#z(;)&0r~;5`NwQQ)S9_tfymY9pF=J6kEku>%g^FT_BK>3v5J|$2 zFgUcoTAWHidBc&O3W1Q$VFb)jKrJs+f=VT)W3g#zX_z!3My3#9@iZC@iz8qO1T=&| zE7PSaK#i6voi!BG91Kv&SBT{*u}q58Z~{D8ipmRxg8Gqf=O>Y~+3)D3${7_PJ+Nv( zj>TheScwGtp@&lCp9+!8Oz3Ytl;P0TjOBnzS&D)W`lo_YmGg%b0{%OHd5R)g8;*dF z1(QJu1XV(#;y)TPki`yt=b@26B$mjvUXa)yAys1Gd$B&6o2Ew_&W96$+~4tjgnk>l z77U@-Y&t{6Pti<|#qdID#-|Hpe6fJ8tgm?>CP)@*yO2n2;?e>B^dL$g z6%=R(g8Zht_z8ei1VTG}CZ*om#ecJ0Gzv(@Qw1JqGQjgdllYLvfDjO(J@_~h$wTNt zgQWkMT`3c)(f|eMD}o}0qJdIK8x7KBMoia_@o5R5MkyQtkH(SE1X4JjLMPzqBpM1k z6D(G6jcUaBnrIGL-{LQSxKR5zJ{dtg2()Y7m zpXK@_1wIMFyvoZ7~Zw=*b< tw>B~QwJ_T-7>S(4!S8}0lXaaaFqnH=^e+*NQ;rZC#_|tg99Xg3j9Hh@&EqUA5s%2VrH0YF+Fpl-(pRmat2RVKbLh*2~7Zaj3H$J diff --git a/graphics/field_effects/pics/shadow_large.png b/graphics/field_effects/pics/shadow_large.png index e917823b05cd96f64884877479f9c8df82d73483..1695208af543eee620304317dd419295cbe6d44a 100644 GIT binary patch literal 4911 zcmeHKYg7~077ij+!B?dM3YIY_SHUEckiaA+0ummnCSpJkg~DVqA)|Sb2}uA^E=qlH z^~y^`@d3j1QSnjj)go#^xJVUIQL(nZuoSRXpruNElzS3TaozrLt=oTQt(=)T``h2% z`#bxbWY&jELdV!owx>`iV?<#>DY!!5J94-!7?*v1ub4uyJ&+o?*dRqskWQ~v5Goup zr08%6Hxmj9#eAz`%ktbuo})whk8PM`BM6Xjw}vh~4p*3Y5 zy0twmyL?{!eQiEp$!eP3zAiM|=}?E6zpHZjhRUB_c5|}sE_iVN=sM;!W!sC+-*eB_ zcb42!d8Kx)rfOSid-w}`uXZsu(DURm$Dh5FM$&_8+K0#4KkSUUSoiZDhkE3@m8Uw| zPsK&7@_pW{4eCv;nN!1GGp$r{rI`}Lu-o4;W7+(G&9%l|;dy=Kqis^0_x4pE=>DYb zN?J*2kKm(*y~3}*CgETAq|cUg;<1_+-nH(=EymyaQrwc7qfL)ZmmZ^+l2W5N9%aAl z9~zUMLgs*iNBE?=ZqHtIVP>n%x8G${)jN&L56N;_?0NM}M7an%v2pVJ$d6UZB3JW4 zrt^auv5evxm*u(rqt4cZ8yV5?H{+HnyOusNZgg`sWlnR<|1e6o`1*qUc&}|_Isb~} zrccz7?3R*@N!i~YnEIt>`;JgzL?8WdQ>)kIEyk@=#@;X&duPapk{@`ApVbTK&v zOlv?SV*@50{K(n$m-=ftK^)Q5e5qs$zaa9Mym4l`DkW~^_1bH>xDV+a6&EW=F_Pmx zt#YDgUSJl)9yHG^k5Vlu`AU|Y6;Lt4UEh(jX~oU^q1WpDwq>_qAG-hB zip(3yxlTUgvFYPa1XD&eX2%$$ZAUKC6h~o6uxxRWQ?Vr5W#mIhlK1hWKc+sdrS1EJ zp;?jV;Bb4vW-u_$r~mlmvnBEI+nuJX=KkbzXm?0;k1Hn)53L*%ap(4LDbEXiS1jtD zyiooP6{DKH&QztGY+E#M(n*f)#r>NHiGPsg$!^^Rk)`Sbb?}rk z_svO7cMT6!=L(%w{>X`+DGp6v#t>Dz4$HDAnq&T?Pnpv!iVdnze>f-&&s0Eo(Gg>#7@M6YKOv?9is-8=D zAAgvj?{sDpVbWMPyOzw=?%9h*I48zUiM0#twykY!6kQ4ay|N)4o4# zTh-_lF}i>F?tTB-DXGnhUAbsvRn0#~em1@){c+b;Fr_fwfLo_#RbcDeA(3y?=owj_oPG3Zh^z*g;DKnCOq7?+uo76 zWRY}q8R7r9)&1WuXX-^i9LUJQY&bKOz21 zbg_6o57VmYs9Y<<>1MSKoU#-O-`}i5vE{e{lHrMjMnLU4b(RVdasf4(BZkGgAY4g= zrRwpBR7oV3x*X%mss3~9`DPvso|Y$l8>>KuEBua_%$Qens-1$Yurl?H>3$6%ODCc4RouGJ?pm|QNG0kaq^ z77ZY1WQxXsnrRx+!$L8@A;d{cPv{JURs&f$QJFT`AfQr#9eS0YS|=92rq_^zDgZqg zW>m*u(qV>L%^2!I8iI|0WH6yW^&lg`j}b$PliFlGh6fvQjlp9mg&ceBuS?detmVit z2Cl-@07`V!aW2A^$zYlfE|b&P3IwCcI9x6b#W0xT!{IX7 z3dImAk%ly&8Vt8k0dhJ4cn}3DM-bSD2Fv^q8XM!nGz9ju3^GI^Lu6d8+;0fQ0zCn` z5>*Y&%0eXvR4iYVEw`}1uneQIxiW-?UGge^8&*~0xF9RznKYFp#}wT0DFMY$h9W&jVY2);}Hhbq9@?zvbbE9AHwv7 zIlk;SpeS5Vf?l++GGRJvz+zb#9w-M$i&{Dr5Li7xHM}4_jvBQ3NUc^SpjwiGES}Z| zhxh}_5=M{!kz(oj!LEoPnL_L;BpaE!J+y1uw+1E7-)=hP#R0lMOiGlFN*m2yve04;ufV~7Lx|EX)Jam(~rku@|XyfF<30avZr5F%V+$L9(*fc$RPmy z2Ij!w0?sPN>%(eLFN=hK;b(9i{=x`=`hAdh()Ybw@8xOn#zPsMb^-c=B6Zn01 z{omxWfAhM7YrsDs6L^`~ST#ZqUWDNA`H{h7U0MJ2z)9}c&7AtnJkSA6s#eD1>ur`8%R1n+yDWz1++y< zomyrQD`2J1K9fTShWry>Juwc-bp~k_4>!PUjLD`?zGRhzq9vu z_Sq|^C@ON9jpcimBofI+DBz31(-vG7rY7KSyh>V6BAGbn#H`Yaku0)Wqmtw47+IUG z#>kismy<}kU+z1SYe)fu#}b5cgLFZ{7*@4z_ov~+wq>}Dr_6(GiSZ= zvC+O=y%YJxp>l`XgmYfmNv^zTaz#+%f!v44*sTpGH}1H`T_SBTt#jF0cK(m@n&+MK z>;&g7r3sHw-zBALM^He4*1ZnN6QX- zM0_VWa<6M%)!>$G8O>kF=U%#!cYOS&cS2o+wa-_^8H-{3-oIAxHszapFTMFzRCsc2 z^^u~i>+@sl+84(kb*x}sw@>-w9V^Aj>|<#%_0>6km69(Wm>s(`!5{DLuHJW}D3)=* z&3Jh62^sFrO%mxDUGSp& zdyVQXesC*rH8R>Ipm;ny_Z`2jE`NExYhrGlu~BQ=f)yHDVIF#X-H`JhZn@jS)av-O zalxrf25GUxUcGsg_{G<@xK*SB4;bViQJK0X3o@@U(ULJ_u}o^vpX(UHN2hrH0D2y zkh`p+Vy8`O$+mrAB(u)q$^gs!{?O(MBo~e2FD+Ty@_W;!e2L?kwLKg9gKj9VCRq#& zo^@b1cTbpt+xp;PZnMM1XV0#{RHa?Q6}87Dt3v~x?Uv5x6e-uC#(^sz)Q#UcGikH_ zO1HM*C=}-;AE4bD&ipy9yDRQ||Je7BDtG5mfZrv`oddnoxc+{m=`;~5kPTqTwHDXs7A74_`RrFKFQSzu;pGV;Ut33V5 z!;bwmqAt6_qEE#R;j25&9Ssc>xs=+MK0LuL#Lg#Hm!|GKIMTkx(Wk-Nsj=53#5i0) zF*BNXr{QZ$J9@%Ov2{HjG(5QQ(1e#pc;g>=+fgH?r>!FB>B8s3mpvmz9AOKq`;jz$ zVO_AqA%*F4cl?(F2_NK*I2{&$_-BG$#f1Bb3m0ma1*bS4K0KV#^S=6s3BLwj;h<<= z)|=>KJd*ralr4Gi?(IY(Cv9Ztu~C~i?&p9XTU=?ewf8d0v&J&Vo{Usxei9Tvq}lm{ zXtghBXO1{%TdPD798{(7MPw=|=BrbvL0cn{0)upF1Wm)VWGR-6E4h@BV<#zOT*jru zF-0_ynun#}f*cJNof8>@=A@x)86{|mWuT4&2o#tWA?p`srDF;JCBUro*QQ)16h*!C&`XevE7S%rAogoWEiQj0)@!lpM-1uA z3a_(q(d%KWzq;P)TSJC5q{(0J$#?c>GyXIgGFoC?Ej#gJ2Y9Kx`>OgAf{u zVl)N{86k^L{G>9(s$K-Mb3QO6T zfl7vQmZ~%g1S}`6K$0=4TA6GZ&q+;gvl(nQ17`Zcph*2+fnqTY0cugtN~ifUV8e)hVK^WiAT6S=R6t;`gKRiF z4Tfk{ni!QTolDV&K-PO23Y;7`wJZXh0EldT%}-Z-G`4o?Yibjuud@>>xi$;YU?IsMQ;-cPAwxD~&uKBeUdLypV0xu!3_3)EAqE^n58yCp9GFR= zPA5y%@97uW22%e=k3a)pMiT&jQ#R0CK(C^{Y*y2H=_ULdf79#mH_ia4XD4|heP`vG zmFtZZcq8y^bExKY6KX zvbE$|36UETGFjhrDK)n^L|oGP1VC)*;--3OE)l|JJ5Ekc0!yu{!(;F;l7=tilQx+x z5P*+4YC$|fB3aq#FC$V_wIeW^YlWgP^WRJz?dL-~?%7oV(|baGNQ^}vD*4fbm2BK% i>S-hG+-SVfBEp8$5N+q`sJ?s;ph&{7NPc6eq~O1~4GgXT delta 86 zcmbQQ+Rr#adGbF&MenHYy#j_oTb3kM7du*7O8o!-pMilvHh11}ASLDL;uyj)GdbY^ p^N;_`2iY}vlm50dwQ%_GG92cTe|U0_SQ$_igQu&X%Q~loCID}b9-#mL diff --git a/graphics/field_effects/pics/shadow_small.png b/graphics/field_effects/pics/shadow_small.png index f5feada2b96633ca74e5281fa01fa7fd59aff536..6cd37c5f23a54d2ea919da42888fa1bb2f98384a 100644 GIT binary patch literal 4807 zcmeHKX;c&05)P{fxFX8{Y7C+%c9ITFAQ5B3%M9uqL`6XuKv@Ps!Id+D3o0VwL!TS(CZNKZ`Qtfn{+V++-CeiptE#W+R&p~# z<_3;1wKXM?NF%sGetd8@(O!lI;F~$=U=fLAz)1=XSMgCbS)r7RaS29NB`Pp7roqJ| zlIB+Dj>XCuQ_a&`Bm8%yP4*VBkex@Lk+0T|O0AB3*0$V(#?3usi~7v=-5dSv?a~z^ zUk{tmE1~+G$)5jG<2!PfneoHdhmYl@gn#&$L#R%wn+-XRTa?G=ykz$9%?Web?zo0WIPPrTkK^<+ii>O-;L;Vouy2 z-?HXr?61K)rWlJYHAag{1p6Pj(bU_`H`$?%78}NtM7y0+pPn~jBRo5=>h^Z$@`|1i z@&>M~H{6Jf)UmUiOJkB#riAI07G0CHM0eko3D&EcZX9!n*k@$s(Eh`XpxY>E+N!Q~ z(IFixQz)6)RnDizPTFid%P3uvw{e7tQ-EyUw$(xU_H7+@txm_!*e8ay)#S^1-T;W>(pS-BT8~+~2{xE4jM(h|^x%Wyg*za}6V)jeC$g7Lcp- zhSE8g9egBXLh_Sa#~&>*4whD#IBY^xEma32o2oj)_uhKi^f>>I^-Yll)~+c>lXmY* z%q_1rFLxik?&;*TRS&Cc?ABhA9oSQoBF@RGTF02{zHtgX+C0~NWO2&}&ht%s%>D|z z^Jem+DaGn7gvH&d?RjTYy^q%}-SeaZ^6jyy%TFrpe(D&3a?Zw&IG^70sMD-tNz|L$ zf66(1aU6rNGF#cTTABFnhr*X9>uzR0AKx&i82k#IxRbv+-_=aC|3Isdk=Q` z_q5-+aM->tIeke@eO&cN=9%W{?!F*94oUp>6 z@?d3qTPk%8iKMp%=Ws%}9L}fh1U6Al>Q>L7%ii`COTF?b+gB}gy1!*VJ7Tou^6cqW zrM|fH=_k?34r>Gt;z!yWHLqGdas7f})-h4zBaM7s7?ju6avS`E-!J9Ij%h1h?se~O z@|_C?=WD0WH}5mtS8ynAZu#2C9~PLLFWYRAKDsQe${gAiQBxM5a`*D(=5sdnO0Ul{TyB(SxGg{quN_t<`{F=wBx5&s` z%eS5#Rdc1-*Mn!j-E#ZO3#<&RZgI}`Ww~d%s+Zc#C~*GnM5Dcr{_G%%k>1!R1^Y}b z;6)4g=J~kS^ZOHj|1eF-Z9kf}RjB9cG+OHQX5#zjH=O43*xXY0KYIib6AyYvTgST2 zc>1oTaM9GXuJ4NYGe0h}`02ys3k?ki0=;AHii)1cUYnpeYv7lMd~YqS4s2XJL%%EL z6)!RRh1KK5L{eN=+bg{)e%MvFOQnH6`@Vd8aSHcRfh&E+z2``EY#-0rh z##=aV4qGUfQc;myfKfG41sH!Ml82W@fePa=6-ykuLO;c5%PGY5c5yKWGaWj5F+7cdquob zqDx04q+t?F3RDT;6&~U;kjo4CY@wwf2A3*yR)FjwnkroUg{&d5X;*aV3=RaCf5si6 z{V8{yGSK4j*nVv z5>JXYD6-a4*WhH2{;~w&1kgy-_WVHC&&QVczx8hd39efrlXZ>DMuq)O2s8l`=^O#O z{v}~7DvQCu4j*W#PjdVp$^}X+bY(EzAQ6U%AViG8kUJs}K$x40J1PVTqPqw5=8U&X*zDSzv( zZ*+YX17D^5t-JnjbeVoR?qD+T4@eCTGl>DswcsE`51A9{PgLahT|eDdk$o?lNcQpR z%Rha6S@L=xes)DKP#F#LPv;Ag2_F{ArmwFLNDfT0eg$rNg4uz7q;*E)gTTvhMNkAm zBAHoeFFn%k92+1UrsDGahdnT~u^eZ{{cA@I5ZQA5d_ql{h0)#yITmS}hc&~^T~?CH b^fUEHVTHpW%-ixOphe>P&-FXu8@=j(7?>nJ delta 86 zcmX@E+Rr#ad9s?2qIXpHUID|PElZNBiybX3CI0{a&%nSSn>+6~kdpFraSY*@nVjIj p{71gw$N&HQJpUUR4l#8yGECy*{>oQV+zwR5;OXk;vd$@?2>?w89&P{t diff --git a/graphics/object_events/palettes/light.pal b/graphics/object_events/palettes/light.pal new file mode 100644 index 000000000..92a4477f7 --- /dev/null +++ b/graphics/object_events/palettes/light.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +110 198 165 +64 61 42 +77 73 50 +85 81 58 +100 94 66 +111 105 75 +119 112 77 +140 131 92 +154 145 103 +171 159 111 +186 174 123 +197 183 128 +209 195 139 +224 209 146 +234 219 155 +249 232 161 diff --git a/graphics/object_events/palettes/light2.pal b/graphics/object_events/palettes/light2.pal new file mode 100644 index 000000000..3d61a3020 --- /dev/null +++ b/graphics/object_events/palettes/light2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +106 202 166 +58 54 31 +67 62 33 +96 89 53 +110 102 57 +121 111 67 +128 119 66 +156 143 82 +166 155 96 +185 169 100 +199 183 112 +211 192 113 +223 203 123 +237 218 129 +247 227 137 +255 237 147 diff --git a/graphics/object_events/palettes/neon_light.pal b/graphics/object_events/palettes/neon_light.pal new file mode 100644 index 000000000..dd287fc64 --- /dev/null +++ b/graphics/object_events/palettes/neon_light.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +104 203 168 +19 48 64 +35 87 115 +58 132 140 +69 156 166 +77 193 254 +106 239 254 +27 68 89 +64 22 19 +115 39 34 +166 57 49 +191 66 57 +222 77 67 +0 0 0 +0 0 0 +0 0 0 diff --git a/graphics/object_events/pics/misc/bike_tire_tracks.png b/graphics/object_events/pics/misc/bike_tire_tracks.png new file mode 100644 index 0000000000000000000000000000000000000000..69a158b5d6b986b9aa6c62fecdc2aaf0ecf61ee2 GIT binary patch literal 2330 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 N6CBAt7?}Lse*nyl2|xe< literal 0 HcmV?d00001 diff --git a/graphics/object_events/pics/misc/poke_center_light.png b/graphics/object_events/pics/misc/poke_center_light.png new file mode 100644 index 0000000000000000000000000000000000000000..42d19f51c6eb9cc16d70ae9e9d4b06063494da62 GIT binary patch literal 5378 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 = DISPLAY_HEIGHT; sTransitionData->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; sTransitionData->BLDALPHA = BLDALPHA_BLEND(task->tBlendTarget2, task->tBlendTarget1); + UpdateShadowColor(0x3DEF); for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = DISPLAY_WIDTH; @@ -3961,6 +3962,8 @@ static void VBlankCB_AngledWipes(void) #define tFadeFromGrayIncrement data[5] #define tDelayTimer data[6] #define tBlend data[7] +#define tBldCntSaved data[8] +#define tShadowColor data[9] static void CreateIntroTask(s16 fadeToGrayDelay, s16 fadeFromGrayDelay, s16 numFades, s16 fadeToGrayIncrement, s16 fadeFromGrayIncrement) { @@ -3988,17 +3991,27 @@ void Task_BattleTransition_Intro(u8 taskId) static bool8 TransitionIntro_FadeToGray(struct Task *task) { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); + u16 index = OBJ_PLTT_ID(paletteNum) + 9; if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { task->tDelayTimer = task->tFadeToGrayDelay; task->tBlend += task->tFadeToGrayIncrement; if (task->tBlend > 16) task->tBlend = 16; + if (paletteNum < 16) + task->tShadowColor = gPlttBufferFaded[index]; BlendPalettes(PALETTES_ALL, task->tBlend, RGB(11, 11, 11)); + if (paletteNum < 16) + gPlttBufferFaded[index] = task->tShadowColor; } if (task->tBlend >= 16) { // Fade to gray complete, start fade back + task->tBldCntSaved = GetGpuReg(REG_OFFSET_BLDCNT); + SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntSaved & ~BLDCNT_TGT2_BG_ALL); + if (paletteNum < 16) + gPlttBufferFaded[index] = RGB(11, 11, 11); task->tState++; task->tDelayTimer = task->tFadeFromGrayDelay; } @@ -4009,11 +4022,18 @@ static bool8 TransitionIntro_FadeFromGray(struct Task *task) { if (task->tDelayTimer == 0 || --task->tDelayTimer == 0) { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); task->tDelayTimer = task->tFadeFromGrayDelay; task->tBlend -= task->tFadeFromGrayIncrement; if (task->tBlend < 0) task->tBlend = 0; BlendPalettes(PALETTES_ALL, task->tBlend, RGB(11, 11, 11)); + SetGpuReg(REG_OFFSET_BLDCNT, task->tBldCntSaved); + if (paletteNum < 16) + { + u16 index = OBJ_PLTT_ID(paletteNum) + 9; + gPlttBufferFaded[index] = task->tShadowColor; + } } if (task->tBlend == 0) { @@ -4306,6 +4326,7 @@ static bool8 FrontierLogoWave_Init(struct Task *task) LZ77UnCompVram(sFrontierLogo_Tileset, tileset); LoadPalette(sFrontierLogo_Palette, BG_PLTT_ID(15), sizeof(sFrontierLogo_Palette)); sTransitionData->cameraY = 0; + UpdateShadowColor(0x3DEF); task->tState++; return FALSE; diff --git a/src/cable_car.c b/src/cable_car.c index 8a666a536..347f4e87e 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -790,12 +790,12 @@ static void CreateCableCarSprites(void) u8 spriteId; u8 i; - u8 playerGraphicsIds[2] = { + u16 playerGraphicsIds[2] = { [MALE] = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, [FEMALE] = OBJ_EVENT_GFX_RIVAL_MAY_NORMAL }; u16 rval = Random(); - u8 hikerGraphicsIds[4] = { + u16 hikerGraphicsIds[4] = { OBJ_EVENT_GFX_HIKER, OBJ_EVENT_GFX_CAMPER, OBJ_EVENT_GFX_PICNICKER, @@ -1058,4 +1058,3 @@ static void InitGroundTilemapData(bool8 goingDown) sCableCar->groundTimer = 0; } - diff --git a/src/contest_util.c b/src/contest_util.c index 0786902b8..d41eb4ffa 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -2489,6 +2489,11 @@ void SetLinkContestPlayerGfx(void) } } +#define OBJ_EVENT_PAL_TAG_BRENDAN 0x1100 +#define OBJ_EVENT_PAL_TAG_MAY 0x1110 +#define OBJ_EVENT_PAL_TAG_RS_BRENDAN 0x1122 +#define OBJ_EVENT_PAL_TAG_RS_MAY 0x1123 + void LoadLinkContestPlayerPalettes(void) { int i; @@ -2497,28 +2502,26 @@ void LoadLinkContestPlayerPalettes(void) struct Sprite *sprite; static const u8 sContestantLocalIds[CONTESTANT_COUNT] = { 3, 4, 5, 14 }; - gReservedSpritePaletteCount = 12; if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) { for (i = 0; i < gNumLinkContestPlayers; i++) { objectEventId = GetObjectEventIdByLocalIdAndMap(sContestantLocalIds[i], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); sprite = &gSprites[gObjectEvents[objectEventId].spriteId]; - sprite->oam.paletteNum = 6 + i; version = (u8)gLinkPlayers[i].version; if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) { if (gLinkPlayers[i].gender == MALE) - LoadPalette(gObjectEventPal_RubySapphireBrendan, OBJ_PLTT_ID(6 + i), PLTT_SIZE_4BPP); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_RS_BRENDAN); else - LoadPalette(gObjectEventPal_RubySapphireMay, OBJ_PLTT_ID(6 + i), PLTT_SIZE_4BPP); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_RS_MAY); } else { if (gLinkPlayers[i].gender == MALE) - LoadPalette(gObjectEventPal_Brendan, OBJ_PLTT_ID(6 + i), PLTT_SIZE_4BPP); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_BRENDAN); else - LoadPalette(gObjectEventPal_May, OBJ_PLTT_ID(6 + i), PLTT_SIZE_4BPP); + sprite->oam.paletteNum = LoadObjectEventPalette(OBJ_EVENT_PAL_TAG_MAY); } } } diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index d19adf6f0..6bb61ae63 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -28,9 +28,21 @@ static const struct SpriteFrameImage sPicTable_ShadowExtraLarge[] = { obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge), }; +const struct SpriteFrameImage sPicTable_BallLight[] = { + obj_frame_tiles(gFieldEffectObjectPic_BallLight), +}; + +const struct SpriteFrameImage sPicTable_PokeCenterLight[] = { + obj_frame_tiles(gFieldEffectObjectPic_PokeCenterLight), +}; + +const struct SpriteFrameImage sPicTable_MartLight[] = { + obj_frame_tiles(gFieldEffectObjectPic_MartLight), +}; + const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = { - .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_SMALL, + .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_8x8, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowSmall, @@ -39,8 +51,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = { }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = { - .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_MEDIUM, + .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_16x8, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowMedium, @@ -49,8 +61,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = { }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = { - .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_LARGE, + .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_32x8, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowLarge, @@ -59,8 +71,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = { }; const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = { - .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .tileTag = FLDEFF_TILE_TAG_SHADOW_EXTRA_LARGE, + .paletteTag = TAG_WEATHER_START, .oam = &gObjectEventBaseOam_64x32, .anims = sAnimTable_Shadow, .images = sPicTable_ShadowExtraLarge, @@ -68,6 +80,42 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = { .callback = UpdateShadowFieldEffect, }; +const struct SpriteTemplate gFieldEffectObjectTemplate_BallLight = { + .tileTag = OBJ_EVENT_PAL_TAG_LIGHT, + .paletteTag = OBJ_EVENT_PAL_TAG_LIGHT, + .oam = &gObjectEventBaseOam_32x32, + .anims = sAnimTable_Inanimate, + .images = sPicTable_BallLight, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateLightSprite, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_PokeCenterLight = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NEON_LIGHT, + .oam = &gObjectEventBaseOam_16x16, + .anims = sAnimTable_Inanimate, + .images = sPicTable_PokeCenterLight, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateLightSprite, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_MartLight = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NEON_LIGHT, + .oam = &gObjectEventBaseOam_16x16, + .anims = sAnimTable_Inanimate, + .images = sPicTable_MartLight, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = UpdateLightSprite, +}; + +const struct SpriteTemplate *const gFieldEffectObjectTemplate_Light[] = { + &gFieldEffectObjectTemplate_BallLight, + &gFieldEffectObjectTemplate_PokeCenterLight, + &gFieldEffectObjectTemplate_MartLight, +}; + static const struct SpriteFrameImage sPicTable_TallGrass[] = { overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 0), overworld_frame(gFieldEffectObjectPic_TallGrass, 2, 2, 1), @@ -210,7 +258,7 @@ static const union AnimCmd *const sAnimTable_SurfBlob[] = const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_32x32, .anims = sAnimTable_SurfBlob, .images = sPicTable_SurfBlob, @@ -267,7 +315,7 @@ static const union AnimCmd *const sAnimTable_Arrow[] = const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_Arrow, .images = sPicTable_Arrow, @@ -931,7 +979,7 @@ static const union AnimCmd *const sAnimTable_Sparkle[] = const struct SpriteTemplate gFieldEffectObjectTemplate_Sparkle = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = FLDEFF_PAL_TAG_NPC_2, .oam = &gObjectEventBaseOam_16x16, .anims = sAnimTable_Sparkle, .images = sPicTable_Sparkle, @@ -975,7 +1023,7 @@ static const union AnimCmd *const sAnimTable_TreeDisguise[] = const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NPC_3, .oam = &gObjectEventBaseOam_16x32, .anims = sAnimTable_TreeDisguise, .images = sPicTable_TreeDisguise, @@ -1019,7 +1067,7 @@ static const union AnimCmd *const sAnimTable_MountainDisguise[] = const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NPC_2, .oam = &gObjectEventBaseOam_16x32, .anims = sAnimTable_MountainDisguise, .images = sPicTable_MountainDisguise, @@ -1064,7 +1112,7 @@ static const union AnimCmd *const sAnimTable_Bird[] = const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &gObjectEventBaseOam_32x32, .anims = sAnimTable_Bird, .images = sPicTable_Bird, diff --git a/src/data/graphics/battle_terrain.h b/src/data/graphics/battle_terrain.h index e719fafe3..219d85a0a 100644 --- a/src/data/graphics/battle_terrain.h +++ b/src/data/graphics/battle_terrain.h @@ -1,13 +1,16 @@ const u32 gBattleTerrainTiles_TallGrass[] = INCBIN_U32("graphics/battle_terrain/tall_grass/tiles.4bpp.lz"); const u32 gBattleTerrainPalette_TallGrass[] = INCBIN_U32("graphics/battle_terrain/tall_grass/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_TallGrass_Night[] = INCBIN_U32("graphics/battle_terrain/tall_grass/palette_night.gbapal.lz"); const u32 gBattleTerrainTilemap_TallGrass[] = INCBIN_U32("graphics/battle_terrain/tall_grass/map.bin.lz"); const u32 gBattleTerrainTiles_LongGrass[] = INCBIN_U32("graphics/battle_terrain/long_grass/tiles.4bpp.lz"); const u32 gBattleTerrainPalette_LongGrass[] = INCBIN_U32("graphics/battle_terrain/long_grass/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_LongGrass_Night[] = INCBIN_U32("graphics/battle_terrain/long_grass/palette_night.gbapal.lz"); const u32 gBattleTerrainTilemap_LongGrass[] = INCBIN_U32("graphics/battle_terrain/long_grass/map.bin.lz"); const u32 gBattleTerrainTiles_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/tiles.4bpp.lz"); const u32 gBattleTerrainPalette_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_Sand_Night[] = INCBIN_U32("graphics/battle_terrain/sand/palette_night.gbapal.lz"); const u32 gBattleTerrainTilemap_Sand[] = INCBIN_U32("graphics/battle_terrain/sand/map.bin.lz"); const u32 gBattleTerrainTiles_Underwater[] = INCBIN_U32("graphics/battle_terrain/underwater/tiles.4bpp.lz"); @@ -16,14 +19,18 @@ const u32 gBattleTerrainTilemap_Underwater[] = INCBIN_U32("graphics/battle_terra const u32 gBattleTerrainTiles_Water[] = INCBIN_U32("graphics/battle_terrain/water/tiles.4bpp.lz"); const u32 gBattleTerrainPalette_Water[] = INCBIN_U32("graphics/battle_terrain/water/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_Water_Night[] = INCBIN_U32("graphics/battle_terrain/water/palette_night.gbapal.lz"); const u32 gBattleTerrainTilemap_Water[] = INCBIN_U32("graphics/battle_terrain/water/map.bin.lz"); const u32 gBattleTerrainTiles_PondWater[] = INCBIN_U32("graphics/battle_terrain/pond_water/tiles.4bpp.lz"); const u32 gBattleTerrainPalette_PondWater[] = INCBIN_U32("graphics/battle_terrain/pond_water/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_PondWater_Night[] = INCBIN_U32("graphics/battle_terrain/pond_water/palette_night.gbapal.lz"); +const u32 gBattleTerrainPalette_PondWater_Cave[] = INCBIN_U32("graphics/battle_terrain/pond_water/palette_cave.gbapal.lz"); const u32 gBattleTerrainTilemap_PondWater[] = INCBIN_U32("graphics/battle_terrain/pond_water/map.bin.lz"); const u32 gBattleTerrainTiles_Rock[] = INCBIN_U32("graphics/battle_terrain/rock/tiles.4bpp.lz"); const u32 gBattleTerrainPalette_Rock[] = INCBIN_U32("graphics/battle_terrain/rock/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_Rock_Night[] = INCBIN_U32("graphics/battle_terrain/rock/palette_night.gbapal.lz"); const u32 gBattleTerrainTilemap_Rock[] = INCBIN_U32("graphics/battle_terrain/rock/map.bin.lz"); const u32 gBattleTerrainTiles_Cave[] = INCBIN_U32("graphics/battle_terrain/cave/tiles.4bpp.lz"); @@ -31,6 +38,7 @@ const u32 gBattleTerrainPalette_Cave[] = INCBIN_U32("graphics/battle_terrain/cav const u32 gBattleTerrainTilemap_Cave[] = INCBIN_U32("graphics/battle_terrain/cave/map.bin.lz"); const u32 gBattleTerrainPalette_Plain[] = INCBIN_U32("graphics/battle_terrain/plain/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_Plain_Night[] = INCBIN_U32("graphics/battle_terrain/plain/palette_night.gbapal.lz"); const u32 gBattleTerrainTiles_Building[] = INCBIN_U32("graphics/battle_terrain/building/tiles.4bpp.lz"); const u32 gBattleTerrainPalette_Frontier[] = INCBIN_U32("graphics/battle_terrain/stadium/battle_frontier.gbapal.lz"); // this is also used for link battles @@ -56,6 +64,7 @@ const u32 gBattleTerrainPalette_StadiumGlacia[] = INCBIN_U32("graphics/battle_te const u32 gBattleTerrainPalette_StadiumDrake[] = INCBIN_U32("graphics/battle_terrain/stadium/palette6.gbapal.lz"); const u32 gBattleTerrainPalette_StadiumWallace[] = INCBIN_U32("graphics/battle_terrain/stadium/palette7.gbapal.lz"); const u32 gBattleTerrainPalette_Rayquaza[] = INCBIN_U32("graphics/battle_terrain/sky/palette.gbapal.lz"); +const u32 gBattleTerrainPalette_Rayquaza_Night[] = INCBIN_U32("graphics/battle_terrain/sky/palette_night.gbapal.lz"); const u32 gBattleTerrainAnimTiles_TallGrass[] = INCBIN_U32("graphics/battle_terrain/tall_grass/anim_tiles.4bpp.lz"); const u32 gBattleTerrainAnimTilemap_TallGrass[] = INCBIN_U32("graphics/battle_terrain/tall_grass/anim_map.bin.lz"); diff --git a/src/data/object_events/object_event_graphics.h b/src/data/object_events/object_event_graphics.h index 2f2cf689b..9dbd5ba50 100755 --- a/src/data/object_events/object_event_graphics.h +++ b/src/data/object_events/object_event_graphics.h @@ -308,6 +308,9 @@ const u32 gFieldEffectObjectPic_ShadowSmall[] = INCBIN_U32("graphics/field_effec const u32 gFieldEffectObjectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effects/pics/shadow_medium.4bpp"); const u32 gFieldEffectObjectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effects/pics/shadow_large.4bpp"); const u32 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effects/pics/shadow_extra_large.4bpp"); +const u32 gFieldEffectObjectPic_BallLight[] = INCBIN_U32("graphics/object_events/pics/misc/light.4bpp"); +const u32 gFieldEffectObjectPic_PokeCenterLight[] = INCBIN_U32("graphics/object_events/pics/misc/poke_center_light.4bpp"); +const u32 gFieldEffectObjectPic_MartLight[] = INCBIN_U32("graphics/object_events/pics/misc/mart_light.4bpp"); static const u32 sFiller[0x48] = {}; const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effects/pics/cut_grass.4bpp"); const u32 gFieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effects/pics/cut_grass.4bpp"); @@ -375,3 +378,6 @@ const u32 gObjectEventPic_Lugia[] = INCBIN_U32("graphics/object_events/pics/poke const u16 gObjectEventPal_Lugia[] = INCBIN_U16("graphics/object_events/palettes/lugia.gbapal"); const u32 gObjectEventPic_HoOh[] = INCBIN_U32("graphics/object_events/pics/pokemon/ho_oh.4bpp"); const u16 gObjectEventPal_HoOh[] = INCBIN_U16("graphics/object_events/palettes/ho_oh.gbapal"); +const u16 gObjectEventPal_Light[] = INCBIN_U16("graphics/object_events/palettes/light.gbapal"); +const u16 gObjectEventPal_Light2[] = INCBIN_U16("graphics/object_events/palettes/light2.gbapal"); +const u16 gObjectEventPal_NeonLight[] = INCBIN_U16("graphics/object_events/palettes/neon_light.gbapal"); diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index 146bb8730..7a3a0656b 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -93,25 +93,6 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanFieldMove = .affineAnims = gDummySpriteAffineAnimTable, }; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_QuintyPlump = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_QUINTY_PLUMP, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_SPECIAL, - .shadowSize = SHADOW_SIZE_L, - .inanimate = FALSE, - .disableReflectionPaletteLoad = FALSE, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_QuintyPlump, - .images = sPicTable_QuintyPlump, - .affineAnims = gDummySpriteAffineAnimTable, -}; - const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NinjaBoy = { .tileTag = TAG_NONE, .paletteTag = OBJ_EVENT_PAL_TAG_NPC_1, @@ -1165,7 +1146,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTree = { .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_S, + .shadowSize = SHADOW_SIZE_NONE, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, @@ -1184,7 +1165,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTreeEarlyStag .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_S, + .shadowSize = SHADOW_SIZE_NONE, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, @@ -1203,7 +1184,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTreeLateStage .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_S, + .shadowSize = SHADOW_SIZE_NONE, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, @@ -1564,7 +1545,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CuttableTree = { .width = 16, .height = 16, .paletteSlot = PALSLOT_NPC_3, - .shadowSize = SHADOW_SIZE_S, + .shadowSize = SHADOW_SIZE_NONE, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, @@ -1792,7 +1773,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Truck = { .width = 48, .height = 48, .paletteSlot = PALSLOT_NPC_SPECIAL, - .shadowSize = SHADOW_SIZE_M, + .shadowSize = SHADOW_SIZE_NONE, .inanimate = TRUE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_NONE, @@ -2666,7 +2647,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HotSpringsOldWoman .width = 16, .height = 32, .paletteSlot = PALSLOT_NPC_4, - .shadowSize = SHADOW_SIZE_M, + .shadowSize = SHADOW_SIZE_NONE, .inanimate = FALSE, .disableReflectionPaletteLoad = FALSE, .tracks = TRACKS_FOOT, @@ -3996,7 +3977,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rayquaza = { .width = 64, .height = 64, .paletteSlot = PALSLOT_NPC_3, - .shadowSize = SHADOW_SIZE_M, + .shadowSize = SHADOW_SIZE_NONE, .inanimate = FALSE, .disableReflectionPaletteLoad = TRUE, .tracks = TRACKS_FOOT, @@ -4652,3 +4633,22 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = { .images = sPicTable_HoOh, .affineAnims = gDummySpriteAffineAnimTable, }; + +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BallLight = { + .tileTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_LIGHT, + .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_LIGHT_2, + .size = 512, + .width = 32, + .height = 32, + .paletteSlot = PALSLOT_NPC_1, + .shadowSize = SHADOW_SIZE_NONE, + .inanimate = TRUE, + .disableReflectionPaletteLoad = FALSE, + .tracks = TRACKS_NONE, + .oam = &gObjectEventBaseOam_32x32, + .subspriteTables = sOamTables_32x32, + .anims = sAnimTable_Inanimate, + .images = sPicTable_BallLight, + .affineAnims = gDummySpriteAffineAnimTable, +}; diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index ae1117164..24cf862e5 100755 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -2,7 +2,6 @@ extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanNorm extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanMachBike; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanSurfing; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanFieldMove; -extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_QuintyPlump; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NinjaBoy; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Twin; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy1; @@ -244,14 +243,13 @@ extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Storyteller extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giddy; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan1; extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan2; - +extern const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BallLight; const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM_OBJ_EVENT_GFX] = { [OBJ_EVENT_GFX_BRENDAN_NORMAL] = &gObjectEventGraphicsInfo_BrendanNormal, [OBJ_EVENT_GFX_BRENDAN_MACH_BIKE] = &gObjectEventGraphicsInfo_BrendanMachBike, [OBJ_EVENT_GFX_BRENDAN_SURFING] = &gObjectEventGraphicsInfo_BrendanSurfing, [OBJ_EVENT_GFX_BRENDAN_FIELD_MOVE] = &gObjectEventGraphicsInfo_BrendanFieldMove, - [OBJ_EVENT_GFX_QUINTY_PLUMP] = &gObjectEventGraphicsInfo_QuintyPlump, [OBJ_EVENT_GFX_NINJA_BOY] = &gObjectEventGraphicsInfo_NinjaBoy, [OBJ_EVENT_GFX_TWIN] = &gObjectEventGraphicsInfo_Twin, [OBJ_EVENT_GFX_BOY_1] = &gObjectEventGraphicsInfo_Boy1, @@ -486,6 +484,7 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_LINK_RS_MAY] = &gObjectEventGraphicsInfo_RubySapphireMay, [OBJ_EVENT_GFX_LUGIA] = &gObjectEventGraphicsInfo_Lugia, [OBJ_EVENT_GFX_HOOH] = &gObjectEventGraphicsInfo_HoOh, + [OBJ_EVENT_GFX_LIGHT_SPRITE] = &gObjectEventGraphicsInfo_BallLight, }; const struct ObjectEventGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = { diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index 1b8c9c727..5531ab89d 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -2172,3 +2172,5 @@ static const struct SpriteFrameImage sPicTable_RubySapphireMay[] = { overworld_frame(gObjectEventPic_RubySapphireMayNormal, 2, 4, 7), overworld_frame(gObjectEventPic_RubySapphireMayNormal, 2, 4, 8), }; + +extern const struct SpriteFrameImage sPicTable_BallLight[]; diff --git a/src/data/tilesets/graphics.h b/src/data/tilesets/graphics.h index 0aac3ee2c..339057988 100644 --- a/src/data/tilesets/graphics.h +++ b/src/data/tilesets/graphics.h @@ -1,6 +1,6 @@ const u32 gTilesetTiles_Petalburg[] = INCBIN_U32("data/tilesets/secondary/petalburg/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Petalburg[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Petalburg[][16] = { INCBIN_U16("data/tilesets/secondary/petalburg/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/petalburg/palettes/01.gbapal"), @@ -22,7 +22,7 @@ const u16 gTilesetPalettes_Petalburg[][16] = const u32 gTilesetTiles_Rustboro[] = INCBIN_U32("data/tilesets/secondary/rustboro/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Rustboro[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Rustboro[][16] = { INCBIN_U16("data/tilesets/secondary/rustboro/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rustboro/palettes/01.gbapal"), @@ -44,7 +44,7 @@ const u16 gTilesetPalettes_Rustboro[][16] = const u32 gTilesetTiles_Dewford[] = INCBIN_U32("data/tilesets/secondary/dewford/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Dewford[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Dewford[][16] = { INCBIN_U16("data/tilesets/secondary/dewford/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dewford/palettes/01.gbapal"), @@ -66,7 +66,7 @@ const u16 gTilesetPalettes_Dewford[][16] = const u32 gTilesetTiles_Slateport[] = INCBIN_U32("data/tilesets/secondary/slateport/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Slateport[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Slateport[][16] = { INCBIN_U16("data/tilesets/secondary/slateport/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/slateport/palettes/01.gbapal"), @@ -88,7 +88,7 @@ const u16 gTilesetPalettes_Slateport[][16] = const u32 gTilesetTiles_Mauville[] = INCBIN_U32("data/tilesets/secondary/mauville/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Mauville[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Mauville[][16] = { INCBIN_U16("data/tilesets/secondary/mauville/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville/palettes/01.gbapal"), @@ -110,7 +110,7 @@ const u16 gTilesetPalettes_Mauville[][16] = const u32 gTilesetTiles_Lavaridge[] = INCBIN_U32("data/tilesets/secondary/lavaridge/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Lavaridge[][16] = +const ALIGNED(4) u16 gTilesetPalettes_Lavaridge[][16] = { INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lavaridge/palettes/01.gbapal"), @@ -132,7 +132,7 @@ const u16 gTilesetPalettes_Lavaridge[][16] = const u32 gTilesetTiles_Fallarbor[] = INCBIN_U32("data/tilesets/secondary/fallarbor/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Fallarbor[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Fallarbor[][16] = { INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fallarbor/palettes/01.gbapal"), @@ -154,7 +154,7 @@ const u16 gTilesetPalettes_Fallarbor[][16] = const u32 gTilesetTiles_Fortree[] = INCBIN_U32("data/tilesets/secondary/fortree/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Fortree[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Fortree[][16] = { INCBIN_U16("data/tilesets/secondary/fortree/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fortree/palettes/01.gbapal"), @@ -176,7 +176,7 @@ const u16 gTilesetPalettes_Fortree[][16] = const u32 gTilesetTiles_Lilycove[] = INCBIN_U32("data/tilesets/secondary/lilycove/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Lilycove[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Lilycove[][16] = { INCBIN_U16("data/tilesets/secondary/lilycove/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lilycove/palettes/01.gbapal"), @@ -198,7 +198,7 @@ const u16 gTilesetPalettes_Lilycove[][16] = const u32 gTilesetTiles_Mossdeep[] = INCBIN_U32("data/tilesets/secondary/mossdeep/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Mossdeep[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Mossdeep[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep/palettes/01.gbapal"), @@ -220,7 +220,7 @@ const u16 gTilesetPalettes_Mossdeep[][16] = const u32 gTilesetTiles_EverGrande[] = INCBIN_U32("data/tilesets/secondary/ever_grande/tiles.4bpp.lz"); -const u16 gTilesetPalettes_EverGrande[][16] = +const u16 ALIGNED(4) gTilesetPalettes_EverGrande[][16] = { INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/ever_grande/palettes/01.gbapal"), @@ -242,7 +242,7 @@ const u16 gTilesetPalettes_EverGrande[][16] = const u32 gTilesetTiles_Pacifidlog[] = INCBIN_U32("data/tilesets/secondary/pacifidlog/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Pacifidlog[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Pacifidlog[][16] = { INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pacifidlog/palettes/01.gbapal"), @@ -264,7 +264,7 @@ const u16 gTilesetPalettes_Pacifidlog[][16] = const u32 gTilesetTiles_Sootopolis[] = INCBIN_U32("data/tilesets/secondary/sootopolis/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Sootopolis[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Sootopolis[][16] = { INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sootopolis/palettes/01.gbapal"), @@ -286,7 +286,7 @@ const u16 gTilesetPalettes_Sootopolis[][16] = const u32 gTilesetTiles_BattleFrontierOutsideWest[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_west/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideWest[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/palettes/01.gbapal"), @@ -308,7 +308,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideWest[][16] = const u32 gTilesetTiles_BattleFrontierOutsideEast[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_outside_east/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierOutsideEast[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/palettes/01.gbapal"), @@ -330,7 +330,7 @@ const u16 gTilesetPalettes_BattleFrontierOutsideEast[][16] = const u32 gTilesetTiles_InsideBuilding[] = INCBIN_U32("data/tilesets/primary/building/tiles.4bpp.lz"); -const u16 gTilesetPalettes_InsideBuilding[][16] = +const u16 ALIGNED(4) gTilesetPalettes_InsideBuilding[][16] = { INCBIN_U16("data/tilesets/primary/building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/building/palettes/01.gbapal"), @@ -352,7 +352,7 @@ const u16 gTilesetPalettes_InsideBuilding[][16] = const u32 gTilesetTiles_Shop[] = INCBIN_U32("data/tilesets/secondary/shop/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Shop[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Shop[][16] = { INCBIN_U16("data/tilesets/secondary/shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/shop/palettes/01.gbapal"), @@ -374,7 +374,7 @@ const u16 gTilesetPalettes_Shop[][16] = const u32 gTilesetTiles_PokemonCenter[] = INCBIN_U32("data/tilesets/secondary/pokemon_center/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonCenter[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonCenter[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_center/palettes/01.gbapal"), @@ -396,7 +396,7 @@ const u16 gTilesetPalettes_PokemonCenter[][16] = const u32 gTilesetTiles_Cave[] = INCBIN_U32("data/tilesets/secondary/cave/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Cave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Cave[][16] = { INCBIN_U16("data/tilesets/secondary/cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cave/palettes/01.gbapal"), @@ -418,7 +418,7 @@ const u16 gTilesetPalettes_Cave[][16] = const u32 gTilesetTiles_PokemonSchool[] = INCBIN_U32("data/tilesets/secondary/pokemon_school/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonSchool[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonSchool[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_school/palettes/01.gbapal"), @@ -440,7 +440,7 @@ const u16 gTilesetPalettes_PokemonSchool[][16] = const u32 gTilesetTiles_PokemonFanClub[] = INCBIN_U32("data/tilesets/secondary/pokemon_fan_club/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonFanClub[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonFanClub[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_fan_club/palettes/01.gbapal"), @@ -462,7 +462,7 @@ const u16 gTilesetPalettes_PokemonFanClub[][16] = const u32 gTilesetTiles_Unused1[] = INCBIN_U32("data/tilesets/secondary/unused_1/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Unused1[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Unused1[][16] = { INCBIN_U16("data/tilesets/secondary/unused_1/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_1/palettes/01.gbapal"), @@ -484,7 +484,7 @@ const u16 gTilesetPalettes_Unused1[][16] = const u32 gTilesetTiles_MeteorFalls[] = INCBIN_U32("data/tilesets/secondary/meteor_falls/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MeteorFalls[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MeteorFalls[][16] = { INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/meteor_falls/palettes/01.gbapal"), @@ -506,7 +506,7 @@ const u16 gTilesetPalettes_MeteorFalls[][16] = const u32 gTilesetTiles_OceanicMuseum[] = INCBIN_U32("data/tilesets/secondary/oceanic_museum/tiles.4bpp.lz"); -const u16 gTilesetPalettes_OceanicMuseum[][16] = +const u16 ALIGNED(4) gTilesetPalettes_OceanicMuseum[][16] = { INCBIN_U16("data/tilesets/secondary/oceanic_museum/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/oceanic_museum/palettes/01.gbapal"), @@ -529,7 +529,7 @@ const u16 gTilesetPalettes_OceanicMuseum[][16] = const u32 gTilesetTiles_CableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/tiles.4bpp"); const u32 gTilesetTiles_UnknownCableClub[] = INCBIN_U32("data/tilesets/secondary/cable_club/unknown_tiles.4bpp"); -const u16 gTilesetPalettes_CableClub[][16] = +const u16 ALIGNED(4) gTilesetPalettes_CableClub[][16] = { INCBIN_U16("data/tilesets/secondary/cable_club/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/cable_club/palettes/01.gbapal"), @@ -551,7 +551,7 @@ const u16 gTilesetPalettes_CableClub[][16] = const u32 gTilesetTiles_SeashoreHouse[] = INCBIN_U32("data/tilesets/secondary/seashore_house/tiles.4bpp.lz"); -const u16 gTilesetPalettes_SeashoreHouse[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SeashoreHouse[][16] = { INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/seashore_house/palettes/01.gbapal"), @@ -573,7 +573,7 @@ const u16 gTilesetPalettes_SeashoreHouse[][16] = const u32 gTilesetTiles_PrettyPetalFlowerShop[] = INCBIN_U32("data/tilesets/secondary/pretty_petal_flower_shop/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PrettyPetalFlowerShop[][16] = { INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pretty_petal_flower_shop/palettes/01.gbapal"), @@ -595,7 +595,7 @@ const u16 gTilesetPalettes_PrettyPetalFlowerShop[][16] = const u32 gTilesetTiles_PokemonDayCare[] = INCBIN_U32("data/tilesets/secondary/pokemon_day_care/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PokemonDayCare[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PokemonDayCare[][16] = { INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/pokemon_day_care/palettes/01.gbapal"), @@ -617,7 +617,7 @@ const u16 gTilesetPalettes_PokemonDayCare[][16] = const u32 gTilesetTiles_Facility[] = INCBIN_U32("data/tilesets/secondary/facility/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Facility[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Facility[][16] = { INCBIN_U16("data/tilesets/secondary/facility/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/facility/palettes/01.gbapal"), @@ -639,7 +639,7 @@ const u16 gTilesetPalettes_Facility[][16] = const u32 gTilesetTiles_BikeShop[] = INCBIN_U32("data/tilesets/secondary/bike_shop/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BikeShop[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BikeShop[][16] = { INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/bike_shop/palettes/01.gbapal"), @@ -661,7 +661,7 @@ const u16 gTilesetPalettes_BikeShop[][16] = const u32 gTilesetTiles_RusturfTunnel[] = INCBIN_U32("data/tilesets/secondary/rusturf_tunnel/tiles.4bpp.lz"); -const u16 gTilesetPalettes_RusturfTunnel[][16] = +const u16 ALIGNED(4) gTilesetPalettes_RusturfTunnel[][16] = { INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rusturf_tunnel/palettes/01.gbapal"), @@ -683,7 +683,7 @@ const u16 gTilesetPalettes_RusturfTunnel[][16] = const u32 gTilesetTiles_SecretBaseBrownCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/brown_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBrownCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/brown_cave/palettes/01.gbapal"), @@ -705,7 +705,7 @@ const u16 gTilesetPalettes_SecretBaseBrownCave[][16] = const u32 gTilesetTiles_SecretBaseTreeCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/tree/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseTree[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseTree[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/tree/palettes/01.gbapal"), @@ -727,7 +727,7 @@ const u16 gTilesetPalettes_SecretBaseTree[][16] = const u32 gTilesetTiles_SecretBaseShrubCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/shrub/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseShrub[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseShrub[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/shrub/palettes/01.gbapal"), @@ -749,7 +749,7 @@ const u16 gTilesetPalettes_SecretBaseShrub[][16] = const u32 gTilesetTiles_SecretBaseBlueCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/blue_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseBlueCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/blue_cave/palettes/01.gbapal"), @@ -771,7 +771,7 @@ const u16 gTilesetPalettes_SecretBaseBlueCave[][16] = const u32 gTilesetTiles_SecretBaseYellowCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/yellow_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseYellowCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/yellow_cave/palettes/01.gbapal"), @@ -793,7 +793,7 @@ const u16 gTilesetPalettes_SecretBaseYellowCave[][16] = const u32 gTilesetTiles_SecretBaseRedCaveCompressed[] = INCBIN_U32("data/tilesets/secondary/secret_base/red_cave/unused_tiles.4bpp.lz"); -const u16 gTilesetPalettes_SecretBaseRedCave[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBaseRedCave[][16] = { INCBIN_U16("data/tilesets/secondary/secret_base/red_cave/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/secret_base/red_cave/palettes/01.gbapal"), @@ -822,7 +822,7 @@ const u32 gTilesetTiles_SecretBaseRedCave[] = INCBIN_U32("data/tilesets/secondar const u32 gTilesetTiles_InsideOfTruck[] = INCBIN_U32("data/tilesets/secondary/inside_of_truck/tiles.4bpp.lz"); -const u16 gTilesetPalettes_InsideOfTruck[][16] = +const u16 ALIGNED(4) gTilesetPalettes_InsideOfTruck[][16] = { INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/inside_of_truck/palettes/01.gbapal"), @@ -844,7 +844,7 @@ const u16 gTilesetPalettes_InsideOfTruck[][16] = const u32 gTilesetTiles_Contest[] = INCBIN_U32("data/tilesets/secondary/contest/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Contest[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Contest[][16] = { INCBIN_U16("data/tilesets/secondary/contest/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/contest/palettes/01.gbapal"), @@ -866,7 +866,7 @@ const u16 gTilesetPalettes_Contest[][16] = const u32 gTilesetTiles_LilycoveMuseum[] = INCBIN_U32("data/tilesets/secondary/lilycove_museum/tiles.4bpp.lz"); -const u16 gTilesetPalettes_LilycoveMuseum[][16] = +const u16 ALIGNED(4) gTilesetPalettes_LilycoveMuseum[][16] = { INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lilycove_museum/palettes/01.gbapal"), @@ -888,7 +888,7 @@ const u16 gTilesetPalettes_LilycoveMuseum[][16] = const u32 gTilesetTiles_BrendansMaysHouse[] = INCBIN_U32("data/tilesets/secondary/brendans_mays_house/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BrendansMaysHouse[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BrendansMaysHouse[][16] = { INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/brendans_mays_house/palettes/01.gbapal"), @@ -910,7 +910,7 @@ const u16 gTilesetPalettes_BrendansMaysHouse[][16] = const u32 gTilesetTiles_Lab[] = INCBIN_U32("data/tilesets/secondary/lab/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Lab[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Lab[][16] = { INCBIN_U16("data/tilesets/secondary/lab/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lab/palettes/01.gbapal"), @@ -932,7 +932,7 @@ const u16 gTilesetPalettes_Lab[][16] = const u32 gTilesetTiles_Underwater[] = INCBIN_U32("data/tilesets/secondary/underwater/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Underwater[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Underwater[][16] = { INCBIN_U16("data/tilesets/secondary/underwater/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/underwater/palettes/01.gbapal"), @@ -954,7 +954,7 @@ const u16 gTilesetPalettes_Underwater[][16] = const u32 gTilesetTiles_GenericBuilding[] = INCBIN_U32("data/tilesets/secondary/generic_building/tiles.4bpp.lz"); -const u16 gTilesetPalettes_GenericBuilding[][16] = +const u16 ALIGNED(4) gTilesetPalettes_GenericBuilding[][16] = { INCBIN_U16("data/tilesets/secondary/generic_building/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/generic_building/palettes/01.gbapal"), @@ -976,7 +976,7 @@ const u16 gTilesetPalettes_GenericBuilding[][16] = const u32 gTilesetTiles_MauvilleGameCorner[] = INCBIN_U32("data/tilesets/secondary/mauville_game_corner/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MauvilleGameCorner[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MauvilleGameCorner[][16] = { INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville_game_corner/palettes/01.gbapal"), @@ -998,7 +998,7 @@ const u16 gTilesetPalettes_MauvilleGameCorner[][16] = const u32 gTilesetTiles_Unused2[] = INCBIN_U32("data/tilesets/secondary/unused_2/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Unused2[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Unused2[][16] = { INCBIN_U16("data/tilesets/secondary/unused_2/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/unused_2/palettes/01.gbapal"), @@ -1020,7 +1020,7 @@ const u16 gTilesetPalettes_Unused2[][16] = const u32 gTilesetTiles_RustboroGym[] = INCBIN_U32("data/tilesets/secondary/rustboro_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_RustboroGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_RustboroGym[][16] = { INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/rustboro_gym/palettes/01.gbapal"), @@ -1042,7 +1042,7 @@ const u16 gTilesetPalettes_RustboroGym[][16] = const u32 gTilesetTiles_DewfordGym[] = INCBIN_U32("data/tilesets/secondary/dewford_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_DewfordGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_DewfordGym[][16] = { INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/dewford_gym/palettes/01.gbapal"), @@ -1064,7 +1064,7 @@ const u16 gTilesetPalettes_DewfordGym[][16] = const u32 gTilesetTiles_MauvilleGym[] = INCBIN_U32("data/tilesets/secondary/mauville_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MauvilleGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MauvilleGym[][16] = { INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mauville_gym/palettes/01.gbapal"), @@ -1086,7 +1086,7 @@ const u16 gTilesetPalettes_MauvilleGym[][16] = const u32 gTilesetTiles_LavaridgeGym[] = INCBIN_U32("data/tilesets/secondary/lavaridge_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_LavaridgeGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_LavaridgeGym[][16] = { INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/lavaridge_gym/palettes/01.gbapal"), @@ -1108,7 +1108,7 @@ const u16 gTilesetPalettes_LavaridgeGym[][16] = const u32 gTilesetTiles_PetalburgGym[] = INCBIN_U32("data/tilesets/secondary/petalburg_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_PetalburgGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_PetalburgGym[][16] = { INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/petalburg_gym/palettes/01.gbapal"), @@ -1130,7 +1130,7 @@ const u16 gTilesetPalettes_PetalburgGym[][16] = const u32 gTilesetTiles_FortreeGym[] = INCBIN_U32("data/tilesets/secondary/fortree_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_FortreeGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_FortreeGym[][16] = { INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/fortree_gym/palettes/01.gbapal"), @@ -1152,7 +1152,7 @@ const u16 gTilesetPalettes_FortreeGym[][16] = const u32 gTilesetTiles_MossdeepGym[] = INCBIN_U32("data/tilesets/secondary/mossdeep_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MossdeepGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MossdeepGym[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep_gym/palettes/01.gbapal"), @@ -1174,7 +1174,7 @@ const u16 gTilesetPalettes_MossdeepGym[][16] = const u32 gTilesetTiles_SootopolisGym[] = INCBIN_U32("data/tilesets/secondary/sootopolis_gym/tiles.4bpp.lz"); -const u16 gTilesetPalettes_SootopolisGym[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SootopolisGym[][16] = { INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/sootopolis_gym/palettes/01.gbapal"), @@ -1196,7 +1196,7 @@ const u16 gTilesetPalettes_SootopolisGym[][16] = const u32 gTilesetTiles_TrickHousePuzzle[] = INCBIN_U32("data/tilesets/secondary/trick_house_puzzle/tiles.4bpp.lz"); -const u16 gTilesetPalettes_TrickHousePuzzle[][16] = +const u16 ALIGNED(4) gTilesetPalettes_TrickHousePuzzle[][16] = { INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/trick_house_puzzle/palettes/01.gbapal"), @@ -1218,7 +1218,7 @@ const u16 gTilesetPalettes_TrickHousePuzzle[][16] = const u32 gTilesetTiles_InsideShip[] = INCBIN_U32("data/tilesets/secondary/inside_ship/tiles.4bpp.lz"); -const u16 gTilesetPalettes_InsideShip[][16] = +const u16 ALIGNED(4) gTilesetPalettes_InsideShip[][16] = { INCBIN_U16("data/tilesets/secondary/inside_ship/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/inside_ship/palettes/01.gbapal"), @@ -1241,7 +1241,7 @@ const u16 gTilesetPalettes_InsideShip[][16] = const u32 gTilesetTiles_SecretBase[] = INCBIN_U32("data/tilesets/primary/secret_base/tiles.4bpp"); const u32 gTilesetTiles_UnknownSecretBase[] = INCBIN_U32("data/tilesets/primary/secret_base/unknown_tiles.4bpp"); -const u16 gTilesetPalettes_SecretBase[][16] = +const u16 ALIGNED(4) gTilesetPalettes_SecretBase[][16] = { INCBIN_U16("data/tilesets/primary/secret_base/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/secret_base/palettes/01.gbapal"), @@ -1263,7 +1263,7 @@ const u16 gTilesetPalettes_SecretBase[][16] = const u32 gTilesetTiles_EliteFour[] = INCBIN_U32("data/tilesets/secondary/elite_four/tiles.4bpp.lz"); -const u16 gTilesetPalettes_EliteFour[][16] = +const u16 ALIGNED(4) gTilesetPalettes_EliteFour[][16] = { INCBIN_U16("data/tilesets/secondary/elite_four/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/elite_four/palettes/01.gbapal"), @@ -1285,7 +1285,7 @@ const u16 gTilesetPalettes_EliteFour[][16] = const u32 gTilesetTiles_BattleFrontier[] = INCBIN_U32("data/tilesets/secondary/battle_frontier/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontier[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontier[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier/palettes/01.gbapal"), @@ -1307,7 +1307,7 @@ const u16 gTilesetPalettes_BattleFrontier[][16] = const u32 gTilesetTiles_BattlePalace[] = INCBIN_U32("data/tilesets/secondary/battle_palace/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattlePalace[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattlePalace[][16] = { INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_palace/palettes/01.gbapal"), @@ -1329,7 +1329,7 @@ const u16 gTilesetPalettes_BattlePalace[][16] = const u32 gTilesetTiles_BattleDome[] = INCBIN_U32("data/tilesets/secondary/battle_dome/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleDome[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleDome[][16] = { INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_dome/palettes/01.gbapal"), @@ -1351,7 +1351,7 @@ const u16 gTilesetPalettes_BattleDome[][16] = const u32 gTilesetTiles_BattleFactory[] = INCBIN_U32("data/tilesets/secondary/battle_factory/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFactory[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFactory[][16] = { INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_factory/palettes/01.gbapal"), @@ -1373,7 +1373,7 @@ const u16 gTilesetPalettes_BattleFactory[][16] = const u32 gTilesetTiles_BattlePike[] = INCBIN_U32("data/tilesets/secondary/battle_pike/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattlePike[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattlePike[][16] = { INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_pike/palettes/01.gbapal"), @@ -1395,7 +1395,7 @@ const u16 gTilesetPalettes_BattlePike[][16] = const u32 gTilesetTiles_BattleArena[] = INCBIN_U32("data/tilesets/secondary/battle_arena/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleArena[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleArena[][16] = { INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_arena/palettes/01.gbapal"), @@ -1417,7 +1417,7 @@ const u16 gTilesetPalettes_BattleArena[][16] = const u32 gTilesetTiles_BattlePyramid[] = INCBIN_U32("data/tilesets/secondary/battle_pyramid/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattlePyramid[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattlePyramid[][16] = { INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_pyramid/palettes/01.gbapal"), @@ -1439,7 +1439,7 @@ const u16 gTilesetPalettes_BattlePyramid[][16] = const u32 gTilesetTiles_MirageTower[] = INCBIN_U32("data/tilesets/secondary/mirage_tower/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MirageTower[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MirageTower[][16] = { INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mirage_tower/palettes/01.gbapal"), @@ -1461,7 +1461,7 @@ const u16 gTilesetPalettes_MirageTower[][16] = const u32 gTilesetTiles_MossdeepGameCorner[] = INCBIN_U32("data/tilesets/secondary/mossdeep_game_corner/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MossdeepGameCorner[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MossdeepGameCorner[][16] = { INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mossdeep_game_corner/palettes/01.gbapal"), @@ -1483,7 +1483,7 @@ const u16 gTilesetPalettes_MossdeepGameCorner[][16] = const u32 gTilesetTiles_IslandHarbor[] = INCBIN_U32("data/tilesets/secondary/island_harbor/tiles.4bpp.lz"); -const u16 gTilesetPalettes_IslandHarbor[][16] = +const u16 ALIGNED(4) gTilesetPalettes_IslandHarbor[][16] = { INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/island_harbor/palettes/01.gbapal"), @@ -1505,7 +1505,7 @@ const u16 gTilesetPalettes_IslandHarbor[][16] = const u32 gTilesetTiles_TrainerHill[] = INCBIN_U32("data/tilesets/secondary/trainer_hill/tiles.4bpp.lz"); -const u16 gTilesetPalettes_TrainerHill[][16] = +const u16 ALIGNED(4) gTilesetPalettes_TrainerHill[][16] = { INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/trainer_hill/palettes/01.gbapal"), @@ -1527,7 +1527,7 @@ const u16 gTilesetPalettes_TrainerHill[][16] = const u32 gTilesetTiles_NavelRock[] = INCBIN_U32("data/tilesets/secondary/navel_rock/tiles.4bpp.lz"); -const u16 gTilesetPalettes_NavelRock[][16] = +const u16 ALIGNED(4) gTilesetPalettes_NavelRock[][16] = { INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/navel_rock/palettes/01.gbapal"), @@ -1549,7 +1549,7 @@ const u16 gTilesetPalettes_NavelRock[][16] = const u32 gTilesetTiles_BattleFrontierRankingHall[] = INCBIN_U32("data/tilesets/secondary/battle_frontier_ranking_hall/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleFrontierRankingHall[][16] = { INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_frontier_ranking_hall/palettes/01.gbapal"), @@ -1571,7 +1571,7 @@ const u16 gTilesetPalettes_BattleFrontierRankingHall[][16] = const u32 gTilesetTiles_BattleTent[] = INCBIN_U32("data/tilesets/secondary/battle_tent/tiles.4bpp.lz"); -const u16 gTilesetPalettes_BattleTent[][16] = +const u16 ALIGNED(4) gTilesetPalettes_BattleTent[][16] = { INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/battle_tent/palettes/01.gbapal"), @@ -1593,7 +1593,7 @@ const u16 gTilesetPalettes_BattleTent[][16] = const u32 gTilesetTiles_MysteryEventsHouse[] = INCBIN_U32("data/tilesets/secondary/mystery_events_house/tiles.4bpp.lz"); -const u16 gTilesetPalettes_MysteryEventsHouse[][16] = +const u16 ALIGNED(4) gTilesetPalettes_MysteryEventsHouse[][16] = { INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/01.gbapal"), @@ -1613,7 +1613,7 @@ const u16 gTilesetPalettes_MysteryEventsHouse[][16] = INCBIN_U16("data/tilesets/secondary/mystery_events_house/palettes/15.gbapal"), }; -const u16 gTilesetPalettes_UnionRoom[][16] = +const u16 ALIGNED(4) gTilesetPalettes_UnionRoom[][16] = { INCBIN_U16("data/tilesets/secondary/union_room/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/union_room/palettes/01.gbapal"), @@ -1635,7 +1635,7 @@ const u16 gTilesetPalettes_UnionRoom[][16] = const u32 gTilesetTiles_UnionRoom[] = INCBIN_U32("data/tilesets/secondary/union_room/tiles.4bpp.lz"); -const u16 gTilesetPalettes_GeneralWithStairs[][16] = +const u16 ALIGNED(4) gTilesetPalettes_GeneralWithStairs[][16] = { INCBIN_U16("data/tilesets/primary/general_with_stairs/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/general_with_stairs/palettes/01.gbapal"), @@ -1654,7 +1654,7 @@ const u16 gTilesetPalettes_GeneralWithStairs[][16] = const u32 gTilesetTiles_GeneralWithStairs[] = INCBIN_U32("data/tilesets/primary/general_with_stairs/tiles.4bpp.lz"); -const u16 gTilesetPalettes_Budport[][16] = +const u16 ALIGNED(4) gTilesetPalettes_Budport[][16] = { INCBIN_U16("data/tilesets/secondary/budport/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/budport/palettes/01.gbapal"), diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index cf7dac5a9..16c2fbf62 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -1,6 +1,13 @@ +#include "fieldmap.h" + +#define SWAP_PAL(x) ((x) < NUM_PALS_IN_PRIMARY ? 1 << (x) : 1 << ((x) - NUM_PALS_IN_PRIMARY)) + + + const struct Tileset gTileset_General = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(4), .isSecondary = FALSE, .tiles = gTilesetTiles_General, .palettes = gTilesetPalettes_General, @@ -12,6 +19,7 @@ const struct Tileset gTileset_General = const struct Tileset gTileset_Petalburg = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(9), .isSecondary = TRUE, .tiles = gTilesetTiles_Petalburg, .palettes = gTilesetPalettes_Petalburg, @@ -45,6 +53,7 @@ const struct Tileset gTileset_Dewford = const struct Tileset gTileset_Slateport = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(6), .isSecondary = TRUE, .tiles = gTilesetTiles_Slateport, .palettes = gTilesetPalettes_Slateport, @@ -78,6 +87,7 @@ const struct Tileset gTileset_Lavaridge = const struct Tileset gTileset_Fallarbor = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(7), .isSecondary = TRUE, .tiles = gTilesetTiles_Fallarbor, .palettes = gTilesetPalettes_Fallarbor, @@ -100,6 +110,7 @@ const struct Tileset gTileset_Fortree = const struct Tileset gTileset_Lilycove = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(6), .isSecondary = TRUE, .tiles = gTilesetTiles_Lilycove, .palettes = gTilesetPalettes_Lilycove, @@ -111,6 +122,7 @@ const struct Tileset gTileset_Lilycove = const struct Tileset gTileset_Mossdeep = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(8), .isSecondary = TRUE, .tiles = gTilesetTiles_Mossdeep, .palettes = gTilesetPalettes_Mossdeep, @@ -128,11 +140,13 @@ const struct Tileset gTileset_EverGrande = .metatiles = gMetatiles_EverGrande, .metatileAttributes = gMetatileAttributes_EverGrande, .callback = InitTilesetAnim_EverGrande, + .swapPalettes = SWAP_PAL(8), }; const struct Tileset gTileset_Pacifidlog = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(9), .isSecondary = TRUE, .tiles = gTilesetTiles_Pacifidlog, .palettes = gTilesetPalettes_Pacifidlog, @@ -144,6 +158,7 @@ const struct Tileset gTileset_Pacifidlog = const struct Tileset gTileset_Sootopolis = { .isCompressed = TRUE, + .swapPalettes = SWAP_PAL(6), .isSecondary = TRUE, .tiles = gTilesetTiles_Sootopolis, .palettes = gTilesetPalettes_Sootopolis, diff --git a/src/decoration.c b/src/decoration.c index 688018b2d..1ba489fe9 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -1624,6 +1624,13 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) } break; } + if (decoration->permission == DECORPERM_SPRITE) + { + for (i = 0; i < NUM_DECORATION_FLAGS; i++) + if (FlagGet(FLAG_DECORATION_1 + i) == TRUE) + return TRUE; + return FALSE; + } return TRUE; } @@ -2119,7 +2126,7 @@ static u8 AddDecorationIconObjectFromObjectEvent(u16 tilesTag, u16 paletteTag, u } else { - spriteId = CreateObjectGraphicsSprite(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); + spriteId = CreateObjectGraphicsSpriteWithTag(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1, paletteTag); } return spriteId; } diff --git a/src/event_data.c b/src/event_data.c index 5fbe1bd3a..33cb02027 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -196,7 +196,7 @@ bool8 VarSet(u16 id, u16 value) return TRUE; } -u8 VarGetObjectEventGraphicsId(u8 id) +u16 VarGetObjectEventGraphicsId(u8 id) { return VarGet(VAR_OBJ_GFX_ID_0 + id); } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 89a594c81..7d160e861 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -31,6 +31,8 @@ #include "constants/metatile_behaviors.h" #include "constants/trainer_types.h" #include "constants/union_room.h" +#include "field_weather.h" +#include "rtc.h" // this file was known as evobjmv.c in Game Freak's original source @@ -77,8 +79,6 @@ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprit return 0;\ } -static EWRAM_DATA u8 sCurrentReflectionType = 0; -static EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0; static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0}; static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); @@ -135,14 +135,12 @@ static void UpdateObjectEventVisibility(struct ObjectEvent *, struct Sprite *); static void MakeSpriteTemplateFromObjectEventTemplate(const struct ObjectEventTemplate *, struct SpriteTemplate *, const struct SubspriteTable **); static void GetObjectEventMovingCameraOffset(s16 *, s16 *); static const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); -static void LoadObjectEventPalette(u16); static void RemoveObjectEventIfOutsideView(struct ObjectEvent *); static void SpawnObjectEventOnReturnToField(u8, s16, s16); static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); static void ResetObjectEventFldEffData(struct ObjectEvent *); static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *); static u8 FindObjectEventPaletteIndexByTag(u16); -static void _PatchObjectPalette(u16, u8); static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8); static void SpriteCB_CameraObject(struct Sprite *); static void CameraObject_0(struct Sprite *); @@ -166,26 +164,13 @@ static void DestroyLevitateMovementTask(u8); static bool8 NpcTakeStep(struct Sprite *); static bool8 IsElevationMismatchAt(u8, s16, s16); static bool8 AreElevationsCompatible(u8, u8); +static u8 UpdateSpritePalette(const struct SpritePalette *spritePalette, struct Sprite *sprite); +static void ObjectEventSetGraphics(struct ObjectEvent *, const struct ObjectEventGraphicsInfo *); static const struct SpriteFrameImage sPicTable_PechaBerryTree[]; static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction); -const u8 gReflectionEffectPaletteMap[16] = { - [PALSLOT_PLAYER] = PALSLOT_PLAYER_REFLECTION, - [PALSLOT_PLAYER_REFLECTION] = PALSLOT_PLAYER_REFLECTION, - [PALSLOT_NPC_1] = PALSLOT_NPC_1_REFLECTION, - [PALSLOT_NPC_2] = PALSLOT_NPC_2_REFLECTION, - [PALSLOT_NPC_3] = PALSLOT_NPC_3_REFLECTION, - [PALSLOT_NPC_4] = PALSLOT_NPC_4_REFLECTION, - [PALSLOT_NPC_1_REFLECTION] = PALSLOT_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = PALSLOT_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = PALSLOT_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = PALSLOT_NPC_4_REFLECTION, - [PALSLOT_NPC_SPECIAL] = PALSLOT_NPC_SPECIAL_REFLECTION, - [PALSLOT_NPC_SPECIAL_REFLECTION] = PALSLOT_NPC_SPECIAL_REFLECTION -}; - static const struct SpriteTemplate sCameraSpriteTemplate = { .tileTag = 0, .paletteTag = TAG_NONE, @@ -454,6 +439,9 @@ const u8 gInitialMovementTypeFacingDirections[] = { #define OBJ_EVENT_PAL_TAG_LUGIA 0x1121 #define OBJ_EVENT_PAL_TAG_RS_BRENDAN 0x1122 #define OBJ_EVENT_PAL_TAG_RS_MAY 0x1123 +#define OBJ_EVENT_PAL_TAG_LIGHT 0x8001 +#define OBJ_EVENT_PAL_TAG_LIGHT_2 0x8002 +#define OBJ_EVENT_PAL_TAG_NEON_LIGHT 0x8004 #define OBJ_EVENT_PAL_TAG_NONE 0x11FF #include "data/object_events/object_event_graphics_info_pointers.h" @@ -500,6 +488,9 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_Lugia, OBJ_EVENT_PAL_TAG_LUGIA}, {gObjectEventPal_RubySapphireBrendan, OBJ_EVENT_PAL_TAG_RS_BRENDAN}, {gObjectEventPal_RubySapphireMay, OBJ_EVENT_PAL_TAG_RS_MAY}, + {gObjectEventPal_Light, OBJ_EVENT_PAL_TAG_LIGHT}, + {gObjectEventPal_Light2, OBJ_EVENT_PAL_TAG_LIGHT_2}, + {gObjectEventPal_NeonLight, OBJ_EVENT_PAL_TAG_NEON_LIGHT}, #ifdef BUGFIX {NULL, OBJ_EVENT_PAL_TAG_NONE}, #else @@ -508,187 +499,6 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { #endif }; -static const u16 sReflectionPaletteTags_Brendan[] = { - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_May[] = { - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_PlayerUnderwater[] = { - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, -}; - -static const struct PairedPalettes sPlayerReflectionPaletteSets[] = { - {OBJ_EVENT_PAL_TAG_BRENDAN, sReflectionPaletteTags_Brendan}, - {OBJ_EVENT_PAL_TAG_MAY, sReflectionPaletteTags_May}, - {OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, sReflectionPaletteTags_PlayerUnderwater}, - {OBJ_EVENT_PAL_TAG_NONE, NULL}, -}; - -static const u16 sReflectionPaletteTags_QuintyPlump[] = { - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_Truck[] = { - OBJ_EVENT_PAL_TAG_TRUCK, - OBJ_EVENT_PAL_TAG_TRUCK, - OBJ_EVENT_PAL_TAG_TRUCK, - OBJ_EVENT_PAL_TAG_TRUCK, -}; - -static const u16 sReflectionPaletteTags_VigorothMover[] = { - OBJ_EVENT_PAL_TAG_VIGOROTH, - OBJ_EVENT_PAL_TAG_VIGOROTH, - OBJ_EVENT_PAL_TAG_VIGOROTH, - OBJ_EVENT_PAL_TAG_VIGOROTH, -}; - -static const u16 sReflectionPaletteTags_MovingBox[] = { - OBJ_EVENT_PAL_TAG_MOVING_BOX, - OBJ_EVENT_PAL_TAG_MOVING_BOX, - OBJ_EVENT_PAL_TAG_MOVING_BOX, - OBJ_EVENT_PAL_TAG_MOVING_BOX, -}; - -static const u16 sReflectionPaletteTags_CableCar[] = { - OBJ_EVENT_PAL_TAG_CABLE_CAR, - OBJ_EVENT_PAL_TAG_CABLE_CAR, - OBJ_EVENT_PAL_TAG_CABLE_CAR, - OBJ_EVENT_PAL_TAG_CABLE_CAR, -}; - -static const u16 sReflectionPaletteTags_SSTidal[] = { - OBJ_EVENT_PAL_TAG_SSTIDAL, - OBJ_EVENT_PAL_TAG_SSTIDAL, - OBJ_EVENT_PAL_TAG_SSTIDAL, - OBJ_EVENT_PAL_TAG_SSTIDAL, -}; - -static const u16 sReflectionPaletteTags_SubmarineShadow[] = { - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, -}; - -static const u16 sReflectionPaletteTags_Kyogre[] = { - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_Groudon[] = { - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_Npc3[] = { // Only used by the Route 120 bridge Kecleon - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_RedLeaf[] = { - OBJ_EVENT_PAL_TAG_RED_LEAF, - OBJ_EVENT_PAL_TAG_RED_LEAF, - OBJ_EVENT_PAL_TAG_RED_LEAF, - OBJ_EVENT_PAL_TAG_RED_LEAF, -}; - -static const struct PairedPalettes sSpecialObjectReflectionPaletteSets[] = { - {OBJ_EVENT_PAL_TAG_BRENDAN, sReflectionPaletteTags_Brendan}, - {OBJ_EVENT_PAL_TAG_MAY, sReflectionPaletteTags_May}, - {OBJ_EVENT_PAL_TAG_QUINTY_PLUMP, sReflectionPaletteTags_QuintyPlump}, - {OBJ_EVENT_PAL_TAG_TRUCK, sReflectionPaletteTags_Truck}, - {OBJ_EVENT_PAL_TAG_VIGOROTH, sReflectionPaletteTags_VigorothMover}, - {OBJ_EVENT_PAL_TAG_MOVING_BOX, sReflectionPaletteTags_MovingBox}, - {OBJ_EVENT_PAL_TAG_CABLE_CAR, sReflectionPaletteTags_CableCar}, - {OBJ_EVENT_PAL_TAG_SSTIDAL, sReflectionPaletteTags_SSTidal}, - {OBJ_EVENT_PAL_TAG_KYOGRE, sReflectionPaletteTags_Kyogre}, - {OBJ_EVENT_PAL_TAG_GROUDON, sReflectionPaletteTags_Groudon}, - {OBJ_EVENT_PAL_TAG_NPC_3, sReflectionPaletteTags_Npc3}, - {OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, sReflectionPaletteTags_SubmarineShadow}, - {OBJ_EVENT_PAL_TAG_RED_LEAF, sReflectionPaletteTags_RedLeaf}, - {OBJ_EVENT_PAL_TAG_NONE, NULL}, -}; - -static const u16 sObjectPaletteTags0[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 sObjectPaletteTags1[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 sObjectPaletteTags2[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 sObjectPaletteTags3[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 *const sObjectPaletteTagSets[] = { - sObjectPaletteTags0, - sObjectPaletteTags1, - sObjectPaletteTags2, - sObjectPaletteTags3, -}; - #include "data/object_events/berry_tree_graphics_tables.h" #include "data/field_effects/field_effect_objects.h" @@ -1460,10 +1270,18 @@ void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) static void RemoveObjectEventInternal(struct ObjectEvent *objectEvent) { + u8 paletteNum; struct SpriteFrameImage image; image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size; gSprites[objectEvent->spriteId].images = ℑ - DestroySprite(&gSprites[objectEvent->spriteId]); + paletteNum = gSprites[objectEvent->spriteId].oam.paletteNum; + if (!gSprites[objectEvent->spriteId].inUse && !gSprites[objectEvent->spriteId].oam.paletteNum && gSprites[objectEvent->spriteId].callback == SpriteCallbackDummy) + DestroySprite(&gSprites[objectEvent->spriteId]); + else + { + DestroySprite(&gSprites[objectEvent->spriteId]); + FieldEffectFreePaletteIfUnused(paletteNum); + } } void RemoveAllObjectEventsExceptPlayer(void) @@ -1480,7 +1298,6 @@ void RemoveAllObjectEventsExceptPlayer(void) static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) { u8 spriteId; - u8 paletteSlot; u8 objectEventId; struct Sprite *sprite; struct ObjectEvent *objectEvent; @@ -1492,25 +1309,11 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven objectEvent = &gObjectEvents[objectEventId]; graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == PALSLOT_PLAYER) - { - LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, paletteSlot); - } - else if (paletteSlot == PALSLOT_NPC_SPECIAL) - { - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); - } - + if (spriteTemplate->paletteTag != TAG_NONE) + LoadObjectEventPalette(spriteTemplate->paletteTag); if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE) objectEvent->invisible = TRUE; - *(u16 *)&spriteTemplate->paletteTag = TAG_NONE; spriteId = CreateSprite(spriteTemplate, 0, 0, 0); if (spriteId == MAX_SPRITES) { @@ -1524,7 +1327,6 @@ static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEven sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->x += 8; sprite->y += 16 + sprite->centerToCornerVecY; - sprite->oam.paletteNum = paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->sObjEventId = objectEventId; objectEvent->spriteId = spriteId; @@ -1569,7 +1371,7 @@ u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate) return TrySpawnObjectEventTemplate(objectEventTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); } -u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation) +u8 SpawnSpecialObjectEventParameterized(u16 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation) { struct ObjectEventTemplate objectEventTemplate; @@ -1626,8 +1428,44 @@ static void MakeSpriteTemplateFromObjectEventTemplate(const struct ObjectEventTe CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEventTemplate->graphicsId, objectEventTemplate->movementType, spriteTemplate, subspriteTables); } +static u8 UpdateSpritePalette(const struct SpritePalette *spritePalette, struct Sprite *sprite) +{ + sprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum); + sprite->inUse = TRUE; + if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) + { + sprite->oam.paletteNum = LoadSpritePalette(spritePalette); + UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE); + } + else + sprite->oam.paletteNum = LoadSpritePalette(spritePalette); + + return sprite->oam.paletteNum; +} + +u8 UpdateSpritePaletteByTemplate(const struct SpriteTemplate *template, struct Sprite *sprite) +{ + u8 i = FindObjectEventPaletteIndexByTag(template->paletteTag); + if (i == 0xFF) + return i; + return UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); +} + +static u8 LoadObjectEventPaletteWithTag(u16 paletteTag, u16 overTag) +{ + u32 i = FindObjectEventPaletteIndexByTag(paletteTag); + struct SpritePalette spritePalette; + if (i == 0xFF) + return i; + spritePalette = sObjectEventSpritePalettes[i]; + if (overTag != TAG_NONE) + spritePalette.tag = overTag; + return LoadSpritePaletteIfTagExists(&spritePalette); +} + // Used to create a sprite using a graphicsId associated with object events. -u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u16 paletteTag) { struct SpriteTemplate *spriteTemplate; const struct SubspriteTable *subspriteTables; @@ -1637,7 +1475,15 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); if (spriteTemplate->paletteTag != TAG_NONE) - LoadObjectEventPalette(spriteTemplate->paletteTag); + { + if (paletteTag == TAG_NONE) + LoadObjectEventPalette(spriteTemplate->paletteTag); + else + { + LoadObjectEventPaletteWithTag(spriteTemplate->paletteTag, paletteTag); + spriteTemplate->paletteTag = paletteTag; + } + } spriteId = CreateSprite(spriteTemplate, x, y, subpriority); Free(spriteTemplate); @@ -1651,6 +1497,11 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), return spriteId; } +u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + return CreateObjectGraphicsSpriteWithTag(graphicsId, callback, x, y, subpriority, TAG_NONE); +} + #define sVirtualObjId data[0] #define sVirtualObjElev data[1] @@ -1659,7 +1510,7 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), // A unique id is given as an argument and stored in the sprite data to allow referring back to the same virtual object. // They can be turned (and, in the case of the Union Room, animated teleporting in and out) but do not have movement types // or any of the other data normally associated with object events. -u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction) +u8 CreateVirtualObject(u16 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction) { u8 spriteId; struct Sprite *sprite; @@ -1669,10 +1520,11 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevatio graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCB_VirtualObject, &spriteTemplate, &subspriteTables); - *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; x += MAP_OFFSET; y += MAP_OFFSET; SetSpritePosToOffsetMapCoords(&x, &y, 8, 16); + if (spriteTemplate.paletteTag != TAG_NONE) + LoadObjectEventPalette(spriteTemplate.paletteTag); spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); if (spriteId != MAX_SPRITES) { @@ -1680,17 +1532,10 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevatio sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = graphicsInfo->paletteSlot; - if (sprite->oam.paletteNum >= 16) - sprite->oam.paletteNum -= 16; sprite->coordOffsetEnabled = TRUE; sprite->sVirtualObjId = virtualObjId; sprite->sVirtualObjElev = elevation; - if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - else if (graphicsInfo->paletteSlot >= 16) - _PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot | 0xf0); if (subspriteTables != NULL) { @@ -1704,6 +1549,129 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevatio return spriteId; } +void UpdateLightSprite(struct Sprite *sprite) +{ + s32 hours, minutes; + s16 left = gSaveBlock1Ptr->pos.x - 2; + s16 right = gSaveBlock1Ptr->pos.x + 17; + s16 top = gSaveBlock1Ptr->pos.y; + s16 bottom = gSaveBlock1Ptr->pos.y + 15; + s16 x = sprite->data[6]; + s16 y = sprite->data[7]; + u16 sheetTileStart; + u32 paletteNum; + if (!(x >= left && x <= right && y >= top && y <= bottom)) + { + sheetTileStart = sprite->sheetTileStart; + paletteNum = sprite->oam.paletteNum; + DestroySprite(sprite); + FieldEffectFreeTilesIfUnused(sheetTileStart); + FieldEffectFreePaletteIfUnused(paletteNum); + Weather_SetBlendCoeffs(12, 12); + return; + } + + if (gTimeOfDay != TIME_OF_DAY_NIGHT) + { + sprite->invisible = TRUE; + return; + } + + if (gTimeOfDay == TIME_OF_DAY_NIGHT) + { + hours = gLocalTime.hours; + minutes = gLocalTime.minutes; + if ((hours == 5 && minutes >= 30) || (hours > 5 && hours < 18) || (hours == 18 && minutes < 30)) + { + Weather_SetBlendCoeffs(7, 12); + sprite->invisible = TRUE; + } + else + { + Weather_SetBlendCoeffs(12, 12); + sprite->invisible = FALSE; + } + } +} + +static void SpawnLightSprite(s16 x, s16 y, s16 camX, s16 camY, u32 lightType) +{ + struct Sprite *sprite; + const struct SpriteTemplate *template; + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + sprite = &gSprites[i]; + if (sprite->inUse && sprite->callback == UpdateLightSprite && sprite->data[6] == x && sprite->data[7] == y) + return; + } + lightType = min(lightType, ARRAY_COUNT(gFieldEffectObjectTemplate_Light) - 1); + template = gFieldEffectObjectTemplate_Light[lightType]; + LoadSpriteSheetByTemplate(template, 0); + sprite = &gSprites[CreateSprite(template, 0, 0, 0)]; + if (lightType == 0 && (i = IndexOfSpritePaletteTag(template->paletteTag + 1)) < 16) + sprite->oam.paletteNum = i; + else + UpdateSpritePaletteByTemplate(template, sprite); + GetMapCoordsFromSpritePos(x + camX, y + camY, &sprite->x, &sprite->y); + sprite->data[5] = lightType; + sprite->data[6] = x; + sprite->data[7] = y; + sprite->affineAnims = gDummySpriteAffineAnimTable; + sprite->affineAnimBeginning = TRUE; + sprite->coordOffsetEnabled = TRUE; + switch (lightType) + { + case 0: // Rustboro lanterns + sprite->centerToCornerVecX = -(32 >> 1); + sprite->centerToCornerVecY = -(32 >> 1); + sprite->oam.priority = 1; + sprite->oam.objMode = 1; + sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; + sprite->x += 8; + sprite->y += 22 + sprite->centerToCornerVecY; + break; + case 1 ... 2: // Pokemon Center & mart + sprite->centerToCornerVecX = -(16 >> 1); + sprite->centerToCornerVecY = -(16 >> 1); + sprite->oam.priority = 2; + sprite->subpriority = 0xFF; + sprite->oam.objMode = 1; + break; + } +} + +void TrySpawnLightSprites(s16 camX, s16 camY) +{ + u8 i; + u8 objectCount; + s16 left = gSaveBlock1Ptr->pos.x - 2; + s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; + s16 top = gSaveBlock1Ptr->pos.y; + s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; + + if (gMapHeader.events == NULL) + return; + + if (InBattlePyramid()) + objectCount = GetNumBattlePyramidObjectEvents(); + else if (InTrainerHill()) + objectCount = 2; + else + objectCount = gMapHeader.events->objectEventCount; + + for (i = 0; i < objectCount; i++) + { + struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i]; + s16 npcX = template->x + MAP_OFFSET; + s16 npcY = template->y + MAP_OFFSET; + if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) + if (template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) + SpawnLightSprite(npcX, npcY, camX, camY, template->trainerRange_berryTreeId); + } +} + void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) { u8 i; @@ -1729,9 +1697,13 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) s16 npcX = template->x + MAP_OFFSET; s16 npcY = template->y + MAP_OFFSET; - if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX - && !FlagGet(template->flagId)) - TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); + if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX && !FlagGet(template->flagId)) + { + if (template->graphicsId == OBJ_EVENT_GFX_LIGHT_SPRITE) + SpawnLightSprite(npcX, npcY, cameraX, cameraY, template->trainerRange_berryTreeId); + else + TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); + } } } } @@ -1785,12 +1757,12 @@ void SpawnObjectEventsOnReturnToField(s16 x, s16 y) SpawnObjectEventOnReturnToField(i, x, y); } CreateReflectionEffectSprites(); + TrySpawnLightSprites(x, y); } static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) { u8 i; - u8 paletteSlot; struct Sprite *sprite; struct ObjectEvent *objectEvent; struct SpriteTemplate spriteTemplate; @@ -1811,22 +1783,8 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); spriteTemplate.images = &spriteFrameImage; - *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == PALSLOT_PLAYER) - { - LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot == PALSLOT_NPC_SPECIAL) - { - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); - } - *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; + if (spriteTemplate.paletteTag != TAG_NONE) + LoadObjectEventPalette(spriteTemplate.paletteTag); i = CreateSprite(&spriteTemplate, 0, 0, 0); if (i != MAX_SPRITES) @@ -1846,7 +1804,6 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) if (subspriteTables != NULL) SetSubspriteTables(sprite, subspriteTables); - sprite->oam.paletteNum = paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->sObjEventId = objectEventId; objectEvent->spriteId = i; @@ -1862,7 +1819,7 @@ static void ResetObjectEventFldEffData(struct ObjectEvent *objectEvent) { objectEvent->singleMovementActive = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; objectEvent->hasReflection = FALSE; objectEvent->inShortGrass = FALSE; objectEvent->inShallowFlowingWater = FALSE; @@ -1879,36 +1836,18 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE); } -void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) +static void ObjectEventSetGraphics(struct ObjectEvent *objectEvent, const struct ObjectEventGraphicsInfo *graphicsInfo) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - struct Sprite *sprite; - u8 paletteSlot; - - graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - sprite = &gSprites[objectEvent->spriteId]; - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == PALSLOT_PLAYER) - { - PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot == PALSLOT_NPC_SPECIAL) - { - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); - } + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + if (i != 0xFF) + UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); sprite->oam.shape = graphicsInfo->oam->shape; sprite->oam.size = graphicsInfo->oam->size; sprite->images = graphicsInfo->images; sprite->anims = graphicsInfo->anims; sprite->subspriteTables = graphicsInfo->subspriteTables; - sprite->oam.paletteNum = paletteSlot; objectEvent->inanimate = graphicsInfo->inanimate; - objectEvent->graphicsId = graphicsId; SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); @@ -1918,7 +1857,14 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) CameraObjectReset1(); } -void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) +void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u16 graphicsId) +{ + objectEvent->graphicsId = graphicsId; + ObjectEventSetGraphics(objectEvent, GetObjectEventGraphicsInfo(graphicsId)); + objectEvent->graphicsId = graphicsId; +} + +void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u16 graphicsId) { u8 objectEventId; @@ -1949,7 +1895,29 @@ void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) ObjectEventTurn(&gObjectEvents[playerAvatar->objectEventId], direction); } -static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, u8 berryId, u8 berryStage) +{ + const u16 graphicsId = gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]; + const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); + struct Sprite *sprite = &gSprites[objectEvent->spriteId]; + UpdateSpritePalette(&sObjectEventSpritePalettes[gBerryTreePaletteSlotTablePointers[berryId][berryStage] - 2], sprite); + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = gBerryTreePicTablePointers[berryId]; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + objectEvent->inanimate = graphicsInfo->inanimate; + objectEvent->graphicsId = graphicsId; + SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->x += 8; + sprite->y += 16 + sprite->centerToCornerVecY; + if (objectEvent->trackedByCamera) + CameraObjectReset1(); +} + +static void GetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 berryStage; u8 berryId; @@ -1966,14 +1934,12 @@ static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite if (berryId > ITEM_TO_BERRY(LAST_BERRY_INDEX)) berryId = 0; - ObjectEventSetGraphicsId(objectEvent, gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]); - sprite->images = gBerryTreePicTablePointers[berryId]; - sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[berryId][berryStage]; + SetBerryTreeGraphics(objectEvent, berryId, berryStage); StartSpriteAnim(sprite, berryStage); } } -const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId) +const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u16 graphicsId) { u8 bard; @@ -2073,17 +2039,18 @@ void FreeAndReserveObjectSpritePalettes(void) gReservedSpritePaletteCount = OBJ_PALSLOT_COUNT; } -static void LoadObjectEventPalette(u16 paletteTag) +u8 LoadObjectEventPalette(u16 paletteTag) { u16 i = FindObjectEventPaletteIndexByTag(paletteTag); // FindObjectEventPaletteIndexByTag returns 0xFF on failure, not OBJ_EVENT_PAL_TAG_NONE. #ifdef BUGFIX - if (i != 0xFF) + if (i == 0xFF) + return i; #else if (i != OBJ_EVENT_PAL_TAG_NONE) #endif - LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); + return LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); } // Unused @@ -2097,28 +2064,14 @@ static void LoadObjectEventPaletteSet(u16 *paletteTags) static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette) { - if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF) - return 0xFF; + u8 paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); + if (paletteNum != 0xFF) + return paletteNum; + paletteNum = LoadSpritePalette(spritePalette); + if (paletteNum != 0xFF) + UpdateSpritePaletteWithWeather(paletteNum, FALSE); - return LoadSpritePalette(spritePalette); -} - -void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) -{ - // paletteTag is assumed to exist in sObjectEventSpritePalettes - u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); - - LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP); -} - -void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot) -{ - while (minSlot < maxSlot) - { - PatchObjectPalette(*paletteTags, minSlot); - paletteTags++; - minSlot++; - } + return paletteNum; } static u8 FindObjectEventPaletteIndexByTag(u16 tag) @@ -2133,42 +2086,6 @@ static u8 FindObjectEventPaletteIndexByTag(u16 tag) return 0xFF; } -void LoadPlayerObjectReflectionPalette(u16 tag, u8 slot) -{ - u8 i; - - PatchObjectPalette(tag, slot); - for (i = 0; sPlayerReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) - { - if (sPlayerReflectionPaletteSets[i].tag == tag) - { - PatchObjectPalette(sPlayerReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]); - return; - } - } -} - -void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot) -{ - u8 i; - - sCurrentSpecialObjectPaletteTag = tag; - PatchObjectPalette(tag, slot); - for (i = 0; sSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) - { - if (sSpecialObjectReflectionPaletteSets[i].tag == tag) - { - PatchObjectPalette(sSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]); - return; - } - } -} - -static void _PatchObjectPalette(u16 tag, u8 slot) -{ - PatchObjectPalette(tag, slot); -} - // Unused static void IncrementObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) { @@ -2602,37 +2519,6 @@ void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup } } -void InitObjectEventPalettes(u8 reflectionType) -{ - FreeAndReserveObjectSpritePalettes(); - sCurrentSpecialObjectPaletteTag = OBJ_EVENT_PAL_TAG_NONE; - sCurrentReflectionType = reflectionType; - if (reflectionType == 1) - { - PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], PALSLOT_PLAYER, PALSLOT_NPC_4 + 1); - gReservedSpritePaletteCount = 8; - } - else - { - PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], PALSLOT_PLAYER, PALSLOT_NPC_4_REFLECTION + 1); - } -} - -u16 GetObjectPaletteTag(u8 palSlot) -{ - u8 i; - - if (palSlot < PALSLOT_NPC_SPECIAL) - return sObjectPaletteTagSets[sCurrentReflectionType][palSlot]; - - for (i = 0; sSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) - { - if (sSpecialObjectReflectionPaletteSets[i].tag == sCurrentSpecialObjectPaletteTag) - return sSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType]; - } - return OBJ_EVENT_PAL_TAG_NONE; -} - movement_type_empty_callback(MovementType_None) movement_type_def(MovementType_WanderAround, gMovementTypeFuncs_WanderAround) @@ -3152,7 +3038,7 @@ void MovementType_BerryTreeGrowth(struct Sprite *sprite) objectEvent = &gObjectEvents[sprite->sObjEventId]; if (!(sprite->sBerryTreeFlags & BERRY_FLAG_SET_GFX)) { - SetBerryTreeGraphics(objectEvent, sprite); + GetBerryTreeGraphics(objectEvent, sprite); sprite->sBerryTreeFlags |= BERRY_FLAG_SET_GFX; } UpdateObjectEventCurrentMovement(objectEvent, sprite, ObjectEventCB2_BerryTree); @@ -3191,7 +3077,7 @@ bool8 MovementType_BerryTreeGrowth_Normal(struct ObjectEvent *objectEvent, struc sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE_START; return TRUE; } - SetBerryTreeGraphics(objectEvent, sprite); + GetBerryTreeGraphics(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); sprite->sTypeFuncId = BERRYTREEFUNC_MOVE; return TRUE; @@ -3231,7 +3117,7 @@ bool8 MovementType_BerryTreeGrowth_Sparkle(struct ObjectEvent *objectEvent, stru sprite->animPaused = TRUE; if (sprite->sTimer > 64) { - SetBerryTreeGraphics(objectEvent, sprite); + GetBerryTreeGraphics(objectEvent, sprite); sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE_END; sprite->sTimer = 0; return TRUE; @@ -4556,7 +4442,7 @@ bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprit return FALSE; } -static void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) +void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->singleMovementActive = FALSE; objectEvent->heldMovementActive = FALSE; @@ -5781,7 +5667,7 @@ bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Spr { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -5798,7 +5684,7 @@ bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprit { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -5815,7 +5701,7 @@ bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Spr { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -5832,7 +5718,7 @@ bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *objectEvent, struct Sp { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -6513,7 +6399,7 @@ bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Spri { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6530,7 +6416,7 @@ bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6547,7 +6433,7 @@ bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Spri { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6564,7 +6450,7 @@ bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Spr { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6581,7 +6467,7 @@ bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, stru { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6598,7 +6484,7 @@ bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6615,7 +6501,7 @@ bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, stru { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6632,7 +6518,7 @@ bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, str { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6649,7 +6535,7 @@ bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6666,7 +6552,7 @@ bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6683,7 +6569,7 @@ bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -6700,7 +6586,7 @@ bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *objectEvent, { if (DoJumpInPlaceAnim(objectEvent, sprite)) { - objectEvent->hasShadow = 0; + objectEvent->noShadow = 0; sprite->sActionFuncId = 2; return TRUE; } @@ -7144,7 +7030,7 @@ bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *objectEven { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7161,7 +7047,7 @@ bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7178,7 +7064,7 @@ bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *objectEven { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7195,7 +7081,7 @@ bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEve { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7212,7 +7098,7 @@ bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, s { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7229,7 +7115,7 @@ bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, str { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7249,7 +7135,7 @@ bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, s { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7269,7 +7155,7 @@ bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7286,7 +7172,7 @@ bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7303,7 +7189,7 @@ bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, st { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7323,7 +7209,7 @@ bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -7343,7 +7229,7 @@ bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, { if (DoJumpAnim(objectEvent, sprite)) { - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = FALSE; sprite->sActionFuncId = 2; return TRUE; } @@ -8368,6 +8254,11 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED }; +static void GroundEffect_Shadow(struct ObjectEvent *objEvent, struct Sprite *sprite) +{ + SetUpShadow(objEvent, sprite); +} + static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) { u8 i; @@ -8378,6 +8269,8 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite * for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) if (flags & 1) sGroundEffectFuncs[i](objEvent, sprite); + if (!(gWeatherPtr->noShadows || objEvent->inHotSprings || objEvent->inSandPile || MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior))) + GroundEffect_Shadow(objEvent, sprite); } void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) @@ -8944,7 +8837,7 @@ void TurnVirtualObject(u8 virtualObjId, u8 direction) StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(direction)); } -void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId) +void SetVirtualObjectGraphics(u8 virtualObjId, u16 graphicsId) { int spriteId = GetVirtualObjectSpriteId(virtualObjId); @@ -8953,10 +8846,12 @@ void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId) struct Sprite *sprite = &gSprites[spriteId]; const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); u16 tileNum = sprite->oam.tileNum; + u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag); + if (i != 0xFF) + UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); sprite->oam = *graphicsInfo->oam; sprite->oam.tileNum = tileNum; - sprite->oam.paletteNum = graphicsInfo->paletteSlot; sprite->images = graphicsInfo->images; if (graphicsInfo->subspriteTables == NULL) @@ -9083,9 +8978,9 @@ u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectE static void DoShadowFieldEffect(struct ObjectEvent *objectEvent) { - if (!objectEvent->hasShadow) + if (!objectEvent->noShadow) { - objectEvent->hasShadow = TRUE; + objectEvent->noShadow = FALSE; StartFieldEffectForObjectEvent(FLDEFF_SHADOW, objectEvent); } } diff --git a/src/event_object_movement.c.orig b/src/event_object_movement.c.orig deleted file mode 100644 index 766980298..000000000 --- a/src/event_object_movement.c.orig +++ /dev/null @@ -1,9348 +0,0 @@ -#include "global.h" -#include "malloc.h" -#include "battle_pyramid.h" -#include "berry.h" -#include "debug.h" -#include "decoration.h" -#include "event_data.h" -#include "event_object_movement.h" -#include "event_scripts.h" -#include "faraway_island.h" -#include "field_camera.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "mauville_old_man.h" -#include "metatile_behavior.h" -#include "overworld.h" -#include "palette.h" -#include "random.h" -#include "sprite.h" -#include "task.h" -#include "trainer_see.h" -#include "trainer_hill.h" -#include "util.h" -#include "constants/event_object_movement.h" -#include "constants/event_objects.h" -#include "constants/field_effects.h" -#include "constants/items.h" -#include "constants/mauville_old_man.h" -#include "constants/metatile_behaviors.h" -#include "constants/trainer_types.h" -#include "constants/union_room.h" - -// this file was known as evobjmv.c in Game Freak's original source - -enum { - MOVE_SPEED_NORMAL, // walking - MOVE_SPEED_FAST_1, // running / surfing / sliding (ice tile) - MOVE_SPEED_FAST_2, // water current / acro bike - MOVE_SPEED_FASTER, // mach bike's max speed - MOVE_SPEED_FASTEST, -}; - -enum { - JUMP_DISTANCE_IN_PLACE, - JUMP_DISTANCE_NORMAL, - JUMP_DISTANCE_FAR, -}; - -// Sprite data used throughout -#define sObjEventId data[0] -#define sTypeFuncId data[1] // Index into corresponding gMovementTypeFuncs_* table -#define sActionFuncId data[2] // Index into corresponding gMovementActionFuncs_* table -#define sDirection data[3] - - -#define movement_type_def(setup, table) \ -static u8 setup##_callback(struct ObjectEvent *, struct Sprite *);\ -void setup(struct Sprite *sprite)\ -{\ - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, setup##_callback);\ -}\ -static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\ -{\ - return table[sprite->sTypeFuncId](objectEvent, sprite);\ -} - -#define movement_type_empty_callback(setup) \ -static u8 setup##_callback(struct ObjectEvent *, struct Sprite *);\ -void setup(struct Sprite *sprite)\ -{\ - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, setup##_callback);\ -}\ -static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\ -{\ - return 0;\ -} - -static EWRAM_DATA u8 sCurrentReflectionType = 0; -static EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0; -static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0}; - -static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); -static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); -static void SetMovementDelay(struct Sprite *, s16); -static bool8 WaitForMovementDelay(struct Sprite *); -static u8 GetCollisionInDirection(struct ObjectEvent *, u8); -static u32 GetCopyDirection(u8, u32, u32); -static void TryEnableObjectEventAnim(struct ObjectEvent *, struct Sprite *); -static void ObjectEventExecHeldMovementAction(struct ObjectEvent *, struct Sprite *); -static void UpdateObjectEventSpriteAnimPause(struct ObjectEvent *, struct Sprite *); -static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *, s16, s16); -static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *, s16, s16, u8); -static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *, s16, s16); -static void UpdateObjectEventOffscreen(struct ObjectEvent *, struct Sprite *); -static void UpdateObjectEventSpriteVisibility(struct ObjectEvent *, struct Sprite *); -static void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent *); -static void GetGroundEffectFlags_Reflection(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_TallGrassOnSpawn(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_LongGrassOnSpawn(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_SandHeap(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_ShallowFlowingWater(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_ShortGrass(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_HotSprings(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_TallGrassOnBeginStep(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_LongGrassOnBeginStep(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_Tracks(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_Puddle(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_Ripple(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_Seaweed(struct ObjectEvent *, u32 *); -static void GetGroundEffectFlags_JumpLanding(struct ObjectEvent *, u32 *); -static u8 ObjectEventGetNearbyReflectionType(struct ObjectEvent *); -static u8 GetReflectionTypeByMetatileBehavior(u32); -static void InitObjectPriorityByElevation(struct Sprite *, u8); -static void ObjectEventUpdateSubpriority(struct ObjectEvent *, struct Sprite *); -static void DoTracksGroundEffect_None(struct ObjectEvent *, struct Sprite *, u8); -static void DoTracksGroundEffect_Footprints(struct ObjectEvent *, struct Sprite *, u8); -static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *, struct Sprite *, u8); -static void DoRippleFieldEffect(struct ObjectEvent *, struct Sprite *); -static void DoGroundEffects_OnSpawn(struct ObjectEvent *, struct Sprite *); -static void DoGroundEffects_OnBeginStep(struct ObjectEvent *, struct Sprite *); -static void DoGroundEffects_OnFinishStep(struct ObjectEvent *, struct Sprite *); -static void VirtualObject_UpdateAnim(struct Sprite *); -static void ApplyLevitateMovement(u8); -static bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *); -static bool8 MovementType_Buried_Callback(struct ObjectEvent *, struct Sprite *); -static void CreateReflectionEffectSprites(void); -static u8 GetObjectEventIdByLocalIdAndMapInternal(u8, u8, u8); -static bool8 GetAvailableObjectEventId(u16, u8, u8, u8 *); -static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *); -static void RemoveObjectEventInternal(struct ObjectEvent *); -static u16 GetObjectEventFlagIdByObjectEventId(u8); -static void UpdateObjectEventVisibility(struct ObjectEvent *, struct Sprite *); -static void MakeSpriteTemplateFromObjectEventTemplate(const struct ObjectEventTemplate *, struct SpriteTemplate *, const struct SubspriteTable **); -static void GetObjectEventMovingCameraOffset(s16 *, s16 *); -static const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); -static void LoadObjectEventPalette(u16); -static void RemoveObjectEventIfOutsideView(struct ObjectEvent *); -static void SpawnObjectEventOnReturnToField(u8, s16, s16); -static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); -static void ResetObjectEventFldEffData(struct ObjectEvent *); -static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *); -static u8 FindObjectEventPaletteIndexByTag(u16); -static void _PatchObjectPalette(u16, u8); -static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8); -static void SpriteCB_CameraObject(struct Sprite *); -static void CameraObject_0(struct Sprite *); -static void CameraObject_1(struct Sprite *); -static void CameraObject_2(struct Sprite *); -static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8, const struct ObjectEventTemplate *, u8); -static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *); -static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8); -static void SetSpriteDataForNormalStep(struct Sprite *, u8, u8); -static void InitSpriteForFigure8Anim(struct Sprite *); -static bool8 AnimateSpriteInFigure8(struct Sprite *); -static void SpriteCB_VirtualObject(struct Sprite *); -static void DoShadowFieldEffect(struct ObjectEvent *); -static void SetJumpSpriteData(struct Sprite *, u8, u8, u8); -static void SetWalkSlowSpriteData(struct Sprite *, u8); -static bool8 UpdateWalkSlowAnim(struct Sprite *); -static u8 DoJumpSpriteMovement(struct Sprite *); -static u8 DoJumpSpecialSpriteMovement(struct Sprite *); -static void CreateLevitateMovementTask(struct ObjectEvent *); -static void DestroyLevitateMovementTask(u8); -static bool8 NpcTakeStep(struct Sprite *); -static bool8 IsElevationMismatchAt(u8, s16, s16); -static bool8 AreElevationsCompatible(u8, u8); - -static const struct SpriteFrameImage sPicTable_PechaBerryTree[]; - -static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction); - -const u8 gReflectionEffectPaletteMap[16] = { - [PALSLOT_PLAYER] = PALSLOT_PLAYER_REFLECTION, - [PALSLOT_PLAYER_REFLECTION] = PALSLOT_PLAYER_REFLECTION, - [PALSLOT_NPC_1] = PALSLOT_NPC_1_REFLECTION, - [PALSLOT_NPC_2] = PALSLOT_NPC_2_REFLECTION, - [PALSLOT_NPC_3] = PALSLOT_NPC_3_REFLECTION, - [PALSLOT_NPC_4] = PALSLOT_NPC_4_REFLECTION, - [PALSLOT_NPC_1_REFLECTION] = PALSLOT_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = PALSLOT_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = PALSLOT_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = PALSLOT_NPC_4_REFLECTION, - [PALSLOT_NPC_SPECIAL] = PALSLOT_NPC_SPECIAL_REFLECTION, - [PALSLOT_NPC_SPECIAL_REFLECTION] = PALSLOT_NPC_SPECIAL_REFLECTION -}; - -static const struct SpriteTemplate sCameraSpriteTemplate = { - .tileTag = 0, - .paletteTag = TAG_NONE, - .oam = &gDummyOamData, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_CameraObject -}; - -static void (*const sCameraObjectFuncs[])(struct Sprite *) = { - CameraObject_0, - CameraObject_1, - CameraObject_2, -}; - -#include "data/object_events/object_event_graphics.h" - -// movement type callbacks -static void (*const sMovementTypeCallbacks[])(struct Sprite *) = -{ - [MOVEMENT_TYPE_NONE] = MovementType_None, - [MOVEMENT_TYPE_LOOK_AROUND] = MovementType_LookAround, - [MOVEMENT_TYPE_WANDER_AROUND] = MovementType_WanderAround, - [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = MovementType_WanderUpAndDown, - [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = MovementType_WanderUpAndDown, - [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = MovementType_WanderLeftAndRight, - [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = MovementType_WanderLeftAndRight, - [MOVEMENT_TYPE_FACE_UP] = MovementType_FaceDirection, - [MOVEMENT_TYPE_FACE_DOWN] = MovementType_FaceDirection, - [MOVEMENT_TYPE_FACE_LEFT] = MovementType_FaceDirection, - [MOVEMENT_TYPE_FACE_RIGHT] = MovementType_FaceDirection, - [MOVEMENT_TYPE_PLAYER] = MovementType_Player, - [MOVEMENT_TYPE_BERRY_TREE_GROWTH] = MovementType_BerryTreeGrowth, - [MOVEMENT_TYPE_FACE_DOWN_AND_UP] = MovementType_FaceDownAndUp, - [MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT] = MovementType_FaceLeftAndRight, - [MOVEMENT_TYPE_FACE_UP_AND_LEFT] = MovementType_FaceUpAndLeft, - [MOVEMENT_TYPE_FACE_UP_AND_RIGHT] = MovementType_FaceUpAndRight, - [MOVEMENT_TYPE_FACE_DOWN_AND_LEFT] = MovementType_FaceDownAndLeft, - [MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT] = MovementType_FaceDownAndRight, - [MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT] = MovementType_FaceDownUpAndLeft, - [MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT] = MovementType_FaceDownUpAndRight, - [MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT] = MovementType_FaceUpRightAndLeft, - [MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT] = MovementType_FaceDownRightAndLeft, - [MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE] = MovementType_RotateCounterclockwise, - [MOVEMENT_TYPE_ROTATE_CLOCKWISE] = MovementType_RotateClockwise, - [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = MovementType_WalkBackAndForth, - [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = MovementType_WalkBackAndForth, - [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = MovementType_WalkBackAndForth, - [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = MovementType_WalkBackAndForth, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = MovementType_WalkSequenceUpRightLeftDown, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = MovementType_WalkSequenceRightLeftDownUp, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = MovementType_WalkSequenceDownUpRightLeft, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = MovementType_WalkSequenceLeftDownUpRight, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = MovementType_WalkSequenceUpLeftRightDown, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = MovementType_WalkSequenceLeftRightDownUp, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = MovementType_WalkSequenceDownUpLeftRight, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = MovementType_WalkSequenceRightDownUpLeft, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = MovementType_WalkSequenceLeftUpDownRight, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = MovementType_WalkSequenceUpDownRightLeft, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = MovementType_WalkSequenceRightLeftUpDown, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = MovementType_WalkSequenceDownRightLeftUp, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = MovementType_WalkSequenceRightUpDownLeft, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = MovementType_WalkSequenceUpDownLeftRight, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = MovementType_WalkSequenceLeftRightUpDown, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = MovementType_WalkSequenceDownLeftRightUp, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = MovementType_WalkSequenceUpLeftDownRight, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = MovementType_WalkSequenceDownRightUpLeft, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = MovementType_WalkSequenceLeftDownRightUp, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = MovementType_WalkSequenceRightUpLeftDown, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = MovementType_WalkSequenceUpRightDownLeft, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = MovementType_WalkSequenceDownLeftUpRight, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = MovementType_WalkSequenceLeftUpRightDown, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = MovementType_WalkSequenceRightDownLeftUp, - [MOVEMENT_TYPE_COPY_PLAYER] = MovementType_CopyPlayer, - [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = MovementType_CopyPlayer, - [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = MovementType_CopyPlayer, - [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = MovementType_CopyPlayer, - [MOVEMENT_TYPE_TREE_DISGUISE] = MovementType_TreeDisguise, - [MOVEMENT_TYPE_MOUNTAIN_DISGUISE] = MovementType_MountainDisguise, - [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = MovementType_CopyPlayerInGrass, - [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = MovementType_CopyPlayerInGrass, - [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = MovementType_CopyPlayerInGrass, - [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = MovementType_CopyPlayerInGrass, - [MOVEMENT_TYPE_BURIED] = MovementType_Buried, - [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = MovementType_WalkInPlace, - [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = MovementType_WalkInPlace, - [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = MovementType_WalkInPlace, - [MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT] = MovementType_WalkInPlace, - [MOVEMENT_TYPE_JOG_IN_PLACE_DOWN] = MovementType_JogInPlace, - [MOVEMENT_TYPE_JOG_IN_PLACE_UP] = MovementType_JogInPlace, - [MOVEMENT_TYPE_JOG_IN_PLACE_LEFT] = MovementType_JogInPlace, - [MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT] = MovementType_JogInPlace, - [MOVEMENT_TYPE_RUN_IN_PLACE_DOWN] = MovementType_RunInPlace, - [MOVEMENT_TYPE_RUN_IN_PLACE_UP] = MovementType_RunInPlace, - [MOVEMENT_TYPE_RUN_IN_PLACE_LEFT] = MovementType_RunInPlace, - [MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT] = MovementType_RunInPlace, - [MOVEMENT_TYPE_INVISIBLE] = MovementType_Invisible, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN] = MovementType_WalkSlowlyInPlace, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = MovementType_WalkSlowlyInPlace, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = MovementType_WalkSlowlyInPlace, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = MovementType_WalkSlowlyInPlace, -}; - -static const bool8 sMovementTypeHasRange[NUM_MOVEMENT_TYPES] = { - [MOVEMENT_TYPE_WANDER_AROUND] = TRUE, - [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = TRUE, - [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = TRUE, - [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = TRUE, - [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = TRUE, - [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = TRUE, - [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = TRUE, - [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = TRUE, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = TRUE, - [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = TRUE, -}; - -const u8 gInitialMovementTypeFacingDirections[] = { - [MOVEMENT_TYPE_NONE] = DIR_SOUTH, - [MOVEMENT_TYPE_LOOK_AROUND] = DIR_SOUTH, - [MOVEMENT_TYPE_WANDER_AROUND] = DIR_SOUTH, - [MOVEMENT_TYPE_WANDER_UP_AND_DOWN] = DIR_NORTH, - [MOVEMENT_TYPE_WANDER_DOWN_AND_UP] = DIR_SOUTH, - [MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT] = DIR_WEST, - [MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT] = DIR_EAST, - [MOVEMENT_TYPE_FACE_UP] = DIR_NORTH, - [MOVEMENT_TYPE_FACE_DOWN] = DIR_SOUTH, - [MOVEMENT_TYPE_FACE_LEFT] = DIR_WEST, - [MOVEMENT_TYPE_FACE_RIGHT] = DIR_EAST, - [MOVEMENT_TYPE_PLAYER] = DIR_SOUTH, - [MOVEMENT_TYPE_BERRY_TREE_GROWTH] = DIR_SOUTH, - [MOVEMENT_TYPE_FACE_DOWN_AND_UP] = DIR_SOUTH, - [MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT] = DIR_WEST, - [MOVEMENT_TYPE_FACE_UP_AND_LEFT] = DIR_NORTH, - [MOVEMENT_TYPE_FACE_UP_AND_RIGHT] = DIR_NORTH, - [MOVEMENT_TYPE_FACE_DOWN_AND_LEFT] = DIR_SOUTH, - [MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT] = DIR_SOUTH, - [MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT] = DIR_SOUTH, - [MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT] = DIR_SOUTH, - [MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT] = DIR_NORTH, - [MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT] = DIR_SOUTH, - [MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE] = DIR_SOUTH, - [MOVEMENT_TYPE_ROTATE_CLOCKWISE] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_UP_AND_DOWN] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_DOWN_AND_UP] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT] = DIR_WEST, - [MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT] = DIR_EAST, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP] = DIR_EAST, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT] = DIR_WEST, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP] = DIR_WEST, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT] = DIR_EAST, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT] = DIR_WEST, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN] = DIR_EAST, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT] = DIR_EAST, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN] = DIR_WEST, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP] = DIR_WEST, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN] = DIR_EAST, - [MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN] = DIR_WEST, - [MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP] = DIR_EAST, - [MOVEMENT_TYPE_COPY_PLAYER] = DIR_NORTH, - [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE] = DIR_SOUTH, - [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE] = DIR_WEST, - [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE] = DIR_EAST, - [MOVEMENT_TYPE_TREE_DISGUISE] = DIR_SOUTH, - [MOVEMENT_TYPE_MOUNTAIN_DISGUISE] = DIR_SOUTH, - [MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS] = DIR_NORTH, - [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = DIR_SOUTH, - [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = DIR_WEST, - [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = DIR_EAST, - [MOVEMENT_TYPE_BURIED] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = DIR_WEST, - [MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT] = DIR_EAST, - [MOVEMENT_TYPE_JOG_IN_PLACE_DOWN] = DIR_SOUTH, - [MOVEMENT_TYPE_JOG_IN_PLACE_UP] = DIR_NORTH, - [MOVEMENT_TYPE_JOG_IN_PLACE_LEFT] = DIR_WEST, - [MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT] = DIR_EAST, - [MOVEMENT_TYPE_RUN_IN_PLACE_DOWN] = DIR_SOUTH, - [MOVEMENT_TYPE_RUN_IN_PLACE_UP] = DIR_NORTH, - [MOVEMENT_TYPE_RUN_IN_PLACE_LEFT] = DIR_WEST, - [MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT] = DIR_EAST, - [MOVEMENT_TYPE_INVISIBLE] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN] = DIR_SOUTH, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = DIR_NORTH, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = DIR_WEST, - [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = DIR_EAST, -}; - -#define OBJ_EVENT_PAL_TAG_BRENDAN 0x1100 -#define OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION 0x1101 -#define OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION 0x1102 -#define OBJ_EVENT_PAL_TAG_NPC_1 0x1103 -#define OBJ_EVENT_PAL_TAG_NPC_2 0x1104 -#define OBJ_EVENT_PAL_TAG_NPC_3 0x1105 -#define OBJ_EVENT_PAL_TAG_NPC_4 0x1106 -#define OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION 0x1107 -#define OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION 0x1108 -#define OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION 0x1109 -#define OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION 0x110A -#define OBJ_EVENT_PAL_TAG_QUINTY_PLUMP 0x110B -#define OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION 0x110C -#define OBJ_EVENT_PAL_TAG_TRUCK 0x110D -#define OBJ_EVENT_PAL_TAG_VIGOROTH 0x110E -#define OBJ_EVENT_PAL_TAG_ZIGZAGOON 0x110F -#define OBJ_EVENT_PAL_TAG_MAY 0x1110 -#define OBJ_EVENT_PAL_TAG_MAY_REFLECTION 0x1111 -#define OBJ_EVENT_PAL_TAG_MOVING_BOX 0x1112 -#define OBJ_EVENT_PAL_TAG_CABLE_CAR 0x1113 -#define OBJ_EVENT_PAL_TAG_SSTIDAL 0x1114 -#define OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER 0x1115 -#define OBJ_EVENT_PAL_TAG_KYOGRE 0x1116 -#define OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION 0x1117 -#define OBJ_EVENT_PAL_TAG_GROUDON 0x1118 -#define OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION 0x1119 -#define OBJ_EVENT_PAL_TAG_UNUSED 0x111A -#define OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW 0x111B -#define OBJ_EVENT_PAL_TAG_POOCHYENA 0x111C -#define OBJ_EVENT_PAL_TAG_RED_LEAF 0x111D -#define OBJ_EVENT_PAL_TAG_DEOXYS 0x111E -#define OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE 0x111F -#define OBJ_EVENT_PAL_TAG_HO_OH 0x1120 -#define OBJ_EVENT_PAL_TAG_LUGIA 0x1121 -#define OBJ_EVENT_PAL_TAG_RS_BRENDAN 0x1122 -#define OBJ_EVENT_PAL_TAG_RS_MAY 0x1123 -#define OBJ_EVENT_PAL_TAG_NONE 0x11FF - -#include "data/object_events/object_event_graphics_info_pointers.h" -#include "data/field_effects/field_effect_object_template_pointers.h" -#include "data/object_events/object_event_pic_tables.h" -#include "data/object_events/object_event_anims.h" -#include "data/object_events/base_oam.h" -#include "data/object_events/object_event_subsprites.h" -#include "data/object_events/object_event_graphics_info.h" - -static const struct SpritePalette sObjectEventSpritePalettes[] = { - {gObjectEventPal_Npc1, OBJ_EVENT_PAL_TAG_NPC_1}, - {gObjectEventPal_Npc2, OBJ_EVENT_PAL_TAG_NPC_2}, - {gObjectEventPal_Npc3, OBJ_EVENT_PAL_TAG_NPC_3}, - {gObjectEventPal_Npc4, OBJ_EVENT_PAL_TAG_NPC_4}, - {gObjectEventPal_Npc1Reflection, OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION}, - {gObjectEventPal_Npc2Reflection, OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION}, - {gObjectEventPal_Npc3Reflection, OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION}, - {gObjectEventPal_Npc4Reflection, OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION}, - {gObjectEventPal_Brendan, OBJ_EVENT_PAL_TAG_BRENDAN}, - {gObjectEventPal_BrendanReflection, OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION}, - {gObjectEventPal_BridgeReflection, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION}, - {gObjectEventPal_PlayerUnderwater, OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER}, - {gObjectEventPal_QuintyPlump, OBJ_EVENT_PAL_TAG_QUINTY_PLUMP}, - {gObjectEventPal_QuintyPlumpReflection, OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION}, - {gObjectEventPal_Truck, OBJ_EVENT_PAL_TAG_TRUCK}, - {gObjectEventPal_Vigoroth, OBJ_EVENT_PAL_TAG_VIGOROTH}, - {gObjectEventPal_EnemyZigzagoon, OBJ_EVENT_PAL_TAG_ZIGZAGOON}, - {gObjectEventPal_May, OBJ_EVENT_PAL_TAG_MAY}, - {gObjectEventPal_MayReflection, OBJ_EVENT_PAL_TAG_MAY_REFLECTION}, - {gObjectEventPal_MovingBox, OBJ_EVENT_PAL_TAG_MOVING_BOX}, - {gObjectEventPal_CableCar, OBJ_EVENT_PAL_TAG_CABLE_CAR}, - {gObjectEventPal_SSTidal, OBJ_EVENT_PAL_TAG_SSTIDAL}, - {gObjectEventPal_Kyogre, OBJ_EVENT_PAL_TAG_KYOGRE}, - {gObjectEventPal_KyogreReflection, OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION}, - {gObjectEventPal_Groudon, OBJ_EVENT_PAL_TAG_GROUDON}, - {gObjectEventPal_GroudonReflection, OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION}, - {gObjectEventPal_SubmarineShadow, OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW}, - {gObjectEventPal_Poochyena, OBJ_EVENT_PAL_TAG_POOCHYENA}, - {gObjectEventPal_RedLeaf, OBJ_EVENT_PAL_TAG_RED_LEAF}, - {gObjectEventPal_Deoxys, OBJ_EVENT_PAL_TAG_DEOXYS}, - {gObjectEventPal_BirthIslandStone, OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE}, - {gObjectEventPal_HoOh, OBJ_EVENT_PAL_TAG_HO_OH}, - {gObjectEventPal_Lugia, OBJ_EVENT_PAL_TAG_LUGIA}, - {gObjectEventPal_RubySapphireBrendan, OBJ_EVENT_PAL_TAG_RS_BRENDAN}, - {gObjectEventPal_RubySapphireMay, OBJ_EVENT_PAL_TAG_RS_MAY}, -#ifdef BUGFIX - {NULL, OBJ_EVENT_PAL_TAG_NONE}, -#else - {}, // BUG: FindObjectEventPaletteIndexByTag looks for OBJ_EVENT_PAL_TAG_NONE and not 0x0. - // If it's looking for a tag that isn't in this table, the game locks in an infinite loop. -#endif -}; - -static const u16 sReflectionPaletteTags_Brendan[] = { - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_May[] = { - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, - OBJ_EVENT_PAL_TAG_MAY_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_PlayerUnderwater[] = { - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, - OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, -}; - -static const struct PairedPalettes sPlayerReflectionPaletteSets[] = { - {OBJ_EVENT_PAL_TAG_BRENDAN, sReflectionPaletteTags_Brendan}, - {OBJ_EVENT_PAL_TAG_MAY, sReflectionPaletteTags_May}, - {OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, sReflectionPaletteTags_PlayerUnderwater}, - {OBJ_EVENT_PAL_TAG_NONE, NULL}, -}; - -static const u16 sReflectionPaletteTags_QuintyPlump[] = { - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, - OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_Truck[] = { - OBJ_EVENT_PAL_TAG_TRUCK, - OBJ_EVENT_PAL_TAG_TRUCK, - OBJ_EVENT_PAL_TAG_TRUCK, - OBJ_EVENT_PAL_TAG_TRUCK, -}; - -static const u16 sReflectionPaletteTags_VigorothMover[] = { - OBJ_EVENT_PAL_TAG_VIGOROTH, - OBJ_EVENT_PAL_TAG_VIGOROTH, - OBJ_EVENT_PAL_TAG_VIGOROTH, - OBJ_EVENT_PAL_TAG_VIGOROTH, -}; - -static const u16 sReflectionPaletteTags_MovingBox[] = { - OBJ_EVENT_PAL_TAG_MOVING_BOX, - OBJ_EVENT_PAL_TAG_MOVING_BOX, - OBJ_EVENT_PAL_TAG_MOVING_BOX, - OBJ_EVENT_PAL_TAG_MOVING_BOX, -}; - -static const u16 sReflectionPaletteTags_CableCar[] = { - OBJ_EVENT_PAL_TAG_CABLE_CAR, - OBJ_EVENT_PAL_TAG_CABLE_CAR, - OBJ_EVENT_PAL_TAG_CABLE_CAR, - OBJ_EVENT_PAL_TAG_CABLE_CAR, -}; - -static const u16 sReflectionPaletteTags_SSTidal[] = { - OBJ_EVENT_PAL_TAG_SSTIDAL, - OBJ_EVENT_PAL_TAG_SSTIDAL, - OBJ_EVENT_PAL_TAG_SSTIDAL, - OBJ_EVENT_PAL_TAG_SSTIDAL, -}; - -static const u16 sReflectionPaletteTags_SubmarineShadow[] = { - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, - OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, -}; - -static const u16 sReflectionPaletteTags_Kyogre[] = { - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, - OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_Groudon[] = { - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, - OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_Npc3[] = { // Only used by the Route 120 bridge Kecleon - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, -}; - -static const u16 sReflectionPaletteTags_RedLeaf[] = { - OBJ_EVENT_PAL_TAG_RED_LEAF, - OBJ_EVENT_PAL_TAG_RED_LEAF, - OBJ_EVENT_PAL_TAG_RED_LEAF, - OBJ_EVENT_PAL_TAG_RED_LEAF, -}; - -static const struct PairedPalettes sSpecialObjectReflectionPaletteSets[] = { - {OBJ_EVENT_PAL_TAG_BRENDAN, sReflectionPaletteTags_Brendan}, - {OBJ_EVENT_PAL_TAG_MAY, sReflectionPaletteTags_May}, - {OBJ_EVENT_PAL_TAG_QUINTY_PLUMP, sReflectionPaletteTags_QuintyPlump}, - {OBJ_EVENT_PAL_TAG_TRUCK, sReflectionPaletteTags_Truck}, - {OBJ_EVENT_PAL_TAG_VIGOROTH, sReflectionPaletteTags_VigorothMover}, - {OBJ_EVENT_PAL_TAG_MOVING_BOX, sReflectionPaletteTags_MovingBox}, - {OBJ_EVENT_PAL_TAG_CABLE_CAR, sReflectionPaletteTags_CableCar}, - {OBJ_EVENT_PAL_TAG_SSTIDAL, sReflectionPaletteTags_SSTidal}, - {OBJ_EVENT_PAL_TAG_KYOGRE, sReflectionPaletteTags_Kyogre}, - {OBJ_EVENT_PAL_TAG_GROUDON, sReflectionPaletteTags_Groudon}, - {OBJ_EVENT_PAL_TAG_NPC_3, sReflectionPaletteTags_Npc3}, - {OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, sReflectionPaletteTags_SubmarineShadow}, - {OBJ_EVENT_PAL_TAG_RED_LEAF, sReflectionPaletteTags_RedLeaf}, - {OBJ_EVENT_PAL_TAG_NONE, NULL}, -}; - -static const u16 sObjectPaletteTags0[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 sObjectPaletteTags1[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 sObjectPaletteTags2[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 sObjectPaletteTags3[] = { - [PALSLOT_PLAYER] = OBJ_EVENT_PAL_TAG_BRENDAN, - [PALSLOT_PLAYER_REFLECTION] = OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION, - [PALSLOT_NPC_1] = OBJ_EVENT_PAL_TAG_NPC_1, - [PALSLOT_NPC_2] = OBJ_EVENT_PAL_TAG_NPC_2, - [PALSLOT_NPC_3] = OBJ_EVENT_PAL_TAG_NPC_3, - [PALSLOT_NPC_4] = OBJ_EVENT_PAL_TAG_NPC_4, - [PALSLOT_NPC_1_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION, - [PALSLOT_NPC_2_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION, - [PALSLOT_NPC_3_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION, - [PALSLOT_NPC_4_REFLECTION] = OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION, -}; - -static const u16 *const sObjectPaletteTagSets[] = { - sObjectPaletteTags0, - sObjectPaletteTags1, - sObjectPaletteTags2, - sObjectPaletteTags3, -}; - -#include "data/object_events/berry_tree_graphics_tables.h" -#include "data/field_effects/field_effect_objects.h" - -static const s16 sMovementDelaysMedium[] = {32, 64, 96, 128}; -static const s16 sMovementDelaysLong[] = {32, 64, 128, 192}; // Unused -static const s16 sMovementDelaysShort[] = {32, 48, 64, 80}; - -#include "data/object_events/movement_type_func_tables.h" - -static const u8 sFaceDirectionAnimNums[] = { - [DIR_NONE] = ANIM_STD_FACE_SOUTH, - [DIR_SOUTH] = ANIM_STD_FACE_SOUTH, - [DIR_NORTH] = ANIM_STD_FACE_NORTH, - [DIR_WEST] = ANIM_STD_FACE_WEST, - [DIR_EAST] = ANIM_STD_FACE_EAST, - [DIR_SOUTHWEST] = ANIM_STD_FACE_WEST, - [DIR_SOUTHEAST] = ANIM_STD_FACE_EAST, - [DIR_NORTHWEST] = ANIM_STD_FACE_WEST, - [DIR_NORTHEAST] = ANIM_STD_FACE_EAST, -}; -static const u8 sMoveDirectionAnimNums[] = { - [DIR_NONE] = ANIM_STD_GO_SOUTH, - [DIR_SOUTH] = ANIM_STD_GO_SOUTH, - [DIR_NORTH] = ANIM_STD_GO_NORTH, - [DIR_WEST] = ANIM_STD_GO_WEST, - [DIR_EAST] = ANIM_STD_GO_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_WEST, - [DIR_SOUTHEAST] = ANIM_STD_GO_EAST, - [DIR_NORTHWEST] = ANIM_STD_GO_WEST, - [DIR_NORTHEAST] = ANIM_STD_GO_EAST, -}; -static const u8 sMoveDirectionFastAnimNums[] = { - [DIR_NONE] = ANIM_STD_GO_FAST_SOUTH, - [DIR_SOUTH] = ANIM_STD_GO_FAST_SOUTH, - [DIR_NORTH] = ANIM_STD_GO_FAST_NORTH, - [DIR_WEST] = ANIM_STD_GO_FAST_WEST, - [DIR_EAST] = ANIM_STD_GO_FAST_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_FAST_WEST, - [DIR_SOUTHEAST] = ANIM_STD_GO_FAST_EAST, - [DIR_NORTHWEST] = ANIM_STD_GO_FAST_WEST, - [DIR_NORTHEAST] = ANIM_STD_GO_FAST_EAST, -}; -static const u8 sMoveDirectionFasterAnimNums[] = { - [DIR_NONE] = ANIM_STD_GO_FASTER_SOUTH, - [DIR_SOUTH] = ANIM_STD_GO_FASTER_SOUTH, - [DIR_NORTH] = ANIM_STD_GO_FASTER_NORTH, - [DIR_WEST] = ANIM_STD_GO_FASTER_WEST, - [DIR_EAST] = ANIM_STD_GO_FASTER_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_FASTER_WEST, - [DIR_SOUTHEAST] = ANIM_STD_GO_FASTER_EAST, - [DIR_NORTHWEST] = ANIM_STD_GO_FASTER_WEST, - [DIR_NORTHEAST] = ANIM_STD_GO_FASTER_EAST, -}; -static const u8 sMoveDirectionFastestAnimNums[] = { - [DIR_NONE] = ANIM_STD_GO_FASTEST_SOUTH, - [DIR_SOUTH] = ANIM_STD_GO_FASTEST_SOUTH, - [DIR_NORTH] = ANIM_STD_GO_FASTEST_NORTH, - [DIR_WEST] = ANIM_STD_GO_FASTEST_WEST, - [DIR_EAST] = ANIM_STD_GO_FASTEST_EAST, - [DIR_SOUTHWEST] = ANIM_STD_GO_FASTEST_WEST, - [DIR_SOUTHEAST] = ANIM_STD_GO_FASTEST_EAST, - [DIR_NORTHWEST] = ANIM_STD_GO_FASTEST_WEST, - [DIR_NORTHEAST] = ANIM_STD_GO_FASTEST_EAST, -}; -static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon - [DIR_NONE] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_SOUTH] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_NORTH] = ANIM_GET_ON_OFF_POKEMON_NORTH, - [DIR_WEST] = ANIM_GET_ON_OFF_POKEMON_WEST, - [DIR_EAST] = ANIM_GET_ON_OFF_POKEMON_EAST, - [DIR_SOUTHWEST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_SOUTHEAST] = ANIM_GET_ON_OFF_POKEMON_SOUTH, - [DIR_NORTHWEST] = ANIM_GET_ON_OFF_POKEMON_NORTH, - [DIR_NORTHEAST] = ANIM_GET_ON_OFF_POKEMON_NORTH, -}; -static const u8 sAcroWheelieDirectionAnimNums[] = { - [DIR_NONE] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, - [DIR_SOUTH] = ANIM_BUNNY_HOP_BACK_WHEEL_SOUTH, - [DIR_NORTH] = ANIM_BUNNY_HOP_BACK_WHEEL_NORTH, - [DIR_WEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, - [DIR_EAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, - [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, - [DIR_NORTHWEST] = ANIM_BUNNY_HOP_BACK_WHEEL_WEST, - [DIR_NORTHEAST] = ANIM_BUNNY_HOP_BACK_WHEEL_EAST, -}; -static const u8 sAcroUnusedDirectionAnimNums[] = { - [DIR_NONE] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, - [DIR_SOUTH] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, - [DIR_NORTH] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, - [DIR_WEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_WEST, - [DIR_EAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, - [DIR_SOUTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_SOUTH, - [DIR_NORTHWEST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, - [DIR_NORTHEAST] = ANIM_BUNNY_HOP_FRONT_WHEEL_NORTH, -}; -static const u8 sAcroEndWheelieDirectionAnimNums[] = { - [DIR_NONE] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, - [DIR_SOUTH] = ANIM_STANDING_WHEELIE_BACK_WHEEL_SOUTH, - [DIR_NORTH] = ANIM_STANDING_WHEELIE_BACK_WHEEL_NORTH, - [DIR_WEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, - [DIR_EAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, - [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, - [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_WEST, - [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_BACK_WHEEL_EAST, -}; -static const u8 sAcroUnusedActionDirectionAnimNums[] = { - [DIR_NONE] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, - [DIR_SOUTH] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, - [DIR_NORTH] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, - [DIR_WEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_WEST, - [DIR_EAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_EAST, - [DIR_SOUTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, - [DIR_SOUTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_SOUTH, - [DIR_NORTHWEST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, - [DIR_NORTHEAST] = ANIM_STANDING_WHEELIE_FRONT_WHEEL_NORTH, -}; -static const u8 sAcroWheeliePedalDirectionAnimNums[] = { - [DIR_NONE] = ANIM_MOVING_WHEELIE_SOUTH, - [DIR_SOUTH] = ANIM_MOVING_WHEELIE_SOUTH, - [DIR_NORTH] = ANIM_MOVING_WHEELIE_NORTH, - [DIR_WEST] = ANIM_MOVING_WHEELIE_WEST, - [DIR_EAST] = ANIM_MOVING_WHEELIE_EAST, - [DIR_SOUTHWEST] = ANIM_MOVING_WHEELIE_WEST, - [DIR_SOUTHEAST] = ANIM_MOVING_WHEELIE_EAST, - [DIR_NORTHWEST] = ANIM_MOVING_WHEELIE_WEST, - [DIR_NORTHEAST] = ANIM_MOVING_WHEELIE_EAST, -}; -static const u8 sFishingDirectionAnimNums[] = { - [DIR_NONE] = ANIM_TAKE_OUT_ROD_SOUTH, - [DIR_SOUTH] = ANIM_TAKE_OUT_ROD_SOUTH, - [DIR_NORTH] = ANIM_TAKE_OUT_ROD_NORTH, - [DIR_WEST] = ANIM_TAKE_OUT_ROD_WEST, - [DIR_EAST] = ANIM_TAKE_OUT_ROD_EAST, - [DIR_SOUTHWEST] = ANIM_TAKE_OUT_ROD_SOUTH, - [DIR_SOUTHEAST] = ANIM_TAKE_OUT_ROD_SOUTH, - [DIR_NORTHWEST] = ANIM_TAKE_OUT_ROD_NORTH, - [DIR_NORTHEAST] = ANIM_TAKE_OUT_ROD_NORTH, -}; -static const u8 sFishingNoCatchDirectionAnimNums[] = { - [DIR_NONE] = ANIM_PUT_AWAY_ROD_SOUTH, - [DIR_SOUTH] = ANIM_PUT_AWAY_ROD_SOUTH, - [DIR_NORTH] = ANIM_PUT_AWAY_ROD_NORTH, - [DIR_WEST] = ANIM_PUT_AWAY_ROD_WEST, - [DIR_EAST] = ANIM_PUT_AWAY_ROD_EAST, - [DIR_SOUTHWEST] = ANIM_PUT_AWAY_ROD_SOUTH, - [DIR_SOUTHEAST] = ANIM_PUT_AWAY_ROD_SOUTH, - [DIR_NORTHWEST] = ANIM_PUT_AWAY_ROD_NORTH, - [DIR_NORTHEAST] = ANIM_PUT_AWAY_ROD_NORTH, -}; -static const u8 sFishingBiteDirectionAnimNums[] = { - [DIR_NONE] = ANIM_HOOKED_POKEMON_SOUTH, - [DIR_SOUTH] = ANIM_HOOKED_POKEMON_SOUTH, - [DIR_NORTH] = ANIM_HOOKED_POKEMON_NORTH, - [DIR_WEST] = ANIM_HOOKED_POKEMON_WEST, - [DIR_EAST] = ANIM_HOOKED_POKEMON_EAST, - [DIR_SOUTHWEST] = ANIM_HOOKED_POKEMON_SOUTH, - [DIR_SOUTHEAST] = ANIM_HOOKED_POKEMON_SOUTH, - [DIR_NORTHWEST] = ANIM_HOOKED_POKEMON_NORTH, - [DIR_NORTHEAST] = ANIM_HOOKED_POKEMON_NORTH, -}; -static const u8 sRunningDirectionAnimNums[] = { - [DIR_NONE] = ANIM_RUN_SOUTH, - [DIR_SOUTH] = ANIM_RUN_SOUTH, - [DIR_NORTH] = ANIM_RUN_NORTH, - [DIR_WEST] = ANIM_RUN_WEST, - [DIR_EAST] = ANIM_RUN_EAST, - [DIR_SOUTHWEST] = ANIM_RUN_WEST, - [DIR_SOUTHEAST] = ANIM_RUN_EAST, - [DIR_NORTHWEST] = ANIM_RUN_WEST, - [DIR_NORTHEAST] = ANIM_RUN_EAST, -}; - -const u8 gTrainerFacingDirectionMovementTypes[] = { - [DIR_NONE] = MOVEMENT_TYPE_FACE_DOWN, - [DIR_SOUTH] = MOVEMENT_TYPE_FACE_DOWN, - [DIR_NORTH] = MOVEMENT_TYPE_FACE_UP, - [DIR_WEST] = MOVEMENT_TYPE_FACE_LEFT, - [DIR_EAST] = MOVEMENT_TYPE_FACE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_TYPE_FACE_DOWN, - [DIR_SOUTHEAST] = MOVEMENT_TYPE_FACE_DOWN, - [DIR_NORTHWEST] = MOVEMENT_TYPE_FACE_UP, - [DIR_NORTHEAST] = MOVEMENT_TYPE_FACE_UP, -}; - -bool8 (*const gOppositeDirectionBlockedMetatileFuncs[])(u8) = { - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsWestBlocked, - MetatileBehavior_IsEastBlocked -}; - -bool8 (*const gDirectionBlockedMetatileFuncs[])(u8) = { - MetatileBehavior_IsNorthBlocked, - MetatileBehavior_IsSouthBlocked, - MetatileBehavior_IsEastBlocked, - MetatileBehavior_IsWestBlocked -}; - -static const struct Coords16 sDirectionToVectors[] = { - { 0, 0}, - { 0, 1}, - { 0, -1}, - {-1, 0}, - { 1, 0}, - {-1, 1}, - { 1, 1}, - {-1, -1}, - { 1, -1}, - {-2, 1}, - { 2, 1}, - {-2, -1}, - { 2, -1} -}; - -const u8 gFaceDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_FACE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_FACE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_FACE_UP, - [DIR_WEST] = MOVEMENT_ACTION_FACE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_FACE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_FACE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_FACE_RIGHT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_FACE_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_FACE_RIGHT -}; -const u8 gWalkSlowMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_SLOW_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_SLOW_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOW_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_SLOW_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_SLOW_RIGHT, -}; -const u8 gWalkNormalMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_NORMAL_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_NORMAL_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_NORMAL_RIGHT, -}; -const u8 gWalkFastMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_FAST_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FAST_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_FAST_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_FAST_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_FAST_RIGHT, -}; -const u8 gRideWaterCurrentMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP, - [DIR_WEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT, -}; -const u8 gWalkFasterMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_FASTER_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_FASTER_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_FASTER_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_FASTER_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_FASTER_RIGHT, -}; -const u8 gSlideMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_SLIDE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_SLIDE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_SLIDE_UP, - [DIR_WEST] = MOVEMENT_ACTION_SLIDE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_SLIDE_RIGHT, -}; -const u8 gPlayerRunMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP, - [DIR_WEST] = MOVEMENT_ACTION_PLAYER_RUN_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_PLAYER_RUN_RIGHT, -}; -const u8 gJump2MovementActions[] = { - MOVEMENT_ACTION_JUMP_2_DOWN, - MOVEMENT_ACTION_JUMP_2_DOWN, - MOVEMENT_ACTION_JUMP_2_UP, - MOVEMENT_ACTION_JUMP_2_LEFT, - MOVEMENT_ACTION_JUMP_2_RIGHT, -}; -const u8 gJumpInPlaceMovementActions[] = { - MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN, - MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN, - MOVEMENT_ACTION_JUMP_IN_PLACE_UP, - MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT, - MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT, -}; -const u8 gJumpInPlaceTurnAroundMovementActions[] = { - MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN, - MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN, - MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP, - MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT, - MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT, -}; -const u8 gJumpMovementActions[] = { - MOVEMENT_ACTION_JUMP_DOWN, - MOVEMENT_ACTION_JUMP_DOWN, - MOVEMENT_ACTION_JUMP_UP, - MOVEMENT_ACTION_JUMP_LEFT, - MOVEMENT_ACTION_JUMP_RIGHT, -}; -const u8 gJumpSpecialMovementActions[] = { - MOVEMENT_ACTION_JUMP_SPECIAL_DOWN, - MOVEMENT_ACTION_JUMP_SPECIAL_DOWN, - MOVEMENT_ACTION_JUMP_SPECIAL_UP, - MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, - MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, -}; -const u8 gWalkInPlaceSlowMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT -}; -const u8 gWalkInPlaceNormalMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT -}; -const u8 gWalkInPlaceFastMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT -}; -const u8 gWalkInPlaceFasterMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTER_RIGHT -}; -const u8 gAcroWheelieFaceDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT -}; -const u8 gAcroPopWheelieFaceDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, -}; -const u8 gAcroEndWheelieFaceDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, -}; -const u8 gAcroWheelieHopFaceDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, -}; -const u8 gAcroWheelieHopDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, -}; -const u8 gAcroWheelieJumpDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, -}; -const u8 gAcroWheelieInPlaceDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, -}; -const u8 gAcroPopWheelieMoveDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, -}; -const u8 gAcroWheelieMoveDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, -}; -const u8 gAcroEndWheelieMoveDirectionMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP, - [DIR_WEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, -}; -// run slow -const u8 gRunSlowMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_RUN_DOWN_SLOW, - [DIR_SOUTH] = MOVEMENT_ACTION_RUN_DOWN_SLOW, - [DIR_NORTH] = MOVEMENT_ACTION_RUN_UP_SLOW, - [DIR_WEST] = MOVEMENT_ACTION_RUN_LEFT_SLOW, - [DIR_EAST] = MOVEMENT_ACTION_RUN_RIGHT_SLOW, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_RUN_LEFT_SLOW, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_RUN_RIGHT_SLOW, - [DIR_NORTHWEST] = MOVEMENT_ACTION_RUN_LEFT_SLOW, - [DIR_NORTHEAST] = MOVEMENT_ACTION_RUN_RIGHT_SLOW, -}; - -static const u8 sOppositeDirections[] = { - DIR_NORTH, - DIR_SOUTH, - DIR_EAST, - DIR_WEST, - DIR_NORTHEAST, - DIR_NORTHWEST, - DIR_SOUTHEAST, - DIR_SOUTHWEST, -}; - -// Takes the player's original and current facing direction to get the direction that should be considered to copy. -// Note that this means an NPC who copies the player's movement changes how they copy them based on how -// the player entered the area. For instance an NPC who does the same movements as the player when they -// entered the area facing South will do the opposite movements as the player if they enter facing North. -static const u8 sPlayerDirectionsForCopy[][4] = { - [DIR_SOUTH - 1] = { - [DIR_SOUTH - 1] = DIR_NORTH, - [DIR_NORTH - 1] = DIR_SOUTH, - [DIR_WEST - 1] = DIR_EAST, - [DIR_EAST - 1] = DIR_WEST - }, - [DIR_NORTH - 1] = { - [DIR_SOUTH - 1] = DIR_SOUTH, - [DIR_NORTH - 1] = DIR_NORTH, - [DIR_WEST - 1] = DIR_WEST, - [DIR_EAST - 1] = DIR_EAST - }, - [DIR_WEST - 1] = { - [DIR_SOUTH - 1] = DIR_WEST, - [DIR_NORTH - 1] = DIR_EAST, - [DIR_WEST - 1] = DIR_NORTH, - [DIR_EAST - 1] = DIR_SOUTH - }, - [DIR_EAST - 1] = { - [DIR_SOUTH - 1] = DIR_EAST, - [DIR_NORTH - 1] = DIR_WEST, - [DIR_WEST - 1] = DIR_SOUTH, - [DIR_EAST - 1] = DIR_NORTH - } -}; - -// Indexed first with the NPC's initial facing direction based on movement type, and secondly with the player direction to copy. -// Returns the direction the copy NPC should travel in. -static const u8 sPlayerDirectionToCopyDirection[][4] = { - [DIR_SOUTH - 1] = { // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE(_IN_GRASS) - [DIR_SOUTH - 1] = DIR_NORTH, - [DIR_NORTH - 1] = DIR_SOUTH, - [DIR_WEST - 1] = DIR_EAST, - [DIR_EAST - 1] = DIR_WEST - }, - [DIR_NORTH - 1] = { // MOVEMENT_TYPE_COPY_PLAYER(_IN_GRASS) - [DIR_SOUTH - 1] = DIR_SOUTH, - [DIR_NORTH - 1] = DIR_NORTH, - [DIR_WEST - 1] = DIR_WEST, - [DIR_EAST - 1] = DIR_EAST - }, - [DIR_WEST - 1] = { // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE(_IN_GRASS) - [DIR_SOUTH - 1] = DIR_EAST, - [DIR_NORTH - 1] = DIR_WEST, - [DIR_WEST - 1] = DIR_SOUTH, - [DIR_EAST - 1] = DIR_NORTH - }, - [DIR_EAST - 1] = { // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE(_IN_GRASS) - [DIR_SOUTH - 1] = DIR_WEST, - [DIR_NORTH - 1] = DIR_EAST, - [DIR_WEST - 1] = DIR_NORTH, - [DIR_EAST - 1] = DIR_SOUTH - } -}; - -#include "data/object_events/movement_action_func_tables.h" - -static void ClearObjectEvent(struct ObjectEvent *objectEvent) -{ - *objectEvent = (struct ObjectEvent){}; - objectEvent->localId = OBJ_EVENT_ID_PLAYER; - objectEvent->mapNum = MAP_NUM(UNDEFINED); - objectEvent->mapGroup = MAP_GROUP(UNDEFINED); - objectEvent->movementActionId = MOVEMENT_ACTION_NONE; -} - -static void ClearAllObjectEvents(void) -{ - u8 i; - - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - ClearObjectEvent(&gObjectEvents[i]); -} - -void ResetObjectEvents(void) -{ - ClearLinkPlayerObjectEvents(); - ClearAllObjectEvents(); - ClearPlayerAvatarInfo(); - CreateReflectionEffectSprites(); -} - -static void CreateReflectionEffectSprites(void) -{ - u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31); - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 0); - gSprites[spriteId].invisible = TRUE; - - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_REFLECTION_DISTORTION], 0, 0, 31); - gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - InitSpriteAffineAnim(&gSprites[spriteId]); - StartSpriteAffineAnim(&gSprites[spriteId], 1); - gSprites[spriteId].invisible = TRUE; -} - -u8 GetFirstInactiveObjectEventId(void) -{ - u8 i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (!gObjectEvents[i].active) - break; - } - - return i; -} - -u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) -{ - if (localId < OBJ_EVENT_ID_PLAYER) - return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); - - return GetObjectEventIdByLocalId(localId); -} - -bool8 TryGetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u8 *objectEventId) -{ - *objectEventId = GetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroupId); - if (*objectEventId == OBJECT_EVENTS_COUNT) - return TRUE; - else - return FALSE; -} - -u8 GetObjectEventIdByXY(s16 x, s16 y) -{ - u8 i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (gObjectEvents[i].active && gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y) - break; - } - - return i; -} - -static u8 GetObjectEventIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroupId) -{ - u8 i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (gObjectEvents[i].active && gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroupId) - return i; - } - - return OBJECT_EVENTS_COUNT; -} - -u8 GetObjectEventIdByLocalId(u8 localId) -{ - u8 i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (gObjectEvents[i].active && gObjectEvents[i].localId == localId) - return i; - } - - return OBJECT_EVENTS_COUNT; -} - -static u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup) -{ - struct ObjectEvent *objectEvent; - u8 objectEventId; - s16 x; - s16 y; - - if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId)) - return OBJECT_EVENTS_COUNT; - objectEvent = &gObjectEvents[objectEventId]; - ClearObjectEvent(objectEvent); - x = template->x + MAP_OFFSET; - y = template->y + MAP_OFFSET; - objectEvent->active = TRUE; - objectEvent->triggerGroundEffectsOnMove = TRUE; - objectEvent->graphicsId = template->graphicsId; - objectEvent->movementType = template->movementType; - objectEvent->localId = template->localId; - objectEvent->mapNum = mapNum; - objectEvent->mapGroup = mapGroup; - objectEvent->initialCoords.x = x; - objectEvent->initialCoords.y = y; - objectEvent->currentCoords.x = x; - objectEvent->currentCoords.y = y; - objectEvent->previousCoords.x = x; - objectEvent->previousCoords.y = y; - objectEvent->currentElevation = template->elevation; - objectEvent->previousElevation = template->elevation; - objectEvent->rangeX = template->movementRangeX; - objectEvent->rangeY = template->movementRangeY; - objectEvent->trainerType = template->trainerType; - objectEvent->mapNum = mapNum; - objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId; - objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType]; - SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection); - SetObjectEventDynamicGraphicsId(objectEvent); - if (sMovementTypeHasRange[objectEvent->movementType]) - { - if (objectEvent->rangeX == 0) - objectEvent->rangeX++; - if (objectEvent->rangeY == 0) - objectEvent->rangeY++; - } - return objectEventId; -} - -u8 Unref_TryInitLocalObjectEvent(u8 localId) -{ - u8 i; - u8 objectEventCount; - struct ObjectEventTemplate *template; - - if (gMapHeader.events != NULL) - { - if (InBattlePyramid()) - objectEventCount = GetNumBattlePyramidObjectEvents(); - else if (InTrainerHill()) - objectEventCount = 2; - else - objectEventCount = gMapHeader.events->objectEventCount; - - for (i = 0; i < objectEventCount; i++) - { - template = &gSaveBlock1Ptr->objectEventTemplates[i]; - if (template->localId == localId && !FlagGet(template->flagId)) - return InitObjectEventStateFromTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); - } - } - return OBJECT_EVENTS_COUNT; -} - -static bool8 GetAvailableObjectEventId(u16 localId, u8 mapNum, u8 mapGroup, u8 *objectEventId) -// Looks for an empty slot. -// Returns FALSE and the location of the available slot -// in *objectEventId. -// If no slots are available, or if the object is already -// loaded, returns TRUE. -{ - u8 i = 0; - - for (i = 0; i < OBJECT_EVENTS_COUNT && gObjectEvents[i].active; i++) - { - if (gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroup) - return TRUE; - } - if (i >= OBJECT_EVENTS_COUNT) - return TRUE; - *objectEventId = i; - for (; i < OBJECT_EVENTS_COUNT; i++) - { - if (gObjectEvents[i].active && gObjectEvents[i].localId == localId && gObjectEvents[i].mapNum == mapNum && gObjectEvents[i].mapGroup == mapGroup) - return TRUE; - } - return FALSE; -} - -static void RemoveObjectEvent(struct ObjectEvent *objectEvent) -{ - objectEvent->active = FALSE; - RemoveObjectEventInternal(objectEvent); -} - -void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 objectEventId; - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - { - FlagSet(GetObjectEventFlagIdByObjectEventId(objectEventId)); - RemoveObjectEvent(&gObjectEvents[objectEventId]); - } -} - -static void RemoveObjectEventInternal(struct ObjectEvent *objectEvent) -{ - struct SpriteFrameImage image; - image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size; - gSprites[objectEvent->spriteId].images = ℑ - DestroySprite(&gSprites[objectEvent->spriteId]); -} - -void RemoveAllObjectEventsExceptPlayer(void) -{ - u8 i; - - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (i != gPlayerAvatar.objectEventId) - RemoveObjectEvent(&gObjectEvents[i]); - } -} - -static u8 TrySetupObjectEventSprite(const struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) -{ - u8 spriteId; - u8 paletteSlot; - u8 objectEventId; - struct Sprite *sprite; - struct ObjectEvent *objectEvent; - const struct ObjectEventGraphicsInfo *graphicsInfo; - - objectEventId = InitObjectEventStateFromTemplate(objectEventTemplate, mapNum, mapGroup); - if (objectEventId == OBJECT_EVENTS_COUNT) - return OBJECT_EVENTS_COUNT; - - objectEvent = &gObjectEvents[objectEventId]; - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == PALSLOT_PLAYER) - { - LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, paletteSlot); - } - else if (paletteSlot == PALSLOT_NPC_SPECIAL) - { - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); - } - - if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE) - objectEvent->invisible = TRUE; - - *(u16 *)&spriteTemplate->paletteTag = TAG_NONE; - spriteId = CreateSprite(spriteTemplate, 0, 0, 0); - if (spriteId == MAX_SPRITES) - { - gObjectEvents[objectEventId].active = FALSE; - return OBJECT_EVENTS_COUNT; - } - - sprite = &gSprites[spriteId]; - GetMapCoordsFromSpritePos(objectEvent->currentCoords.x + cameraX, objectEvent->currentCoords.y + cameraY, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - sprite->oam.paletteNum = paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->sObjEventId = objectEventId; - objectEvent->spriteId = spriteId; - objectEvent->inanimate = graphicsInfo->inanimate; - if (!objectEvent->inanimate) - StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); - - SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1); - UpdateObjectEventVisibility(objectEvent, sprite); - return objectEventId; -} - -static u8 TrySpawnObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) -{ - u8 objectEventId; - struct SpriteTemplate spriteTemplate; - struct SpriteFrameImage spriteFrameImage; - const struct ObjectEventGraphicsInfo *graphicsInfo; - const struct SubspriteTable *subspriteTables = NULL; - - graphicsInfo = GetObjectEventGraphicsInfo(objectEventTemplate->graphicsId); - MakeSpriteTemplateFromObjectEventTemplate(objectEventTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = graphicsInfo->size; - spriteTemplate.images = &spriteFrameImage; - objectEventId = TrySetupObjectEventSprite(objectEventTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); - if (objectEventId == OBJECT_EVENTS_COUNT) - return OBJECT_EVENTS_COUNT; - - gSprites[gObjectEvents[objectEventId].spriteId].images = graphicsInfo->images; - if (subspriteTables) - SetSubspriteTables(&gSprites[gObjectEvents[objectEventId].spriteId], subspriteTables); - - return objectEventId; -} - -u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate) -{ - s16 cameraX; - s16 cameraY; - - GetObjectEventMovingCameraOffset(&cameraX, &cameraY); - return TrySpawnObjectEventTemplate(objectEventTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); -} - -u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation) -{ - struct ObjectEventTemplate objectEventTemplate; - - x -= MAP_OFFSET; - y -= MAP_OFFSET; - objectEventTemplate.localId = localId; - objectEventTemplate.graphicsId = graphicsId; - objectEventTemplate.kind = OBJ_KIND_NORMAL; - objectEventTemplate.x = x; - objectEventTemplate.y = y; - objectEventTemplate.elevation = elevation; - objectEventTemplate.movementType = movementBehavior; - objectEventTemplate.movementRangeX = 0; - objectEventTemplate.movementRangeY = 0; - objectEventTemplate.trainerType = TRAINER_TYPE_NONE; - objectEventTemplate.trainerRange_berryTreeId = 0; - return SpawnSpecialObjectEvent(&objectEventTemplate); -} - -u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup) -{ - const struct ObjectEventTemplate *objectEventTemplate; - s16 cameraX, cameraY; - - objectEventTemplate = GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - if (!objectEventTemplate) - return OBJECT_EVENTS_COUNT; - - GetObjectEventMovingCameraOffset(&cameraX, &cameraY); - return TrySpawnObjectEventTemplate(objectEventTemplate, mapNum, mapGroup, cameraX, cameraY); -} - -static void CopyObjectGraphicsInfoToSpriteTemplate(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) -{ - const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - - spriteTemplate->tileTag = graphicsInfo->tileTag; - spriteTemplate->paletteTag = graphicsInfo->paletteTag; - spriteTemplate->oam = graphicsInfo->oam; - spriteTemplate->anims = graphicsInfo->anims; - spriteTemplate->images = graphicsInfo->images; - spriteTemplate->affineAnims = graphicsInfo->affineAnims; - spriteTemplate->callback = callback; - *subspriteTables = graphicsInfo->subspriteTables; -} - -static void CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(u16 graphicsId, u16 movementType, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) -{ - CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, sMovementTypeCallbacks[movementType], spriteTemplate, subspriteTables); -} - -static void MakeSpriteTemplateFromObjectEventTemplate(const struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) -{ - CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEventTemplate->graphicsId, objectEventTemplate->movementType, spriteTemplate, subspriteTables); -} - -// Used to create a sprite using a graphicsId associated with object events. -u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - struct SpriteTemplate *spriteTemplate; - const struct SubspriteTable *subspriteTables; - struct Sprite *sprite; - u8 spriteId; - - spriteTemplate = Alloc(sizeof(struct SpriteTemplate)); - CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, callback, spriteTemplate, &subspriteTables); - if (spriteTemplate->paletteTag != TAG_NONE) - LoadObjectEventPalette(spriteTemplate->paletteTag); - - spriteId = CreateSprite(spriteTemplate, x, y, subpriority); - Free(spriteTemplate); - - if (spriteId != MAX_SPRITES && subspriteTables != NULL) - { - sprite = &gSprites[spriteId]; - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; - } - return spriteId; -} - -#define sVirtualObjId data[0] -#define sVirtualObjElev data[1] - -// "Virtual Objects" are a class of sprites used instead of a full object event. -// Used when more objects are needed than the object event limit (for Contest / Battle Dome audiences and group members in Union Room). -// A unique id is given as an argument and stored in the sprite data to allow referring back to the same virtual object. -// They can be turned (and, in the case of the Union Room, animated teleporting in and out) but do not have movement types -// or any of the other data normally associated with object events. -u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction) -{ - u8 spriteId; - struct Sprite *sprite; - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - const struct ObjectEventGraphicsInfo *graphicsInfo; - - graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - CopyObjectGraphicsInfoToSpriteTemplate(graphicsId, SpriteCB_VirtualObject, &spriteTemplate, &subspriteTables); - *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; - x += MAP_OFFSET; - y += MAP_OFFSET; - SetSpritePosToOffsetMapCoords(&x, &y, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = graphicsInfo->paletteSlot; - if (sprite->oam.paletteNum >= 16) - sprite->oam.paletteNum -= 16; - - sprite->coordOffsetEnabled = TRUE; - sprite->sVirtualObjId = virtualObjId; - sprite->sVirtualObjElev = elevation; - if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - else if (graphicsInfo->paletteSlot >= 16) - _PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot | 0xf0); - - if (subspriteTables != NULL) - { - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; - } - InitObjectPriorityByElevation(sprite, elevation); - SetObjectSubpriorityByElevation(elevation, sprite, 1); - StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction)); - } - return spriteId; -} - -void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) -{ - u8 i; - u8 objectCount; - - if (gMapHeader.events != NULL) - { - s16 left = gSaveBlock1Ptr->pos.x - 2; - s16 right = gSaveBlock1Ptr->pos.x + MAP_OFFSET_W + 2; - s16 top = gSaveBlock1Ptr->pos.y; - s16 bottom = gSaveBlock1Ptr->pos.y + MAP_OFFSET_H + 2; - - if (InBattlePyramid()) - objectCount = GetNumBattlePyramidObjectEvents(); - else if (InTrainerHill()) - objectCount = 2; - else - objectCount = gMapHeader.events->objectEventCount; - - for (i = 0; i < objectCount; i++) - { - struct ObjectEventTemplate *template = &gSaveBlock1Ptr->objectEventTemplates[i]; - s16 npcX = template->x + MAP_OFFSET; - s16 npcY = template->y + MAP_OFFSET; - - if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX - && !FlagGet(template->flagId)) - TrySpawnObjectEventTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); - } - } -} - -void RemoveObjectEventsOutsideView(void) -{ - u8 i, j; - bool8 isActiveLinkPlayer; - - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - for (j = 0, isActiveLinkPlayer = FALSE; j < ARRAY_COUNT(gLinkPlayerObjectEvents); j++) - { - if (gLinkPlayerObjectEvents[j].active && i == gLinkPlayerObjectEvents[j].objEventId) - isActiveLinkPlayer = TRUE; - } - if (!isActiveLinkPlayer) - { - struct ObjectEvent *objectEvent = &gObjectEvents[i]; - - if (objectEvent->active && !objectEvent->isPlayer) - RemoveObjectEventIfOutsideView(objectEvent); - } - } -} - -static void RemoveObjectEventIfOutsideView(struct ObjectEvent *objectEvent) -{ - s16 left = gSaveBlock1Ptr->pos.x - 2; - s16 right = gSaveBlock1Ptr->pos.x + 17; - s16 top = gSaveBlock1Ptr->pos.y; - s16 bottom = gSaveBlock1Ptr->pos.y + 16; - - if (objectEvent->currentCoords.x >= left && objectEvent->currentCoords.x <= right - && objectEvent->currentCoords.y >= top && objectEvent->currentCoords.y <= bottom) - return; - if (objectEvent->initialCoords.x >= left && objectEvent->initialCoords.x <= right - && objectEvent->initialCoords.y >= top && objectEvent->initialCoords.y <= bottom) - return; - RemoveObjectEvent(objectEvent); -} - -void SpawnObjectEventsOnReturnToField(s16 x, s16 y) -{ - u8 i; - - ClearPlayerAvatarInfo(); - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (gObjectEvents[i].active) - SpawnObjectEventOnReturnToField(i, x, y); - } - CreateReflectionEffectSprites(); -} - -static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) -{ - u8 i; - u8 paletteSlot; - struct Sprite *sprite; - struct ObjectEvent *objectEvent; - struct SpriteTemplate spriteTemplate; - struct SpriteFrameImage spriteFrameImage; - const struct SubspriteTable *subspriteTables; - const struct ObjectEventGraphicsInfo *graphicsInfo; - - for (i = 0; i < ARRAY_COUNT(gLinkPlayerObjectEvents); i++) - { - if (gLinkPlayerObjectEvents[i].active && objectEventId == gLinkPlayerObjectEvents[i].objEventId) - return; - } - - objectEvent = &gObjectEvents[objectEventId]; - subspriteTables = NULL; - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - spriteFrameImage.size = graphicsInfo->size; - CopyObjectGraphicsInfoToSpriteTemplate_WithMovementType(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); - spriteTemplate.images = &spriteFrameImage; - - *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == PALSLOT_PLAYER) - { - LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot == PALSLOT_NPC_SPECIAL) - { - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); - } - *(u16 *)&spriteTemplate.paletteTag = TAG_NONE; - - i = CreateSprite(&spriteTemplate, 0, 0, 0); - if (i != MAX_SPRITES) - { - sprite = &gSprites[i]; - GetMapCoordsFromSpritePos(x + objectEvent->currentCoords.x, y + objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - sprite->images = graphicsInfo->images; - if (objectEvent->movementType == MOVEMENT_TYPE_PLAYER) - { - SetPlayerAvatarObjectEventIdAndObjectId(objectEventId, i); - objectEvent->warpArrowSpriteId = CreateWarpArrowSprite(); - } - if (subspriteTables != NULL) - SetSubspriteTables(sprite, subspriteTables); - - sprite->oam.paletteNum = paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->sObjEventId = objectEventId; - objectEvent->spriteId = i; - if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) - StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); - - ResetObjectEventFldEffData(objectEvent); - SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1); - } -} - -static void ResetObjectEventFldEffData(struct ObjectEvent *objectEvent) -{ - objectEvent->singleMovementActive = FALSE; - objectEvent->triggerGroundEffectsOnMove = TRUE; - objectEvent->hasShadow = FALSE; - objectEvent->hasReflection = FALSE; - objectEvent->inShortGrass = FALSE; - objectEvent->inShallowFlowingWater = FALSE; - objectEvent->inSandPile = FALSE; - objectEvent->inHotSprings = FALSE; - ObjectEventClearHeldMovement(objectEvent); -} - -static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteId) -{ - gPlayerAvatar.objectEventId = objectEventId; - gPlayerAvatar.spriteId = spriteId; - gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gObjectEvents[objectEventId].graphicsId); - SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE); -} - -void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) -{ - const struct ObjectEventGraphicsInfo *graphicsInfo; - struct Sprite *sprite; - u8 paletteSlot; - - graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - sprite = &gSprites[objectEvent->spriteId]; - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == PALSLOT_PLAYER) - { - PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot == PALSLOT_NPC_SPECIAL) - { - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); - } - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = graphicsInfo->images; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - sprite->oam.paletteNum = paletteSlot; - objectEvent->inanimate = graphicsInfo->inanimate; - objectEvent->graphicsId = graphicsId; - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - if (objectEvent->trackedByCamera) - CameraObjectReset1(); -} - -void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) -{ - u8 objectEventId; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - ObjectEventSetGraphicsId(&gObjectEvents[objectEventId], graphicsId); -} - -void ObjectEventTurn(struct ObjectEvent *objectEvent, u8 direction) -{ - SetObjectEventDirection(objectEvent, direction); - if (!objectEvent->inanimate) - { - StartSpriteAnim(&gSprites[objectEvent->spriteId], GetFaceDirectionAnimNum(objectEvent->facingDirection)); - SeekSpriteAnim(&gSprites[objectEvent->spriteId], 0); - } -} - -void ObjectEventTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) -{ - u8 objectEventId; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - ObjectEventTurn(&gObjectEvents[objectEventId], direction); -} - -void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) -{ - ObjectEventTurn(&gObjectEvents[playerAvatar->objectEventId], direction); -} - -static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 berryStage; - u8 berryId; - - objectEvent->invisible = TRUE; - sprite->invisible = TRUE; - berryStage = GetStageByBerryTreeId(objectEvent->trainerRange_berryTreeId); - if (berryStage != BERRY_STAGE_NO_BERRY) - { - objectEvent->invisible = FALSE; - sprite->invisible = FALSE; - berryId = GetBerryTypeByBerryTreeId(objectEvent->trainerRange_berryTreeId) - 1; - berryStage--; - if (berryId > ITEM_TO_BERRY(LAST_BERRY_INDEX)) - berryId = 0; - - ObjectEventSetGraphicsId(objectEvent, gBerryTreeObjectEventGraphicsIdTablePointers[berryId][berryStage]); - sprite->images = gBerryTreePicTablePointers[berryId]; - sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[berryId][berryStage]; - StartSpriteAnim(sprite, berryStage); - } -} - -const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId) -{ - u8 bard; - - if (graphicsId >= OBJ_EVENT_GFX_VARS) - graphicsId = VarGetObjectEventGraphicsId(graphicsId - OBJ_EVENT_GFX_VARS); - - if (graphicsId == OBJ_EVENT_GFX_BARD) - { - bard = GetCurrentMauvilleOldMan(); - return gMauvilleOldManGraphicsInfoPointers[bard]; - } - - if (graphicsId >= NUM_OBJ_EVENT_GFX) - graphicsId = OBJ_EVENT_GFX_NINJA_BOY; - - return gObjectEventGraphicsInfoPointers[graphicsId]; -} - -static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *objectEvent) -{ - if (objectEvent->graphicsId >= OBJ_EVENT_GFX_VARS) - objectEvent->graphicsId = VarGetObjectEventGraphicsId(objectEvent->graphicsId - OBJ_EVENT_GFX_VARS); -} - -void SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, bool8 invisible) -{ - u8 objectEventId; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - gObjectEvents[objectEventId].invisible = invisible; -} - -void ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, void *mapNum, void *mapGroup) -{ - *(u8 *)(localId) = objectEvent->localId; - *(u8 *)(mapNum) = objectEvent->mapNum; - *(u8 *)(mapGroup) = objectEvent->mapGroup; -} - -void AllowObjectAtPosTriggerGroundEffects(s16 x, s16 y) -{ - u8 objectEventId; - struct ObjectEvent *objectEvent; - - objectEventId = GetObjectEventIdByXY(x, y); - if (objectEventId != OBJECT_EVENTS_COUNT) - { - objectEvent = &gObjectEvents[objectEventId]; - objectEvent->triggerGroundEffectsOnMove = TRUE; - } -} - -void SetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) -{ - u8 objectEventId; - struct ObjectEvent *objectEvent; - struct Sprite *sprite; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - { - objectEvent = &gObjectEvents[objectEventId]; - sprite = &gSprites[objectEvent->spriteId]; - objectEvent->fixedPriority = TRUE; - sprite->subpriority = subpriority; - } -} - -void ResetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 objectEventId; - struct ObjectEvent *objectEvent; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - { - objectEvent = &gObjectEvents[objectEventId]; - objectEvent->fixedPriority = FALSE; - objectEvent->triggerGroundEffectsOnMove = TRUE; - } -} - -void SetObjectEventSpritePosByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 objectEventId; - struct Sprite *sprite; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - { - sprite = &gSprites[gObjectEvents[objectEventId].spriteId]; - sprite->x2 = x; - sprite->y2 = y; - } -} - -void FreeAndReserveObjectSpritePalettes(void) -{ - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = OBJ_PALSLOT_COUNT; -} - -static void LoadObjectEventPalette(u16 paletteTag) -{ - u16 i = FindObjectEventPaletteIndexByTag(paletteTag); - -// FindObjectEventPaletteIndexByTag returns 0xFF on failure, not OBJ_EVENT_PAL_TAG_NONE. -#ifdef BUGFIX - if (i != 0xFF) -#else - if (i != OBJ_EVENT_PAL_TAG_NONE) -#endif - LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); -} - -// Unused -static void LoadObjectEventPaletteSet(u16 *paletteTags) -{ - u8 i; - - for (i = 0; paletteTags[i] != OBJ_EVENT_PAL_TAG_NONE; i++) - LoadObjectEventPalette(paletteTags[i]); -} - -static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette) -{ - if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF) - return 0xFF; - - return LoadSpritePalette(spritePalette); -} - -void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) -{ - // paletteTag is assumed to exist in sObjectEventSpritePalettes - u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); - - LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, OBJ_PLTT_ID(paletteSlot), PLTT_SIZE_4BPP); -} - -void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot) -{ - while (minSlot < maxSlot) - { - PatchObjectPalette(*paletteTags, minSlot); - paletteTags++; - minSlot++; - } -} - -static u8 FindObjectEventPaletteIndexByTag(u16 tag) -{ - u8 i; - - for (i = 0; sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) - { - if (sObjectEventSpritePalettes[i].tag == tag) - return i; - } - return 0xFF; -} - -void LoadPlayerObjectReflectionPalette(u16 tag, u8 slot) -{ - u8 i; - - PatchObjectPalette(tag, slot); - for (i = 0; sPlayerReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) - { - if (sPlayerReflectionPaletteSets[i].tag == tag) - { - PatchObjectPalette(sPlayerReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]); - return; - } - } -} - -void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot) -{ - u8 i; - - sCurrentSpecialObjectPaletteTag = tag; - PatchObjectPalette(tag, slot); - for (i = 0; sSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) - { - if (sSpecialObjectReflectionPaletteSets[i].tag == tag) - { - PatchObjectPalette(sSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType], gReflectionEffectPaletteMap[slot]); - return; - } - } -} - -static void _PatchObjectPalette(u16 tag, u8 slot) -{ - PatchObjectPalette(tag, slot); -} - -// Unused -static void IncrementObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) -{ - objectEvent->previousCoords.x = objectEvent->currentCoords.x; - objectEvent->previousCoords.y = objectEvent->currentCoords.y; - objectEvent->currentCoords.x += x; - objectEvent->currentCoords.y += y; -} - -void ShiftObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) -{ - objectEvent->previousCoords.x = objectEvent->currentCoords.x; - objectEvent->previousCoords.y = objectEvent->currentCoords.y; - objectEvent->currentCoords.x = x; - objectEvent->currentCoords.y = y; -} - -static void SetObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) -{ - objectEvent->previousCoords.x = x; - objectEvent->previousCoords.y = y; - objectEvent->currentCoords.x = x; - objectEvent->currentCoords.y = y; -} - -void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) -{ - struct Sprite *sprite; - const struct ObjectEventGraphicsInfo *graphicsInfo; - - sprite = &gSprites[objectEvent->spriteId]; - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - SetObjectEventCoords(objectEvent, x, y); - SetSpritePosToMapCoords(objectEvent->currentCoords.x, objectEvent->currentCoords.y, &sprite->x, &sprite->y); - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->x += 8; - sprite->y += 16 + sprite->centerToCornerVecY; - ResetObjectEventFldEffData(objectEvent); - if (objectEvent->trackedByCamera) - CameraObjectReset1(); -} - -void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 objectEventId; - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - { - x += MAP_OFFSET; - y += MAP_OFFSET; - MoveObjectEventToMapCoords(&gObjectEvents[objectEventId], x, y); - } -} - -void ShiftStillObjectEventCoords(struct ObjectEvent *objectEvent) -{ - ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x, objectEvent->currentCoords.y); -} - -void UpdateObjectEventCoordsForCameraUpdate(void) -{ - u8 i; - s16 dx; - s16 dy; - - if (gCamera.active) - { - dx = gCamera.x; - dy = gCamera.y; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (gObjectEvents[i].active) - { - gObjectEvents[i].initialCoords.x -= dx; - gObjectEvents[i].initialCoords.y -= dy; - gObjectEvents[i].currentCoords.x -= dx; - gObjectEvents[i].currentCoords.y -= dy; - gObjectEvents[i].previousCoords.x -= dx; - gObjectEvents[i].previousCoords.y -= dy; - } - } - } -} - -u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation) -{ - u8 i; - - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (gObjectEvents[i].active) - { - if (gObjectEvents[i].currentCoords.x == x - && gObjectEvents[i].currentCoords.y == y - && ObjectEventDoesElevationMatch(&gObjectEvents[i], elevation)) - return i; - } - } - return OBJECT_EVENTS_COUNT; -} - -static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *objectEvent, u8 elevation) -{ - if (objectEvent->currentElevation != 0 && elevation != 0 && objectEvent->currentElevation != elevation) - return FALSE; - - return TRUE; -} - -void UpdateObjectEventsForCameraUpdate(s16 x, s16 y) -{ - UpdateObjectEventCoordsForCameraUpdate(); - TrySpawnObjectEvents(x, y); - RemoveObjectEventsOutsideView(); -} - -#define sLinkedSpriteId data[0] -#define sState data[1] - -u8 AddCameraObject(u8 linkedSpriteId) -{ - u8 spriteId = CreateSprite(&sCameraSpriteTemplate, 0, 0, 4); - - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].sLinkedSpriteId = linkedSpriteId; - return spriteId; -} - -static void SpriteCB_CameraObject(struct Sprite *sprite) -{ - void (*callbacks[ARRAY_COUNT(sCameraObjectFuncs)])(struct Sprite *); - - memcpy(callbacks, sCameraObjectFuncs, sizeof sCameraObjectFuncs); - callbacks[sprite->sState](sprite); -} - -static void CameraObject_0(struct Sprite *sprite) -{ - sprite->x = gSprites[sprite->sLinkedSpriteId].x; - sprite->y = gSprites[sprite->sLinkedSpriteId].y; - sprite->invisible = TRUE; - sprite->sState = 1; - CameraObject_1(sprite); -} - -static void CameraObject_1(struct Sprite *sprite) -{ - s16 x = gSprites[sprite->sLinkedSpriteId].x; - s16 y = gSprites[sprite->sLinkedSpriteId].y; - - sprite->data[2] = x - sprite->x; - sprite->data[3] = y - sprite->y; - sprite->x = x; - sprite->y = y; -} - -static void CameraObject_2(struct Sprite *sprite) -{ - sprite->x = gSprites[sprite->sLinkedSpriteId].x; - sprite->y = gSprites[sprite->sLinkedSpriteId].y; - sprite->data[2] = 0; - sprite->data[3] = 0; -} - -static struct Sprite *FindCameraSprite(void) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - if (gSprites[i].inUse && gSprites[i].callback == SpriteCB_CameraObject) - return &gSprites[i]; - } - return NULL; -} - -void CameraObjectReset1(void) -{ - struct Sprite *camera; - - camera = FindCameraSprite(); - if (camera != NULL) - { - camera->sState = 0; - camera->callback(camera); - } -} - -void CameraObjectSetFollowedSpriteId(u8 spriteId) -{ - struct Sprite *camera; - - camera = FindCameraSprite(); - if (camera != NULL) - { - camera->sLinkedSpriteId = spriteId; - CameraObjectReset1(); - } -} - -// Unused -static u8 CameraObjectGetFollowedSpriteId(void) -{ - struct Sprite *camera; - - camera = FindCameraSprite(); - if (camera == NULL) - return MAX_SPRITES; - - return camera->sLinkedSpriteId; -} - -void CameraObjectReset2(void) -{ - // UB: Possible null dereference -#ifdef UBFIX - struct Sprite *camera = FindCameraSprite(); - if (camera) - camera->sState = 2; -#else - FindCameraSprite()->sState = 2; -#endif // UBFIX -} - -u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *sprite; - gSprites[i].x = x; - gSprites[i].y = y; - gSprites[i].subpriority = subpriority; - break; - } - } - return i; -} - -u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = MAX_SPRITES - 1; i > -1; i--) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *sprite; - gSprites[i].x = x; - gSprites[i].y = y; - gSprites[i].subpriority = subpriority; - return i; - } - } - return MAX_SPRITES; -} - -void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction) -{ - s8 d2; - objectEvent->previousMovementDirection = objectEvent->facingDirection; - if (!objectEvent->facingDirectionLocked) - { - d2 = direction; - objectEvent->facingDirection = d2; - } - objectEvent->movementDirection = direction; -} - -static const u8 *GetObjectEventScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; -} - -const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId) -{ - return GetObjectEventScriptPointerByLocalIdAndMap(gObjectEvents[objectEventId].localId, gObjectEvents[objectEventId].mapNum, gObjectEvents[objectEventId].mapGroup); -} - -static u16 GetObjectEventFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - const struct ObjectEventTemplate *obj = GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup); -#ifdef UBFIX - // BUG: The function may return NULL, and attempting to read from NULL may freeze the game using modern compilers. - if (obj == NULL) - return 0; -#endif // UBFIX - return obj->flagId; -} - -static u16 GetObjectEventFlagIdByObjectEventId(u8 objectEventId) -{ - return GetObjectEventFlagIdByLocalIdAndMap(gObjectEvents[objectEventId].localId, gObjectEvents[objectEventId].mapNum, gObjectEvents[objectEventId].mapGroup); -} - -// Unused -static u8 GetObjectTrainerTypeByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 objectEventId; - - if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - return 0xFF; - - return gObjectEvents[objectEventId].trainerType; -} - -// Unused -static u8 GetObjectTrainerTypeByObjectEventId(u8 objectEventId) -{ - return gObjectEvents[objectEventId].trainerType; -} - -// Unused -u8 GetObjectEventBerryTreeIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 objectEventId; - - if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - return 0xFF; - - return gObjectEvents[objectEventId].trainerRange_berryTreeId; -} - -u8 GetObjectEventBerryTreeId(u8 objectEventId) -{ - return gObjectEvents[objectEventId].trainerRange_berryTreeId; -} - -static const struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - const struct ObjectEventTemplate *templates; - const struct MapHeader *mapHeader; - u8 count; - - if (gSaveBlock1Ptr->location.mapNum == mapNum && gSaveBlock1Ptr->location.mapGroup == mapGroup) - { - templates = gSaveBlock1Ptr->objectEventTemplates; - count = gMapHeader.events->objectEventCount; - } - else - { - mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); - templates = mapHeader->events->objectEvents; - count = mapHeader->events->objectEventCount; - } - return FindObjectEventTemplateByLocalId(localId, templates, count); -} - -static const struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, const struct ObjectEventTemplate *templates, u8 count) -{ - u8 i; - - for (i = 0; i < count; i++) - { - if (templates[i].localId == localId) - return &templates[i]; - } - return NULL; -} - -struct ObjectEventTemplate *GetBaseTemplateForObjectEvent(const struct ObjectEvent *objectEvent) -{ - int i; - - if (objectEvent->mapNum != gSaveBlock1Ptr->location.mapNum - || objectEvent->mapGroup != gSaveBlock1Ptr->location.mapGroup) - return NULL; - - for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) - { - if (objectEvent->localId == gSaveBlock1Ptr->objectEventTemplates[i].localId) - return &gSaveBlock1Ptr->objectEventTemplates[i]; - } - return NULL; -} - -void OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent) -{ - struct ObjectEventTemplate *objectEventTemplate; - - objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent); - if (objectEventTemplate != NULL) - { - objectEventTemplate->x = objectEvent->currentCoords.x - MAP_OFFSET; - objectEventTemplate->y = objectEvent->currentCoords.y - MAP_OFFSET; - } -} - -static void OverrideObjectEventTemplateScript(const struct ObjectEvent *objectEvent, const u8 *script) -{ - struct ObjectEventTemplate *objectEventTemplate; - - objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent); - if (objectEventTemplate) - objectEventTemplate->script = script; -} - -void TryOverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent, u8 movementType) -{ - struct ObjectEventTemplate *objectEventTemplate; - - objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent); - if (objectEventTemplate != NULL) - objectEventTemplate->movementType = movementType; -} - -void TryOverrideObjectEventTemplateCoords(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 objectEventId; - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - OverrideTemplateCoordsForObjectEvent(&gObjectEvents[objectEventId]); -} - -void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup, u8 decorationCategory) -{ - u8 objectEventId; - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - { - switch (decorationCategory) - { - case DECORCAT_DOLL: - OverrideObjectEventTemplateScript(&gObjectEvents[objectEventId], SecretBase_EventScript_DollInteract); - break; - case DECORCAT_CUSHION: - OverrideObjectEventTemplateScript(&gObjectEvents[objectEventId], SecretBase_EventScript_CushionInteract); - break; - } - } -} - -void InitObjectEventPalettes(u8 reflectionType) -{ - FreeAndReserveObjectSpritePalettes(); - sCurrentSpecialObjectPaletteTag = OBJ_EVENT_PAL_TAG_NONE; - sCurrentReflectionType = reflectionType; - if (reflectionType == 1) - { - PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], PALSLOT_PLAYER, PALSLOT_NPC_4 + 1); - gReservedSpritePaletteCount = 8; - } - else - { - PatchObjectPaletteRange(sObjectPaletteTagSets[sCurrentReflectionType], PALSLOT_PLAYER, PALSLOT_NPC_4_REFLECTION + 1); - } -} - -u16 GetObjectPaletteTag(u8 palSlot) -{ - u8 i; - - if (palSlot < PALSLOT_NPC_SPECIAL) - return sObjectPaletteTagSets[sCurrentReflectionType][palSlot]; - - for (i = 0; sSpecialObjectReflectionPaletteSets[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) - { - if (sSpecialObjectReflectionPaletteSets[i].tag == sCurrentSpecialObjectPaletteTag) - return sSpecialObjectReflectionPaletteSets[i].data[sCurrentReflectionType]; - } - return OBJ_EVENT_PAL_TAG_NONE; -} - -movement_type_empty_callback(MovementType_None) -movement_type_def(MovementType_WanderAround, gMovementTypeFuncs_WanderAround) - -bool8 MovementType_WanderAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_WanderAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) - return FALSE; - SetMovementDelay(sprite, sMovementDelaysMedium[Random() % ARRAY_COUNT(sMovementDelaysMedium)]); - sprite->sTypeFuncId = 3; - return TRUE; -} - -bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[4]; - u8 chosenDirection; - - memcpy(directions, gStandardDirections, sizeof directions); - chosenDirection = directions[Random() & 3]; - SetObjectEventDirection(objectEvent, chosenDirection); - sprite->sTypeFuncId = 5; - if (GetCollisionInDirection(objectEvent, chosenDirection)) - sprite->sTypeFuncId = 1; - - return TRUE; -} - -bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 6; - return TRUE; -} - -bool8 MovementType_WanderAround_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 1; - } - return FALSE; -} - -bool8 ObjectEventIsTrainerAndCloseToPlayer(struct ObjectEvent *objectEvent) -{ - s16 playerX; - s16 playerY; - s16 objX; - s16 objY; - s16 minX; - s16 maxX; - s16 minY; - s16 maxY; - - if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) - return FALSE; - - if (objectEvent->trainerType != TRAINER_TYPE_NORMAL && objectEvent->trainerType != TRAINER_TYPE_BURIED) - return FALSE; - - PlayerGetDestCoords(&playerX, &playerY); - objX = objectEvent->currentCoords.x; - objY = objectEvent->currentCoords.y; - minX = objX - objectEvent->trainerRange_berryTreeId; - minY = objY - objectEvent->trainerRange_berryTreeId; - maxX = objX + objectEvent->trainerRange_berryTreeId; - maxY = objY + objectEvent->trainerRange_berryTreeId; - if (minX > playerX || maxX < playerX - || minY > playerY || maxY < playerY) - return FALSE; - - return TRUE; -} - -u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - if (absdx > absdy) - { - direction = DIR_EAST; - if (dx < 0) - direction = DIR_WEST; - } - else - { - direction = DIR_SOUTH; - if (dy < 0) - direction = DIR_NORTH; - } - return direction; -} - -u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = DIR_SOUTH; - if (dy < 0) - direction = DIR_NORTH; - return direction; -} - -u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = DIR_EAST; - if (dx < 0) - direction = DIR_WEST; - return direction; -} - -u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - { - direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - if (direction == DIR_EAST) - direction = DIR_NORTH; - } - else if (direction == DIR_EAST) - { - direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - direction = DIR_NORTH; - } - return direction; -} - -u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - { - direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - if (direction == DIR_WEST) - direction = DIR_NORTH; - } - else if (direction == DIR_WEST) - { - direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - direction = DIR_NORTH; - } - return direction; -} - -u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - { - direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - if (direction == DIR_EAST) - direction = DIR_SOUTH; - } - else if (direction == DIR_EAST) - { - direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - direction = DIR_SOUTH; - } - return direction; -} - -u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - { - direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - if (direction == DIR_WEST) - direction = DIR_SOUTH; - } - else if (direction == DIR_WEST) - { - direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - direction = DIR_SOUTH; - } - return direction; -} - -u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_EAST) - direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - return direction; -} - -u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_WEST) - direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - return direction; -} - -u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - return direction; -} - -u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetVectorDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - return direction; -} - -u8 TryGetTrainerEncounterDirection(struct ObjectEvent *objectEvent, u8 movementType) -{ - s16 dx, dy; - s16 absdx, absdy; - - if (!ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - return DIR_NONE; - - PlayerGetDestCoords(&dx, &dy); - dx -= objectEvent->currentCoords.x; - dy -= objectEvent->currentCoords.y; - absdx = dx; - absdy = dy; - - if (absdx < 0) - absdx = -absdx; - if (absdy < 0) - absdy = -absdy; - - return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy); -} - -movement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround) - -bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_LookAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_LookAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysMedium[Random() % ARRAY_COUNT(sMovementDelaysMedium)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_LookAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_LookAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gStandardDirections, sizeof directions); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY); - if (direction == DIR_NONE) - direction = directions[Random() & 3]; - - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_WanderUpAndDown, gMovementTypeFuncs_WanderUpAndDown) - -bool8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) - return FALSE; - - SetMovementDelay(sprite, sMovementDelaysMedium[Random() % ARRAY_COUNT(sMovementDelaysMedium)]); - sprite->sTypeFuncId = 3; - return TRUE; -} - -bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUpAndDownDirections, sizeof directions); - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 5; - if (GetCollisionInDirection(objectEvent, direction)) - sprite->sTypeFuncId = 1; - - return TRUE; -} - -bool8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 6; - return TRUE; -} - -bool8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 1; - } - return FALSE; -} - -movement_type_def(MovementType_WanderLeftAndRight, gMovementTypeFuncs_WanderLeftAndRight) - -bool8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) - return FALSE; - - SetMovementDelay(sprite, sMovementDelaysMedium[Random() % ARRAY_COUNT(sMovementDelaysMedium)]); - sprite->sTypeFuncId = 3; - return TRUE; -} - -bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gLeftAndRightDirections, sizeof directions); - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 5; - if (GetCollisionInDirection(objectEvent, direction)) - sprite->sTypeFuncId = 1; - - return TRUE; -} - -bool8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 6; - return TRUE; -} - -bool8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 1; - } - return FALSE; -} - -movement_type_def(MovementType_FaceDirection, gMovementTypeFuncs_FaceDirection) - -bool8 MovementType_FaceDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - sprite->sTypeFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceDirection_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->singleMovementActive = FALSE; - return FALSE; -} - -static bool8 ObjectEventCB2_BerryTree(struct ObjectEvent *objectEvent, struct Sprite *sprite); -extern bool8 (*const gMovementTypeFuncs_BerryTreeGrowth[])(struct ObjectEvent *objectEvent, struct Sprite *sprite); - -enum { - BERRYTREEFUNC_NORMAL, - BERRYTREEFUNC_MOVE, - BERRYTREEFUNC_SPARKLE_START, - BERRYTREEFUNC_SPARKLE, - BERRYTREEFUNC_SPARKLE_END, -}; - -#define sTimer data[2] -#define sBerryTreeFlags data[7] - -#define BERRY_FLAG_SET_GFX (1 << 0) -#define BERRY_FLAG_SPARKLING (1 << 1) -#define BERRY_FLAG_JUST_PICKED (1 << 2) - -void MovementType_BerryTreeGrowth(struct Sprite *sprite) -{ - struct ObjectEvent *objectEvent; - - objectEvent = &gObjectEvents[sprite->sObjEventId]; - if (!(sprite->sBerryTreeFlags & BERRY_FLAG_SET_GFX)) - { - SetBerryTreeGraphics(objectEvent, sprite); - sprite->sBerryTreeFlags |= BERRY_FLAG_SET_GFX; - } - UpdateObjectEventCurrentMovement(objectEvent, sprite, ObjectEventCB2_BerryTree); -} -static bool8 ObjectEventCB2_BerryTree(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - return gMovementTypeFuncs_BerryTreeGrowth[sprite->sTypeFuncId](objectEvent, sprite); -} - -// BERRYTREEFUNC_NORMAL -bool8 MovementType_BerryTreeGrowth_Normal(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 berryStage; - ClearObjectEventMovement(objectEvent, sprite); - objectEvent->invisible = TRUE; - sprite->invisible = TRUE; - berryStage = GetStageByBerryTreeId(objectEvent->trainerRange_berryTreeId); - if (berryStage == BERRY_STAGE_NO_BERRY) - { - if (!(sprite->sBerryTreeFlags & BERRY_FLAG_JUST_PICKED) && sprite->animNum == BERRY_STAGE_FLOWERING) - { - gFieldEffectArguments[0] = objectEvent->currentCoords.x; - gFieldEffectArguments[1] = objectEvent->currentCoords.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - sprite->animNum = berryStage; - } - return FALSE; - } - objectEvent->invisible = FALSE; - sprite->invisible = FALSE; - berryStage--; - if (sprite->animNum != berryStage) - { - sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE_START; - return TRUE; - } - SetBerryTreeGraphics(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); - sprite->sTypeFuncId = BERRYTREEFUNC_MOVE; - return TRUE; -} - -// BERRYTREEFUNC_MOVE -bool8 MovementType_BerryTreeGrowth_Move(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - sprite->sTypeFuncId = BERRYTREEFUNC_NORMAL; - return TRUE; - } - return FALSE; -} - -// BERRYTREEFUNC_SPARKLE_START -bool8 MovementType_BerryTreeGrowth_SparkleStart(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE; - sprite->sTimer = 0; - sprite->sBerryTreeFlags |= BERRY_FLAG_SPARKLING; - gFieldEffectArguments[0] = objectEvent->currentCoords.x; - gFieldEffectArguments[1] = objectEvent->currentCoords.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - return TRUE; -} - -// BERRYTREEFUNC_SPARKLE -bool8 MovementType_BerryTreeGrowth_Sparkle(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->sTimer++; - objectEvent->invisible = (sprite->sTimer & 2) >> 1; - sprite->animPaused = TRUE; - if (sprite->sTimer > 64) - { - SetBerryTreeGraphics(objectEvent, sprite); - sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE_END; - sprite->sTimer = 0; - return TRUE; - } - return FALSE; -} - -// BERRYTREEFUNC_SPARKLE_END -bool8 MovementType_BerryTreeGrowth_SparkleEnd(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->sTimer++; - objectEvent->invisible = (sprite->sTimer & 2) >> 1; - sprite->animPaused = TRUE; - if (sprite->sTimer > 64) - { - sprite->sTypeFuncId = BERRYTREEFUNC_NORMAL; - sprite->sBerryTreeFlags &= ~BERRY_FLAG_SPARKLING; - return TRUE; - } - return FALSE; -} - -movement_type_def(MovementType_FaceDownAndUp, gMovementTypeFuncs_FaceDownAndUp) - -bool8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysMedium[Random() % ARRAY_COUNT(sMovementDelaysMedium)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUpAndDownDirections, sizeof gUpAndDownDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH); - if (direction == DIR_NONE) - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceLeftAndRight, gMovementTypeFuncs_FaceLeftAndRight) - -bool8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysMedium[Random() % ARRAY_COUNT(sMovementDelaysMedium)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gLeftAndRightDirections, sizeof gLeftAndRightDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_EAST_WEST); - if (direction == DIR_NONE) - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceUpAndLeft, gMovementTypeFuncs_FaceUpAndLeft) - -bool8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUpAndLeftDirections, sizeof gUpAndLeftDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_WEST); - if (direction == DIR_NONE) - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceUpAndRight, gMovementTypeFuncs_FaceUpAndRight) - -bool8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gUpAndRightDirections, sizeof gUpAndRightDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_EAST); - if (direction == DIR_NONE) - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceDownAndLeft, gMovementTypeFuncs_FaceDownAndLeft) - -bool8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gDownAndLeftDirections, sizeof gDownAndLeftDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_WEST); - if (direction == DIR_NONE) - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceDownAndRight, gMovementTypeFuncs_FaceDownAndRight) - -bool8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[2]; - memcpy(directions, gDownAndRightDirections, sizeof gDownAndRightDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_EAST); - if (direction == DIR_NONE) - direction = directions[Random() & 1]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceDownUpAndLeft, gMovementTypeFuncs_FaceDownUpAndLeft) - -bool8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gDownUpAndLeftDirections, sizeof gDownUpAndLeftDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH_WEST); - if (direction == DIR_NONE) - direction = directions[Random() & 3]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceDownUpAndRight, gMovementTypeFuncs_FaceDownUpAndRight) - -bool8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gDownUpAndRightDirections, sizeof gDownUpAndRightDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_SOUTH_EAST); - if (direction == DIR_NONE) - direction = directions[Random() & 3]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceUpRightAndLeft, gMovementTypeFuncs_FaceUpLeftAndRight) - -bool8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gUpLeftAndRightDirections, sizeof gUpLeftAndRightDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_NORTH_EAST_WEST); - if (direction == DIR_NONE) - direction = directions[Random() & 3]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_FaceDownRightAndLeft, gMovementTypeFuncs_FaceDownLeftAndRight) - -bool8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, sMovementDelaysShort[Random() % ARRAY_COUNT(sMovementDelaysShort)]); - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 3; - } - return FALSE; -} - -bool8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - sprite->sTypeFuncId = 4; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[4]; - memcpy(directions, gDownLeftAndRightDirections, sizeof gDownLeftAndRightDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_SOUTH_EAST_WEST); - if (direction == DIR_NONE) - direction = directions[Random() & 3]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_RotateCounterclockwise, gMovementTypeFuncs_RotateCounterclockwise) - -bool8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, 48); - sprite->sTypeFuncId = 2; - } - return FALSE; -} - -bool8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - sprite->sTypeFuncId = 3; - return FALSE; -} - -bool8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gCounterclockwiseDirections, sizeof gCounterclockwiseDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY); - if (direction == DIR_NONE) - direction = directions[objectEvent->facingDirection]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 0; - return TRUE; -} - -movement_type_def(MovementType_RotateClockwise, gMovementTypeFuncs_RotateClockwise) - -bool8 MovementType_RotateClockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_RotateClockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - SetMovementDelay(sprite, 48); - sprite->sTypeFuncId = 2; - } - return FALSE; -} - -bool8 MovementType_RotateClockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - sprite->sTypeFuncId = 3; - return FALSE; -} - -bool8 MovementType_RotateClockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - u8 directions[5]; - memcpy(directions, gClockwiseDirections, sizeof gClockwiseDirections); - direction = TryGetTrainerEncounterDirection(objectEvent, RUNFOLLOW_ANY); - if (direction == DIR_NONE) - direction = directions[objectEvent->facingDirection]; - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 0; - return TRUE; -} - -movement_type_def(MovementType_WalkBackAndForth, gMovementTypeFuncs_WalkBackAndForth) - -bool8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 direction; - - direction = gInitialMovementTypeFacingDirections[objectEvent->movementType]; - if (objectEvent->directionSequenceIndex) - direction = GetOppositeDirection(direction); - SetObjectEventDirection(objectEvent, direction); - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - bool8 collision; - u8 movementActionId; - - if (objectEvent->directionSequenceIndex && objectEvent->initialCoords.x == objectEvent->currentCoords.x && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - { - objectEvent->directionSequenceIndex = 0; - SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection)); - } - collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); - movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); - if (collision == COLLISION_OUTSIDE_RANGE) - { - objectEvent->directionSequenceIndex++; - SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection)); - movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); - collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); - } - - if (collision) - movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection); - - ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 3; - return TRUE; -} - -bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 1; - } - return FALSE; -} - -bool8 MovementType_WalkSequence_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MoveNextDirectionInSequence(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 *route) -{ - u8 collision; - u8 movementActionId; - - if (objectEvent->directionSequenceIndex == 3 && objectEvent->initialCoords.x == objectEvent->currentCoords.x && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 0; - - SetObjectEventDirection(objectEvent, route[objectEvent->directionSequenceIndex]); - movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); - collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); - if (collision == COLLISION_OUTSIDE_RANGE) - { - objectEvent->directionSequenceIndex++; - SetObjectEventDirection(objectEvent, route[objectEvent->directionSequenceIndex]); - movementActionId = GetWalkNormalMovementAction(objectEvent->movementDirection); - collision = GetCollisionInDirection(objectEvent, objectEvent->movementDirection); - } - - if (collision) - movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection); - - ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 MovementType_WalkSequence_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 1; - } - return FALSE; -} - -movement_type_def(MovementType_WalkSequenceUpRightLeftDown, gMovementTypeFuncs_WalkSequenceUpRightLeftDown) - -u8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gUpRightLeftDownDirections)]; - memcpy(directions, gUpRightLeftDownDirections, sizeof(gUpRightLeftDownDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceRightLeftDownUp, gMovementTypeFuncs_WalkSequenceRightLeftDownUp) - -u8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gRightLeftDownUpDirections)]; - memcpy(directions, gRightLeftDownUpDirections, sizeof(gRightLeftDownUpDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceDownUpRightLeft, gMovementTypeFuncs_WalkSequenceDownUpRightLeft) - -u8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gDownUpRightLeftDirections)]; - memcpy(directions, gDownUpRightLeftDirections, sizeof(gDownUpRightLeftDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceLeftDownUpRight, gMovementTypeFuncs_WalkSequenceLeftDownUpRight) - -u8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gLeftDownUpRightDirections)]; - memcpy(directions, gLeftDownUpRightDirections, sizeof(gLeftDownUpRightDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceUpLeftRightDown, gMovementTypeFuncs_WalkSequenceUpLeftRightDown) - -u8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gUpLeftRightDownDirections)]; - memcpy(directions, gUpLeftRightDownDirections, sizeof(gUpLeftRightDownDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceLeftRightDownUp, gMovementTypeFuncs_WalkSequenceLeftRightDownUp) - -u8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gLeftRightDownUpDirections)]; - memcpy(directions, gLeftRightDownUpDirections, sizeof(gLeftRightDownUpDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceDownUpLeftRight, gMovementTypeFuncs_WalkSequenceDownUpLeftRight) - -u8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gStandardDirections)]; - memcpy(directions, gStandardDirections, sizeof(gStandardDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceRightDownUpLeft, gMovementTypeFuncs_WalkSequenceRightDownUpLeft) - -u8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gRightDownUpLeftDirections)]; - memcpy(directions, gRightDownUpLeftDirections, sizeof(gRightDownUpLeftDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceLeftUpDownRight, gMovementTypeFuncs_WalkSequenceLeftUpDownRight) - -u8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gLeftUpDownRightDirections)]; - memcpy(directions, gLeftUpDownRightDirections, sizeof(gLeftUpDownRightDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceUpDownRightLeft, gMovementTypeFuncs_WalkSequenceUpDownRightLeft) - -u8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gUpDownRightLeftDirections)]; - memcpy(directions, gUpDownRightLeftDirections, sizeof(gUpDownRightLeftDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceRightLeftUpDown, gMovementTypeFuncs_WalkSequenceRightLeftUpDown) - -u8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gRightLeftUpDownDirections)]; - memcpy(directions, gRightLeftUpDownDirections, sizeof(gRightLeftUpDownDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceDownRightLeftUp, gMovementTypeFuncs_WalkSequenceDownRightLeftUp) - -u8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gDownRightLeftUpDirections)]; - memcpy(directions, gDownRightLeftUpDirections, sizeof(gDownRightLeftUpDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceRightUpDownLeft, gMovementTypeFuncs_WalkSequenceRightUpDownLeft) - -u8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gRightUpDownLeftDirections)]; - memcpy(directions, gRightUpDownLeftDirections, sizeof(gRightUpDownLeftDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceUpDownLeftRight, gMovementTypeFuncs_WalkSequenceUpDownLeftRight) - -u8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gUpDownLeftRightDirections)]; - memcpy(directions, gUpDownLeftRightDirections, sizeof(gUpDownLeftRightDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceLeftRightUpDown, gMovementTypeFuncs_WalkSequenceLeftRightUpDown) - -u8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gLeftRightUpDownDirections)]; - memcpy(directions, gLeftRightUpDownDirections, sizeof(gLeftRightUpDownDirections)); - if (objectEvent->directionSequenceIndex == 1 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 2; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceDownLeftRightUp, gMovementTypeFuncs_WalkSequenceDownLeftRightUp) - -u8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gDownLeftRightUpDirections)]; - memcpy(directions, gDownLeftRightUpDirections, sizeof(gDownLeftRightUpDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceUpLeftDownRight, gMovementTypeFuncs_WalkSequenceUpLeftDownRight) - -u8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gUpLeftDownRightDirections)]; - memcpy(directions, gUpLeftDownRightDirections, sizeof(gUpLeftDownRightDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceDownRightUpLeft, gMovementTypeFuncs_WalkSequenceDownRightUpLeft) - -u8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gDownRightUpLeftDirections)]; - memcpy(directions, gDownRightUpLeftDirections, sizeof(gDownRightUpLeftDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceLeftDownRightUp, gMovementTypeFuncs_WalkSequenceLeftDownRightUp) - -u8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gLeftDownRightUpDirections)]; - memcpy(directions, gLeftDownRightUpDirections, sizeof(gLeftDownRightUpDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceRightUpLeftDown, gMovementTypeFuncs_WalkSequenceRightUpLeftDown) - -u8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gRightUpLeftDownDirections)]; - memcpy(directions, gRightUpLeftDownDirections, sizeof(gRightUpLeftDownDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceUpRightDownLeft, gMovementTypeFuncs_WalkSequenceUpRightDownLeft) - -u8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gUpRightDownLeftDirections)]; - memcpy(directions, gUpRightDownLeftDirections, sizeof(gUpRightDownLeftDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceDownLeftUpRight, gMovementTypeFuncs_WalkSequenceDownLeftUpRight) - -u8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gDownLeftUpRightDirections)]; - memcpy(directions, gDownLeftUpRightDirections, sizeof(gDownLeftUpRightDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.y == objectEvent->currentCoords.y) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceLeftUpRightDown, gMovementTypeFuncs_WalkSequenceLeftUpRightDown) - -u8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gLeftUpRightDownDirections)]; - memcpy(directions, gLeftUpRightDownDirections, sizeof(gLeftUpRightDownDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_WalkSequenceRightDownLeftUp, gMovementTypeFuncs_WalkSequenceRightDownLeftUp) - -u8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 directions[sizeof(gRightDownLeftUpDirections)]; - memcpy(directions, gRightDownLeftUpDirections, sizeof(gRightDownLeftUpDirections)); - if (objectEvent->directionSequenceIndex == 2 && objectEvent->initialCoords.x == objectEvent->currentCoords.x) - objectEvent->directionSequenceIndex = 3; - - return MoveNextDirectionInSequence(objectEvent, sprite, directions); -} - -movement_type_def(MovementType_CopyPlayer, gMovementTypeFuncs_CopyPlayer) - -bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - if (objectEvent->directionSequenceIndex == 0) - objectEvent->directionSequenceIndex = GetPlayerFacingDirection(); - sprite->sTypeFuncId = 1; - return TRUE; -} - -bool8 MovementType_CopyPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - return FALSE; - - return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), NULL); -} - -bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - objectEvent->singleMovementActive = FALSE; - sprite->sTypeFuncId = 1; - } - return FALSE; -} - -bool8 CopyablePlayerMovement_None(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - return FALSE; -} - -bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, playerDirection))); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 CopyablePlayerMovement_WalkNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - if (ObjectEventIsFarawayIslandMew(objectEvent)) - { - direction = GetMewMoveDirection(); - if (direction == DIR_NONE) - { - direction = playerDirection; - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; - } - } - else - { - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - } - ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(direction)); - - if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 CopyablePlayerMovement_WalkFast(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFastMovementAction(direction)); - - if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 CopyablePlayerMovement_WalkFaster(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkFasterMovementAction(direction)); - - if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); - ObjectEventSetSingleMovement(objectEvent, sprite, GetSlideMovementAction(direction)); - - if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 CopyablePlayerMovement_JumpInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - u32 direction; - - direction = playerDirection; - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - ObjectEventSetSingleMovement(objectEvent, sprite, GetJumpInPlaceMovementAction(direction)); - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); - ObjectEventSetSingleMovement(objectEvent, sprite, GetJumpMovementAction(direction)); - - if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -bool8 CopyablePlayerMovement_Jump2(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = GetCopyDirection(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); - x = objectEvent->currentCoords.x; - y = objectEvent->currentCoords.y; - MoveCoordsInDirection(direction, &x, &y, 2, 2); - ObjectEventSetSingleMovement(objectEvent, sprite, GetJump2MovementAction(direction)); - - if (GetCollisionAtCoords(objectEvent, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - - objectEvent->singleMovementActive = TRUE; - sprite->sTypeFuncId = 2; - return TRUE; -} - -movement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerInGrass) - -bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - return FALSE; - - return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass); -} - -void MovementType_TreeDisguise(struct Sprite *sprite) -{ - struct ObjectEvent *objectEvent; - - objectEvent = &gObjectEvents[sprite->sObjEventId]; - if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7])) - { - ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_TREE_DISGUISE); - objectEvent->directionSequenceIndex = 1; - sprite->data[7]++; - } - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, MovementType_Disguise_Callback); -} - -static bool8 MovementType_Disguise_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - return FALSE; -} - -void MovementType_MountainDisguise(struct Sprite *sprite) -{ - struct ObjectEvent *objectEvent; - - objectEvent = &gObjectEvents[sprite->sObjEventId]; - if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7])) - { - ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - objectEvent->fieldEffectSpriteId = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); - objectEvent->directionSequenceIndex = 1; - sprite->data[7]++; - } - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, MovementType_Disguise_Callback); -} - -void MovementType_Buried(struct Sprite *sprite) -{ - if (!sprite->data[7]) - { - gObjectEvents[sprite->sObjEventId].fixedPriority = TRUE; - sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; - sprite->oam.priority = 3; - sprite->data[7]++; - } - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, MovementType_Buried_Callback); -} - -static bool8 MovementType_Buried_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - return gMovementTypeFuncs_Buried[sprite->sTypeFuncId](objectEvent, sprite); -} - -bool8 MovementType_Buried_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - return FALSE; -} - -bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - sprite->sTypeFuncId = 0; - return FALSE; -} - -movement_type_def(MovementType_WalkInPlace, gMovementTypeFuncs_WalkInPlace) - -bool8 MovementType_WalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_WalkSlowlyInPlace, gMovementTypeFuncs_WalkSlowlyInPlace) - -bool8 MovementType_WalkSlowlyInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceSlowMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_JogInPlace, gMovementTypeFuncs_JogInPlace) - -bool8 MovementType_JogInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFastMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_RunInPlace, gMovementTypeFuncs_RunInPlace) - -bool8 MovementType_RunInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFasterMovementAction(objectEvent->facingDirection)); - sprite->sTypeFuncId = 1; - return TRUE; -} - -movement_type_def(MovementType_Invisible, gMovementTypeFuncs_Invisible) - -bool8 MovementType_Invisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ClearObjectEventMovement(objectEvent, sprite); - ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - objectEvent->invisible = TRUE; - sprite->sTypeFuncId = 1; - return TRUE; -} -bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { - sprite->sTypeFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->singleMovementActive = FALSE; - return FALSE; -} - -static void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->singleMovementActive = FALSE; - objectEvent->heldMovementActive = FALSE; - objectEvent->heldMovementFinished = FALSE; - objectEvent->movementActionId = MOVEMENT_ACTION_NONE; - sprite->sTypeFuncId = 0; -} - -u8 GetFaceDirectionAnimNum(u8 direction) -{ - return sFaceDirectionAnimNums[direction]; -} - -u8 GetMoveDirectionAnimNum(u8 direction) -{ - return sMoveDirectionAnimNums[direction]; -} - -u8 GetMoveDirectionFastAnimNum(u8 direction) -{ - return sMoveDirectionFastAnimNums[direction]; -} - -u8 GetMoveDirectionFasterAnimNum(u8 direction) -{ - return sMoveDirectionFasterAnimNums[direction]; -} - -u8 GetMoveDirectionFastestAnimNum(u8 direction) -{ - return sMoveDirectionFastestAnimNums[direction]; -} - -u8 GetJumpSpecialDirectionAnimNum(u8 direction) -{ - return sJumpSpecialDirectionAnimNums[direction]; -} - -u8 GetAcroWheelieDirectionAnimNum(u8 direction) -{ - return sAcroWheelieDirectionAnimNums[direction]; -} - -u8 GetAcroUnusedDirectionAnimNum(u8 direction) -{ - return sAcroUnusedDirectionAnimNums[direction]; -} - -u8 GetAcroEndWheelieDirectionAnimNum(u8 direction) -{ - return sAcroEndWheelieDirectionAnimNums[direction]; -} - -u8 GetAcroUnusedActionDirectionAnimNum(u8 direction) -{ - return sAcroUnusedActionDirectionAnimNums[direction]; -} - -u8 GetAcroWheeliePedalDirectionAnimNum(u8 direction) -{ - return sAcroWheeliePedalDirectionAnimNums[direction]; -} - -u8 GetFishingDirectionAnimNum(u8 direction) -{ - return sFishingDirectionAnimNums[direction]; -} - -u8 GetFishingNoCatchDirectionAnimNum(u8 direction) -{ - return sFishingNoCatchDirectionAnimNums[direction]; -} - -u8 GetFishingBiteDirectionAnimNum(u8 direction) -{ - return sFishingBiteDirectionAnimNums[direction]; -} - -u8 GetRunningDirectionAnimNum(u8 direction) -{ - return sRunningDirectionAnimNums[direction]; -} - -static const struct StepAnimTable *GetStepAnimTable(const union AnimCmd *const *anims) -{ - const struct StepAnimTable *stepTable; - - for (stepTable = sStepAnimTables; stepTable->anims != NULL; stepTable++) - { - if (stepTable->anims == anims) - return stepTable; - } - return NULL; -} - -void SetStepAnimHandleAlternation(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) -{ - const struct StepAnimTable *stepTable; - - if (!objectEvent->inanimate) - { - sprite->animNum = animNum; - stepTable = GetStepAnimTable(sprite->anims); - if (stepTable != NULL) - { - if (sprite->animCmdIndex == stepTable->animPos[0]) - sprite->animCmdIndex = stepTable->animPos[3]; - else if (sprite->animCmdIndex == stepTable->animPos[1]) - sprite->animCmdIndex = stepTable->animPos[2]; - } - SeekSpriteAnim(sprite, sprite->animCmdIndex); - } -} - -void SetStepAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) -{ - const struct StepAnimTable *stepTable; - - if (!objectEvent->inanimate) - { - u8 animPos; - - sprite->animNum = animNum; - stepTable = GetStepAnimTable(sprite->anims); - if (stepTable != NULL) - { - animPos = stepTable->animPos[1]; - if (sprite->animCmdIndex <= stepTable->animPos[0]) - animPos = stepTable->animPos[0]; - - SeekSpriteAnim(sprite, animPos); - } - } -} - -u8 GetDirectionToFace(s16 x, s16 y, s16 targetX, s16 targetY) -{ - if (x > targetX) - return DIR_WEST; - - if (x < targetX) - return DIR_EAST; - - if (y > targetY) - return DIR_NORTH; - - return DIR_SOUTH; -} - -void SetTrainerMovementType(struct ObjectEvent *objectEvent, u8 movementType) -{ - objectEvent->movementType = movementType; - objectEvent->directionSequenceIndex = 0; - objectEvent->playerCopyableMovement = 0; - gSprites[objectEvent->spriteId].callback = sMovementTypeCallbacks[movementType]; - gSprites[objectEvent->spriteId].sTypeFuncId = 0; -} - -u8 GetTrainerFacingDirectionMovementType(u8 direction) -{ - return gTrainerFacingDirectionMovementTypes[direction]; -} - -u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) -{ - s16 x = objectEvent->currentCoords.x; - s16 y = objectEvent->currentCoords.y; - MoveCoords(direction, &x, &y); - return GetCollisionAtCoords(objectEvent, x, y, direction); -} - -u8 GetSidewaysStairsCollision(struct ObjectEvent *objectEvent, u8 dir, u8 currentBehavior, u8 nextBehavior, u8 collision) -{ - if ((dir == DIR_SOUTH || dir == DIR_NORTH) && collision != COLLISION_NONE) - return collision; - - if (MetatileBehavior_IsSidewaysStairsLeftSide(nextBehavior)) - { - //moving ONTO left side stair - if (dir == DIR_WEST && currentBehavior != nextBehavior) - return collision; //moving onto top part of left-stair going left, so no diagonal - else - return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; // move diagonally - } - else if (MetatileBehavior_IsSidewaysStairsRightSide(nextBehavior)) - { - //moving ONTO right side stair - if (dir == DIR_EAST && currentBehavior != nextBehavior) - return collision; //moving onto top part of right-stair going right, so no diagonal - else - return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; - } - else if (MetatileBehavior_IsSidewaysStairsLeftSideAny(currentBehavior)) - { - //moving OFF of any left side stair - if (dir == DIR_WEST && nextBehavior != currentBehavior) - return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; //moving off of left stairs onto non-stair -> move diagonal - else - return collision; //moving off of left side stair to east -> move east - } - else if (MetatileBehavior_IsSidewaysStairsRightSideAny(currentBehavior)) - { - //moving OFF of any right side stair - if (dir == DIR_EAST && nextBehavior != currentBehavior) - return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; //moving off right stair onto non-stair -> move diagonal - else - return collision; - } - - return collision; -} - -static u8 GetVanillaCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) -{ -<<<<<<< HEAD - u8 direction = dir; - -#if OW_FLAG_NO_COLLISION != 0 - if (FlagGet(OW_FLAG_NO_COLLISION)) - return COLLISION_NONE; -#endif - -======= ->>>>>>> d80cf0a193711b8d8c902b50f9cd286f4acc7b8a - if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y)) - return COLLISION_OUTSIDE_RANGE; - else if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction)) - return COLLISION_IMPASSABLE; - else if (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)) - return COLLISION_IMPASSABLE; - else if (IsElevationMismatchAt(objectEvent->currentElevation, x, y)) - return COLLISION_ELEVATION_MISMATCH; - else if (DoesObjectCollideWithObjectAt(objectEvent, x, y)) - return COLLISION_OBJECT_EVENT; - - return COLLISION_NONE; -} - -static bool8 ObjectEventOnLeftSideStair(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) -{ - switch (direction) - { - case DIR_EAST: - MoveCoords(DIR_NORTH, &x, &y); - return DoesObjectCollideWithObjectAt(objectEvent, x, y); - case DIR_WEST: - MoveCoords(DIR_SOUTH, &x, &y); - return DoesObjectCollideWithObjectAt(objectEvent, x, y); - default: - return FALSE; //north/south taken care of in GetVanillaCollision - } -} - -static bool8 ObjectEventOnRightSideStair(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) -{ - switch (direction) - { - case DIR_EAST: - MoveCoords(DIR_SOUTH, &x, &y); - return DoesObjectCollideWithObjectAt(objectEvent, x, y); - case DIR_WEST: - MoveCoords(DIR_NORTH, &x, &y); - return DoesObjectCollideWithObjectAt(objectEvent, x, y); - default: - return FALSE; //north/south taken care of in GetVanillaCollision - } -} - -u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir) -{ - u8 direction = dir; - u8 currentBehavior = MapGridGetMetatileBehaviorAt(objectEvent->currentCoords.x, objectEvent->currentCoords.y); - u8 nextBehavior = MapGridGetMetatileBehaviorAt(x, y); - u8 collision; - - objectEvent->directionOverwrite = DIR_NONE; - - //sideways stairs checks - if (MetatileBehavior_IsSidewaysStairsLeftSideTop(nextBehavior) && dir == DIR_EAST) - return COLLISION_IMPASSABLE; //moving onto left-side top edge east from regular ground -> nope - else if (MetatileBehavior_IsSidewaysStairsRightSideTop(nextBehavior) && dir == DIR_WEST) - return COLLISION_IMPASSABLE; //moving onto left-side top edge east from regular ground -> nope - else if (MetatileBehavior_IsSidewaysStairsRightSideBottom(nextBehavior) && (dir == DIR_EAST || dir == DIR_SOUTH)) - return COLLISION_IMPASSABLE; //moving into right-side bottom edge from regular ground -> nah - else if (MetatileBehavior_IsSidewaysStairsLeftSideBottom(nextBehavior) && (dir == DIR_WEST || dir == DIR_SOUTH)) - return COLLISION_IMPASSABLE; //moving onto left-side bottom edge from regular ground -> nah - else if ((MetatileBehavior_IsSidewaysStairsLeftSideTop(currentBehavior) || MetatileBehavior_IsSidewaysStairsRightSideTop(currentBehavior)) - && dir == DIR_NORTH) - return COLLISION_IMPASSABLE; //trying to move north off of top-most tile onto same level doesn't work - else if (!(MetatileBehavior_IsSidewaysStairsLeftSideTop(currentBehavior) || MetatileBehavior_IsSidewaysStairsRightSideTop(currentBehavior)) - && dir == DIR_SOUTH && (MetatileBehavior_IsSidewaysStairsLeftSideTop(nextBehavior) || MetatileBehavior_IsSidewaysStairsRightSideTop(nextBehavior))) - return COLLISION_IMPASSABLE; //trying to move south onto top stair tile at same level from non-stair -> no - else if (!(MetatileBehavior_IsSidewaysStairsLeftSideBottom(currentBehavior) || MetatileBehavior_IsSidewaysStairsRightSideBottom(currentBehavior)) - && dir == DIR_NORTH && (MetatileBehavior_IsSidewaysStairsLeftSideBottom(nextBehavior) || MetatileBehavior_IsSidewaysStairsRightSideBottom(nextBehavior))) - return COLLISION_IMPASSABLE; //trying to move north onto top stair tile at same level from non-stair -> no - - // regular checks - collision = GetVanillaCollision(objectEvent, x, y, dir); - - //sideways stairs checks - collision = GetSidewaysStairsCollision(objectEvent, dir, currentBehavior, nextBehavior, collision); - switch (collision) - { - case COLLISION_SIDEWAYS_STAIRS_TO_LEFT: - if (ObjectEventOnLeftSideStair(objectEvent, x, y, dir)) - return COLLISION_OBJECT_EVENT; - objectEvent->directionOverwrite = GetLeftSideStairsDirection(dir); - return COLLISION_NONE; - case COLLISION_SIDEWAYS_STAIRS_TO_RIGHT: - if (ObjectEventOnRightSideStair(objectEvent, x, y, dir)) - return COLLISION_OBJECT_EVENT; - objectEvent->directionOverwrite = GetRightSideStairsDirection(dir); - return COLLISION_NONE; - } - - return collision; -} - -u8 GetCollisionFlagsAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) -{ - u8 flags = 0; - - if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y)) - flags |= 1 << (COLLISION_OUTSIDE_RANGE - 1); - if (MapGridGetCollisionAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction) || (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction))) - flags |= 1 << (COLLISION_IMPASSABLE - 1); - if (IsElevationMismatchAt(objectEvent->currentElevation, x, y)) - flags |= 1 << (COLLISION_ELEVATION_MISMATCH - 1); - if (DoesObjectCollideWithObjectAt(objectEvent, x, y)) - flags |= 1 << (COLLISION_OBJECT_EVENT - 1); - return flags; -} - -static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *objectEvent, s16 x, s16 y) -{ - s16 left; - s16 right; - s16 top; - s16 bottom; - - if (objectEvent->rangeX != 0) - { - left = objectEvent->initialCoords.x - objectEvent->rangeX; - right = objectEvent->initialCoords.x + objectEvent->rangeX; - - if (left > x || right < x) - return TRUE; - } - if (objectEvent->rangeY != 0) - { - top = objectEvent->initialCoords.y - objectEvent->rangeY; - bottom = objectEvent->initialCoords.y + objectEvent->rangeY; - - if (top > y || bottom < y) - return TRUE; - } - return FALSE; -} - -static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) -{ - if (gOppositeDirectionBlockedMetatileFuncs[direction - 1](objectEvent->currentMetatileBehavior) - || gDirectionBlockedMetatileFuncs[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) - return TRUE; - - return FALSE; -} - -static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16 x, s16 y) -{ - u8 i; - struct ObjectEvent *curObject; - - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - curObject = &gObjectEvents[i]; - if (curObject->active && curObject != objectEvent) - { - // check for collision if curObject is active, not the object in question, and not exempt from collisions - if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y)) - { - if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation)) - return TRUE; - } - } - } - return FALSE; -} - -bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 objectEventId; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) - && gSprites[gObjectEvents[objectEventId].spriteId].sBerryTreeFlags & BERRY_FLAG_SPARKLING) - return TRUE; - - return FALSE; -} - -void SetBerryTreeJustPicked(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 objectEventId; - - if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) - gSprites[gObjectEvents[objectEventId].spriteId].sBerryTreeFlags |= BERRY_FLAG_JUST_PICKED; -} - -#undef sTimer -#undef sBerryTreeFlags - -void MoveCoords(u8 direction, s16 *x, s16 *y) -{ - *x += sDirectionToVectors[direction].x; - *y += sDirectionToVectors[direction].y; -} - -// Unused -static void MoveCoordsInMapCoordIncrement(u8 direction, s16 *x, s16 *y) -{ - *x += sDirectionToVectors[direction].x << 4; - *y += sDirectionToVectors[direction].y << 4; -} - -static void MoveCoordsInDirection(u32 dir, s16 *x, s16 *y, s16 deltaX, s16 deltaY) -{ - u8 direction = dir; - s16 dx2 = (u16)deltaX; - s16 dy2 = (u16)deltaY; - if (sDirectionToVectors[direction].x > 0) - *x += dx2; - if (sDirectionToVectors[direction].x < 0) - *x -= dx2; - if (sDirectionToVectors[direction].y > 0) - *y += dy2; - if (sDirectionToVectors[direction].y < 0) - *y -= dy2; -} - -void GetMapCoordsFromSpritePos(s16 x, s16 y, s16 *destX, s16 *destY) -{ - *destX = (x - gSaveBlock1Ptr->pos.x) << 4; - *destY = (y - gSaveBlock1Ptr->pos.y) << 4; - *destX -= gTotalCameraPixelOffsetX; - *destY -= gTotalCameraPixelOffsetY; -} - -void SetSpritePosToMapCoords(s16 mapX, s16 mapY, s16 *destX, s16 *destY) -{ - s16 dx = -gTotalCameraPixelOffsetX - gFieldCamera.x; - s16 dy = -gTotalCameraPixelOffsetY - gFieldCamera.y; - if (gFieldCamera.x > 0) - dx += 16; - - if (gFieldCamera.x < 0) - dx -= 16; - - if (gFieldCamera.y > 0) - dy += 16; - - if (gFieldCamera.y < 0) - dy -= 16; - - *destX = ((mapX - gSaveBlock1Ptr->pos.x) << 4) + dx; - *destY = ((mapY - gSaveBlock1Ptr->pos.y) << 4) + dy; -} - -void SetSpritePosToOffsetMapCoords(s16 *x, s16 *y, s16 dx, s16 dy) -{ - SetSpritePosToMapCoords(*x, *y, x, y); - *x += dx; - *y += dy; -} - -static void GetObjectEventMovingCameraOffset(s16 *x, s16 *y) -{ - *x = 0; - *y = 0; - - if (gFieldCamera.x > 0) - (*x)++; - - if (gFieldCamera.x < 0) - (*x)--; - - if (gFieldCamera.y > 0) - (*y)++; - - if (gFieldCamera.y < 0) - (*y)--; -} - -void ObjectEventMoveDestCoords(struct ObjectEvent *objectEvent, u32 direction, s16 *x, s16 *y) -{ - u8 newDirn = direction; - *x = objectEvent->currentCoords.x; - *y = objectEvent->currentCoords.y; - MoveCoords(newDirn, x, y); -} - -bool8 ObjectEventIsMovementOverridden(struct ObjectEvent *objectEvent) -{ - if (objectEvent->singleMovementActive || objectEvent->heldMovementActive) - return TRUE; - - return FALSE; -} - -bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent) -{ - if (objectEvent->heldMovementActive && objectEvent->movementActionId != MOVEMENT_ACTION_NONE) - return TRUE; - - return FALSE; -} - -static u8 TryUpdateMovementActionOnStairs(struct ObjectEvent *objectEvent, u8 movementActionId) -{ - #if FOLLOW_ME_IMPLEMENTED - if (objectEvent->isPlayer || objectEvent->localId == GetFollowerLocalId()) - return movementActionId; //handled separately - #else - if (objectEvent->isPlayer) - return movementActionId; //handled separately - #endif - - if (!ObjectMovingOnRockStairs(objectEvent, objectEvent->movementDirection)) - return movementActionId; - - switch (movementActionId) - { - case MOVEMENT_ACTION_WALK_NORMAL_DOWN: - return MOVEMENT_ACTION_WALK_SLOW_DOWN; - case MOVEMENT_ACTION_WALK_NORMAL_UP: - return MOVEMENT_ACTION_WALK_SLOW_UP; - case MOVEMENT_ACTION_WALK_NORMAL_LEFT: - return MOVEMENT_ACTION_WALK_SLOW_LEFT; - case MOVEMENT_ACTION_WALK_NORMAL_RIGHT: - return MOVEMENT_ACTION_WALK_SLOW_RIGHT; - default: - return movementActionId; - } -} - -bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId) -{ - if (ObjectEventIsMovementOverridden(objectEvent)) - return TRUE; - - movementActionId = TryUpdateMovementActionOnStairs(objectEvent, movementActionId); - - UnfreezeObjectEvent(objectEvent); - objectEvent->movementActionId = movementActionId; - objectEvent->heldMovementActive = TRUE; - objectEvent->heldMovementFinished = FALSE; - gSprites[objectEvent->spriteId].sActionFuncId = 0; - return FALSE; -} - -void ObjectEventForceSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementActionId) -{ - movementActionId = TryUpdateMovementActionOnStairs(objectEvent, movementActionId); - ObjectEventClearHeldMovementIfActive(objectEvent); - ObjectEventSetHeldMovement(objectEvent, movementActionId); -} - -void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *objectEvent) -{ - if (objectEvent->heldMovementActive) - ObjectEventClearHeldMovement(objectEvent); -} - -void ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent) -{ - objectEvent->movementActionId = MOVEMENT_ACTION_NONE; - objectEvent->heldMovementActive = FALSE; - objectEvent->heldMovementFinished = FALSE; - gSprites[objectEvent->spriteId].sTypeFuncId = 0; - gSprites[objectEvent->spriteId].sActionFuncId = 0; -} - -u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent) -{ - if (objectEvent->heldMovementActive) - return objectEvent->heldMovementFinished; - - return 16; -} - -u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *objectEvent) -{ - u8 heldMovementStatus = ObjectEventCheckHeldMovementStatus(objectEvent); - if (heldMovementStatus != 0 && heldMovementStatus != 16) - ObjectEventClearHeldMovementIfActive(objectEvent); - - return heldMovementStatus; -} - -u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent) -{ - if (objectEvent->heldMovementActive) - return TryUpdateMovementActionOnStairs(objectEvent, objectEvent->movementActionId); - - return MOVEMENT_ACTION_NONE; -} - -void UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 (*callback)(struct ObjectEvent *, struct Sprite *)) -{ - DoGroundEffects_OnSpawn(objectEvent, sprite); - TryEnableObjectEventAnim(objectEvent, sprite); - - if (ObjectEventIsHeldMovementActive(objectEvent)) - ObjectEventExecHeldMovementAction(objectEvent, sprite); - else if (!objectEvent->frozen) - while (callback(objectEvent, sprite)); - - DoGroundEffects_OnBeginStep(objectEvent, sprite); - DoGroundEffects_OnFinishStep(objectEvent, sprite); - UpdateObjectEventSpriteAnimPause(objectEvent, sprite); - UpdateObjectEventVisibility(objectEvent, sprite); - ObjectEventUpdateSubpriority(objectEvent, sprite); -} - -#define dirn_to_anim(name, table)\ -u8 name(u32 idx)\ -{\ - u8 direction;\ - u8 animIds[sizeof(table)];\ - direction = idx;\ - memcpy(animIds, (table), sizeof(table));\ - if (direction > sizeof(table)) direction = 0;\ - return animIds[direction];\ -} - -dirn_to_anim(GetFaceDirectionMovementAction, gFaceDirectionMovementActions); -dirn_to_anim(GetWalkSlowMovementAction, gWalkSlowMovementActions); -dirn_to_anim(GetPlayerRunSlowMovementAction, gRunSlowMovementActions); -dirn_to_anim(GetWalkNormalMovementAction, gWalkNormalMovementActions); -dirn_to_anim(GetWalkFastMovementAction, gWalkFastMovementActions); -dirn_to_anim(GetRideWaterCurrentMovementAction, gRideWaterCurrentMovementActions); -dirn_to_anim(GetWalkFasterMovementAction, gWalkFasterMovementActions); -dirn_to_anim(GetSlideMovementAction, gSlideMovementActions); -dirn_to_anim(GetPlayerRunMovementAction, gPlayerRunMovementActions); -dirn_to_anim(GetJump2MovementAction, gJump2MovementActions); -dirn_to_anim(GetJumpInPlaceMovementAction, gJumpInPlaceMovementActions); -dirn_to_anim(GetJumpInPlaceTurnAroundMovementAction, gJumpInPlaceTurnAroundMovementActions); -dirn_to_anim(GetJumpMovementAction, gJumpMovementActions); -dirn_to_anim(GetJumpSpecialMovementAction, gJumpSpecialMovementActions); -dirn_to_anim(GetWalkInPlaceSlowMovementAction, gWalkInPlaceSlowMovementActions); -dirn_to_anim(GetWalkInPlaceNormalMovementAction, gWalkInPlaceNormalMovementActions); -dirn_to_anim(GetWalkInPlaceFastMovementAction, gWalkInPlaceFastMovementActions); -dirn_to_anim(GetWalkInPlaceFasterMovementAction, gWalkInPlaceFasterMovementActions); - -bool8 ObjectEventFaceOppositeDirection(struct ObjectEvent *objectEvent, u8 direction) -{ - return ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetOppositeDirection(direction))); -} - -dirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, gAcroWheelieFaceDirectionMovementActions); -dirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, gAcroPopWheelieFaceDirectionMovementActions); -dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, gAcroEndWheelieFaceDirectionMovementActions); -dirn_to_anim(GetAcroWheelieHopFaceDirectionMovementAction, gAcroWheelieHopFaceDirectionMovementActions); -dirn_to_anim(GetAcroWheelieHopDirectionMovementAction, gAcroWheelieHopDirectionMovementActions); -dirn_to_anim(GetAcroWheelieJumpDirectionMovementAction, gAcroWheelieJumpDirectionMovementActions); -dirn_to_anim(GetAcroWheelieInPlaceDirectionMovementAction, gAcroWheelieInPlaceDirectionMovementActions); -dirn_to_anim(GetAcroPopWheelieMoveDirectionMovementAction, gAcroPopWheelieMoveDirectionMovementActions); -dirn_to_anim(GetAcroWheelieMoveDirectionMovementAction, gAcroWheelieMoveDirectionMovementActions); -dirn_to_anim(GetAcroEndWheelieMoveDirectionMovementAction, gAcroEndWheelieMoveDirectionMovementActions); - -u8 GetOppositeDirection(u8 direction) -{ - u8 directions[sizeof sOppositeDirections]; - - memcpy(directions, sOppositeDirections, sizeof sOppositeDirections); - if (direction <= DIR_NONE || direction > (sizeof sOppositeDirections)) - return direction; - - return directions[direction - 1]; -} - -// Takes the player's original and current direction and gives a direction the copy NPC should consider as the player's direction. -// See comments at the table's definition. -static u32 GetPlayerDirectionForCopy(u8 initDir, u8 moveDir) -{ - return sPlayerDirectionsForCopy[initDir - 1][moveDir - 1]; -} - -// copyInitDir is the initial facing direction of the copying NPC. -// playerInitDir is the direction the player was facing when the copying NPC was spawned, as set by MovementType_CopyPlayer_Step0. -// playerMoveDir is the direction the player is currently moving. -static u32 GetCopyDirection(u8 copyInitDir, u32 playerInitDir, u32 playerMoveDir) -{ - u32 dir; - u8 _playerInitDir = playerInitDir; - u8 _playerMoveDir = playerMoveDir; - if (_playerInitDir == DIR_NONE || _playerMoveDir == DIR_NONE - || _playerInitDir > DIR_EAST || _playerMoveDir > DIR_EAST) - return DIR_NONE; - - dir = GetPlayerDirectionForCopy(_playerInitDir, playerMoveDir); - return sPlayerDirectionToCopyDirection[copyInitDir - 1][dir - 1]; -} - -static void ObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->movementActionId = TryUpdateMovementActionOnStairs(objectEvent, objectEvent->movementActionId); - if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) - objectEvent->heldMovementFinished = TRUE; -} - -static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->movementActionId = TryUpdateMovementActionOnStairs(objectEvent, objectEvent->movementActionId); - if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) - { - objectEvent->movementActionId = MOVEMENT_ACTION_NONE; - sprite->sActionFuncId = 0; - return TRUE; - } - return FALSE; -} - -static void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animId) -{ - objectEvent->movementActionId = TryUpdateMovementActionOnStairs(objectEvent, animId); - sprite->sActionFuncId = 0; -} - -static void FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) -{ - SetObjectEventDirection(objectEvent, direction); - ShiftStillObjectEventCoords(objectEvent); - SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); - sprite->animPaused = TRUE; - sprite->sActionFuncId = 1; -} - -bool8 MovementAction_FaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - FaceDirection(objectEvent, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 MovementAction_FaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - FaceDirection(objectEvent, sprite, DIR_NORTH); - return TRUE; -} - -bool8 MovementAction_FaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - FaceDirection(objectEvent, sprite, DIR_WEST); - return TRUE; -} - -bool8 MovementAction_FaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - FaceDirection(objectEvent, sprite, DIR_EAST); - return TRUE; -} - -void InitNpcForMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) -{ - s16 x; - s16 y; - - x = objectEvent->currentCoords.x; - y = objectEvent->currentCoords.y; - SetObjectEventDirection(objectEvent, direction); - MoveCoords(direction, &x, &y); - ShiftObjectEventCoords(objectEvent, x, y); - SetSpriteDataForNormalStep(sprite, direction, speed); - sprite->animPaused = FALSE; - - if (sLockedAnimObjectEvents != NULL && FindLockedObjectEventIndex(objectEvent) != OBJECT_EVENTS_COUNT) - sprite->animPaused = TRUE; - - objectEvent->triggerGroundEffectsOnMove = TRUE; - sprite->sActionFuncId = 1; -} - -static void InitMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) -{ - u8 (*functions[ARRAY_COUNT(sDirectionAnimFuncsBySpeed)])(u8); - - memcpy(functions, sDirectionAnimFuncsBySpeed, sizeof sDirectionAnimFuncsBySpeed); - InitNpcForMovement(objectEvent, sprite, direction, speed); - SetStepAnimHandleAlternation(objectEvent, sprite, functions[speed](objectEvent->facingDirection)); -} - -static void StartRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) -{ - InitNpcForMovement(objectEvent, sprite, direction, MOVE_SPEED_FAST_1); - SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection)); -} - -static bool8 UpdateMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (NpcTakeStep(sprite)) - { - ShiftStillObjectEventCoords(objectEvent); - objectEvent->triggerGroundEffectsOnStop = TRUE; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -static void InitNpcForWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) -{ - s16 x; - s16 y; - - x = objectEvent->currentCoords.x; - y = objectEvent->currentCoords.y; - SetObjectEventDirection(objectEvent, direction); - MoveCoords(direction, &x, &y); - ShiftObjectEventCoords(objectEvent, x, y); - SetWalkSlowSpriteData(sprite, direction); - sprite->animPaused = FALSE; - objectEvent->triggerGroundEffectsOnMove = TRUE; - sprite->sActionFuncId = 1; -} - -static void InitWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) -{ - InitNpcForWalkSlow(objectEvent, sprite, direction); - SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); -} - -static bool8 UpdateWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlowAnim(sprite)) - { - ShiftStillObjectEventCoords(objectEvent); - objectEvent->triggerGroundEffectsOnStop = TRUE; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_NORTHWEST); - return MovementAction_WalkSlowDiagonalUpLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowDiagonalUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_NORTHEAST); - return MovementAction_WalkSlowDiagonalUpRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowDiagonalUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_SOUTHWEST); - return MovementAction_WalkSlowDiagonalDownLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowDiagonalDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_SOUTHEAST); - return MovementAction_WalkSlowDiagonalDownRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowDiagonalDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_SOUTH); - return MovementAction_WalkSlowDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_NORTH); - return MovementAction_WalkSlowUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitWalkSlow(objectEvent, sprite, objectEvent->directionOverwrite); - else - InitWalkSlow(objectEvent, sprite, DIR_WEST); - return MovementAction_WalkSlowLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitWalkSlow(objectEvent, sprite, objectEvent->directionOverwrite); - else - InitWalkSlow(objectEvent, sprite, DIR_EAST); - return MovementAction_WalkSlowRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkSlowRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_NORTHWEST, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalDiagonalUpLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalDiagonalUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_NORTHEAST, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalDiagonalUpRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalDiagonalUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_SOUTHWEST, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalDiagonalDownLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalDiagonalDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_SOUTHEAST, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalDiagonalDownRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_NORMAL); - else - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_NORMAL); - else - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL); - return MovementAction_WalkNormalRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkNormalRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -#define JUMP_HALFWAY 1 -#define JUMP_FINISHED ((u8)-1) - -enum { - JUMP_TYPE_HIGH, - JUMP_TYPE_LOW, - JUMP_TYPE_NORMAL, -}; - -static void InitJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type) -{ - s16 displacements[ARRAY_COUNT(sJumpInitDisplacements)]; - s16 x; - s16 y; - - memcpy(displacements, sJumpInitDisplacements, sizeof sJumpInitDisplacements); - x = 0; - y = 0; - SetObjectEventDirection(objectEvent, direction); - MoveCoordsInDirection(direction, &x, &y, displacements[distance], displacements[distance]); - ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y); - SetJumpSpriteData(sprite, direction, distance, type); - sprite->sActionFuncId = 1; - sprite->animPaused = FALSE; - objectEvent->triggerGroundEffectsOnMove = TRUE; - objectEvent->disableCoveringGroundEffects = TRUE; -} - -static void InitJumpRegular(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type) -{ - InitJump(objectEvent, sprite, direction, distance, type); - SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); - DoShadowFieldEffect(objectEvent); -} - -#define sDistance data[4] - -static u8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 callback(struct Sprite *)) -{ - s16 displacements[ARRAY_COUNT(sJumpDisplacements)]; - s16 x; - s16 y; - u8 result; - - memcpy(displacements, sJumpDisplacements, sizeof sJumpDisplacements); - result = callback(sprite); - if (result == JUMP_HALFWAY && displacements[sprite->sDistance] != 0) - { - x = 0; - y = 0; - MoveCoordsInDirection(objectEvent->movementDirection, &x, &y, displacements[sprite->sDistance], displacements[sprite->sDistance]); - ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y); - objectEvent->triggerGroundEffectsOnMove = TRUE; - objectEvent->disableCoveringGroundEffects = TRUE; - } - else if (result == JUMP_FINISHED) - { - ShiftStillObjectEventCoords(objectEvent); - objectEvent->triggerGroundEffectsOnStop = TRUE; - objectEvent->landingJump = TRUE; - sprite->animPaused = TRUE; - } - return result; -} - -#undef sDistance - -static u8 DoJumpAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - return UpdateJumpAnim(objectEvent, sprite, DoJumpSpriteMovement); -} - -static u8 DoJumpSpecialAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - return UpdateJumpAnim(objectEvent, sprite, DoJumpSpecialSpriteMovement); -} - -static bool8 DoJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnimStep(objectEvent, sprite) == JUMP_FINISHED) - return TRUE; - - return FALSE; -} - -static bool8 DoJumpSpecialAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpSpecialAnimStep(objectEvent, sprite) == JUMP_FINISHED) - return TRUE; - - return FALSE; -} - -static bool8 DoJumpInPlaceAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - switch (DoJumpAnimStep(objectEvent, sprite)) - { - case JUMP_FINISHED: - return TRUE; - case JUMP_HALFWAY: - SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection)); - SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); - default: - return FALSE; - } -} - -bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_Jump2Down_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_Jump2Up_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_Jump2Left_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_Jump2Right_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -static void InitMovementDelay(struct Sprite *sprite, u16 duration) -{ - sprite->sActionFuncId = 1; - sprite->data[3] = duration; -} - -bool8 MovementAction_Delay_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (--sprite->data[3] == 0) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_Delay1_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementDelay(sprite, 1); - return MovementAction_Delay_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Delay2_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementDelay(sprite, 2); - return MovementAction_Delay_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Delay4_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementDelay(sprite, 4); - return MovementAction_Delay_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Delay8_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementDelay(sprite, 8); - return MovementAction_Delay_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Delay16_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementDelay(sprite, 16); - return MovementAction_Delay_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1); - return MovementAction_WalkFastDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1); - return MovementAction_WalkFastUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_1); - else - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); - return MovementAction_WalkFastLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_1); - else - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); - return MovementAction_WalkFastRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFastRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - - -static void InitMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration) -{ - SetObjectEventDirection(objectEvent, direction); - SetStepAnimHandleAlternation(objectEvent, sprite, animNum); - sprite->animPaused = FALSE; - sprite->sActionFuncId = 1; - sprite->data[3] = duration; -} - -bool8 MovementAction_WalkInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (-- sprite->data[3] == 0) - { - sprite->sActionFuncId = 2; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkInPlaceSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (sprite->data[3] & 1) - sprite->animDelayCounter++; - - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 32); - return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); - return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 32); - return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 32); - return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 16); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 16); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 16); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 16); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastAnimNum(DIR_SOUTH), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFastAnimNum(DIR_NORTH), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFastAnimNum(DIR_WEST), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFastAnimNum(DIR_EAST), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFasterDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFasterAnimNum(DIR_SOUTH), 4); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFasterUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFasterAnimNum(DIR_NORTH), 4); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); - else - InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkInPlaceFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); - else - InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RideWaterCurrentDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_2); - return MovementAction_RideWaterCurrentDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_RideWaterCurrentUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_2); - return MovementAction_RideWaterCurrentUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_2); - else - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_2); - return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FAST_2); - else - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_2); - return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RideWaterCurrentRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkFasterDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FASTER); - return MovementAction_WalkFasterDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFasterDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkFasterUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FASTER); - return MovementAction_WalkFasterUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFasterUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkFasterLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTER); - else - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTER); - return MovementAction_WalkFasterLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFasterLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkFasterRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTER); - else - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTER); - return MovementAction_WalkFasterRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkFasterRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_SlideDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FASTEST); - return MovementAction_SlideDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_SlideDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_SlideUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FASTEST); - return MovementAction_SlideUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTEST); - else - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FASTEST); - return MovementAction_SlideLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMovementNormal(objectEvent, sprite, objectEvent->directionOverwrite, MOVE_SPEED_FASTEST); - else - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FASTEST); - return MovementAction_SlideRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_SlideRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_PlayerRunDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartRunningAnim(objectEvent, sprite, DIR_SOUTH); - return MovementAction_PlayerRunDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_PlayerRunDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_PlayerRunUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartRunningAnim(objectEvent, sprite, DIR_NORTH); - return MovementAction_PlayerRunUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - StartRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); - else - StartRunningAnim(objectEvent, sprite, DIR_WEST); - return MovementAction_PlayerRunLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - StartRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); - else - StartRunningAnim(objectEvent, sprite, DIR_EAST); - return MovementAction_PlayerRunRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_PlayerRunRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -void StartSpriteAnimInDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum) -{ - SetAndStartSpriteAnim(sprite, animNum, 0); - SetObjectEventDirection(objectEvent, direction); - sprite->sActionFuncId = 1; -} - -bool8 MovementAction_StartAnimInDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, objectEvent->movementDirection, sprite->animNum); - return FALSE; -} - -bool8 MovementAction_WaitSpriteAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (SpriteAnimEnded(sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -static void InitJumpSpecial(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) -{ - InitJump(objectEvent, sprite, direction, JUMP_DISTANCE_NORMAL, JUMP_TYPE_HIGH); - StartSpriteAnim(sprite, GetJumpSpecialDirectionAnimNum(direction)); -} - -bool8 MovementAction_JumpSpecialDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpSpecial(objectEvent, sprite, DIR_SOUTH); - return MovementAction_JumpSpecialDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpSpecialAnim(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - objectEvent->landingJump = FALSE; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpSpecialUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpSpecial(objectEvent, sprite, DIR_NORTH); - return MovementAction_JumpSpecialUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpSpecialAnim(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - objectEvent->landingJump = FALSE; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpSpecialLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpSpecial(objectEvent, sprite, DIR_WEST); - return MovementAction_JumpSpecialLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpSpecialAnim(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - objectEvent->landingJump = FALSE; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpSpecialRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpSpecial(objectEvent, sprite, DIR_EAST); - return MovementAction_JumpSpecialRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpSpecialAnim(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - objectEvent->landingJump = FALSE; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_FacePlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 playerObjectId; - - if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId)) - FaceDirection(objectEvent, sprite, GetDirectionToFace(objectEvent->currentCoords.x, - objectEvent->currentCoords.y, - gObjectEvents[playerObjectId].currentCoords.x, - gObjectEvents[playerObjectId].currentCoords.y)); - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_FaceAwayPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u8 playerObjectId; - - if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId)) - FaceDirection(objectEvent, sprite, GetOppositeDirection(GetDirectionToFace(objectEvent->currentCoords.x, - objectEvent->currentCoords.y, - gObjectEvents[playerObjectId].currentCoords.x, - gObjectEvents[playerObjectId].currentCoords.y))); - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_LockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirectionLocked = TRUE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_UnlockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirectionLocked = FALSE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_JumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); - return MovementAction_JumpDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); - return MovementAction_JumpUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); - return MovementAction_JumpLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_NORMAL); - return MovementAction_JumpRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); - return MovementAction_JumpInPlaceDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); - return MovementAction_JumpInPlaceUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); - return MovementAction_JumpInPlaceLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_HIGH); - return MovementAction_JumpInPlaceRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceDownUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); - return MovementAction_JumpInPlaceDownUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpInPlaceAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceUpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); - return MovementAction_JumpInPlaceUpDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpInPlaceAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); - return MovementAction_JumpInPlaceLeftRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpInPlaceAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_NORMAL); - return MovementAction_JumpInPlaceRightLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpInPlaceAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = 0; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_FaceOriginalDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - FaceDirection(objectEvent, sprite, gInitialMovementTypeFacingDirections[objectEvent->movementType]); - return TRUE; -} - -bool8 MovementAction_NurseJoyBowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, ANIM_NURSE_BOW); - return FALSE; -} - -bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->disableJumpLandingGroundEffect = FALSE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->disableJumpLandingGroundEffect = TRUE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_DisableAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->inanimate = TRUE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_RestoreAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->inanimate = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->inanimate; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_SetInvisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->invisible = TRUE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_SetVisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->invisible = FALSE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_EmoteExclamationMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_QUESTION_MARK_ICON); - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_EmoteHeart_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_HEART_ICON); - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->movementType == MOVEMENT_TYPE_BURIED) - { - SetBuriedTrainerMovement(objectEvent); - return FALSE; - } - if (objectEvent->movementType != MOVEMENT_TYPE_TREE_DISGUISE && objectEvent->movementType != MOVEMENT_TYPE_MOUNTAIN_DISGUISE) - { - sprite->sActionFuncId = 2; - return TRUE; - } - StartRevealDisguise(objectEvent); - sprite->sActionFuncId = 1; - return MovementAction_RevealTrainer_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateRevealDisguise(objectEvent)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_RockSmashBreak_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0); - sprite->sActionFuncId = 1; - return FALSE; -} - -bool8 MovementAction_RockSmashBreak_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (SpriteAnimEnded(sprite)) - { - SetMovementDelay(sprite, 32); - sprite->sActionFuncId = 2; - } - return FALSE; -} - -bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->invisible ^= TRUE; - if (WaitForMovementDelay(sprite)) - { - objectEvent->invisible = TRUE; - sprite->sActionFuncId = 3; - } - return FALSE; -} - -bool8 MovementAction_CutTree_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - SetAndStartSpriteAnim(sprite, ANIM_REMOVE_OBSTACLE, 0); - sprite->sActionFuncId = 1; - return FALSE; -} - -bool8 MovementAction_CutTree_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (SpriteAnimEnded(sprite)) - { - SetMovementDelay(sprite, 32); - sprite->sActionFuncId = 2; - } - return FALSE; -} - -bool8 MovementAction_CutTree_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->invisible ^= TRUE; - if (WaitForMovementDelay(sprite)) - { - objectEvent->invisible = TRUE; - sprite->sActionFuncId = 3; - } - return FALSE; -} - -bool8 MovementAction_SetFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->fixedPriority = TRUE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_ClearFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->fixedPriority = FALSE; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_InitAffineAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; - InitSpriteAffineAnim(sprite); - sprite->affineAnimPaused = TRUE; - sprite->subspriteMode = SUBSPRITES_OFF; - return TRUE; -} - -bool8 MovementAction_ClearAffineAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - return TRUE; -} - -bool8 MovementAction_HideReflection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->hideReflection = TRUE; - return TRUE; -} - -bool8 MovementAction_ShowReflection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->hideReflection = FALSE; - return TRUE; -} - -bool8 MovementAction_WalkDownStartAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_SOUTH); - sprite->affineAnimPaused = FALSE; - StartSpriteAffineAnimIfDifferent(sprite, 0); - return MovementAction_WalkDownStartAffine_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkDownStartAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->affineAnimPaused = TRUE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkDownAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitWalkSlow(objectEvent, sprite, DIR_SOUTH); - sprite->affineAnimPaused = FALSE; - ChangeSpriteAffineAnimIfDifferent(sprite, 1); - return MovementAction_WalkDownAffine_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkDownAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateWalkSlow(objectEvent, sprite)) - { - sprite->affineAnimPaused = TRUE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkLeftAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); - sprite->affineAnimPaused = FALSE; - ChangeSpriteAffineAnimIfDifferent(sprite, 2); - return MovementAction_WalkLeftAffine_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkLeftAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->affineAnimPaused = TRUE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_WalkRightAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); - sprite->affineAnimPaused = FALSE; - ChangeSpriteAffineAnimIfDifferent(sprite, 3); - return MovementAction_WalkRightAffine_Step1(objectEvent, sprite); -} - -bool8 MovementAction_WalkRightAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->affineAnimPaused = TRUE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -static void AcroWheelieFaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) -{ - SetObjectEventDirection(objectEvent, direction); - ShiftStillObjectEventCoords(objectEvent); - SetStepAnim(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(direction)); - sprite->animPaused = TRUE; - sprite->sActionFuncId = 1; -} - -bool8 MovementAction_AcroWheelieFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - AcroWheelieFaceDirection(objectEvent, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 MovementAction_AcroWheelieFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - AcroWheelieFaceDirection(objectEvent, sprite, DIR_NORTH); - return TRUE; -} - -bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - AcroWheelieFaceDirection(objectEvent, sprite, DIR_WEST); - return TRUE; -} - -bool8 MovementAction_AcroWheelieFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - AcroWheelieFaceDirection(objectEvent, sprite, DIR_EAST); - return TRUE; -} - -bool8 MovementAction_AcroPopWheelieDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroWheelieDirectionAnimNum(DIR_SOUTH)); - return FALSE; -} - -bool8 MovementAction_AcroPopWheelieUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroWheelieDirectionAnimNum(DIR_NORTH)); - return FALSE; -} - -bool8 MovementAction_AcroPopWheelieLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroWheelieDirectionAnimNum(DIR_WEST)); - return FALSE; -} - -bool8 MovementAction_AcroPopWheelieRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroWheelieDirectionAnimNum(DIR_EAST)); - return FALSE; -} - -bool8 MovementAction_AcroEndWheelieFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroEndWheelieDirectionAnimNum(DIR_SOUTH)); - return FALSE; -} - -bool8 MovementAction_AcroEndWheelieFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroEndWheelieDirectionAnimNum(DIR_NORTH)); - return FALSE; -} - -bool8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroEndWheelieDirectionAnimNum(DIR_WEST)); - return FALSE; -} - -bool8 MovementAction_AcroEndWheelieFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroEndWheelieDirectionAnimNum(DIR_EAST)); - return FALSE; -} - -bool8 MovementAction_UnusedAcroActionDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_SOUTH, GetAcroUnusedActionDirectionAnimNum(DIR_SOUTH)); - return FALSE; -} - -bool8 MovementAction_UnusedAcroActionUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_NORTH, GetAcroUnusedActionDirectionAnimNum(DIR_NORTH)); - return FALSE; -} - -bool8 MovementAction_UnusedAcroActionLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_WEST, GetAcroUnusedActionDirectionAnimNum(DIR_WEST)); - return FALSE; -} - -bool8 MovementAction_UnusedAcroActionRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSpriteAnimInDirection(objectEvent, sprite, DIR_EAST, GetAcroUnusedActionDirectionAnimNum(DIR_EAST)); - return FALSE; -} - -void InitFigure8Anim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitSpriteForFigure8Anim(sprite); - sprite->animPaused = FALSE; -} - -bool8 DoFigure8Anim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (AnimateSpriteInFigure8(sprite)) - { - ShiftStillObjectEventCoords(objectEvent); - objectEvent->triggerGroundEffectsOnStop = TRUE; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_Figure8_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitFigure8Anim(objectEvent, sprite); - sprite->sActionFuncId = 1; - return MovementAction_Figure8_Step1(objectEvent, sprite); -} - -bool8 MovementAction_Figure8_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoFigure8Anim(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -static void InitAcroWheelieJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 distance, u8 type) -{ - InitJump(objectEvent, sprite, direction, distance, type); - StartSpriteAnimIfDifferent(sprite, GetAcroWheelieDirectionAnimNum(direction)); - DoShadowFieldEffect(objectEvent); -} - -bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopFaceDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopFaceUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopFaceLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_IN_PLACE, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopFaceRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieHopDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieHopUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); - else - InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); - else - InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_NORMAL, JUMP_TYPE_LOW); - return MovementAction_AcroWheelieHopRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieJumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_AcroWheelieJumpDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieJumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_AcroWheelieJumpUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - else - InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_AcroWheelieJumpLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroWheelieJump(objectEvent, sprite, objectEvent->directionOverwrite, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - else - InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); - return MovementAction_AcroWheelieJumpRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (DoJumpAnim(objectEvent, sprite)) - { - objectEvent->hasShadow = FALSE; - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->directionOverwrite), 8); - else - InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitMoveInPlace(objectEvent, sprite, objectEvent->directionOverwrite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->directionOverwrite), 8); - else - InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); - return MovementAction_WalkInPlace_Step1(objectEvent, sprite); -} - -static void InitAcroPopWheelie(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) -{ - InitNpcForMovement(objectEvent, sprite, direction, speed); - StartSpriteAnim(sprite, GetAcroWheelieDirectionAnimNum(objectEvent->facingDirection)); - SeekSpriteAnim(sprite, 0); -} - -bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroPopWheelie(objectEvent, sprite, DIR_SOUTH, 1); - return MovementAction_AcroPopWheelieMoveDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroPopWheelie(objectEvent, sprite, DIR_NORTH, 1); - return MovementAction_AcroPopWheelieMoveUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroPopWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); - else - InitAcroPopWheelie(objectEvent, sprite, DIR_WEST, 1); - return MovementAction_AcroPopWheelieMoveLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroPopWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); - else - InitAcroPopWheelie(objectEvent, sprite, DIR_EAST, 1); - return MovementAction_AcroPopWheelieMoveRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -static void InitAcroWheelieMove(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) -{ - InitNpcForMovement(objectEvent, sprite, direction, speed); - SetStepAnimHandleAlternation(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->facingDirection)); -} - -bool8 MovementAction_AcroWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieMove(objectEvent, sprite, DIR_SOUTH, 1); - return MovementAction_AcroWheelieMoveDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroWheelieMove(objectEvent, sprite, DIR_NORTH, 1); - return MovementAction_AcroWheelieMoveUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroWheelieMove(objectEvent, sprite, objectEvent->directionOverwrite, 1); - else - InitAcroWheelieMove(objectEvent, sprite, DIR_WEST, 1); - return MovementAction_AcroWheelieMoveLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroWheelieMove(objectEvent, sprite, objectEvent->directionOverwrite, 1); - else - InitAcroWheelieMove(objectEvent, sprite, DIR_EAST, 1); - return MovementAction_AcroWheelieMoveRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -static void InitAcroEndWheelie(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) -{ - InitNpcForMovement(objectEvent, sprite, direction, speed); - StartSpriteAnim(sprite, GetAcroEndWheelieDirectionAnimNum(objectEvent->facingDirection)); - SeekSpriteAnim(sprite, 0); -} - -bool8 MovementAction_AcroEndWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroEndWheelie(objectEvent, sprite, DIR_SOUTH, 1); - return MovementAction_AcroEndWheelieMoveDown_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroEndWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroEndWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - InitAcroEndWheelie(objectEvent, sprite, DIR_NORTH, 1); - return MovementAction_AcroEndWheelieMoveUp_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroEndWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); - else - InitAcroEndWheelie(objectEvent, sprite, DIR_WEST, 1); - return MovementAction_AcroEndWheelieMoveLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroEndWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - InitAcroEndWheelie(objectEvent, sprite, objectEvent->directionOverwrite, 1); - else - InitAcroEndWheelie(objectEvent, sprite, DIR_EAST, 1); - return MovementAction_AcroEndWheelieMoveRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroEndWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_Levitate_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - CreateLevitateMovementTask(objectEvent); - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_StopLevitate_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - DestroyLevitateMovementTask(objectEvent->warpArrowSpriteId); - sprite->y2 = 0; - sprite->sActionFuncId = 1; - return TRUE; -} - -bool8 MovementAction_StopLevitateAtTop_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (sprite->y2 == 0) - { - DestroyLevitateMovementTask(objectEvent->warpArrowSpriteId); - sprite->sActionFuncId = 1; - return TRUE; - } - return FALSE; -} - -u8 MovementAction_Finish(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - return TRUE; -} - -bool8 MovementAction_PauseSpriteAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->animPaused = TRUE; - return TRUE; -} - -static void UpdateObjectEventSpriteAnimPause(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->disableAnim) - sprite->animPaused = TRUE; -} - -static void TryEnableObjectEventAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->enableAnim) - { - sprite->animPaused = FALSE; - objectEvent->disableAnim = FALSE; - objectEvent->enableAnim = FALSE; - } -} - -static void UpdateObjectEventVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - UpdateObjectEventOffscreen(objectEvent, sprite); - UpdateObjectEventSpriteVisibility(objectEvent, sprite); -} - -static void UpdateObjectEventOffscreen(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - u16 x, y; - u16 x2, y2; - const struct ObjectEventGraphicsInfo *graphicsInfo; - - objectEvent->offScreen = FALSE; - - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - if (sprite->coordOffsetEnabled) - { - x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; - y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; - } - x2 = graphicsInfo->width; - x2 += x; - y2 = y; - y2 += graphicsInfo->height; - - if ((s16)x >= DISPLAY_WIDTH + 16 || (s16)x2 < -16) - objectEvent->offScreen = TRUE; - - if ((s16)y >= DISPLAY_HEIGHT + 16 || (s16)y2 < -16) - objectEvent->offScreen = TRUE; -} - -static void UpdateObjectEventSpriteVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->invisible = FALSE; - if (objectEvent->invisible || objectEvent->offScreen) - sprite->invisible = TRUE; -} - -static void GetAllGroundEffectFlags_OnSpawn(struct ObjectEvent *objEvent, u32 *flags) -{ - ObjectEventUpdateMetatileBehaviors(objEvent); - GetGroundEffectFlags_Reflection(objEvent, flags); - GetGroundEffectFlags_TallGrassOnSpawn(objEvent, flags); - GetGroundEffectFlags_LongGrassOnSpawn(objEvent, flags); - GetGroundEffectFlags_SandHeap(objEvent, flags); - GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags); - GetGroundEffectFlags_ShortGrass(objEvent, flags); - GetGroundEffectFlags_HotSprings(objEvent, flags); -} - -static void GetAllGroundEffectFlags_OnBeginStep(struct ObjectEvent *objEvent, u32 *flags) -{ - ObjectEventUpdateMetatileBehaviors(objEvent); - GetGroundEffectFlags_Reflection(objEvent, flags); - GetGroundEffectFlags_TallGrassOnBeginStep(objEvent, flags); - GetGroundEffectFlags_LongGrassOnBeginStep(objEvent, flags); - GetGroundEffectFlags_Tracks(objEvent, flags); - GetGroundEffectFlags_SandHeap(objEvent, flags); - GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags); - GetGroundEffectFlags_Puddle(objEvent, flags); - GetGroundEffectFlags_ShortGrass(objEvent, flags); - GetGroundEffectFlags_HotSprings(objEvent, flags); -} - -static void GetAllGroundEffectFlags_OnFinishStep(struct ObjectEvent *objEvent, u32 *flags) -{ - ObjectEventUpdateMetatileBehaviors(objEvent); - GetGroundEffectFlags_ShallowFlowingWater(objEvent, flags); - GetGroundEffectFlags_SandHeap(objEvent, flags); - GetGroundEffectFlags_Puddle(objEvent, flags); - GetGroundEffectFlags_Ripple(objEvent, flags); - GetGroundEffectFlags_ShortGrass(objEvent, flags); - GetGroundEffectFlags_HotSprings(objEvent, flags); - GetGroundEffectFlags_Seaweed(objEvent, flags); - GetGroundEffectFlags_JumpLanding(objEvent, flags); -} - -static void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent *objEvent) -{ - objEvent->previousMetatileBehavior = MapGridGetMetatileBehaviorAt(objEvent->previousCoords.x, objEvent->previousCoords.y); - objEvent->currentMetatileBehavior = MapGridGetMetatileBehaviorAt(objEvent->currentCoords.x, objEvent->currentCoords.y); -} - -static void GetGroundEffectFlags_Reflection(struct ObjectEvent *objEvent, u32 *flags) -{ - u32 reflectionFlags[NUM_REFLECTION_TYPES - 1] = { - [REFL_TYPE_ICE - 1] = GROUND_EFFECT_FLAG_ICE_REFLECTION, - [REFL_TYPE_WATER - 1] = GROUND_EFFECT_FLAG_WATER_REFLECTION - }; - u8 reflType = ObjectEventGetNearbyReflectionType(objEvent); - - if (reflType) - { - if (objEvent->hasReflection == 0) - { - objEvent->hasReflection++; - *flags |= reflectionFlags[reflType - 1]; - } - } - else - { - objEvent->hasReflection = FALSE; - } -} - -static void GetGroundEffectFlags_TallGrassOnSpawn(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(objEvent->currentMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN; -} - -static void GetGroundEffectFlags_TallGrassOnBeginStep(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsTallGrass(objEvent->currentMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE; -} - -static void GetGroundEffectFlags_LongGrassOnSpawn(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN; -} - -static void GetGroundEffectFlags_LongGrassOnBeginStep(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE; -} - -static void GetGroundEffectFlags_Tracks(struct ObjectEvent *objEvent, u32 *flags) -{ - if (objEvent->directionOverwrite) - return; - - if (MetatileBehavior_IsDeepSand(objEvent->previousMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_DEEP_SAND; - else if (MetatileBehavior_IsSandOrDeepSand(objEvent->previousMetatileBehavior) - || MetatileBehavior_IsFootprints(objEvent->previousMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_SAND; -} - -static void GetGroundEffectFlags_SandHeap(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsDeepSand(objEvent->currentMetatileBehavior) - && MetatileBehavior_IsDeepSand(objEvent->previousMetatileBehavior)) - { - if (!objEvent->inSandPile) - { - objEvent->inSandPile = FALSE; - objEvent->inSandPile = TRUE; - *flags |= GROUND_EFFECT_FLAG_SAND_PILE; - } - } - else - { - objEvent->inSandPile = FALSE; - } -} - -static void GetGroundEffectFlags_ShallowFlowingWater(struct ObjectEvent *objEvent, u32 *flags) -{ - if ((MetatileBehavior_IsShallowFlowingWater(objEvent->currentMetatileBehavior) - && MetatileBehavior_IsShallowFlowingWater(objEvent->previousMetatileBehavior)) - || (MetatileBehavior_IsPacifidlogLog(objEvent->currentMetatileBehavior) - && MetatileBehavior_IsPacifidlogLog(objEvent->previousMetatileBehavior))) - { - if (!objEvent->inShallowFlowingWater) - { - objEvent->inShallowFlowingWater = FALSE; - objEvent->inShallowFlowingWater = TRUE; - *flags |= GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER; - } - } - else - { - objEvent->inShallowFlowingWater = FALSE; - } -} - -static void GetGroundEffectFlags_Puddle(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsPuddle(objEvent->currentMetatileBehavior) - && MetatileBehavior_IsPuddle(objEvent->previousMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_PUDDLE; -} - -static void GetGroundEffectFlags_Ripple(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_HasRipples(objEvent->currentMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_RIPPLES; -} - -static void GetGroundEffectFlags_ShortGrass(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsShortGrass(objEvent->currentMetatileBehavior) - && MetatileBehavior_IsShortGrass(objEvent->previousMetatileBehavior)) - { - if (!objEvent->inShortGrass) - { - objEvent->inShortGrass = FALSE; - objEvent->inShortGrass = TRUE; - *flags |= GROUND_EFFECT_FLAG_SHORT_GRASS; - } - } - else - { - objEvent->inShortGrass = FALSE; - } -} - -static void GetGroundEffectFlags_HotSprings(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsHotSprings(objEvent->currentMetatileBehavior) - && MetatileBehavior_IsHotSprings(objEvent->previousMetatileBehavior)) - { - if (!objEvent->inHotSprings) - { - objEvent->inHotSprings = FALSE; - objEvent->inHotSprings = TRUE; - *flags |= GROUND_EFFECT_FLAG_HOT_SPRINGS; - } - } - else - { - objEvent->inHotSprings = FALSE; - } -} - -static void GetGroundEffectFlags_Seaweed(struct ObjectEvent *objEvent, u32 *flags) -{ - if (MetatileBehavior_IsSeaweed(objEvent->currentMetatileBehavior)) - *flags |= GROUND_EFFECT_FLAG_SEAWEED; -} - -static void GetGroundEffectFlags_JumpLanding(struct ObjectEvent *objEvent, u32 *flags) -{ - typedef bool8 (*MetatileFunc)(u8); - - static const MetatileFunc metatileFuncs[] = { - MetatileBehavior_IsTallGrass, - MetatileBehavior_IsLongGrass, - MetatileBehavior_IsPuddle, - MetatileBehavior_IsSurfableWaterOrUnderwater, - MetatileBehavior_IsShallowFlowingWater, - MetatileBehavior_IsATile, - }; - - static const u32 jumpLandingFlags[] = { - GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS, - GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS, - GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER, - GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER, - GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER, - GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND, - }; - - if (objEvent->landingJump && !objEvent->disableJumpLandingGroundEffect) - { - u8 i; - - for (i = 0; i < ARRAY_COUNT(metatileFuncs); i++) - { - if (metatileFuncs[i](objEvent->currentMetatileBehavior)) - { - *flags |= jumpLandingFlags[i]; - return; - } - } - } -} - -#define RETURN_REFLECTION_TYPE_AT(x, y) \ - b = MapGridGetMetatileBehaviorAt(x, y); \ - result = GetReflectionTypeByMetatileBehavior(b); \ - if (result != REFL_TYPE_NONE) \ - return result; - -static u8 ObjectEventGetNearbyReflectionType(struct ObjectEvent *objEvent) -{ - const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); - - // ceil div by tile width? - s16 width = (info->width + 8) >> 4; - s16 height = (info->height + 8) >> 4; - s16 i, j; - u8 result, b; // used by RETURN_REFLECTION_TYPE_AT - s16 one = 1; - - for (i = 0; i < height; i++) - { - RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x, objEvent->currentCoords.y + one + i) - RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x, objEvent->previousCoords.y + one + i) - for (j = 1; j < width; j++) - { - RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x + j, objEvent->currentCoords.y + one + i) - RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x - j, objEvent->currentCoords.y + one + i) - RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x + j, objEvent->previousCoords.y + one + i) - RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x - j, objEvent->previousCoords.y + one + i) - } - } - - return REFL_TYPE_NONE; -} - -#undef RETURN_REFLECTION_TYPE_AT - -static u8 GetReflectionTypeByMetatileBehavior(u32 behavior) -{ - if (MetatileBehavior_IsIce(behavior)) - return REFL_TYPE_ICE; - else if (MetatileBehavior_IsReflective(behavior)) - return REFL_TYPE_WATER; - else - return REFL_TYPE_NONE; -} - -u8 GetLedgeJumpDirection(s16 x, s16 y, u8 direction) -{ - static bool8 (*const ledgeBehaviorFuncs[])(u8) = { - [DIR_SOUTH - 1] = MetatileBehavior_IsJumpSouth, - [DIR_NORTH - 1] = MetatileBehavior_IsJumpNorth, - [DIR_WEST - 1] = MetatileBehavior_IsJumpWest, - [DIR_EAST - 1] = MetatileBehavior_IsJumpEast, - }; - - u8 behavior; - u8 index = direction; - - if (index == DIR_NONE) - return DIR_NONE; - else if (index > DIR_EAST) - index -= DIR_EAST; - - index--; - behavior = MapGridGetMetatileBehaviorAt(x, y); - - if (ledgeBehaviorFuncs[index](behavior) == TRUE) - return index + 1; - - return DIR_NONE; -} - -static void SetObjectEventSpriteOamTableForLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - if (objEvent->disableCoveringGroundEffects) - return; - - if (!MetatileBehavior_IsLongGrass(objEvent->currentMetatileBehavior)) - return; - - if (!MetatileBehavior_IsLongGrass(objEvent->previousMetatileBehavior)) - return; - - sprite->subspriteTableNum = 4; - - if (ElevationToPriority(objEvent->previousElevation) == 1) - sprite->subspriteTableNum = 5; -} - -static bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y) -{ - u8 mapElevation; - - if (elevation == 0) - return FALSE; - - mapElevation = MapGridGetElevationAt(x, y); - - if (mapElevation == 0 || mapElevation == 15) - return FALSE; - - if (mapElevation != elevation) - return TRUE; - - return FALSE; -} - -static const u8 sElevationToSubpriority[] = { - 115, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 0, 0, 115 -}; - -static const u8 sElevationToPriority[] = { - 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 -}; - -static const u8 sElevationToSubspriteTableNum[] = { - 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, -}; - -static void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - if (objEvent->fixedPriority) - return; - - ObjectEventUpdateElevation(objEvent); - - sprite->subspriteTableNum = sElevationToSubspriteTableNum[objEvent->previousElevation]; - sprite->oam.priority = sElevationToPriority[objEvent->previousElevation]; -} - -static void InitObjectPriorityByElevation(struct Sprite *sprite, u8 elevation) -{ - sprite->subspriteTableNum = sElevationToSubspriteTableNum[elevation]; - sprite->oam.priority = sElevationToPriority[elevation]; -} - -u8 ElevationToPriority(u8 elevation) -{ - return sElevationToPriority[elevation]; -} - -void ObjectEventUpdateElevation(struct ObjectEvent *objEvent) -{ - u8 curElevation = MapGridGetElevationAt(objEvent->currentCoords.x, objEvent->currentCoords.y); - u8 prevElevation = MapGridGetElevationAt(objEvent->previousCoords.x, objEvent->previousCoords.y); - - if (curElevation == 15 || prevElevation == 15) - return; - - objEvent->currentElevation = curElevation; - - if (curElevation != 0 && curElevation != 15) - objEvent->previousElevation = curElevation; -} - -void SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 subpriority) -{ - s32 tmp = sprite->centerToCornerVecY; - u32 tmpa = *(u16 *)&sprite->y; - u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; - s32 tmp2 = (tmpa - tmp) + tmpb; - u16 tmp3 = (16 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; - sprite->subpriority = tmp3 + sElevationToSubpriority[elevation] + subpriority; -} - -static void ObjectEventUpdateSubpriority(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - if (objEvent->fixedPriority) - return; - - SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1); -} - -static bool8 AreElevationsCompatible(u8 a, u8 b) -{ - if (a == 0 || b == 0) - return TRUE; - - if (a != b) - return FALSE; - - return TRUE; -} - -void GroundEffect_SpawnOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; // priority - gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; - gFieldEffectArguments[5] = objEvent->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; - gFieldEffectArguments[7] = TRUE; // skip to end of anim - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void GroundEffect_StepOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; // priority - gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; - gFieldEffectArguments[5] = objEvent->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; - gFieldEffectArguments[7] = FALSE; // don't skip to end of anim - FieldEffectStart(FLDEFF_TALL_GRASS); -} - -void GroundEffect_SpawnOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; - gFieldEffectArguments[5] = objEvent->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; - gFieldEffectArguments[7] = 1; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void GroundEffect_StepOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = (objEvent->localId << 8) | objEvent->mapNum; - gFieldEffectArguments[5] = objEvent->mapGroup; - gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; - gFieldEffectArguments[7] = 0; - FieldEffectStart(FLDEFF_LONG_GRASS); -} - -void GroundEffect_WaterReflection(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - SetUpReflection(objEvent, sprite, FALSE); -} - -void GroundEffect_IceReflection(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - SetUpReflection(objEvent, sprite, TRUE); -} - -void GroundEffect_FlowingWater(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - StartFieldEffectForObjectEvent(FLDEFF_FEET_IN_FLOWING_WATER, objEvent); -} - -static void (*const sGroundEffectTracksFuncs[])(struct ObjectEvent *objEvent, struct Sprite *sprite, bool8 isDeepSand) = { - [TRACKS_NONE] = DoTracksGroundEffect_None, - [TRACKS_FOOT] = DoTracksGroundEffect_Footprints, - [TRACKS_BIKE_TIRE] = DoTracksGroundEffect_BikeTireTracks, -}; - -void GroundEffect_SandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); - sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, FALSE); -} - -void GroundEffect_DeepSandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); - sGroundEffectTracksFuncs[info->tracks](objEvent, sprite, TRUE); -} - -static void DoTracksGroundEffect_None(struct ObjectEvent *objEvent, struct Sprite *sprite, bool8 isDeepSand) -{ -} - -static void DoTracksGroundEffect_Footprints(struct ObjectEvent *objEvent, struct Sprite *sprite, bool8 isDeepSand) -{ - // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) - u16 sandFootprints_FieldEffectData[2] = { - FLDEFF_SAND_FOOTPRINTS, - FLDEFF_DEEP_SAND_FOOTPRINTS - }; - - gFieldEffectArguments[0] = objEvent->previousCoords.x; - gFieldEffectArguments[1] = objEvent->previousCoords.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = objEvent->facingDirection; - FieldEffectStart(sandFootprints_FieldEffectData[isDeepSand]); -} - -static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *objEvent, struct Sprite *sprite, bool8 isDeepSand) -{ - // Specifies which bike track shape to show next. - // For example, when the bike turns from up to right, it will show - // a track that curves to the right. - // Each 4-byte row corresponds to the initial direction of the bike, and - // each byte in that row is for the next direction of the bike in the order - // of down, up, left, right. - static const u8 bikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, - 1, 2, 6, 5, - 5, 8, 3, 4, - 6, 7, 3, 4, - }; - - if (objEvent->currentCoords.x != objEvent->previousCoords.x || objEvent->currentCoords.y != objEvent->previousCoords.y) - { - u8 movementDir = (objEvent->previousMovementDirection > DIR_EAST) ? (objEvent->previousMovementDirection - DIR_EAST) : objEvent->previousMovementDirection; - gFieldEffectArguments[0] = objEvent->previousCoords.x; - gFieldEffectArguments[1] = objEvent->previousCoords.y; - gFieldEffectArguments[2] = 149; - gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = - bikeTireTracks_Transitions[movementDir][objEvent->facingDirection - 5]; - FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); - } -} - -void GroundEffect_Ripple(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - DoRippleFieldEffect(objEvent, sprite); -} - -void GroundEffect_StepOnPuddle(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - StartFieldEffectForObjectEvent(FLDEFF_SPLASH, objEvent); -} - -void GroundEffect_SandHeap(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - StartFieldEffectForObjectEvent(FLDEFF_SAND_PILE, objEvent); -} - -void GroundEffect_JumpOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - u8 spriteId; - - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); - - spriteId = FindTallGrassFieldEffectSpriteId( - objEvent->localId, - objEvent->mapNum, - objEvent->mapGroup, - objEvent->currentCoords.x, - objEvent->currentCoords.y); - - if (spriteId == MAX_SPRITES) - GroundEffect_SpawnOnTallGrass(objEvent, sprite); -} - -void GroundEffect_JumpOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; - FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); -} - -void GroundEffect_JumpOnShallowWater(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); -} - -void GroundEffect_JumpOnWater(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); -} - -void GroundEffect_JumpLandingDust(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_DUST); -} - -void GroundEffect_ShortGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - StartFieldEffectForObjectEvent(FLDEFF_SHORT_GRASS, objEvent); -} - -void GroundEffect_HotSprings(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - StartFieldEffectForObjectEvent(FLDEFF_HOT_SPRINGS_WATER, objEvent); -} - -void GroundEffect_Seaweed(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - gFieldEffectArguments[0] = objEvent->currentCoords.x; - gFieldEffectArguments[1] = objEvent->currentCoords.y; - FieldEffectStart(FLDEFF_BUBBLES); -} - -static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct Sprite *sprite) = { - GroundEffect_SpawnOnTallGrass, // GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN - GroundEffect_StepOnTallGrass, // GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE - GroundEffect_SpawnOnLongGrass, // GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN - GroundEffect_StepOnLongGrass, // GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE - GroundEffect_WaterReflection, // GROUND_EFFECT_FLAG_WATER_REFLECTION - GroundEffect_IceReflection, // GROUND_EFFECT_FLAG_ICE_REFLECTION - GroundEffect_FlowingWater, // GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER - GroundEffect_SandTracks, // GROUND_EFFECT_FLAG_SAND - GroundEffect_DeepSandTracks, // GROUND_EFFECT_FLAG_DEEP_SAND - GroundEffect_Ripple, // GROUND_EFFECT_FLAG_RIPPLES - GroundEffect_StepOnPuddle, // GROUND_EFFECT_FLAG_PUDDLE - GroundEffect_SandHeap, // GROUND_EFFECT_FLAG_SAND_PILE - GroundEffect_JumpOnTallGrass, // GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS - GroundEffect_JumpOnLongGrass, // GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS - GroundEffect_JumpOnShallowWater, // GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER - GroundEffect_JumpOnWater, // GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER - GroundEffect_JumpLandingDust, // GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND - GroundEffect_ShortGrass, // GROUND_EFFECT_FLAG_SHORT_GRASS - GroundEffect_HotSprings, // GROUND_EFFECT_FLAG_HOT_SPRINGS - GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED -}; - -static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *sprite, u32 flags) -{ - u8 i; - - if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent)) - return; - - for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) - if (flags & 1) - sGroundEffectFuncs[i](objEvent, sprite); -} - -void filters_out_some_ground_effects(struct ObjectEvent *objEvent, u32 *flags) -{ - if (objEvent->disableCoveringGroundEffects) - { - objEvent->inShortGrass = 0; - objEvent->inSandPile = 0; - objEvent->inShallowFlowingWater = 0; - objEvent->inHotSprings = 0; - *flags &= ~(GROUND_EFFECT_FLAG_HOT_SPRINGS - | GROUND_EFFECT_FLAG_SHORT_GRASS - | GROUND_EFFECT_FLAG_SAND_PILE - | GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER - | GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE); - } -} - -void FilterOutStepOnPuddleGroundEffectIfJumping(struct ObjectEvent *objEvent, u32 *flags) -{ - if (objEvent->landingJump) - *flags &= ~GROUND_EFFECT_FLAG_PUDDLE; -} - -static void DoGroundEffects_OnSpawn(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - u32 flags; - - if (objEvent->triggerGroundEffectsOnMove) - { - flags = 0; - UpdateObjectEventElevationAndPriority(objEvent, sprite); - GetAllGroundEffectFlags_OnSpawn(objEvent, &flags); - SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); - DoFlaggedGroundEffects(objEvent, sprite, flags); - objEvent->triggerGroundEffectsOnMove = 0; - objEvent->disableCoveringGroundEffects = 0; - } -} - -static void DoGroundEffects_OnBeginStep(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - u32 flags; - - if (objEvent->triggerGroundEffectsOnMove) - { - flags = 0; - UpdateObjectEventElevationAndPriority(objEvent, sprite); - GetAllGroundEffectFlags_OnBeginStep(objEvent, &flags); - SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); - filters_out_some_ground_effects(objEvent, &flags); - DoFlaggedGroundEffects(objEvent, sprite, flags); - objEvent->triggerGroundEffectsOnMove = 0; - objEvent->disableCoveringGroundEffects = 0; - } -} - -static void DoGroundEffects_OnFinishStep(struct ObjectEvent *objEvent, struct Sprite *sprite) -{ - u32 flags; - - if (objEvent->triggerGroundEffectsOnStop) - { - flags = 0; - UpdateObjectEventElevationAndPriority(objEvent, sprite); - GetAllGroundEffectFlags_OnFinishStep(objEvent, &flags); - SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite); - FilterOutStepOnPuddleGroundEffectIfJumping(objEvent, &flags); - DoFlaggedGroundEffects(objEvent, sprite, flags); - objEvent->triggerGroundEffectsOnStop = 0; - objEvent->landingJump = 0; - } -} - -bool8 FreezeObjectEvent(struct ObjectEvent *objectEvent) -{ - if (objectEvent->heldMovementActive || objectEvent->frozen) - { - return TRUE; - } - else - { - objectEvent->frozen = TRUE; - objectEvent->spriteAnimPausedBackup = gSprites[objectEvent->spriteId].animPaused; - objectEvent->spriteAffineAnimPausedBackup = gSprites[objectEvent->spriteId].affineAnimPaused; - gSprites[objectEvent->spriteId].animPaused = TRUE; - gSprites[objectEvent->spriteId].affineAnimPaused = TRUE; - return FALSE; - } -} - -void FreezeObjectEvents(void) -{ - u8 i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - if (gObjectEvents[i].active && i != gPlayerAvatar.objectEventId) - FreezeObjectEvent(&gObjectEvents[i]); -} - -void FreezeObjectEventsExceptOne(u8 objectEventId) -{ - u8 i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - if (i != objectEventId && gObjectEvents[i].active && i != gPlayerAvatar.objectEventId) - FreezeObjectEvent(&gObjectEvents[i]); -} - -void UnfreezeObjectEvent(struct ObjectEvent *objectEvent) -{ - if (objectEvent->active && objectEvent->frozen) - { - objectEvent->frozen = 0; - gSprites[objectEvent->spriteId].animPaused = objectEvent->spriteAnimPausedBackup; - gSprites[objectEvent->spriteId].affineAnimPaused = objectEvent->spriteAffineAnimPausedBackup; - } -} - -void UnfreezeObjectEvents(void) -{ - u8 i; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - if (gObjectEvents[i].active) - UnfreezeObjectEvent(&gObjectEvents[i]); -} - -static void Step1(struct Sprite *sprite, u8 dir) -{ - sprite->x += sDirectionToVectors[dir].x; - sprite->y += sDirectionToVectors[dir].y; -} - -static void Step2(struct Sprite *sprite, u8 dir) -{ - sprite->x += 2 * (u16) sDirectionToVectors[dir].x; - sprite->y += 2 * (u16) sDirectionToVectors[dir].y; -} - -static void Step3(struct Sprite *sprite, u8 dir) -{ - sprite->x += 2 * (u16) sDirectionToVectors[dir].x + (u16) sDirectionToVectors[dir].x; - sprite->y += 2 * (u16) sDirectionToVectors[dir].y + (u16) sDirectionToVectors[dir].y; -} - -static void Step4(struct Sprite *sprite, u8 dir) -{ - sprite->x += 4 * (u16) sDirectionToVectors[dir].x; - sprite->y += 4 * (u16) sDirectionToVectors[dir].y; -} - -static void Step8(struct Sprite *sprite, u8 dir) -{ - sprite->x += 8 * (u16) sDirectionToVectors[dir].x; - sprite->y += 8 * (u16) sDirectionToVectors[dir].y; -} - -#define sSpeed data[4] -#define sTimer data[5] - -static void SetSpriteDataForNormalStep(struct Sprite *sprite, u8 direction, u8 speed) -{ - sprite->sDirection = direction; - sprite->sSpeed = speed; - sprite->sTimer = 0; -} - -typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 direction); - -static const SpriteStepFunc sStep1Funcs[] = { - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, - Step1, -}; - -static const SpriteStepFunc sStep2Funcs[] = { - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, - Step2, -}; - -static const SpriteStepFunc sStep3Funcs[] = { - Step2, - Step3, - Step3, - Step2, - Step3, - Step3, -}; - -static const SpriteStepFunc sStep4Funcs[] = { - Step4, - Step4, - Step4, - Step4, -}; - -static const SpriteStepFunc sStep8Funcs[] = { - Step8, - Step8, -}; - -static const SpriteStepFunc *const sNpcStepFuncTables[] = { - [MOVE_SPEED_NORMAL] = sStep1Funcs, - [MOVE_SPEED_FAST_1] = sStep2Funcs, - [MOVE_SPEED_FAST_2] = sStep3Funcs, - [MOVE_SPEED_FASTER] = sStep4Funcs, - [MOVE_SPEED_FASTEST] = sStep8Funcs, -}; - -static const s16 sStepTimes[] = { - [MOVE_SPEED_NORMAL] = ARRAY_COUNT(sStep1Funcs), - [MOVE_SPEED_FAST_1] = ARRAY_COUNT(sStep2Funcs), - [MOVE_SPEED_FAST_2] = ARRAY_COUNT(sStep3Funcs), - [MOVE_SPEED_FASTER] = ARRAY_COUNT(sStep4Funcs), - [MOVE_SPEED_FASTEST] = ARRAY_COUNT(sStep8Funcs), -}; - -static bool8 NpcTakeStep(struct Sprite *sprite) -{ - if (sprite->sTimer >= sStepTimes[sprite->sSpeed]) - return FALSE; - - sNpcStepFuncTables[sprite->sSpeed][sprite->sTimer](sprite, sprite->sDirection); - - sprite->sTimer++; - - if (sprite->sTimer < sStepTimes[sprite->sSpeed]) - return FALSE; - - return TRUE; -} - -#undef sSpeed -#undef sTimer - -#define sTimer data[4] -#define sNumSteps data[5] - -static void SetWalkSlowSpriteData(struct Sprite *sprite, u8 direction) -{ - sprite->sDirection = direction; - sprite->sTimer = 0; - sprite->sNumSteps = 0; -} - -static bool8 UpdateWalkSlowAnim(struct Sprite *sprite) -{ - if (!(sprite->sTimer & 1)) - { - Step1(sprite, sprite->sDirection); - sprite->sNumSteps++; - } - - sprite->sTimer++; - - if (sprite->sNumSteps > 15) - return TRUE; - else - return FALSE; -} - -#undef sTimer -#undef sNumSteps - -static const s8 sFigure8XOffsets[FIGURE_8_LENGTH] = { - 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 2, 2, 1, 2, - 2, 1, 2, 2, 1, 2, 1, 1, - 2, 1, 1, 2, 1, 1, 2, 1, - 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 0, 1, 1, 0, - 1, 0, 1, 0, 1, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, -}; - -static const s8 sFigure8YOffsets[FIGURE_8_LENGTH] = { - 0, 0, 1, 0, 0, 1, 0, 0, - 1, 0, 1, 1, 0, 1, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, - 0, 0, 1, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -1, 0, 0, -1, 0, 0, - -1, 0, -1, -1, 0, -1, -1, 0, - -1, -1, -1, -1, -1, -1, -1, -2, -}; - -s16 GetFigure8YOffset(s16 idx) -{ - return sFigure8YOffsets[idx]; -} - -s16 GetFigure8XOffset(s16 idx) -{ - return sFigure8XOffsets[idx]; -} - -static void InitSpriteForFigure8Anim(struct Sprite *sprite) -{ - sprite->data[6] = 0; - sprite->data[7] = 0; -} - -static bool8 AnimateSpriteInFigure8(struct Sprite *sprite) -{ - bool8 finished = FALSE; - - switch(sprite->data[7]) - { - case 0: - sprite->x2 += GetFigure8XOffset(sprite->data[6]); - sprite->y2 += GetFigure8YOffset(sprite->data[6]); - break; - case 1: - sprite->x2 -= GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]); - sprite->y2 += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]); - break; - case 2: - sprite->x2 -= GetFigure8XOffset(sprite->data[6]); - sprite->y2 += GetFigure8YOffset(sprite->data[6]); - break; - case 3: - sprite->x2 += GetFigure8XOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]); - sprite->y2 += GetFigure8YOffset((FIGURE_8_LENGTH - 1) - sprite->data[6]); - break; - } - if (++sprite->data[6] == FIGURE_8_LENGTH) - { - sprite->data[6] = 0; - sprite->data[7]++; - } - if (sprite->data[7] == 4) - { - sprite->y2 = 0; - sprite->x2 = 0; - finished = TRUE; - } - return finished; -} - -static const s8 sJumpY_High[] = { - -4, -6, -8, -10, -11, -12, -12, -12, - -11, -10, -9, -8, -6, -4, 0, 0 -}; - -static const s8 sJumpY_Low[] = { - 0, -2, -3, -4, -5, -6, -6, -6, - -5, -5, -4, -3, -2, 0, 0, 0 -}; - -static const s8 sJumpY_Normal[] = { - -2, -4, -6, -8, -9, -10, -10, -10, - -9, -8, -6, -5, -3, -2, 0, 0 -}; - -static const s8 *const sJumpYTable[] = { - [JUMP_TYPE_HIGH] = sJumpY_High, - [JUMP_TYPE_LOW] = sJumpY_Low, - [JUMP_TYPE_NORMAL] = sJumpY_Normal -}; - -static s16 GetJumpY(s16 i, u8 type) -{ - return sJumpYTable[type][i]; -} - -#define sDistance data[4] -#define sJumpType data[5] -#define sTimer data[6] - -static void SetJumpSpriteData(struct Sprite *sprite, u8 direction, u8 distance, u8 type) -{ - sprite->sDirection = direction; - sprite->sDistance = distance; - sprite->sJumpType = type; - sprite->sTimer = 0; -} - -static u8 DoJumpSpriteMovement(struct Sprite *sprite) -{ - s16 distanceToTime[] = { - [JUMP_DISTANCE_IN_PLACE] = 16, - [JUMP_DISTANCE_NORMAL] = 16, - [JUMP_DISTANCE_FAR] = 32, - }; - u8 distanceToShift[] = { - [JUMP_DISTANCE_IN_PLACE] = 0, - [JUMP_DISTANCE_NORMAL] = 0, - [JUMP_DISTANCE_FAR] = 1, - }; - u8 result = 0; - - if (sprite->sDistance != JUMP_DISTANCE_IN_PLACE) - Step1(sprite, sprite->sDirection); - - sprite->y2 = GetJumpY(sprite->sTimer >> distanceToShift[sprite->sDistance], sprite->sJumpType); - - sprite->sTimer++; - - if (sprite->sTimer == distanceToTime[sprite->sDistance] >> 1) - result = JUMP_HALFWAY; - - if (sprite->sTimer >= distanceToTime[sprite->sDistance]) - { - sprite->y2 = 0; - result = JUMP_FINISHED; - } - - return result; -} - -static u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite) -{ - s16 distanceToTime[] = { - [JUMP_DISTANCE_IN_PLACE] = 32, - [JUMP_DISTANCE_NORMAL] = 32, - [JUMP_DISTANCE_FAR] = 64, - }; - u8 distanceToShift[] = { - [JUMP_DISTANCE_IN_PLACE] = 1, - [JUMP_DISTANCE_NORMAL] = 1, - [JUMP_DISTANCE_FAR] = 2, - }; - u8 result = 0; - - if (sprite->sDistance != JUMP_DISTANCE_IN_PLACE && !(sprite->sTimer & 1)) - Step1(sprite, sprite->sDirection); - - sprite->y2 = GetJumpY(sprite->sTimer >> distanceToShift[sprite->sDistance], sprite->sJumpType); - - sprite->sTimer++; - - if (sprite->sTimer == distanceToTime[sprite->sDistance] >> 1) - result = JUMP_HALFWAY; - - if (sprite->sTimer >= distanceToTime[sprite->sDistance]) - { - sprite->y2 = 0; - result = JUMP_FINISHED; - } - - return result; -} - -#undef sDistance -#undef sJumpType -#undef sTimer - -static void SetMovementDelay(struct Sprite *sprite, s16 timer) -{ - sprite->data[3] = timer; -} - -static bool8 WaitForMovementDelay(struct Sprite *sprite) -{ - if (--sprite->data[3] == 0) - return TRUE; - else - return FALSE; -} - -void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex) -{ - sprite->animNum = animNum; - sprite->animPaused = FALSE; - SeekSpriteAnim(sprite, animCmdIndex); -} - -bool8 SpriteAnimEnded(struct Sprite *sprite) -{ - if (sprite->animEnded) - return TRUE; - else - return FALSE; -} - -void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible) -{ - u16 x, y; - s16 x2, y2; - - sprite->invisible = invisible; - - if (sprite->coordOffsetEnabled) - { - x = sprite->x + sprite->x2 + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->y + sprite->y2 + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->x + sprite->x2 + sprite->centerToCornerVecX; - y = sprite->y + sprite->y2 + sprite->centerToCornerVecY; - } - - x2 = x - (sprite->centerToCornerVecX >> 1); - y2 = y - (sprite->centerToCornerVecY >> 1); - - if ((s16)x >= DISPLAY_WIDTH + 16 || x2 < -16) - sprite->invisible = TRUE; - if ((s16)y >= DISPLAY_HEIGHT + 16 || y2 < -16) - sprite->invisible = TRUE; -} - -#define sInvisible data[2] -#define sAnimNum data[3] -#define sAnimState data[4] - -static void SpriteCB_VirtualObject(struct Sprite *sprite) -{ - VirtualObject_UpdateAnim(sprite); - SetObjectSubpriorityByElevation(sprite->sVirtualObjElev, sprite, 1); - UpdateObjectEventSpriteInvisibility(sprite, sprite->sInvisible); -} - -// Unused -static void DestroyVirtualObjects(void) -{ - int i; - - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if(sprite->inUse && sprite->callback == SpriteCB_VirtualObject) - DestroySprite(sprite); - } -} - -static int GetVirtualObjectSpriteId(u8 virtualObjId) -{ - int i; - - for (i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if (sprite->inUse && sprite->callback == SpriteCB_VirtualObject && (u8)sprite->sVirtualObjId == virtualObjId) - return i; - } - return MAX_SPRITES; -} - -void TurnVirtualObject(u8 virtualObjId, u8 direction) -{ - u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); - - if (spriteId != MAX_SPRITES) - StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(direction)); -} - -void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId) -{ - int spriteId = GetVirtualObjectSpriteId(virtualObjId); - - if (spriteId != MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[spriteId]; - const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(graphicsId); - u16 tileNum = sprite->oam.tileNum; - - sprite->oam = *graphicsInfo->oam; - sprite->oam.tileNum = tileNum; - sprite->oam.paletteNum = graphicsInfo->paletteSlot; - sprite->images = graphicsInfo->images; - - if (graphicsInfo->subspriteTables == NULL) - { - sprite->subspriteTables = NULL; - sprite->subspriteTableNum = 0; - sprite->subspriteMode = SUBSPRITES_OFF; - } - else - { - SetSubspriteTables(sprite, graphicsInfo->subspriteTables); - sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; - } - StartSpriteAnim(sprite, 0); - } -} - -void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible) -{ - u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); - - if (spriteId == MAX_SPRITES) - return; - - if (invisible) - gSprites[spriteId].sInvisible = TRUE; - else - gSprites[spriteId].sInvisible = FALSE; -} - -bool32 IsVirtualObjectInvisible(u8 virtualObjId) -{ - u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); - - if (spriteId == MAX_SPRITES) - return FALSE; - - return (gSprites[spriteId].sInvisible == TRUE); -} - -void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNum) -{ - u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); - - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].sAnimNum = animNum; - gSprites[spriteId].sAnimState = 0; - } -} - -static void MoveUnionRoomObjectUp(struct Sprite *sprite) -{ - switch(sprite->sAnimState) - { - case 0: - sprite->y2 = 0; - sprite->sAnimState++; - case 1: - sprite->y2 -= 8; - if (sprite->y2 == -DISPLAY_HEIGHT) - { - sprite->y2 = 0; - sprite->sInvisible = TRUE; - sprite->sAnimNum = 0; - sprite->sAnimState = 0; - } - } -} - -static void MoveUnionRoomObjectDown(struct Sprite *sprite) -{ - switch(sprite->sAnimState) - { - case 0: - sprite->y2 = -DISPLAY_HEIGHT; - sprite->sAnimState++; - case 1: - sprite->y2 += 8; - if(sprite->y2 == 0) - { - sprite->sAnimNum = 0; - sprite->sAnimState = 0; - } - } -} - -static void VirtualObject_UpdateAnim(struct Sprite *sprite) -{ - switch(sprite->sAnimNum) - { - case UNION_ROOM_SPAWN_IN: - MoveUnionRoomObjectDown(sprite); - break; - case UNION_ROOM_SPAWN_OUT: - MoveUnionRoomObjectUp(sprite); - break; - case 0: - break; - default: - sprite->sAnimNum = 0; - break; - } -} - -bool32 IsVirtualObjectAnimating(u8 virtualObjId) -{ - u8 spriteId = GetVirtualObjectSpriteId(virtualObjId); - - if (spriteId == MAX_SPRITES) - return FALSE; - - if (gSprites[spriteId].sAnimNum != 0) - return TRUE; - - return FALSE; -} - -u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectEvent) -{ - ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - return FieldEffectStart(fieldEffectId); -} - -static void DoShadowFieldEffect(struct ObjectEvent *objectEvent) -{ - if (!objectEvent->hasShadow) - { - objectEvent->hasShadow = TRUE; - StartFieldEffectForObjectEvent(FLDEFF_SHADOW, objectEvent); - } -} - -static void DoRippleFieldEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - const struct ObjectEventGraphicsInfo *graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - gFieldEffectArguments[0] = sprite->x; - gFieldEffectArguments[1] = sprite->y + (graphicsInfo->height >> 1) - 2; - gFieldEffectArguments[2] = 151; - gFieldEffectArguments[3] = 3; - FieldEffectStart(FLDEFF_RIPPLE); -} - -u8 (*const gMovementActionFuncs_LockAnim[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_LockAnim_Step0, - MovementAction_Finish, -}; - -u8 (*const gMovementActionFuncs_UnlockAnim[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_UnlockAnim_Step0, - MovementAction_Finish, -}; - -u8 (*const gMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_FlyUp_Step0, - MovementAction_FlyUp_Step1, - MovementAction_Fly_Finish, -}; - -u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_FlyDown_Step0, - MovementAction_FlyDown_Step1, - MovementAction_Fly_Finish, -}; - -u8 MovementAction_LockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - bool32 ableToStore = FALSE; - if (sLockedAnimObjectEvents == NULL) - { - sLockedAnimObjectEvents = AllocZeroed(sizeof(struct LockedAnimObjectEvents)); - sLockedAnimObjectEvents->localIds[0] = objectEvent->localId; - sLockedAnimObjectEvents->count = 1; - ableToStore = TRUE; - } - else - { - u8 i; - u8 firstFreeSlot = OBJECT_EVENTS_COUNT; - bool32 found = FALSE; - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (firstFreeSlot == OBJECT_EVENTS_COUNT && sLockedAnimObjectEvents->localIds[i] == 0) - firstFreeSlot = i; - - if (sLockedAnimObjectEvents->localIds[i] == objectEvent->localId) - { - found = TRUE; - break; - } - } - - if (!found && firstFreeSlot != OBJECT_EVENTS_COUNT) - { - sLockedAnimObjectEvents->localIds[firstFreeSlot] = objectEvent->localId; - sLockedAnimObjectEvents->count++; - ableToStore = TRUE; - } - } - - if (ableToStore == TRUE) - { - objectEvent->inanimate = TRUE; - objectEvent->facingDirectionLocked = TRUE; - } - - sprite->sActionFuncId = 1; - return TRUE; -} - -u8 MovementAction_UnlockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - bool32 ableToStore; - u8 index; - - sprite->sActionFuncId = 1; - if (sLockedAnimObjectEvents != NULL) - { - ableToStore = FALSE; - index = FindLockedObjectEventIndex(objectEvent); - if (index != OBJECT_EVENTS_COUNT) - { - sLockedAnimObjectEvents->localIds[index] = 0; - sLockedAnimObjectEvents->count--; - ableToStore = TRUE; - } - if (sLockedAnimObjectEvents->count == 0) - FREE_AND_SET_NULL(sLockedAnimObjectEvents); - if (ableToStore == TRUE) - { - objectEvent->inanimate = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->inanimate; - objectEvent->facingDirectionLocked = FALSE; - sprite->animPaused = 0; - } - } - - return TRUE; -} - -u8 FindLockedObjectEventIndex(struct ObjectEvent *objectEvent) -{ - u8 i; - - for (i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if (sLockedAnimObjectEvents->localIds[i] == objectEvent->localId) - return i; - } - return OBJECT_EVENTS_COUNT; -} - -static void CreateLevitateMovementTask(struct ObjectEvent *objectEvent) -{ - u8 taskId = CreateTask(ApplyLevitateMovement, 0xFF); - struct Task *task = &gTasks[taskId]; - - StoreWordInTwoHalfwords(&task->data[0], (u32)objectEvent); - objectEvent->warpArrowSpriteId = taskId; - task->data[3] = 0xFFFF; -} - -static void ApplyLevitateMovement(u8 taskId) -{ - struct ObjectEvent *objectEvent; - struct Sprite *sprite; - struct Task *task = &gTasks[taskId]; - - LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&objectEvent); // load the map object pointer. - sprite = &gSprites[objectEvent->spriteId]; - - if(!(task->data[2] & 3)) - sprite->y2 += task->data[3]; - - if(!(task->data[2] & 15)) - task->data[3] = -task->data[3]; - - task->data[2]++; -} - -static void DestroyLevitateMovementTask(u8 taskId) -{ - struct ObjectEvent *objectEvent; - struct Task *task = &gTasks[taskId]; - - LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&objectEvent); // unused objectEvent - DestroyTask(taskId); -} - -// Used to freeze other objects except two trainers approaching for battle -void FreezeObjectEventsExceptTwo(u8 objectEventId1, u8 objectEventId2) -{ - u8 i; - - for(i = 0; i < OBJECT_EVENTS_COUNT; i++) - { - if(i != objectEventId1 && i != objectEventId2 && - gObjectEvents[i].active && i != gPlayerAvatar.objectEventId) - FreezeObjectEvent(&gObjectEvents[i]); - } -} - -u8 MovementAction_FlyUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->y2 = 0; - sprite->sActionFuncId++; - return FALSE; -} - -u8 MovementAction_FlyUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->y2 -= 8; - - if(sprite->y2 == -DISPLAY_HEIGHT) - sprite->sActionFuncId++; - return FALSE; -} - -u8 MovementAction_FlyDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->y2 = -DISPLAY_HEIGHT; - sprite->sActionFuncId++; - return FALSE; -} - -u8 MovementAction_FlyDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - sprite->y2 += 8; - - if(!sprite->y2) - sprite->sActionFuncId++; - return FALSE; -} - -// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it. -u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - return TRUE; -} - - -// running slow -static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) -{ - InitNpcForWalkSlow(objectEvent, sprite, direction); - SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection)); -} - -bool8 MovementActionFunc_RunSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSlowRunningAnim(objectEvent, sprite, DIR_SOUTH); - return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); -} - -bool8 MovementActionFunc_RunSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - StartSlowRunningAnim(objectEvent, sprite, DIR_NORTH); - return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); -} - -bool8 MovementActionFunc_RunSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - StartSlowRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); - else - StartSlowRunningAnim(objectEvent, sprite, DIR_WEST); - return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); -} - -bool8 MovementActionFunc_RunSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (objectEvent->directionOverwrite) - StartSlowRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); - else - StartSlowRunningAnim(objectEvent, sprite, DIR_EAST); - return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); -} - -bool8 MovementActionFunc_RunSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (UpdateMovementNormal(objectEvent, sprite)) - { - sprite->sActionFuncId = 2; - return TRUE; - } - return FALSE; -} diff --git a/src/faraway_island.c b/src/faraway_island.c index 4f34cf30e..68be69d26 100755 --- a/src/faraway_island.c +++ b/src/faraway_island.c @@ -392,7 +392,7 @@ void SetMewAboveGrass(void) gSprites[mew->spriteId].subpriority = 1; LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1); - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(gSpritePalette_GeneralFieldEffect1.tag)); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(gSpritePalette_GeneralFieldEffect1.tag), FALSE); x = mew->currentCoords.x; y = mew->currentCoords.y; diff --git a/src/field_effect.c b/src/field_effect.c index 5b00f5340..c67c79f58 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -782,7 +782,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); - UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag), TRUE); (*script) += 4; } @@ -1593,6 +1593,7 @@ static bool8 EscalatorWarpOut_WaitForPlayer(struct Task *task) if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) { ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetPlayerFacingDirection())); + objectEvent->noShadow = TRUE; task->tState++; task->data[2] = 0; task->data[3] = 0; @@ -1714,6 +1715,7 @@ static bool8 EscalatorWarpIn_Init(struct Task *task) u8 behavior; CameraObjectReset2(); objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + objectEvent->noShadow = TRUE; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(DIR_EAST)); PlayerGetDestCoords(&x, &y); behavior = MapGridGetMetatileBehaviorAt(x, y); @@ -1810,6 +1812,7 @@ static bool8 EscalatorWarpIn_End(struct Task *task) { struct ObjectEvent *objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + objectEvent->noShadow = FALSE; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { CameraObjectReset1(); @@ -1962,6 +1965,7 @@ static bool8 LavaridgeGymB1FWarpEffect_Init(struct Task *task, struct ObjectEven SetCameraPanningCallback(NULL); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = 1; + objectEvent->noShadow = TRUE; task->data[1] = 1; task->data[0]++; return TRUE; @@ -2154,6 +2158,7 @@ static bool8 LavaridgeGym1FWarpEffect_Init(struct Task *task, struct ObjectEvent CameraObjectReset2(); gPlayerAvatar.preventStep = TRUE; objectEvent->fixedPriority = 1; + objectEvent->noShadow = TRUE; task->data[0]++; return FALSE; } @@ -3116,10 +3121,10 @@ u8 FldEff_NPCFlyOut(void) u8 spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIRD], 0x78, 0, 1); struct Sprite *sprite = &gSprites[spriteId]; - sprite->oam.paletteNum = 0; sprite->oam.priority = 1; sprite->callback = SpriteCB_NPCFlyOut; sprite->data[1] = gFieldEffectArguments[0]; + sprite->oam.paletteNum = LoadObjectEventPalette(gSaveBlock2Ptr->playerGender ? FLDEFF_PAL_TAG_MAY : FLDEFF_PAL_TAG_BRENDAN); PlaySE(SE_M_FLY); return spriteId; } @@ -3267,7 +3272,7 @@ static void FlyOutFieldEffect_FlyOffWithBird(struct Task *task) struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventClearHeldMovementIfActive(objectEvent); objectEvent->inanimate = FALSE; - objectEvent->hasShadow = FALSE; + objectEvent->noShadow = TRUE; SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId); CameraObjectReset2(); task->tState++; @@ -3298,9 +3303,9 @@ static u8 CreateFlyBirdSprite(void) struct Sprite *sprite; spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_BIRD], 0xff, 0xb4, 0x1); sprite = &gSprites[spriteId]; - sprite->oam.paletteNum = 0; sprite->oam.priority = 1; sprite->callback = SpriteCB_FlyBirdLeaveBall; + sprite->oam.paletteNum = LoadObjectEventPalette(gSaveBlock2Ptr->playerGender ? FLDEFF_PAL_TAG_MAY : FLDEFF_PAL_TAG_BRENDAN); return spriteId; } @@ -3488,6 +3493,7 @@ static void FlyInFieldEffect_BirdSwoopDown(struct Task *task) ObjectEventTurn(objectEvent, DIR_WEST); StartSpriteAnim(&gSprites[objectEvent->spriteId], ANIM_GET_ON_OFF_POKEMON_WEST); objectEvent->invisible = FALSE; + objectEvent->noShadow = TRUE; task->tBirdSpriteId = CreateFlyBirdSprite(); StartFlyBirdSwoopDown(task->tBirdSpriteId); SetFlyBirdPlayerSpriteId(task->tBirdSpriteId, objectEvent->spriteId); diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 9421aaf27..4aeff79c5 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -12,13 +12,20 @@ #include "trig.h" #include "constants/field_effects.h" #include "constants/songs.h" +#include "constants/event_objects.h" +#include "palette.h" +#include "constants/rgb.h" #define OBJ_EVENT_PAL_TAG_NONE 0x11FF // duplicate of define in event_object_movement.c +#define PAL_TAG_REFLECTION_OFFSET 0x2000 // reflection tag value is paletteTag + 0x2000 +#define PAL_RAW_REFLECTION_OFFSET 0x4000 // raw reflection tag is paletteNum + 0x4000 +#define HIGH_BRIDGE_PAL_TAG 0x4010 +#define REFLECTION_PAL_TAG(tag, num) ((tag) == TAG_NONE ? (num) + PAL_RAW_REFLECTION_OFFSET : (tag) + PAL_TAG_REFLECTION_OFFSET) static void UpdateObjectReflectionSprite(struct Sprite *); static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct Sprite *sprite); -static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *, u8); -static void LoadObjectRegularReflectionPalette(struct ObjectEvent *, u8); +static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *, struct Sprite *sprite); +static void LoadObjectRegularReflectionPalette(struct ObjectEvent *, struct Sprite *sprite); static void UpdateGrassFieldEffectSubpriority(struct Sprite *, u8, u8); static void FadeFootprintsTireTracks_Step0(struct Sprite *); static void FadeFootprintsTireTracks_Step1(struct Sprite *); @@ -31,7 +38,7 @@ static void SynchroniseSurfPosition(struct ObjectEvent *, struct Sprite *); static void UpdateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *); static void SpriteCB_UnderwaterSurfBlob(struct Sprite *); static u32 ShowDisguiseFieldEffect(u8, u8, u8); - +u32 FldEff_Shadow(void); // Used by several field effects to determine which of a group it is #define sFldEff data[1] @@ -40,6 +47,14 @@ static u32 ShowDisguiseFieldEffect(u8, u8, u8); #define sReflectionVerticalOffset data[2] #define sIsStillReflection data[7] +void SetUpShadow(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = objectEvent->localId; + gFieldEffectArguments[1] = gSaveBlock1Ptr->location.mapNum; + gFieldEffectArguments[2] = gSaveBlock1Ptr->location.mapGroup; + FldEff_Shadow(); +} + void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection) { struct Sprite *reflectionSprite; @@ -47,14 +62,14 @@ void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, boo reflectionSprite = &gSprites[CreateCopySpriteAt(sprite, sprite->x, sprite->y, 0x98)]; reflectionSprite->callback = UpdateObjectReflectionSprite; reflectionSprite->oam.priority = 3; - reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[reflectionSprite->oam.paletteNum]; reflectionSprite->usingSheet = TRUE; reflectionSprite->anims = gDummySpriteAnimTable; StartSpriteAnim(reflectionSprite, 0); reflectionSprite->affineAnims = gDummySpriteAffineAnimTable; reflectionSprite->affineAnimBeginning = TRUE; - reflectionSprite->subspriteMode = SUBSPRITES_OFF; - reflectionSprite->sReflectionObjEventId = sprite->data[0]; + reflectionSprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; + reflectionSprite->subspriteTableNum = 0; + reflectionSprite->sReflectionObjEventId = sprite->sReflectionObjEventId; reflectionSprite->sReflectionObjEventLocalId = objectEvent->localId; reflectionSprite->sIsStillReflection = stillReflection; LoadObjectReflectionPalette(objectEvent, reflectionSprite); @@ -82,43 +97,88 @@ static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct || (bridgeType = MetatileBehavior_GetBridgeType(objectEvent->currentMetatileBehavior)))) { reflectionSprite->sReflectionVerticalOffset = bridgeReflectionVerticalOffsets[bridgeType - 1]; - LoadObjectHighBridgeReflectionPalette(objectEvent, reflectionSprite->oam.paletteNum); + LoadObjectHighBridgeReflectionPalette(objectEvent, reflectionSprite); } else { - LoadObjectRegularReflectionPalette(objectEvent, reflectionSprite->oam.paletteNum); + LoadObjectRegularReflectionPalette(objectEvent, reflectionSprite); } } -static void LoadObjectRegularReflectionPalette(struct ObjectEvent *objectEvent, u8 paletteIndex) +static void ApplyPondFilter(u8 paletteNum, u16 *dest) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE) + u32 i; + s32 r, g, b; + u16 *src = gPlttBufferUnfaded + OBJ_PLTT_ID(paletteNum); + *dest++ = *src++; + for (i = 0; i < 16 - 1; i++) { - if (graphicsInfo->paletteSlot == PALSLOT_PLAYER) - LoadPlayerObjectReflectionPalette(graphicsInfo->paletteTag, paletteIndex); - else if (graphicsInfo->paletteSlot == PALSLOT_NPC_SPECIAL) - LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, paletteIndex); - else - PatchObjectPalette(GetObjectPaletteTag(paletteIndex), paletteIndex); - UpdateSpritePaletteWithWeather(paletteIndex); + u32 color = *src++; + r = (color << 27) >> 27; + g = (color << 22) >> 27; + b = (color << 17) >> 27; + b += 10; + if (b > 31) + b = 31; + *dest++ = RGB2(r, g, b); } } +static void ApplyIceFilter(u8 paletteNum, u16 *dest) +{ + u32 i; + s32 r, g, b; + u16 *src = gPlttBufferUnfaded + OBJ_PLTT_ID(paletteNum); + *dest++ = *src++; + for (i = 0; i < 16 - 1; i++) + { + u32 color = *src++; + r = (color << 27) >> 27; + g = (color << 22) >> 27; + b = (color << 17) >> 27; + r -= 5; + if (r < 0) + r = 0; + g += 3; + if (g > 31) + g = 31; + b += 16; + if (b > 31) + b = 31; + *dest++ = RGB2(r, g, b); + } +} + +static void LoadObjectRegularReflectionPalette(struct ObjectEvent *objectEvent, struct Sprite *sprite) +{ + const struct Sprite *mainSprite = &gSprites[objectEvent->spriteId]; + u16 baseTag = GetSpritePaletteTagByPaletteNum(mainSprite->oam.paletteNum); + u16 paletteTag = REFLECTION_PAL_TAG(baseTag, mainSprite->oam.paletteNum); + u8 paletteNum = IndexOfSpritePaletteTag(paletteTag); + if (paletteNum <= 16) + { + u16 filteredData[16]; + struct SpritePalette filteredPal = {.tag = paletteTag, .data = filteredData}; + if (sprite->sIsStillReflection == FALSE) + ApplyPondFilter(mainSprite->oam.paletteNum, filteredData); + else + ApplyIceFilter(mainSprite->oam.paletteNum, filteredData); + paletteNum = LoadSpritePalette(&filteredPal); + UpdateSpritePaletteWithWeather(paletteNum, TRUE); + } + sprite->oam.paletteNum = paletteNum; + sprite->oam.objMode = ST_OAM_OBJ_BLEND; +} + // When walking on a bridge high above water (Route 120), the reflection is a solid dark blue color. // This is so the sprite blends in with the dark water metatile underneath the bridge. -static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *objectEvent, u8 paletteNum) +static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - const struct ObjectEventGraphicsInfo *graphicsInfo; - - graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); - if (graphicsInfo->reflectionPaletteTag != OBJ_EVENT_PAL_TAG_NONE) - { - PatchObjectPalette(graphicsInfo->reflectionPaletteTag, paletteNum); - UpdateSpritePaletteWithWeather(paletteNum); - } + u16 blueData[16]; + struct SpritePalette bluePalette = {.tag = HIGH_BRIDGE_PAL_TAG, .data = blueData}; + CpuFill16(0x55C9, blueData, PLTT_SIZE_4BPP); + sprite->oam.paletteNum = LoadSpritePalette(&bluePalette); + UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, TRUE); } static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) @@ -131,37 +191,58 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) if (!objectEvent->active || !objectEvent->hasReflection || objectEvent->localId != reflectionSprite->sReflectionObjEventLocalId) { reflectionSprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(reflectionSprite->oam.paletteNum); + return; } - else + if (IndexOfSpritePaletteTag(HIGH_BRIDGE_PAL_TAG) != reflectionSprite->oam.paletteNum) { - reflectionSprite->oam.paletteNum = gReflectionEffectPaletteMap[mainSprite->oam.paletteNum]; - reflectionSprite->oam.shape = mainSprite->oam.shape; - reflectionSprite->oam.size = mainSprite->oam.size; - reflectionSprite->oam.matrixNum = mainSprite->oam.matrixNum | ST_OAM_VFLIP; - reflectionSprite->oam.tileNum = mainSprite->oam.tileNum; - reflectionSprite->subspriteTables = mainSprite->subspriteTables; - reflectionSprite->subspriteTableNum = mainSprite->subspriteTableNum; - reflectionSprite->invisible = mainSprite->invisible; - reflectionSprite->x = mainSprite->x; - reflectionSprite->y = mainSprite->y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->sReflectionVerticalOffset; - reflectionSprite->centerToCornerVecX = mainSprite->centerToCornerVecX; - reflectionSprite->centerToCornerVecY = mainSprite->centerToCornerVecY; - reflectionSprite->x2 = mainSprite->x2; - reflectionSprite->y2 = -mainSprite->y2; - reflectionSprite->coordOffsetEnabled = mainSprite->coordOffsetEnabled; - - if (objectEvent->hideReflection == TRUE) - reflectionSprite->invisible = TRUE; - - if (reflectionSprite->sIsStillReflection == FALSE) + u16 baseTag = GetSpritePaletteTagByPaletteNum(mainSprite->oam.paletteNum); + u16 paletteTag = REFLECTION_PAL_TAG(baseTag, mainSprite->oam.paletteNum); + u8 paletteNum = IndexOfSpritePaletteTag(paletteTag); + if (paletteNum >= 16) { - // Sets the reflection sprite's rot/scale matrix to the appropriate - // matrix based on whether or not the main sprite is horizontally flipped. - // If the sprite is facing to the east, then it is flipped, and its matrixNum is 8. - reflectionSprite->oam.matrixNum = 0; - if (mainSprite->oam.matrixNum & ST_OAM_HFLIP) - reflectionSprite->oam.matrixNum = 1; + u16 filteredData[16]; + struct SpritePalette filteredPal = {.tag = paletteTag, .data = filteredData}; + reflectionSprite->inUse = FALSE; + FieldEffectFreePaletteIfUnused(reflectionSprite->oam.paletteNum); + reflectionSprite->inUse = TRUE; + if (reflectionSprite->sIsStillReflection == FALSE) + ApplyPondFilter(mainSprite->oam.paletteNum, filteredData); + else + ApplyIceFilter(mainSprite->oam.paletteNum, filteredData); + paletteNum = LoadSpritePalette(&filteredPal); + UpdateSpritePaletteWithWeather(paletteNum, TRUE); } + reflectionSprite->oam.paletteNum = paletteNum; + } + reflectionSprite->oam.shape = mainSprite->oam.shape; + reflectionSprite->oam.size = mainSprite->oam.size; + reflectionSprite->oam.matrixNum = mainSprite->oam.matrixNum | ST_OAM_VFLIP; + reflectionSprite->oam.tileNum = mainSprite->oam.tileNum; + reflectionSprite->subspriteTables = mainSprite->subspriteTables; + reflectionSprite->invisible = mainSprite->invisible; + reflectionSprite->x = mainSprite->x; + reflectionSprite->y = mainSprite->y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->sReflectionVerticalOffset; + reflectionSprite->centerToCornerVecX = mainSprite->centerToCornerVecX; + reflectionSprite->centerToCornerVecY = mainSprite->centerToCornerVecY; + reflectionSprite->x2 = mainSprite->x2; + reflectionSprite->y2 = -mainSprite->y2; + reflectionSprite->coordOffsetEnabled = mainSprite->coordOffsetEnabled; + + if (objectEvent->hideReflection == TRUE) + reflectionSprite->invisible = TRUE; + + if (reflectionSprite->subspriteTables[0].subsprites) + { + reflectionSprite->oam.affineMode = ST_OAM_AFFINE_OFF; + return; + } + if (reflectionSprite->sIsStillReflection == FALSE) + { + // Sets the reflection sprite's rot/scale matrix to the appropriate + // matrix based on whether or not the main sprite is horizontally flipped. + // If the sprite is facing to the east, then it is flipped, and its matrixNum is 8. + reflectionSprite->oam.matrixNum = (mainSprite->oam.matrixNum & ST_OAM_HFLIP) ? 1 : 0; } } @@ -181,6 +262,7 @@ u8 CreateWarpArrowSprite(void) if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = LoadObjectEventPalette(gSaveBlock2Ptr->playerGender ? FLDEFF_PAL_TAG_MAY : FLDEFF_PAL_TAG_BRENDAN); sprite->oam.priority = 1; sprite->coordOffsetEnabled = TRUE; sprite->invisible = TRUE; @@ -232,12 +314,22 @@ u32 FldEff_Shadow(void) u8 objectEventId; const struct ObjectEventGraphicsInfo *graphicsInfo; u8 spriteId; + s32 i; + for (i = MAX_SPRITES - 1; i > -1; i--) + { + if (gSprites[i].data[0] == gFieldEffectArguments[0] && gSprites[i].callback == UpdateShadowFieldEffect) + return 0; + } objectEventId = GetObjectEventIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); - spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 0x94); + if (graphicsInfo->shadowSize == SHADOW_SIZE_NONE) + return 0; + LoadSpriteSheetByTemplate(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[sShadowEffectTemplateIds[graphicsInfo->shadowSize]], 0, 0, 149); if (spriteId != MAX_SPRITES) { + gSprites[spriteId].oam.objMode = 1; gSprites[spriteId].coordOffsetEnabled = TRUE; gSprites[spriteId].data[0] = gFieldEffectArguments[0]; gSprites[spriteId].data[1] = gFieldEffectArguments[1]; @@ -264,12 +356,15 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) sprite->oam.priority = linkedSprite->oam.priority; sprite->x = linkedSprite->x; sprite->y = linkedSprite->y + sprite->data[3]; - if (!objectEvent->active || !objectEvent->hasShadow + sprite->invisible = linkedSprite->invisible; + if (!objectEvent->active || objectEvent->noShadow + || objectEvent->inHotSprings + || objectEvent->inSandPile + || gWeatherPtr->noShadows || MetatileBehavior_IsPokeGrass(objectEvent->currentMetatileBehavior) + || MetatileBehavior_IsPuddle(objectEvent->currentMetatileBehavior) || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->currentMetatileBehavior) - || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->previousMetatileBehavior) - || MetatileBehavior_IsReflective(objectEvent->currentMetatileBehavior) - || MetatileBehavior_IsReflective(objectEvent->previousMetatileBehavior)) + || MetatileBehavior_IsSurfableWaterOrUnderwater(objectEvent->previousMetatileBehavior)) { FieldEffectStop(sprite, FLDEFF_SHADOW); } @@ -1014,8 +1109,8 @@ u32 FldEff_SurfBlob(void) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; - sprite->oam.paletteNum = 0; sprite->tPlayerObjId = gFieldEffectArguments[2]; + sprite->oam.paletteNum = LoadObjectEventPalette(gSaveBlock2Ptr->playerGender ? FLDEFF_PAL_TAG_MAY : FLDEFF_PAL_TAG_BRENDAN); sprite->data[3] = -1; sprite->data[6] = -1; sprite->data[7] = -1; @@ -1297,7 +1392,7 @@ u32 FldEff_BerryTreeGrowthSparkle(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->oam.paletteNum = 5; + UpdateSpritePaletteByTemplate(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPARKLE], sprite); sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; } return 0; @@ -1339,8 +1434,8 @@ static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 fldEffObj, u8 paletteNum) if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = LoadObjectEventPalette(gFieldEffectObjectTemplatePointers[fldEffObj]->paletteTag); sprite->coordOffsetEnabled ++; - sprite->oam.paletteNum = paletteNum; sprite->sFldEff = fldEff; sprite->sLocalId = gFieldEffectArguments[0]; sprite->sMapNum = gFieldEffectArguments[1]; diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 0bf0629e1..024ab8c73 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -445,7 +445,7 @@ static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8)) { struct PlayerAvatar *playerAvatar = &gPlayerAvatar; u8 collision; - + // Check for sideways stairs onto ice movement. switch (direction) { @@ -458,7 +458,7 @@ static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8)) direction = DIR_EAST; break; } - + collision = CheckForPlayerAvatarCollision(direction); playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED_MOVE; @@ -624,7 +624,7 @@ static void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys) static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) { u8 collision = CheckForPlayerAvatarCollision(direction); - + if (collision) { if (collision == COLLISION_LEDGE_JUMP) @@ -645,7 +645,7 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) return; } } - + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) { // same speed as running @@ -660,7 +660,7 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) PlayerRunSlow(direction); else PlayerRun(direction); - + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; return; } @@ -680,7 +680,7 @@ static u8 CheckForPlayerAvatarCollision(u8 direction) x = playerObjEvent->currentCoords.x; y = playerObjEvent->currentCoords.y; - + MoveCoords(direction, &x, &y); return CheckForObjectEventCollision(playerObjEvent, x, y, direction, MapGridGetMetatileBehaviorAt(x, y)); } @@ -700,7 +700,7 @@ u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u { u8 collision = GetCollisionAtCoords(objectEvent, x, y, direction); u8 currentBehavior = MapGridGetMetatileBehaviorAt(objectEvent->currentCoords.x, objectEvent->currentCoords.y); - + if (collision == COLLISION_ELEVATION_MISMATCH && CanStopSurfing(x, y, direction)) return COLLISION_STOP_SURFING; @@ -718,7 +718,7 @@ u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u return COLLISION_ROTATING_GATE; CheckAcroBikeCollision(x, y, metatileBehavior, &collision); } - + //sideways stairs logic /* if (MetatileBehavior_IsSidewaysStairsLeftSideTop(metatileBehavior) && direction == DIR_EAST) @@ -733,7 +733,7 @@ u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u && direction == DIR_NORTH && collision == COLLISION_NONE) return COLLISION_IMPASSABLE; //trying to move north off of top-most tile onto same level doesn't work */ - + return collision; } @@ -1268,50 +1268,32 @@ void StopPlayerAvatar(void) } } -u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +u16 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) { return sRivalAvatarGfxIds[state][gender]; } -u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +u16 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) { return sPlayerAvatarGfxIds[state][gender]; } -u8 GetFRLGAvatarGraphicsIdByGender(u8 gender) +u16 GetFRLGAvatarGraphicsIdByGender(u8 gender) { return sFRLGAvatarGfxIds[gender]; } -u8 GetRSAvatarGraphicsIdByGender(u8 gender) +u16 GetRSAvatarGraphicsIdByGender(u8 gender) { return sRSAvatarGfxIds[gender]; } -u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) +u16 GetPlayerAvatarGraphicsIdByStateId(u8 state) { return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); } -u8 unref_GetRivalAvatarGenderByGraphicsId(u8 gfxId) -{ - switch (gfxId) - { - case OBJ_EVENT_GFX_RIVAL_MAY_NORMAL: - case OBJ_EVENT_GFX_RIVAL_MAY_MACH_BIKE: - case OBJ_EVENT_GFX_RIVAL_MAY_ACRO_BIKE: - case OBJ_EVENT_GFX_RIVAL_MAY_SURFING: - case OBJ_EVENT_GFX_RIVAL_MAY_FIELD_MOVE: - case OBJ_EVENT_GFX_MAY_UNDERWATER: - case OBJ_EVENT_GFX_MAY_FISHING: - case OBJ_EVENT_GFX_MAY_WATERING: - return FEMALE; - default: - return MALE; - } -} - -u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) +u16 GetPlayerAvatarGenderByGraphicsId(u16 gfxId) { switch (gfxId) { @@ -1380,7 +1362,7 @@ void SetPlayerAvatarStateMask(u8 flags) gPlayerAvatar.flags |= flags; } -static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender) +static u8 GetPlayerAvatarStateTransitionByGraphicsId(u16 graphicsId, u8 gender) { u8 i; @@ -1392,7 +1374,7 @@ static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender) return PLAYER_AVATAR_FLAG_ON_FOOT; } -u8 GetPlayerAvatarGraphicsIdByCurrentState(void) +u16 GetPlayerAvatarGraphicsIdByCurrentState(void) { u8 i; u8 flags = gPlayerAvatar.flags; @@ -1405,7 +1387,7 @@ u8 GetPlayerAvatarGraphicsIdByCurrentState(void) return 0; } -void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 transitionFlag) +void SetPlayerAvatarExtraStateTransition(u16 graphicsId, u8 transitionFlag) { u8 stateFlag = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender); @@ -2285,9 +2267,9 @@ u8 GetRightSideStairsDirection(u8 direction) default: if (direction > DIR_EAST) direction -= DIR_EAST; - + return direction; - } + } } u8 GetLeftSideStairsDirection(u8 direction) @@ -2301,7 +2283,7 @@ u8 GetLeftSideStairsDirection(u8 direction) default: if (direction > DIR_EAST) direction -= DIR_EAST; - + return direction; } } @@ -2311,12 +2293,12 @@ bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction) #if SLOW_MOVEMENT_ON_STAIRS s16 x = objectEvent->currentCoords.x; s16 y = objectEvent->currentCoords.y; - + #if FOLLOW_ME_IMPLEMENTED if (PlayerHasFollower() && (objectEvent->isPlayer || objectEvent->localId == GetFollowerLocalId())) return FALSE; #endif - + switch (direction) { case DIR_NORTH: @@ -2340,4 +2322,3 @@ bool8 ObjectMovingOnRockStairs(struct ObjectEvent *objectEvent, u8 direction) return FALSE; #endif } - diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 616444116..d81129674 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -1132,6 +1132,7 @@ static void Task_OrbEffect(u8 taskId) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); SetGpuRegBits(REG_OFFSET_BLDCNT, gOrbEffectBackgroundLayerFlags[0]); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 7)); + UpdateShadowColor(0x2109); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetBgTilemapPalette(0, 0, 0, DISPLAY_TILE_WIDTH, DISPLAY_TILE_HEIGHT, 0xF); @@ -1196,6 +1197,7 @@ static void Task_OrbEffect(u8 taskId) SetGpuReg(REG_OFFSET_DISPCNT, tDispCnt); SetGpuReg(REG_OFFSET_BLDCNT, tBldCnt); SetGpuReg(REG_OFFSET_BLDALPHA, tBldAlpha); + UpdateShadowColor(RGB_BLACK); SetGpuReg(REG_OFFSET_WININ, tWinIn); SetGpuReg(REG_OFFSET_WINOUT, tWinOut); ScriptContext_Enable(); diff --git a/src/field_specials.c b/src/field_specials.c index c91f458ed..adeff7dc5 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -100,7 +100,7 @@ void SetPlayerGotFirstFans(void); u16 GetNumFansOfPlayerInTrainerFanClub(void); static void RecordCyclingRoadResults(u32, u8); -static void LoadLinkPartnerObjectEventSpritePalette(u8, u8, u8); +static void LoadLinkPartnerObjectEventSpritePalette(u16, u8, u8); static void Task_PetalburgGymSlideOpenRoomDoors(u8); static void PetalburgGymSetDoorMetatiles(u8, u16); static void Task_PCTurnOnEffect(u8); @@ -573,7 +573,7 @@ void SpawnLinkPartnerObjectEvent(void) } } -static void LoadLinkPartnerObjectEventSpritePalette(u8 graphicsId, u8 localEventId, u8 paletteNum) +static void LoadLinkPartnerObjectEventSpritePalette(u16 graphicsId, u8 localEventId, u8 paletteNum) { u8 adjustedPaletteNum; // Note: This temp var is necessary; paletteNum += 6 doesn't match. @@ -3055,7 +3055,7 @@ static void HideFrontierExchangeCornerItemIcon(u16 menu, u16 unused) case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2: case SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR: case SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR: - DestroySpriteAndFreeResources(&gSprites[sScrollableMultichoice_ItemSpriteId]); + FieldEffectFreeGraphicsResources(&gSprites[sScrollableMultichoice_ItemSpriteId]); break; } sScrollableMultichoice_ItemSpriteId = MAX_SPRITES; @@ -3196,7 +3196,7 @@ void ScrollableMultichoice_ClosePersistentMenu(void) #undef tTaskId #define DEOXYS_ROCK_LEVELS 11 -#define ROCK_PAL_ID 10 +#define OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE 0x111F void DoDeoxysRockInteraction(void) { @@ -3275,9 +3275,9 @@ static void Task_DeoxysRockInteraction(u8 taskId) static void ChangeDeoxysRockLevel(u8 rockLevel) { - u8 objectEventId; - LoadPalette(&sDeoxysRockPalettes[rockLevel], OBJ_PLTT_ID(ROCK_PAL_ID), PLTT_SIZEOF(4)); - TryGetObjectEventIdByLocalIdAndMap(LOCALID_BIRTH_ISLAND_EXTERIOR_ROCK, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); + u8 paletteNum = IndexOfSpritePaletteTag(OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE); + LoadPalette(&sDeoxysRockPalettes[rockLevel], OBJ_PLTT_ID(paletteNum), PLTT_SIZEOF(4)); + UpdateSpritePaletteWithWeather(paletteNum, FALSE); if (rockLevel == 0) PlaySE(SE_M_CONFUSE_RAY); // Failure sound @@ -3325,8 +3325,9 @@ void IncrementBirthIslandRockStepCount(void) void SetDeoxysRockPalette(void) { - LoadPalette(&sDeoxysRockPalettes[(u8)VarGet(VAR_DEOXYS_ROCK_LEVEL)], OBJ_PLTT_ID(ROCK_PAL_ID), PLTT_SIZEOF(4)); - BlendPalettes(1 << (ROCK_PAL_ID + 16), 16, 0); + u32 paletteNum = IndexOfSpritePaletteTag(OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE); + LoadPalette(&sDeoxysRockPalettes[(u8)VarGet(VAR_DEOXYS_ROCK_LEVEL)], OBJ_PLTT_ID(paletteNum), PLTT_SIZEOF(4)); + CpuFill16(0, &gPlttBufferFaded[OBJ_PLTT_ID(paletteNum)], 32); } void SetPCBoxToSendMon(u8 boxId) diff --git a/src/field_weather.c b/src/field_weather.c index 045c234ac..912877731 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -17,6 +17,7 @@ #include "trig.h" #include "gpu_regs.h" #include "field_camera.h" +#include "overworld.h" #define DROUGHT_COLOR_INDEX(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) @@ -134,15 +135,15 @@ static const u8 ALIGNED(2) sBasePaletteColorMapTypes[32] = // sprite palettes COLOR_MAP_CONTRAST, COLOR_MAP_DARK_CONTRAST, - COLOR_MAP_CONTRAST, - COLOR_MAP_CONTRAST, - COLOR_MAP_CONTRAST, - COLOR_MAP_CONTRAST, COLOR_MAP_DARK_CONTRAST, COLOR_MAP_DARK_CONTRAST, COLOR_MAP_DARK_CONTRAST, COLOR_MAP_DARK_CONTRAST, - COLOR_MAP_CONTRAST, + COLOR_MAP_DARK_CONTRAST, + COLOR_MAP_DARK_CONTRAST, + COLOR_MAP_DARK_CONTRAST, + COLOR_MAP_DARK_CONTRAST, + COLOR_MAP_DARK_CONTRAST, COLOR_MAP_DARK_CONTRAST, COLOR_MAP_DARK_CONTRAST, COLOR_MAP_DARK_CONTRAST, @@ -160,7 +161,7 @@ void StartWeather(void) CpuCopy32(gFogPalette, &gPlttBufferUnfaded[OBJ_PLTT_ID(index)], PLTT_SIZE_4BPP); BuildColorMaps(); gWeatherPtr->contrastColorMapSpritePalIndex = index; - gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2); + gWeatherPtr->weatherPicSpritePalIndex = 0xFF; gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->curRainSpriteIndex = 0; gWeatherPtr->cloudSpritesCreated = 0; @@ -251,6 +252,8 @@ static void Task_WeatherMain(u8 taskId) static void None_Init(void) { + Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; gWeatherPtr->targetColorMapIndex = 0; gWeatherPtr->colorMapStepDelay = 0; } @@ -472,18 +475,27 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) if (colorMapIndex > 0) { + u32 palettes = PALETTES_ALL; + numPalettes += startPalIndex; + palettes = (palettes >> startPalIndex) << startPalIndex; + palettes = (palettes << (32 - numPalettes)) >> (32 - numPalettes); + numPalettes -= startPalIndex; colorMapIndex--; palOffset = PLTT_ID(startPalIndex); + UpdateAltBgPalettes(palettes & PALETTES_BG); + if (!(colorMapIndex > 3) && MapHasNaturalLight(gMapHeader.mapType)) + UpdatePalettesWithTime(palettes); + else + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, PLTT_SIZE_4BPP * numPalettes); numPalettes += startPalIndex; curPalIndex = startPalIndex; // Loop through the specified palette range and apply necessary color maps. while (curPalIndex < numPalettes) { - if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE) + if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE || (curPalIndex >= 16 && GetSpritePaletteTagByPaletteNum(curPalIndex - 16) >> 15)) { // No palette change. - CpuFastCopy(&gPlttBufferUnfaded[palOffset], &gPlttBufferFaded[palOffset], PLTT_SIZE_4BPP); palOffset += 16; } else @@ -498,7 +510,7 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) for (i = 0; i < 16; i++) { // Apply color map to the original color. - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferFaded[palOffset]; r = colorMap[baseColor.r]; g = colorMap[baseColor.g]; b = colorMap[baseColor.b]; @@ -539,8 +551,14 @@ static void ApplyColorMap(u8 startPalIndex, u8 numPalettes, s8 colorMapIndex) } else { - // No palette blending. - CpuFastCopy(&gPlttBufferUnfaded[PLTT_ID(startPalIndex)], &gPlttBufferFaded[PLTT_ID(startPalIndex)], numPalettes * PLTT_SIZE_4BPP); + if (MapHasNaturalLight(gMapHeader.mapType)) + { + u32 palettes = ((1 << numPalettes) - 1) << startPalIndex; + UpdateAltBgPalettes(palettes & PALETTES_BG); + UpdatePalettesWithTime(palettes); + } + else + CpuFastCopy(&gPlttBufferUnfaded[PLTT_ID(startPalIndex)], &gPlttBufferFaded[PLTT_ID(startPalIndex)], numPalettes * PLTT_SIZE_4BPP); } } @@ -561,10 +579,13 @@ static void ApplyColorMapWithBlend(u8 startPalIndex, u8 numPalettes, s8 colorMap while (curPalIndex < numPalettes) { + UpdateAltBgPalettes((1 << (palOffset >> 4)) & PALETTES_BG); + CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, PLTT_SIZE_4BPP); + UpdatePalettesWithTime(1 << (palOffset >> 4)); if (sPaletteColorMapTypes[curPalIndex] == COLOR_MAP_NONE) { // No color map. Simply blend the colors. - BlendPalette(palOffset, 16, blendCoeff, blendColor); + BlendPalettesFine(1, gPlttBufferFaded + palOffset, gPlttBufferFaded + palOffset, blendCoeff, blendColor); palOffset += 16; } else @@ -578,7 +599,7 @@ static void ApplyColorMapWithBlend(u8 startPalIndex, u8 numPalettes, s8 colorMap for (i = 0; i < 16; i++) { - struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferFaded[palOffset]; u8 r = colorMap[baseColor.r]; u8 g = colorMap[baseColor.g]; u8 b = colorMap[baseColor.b]; @@ -652,49 +673,23 @@ static void ApplyDroughtColorMapWithBlend(s8 colorMapIndex, u8 blendCoeff, u16 b static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) { - struct RGBColor color; - u8 rBlend; - u8 gBlend; - u8 bBlend; - u16 curPalIndex; - - BlendPalette(BG_PLTT_ID(0), 16 * 16, blendCoeff, blendColor); - color = *(struct RGBColor *)&blendColor; - rBlend = color.r; - gBlend = color.g; - bBlend = color.b; + u32 curPalIndex; + u16 fogCoeff = min((gTimeOfDay + 1) * 4, 12); + UpdateAltBgPalettes(PALETTES_BG); + CpuFastCopy(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_BUFFER_SIZE * 2); + UpdatePalettesWithTime(PALETTES_ALL); + BlendPalettesFine(0x1FFF, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { if (LightenSpritePaletteInFog(curPalIndex)) - { - u16 palEnd = PLTT_ID(curPalIndex + 1); - u16 palOffset = PLTT_ID(curPalIndex); - - while (palOffset < palEnd) - { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = color.r; - u8 g = color.g; - u8 b = color.b; - - r += ((28 - r) * 3) >> 2; - g += ((31 - g) * 3) >> 2; - b += ((28 - b) * 3) >> 2; - - r += ((rBlend - r) * blendCoeff) >> 4; - g += ((gBlend - g) * blendCoeff) >> 4; - b += ((bBlend - b) * blendCoeff) >> 4; - - gPlttBufferFaded[palOffset] = RGB2(r, g, b); - palOffset++; - } - } + BlendPalettesFine(1, gPlttBufferFaded + PLTT_ID(curPalIndex), gPlttBufferFaded + PLTT_ID(curPalIndex), fogCoeff, RGB(28, 31, 28)); else { BlendPalette(PLTT_ID(curPalIndex), 16, blendCoeff, blendColor); } } + BlendPalettesFine(PALETTES_OBJECTS, gPlttBufferFaded, gPlttBufferFaded, blendCoeff, blendColor); } static void MarkFogSpritePalToLighten(u8 paletteIndex) @@ -710,6 +705,9 @@ static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { u16 i; + if (paletteIndex >= 16 && (GetSpritePaletteTagByPaletteNum(i - 16) >> 15)) + return FALSE; + for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) { if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) @@ -786,19 +784,26 @@ void FadeScreen(u8 mode, s8 delay) if (fadeOut) { - if (useWeatherPal) - CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); - + CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); BeginNormalPaletteFade(PALETTES_ALL, delay, 0, 16, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } else { gWeatherPtr->fadeDestColor = fadeColor; + UpdateTimeOfDay(); if (useWeatherPal) gWeatherPtr->fadeScreenCounter = 0; else - BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); + { + if (MapHasNaturalLight(gMapHeader.mapType)) + { + UpdateAltBgPalettes(PALETTES_BG); + BeginTimeOfDayPaletteFade(PALETTES_ALL, delay, 16, 0, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight, fadeColor); + } + else + BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); + } gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; gWeatherPtr->fadeInFirstFrame = TRUE; @@ -813,7 +818,7 @@ bool8 IsWeatherNotFadingIn(void) return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); } -void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog) { u16 paletteIndex = 16 + spritePaletteIndex; u16 i; @@ -840,20 +845,31 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) default: if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) { - ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); + if (gWeatherPtr->colorMapIndex) + ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); + else + UpdateSpritePaletteWithTime(spritePaletteIndex); } else { - paletteIndex = PLTT_ID(paletteIndex); - BlendPalette(paletteIndex, 16, 12, RGB(28, 31, 28)); + if (allowFog) + { + i = min((gTimeOfDay + 1) * 4, 12); + paletteIndex = PLTT_ID(paletteIndex); + CpuFastCopy(gPlttBufferUnfaded + paletteIndex, gPlttBufferFaded + paletteIndex, PLTT_SIZE_4BPP); + UpdateSpritePaletteWithTime(spritePaletteIndex); + BlendPalettesFine(1, gPlttBufferFaded + paletteIndex, gPlttBufferFaded + paletteIndex, i, RGB(28, 31, 28)); + } + else + UpdateSpritePaletteWithTime(spritePaletteIndex); } break; } } -void ApplyWeatherColorMapToPal(u8 paletteIndex) +void ApplyWeatherColorMapToPal(u8 paletteIndex, u8 numPalettes) { - ApplyColorMap(paletteIndex, 1, gWeatherPtr->colorMapIndex); + ApplyColorMap(paletteIndex, numPalettes, gWeatherPtr->colorMapIndex); } // Unused @@ -867,8 +883,11 @@ static bool8 IsFirstFrameOfWeatherFadeIn(void) void LoadCustomWeatherSpritePalette(const u16 *palette) { + if (gWeatherPtr->weatherPicSpritePalIndex > 16) + if ((gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2)) > 16) + return; LoadPalette(palette, OBJ_PLTT_ID(gWeatherPtr->weatherPicSpritePalIndex), PLTT_SIZE_4BPP); - UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); + UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex, TRUE); } static void LoadDroughtWeatherPalette(u8 *palsIndex, u8 *palsOffset) diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 334033403..f21e200a2 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -13,6 +13,8 @@ #include "task.h" #include "trig.h" #include "gpu_regs.h" +#include "palette.h" +#include "constants/rgb.h" EWRAM_DATA static u8 sCurrentAbnormalWeather = 0; EWRAM_DATA static u16 sUnusedWeatherRelated = 0; @@ -94,6 +96,7 @@ static const struct SpriteTemplate sCloudSpriteTemplate = void Clouds_InitVars(void) { + gWeatherPtr->noShadows = FALSE; gWeatherPtr->targetColorMapIndex = 0; gWeatherPtr->colorMapStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; @@ -154,6 +157,8 @@ void Sunny_InitVars(void) { gWeatherPtr->targetColorMapIndex = 0; gWeatherPtr->colorMapStepDelay = 20; + Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; } void Sunny_InitAll(void) @@ -237,6 +242,7 @@ void Drought_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->targetColorMapIndex = 0; gWeatherPtr->colorMapStepDelay = 0; + gWeatherPtr->noShadows = FALSE; } void Drought_InitAll(void) @@ -479,6 +485,8 @@ void Rain_InitVars(void) gWeatherPtr->targetColorMapIndex = 3; gWeatherPtr->colorMapStepDelay = 20; SetRainStrengthFromSoundEffect(SE_RAIN); + Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; } void Rain_InitAll(void) @@ -772,6 +780,8 @@ void Snow_InitVars(void) gWeatherPtr->colorMapStepDelay = 20; gWeatherPtr->targetSnowflakeSpriteCount = 16; gWeatherPtr->snowflakeVisibleCounter = 0; + Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; } void Snow_InitAll(void) @@ -1020,6 +1030,8 @@ void Thunderstorm_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->thunderEnqueued = FALSE; SetRainStrengthFromSoundEffect(SE_THUNDERSTORM); + Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; } void Thunderstorm_InitAll(void) @@ -1048,6 +1060,8 @@ void Downpour_InitVars(void) gWeatherPtr->colorMapStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_DOWNPOUR); + Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; } void Downpour_InitAll(void) @@ -1340,6 +1354,26 @@ void FogHorizontal_Main(void); static void CreateFogHorizontalSprites(void); static void DestroyFogHorizontalSprites(void); +#define SHADOW_COLOR_INDEX 9 + +u8 UpdateShadowColor(u16 color) +{ + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); + ALIGNED(4) u16 tempBuffer[16]; + u16 blendedColor; + if (paletteNum != 0xFF) + { + u16 index = OBJ_PLTT_ID(paletteNum) + SHADOW_COLOR_INDEX; + gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = color; + CpuFastCopy(&gPlttBufferFaded[index - SHADOW_COLOR_INDEX], tempBuffer, PLTT_SIZE_4BPP); + UpdateSpritePaletteWithTime(paletteNum); + blendedColor = gPlttBufferFaded[index]; + CpuFastCopy(tempBuffer, &gPlttBufferFaded[index - SHADOW_COLOR_INDEX], PLTT_SIZE_4BPP); + gPlttBufferFaded[index] = blendedColor; + } + return paletteNum; +} + void FogHorizontal_InitVars(void) { gWeatherPtr->initStep = 0; @@ -1353,6 +1387,7 @@ void FogHorizontal_InitVars(void) gWeatherPtr->fogHScrollPosX = 0; Weather_SetBlendCoeffs(0, 16); } + gWeatherPtr->noShadows = FALSE; } void FogHorizontal_InitAll(void) @@ -1375,7 +1410,11 @@ void FogHorizontal_Main(void) case 0: CreateFogHorizontalSprites(); if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) + { + u8 paletteNum = IndexOfSpritePaletteTag(TAG_WEATHER_START); Weather_SetTargetBlendCoeffs(12, 8, 3); + UpdateShadowColor(0x3DEF); + } else Weather_SetTargetBlendCoeffs(4, 16, 0); gWeatherPtr->initStep++; @@ -1414,6 +1453,7 @@ bool8 FogHorizontal_Finish(void) gWeatherPtr->finishStep++; break; default: + UpdateShadowColor(RGB_BLACK); return FALSE; } return TRUE; @@ -1503,10 +1543,8 @@ void Ash_InitVars(void) gWeatherPtr->colorMapStepDelay = 20; gWeatherPtr->ashUnused = 20; // Never read if (!gWeatherPtr->ashSpritesCreated) - { - Weather_SetBlendCoeffs(0, 16); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(64, 63)); // These aren't valid blend coefficients! - } + Weather_SetBlendCoeffs(0, 12); + gWeatherPtr->noShadows = FALSE; } void Ash_InitAll(void) @@ -1532,7 +1570,7 @@ void Ash_Main(void) if (!gWeatherPtr->ashSpritesCreated) CreateAshSprites(); - Weather_SetTargetBlendCoeffs(16, 0, 1); + Weather_SetTargetBlendCoeffs(10, 12, 1); gWeatherPtr->initStep++; break; case 2: @@ -1553,7 +1591,7 @@ bool8 Ash_Finish(void) switch (gWeatherPtr->finishStep) { case 0: - Weather_SetTargetBlendCoeffs(0, 16, 1); + Weather_SetTargetBlendCoeffs(0, 12, 1); gWeatherPtr->finishStep++; break; case 1: @@ -1723,6 +1761,7 @@ void FogDiagonal_InitVars(void) gWeatherPtr->fogDPosY = 0; Weather_SetBlendCoeffs(0, 16); } + gWeatherPtr->noShadows = TRUE; } void FogDiagonal_InitAll(void) @@ -1936,6 +1975,7 @@ void Sandstorm_InitVars(void) Weather_SetBlendCoeffs(0, 16); } + gWeatherPtr->noShadows = FALSE; } void Sandstorm_InitAll(void) @@ -1960,7 +2000,8 @@ void Sandstorm_Main(void) gWeatherPtr->initStep++; break; case 1: - Weather_SetTargetBlendCoeffs(16, 0, 0); + Weather_SetTargetBlendCoeffs(16, 2, 0); + UpdateShadowColor(0x3DEF); gWeatherPtr->initStep++; break; case 2: @@ -1986,9 +2027,12 @@ bool8 Sandstorm_Finish(void) case 1: if (Weather_UpdateBlend()) gWeatherPtr->finishStep++; + if (gWeatherPtr->currBlendEVB == 12) + UpdateShadowColor(RGB_BLACK); break; case 2: DestroySandstormSprites(); + UpdateShadowColor(RGB_BLACK); gWeatherPtr->finishStep++; break; default: @@ -2222,6 +2266,8 @@ void Shade_InitVars(void) gWeatherPtr->initStep = 0; gWeatherPtr->targetColorMapIndex = 3; gWeatherPtr->colorMapStepDelay = 20; + Weather_SetBlendCoeffs(8, 12); + gWeatherPtr->noShadows = FALSE; } void Shade_InitAll(void) @@ -2283,6 +2329,7 @@ void Bubbles_InitVars(void) gWeatherPtr->bubblesCoordsIndex = 0; gWeatherPtr->bubblesSpriteCount = 0; } + gWeatherPtr->noShadows = TRUE; } void Bubbles_InitAll(void) @@ -2606,5 +2653,3 @@ static void UpdateRainCounter(u8 newWeather, u8 oldWeather) && (newWeather == WEATHER_RAIN || newWeather == WEATHER_RAIN_THUNDERSTORM)) IncrementGameStat(GAME_STAT_GOT_RAINED_ON); } - - diff --git a/src/fieldmap.c b/src/fieldmap.c index ac9cedc0b..b16e2e076 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -882,28 +882,55 @@ static void ApplyGlobalTintToPaletteSlot(u8 slot, u8 count) } -static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) +static void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size, bool8 skipFaded) { - u16 black = RGB_BLACK; + u32 low = 0; + u32 high = 0; if (tileset) { if (tileset->isSecondary == FALSE) { - LoadPalette(&black, destOffset, PLTT_SIZEOF(1)); - LoadPalette(tileset->palettes[0] + 1, destOffset + 1, size - PLTT_SIZEOF(1)); - ApplyGlobalTintToPaletteEntries(destOffset + 1, (size - PLTT_SIZEOF(1)) >> 1); + if (skipFaded) + CpuFastCopy(tileset->palettes, &gPlttBufferUnfaded[destOffset], size); + else + LoadPaletteFast(tileset->palettes, destOffset, size); + gPlttBufferFaded[destOffset] = gPlttBufferUnfaded[destOffset] = RGB_BLACK; + ApplyGlobalTintToPaletteEntries(destOffset + 1, (size - 2) >> 1); + low = 0; + high = NUM_PALS_IN_PRIMARY; } else if (tileset->isSecondary == TRUE) { - LoadPalette(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); - ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); + if (skipFaded) + CpuFastCopy((void *)tileset->palettes[NUM_PALS_IN_PRIMARY], &gPlttBufferUnfaded[destOffset], size); + else + LoadPaletteFast(tileset->palettes[NUM_PALS_IN_PRIMARY], destOffset, size); + low = NUM_PALS_IN_PRIMARY; + high = NUM_PALS_TOTAL; } else { LoadCompressedPalette((const u32 *)tileset->palettes, destOffset, size); ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } + if (tileset->lightPalettes) + { + u32 i, j, color; + for (i = low; i < high; i++) + { + if (tileset->lightPalettes & (1 << (i - low))) + { + for (j = 1, color = gPlttBufferUnfaded[PLTT_ID(i)]; j < 16 && color; j++, color >>= 1) + { + if (color & 1) + gPlttBufferFaded[PLTT_ID(i) + j] = gPlttBufferUnfaded[PLTT_ID(i) + j] |= RGB_ALPHA; + } + if (tileset->customLightColor & (1 << (i - low))) + gPlttBufferFaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i)] = gPlttBufferUnfaded[PLTT_ID(i) + 15] | RGB_ALPHA; + } + } + } } } @@ -924,12 +951,12 @@ void CopySecondaryTilesetToVramUsingHeap(struct MapLayout const *mapLayout) static void LoadPrimaryTilesetPalette(struct MapLayout const *mapLayout) { - LoadTilesetPalette(mapLayout->primaryTileset, BG_PLTT_ID(0), NUM_PALS_IN_PRIMARY * PLTT_SIZE_4BPP); + LoadTilesetPalette(mapLayout->primaryTileset, 0, NUM_PALS_IN_PRIMARY * PLTT_SIZE_4BPP, FALSE); } -void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout) +void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout, bool8 skipFaded) { - LoadTilesetPalette(mapLayout->secondaryTileset, BG_PLTT_ID(NUM_PALS_IN_PRIMARY), (NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY) * PLTT_SIZE_4BPP); + LoadTilesetPalette(mapLayout->secondaryTileset, PLTT_ID(NUM_PALS_IN_PRIMARY), (NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY) * PLTT_SIZE_4BPP, skipFaded); } void CopyMapTilesetsToVram(struct MapLayout const *mapLayout) @@ -946,6 +973,6 @@ void LoadMapTilesetPalettes(struct MapLayout const *mapLayout) if (mapLayout) { LoadPrimaryTilesetPalette(mapLayout); - LoadSecondaryTilesetPalette(mapLayout); + LoadSecondaryTilesetPalette(mapLayout, FALSE); } } diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c index c01e88b51..0b254b6af 100644 --- a/src/fldeff_misc.c +++ b/src/fldeff_misc.c @@ -1024,7 +1024,7 @@ void DoSecretBaseGlitterMatSparkle(void) { gSprites[spriteId].coordOffsetEnabled = TRUE; gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].oam.paletteNum = 5; + UpdateSpritePaletteByTemplate(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SPARKLE], &gSprites[spriteId]); gSprites[spriteId].callback = SpriteCB_GlitterMatSparkle; gSprites[spriteId].data[0] = 0; } diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index 27689b02e..844592961 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -27,7 +27,7 @@ static void Task_DoFieldMove_RunFunc(u8 taskId); static void FieldCallback_RockSmash(void); static void FieldMove_RockSmash(void); -bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId) +bool8 CheckObjectGraphicsInFrontOfPlayer(u16 graphicsId) { u8 objEventId; diff --git a/src/graphics.c b/src/graphics.c index 40c5d131b..5599b24ab 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1918,7 +1918,7 @@ const u32 gUnionRoomChat_Keyboard_Gfx[] = INCBIN_U32("graphics/union_room_chat/k const u32 gUnionRoomChat_Keyboard_Tilemap[] = INCBIN_U32("graphics/union_room_chat/keyboard.bin.lz"); const u32 gUnionRoomChat_RButtonLabels[] = INCBIN_U32("graphics/union_room_chat/r_button_labels.4bpp.lz"); -const u16 gTilesetPalettes_General[][16] = +const u16 ALIGNED(4) gTilesetPalettes_General[][16] = { INCBIN_U16("data/tilesets/primary/general/palettes/00.gbapal"), INCBIN_U16("data/tilesets/primary/general/palettes/01.gbapal"), diff --git a/src/load_save.c b/src/load_save.c index 44e08b5e9..f956aff4d 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -180,17 +180,31 @@ void LoadPlayerParty(void) void SaveObjectEvents(void) { int i; + u16 graphicsId; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { gSaveBlock1Ptr->objectEvents[i] = gObjectEvents[i]; + graphicsId = gObjectEvents[i].graphicsId; + gSaveBlock1Ptr->objectEvents[i].graphicsId = (graphicsId >> 8) | (graphicsId << 8); + gSaveBlock1Ptr->objectEvents[i].spriteId = 127; + } } void LoadObjectEvents(void) { int i; + u16 graphicsId; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { gObjectEvents[i] = gSaveBlock1Ptr->objectEvents[i]; + graphicsId = gObjectEvents[i].graphicsId; + gObjectEvents[i].graphicsId = (graphicsId >> 8) | (graphicsId << 8); + if (gObjectEvents[i].spriteId != 127) + gObjectEvents[i].graphicsId &= 0xFF; + gObjectEvents[i].spriteId = 0; + } } void CopyPartyAndObjectsToSave(void) diff --git a/src/mirage_tower.c b/src/mirage_tower.c index 9b48ee24b..23cee0ca7 100644 --- a/src/mirage_tower.c +++ b/src/mirage_tower.c @@ -19,6 +19,7 @@ #include "constants/rgb.h" #include "constants/songs.h" #include "constants/metatile_labels.h" +#include "field_effect.h" struct MirageTowerPulseBlend { @@ -151,10 +152,12 @@ static const union AnimCmd *const sAnims_FallingFossil[] = sAnim_FallingFossil, }; +#define OBJ_EVENT_PAL_TAG_NPC_1 0x1103 + static const struct SpriteTemplate sSpriteTemplate_FallingFossil = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NPC_1, .oam = &sOamData_FallingFossil, .anims = sAnims_FallingFossil, .images = NULL, @@ -690,6 +693,7 @@ static void Task_FossilFallAndSink(u8 taskId) { struct SpriteTemplate fossilTemplate = sSpriteTemplate_FallingFossil; fossilTemplate.images = sFallingFossil->frameImage; + LoadObjectEventPalette(sSpriteTemplate_FallingFossil.paletteTag); sFallingFossil->spriteId = CreateSprite(&fossilTemplate, 128, -16, 1); gSprites[sFallingFossil->spriteId].centerToCornerVecX = 0; gSprites[sFallingFossil->spriteId].data[0] = gSprites[sFallingFossil->spriteId].x; @@ -715,6 +719,9 @@ static void Task_FossilFallAndSink(u8 taskId) // Wait for fossil to finish falling / disintegrating if (gSprites[sFallingFossil->spriteId].callback != SpriteCallbackDummy) return; + gSprites[sFallingFossil->spriteId].inUse = FALSE; + FieldEffectFreePaletteIfUnused(gSprites[sFallingFossil->spriteId].oam.paletteNum); + gSprites[sFallingFossil->spriteId].inUse = TRUE; DestroySprite(&gSprites[sFallingFossil->spriteId]); FREE_AND_SET_NULL(sFallingFossil->disintegrateRand);; FREE_AND_SET_NULL(sFallingFossil->frameImage); diff --git a/src/naming_screen.c b/src/naming_screen.c index 28bb24637..d054e70ff 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1395,7 +1395,7 @@ static void NamingScreen_NoIcon(void) static void NamingScreen_CreatePlayerIcon(void) { - u8 rivalGfxId; + u16 rivalGfxId; u8 spriteId; rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, sNamingScreen->monSpecies); @@ -2585,4 +2585,3 @@ static const struct SpritePalette sSpritePalettes[] = {} }; - diff --git a/src/overworld.c b/src/overworld.c index 0152a4857..108b21755 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -66,6 +66,7 @@ #include "constants/songs.h" #include "constants/trainer_hill.h" #include "constants/weather.h" +#include "rtc.h" struct CableClubPlayer { @@ -192,6 +193,10 @@ bool8 (*gFieldCallback2)(void); u8 gLocalLinkPlayerId; // This is our player id in a multiplayer mode. u8 gFieldLinkPlayerCount; +u8 gTimeOfDay; +struct TimeBlendSettings currentTimeBlend; +u8 gTimeUpdateCounter; + EWRAM_DATA static u8 sObjectEventLoadFlag = 0; EWRAM_DATA struct WarpData gLastUsedWarp = {0}; EWRAM_DATA static struct WarpData sWarpDestination = {0}; // new warp position @@ -831,10 +836,9 @@ void LoadMapFromCameraTransition(u8 mapGroup, u8 mapNum) RunOnTransitionMapScript(); InitMap(); CopySecondaryTilesetToVramUsingHeap(gMapHeader.mapLayout); - LoadSecondaryTilesetPalette(gMapHeader.mapLayout); + LoadSecondaryTilesetPalette(gMapHeader.mapLayout, TRUE); - for (paletteIndex = NUM_PALS_IN_PRIMARY; paletteIndex < NUM_PALS_TOTAL; paletteIndex++) - ApplyWeatherColorMapToPal(paletteIndex); + ApplyWeatherColorMapToPal(NUM_PALS_IN_PRIMARY, NUM_PALS_TOTAL - NUM_PALS_IN_PRIMARY); InitSecondaryTilesetAnimation(); UpdateLocationHistoryForRoamer(); @@ -1486,6 +1490,137 @@ void CB1_Overworld(void) DoCB1_Overworld(gMain.newKeys, gMain.heldKeys); } +#define TINT_NIGHT Q_8_8(0.456) | Q_8_8(0.456) << 8 | Q_8_8(0.615) << 16 + +const struct BlendSettings gTimeOfDayBlend[] = +{ + [TIME_OF_DAY_NIGHT] = {.coeff = 10, .blendColor = TINT_NIGHT, .isTint = TRUE}, + [TIME_OF_DAY_TWILIGHT] = {.coeff = 4, .blendColor = 0xA8B0E0, .isTint = TRUE}, + [TIME_OF_DAY_DAY] = {.coeff = 0, .blendColor = 0}, +}; + +u8 UpdateTimeOfDay(void) +{ + s32 hours, minutes; + RtcCalcLocalTime(); + hours = gLocalTime.hours; + minutes = gLocalTime.minutes; + + if (hours < 5) + { // night + currentTimeBlend.weight = 256; + currentTimeBlend.altWeight = 0; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + } + else if (hours < 6) + { // night->twilight + currentTimeBlend.time0 = TIME_OF_DAY_NIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 5) * 60 + minutes) / ((6 - 5) * 60); + currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2; + gTimeOfDay = TIME_OF_DAY_NIGHT; + } + else if (hours < 7) + { // twilight->day + currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_DAY; + currentTimeBlend.weight = 256 - 256 * ((hours - 6) * 60 + minutes) / ((7 - 6) * 60); + currentTimeBlend.altWeight = (256 - currentTimeBlend.weight) / 2 + 128; + gTimeOfDay = TIME_OF_DAY_DAY; + } + else if (hours < 17) + { // day + currentTimeBlend.weight = currentTimeBlend.altWeight = 256; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_DAY; + } + else if (hours < 18) + { // day->twilight + currentTimeBlend.time0 = TIME_OF_DAY_DAY; + currentTimeBlend.time1 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 17) * 60 + minutes) / ((18 - 17) * 60); + currentTimeBlend.altWeight = currentTimeBlend.weight / 2 + 128; + gTimeOfDay = TIME_OF_DAY_DAY; + } + else if (hours < 19) + { // twilight->night + currentTimeBlend.time0 = TIME_OF_DAY_TWILIGHT; + currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + currentTimeBlend.weight = 256 - 256 * ((hours - 18) * 60 + minutes) / ((19 - 18) * 60); + currentTimeBlend.altWeight = currentTimeBlend.weight / 2; + gTimeOfDay = TIME_OF_DAY_NIGHT; + } + else + { // 19-24, night + currentTimeBlend.weight = 256; + currentTimeBlend.altWeight = 0; + gTimeOfDay = currentTimeBlend.time0 = currentTimeBlend.time1 = TIME_OF_DAY_NIGHT; + } + return gTimeOfDay; +} + +bool8 MapHasNaturalLight(u8 mapType) +{ + return mapType == MAP_TYPE_TOWN || mapType == MAP_TYPE_CITY || mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_OCEAN_ROUTE; +} + +void UpdateAltBgPalettes(u16 palettes) +{ + const struct Tileset *primary = gMapHeader.mapLayout->primaryTileset; + const struct Tileset *secondary = gMapHeader.mapLayout->secondaryTileset; + u32 i = 1; + if (!MapHasNaturalLight(gMapHeader.mapType)) + return; + palettes &= ~((1 << NUM_PALS_IN_PRIMARY) - 1) | primary->swapPalettes; + palettes &= ((1 << NUM_PALS_IN_PRIMARY) - 1) | (secondary->swapPalettes << NUM_PALS_IN_PRIMARY); + palettes &= 0x1FFE; + palettes >>= 1; + if (!palettes) + return; + while (palettes) + { + if (palettes & 1) + { + if (i < NUM_PALS_IN_PRIMARY) + AvgPaletteWeighted(&((u16 *)primary->palettes)[PLTT_ID(i)], &((u16 *)primary->palettes)[PLTT_ID((i + 9) % 16)], gPlttBufferUnfaded + PLTT_ID(i), currentTimeBlend.altWeight); + else + AvgPaletteWeighted(&((u16 *)secondary->palettes)[PLTT_ID(i)], &((u16 *)secondary->palettes)[PLTT_ID((i + 9) % 16)], gPlttBufferUnfaded + PLTT_ID(i), currentTimeBlend.altWeight); + } + i++; + palettes >>= 1; + } +} + +void UpdatePalettesWithTime(u32 palettes) +{ + if (MapHasNaturalLight(gMapHeader.mapType)) + { + u32 i; + u32 mask = 1 << 16; + if (palettes >= 0x10000) + for (i = 0; i < 16; i++, mask <<= 1) + if (GetSpritePaletteTagByPaletteNum(i) >> 15) + palettes &= ~(mask); + + palettes &= 0xFFFF1FFF; + if (!palettes) + return; + TimeMixPalettes(palettes, gPlttBufferUnfaded, gPlttBufferFaded, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight); + } +} + +u8 UpdateSpritePaletteWithTime(u8 paletteNum) +{ + if (MapHasNaturalLight(gMapHeader.mapType)) + { + u16 offset; + if (GetSpritePaletteTagByPaletteNum(paletteNum) >> 15) + return paletteNum; + offset = (paletteNum + 16) << 4; + TimeMixPalettes(1, gPlttBufferUnfaded + offset, gPlttBufferFaded + offset, (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time0], (struct BlendSettings *)&gTimeOfDayBlend[currentTimeBlend.time1], currentTimeBlend.weight); + } + return paletteNum; +} + static void OverworldBasic(void) { ScriptContext_RunScript(); @@ -1497,6 +1632,21 @@ static void OverworldBasic(void) UpdatePaletteFade(); UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); + if (++gTimeUpdateCounter > 60) + { + struct TimeBlendSettings cachedBlend = { + .time0 = currentTimeBlend.time0, + .time1 = currentTimeBlend.time1, + .weight = currentTimeBlend.weight, + }; + gTimeUpdateCounter = 0; + UpdateTimeOfDay(); + if (cachedBlend.time0 != currentTimeBlend.time0 || cachedBlend.time1 != currentTimeBlend.time1 || cachedBlend.weight != currentTimeBlend.weight) + { + UpdateAltBgPalettes(PALETTES_BG); + UpdatePalettesWithTime(PALETTES_ALL); + } + } } // This CB2 is used when starting @@ -1512,7 +1662,10 @@ void CB2_Overworld(void) SetVBlankCallback(NULL); OverworldBasic(); if (fading) + { SetFieldVBlankCallback(); + return; + } } void SetMainCallback1(MainCallback cb) @@ -2161,10 +2314,7 @@ static void ResumeMap(bool32 a1) ResetAllPicSprites(); ResetCameraUpdateInfo(); InstallCameraPanAheadCallback(); - if (!a1) - InitObjectEventPalettes(0); - else - InitObjectEventPalettes(1); + FreeAllSpritePalettes(); FieldEffectActiveListClear(); StartWeather(); diff --git a/src/palette.c b/src/palette.c index e36066462..e876d7ef7 100644 --- a/src/palette.c +++ b/src/palette.c @@ -11,12 +11,14 @@ enum NORMAL_FADE, FAST_FADE, HARDWARE_FADE, + TIME_OF_DAY_FADE, }; // These are structs for some unused palette system. // The full functionality of this system is unknown. #define NUM_PALETTE_STRUCTS 16 +#define DEFAULT_LIGHT_COLOR 0x3F9F struct PaletteStructTemplate { @@ -52,6 +54,7 @@ static u8 UpdateNormalPaletteFade(void); static void BeginFastPaletteFadeInternal(u8); static u8 UpdateFastPaletteFade(void); static u8 UpdateHardwarePaletteFade(void); +static u8 UpdateTimeOfDayPaletteFade(void); static void UpdateBlendRegisters(void); static bool8 IsSoftwarePaletteFadeFinishing(void); static void Task_BlendPalettesGradually(u8 taskId); @@ -94,6 +97,14 @@ void LoadPalette(const void *src, u16 offset, u16 size) CpuCopy16(src, &gPlttBufferFaded[offset], size); } +void LoadPaletteFast(const void *src, u16 offset, u16 size) +{ + if ((u32)src & 3) + return LoadPalette(src, offset, size); + CpuFastCopy(src, &gPlttBufferUnfaded[offset], size); + CpuFastCopy(&gPlttBufferUnfaded[offset], &gPlttBufferFaded[offset], size); +} + void FillPalette(u16 value, u16 offset, u16 size) { CpuFill16(value, &gPlttBufferUnfaded[offset], size); @@ -125,6 +136,8 @@ u8 UpdatePaletteFade(void) result = UpdateNormalPaletteFade(); else if (gPaletteFade.mode == FAST_FADE) result = UpdateFastPaletteFade(); + else if (gPaletteFade.mode == TIME_OF_DAY_FADE) + result = UpdateTimeOfDayPaletteFade(); else result = UpdateHardwarePaletteFade(); @@ -201,6 +214,48 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe } } +bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, struct BlendSettings *bld0, struct BlendSettings *bld1, u16 weight, u16 color) +{ + u8 temp; + + if (gPaletteFade.active) + return FALSE; + else + { + gPaletteFade.deltaY = 2; + if (delay < 0) + { + gPaletteFade.deltaY += (delay * -1); + delay = 0; + } + gPaletteFade_selectedPalettes = selectedPalettes; + gPaletteFade.delayCounter = delay; + gPaletteFade_delay = delay; + gPaletteFade.y = startY; + gPaletteFade.targetY = targetY; + gPaletteFade.active = TRUE; + gPaletteFade.mode = TIME_OF_DAY_FADE; + gPaletteFade.blendColor = color; + gPaletteFade.bld0 = bld0; + gPaletteFade.bld1 = bld1; + gPaletteFade.weight = weight; + if (startY < targetY) + gPaletteFade.yDec = 0; + else + gPaletteFade.yDec = 1; + + UpdatePaletteFade(); + temp = gPaletteFade.bufferTransferDisabled; + gPaletteFade.bufferTransferDisabled = FALSE; + CpuCopy32(gPlttBufferFaded, (void *)PLTT, PLTT_SIZE); + sPlttBufferTransferPending = 0; + if (gPaletteFade.mode == HARDWARE_FADE && gPaletteFade.active) + UpdateBlendRegisters(); + gPaletteFade.bufferTransferDisabled = temp; + return TRUE; + } +} + // Unused static bool8 BeginPlttFade(u32 selectedPalettes, u8 delay, u8 startY, u8 targetY, u16 blendColor) { @@ -407,6 +462,103 @@ static u8 PaletteStruct_GetPalNum(u16 id) return NUM_PALETTE_STRUCTS; } +static u8 UpdateTimeOfDayPaletteFade(void) +{ + u8 paletteNum; + u16 paletteOffset; + u16 selectedPalettes; + u16 timePalettes = 0; + u16 copyPalettes; + u16 *src; + u16 *dst; + + if (!gPaletteFade.active) + return PALETTE_FADE_STATUS_DONE; + + if (IsSoftwarePaletteFadeFinishing()) + return gPaletteFade.active ? PALETTE_FADE_STATUS_ACTIVE : PALETTE_FADE_STATUS_DONE; + + if (!gPaletteFade.objPaletteToggle) + { + if (gPaletteFade.delayCounter < gPaletteFade_delay) + { + gPaletteFade.delayCounter++; + return 2; + } + gPaletteFade.delayCounter = 0; + } + paletteOffset = 0; + if (!gPaletteFade.objPaletteToggle) + selectedPalettes = gPaletteFade_selectedPalettes; + else + { + selectedPalettes = gPaletteFade_selectedPalettes >> 16; + paletteOffset = 256; + } + src = gPlttBufferUnfaded + paletteOffset; + dst = gPlttBufferFaded + paletteOffset; + if (gPaletteFade.objPaletteToggle) + { + u8 i; + u16 j = 1; + for (i = 0; i < 16; i++, j <<= 1) + { + if ((selectedPalettes & j) && !(GetSpritePaletteTagByPaletteNum(i) >> 15)) + timePalettes |= j; + } + } + else + timePalettes = selectedPalettes & 0x1FFF; + TimeMixPalettes(timePalettes, src, dst, gPaletteFade.bld0, gPaletteFade.bld1, gPaletteFade.weight); + + if ((copyPalettes = ~timePalettes)) + { + u16 *src1 = src; + u16 *dst1 = dst; + while (copyPalettes) + { + if (copyPalettes & 1) + CpuFastCopy(src1, dst1, 32); + copyPalettes >>= 1; + src1 += 16; + dst1 += 16; + } + } + BlendPalettesFine(selectedPalettes, dst, dst, gPaletteFade.y, gPaletteFade.blendColor); + gPaletteFade.objPaletteToggle ^= 1; + if (!gPaletteFade.objPaletteToggle) + { + if ((gPaletteFade.yDec && gPaletteFade.y == 0) || (!gPaletteFade.yDec && gPaletteFade.y == gPaletteFade.targetY)) + { + gPaletteFade_selectedPalettes = 0; + gPaletteFade.softwareFadeFinishing = 1; + } + else + { + s8 val; + + if (!gPaletteFade.yDec) + { + val = gPaletteFade.y; + val += gPaletteFade.deltaY; + if (val > gPaletteFade.targetY) + val = gPaletteFade.targetY; + gPaletteFade.y = val; + } + else + { + val = gPaletteFade.y; + val -= gPaletteFade.deltaY; + if (val < 0) + val = 0; + gPaletteFade.y = val; + } + } + } + + return PALETTE_FADE_STATUS_ACTIVE; +} + static u8 UpdateNormalPaletteFade(void) { u16 paletteOffset; @@ -831,16 +983,45 @@ static bool8 IsSoftwarePaletteFadeFinishing(void) } } +void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color) +{ + s32 newR, newG, newB; + + if (!palettes) + return; + + coeff *= 2; + newR = (color << 27) >> 27; + newG = (color << 22) >> 27; + newB = (color << 17) >> 27; + + do + { + if (palettes & 1) + { + u16 *srcEnd = src + 16; + while (src != srcEnd) + { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 16) >> 26; + *dst++ = ((r + (((newR - r) * (s32)coeff) >> 5)) << 0) | ((g + (((newG - g) * (s32)coeff) >> 5)) << 5) | ((b + (((newB - (b & 31)) * (s32)coeff) >> 5)) << 10); + src++; + } + } + else + { + src += 16; + dst += 16; + } + palettes >>= 1; + } while (palettes); +} + void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) { - u16 paletteOffset; - - for (paletteOffset = 0; selectedPalettes; paletteOffset += 16) - { - if (selectedPalettes & 1) - BlendPalette(paletteOffset, 16, coeff, color); - selectedPalettes >>= 1; - } + BlendPalettesFine(selectedPalettes, gPlttBufferUnfaded, gPlttBufferFaded, coeff, color); } void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) @@ -1044,3 +1225,171 @@ static void Task_BlendPalettesGradually(u8 taskId) } } } + +void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0) +{ + s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; + u32 color0, coeff0, color1, coeff1; + bool8 tint0, tint1; + u32 defaultColor = DEFAULT_LIGHT_COLOR; + + if (!palettes) + return; + + color0 = blend0->blendColor; + tint0 = blend0->isTint; + coeff0 = tint0 ? 8 * 2 : blend0->coeff * 2; + color1 = blend1->blendColor; + tint1 = blend1->isTint; + coeff1 = tint1 ? 8 * 2 : blend1->coeff * 2; + + if (tint0) + { + r0 = (color0 << 24) >> 24; + g0 = (color0 << 16) >> 24; + b0 = (color0 << 8) >> 24; + } + else + { + r0 = (color0 << 27) >> 27; + g0 = (color0 << 22) >> 27; + b0 = (color0 << 17) >> 27; + } + if (tint1) + { + r1 = (color1 << 24) >> 24; + g1 = (color1 << 16) >> 24; + b1 = (color1 << 8) >> 24; + } + else + { + r1 = (color1 << 27) >> 27; + g1 = (color1 << 22) >> 27; + b1 = (color1 << 17) >> 27; + } + defR = (defaultColor << 27) >> 27; + defG = (defaultColor << 22) >> 27; + defB = (defaultColor << 17) >> 27; + + do + { + if (palettes & 1) + { + u16 *srcEnd = src + 16; + u32 altBlendColor = *dst++ = *src++; + if (altBlendColor >> 15) + { + altR = (altBlendColor << 27) >> 27; + altG = (altBlendColor << 22) >> 27; + altB = (altBlendColor << 17) >> 27; + } + else + altBlendColor = 0; + while (src != srcEnd) + { + u32 srcColor = *src; + s32 r = (srcColor << 27) >> 27; + s32 g = (srcColor << 22) >> 27; + s32 b = (srcColor << 17) >> 27; + s32 r2, g2, b2; + + if (srcColor >> 15) + { + if (altBlendColor) + { + r2 = r + (((altR - r) * (s32)coeff1) >> 5); + g2 = g + (((altG - g) * (s32)coeff1) >> 5); + b2 = b + (((altB - b) * (s32)coeff1) >> 5); + r = r + (((altR - r) * (s32)coeff0) >> 5); + g = g + (((altG - g) * (s32)coeff0) >> 5); + b = b + (((altB - b) * (s32)coeff0) >> 5); + } + else + { + r2 = r + (((defR - r) * (s32)coeff1) >> 5); + g2 = g + (((defG - g) * (s32)coeff1) >> 5); + b2 = b + (((defB - b) * (s32)coeff1) >> 5); + r = r + (((defR - r) * (s32)coeff0) >> 5); + g = g + (((defG - g) * (s32)coeff0) >> 5); + b = b + (((defB - b) * (s32)coeff0) >> 5); + } + } + else + { + if (!tint1) + { + r2 = (r + (((r1 - r) * (s32)coeff1) >> 5)); + g2 = (g + (((g1 - g) * (s32)coeff1) >> 5)); + b2 = (b + (((b1 - b) * (s32)coeff1) >> 5)); + } + else + { + r2 = (u16)((r1 * r)) >> 8; + g2 = (u16)((g1 * g)) >> 8; + b2 = (u16)((b1 * b)) >> 8; + if (r2 > 31) + r2 = 31; + if (g2 > 31) + g2 = 31; + if (b2 > 31) + b2 = 31; + } + if (!tint0) + { + r = (r + (((r0 - r) * (s32)coeff0) >> 5)); + g = (g + (((g0 - g) * (s32)coeff0) >> 5)); + b = (b + (((b0 - b) * (s32)coeff0) >> 5)); + } + else + { + r = (u16)((r0 * r)) >> 8; + g = (u16)((g0 * g)) >> 8; + b = (u16)((b0 * b)) >> 8; + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + } + } + r = r2 + (((r - r2) * (s32)weight0) >> 8); + g = g2 + (((g - g2) * (s32)weight0) >> 8); + b = b2 + (((b - b2) * (s32)weight0) >> 8); + *dst++ = RGB2(r, g, b); + src++; + } + } + else + { + src += 16; + dst += 16; + } + palettes >>= 1; + } while (palettes); +} + +void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0) +{ + u16 *srcEnd = src0 + 16; + src0++; + src1++; + dst++; + while (src0 != srcEnd) + { + u32 src0Color = *src0++; + s32 r0 = (src0Color << 27) >> 27; + s32 g0 = (src0Color << 22) >> 27; + s32 b0 = (src0Color << 17) >> 27; + u32 src1Color = *src1++; + s32 r1 = (src1Color << 27) >> 27; + s32 g1 = (src1Color << 22) >> 27; + s32 b1 = (src1Color << 17) >> 27; + + r0 = r1 + (((r0 - r1) * weight0) >> 8); + g0 = g1 + (((g0 - g1) * weight0) >> 8); + b0 = b1 + (((b0 - b1) * weight0) >> 8); + *dst = (*dst & RGB_ALPHA) | RGB2(r0, g0, b0); + dst++; + } +} diff --git a/src/palette_util.c b/src/palette_util.c index 08239c336..5fdb49851 100755 --- a/src/palette_util.c +++ b/src/palette_util.c @@ -2,6 +2,7 @@ #include "palette.h" #include "palette_util.h" #include "util.h" +#include "overworld.h" // "RouletteFlash" is more accurately a general flashing/fading util // this file handles fading the palettes for the color/icon selections on the Roulette wheel @@ -385,7 +386,9 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend) if (--pulseBlendPalette->delayCounter == 0xFF) { pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; - BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); + CpuFastCopy(gPlttBufferUnfaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, 32); + UpdatePalettesWithTime(1 << (pulseBlendPalette->pulseBlendSettings.paletteOffset >> 4)); + BlendPalettesFine(1, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, gPlttBufferFaded + pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); switch (pulseBlendPalette->pulseBlendSettings.fadeType) { case 0: // Fade all the way to the max blend amount, then wrap around diff --git a/src/pokemon.c b/src/pokemon.c index a360feb0b..fcbb3cd69 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -53,6 +53,8 @@ #include "constants/union_room.h" #include "constants/weather.h" +#define FRIENDSHIP_EVO_THRESHOLD 220 + struct SpeciesItem { u16 species; @@ -6472,8 +6474,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem, s targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_DAY: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220) + UpdateTimeOfDay(); + if (gTimeOfDay == TIME_OF_DAY_DAY && friendship >= FRIENDSHIP_EVO_THRESHOLD) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_DAY: @@ -6482,8 +6484,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem, s targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_FRIENDSHIP_NIGHT: - RtcCalcLocalTime(); - if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220) + UpdateTimeOfDay(); + if (gTimeOfDay == TIME_OF_DAY_NIGHT && friendship >= FRIENDSHIP_EVO_THRESHOLD) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_NIGHT: diff --git a/src/rotating_gate.c b/src/rotating_gate.c index 0b0c68a83..f989b4e59 100644 --- a/src/rotating_gate.c +++ b/src/rotating_gate.c @@ -461,11 +461,12 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_RotatingGate[] = sSpriteAffineAnim_RotatingClockwise270to360Faster, }; +#define OBJ_EVENT_PAL_TAG_NPC_1 0x1103 static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge = { .tileTag = ROTATING_GATE_TILE_TAG, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NPC_1, .oam = &sOamData_RotatingGateLarge, .anims = sSpriteAnimTable_RotatingGateLarge, .images = NULL, @@ -476,7 +477,7 @@ static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge = static const struct SpriteTemplate sSpriteTemplate_RotatingGateRegular = { .tileTag = ROTATING_GATE_TILE_TAG, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_NPC_1, .oam = &sOamData_RotatingGateRegular, .anims = sSpriteAnimTable_RotatingGateRegular, .images = NULL, @@ -740,7 +741,7 @@ static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG; - spriteId = CreateSprite(&template, 0, 0, 0x94); + spriteId = CreateSprite(&template, 0, 0, 0x93); if (spriteId == MAX_SPRITES) return MAX_SPRITES; @@ -748,6 +749,7 @@ static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) y = gate->y + MAP_OFFSET; sprite = &gSprites[spriteId]; + UpdateSpritePaletteByTemplate(&template, sprite); sprite->data[0] = gateId; sprite->coordOffsetEnabled = 1; diff --git a/src/scrcmd.c b/src/scrcmd.c index 23aea1f6e..c8b71841c 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1181,7 +1181,7 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) bool8 ScrCmd_createvobject(struct ScriptContext *ctx) { - u8 graphicsId = ScriptReadByte(ctx); + u16 graphicsId = ScriptReadByte(ctx); u8 virtualObjId = ScriptReadByte(ctx); u16 x = VarGet(ScriptReadHalfword(ctx)); u32 y = VarGet(ScriptReadHalfword(ctx)); diff --git a/src/secret_base.c b/src/secret_base.c index 9509cd0fc..82888f6cf 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -159,7 +159,7 @@ static const struct YesNoFuncTable sDeleteRegistryYesNoFuncs = .noFunc = DeleteRegistry_No, }; -static const u8 sSecretBaseOwnerGfxIds[10] = +static const u16 sSecretBaseOwnerGfxIds[10] = { // Male OBJ_EVENT_GFX_YOUNGSTER, diff --git a/src/shop.c b/src/shop.c index facc508b3..b78f225ff 100644 --- a/src/shop.c +++ b/src/shop.c @@ -40,7 +40,7 @@ #include "constants/songs.h" #define TAG_SCROLL_ARROW 2100 -#define TAG_ITEM_ICON_BASE 2110 +#define TAG_ITEM_ICON_BASE 9110 #define MAX_ITEMS_SHOWN 8 @@ -903,6 +903,9 @@ static void BuyMenuDrawObjectEvents(void) u8 spriteId; const struct ObjectEventGraphicsInfo *graphicsInfo; + u8 weatherTemp = gWeatherPtr->palProcessingState; + if (weatherTemp == WEATHER_PAL_STATE_SCREEN_FADING_OUT) + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (sShopData->viewportObjects[i][OBJ_EVENT_ID] == OBJECT_EVENTS_COUNT) @@ -925,6 +928,8 @@ static void BuyMenuDrawObjectEvents(void) StartSpriteAnim(&gSprites[spriteId], sShopData->viewportObjects[i][ANIM_NUM]); } + gWeatherPtr->palProcessingState = weatherTemp; + CpuFastCopy(gPlttBufferFaded + PLTT_ID(16), gPlttBufferUnfaded + PLTT_ID(16), PLTT_BUFFER_SIZE); } static bool8 BuyMenuCheckIfObjectEventOverlapsMenuBg(s16 *object) diff --git a/src/trainer_see.c b/src/trainer_see.c index 6e1d41055..52222fd10 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -165,10 +165,12 @@ static const union AnimCmd *const sSpriteAnimTable_Icons[] = sSpriteAnim_Icons2 }; +#define OBJ_EVENT_PAL_TAG_MAY 0x1110 + static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark = { .tileTag = TAG_NONE, - .paletteTag = TAG_NONE, + .paletteTag = OBJ_EVENT_PAL_TAG_MAY, .oam = &sOamData_Icons, .anims = sSpriteAnimTable_Icons, .images = sSpriteImageTable_ExclamationQuestionMark, @@ -179,7 +181,7 @@ static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark = static const struct SpriteTemplate sSpriteTemplate_HeartIcon = { .tileTag = TAG_NONE, - .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, + .paletteTag = FLDEFF_PAL_TAG_NPC_1, .oam = &sOamData_Icons, .anims = sSpriteAnimTable_Icons, .images = sSpriteImageTable_HeartIcon, @@ -701,7 +703,10 @@ u8 FldEff_ExclamationMarkIcon(void) u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); if (spriteId != MAX_SPRITES) + { SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0); + UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); + } return 0; } @@ -711,7 +716,10 @@ u8 FldEff_QuestionMarkIcon(void) u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x52); if (spriteId != MAX_SPRITES) + { SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 1); + UpdateSpritePaletteByTemplate(&sSpriteTemplate_ExclamationQuestionMark, &gSprites[spriteId]); + } return 0; } @@ -725,7 +733,7 @@ u8 FldEff_HeartIcon(void) struct Sprite *sprite = &gSprites[spriteId]; SetIconSpriteData(sprite, FLDEFF_HEART_ICON, 0); - sprite->oam.paletteNum = 2; + UpdateSpritePaletteByTemplate(&sSpriteTemplate_HeartIcon, sprite); } return 0; diff --git a/src/union_room_player_avatar.c b/src/union_room_player_avatar.c index 31f535310..6a2d6081c 100644 --- a/src/union_room_player_avatar.c +++ b/src/union_room_player_avatar.c @@ -23,9 +23,8 @@ static u8 CreateTask_AnimateUnionRoomPlayers(void); static u32 IsUnionRoomPlayerInvisible(u32, u32); static void SetUnionRoomObjectFacingDirection(s32, s32, u8); -// + 2 is just to match, those elements are empty and never read // Graphics ids should correspond with the classes in gUnionRoomFacilityClasses -static const u8 sUnionRoomObjGfxIds[GENDER_COUNT][NUM_UNION_ROOM_CLASSES + 2] = { +static const u16 sUnionRoomObjGfxIds[GENDER_COUNT][NUM_UNION_ROOM_CLASSES] = { [MALE] = { OBJ_EVENT_GFX_MAN_3, OBJ_EVENT_GFX_BLACK_BELT, @@ -131,7 +130,7 @@ static bool32 IsPlayerStandingStill(void) } // Gender and trainer id are used to determine which sprite a player appears as -static u8 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id) +static u16 GetUnionRoomPlayerGraphicsId(u32 gender, u32 id) { return sUnionRoomObjGfxIds[gender][id % NUM_UNION_ROOM_CLASSES]; } @@ -442,7 +441,7 @@ static bool32 IsUnionRoomPlayerInvisible(u32 leaderId, u32 memberId) return IsVirtualObjectInvisible(UR_PLAYER_SPRITE_ID(leaderId, memberId) - UR_SPRITE_START_ID); } -static void SpawnGroupMember(u32 leaderId, u32 memberId, u8 graphicsId, struct RfuGameData * gameData) +static void SpawnGroupMember(u32 leaderId, u32 memberId, u16 graphicsId, struct RfuGameData * gameData) { s32 x, y; s32 id = UR_PLAYER_SPRITE_ID(leaderId, memberId); diff --git a/src/util.c b/src/util.c index 09381fcaf..767ebec04 100644 --- a/src/util.c +++ b/src/util.c @@ -264,6 +264,7 @@ u32 CalcByteArraySum(const u8 *data, u32 length) void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { u16 i; + struct PlttData *data2 = (struct PlttData *)&blendColor; for (i = 0; i < numEntries; i++) { u16 index = i + palOffset; @@ -271,7 +272,6 @@ void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) s8 r = data1->r; s8 g = data1->g; s8 b = data1->b; - struct PlttData *data2 = (struct PlttData *)&blendColor; gPlttBufferFaded[index] = RGB(r + (((data2->r - r) * coeff) >> 4), g + (((data2->g - g) * coeff) >> 4), b + (((data2->b - b) * coeff) >> 4)); diff --git a/tools/gbagfx/gfx.c b/tools/gbagfx/gfx.c index 1dfc38e2d..c413e4b0f 100644 --- a/tools/gbagfx/gfx.c +++ b/tools/gbagfx/gfx.c @@ -14,6 +14,7 @@ #define GET_GBA_PAL_BLUE(x) (((x) >> 10) & 0x1F) #define SET_GBA_PAL(r, g, b) (((b) << 10) | ((g) << 5) | (r)) +#define SET_GBA_PAL_RGBA(r, g, b, a) (((a) << 15) | ((b) << 10) | ((g) << 5) | (r)) #define UPCONVERT_BIT_DEPTH(x) (((x) * 255) / 31) @@ -578,8 +579,9 @@ void WriteGbaPalette(char *path, struct Palette *palette) unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red); unsigned char green = DOWNCONVERT_BIT_DEPTH(palette->colors[i].green); unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue); + bool alpha = palette->colors[i].alpha; - uint16_t paletteEntry = SET_GBA_PAL(red, green, blue); + uint16_t paletteEntry = SET_GBA_PAL_RGBA(red, green, blue, alpha); fputc(paletteEntry & 0xFF, fp); fputc(paletteEntry >> 8, fp); diff --git a/tools/gbagfx/gfx.h b/tools/gbagfx/gfx.h index 1797d84df..30bbfeb8d 100644 --- a/tools/gbagfx/gfx.h +++ b/tools/gbagfx/gfx.h @@ -10,6 +10,7 @@ struct Color { unsigned char red; unsigned char green; unsigned char blue; + bool alpha; }; struct Palette { diff --git a/tools/gbagfx/jasc_pal.c b/tools/gbagfx/jasc_pal.c index e5ba9c3c2..3c5ccaf0b 100644 --- a/tools/gbagfx/jasc_pal.c +++ b/tools/gbagfx/jasc_pal.c @@ -22,7 +22,7 @@ // Blue - "0 0 255\r\n" // Brown - "150 75 0\r\n" -#define MAX_LINE_LENGTH 11 +#define MAX_LINE_LENGTH 64 void ReadJascPaletteLine(FILE *fp, char *line) { @@ -152,6 +152,37 @@ void ReadJascPalette(char *path, struct Palette *palette) FATAL_ERROR("Garbage after color data.\n"); fclose(fp); + char *dot = strrchr(path, '.'); + if (strcmp(dot, ".pal") != 0) + return; + strcpy(dot, ".pla"); + fp = fopen(path, "rb"); + + if (fp == NULL) + return; + + int i = 0; + while (i < palette->numColors && fgets(line, MAX_LINE_LENGTH, fp) != NULL) + { + if (line[0] == '#') + continue; + + char *s = line; + char *end; + int colorIndex; + + if (!ParseNumber(s, &end, 10, &colorIndex)) + FATAL_ERROR("Failed to parse aux color index.\n"); + + s = end; + + if (colorIndex >= palette->numColors) + FATAL_ERROR("Aux color index %d out of bounds.\n", colorIndex); + + palette->colors[colorIndex].alpha = 1; + i++; + } + fclose(fp); } void WriteJascPalette(char *path, struct Palette *palette) diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c index 98a1a1edf..bb1691c59 100644 --- a/tools/gbagfx/main.c +++ b/tools/gbagfx/main.c @@ -291,7 +291,7 @@ void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **a void HandlePngToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { - struct Palette palette = {}; + struct Palette palette = {0}; ReadPngPalette(inputPath, &palette); WriteJascPalette(outputPath, &palette); @@ -299,7 +299,7 @@ void HandlePngToJascPaletteCommand(char *inputPath, char *outputPath, int argc U void HandlePngToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { - struct Palette palette = {}; + struct Palette palette = {0}; ReadPngPalette(inputPath, &palette); WriteGbaPalette(outputPath, &palette); @@ -307,7 +307,7 @@ void HandlePngToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UN void HandleGbaToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) { - struct Palette palette = {}; + struct Palette palette = {0}; ReadGbaPalette(inputPath, &palette); WriteJascPalette(outputPath, &palette); @@ -340,7 +340,7 @@ void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc, } } - struct Palette palette = {}; + struct Palette palette = {0}; ReadJascPalette(inputPath, &palette);