In Suikoden II the player can recruit up to five flying squirrels to fight on their side. Depending on how the game is played, one of them—Mukumuku—may be recruited in a fixed place, and in a manner similar to how other characters are recruited. The other four, at the very least, are recruited by wandering the world map around Greenhill after the game has advanced sufficiently far. As long as a few basic rules are followed, the squirrels will automatically and quietly enter the battle party.

The essential requirements are as follows:

The squirrels' positions in the order and on the map:
  1. Mukumuku — He can be recruited during early game events in Kyaro, or by wandering the area near the Muse-Greenhill border. His square is 11x21 tiles.
  2. Makumaku — Recruited by wandering near the curve in the north-south path from Two-River to Greenhill. His square is 21x11 tiles.
  3. Mikumiku — Recruited by wandering near where the woods grow narrow, on the path from Greenhill to Forest Village. Her square is 21x16 tiles.
  4. Mekumeku — Recruited by wandering near the larger tree on the path from Greenhill to the Matilda path. His square is 11x11 tiles.
  5. Mokumoku — Found in a narrow area of forest south of the one that leads to the Forest Village. His square is 17x11 tiles.

Recruiting - Technical Details


Most scripts in the game come in pairs. First, there is a "background" script that executes a few times every second, that checks if it is appropriate to trigger an "active" script. The most commonplace implementation of this is characters and NPCs in town. A background script will trigger their random movements, and check to see if the player is interacting with them. If an interaction is triggered, then the active script will be run, and the player will see any dialogues or actions that it specifies. The squirrels work in a similar fashion.

As soon as the player enters the world map, background scripts for each squirrel begin running. A couple of times each second, the game checks to see if it is possible, given current conditions, for a squirrel to join the party. The background scripts for each squirrel are essentially identical. They check that:
  1. The prerequisite character is recruited. Mukumuku has no prerequisite. Makumaku's prerequisite is Mukumuku. Mikumiku's is Makumaku, and so on.
  2. The character being checked isn't already recruited. Simple enough.
  3. The player is not in the menu.
  4. The player is within the region of the map defined for the squirrel.
  5. Three checks are performed for unknown purposes. One may be a check of the castle level, in which case the castle must be at a minimum of level 2. The other two checks look to be on status flags. The status flags may be updated periodically, and act as a timer.
  6. The party must contain at most 5 characters.

If all of these conditions are met, then an active script runs. This script has several functions, most of which are obvious, like setting the squirrel's level, updating its recruit status, and adding it to the party. However, the active script has a branch in it. It calls a function at 0x8016022C that generates a random number, factoring in a seed the script provides. If this number is more than 2, then the squirrel will not be recruited. This segment of the active script is what makes the squirrels difficult to recruit.

Below is the background script for Mikumiku. The other squirrels have nearly identical scripts. The only changes are the X and Y bounds and the character indices.
RAM:8016960C unk_8016960C: .byte 0x17 # DATA XREF: RAM:80169930o
RAM:8016960D .byte 0x4B                  # Is Maku recruited?
RAM:8016960E .byte 2
RAM:8016960F .byte 0x18                  # Miku not recruited?
RAM:80169610 .byte 0x4C
RAM:80169611 .byte 2
RAM:80169612 .byte 4                     # byte at 0x97(0x8006AED7) & 0x40 (checks menu status, I think)
RAM:80169613 .byte 0x97
RAM:80169614 .byte 0x40
RAM:80169615 .byte 1                     # Check X-pos of hero
RAM:80169616 .byte 0x64
RAM:80169617 .byte 0x78
RAM:80169618 .byte 2                     # Check Y-pos of hero
RAM:80169619 .byte 0x41
RAM:8016961A .byte 0x50
RAM:8016961B .byte 6                     # Maybe timer checks. Flags of some sort at a minimum -- 0x80025664 & 1 AND NOT(0x80025664 & 2)
RAM:8016961C .byte 1
RAM:8016961D .byte 7
RAM:8016961E .byte 2
RAM:8016961F .byte 0x26                  # Party contains at most 5 characters?
RAM:80169620 .byte 2
RAM:80169621 .byte 5
RAM:80169622 .byte 0x21                  # Some other variable > 1 (castle level maybe?)
RAM:80169623 .byte 1
RAM:80169624 .byte 2
RAM:80169625 .byte 0xFF                  # Terminators
RAM:80169626 .byte 0xFE
RAM:80169627 .byte 0

