Should fix the bug mentioned in #4184. See 1f6ead6354, #2324, #2371 and 98498f9d50 for more confusion. This change might break any or all of the above.
note on using PALETTE_SIZE as offset. normally it's `256 colors * 3 bytes per color = 768`, but in our headless mode it's 256. upstream does `SDL_SetPaletteColors(screen->format->palette, playpal_data->colours + 256 * pal, 0, 256);` when palette is updated, so clearly it means offsetting by 256 colors=bytes. but PALETTE_SIZE I used as my offset is not for stuff upstream uses it for. just something better than a magic number.
* new callback system with callback return values
If the lua callback returns a value, the core will update the addr with it. Otherwise, the old value sent by the core will be used unmodified
* update MemoryCallbackDelegate return value to uint?
* throw NotSupportedException for GBA memory callbacks
* docs: return value of MemoryCallbackDelegate and CallMemoryCallbacks
just like mame we're hashing the wad files, concating them, hashing that, and the result goes to movie header. for singular IWADs loaded on their own just the actual hash is used instead, to make it clear to users.
printing hashes of all files to header might be cool, but I'm not sure it's warranted - usually there's only 1 PWAD
Breakpoint hits don't actually pause execution, so it's necessary to immediately update the disassember view as the core will continue executing after. This isn't great design but whatever
user will be changing those options from hawk side dialog so it's impossible to miss what you're changing (you can look at the dialog again if you're THAT sloppy)
but since we're now initializing with default nonsync settings and changing them on the fly, those UI messages would be appearing all the time
automap messages are left intact since they appear upon in-game button press
worst case scenario, UI messages are moved to hawk side, but then why limit them to only whatever upstream reports and not report every change? which is never done anyway, so I doubt it'd come to this
if we set them on core init that's how it'd remember them in the reference state, so loading states made with different init options would fail to load
instead we set everything to default on init and then change to what the user set during the first frame advance. that way reference state remains the same so states using different options keep working across all variants
need to not show core messages tho when something is changed from default, because now they appear on init and state load rather than only on explicit change
slaughter maps have gigantic savestates so they're not very tasable until we move from wbx to native. so no point in claiming complete support for them right away. okuplok launches, but might crash maybe
passing rngseed didn't fix sync, and passing all the settings is too much work for this release. will support it afterwards.
instead just tell the user BOOM demos are not supported