Warn­ing! Your devicePixelRatio is not 1 (or your brows­er doesn't CSS me­dia queries, in which case you can prob­a­bly ig­nore this warn­ing)! Since HTML is as brain­dead as it can get, cre­at­ing sites out­side of di­ver­si­ty hires cor­po­rate art sphere is damn near im­pos­si­ble, so this site is not re­al­ly op­ti­mized for HiDPI screens. Some im­ages might ap­pear blur­ry.

Need for Speed III: Hot Pursuit (Windows)

Cre­at­ed: 1730751278 (2024-11-04T20:14:38Z), Up­dat­ed: 1731116945 (2024-11-09T01:49:05Z), 7402 words, ~31 min­utes

Tags: , , , ,

This post is part of se­ries nfs: 1, 2, 3:HP (W, PS), 4:HS (W, PS), 5:PU, MCO, 6:HP2

Oh, boy. The very first NFS game I've played and still one of my fa­vorite. (Well, not com­plete­ly true, the first NFS I played was the de­mo ver­sion of NFS4, with its on­ly "Route Adonf" track, but the first full ver­sion NFS I played was NFS3.) Need for Speed III: Hot Pur­suit (still オーバードライビンⅢ:ホットパーシュート in Japan, and Need for Speed III: Pour­suite In­fer­nale in France as a new con­tender) from 1998, here I come! Al­so, the last NFS to have a prop­er num­ber and the first where the mar­ket­ing de­part­ment start­ed to at­tach stu­pid names to the ti­tle of the game.

As usu­al, start with the in­tro video, which is back at 320x240 res­o­lu­tion this time, for the whole du­ra­tion (but the sec­ond part of the in­tro is let­ter­boxed from var­i­ous ran­dom as­pect ra­tios, ex­cept when it looks like an orig­i­nal­ly 4:3 video was made wide screen by adding black bars, but fuck­ing it up so the so one row or col­umn of pix­els at the side of the video still there, vis­i­ble around 01:14-01:20 or af­ter 1:30):

The first thing you can no­tice is the EA lo­go is the same as in NFS2. Huh, did the an­nu­al EA lo­go re­design team slack off and couldn't com­plete a new lo­go on time? But then, hey, Dol­by Sur­round©®™ (I hope I didn't miss any char­ac­ter, I don't want to be sued by Dol­by Lab­o­ra­to­ries for mis­rep­re­sent­ing a 42 years old tech­nol­o­gy)! (Al­so, was that video dig­i­tized from VHS? Part of the bot­tom row is miss­ing...) You can con­nect the stereo out­put to a Dol­by Sur­round com­pat­i­ble re­ceiv­er, and have sur­round sound! Maybe. The first and on­ly NFS to have this fea­ture. More on this lat­er in the tech­ni­cal shit part.

Then, around 0:14, on­to the re­al in­tro be­gins. Ac­tu­al ingame footage! Woohoo! Keep your eyes peeled, you won't see any­thing like this, un­til... Un­der­ground, I think? This al­so makes it the on­ly in­tro video in the clas­sic NFS se­ries show­ing any re­sem­blance to the ac­tu­al game... Plus a ran­dom col­lec­tion of re­al-life videos. This is a blend be­tween the re­al-life-on­ly NFS1/2 and the CG on­ly NFS4+ in­tros. On the oth­er hand, this goes back to NFS1's ran­dom video col­lec­tion in­tro, rather than NFS2 or 4 where the video tries to have some kind of sto­ry. The video al­so show­cas­es two new fea­tures of NFS3, night dri­ving and weath­er (which means rain or snow). (Well, NFS2 had rain and snow on some tracks, but I think it was ex­clu­sive to the Glide ver­sion and al­so track de­pen­dent, here you can choose weath­er on any track you want.) And of course, po­lice, a newish fea­ture (NFS1 had some­thing, but it was pret­ty lame). Al­so, in­stead of gear­box-shift­ing fetish, we have light­ning and weld­ing fetish. What­ev­er.

(Fun fact: around 0:39-0:40, the Lam­borgh­i­ni go­ing through the S-curve. When I was a kid I al­ways thought it's ac­tu­al­ly the back of the car, and the video is just played back in re­verse. I had to ac­tu­al­ly pause the video on the last frame where the car is still vis­i­ble to con­firm no, that's a white light, not red, so it's the front of the car. I blame this on the hor­ri­ble video qual­i­ty. Sim­i­lar to nip porn cen­sored so hard you can't even tell the gen­ders of the peo­ple...)

The Labyrinth of Menus#

Here I go, the same or­der as with NFS2. When you start the game, you have to se­lect one from four op­tions. One Play­er, if you want a sin­gle play­er race, Two Play­ers for lo­cal split-screen, Con­nect Play­ers for net­work play, and... hold your breath... Load, to load re­plays and saved tour­na­ments/knock­outs! You no longer have to go in­to the depth of the set­tings to load a game! (Even though set­tings still have a load but­ton, prob­a­bly to help peo­ple who al­ready de­vel­oped Stock­holm syn­drome with NFS1/2.) Such mar­velous en­gi­neer, much im­prove, so amaze, wow. I had no idea how easy my child­hood was com­pared to pre­vi­ous gen­er­a­tions!...

The game modes are more-or-less the same as in NFS2, with one ad­di­tion.

Sin­gle Race: the same as in NFS2. Se­lect a track, your op­po­nents (or lack of them), and go!

Hot Pur­suit: the new mode, al­so the namer of this in­stall­ment. And this ac­tu­al­ly has two sub­modes de­pend­ing on the car you se­lect. If you se­lect a nor­mal car, you'll race against a sin­gle op­po­nent (with op­tion­al traf­fic), but with the po­lice try­ing to stop you. You can get caught num­ber of laps times be­fore you're ar­rest­ed and your race ends. Each time you suc­cess­ful­ly fin­ish a race, you be­come most want­ed on the track. Be­come most want­ed on all tracks to win a bonus car. Al­ter­na­tive­ly you can se­lect a cop car to be the cop. In this case you're the on­ly cop and you have to stop 6 rac­ers. You on­ly have to ar­rest each of them once, and the num­ber of op­po­nents doesn't de­pend on the lap num­ber, so you can just se­lect 8 laps to make your task eas­i­er... Sim­i­lar to the rac­er mode, if you ar­rest all play­ers be­fore they fin­ish their laps, you be­come top cop on the track, and col­lect top cop for all tracks to win an­oth­er bonus car.

Knock­out: the knock­out from NFS2, where each race the last to fin­ish is elim­i­nat­ed. Un­like NFS2, you can save the knock­out state be­tween races, so no more rage-quits if you fuck up the last race. There are two dif­fi­cul­ty lev­els, be­gin­ner and ex­pert, on be­gin­ner you race the tracks in or­der and nice con­di­tions, on ex­pert in ran­dom or­der and con­di­tions. Win­ning be­gin­ner gives you the bonus track and win­ning ex­pert gives you the bonus track and a bonus car. So there's no point in com­plet­ing the be­gin­ner one...

Tour­na­ment: com­plete each tracks and col­lect the most points to win. Un­like NFS1 and 2, the or­der of the tracks are fixed now, and you have to use the same car for all tracks (so it's like the knock­out). Win­ning the be­gin­ner/ex­pert tour­na­ment gives you 1/2 bonus cars re­spec­tive­ly.

Mainm0JXL PNGMainm1JXL PNG

On the car front, you can se­lect be­tween 12 cars (or a bit more if you have a pro­mo/lo­cal­ized re­lease), 3 of them be­ing bonus cars. Three cars have a playable po­lice ver­sion if you're play­ing Hot Pur­suit. You have the usu­al fact sheets about each car, com­plete with au­dio nar­ra­tion and slideshow, just like in each clas­sic NFS game. In­stead of car videos from NFS1/2, you have a 360° in­te­ri­or panora­mas. Car tun­ing is still there, and just as in NFS2, I nev­er touched it... You have a new car com­par­i­son mode to help you se­lect the best car based on pa­ra­me­ters a bit more eas­i­ly than NFS2's graph dis­play. But the re­al new fea­ture: 3D pre­view of the car in the menu! You can ro­tate the car and in­spect it. No longer have to start a race to check out your car. Al­so, you can fi­nal­ly se­lect cus­tom car col­ors.

Carm0JXL PNGCarm1JXL PNGCarm2JXL PNGCarm3JXL PNGCarm4JXL PNGCarm5JXL PNG

About tracks, you have 8 nor­mal tracks and a bonus one. Un­like NFS2, where the in­tro lit­er­al­ly ends in "race around the world" and even the main menu has a map of con­ti­nents as a back­ground (but even in NFS1/4 you have tracks around the world), in NFS3 you on­ly have tracks from the USA and Cana­da. A bit of a bum­mer. And 8 tracks are ac­tu­al­ly at 4 lo­ca­tions, you have an eas­i­er and hard­er vari­ant of each lo­ca­tion, with a shared seg­ment that's the same on both tracks. (But at least the first track, Home­town, while still be­ing pret­ty easy, ac­tu­al­ly has some re­play val­ue, un­like NFS2's Prov­ing Grounds, an oval track, which oth­er than mea­sur­ing the top speed of cars, is pret­ty much use­less. You don't re­al­ly play it out­side knock­out/tour­na­ment...) The hard­er vari­ants has more dif­fi­cult cor­ners, and set in win­ter or sun­set (the lat­ter is a bit an­noy­ing as you can't turn on your lights (or more ex­act­ly you can turn them on, but they have no ef­fect) and some parts of these tracks can get rather dark). The track pre­sen­ta­tions now in­clude pic­tures next to the au­dio com­men­tary (still pic­tures on­ly, though, on­ly in NFS4 you get videos).

Trackm0JXL PNGTrackm1JXL PNG

A new fea­ture is dri­ving as­sists: Brak­ing, Col­li­sion Re­cov­ery, Trac­tion will help you dri­ve if you can't. Best Line puts cones around the "op­ti­mal" line to race, al­so adding a counter of how many cones you hit—which of course prompt­ed lit­tle me (and al­so to­day's me) to try to hit as many cones as pos­si­ble. Nav­i­ga­tor adds a ral­ly-style nav­i­ga­tor to the race, an­nounc­ing the turns in ad­vance. Pur­suit is on­ly avail­able in Hot Pur­suit mode, it is the on­ly as­sist en­abled by de­fault, and on­ly does any­thing if you're a cop. When en­abled, when you re­set your car (ei­ther be­cause you flipped over, bust­ed a dri­ver or press the re­set but­ton), in­stead of be­ing put back to a near point on the track, you'll be in­stead put back near to a rac­er. It helps so much it ba­si­cal­ly makes pur­suit with and with­out as­sist a dif­fer­ent game.

(Mods used: track: At­lanti­ca HD Tex­ture Pack, car: Toy­ota Supra 3000GT)

Just as in NFS2, you can se­lect what kind of op­po­nents you want in Sin­gle Race and Hot Pur­suit mode, and you have ex­ten­sive set­tings.

Miscm0JXL PNGMiscm1JXL PNGMiscm2JXL PNGMiscm3JXL PNGMiscm4JXL PNG

Mods mods mods#

Since I spent a lot of time play­ing more-or-less vanil­la NFS3 in the past, I fig­ured there's not much to ex­plore in them, so I set out to ex­plore some mods. Al­so, NFS3 is the game where the NFS mod­ding scene start­ed to form, so this is the first game with any sub­stan­tial amount of mods. The mods can be gen­er­al­ly clas­si­fied in­to three cat­e­gories: cars, tracks, and every­thing else. One thing you have to keep in mind: this game is not too ro­bust when it comes to han­dling mod­i­fi­ca­tions to its files, and if it doesn't like what you did, it will tell you by crash­ing and spew­ing you the val­ues of x86 reg­is­ters, but noth­ing to help you lo­cate the prob­lem. So your best bet is in­stalling mods one by one, so if it fails, you know the cul­prit. And some­times mods are in­com­pat­i­ble with each oth­er, so mod A and B both work in iso­la­tion, but when you en­able both, the game crash­es. Hope you like tri­al and er­ror.

With cars, the game for­tu­nate­ly sup­ports adding brand-new cars, the files usu­al­ly go in­to a new di­rec­to­ry in gamedata/carmodel. All the built-in cars have 4 let­ter di­rec­to­ry names, and while you can use longer di­rec­to­ry names, af­ter a while the game will crash. I didn't spend time to fig­ure out what is the max length I can get with­out crash­ing, if you don't want to com­pli­cate your life, stick to 4 char­ac­ter di­rec­to­ry names. Oth­er prob­lem is every car has a 4 let­ter in­ter­nal ID, and if they clash (even if placed in­to dif­fer­ent di­rec­to­ries), the game will crash (with­out telling which two cars con­flict!). Your so­lu­tions in this case is to not have the two cars in­stalled at the same time, or mess around with mod­ding tools to change the ID of one of the cars.

With tracks, the sit­u­a­tion is a bit worse, as you can't add new tracks to the game. Each mod­ded track re­places an al­ready ex­ist­ing track, se­vere­ly lim­it­ing the set of tracks you can have in­stalled at the same time. Al­so, as far as I can tell, there's no user-friend­ly way to change the names of the tracks in game, so the game will still re­fer to the tracks by their old name... Which gets me to the next point, an ex­cerpt from a readme:

1) Rename GAMEDATA\TRACKS\TRK006 subdirectory or move it to another location
(or delete it if you can restore original track from NFS III CD)

I did it once, but then a voice in my head spoke. What is this pleb ap­proach!? I'm on Lin­ux. I have overlayfs! And at that point the dam­age was done...

The ba­sic idea is to have a base "lay­er" with the game, a num­ber of mod lay­ers on top of it (for tracks and any­thing else), then a top lev­el lay­er to store saves (be­cause this game writes the saves to its own dir, Win­dows 9x didn't have non-ad­min users, or pret­ty much users). Then I can just re­mount it with dif­fer­ent mods, and leave the ple­beian "move files around man­u­al­ly every time" to win­sux users. I whipped to­geth­er a sim­ple script to au­to­mate it, and ta­da! The on­ly an­noy­ing part is overlayfs needs root to mount dirs, so it will need the root pass­word every time. It was an­noy­ing, so I switched to fuse-overlayfs, which is more-or-less the same but FUSE, so works with­out ad­min. Yes, I could have worked around it with sudoers or user name­space mag­ic, but name­spaces are a has­sle to use (the mount wouldn't be vis­i­ble out­side of it...) and I was too lazy to mess with my sudoers file... Then I mount a ciopfs over the union mount, be­cause file­names in mods come with to­tal­ly ran­dom file cas­ing, and I didn't want to mess around with re­nam­ing files every time in­stalling a new mod.

Af­ter this, I went to hunt for ad­dons. I knew about nf­s­cars from back in the days, but when search­ing for it, it was gone. For­tu­nate­ly some­one backed up the whole site be­fore it went down, so the con­tent is avail­able out there, how­ev­er the pre­sen­ta­tion is pret­ty bare-bones.

With a bit of search­ing for bet­ter al­ter­na­tives, I land­ed on nf­sad­dons.com and came up with the bril­liant idea of check­ing out all the tracks, start­ing from the old­est. Not a good idea. Ear­li­er tracks are just slight mod­i­fi­ca­tions to ex­ist­ing tracks, some­times adding huge bumps in­to the roads and gen­er­al­ly fuck­ing up the road, things I'd sure­ly en­joyed them when I was 10, but now a few decades lat­er, it's just an­noy­ing. Oth­er­wise they just changed the tex­tures of the tracks, usu­al­ly to the worse. A se­ri­ous­ly bad con­tender is a track with a mouth­ful name of "Aquar­ius Ris­ing II: The Su­per­no­va Grand Prix", where I se­ri­ous­ly have to ques­tion whether the au­thor for­got to take his meds be­fore mak­ing this track. If you want some­thing good, look at Opus IV, even though most of his tracks are al­so just tex­ture swaps, with a few track con­ver­sions. The NFS1/2 track con­ver­sions are al­so good, and the HD tex­ture packs are not as bad as the ti­tle make them sound. What I re­al­ly missed is tracks nei­ther a con­ver­sion from a pre­vi­ous NFS nor a slight ed­it of an ex­ist­ing track. There is Test Run­way, but it's not ex­act­ly a track you can race. Sochi-2014 RACEWAY, and Olympic Race­way, which looks like a vari­a­tion/new­er ver­sion of the for­mer, are all what re­al­ly fits the bill. Maybe Ra­pa Nui Moun­tain too, even though it's still just a Sum­mit vari­a­tion. Not much.

On the car front, I tried a few, plus I found some cars in my saves from old­er com­put­ers. There are two com­mon prob­lems with down­loaded cars. First, their per­for­mances are all over the place (and the per­for­mance graphs in the car com­par­i­son usu­al­ly have noth­ing to do with the ac­tu­al in-game per­for­mance), usu­al­ly they're way too pow­er­ful, they feel like you're cheat­ing. Sec­ond, most cars lack a cock­pit view (ei­ther com­plete­ly or just reusing a cock­pit from an ex­ist­ing NFS3 car, in many cas­es from a com­plete­ly dif­fer­ent brand). Se­ri­ous­ly, what the fuck the mod­ders were think­ing? Cre­ate a mod you can't see? I don't un­der­stand peo­ple...

As a lit­tle bonus, I found this of­fi­cial EA cars bun­dle, which in­cludes all cars in­clud­ed in var­i­ous pro­mo/re­gion­al NFS3 re­leas­es plus some down­load­able cars from EA. Un­for­tu­nate­ly the lat­ter are in­clud­ed as .exe files, and I found no way to ex­tract them with na­tive un­pack­ers on Lin­ux, and run­ning the ex­e­cutable will fail if you in­stalled mod­ern patch as it will miss the re­quired reg­istry en­tries. To make your life eas­i­er, I made a tar­ball of the ex­tract­ed cars, so you can just drop them in­to the game di­rec­to­ry avail­able here.

Gameplay#

Okay, let's race al­ready. The first thing you'll prob­a­bly no­tice is the brand-new HUD. The huge-ass omega lo­go next to the timer is gone (what the fuck was it do­ing in NFS2 any­way?). The first game where you have an op­po­nent list—by the way, what is the con­ver­sion be­tween me­ters and sec­onds? Be­cause it's not like it has check­points on the tracks and cal­cu­lates the time dif­fer­ence be­tween you and the op­po­nents pass­ing it, but it's up­dat­ing con­stant­ly. But the bet­ter new fea­ture, theHUD is cus­tomiz­able! You can move the me­ters and map and oth­er things around! It feels like I'm us­ing blender and not a dumb­ed-down soft­ware de­signed for re­tards. Grant­ed, prob­a­bly 99.9% of peo­ple nev­er touched it, and even peo­ple who touched it bare­ly cus­tomized any­thing...

Hud setupJXL PNG

(Mods used: track: Lost Canyons HD Tex­ture Pack, car: Im­preza WRX STi)

Han­dling wise, for­tu­nate­ly it seems like they con­tin­ued from the sim­u­la­tion "style" of NFS2. It needs some get­ting used to, but it's not too bad from a '98 game (and of course this has ab­solute­ly noth­ing to do with the fact that NFS3 is the first NFS I played, so I had a lot of time get­ting used to it). The per-track mu­sic theme in rock and tech­no (but the track pairs share them), and the dy­nam­ic mu­sic from NFS2, even if less no­tice­able, still here. The dy­nam­ic mu­sic al­so re­acts to pur­suit state! Say good­bye to this un­til MW.

Which re­minds me, let's take a look at the hot pur­suit mode—win the race against the sin­gle AI op­po­nent with­out get­ting tick­et­ed too many times. There are ba­si­cal­ly three ways to get tick­et­ed/ar­rest­ed:

  1. Re­set your car while be­ing near a po­lice car. Au­to­mat­ic re­sets by the game (be­cause you rolled over) count too. Try to not re­set your car while the po­lice is near­by. (On the oth­er hand, if the sit­u­a­tion is hope­less, it's prob­a­bly bet­ter re­set im­me­di­ate­ly to save some time...)
  2. Spike strips. Get­ting hit by a spike strip is an in­stant catch.
  3. Go­ing too slow near a po­lice car. This one is nasty. The po­lice doesn't have to im­mo­bi­lize you, you don't even have to stop, just be too slow for a few sec­onds and you're caught. And the po­lice love to spin their cars in front of you, block­ing your way, or PIT-ing you, or just get­ting in front of you and brake, if you can't get out of it quick­ly, you're toast. It's way eas­i­er get­ting caught here than in MW, or heck even HP2. On the flip side, you have mul­ti­ple strikes.

(Mods used: track: Coun­try Sum­mer, car: Nis­san 350Z)

I can't stop not men­tion­ing the in­con­sis­ten­cy on the HUD. On the first lap on a 2 lap track, you see 1/2 laps. The last lap is 2/2, and you still have to com­plete it. But with tick­ets, you start at 0/3 tick­ets. When you're at 2/3 tick­ets, you can't get one more tick­et and con­tin­ue! The next time you're caught you're ar­rest­ed and the race is over. You can't get to 3/3 tick­ets be­cause the game im­me­di­ate­ly ends if you do it. I don't know how many times I got ar­rest­ed when I thought I can still get tick­et­ed once more... Did a sin­gle pro­gram­mer see this UI?! Yes, I know how UI de­vel­op­ment works with all room-tem­per­a­ture IQ UX de­sign­ers...

You al­so have a po­lice "range find­er" un­der your rearview mir­ror, which gets more and more red as you get near a po­lice unit, and you can lis­ten to their ra­dio. How re­al­is­tic is, I have no idea, but prob­a­bly not re­al­ly. Al­so for some weird rea­son, cops can be heard from the right speak­er, when the dis­patch­er/op­er­a­tor/what­ev­er from the left. I thought po­lice ra­dio is some low qual­i­ty mono trans­mis­sion...

When you're the cop, you have to use one of the meth­ods above to catch the rac­ers—but of course, they won't ac­ci­den­tal­ly re­set their cars... Spike strips are al­so a bit nerfed, when you drop a spike strip, it needs a cou­ple of sec­onds to ac­ti­vate. I mean, I get it, they didn't want to make it OP where you just over­take a rac­er and drop the spike strip for in­stant win, but when you're alone, set­ting up a road block with a spike strip and wait­ing un­til a rac­er goes there is not ex­act­ly a vi­able tac­tic. Oh, al­so, if you're not around the rac­er when they hit the spike strip, they'll just re­set them­selves and con­tin­ue, so just drop­ping the spike strip in a good po­si­tion and hop­ing some­one will hit it is al­so not a good tac­tic. On the oth­er hand, if you hit a spike strip as a rac­er, it's a 100% catch... So most of the time the way you catch rac­ers is to some­how force them to stop, ei­ther by spin­ning them out, or block­ing the path in front of them.

(Mods used: track: Ra­pa Nui Moun­tain, car: Sub­aru Im­preza WRX Sti Ver. IV (but VI ingame...))

(Look at those light­ing ef­fect with the pur­suit cars! For ex­am­ple, around 1:10 or 7:15. How it lights up the dash­board or the sur­round­ing en­vi­ron­ment, even vis­i­ble in the rearview mir­ror. In 1998! Don't ask why the dash­board doesn't have lights... Or see the very ef­fec­tive road­block in ac­tion at 3:20. Al­so see 9:27 for a near-catch, show­ing your about on­ly op­tion here, press the gas ped­al and hope you can some­how get out of the sit­u­a­tion. If you brake, you lose.)

Technical shit#

Note: most of the patch­es men­tioned in this sec­tion are mir­rored on my serv­er.

Oh my, where do I even start? First, if you're play­ing this on Lin­ux, just as with NFS2 or 4, get Wine 6.19 or old­er. Con­troller sup­port is com­plete­ly bro­ken in new­er ver­sions, and when I tried it with Wine 9.20, it sim­ply hanged up­on ex­it. Fix one bug, in­tro­duce 3 new, just the usu­al Wine de­vel­op­ment. Next, no mat­ter what OS you use, grab the mod­ern patch. If you use Wine, get the be­ta ver­sion from the bot­tom of the page, be­cause the last sta­ble re­lease doesn't han­dle res­o­lu­tion changes prop­er­ly.

In­stal­la­tion is pret­ty sim­ple, as the web­site says, copy FEDATA and GAMEDATA di­rec­to­ries from the CD and ex­tract the 7z file, over­writ­ing the files... ha­ha no. The files on the CD will (like­ly) have up­per­case file­names, while the 7z files has low­er­case file­names. To fix it, you can ei­ther down­case every file­name like I did in NFS2:

ruby -e "Dir['**/*'].reverse.each {|p| File.rename p, File.join(File.dirname(p), File.basename(p).downcase) }"

or use the above-men­tioned ciopfs to em­u­late a case-in­sen­si­tive filesys­tem. The lat­ter is rec­om­mend­ed if you want to use mods, just make sure to mount ciopfs first, and copy the files from CD to the mount point, as ciopfs ex­pects all file names to be down­case on the un­der­ly­ing FS.

The first thing you want to do af­ter ex­tract­ing is check­ing the nfs3.ini file, which is the con­fig file for the mod­ern patch, The en­tries you should prob­a­bly look in­to are the fol­low­ing:

Plus there's one more op­tion, called ThrashDriver, which spec­i­fies the graph­ics API to ren­der the game with, and you have quite a few op­tions:

About screen res­o­lu­tions: the game menus are hard­cod­ed to 640x480 res­o­lu­tion, so no mat­ter what you set in the set­tings, the menu will be 640x480. And on­ly the glide wrap­pers (nglide, dgvoodoo) seem to have a work­ing "over­ride res­o­lu­tion" mode, in every oth­er case you'll be stuck with 640x480 menus. But with mod­ern patch you can se­lect high­er and non-4:3 res­o­lu­tions ingame (and you should do, even if you over­ride res­o­lu­tion from the Glide wrap­per, so the HUD won't be stretched). If you want to run the game win­dowed or have more than one mon­i­tors, I rec­om­mend en­abling em­u­late vir­tu­al desk­top in winecfg in­stead of get­ting mod­ern patch's win­dowed mode work­ing.

