Skip to content

Porta Westfalica

Pre-launch

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.

Syria Frontier, Level 3: a Tier III Sagittarii Tower and the choice between Fire Arrows and Poison Arrows, 20 gold each, under the game’s battle HUD
FIG. 01 — Porta Westfalica · Video games
Client
Alopix Studios
Industry
Video games
Status
Pre-launch
What we built
PC game
Stack
Godot 4.7 · GDScript · GL Compatibility · GitHub Actions · Python · PowerShell
Services
Game development in Godot 4 · Gameplay systems & balance · Game UI/UX · Level building · Animation & art pipeline · Testing & builds

FIG. 02 — Anatomy

Brief

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

Syria Frontier, Level 3: a Tier III Sagittarii Tower and the choice between Fire Arrows and Poison Arrows, 20 gold each, under the game’s battle HUD
Syria Frontier, Level 3: a Tier III Sagittarii Tower and the choice between Fire Arrows and Poison Arrows, 20 gold each, under the game’s battle HUD
A — Interface
A Roman UI in gold and oxblood: the battle HUD, tower details and the doctrine choice
B — Logic
A simulation of towers, enemies, formations and regional rules at 1×, 2× or 3× speed
C — Data
Typed Godot resources: 9 enemy types with the boss, 7 regions, 5 towers with 3 tiers each

Approach

  1. 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.

  2. 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.

  3. 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

  • 01A boss in every region and a three-lane finale
  • 025 Roman tower families, 10 doctrines and 10 Master upgrades
  • 03A mechanic of its own in every region, nine in the finale
  • 04200 test scripts; the headless suite runs on every push
Skip the chapters ↓

How it’s built

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.

  1. 01From Carthago to the Weser gorge
  2. 02Five towers, three tiers, then a doctrine
  3. 03Every region plays by its own rules
  4. 04Waves arrive in formation
  5. 05Read the feint, hold the gate
  6. 06From a browser prototype to Godot
  7. 07Seven months, 35 levels, one campaign

CH. 01 / 07 — Campaign

From Carthago to the Weser gorge

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

  1. 01Seven regions, one road: from Carthago to the Weser
  2. 02I · Carthago — Miles, legionary
  3. 03II–III · Judea and Syria — Tesserarius, Optio
  4. 04IV · Britannia — Centurio
  5. 05V · The Alps — Primus Pilus
  6. 06VI–VII · Germania and Porta Westfalica — up to Dux
Open the full image (opens in a new tab)
The campaign map: the Mediterranean and Europe with seven forts numbered I to VII, Rome, the pyramids, the Acropolis and the red lines of the frontier
The campaign map: the Mediterranean and Europe with seven forts numbered I to VII, Rome, the pyramids, the Acropolis and the red lines of the frontier

Route

  1. 01Seven regions, one road: from Carthago to the Weser
  2. 02I · Carthago — Miles, legionary
  3. 03II–III · Judea and Syria — Tesserarius, Optio
  4. 04IV · Britannia — Centurio
  5. 05V · The Alps — Primus Pilus
  6. 06VI–VII · Germania and Porta Westfalica — up to Dux
Open the full image (opens in a new tab)

CH. 02 / 07 — Defence

Five towers, three tiers, then a doctrine

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.

  • First · strongest · fastest
  • Arrow Rain · Boulder Drop

