Vette2026
Vette2026 is a C++ rebuild of Vette! for Windows, Linux, and macOS with classic and enhanced modes.
- Type: PC port
- Game: Vette!
- Runs on Windows, Linux and macOS
- By PlasticCog
- Latest release v0.10.0, 2026-10-12
- Source: https://github.com/PlasticCog/Vette2026
README
VETTE! 2026
A from-the-disassembly rebuild of VETTE! (Spectrum HoloByte, 1989) in C++20 and SDL3. It's built to run on modern Windows, Linux and macOS.
- Classic mode plays 1:1 with the original DOS release.
- Enhanced mode adds options on top: high resolution and widescreen, FM/AdLib music, digitized sound effects from the Macintosh version, modern controls, and more.
Status: early reverse engineering. See docs/PLAN.md for the approach and roadmap.
You need the original game
This repository contains no original game files. To play, copy the files from your own copy of
VETTE! for DOS into a folder in Game/ (e.g. Game/DOS). The PC-98 and Macintosh
versions, if you have them, go in folders of their own beside it, under any names: VETTE! 2026 scans
Game/ when it starts, works out which version is where, and shows what it found in the launch menu.
VETTE! 2026 is an unofficial fan project. It is not affiliated with or endorsed by the rights holders of VETTE!.
Building
Requires CMake 3.24+ and a C++20 compiler. SDL3 is used from your system if it's installed; otherwise CMake fetches and builds it statically, so the exe has no runtime dependencies.
Windows (Visual Studio 2022):
build.bat # Debug -> build\windows-msvc\Debug\vette2026.exe
build.bat release # Release
Linux (needs the X11/Wayland development packages for SDL, and libssl-dev for online play):
cmake --preset linux
cmake --build --preset linux-release
macOS (Xcode command line tools, CMake and Ninja; builds VETTE! 2026.app):
cmake --preset macos
cmake --build --preset macos-release
Downloads. Every push is built for Windows, Linux and macOS by GitHub Actions (.github/workflows/),
and tagged versions are published on the Releases page. Put the Game folder next to the program (or
next to VETTE! 2026.app), or choose its location in the launch menu. The macOS app isn't notarized:
the first time, right-click it and choose Open.
Run with --game <dir> to point at a different game folder. --dump-frame out.bmp renders the title
screen to a file without opening a window, as a quick check that your game files are found.
Current state: the original game runs inside the built-in emulator and is fully playable, with keyboard, mouse, gamepad and PC-speaker sound. Native C++ ports of its routines are being added one at a time, each verified against the original (see docs/PORTING.md).
Launch menu. VETTE! 2026 opens with a launch menu. Choose a preset there (Classic, VETTE!
exactly as in 1989, or Enhanced), or set each option: frame rate, PC speed, draw distance, its
resolution, depth buffer and skyline, driving and lane centering, the manual check, joystick, window or fullscreen, scaling (sharp pixels, or smooth), sound, and whether the
menu appears at startup. Game folder shows
where your game files were found; select it to choose another folder. If the files aren't found, the
menu opens anyway and asks for the folder. It works with the keyboard, mouse or gamepad. Choices
(including the folder, and full screen or the window as you leave it) are kept for next time, whether you
play or quit, in %APPDATA%\VETTE2026\config\settings.ini (the per-user settings folder on other systems).
Command-line flags override them for one run, and aren't kept; --launcher brings the menu back if you
switched it off.
The original asks a manual-lookup question (copy protection) before the first race. VETTE! 2026 skips
it, since this version of the game accepts any answer anyway. Pass --manual-check to see it.
Smooth frame rate. The race view is drawn at your display's refresh rate (60, 120, 144 Hz…) while the
game logic keeps its own cadence, exactly as the original. For every display frame, the original's own
3D drawing code runs again on a throwaway copy of the latest game frame, with the camera and cars blended
between the last two game frames. This adds at most one game frame (~33 ms) of delay. --fps original
shows only the frames the game draws itself.
Draw distance. The original draws only the few city blocks around the car, about two blocks ahead.
With Maximum (the Enhanced preset), VETTE! 2026 draws the race view's 3D world itself, with the
whole city in view to the horizon at once: every building, road and landmark with its most detailed
model, and (with the depth buffer, below) all of the game's traffic and pedestrians, which repeat across
the city in a pattern every four blocks, so nothing pops in as you drive. Extended draws eight blocks
around the car. The city is taken from your own copy of the game when it starts (about 0.1 s). The
rear-view mirrors and the freeway sections are drawn the same way (at Maximum, the freeway's whole
route). Road markings are painted flat on the road; edges and cables are thin, crisp lines. The dash and
messages are still the game's own. With PC-98 or Mac graphics the mirror is the original's.
--draw-distance original|extended|maximum overrides the setting for one run.
Depth buffer. With On (the default), the long-distance view is drawn on the GPU with a depth
buffer: nearer things always cover farther ones, so nothing shows through the scenery or flips in front
of something else as you drive, and the whole city's traffic and pedestrians are drawn. Things lying on
each other (road markings, outlines, windows) still go on top in the original's order. It needs
Direct3D 12, Vulkan or Metal; without, the game works as with Off: the original's back-to-front
drawing order, with traffic and pedestrians only near the car, where the original draws them, so they
appear as you get close (--depth-buffer off).
Colours. The original's EGA has 16 colours, and a few things are shaded in two of them as a
checkerboard: the Transamerica Pyramid's faces, some pavements, the odd sign. The Enhanced view blends
each such pair to one flat colour. With Dithered (original), it draws the checkerboard instead, each
cell the size of one of the original's pixels, in the mirror and on the opponent screen's car too
(--dither on).
Resolution. The long-distance view is drawn at your display's full resolution. With Original
320x200, it is drawn at the original's own 320x200 instead and enlarged like the rest of the picture:
the whole city and every other enhancement, with the chunky pixels and one-pixel lines of 1989
(--resolution original).
Skyline. Behind the long-distance view, Hills (the default) keeps only the landscape of the
original's painted horizon: its painted buildings, towers and bridges are taken out, since the real city
now stands in front of it. Painted keeps the original's backdrop as it is (--skyline painted).
Hills is made for DOS VETTE! 1.1's pictures; with others, the backdrop stays painted.
Driving. Two options change how your car drives. They're off by default, and the Classic preset turns
them off. With Improved driving, your car drifts a little through fast corners, its view pointing into
the turn as it slides wide, and it leaves the ground over the crest of a hill when it's going fast enough
(from about 50 mph), landing with the Mac version's thud. Lane centering gently steers your car toward
its lane's direction and centre, found from the city's lane markings, and lets go as soon as you steer.
Either one also evens out the original's rounding of sideways movement, which made a car a degree off
straight creep left but never right; speeds and race times are unchanged. --driving improved and
--lane-centering on turn them on for one run.
Traffic. The original's city cars can vanish in plain view: its turn rules hide a car whose street has no road its way (a park, the water, a one-way street), and its small drawing window rebinds the cars to new cells as you move. With Smooth (the default), Enhanced keeps a shadow of every car it draws, and when the original drops one, the shadow drives on by itself along the roads (straight on where it can, else a turn the roads and the one-way rules allow) until it is well behind you. Such a car is a picture only: the original's collisions are with its own cars.
The original also puts a new freeway car on the road 5 to 12 road slices ahead of you
(each slice is 128 of its units, about 30 feet), and takes cars off as they get more than 22 slices ahead
or 7 behind. In its own 320x200 view that hardly shows; with the long draw distance, cars appear out of
nowhere in front of you and vanish up the road. Smooth (the default; Classic turns it off) brings new
cars in at the far end of the road the original shows (14 to 21 slices ahead, or 6 to 7 behind when you're
slow) and, in the Enhanced view, fades them in, and fades out a car the original takes off while it drives
on along the road. The traffic itself (speeds, lanes, how often cars come, collisions) is the original's.
--freeway-traffic original turns it off for one run.
Freeways. The original's city is in parts that only its freeways join: the Zoo and the Sunset, the
central city, the Marina, the Bay Bridge's end of town and the Golden Gate (every course takes at least one
freeway). With Freeways: Off the city is one: roads made of the original's own pieces join the parts
(a coast road from the Great Highway over the water and through the Marina to the Golden Gate, Marina
Boulevard on through the park into the central city, Golden Gate Park opened into it, and the diagonal
barrier before the Bay Bridge made a street), the on-ramps lead nowhere, and the computer opponent drives
streets where its route took a freeway. The traffic goes along: the Golden Gate's cars carry on down the
coast road both ways, the Bay Bridge's drive Marina Boulevard (east, as on the bridge; west on course 3),
the city's turn back where the coast road begins as they do at any dead end, the new diagonal has the old
one's, and pedestrians walk the Marina but keep off the water and the coast road.
Every course can be raced on the city's streets, and the opponent finishes each one (it's quicker than
with the freeways). An online race uses the host's choice. --freeways off turns them off for one run;
vette_world --drivable [--no-freeways] shows which parts of the city connect.
Map editor. The launch menu's Map row picks the city you race in: the original, or a map of your
own. Enter on it opens the map editor, which shows the whole city from above and lets you change it cell
by cell with the original's own 161 cell types (streets, city blocks, parks, water, bridge pieces):
left-click paints the brush, right-click picks a cell as the brush, the wheel zooms, right-drag moves,
0-3 set the brush's height, [ and ] change which design a big tile uses, W makes a big tile water or
land, Ctrl+Z/Ctrl+Y undo and redo, Ctrl+S saves (F1 lists every key). The city is 5 x 5 big tiles of
16 x 16 cells, and big tiles that share a design (the water around the city, for one) change together.
Maps are saved in VETTE! 2026's own folder (maps, next to save) and put into the game as it starts;
the game's files are never changed. --map NAME plays one for one run. For now the original's traffic,
pedestrians and computer opponent keep their fixed routes, which can run through what you change, and the
street names and dashboard signs are the original's. An online race is in the host's map: their game sends
it to the friend's as the race begins.
Object editor. The launch menu's Objects row picks the cars, pedestrians and buildings: the original's, or a set you've reshaped. Enter on it opens the object editor: the original's 58 3D models (the traffic and the opponents' cars, the police car, your Corvette, the pedestrians and the landmarks from Coit Tower to the Ferry Building), and below them the city's ordinary buildings and street objects, one at a time. The original draws those with program code rather than as models, so the editor makes each one a model (31 of them, from the tall office blocks to the small things beside the streets), and a set that changes one has the game draw the model in its place, everywhere the city has it. Collisions follow the map rather than the shapes: the car drives through whatever a building gains.
The editor is laid out like 3ds Max: menus and a toolbar along the top, four views (Top, Front, Left and
Perspective, each with a grid; click a view's name for the others, Isometric among them, or press Q for
one view), the Create and Modify panel on the right and the status bar along the bottom, with
the picked vertex's x, y and z and the view controls (zoom, slide, turn round). Pick vertices or faces
with the mouse (Tab switches; drag on empty space for a box), then Move (V), Turn (T) or Size
(S) them by dragging (X, Y or Z keeps it to one axis). While you drag, Snap lands the point on a
vertex near it or lines it up with others along x, y or z, with guide lines to show which (hold Alt to
move freely). Symmetry (Shift+M) does on one side of the middle whatever you do on the other. The
Create panel adds a cube, cone, sphere, cylinder, pyramid, plane, wedge or roof to build with, and the
Modify panel adds vertices and faces, extrudes faces (E), turns them round, mirrors and deletes, with
each face's colour from the EGA palette and whether it hides its back. Everything can be undone, and F1
lists every key. The game takes 124 vertices and 16 corners a face at most, which the panel checks as
you go. Sets are saved in the objects folder next to
save and written into the game's memory as it starts, so both the original's renderer and the Enhanced
view draw them (the opponent screen's turning car too); the game's files are never changed.
--objects NAME plays one for one run; two-player races use the original's objects.
The opponent screen. With the Enhanced view, the opponent screen's turning car is drawn at the display's resolution too, and with the Smooth frame rate it turns smoothly rather than in the game's steps.
Online races. Two players can race each other over the internet, in the original's two-player
mode, with no server in between: the games connect straight to each other. In the launch menu, choose
Online race, then Host a race: a code like 7K3M-QX9P-2HDA goes onto your clipboard. Paste it to
your friend in any chat; they choose Online race > Join a race (the code is picked up from their
clipboard) and both games go straight into the race. A vette2026://direct/CODE link does the same, and
if VETTE! 2026 is already running, that copy joins. The race is on the host's course and with the host's
Driving setting (and in the host's map, if they play one of their own); Lane centering stays each
player's own, and jumps show on both screens. Both players need the same version of VETTE! 2026 and
their own copy of DOS VETTE! 1.1.
Name tag and arrow. In two-player races, each player's name floats over their car on the other's screen, and a small yellow arrow shows the way to them. From the driver's seat it sits at the top of the view and turns to point where you need to steer: straight up when your friend is ahead, sliding down to the left or right edge (and pointing that way) as they fall to that side or behind you. In the helicopter view (F4) it lies on the ground and circles your car instead. Tab shows or hides both during the race; the original leaves Tab unused. Set your name and whether they start on in the online screen (Your name, Tag and arrow); a LAN race is listed by its host's name. In Classic (and with the Enhanced view at the original's resolution) they're drawn in the game's own pixels and colours, the tag in a small pixel font.
LAN races. Two players on the same network (the same Wi-Fi or router) choose Host a LAN race and Join a LAN race: the second lists the races hosted on the network, and Enter joins one. There's no code to send and nothing to set up on the router. The games find each other by a broadcast on UDP port 26990 that never leaves the local network; races from Host a race are listed too.
The host's router must let the friend in. Most routers open the game's port themselves when asked (UPnP,
NAT-PMP or PCP). If yours doesn't, the game says so and gives a same-network code that works for a
friend on your own network; for one over the internet, either let your friend host, or forward TCP port
26989 to your computer in the router's settings, then set Router to Port forwarded by hand and
enter your Internet address (the router's status page shows it). Some connections (mobile networks,
some internet providers that share one address between customers) can't be reached at all: then the
other player hosts. The first time you host, Windows asks whether to let the game through its firewall:
allow it. As in the original, each game runs its own race: the traffic differs between the two screens,
and when both cars cross the line within a moment of each other, both players may see themselves win.
--online-host, --online-lan-host and --online-join CODE (or lan) do the same from the command line. (A relay server for room
codes is in server/, server/README.md, for those who run one: --online-server URL.)
Sound effects and music. The original only had the PC speaker. VETTE! 2026 can instead play its
sounds on an emulated AdLib card (the Enhanced preset; DOS VETTE! never supported one), or use the
Macintosh version's digitized sounds. The music can be the original's tunes, or the PC-98
version's FM soundtrack (its YM2203 chip, emulated). That soundtrack adds music to the menus and the
loser's screen, where DOS is silent. With AdLib or the Mac sounds, the engine keeps running under a skid
or the siren, where the original's single speaker voice cut it off. They also play the Mac version's
extra sounds at the matching moments, which the DOS game passes in silence: the start countdown, the
helicopter view's rotor, the horn (X), splashing into the bay, thuds over hill crests, the police
officer pulling you over, and the title sequence's bell and voices. The Mac and PC-98 options need those
versions' files (see Game/). --effects and --music override the settings for one
run.
Sound editor. vette_sfx edits the AdLib sounds: every sound's FM instrument and pitch, with the
original PC-speaker version (read from your own copy of the game) to compare. A game that's running
picks up a saved change within a second.
Graphics. With PC-98 or Mac graphics, VETTE! 2026 recognises the DOS pictures on screen (title, garage, opponent selection, dashboard, crash pictures) and shows the other version's art in their place, at your display's resolution. Everything the game draws over them (text, gauges, selections) stays on top or moves into the new layout. The game itself runs unchanged.
PC speed. By default the emulated PC is fast enough that the game runs at its own built-in limit of
30 fps, as it did on fast 386/486 PCs; the game then also enables its rear-view mirror and building
windows. --pc 286 emulates a 12 MHz PC/AT of 1989 (about 12-17 fps); --cpu-hz <n> sets any clock.
Controls
- Keyboard: every key goes to the game, Esc included, except this program's own: Ctrl+H shows the keys over the game (it pauses, except in an online race), Alt+Q quits to the desktop from any screen, F11 or Alt+Enter toggles fullscreen, and in two-player races Tab shows or hides the other player's name tag and the arrow to them. X is the horn (with AdLib or the Mac sounds): the DOS game has none, so it plays the Mac's. The original's own Ctrl+Q leaves the race, as does Esc's menu.
- Mouse: acts as the PC's mouse. When the game shows the mouse pointer, it's drawn o