https://fabiensanglard.net/sf2_sheets/index.html
FABIEN SANGLARD'S WEBSITE
---------------------------------------------------------------------
ABOUT EMAIL RSS DONATE
Dec 22, 2021
Street Fighter II, paper trails
---------------------------------------------------------------------
The late 90s saw the emergence of Capcom in the world of arcades. The
Osaka based company seemed to produce one hit after another with
Ghouls'n Ghosts in 1988, Final Fight in 1989 and Street Fighter II in
1991 among a myriad of other excellent games.
During this era, a video-game enthusiast could not go to an arcade
without seeing multiple Capcom cabinets, proof of their popularity
with both players and operators.
Over the past six months, I have spent my spare time studying Capcom
success stories and in particular the genesis of Street Fighter II.
If discovering the engineering behind the CPS-1 was fascinating, I
found the side story of how developers tracked ROM budget using paper
and scissors equally interesting.
CP-System 101
---------------------------------------------------------------------
Introduced in 1988, the CPS-1 (a.k.a CP-System at the time) was
Capcom unified arcade platform. Among its many innovations was a
powerful graphic rendering pipeline.
If it still embraced the concept of layers, the CPS-1 abandoned the
constraint of rectangular sprites. The OBJ layer is built via 16x16
units called "tile". In Street Fighter II, tiles are combined to make
character poses. This approach gave considerable freedom to the
artists who proceeded with designing "objects" of arbitrary sizes and
shapes.
[ryu] [sagat] [honda] [chunLi]
Ryu's Sagat's Tiger Chun-li being
victory Uppercut pose (30 Honda's Jump pose (45 awesome pose (25
pose (29 tiles) tiles) tiles)
tiles)
Besides a few basic operations such as horizontal and vertical
flipping, the CPS-1 cannot alter tiles. It has no rotating or scaling
capabilities. What made the machine stand out was the sheer volume of
tiles it could manipulate per frame, reported to be in the vicinity
of 256.
It was a real tour-de-force at the time to make so much of the screen
move. The "wow" factor immensely contributed to the success of the
games. In a game like "The Punisher", the kingpin final boss is made
of poses reaching up to 80 tiles.
[kingpin]"The Punisher" screen can be almost covered with sprites
(Source: rq87.flyingomelette.com).
ROM Budget
---------------------------------------------------------------------
If the CPS-1 capabilities were a blessing for artists, it was a
problem for project managers. In an era where ROM chips were very
expensive, a game was allocated a ROM budget at its beginning which
it could not exceed.
Before the CPS-1, remaining within the budget was a simple matter of
a division. The number of #sprites allowed to the art team was ROM
size / rectangular sprite size. But the free form factor introduced a
tracking problem.
The sheet system
---------------------------------------------------------------------
The solution came under the form of paper sheets and scissors.
In order to make the best use of the capacity we had, we wrote
the ROM's capacity on a board, and cut and paste the pixel
characters on the board.
If there was space left on the board, then there was open
capacity in the ROM. So, from there we started filling in the
spaces, like a puzzle.
One thing that happened that's kinda interesting, we saved making
the ending for last, and by the time we got there we were all out
of capacity. We were wondering what to do, when we found a board
that had gone missing under a desk.
We called it the "Mirac-ulous Memory."
- Akira Nishitani, SF2 development interview
[rom_sheet]A blank sheet
Since the CP-S uses 16 indexed colors (4-bit per pixel), a sheet of
16x16 tiles represents 16x16x16x16 / 2 = 32 KiB. For a game such as
Street Fighter II: World Warrior, the team allocated 4.6 MiB out of
its 6 MiB ROM budget to sprites and therefore printed 144 paper
sheets.
Sheets archeology
---------------------------------------------------------------------
This system is a golden opportunity for a software archaeologist.
Among other things one can see which features were added later (these
would be implemented using left-over space and therefore less
elegantly cut out).
Unfortunately, I was only able to come across two of them. I found a
Dhalsim in the article "Final Fight Developer's Interview"^[1] and a
Ryu in the book "How To Make Capcom Fighting Characters"^[2].
[rom_sheet_dhalsim] [rom_sheet_ryu]
Sheet 0x3300 Sheet 0x4500
Notice the tile addressing system in the upper left of each sheet
(Dhalsim 0x3300 and Ryu 0x4500). The first two hex characters give a
value [0-255] which is the sheet ID while the two remaining are the
tile ID within that sheet.
Also notice how the sheet tiles are rectangular instead of square.
The CP-System uses a resolution of 384x224 which aspect ratio differs
from the 4:3 aspect ratio of a CRT. Had designers drew in squares,
the result would have been compressed on screen. By drawing in
rectangles, they essentially reverse-stretched the visual assets so
tiles would be displayed as they were drawn. This non-square pixel
system was a nightmare for the art team.
When I was working on Forgotten Worlds, I noticed the problem of
aspect ratio. "The pixels are not square!" I told my boss.
"Impossible, I ordered them to be square!" he replied and called
hardware on the spot.
"The pixels are square!" he replied.
Later I protested again to which my boss replied it was a
calculation error.
- Akira Yasuda, SF2 producer^[3])
It was disappointing to see that only two sheets had come out but it
was possible to reconstruct them using the imprint left in the ROM.
Thanks to mame and sf2platinium providing the GFX-ROM format, a tool^
[4] was written to automate the process. With all the sheets
reconstructed, it was analysis and hypothesis time.
Exploring the sheets
---------------------------------------------------------------------
The CPS1 works with four layers. The OBJ layer of Street Fighter II
is made of 144 sheets totaling 4.6MiB. The remaining 1.4MiB is used
for the background and frontground layers called SCROL1 (16 sheets),
SCROL2 (8 sheets), and SCROL3 (23 sheets).
[sf2_sheets_stats]
The most byte-heavy characters are Zangief (19), followed by Honda
(15), Dhalsim (14, he is slim but stretches a lot!), Blanka (15), Ryu
(13.5), Guile (11), Chun-li (10), Dictator (9, his cape takes a whole
sheet!), Sagat (6), Boxer (6), Claw (6), and Ken (3).
The first sheet features, without surprise, the main protagonist Ryu.
[0x0000]
Notice how Ryu's top hair for 0x69/0x6A was placed at 0x6F/0x9F in
order to not disturb the layout. Why the hair of the top left pose is
offsetted is unknown. Could it be that GFX ROM address 0x0000 could
not be used? Analyzing other games also showed that tile 0x0000 was
never used.
Ken is a patch
---------------------------------------------------------------------
+---------------+
| | | | | | | | |
|-+-+-+-+-+-+-+-|
| | | | | | | | |
+---------------+
Ryu palette
+---------------+
| | | | | | | | |
|-+-+-+-+-+-+-+-|
| | | | | | | | |
+---------------+
Ken palette
Looking at the pie chart, we can see that Ken character is consuming
an impossibly small amount of three sheets.
That is because Ken is a patch on top of Ryu tiles. Ryu palette is
specially designed to be skin tone compatible with Ken. Only the
clothes and face colors differ.
[0x0100] [0x4700]
The patching is obvious on sheet 0x0100 where Ryu's winning pose 0x76
is next to Ken 2x2 patch at 0x70.
[ryu] [kenWin] [kenWinHo] [kenWinPa] [kenWinFi]
Ken's victory pose starts with Ryu's pose. The palette is changed and
only differing tiles are used. Notice how Ryu's teeth white color
comes from his clothes. For Ken, artists had to reuse some of the
skin color because Ken's kimono is red.
Hunting crumbles
---------------------------------------------------------------------
In sheet 0x4700 ("Ken is patch" section), we can see a 2x2 portrait
at 0xC0 that is not a fighter. This is in fact the picture of the
development team. They are featured in the credit at the end of the
game. Notice how it features neither accurate pictures nor give real
names. Likely done so to avoid talent poaching.
[credit1] [0 ]
Fun fact: "NIN" is the alias of Akira Nishitani who was a producer at
Capcom. It was used for all high scores in all games he worked on
including Forgotten Worlds, Final Fight, and Street Fighter 2.
No small saving
---------------------------------------------------------------------
Developers seem to have been so short on ROM that they even used
partial pose symmetry. In 0x4E00, Saga's left leg is missing at 0xBA.
To draw it, the CPS-1 is instructed to use the right leg tiles and
flip them horizontally.
[0x4e00]
Dhalsim (0x3300) sheet differences
---------------------------------------------------------------------
[rom_sheet_dhalsim] [0x3300]
Dahlsim reconstructed sheet is a near perfect match. Although we can
see that the pose outlined in red did not make the cut. It was
sacrificed to Chun-li's "Hundred Rending Legs" which would indicate
it was a later addition. At 0x4C we can see crumble space was
allocated to Blanka.
Ryu (0x4500) sheet differences
---------------------------------------------------------------------
[rom_sheet_ryu] [0x4500]
Similar differences can be seen in Ryu's sheet. Two poses (at 0xC2
and 0xCC) were deleted before shipping to accommodate Chun-li's
"Spinning Bird Kick" (a move also added at the end of development?)
and the team credit portraits.
For how long was the sheet system used?
---------------------------------------------------------------------
With powerful workstations such as the X68000 around at the time, I
always wondered for how long the sheet system was used before a tool
was written to compile the GFX assets. With the ability to look at
other game sheets, it was possible to make a rough estimate.
The first destination was to visit all games made by the same team
starting with titles released prior to SF2, Forgotten World and Final
Fight. Although I did not take the time to locate the palettes and
used a default greyscale, it was still possible to see shapes
distinctively.
[fw-0x0000] [ff-0x0400]
Forgotten World sheet (1988) Final Fight sheet (1989)
Without surprise, the same structure was found. Later games such as
Street Fighter 2: Champion Edition and Street Fighter 2: Hyper
Fighting were also checked. Since GFX was not changed the sheets were
identical.
[sf2hf-0x0000] [sf2hf-0x0000]
Street Fighter 2: Champion Street Fighter 2: Hyper Fighting
Edition (1992) sheet (1992)
Other Capcom teams
---------------------------------------------------------------------
Capcom had several titles produced in parallel by different teams.
Checking other teams' work responsible for Ghouls 'n Ghosts and
Strider showed once again the same process albeit less crammed.
[gg-0x0000] [strider-0x0c00]
Ghouls 'n Ghosts sheet (1988) Strider sheet (1989)
Non-Capcom games
---------------------------------------------------------------------
Some CPS-1 games were not produced by Capcom. This was the case for
Pang-3 by Mitchell Corporation. Once again, no changes.
[pang3-0x0000]
CPS-2 and Super Street Fighter 2
---------------------------------------------------------------------
It seems like the sheet system was in effect for most if not all
CPS-1 games. Looking at CPS-2 games was a bit more difficult since
Capcom added many protection mecanisms. While the 68000 instructions
and Z-80 instructions were encrypted, the GFX ROMs are merely
shuffled and easily viewable.
In the first CPS-2 title, Super Street Fighter 2 (1993), four new
characters were added to the existing twelve roster. The existing
character sheets are unchanged.
[ssf-0x0000] [ssf-0x9000]
Super Street Fighter 2 Ryu sheet Super Street Fighter 2 Cammy sheet
(1993) (1993)
But if we look at Cammy sheets (0x9000) the layout was clearly not
made by hand. It seems an allocation system proceeding top to bottom
and left to right was used instead. It seems like Capcom started
using tools to build new GFX ROMs for SSF2 circa 1992. Whether x68000
workstations were used remains unknown.
Street Fighter Alpha
---------------------------------------------------------------------
Moving forward with CPS-2 titles, Street Fighter Alpha (1995) and
Street Fighter Alpha 3 (1998) both show the same type of structure
indicative of a tool. All sheets look like mashed potatoes without
any wasted tile space. It is likely that none of the CPS-2 titles
used the sheet system.
[sfa-0x0400] [sfa3-0x0000]
Street Fighter Alpha sheet (1995) Street Fighter Alpha 3 sheet (1998)
Call for interview
---------------------------------------------------------------------
I have made several attempts to talk with developers who worked on
CPS-1/CPS-2 systems. All of them have failed so far. I would like to
document and preserve how these machines were programmed. I am
especially interested in knowing how the X68000 was used. If you have
first hand experience or if you can get someone in touch with me,
please email me :) !
References
---------------------------------------------------------------------
^ [1] Final Fight Developer's Interview
^ [2] How To Make Capcom Fighting Characters
^ [3] Akiman's Twitter account
^ [4] Tool CPSheet
---------------------------------------------------------------------
*