De­pend­ing on your ren­der­er, some­times if NFS3 crash­es, it won't re­store the gam­ma set­tings, leav­ing your screen too bright. You can use xgamma -gamma 1 to fix this.

This was the easy part. Now comes the woes.

Joystick setup#

First make sure you have Wine 6.19 or old­er if you want to use joy­sticks, then run wine control joy.cpl, and make sure you dis­able any du­pli­cates/non-con­trollers. If you have any­thing un­der xin­put de­vices, click on over­ride to move them back to nor­mal de­vices. If dis­abling/over­rid­ing doesn't seem to do any­thing, click on OK and restart Wine, it's a bit bug­gy.

Then, if you have a DualShock 4 con­troller, it has a fan­tas­tic "fea­ture": the L2/R2 but­tons are both but­tons and ax­es. When you press them, they both reg­is­ter as an ax­is move­ment and key press, which fucks up the key­bind­ing screen of NFS3 as it will reg­is­ter the but­ton and not the ax­is move­ment. What I did here (and com­plete­ly for­got about, thanks to Gen­too's /etc/portage/patches, so it might be need­ed for NFS2/4 too) is to get rid of this bull­shit fea­ture by patch­ing the ker­nel dri­ver. Some­thing like this:

--- a/drivers/hid/hid-playstation.c.orig	2023-06-23 13:53:41.566333749 +0200
+++ b/drivers/hid/hid-playstation.c	2023-06-23 13:54:02.203362523 +0200
@@ -1361,8 +1361,8 @@
 	input_report_key(ds->gamepad, BTN_NORTH,  ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE);
 	input_report_key(ds->gamepad, BTN_TL,     ds_report->buttons[1] & DS_BUTTONS1_L1);
 	input_report_key(ds->gamepad, BTN_TR,     ds_report->buttons[1] & DS_BUTTONS1_R1);
-	input_report_key(ds->gamepad, BTN_TL2,    ds_report->buttons[1] & DS_BUTTONS1_L2);
-	input_report_key(ds->gamepad, BTN_TR2,    ds_report->buttons[1] & DS_BUTTONS1_R2);
+	//input_report_key(ds->gamepad, BTN_TL2,    ds_report->buttons[1] & DS_BUTTONS1_L2);
+	//input_report_key(ds->gamepad, BTN_TR2,    ds_report->buttons[1] & DS_BUTTONS1_R2);
 	input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE);
 	input_report_key(ds->gamepad, BTN_START,  ds_report->buttons[1] & DS_BUTTONS1_OPTIONS);
 	input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3);
@@ -2233,8 +2233,8 @@
 	input_report_key(ds4->gamepad, BTN_NORTH,  ds4_report->buttons[0] & DS_BUTTONS0_TRIANGLE);
 	input_report_key(ds4->gamepad, BTN_TL,     ds4_report->buttons[1] & DS_BUTTONS1_L1);
 	input_report_key(ds4->gamepad, BTN_TR,     ds4_report->buttons[1] & DS_BUTTONS1_R1);
