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 9c5c2a030..c5fbddc9b 100644 Binary files a/data/layouts/BudportCity/map.bin and b/data/layouts/BudportCity/map.bin differ diff --git a/data/maps/BattleFrontier_OutsideEast/map.json b/data/maps/BattleFrontier_OutsideEast/map.json index c99fe3047..f608f7868 100644 --- a/data/maps/BattleFrontier_OutsideEast/map.json +++ b/data/maps/BattleFrontier_OutsideEast/map.json @@ -357,6 +357,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "BattleFrontier_OutsideEast_EventScript_Camper", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 5, + "y": 51, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": -3, + "y": 51, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/BattleFrontier_OutsideWest/map.json b/data/maps/BattleFrontier_OutsideWest/map.json index bcf579cf1..7597f4bcc 100644 --- a/data/maps/BattleFrontier_OutsideWest/map.json +++ b/data/maps/BattleFrontier_OutsideWest/map.json @@ -331,6 +331,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "BattleFrontier_OutsideWest_EventScript_PokefanF", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 61, + "y": 51, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 53, + "y": 51, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/BudportCity/map.json b/data/maps/BudportCity/map.json index 2efb4bb94..481a44c19 100644 --- a/data/maps/BudportCity/map.json +++ b/data/maps/BudportCity/map.json @@ -14,7 +14,19 @@ "battle_scene": "MAP_BATTLE_SCENE_NORMAL", "connections": 0, "object_events": [ - + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 7, + "y": 21, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" + } ], "warp_events": [ { diff --git a/data/maps/DewfordTown/map.json b/data/maps/DewfordTown/map.json index 73aea8287..911f3fdce 100644 --- a/data/maps/DewfordTown/map.json +++ b/data/maps/DewfordTown/map.json @@ -89,6 +89,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "DewfordTown_EventScript_TrendyPhraseBoy", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 4, + "y": 10, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/EverGrandeCity/map.json b/data/maps/EverGrandeCity/map.json index 6e0b5f707..6a524d145 100644 --- a/data/maps/EverGrandeCity/map.json +++ b/data/maps/EverGrandeCity/map.json @@ -20,7 +20,19 @@ } ], "object_events": [ - + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 29, + "y": 48, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + } ], "warp_events": [ { diff --git a/data/maps/FallarborTown/map.json b/data/maps/FallarborTown/map.json index f59fd7716..fa897361a 100644 --- a/data/maps/FallarborTown/map.json +++ b/data/maps/FallarborTown/map.json @@ -76,6 +76,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "FallarborTown_EventScript_Azurill", "flag": "FLAG_HIDE_FALLARBOR_AZURILL" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 16, + "y": 7, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 17, + "y": 15, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/FortreeCity/map.json b/data/maps/FortreeCity/map.json index 9efc51a7f..af87f9057 100644 --- a/data/maps/FortreeCity/map.json +++ b/data/maps/FortreeCity/map.json @@ -115,6 +115,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "FortreeCity_EventScript_Kecleon", "flag": "FLAG_HIDE_FORTREE_CITY_KECLEON" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 7, + "y": 6, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 6, + "y": 14, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/LavaridgeTown/map.json b/data/maps/LavaridgeTown/map.json index ecf7c5b9f..7dc95c186 100644 --- a/data/maps/LavaridgeTown/map.json +++ b/data/maps/LavaridgeTown/map.json @@ -136,6 +136,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "LavaridgeTown_EventScript_EggWoman", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 11, + "y": 6, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 17, + "y": 5, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/LilycoveCity/map.json b/data/maps/LilycoveCity/map.json index 8d43ea846..00a0969c2 100644 --- a/data/maps/LilycoveCity/map.json +++ b/data/maps/LilycoveCity/map.json @@ -310,6 +310,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "LilycoveCity_EventScript_FatMan", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 26, + "y": 14, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/MauvilleCity/map.json b/data/maps/MauvilleCity/map.json index eda6ec7fe..c22288499 100644 --- a/data/maps/MauvilleCity/map.json +++ b/data/maps/MauvilleCity/map.json @@ -177,6 +177,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_MAUVILLE_CITY_SCOTT" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 24, + "y": 5, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 25, + "y": 14, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/MossdeepCity/map.json b/data/maps/MossdeepCity/map.json index 3759694d8..7fac39e09 100644 --- a/data/maps/MossdeepCity/map.json +++ b/data/maps/MossdeepCity/map.json @@ -250,6 +250,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "MossdeepCity_EventScript_BlackBelt", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 30, + "y": 16, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 39, + "y": 18, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/OldaleTown/map.json b/data/maps/OldaleTown/map.json index 302ef5e9d..10e78f07d 100644 --- a/data/maps/OldaleTown/map.json +++ b/data/maps/OldaleTown/map.json @@ -81,6 +81,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "OldaleTown_EventScript_Rival", "flag": "FLAG_HIDE_OLDALE_TOWN_RIVAL" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 8, + "y": 16, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 16, + "y": 6, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/PacifidlogTown/map.json b/data/maps/PacifidlogTown/map.json index 37cfe8ad0..3c833550d 100644 --- a/data/maps/PacifidlogTown/map.json +++ b/data/maps/PacifidlogTown/map.json @@ -63,6 +63,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "PacifidlogTown_EventScript_NinjaBoy", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 10, + "y": 15, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/PetalburgCity/map.json b/data/maps/PetalburgCity/map.json index d653e46ae..fcfa3dc6b 100644 --- a/data/maps/PetalburgCity/map.json +++ b/data/maps/PetalburgCity/map.json @@ -141,6 +141,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_PETALBURG_CITY_SCOTT" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 16, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 27, + "y": 12, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/Route101/map.json b/data/maps/Route101/map.json index 5ad24fe0d..12cf46ca8 100644 --- a/data/maps/Route101/map.json +++ b/data/maps/Route101/map.json @@ -89,6 +89,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "Route101_EventScript_Boy", "flag": "FLAG_HIDE_ROUTE_101_BOY" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 8, + "y": -4, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/Route102/map.json b/data/maps/Route102/map.json index 8c8771b5e..2b29d67c2 100644 --- a/data/maps/Route102/map.json +++ b/data/maps/Route102/map.json @@ -141,6 +141,19 @@ "trainer_sight_or_berry_tree_id": "3", "script": "Route102_EventScript_Allen", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": -3, + "y": 2, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/Route112/map.json b/data/maps/Route112/map.json index 5340680ea..c13d8d736 100644 --- a/data/maps/Route112/map.json +++ b/data/maps/Route112/map.json @@ -211,6 +211,19 @@ "trainer_sight_or_berry_tree_id": "3", "script": "Route112_EventScript_Shayla", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": -3, + "y": 45, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/Route113/map.json b/data/maps/Route113/map.json index 2e5890d65..870347b32 100644 --- a/data/maps/Route113/map.json +++ b/data/maps/Route113/map.json @@ -237,6 +237,32 @@ "trainer_sight_or_berry_tree_id": "6", "script": "Route113_EventScript_Coby", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": -4, + "y": 7, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": -3, + "y": 15, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/Route119/map.json b/data/maps/Route119/map.json index f8591a5ba..2cf1e41bb 100644 --- a/data/maps/Route119/map.json +++ b/data/maps/Route119/map.json @@ -583,6 +583,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_ROUTE_119_SCOTT" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 47, + "y": 6, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 46, + "y": 14, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/RustboroCity/map.json b/data/maps/RustboroCity/map.json index 3d77404ee..75a76d73c 100644 --- a/data/maps/RustboroCity/map.json +++ b/data/maps/RustboroCity/map.json @@ -237,6 +237,253 @@ "trainer_sight_or_berry_tree_id": "0", "script": "RustboroCity_EventScript_Boy1", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 37, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 37, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 30, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 30, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 23, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 23, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 44, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 44, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 29, + "y": 48, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 14, + "y": 19, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 15, + "y": 17, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 9, + "y": 19, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 8, + "y": 17, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 15, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 22, + "y": 15, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 14, + "y": 54, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 17, + "y": 54, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 18, + "y": 38, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 18, + "y": 45, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index 972b51447..23a5e496b 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -484,6 +484,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "0x0", "flag": "FLAG_HIDE_SLATEPORT_CITY_SCOTT" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 21, + "y": 19, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 15, + "y": 26, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/SootopolisCity/map.json b/data/maps/SootopolisCity/map.json index c6a6757d2..6a19724e7 100644 --- a/data/maps/SootopolisCity/map.json +++ b/data/maps/SootopolisCity/map.json @@ -247,6 +247,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "SootopolisCity_EventScript_Wallace", "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 45, + "y": 31, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 19, + "y": 29, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/maps/VerdanturfTown/map.json b/data/maps/VerdanturfTown/map.json index 2d1df93ed..d1a9b8236 100644 --- a/data/maps/VerdanturfTown/map.json +++ b/data/maps/VerdanturfTown/map.json @@ -76,6 +76,32 @@ "trainer_sight_or_berry_tree_id": "0", "script": "VerdanturfTown_EventScript_Camper", "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 18, + "y": 3, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "1", + "script": "NULL", + "flag": "0" + }, + { + "graphics_id": "OBJ_EVENT_GFX_LIGHT_SPRITE", + "x": 14, + "y": 3, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "2", + "script": "NULL", + "flag": "0" } ], "warp_events": [ diff --git a/data/tilesets/primary/general/metatile_attributes.bin b/data/tilesets/primary/general/metatile_attributes.bin index 0b61bf2db..514ba37b2 100644 Binary files a/data/tilesets/primary/general/metatile_attributes.bin and b/data/tilesets/primary/general/metatile_attributes.bin differ diff --git a/data/tilesets/primary/general/metatiles.bin b/data/tilesets/primary/general/metatiles.bin index b369fee08..6290d4f41 100644 Binary files a/data/tilesets/primary/general/metatiles.bin and b/data/tilesets/primary/general/metatiles.bin differ diff --git a/data/tilesets/primary/general/palettes/04.pal b/data/tilesets/primary/general/palettes/04.pal index d8051b7ba..313337d6d 100644 --- a/data/tilesets/primary/general/palettes/04.pal +++ b/data/tilesets/primary/general/palettes/04.pal @@ -1,14 +1,14 @@ JASC-PAL 0100 16 -24 41 82 -255 255 255 +0 0 0 +216 224 232 222 230 238 -255 0 255 -255 0 255 -255 0 255 +184 200 224 +152 176 216 +112 184 240 156 164 189 -82 106 213 +80 104 208 65 90 189 57 82 156 41 65 139 @@ -16,4 +16,4 @@ JASC-PAL 139 164 222 106 131 213 82 106 213 -115 197 164 +96 168 232 diff --git a/data/tilesets/primary/general/palettes/04.pla b/data/tilesets/primary/general/palettes/04.pla new file mode 100644 index 000000000..5f08f88f3 --- /dev/null +++ b/data/tilesets/primary/general/palettes/04.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +1 +3 +4 +5 +15 \ No newline at end of file diff --git a/data/tilesets/primary/general/palettes/13.pal b/data/tilesets/primary/general/palettes/13.pal index 4b0812f09..73fec5261 100644 --- a/data/tilesets/primary/general/palettes/13.pal +++ b/data/tilesets/primary/general/palettes/13.pal @@ -1,19 +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 +232 0 128 +232 228 216 +222 230 238 +224 214 184 +216 200 152 +244 226 171 +156 164 189 +80 104 208 +65 90 189 +57 82 156 +41 65 139 +172 197 230 +139 164 222 +106 131 213 +82 106 213 +221 205 143 diff --git a/data/tilesets/primary/general/tiles.png b/data/tilesets/primary/general/tiles.png index 478d12434..1628f0ffb 100644 Binary files a/data/tilesets/primary/general/tiles.png and b/data/tilesets/primary/general/tiles.png differ diff --git a/data/tilesets/secondary/battle_frontier_outside_east/metatile_attributes.bin b/data/tilesets/secondary/battle_frontier_outside_east/metatile_attributes.bin index e7f5d7977..7950e8a29 100644 Binary files a/data/tilesets/secondary/battle_frontier_outside_east/metatile_attributes.bin and b/data/tilesets/secondary/battle_frontier_outside_east/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/battle_frontier_outside_east/metatiles.bin b/data/tilesets/secondary/battle_frontier_outside_east/metatiles.bin index d2e3a6995..fdda78e32 100644 Binary files a/data/tilesets/secondary/battle_frontier_outside_east/metatiles.bin and b/data/tilesets/secondary/battle_frontier_outside_east/metatiles.bin differ diff --git a/data/tilesets/secondary/battle_frontier_outside_east/tiles.png b/data/tilesets/secondary/battle_frontier_outside_east/tiles.png index 59ac5b7e9..1b70f52f6 100644 Binary files a/data/tilesets/secondary/battle_frontier_outside_east/tiles.png and b/data/tilesets/secondary/battle_frontier_outside_east/tiles.png differ 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 a4b865a31..8b31735aa 100644 Binary files a/data/tilesets/secondary/battle_frontier_outside_west/metatile_attributes.bin and b/data/tilesets/secondary/battle_frontier_outside_west/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/battle_frontier_outside_west/metatiles.bin b/data/tilesets/secondary/battle_frontier_outside_west/metatiles.bin index b41be94da..5d3e56da9 100644 Binary files a/data/tilesets/secondary/battle_frontier_outside_west/metatiles.bin and b/data/tilesets/secondary/battle_frontier_outside_west/metatiles.bin differ diff --git a/data/tilesets/secondary/battle_frontier_outside_west/tiles.png b/data/tilesets/secondary/battle_frontier_outside_west/tiles.png index 277abe7f8..efc4a2610 100644 Binary files a/data/tilesets/secondary/battle_frontier_outside_west/tiles.png and b/data/tilesets/secondary/battle_frontier_outside_west/tiles.png differ 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 000000000..eb9808467 Binary files /dev/null and b/data/tilesets/secondary/budport.bak/anim/balloons/0.png differ 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 000000000..65df1eaa0 Binary files /dev/null and b/data/tilesets/secondary/budport.bak/anim/balloons/1.png differ 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 000000000..47dd73ae4 Binary files /dev/null and b/data/tilesets/secondary/budport.bak/anim/balloons/2.png differ 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 000000000..65df1eaa0 Binary files /dev/null and b/data/tilesets/secondary/budport.bak/anim/balloons/3.png differ 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 000000000..aa64d680e Binary files /dev/null and b/data/tilesets/secondary/budport.bak/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/budport.bak/metatiles.bin b/data/tilesets/secondary/budport.bak/metatiles.bin new file mode 100644 index 000000000..963d6749c Binary files /dev/null and b/data/tilesets/secondary/budport.bak/metatiles.bin differ 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 000000000..5fb5f4e19 Binary files /dev/null and b/data/tilesets/secondary/budport.bak/tiles.png differ diff --git a/data/tilesets/secondary/budport/metatile_attributes.bin b/data/tilesets/secondary/budport/metatile_attributes.bin index aa64d680e..ab41f697f 100644 Binary files a/data/tilesets/secondary/budport/metatile_attributes.bin and b/data/tilesets/secondary/budport/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/budport/metatiles.bin b/data/tilesets/secondary/budport/metatiles.bin index 963d6749c..14bec42e1 100644 Binary files a/data/tilesets/secondary/budport/metatiles.bin and b/data/tilesets/secondary/budport/metatiles.bin differ 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 5fb5f4e19..c5f01eb1d 100644 Binary files a/data/tilesets/secondary/budport/tiles.png and b/data/tilesets/secondary/budport/tiles.png differ diff --git a/data/tilesets/secondary/dewford/metatile_attributes.bin b/data/tilesets/secondary/dewford/metatile_attributes.bin index 67ee25d40..ee8126f6c 100644 Binary files a/data/tilesets/secondary/dewford/metatile_attributes.bin and b/data/tilesets/secondary/dewford/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/dewford/metatiles.bin b/data/tilesets/secondary/dewford/metatiles.bin index 728d5b632..0940b2eb7 100644 Binary files a/data/tilesets/secondary/dewford/metatiles.bin and b/data/tilesets/secondary/dewford/metatiles.bin differ diff --git a/data/tilesets/secondary/dewford/tiles.png b/data/tilesets/secondary/dewford/tiles.png index 33e61b435..f53704a20 100644 Binary files a/data/tilesets/secondary/dewford/tiles.png and b/data/tilesets/secondary/dewford/tiles.png differ diff --git a/data/tilesets/secondary/ever_grande/metatile_attributes.bin b/data/tilesets/secondary/ever_grande/metatile_attributes.bin index 173bf5619..ccd80c532 100644 Binary files a/data/tilesets/secondary/ever_grande/metatile_attributes.bin and b/data/tilesets/secondary/ever_grande/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/ever_grande/palettes/01.pal b/data/tilesets/secondary/ever_grande/palettes/01.pal index 3c6e40c2e..2c0276761 100644 --- a/data/tilesets/secondary/ever_grande/palettes/01.pal +++ b/data/tilesets/secondary/ever_grande/palettes/01.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -24 41 82 -255 255 255 -222 230 238 -189 205 230 -156 180 222 +0 197 0 +246 197 123 +238 156 90 +205 115 41 +164 90 49 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 +224 226 171 +216 200 152 +255 255 238 +222 222 197 +197 197 164 +164 172 123 +255 255 115 diff --git a/data/tilesets/secondary/ever_grande/palettes/08.pal b/data/tilesets/secondary/ever_grande/palettes/08.pal index 083dd5080..fcd13d772 100644 --- a/data/tilesets/secondary/ever_grande/palettes/08.pal +++ b/data/tilesets/secondary/ever_grande/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -24 41 82 +0 0 0 246 197 123 238 156 90 205 115 41 diff --git a/data/tilesets/secondary/ever_grande/palettes/08.pla b/data/tilesets/secondary/ever_grande/palettes/08.pla new file mode 100644 index 000000000..5eb702de8 --- /dev/null +++ b/data/tilesets/secondary/ever_grande/palettes/08.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/metatile_attributes.bin b/data/tilesets/secondary/fallarbor/metatile_attributes.bin index 7a8451785..ba469027c 100644 Binary files a/data/tilesets/secondary/fallarbor/metatile_attributes.bin and b/data/tilesets/secondary/fallarbor/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/fallarbor/metatiles.bin b/data/tilesets/secondary/fallarbor/metatiles.bin index a8781129b..8872a2900 100644 Binary files a/data/tilesets/secondary/fallarbor/metatiles.bin and b/data/tilesets/secondary/fallarbor/metatiles.bin differ 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 3582d1d03..5c3419bdb 100644 Binary files a/data/tilesets/secondary/fallarbor/tiles.png and b/data/tilesets/secondary/fallarbor/tiles.png differ diff --git a/data/tilesets/secondary/fortree/metatiles.bin b/data/tilesets/secondary/fortree/metatiles.bin index ecc00d7e7..1b0958cbd 100644 Binary files a/data/tilesets/secondary/fortree/metatiles.bin and b/data/tilesets/secondary/fortree/metatiles.bin differ diff --git a/data/tilesets/secondary/fortree/palettes/08.pal b/data/tilesets/secondary/fortree/palettes/08.pal index 40b922e28..1d8a56f8e 100644 --- a/data/tilesets/secondary/fortree/palettes/08.pal +++ b/data/tilesets/secondary/fortree/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -255 255 255 +176 184 200 255 255 255 246 238 189 230 213 172 @@ -16,4 +16,4 @@ JASC-PAL 0 0 0 172 180 197 123 123 123 -115 197 164 +176 184 200 diff --git a/data/tilesets/secondary/fortree/palettes/08.pla b/data/tilesets/secondary/fortree/palettes/08.pla new file mode 100644 index 000000000..69488b50c --- /dev/null +++ b/data/tilesets/secondary/fortree/palettes/08.pla @@ -0,0 +1,6 @@ +# Color indices to set high bit +0 +8 +9 +11 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/fortree/tiles.png b/data/tilesets/secondary/fortree/tiles.png index 9cd688c5e..2da9fcbfa 100644 Binary files a/data/tilesets/secondary/fortree/tiles.png and b/data/tilesets/secondary/fortree/tiles.png differ diff --git a/data/tilesets/secondary/lavaridge/metatiles.bin b/data/tilesets/secondary/lavaridge/metatiles.bin index fd0314ed7..c9bc71442 100644 Binary files a/data/tilesets/secondary/lavaridge/metatiles.bin and b/data/tilesets/secondary/lavaridge/metatiles.bin differ diff --git a/data/tilesets/secondary/lavaridge/palettes/06.pal b/data/tilesets/secondary/lavaridge/palettes/06.pal index 00e1478a7..3ea0c4254 100644 --- a/data/tilesets/secondary/lavaridge/palettes/06.pal +++ b/data/tilesets/secondary/lavaridge/palettes/06.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 0 0 -65 74 106 -197 205 0 -230 238 238 -255 255 255 -255 115 65 -230 115 65 -180 98 90 -164 82 82 -205 49 0 -148 49 0 -246 24 24 -246 148 0 -148 164 65 -106 123 139 -222 222 0 +224 40 0 +64 72 104 +192 200 0 +224 232 232 +248 248 248 +248 112 64 +224 112 64 +176 96 88 +160 80 80 +200 48 0 +144 48 0 +240 24 24 +240 144 0 +144 160 64 +104 120 136 +224 40 0 diff --git a/data/tilesets/secondary/lavaridge/palettes/06.pla b/data/tilesets/secondary/lavaridge/palettes/06.pla new file mode 100644 index 000000000..26f59249a --- /dev/null +++ b/data/tilesets/secondary/lavaridge/palettes/06.pla @@ -0,0 +1,7 @@ +# Color indices to set high bit +0 +9 +10 +11 +12 +15 \ No newline at end of file diff --git a/data/tilesets/secondary/lavaridge/tiles.png b/data/tilesets/secondary/lavaridge/tiles.png index 2f6898a0f..03c832c37 100644 Binary files a/data/tilesets/secondary/lavaridge/tiles.png and b/data/tilesets/secondary/lavaridge/tiles.png differ diff --git a/data/tilesets/secondary/lilycove/metatile_attributes.bin b/data/tilesets/secondary/lilycove/metatile_attributes.bin index 0f4e01b92..f31cc9a04 100644 Binary files a/data/tilesets/secondary/lilycove/metatile_attributes.bin and b/data/tilesets/secondary/lilycove/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/lilycove/metatiles.bin b/data/tilesets/secondary/lilycove/metatiles.bin index 6018ac8ec..f82bdff5c 100644 Binary files a/data/tilesets/secondary/lilycove/metatiles.bin and b/data/tilesets/secondary/lilycove/metatiles.bin differ 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 44111c448..56be3ab4d 100644 Binary files a/data/tilesets/secondary/lilycove/tiles.png and b/data/tilesets/secondary/lilycove/tiles.png differ diff --git a/data/tilesets/secondary/mauville/metatile_attributes.bin b/data/tilesets/secondary/mauville/metatile_attributes.bin index 79e40abe2..e2b10eed5 100644 Binary files a/data/tilesets/secondary/mauville/metatile_attributes.bin and b/data/tilesets/secondary/mauville/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/mauville/metatiles.bin b/data/tilesets/secondary/mauville/metatiles.bin index a71ead8e5..2a082d647 100644 Binary files a/data/tilesets/secondary/mauville/metatiles.bin and b/data/tilesets/secondary/mauville/metatiles.bin differ 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 208a052c5..9d2830b18 100644 Binary files a/data/tilesets/secondary/mauville/tiles.png and b/data/tilesets/secondary/mauville/tiles.png differ diff --git a/data/tilesets/secondary/mossdeep/metatiles.bin b/data/tilesets/secondary/mossdeep/metatiles.bin index 5fc527d0f..1fe4faf9c 100644 Binary files a/data/tilesets/secondary/mossdeep/metatiles.bin and b/data/tilesets/secondary/mossdeep/metatiles.bin differ diff --git a/data/tilesets/secondary/mossdeep/palettes/01.pal b/data/tilesets/secondary/mossdeep/palettes/01.pal index 1d09f740d..e845b832b 100644 --- a/data/tilesets/secondary/mossdeep/palettes/01.pal +++ b/data/tilesets/secondary/mossdeep/palettes/01.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -131 197 98 +0 192 0 255 255 255 -222 230 238 -189 205 230 -156 180 222 -131 131 139 +205 205 197 +180 180 164 +180 189 222 +139 139 148 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 +255 248 180 +224 217 159 +255 213 49 +238 148 16 +205 213 131 +148 148 74 +90 82 8 diff --git a/data/tilesets/secondary/mossdeep/palettes/02.pal b/data/tilesets/secondary/mossdeep/palettes/02.pal index 4c41030f6..14fb4a989 100644 --- a/data/tilesets/secondary/mossdeep/palettes/02.pal +++ b/data/tilesets/secondary/mossdeep/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 32 0 +248 248 248 +248 0 248 +224 0 232 +64 128 96 +120 120 144 +96 96 120 +64 72 104 +255 227 148 +184 184 192 +160 160 152 +240 216 152 +208 144 112 +184 80 80 +128 56 64 +240 144 48 diff --git a/data/tilesets/secondary/mossdeep/palettes/08.pal b/data/tilesets/secondary/mossdeep/palettes/08.pal index 07d79210a..5b086f051 100644 --- a/data/tilesets/secondary/mossdeep/palettes/08.pal +++ b/data/tilesets/secondary/mossdeep/palettes/08.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -131 197 98 +0 0 0 255 255 255 205 205 197 180 180 164 diff --git a/data/tilesets/secondary/mossdeep/palettes/08.pla b/data/tilesets/secondary/mossdeep/palettes/08.pla new file mode 100644 index 000000000..5eb702de8 --- /dev/null +++ b/data/tilesets/secondary/mossdeep/palettes/08.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/mossdeep/palettes/09.pal b/data/tilesets/secondary/mossdeep/palettes/09.pal index cee575bae..088332116 100644 --- a/data/tilesets/secondary/mossdeep/palettes/09.pal +++ b/data/tilesets/secondary/mossdeep/palettes/09.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -131 197 98 -255 255 255 -139 205 123 -98 172 98 -65 131 98 -123 123 148 -98 98 123 -65 74 106 -41 49 90 -189 189 197 -164 164 156 -246 222 156 -213 148 115 -189 82 82 -131 57 65 -246 148 49 +0 32 0 +248 248 248 +248 0 248 +224 0 232 +64 128 96 +120 120 144 +96 96 120 +64 72 104 +80 72 104 +184 184 192 +160 160 152 +240 216 152 +208 144 112 +184 80 80 +128 56 64 +240 144 48 diff --git a/data/tilesets/secondary/mossdeep/tiles.png b/data/tilesets/secondary/mossdeep/tiles.png index cc4591f88..6c1bb1d39 100644 Binary files a/data/tilesets/secondary/mossdeep/tiles.png and b/data/tilesets/secondary/mossdeep/tiles.png differ diff --git a/data/tilesets/secondary/pacifidlog/palettes/02.pal b/data/tilesets/secondary/pacifidlog/palettes/02.pal index 4c41030f6..9ea109ce0 100644 --- a/data/tilesets/secondary/pacifidlog/palettes/02.pal +++ b/data/tilesets/secondary/pacifidlog/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 0 128 +222 230 164 +180 189 123 +156 164 98 +131 139 74 +90 98 41 +98 98 123 +65 74 106 +32 32 82 +238 230 164 +238 197 98 +205 156 57 +164 123 24 +131 82 49 +131 131 139 +244 226 171 diff --git a/data/tilesets/secondary/pacifidlog/palettes/09.pal b/data/tilesets/secondary/pacifidlog/palettes/09.pal index 780f5b0ab..653ffdfb3 100644 --- a/data/tilesets/secondary/pacifidlog/palettes/09.pal +++ b/data/tilesets/secondary/pacifidlog/palettes/09.pal @@ -16,4 +16,4 @@ JASC-PAL 164 123 24 131 82 49 131 131 139 -82 106 213 +64 72 104 diff --git a/data/tilesets/secondary/pacifidlog/palettes/09.pla b/data/tilesets/secondary/pacifidlog/palettes/09.pla new file mode 100644 index 000000000..321117092 --- /dev/null +++ b/data/tilesets/secondary/pacifidlog/palettes/09.pla @@ -0,0 +1,2 @@ +# Color indices to set high bit +15 \ No newline at end of file diff --git a/data/tilesets/secondary/pacifidlog/tiles.png b/data/tilesets/secondary/pacifidlog/tiles.png index 9fe620e1e..31f78891d 100644 Binary files a/data/tilesets/secondary/pacifidlog/tiles.png and b/data/tilesets/secondary/pacifidlog/tiles.png differ diff --git a/data/tilesets/secondary/petalburg/metatiles.bin b/data/tilesets/secondary/petalburg/metatiles.bin index 3711f4aee..3ca46efec 100644 Binary files a/data/tilesets/secondary/petalburg/metatiles.bin and b/data/tilesets/secondary/petalburg/metatiles.bin differ 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 00d6d94a4..c3ae46ad7 100644 Binary files a/data/tilesets/secondary/petalburg/tiles.png and b/data/tilesets/secondary/petalburg/tiles.png differ diff --git a/data/tilesets/secondary/rustboro/metatile_attributes.bin b/data/tilesets/secondary/rustboro/metatile_attributes.bin index e2b728c65..56b728b08 100644 Binary files a/data/tilesets/secondary/rustboro/metatile_attributes.bin and b/data/tilesets/secondary/rustboro/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/rustboro/metatiles.bin b/data/tilesets/secondary/rustboro/metatiles.bin index 5a0d1b0d1..649b09fac 100644 Binary files a/data/tilesets/secondary/rustboro/metatiles.bin and b/data/tilesets/secondary/rustboro/metatiles.bin differ 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 c3a3bfbab..1cf8473a2 100644 Binary files a/data/tilesets/secondary/rustboro/tiles.png and b/data/tilesets/secondary/rustboro/tiles.png differ diff --git a/data/tilesets/secondary/slateport/metatile_attributes.bin b/data/tilesets/secondary/slateport/metatile_attributes.bin index 496eb1a9c..0f311a694 100644 Binary files a/data/tilesets/secondary/slateport/metatile_attributes.bin and b/data/tilesets/secondary/slateport/metatile_attributes.bin differ diff --git a/data/tilesets/secondary/slateport/metatiles.bin b/data/tilesets/secondary/slateport/metatiles.bin index d474c31f5..81c28bc3c 100644 Binary files a/data/tilesets/secondary/slateport/metatiles.bin and b/data/tilesets/secondary/slateport/metatiles.bin differ diff --git a/data/tilesets/secondary/slateport/palettes/06.pal b/data/tilesets/secondary/slateport/palettes/06.pal index 0c2d8d3ca..1e7d9a822 100644 --- a/data/tilesets/secondary/slateport/palettes/06.pal +++ b/data/tilesets/secondary/slateport/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/slateport/palettes/06.pla b/data/tilesets/secondary/slateport/palettes/06.pla new file mode 100644 index 000000000..07f021d4b --- /dev/null +++ b/data/tilesets/secondary/slateport/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/slateport/palettes/12.pal b/data/tilesets/secondary/slateport/palettes/12.pal index 4b0812f09..7ef1f4f2d 100644 --- a/data/tilesets/secondary/slateport/palettes/12.pal +++ b/data/tilesets/secondary/slateport/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/slateport/palettes/12.pla b/data/tilesets/secondary/slateport/palettes/12.pla new file mode 100644 index 000000000..27f716b90 --- /dev/null +++ b/data/tilesets/secondary/slateport/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/slateport/palettes/15.pal b/data/tilesets/secondary/slateport/palettes/15.pal index e7717d74e..25b623a26 100644 --- a/data/tilesets/secondary/slateport/palettes/15.pal +++ b/data/tilesets/secondary/slateport/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/slateport/tiles.png b/data/tilesets/secondary/slateport/tiles.png index ff7588d2d..c5f01eb1d 100644 Binary files a/data/tilesets/secondary/slateport/tiles.png and b/data/tilesets/secondary/slateport/tiles.png differ 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 d27c817f0..f9a6be215 100644 Binary files a/data/tilesets/secondary/sootopolis/tiles.png and b/data/tilesets/secondary/sootopolis/tiles.png differ 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 461bba675..782d32f03 100644 Binary files a/graphics/battle_terrain/sky/tiles.png and b/graphics/battle_terrain/sky/tiles.png differ 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 765a5291a..eb334a976 100644 Binary files a/graphics/field_effects/pics/shadow_extra_large.png and b/graphics/field_effects/pics/shadow_extra_large.png differ diff --git a/graphics/field_effects/pics/shadow_large.png b/graphics/field_effects/pics/shadow_large.png index e917823b0..1695208af 100644 Binary files a/graphics/field_effects/pics/shadow_large.png and b/graphics/field_effects/pics/shadow_large.png differ diff --git a/graphics/field_effects/pics/shadow_medium.png b/graphics/field_effects/pics/shadow_medium.png index 83ab6e1f6..4327a053d 100644 Binary files a/graphics/field_effects/pics/shadow_medium.png and b/graphics/field_effects/pics/shadow_medium.png differ diff --git a/graphics/field_effects/pics/shadow_small.png b/graphics/field_effects/pics/shadow_small.png index f5feada2b..6cd37c5f2 100644 Binary files a/graphics/field_effects/pics/shadow_small.png and b/graphics/field_effects/pics/shadow_small.png differ 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 000000000..69a158b5d Binary files /dev/null and b/graphics/object_events/pics/misc/bike_tire_tracks.png differ diff --git a/graphics/object_events/pics/misc/light.png b/graphics/object_events/pics/misc/light.png new file mode 100644 index 000000000..69a158b5d Binary files /dev/null and b/graphics/object_events/pics/misc/light.png differ diff --git a/graphics/object_events/pics/misc/mart_light.png b/graphics/object_events/pics/misc/mart_light.png new file mode 100644 index 000000000..7ec1a434e Binary files /dev/null and b/graphics/object_events/pics/misc/mart_light.png differ 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 000000000..42d19f51c Binary files /dev/null and b/graphics/object_events/pics/misc/poke_center_light.png differ diff --git a/graphics/weather/fog.pal b/graphics/weather/fog.pal index 6191b6692..1f40dd4e7 100644 --- a/graphics/weather/fog.pal +++ b/graphics/weather/fog.pal @@ -10,7 +10,7 @@ JASC-PAL 213 213 213 222 222 222 164 164 164 -255 0 255 +0 0 0 255 0 255 255 0 255 180 180 180 diff --git a/include/battle_tower.h b/include/battle_tower.h index a80314592..8288ffb7e 100644 --- a/include/battle_tower.h +++ b/include/battle_tower.h @@ -54,7 +54,7 @@ void CallBattleTowerFunc(void); u16 GetRandomScaledFrontierTrainerId(u8 challengeNum, u8 battleNum); void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId); void SetEReaderTrainerGfxId(void); -u8 GetBattleFacilityTrainerGfxId(u16 trainerId); +u16 GetBattleFacilityTrainerGfxId(u16 trainerId); void PutNewBattleTowerRecord(struct EmeraldBattleTowerRecord *newRecordEm); u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); u8 GetFrontierOpponentClass(u16 trainerId); @@ -81,7 +81,7 @@ void GetBattleTowerTrainerLanguage(u8 *dst, u16 trainerId); u8 SetFacilityPtrsGetLevel(void); u8 GetFrontierEnemyMonLevel(u8 lvlMode); s32 GetHighestLevelInPlayerParty(void); -u8 FacilityClassToGraphicsId(u8 facilityClass); +u16 FacilityClassToGraphicsId(u8 facilityClass); bool32 ValidateBattleTowerRecord(u8 recordId); // unused void TrySetLinkBattleTowerEnemyPartyLevel(void); diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index c8fa94265..07424824b 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -5,7 +5,7 @@ #define OBJ_EVENT_GFX_BRENDAN_MACH_BIKE 1 #define OBJ_EVENT_GFX_BRENDAN_SURFING 2 #define OBJ_EVENT_GFX_BRENDAN_FIELD_MOVE 3 -#define OBJ_EVENT_GFX_QUINTY_PLUMP 4 +#define OBJ_EVENT_GFX_LIGHT_SPRITE 4 #define OBJ_EVENT_GFX_NINJA_BOY 5 #define OBJ_EVENT_GFX_TWIN 6 #define OBJ_EVENT_GFX_BOY_1 7 @@ -274,10 +274,10 @@ #define OBJ_EVENT_GFX_VAR_E (OBJ_EVENT_GFX_VARS + 0xE) #define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF) // 255 -#define SHADOW_SIZE_S 0 -#define SHADOW_SIZE_M 1 -#define SHADOW_SIZE_L 2 -#define SHADOW_SIZE_XL 3 +#define SHADOW_SIZE_S 0 +#define SHADOW_SIZE_M 1 +#define SHADOW_SIZE_L 2 +#define SHADOW_SIZE_NONE 3 #define F_INANIMATE (1 << 6) #define F_DISABLE_REFLECTION_PALETTE_LOAD (1 << 7) diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index a62040947..a8d1d3fa6 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -119,5 +119,14 @@ #define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F #define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010 #define FLDEFF_PAL_TAG_UNKNOWN 0x1011 +#define FLDEFF_PAL_TAG_BRENDAN 0x1100 // OBJ_EVENT_PAL_TAG_BRENDAN +#define FLDEFF_PAL_TAG_MAY 0x1110 // OBJ_EVENT_PAL_TAG_MAY +#define FLDEFF_PAL_TAG_NPC_1 0x1103 // OBJ_EVENT_PAL_TAG_NPC_1 +#define FLDEFF_PAL_TAG_NPC_2 0x1104 // OBJ_EVENT_PAL_TAG_NPC_2 + +#define FLDEFF_TILE_TAG_SHADOW_SMALL 0x1400 +#define FLDEFF_TILE_TAG_SHADOW_MEDIUM 0x1401 +#define FLDEFF_TILE_TAG_SHADOW_LARGE 0x1402 +#define FLDEFF_TILE_TAG_SHADOW_EXTRA_LARGE 0x1403 #endif // GUARD_FIELD_EFFECT_CONSTANTS_H diff --git a/include/event_data.h b/include/event_data.h index 51875ec5a..04287b7ed 100644 --- a/include/event_data.h +++ b/include/event_data.h @@ -22,7 +22,7 @@ u16 *GetVarPointer(u16 id); u16 VarGet(u16 id); u16 VarGetIfExist(u16 id); bool8 VarSet(u16 id, u16 value); -u8 VarGetObjectEventGraphicsId(u8 id); +u16 VarGetObjectEventGraphicsId(u8 id); u8 *GetFlagPointer(u16 id); u8 FlagSet(u16 id); u8 FlagToggle(u16 id); diff --git a/include/event_object_movement.h b/include/event_object_movement.h index dc3b4852e..e6add6582 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -92,7 +92,6 @@ struct LockedAnimObjectEvents extern const struct OamData gObjectEventBaseOam_32x8; extern const struct OamData gObjectEventBaseOam_32x32; extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; -extern const u8 gReflectionEffectPaletteMap[]; extern const u8 *const gBerryTreeObjectEventGraphicsIdTablePointers[]; extern const struct SpriteFrameImage *const gBerryTreePicTablePointers[]; @@ -106,10 +105,7 @@ u8 GetObjectEventIdByXY(s16 x, s16 y); void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction); u8 GetFirstInactiveObjectEventId(void); void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup); -void LoadPlayerObjectReflectionPalette(u16 tag, u8 slot); -void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot); void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); -void PatchObjectPalette(u16 paletteTag, u8 paletteSlot); void SpawnObjectEventsOnReturnToField(s16 x, s16 y); void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat); void GetMapCoordsFromSpritePos(s16 x, s16 y, s16 *destX, s16 *destY); @@ -120,14 +116,14 @@ void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *); void TrySpawnObjectEvents(s16 cameraX, s16 cameraY); u8 CreateObjectGraphicsSprite(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority); u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup); -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); u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *); void SetSpritePosToMapCoords(s16 mapX, s16 mapY, s16 *destX, s16 *destY); void CameraObjectReset1(void); -void ObjectEventSetGraphicsId(struct ObjectEvent *, u8 graphicsId); +void ObjectEventSetGraphicsId(struct ObjectEvent *, u16 graphicsId); void ObjectEventTurn(struct ObjectEvent *, u8 direction); void ObjectEventTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction); -const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId); +const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u16 graphicsId); void SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, bool8 invisible); void FreeAndReserveObjectSpritePalettes(void); void SetObjectEventSpritePosByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); @@ -138,7 +134,6 @@ void ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, void ShiftObjectEventCoords(struct ObjectEvent *, s16 x, s16 y); void MoveObjectEventToMapCoords(struct ObjectEvent *, s16 x, s16 y); void TryOverrideObjectEventTemplateCoords(u8 localId, u8 mapNum, u8 mapGroup); -void InitObjectEventPalettes(u8 palSlot); void UpdateObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *, bool8(struct ObjectEvent *, struct Sprite *)); u8 ObjectEventFaceOppositeDirection(struct ObjectEvent *, u8 direction); u8 GetOppositeDirection(u8 direction); @@ -207,7 +202,6 @@ u8 GetMoveDirectionFasterAnimNum(u8 direction); u8 GetMoveDirectionFastestAnimNum(u8 direction); u8 GetLedgeJumpDirection(s16 x, s16 y, u8 direction); void CameraObjectSetFollowedSpriteId(u8 objectId); -u16 GetObjectPaletteTag(u8 palSlot); void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible); s16 GetFigure8XOffset(s16 idx); s16 GetFigure8YOffset(s16 idx); @@ -215,6 +209,10 @@ void CameraObjectReset2(void); u8 GetObjectEventBerryTreeId(u8 objectEventId); void SetBerryTreeJustPicked(u8 mapId, u8 mapNumber, u8 mapGroup); bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup); +u8 LoadObjectEventPalette(u16 paletteTag); +void UpdateLightSprite(struct Sprite *sprite); +u8 UpdateSpritePaletteByTemplate(const struct SpriteTemplate *template, struct Sprite *sprite); +u8 CreateObjectGraphicsSpriteWithTag(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u16 paletteTag); void MovementType_None(struct Sprite *); void MovementType_LookAround(struct Sprite *); @@ -432,9 +430,9 @@ u8 MovementType_Invisible_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step2(struct ObjectEvent *, struct Sprite *); -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); void TurnVirtualObject(u8 virtualObjId, u8 direction); -void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId); +void SetVirtualObjectGraphics(u8 virtualObjId, u16 graphicsId); void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible); bool32 IsVirtualObjectInvisible(u8 virtualObjId); void SetVirtualObjectSpriteAnim(u8 virtualObjId, u8 animNum); diff --git a/include/field_effect.h b/include/field_effect.h index 4cde29e8a..239e7db8e 100644 --- a/include/field_effect.h +++ b/include/field_effect.h @@ -24,6 +24,7 @@ void FieldEffectScript_LoadTiles(u8 **script); void FieldEffectScript_LoadFadedPalette(u8 **script); void FieldEffectScript_LoadPalette(u8 **script); void FieldEffectScript_CallNative(u8 **script, u32 *val); +void FieldEffectFreeGraphicsResources(struct Sprite *sprite); void FieldEffectFreeTilesIfUnused(u16 tileStart); void FieldEffectFreePaletteIfUnused(u8 paletteNum); bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val); diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index 2ae5d79f7..90286760b 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -41,5 +41,6 @@ void UpdateBubblesFieldEffect(struct Sprite *); void UpdateSparkleFieldEffect(struct Sprite *); void SetSpriteInvisible(u8 spriteId); void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y); +void SetUpShadow(struct ObjectEvent *objEvent, struct Sprite *sprite); #endif //GUARD_FIELD_EFFECT_HELPERS_H diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index 9288ee9e7..2ebf94912 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -3,8 +3,8 @@ void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys); void ClearPlayerAvatarInfo(void); -void SetPlayerAvatarExtraStateTransition(u8, u8); -u8 GetPlayerAvatarGenderByGraphicsId(u8); +void SetPlayerAvatarExtraStateTransition(u16, u8); +u16 GetPlayerAvatarGenderByGraphicsId(u16); bool8 TestPlayerAvatarFlags(u8); u8 GetPlayerAvatarSpriteId(void); void PlayerGetDestCoords(s16 *, s16 *); @@ -38,11 +38,11 @@ void PlayerFreeze(void); void StopPlayerAvatar(void); void SetSpinStartFacingDir(u8); void GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr); -u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender); +u16 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender); void SetPlayerAvatarFieldMove(void); -u8 GetPlayerAvatarGraphicsIdByCurrentState(void); +u16 GetPlayerAvatarGraphicsIdByCurrentState(void); void SetPlayerAvatarStateMask(u8 flags); -u8 GetPlayerAvatarGraphicsIdByStateId(u8 state); +u16 GetPlayerAvatarGraphicsIdByStateId(u8 state); u8 GetJumpSpecialMovementAction(u32); bool8 PartyHasMonWithSurf(void); bool8 IsPlayerFacingSurfableFishableWater(void); @@ -50,8 +50,8 @@ bool8 IsPlayerSurfingNorth(void); void SetPlayerAvatarWatering(u8 direction); u8 GetPlayerAvatarFlags(void); void UpdatePlayerAvatarTransitionState(void); -u8 GetFRLGAvatarGraphicsIdByGender(u8); -u8 GetRSAvatarGraphicsIdByGender(u8); +u16 GetFRLGAvatarGraphicsIdByGender(u8); +u16 GetRSAvatarGraphicsIdByGender(u8); void PlayerWheelieInPlace(u8 direction); void PlayerWheelieMove(u8 direction); void PlayerPopWheelieWhileMoving(u8 direction); diff --git a/include/field_weather.h b/include/field_weather.h index 8ce0cc9e5..2e4295114 100644 --- a/include/field_weather.h +++ b/include/field_weather.h @@ -47,7 +47,8 @@ struct Weather s8 targetColorMapIndex; u8 colorMapStepDelay; u8 colorMapStepCounter; - u16 fadeDestColor; + u16 fadeDestColor:15; + u16 noShadows:1; u8 palProcessingState; u8 fadeScreenCounter; bool8 readyForInit; @@ -152,8 +153,8 @@ void ApplyWeatherColorMapIfIdle(s8 colorMapIndex); void ApplyWeatherColorMapIfIdle_Gradual(u8 colorMapIndex, u8 targetColorMapIndex, u8 colorMapStepDelay); void FadeScreen(u8 mode, s8 delay); bool8 IsWeatherNotFadingIn(void); -void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex); -void ApplyWeatherColorMapToPal(u8 paletteIndex); +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex, bool8 allowFog); +void ApplyWeatherColorMapToPal(u8 paletteIndex, u8 numPalettes); void LoadCustomWeatherSpritePalette(const u16 *palette); void ResetDroughtWeatherPaletteLoading(void); bool8 LoadDroughtWeatherPalettes(void); @@ -222,6 +223,7 @@ void Bubbles_InitVars(void); void Bubbles_Main(void); void Bubbles_InitAll(void); bool8 Bubbles_Finish(void); +u8 UpdateShadowColor(u16 color); u8 GetSavedWeather(void); void SetSavedWeather(u32 weather); diff --git a/include/fieldmap.h b/include/fieldmap.h index ecb1e49c4..318e91603 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -45,7 +45,7 @@ void InitTrainerHillMap(void); void InitBattlePyramidMap(bool8 setPlayerPosition); void CopyMapTilesetsToVram(struct MapLayout const *mapLayout); void LoadMapTilesetPalettes(struct MapLayout const *mapLayout); -void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout); +void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout, bool8 skipFaded); void CopySecondaryTilesetToVramUsingHeap(struct MapLayout const *mapLayout); void CopyPrimaryTilesetToVram(const struct MapLayout *); void CopySecondaryTilesetToVram(const struct MapLayout *); diff --git a/include/fldeff.h b/include/fldeff.h index bed235a1b..f676720ed 100644 --- a/include/fldeff.h +++ b/include/fldeff.h @@ -46,7 +46,7 @@ bool8 SetUpFieldMove_Dig(void); bool8 FldEff_UseDig(void); // rock smash -bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId); +bool8 CheckObjectGraphicsInFrontOfPlayer(u16 graphicsId); u8 CreateFieldMoveTask(void); bool8 SetUpFieldMove_RockSmash(void); bool8 FldEff_UseRockSmash(void); diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 1ebecb203..ce8a8d92c 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -37,8 +37,11 @@ typedef void (*TilesetCB)(void); struct Tileset { - /*0x00*/ bool8 isCompressed; + /*0x00*/ bool8 isCompressed:1; + /*0x00*/ u8 swapPalettes:7; /*0x01*/ bool8 isSecondary; + /*0x02*/ u8 lightPalettes; + /*0x03*/ u8 customLightColor; /*0x04*/ const u32 *tiles; /*0x08*/ const u16 (*palettes)[16]; /*0x0C*/ const u16 *metatiles; @@ -63,25 +66,24 @@ struct BackupMapLayout u16 *map; }; -struct ObjectEventTemplate +struct __attribute__((packed, aligned(4))) ObjectEventTemplate { /*0x00*/ u8 localId; - /*0x01*/ u8 graphicsId; - /*0x02*/ u8 kind; // Always OBJ_KIND_NORMAL in Emerald. - /*0x03*/ //u8 padding1; + /*0x01*/ u16 graphicsId; + /*0x03*/ u8 kind; // Always OBJ_KIND_NORMAL in Emerald. /*0x04*/ s16 x; /*0x06*/ s16 y; /*0x08*/ u8 elevation; /*0x09*/ u8 movementType; /*0x0A*/ u16 movementRangeX:4; u16 movementRangeY:4; - //u16 padding2:8; + u16 unused:8; /*0x0C*/ u16 trainerType; /*0x0E*/ u16 trainerRange_berryTreeId; /*0x10*/ const u8 *script; /*0x14*/ u16 flagId; - /*0x16*/ //u8 padding3[2]; -}; + /*0x16*/ u16 filler; +}; // size = 0x18 struct WarpEvent { @@ -189,15 +191,13 @@ struct ObjectEvent u32 inShallowFlowingWater:1; u32 inSandPile:1; u32 inHotSprings:1; - u32 hasShadow:1; + u32 noShadow:1; u32 spriteAnimPausedBackup:1; /*0x03*/ u32 spriteAffineAnimPausedBackup:1; u32 disableJumpLandingGroundEffect:1; u32 fixedPriority:1; u32 hideReflection:1; - //u32 padding:4; - /*0x04*/ u8 spriteId; - /*0x05*/ u8 graphicsId; + /*0x04*/ u16 graphicsId; /*0x06*/ u8 movementType; /*0x07*/ u8 trainerType; /*0x08*/ u8 localId; @@ -222,7 +222,7 @@ struct ObjectEvent u8 directionOverwrite:4; /*0x21*/ u8 directionSequenceIndex; /*0x22*/ u8 playerCopyableMovement; // COPY_MOVE_* - /*0x23*/ //u8 padding2; + /*0x23*/ u8 spriteId; /*size = 0x24*/ }; diff --git a/include/global.h b/include/global.h index 60abf094a..deb757ccb 100644 --- a/include/global.h +++ b/include/global.h @@ -523,6 +523,7 @@ struct SaveBlock2 }; // sizeof=0xF2C extern struct SaveBlock2 *gSaveBlock2Ptr; +extern u8 UpdateSpritePaletteWithTime(u8); struct SecretBaseParty { diff --git a/include/graphics.h b/include/graphics.h index 00727abac..582a1b5d4 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -7595,16 +7595,19 @@ extern const u32 gBattleTerrainTilemap_TallGrass[]; extern const u32 gBattleTerrainAnimTiles_TallGrass[]; extern const u32 gBattleTerrainAnimTilemap_TallGrass[]; extern const u32 gBattleTerrainPalette_TallGrass[]; +extern const u32 gBattleTerrainPalette_TallGrass_Night[]; extern const u32 gBattleTerrainTiles_LongGrass[]; extern const u32 gBattleTerrainTilemap_LongGrass[]; extern const u32 gBattleTerrainAnimTiles_LongGrass[]; extern const u32 gBattleTerrainAnimTilemap_LongGrass[]; extern const u32 gBattleTerrainPalette_LongGrass[]; +extern const u32 gBattleTerrainPalette_LongGrass_Night[]; extern const u32 gBattleTerrainTiles_Sand[]; extern const u32 gBattleTerrainTilemap_Sand[]; extern const u32 gBattleTerrainAnimTiles_Sand[]; extern const u32 gBattleTerrainAnimTilemap_Sand[]; extern const u32 gBattleTerrainPalette_Sand[]; +extern const u32 gBattleTerrainPalette_Sand_Night[]; extern const u32 gBattleTerrainTiles_Underwater[]; extern const u32 gBattleTerrainTilemap_Underwater[]; extern const u32 gBattleTerrainAnimTiles_Underwater[]; @@ -7615,16 +7618,20 @@ extern const u32 gBattleTerrainTilemap_Water[]; extern const u32 gBattleTerrainAnimTiles_Water[]; extern const u32 gBattleTerrainAnimTilemap_Water[]; extern const u32 gBattleTerrainPalette_Water[]; +extern const u32 gBattleTerrainPalette_Water_Night[]; extern const u32 gBattleTerrainTiles_PondWater[]; extern const u32 gBattleTerrainTilemap_PondWater[]; extern const u32 gBattleTerrainAnimTiles_PondWater[]; extern const u32 gBattleTerrainAnimTilemap_PondWater[]; extern const u32 gBattleTerrainPalette_PondWater[]; +extern const u32 gBattleTerrainPalette_PondWater_Night[]; +extern const u32 gBattleTerrainPalette_PondWater_Cave[]; extern const u32 gBattleTerrainTiles_Rock[]; extern const u32 gBattleTerrainTilemap_Rock[]; extern const u32 gBattleTerrainAnimTiles_Rock[]; extern const u32 gBattleTerrainAnimTilemap_Rock[]; extern const u32 gBattleTerrainPalette_Rock[]; +extern const u32 gBattleTerrainPalette_Rock_Night[]; extern const u32 gBattleTerrainTiles_Cave[]; extern const u32 gBattleTerrainTilemap_Cave[]; extern const u32 gBattleTerrainAnimTiles_Cave[]; @@ -7636,6 +7643,7 @@ extern const u32 gBattleTerrainAnimTiles_Building[]; extern const u32 gBattleTerrainAnimTilemap_Building[]; extern const u32 gBattleTerrainPalette_Building[]; extern const u32 gBattleTerrainPalette_Plain[]; +extern const u32 gBattleTerrainPalette_Plain_Night[]; extern const u32 gBattleTerrainPalette_Frontier[]; extern const u32 gBattleTerrainTiles_Stadium[]; extern const u32 gBattleTerrainTilemap_Stadium[]; @@ -7644,6 +7652,7 @@ extern const u32 gBattleTerrainTilemap_Rayquaza[]; extern const u32 gBattleTerrainAnimTiles_Rayquaza[]; extern const u32 gBattleTerrainAnimTilemap_Rayquaza[]; extern const u32 gBattleTerrainPalette_Rayquaza[]; +extern const u32 gBattleTerrainPalette_Rayquaza_Night[]; extern const u32 gBattleTerrainPalette_Kyogre[]; extern const u32 gBattleTerrainPalette_Groudon[]; extern const u32 gBattleTerrainPalette_BuildingGym[]; diff --git a/include/overworld.h b/include/overworld.h index bda2046ec..c30993cf7 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -25,6 +25,9 @@ #define MOVEMENT_MODE_SCRIPTED 2 #define SKIP_OBJECT_EVENT_LOAD 1 +#define TIME_OF_DAY_NIGHT 0 +#define TIME_OF_DAY_TWILIGHT 1 +#define TIME_OF_DAY_DAY 2 struct InitialPlayerAvatarState { @@ -40,6 +43,15 @@ struct LinkPlayerObjectEvent u8 movementMode; }; +struct __attribute__((packed)) TimeBlendSettings +{ + u16 weight:9; + u16 time1:3; + u16 time0:3; + u16 unused:1; + u16 altWeight; +}; + extern struct WarpData gLastUsedWarp; extern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4]; @@ -51,6 +63,9 @@ extern void (*gFieldCallback)(void); extern bool8 (*gFieldCallback2)(void); extern u8 gLocalLinkPlayerId; extern u8 gFieldLinkPlayerCount; +extern u8 gTimeOfDay; +extern u8 gTimeUpdateCounter; +extern struct TimeBlendSettings currentTimeBlend; extern const struct UCoords32 gDirectionToVectors[]; @@ -154,5 +169,9 @@ bool32 Overworld_RecvKeysFromLinkIsRunning(void); bool32 Overworld_SendKeysToLinkIsRunning(void); bool32 IsSendingKeysOverCable(void); void ClearLinkPlayerObjectEvents(void); +u8 UpdateTimeOfDay(void); +bool8 MapHasNaturalLight(u8 mapType); +void UpdateAltBgPalettes(u16 palettes); +void UpdatePalettesWithTime(u32); #endif // GUARD_OVERWORLD_H diff --git a/include/palette.h b/include/palette.h index 15c92cc2a..7ce590b4c 100644 --- a/include/palette.h +++ b/include/palette.h @@ -32,9 +32,19 @@ enum FAST_FADE_OUT_TO_BLACK, }; +struct BlendSettings +{ + u32 blendColor:24; + u32 isTint:1; + u32 coeff:5; +}; + struct PaletteFadeControl { u32 multipurpose1; + struct BlendSettings *bld0; + struct BlendSettings *bld1; + u16 weight:9; u8 delayCounter:6; u16 y:5; // blend coefficient u16 targetY:5; // target blend coefficient @@ -52,6 +62,7 @@ struct PaletteFadeControl u8 deltaY:4; // rate of change of blend coefficient }; +extern const struct BlendSettings gTimeOfDayBlend[]; extern struct PaletteFadeControl gPaletteFade; extern u32 gPlttBufferTransferPending; extern u8 ALIGNED(4) gPaletteDecompressionBuffer[]; @@ -60,6 +71,7 @@ extern u16 ALIGNED(4) gPlttBufferFaded[PLTT_BUFFER_SIZE]; void LoadCompressedPalette(const u32 *src, u16 offset, u16 size); void LoadPalette(const void *src, u16 offset, u16 size); +void LoadPaletteFast(const void *src, u16 offset, u16 size); void FillPalette(u16 value, u16 offset, u16 size); void TransferPlttBuffer(void); u8 UpdatePaletteFade(void); @@ -79,6 +91,10 @@ void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone); +bool8 BeginTimeOfDayPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, struct BlendSettings *bld0, struct BlendSettings *bld1, u16 weight, u16 color); +void BlendPalettesFine(u32 palettes, u16 *src, u16 *dst, u32 coeff, u32 color); +void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0); +void AvgPaletteWeighted(u16 *src0, u16 *src1, u16 *dst, u16 weight0); static inline void SetBackdropFromColor(u16 color) { diff --git a/pokeemerald-0.png b/pokeemerald-0.png new file mode 100644 index 000000000..1fa740296 Binary files /dev/null and b/pokeemerald-0.png differ diff --git a/src/battle_bg.c b/src/battle_bg.c index 97d5cc862..56a7079af 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -774,7 +774,11 @@ void DrawMainBattleBackground(void) { LZDecompressVram(gBattleTerrainTiles_Rayquaza, (void *)(BG_CHAR_ADDR(2))); LZDecompressVram(gBattleTerrainTilemap_Rayquaza, (void *)(BG_SCREEN_ADDR(26))); - LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + UpdateTimeOfDay(); + if (gTimeOfDay == TIME_OF_DAY_NIGHT) + LoadCompressedPalette(gBattleTerrainPalette_Rayquaza_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gTimeOfDay == TIME_OF_DAY_DAY) + LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); } else { @@ -801,9 +805,30 @@ void DrawMainBattleBackground(void) { default: case MAP_BATTLE_SCENE_NORMAL: + UpdateTimeOfDay(); LZDecompressVram(sBattleTerrainTable[gBattleTerrain].tileset, (void *)(BG_CHAR_ADDR(2))); LZDecompressVram(sBattleTerrainTable[gBattleTerrain].tilemap, (void *)(BG_SCREEN_ADDR(26))); - LoadCompressedPalette(sBattleTerrainTable[gBattleTerrain].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + if (gTimeOfDay == TIME_OF_DAY_NIGHT && gMapHeader.mapType != MAP_TYPE_INDOOR) + { + if (gBattleTerrain == BATTLE_TERRAIN_GRASS) + LoadCompressedPalette(gBattleTerrainPalette_TallGrass_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_LONG_GRASS) + LoadCompressedPalette(gBattleTerrainPalette_LongGrass_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_WATER) + LoadCompressedPalette(gBattleTerrainPalette_Water_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_PLAIN) + LoadCompressedPalette(gBattleTerrainPalette_Plain_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_MOUNTAIN) + LoadCompressedPalette(gBattleTerrainPalette_Rock_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_SAND) + LoadCompressedPalette(gBattleTerrainPalette_Sand_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + } + else if (gMapHeader.mapType == MAP_TYPE_UNDERGROUND && gBattleTerrain == BATTLE_TERRAIN_POND) + LoadCompressedPalette(gBattleTerrainPalette_PondWater_Cave, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gTimeOfDay == TIME_OF_DAY_NIGHT && gMapHeader.mapType != MAP_TYPE_UNDERGROUND && gBattleTerrain == BATTLE_TERRAIN_POND) + LoadCompressedPalette(gBattleTerrainPalette_PondWater_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else + LoadCompressedPalette(sBattleTerrainTable[gBattleTerrain].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_GYM: LZDecompressVram(gBattleTerrainTiles_Building, (void *)(BG_CHAR_ADDR(2))); @@ -1373,7 +1398,28 @@ bool8 LoadChosenBattleElement(u8 caseId) { default: case MAP_BATTLE_SCENE_NORMAL: - LoadCompressedPalette(sBattleTerrainTable[gBattleTerrain].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + UpdateTimeOfDay(); + if (gTimeOfDay == TIME_OF_DAY_NIGHT && gMapHeader.mapType != MAP_TYPE_INDOOR) + { + if (gBattleTerrain == BATTLE_TERRAIN_GRASS) + LoadCompressedPalette(gBattleTerrainPalette_TallGrass_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_LONG_GRASS) + LoadCompressedPalette(gBattleTerrainPalette_LongGrass_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_WATER) + LoadCompressedPalette(gBattleTerrainPalette_Water_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_PLAIN) + LoadCompressedPalette(gBattleTerrainPalette_Plain_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_MOUNTAIN) + LoadCompressedPalette(gBattleTerrainPalette_Rock_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gBattleTerrain == BATTLE_TERRAIN_SAND) + LoadCompressedPalette(gBattleTerrainPalette_Sand_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + } + else if (gMapHeader.mapType == MAP_TYPE_UNDERGROUND && gBattleTerrain == BATTLE_TERRAIN_POND) + LoadCompressedPalette(gBattleTerrainPalette_PondWater_Cave, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else if (gTimeOfDay == TIME_OF_DAY_NIGHT && gMapHeader.mapType != MAP_TYPE_UNDERGROUND && gBattleTerrain == BATTLE_TERRAIN_POND) + LoadCompressedPalette(gBattleTerrainPalette_PondWater_Night, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); + else + LoadCompressedPalette(sBattleTerrainTable[gBattleTerrain].palette, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); break; case MAP_BATTLE_SCENE_GYM: LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, BG_PLTT_ID(2), 3 * PLTT_SIZE_4BPP); @@ -1434,4 +1480,3 @@ void DrawTerrainTypeBattleBackground(void) break; } } - diff --git a/src/battle_tower.c b/src/battle_tower.c index 7615c796e..e29eb44a0 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1257,11 +1257,11 @@ void SetEReaderTrainerGfxId(void) SetBattleFacilityTrainerGfxId(TRAINER_EREADER, 0); } -u8 GetBattleFacilityTrainerGfxId(u16 trainerId) +u16 GetBattleFacilityTrainerGfxId(u16 trainerId) { u32 i; u8 facilityClass; - u8 trainerObjectGfxId; + u16 trainerObjectGfxId; SetFacilityPtrsGetLevel(); if (trainerId == TRAINER_EREADER) @@ -3584,7 +3584,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) } } -u8 FacilityClassToGraphicsId(u8 facilityClass) +u16 FacilityClassToGraphicsId(u8 facilityClass) { u8 trainerObjectGfxId; u8 i; diff --git a/src/battle_transition.c b/src/battle_transition.c index 2e87b9c1d..ba8cdcb07 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -1390,6 +1390,7 @@ static void InitPatternWeaveTransition(struct Task *task) sTransitionData->WIN0V = 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);