Warning! Your devicePixelRatio
is not 1 (or your browser doesn't CSS media queries, in which case you can probably ignore this warning)!
Since HTML is as braindead as it can get, creating sites outside of diversity hires corporate art sphere is damn near impossible, so this site is not really optimized for HiDPI screens.
Some images might appear blurry.
Need for Speed III: Hot Pursuit (Windows)
Created: 1730751278 (2024-11-04T20:14:38Z), Updated: 1731116945 (2024-11-09T01:49:05Z), 7402 words, ~31 minutes
Tags: review, western, ea, nfs, racing
This post is part of series 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 favorite. (Well, not completely true, the first NFS I played was the demo version of NFS4, with its only "Route Adonf" track, but the first full version NFS I played was NFS3.) Need for Speed III: Hot Pursuit (still オーバードライビンⅢ:ホットパーシュート in Japan, and Need for Speed III: Poursuite Infernale in France as a new contender) from 1998, here I come! Also, the last NFS to have a proper number and the first where the marketing department started to attach stupid names to the title of the game.
As usual, start with the intro video, which is back at 320x240 resolution this time, for the whole duration (but the second part of the intro is letterboxed from various random aspect ratios, except when it looks like an originally 4:3 video was made wide screen by adding black bars, but fucking it up so the so one row or column of pixels at the side of the video still there, visible around 01:14-01:20 or after 1:30):
The first thing you can notice is the EA logo is the same as in NFS2. Huh, did the annual EA logo redesign team slack off and couldn't complete a new logo on time? But then, hey, Dolby Surround©®™ (I hope I didn't miss any character, I don't want to be sued by Dolby Laboratories for misrepresenting a 42 years old technology)! (Also, was that video digitized from VHS? Part of the bottom row is missing...) You can connect the stereo output to a Dolby Surround compatible receiver, and have surround sound! Maybe. The first and only NFS to have this feature. More on this later in the technical shit part.
Then, around 0:14, onto the real intro begins. Actual ingame footage! Woohoo! Keep your eyes peeled, you won't see anything like this, until... Underground, I think? This also makes it the only intro video in the classic NFS series showing any resemblance to the actual game... Plus a random collection of real-life videos. This is a blend between the real-life-only NFS1/2 and the CG only NFS4+ intros. On the other hand, this goes back to NFS1's random video collection intro, rather than NFS2 or 4 where the video tries to have some kind of story. The video also showcases two new features of NFS3, night driving and weather (which means rain or snow). (Well, NFS2 had rain and snow on some tracks, but I think it was exclusive to the Glide version and also track dependent, here you can choose weather on any track you want.) And of course, police, a newish feature (NFS1 had something, but it was pretty lame). Also, instead of gearbox-shifting fetish, we have lightning and welding fetish. Whatever.
(Fun fact: around 0:39-0:40, the Lamborghini going through the S-curve. When I was a kid I always thought it's actually the back of the car, and the video is just played back in reverse. I had to actually pause the video on the last frame where the car is still visible to confirm no, that's a white light, not red, so it's the front of the car. I blame this on the horrible video quality. Similar to nip porn censored so hard you can't even tell the genders of the people...)
The Labyrinth of Menus#
Here I go, the same order as with NFS2. When you start the game, you have to select one from four options. One Player, if you want a single player race, Two Players for local split-screen, Connect Players for network play, and... hold your breath... Load, to load replays and saved tournaments/knockouts! You no longer have to go into the depth of the settings to load a game! (Even though settings still have a load button, probably to help people who already developed Stockholm syndrome with NFS1/2.) Such marvelous engineer, much improve, so amaze, wow. I had no idea how easy my childhood was compared to previous generations!...
The game modes are more-or-less the same as in NFS2, with one addition.
Single Race: the same as in NFS2. Select a track, your opponents (or lack of them), and go!
Hot Pursuit: the new mode, also the namer of this installment. And this actually has two submodes depending on the car you select. If you select a normal car, you'll race against a single opponent (with optional traffic), but with the police trying to stop you. You can get caught number of laps times before you're arrested and your race ends. Each time you successfully finish a race, you become most wanted on the track. Become most wanted on all tracks to win a bonus car. Alternatively you can select a cop car to be the cop. In this case you're the only cop and you have to stop 6 racers. You only have to arrest each of them once, and the number of opponents doesn't depend on the lap number, so you can just select 8 laps to make your task easier... Similar to the racer mode, if you arrest all players before they finish their laps, you become top cop on the track, and collect top cop for all tracks to win another bonus car.
Knockout: the knockout from NFS2, where each race the last to finish is eliminated. Unlike NFS2, you can save the knockout state between races, so no more rage-quits if you fuck up the last race. There are two difficulty levels, beginner and expert, on beginner you race the tracks in order and nice conditions, on expert in random order and conditions. Winning beginner gives you the bonus track and winning expert gives you the bonus track and a bonus car. So there's no point in completing the beginner one...
Tournament: complete each tracks and collect the most points to win. Unlike NFS1 and 2, the order of the tracks are fixed now, and you have to use the same car for all tracks (so it's like the knockout). Winning the beginner/expert tournament gives you 1/2 bonus cars respectively.
On the car front, you can select between 12 cars (or a bit more if you have a promo/localized release), 3 of them being bonus cars. Three cars have a playable police version if you're playing Hot Pursuit. You have the usual fact sheets about each car, complete with audio narration and slideshow, just like in each classic NFS game. Instead of car videos from NFS1/2, you have a 360° interior panoramas. Car tuning is still there, and just as in NFS2, I never touched it... You have a new car comparison mode to help you select the best car based on parameters a bit more easily than NFS2's graph display. But the real new feature: 3D preview of the car in the menu! You can rotate the car and inspect it. No longer have to start a race to check out your car. Also, you can finally select custom car colors.
About tracks, you have 8 normal tracks and a bonus one. Unlike NFS2, where the intro literally ends in "race around the world" and even the main menu has a map of continents as a background (but even in NFS1/4 you have tracks around the world), in NFS3 you only have tracks from the USA and Canada. A bit of a bummer. And 8 tracks are actually at 4 locations, you have an easier and harder variant of each location, with a shared segment that's the same on both tracks. (But at least the first track, Hometown, while still being pretty easy, actually has some replay value, unlike NFS2's Proving Grounds, an oval track, which other than measuring the top speed of cars, is pretty much useless. You don't really play it outside knockout/tournament...) The harder variants has more difficult corners, and set in winter or sunset (the latter is a bit annoying as you can't turn on your lights (or more exactly you can turn them on, but they have no effect) and some parts of these tracks can get rather dark). The track presentations now include pictures next to the audio commentary (still pictures only, though, only in NFS4 you get videos).
A new feature is driving assists: Braking, Collision Recovery, Traction will help you drive if you can't. Best Line puts cones around the "optimal" line to race, also adding a counter of how many cones you hit—which of course prompted little me (and also today's me) to try to hit as many cones as possible. Navigator adds a rally-style navigator to the race, announcing the turns in advance. Pursuit is only available in Hot Pursuit mode, it is the only assist enabled by default, and only does anything if you're a cop. When enabled, when you reset your car (either because you flipped over, busted a driver or press the reset button), instead of being put back to a near point on the track, you'll be instead put back near to a racer. It helps so much it basically makes pursuit with and without assist a different game.
(Mods used: track: Atlantica HD Texture Pack, car: Toyota Supra 3000GT)
Just as in NFS2, you can select what kind of opponents you want in Single Race and Hot Pursuit mode, and you have extensive settings.
Mods mods mods#
Since I spent a lot of time playing more-or-less vanilla NFS3 in the past, I figured there's not much to explore in them, so I set out to explore some mods. Also, NFS3 is the game where the NFS modding scene started to form, so this is the first game with any substantial amount of mods. The mods can be generally classified into three categories: cars, tracks, and everything else. One thing you have to keep in mind: this game is not too robust when it comes to handling modifications to its files, and if it doesn't like what you did, it will tell you by crashing and spewing you the values of x86 registers, but nothing to help you locate the problem. So your best bet is installing mods one by one, so if it fails, you know the culprit. And sometimes mods are incompatible with each other, so mod A and B both work in isolation, but when you enable both, the game crashes. Hope you like trial and error.
With cars, the game fortunately supports adding brand-new cars, the files usually go into a new directory in gamedata/carmodel
.
All the built-in cars have 4 letter directory names, and while you can use longer directory names, after a while the game will crash.
I didn't spend time to figure out what is the max length I can get without crashing, if you don't want to complicate your life, stick to 4 character directory names.
Other problem is every car has a 4 letter internal ID, and if they clash (even if placed into different directories), the game will crash (without telling which two cars conflict!).
Your solutions in this case is to not have the two cars installed at the same time, or mess around with modding tools to change the ID of one of the cars.
With tracks, the situation is a bit worse, as you can't add new tracks to the game. Each modded track replaces an already existing track, severely limiting the set of tracks you can have installed at the same time. Also, as far as I can tell, there's no user-friendly way to change the names of the tracks in game, so the game will still refer to the tracks by their old name... Which gets me to the next point, an excerpt 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 approach!?
I'm on Linux.
I have overlayfs
!
And at that point the damage was done...
The basic idea is to have a base "layer" with the game, a number of mod layers on top of it (for tracks and anything else), then a top level layer to store saves (because this game writes the saves to its own dir, Windows 9x didn't have non-admin users, or pretty much users).
Then I can just remount it with different mods, and leave the plebeian "move files around manually every time" to winsux users.
I whipped together a simple script to automate it, and tada!
The only annoying part is overlayfs
needs root
to mount dirs, so it will need the root
password every time.
It was annoying, so I switched to fuse-overlayfs
, which is more-or-less the same but FUSE, so works without admin.
Yes, I could have worked around it with sudoers
or user namespace magic, but namespaces are a hassle to use (the mount wouldn't be visible outside of it...) and I was too lazy to mess with my sudoers
file...
Then I mount a ciopfs
over the union mount, because filenames in mods come with totally random file casing, and I didn't want to mess around with renaming files every time installing a new mod.
After this, I went to hunt for addons. I knew about nfscars from back in the days, but when searching for it, it was gone. Fortunately someone backed up the whole site before it went down, so the content is available out there, however the presentation is pretty bare-bones.
With a bit of searching for better alternatives, I landed on nfsaddons.com and came up with the brilliant idea of checking out all the tracks, starting from the oldest. Not a good idea. Earlier tracks are just slight modifications to existing tracks, sometimes adding huge bumps into the roads and generally fucking up the road, things I'd surely enjoyed them when I was 10, but now a few decades later, it's just annoying. Otherwise they just changed the textures of the tracks, usually to the worse. A seriously bad contender is a track with a mouthful name of "Aquarius Rising II: The Supernova Grand Prix", where I seriously have to question whether the author forgot to take his meds before making this track. If you want something good, look at Opus IV, even though most of his tracks are also just texture swaps, with a few track conversions. The NFS1/2 track conversions are also good, and the HD texture packs are not as bad as the title make them sound. What I really missed is tracks neither a conversion from a previous NFS nor a slight edit of an existing track. There is Test Runway, but it's not exactly a track you can race. Sochi-2014 RACEWAY, and Olympic Raceway, which looks like a variation/newer version of the former, are all what really fits the bill. Maybe Rapa Nui Mountain too, even though it's still just a Summit variation. Not much.
On the car front, I tried a few, plus I found some cars in my saves from older computers. There are two common problems with downloaded cars. First, their performances are all over the place (and the performance graphs in the car comparison usually have nothing to do with the actual in-game performance), usually they're way too powerful, they feel like you're cheating. Second, most cars lack a cockpit view (either completely or just reusing a cockpit from an existing NFS3 car, in many cases from a completely different brand). Seriously, what the fuck the modders were thinking? Create a mod you can't see? I don't understand people...
As a little bonus, I found this official EA cars bundle, which includes all cars included in various promo/regional NFS3 releases plus some downloadable cars from EA. Unfortunately the latter are included as .exe files, and I found no way to extract them with native unpackers on Linux, and running the executable will fail if you installed modern patch as it will miss the required registry entries. To make your life easier, I made a tarball of the extracted cars, so you can just drop them into the game directory available here.
Gameplay#
Okay, let's race already. The first thing you'll probably notice is the brand-new HUD. The huge-ass omega logo next to the timer is gone (what the fuck was it doing in NFS2 anyway?). The first game where you have an opponent list—by the way, what is the conversion between meters and seconds? Because it's not like it has checkpoints on the tracks and calculates the time difference between you and the opponents passing it, but it's updating constantly. But the better new feature, theHUD is customizable! You can move the meters and map and other things around! It feels like I'm using blender and not a dumbed-down software designed for retards. Granted, probably 99.9% of people never touched it, and even people who touched it barely customized anything...
(Mods used: track: Lost Canyons HD Texture Pack, car: Impreza WRX STi)
Handling wise, fortunately it seems like they continued from the simulation "style" of NFS2. It needs some getting used to, but it's not too bad from a '98 game (and of course this has absolutely nothing to do with the fact that NFS3 is the first NFS I played, so I had a lot of time getting used to it). The per-track music theme in rock and techno (but the track pairs share them), and the dynamic music from NFS2, even if less noticeable, still here. The dynamic music also reacts to pursuit state! Say goodbye to this until MW.
Which reminds me, let's take a look at the hot pursuit mode—win the race against the single AI opponent without getting ticketed too many times. There are basically three ways to get ticketed/arrested:
- 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...)
- Spike strips. Getting hit by a spike strip is an instant catch.
- 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: Country Summer, car: Nissan 350Z)
I can't stop not mentioning the inconsistency 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 complete it. But with tickets, you start at 0/3 tickets. When you're at 2/3 tickets, you can't get one more ticket and continue! The next time you're caught you're arrested and the race is over. You can't get to 3/3 tickets because the game immediately ends if you do it. I don't know how many times I got arrested when I thought I can still get ticketed once more... Did a single programmer see this UI?! Yes, I know how UI development works with all room-temperature IQ UX designers...
You also have a police "range finder" under your rearview mirror, which gets more and more red as you get near a police unit, and you can listen to their radio. How realistic is, I have no idea, but probably not really. Also for some weird reason, cops can be heard from the right speaker, when the dispatcher/operator/whatever from the left. I thought police radio is some low quality mono transmission...
When you're the cop, you have to use one of the methods above to catch the racers—but of course, they won't accidentally reset their cars... Spike strips are also a bit nerfed, when you drop a spike strip, it needs a couple of seconds to activate. I mean, I get it, they didn't want to make it OP where you just overtake a racer and drop the spike strip for instant win, but when you're alone, setting up a road block with a spike strip and waiting until a racer goes there is not exactly a viable tactic. Oh, also, if you're not around the racer when they hit the spike strip, they'll just reset themselves and continue, so just dropping the spike strip in a good position and hoping someone will hit it is also not a good tactic. On the other hand, if you hit a spike strip as a racer, it's a 100% catch... So most of the time the way you catch racers is to somehow force them to stop, either by spinning them out, or blocking the path in front of them.
(Mods used: track: Rapa Nui Mountain, car: Subaru Impreza WRX Sti Ver. IV (but VI ingame...))
(Look at those lighting effect with the pursuit cars! For example, around 1:10 or 7:15. How it lights up the dashboard or the surrounding environment, even visible in the rearview mirror. In 1998! Don't ask why the dashboard doesn't have lights... Or see the very effective roadblock in action at 3:20. Also see 9:27 for a near-catch, showing your about only option here, press the gas pedal and hope you can somehow get out of the situation. If you brake, you lose.)
Technical shit#
Note: most of the patches mentioned in this section are mirrored on my server.
Oh my, where do I even start? First, if you're playing this on Linux, just as with NFS2 or 4, get Wine 6.19 or older. Controller support is completely broken in newer versions, and when I tried it with Wine 9.20, it simply hanged upon exit. Fix one bug, introduce 3 new, just the usual Wine development. Next, no matter what OS you use, grab the modern patch. If you use Wine, get the beta version from the bottom of the page, because the last stable release doesn't handle resolution changes properly.
Installation is pretty simple, as the website says, copy FEDATA
and GAMEDATA
directories from the CD and extract the 7z file, overwriting the files... haha no.
The files on the CD will (likely) have uppercase filenames, while the 7z files has lowercase filenames.
To fix it, you can either downcase every filename 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-mentioned ciopfs to emulate a case-insensitive filesystem.
The latter is recommended 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
expects all file names to be downcase on the underlying FS.
The first thing you want to do after extracting is checking the nfs3.ini
file, which is the config file for the modern patch,
The entries you should probably look into are the following:
NoMovies=1
: disable intro movie and demo movies the game plays if you idle in the main menu for too long. Intro videos are fun to watch once or twice, but when you start the game for the 19834847th time, they're just annoying.LoadingSplashTime=0
: this one is total WTF. Modern patch optimizes game loading so it doesn't take ages to load, so what does this patch does? Adds an option to set a minimum time of how long you want to see the loading screen, and defaults it to 5 seconds. What kind of retarded bullshit is that!? You spend weeks to optimize the code, then you just shit on the middle of the table and fuck the whole shit up with some totally useless shit?! What kind of terminal retardation is required to do this?!... Anyway, setting this to 0 disables this crap, and you'll only see the loading screen as long as it's necessary. (Interestingly,IntroSplashTime
, a similar setting for the initial loading screen defaults to 0...)AllowHugeTextures
,OwnHeapLimitMb
: it might be required to bump them up with some mods, even though I didn't run into problems with the default settings.
Plus there's one more option, called ThrashDriver
, which specifies the graphics API to render the game with, and you have quite a few options:
nglide
: the default one, uses nGlide to translate glide to DirectX 9 (which will be converted by Wine/DXVK to OpenGL/Vulkan), and unless you feel likea masochistexperimenting, you should probably stick to this. However, you should still opendrivers/nglide/thrash.ini
and setNGLIDE_RESOLUTION=1
andNGLIDE_ASPECT=1
, to force using desktop resolution.dgvoodoo
: using dgVoodoo2, another Glide wrapper. I've got some massive FPS drops at race starts with this, so I didn't really try this.glide3x
: use Glide API directly, useful if you have some Glide wrapper already installed and you want to use it. I used this originally so I could use the system installed nGlide and set it to desktop resolution. Then I figured out the env var settings, and afterward I only usednglide
...dx5
,dx6
,dx7
,dx8
: various DirectX renderers from EA.dx8
is hilariously buggy in Wine, older versions usable, but not much use unless the Glide wrappers don't work on your machine.softtri
: a software renderer. This might be useful as the software render has quite a different look than the others, which might be useful if you want total nostalgia feeling. With modern patch, you can run it in higher and widescreen resolutions too. Woo-hoo!opengl1
,opengl3
: not included in modern patch, but you can getdrivers/opengl1
ordrivers/opengl3
from NFS2's modern patch (or a slightly newer version from archive.org). Works surprisingly well, except you can't force it to run in desktop resolution (while it worked in NFS2 with these renderers). There's a setting in the config calledOGL_RESOLUTION
, setting it to 1 is supposed to force desktop resolution, but instead I get a 1x1 pixel window. If I try to set the resolution explicitly, then I get a square window whose width is the specified, but the height is the same as the width. I played around with the other parameters, hoping something will fix it, but no luck.
About screen resolutions: the game menus are hardcoded to 640x480 resolution, so no matter what you set in the settings, the menu will be 640x480.
And only the glide wrappers (nglide
, dgvoodoo
) seem to have a working "override resolution" mode, in every other case you'll be stuck with 640x480 menus.
But with modern patch you can select higher and non-4:3 resolutions ingame (and you should do, even if you override resolution from the Glide wrapper, so the HUD won't be stretched).
If you want to run the game windowed or have more than one monitors, I recommend enabling emulate virtual desktop in winecfg
instead of getting modern patch's windowed mode working.
Depending on your renderer, sometimes if NFS3 crashes, it won't restore the gamma settings, leaving 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 older if you want to use joysticks, then run wine control joy.cpl
, and make sure you disable any duplicates/non-controllers.
If you have anything under xinput devices, click on override to move them back to normal devices.
If disabling/overriding doesn't seem to do anything, click on OK and restart Wine, it's a bit buggy.
Then, if you have a DualShock 4 controller, it has a fantastic "feature": the L2/R2 buttons are both buttons and axes.
When you press them, they both register as an axis movement and key press, which fucks up the keybinding screen of NFS3 as it will register the button and not the axis movement.
What I did here (and completely forgot about, thanks to Gentoo's /etc/portage/patches
, so it might be needed for NFS2/4 too) is to get rid of this bullshit feature by patching the kernel driver.
Something 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 comment the lines, there are a few because there's a separate section for each DS4 variations.)
If you don't want to patch your kernel, there is a workaround, but pretty annoying. If you press the thumb just a little bit, it'll already report it as a button press, but the axis will be only around 10% or so. So press the button a little bit, keep it steady, click on the control you want to assign in the menu, then press it fully. Since the button is already pressed when you click on assign, the game won't detect the button as being pressed, but it will detect the axis movement. You might have to retry this a few times until you succeed.
Watch out for the icons you see when binding axes, as NFS3 supports both full axes (when the full range of axis is used for a single input) and centered axes (where it's normally in the middle and it can go both up and down). Steering is usually centered, acceleration/brake can be both (you have one centered axis, acceleration moves in one direction, brake in other, or two separate full axes). With DS4 above, you want L2/R2 to be full, otherwise you won't start accelerating/braking until you press the button at least halfway.
Next, even with the patch above, you'll maybe run into the issue of NFS3's controller binding page being buggy. Sometimes, I think generally after using POV buttons, but I'm not 100% sure, it just stops registering any controller event. If this happens, press Esc, click Done, and restart the game. After it, you can continue binding keys until it breaks again. You can usually finish setting the bindings in 2–3 restarts. Good thing you only have to do it once.
Haha no.
The game has a fetish of resetting your controller configuration.
If you start the game once without the controller being connected, say goodbye to your bindings.
(I mean, kinda makes sense, when this game were made, controller meant a game port on your soundcard with zero plug-and-play, so the only way to have a controller disconnected was to replace your sound card without a game port, and at that point it was pretty safe to assume you won't use the controller again.
But in today's age of USB and Bluetooth and whatever controllers it's pretty annoying.)
If the game crashes (and it happens a lot with mods), say goodbye to your bindings.
So, here's a pro tip: after you set up everything in the settings, quit the game, and make a backup of fedata/config/config.dat
.
Next time the game has a brain fart, just restore the backup and save yourself the misery of having to set up keybindings again...
Dolby Surround©®™ (aka. Dolby Laboratories will now sue you, stock up on lube)#
When you go to audio settings, you can choose between Mono, Stereo and Dolby Surround. Back when I was a kid, I only had stereo speakers, so I selected Stereo and everything was alright. Later I got 5.1 speakers, and NFS3 still had the same options. All Dolby Surround is doing is mixing four channels (front left-center-right, and a rear) into two. It was used on some DVDs and such, and some Hi-Fi systems had a Dolby Surround button to enable a decoder... but of course on PC you had none of this. You had 6 output channels, there was no need for this fuckery. So for a long time, I played NFS3 in stereo, even when I had 5.1 surround.
Fast forward a decade or so into 2024, and I started to get enough of this. Once I've opened PCGW's NFS3 page, and noticed it supports DirectSound 3D, and there's a project called DSOAL, which wraps DirectSound with surround (something not even supported on Vista) to OpenAL. Exactly what I need! Haha no. I'll cut the story short, after setting it up and trying it... front speakers were too loud compared to surround speakers, and it didn't really sound 3D. Staring at DSOAL's debug output revealed the problem: race music, engine sounds, speech, collision sounds, environmental sounds, they're all mixed into a single stereo stream placed at (0, 0, 1). Right in front of you. The reason why front speakers were loud and rear quiet. The sounds of opponent and traffic cars were seemed to be given some 3D coordinates, but at this point it was clear I'm not going to get anything resembling 5.1 out of this.
So back to the original problem, decoding Dolby Surround on PC. It must be an easy problem, right? Unfortunately, my research yielded the same result as a couple of years ago: no. First, there's FreeSurround Alsa Plugin, last updated in 2009, which doesn't even compile (Makefile has some paths hardcoded and no longer true on a modernish 64-bit Linux). If you want to use it, grab my fork (mirror), compile it with something 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 example config given probably works, just forget 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!
Kinda.
There was a ~1 second delay between the video and audio.
I've measured it with OBS, focused a button in the menu, the sound effect came 900 ms late.
Oof.
But at least it allowed me to confirm Dolby Surround output actually works.
I turned off music, engine sounds, stopped in front of a waterfall on the Atlantica track—water sound comes from front speakers.
Turn around, water sound comes from back speakers.
Yay!
Now just do something with the ridiculous delay...
Poking at the source code it creates a buffer to hold 8192 samples, and process them at once (it does an FFT on it).
8192 samples at 48 kHz is about 171 ms.
Not a small number, but far from 900 ms.
My first idea was to decrease the buffer size, but of course the author of the code apparently didn't know the C compiler can do basic arithmetic, 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 commented).
After fixing them, I could reduce the buffer size, at 512 samples the latency started become acceptable, but it also started to sound like some badly compressed MP3 file.
There must be a project to solve this!—I thought, and started searching. I found a project called FreeSurround2020, where the readme states "An ALSA plugin using the most recent implementation of the FreeSurround upmixer". Perfect! Except... there's zero trace of an ALSA plugin in the repo. All it has is a command line tool to convert sound files. Useless for my use case. But it was supposedly using a newer FreeSurround implementation.
At this point I started to give up the ridiculous idea (again) where the world would end up in a configuration by itself that's not completely useless. I also started using PipeWire recently (long story...), so I decided to grab the original FreeSurround implementation called foo_dsp_fsurround, and started to play around with it. And ladies and gentlemen, this is how I lost one week of my life to mess around with Dolby Surround decoders. I don't want to go into details (I'd need to write at least one blogpost's worth of text for it), so just the important ones. FreeSurround header file notes about FFT block size:
Must be a power of two and should correspond to ca. 10ms worth of single-channel samples (default is 4096 for 44.1Khz data). Do not make it shorter or longer than 5ms to 20ms since the granularity at which locations are decoded changes with this.
What's the problem with this? 4096 samples at 44.1 kHz is not about 10 ms, it's about 93 ms. No wonder the quick calculations I made assuming it processes audio in 10 ms chunks were way off. I'd say it's a typo and he meant 100 ms, but then the next sentence should also read between 50 ms and 200 ms. Nevertheless, the FreeSurround plugin defaults to using 4096 samples, and if I set it to 512 samples (about 11-12 ms with 44.1/48 kHz), it sounds pretty bad. Also, after looking through the code I realized the filter itself has a half chunk size delay, so 4096 samples at 48 kHz should result in 128 ms delay, which my measurements confirmed. Way better than the 900 ms I got with the ALSA plugin, but still a tad too much. Personally I found 1024 samples to be the best compromise between sound quality and latency (32 ms from FreeSurround algorithm, a bit more if you add PipeWire processing on top of it).
But I wasn't convinced.
Even at 1024 samples, I could hear some weird artifacts, and the proprietary decoders built into home entertainment systems surely worked in real time without adding 100+ ms delay.
After a bit lot of digging, I found Dolphin emulator, and while it uses FreeSurround to decode Dolby Surround now (but with 512 block size, didn't they realize it sounds awful?), used a Dolby decoder from ffdshow tryouts before, another long abandoned package.
I integrated it too into my tool, as unlike FreeSurround it has practically zero delay (inherent to the algorithm, the extra PipeWire node will of course add a bit).
No more latency!
Yay!
Except... now if I crash into something, I hear the crashing sound sound from the front speakers, and also from rear speakers, just a bit quieter.
If I reverse into something, rear speakers are a bit louder, but I still hear it from the front.
Well, kikepedia notes there might as little as 3 dB separation between front and surround channels, I guess it means whatever is supposed to be heard from front can leak into surround channels, just 3 dB quieter (which is not a lot).
Notwithstanding, this decoder still seemed like a better compromise than using FreeSurround with small block sizes, so I mostly went with this.
But the videos posted in this blogpost are decoded using 4096 sample FreeSurround if you chose HQ (MQ has the raw Dolby Surround stereo).
I know it's not realistic, but whatever.
Grab this hacky fine software from here (mirror) if interested.
Headlights#
So you think you set up everything, played a few races, everything seems alright, then you start a night race, and this is what you get:
According to the modern patch readme, "this problem is occurs on some GPUs", so whatever follows might not be true for you if you don't have an AMD RX 580 GPU. (Testing this on my laptop halfway in the trash really quick, the same problem happens on 4th gen Intel too but not on Nvidia GTX 960M or llvmpipe, so yeah, it depends on the GPU.) So, what to do about it?
First option is, also the workaround recommended by the modern patch, to go to graphics settings, and set headlights to vertex from projected. The result will be something like this:
No more Z fighting, but the edges of the lights are a bit jarring.
This is because there is no per pixel lighting, only per vertex and goaourd Gouraud shading, and triangles are quite big in a 1998 game.
If you can put up with this, you can stop here.
I, however, wanted to figure out how to get projected lights to work.
One (mostly) working workaround is to use DXVK to convert DirectX to Vulkan, instead of Wine's OpenGL translator. I suspect there's some rounding issue is at play and Vulkan (or Nvidia) rounds it a bit differently than the AMD/Intel OpenGL... (Interestingly this workaround doesn't work for NFS4.)
Update 2024-11-09: I knew I read something about this bug before, and I found it, at the bottom of dgVoodoo2's Glide readme:
I ran into a problem with NFS 3 Hot Pursuit: ugly z-fighting which is most noticable with projected headlights. This game does not use depth bias but utilize the inaccuracy of the 16 bit voodoo depth buffer when rendering polygons onto each other (I'm not sure if it was intentional or just a bug). If an app uses z-buffering then using a 16 bit depth buffer in the emulation provides the correct and exact mapping of the z values, like on a real Voodoo.
I updated dgVoodoo2 to the latest version (2.83.2 at the time) to check it out, but I ended up with the same result: using DXVK it works, using Wine's WineD3D, it flickers, irrespective of the 16-bit depth buffer setting in dgVoodoo2. I don't know if this is because of emulation inaccuracies in DXVK/Wine, or the open source AMD driver, or dgVoodoo2 broke this option, or modern patch broke it. Anyway, if nGlide + DXVK doesn't solve the problem for you, you might try this method. End update.
So, projected headlights with nGlide and DXVK:
However, if you look closely (you might have to select HQ and pause the video), there are still a few black dots in the light cones.
I don't consider this problematic, but I started looking around for other, less hacky solutions.
The DirectX thrash backends don't work too good under Wine, but opengl3
is also good with only a few visual artifacts.
Which one to choose? Good question. Vertex looks brighter, which is useful on darker tracks (and night in NFS3 can get real dark, unlike what you have in Underground and later), even if it's a bit more annoying at the sides. I also don't really like how projected is just render the dark terrain, then put a bright texture with some alpha on it, colors can get real washed out along the center of the screen as you run out of the dynamic range of 8-bit colors. (And by the way, the projected headlights still use some per vertex shading just with less intensity, look at the sides of the videos. Also note how in the second part, the town segment, how streetlights produce zero light, they're just a bright dot where the lights are supposed to be.)
At this point, just for fun, I decided to load the same replay in PCem and check how it looks like with it's emulated Voodoo2 card.
(Fun fact, it looks like rearview mirror in replays is a modern patch feature. Also auto-hiding replay controls.) More dithering, smaller resolutions, lower FPS (not sure how much of is because of emulation and how many FPS should an authentic Voodoo2 card produce with this game... but probably not 60 FPS), and even less glitches (but still not perfect!).
And last, I couldn't stop myself from trying the software renderer.
OMG. NFS3's software renderer from 1998 in 1920x1200 resolution at stable 60 FPS! Also with software renderer the headlight option is disabled and you only have vertex, but frankly, looking at the output it's somewhere between vertex and projected. Note how opponent cars and lane markings (and also dashboard) are fullbright, making night races way easier. This probably also explains why I didn't remember the game so dark when I played it as a kid, as I used the software renderer back then...
I used "Haha no" three times in this section, not counting both instances of "Haha no" appearing in this sentence.