← Devlog
v0.2.9-pre-alpha

Ultraviolet v0.2.9-pre-alpha: the levels are procedural now

Longer gap than usual — five tagged builds since v0.2.0, rolled into one release here. The headline: missions are generated now. v0.2.0 had one hand-built test corridor; v0.2.9 builds a fresh mission from a seed every time you leave the hub. Everything else this cycle is the scaffolding around that — a language toggle, a real options menu, a pause menu, and the first sound. Still placeholder art, still the same question: does it play well.


Missions are generated (v0.2.5 + v0.2.6)

Leaving the hub through the portal no longer loads a fixed level. MapGenerator builds a room graph from a seed — the Dead Cells model: entry → a few combat / traversal zones → a choice room → one more zone → the boss. The choice room forks into optional branches — an in-mission reliquary, a shortcut, a challenge room, sometimes a reward behind a 90-second timed door — and there’s a ~35% chance of a hidden room hanging off the main path.

The rooms themselves are hand-built (16 for the Nadodrze district so far). The generator picks and arranges them by type, depth and which doors line up — it doesn’t draw geometry. Same seed = same layout, every time.

The main spine is seamless: instead of a fade between every room, three rooms are stitched into one continuous scene with a sliding window, so the camera just flows from one to the next as you walk. Branches, the secret room and the boss arena still fade in. One generated mission is roughly a 10–20 minute session. (--map-debug-level on the command line still loads the old hand-built level if you want to compare.)


English and Polish (v0.2.7)

The game has a language toggle now. English is the default; Polish is the other option. First launch shows a one-time prompt; after that it lives in Options → Language and switches live. Every string in the game runs through translation keys (four CSV files — UI, relics, tattoos, dialogue). The English text is a first pass and will get a prose edit; more languages later are just another column.


A real options menu, and a pause menu (v0.2.8)

“Options” used to be a stub. Now it has:

Camera framing is now fixed across resolutions: the picture scales as a whole, the camera always shows the same slice of the world, so changing resolution doesn’t change how much you see. Odd monitor aspect ratios letterbox.

Changes are staged — left/right edits a pending value (marked with a *), and a built-in Apply row commits them all at once. Leaving without Apply discards.

Esc during a run now opens a pause menu: Resume / Settings / Quit to main menu (with a confirm on quit). Same settings panel as Options, one level down. On a pad: Start opens and closes it, B backs out a level, A selects. Music keeps playing while paused.


Sound (v0.2.9)

The big one for this build. There were no sound effects at all before — now there are 30 placeholder clips wired across combat (katana swings, hits, parries, guard breaks, the throw-out), the revolver (shots, dry-fire, reload), movement (jump, double jump, dash, ledge grab), taking damage, and the whole UI (cursor moves, selects, back, apply). They’re rough stand-ins from a sound pack — unbalanced, and going to be replaced — but the game isn’t silent anymore.

Audio is split into three buses — Master / Music / SFX — with a slider for each in the settings. Turn the music down and keep the hit sounds, or the other way round.

The two “Corrupted Hunt” music tracks also play on generated missions now (they used to only play on the old test level), shuffling, and surviving every room transition and the pause menu.


Also fixed

The exported build had no floor on generated missions — you’d leave the hub and drop straight through the world. It worked fine in the editor, which made it a good one to chase down: in an export Godot renames resource files, and the room loader’s directory scan stopped matching any of them, so the room pool came back empty and the generator had nothing to build with. Fixed.


Controls

ActionKeyboardPad (Xbox)
Move← / →left stick / d-pad
Jump (double)Space / EnterA
Melee (3-hit combo)A — tapRB
Charged attackA — hold ≥ ~0.5 sRB — hold
Third-hit varianthold ↓ heavy · nothing = fast · ↑ = air launchersame
Block / parryD — hold / tap just before the hitLT
Dodge (dash, i-frames)ShiftLB
Shoot (8-way)SRT
ReloadR (auto on empty)Y
Interact / throw-outEX
Pause / menuEscStart
Dialogue & menus: move / confirm / back↑↓ / Enter / Escd-pad / A / B
Overview (relic + tattoos, read-only)Tab — holdSelect — hold
Ledge grabautomatic; climb = jump / ↑, drop = ↓same

How to run it

SystemFileNotes
Windowsultraviolet.exe (+ ultraviolet.pck beside it)SmartScreen may warn about an unsigned file — “More info” → “Run anyway”.
Linuxultraviolet.x86_64 (+ .pck beside it)chmod +x, then ./ultraviolet.x86_64.
macOSUltraviolet.appUnsigned: right-click → Open → confirm, or xattr -dr com.apple.quarantine Ultraviolet.app.

Quitting: Esc in the main menu closes the game (careful). In a run, Esc opens the pause menu — quit to the main menu from there.


Still pre-alpha — what’s not here


How to report feedback

BUG — what happened, where (menu / hub / which room), how to reproduce, which platform, and a screenshot or clip if you can.

FEEL — it works, but how does it play? This build especially:

Leave feedback in the comments under the game or this post. Testers with the full guide have a checklist there — even a partial run helps.

Thanks for playing something that’s still mostly rectangles.

— SolarNine · v0.2.9-pre-alpha