The routine at 39958 is responsible for animating the puff of smoke. The instruction at 39972 initialises a loop counter to five with the intention
of iterating over all puff of smoke graphic frames at 31377. There are, however, six frames, so the sixth is never drawn. It is possible that this bug
is related to the fact that in Spellbound (which uses the same puff of smoke graphics), the routine that draws all six frames uses a somewhat different
mechanism to do so; the Spellbound drawing method uses a loop counter initialised to five to draw six frames.
When Magic Knight takes an object from a character, that character's "take an object" routine is executed. The start addresses of these routines are
listed in a table at 42069, and Off-White's routine is located at 42085. All Off-White's routine does, however, is to check whether the object being
taken is an egg, and if so have Off-White refuse to hand it over. Off-White tends to be rather trigger-happy in other circumstances and so should be
To fix, set Off-White's "take an object" routine to be 42244:
Off-White and Grunter don't kill on giving an object
When Magic Knight gives an object to a character, that character's "give an object" routine is executed. The start addresses of these routines are
listed in a table at 42413; Off-White's routine is located at 42429 and Grunter's routine is located at 42488.
All Grunter's routine does is to transfer the object in question to Magic Knight's inventory. As Grunter readily kills Magic Knight if he tries to take
an object, the beast should also kill when an object is given.
Off-White's routine checks whether the object being given is the Brass Ankh, and if so it is refused. A jump is then made to 42437 to a non-existent
code address. The result of this is that the game will freeze if Magic Knight attempts to give an object to his evil counterpart. While Off-White's
refusal of the ankh is consistent with his dark nature, he should really kill Magic Knight instead.
To fix Grunter's "give an object" routine so that he kills Magic Knight, it should be set to 42244 or 45723:
To fix Off-White's "give an object" routine so that he kills Magic Knight, it should also be set to 42244 or 45723:
2 × 2 block drawing
The routine at 41271 draws 2 × 2 blocks as defined in the table at 49794. These definitions include a bitmap that determines which of
the four character cells spanned by the block have a terrain interaction parameter applied. The routine functions correctly up to 41398, by which
point the upper two cells have had their terrain interaction parameters correctly applied. The instructions from 41398 are intended to advance the
terrain interaction data pointer down one character row and paint the lower two cells, however the instructions are in the wrong order. The instructions
at 41398 - 41402 load B with the terrain interaction painting bitmap and A with the terrain interaction parameter to apply. Then the
instructions at 41405 - 41411 advance the terrain interaction data pointer by 32 bytes by adding 32 in BC. When BC is loaded with 32 at
41408, the terrain interaction painting bitmap value is lost, and therefore from 41412 onwards the value in B is zero.
In order to fix this bug, the two blocks of code, 41398 - 41402 inclusive, and 41405 - 41411 inclusive, should be switched in position.
Spelling and punctuation
There are a number of spelling and punctuation issues:
the text entry at 53258 contains "EXTREEME" instead of "EXTREME"
the text entry at 53607 contains "HUNNEY" instead of "HONEY" (or "HUNNY", see trivia)
the text entry at 54837 contains "THROW" instead of "THROWN"
the text entry at 55083 contains "DISQUISE" instead of "DISGUISES"
the text entries at 56850 and 58256 are missing apostrophes
the text entry at 57867 contains "DISQUISE" instead of "DISGUISE"
For reasons of consistency, "disquise" is used in place of "disguise" throughout this disassembly.
Text never shown
The byte at 23714 determines the index of the current Scroll substring from the list of strings at 54902. This index is capped at 7, however there
is an eighth (and therefore unused) substring at 55139.