PL. 01 — Build, upgrade, aim

  1. 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.

    • First · strongest · fastest
    • Arrow Rain · Boulder Drop
  2. 02

    Sagittarii Tower

    One arrow at Tier I, four at Tier III and six on every tenth volley. Doctrines: Fire Arrows or Poison Arrows.

    • 25 gold
    • Fire · Poison Arrows
    1. Sagittarii Tower, Tier I: the sprite from the game
      01 / 03
    2. Sagittarii Tower, Tier II: the sprite from the game
      02 / 03
    3. Sagittarii Tower, Tier III: the sprite from the game
      03 / 03
  3. 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.

    • 50 gold
    • Armor-Break · Piercing Shaft
    1. Pilum Platform, Tier I: the sprite from the game
      01 / 03
    2. Pilum Platform, Tier II: the sprite from the game
      02 / 03
    3. Pilum Platform, Tier III: the sprite from the game
      03 / 03
  4. 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.

    • 75 gold
    • Up to 3 foes around the target
    1. Onager Tower, Tier I: the sprite from the game
      01 / 03
    2. Onager Tower, Tier II: the sprite from the game
      02 / 03
    3. Onager Tower, Tier III: the sprite from the game
      03 / 03
  5. 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.

    • 100 gold
    • Shield Wall · Veteran Cohort
    1. Legionary Barracks, Tier I: the sprite from the game
      01 / 03
    2. Legionary Barracks, Tier II: the sprite from the game
      02 / 03
    3. Legionary Barracks, Tier III: the sprite from the game
      03 / 03
  6. 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.

    • 125 gold
    • Scout Riders · Heavy Auxilia
    1. Auxilia Cavalry Camp, Tier I: the sprite from the game
      01 / 03
    2. Auxilia Cavalry Camp, Tier II: the sprite from the game
      02 / 03
    3. Auxilia Cavalry Camp, Tier III: the sprite from the game
      03 / 03
  1. 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.

    • First · strongest · fastest
    • Arrow Rain · Boulder Drop
  2. 02

    Sagittarii Tower

    One arrow at Tier I, four at Tier III and six on every tenth volley. Doctrines: Fire Arrows or Poison Arrows.

    • 25 gold
    • Fire · Poison Arrows
    1. Sagittarii Tower, Tier I: the sprite from the game
      01 / 03
    2. Sagittarii Tower, Tier II: the sprite from the game
      02 / 03
    3. Sagittarii Tower, Tier III: the sprite from the game
      03 / 03
  3. 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.

    • 50 gold
    • Armor-Break · Piercing Shaft
    1. Pilum Platform, Tier I: the sprite from the game
      01 / 03
    2. Pilum Platform, Tier II: the sprite from the game
      02 / 03
    3. Pilum Platform, Tier III: the sprite from the game
      03 / 03
  4. 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.

    • 75 gold
    • Up to 3 foes around the target
    1. Onager Tower, Tier I: the sprite from the game
      01 / 03
    2. Onager Tower, Tier II: the sprite from the game
      02 / 03
    3. Onager Tower, Tier III: the sprite from the game
      03 / 03
  5. 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.

    • 100 gold
    • Shield Wall · Veteran Cohort
    1. Legionary Barracks, Tier I: the sprite from the game
      01 / 03
    2. Legionary Barracks, Tier II: the sprite from the game
      02 / 03
    3. Legionary Barracks, Tier III: the sprite from the game
      03 / 03
  6. 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.

    • 125 gold
    • Scout Riders · Heavy Auxilia
    1. Auxilia Cavalry Camp, Tier I: the sprite from the game
      01 / 03
    2. Auxilia Cavalry Camp, Tier II: the sprite from the game
      02 / 03
    3. Auxilia Cavalry Camp, Tier III: the sprite from the game
      03 / 03

CH. 03 / 07 — Regions

Every region plays by its own rules

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.

  • Quicksand
  • Sandstorm

PL. 01 — Carthago

  1. Carthago, Level 4: a column of raiders with torches on the sandy road between palms and ruins

    01 / 07 — Carthago

    The desert where it all begins. The heavier the enemy, the deeper it sinks into the quicksand.

    • Quicksand
    • Sandstorm
  2. Judea Highlands, Level 4: a long enemy column led by wagon rams turns the corner past an archer tower

    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.

    • Path A · Path B
    • Terraces and ravines
  3. Syria Frontier, Level 4: stones from a Boulder Drop crash onto a siege column on the terracotta road

    03 / 07 — Syria

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

    • Wind: +15% / −20%
    • Caravan roads
  4. Britannia Limes: shield-bearer columns heading for the timber gate wall on the left, against an archer tower, an onager, a pilum platform and legionaries

    04 / 07 — Britannia

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

    • 3 gates
    • Rain and mud
  5. Alpine-Gaul Transit, Level 4: a snowy switchback road, snow-covered wagons and four enemy shield bearers with golden shields

    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.

    • Rockfall
    • Alpine mist
  6. Inner Germania, wave 25 of 25: a boss in a wolf-pelt hood and green cloak, axe raised, among the warbands in the bog forest

    06 / 07 — Germania

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

    • Ambushes
    • Forest fog
  7. Porta Westfalica in the rain: an enemy column with torches crosses the bridge as Roman archers loose a volley

    07 / 07 — Porta Westfalica

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

    • 3 lanes · 9 mechanics
    • Storm and fog
  1. Carthago, Level 4: a column of raiders with torches on the sandy road between palms and ruins

    01 / 07 — Carthago

    The desert where it all begins. The heavier the enemy, the deeper it sinks into the quicksand.

    • Quicksand
    • Sandstorm
  2. Judea Highlands, Level 4: a long enemy column led by wagon rams turns the corner past an archer tower

    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.

    • Path A · Path B
    • Terraces and ravines
  3. Syria Frontier, Level 4: stones from a Boulder Drop crash onto a siege column on the terracotta road

    03 / 07 — Syria

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

    • Wind: +15% / −20%
    • Caravan roads
  4. Britannia Limes: shield-bearer columns heading for the timber gate wall on the left, against an archer tower, an onager, a pilum platform and legionaries

    04 / 07 — Britannia

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

    • 3 gates
    • Rain and mud
  5. Alpine-Gaul Transit, Level 4: a snowy switchback road, snow-covered wagons and four enemy shield bearers with golden shields

    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.

    • Rockfall
    • Alpine mist
  6. Inner Germania, wave 25 of 25: a boss in a wolf-pelt hood and green cloak, axe raised, among the warbands in the bog forest

    06 / 07 — Germania

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

    • Ambushes
    • Forest fog
  7. Porta Westfalica in the rain: an enemy column with torches crosses the bridge as Roman archers loose a volley

    07 / 07 — Porta Westfalica

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

    • 3 lanes · 9 mechanics
    • Storm and fog

CH. 04 / 07 — The enemy

Waves arrive in formation

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.

  • Appears in this region
  • Not in this region
  • Only Porta Westfalica uses all five formations.
  • Up to 50 enemies per wave.
Waves arrive in formation
Waves arrive in formation
CarthagoIAppears in this regionNot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Judea HighlandsIINot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionNot in this region
Syria FrontierIIIAppears in this regionNot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Britannia LimesIVAppears in this regionAppears in this regionAppears in this regionAppears in this regionNot in this regionAppears in this region
Alpine-Gaul TransitVAppears in this regionAppears in this regionNot in this regionAppears in this regionAppears in this regionNot in this region
Inner GermaniaVINot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Porta WestfalicaVIIAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Appears in this region5/75/76/77/76/75/7
Waves arrive in formation
Waves arrive in formationSiege ColumnShield Wall PushHarass ScreenFast PackMixed AssaultCrisis wave
CarthagoIAppears in this regionNot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Judea HighlandsIINot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionNot in this region
Syria FrontierIIIAppears in this regionNot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Britannia LimesIVAppears in this regionAppears in this regionAppears in this regionAppears in this regionNot in this regionAppears in this region
Alpine-Gaul TransitVAppears in this regionAppears in this regionNot in this regionAppears in this regionAppears in this regionNot in this region
Inner GermaniaVINot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Porta WestfalicaVIIAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Appears in this region5/75/76/77/76/75/7
  • Appears in this region
  • Not in this region
  • Only Porta Westfalica uses all five formations.
  • Up to 50 enemies per wave.
