Update for Drawing::Color16bit() and slight refactoring of applying bolt colors.
BoltExt maps to const ExtData.
BombExt maps to const ExtData.
WaveExt maps to const ExtData.
RadSiteExt maps to const ExtData.
IonExt maps to const ExtData.
Extracted creating electric bolts into a new method.

Use this function for support prism beams also. This previously wasn't done and support beams did not support colored bolts even if specified.

The bolt hook broke a test instruction. It has been fixed.
TimerStruct::StartIfEmpty() renamed to Resume().
More TimerStruct updates

Ignorable() ->  Expired()
!Ignorable() -> InProgress()
Yet another TimerStruct update

IsDone() -> Completed()
Update for CameoDataStruct.
DirStruct update

The spotlight calculation has not been updated to radians() because of the difference regarding the constant that is subtracted there.
FacingStruct update

As the cast from FacingStruct to int has been abolished, current().value8() has to be used now to make this explicit.
Update for Checksummer definition change.

Switched to SafeChecksummer because of allocation on stack.
Replaced the original Checksummer functions with the YR++ implementation that doesn't exhibit the write beyond array bounds bug.
Mod info tags

These are at the moment purely diagnostic - not shown anywhere, nor used anywhere. They can be defined in uimd.ini, which is mod-controlled. Mods can then specify their name and their version, and this will be printed in the debug.log.

[VersionInfo]Name= (string, 0x3F chars)
The name of the mod in unspecified format.

[VersionInfo]Version= (string, 0x3F chars)
The version of the mod. Unspecified format, not just numbers.

An identifier is created from these using the game's Checksummer. This is reserved for future use to identify a mod by name and version using a number comparison (collisions are allowed, but that shouldn't happen considering the number of mods and their release cycles compared to the nearly endless possible values an int can store).
Removed the Offset parameter to reduce complexity a bit.

The AresByteStream now increases the internal read offset unconditionally. Thus, a failed read will still increase the offset and the same bytes aren't tried to be read twice.

Added an Offset() member function to return the current offset, which can be used for end-of-stream checks.
Some minor cleanup
Unnecessarily specialized method cleanup

Calls to the SWIZZLE macro are useless and have been removed from these functions, as well as already commented out code.

Removed specialized functions that do the same as the non-specialized ones after this treatment.
Refactored some functions a bit. Flattened conditionals, added comments, broke down some long lines, and other minor stuff that doesn't change behavior.