This is the active script for Mikumiku. Again, all the other squirrels have a very similar script. Note that the script "language" is different. There are separate handlers for background and active scripts, each with its own set of commands.
RAM:801697A0 unk_801697A0:   .byte 0x24  # $          # DATA XREF: RAM:80169934o
RAM:801697A1                 .byte    2            # Set flag bit
RAM:801697A2                 .byte 0x1E            # Generate random number, and set branch leg variable
RAM:801697A3                 .byte    4            # (tells 1E what area-function to call)
RAM:801697A4                 .byte    2            # (number of arguments)
RAM:801697A5                 .byte 0x13
RAM:801697A6                 .byte    2
RAM:801697A7                 .byte 0x29  # )        # Branch based on results
RAM:801697A8                 .byte    2            # two paths
RAM:801697A9                 .byte    0            # first condition
RAM:801697AA                 .byte    1            # second
RAM:801697AB                 .byte 0xFF            # indicates start of path
RAM:801697AC                 .byte    0            # path 0
RAM:801697AD                 .byte 0x73  # s        # Set level
RAM:801697AE                 .byte 0x4C  # L
RAM:801697AF                 .byte 0x21  # !
RAM:801697B0                 .byte 0x1F            # Area flags I think
RAM:801697B1                 .byte    0
RAM:801697B2                 .byte  0xD
RAM:801697B3                 .byte 0x2A  # *
RAM:801697B4                 .byte 0x80  # Ç        # Add to active party
RAM:801697B5                 .byte    0
RAM:801697B6                 .byte    2
RAM:801697B7                 .byte 0x4C  # L
RAM:801697B8                 .byte    1
RAM:801697B9                 .byte 0x2E  # .        # Take token?
RAM:801697BA Rec_Squirrel:   .byte 0x54  # T        # Recruit
RAM:801697BB                 .byte 0x4C  # L
RAM:801697BC                 .byte 0x1F
RAM:801697BD                 .byte 0x25  # %        # unset flag bit
RAM:801697BE                 .byte    1
RAM:801697BF                 .byte 0x25  # %        # unset flag bit
RAM:801697C0                 .byte    2
RAM:801697C1                 .byte 0x2F  # /        # relinquish token?
RAM:801697C2                 .byte 0xFF            # indicates start of path
RAM:801697C3                 .byte    1            # path 1
RAM:801697C4                 .byte 0x49  # I        # 49 is like is like sleep command or something
RAM:801697C5                 .byte 0x78  # x
RAM:801697C6                 .byte 0x49  # I        # I think if it "fails" to recruit, these force it
RAM:801697C7                 .byte 0xB4  # ¦        # to wait before unsetting 0x80025664 bit 1, so it can't try again for X cycles
RAM:801697C8                 .byte 0x25  # %        # unset flag bit
RAM:801697C9                 .byte    2
RAM:801697CA                 .byte 0xFF            # end script
RAM:801697CB                 .byte 0xFE  # ¦

The relevant code (including the scripts and the random decision function) is in the /CDROM/050_ARE/WE.BIN module.

For fun, it's possible to remove most of the randomness associated with recruiting the squirrels.

Flying Squirrels Are Easier to Recruit
D01602B8 80B3
801602AE 1000
D01602B8 80B3
30025664 0001

It may help to go into a nearby town, if you don't get a particular squirrel on your first pass through its area. I think one of the flag bits (the one unset by 0x25, 1) may signify that the area has reset in some way, and won't turn on again until some amount of time has passed, or you force a refresh by exiting and returning. In any case, I was able to consistently get all four of the "wild" squirrels in under three minutes using this.

Note: There was a typo in the code that has been fixed, and two extra lines were added to remove the semi-randomized effect of the background script. It's now possible to recruit all the squirrels in even less time. Each one will typically join on the first step you take into their map region, and there's no need to enter and leave a town to reset the area. With Stallion in your party and Champion Rune, it may even be possible to recruit all the squirrels in less than a minute.