Retronauts

Retronauts is a multiplayer party game in which two players battle against each other to change a scene from the past.

Each player takes control of a titular Retronaut, a mysterious time traveller that has a list of seemingly innocuous things to change in a seemingly innocent room from the past. But who knows, one slight detail changed in the past could have massive consequences for the mysterious organisations from the future that have hired these agents...

We hope you enjoy the culmination of our years of study concentrated into three full days and two sleepless nights.

The Flex

Retronauts is a submission for the Ground Zero track. It is a display of the very best of our technical skills. Retronauts is born from our passion for hackathons and love for creating unique, interactable works of art. This project displays: • 3D modelling, texturing, and composition with Blender, • 3D game development with Three.js and frontend state management with Zustand, • Industry standard multiplayer networking architecture with a Rust server, • CI/CD deployments with Docker. We believe we’ve demonstrated not only the makings of a full-stack app, but have truly communicated the child-like joy of creation in software development

The Game

The frontend for Retronauts is powered by Three.js, handled through React Three Fiber. Under standard multiplayer networking protocols, the frontend does an initial validation player movement, ensuring that they can move through terrain. Then, positional updates through the server for further validation (game state checking, AABB restraints, etc). On every server tick, the frontend receives a game state representation of the entire scene and interpolates the previous game state to the current game state. This uses an interpolation buffer in order to account for ongoing game states and lost packets, ensuring that the players have a seamless experience with no lost data.

On top of this 3D game, there is also a standard web frontend structure. Game state management is handled through Zustand, while schema validation through WebSockets and exposed REST APIs are handled through Zod and TanStack Query.

We ran out of time to fully flesh out client-side interpolation, notably missing out on client-side prediction.

The Networking

For Retronauts, we've decided to use the WebSocket protocol to communicate with our game server, written in Rust and powered by rocket.rs. The Rust server handles all of the game state, including the players position, the objects they've interacted with, and ultimately who wins the game at the end. All control of the flow of the game happens server side too. Combine this with a smooth 120 Hz tick rate allows a responsive game session between two players.

While unfortunately we ran out of time to have the ability for multiple rooms, the current deployment works well as a single, locked-down room in which only two players can play at a time, opening up a spot when one or more players leave, and complete with a lobby system that allows players to explore the environment while they wait for a partner.

The Charm

Each model has been uniquely hand crafted by our talented 3D modeller and rigged with Mixamo, drawing on themes of nostalgia from the past.

The Deployment

The culmination of this project is the industry standard CI/CD practices of the project, complete with an easy deployment process that immediately deploys a Dockerised container off of the most recent commit to main.

Beyond that, we have a handy docker build script to give us an exact replica on our local machine for complete integration testing, as well as providing you with an easy way to run this locally too!

Share this project:

Updates