Table of Contents

Who Receives Bonuses
Level Bonuses
Weapon Bonuses
Transferring Runes
Conversion Table
Transferring Items
Helmet Conversion Table
Armor Conversion Table
Hypothetical Accessory Conversion Table
Highest Level Bonus
Example

You get a fair number of bonuses for loading data from the original Suikoden into Suikoden II.

This page is going to be a bit disorganized for the time being. The ordering of the bonus descriptions is the processing order unless otherwise noted.

Who Receives Bonuses


Seventeen characters are set up to receive bonuses based on their levels, etc. from Suikoden. Below are their names, followed by the data from the default table. The first two columns are in hex and are just the ID mapping from Suikoden II to the original. The last column is the character's default level.
Character
Suikoden II ID
Suikoden ID
Default Level
01:Flik
0x2
0x11
20
02:Viktor
0x3
0x23
20
03:Sheena
0x5
0x3E
38
04:Clive
0x6
0x35
16
05:Hix
0x7
0x3F
27
06:Tengaar
0x8
0x21
27
07:Futch
0x9
0x13
34
08:Humphrey
0xA
0x15
34
09:Valeria
0xC
0x24
38
10:Pesmerga
0xD
0x6B
50
11:Lorelai
0xE
0x2F
38
12:Meg
0x29
0x4C
31
13:Luc
0x35
0x1A
27
14:Vincent
0x40
0x32
49
15:Stallion
0x43
0x4B
31
16:Kasumi
0x49
0x17
38
17:McDohl
0x52
0x8
38

Tai Ho doesn't receive bonuses because he wasn't set up to. Was he forgotten or deliberately excluded? Who knows. Everybody misses Vincent for some reason.

Level Bonuses


