Vette2026

Vette2026 is a C++ rebuild of Vette! for Windows, Linux, and macOS with classic and enhanced modes.

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