A few years late to the party, but I've recently discovered just how BS drawing magic seals is in an emulator.
Speaking of BS, BS Free helped me find the old codes for this game to quickly make this one:
Code:
Easy Seal Drawing
0201C5A8 E3A00000
.org 0x0201C5A8
@mov r0, r0, lsl #0x6
mov r0, #0x0 @New instruction
Notes about how I obtained this information:
0x020D36A8 - First boss's HP
0x020D345D - Set this to 0x06 to make the seal for the boss appear (this is done by a function that confirms the boss's HP has been reduced to 0)
0x020D102C - Set this to 0x00010000 to make attacks be stuck in their first frame (unrelated but fun tidbit found by accident during this)
0x020F29BC - Freeze this when it changes to 1025 when the magic seal appears to make it unable to be failed or completed
Setting it to 2047 instead of freezing it makes the seal auto-complete, but the boss won't be defeated this way
The boss instead becomes stuck flashing red and is unable to be fought anymore
This can be escaped by changing [0x020D345D] from 0x07 to 0x06
0x020D3450 - Some kind of callback register, held the value below which was a function that processed the boss's behaviour
0x022FFDE8 - One of the possible locations of a function that is called when the seal for the first boss is drawn correctly
The function reached a part of its switch statement that led to 0x02300C58, a call to a function that eventually raised the player's EXP
This switch statement's case value appears to be [0x020D345D] (see above), which appears to be the state machine for the boss (Puppet Master has just over half as many states)
During case 7, if r0 is set to be greater than 0 after each call that has a cmp r0 instruction after, the boss will be (partially) killed even if the seal is failed
If this is done, the boss will float in the air in pieces and Yoko's dialogue will be skipped as well as the healing orb, but the soul and exp will still be obtained - however, entering the room again after this freezes the game
In the opposite case of changing the values to their usual failure values of -3 after succeeding at the seal, the boss fight will continue except the seal will converge into the healing orb
The boss can be fought normally in this state and even be killed again
The values returned by those functions are both [[0x0208AC20] + 0x3662B] (because they're both calls to the same argumentless function for some reason)
This appears to be a flag indicating the success level of the seal drawing with numbers that seem to range from -3 through 1
0x0201C660 appears to be a validation function for drawing the seal
Forcing it to return 1 doesn't seem to make a difference
0x0201C550 is a validation function that seems to return the distance of where the player is drawing from the point they're supposed to
Forcing this function's return value to be read as 0 makes the seal much easier to draw
This function seems to be called constantly however so it may have adverse effects
(Confirmed; leaving this change active causes some enemies to behave oddly; the enemies spawned by the final boss will target Soma with their lunge from any distance and become extremely aggressive while the flying spear enemies will seem to hover in one place instead of flitting about as usual)
Further testing with 0x0201C550 set to return 0 seems to consistently make seals auto-complete, but not instantly
Rather, for the first seal, the first correct point had to be started at, and for seal 3 (Puppet Master uses this seal) the first correct line and part of the second had to be drawn
Seal 4 required more than the first correct line to be drawn as well, but auto-completed before the third line could be started
Seal 5 required about half of the circle part of the seal to be drawn
The change is for the most part acceptable to leave active