
01 / 07 — Carthago
The desert where it all begins. The heavier the enemy, the deeper it sinks into the quicksand.
- Quicksand
- Sandstorm
Real screens from the build, before launch
A strategic tower-defence campaign on the frontiers of the Roman Empire, built in Godot for Alopix Studios: seven regions, 35 levels and 558 waves.

Brief
Grow a browser prototype into a full Roman-frontier campaign for Steam.


01Challenge
The game began as a browser prototype: a grid on a canvas, one road and five Roman tower types. The task was to grow it into a full campaign for Steam: seven regions that each play differently, strategy you can read at every step, and a build that is tested and shipped like real software.
02Approach
We built each region as its own scene with its own rules, assembled in the editor, and every enemy as an animated rig of parts, the ordinary ones pre-rendered into regional atlases. The headless test suite runs on Windows with every push to the game’s code.
03Result
The 0.9.5 playtest build holds the whole campaign: 7 regions, 35 levels and 558 waves. The game’s repository holds 200 automated test scripts and 189 commits from March to October 2026.
Highlights
CH. 01—07
Chapters
Porta Westfalica is a single-player tower-defence campaign we built for Alopix Studios in Godot 4. You play Aurelius, a young legionary who rises from Carthago to the Weser gorge through seven regions, each with its own rules. Five Roman tower families, eight enemy types and a boss in every region.
CH. 01 / 07 — Campaign
You play Aurelius, a young legionary posted to Carthago. He is promoted after every region, and the campaign map draws his road along the empire’s frontiers to Porta Westfalica, where Rome remembers him as Dux Limitis.
Route
PL. 01 — Seven regions, one road: from Carthago to the Weser
Route


Route
CH. 02 / 07 — Defence
Archers loose volleys, pilums pierce armour, the onager hits groups, barracks and cavalry hold the road. Each tower grows to Tier III; from Region III it can take one of two paid doctrines, and in the last two regions a Master upgrade too.
Towers go up beside the road; a click opens upgrade, focus and sell. You choose who each tower shoots, and when to call in Arrow Rain or Boulder Drop.
PL. 01 — Build, upgrade, aim
01
Build, upgrade, aim
Towers go up beside the road; a click opens upgrade, focus and sell. You choose who each tower shoots, and when to call in Arrow Rain or Boulder Drop.
02
Sagittarii Tower
One arrow at Tier I, four at Tier III and six on every tenth volley. Doctrines: Fire Arrows or Poison Arrows.



03
Pilum Platform
Heavy javelins that pierce armour: 72 base damage a hit at Tier III. Doctrines: a pilum that breaks armour, or a shaft through two more targets.



04
Onager Tower
Each stone also hits up to three foes around the target, and at Tier III knocks the target back. Doctrines: Shattering Stones or Shock Impact.



05
Legionary Barracks
Legionaries who hold the enemy on the road: two at Tier I, three with 400 HP each at Tier III. Doctrines: Shield Wall or Veteran Cohort.



06
Auxilia Cavalry Camp
Riders who cut off breakthroughs: one at Tier I, two at Tiers II and III. Doctrines: Scout Riders or Heavy Auxilia.



01
Build, upgrade, aim
Towers go up beside the road; a click opens upgrade, focus and sell. You choose who each tower shoots, and when to call in Arrow Rain or Boulder Drop.
02
Sagittarii Tower
One arrow at Tier I, four at Tier III and six on every tenth volley. Doctrines: Fire Arrows or Poison Arrows.



03
Pilum Platform
Heavy javelins that pierce armour: 72 base damage a hit at Tier III. Doctrines: a pilum that breaks armour, or a shaft through two more targets.



04
Onager Tower
Each stone also hits up to three foes around the target, and at Tier III knocks the target back. Doctrines: Shattering Stones or Shock Impact.



05
Legionary Barracks
Legionaries who hold the enemy on the road: two at Tier I, three with 400 HP each at Tier III. Doctrines: Shield Wall or Veteran Cohort.



06
Auxilia Cavalry Camp
Riders who cut off breakthroughs: one at Tier I, two at Tiers II and III. Doctrines: Scout Riders or Heavy Auxilia.



CH. 03 / 07 — Regions
Every region adds a rule of its own: the sand drags at the heavy, the wind stretches and shrinks your range, gates get breached. Seven battlefields, and every frame here is from the game itself.
Carthago
The desert where it all begins. The heavier the enemy, the deeper it sinks into the quicksand.
PL. 01 — Carthago

