Tide A networking-first game engine

One deterministic simulation that every player shares, on desktop or in the browser, written in a language made for it.

Multiplayer by default

Rollback netcode with full server authority. Clients have no input delay, and single-player is a match too, so there's only one path to get right.

Deterministic floats

The same build and the same inputs give the same bits on every platform, the web included. Plain floats, no fixed point.

A language for the ECS

A C#-like language built around the ECS. Systems say what they read and write, and the compiler works out the rest. It compiles to C, then to native code or WebAssembly.

A schedule you can read

The compiler knows every system's data, so it plans which ones can run at the same time, and tells you why the others wait.

The web is a real platform

Every game also builds as one self-contained web page on WebGL 2, running the same simulation as desktop.

Nothing to set up

One tide command, with clang built in. Write a .tide file and run tide run. Editor support for VS Code and JetBrains IDEs.

A whole game

A game is a folder of .tide files, and needs no other code. This one bounces a ball:

tide
component Ball
{
    float2 position;
    float2 velocity = float2(160, 120);
}

scene Main { }

event(Spawned) Setup(with Main)
{
    Spawn(Ball);
}

system Move(mut Ball ball, Time time)
{
    ball.position += ball.velocity * time.dt;
    if (Math.Abs(ball.position.x) > 300) ball.velocity.x = -ball.velocity.x;
    if (Math.Abs(ball.position.y) > 200) ball.velocity.y = -ball.velocity.y;
}

view DrawBalls(Ball ball)
{
    Draw.Circle(ball.position, 20, Color.red);
}

Save it as game.tide, then run tide run in its folder. Install tide to get started, or see your first game for a longer tour.