01Siege Column
A ram and its armoured escort lead. The counter: focus the armoured, break armour with javelins, stall them with barracks.
02Shield Wall Push
Shield Bearers and medium troops ahead of the light ranks. Counter: javelins against the armour, onager splash before the light ranks.
03Harass Screen
A screen first, then raiders who go for the towers. Counter: barracks or cavalry in front of the towers, early focus on the saboteurs.
04Fast Pack
A shock unit, then war dogs, each at its own pace. Counter: Fastest focus, archer cover and cavalry to intercept them.
05Mixed Assault
Armoured and medium troops ahead of the light support. Counter: change the target focus and cover both the front and the support.
06Crisis wave
In five regions, longer levels hold one late crisis wave: a mercenary raid, sandstorm push, gate assault, Teutoburg Echo or split-lane sabotage.
Waves arrive in formation
Waves arrive in formationSiege ColumnShield Wall PushHarass ScreenFast PackMixed AssaultCrisis wave
CarthagoIAppears in this regionNot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Judea HighlandsIINot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionNot in this region
Syria FrontierIIIAppears in this regionNot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Britannia LimesIVAppears in this regionAppears in this regionAppears in this regionAppears in this regionNot in this regionAppears in this region
Alpine-Gaul TransitVAppears in this regionAppears in this regionNot in this regionAppears in this regionAppears in this regionNot in this region
Inner GermaniaVINot in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Porta WestfalicaVIIAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this regionAppears in this region
Appears in this region5/75/76/77/76/75/7
  • Appears in this region
  • Not in this region
  • Only Porta Westfalica uses all five formations.
  • Up to 50 enemies per wave.
01Siege Column
A ram and its armoured escort lead. The counter: focus the armoured, break armour with javelins, stall them with barracks.
02Shield Wall Push
Shield Bearers and medium troops ahead of the light ranks. Counter: javelins against the armour, onager splash before the light ranks.
03Harass Screen
A screen first, then raiders who go for the towers. Counter: barracks or cavalry in front of the towers, early focus on the saboteurs.
04Fast Pack
A shock unit, then war dogs, each at its own pace. Counter: Fastest focus, archer cover and cavalry to intercept them.
05Mixed Assault
Armoured and medium troops ahead of the light support. Counter: change the target focus and cover both the front and the support.
06Crisis wave
In five regions, longer levels hold one late crisis wave: a mercenary raid, sandstorm push, gate assault, Teutoburg Echo or split-lane sabotage.

CH. 05 / 07 — Porta Westfalica

Read the feint, hold the gate

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

  • River
  • Hills and rock
The Porta Westfalica battlefield, layer 1: river, hills and rock, recombined for this page from the game’s scene
  1. 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

    • River
    • Hills and rock
    The Porta Westfalica battlefield, layer 1: river, hills and rock, recombined for this page from the game’s scene
  2. 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

    • Main road
    • Ridge
    • Riverbank
    The Porta Westfalica battlefield, layer 2: the roads of the three lanes, recombined for this page from the game’s scene
  3. 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

    • Bridge control +8%
    • Saboteurs
    The Porta Westfalica battlefield, layer 3: the stone bridge and the timber gate with its palisade, recombined for this page from the game’s scene
  4. 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

    • Forest cover
    • Storm and fog
    The Porta Westfalica battlefield, layer 4: trees, stones and a hill, recombined for this page from the game’s scene
  5. 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

    • Assault + 3 phases
    • Gatebreaker Pressure 0–8
    Porta Westfalica, Level 5, wave 25 of 25: the Gatebreaker fight opens with its “Bridge Assault” phase
  1. 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

    • River
    • Hills and rock
    The Porta Westfalica battlefield, layer 1: river, hills and rock, recombined for this page from the game’s scene
  2. 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

    • Main road
    • Ridge
    • Riverbank
    The Porta Westfalica battlefield, layer 2: the roads of the three lanes, recombined for this page from the game’s scene
  3. 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

    • Bridge control +8%
    • Saboteurs
    The Porta Westfalica battlefield, layer 3: the stone bridge and the timber gate with its palisade, recombined for this page from the game’s scene
  4. 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

    • Forest cover
    • Storm and fog
    The Porta Westfalica battlefield, layer 4: trees, stones and a hill, recombined for this page from the game’s scene
  5. 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

    • Assault + 3 phases
    • Gatebreaker Pressure 0–8
    Porta Westfalica, Level 5, wave 25 of 25: the Gatebreaker fight opens with its “Bridge Assault” phase

CH. 06 / 07 — Engineering

From a browser prototype to Godot

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.

  • HTML · CSS · JavaScript
  • 1,161 lines of JavaScript

