A first-person, goal-less space exploration game, heavily inspired by Alessandro Ghignola's Noctis IV (2001). Vesperis is vibe coded: the whole thing was written with an AI coding agent, from the software renderer to the planet function, in the space of a few days.
You fly a small ship between the stars of a procedurally generated galaxy, approach planets and moons, pick a landing sector on a map and walk (or drive) around on surfaces generated by the same function that painted the globe you saw from orbit. Nothing has a name until you give it one. There is no objective. Everything is deterministic: the same sector, star, planet and square metre of ground is always the same.
The picture is rendered in software at 320x200 (scaled up 1x-4x) through palette intensity ramps and a soft smoothing filter, in the spirit of the original.
Since 1.1.0 the galaxy has the proportions of ours (200 billion stars in a disc with a bulge, arms, globular and open clusters, the band of the Milky Way in every sky), fourteen kinds of star (red dwarfs that flare, neutron stars, protostars, Wolf-Rayet stars, black holes among them) and dead peoples: one desert or felisian world in eight once had a civilisation, whose ruins, roads and graves read the terrain they stood on, and whose recordings, taken from the ruins and decoded on the ship, are texts, music and star charts in a language, a voice and a musical tradition of the world's own. A signal radar on the ship points at the worlds that still transmit. Saves from 1.0.0 load, but the galaxy was rebuilt: a saved star may be gone.
1.2.0 adds time and witness: an almanac of the coming events (sunrises, eclipses, moonrises, a front's arrival, a meteor shower's peak) that runs the clock to them; a telescope on the ship; weather fronts that move and arrive; nights with meteor showers, the zodiacal light and earthshine; and probes dropped into gas giants, each giant with its own decks, storms and glow, whose descents come back as recordings in the gallery and profiles on the data sheet. The Vimana jumps any number of light years along the aim, and on the ground a scanner points to ruins, lakes, peaks and the other sights while the explorer marks and names what they find on the sector map. The giants were regenerated (generation 12).
1.3.0 is the far, the faint and the peoples. Each dead people is found at the age it had reached when it fell, from the stone age to a far future, and its world shows it: towns, roads and great works of that age across the people's own lands, buildings in an architecture of its own, and on a world of two peoples the frontier between them and the battlefields of their wars. Their records come in the genres and the tongue of the people and the age (letters, chronicles, songs, sermons, broadcasts, a star chart on a cave's ceiling or a navigation chart of routes), and the decoder reads them as a history along the people's eras. Instruments taken from the ruins are played from a case on the ship, a drone bay sends three drones down to bring back records and instruments, and the ship's player plays what the ship has heard and held. A chart of the whole galaxy plots the next jump, and the radar's gain hears signals thousands of light years away. The peoples were regenerated (generation 13): saves load, and the shards already found are kept with new contents.
Download the build for your machine from the
releases page, unzip it and
run vesperis (on macOS, Vesperis.app). The game writes its save, settings
and guide files next to itself (the macOS app uses ~/Documents/vesperis).
- macOS: the app is not signed. If it is refused, right-click it and choose
Open once, or run
xattr -dr com.apple.quarantine Vesperis.app. - Linux: needs an X11 display (XWayland is fine) and OpenGL 3.3.
- Windows: a single
vesperis.exe, no installer.
Press H at any time for the key reference, Esc for the menu.
Requirements: a C++17 compiler and raylib 5.x
(brew install raylib on macOS; on Linux install the raylib development
package or let CMake fetch it). Then:
make # builds ./vesperis (the game) and ./vesperis_test (headless checks)
./vesperis
CMake works too: cmake -B build-cmake && cmake --build build-cmake -j. Add
-DVESPERIS_FETCH_RAYLIB=ON to download and build raylib when none is
installed (Linux, Windows), -DVESPERIS_BUILD_GAME=OFF to build only the
headless harness, and ctest --test-dir build-cmake runs the headless checks.
packaging/make_app.sh wraps the macOS binary into dist/Vesperis.app,
packaging/make_zip.sh makes a portable zip, web/build_web.sh targets the
browser with emsdk (experimental).
The headless harness needs no window: ./vesperis_test flow plays through a
whole expedition and dumps frames to shots/tests/, ./vesperis_test unit
runs the unit tests, ./vesperis_test regress the determinism and frame
hashes; run it without arguments for the full list of modes.
A gamepad works out of the box (left stick walks, right stick looks, A enter, B
back, X jump, Y data, bumpers sprint and chase view). Keyboard layouts: copy
vesperis_keys.example.txt to vesperis_keys.txt and list PHYSICAL LOGICAL
pairs, or use the key bindings screen in the settings.
In space:
| Key | Action |
|---|---|
| Mouse / arrows | Look around |
R |
Remote target: aim at a star, Enter or click to lock; N cycles the nearest stars; type light years and Enter to jump that far along the aim |
V |
Vimana flight to the remote target (V again aborts) |
L / click |
Local target: next body, then the asteroid belts / the body under the crosshair |
Tab |
Solar system analyzer (bodies and belts; Enter approaches, L targets) |
Enter |
Fine approach to the local target |
X |
Center the view on the local target |
Z |
The telescope (zoom, the reticle, photographs) |
O |
Toggle orbit / fixed point chase; Shift+arrows carry the parked ship round its world |
F |
Field amplificator (brighter star field) |
G / M / J |
The GUIDE (name stars and worlds, notes, targets by name or coordinates, home, history, export/import) / star map (Tab turns to the galaxy chart: Enter plots a jump to the cursor, Enter again flies it) / expedition log |
C |
Deploy the surface capsule (from orbit around a landable world), or drop a probe into a gas giant |
B |
The signal radar (the sweep, lock a signal, its distance and age; +/- turn the gain up to hear farther) |
E at the cabin's back wall |
The shard decoder: a world's records, timeline and history (Tab; Shift with the arrows runs the cursor), read, hear and play what the ruins held, name a piece with N; Tab at the worlds turns to the ship's player |
E at the cabin's left wall |
The instruments' case (play what the ruins held) and, by the front window, the drone bay (Enter sends three drones down for records and instruments) |
I (F2) |
Data sheet of the local target |
T / Ctrl+T |
Time warp x1 / x10 / x100 / x1000 / x10000 / the almanac |
Ctrl+S / Ctrl+L (F5 / F9) |
Save / load |
Ctrl+P / Ctrl+Shift+P / Ctrl+R |
Photo mode / panorama / frame recorder to movies/ |
Ctrl+K / Ctrl+F / P (F10 / F11 / F12) |
Scanlines / fullscreen (also Alt+Enter) / screenshot (saved in shots/) |
H (F1) |
Help |
Esc |
Menu |
You live in the ship's cabin: the mouse turns your head, W A S D walk between
the windows, E uses what you face (the console on the left, the flight
computer at the front, the screens on the right, the capsule in its cage), U
lights the cabin, Y turns the hull to glass, PgUp/PgDn take the lifter to
the roof deck. The classic cockpit camera is one setting away (SHIP VIEW).
Landing map: arrows move the cursor (Shift = fast), Z zooms into the
cursor's sector, R picks a random lit land site, C toggles the cloud
overlay, J jumps under the biggest body in that world's sky, V shows the
peoples (where their records were kept; a people's whole map once all its
records are held), Enter lands, Esc returns.
On the surface:
| Key | Action |
|---|---|
| Mouse | Look around |
W A S D |
Walk (Shift sprints, with stamina) |
Space |
Jump; held in the air, the jetpack thrusts |
1-9 / 0 |
Autowalk speed presets / stop |
C / Z |
Crouch / stand tall (hold) |
Ctrl |
Dive while swimming |
B |
Unfold a buggy next to the capsule; E gets in and out; W/S drive, A/D steer, Space brake; V outside view |
F |
Launch the drone from the capsule (Space lifts off, W/S thrust, A/D turn) |
M |
Set a waypoint on the spot under the crosshair, or clear it |
Q / E |
Board the capsule when standing next to it (return to orbit); E also takes a record or an instrument from a ruin |
K |
Call the capsule to your position |
R / Shift+R |
The scanner: ruins, works, lakes, peaks, craters, canyons, mesas, geysers, crystals, off / leave out or take in what you have marked |
Tab |
The readings: the place, the sky, the air, the ground, the vehicle |
L |
Mark the spot under the crosshair and name it |
N |
Sector map (2 km to 2048 km wide): a cursor (arrows or mouse), Enter marks or renames, Delete twice removes, M places the waypoint, Tab the next mark, +/- zoom |
G |
The GUIDE: name the world, write a note |
V |
Vision modes |
X |
Highlight nearby creatures |
I (F2) |
Environment data sheet |
T / Ctrl+T |
Time warp / the almanac |
Ctrl+S / Ctrl+L |
Save / load |
The expedition is saved to vesperis_save.txt in the working directory when
you quit, and can be continued from the title screen. Names, notes and the log
live in guide.txt; settings in vesperis_settings.txt.
src/core math, hashing, noise, 8-bit framebuffer + palette + smoothing filter,
scanline rasteriser with depth buffer, 5x7 font, PNG writer, input
src/galaxy star field and star classes, system generator, the planet function,
drainage, landmarks and maps
src/space star field, suns, ray-traced globes and rings, sky bodies
src/surface landing site geometry, terrain caches, sky, terrain, water, objects, life
src/game state machine, autopilot, HUD, menus, save/load, audio synthesis
src/platform_raylib.cpp window, input and audio via raylib
src/main_headless.cpp tests and screenshot generation without a window
docs/ development notes: bug reports, plans, reference notes
Vesperis is heavily inspired by Noctis IV by Alessandro Ghignola. It shares no code with it. Written in C++ with raylib for the window, input and sound. MIT licence.
0 comments
log in to comment.