01 / 07 — Carthago
The desert where it all begins. The heavier the enemy, the deeper it sinks into the quicksand.

02 / 07 — Judea
Two roads take turns: Path A on odd waves, Path B on even ones, and a trail on the ground shows which is next.

03 / 07 — Syria
The wind turns every 5–10 seconds: downwind, archer range grows by 15%; upwind, it drops by 20%.

04 / 07 — Britannia
Three gates the enemy can breach to open new lanes, repaired with gold. The region’s motto: “The battlefield remembers”.

05 / 07 — The Alps
Snowy passes. After a countdown a rockfall leaves rubble that slows the enemy, and some waves send an engineer you must protect while he repairs your towers.

06 / 07 — Germania
Dense forest, bogs and ambushes along upper and deep forest trails. Before the boss, a war council gives you a choice.

07 / 07 — Porta Westfalica
The finale: three lanes through the gorge, a bridge, a gate and nine mechanics that arrive level by level.

01 / 07 — Carthago
The desert where it all begins. The heavier the enemy, the deeper it sinks into the quicksand.

02 / 07 — Judea
Two roads take turns: Path A on odd waves, Path B on even ones, and a trail on the ground shows which is next.

03 / 07 — Syria
The wind turns every 5–10 seconds: downwind, archer range grows by 15%; upwind, it drops by 20%.

04 / 07 — Britannia
Three gates the enemy can breach to open new lanes, repaired with gold. The region’s motto: “The battlefield remembers”.

05 / 07 — The Alps
Snowy passes. After a countdown a rockfall leaves rubble that slows the enemy, and some waves send an engineer you must protect while he repairs your towers.

06 / 07 — Germania
Dense forest, bogs and ambushes along upper and deep forest trails. Before the boss, a war council gives you a choice.

07 / 07 — Porta Westfalica
The finale: three lanes through the gorge, a bridge, a gate and nine mechanics that arrive level by level.
CH. 04 / 07 — The enemy
Nothing arrives unannounced: before every wave the preview names the formation and how to stop it. The surprise is in the mix: each region draws from its own pool of formations, and five regions also hold a crisis wave.
Siege Column
A ram and its armoured escort lead. The counter: focus the armoured, break armour with javelins, stall them with barracks.
| Waves arrive in formation | ||||||
|---|---|---|---|---|---|---|
| CarthagoI | Appears in this region | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Judea HighlandsII | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Not in this region |
| Syria FrontierIII | Appears in this region | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Britannia LimesIV | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Not in this region | Appears in this region |
| Alpine-Gaul TransitV | Appears in this region | Appears in this region | Not in this region | Appears in this region | Appears in this region | Not in this region |
| Inner GermaniaVI | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Porta WestfalicaVII | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Appears in this region | 5/7 | 5/7 | 6/7 | 7/7 | 6/7 | 5/7 |
| Waves arrive in formation | Siege Column | Shield Wall Push | Harass Screen | Fast Pack | Mixed Assault | Crisis wave |
|---|---|---|---|---|---|---|
| CarthagoI | Appears in this region | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Judea HighlandsII | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Not in this region |
| Syria FrontierIII | Appears in this region | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Britannia LimesIV | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Not in this region | Appears in this region |
| Alpine-Gaul TransitV | Appears in this region | Appears in this region | Not in this region | Appears in this region | Appears in this region | Not in this region |
| Inner GermaniaVI | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Porta WestfalicaVII | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Appears in this region | 5/7 | 5/7 | 6/7 | 7/7 | 6/7 | 5/7 |
| Waves arrive in formation | Siege Column | Shield Wall Push | Harass Screen | Fast Pack | Mixed Assault | Crisis wave |
|---|---|---|---|---|---|---|
| CarthagoI | Appears in this region | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Judea HighlandsII | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Not in this region |
| Syria FrontierIII | Appears in this region | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Britannia LimesIV | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Not in this region | Appears in this region |
| Alpine-Gaul TransitV | Appears in this region | Appears in this region | Not in this region | Appears in this region | Appears in this region | Not in this region |
| Inner GermaniaVI | Not in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Porta WestfalicaVII | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region | Appears in this region |
| Appears in this region | 5/7 | 5/7 | 6/7 | 7/7 | 6/7 | 5/7 |
CH. 05 / 07 — Porta Westfalica
The last region, assembled before your eyes: ground, three lanes, a bridge and a gate, then the forest. Its five levels bring patrols, ridge ambushes, bridge saboteurs and a feint that releases the lanes one by one.
The Weser gorge
River, hills and rock: the bottom layer of the scene, one whole image that everything else is placed on.
From layers to battle

