← Back to Projects
Ready To Race Unlimited cover
Web Game · Racing & Betting

Ready To Race Unlimited

The same racing arena as Horse Racing Elite, rebuilt around supercars. There are six cars, live betting and a smooth 60fps race, and you can play solo or in multiplayer rooms.

Role
  • Developer
  • Vibe coder
Genre
  • Racing arena
  • Win betting
Modes
  • Solo
  • Multiplayer rooms
Stack
  • Next.js
  • React
  • TypeScript
Multiplayer
Firebase Realtime Database
Platform
  • Browser
  • Game Engine arcade

01The Game

Ready To Race Unlimited takes the Horse Racing Elite arena and gives it a completely new look built around supercars. The grid has a Ferrari 488 GTB, a Porsche 911 Turbo, a Lamborghini Huracán, a Bugatti Chiron, a Mazda RX-7 and a Nissan GT-R, all racing on a deep violet neon track.

Underneath, it runs on exactly the same engine: a seeded race with a fixed timestep, where the animation you see is the calculation itself. Building it taught me a lot about how to fork a game properly, including what should be shared between the two, what needs to be kept separate and what shouldn’t be copied at all.

One engine, two games

The racing arena works as a reusable engine, and this game is the second look built on top of it.

Simulated outcomes

The game never chooses a winner. Six cars race through a seeded physics loop, and the first one across the line wins.

Rooms for everyone

You can play solo or in multiplayer rooms with invite codes. These rooms are kept completely separate from the horse racing game’s rooms.

02Screenshots

These screenshots were captured straight from the game. Tap any of them to see it bigger.

03Core Loop

  1. 1

    Grid

    Play on your own, or create a multiplayer room or join one.

  2. 2

    Bet

    Choose one of the six cars and place your bet before betting closes.

  3. 3

    Sync

    The room’s seed is fetched and shared, so every player’s game runs the same race.

  4. 4

    Race

    The race runs as a fixed-step simulation, with cars overtaking each other live.

  5. 5

    Payout

    If you backed the winner, you collect your stake multiplied by the odds.

04Key Features

Six supercars

Every car has a speed stat and an acceleration stat (which is really the engine’s stamina field with a new name), and the odds range from 2.5× to 12×.

Multiplayer rooms

The Firebase rooms use their own section of the database, so the two racing games never get mixed up with each other.

Violet neon skin

Orange, cyan and pink highlights sit over a deep violet background, and you can switch between Default, Cyber and eSports palettes.

Bots & bounty

There are AI rivals, a live feed of bets, ranks, seasons and a daily bounty.

05The Maths

The maths is exactly the same as Horse Racing Elite because the code is the same. I confirmed it by running all 10,001 seeds through it.

Velocity & ticks

Each car’s starting speed is a mix of 60% speed and 40% acceleration, plus a random amount. Then every 16ms, a small, limited amount of random jitter is added.

Payout

You bet on a car to win, and the payout includes your stake: floor(stake × odds).

Audit result

Every car wins about one race in six, which means the fair price for each one is 6.0×. Because the fork simply copied values by position, the Ferrari ended up with Thunder Bolt’s numbers. The tutorial line saying that lower odds mean a safer pick also isn’t true for this simulation.

Fix

Either give all six cars the same odds, set a little under 6.0×, or make the stats affect every tick and set new odds based on the measured win rates. Either way, the tutorial text needs to be corrected too.

06Under the Hood

A clean fork

I changed the names, the colours and added a field for the car sprites. The engine, the game loop and the economy stayed the same as the horse game’s design.

Database namespacing

Rooms are stored under their own Firebase path, so horse rooms and car rooms can’t see each other.

Fixed-timestep loop

It uses the same accumulator loop, which gives identical results at any refresh rate.

Seeded races

Seeds come from the RNG service through the server proxy, with a local fallback in case the service is unavailable.

07Challenges & Solutions

ChallengeWhen you fork a game, you end up with duplicated data, and the two versions slowly start to behave differently.
SolutionI kept a single engine design, gave the multiplayer data its own namespace and wrote down every difference between the two games.
ChallengeThe engine was built for horses, but the text and stats needed to make sense for cars.
SolutionI renamed stamina to acceleration in the interface, without changing any of the maths underneath.

08Results & Takeaways

2
games from one racing engine
60 FPS
fixed-step race loop
6
supercars on the grid
Next.jsReactTypeScriptFirebase RTDBrequestAnimationFrameCSS tokensVibe coding
  • A second full game built on the same engine, with its own look and its own multiplayer namespace.
  • A written comparison of the two versions, listing every shared value and every change in behaviour.

What I learned

  • Giving a game a new look is easy, but forking it well is hard. Logic that both games share should live in one place.
  • The text is part of the maths too. What the tutorial says has to match what the engine actually does.