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, PSX), 4:HS, 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. Reset your car while being near a police car. Automatic resets by the game (because you rolled over) count too. Try to not reset your car while the police is nearby. (On the other hand, if the situation is hopeless, it's probably better reset immediately to save some time...)
  2. Spike strips. Getting hit by a spike strip is an instant catch.
  3. Going too slow near a police car. This one is nasty. The police doesn't have to immobilize you, you don't even have to stop, just be too slow for a few seconds and you're caught. And the police love to spin their cars in front of you, blocking your way, or PIT-ing you, or just getting in front of you and brake, if you can't get out of it quickly, you're toast. It's way easier getting caught here than in MW, or heck even HP2. On the flip side, you have multiple 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, PSX), 4:HS, 5:PU, MCO, 6:HP2