Each character gets a bonus based on their level from Suikoden, but only if their level (or at least the level of the character they're associated with) is 60 or higher.

The calculation is bonus = (suikoden_level - 50) / 10 * default_level / 10

To prose it up, subtract 50 from their level from Suikoden, divide the result by ten. Multiply that result by their default level from Suikoden II, and finally divide that by ten to get the number of bonus levels they'll be given. This is all integer division, so discard any fractional amounts. No rounding up ever occurs.

Each character that reached level 99 in the original will also receive a flat bonus of 5 additional levels. At level 98, Flik will receive (99 - 50) / 10 = 4 -> 4 * 20 = 80 -> 80 / 10 = 8, 8 bonuses levels, for an initial level of 28. At 99, he gets a flat bonus of 5 extra levels on top of that, so he'd be level 33.

Weapon Bonuses


Determined by bonus = (weapon_level - 10) / 2.

Transferring Runes


It looks like it attempts to transfer the equipped rune, but it looks at the wrong data. It only even attempts this if the default data for the character has three empty rune slots. I'm pretty sure most of the characters are initialized with at least one rune.


Conversion Table

Suikoden
Suikoden II
02 - Fire
01 - Fire
03 - Water
03 - Water
04 - Wind
05 - Wind
05 - Lightning
09 - Lightning
06 - Earth
07 - Earth
07 - Resurrection
00 - Nothing
08 - Boar
00 - Nothing
09 - Shrike
00 - Nothing
0A - Falcon
00 - Nothing
0B - Hate
00 - Nothing
0C - Trick
00 - Nothing
0D - Clone
00 - Nothing
0E - Double-Beat
41 - Double-Beat
0F - Killer
42 - Killer
10 - Counter
43 - Counter
11 - Spark
44 - Spark
12 - Hazy
4A - Hazy
13 - Gale
00 - Nothing
14 - Sunbeam
00 - Nothing
15 - Holy
00 - Nothing
16 - Fortune
00 - Nothing
17 - Prosperity
00 - Nothing
18 - Champion's
00 - Nothing
19 - Turtle
00 - Nothing
1A - Phero
47 - Phero
1B - Rage
01 - Fire
1C - Flowing
03 - Water
1D - Cyclone
05 - Wind
1E - Mother Earth
07 - Earth
1F - Thunder
09 - Lightning


You can see where the error might be in the code below. In Suikoden the attached rune is one of the first pieces of data on each character. Going by the offset they use to access the level, it should be at 0x514 and not 0x564. They may restructure the data prior to analyzing it, but I can't imagine why. This requires additional investigation, in any case.

It seems the data is referenced properly. Either they do restructure it, or the reference I was using for the data structure is wrong. Regardless, it's impossible to transfer in runes. This is due in part to the game checking to see if the character's recruit status flag has bit 2 set. I don't know what that means exactly, but all the recruit status flags are zero while the data transfer is processing. Even if the check is faked, the runes are not placed on the character, in the bag, or in storage. If this was broken unintentionally, the cause is a series of really stupid choices that were never tested.

Transferring Items


If Humphrey or Pesmerga have Windspun Armor equipped in the Suikoden save, it will be equipped to them in Suikoden II. This is a very specific search, so only this item type for these two characters is considered.

The Suikoden Hero (McDohl) can transfer pretty much anything he has equipped.

Helmet Conversion Table

03 - Pointed Hat
04 - Pointed Hat
04 - Half Helmet
06 - Pointed Hat
05 - Head Gear
07 - Head Gear
06 - Full Helmet
09 - Full Helmet
07 - Silver Hat
08 - Silver Hat
08 - Horned Helmet
0C - Horned Helmet

McDohl is equipped with a Bandana (ID 01) by default. The Headband from the original has no conversion.

Armor Conversion Table

09 - Robe
0D - Robe
0A - Tunic
0E - Tunic
0B - Leather Coat
0F - Leather Coat
0C - Brass Armor
10 - Brass Armor
0D - Guard Robe
11 - Guard Robe
0E - Karate Uniform
12 - Karate Uniform
0F - Leather Armor
13 - Leather Armor
10 - Half Armor
16 - Half Plate
11 - Magic Robe
17 - Magic Robe
12 - Ninja Suit
15 - Ninja Suit
13 - Dragon Armor
1A - Dragon Armor
14 - Master Robe
1B - Master Robe
15 - Full Armor
1C - Full Plate
16 - Taikioku Wear
1D - Taikiyoku Wear
17 - Master Garb
1E - Master Garb
18 - Windspun Armor
25 - Windspun Armor

Dragon Armor is the default. Everything from the first game has a conversion here, even things he couldn't equip.

Shields and accessories do not transfer by design. There's little to be gained by bringing in two accessories, but on the off chance someone wants to add the functionality, this is one possible conversion chart for them.

Hypothetical Accessory Conversion Table

1B - Wooden Shoes
2D - Wooden Shoes
1C - Boots
2E - Boots
1D - Toe Shoes
2F - Toe Shoes
1E - Wing Boots
30 - Winged Boots
1F - Earth Boots
00 - None
20 - Gloves
32 - Gloves
21 - Gauntlet
33 - Gauntlet
22 - Silverlet
34 - Silverlet
23 - Goldlet
36 - Goldlet
24 - Mangosh
00 - None
25 - Power Gloves
35 - Power Gloves
26 - Cape
37 - Cape
27 - Fur Cape
39 - Fur Cape
28 - Cape of Darkness
3A - Cape of Darkness
29 - Crimson Cape
3B - Crimson Cape
2A - Circlet
00 - None
2B - Blue Ribbon
47 - Blue Ribbon
2C - Feather
00 - None
2D - Silver Ring
00 - None
2E - Leggings
41 - Leggings
2F - Shoulder Pads
42 - Shoulder Pads
30 - Emblem
00 - None
31 - Star Earrings
48 - Star Earrings
32 - Rose Brooch
4B - Rose Brooch
33 - Guard Ring
4F - Guard Ring
34 - Speed Ring
51 - Speed Ring
35 - Power Ring
52 - Power Ring
36 - Necklace
3C - Necklace
37 - Silver Necklace
3E - Silver Necklace
38 - Gold Necklace
3F - Gold Necklace

They may have felt that you could gain too much by transferring in some of these (I can't imagine which). For shields, at least, the lack of transfer can simply be ascribed to McDohl's inability to equip them without cheats.

Highest Level Bonus


One character will receive a flat bonus of five levels for having the highest level in the Suikoden save. Only one character will get the the bonus, even if you level everybody up to level 99. Who gets the bonus when two or more characters are at the highest level is determined by generating a random number to pick between them.

The game saves the Suikoden levels of each character in order according the bonus list at the top of this article. Flik is in the first position, and McDohl comes last. This list of levels is scanned to find the highest value. Each character that reached this level is then counted. If the count is one, then whoever had the highest level gets the bonus. If the count is two or higher, a random number is generated that is lower than the count, i.e. a number from 0 to count - 1, up to a maximum of 16. This number determines which character will get the bonus. The level list is rescanned, and when it finds a character with that level, and the count of previous hits matches the number, the character in that position gets the bonus.

Example

Let's say Flik, Pesmerga, and McDohl are each level 99. Everyone else is lower. That's 3 characters with the highest level.
1
Flik
99
10
Pesmerga
99
17
McDohl
99

The game will generate a random number lower than 3. Assume it's 1. It then rescans for characters who are level 99. It finds Flik, and checks how many times it's found the level it's looking for so far. Zero hits so far, so Flik doesn't get the bonus. It adds 1 to hit count, making it 1. It resumes scanning, and doesn't get a hit on the level for Viktor through Valeria, but Pesmerga's level is the right value. It checks the hit count, and it's 1, which is the random number we're looking for. Pesmerga gets the bonus.

If the random number had been 0, Flik would have gotten the bonus. Had it been 2, McDohl would have gotten it.

Note: The results of this might be consistent, depending on how much random number generating occurs on the Title Screen and the Name Input Screen. If it's zero, then the number won't be random at all, and even if some does occur, how quickly you move through the screens may affect just how random these "random" numbers are. It's conceivable that you'll get consistent results, even though the developers' intention was that they be unpredictable.

RAM:80110010                 move    $s2, $0
RAM:80110014                 move    $s3, $0
RAM:80110018                 addiu   $a0, $sp, 0x20   # Address of G1_Level array from earlier
RAM:8011001C                 addu    $v0, $a0, $s3
RAM:80110020
RAM:80110020 loc_80110020:                            # CODE XREF: RAM:80110040j
RAM:80110020                 lbu     $v1, 0($v0)
RAM:80110024                 andi    $v0, $s2, 0xFF
RAM:80110028                 sltu    $v0, $v1
RAM:8011002C                 beqz    $v0, loc_80110038
RAM:80110030                 nop
RAM:80110034                 move    $s2, $v1         # Get highest level
RAM:80110038
RAM:80110038 loc_80110038:                            # CODE XREF: RAM:8011002Cj
RAM:80110038                 addiu   $s3, 1
RAM:8011003C                 slti    $v0, $s3, 0x11
RAM:80110040                 bnez    $v0, loc_80110020
RAM:80110044                 addu    $v0, $a0, $s3
RAM:80110048                 move    $fp, $0
RAM:8011004C                 move    $s0, $fp
RAM:80110050                 move    $s3, $s0
RAM:80110054                 addiu   $a0, $sp, 0x20
RAM:80110058                 andi    $v1, $s2, 0xFF
RAM:8011005C                 addu    $v0, $a0, $s3
RAM:80110060
RAM:80110060 loc_80110060:                            # CODE XREF: RAM:80110080j
RAM:80110060                 lbu     $v0, 0($v0)
RAM:80110064                 nop
RAM:80110068                 bne     $v1, $v0, loc_80110078
RAM:8011006C                 nop
RAM:80110070                 move    $fp, $s3         # Position of character matching highest level
RAM:80110074                 addiu   $s0, 1           # Count of characters matching highest level
RAM:80110078
RAM:80110078 loc_80110078:                            # CODE XREF: RAM:80110068j
RAM:80110078                 addiu   $s3, 1
RAM:8011007C                 slti    $v0, $s3, 0x11
RAM:80110080                 bnez    $v0, loc_80110060
RAM:80110084                 addu    $v0, $a0, $s3
RAM:80110088                 li      $v0, 1
RAM:8011008C                 beq     $s0, $v0, l_give_bonus
RAM:80110090                 li      $v0, 0x800D4C2C  # rand
RAM:80110098                 lui     $v1, 0x8013
RAM:8011009C                 jalr    $v0              # call rand
RAM:801100A0                 sw      $v0, dword_80133DD4
RAM:801100A4                 mult    $0, $v0, $s0     # multiply by highest_level count
RAM:801100A8                 mflo    $v0
RAM:801100AC                 bgez    $v0, loc_801100BC
RAM:801100B0                 sra     $s1, $v0, 15
RAM:801100B4                 addiu   $v0, 0x7FFF
RAM:801100B8                 sra     $s1, $v0, 15
RAM:801100BC
RAM:801100BC loc_801100BC:                            # CODE XREF: RAM:801100ACj
RAM:801100BC                 move    $fp, $0
RAM:801100C0                 move    $s0, $fp
RAM:801100C4                 move    $s3, $s0
RAM:801100C8                 addiu   $v1, $sp, 0x20
RAM:801100CC                 andi    $a1, $s2, 0xFF   # Highest level
RAM:801100D0                 addu    $v0, $v1, $s3
RAM:801100D4
RAM:801100D4 loc_801100D4:                            # CODE XREF: RAM:801100F8j
RAM:801100D4                 lbu     $v0, 0($v0)
RAM:801100D8                 nop
RAM:801100DC                 bne     $a1, $v0, loc_801100F0
RAM:801100E0                 nop
RAM:801100E4                 beq     $s0, $s1, l_give_bonus
RAM:801100E8                 move    $fp, $s3
RAM:801100EC                 addiu   $s0, 1
RAM:801100F0
RAM:801100F0 loc_801100F0:                            # CODE XREF: RAM:801100DCj
RAM:801100F0                 addiu   $s3, 1
RAM:801100F4                 slti    $v0, $s3, 0x11
RAM:801100F8                 bnez    $v0, loc_801100D4
RAM:801100FC                 addu    $v0, $v1, $s3
RAM:80110100
RAM:80110100 l_give_bonus:                            # CODE XREF: RAM:8011008Cj
RAM:80110100                                          # RAM:801100E4j
RAM:80110100                 li      $v0, 0x80073E24  # MP_Level_Sub
RAM:80110108                 li      $a0, 1
RAM:8011010C                 li      $a1, 5
RAM:80110110                 lui     $v1, 0x8013
RAM:80110114                 la      $a2, BonusCharactersDefaults
RAM:8011011C                 sw      $v0, dword_80133DD4
RAM:80110120                 sll     $v1, $fp, 1
RAM:80110124                 addu    $v1, $fp
RAM:80110128                 addu    $v1, $a2
RAM:8011012C                 lbu     $a2, 0($v1)
RAM:80110130                 jalr    $v0
RAM:80110134                 addiu   $a3, $sp, 0x38