In the mid to late 90s, Playstation games had three SKUs: SCUS, SCEE, and SCEJ, being respectively the US NTSC version, the European PAL version, and the Japanese NTSC version.
The American version shipped in early September 1996. We finished it in early August (manufacture took a month). From my perspective — and it’s worth noting that during the Crash period I personally did most of the localization work — the European version was finished at the same time. I’d killed myself getting it ready during July. But Europe itself liked to drag matters out with a leisurely testing schedule. I wanted it done, because until it was, I couldn’t do much else.
At Naughty Dog, we pioneered the idea of simultaneous international release. By Crash 2 and Crash 3 the same exact code, conditionalized very slightly, ran all three versions. Jak & Daxter was one of the first games where the American version included the European languages. By Jak II you could switch languages on the fly in the menu anytime. We wanted one code base, one art base, one thing to debug. We wanted it for sale simultaneously world wide. I wanted one gold master.
This goal and the tools to do it began on Crash 1, and were fairly well in place by Crash 2. The international groups weren’t quite as on board and year after year dragged out the European and Japanese editions for extra testing. As best I can tell this resulted mostly from a “this is the way it’s always been done” kind of mentality. Jason and I have never been big on that type of reasoning. Still, that personal caveat aside, even from Crash 1, Sony’s international teams did an awesome job, putting in a tremendous effort to ensure the product was really polished for each territory.
Anyway, each territory had its own quirks. With the European version, they stemmed from PAL, the old European video standard. PAL actually has a slightly higher resolution and better color fidelity than NTSC (the US standard). But the kicker is that it runs at 50 hertz instead of 60. For Crash this meant that the frame rate would be 25 frames per second instead of 30.
The resolution itself wasn’t much of a problem. Crash was mostly a 3D game and it wasn’t hard to adjust the projection matrix in the engine to render the game to a different resolution. But the aspect ratio of PAL pixels is also a little different and Crash did have a certain amount of bitmap graphics like the powerups and font. The PAL frame buffers were larger and the machine had the same video RAM so increasing the resolution of the sprites was rarely an option. Generally, we just had to live with a slight aspect shift or stretch them to fit. I developed notation in the original data so that different kinds of sprites could go either way in a fairly uniform manner.
The real kicker was the frame rate. One of the reasons why the animation in Crash is so so much better than most of its contemporaries is that we stored every vertex for every frame — then compressed the living crap out of it. This meant that each segment of animation was sampled from Alias PowerAnimator at 30 fps. I modified the tools to support making a second copy of every animation where the step rate was adjusted to 25fps. The pal version used these files instead of the originals. This worked about 80% of the time. Sometimes it became necessary to notate a particular animation segment as having a strange or custom step for PAL, or even hand code certain frames. I added special constructs to my custom language (GOOL) which made this stuff as automatic as I could.But the physics and collision systems also needed to adjust to the different frame rate. I had done PAL conversions for Rings of Power and Way of the Warriorand having every great programmer’s hatred for tedium had developed the notion when starting Crash that I would notate all “time and space based” units not in the traditional game programmer manner of “moves X pixels per frame” but in a kind of neutral space. Hence everything in Crash was measured in meters, seconds, and the like. I built into GOOL constructs like (meters 5) or (meters-per-second 2.5). The compiler or the runtime (depended) would convert these on the fly into the appropriate pixel per frame units.
This had a number of big advantages. First of all, even without the PAL issue, it allowed the physics (and the enemies) to move in a fairly frame rate independent way. Special functions were used to deal with velocity and acceleration which took into account the current frame’s estimated real time (based usually on how long it took the previous frame to compute and render). This meant that the code which propelled Crash in a parabolic arc as he jumped would move him further per frame if the frame rate slipped to 20 or 15 (which, unfortunately, it sometimes did). This wasn’t a perfect solution, 15 fps still played worse than 30, but it helped.
And it really paid off with the PAL conversion. The hard work — and it was incredibly tedious — really only took me about five days. After running all the automatic convertors and debugging those I had to go through the entire game and check every single level, every creature, every behavior of every creature or object and make sure it stilled played and looked okay in PAL. If it didn’t I had to play with the numbers, or in the worst case add some special “if PAL do it a little differently” clauses to the GOOL code.
But this was in a world where most American games just played 16% more sluggishly in Europe and most European games 16% fast in America.
Crash played great in both — and looked great in both. The Euro version actually even looked a little better (higher resolution and better color) although the feel at 25hz was slightly inferior. But we didn’t invent the TV standard.
The final tricky bit with localization was the language(s). Crash 1 didn’t really have any voice (which was to become a huge deal in later games). But it did have some text.
In typical programmer fashion, I invented another system for this. All of the text was generated by literal strings in the GOOL code, and since I controlled the compiler, I added a feature where a mapping file could be created for each language specifying the English text and the equivalent phrases in each of our five languages (English, French, Spanish, German, Italian). I changed the way strings were handled to index into a table and to have five files on disk for the string buffer. This is typical now, but was very unusual then. Even on Crash 1 you could change the language on the fly. But Europe made me put the toggle only at the main menu because they didn’t want to have to test for weird bugs that came up when you switched languages in the middle of a level.
I systemized all of this stuff by having the tools and the game itself both have separate notions of: video rate (NTSC, PAL), territory (which country’s disc it actually was), and language. This separated the concept of language from territory, opening up the possibility of foreign languages in the American versions (which didn’t happen until Jak 1 for logistical and legal reasons).
As requests came in from Europe to do peculiar and territory specific things like “make the game harder because European gamers like a challenge” (after Crash 1 we refused to acknowledge this “truism”) I modified the tools to allow territory specific overrides in the files that controlled the game data. For example, CONTINUE_POINT_64_32 in the jungle level, “hide in europe.” While I’m not sure the frustrated Euro gamer appreciated it, the system did make serving the producer’s requests easier.
In any case, the Euro version of Crash was lavished with the same attention to detail with which we did everything, and Sony Europe did the same. This was one (if not the) first product for which the whole international organization was behind and where they controlled the worldwide rights. Each Sony territory really pulled out all the stops in supporting and promoting the game as “made here.” It was highly localized, not just the game itself but each little country in Europe doing its own advertising and marketing campaign. Even the Irish filmed their own ads with Irish accented actors. Traditionally game players were highly “nationalistic” with, for example, French games selling better in France. The attention paid by both us and at all levels of the Sony infrastructure to selling a worldwide product aimed specifically at each and every consumer group really paid off.
The game sold like wildfire everywhere. Although we had certain champion territories like France and Australia (Crash’s virtual birthplace) who really poured on the love.
The story continues with Crash goes to Japan!
|If you liked this post, follow me at:
My novels: The Darkening Dream and Untimed