InitScroll() does not reset last_bg_pal_loaded (palettes get appended)
If multiple maps are loaded with InitScroll(), it is possible to run out of palettes (and I assume have the wrong palettes assigned to the wrong tile).
I believe in Scroll.c, InitScrollWithTiles should reset last_bg_pal_loaded back to 0, prior to loading the tile and map data.
https://discord.com/channels/790342889318252555/790346049377927168/928058473692954674
Actually, it looks like last_bg_pal_loaded could just be completely removed.
Yep, there was a few problems with this, and also with how attributes were being handled. From this commit to this one I have been changing how tiles are loaded for maps.
Tiles are loaded in ZGB using ScrollSetTiles, which is being called by InitScroll (for scrolled backgrounds bigger than 32x32 and containnig enemy spawners) and LoadMap (for regular backgrounds, like splash screens or huds)
Whenever new tiles are loaded using ScrollSetTiles an offset is returned (containing both the first index and the first palette where the new tiles have their info). Users doesn't really need to know what this offset contains but they need to keep it and pass it back to UpdateMapTile if they want to update any of the tiles (this is very common on the hud when the player gets hit and you need to update the life bar)
In ZGB maps are used for backgrounds, huds and fonts. For performance reasons I have taken the decission of ignoring offsets for the backgrounds. This means, the background should always be loaded first in any State (I can't find any use case where this could be a problem but if there is something I am missing I'll be happy to discuss it). Then the user can load some extra maps for either the Font or the HUD
InitScroll does 4 things:
- loads the tileset (calling ScrollSetTiles)
- loads the map (calling ScrollSetMap)
- fills the data required for collisions
- fills the current are of the screen where the scroll_target is located InitScroll should only be called once per state... or none. Because maps can also be loaded with LoadMap. That's why last_bg_pal_loaded is reset to 0 on main.c when swapping states.
You can of course tweak the whole engine and make InitScroll work within the same state (by resetting all the vars, doing fades and all the whole stuff that is done in main.c when swapping states). But that's up to you. It's not how ZGB is mean to be used. One thing that is posible to do is to load a new map using the same tiles using ScrollSetMap
I have also added a few useful macros
- INIT_HUD will automatically load the map for the hud on the window, place the window based on the map dimensions, and offset the scroll borders to match the screen limits
- UPDATE_HUD_TILE for updating tiles on the HUD
- INIT_BKG to load background maps
I hope you find this whole thing useful. It's been a lot of extra work ;)
LoadMap (for regular backgrounds, like splash screens or huds)
Where is LoadMap? I searched this repo and the GBDK docs, and I can't find anything.
It's one of the new additions. You need to check the develop branch https://github.com/Zal0/ZGB/blob/6fd59298a98a6f0f7877c96dfb5acc40e2ebc09a/common/include/Scroll.h#L57
I think I can close this one