diff --git a/data/event_scripts.s b/data/event_scripts.s index 2d56bae9fbb2..65e07cb8f7f7 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -15,6 +15,7 @@ #include "constants/cable_club.h" #include "constants/coins.h" #include "constants/contest.h" +#include "constants/day_night.h" #include "constants/daycare.h" #include "constants/decorations.h" #include "constants/easy_chat.h" diff --git a/data/tilesets.s b/data/tilesets.s index 4436862348ba..b2b70a341a9e 100644 --- a/data/tilesets.s +++ b/data/tilesets.s @@ -1,3 +1,4 @@ +#include "constants/day_night.h" .include "asm/macros.inc" .include "constants/constants.inc" @@ -6,3 +7,4 @@ .include "data/tilesets/graphics.inc" .include "data/tilesets/metatiles.inc" .include "data/tilesets/headers.inc" + .include "data/tilesets/overrides.inc" diff --git a/data/tilesets/graphics.inc b/data/tilesets/graphics.inc index c7e6d15b0309..c4288672e7b9 100644 --- a/data/tilesets/graphics.inc +++ b/data/tilesets/graphics.inc @@ -1729,3 +1729,7 @@ gTilesetPalettes_UnionRoom:: @ 8395678 .align 2 gTilesetTiles_UnionRoom:: @ 8395878 .incbin "data/tilesets/secondary/union_room/tiles.4bpp.lz" + + .align 2 +gTilesetPalOverride_General05:: + .incbin "data/tilesets/primary/general/palettes/05_over.gbapal" diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index c56234b13b6e..292ce9da32a0 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -8,6 +8,8 @@ gTileset_General:: @ 83DF704 .4byte gMetatiles_General .4byte gMetatileAttributes_General .4byte InitTilesetAnim_General + .4byte NULL @ TODO: gTilesetPalOverrides_General + .4byte NULL .align 2 gTileset_Petalburg:: @ 83DF71C @@ -19,6 +21,8 @@ gTileset_Petalburg:: @ 83DF71C .4byte gMetatiles_Petalburg .4byte gMetatileAttributes_Petalburg .4byte InitTilesetAnim_Petalburg + .4byte NULL + .4byte NULL .align 2 gTileset_Rustboro:: @ 83DF734 @@ -30,6 +34,7 @@ gTileset_Rustboro:: @ 83DF734 .4byte gMetatiles_Rustboro .4byte gMetatileAttributes_Rustboro .4byte InitTilesetAnim_Rustboro + .4byte NULL .align 2 gTileset_Dewford:: @ 83DF74C @@ -41,6 +46,7 @@ gTileset_Dewford:: @ 83DF74C .4byte gMetatiles_Dewford .4byte gMetatileAttributes_Dewford .4byte InitTilesetAnim_Dewford + .4byte NULL .align 2 gTileset_Slateport:: @ 83DF764 @@ -52,6 +58,7 @@ gTileset_Slateport:: @ 83DF764 .4byte gMetatiles_Slateport .4byte gMetatileAttributes_Slateport .4byte InitTilesetAnim_Slateport + .4byte NULL .align 2 gTileset_Mauville:: @ 83DF77C @@ -63,6 +70,7 @@ gTileset_Mauville:: @ 83DF77C .4byte gMetatiles_Mauville .4byte gMetatileAttributes_Mauville .4byte InitTilesetAnim_Mauville + .4byte NULL .align 2 gTileset_Lavaridge:: @ 83DF794 @@ -74,6 +82,7 @@ gTileset_Lavaridge:: @ 83DF794 .4byte gMetatiles_Lavaridge .4byte gMetatileAttributes_Lavaridge .4byte InitTilesetAnim_Lavaridge + .4byte NULL .align 2 gTileset_Fallarbor:: @ 83DF7AC @@ -85,6 +94,7 @@ gTileset_Fallarbor:: @ 83DF7AC .4byte gMetatiles_Fallarbor .4byte gMetatileAttributes_Fallarbor .4byte InitTilesetAnim_Fallarbor + .4byte NULL .align 2 gTileset_Fortree:: @ 83DF7C4 @@ -96,6 +106,7 @@ gTileset_Fortree:: @ 83DF7C4 .4byte gMetatiles_Fortree .4byte gMetatileAttributes_Fortree .4byte InitTilesetAnim_Fortree + .4byte NULL .align 2 gTileset_Lilycove:: @ 83DF7DC @@ -107,6 +118,7 @@ gTileset_Lilycove:: @ 83DF7DC .4byte gMetatiles_Lilycove .4byte gMetatileAttributes_Lilycove .4byte InitTilesetAnim_Lilycove + .4byte NULL .align 2 gTileset_Mossdeep:: @ 83DF7F4 @@ -118,6 +130,7 @@ gTileset_Mossdeep:: @ 83DF7F4 .4byte gMetatiles_Mossdeep .4byte gMetatileAttributes_Mossdeep .4byte InitTilesetAnim_Mossdeep + .4byte NULL .align 2 gTileset_EverGrande:: @ 83DF80C @@ -129,6 +142,7 @@ gTileset_EverGrande:: @ 83DF80C .4byte gMetatiles_EverGrande .4byte gMetatileAttributes_EverGrande .4byte InitTilesetAnim_EverGrande + .4byte NULL .align 2 gTileset_Pacifidlog:: @ 83DF824 @@ -140,6 +154,7 @@ gTileset_Pacifidlog:: @ 83DF824 .4byte gMetatiles_Pacifidlog .4byte gMetatileAttributes_Pacifidlog .4byte InitTilesetAnim_Pacifidlog + .4byte NULL .align 2 gTileset_Sootopolis:: @ 83DF83C @@ -151,6 +166,7 @@ gTileset_Sootopolis:: @ 83DF83C .4byte gMetatiles_Sootopolis .4byte gMetatileAttributes_Sootopolis .4byte InitTilesetAnim_Sootopolis + .4byte NULL .align 2 gTileset_BattleFrontierOutsideWest:: @ 83DF854 @@ -162,6 +178,7 @@ gTileset_BattleFrontierOutsideWest:: @ 83DF854 .4byte gMetatiles_BattleFrontierOutsideWest .4byte gMetatileAttributes_BattleFrontierOutsideWest .4byte InitTilesetAnim_BattleFrontierOutsideWest + .4byte NULL .align 2 gTileset_BattleFrontierOutsideEast:: @ 83DF86C @@ -173,6 +190,7 @@ gTileset_BattleFrontierOutsideEast:: @ 83DF86C .4byte gMetatiles_BattleFrontierOutsideEast .4byte gMetatileAttributes_BattleFrontierOutsideEast .4byte InitTilesetAnim_BattleFrontierOutsideEast + .4byte NULL .align 2 gTileset_Building:: @ 83DF884 @@ -184,6 +202,7 @@ gTileset_Building:: @ 83DF884 .4byte gMetatiles_InsideBuilding .4byte gMetatileAttributes_InsideBuilding .4byte InitTilesetAnim_Building + .4byte NULL .align 2 gTileset_Shop:: @ 83DF89C @@ -195,6 +214,7 @@ gTileset_Shop:: @ 83DF89C .4byte gMetatiles_Shop .4byte gMetatileAttributes_Shop .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_PokemonCenter:: @ 83DF8B4 @@ -206,6 +226,7 @@ gTileset_PokemonCenter:: @ 83DF8B4 .4byte gMetatiles_PokemonCenter .4byte gMetatileAttributes_PokemonCenter .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_Cave:: @ 83DF8CC @@ -217,6 +238,7 @@ gTileset_Cave:: @ 83DF8CC .4byte gMetatiles_Cave .4byte gMetatileAttributes_Cave .4byte InitTilesetAnim_Cave + .4byte NULL .align 2 gTileset_PokemonSchool:: @ 83DF8E4 @@ -228,6 +250,7 @@ gTileset_PokemonSchool:: @ 83DF8E4 .4byte gMetatiles_PokemonSchool .4byte gMetatileAttributes_PokemonSchool .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_PokemonFanClub:: @ 83DF8FC @@ -239,6 +262,7 @@ gTileset_PokemonFanClub:: @ 83DF8FC .4byte gMetatiles_PokemonFanClub .4byte gMetatileAttributes_PokemonFanClub .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_Unused1:: @ 83DF914 @@ -250,6 +274,7 @@ gTileset_Unused1:: @ 83DF914 .4byte gMetatiles_Unused1 .4byte gMetatileAttributes_Unused1 .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_MeteorFalls:: @ 83DF92C @@ -261,6 +286,7 @@ gTileset_MeteorFalls:: @ 83DF92C .4byte gMetatiles_MeteorFalls .4byte gMetatileAttributes_MeteorFalls .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_OceanicMuseum:: @ 83DF944 @@ -272,6 +298,7 @@ gTileset_OceanicMuseum:: @ 83DF944 .4byte gMetatiles_OceanicMuseum .4byte gMetatileAttributes_OceanicMuseum .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_CableClub:: @ 83DF95C @@ -283,6 +310,7 @@ gTileset_CableClub:: @ 83DF95C .4byte gMetatiles_CableClub .4byte gMetatileAttributes_CableClub .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SeashoreHouse:: @ 83DF974 @@ -294,6 +322,7 @@ gTileset_SeashoreHouse:: @ 83DF974 .4byte gMetatiles_SeashoreHouse .4byte gMetatileAttributes_SeashoreHouse .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_PrettyPetalFlowerShop:: @ 83DF98C @@ -305,6 +334,7 @@ gTileset_PrettyPetalFlowerShop:: @ 83DF98C .4byte gMetatiles_PrettyPetalFlowerShop .4byte gMetatileAttributes_PrettyPetalFlowerShop .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_PokemonDayCare:: @ 83DF9A4 @@ -316,6 +346,7 @@ gTileset_PokemonDayCare:: @ 83DF9A4 .4byte gMetatiles_PokemonDayCare .4byte gMetatileAttributes_PokemonDayCare .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_Facility:: @ 83DF9BC @@ -327,6 +358,7 @@ gTileset_Facility:: @ 83DF9BC .4byte gMetatiles_Facility .4byte gMetatileAttributes_Facility .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BikeShop:: @ 83DF9D4 @@ -338,6 +370,7 @@ gTileset_BikeShop:: @ 83DF9D4 .4byte gMetatiles_BikeShop .4byte gMetatileAttributes_BikeShop .4byte InitTilesetAnim_BikeShop + .4byte NULL .align 2 gTileset_RusturfTunnel:: @ 83DF9EC @@ -349,6 +382,7 @@ gTileset_RusturfTunnel:: @ 83DF9EC .4byte gMetatiles_RusturfTunnel .4byte gMetatileAttributes_RusturfTunnel .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SecretBaseBrownCave:: @ 83DFA04 @@ -360,6 +394,7 @@ gTileset_SecretBaseBrownCave:: @ 83DFA04 .4byte gMetatiles_SecretBaseSecondary .4byte gMetatileAttributes_SecretBaseSecondary .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SecretBaseTree:: @ 83DFA1C @@ -371,6 +406,7 @@ gTileset_SecretBaseTree:: @ 83DFA1C .4byte gMetatiles_SecretBaseSecondary .4byte gMetatileAttributes_SecretBaseSecondary .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SecretBaseShrub:: @ 83DFA34 @@ -382,6 +418,7 @@ gTileset_SecretBaseShrub:: @ 83DFA34 .4byte gMetatiles_SecretBaseSecondary .4byte gMetatileAttributes_SecretBaseSecondary .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SecretBaseBlueCave:: @ 83DFA4C @@ -393,6 +430,7 @@ gTileset_SecretBaseBlueCave:: @ 83DFA4C .4byte gMetatiles_SecretBaseSecondary .4byte gMetatileAttributes_SecretBaseSecondary .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SecretBaseYellowCave:: @ 83DFA64 @@ -404,6 +442,7 @@ gTileset_SecretBaseYellowCave:: @ 83DFA64 .4byte gMetatiles_SecretBaseSecondary .4byte gMetatileAttributes_SecretBaseSecondary .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SecretBaseRedCave:: @ 83DFA7C @@ -415,6 +454,7 @@ gTileset_SecretBaseRedCave:: @ 83DFA7C .4byte gMetatiles_SecretBaseSecondary .4byte gMetatileAttributes_SecretBaseSecondary .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_InsideOfTruck:: @ 83DFA94 @@ -426,6 +466,7 @@ gTileset_InsideOfTruck:: @ 83DFA94 .4byte gMetatiles_InsideOfTruck .4byte gMetatileAttributes_InsideOfTruck .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_Unused2:: @ 83DFAAC @@ -437,6 +478,7 @@ gTileset_Unused2:: @ 83DFAAC .4byte gMetatiles_Unused2 .4byte gMetatileAttributes_Unused2 .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_Contest:: @ 83DFAC4 @@ -448,6 +490,7 @@ gTileset_Contest:: @ 83DFAC4 .4byte gMetatiles_Contest .4byte gMetatileAttributes_Contest .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_LilycoveMuseum:: @ 83DFADC @@ -459,6 +502,7 @@ gTileset_LilycoveMuseum:: @ 83DFADC .4byte gMetatiles_LilycoveMuseum .4byte gMetatileAttributes_LilycoveMuseum .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BrendansMaysHouse:: @ 83DFAF4 @@ -470,6 +514,7 @@ gTileset_BrendansMaysHouse:: @ 83DFAF4 .4byte gMetatiles_BrendansMaysHouse .4byte gMetatileAttributes_BrendansMaysHouse .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_Lab:: @ 83DFB0C @@ -481,6 +526,7 @@ gTileset_Lab:: @ 83DFB0C .4byte gMetatiles_Lab .4byte gMetatileAttributes_Lab .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_Underwater:: @ 83DFB24 @@ -492,6 +538,7 @@ gTileset_Underwater:: @ 83DFB24 .4byte gMetatiles_Underwater .4byte gMetatileAttributes_Underwater .4byte InitTilesetAnim_Underwater + .4byte NULL .align 2 gTileset_PetalburgGym:: @ 83DFB3C @@ -503,6 +550,7 @@ gTileset_PetalburgGym:: @ 83DFB3C .4byte gMetatiles_PetalburgGym .4byte gMetatileAttributes_PetalburgGym .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SootopolisGym:: @ 83DFB54 @@ -514,6 +562,7 @@ gTileset_SootopolisGym:: @ 83DFB54 .4byte gMetatiles_SootopolisGym .4byte gMetatileAttributes_SootopolisGym .4byte InitTilesetAnim_SootopolisGym + .4byte NULL .align 2 gTileset_GenericBuilding:: @ 83DFB6C @@ -525,6 +574,7 @@ gTileset_GenericBuilding:: @ 83DFB6C .4byte gMetatiles_GenericBuilding .4byte gMetatileAttributes_GenericBuilding .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_MauvilleGameCorner:: @ 83DFB84 @@ -536,6 +586,7 @@ gTileset_MauvilleGameCorner:: @ 83DFB84 .4byte gMetatiles_MauvilleGameCorner .4byte gMetatileAttributes_MauvilleGameCorner .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_RustboroGym:: @ 83DFB9C @@ -547,6 +598,7 @@ gTileset_RustboroGym:: @ 83DFB9C .4byte gMetatiles_RustboroGym .4byte gMetatileAttributes_RustboroGym .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_DewfordGym:: @ 83DFBB4 @@ -558,6 +610,7 @@ gTileset_DewfordGym:: @ 83DFBB4 .4byte gMetatiles_DewfordGym .4byte gMetatileAttributes_DewfordGym .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_MauvilleGym:: @ 83DFBCC @@ -569,6 +622,7 @@ gTileset_MauvilleGym:: @ 83DFBCC .4byte gMetatiles_MauvilleGym .4byte gMetatileAttributes_MauvilleGym .4byte InitTilesetAnim_MauvilleGym + .4byte NULL .align 2 gTileset_LavaridgeGym:: @ 83DFBE4 @@ -580,6 +634,7 @@ gTileset_LavaridgeGym:: @ 83DFBE4 .4byte gMetatiles_LavaridgeGym .4byte gMetatileAttributes_LavaridgeGym .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_TrickHousePuzzle:: @ 83DFBFC @@ -591,6 +646,7 @@ gTileset_TrickHousePuzzle:: @ 83DFBFC .4byte gMetatiles_TrickHousePuzzle .4byte gMetatileAttributes_TrickHousePuzzle .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_FortreeGym:: @ 83DFC14 @@ -602,6 +658,7 @@ gTileset_FortreeGym:: @ 83DFC14 .4byte gMetatiles_FortreeGym .4byte gMetatileAttributes_FortreeGym .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_MossdeepGym:: @ 83DFC2C @@ -613,6 +670,7 @@ gTileset_MossdeepGym:: @ 83DFC2C .4byte gMetatiles_MossdeepGym .4byte gMetatileAttributes_MossdeepGym .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_InsideShip:: @ 83DFC44 @@ -624,6 +682,7 @@ gTileset_InsideShip:: @ 83DFC44 .4byte gMetatiles_InsideShip .4byte gMetatileAttributes_InsideShip .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_SecretBase:: @ 83DFC5C @@ -635,6 +694,7 @@ gTileset_SecretBase:: @ 83DFC5C .4byte gMetatiles_SecretBasePrimary .4byte gMetatileAttributes_SecretBasePrimary .4byte NULL @ animation callback + .4byte NULL .align 2 gTilesetPointer_SecretBase:: @ 83DFC74 @@ -654,6 +714,7 @@ gTileset_EliteFour:: @ 83DFC7C .4byte gMetatiles_EliteFour .4byte gMetatileAttributes_EliteFour .4byte InitTilesetAnim_EliteFour + .4byte NULL .align 2 gTileset_BattleFrontier:: @ 83DFC94 @@ -665,6 +726,7 @@ gTileset_BattleFrontier:: @ 83DFC94 .4byte gMetatiles_BattleFrontier .4byte gMetatileAttributes_BattleFrontier .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BattlePalace:: @ 83DFCAC @@ -676,6 +738,7 @@ gTileset_BattlePalace:: @ 83DFCAC .4byte gMetatiles_BattlePalace .4byte gMetatileAttributes_BattlePalace .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BattleDome:: @ 83DFCC4 @@ -687,6 +750,7 @@ gTileset_BattleDome:: @ 83DFCC4 .4byte gMetatiles_BattleDome .4byte gMetatileAttributes_BattleDome .4byte InitTilesetAnim_BattleDome + .4byte NULL .align 2 gTileset_BattleFactory:: @ 83DFCDC @@ -698,6 +762,7 @@ gTileset_BattleFactory:: @ 83DFCDC .4byte gMetatiles_BattleFactory .4byte gMetatileAttributes_BattleFactory .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BattlePike:: @ 83DFCF4 @@ -709,6 +774,7 @@ gTileset_BattlePike:: @ 83DFCF4 .4byte gMetatiles_BattlePike .4byte gMetatileAttributes_BattlePike .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BattleArena:: @ 83DFD0C @@ -720,6 +786,7 @@ gTileset_BattleArena:: @ 83DFD0C .4byte gMetatiles_BattleArena .4byte gMetatileAttributes_BattleArena .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BattlePyramid:: @ 83DFD24 @@ -731,6 +798,7 @@ gTileset_BattlePyramid:: @ 83DFD24 .4byte gMetatiles_BattlePyramid .4byte gMetatileAttributes_BattlePyramid .4byte InitTilesetAnim_BattlePyramid + .4byte NULL .align 2 gTileset_MirageTower:: @ 83DFD3C @@ -742,6 +810,7 @@ gTileset_MirageTower:: @ 83DFD3C .4byte gMetatiles_MirageTower .4byte gMetatileAttributes_MirageTower .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_MossdeepGameCorner:: @ 83DFD54 @@ -753,6 +822,7 @@ gTileset_MossdeepGameCorner:: @ 83DFD54 .4byte gMetatiles_MossdeepGameCorner .4byte gMetatileAttributes_MossdeepGameCorner .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_IslandHarbor:: @ 83DFD6C @@ -764,6 +834,7 @@ gTileset_IslandHarbor:: @ 83DFD6C .4byte gMetatiles_IslandHarbor .4byte gMetatileAttributes_IslandHarbor .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_TrainerHill:: @ 83DFD84 @@ -775,6 +846,7 @@ gTileset_TrainerHill:: @ 83DFD84 .4byte gMetatiles_TrainerHill .4byte gMetatileAttributes_TrainerHill .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_NavelRock:: @ 83DFD9C @@ -786,6 +858,7 @@ gTileset_NavelRock:: @ 83DFD9C .4byte gMetatiles_NavelRock .4byte gMetatileAttributes_NavelRock .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BattleFrontierRankingHall:: @ 83DFDB4 @@ -797,6 +870,7 @@ gTileset_BattleFrontierRankingHall:: @ 83DFDB4 .4byte gMetatiles_BattleFrontierRankingHall .4byte gMetatileAttributes_BattleFrontierRankingHall .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_BattleTent:: @ 83DFDCC @@ -808,6 +882,7 @@ gTileset_BattleTent:: @ 83DFDCC .4byte gMetatiles_BattleTent .4byte gMetatileAttributes_BattleTent .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_MysteryEventsHouse:: @ 83DFDE4 @@ -819,6 +894,7 @@ gTileset_MysteryEventsHouse:: @ 83DFDE4 .4byte gMetatiles_MysteryEventsHouse .4byte gMetatileAttributes_MysteryEventsHouse .4byte NULL @ animation callback + .4byte NULL .align 2 gTileset_UnionRoom:: @ 83DFDFC @@ -830,3 +906,4 @@ gTileset_UnionRoom:: @ 83DFDFC .4byte gMetatiles_UnionRoom .4byte gMetatileAttributes_UnionRoom .4byte NULL @ animation callback + .4byte NULL diff --git a/data/tilesets/overrides.inc b/data/tilesets/overrides.inc new file mode 100755 index 000000000000..8c56d5a56955 --- /dev/null +++ b/data/tilesets/overrides.inc @@ -0,0 +1,13 @@ + .align 2 +gTilesetPalOverrides_General:: + .byte 5 + .byte TIME_NIGHT + .2byte 0 @ padding + .4byte gTilesetPalOverride_General05 + + .byte 0xFF + .byte 0 + .byte 0 + .byte 0 @ padding + .4byte NULL + .align 2 diff --git a/data/tilesets/primary/general/palettes/05_over.pal b/data/tilesets/primary/general/palettes/05_over.pal new file mode 100755 index 000000000000..3681b27b01d4 --- /dev/null +++ b/data/tilesets/primary/general/palettes/05_over.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +0 0 0 +247 247 157 +239 239 99 +222 222 56 +0 0 0 +0 0 0 +0 0 0 +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/gflib/sprite.c b/gflib/sprite.c index 2e96acf2c73a..69f25e85fed5 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1,7 +1,8 @@ #include "global.h" -#include "sprite.h" +#include "day_night.h" #include "main.h" #include "palette.h" +#include "sprite.h" #define MAX_SPRITE_COPY_REQUESTS 64 @@ -1609,6 +1610,27 @@ u8 LoadSpritePalette(const struct SpritePalette *palette) } } +u8 LoadSpritePaletteDayNight(const struct SpritePalette *palette) +{ + u8 index = IndexOfSpritePaletteTag(palette->tag); + + if (index != 0xFF) + return index; + + index = IndexOfSpritePaletteTag(0xFFFF); + + if (index == 0xFF) + { + return 0xFF; + } + else + { + sSpritePaletteTags[index] = palette->tag; + DoLoadSpritePaletteDayNight(palette->data, index * 16); + return index; + } +} + void LoadSpritePalettes(const struct SpritePalette *palettes) { u8 i; diff --git a/gflib/sprite.h b/gflib/sprite.h index 9753837fd7aa..144c226d0921 100644 --- a/gflib/sprite.h +++ b/gflib/sprite.h @@ -315,5 +315,6 @@ void CopyFromSprites(u8 *dest); u8 SpriteTileAllocBitmapOp(u16 bit, u8 op); void ClearSpriteCopyRequests(void); void ResetAffineAnimData(void); +u8 LoadSpritePaletteDayNight(const struct SpritePalette *palette); #endif //GUARD_SPRITE_H diff --git a/include/constants/day_night.h b/include/constants/day_night.h new file mode 100755 index 000000000000..8c6d2dc28fe0 --- /dev/null +++ b/include/constants/day_night.h @@ -0,0 +1,21 @@ +#ifndef GUARD_CONSTANTS_DAY_NIGHT_H +#define GUARD_CONSTANTS_DAY_NIGHT_H + +#define TIME_MORNING_HOUR 4 +#define TIME_DAY_HOUR 10 +#define TIME_NIGHT_HOUR 20 + +#define TIME_MORNING 0 +#define TIME_DAY 1 +#define TIME_NIGHT 2 +#define TIME_OF_DAY_COUNT 3 + +#define DAY_SUNDAY 0 +#define DAY_MONDAY 1 +#define DAY_TUESDAY 2 +#define DAY_WEDNESDAY 3 +#define DAY_THURSDAY 4 +#define DAY_FRIDAY 5 +#define DAY_SATURDAY 6 + +#endif // GUARD_CONSTANTS_DAY_NIGHT_H diff --git a/include/constants/flags.h b/include/constants/flags.h index be08996917a9..612593c2fb0b 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -1390,7 +1390,7 @@ #define FLAG_UNUSED_0x881 (SYSTEM_FLAGS + 0x21) // Unused Flag #define FLAG_UNUSED_0x882 (SYSTEM_FLAGS + 0x22) // Unused Flag #define FLAG_UNUSED_0x883 (SYSTEM_FLAGS + 0x23) // Unused Flag -#define FLAG_UNUSED_0x884 (SYSTEM_FLAGS + 0x24) // Unused Flag +#define FLAG_SYS_DAYLIGHT_SAVING (SYSTEM_FLAGS + 0x24) #define FLAG_UNUSED_0x885 (SYSTEM_FLAGS + 0x25) // Unused Flag #define FLAG_UNUSED_0x886 (SYSTEM_FLAGS + 0x26) // Unused Flag #define FLAG_UNUSED_0x887 (SYSTEM_FLAGS + 0x27) // Unused Flag diff --git a/include/day_night.h b/include/day_night.h new file mode 100755 index 000000000000..6daf4c45df6c --- /dev/null +++ b/include/day_night.h @@ -0,0 +1,25 @@ +#ifndef GUARD_DAY_NIGHT_H +#define GUARD_DAY_NIGHT_H + +#define PALOVER_LIST_TERM 0xFF + +struct PaletteOverride +{ + u8 slot; + u8 timeOfDay; + void *palette; +}; + +extern u16 gPlttBufferPreDN[]; +extern struct PaletteOverride *gPaletteOverrides[]; + +u8 GetCurrentTimeOfDay(void); +u8 GetTimeOfDay(s8 hours); +void LoadCompressedPaletteDayNight(const void *src, u16 offset, u16 size); +void LoadPaletteDayNight(const void *src, u16 offset, u16 size); +void CheckClockForImmediateTimeEvents(void); +void ProcessImmediateTimeEvents(void); +void DoLoadSpritePaletteDayNight(const u16 *src, u16 paletteOffset); +const u8 *GetDayOfWeekString(u8 dayOfWeek); + +#endif // GUARD_DAY_NIGHT_H diff --git a/include/field_tasks.h b/include/field_tasks.h index 400ad054de49..291cb08d6383 100644 --- a/include/field_tasks.h +++ b/include/field_tasks.h @@ -5,5 +5,6 @@ void SetUpFieldTasks(void); void ActivatePerStepCallback(u8 callbackId); void ResetFieldTasksArgs(void); void SetSootopolisGymCrackedIceMetatiles(void); +void ForceTimeBasedEvents(void); #endif // GUARD_FIELD_TASKS_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 3913b96d84ac..0c7ca076b669 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -31,6 +31,7 @@ struct Tileset /*0x0c*/ u16 *metatiles; /*0x10*/ u16 *metatileAttributes; /*0x14*/ TilesetCB callback; + /*0x18*/ struct PaletteOverride *paletteOverrides; }; struct MapLayout diff --git a/include/global.h b/include/global.h index dc7b95c4d5ce..b0a334dab811 100644 --- a/include/global.h +++ b/include/global.h @@ -151,6 +151,7 @@ struct Time /*0x02*/ s8 hours; /*0x03*/ s8 minutes; /*0x04*/ s8 seconds; + /*0x05*/ s8 dayOfWeek; }; #define DEX_FLAGS_NO ((POKEMON_SLOTS_NUMBER / 8) + ((POKEMON_SLOTS_NUMBER % 8) ? 1 : 0)) diff --git a/include/overworld.h b/include/overworld.h index ac916feb191d..ab0d1e8255a1 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -55,6 +55,7 @@ extern u8 gFieldLinkPlayerCount; extern const struct UCoords32 gDirectionToVectors[]; void DoWhiteOut(void); +void ChooseAmbientCrySpecies(void); void Overworld_ResetStateAfterFly(void); void Overworld_ResetStateAfterTeleport(void); void Overworld_ResetStateAfterDigEscRope(void); diff --git a/include/palette.h b/include/palette.h index 8d16270aa30b..856b9210b0be 100644 --- a/include/palette.h +++ b/include/palette.h @@ -75,5 +75,6 @@ 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); +void TintPalette_CustomToneWithCopy(const u16 *src, u16 *dest, u16 count, u16 rTone, u16 gTone, u16 bTone, bool8 excludeZeroes); #endif // GUARD_PALETTE_H diff --git a/include/rtc.h b/include/rtc.h index 7a3d3d524ba3..ebb78543f002 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -29,8 +29,10 @@ void RtcInit(void); u16 RtcGetErrorStatus(void); void RtcGetInfo(struct SiiRtcInfo *rtc); void RtcGetDateTime(struct SiiRtcInfo *rtc); +void RtcGetTime(struct SiiRtcInfo *rtc); void RtcGetStatus(struct SiiRtcInfo *rtc); void RtcGetRawInfo(struct SiiRtcInfo *rtc); +void RtcGetRawInfoFast(struct SiiRtcInfo *rtc); u16 RtcCheckInfo(struct SiiRtcInfo *rtc); void RtcReset(void); void FormatDecimalTime(u8 *dest, s32 hour, s32 minute, s32 second); @@ -40,10 +42,14 @@ void FormatDecimalDate(u8 *dest, s32 year, s32 month, s32 day); void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day); void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t); void RtcCalcLocalTime(void); +void RtcCalcLocalTimeFast(void); void RtcInitLocalTimeOffset(s32 hour, s32 minute); void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds); +void RtcSetDayOfWeek(s8 dayOfWeek); void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2); u32 RtcGetMinuteCount(void); +u32 GetTotalMinutes(struct Time *time); +u32 GetTotalSeconds(struct Time *time); u32 RtcGetLocalDayCount(void); #endif // GUARD_RTC_UTIL_H diff --git a/include/strings.h b/include/strings.h index fe4e08eebfb6..0439224e3684 100644 --- a/include/strings.h +++ b/include/strings.h @@ -2952,4 +2952,12 @@ extern const u8 gText_Smartness[]; extern const u8 gText_Cuteness[]; extern const u8 gText_Beauty3[]; +extern const u8 gText_Sunday[]; +extern const u8 gText_Monday[]; +extern const u8 gText_Tuesday[]; +extern const u8 gText_Wednesday[]; +extern const u8 gText_Thursday[]; +extern const u8 gText_Friday[]; +extern const u8 gText_Saturday[]; + #endif // GUARD_STRINGS_H diff --git a/ld_script.txt b/ld_script.txt index 7e0eeac3de1b..6acc31b80f66 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -329,6 +329,7 @@ SECTIONS { src/gym_leader_rematch.o(.text); src/unk_transition.o(.text); src/international_string_util.o(.text); + src/day_night.o(.text); } =0 script_data : @@ -689,6 +690,7 @@ SECTIONS { data/mystery_event.o(.rodata); src/m4a_tables.o(.rodata); data/sound_data.o(.rodata); + src/day_night.o(.rodata); } =0 song_data : diff --git a/src/day_night.c b/src/day_night.c new file mode 100755 index 000000000000..23a8c3b67fc4 --- /dev/null +++ b/src/day_night.c @@ -0,0 +1,216 @@ +// The day/night system is a slightly-modified port from Diegoisawesome's CrystalDust project. +// The debug features are stripped out, along with some field effects that preserve original palette for emote bubbles. +// Trihard is also not currently taking advantage of the palette override system, which lets you +// do things like lit windows at night--the functionality is all there, though, and it's slightly modified from CrystalDust, in that +// you only specify the time of day enum, rather than an hour range. + +#include "global.h" +#include "day_night.h" +#include "decompress.h" +#include "event_data.h" +#include "field_tasks.h" +#include "field_weather.h" +#include "overworld.h" +#include "palette.h" +#include "rtc.h" +#include "strings.h" +#include "string_util.h" +#include "constants/day_night.h" +#include "constants/rgb.h" + +#define TINT_MORNING Q_8_8(0.8), Q_8_8(0.7), Q_8_8(0.9) +#define TINT_DAY Q_8_8(1.0), Q_8_8(1.0), Q_8_8(1.0) +#define TINT_NIGHT Q_8_8(0.6), Q_8_8(0.55), Q_8_8(1.0) + +EWRAM_DATA u16 gPlttBufferPreDN[PLTT_BUFFER_SIZE] = {0}; +static EWRAM_DATA s8 sOldHour = 0; +static EWRAM_DATA bool8 sRetintPhase = FALSE; +EWRAM_DATA struct PaletteOverride *gPaletteOverrides[4] = {NULL}; + +static const u16 sTimeOfDayTints[][3] = { + {TINT_NIGHT}, // Midnight + {TINT_NIGHT}, // 1 AM + {TINT_NIGHT}, // 2 AM + {TINT_NIGHT}, // 3 AM + {Q_8_8(0.6), Q_8_8(0.6), Q_8_8(1.0)}, // 4 AM + {TINT_MORNING}, // 5 AM + {TINT_MORNING}, // 6 AM + {TINT_MORNING}, // 7 AM + {Q_8_8(0.9), Q_8_8(0.8), Q_8_8(1.0)}, // 8 AM + {Q_8_8(1.0), Q_8_8(0.9), Q_8_8(1.0)}, // 9 AM + {TINT_DAY}, // 10 AM + {TINT_DAY}, // 11 AM + {TINT_DAY}, // 12 PM + {TINT_DAY}, // 1 PM + {TINT_DAY}, // 2 PM + {TINT_DAY}, // 3 PM + {TINT_DAY}, // 4 PM + {Q_8_8(1.0), Q_8_8(0.9), Q_8_8(0.8)}, // 5 PM + {Q_8_8(0.9), Q_8_8(0.6), Q_8_8(0.67)}, // 6 PM + {Q_8_8(0.7), Q_8_8(0.6), Q_8_8(0.9)}, // 7 PM + {TINT_NIGHT}, // 8 PM + {TINT_NIGHT}, // 9 PM + {TINT_NIGHT}, // 10 PM + {TINT_NIGHT}, // 11 PM +}; + +const u8 *const gDayOfWeekTable[] = +{ + gText_Sunday, + gText_Monday, + gText_Tuesday, + gText_Wednesday, + gText_Thursday, + gText_Friday, + gText_Saturday +}; + +u8 GetCurrentTimeOfDay(void) +{ + return GetTimeOfDay(gLocalTime.hours); +} + +u8 GetTimeOfDay(s8 hours) +{ + if (hours < TIME_MORNING_HOUR) + return TIME_NIGHT; + else if (hours < TIME_DAY_HOUR) + return TIME_MORNING; + else if (hours < TIME_NIGHT_HOUR) + return TIME_DAY; + else + return TIME_NIGHT; +} + +const u8 *GetDayOfWeekString(u8 dayOfWeek) +{ + return gDayOfWeekTable[dayOfWeek]; +} + +void CopyDayOfWeekStringToVar1(void) +{ + if (gSpecialVar_0x8004 <= DAY_SATURDAY) + StringCopy(gStringVar1, gDayOfWeekTable[gSpecialVar_0x8004]); + else + StringCopy(gStringVar1, gText_None); +} + +void CopyCurrentDayOfWeekStringToVar1(void) +{ + RtcCalcLocalTime(); + if (gLocalTime.dayOfWeek <= DAY_SATURDAY) + StringCopy(gStringVar1, gDayOfWeekTable[gLocalTime.dayOfWeek]); + else + StringCopy(gStringVar1, gText_None); +} + +static void LoadPaletteOverrides(void) +{ + u8 i, j; + const u16* src; + u16* dest; + u8 curTimeOfDay = GetCurrentTimeOfDay(); + + for (i = 0; i < ARRAY_COUNT(gPaletteOverrides); i++) + { + const struct PaletteOverride *curr = gPaletteOverrides[i]; + if (curr != NULL) + { + while (curr->slot != PALOVER_LIST_TERM && curr->palette != NULL) + { + if (curr->timeOfDay == curTimeOfDay) + { + for (j = 0, src = curr->palette, dest = gPlttBufferUnfaded + (curr->slot * 16); j < 16; j++, src++, dest++) + { + if (*src != RGB_BLACK) + *dest = *src; + } + } + curr++; + } + } + } +} + +static bool8 ShouldTintOverworld(void) +{ + if (IsMapTypeOutdoors(gMapHeader.mapType)) + return TRUE; + + // more conditions? + return FALSE; +} + +static void TintPaletteForDayNight(u16 offset, u16 size) +{ + if (ShouldTintOverworld()) + { + s8 hour; + RtcCalcLocalTimeFast(); + hour = gLocalTime.hours; + TintPalette_CustomToneWithCopy(gPlttBufferPreDN + offset, gPlttBufferUnfaded + offset, size / 2, sTimeOfDayTints[hour][0], sTimeOfDayTints[hour][1], sTimeOfDayTints[hour][2], FALSE); + } + else + { + CpuCopy16(gPlttBufferPreDN + offset, gPlttBufferUnfaded + offset, size); + } + LoadPaletteOverrides(); +} + +void LoadCompressedPaletteDayNight(const void *src, u16 offset, u16 size) +{ + LZDecompressWram(src, gPaletteDecompressionBuffer); + CpuCopy16(gPaletteDecompressionBuffer, gPlttBufferPreDN + offset, size); + TintPaletteForDayNight(offset, size); + CpuCopy16(gPlttBufferUnfaded + offset, gPlttBufferFaded + offset, size); +} + +void LoadPaletteDayNight(const void *src, u16 offset, u16 size) +{ + CpuCopy16(src, gPlttBufferPreDN + offset, size); + TintPaletteForDayNight(offset, size); + CpuCopy16(gPlttBufferUnfaded + offset, gPlttBufferFaded + offset, size); +} + +void CheckClockForImmediateTimeEvents(void) +{ + if (ShouldTintOverworld() && !sRetintPhase) + RtcCalcLocalTimeFast(); +} + +void ProcessImmediateTimeEvents(void) +{ + s8 hour; + + if (ShouldTintOverworld()) + { + if (!sRetintPhase) + { + hour = gLocalTime.hours; + if (hour != sOldHour) + { + sOldHour = hour; + sRetintPhase = 1; + TintPalette_CustomToneWithCopy(gPlttBufferPreDN, gPlttBufferUnfaded, BG_PLTT_SIZE / 2, sTimeOfDayTints[hour][0], sTimeOfDayTints[hour][1], sTimeOfDayTints[hour][2], TRUE); + } + } + else + { + sRetintPhase = 0; + TintPalette_CustomToneWithCopy(gPlttBufferPreDN + (BG_PLTT_SIZE / 2), gPlttBufferUnfaded + (BG_PLTT_SIZE / 2), OBJ_PLTT_SIZE / 2, sTimeOfDayTints[sOldHour][0], sTimeOfDayTints[sOldHour][1], sTimeOfDayTints[sOldHour][2], TRUE); + LoadPaletteOverrides(); + + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN && + gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) + CpuCopy16(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE); + + ChooseAmbientCrySpecies(); // so a time-of-day appropriate mon is chosen + ForceTimeBasedEvents(); // for misc events that should run on time of day boundaries + } + } +} + +void DoLoadSpritePaletteDayNight(const u16 *src, u16 paletteOffset) +{ + LoadPaletteDayNight(src, paletteOffset + 0x100, 32); +} diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f84a7bedbea9..a3c448777c8c 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2,6 +2,7 @@ #include "malloc.h" #include "battle_pyramid.h" #include "berry.h" +#include "day_night.h" #include "decoration.h" #include "event_data.h" #include "event_object_movement.h" @@ -1982,6 +1983,7 @@ void Unused_LoadEventObjectPaletteSet(u16 *paletteTags) } } +// NOTE: Does not use LoadSpritePaletteDayNight because of naming screen static u8 sub_808E8F4(const struct SpritePalette *spritePalette) { if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF) @@ -1995,7 +1997,7 @@ void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) { u8 paletteIndex = FindEventObjectPaletteIndexByTag(paletteTag); - LoadPalette(sEventObjectSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20); + LoadPaletteDayNight(sEventObjectSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20); } void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot) diff --git a/src/field_effect.c b/src/field_effect.c index 6bbd1df3c035..5b5257696e91 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,4 +1,5 @@ #include "global.h" +#include "day_night.h" #include "decompress.h" #include "event_object_movement.h" #include "field_camera.h" @@ -770,12 +771,27 @@ void FieldEffectScript_LoadTiles(u8 **script) void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); - LoadSpritePalette(palette); + LoadSpritePaletteDayNight(palette); UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); (*script) += 4; } void FieldEffectScript_LoadPalette(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePaletteDayNight(palette); + (*script) += 4; +} + +void FieldEffectScript_LoadFadedPaletteNoTint(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePalette(palette); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); + (*script) += 4; +} + +void FieldEffectScript_LoadPaletteNoTint(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); diff --git a/src/field_tasks.c b/src/field_tasks.c index 21b2732c3413..6a6386bd429e 100644 --- a/src/field_tasks.c +++ b/src/field_tasks.c @@ -121,6 +121,7 @@ static void Task_RunPerStepCallback(u8 taskId) #define tState data[0] #define tAmbientCryState data[1] #define tAmbientCryDelay data[2] +#define tForceTimeUpdate data[3] static void RunTimeBasedEvents(s16 *data) { @@ -151,11 +152,26 @@ static void Task_RunTimeBasedEvents(u8 taskId) RunTimeBasedEvents(data); UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay); } + + if (tForceTimeUpdate) + { + tForceTimeUpdate = 0; + DoTimeBasedEvents(); + } +} + +void ForceTimeBasedEvents(void) +{ + u8 taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); + + if (taskId != 0xFF) + gTasks[taskId].tForceTimeUpdate = 1; } #undef tState #undef tAmbientCryState #undef tAmbientCryDelay +#undef tForceTimeUpdate void SetUpFieldTasks(void) { diff --git a/src/fieldmap.c b/src/fieldmap.c index 21bbaa8f8675..d2905d3abdc3 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle_pyramid.h" #include "bg.h" +#include "day_night.h" #include "fieldmap.h" #include "fldeff.h" #include "fldeff_misc.h" @@ -983,18 +984,21 @@ void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u1 { if (tileset->isSecondary == FALSE) { - LoadPalette(&black, destOffset, 2); - LoadPalette(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2); + gPaletteOverrides[0] = tileset->paletteOverrides; + LoadPaletteDayNight(&black, destOffset, 2); + LoadPaletteDayNight(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2); nullsub_3(destOffset + 1, (size - 2) >> 1); } else if (tileset->isSecondary == TRUE) { - LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); + gPaletteOverrides[1] = tileset->paletteOverrides; + LoadPaletteDayNight(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); nullsub_3(destOffset, size >> 1); } else { - LoadCompressedPalette((u32*)tileset->palettes, destOffset, size); + gPaletteOverrides[2] = tileset->paletteOverrides; + LoadCompressedPaletteDayNight((u32*)tileset->palettes, destOffset, size); nullsub_3(destOffset, size >> 1); } } diff --git a/src/overworld.c b/src/overworld.c index 1cb264369039..529faa7d73a4 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -6,6 +6,7 @@ #include "bg.h" #include "cable_club.h" #include "clock.h" +#include "day_night.h" #include "event_data.h" #include "field_camera.h" #include "field_control_avatar.h" @@ -114,7 +115,6 @@ static void c2_80567AC(void); static void CB2_LoadMap2(void); static void VBlankCB_Field(void); static void SpriteCB_LinkPlayer(struct Sprite *sprite); -static void ChooseAmbientCrySpecies(void); static void do_load_map_stuff_loop(u8 *state); static bool32 map_loading_iteration_3(u8 *state); static bool32 sub_8086638(u8 *state); @@ -1316,7 +1316,7 @@ void UpdateAmbientCry(s16 *state, u16 *delayCounter) } } -static void ChooseAmbientCrySpecies(void) +void ChooseAmbientCrySpecies(void) { if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE130) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE130)) @@ -1475,6 +1475,7 @@ static void OverworldBasic(void) CameraUpdate(); UpdateCameraPanning(); BuildOamBuffer(); + ProcessImmediateTimeEvents(); UpdatePaletteFade(); UpdateTilesetAnimations(); do_scheduled_bg_tilemap_copies_to_vram(); @@ -1794,6 +1795,7 @@ static void VBlankCB_Field(void) FieldUpdateBgTilemapScroll(); TransferPlttBuffer(); TransferTilesetAnimsBuffer(); + CheckClockForImmediateTimeEvents(); } static void InitCurrentFlashLevelScanlineEffect(void) diff --git a/src/palette.c b/src/palette.c index eb49ce4c60ea..86500b88f912 100644 --- a/src/palette.c +++ b/src/palette.c @@ -940,6 +940,35 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b } } +void TintPalette_CustomToneWithCopy(const u16 *src, u16 *dest, u16 count, u16 rTone, u16 gTone, u16 bTone, bool8 excludeZeroes) +{ + s32 r, g, b, i; + u32 gray; + + for (i = 0; i < count; i++, src++, dest++) + { + if (excludeZeroes && *src == RGB_BLACK) + continue; + + r = (*src >> 0) & 0x1F; + g = (*src >> 5) & 0x1F; + b = (*src >> 10) & 0x1F; + + r = (u16)((rTone * r)) >> 8; + g = (u16)((gTone * g)) >> 8; + b = (u16)((bTone * b)) >> 8; + + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + + *dest = (b << 10) | (g << 5) | (r << 0); + } +} + void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7) { u8 taskId; diff --git a/src/rtc.c b/src/rtc.c index b135a675a844..86479942aaaf 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -1,7 +1,9 @@ #include "global.h" +#include "event_data.h" #include "rtc.h" #include "string_util.h" #include "text.h" +#include "constants/flags.h" // iwram bss static u16 sErrorStatus; @@ -131,6 +133,21 @@ void RtcGetInfo(struct SiiRtcInfo *rtc) RtcGetRawInfo(rtc); } +void RtcGetInfoFast(struct SiiRtcInfo *rtc) +{ + if (sErrorStatus & RTC_ERR_FLAG_MASK) + *rtc = sRtcDummy; + else + RtcGetRawInfoFast(rtc); +} + +void RtcGetTime(struct SiiRtcInfo *rtc) +{ + RtcDisableInterrupts(); + SiiRtcGetTime(rtc); + RtcRestoreInterrupts(); +} + void RtcGetDateTime(struct SiiRtcInfo *rtc) { RtcDisableInterrupts(); @@ -151,6 +168,12 @@ void RtcGetRawInfo(struct SiiRtcInfo *rtc) RtcGetDateTime(rtc); } +void RtcGetRawInfoFast(struct SiiRtcInfo *rtc) +{ + RtcGetStatus(rtc); + RtcGetTime(rtc); +} + u16 RtcCheckInfo(struct SiiRtcInfo *rtc) { u16 errorFlags = 0; @@ -267,6 +290,7 @@ void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct T result->minutes = ConvertBcdToBinary(rtc->minute) - t->minutes; result->hours = ConvertBcdToBinary(rtc->hour) - t->hours; result->days = days - t->days; + result->dayOfWeek = ConvertBcdToBinary(rtc->dayOfWeek) - t->dayOfWeek; if (result->seconds < 0) { @@ -284,6 +308,12 @@ void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct T { result->hours += 24; --result->days; + --result->dayOfWeek; + } + + if (result->dayOfWeek < 0) + { + result->dayOfWeek += 7; } } @@ -293,6 +323,12 @@ void RtcCalcLocalTime(void) RtcCalcTimeDifference(&sRtc, &gLocalTime, &gSaveBlock2Ptr->localTimeOffset); } +void RtcCalcLocalTimeFast(void) +{ + RtcGetInfoFast(&sRtc); + RtcCalcTimeDifference(&sRtc, &gLocalTime, &gSaveBlock2Ptr->localTimeOffset); +} + void RtcInitLocalTimeOffset(s32 hour, s32 minute) { RtcCalcLocalTimeOffset(0, hour, minute, 0); @@ -308,12 +344,22 @@ void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds) RtcCalcTimeDifference(&sRtc, &gSaveBlock2Ptr->localTimeOffset, &gLocalTime); } +void RtcSetDayOfWeek(s8 dayOfWeek) +{ + // calc local time so we have an up-to-date time offset before recalculating offset + RtcCalcLocalTime(); + gLocalTime.dayOfWeek = dayOfWeek;; + RtcGetInfo(&sRtc); + RtcCalcTimeDifference(&sRtc, &gSaveBlock2Ptr->localTimeOffset, &gLocalTime); +} + void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) { result->seconds = t2->seconds - t1->seconds; result->minutes = t2->minutes - t1->minutes; result->hours = t2->hours - t1->hours; result->days = t2->days - t1->days; + result->dayOfWeek = t2->dayOfWeek - t1->dayOfWeek; if (result->seconds < 0) { @@ -331,6 +377,12 @@ void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2) { result->hours += 24; --result->days; + --result->dayOfWeek; + } + + if (result->dayOfWeek < 0) + { + result->dayOfWeek += 7; } } @@ -344,3 +396,39 @@ u32 RtcGetLocalDayCount(void) { return RtcGetDayCount(&sRtc); } + +u32 GetTotalMinutes(struct Time *time) +{ + return time->days * 1440 + time->hours * 60 + time->minutes; +} + +u32 GetTotalSeconds(struct Time *time) +{ + return time->days * 86400 + time->hours * 3600 + time->minutes * 60 + time->seconds; +} + +void SwitchDSTMode(void) +{ + if (FlagGet(FLAG_SYS_DAYLIGHT_SAVING)) + { + if (gLocalTime.hours > 0) + { + FlagClear(FLAG_SYS_DAYLIGHT_SAVING); + RtcCalcLocalTime(); + gLocalTime.hours--; + RtcGetInfo(&sRtc); + RtcCalcTimeDifference(&sRtc, &gSaveBlock2Ptr->localTimeOffset, &gLocalTime); + } + } + else + { + if (gLocalTime.hours < 23) + { + FlagSet(FLAG_SYS_DAYLIGHT_SAVING); + RtcCalcLocalTime(); + gLocalTime.hours++; + RtcGetInfo(&sRtc); + RtcCalcTimeDifference(&sRtc, &gSaveBlock2Ptr->localTimeOffset, &gLocalTime); + } + } +} diff --git a/src/scrcmd.c b/src/scrcmd.c index ac6e2d689081..87d5abdc8af7 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -705,6 +705,7 @@ bool8 ScrCmd_gettime(struct ScriptContext *ctx) gSpecialVar_0x8000 = gLocalTime.hours; gSpecialVar_0x8001 = gLocalTime.minutes; gSpecialVar_0x8002 = gLocalTime.seconds; + gSpecialVar_0x8003 = gLocalTime.dayOfWeek; return FALSE; } diff --git a/src/strings.c b/src/strings.c index f0566c8590d6..8fbdb9ed6430 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1817,3 +1817,11 @@ const u8 gText_Answer[] = _("ANSWER"); const u8 gText_PokeBalls[] = _("POKé BALLS"); const u8 gText_Berry[] = _("BERRY"); const u8 gText_Berries[] = _("BERRIES"); + +const u8 gText_Sunday[] = _("SUNDAY"); +const u8 gText_Monday[] = _("MONDAY"); +const u8 gText_Tuesday[] = _("TUESDAY"); +const u8 gText_Wednesday[] = _("WEDNESDAY"); +const u8 gText_Thursday[] = _("THURSDAY"); +const u8 gText_Friday[] = _("FRIDAY"); +const u8 gText_Saturday[] = _("SATURDAY"); diff --git a/sym_ewram.txt b/sym_ewram.txt index 79e89fc9bf5d..07bf74534d13 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -145,3 +145,4 @@ .include "src/faraway_island.o" .include "src/trainer_hill.o" .include "src/rayquaza_scene.o" + .include "src/day_night.o"