Background

Backrooms: Origins

Case Study
Roblox Studioroblox-tsTypeScriptRojomatterGitFusionTestEZHoarcekatRemodelLune

I’ve coordinated a small team of mesh, VFX, and image artists regarding every development done in Roblox Studio, while being responsible for all of the game scripting and DevOps. Backrooms art

A tech demo is available.

Backrooms: Origins has been made in two editions — multiplayer, and story (campaign) mode. Right now, only a demo of the story mode is available.

Below, some of the core features I’ve programmed will be outlined.

Procedurally generating infinite worlds

Slide image
Slide image

Backrooms: Origins features a custom made, procedural infinite world generator. The world keeps generating until infinite distance (*tested up to 1 million studs).

To support fast load times, the world only renders chunks in a sphere around the player. To keep FPS high, these are dynamically unloaded when not in view. Furthermore, these chunks are split into 12 by 12 stud tiles.

The features for the map generator include:

  • Modularity: Multiple generation types are supported, and the map system can choose which type of level to generate.
  • Performance: As the map generates on server startup — and thus right when players join — the map should generate in a reasonable amount of time.
  • Determinism: If the same map seed is provided, the map generates exactly the same, even if players walk around the world differently.
  • Monuments: The generator spawns different ‘monuments’ around the world — larger, multi-chunk preset structures (most of which are also procedurally generated). These shape the world around them, and always have corridors entering them.

Fully interactive operating system

SunshineOS login screen

“Sunshine OS” is a core part of Backrooms: Origins, representing both the lobby, but also an important gameplay element to convey the story.

It is an interface made in around 6,000 lines of roblox-ts and Fusion code, with the design inspired by Windows 98, SerenityOS, and THE_ABYSS_HAS_WALLS, with features such as:

  • Minimize, maximize, drag, reorder, resize windows
  • File explorer
  • Draggable & interactive desktop icons
  • Arcade games such as Snake and Minesweeper
  • Media viewer (images and videos)
  • Start menu
  • Taskbar
  • Messenger client
  • Email client

Custom video player

Backrooms: Origins features a custom made video player. It uses:

  • No EditableImage
  • No VideoFrame

As they weren’t publicly usable yet.

Instead, videos are played by manipulating hundreds of Frame instances every second. To achieve this, a frame by frame playback algorithm is employed.

To store video content efficiently, while respecting players’ bandwidth, I’ve made a custom video format called SRVF, that stores frame by frame diffs and metadata.

SRVF files are generated by using a Node-based CLI that uses ffmpeg to extract frame data.

Furthermore, the video files are compressed using the DEFLATE algorithm and are serialized to a Studio compatible format by getting split up into multiple ModuleScripts. These are generated at build time then packaged into a rbxm using a Lune script.

Custom character controller and camera

Backrooms: Origins features a custom made character controller based on physics parts. To complement it, custom camera code is employed, compatible with all input methods such as touch and controller.

Dynamic entities and world interactions

Multiple ‘entities’ (monsters) are implemented in the game, featuring their own pathfinding, animations, noises, and jumpscares.

The game features scannable objects for objective completion, and various easter eggs.

Matchmaking

The multiplayer edition of Backrooms: Origins features a party based matchmaking system that uses MemoryStoreService, wherein multiple players are able to queue up and start a game, following the host’s configuration for the match.

An auto-rejoin system is also included — if a player gets disconnected during a match, and they rejoin the main game, they are asked if they’d like to rejoin the in-progress match.

Contact

Have a project in mind? Let‘s connect: