Skip to content
Alejandro ArandaAlejandro Aranda
Back to projects
6 min readProjects

Centurion, from a childhood memory to a web remake

Some games stay with you without you knowing quite why. Centurion: Defender of Rome was one of them. I played it as a kid, and for years I remembered it as a map of the Mediterranean full of legions moving from province to province, like pieces on a board that seemed to have no end.

Not long ago I played it again on archive.org. I started out of curiosity and ended up spending the whole afternoon on it, like going back to a childhood home and finding the rooms smaller than you remembered. Going back to a game from more than thirty years ago feels a bit like digging something up: you recognise the ideas that worked, and you also notice what time has worn away. That is where the question behind this project came from: what would it look like if that game existed today, in the browser, with nothing to install?

The idea behind the remake

The goal was never to copy the original. It was to recover its essence: the campaign on the map of Rome, diplomacy with the neighbouring peoples, the battles and the circus games. The original had 27 provinces. This remake has 53, expanded in the same spirit, and the map is now a 3D war table you can rotate, zoom into and read like an old map held up to the light.

The project is called CENTVRION · Vincere Mare Nostrum. The name sounds like conquest, and that is exactly what the game asks of you: think, advance, and try again when a province slips away.

How it was made

1. Respect for the original and licences

I have respected the material of the original game. The repository contains nothing from that game: no art, portraits, backgrounds or text. Respecting a game does not only mean not copying it; it means building from somewhere else, with materials of your own or with licences that make clear what can be done with them. It is an unofficial remake, and everything published is released under explicit licences:

  • Code: AGPL-3.0.
  • Art and text: CC BY-NC-SA 4.0.
  • Third-party libraries: three.js and OrbitControls under the MIT licence; the Cinzel and Inter fonts under the SIL Open Font License 1.1.
  • Terrain data: public sources (AWS Terrain Tiles and NASA Blue Marble), credited in the README.

2. The engine

The game is written in plain JavaScript, with no frameworks, the way you might raise a house with simple tools. The engine is deterministic: the same seed and the same orders always produce the same game. If something goes wrong, I can rewind like a tape and see exactly what happened. It runs 58 automated checks, and bots play complete games to catch problems before a player does.

Battles come in two modes: the classic turn-based one, and a real-time one where orders are drawn with the mouse, as in the original manual. The naval battle has its own 3D ships, moving over the water with their wake trailing behind them.

3. The map

The map is built with Three.js. The terrain comes from public elevation data (AWS Terrain Tiles, which combines SRTM, ETOPO1 and GEBCO), and the surface uses NASA Blue Marble imagery. When you zoom in, the land sharpens with higher-resolution tiles, and suddenly the Apennines appear under your legions as if they had always been there.

The province map comes from the map of the Roman Empire we use on mappuzzle: mappuzzle.xyz/map/roman-empire.

Each city is a small 3D model, 53 in total. I generated them from reference images with TRELLIS, cleaned them up and fitted them to the terrain, until each one seems to belong to its landscape.

Title screen of the Centurion remake
The title screen: new artwork, made for the remake.

4. Art, portraits and sound

The event illustrations, battle backgrounds, leader portraits and the 54 town emblems are new art, generated with AI image tools and reviewed by hand, one by one. Each emblem is a little coat of arms: a Capitoline she-wolf, a Tarentine dolphin, a Gallic carnyx or a Carthaginian elephant. The gladiators were modelled in Blender without the interface, and they are animated with a rig I wrote for Three.js.

The music is not recorded. It is synthesised live with the Web Audio API, note by note, with no samples. The game does not load a single audio file: all the sound is born in the browser, as if a musician never quite stopped playing.

5. Two languages

The code is written in Spanish, and the English text comes from a dictionary of phrases. A project tool checks that no interface phrase is left untranslated. Translating a game means hearing it in another voice, and the goal is for it to feel just as natural in both languages.

6. The prologue

The prologue opens with the sky: a reddish sunset, the black silhouettes of a round temple, which is Vesta, and a crested helmet, which is Mars, and a horizon line that turns and divides the two gods. Then the story of Rome unfolds in two parts.

The first part is the myth. Rhea Silvia, a vestal, and Mars are the parents of Romulus and Remus. Cast into the Tiber, the twins run aground under a fig tree, where a she-wolf finds them and suckles them. When the augury comes, Remus sees six vultures and Romulus twelve, and each claims the right to found the city. Remus leaps over the walls his brother had begun to raise, and Romulus kills him with the words the video quotes: "Thus perish whoever leaps my walls," according to Livy. Brotherhood breaks there, and with it begins the history of Rome. The video ends with the seven hills and the year 753 BC, the traditional date of the founding: one city, seven hills, and a year that marks the starting point of everything that follows.

The second part is the expansion. The map of Italy and the Mediterranean fills with arcs leaving from Rome, and the empire spreads like oil on water: first the Republic, Brennus sacking Rome in 390 BC, the Samnite Wars and Pyrrhus of Epirus, until Rome takes Italy. Then come the Punic Wars and Hannibal, Hispania, Pergamum and Narbonensis; Pompey in the East, Caesar in Gaul and Augustus. The last act is the most revealing: Trajan, at the empire's greatest extent, and then the map rewinds to 275 BC, when it was still only Italy. That is where your campaign begins.

Here is the prologue, in English:

7. Programming with AI help

I started with Antigravity and Gemini. The results were poor and slow, like working with an eager apprentice who takes a long time to understand what you need, but they got me a first working prototype of what the game later became. Then I continued with Claude, using my own skills, which I have been refining over the last while. With them, the work feels more like directing a team than dictating every line.

What is left

What needs the most work is the graphics of the circus games, especially the chariot race: there the game still falls short next to everything else. Otherwise the game is fully functional and a lot of fun to play, from start to finish.

You can play it at centurion.mappuzzle.xyz.

You may also like