01 / 05 — Ground
The Weser gorge
River, hills and rock: the bottom layer of the scene, one whole image that everything else is placed on.
From layers to battle

02 / 05 — Roads
Three lanes
The roads trace three lanes: the main road over the bridge, the ridge and the riverbank. The ridge opens in Level 2, the riverbank in Level 3.
From layers to battle

03 / 05 — Bridge & gate
The bridge and the gate
The stone bridge, and the timber gate with its palisade. Towers near the bridge attack 8% faster until a saboteur breaks control of the bridge.
From layers to battle

04 / 05 — Forest
Forest and storm
Trees, stones and a hill finish the scene, while rain and clouds pass above the troops. Forest cover on the ridge hides the ambushers.
From layers to battle

05 / 05 — Battle
Wave 25 of 25
The Gatebreaker takes the main road: a Bridge Assault, then three phases up to all three lanes. A well-played region leaves him less support.
From layers to battle

01 / 05 — Ground
The Weser gorge
River, hills and rock: the bottom layer of the scene, one whole image that everything else is placed on.
From layers to battle

02 / 05 — Roads
Three lanes
The roads trace three lanes: the main road over the bridge, the ridge and the riverbank. The ridge opens in Level 2, the riverbank in Level 3.
From layers to battle

03 / 05 — Bridge & gate
The bridge and the gate
The stone bridge, and the timber gate with its palisade. Towers near the bridge attack 8% faster until a saboteur breaks control of the bridge.
From layers to battle

04 / 05 — Forest
Forest and storm
Trees, stones and a hill finish the scene, while rain and clouds pass above the troops. Forest cover on the ridge hides the ambushers.
From layers to battle

05 / 05 — Battle
Wave 25 of 25
The Gatebreaker takes the main road: a Bridge Assault, then three phases up to all three lanes. A well-played region leaves him less support.
From layers to battle

CH. 06 / 07 — Engineering
The game began as a prototype in plain HTML and JavaScript. By the time its repository was created, a Godot 4 port ran beside it; in the first days the code was split into simulation, rendering, input and data, the base everything since has grown on.
A 1100×620 canvas, “L1” circles for towers, dots for enemies, a first region already named Porta Westfalica. The towers kept their names and prices.
PL. 01 — The prototype
01
The prototype
A 1100×620 canvas, “L1” circles for towers, dots for enemies, a first region already named Porta Westfalica. The towers kept their names and prices.

02
Strategy you can read
After every level a Battle Report says what worked and what went wrong, and the Strategy Codex explains the enemies, formations and doctrines.
Readable and accessible
In-game screens and settings
03
Characters made of parts
Each enemy is a rig of separate parts, anchored for four directions. Ordinary enemies are pre-rendered into seven regional atlases.

04
A living loading screen
After the studio ident, the menu and active region load on a separate thread behind a five-second living illustration. Reduced Motion keeps it still.
05
A gate that tests itself
Every push to the game’s code boots the official Godot 4.7.2 on Windows and runs the headless suite. Any error fails it, even after a PASS.
Headless release gate
GitHub Actions · windows-latest
01
The prototype
A 1100×620 canvas, “L1” circles for towers, dots for enemies, a first region already named Porta Westfalica. The towers kept their names and prices.

02
Strategy you can read
After every level a Battle Report says what worked and what went wrong, and the Strategy Codex explains the enemies, formations and doctrines.
Readable and accessible
In-game screens and settings
03
Characters made of parts
Each enemy is a rig of separate parts, anchored for four directions. Ordinary enemies are pre-rendered into seven regional atlases.

04
A living loading screen
After the studio ident, the menu and active region load on a separate thread behind a five-second living illustration. Reduced Motion keeps it still.
05
A gate that tests itself
Every push to the game’s code boots the official Godot 4.7.2 on Windows and runs the headless suite. Any error fails it, even after a PASS.
Headless release gate
GitHub Actions · windows-latest
CH. 07 / 07 — Result
From the repository’s first commit on 5 March to the 0.9.5 playtest package on 5 October 2026: the whole campaign, tested automatically on every push.
levels across 7 regions
waves in the campaign
lines of GDScript in the game
automated test scripts
pre-rendered animation frames
commits in the game’s repository

PL. 01—04




Contact
Want something like this?
30 minutes, no commitment. You’ll leave with concrete ideas for your website, processes or product.
Pick a time that suits you in our calendar.
Tell us about the project. We reply within a few hours on business days.
Tell us about the project. We reply within a few hours on business days.