This is part of an on-going effort on my end to document the AKOS code, and fix strange stuff
such as integers being used as booleans, and variable_names instead of variableNames
It was getting painful to go through the AKOS system without proper opcodes documentation, so here it is.
This was checked against COMI and SCUMM HE code, for names consistency.
This prints the number of the real Grail object when counting from the
left in the final room with the knight in Indy3.
May be useful since there are many Grails, choosing the wrong one kills
you and makes you restart the 3 trials again, and the hints to find it
require the original manual and taking notes during the game.
getObjOrActorName() may return a nullptr, but giving a null pointer to
printf()-like functions is undefined, and OpenBSD complains about it.
Hardcode "(null)" in that case; that's the default value on Windows,
macOS and Linux.
This commit introduces the following (seemingly non-invasive) changes
to make the 'imuse play' debugger command more useful (i.e. don't crash
when trying to load the wrong kind of (sound) resource.
* ScummEngine::readSoundResource()
Instead of fatally error()'ing upon hitting a non-sound resource type,
e.g. a room header (0x524d4844 aka RMHD), we now only issue a warning().
This enables the already existing dead code which properly returns 0
(aka no resource loaded).
* ResourceManager::validateResource()
Instead of fatally error()'ing upon hitting an illegal glob type we now
only issue a warning() and return false (also existing dead code).
All methods calling validateResource() check its return value so this
seems like the right thing to do anyway.
* ScummDebugger::Cmd_IMuse()
Instead of directly calling ensureResourceLoaded() we now call
getResourceAddress() instead (which in turn calls ensureResourceLoaded()
and handles other edge cases) and only attempt to play a sound if the
returned pointer actually is valid.
Fixes Trac#10527.
These are regressions from c05cb7f3bb. They were
caused by VirtualScreen::getPixels differing from Surface::getBasePtr and I
accidently used the former in some cases in the conversion.
I also fixed a bug in debugger.cpp which exchanged x and y.
Mac Loom's drafts appear to be stored from variable 55 and upwards.
I'm working under the assumption that there's either only one
version of Loom for the Mac, or that they all behave the same. I
could be wrong about that.
It was never quite clear exactly what "drafts fix" did. It wasn't
guaranteed to work on all versions of Loom - or at all - and I
haven't heard any reports about the data structure getting
corrupted for years.
Some object functions allow actor IDs and object IDs as parameters. They are easily distinguishable in engines > 0 as actor IDs are < _numActors and object IDs are bigger. In v0 this is not the case as there are objects with IDs like 3 and 5 (e.g. the hamster). So object ID handling was unified for v0 and the other engines by introducing objIsActor(), objToActor() and ActorToObj().
Previously, we had a couple of arrays of size N (where N = number of
resource types), one for each attribute of a resource type (such as as
the number of resources of that type.
Now, we have one array of size N, whose elements are a record
aggregating all the attributes of each resource type.