← All projects

Game development · 3D · Personal project

Everything to Lose

A first-person 3D game I'm building in Godot 4.6, made to look as if it's running on an original PlayStation: models jitter as you move, textures warp, and the colour is reduced and dithered. So far I've modelled and textured the apartment it starts in, and all of its furniture, in Blender, and written the first-person controller you explore it with. Development is ongoing.

  • Godot 4.6
  • GDScript
  • Blender
  • Jolt Physics
  • Git LFS

The code is in a private repository; I'm happy to walk through it.

Overview

Everything to Lose is in early development. Before building any gameplay, I wanted to get the look and the feel of moving around right, so the first milestone is a single space you can walk around: a small apartment, furnished and lit, rendered with the limitations of late-1990s console hardware.

Models go straight from Blender into Godot as glTF files. Each piece of furniture is wrapped in its own reusable scene with collision and then placed in the apartment scene, which the main scene loads alongside the player, the lighting and the environment.

My role

A solo personal project. I modelled and textured every 3D asset in Blender: the apartment itself, a bed, desk, chair, PC, nightstand and a TV stand with a PS1. The desk, chair and TV stand share one texture sheet, which keeps the number of textures down. I also set up the Godot project and its folder structure, chose and configured the rendering and physics settings, and wrote the player controller.

Recreating the PlayStation look

The original PlayStation drew 3D graphics with whole-pixel screen positions, no perspective correction for textures and 15-bit colour. Those shortcuts are what give its games their look, so rather than adding a simple pixelation filter, I reproduce each one. I built this on the open-source PSX Visuals GD4 Port plugin (MIT licence) and tuned its global shader settings for this game:

  • Vertex snapping: every vertex is rounded to a 0.025-unit grid in view space, so models wobble slightly as the camera moves, as they did on hardware without sub-pixel precision.
  • Affine texture mapping: textures are interpolated without perspective correction (set to full strength), so large surfaces such as the carpet warp and swim as you walk past.
  • 15-bit colour with dithering: a full-screen post-processing pass cuts each colour channel to 5 bits, the same depth as the PS1, and breaks up the banding with a 4×4 ordered (Bayer) dither.
  • Nearest-neighbour textures: textures are sampled without filtering, so each texel stays a sharp square.
  • Automatic materials: as each mesh enters the scene, its standard material is swapped for a PSX shader that keeps its texture and colour, so models come from Blender without needing hand-made materials.

Key features

  • First-person controller: a CharacterBody3D with WASD movement, jumping and gravity. The mouse turns the body left and right but tilts only the head, clamped to ±90° so the view can't flip over, and movement always follows the way the player is facing.
  • A furnished apartment: the shell (floor, walls, ceiling, windows, door frames and front door) plus six furniture models, placed to scale and lit by three dim omni lights.
  • Reusable props: each piece of furniture is its own scene that wraps the imported model with a static body and box collider, so it's solid as soon as it's dropped into a room and can be reused, as the two nightstands are.
  • Collision that fits the space: the floor and walls use triangle-mesh collision, because a convex shape would seal the doorways; the ceiling, windows and front door use simpler convex shapes. Physics runs on the Jolt engine.
  • Groundwork for what's next: the input map already has named actions for sprint, interact (E), the in-game phone (T), pause (Esc) and a debug HUD toggle (F1), and the project includes retro typefaces (Press Start 2P and VT323) and colour palettes defined in GDScript.

Engineering practices

  • Git LFS for binary assets: models, textures, fonts and audio are stored with Git LFS through .gitattributes, so the repository stays light, and text files are normalised to LF line endings.
  • No secrets or generated files in git: export presets, which can hold store keys, have been git-ignored since the first commit, along with Godot's regenerated .godot cache.
  • Third-party code kept separate and credited: the PSX plugin sits in its own addons folder with its licence, apart from my own scripts and scenes.

What I'd improve next

  • Build the systems the input map already reserves: interaction, the in-game phone, sprinting, a pause menu and the HUD, which is still an empty scene.
  • Improve how movement feels: add acceleration and friction instead of instant starts and stops, and turn mouse sensitivity and field of view into player settings rather than hard-coded values.
  • Add a check that runs the project headless in CI on every push, so a broken scene or script is caught before it reaches the main branch.