PL. 01 — The prototype

  1. 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.

    • HTML · CSS · JavaScript
    • 1,161 lines of JavaScript
    The browser prototype: “Porta Westfalica: Roman Frontier Defense”, five tower cards and a canvas with a road, “L1” towers and enemies as dots
  2. 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.

    • UI scale up to 150%

    Readable and accessible

    In-game screens and settings

    Before a wave
    the formation and its counter
    After a level
    a Battle Report: what worked
    Strategy Codex
    6 sections
    UI scale
    90% to 150%
    Accessi­bility
    Reduced Motion, high-contrast threats
  3. 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.

    • 7 atlases
    • 4 directions
    The Gatebreaker of Westfalica, assembled and taken apart into its parts, rendered for this page from the game’s anchor scene
  4. 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.

    • Threaded loading
    • 5 s loop
  5. 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.

    • 200 test scripts

    Headless release gate

    GitHub Actions · windows-latest

    Engine
    official Godot 4.7.2
    Self-test
    broken fixtures must fail
    Atlases
    all seven versioned
    Each case
    120 s, its own profile
    Fails on
    an error, a timeout or exit ≠ 0
    Reports kept for 7 days
  1. 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.

    • HTML · CSS · JavaScript
    • 1,161 lines of JavaScript
    The browser prototype: “Porta Westfalica: Roman Frontier Defense”, five tower cards and a canvas with a road, “L1” towers and enemies as dots
  2. 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.

    • UI scale up to 150%

    Readable and accessible

    In-game screens and settings

    Before a wave
    the formation and its counter
    After a level
    a Battle Report: what worked
    Strategy Codex
    6 sections
    UI scale
    90% to 150%
    Accessi­bility
    Reduced Motion, high-contrast threats
  3. 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.

    • 7 atlases
    • 4 directions
    The Gatebreaker of Westfalica, assembled and taken apart into its parts, rendered for this page from the game’s anchor scene
  4. 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.

    • Threaded loading
    • 5 s loop
  5. 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.

    • 200 test scripts

    Headless release gate

    GitHub Actions · windows-latest

    Engine
    official Godot 4.7.2
    Self-test
    broken fixtures must fail
    Atlases
    all seven versioned
    Each case
    120 s, its own profile
    Fails on
    an error, a timeout or exit ≠ 0
    Reports kept for 7 days

CH. 07 / 07 — Result

Seven months, 35 levels, one campaign

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.

  1. Prototype + Godot
  2. First battlefield
  3. The finale’s map
  4. CI on Windows
  5. Godot 4.7.2
  6. Playtest 0.9.5
  • 35

    levels across 7 regions

  • 558

    waves in the campaign

  • 81,706

    lines of GDScript in the game

  • 200

    automated test scripts

  • 4,704

    pre-rendered animation frames

  • 189

    commits in the game’s repository

store.steampowered.com
Porta Westfalica’s Steam page: screenshots, the short description and the “Coming soon” note
  • On Steam: Coming soon, for Windows only and in English, with no date announced.
  • Figures from the game’s repository on 6 Oct 2026; 0.9.5 is a playtest build.

Plates

PL. 01—04

Porta Westfalica key art: a Roman legionary with a raised gladius and a winged red shield, arrows in a dusty sky
PL. 01 — Porta Westfalica
“First Commission”: Aurelius as Miles and the start of Region I, Carthago, with the “TAKE COMMAND” button
PL. 02 — Porta Westfalica
The campaign map in Region VI: Aurelius as Praefectus Castrorum and his next promotion, Dux
PL. 03 — Porta Westfalica
The campaign map in the game: seven forts numbered I to VII, galleys and the red lines of the frontier
PL. 04 — Porta Westfalica

Palette & type

  • #2E1411Oxblood
  • #B52726Legion red
  • #B5914DRoman gold
  • #EFDFBFParchment
  • #3C4744Westfalica slate
  • Libre Baskerville

Contact

Want something like this?

Your project could be Fig. 07.

30 minutes, no commitment. You’ll leave with concrete ideas for your website, processes or product.

FIG. 07 — Your project30 minutes · no commitment · we reply within a few hours on business days