-	input_report_key(ds4->gamepad, BTN_TL2,    ds4_report->buttons[1] & DS_BUTTONS1_L2);
-	input_report_key(ds4->gamepad, BTN_TR2,    ds4_report->buttons[1] & DS_BUTTONS1_R2);
+	//input_report_key(ds4->gamepad, BTN_TL2,    ds4_report->buttons[1] & DS_BUTTONS1_L2);
+	//input_report_key(ds4->gamepad, BTN_TR2,    ds4_report->buttons[1] & DS_BUTTONS1_R2);
 	input_report_key(ds4->gamepad, BTN_SELECT, ds4_report->buttons[1] & DS_BUTTONS1_CREATE);
 	input_report_key(ds4->gamepad, BTN_START,  ds4_report->buttons[1] & DS_BUTTONS1_OPTIONS);
 	input_report_key(ds4->gamepad, BTN_THUMBL, ds4_report->buttons[1] & DS_BUTTONS1_L3);

(Just search for BTN_TL2 and BTN_TR2 and com­ment the lines, there are a few be­cause there's a sep­a­rate sec­tion for each DS4 vari­a­tions.)

If you don't want to patch your ker­nel, there is a workaround, but pret­ty an­noy­ing. If you press the thumb just a lit­tle bit, it'll al­ready re­port it as a but­ton press, but the ax­is will be on­ly around 10% or so. So press the but­ton a lit­tle bit, keep it steady, click on the con­trol you want to as­sign in the menu, then press it ful­ly. Since the but­ton is al­ready pressed when you click on as­sign, the game won't de­tect the but­ton as be­ing pressed, but it will de­tect the ax­is move­ment. You might have to retry this a few times un­til you suc­ceed.

Watch out for the icons you see when bind­ing ax­es, as NFS3 sup­ports both full ax­es (when the full range of ax­is is used for a sin­gle in­put) and cen­tered ax­es (where it's nor­mal­ly in the mid­dle and it can go both up and down). Steer­ing is usu­al­ly cen­tered, ac­cel­er­a­tion/brake can be both (you have one cen­tered ax­is, ac­cel­er­a­tion moves in one di­rec­tion, brake in oth­er, or two sep­a­rate full ax­es). With DS4 above, you want L2/R2 to be full, oth­er­wise you won't start ac­cel­er­at­ing/brak­ing un­til you press the but­ton at least halfway.

Joystick axisJXL PNG

Next, even with the patch above, you'll maybe run in­to the is­sue of NFS3's con­troller bind­ing page be­ing bug­gy. Some­times, I think gen­er­al­ly af­ter us­ing POV but­tons, but I'm not 100% sure, it just stops reg­is­ter­ing any con­troller event. If this hap­pens, press Esc, click Done, and restart the game. Af­ter it, you can con­tin­ue bind­ing keys un­til it breaks again. You can usu­al­ly fin­ish set­ting the bind­ings in 2–3 restarts. Good thing you on­ly have to do it once.

Ha­ha no. The game has a fetish of re­set­ting your con­troller con­fig­u­ra­tion. If you start the game once with­out the con­troller be­ing con­nect­ed, say good­bye to your bind­ings. (I mean, kin­da makes sense, when this game were made, con­troller meant a game port on your sound­card with ze­ro plug-and-play, so the on­ly way to have a con­troller dis­con­nect­ed was to re­place your sound card with­out a game port, and at that point it was pret­ty safe to as­sume you won't use the con­troller again. But in to­day's age of USB and Blue­tooth and what­ev­er con­trollers it's pret­ty an­noy­ing.) If the game crash­es (and it hap­pens a lot with mods), say good­bye to your bind­ings. So, here's a pro tip: af­ter you set up every­thing in the set­tings, quit the game, and make a back­up of fedata/config/config.dat. Next time the game has a brain fart, just re­store the back­up and save your­self the mis­ery of hav­ing to set up key­bind­ings again...

Dolby Surround©®™ (aka. Dolby Laboratories will now sue you, stock up on lube)#

When you go to au­dio set­tings, you can choose be­tween Mono, Stereo and Dol­by Sur­round. Back when I was a kid, I on­ly had stereo speak­ers, so I se­lect­ed Stereo and every­thing was al­right. Lat­er I got 5.1 speak­ers, and NFS3 still had the same op­tions. All Dol­by Sur­round is do­ing is mix­ing four chan­nels (front left-cen­ter-right, and a rear) in­to two. It was used on some DVDs and such, and some Hi-Fi sys­tems had a Dol­by Sur­round but­ton to en­able a de­coder... but of course on PC you had none of this. You had 6 out­put chan­nels, there was no need for this fuck­ery. So for a long time, I played NFS3 in stereo, even when I had 5.1 sur­round.

Fast for­ward a decade or so in­to 2024, and I start­ed to get enough of this. Once I've opened PCGW's NFS3 page, and no­ticed it sup­ports DirectSound 3D, and there's a project called DSOAL, which wraps DirectSound with sur­round (some­thing not even sup­port­ed on Vista) to OpenAL. Ex­act­ly what I need! Ha­ha no. I'll cut the sto­ry short, af­ter set­ting it up and try­ing it... front speak­ers were too loud com­pared to sur­round speak­ers, and it didn't re­al­ly sound 3D. Star­ing at DSOAL's de­bug out­put re­vealed the prob­lem: race mu­sic, en­gine sounds, speech, col­li­sion sounds, en­vi­ron­men­tal sounds, they're all mixed in­to a sin­gle stereo stream placed at (0, 0, 1). Right in front of you. The rea­son why front speak­ers were loud and rear qui­et. The sounds of op­po­nent and traf­fic cars were seemed to be giv­en some 3D co­or­di­nates, but at this point it was clear I'm not go­ing to get any­thing re­sem­bling 5.1 out of this.

So back to the orig­i­nal prob­lem, de­cod­ing Dol­by Sur­round on PC. It must be an easy prob­lem, right? Un­for­tu­nate­ly, my re­search yield­ed the same re­sult as a cou­ple of years ago: no. First, there's FreeSurround Al­sa Plu­g­in, last up­dat­ed in 2009, which doesn't even com­pile (Make­file has some paths hard­cod­ed and no longer true on a mod­ernish 64-bit Lin­ux). If you want to use it, grab my fork (mir­ror), com­pile it with some­thing like

make CFLAGS=-m32 && sudo cp .libs/libasound_module_pcm_freesurround.so /usr/lib/alsa-lib/

to get 32-bit libs (or to /usr/lib32 if you have 32-bit libs there). The ex­am­ple con­fig giv­en prob­a­bly works, just for­get about the SPDIF thing and use a dmix for the FreeSurround's slave PCM (or pipewire if you use PipeWire). I did it, and it worked! Kin­da. There was a ~1 sec­ond de­lay be­tween the video and au­dio. I've mea­sured it with OBS, fo­cused a but­ton in the menu, the sound ef­fect came 900 ms late. Oof. But at least it al­lowed me to con­firm Dol­by Sur­round out­put ac­tu­al­ly works. I turned off mu­sic, en­gine sounds, stopped in front of a wa­ter­fall on the At­lanti­ca track—wa­ter sound comes from front speak­ers. Turn around, wa­ter sound comes from back speak­ers. Yay! Now just do some­thing with the ridicu­lous de­lay...

Pok­ing at the source code it cre­ates a buffer to hold 8192 sam­ples, and process them at once (it does an FFT on it). 8192 sam­ples at 48 kHz is about 171 ms. Not a small num­ber, but far from 900 ms. My first idea was to de­crease the buffer size, but of course the au­thor of the code ap­par­ent­ly didn't know the C com­pil­er can do ba­sic arith­metic, and the code had a bunch of things like typedef float farraybse[12288]; // BLOCK_SIZE + BLOCK_SIZE/2 (but most of the time it wasn't even com­ment­ed). Af­ter fix­ing them, I could re­duce the buffer size, at 512 sam­ples the la­ten­cy start­ed be­come ac­cept­able, but it al­so start­ed to sound like some bad­ly com­pressed MP3 file.

There must be a project to solve this!—I thought, and start­ed search­ing. I found a project called FreeSurround2020, where the readme states "An ALSA plu­g­in us­ing the most re­cent im­ple­men­ta­tion of the FreeSurround up­mix­er". Per­fect! Ex­cept... there's ze­ro trace of an ALSA plu­g­in in the re­po. All it has is a com­mand line tool to con­vert sound files. Use­less for my use case. But it was sup­pos­ed­ly us­ing a new­er FreeSurround im­ple­men­ta­tion.

At this point I start­ed to give up the ridicu­lous idea (again) where the world would end up in a con­fig­u­ra­tion by it­self that's not com­plete­ly use­less. I al­so start­ed us­ing PipeWire re­cent­ly (long sto­ry...), so I de­cid­ed to grab the orig­i­nal FreeSurround im­ple­men­ta­tion called foo_dsp_fsur­round, and start­ed to play around with it. And ladies and gen­tle­men, this is how I lost one week of my life to mess around with Dol­by Sur­round de­coders. I don't want to go in­to de­tails (I'd need to write at least one blog­post's worth of text for it), so just the im­por­tant ones. FreeSurround head­er file notes about FFT block size:

Must be a pow­er of two and should cor­re­spond to ca. 10ms worth of sin­gle-chan­nel sam­ples (de­fault is 4096 for 44.1Khz da­ta). Do not make it short­er or longer than 5ms to 20ms since the gran­u­lar­i­ty at which lo­ca­tions are de­cod­ed changes with this.

What's the prob­lem with this? 4096 sam­ples at 44.1 kHz is not about 10 ms, it's about 93 ms. No won­der the quick cal­cu­la­tions I made as­sum­ing it process­es au­dio in 10 ms chunks were way off. I'd say it's a ty­po and he meant 100 ms, but then the next sen­tence should al­so read be­tween 50 ms and 200 ms. Nev­er­the­less, the FreeSurround plu­g­in de­faults to us­ing 4096 sam­ples, and if I set it to 512 sam­ples (about 11-12 ms with 44.1/48 kHz), it sounds pret­ty bad. Al­so, af­ter look­ing through the code I re­al­ized the fil­ter it­self has a half chunk size de­lay, so 4096 sam­ples at 48 kHz should re­sult in 128 ms de­lay, which my mea­sure­ments con­firmed. Way bet­ter than the 900 ms I got with the ALSA plu­g­in, but still a tad too much. Per­son­al­ly I found 1024 sam­ples to be the best com­pro­mise be­tween sound qual­i­ty and la­ten­cy (32 ms from FreeSurround al­go­rithm, a bit more if you add PipeWire pro­cess­ing on top of it).

But I wasn't con­vinced. Even at 1024 sam­ples, I could hear some weird ar­ti­facts, and the pro­pri­etary de­coders built in­to home en­ter­tain­ment sys­tems sure­ly worked in re­al time with­out adding 100+ ms de­lay. Af­ter a bit lot of dig­ging, I found Dol­phin em­u­la­tor, and while it us­es FreeSurround to de­code Dol­by Sur­round now (but with 512 block size, didn't they re­al­ize it sounds aw­ful?), used a Dol­by de­coder from ffd­show try­outs be­fore, an­oth­er long aban­doned pack­age. I in­te­grat­ed it too in­to my tool, as un­like FreeSurround it has prac­ti­cal­ly ze­ro de­lay (in­her­ent to the al­go­rithm, the ex­tra PipeWire node will of course add a bit). No more la­ten­cy! Yay! Ex­cept... now if I crash in­to some­thing, I hear the crash­ing sound sound from the front speak­ers, and al­so from rear speak­ers, just a bit qui­eter. If I re­verse in­to some­thing, rear speak­ers are a bit loud­er, but I still hear it from the front. Well, kike­pe­dia notes there might as lit­tle as 3 dB sep­a­ra­tion be­tween front and sur­round chan­nels, I guess it means what­ev­er is sup­posed to be heard from front can leak in­to sur­round chan­nels, just 3 dB qui­eter (which is not a lot). Notwith­stand­ing, this de­coder still seemed like a bet­ter com­pro­mise than us­ing FreeSurround with small block sizes, so I most­ly went with this. But the videos post­ed in this blog­post are de­cod­ed us­ing 4096 sam­ple FreeSurround if you chose HQ (MQ has the raw Dol­by Sur­round stereo). I know it's not re­al­is­tic, but what­ev­er.

Grab this hacky fine soft­ware from here (mir­ror) if in­ter­est­ed.

Headlights#

So you think you set up every­thing, played a few races, every­thing seems al­right, then you start a night race, and this is what you get:

Ac­cord­ing to the mod­ern patch readme, "this prob­lem is oc­curs on some GPUs", so what­ev­er fol­lows might not be true for you if you don't have an AMD RX 580 GPU. (Test­ing this on my lap­top halfway in the trash re­al­ly quick, the same prob­lem hap­pens on 4th gen In­tel too but not on Nvidia GTX 960M or llvmpipe, so yeah, it de­pends on the GPU.) So, what to do about it?

First op­tion is, al­so the workaround rec­om­mend­ed by the mod­ern patch, to go to graph­ics set­tings, and set head­lights to ver­tex from pro­ject­ed. The re­sult will be some­thing like this:

No more Z fight­ing, but the edges of the lights are a bit jar­ring. This is be­cause there is no per pix­el light­ing, on­ly per ver­tex and goaourd Gouraud shad­ing, and tri­an­gles are quite big in a 1998 game. If you can put up with this, you can stop here. I, how­ev­er, want­ed to fig­ure out how to get pro­ject­ed lights to work.

One (most­ly) work­ing workaround is to use DXVK to con­vert DirectX to Vulkan, in­stead of Wine's OpenGL trans­la­tor. I sus­pect there's some round­ing is­sue is at play and Vulkan (or Nvidia) rounds it a bit dif­fer­ent­ly than the AMD/In­tel OpenGL... (In­ter­est­ing­ly this workaround doesn't work for NFS4.)

Up­date 2024-11-09: I knew I read some­thing about this bug be­fore, and I found it, at the bot­tom of dgVoodoo2's Glide readme:

I ran in­to a prob­lem with NFS 3 Hot Pur­suit: ug­ly z-fight­ing which is most not­i­ca­ble with pro­ject­ed head­lights. This game does not use depth bias but uti­lize the in­ac­cu­ra­cy of the 16 bit voodoo depth buffer when ren­der­ing poly­gons on­to each oth­er (I'm not sure if it was in­ten­tion­al or just a bug). If an app us­es z-buffer­ing then us­ing a 16 bit depth buffer in the em­u­la­tion pro­vides the cor­rect and ex­act map­ping of the z val­ues, like on a re­al Voodoo.

I up­dat­ed dgVoodoo2 to the lat­est ver­sion (2.83.2 at the time) to check it out, but I end­ed up with the same re­sult: us­ing DXVK it works, us­ing Wine's WineD3D, it flick­ers, ir­re­spec­tive of the 16-bit depth buffer set­ting in dgVoodoo2. I don't know if this is be­cause of em­u­la­tion in­ac­cu­ra­cies in DXVK/Wine, or the open source AMD dri­ver, or dgVoodoo2 broke this op­tion, or mod­ern patch broke it. Any­way, if nGlide + DXVK doesn't solve the prob­lem for you, you might try this method. End up­date.

So, pro­ject­ed head­lights with nGlide and DXVK:

How­ev­er, if you look close­ly (you might have to se­lect HQ and pause the video), there are still a few black dots in the light cones. I don't con­sid­er this prob­lem­at­ic, but I start­ed look­ing around for oth­er, less hacky so­lu­tions. The DirectX thrash back­ends don't work too good un­der Wine, but opengl3 is al­so good with on­ly a few vi­su­al ar­ti­facts.

Which one to choose? Good ques­tion. Ver­tex looks brighter, which is use­ful on dark­er tracks (and night in NFS3 can get re­al dark, un­like what you have in Un­der­ground and lat­er), even if it's a bit more an­noy­ing at the sides. I al­so don't re­al­ly like how pro­ject­ed is just ren­der the dark ter­rain, then put a bright tex­ture with some al­pha on it, col­ors can get re­al washed out along the cen­ter of the screen as you run out of the dy­nam­ic range of 8-bit col­ors. (And by the way, the pro­ject­ed head­lights still use some per ver­tex shad­ing just with less in­ten­si­ty, look at the sides of the videos. Al­so note how in the sec­ond part, the town seg­ment, how street­lights pro­duce ze­ro light, they're just a bright dot where the lights are sup­posed to be.)

At this point, just for fun, I de­cid­ed to load the same re­play in PCem and check how it looks like with it's em­u­lat­ed Voodoo2 card.

(Fun fact, it looks like rearview mir­ror in re­plays is a mod­ern patch fea­ture. Al­so au­to-hid­ing re­play con­trols.) More dither­ing, small­er res­o­lu­tions, low­er FPS (not sure how much of is be­cause of em­u­la­tion and how many FPS should an au­then­tic Voodoo2 card pro­duce with this game... but prob­a­bly not 60 FPS), and even less glitch­es (but still not per­fect!).

And last, I couldn't stop my­self from try­ing the soft­ware ren­der­er.

OMG. NFS3's soft­ware ren­der­er from 1998 in 1920x1200 res­o­lu­tion at sta­ble 60 FPS! Al­so with soft­ware ren­der­er the head­light op­tion is dis­abled and you on­ly have ver­tex, but frankly, look­ing at the out­put it's some­where be­tween ver­tex and pro­ject­ed. Note how op­po­nent cars and lane mark­ings (and al­so dash­board) are full­bright, mak­ing night races way eas­i­er. This prob­a­bly al­so ex­plains why I didn't re­mem­ber the game so dark when I played it as a kid, as I used the soft­ware ren­der­er back then...

I used "Ha­ha no" three times in this sec­tion, not count­ing both in­stances of "Ha­ha no" ap­pear­ing in this sen­tence.

This post is part of se­ries nfs: 1, 2, 3:HP (W, PS), 4:HS (W, PS), 5:PU, MCO, 6:HP2