Type 1 SMF files consist of multiple tracks that are to be played simultaneously
in parallel. Support for this was previously implemented by merging these tracks
into one single track, then treating the result as a regular type 0 SMF file.
This commit adds full support for type 1 files. The parallel tracks are loaded
as subtracks of the parent track and played simultaneously in real time. This
allows for support of MIDI formats with parallel subtracks that do not use the
SMF format (Dark Seed floppy version) or that jump to offsets within each
parallel subtrack (Origin MIDI).
When you use the look command to look at the spell incantation and reagents required, it gets the wrong index if there are any missing spells on that page before the one you try to look at.
Add it to engines that have MIDI playback.
This essentially compiles the emulator only when an engine that
can potentially use it (e.g. MIDI) is enabled
Previously all keybind actions were handled with debugger console commands. This required the existence console commands that are unlikely to have use outside the keybinding action. Additionally, every input iterates over a lookup table and parses command strings.
U6 NPCs following their schedule can open doors in the way.
However, E/W facing doors would not be detected if an object was
directly S of them, causing pathing to fail in some cases.
Fix and simplify door detection.
Closes#15308
Waking Mordea while sleeping put the camera below the floor. Increasing the box to 2x2x2 footpad fixes the cutscene and eliminates the need to increase based on main actor size.
This class manages a buffer where all data usually stored in detection
plugin will get copied before unloading the plugin and starting the
game.
This class expects that two functions are present in every
GameDescription: sizeBuffer which calculates how many bytes we will need
to store the entry in RAM and toBuffer which copies the data in the
buffer and fix the pointers in the class.
At the end, it is expected that an ADDynamicGameDescription doesn't
depend anymore on data stored in the detection plugin.
The AD_GAME_DESCRIPTION_HELPERS macro allow to implement these functions
in all GameDescription which don't have any pointer except those in
ADGameDescription.