Table of Contents

Suikoden II Bug: Knife-thrower Event
Affected Versions
Cause
Fix
GameShark Codes
Patch

Suikoden II Bug: Knife-thrower Event


Early in the game, you meet Eilie and her siblings as they are performing in Ryube. She uses the Hero as a hesitant volunteer in her knife-throwing act. Every time she is about to throw, the player is given the option to keep the hero still, or to move him a hair to the left or the right. If you ever choose to move, she will hit the Hero with her throw, and the event will end. When this happens, your character's hit points are approximately halved, but if he has only one hit point, the value will become zero.

This is the only time it is possible for a character to have zero hit points outside of battle. Without resting, the Hero will go into subsequent battles alive, but with zero hit points. There do not seem to be any detriments to the bug. He will die normally if attacked, and his hit points will be set to one after battle. This bug is more of an oddity, than a hardship on the player.

Affected Versions


All versions are affected by this bug.

Cause


The problem lies in the game utilizing code that should probably only be used during battles as part of an out-of-battle script. There is a multipurpose function for dealing with stats that is called when Eilie hits the Hero. The arguments passed will cause a character's current hit points to be halved. Since this is potentially useful in battle, the halving needs to be done so that the zero can result, i.e., when hit points are 1, zero should be the result rather than one. As such, Konami used the integer quotient of division as the resultant HP, rather than taking half, and subtracting that from the original value.

During these events, code written for the purpose should have been used, so that the hit point value cannot become zero.
TEXT:800730E4                 lhu     $v0, 0x872($v1)
TEXT:800730E8                 nop
TEXT:800730EC                 div     $v0, $a1
....
TEXT:80073114
TEXT:80073114 loc_80073114:                            # CODE XREF: MngCharaStat+F8j
TEXT:80073114                                          # MngCharaStat+100j
TEXT:80073114                 mflo    $v0
TEXT:80073118                 j       loc_8007320C
TEXT:8007311C                 sh      $v0, 0x872($v1)
This is the code in question. Most of it is spent finding the address of the character, and checking for exceptions like Divide By Zero. Those sections of the code have been removed.

The code that calls it is located in /CDROM/020_ARB/VB18.BIN.
RAM:8010DCA0                 li      $v1, 0x80073008
RAM:8010DCA8                 li      $a0, 3
RAM:8010DCAC                 li      $a1, 2
RAM:8010DCB0                 sw      $v1, dword_8015B238
RAM:8010DCB4                 move    $s1, $v0
RAM:8010DCB8                 li      $a2, 1
RAM:8010DCBC                 jalr    $v1
RAM:8010DCC0                 addiu   $a3, $sp, 0x10

Fix


This calling code in the BIN file is hard-coded to both halve hit points and to do so only to the Hero. As such, it can be easily replaced with code that does exactly that, and prevents his hit points from dropping below 1.
; Suikoden II Eilie Script Fix
; Written by Pyriel
.psx
.createfile eilie_fix.bin, 0x8010DCA0
.align 4
 
eilie_fix:
    lui v1, 0x8007        
    lhu a0, 0x9896(v1)        ;load hero's current HP
    addu s1, zero, v0        ;preserved from previous code
    srl a0, a0, 1            ;shift hit points right by 1 (divide by 2)
    bne a0, zero, store        ;if hit points not zero, store
    nop
    addiu a0, zero, 1        ;set to 1 if zero
    nop
 
store:
    sh a0, 0x9896(v1)
 
.close

GameShark Codes

A code is unnecessary for this. The bug is not game-breaking, and it's easy enough to use an Infinite HP code or to rest at an inn, if you're worried about it.

Patch

Find your version on the Patch Files page.