Jet Moto 3
Harness the blurring speed of 11 ultra-realistic, all-terrain jet hover bikes.
Feel the bone-smashing action of 19 treacherous, obstacle-ridden environments including subterranean graveyards, ancient cities, alien worlds and the wildest, most thrilling stunt tracks ever designed.
Experience an all-new blazing fast 3D engine with realistic MotoPhysics handling.
Jostle, sideswipe and rip it up in 1-player and 2-player competition.
The Rush Is Back!
Was it your intent to make Jet Moto an annual franchise like many of the sports titles?
“It wasn’t so much about trying to make Jet Moto an annual franchise. We would have been happy with an every other year rotation between Twisted Metal and Jet Moto. It did have a lot to do with the GT Interactive purchase of Single Trac and their determination to make a Jet Moto clone to go along with their Twisted Metal clone. Don Traeger had left BMG and set up Pacific Coast Power and Light and we contracted him to make Jet Moto because we were fans of his Road Rash series back at EA. THQ purchased Don’s studio during development so we knew we had to find a new home for the franchise. Like Twisted Metal, the Jet Moto designers didn’t want to work on 3 or 4. Hunter Luisi was available to produce, a development studio was nearby and cheap, and we pulled the trigger on it. I thought Jet Moto 3 had some excellent track ideas. I especially liked the Volcano and some of the other races. Jet Moto was never as big as Twisted Metal and I think we were generally happy with the numbers. I’m sure it turned out to be profitable and I think the reviews were okay. It was a little too hard and too fast, but the earlier Jet Moto games were also on the difficult side.” Kelly Flock, former President 989 Studios
Interview with Ming Lee, former programmer:
Jet Moto 3 was my first and last PlayStation 1 project. In fact, I had not even completed any game engines before Jet Moto 3. I worked on one at Atari Games, but they canceled my project which caused me to become disgruntled. That’s how Dennis Harper was able to recruit me to work at Pacific Coast Power and Light (then named DT Productions). Jet Moto 3 shipped in 1999, which was 5 years after the PlayStation launched. We were up against competitors who had already shipped two or three games in those 5 years. I had only 1 year to make a complete game and tool chain from scratch while other studios already had had 4 years of technology and experience working with the PlayStation. It’s like starting a marathon after your opponents have a 21 mile head start. Plus, it was just me! As lead of the JM3 project, Don asked me if I wanted a tools person. I told him that I did, but I didn’t trust anyone else to do the job right. I think I made the right choice since we were able to ship not only Jet Moto 3 on my tool chain, but also Nuclear Strike 64 and Road Rash 64 for N64 using my cross-platform tool chain.
Was the Jet Moto 3 engine built from the ground up? If so, how much time did it take to code it?
The Jet Moto 3 graphics engine and tool chain was built from scratch entirely by me. I started with exactly zero lines of code, which is sort of unusual in this business. It took about 18 months to complete the game, but I didn’t spend all of that time exclusively on the engine. There were other things such as a scripting language, physics, collision, visibility, and other game engine related tasks that I needed to do. We had 2 1/2 programmers. Dennis Harper was our studio producer, so he didn’t work on the programming full-time. I’d often have him work on something ahead of me, but then he’d complain that I’d just rewrite it later anyway. But I told him it was still useful for me to have that initial prototype to see what the problems were so that I could build a stronger architecture. Matt Gaston worked on the physics, AI, menus, and anything else that fell through the cracks. He was great at interfacing with the artists and designers because he was happy to tune and test the game as much as it needed. I like to finish something and then move on, so I was better suited to system work that had a “right answer” like collision or graphics rendering.
Following up with a Jet Moto sequel was no easy task. Do you recall any specific difficulties or challenges that you or the team encountered?
Actually, I felt good about the JM3 project because JM1 and 2 set such a low bar graphics-wise. The early Jet Motos ran at 20 fps and as low as 15 fps at some points and was entirely unlit. Graphically, I could easily outdo that. However, we weren’t just competing with our own Jet Moto legacy. There were plenty of other PlayStation games out by that point that had raised the bar on graphics.
Instead, the difficulties and challenges were presented by our 989 producer who wanted so much more for JM3 than 1 or 2. I had carefully played and analyzed each of the earlier Jet Moto levels. My plan was to have a drivable trench with the terrain farther away in the background. This would allow us to have a nice high polygon driveable surface while keeping the large warpy terrain textures in the background. So when our 989 producer insisted that in Jet Moto 3 we should be able to drive anywhere because you could do that in 1 and 2, I had to correct him by loading up the previous games. I showed him how on the very first level, there was a 15 degree grade burm that you would think you could drive on, but was blocked by an invisible wall. Immediately, he deemed that ridiculous and insisted that in Jet Moto 3, we capture the “true spirit” of Jet Moto, which was to be able to drive anywhere! I warned him that we would always have a problem with texture warping if we could drive anywhere, but he insisted on that feature. Despite all of the technical difficulties this requested feature cost me both graphics-wise, collision-wise, and gameplay-wise, I made it work because I saw it as a challenge.
The graphics in JM 3 easily eclipsed Jet Moto 1 and 2. I would have thought the more detailed graphics would have caused a slower racing experience but JM3 was blazing fast! Did your team use any special tricks to squeeze every ounce of power from the PlayStation?
I’m glad you noticed! Oh yeah, I personally asked our producer if I could do some questionable things that would allow us to squeak some more speed out of the graphics engine. He told me, “Ming, do anything and everything you know to make it as fast as possible, but I don’t want to know what you did.” I responded, “Okay, I hope your testers are ready because I’m going to do some crazy stuff.” He said, “We have good testers.” So I felt like he gave me a license to really cross the line. 989 at that time was basically a first party publisher, so I felt that any indiscretions I took would be supported.
Going into assembly for the GTE was mandatory— but I went way BEYOND that. Because I’m a computer hardware engineer by education, I decomposed the opcodes for the GTE (the PS1’s graphics coprocessor) and could make that thing do operations that were not in the documentation. In addition to this, I pulled intermediate values out of the registers that were meant to be temporary variables internal to the chip to use as a scale for particles. I disassembled some of Sony’s library calls and wrote my own hacked libraries to inline certain functions. Basically, if there were any PlayStation code cops, I would have been busted and put in jail for life for the stuff I pulled on Jet Moto 3.
However, all that speed was not without its sacrifices. Apparently, the hacked-up code did not work on the first 100,000 or so PlayStations and our producer caught heat because his testers did not catch that. When the PS2 came out and advertised that it would be backwards compatible with ALL PlayStation 1 games, I was concerned that I would get a call from the PlayStation code cops in the middle of the night. But when PS2 came out, I popped that JM3 disc in and it worked brilliantly! That still amazes me to this day… and I apologize if any anonymous Sony engineer had to figure out my code to make the PS2 backward compatible with it.
While JM3 was in development, Crash Bandicoot 3 was released and it had really great water effects. Was there ever a concern that JM3 couldn’t emulate Crash’s realistic water effects and wouldn’t ship on time?
The water effects were extremely simple and took me about a day to implement. We never had any performance issues with it whatsoever. I basically put it in one day and moved on to the next item— the same as every other part of the game. In fact, all of JM3 engineering was relatively quick and simple. The only delays we had were Sony giving us one week notice to provide a working demo disc for the PlayStation Underground.
There was never any pressure to do the water the same as in Crash Bandicoot or any other game. We had exactly one level with animated water and the first thing I tried was good enough, so we went with it. I never had a single meeting or even cube-side discussion about the water with anybody else at 989 or even internally. Midway ALSO made this excuse for why they could not port Hydro Thunder to PS1. They argued with their producer that the water in the arcade hydro thunder could not be handled by the PS1. Well, Don had to show his producer friend at Midway our water in JM3, and the producer was pissed that their engineers had lied to him.
Perhaps what I did was clever, but I didn’t really think so. What I did was to map the y-position of each vertex on the triangle to the sum of 2 sinusoidal waves. This would make a 2D rolling water that you see in JM3. If I had enough CPU left, I would subdivide the nearby triangles. I suppose a typical engineer might claim that it would be too expensive to do collision and physics on these moving and subdividing dynamic polygons. Well, that would be true. The best optimization, of course, is to not do that stupid thing which is too slow for your pathetic hardware. So I didn’t. Instead, I collided with the two sinusoidal functions which would provide the normal to the surface of that water with infinite resolution (as opposed to blocky polygonal water). The sine function used a look-up table, so it didn’t even do a real trig function.
As a programmer, you can see that this approach is not that much more expensive than static geometry on the PS1. In your mesh instead of AddVert(x, y, z), you had something like AddVert(x, y+quickSin(phase1) + quickSin(phase2), z). quickSin was a lookup into an array so it was super fast. And of course, the derivative of sine is some form of cosine. So from there you can get the tangent vectors. With the cross product of the tangent vectors, you can get the normal to the 2D rolling water surface. Not only was this NOT difficult and NOT expensive, but it was actually cheaper to do collision with the water surface than with a generic polygon surface.
What are some things that you are proud of about Jet Moto 3?
On the snow level, the snowflakes actually fall to the ground and stay there for a little while before fading away. Considering the number of particles I could do in JM3, adding that collision was a nice touch to an already insane particle engine.
The rain particles in the volcano level actually streak in 3D according to your camera speed. So if you turn the camera straight up to the sky on that level, it will look like the rain is falling down on you. As you start zooming forward, it appears that the rain is streaking towards you. If you look at almost all PlayStation games from that era, the rain is a fake 2D thing that is slapped on top of the screen. Then the camera is limited so that you can’t look up into the sky otherwise you’d notice that the rain wasn’t coming down, but was just a 2D animated overlay. Because Jet Moto 3 bikes were so crazy maneuverable along with its free camera, real 3D rain was the only solution.
The ice level actually ran at 60 frames per second in most places. However, our internal producer forced me to lock it at 30 fps at all times because it was jarring for some people to switch between 60 fps and 30 fps. But let me tell you it’s a thing of beauty to see so many particles flying in 3D while going so fast at 60 fps. 60 fps games look great, but are extremely rare simply because you can have twice as much stuff and run at 30 fps which everyone regards as the optimal frame rate. I suppose this will be true until the end of time, but I still think games at 60 fps look so much more solid and realistic than 30 fps.
On the alien planet level, we had green-colored fog. Nowadays, colored-fog is trivial, but the PlayStation was limited in such a way that you had to be kind of tricky to do it. Even doing a billboard tree that faded into colored fog as we had on the volcano level had required a few graphical tricks that would be nothing on modern hardware. I hadn’t seen it in any PlayStation game before ours, so I was hoping that I would have broken new ground there. Then Spyro shipped before we could and rained colored fog on my parade.
And finally, you really can go just about anywhere in Jet Moto 3. Every single surface is drivable and collidable. Unless you’re an engineer who has had to do this yourself, it’s hard to appreciate how hard it is to make a game that basically has no design constraints, must collide with all surfaces, must be graphically superior, and must run at a constant 30 fps with more bikes and animated riders than before. I think that while you’re on the project, it’s easy to take for granted how easy it is for me to break down impossible barriers. But if you look back at the end of the project and consider what the design requirements were for the project where you allocated only ONE engineer and only 18 months, you would think you’re headed for certain failure. Basically, all other racing games on the PlayStation were a subset of ours. We could do any of those games on my engine, but not the other way around. Any racing game with a road? Trivial. Try driving on the walls, Gran Turismo! Any motocross game? No problem. Snowboarding? Puh-lease!
In the ice level, pay attention to small details like the snow: It doesn’t snow inside of the tunnels. The snow can land on the water before dissolving.
Also, look at how round and organic the level looks compared to other games of that era. Pay attention to the lighting of the level. The tunnels have shadows. As your bike enters/leaves the shadowed areas, it gets brighter/darker.
On the volcano level, try tilting the camera up to look at the rain. 3D rain! The rain streaks are relative to the camera motion, not the bike motion. The rain streaks give the player a nice cue of how fast he’s moving. Also in the same level are some translucent grass/foliage on top of the ridges. It’s not that it’s hard to do the translucency, but it turns out to be rather difficult to do both translucency and colored fog on those same polygons in PlayStation 1. It’s trivial and taken for granted on modern hardware, however. Of course, such a trick is underrated because you sort of assume that doing such a thing would be easy. But if you look around at how many games actually do colored fog (rare) PLUS translucent polygons under colored fog (very rare), then it gives you an indication of how hard it is.
Also notice how the glow of the volcano lava affects your bike’s lighting.
When the bike’s thrusters point directly into the camera, the light flares larger than normal.
On each level, there is a subtle colored fog in the distance. On some levels, like Planet X, it’s more pronounced than normal. But for the Canyon level, it has a nice fade into a hazy blue into the distance. If you look around the world on a clear day, you’ll notice a similar fogging effect.
It’s just a shame that I started the race 4 years later than everyone else and the PlayStation left the end of its profitable lifetime.
What are some things that you think could have been improved with JM3?
JM3 was designed to be played at a much much slower speed. Matt had tuned it very nicely so that it was quite a game of skill and that the AI had presented a very interesting challenge. It was much closer to JM1 and 2 in speed for probably 80% of our development. Sony insisted on “helping” us tune the game in the final few months before we shipped, they cranked up the speed and power of the bikes.
I asked our PCPL producer if I could put in an “unlockable” code that players could later enter to get the “developer’s cut” game tuning. But he told me that would be disrespectful and wasn’t worth the potential storm it might raise. In the end, they paid the bills, so I let it go. The final version where you are literally bouncing off the walls due to maxed out tuning values is the one we shipped.
The other thing I was disappointed with was the decision to make the stunt mode an unlockable. It was so much fun, but you had to finish the entire game before you could do even the FIRST stunt level! I thought the stunt levels could have been a game in themselves. I wanted to put the first stunt level on the main menu so you could just get in and have fun right away. As usual, I did not get my way.
Was your team aware that Sony had another Jet Moto game in development internally at the same time?
We were not aware that 989 Studios had another Jet Moto game in development at the same time as ours! The other team was certainly aware of us, however. When we found out about it, it was kind of a slap in the face because we assumed that we were doing a good job on Jet Moto 3 and would be given the opportunity to do 4 as well. 989’s strategy was to have an evergreen product that they can put out every year like Madden. With both JM1 and JM2 each having over 1 million units sold, 989 bet on more sales every year for JM3 and JM4. However, when JM3 did not reach those sales figures, it didn’t bode well for JM4.
Personally, I’m glad that they tried to do JM4. To me, it is exactly what you should expect from a competent team starting from zero lines of code. The publisher should be glad that it is somewhat of an improvement of JM2, which had much more development time in its engine! Given the same amount of time that JM2 had, I’m sure that the JM4 guys would have made noticeable gains on it.
I’d be interested in doing another Jet Moto game for a modern console if any publisher has interest and wants to sign a contract. And this time, I wouldn’t be starting with zero lines of code. 🙂Jet Moto 3,