Games · Devlog #01 · personal project

Echoes of Aether

The Ruin of the Veil

A turn-based fantasy RPG in the browser, in pixel art and multiplayer, where the Veil between worlds has cracked and enemies learn through reinforcement in a NetLogo lab before reaching the C# game.

The Caverna dos Ecos entrance on the game map, with the village wall and the Arsenal da Guarda below

The hook

I started from something that bugs me in a lot of RPGs: the final boss is just a monster with a bigger health bar and a predictable script. Echoes of Aether makes a different bet. Its enemies don’t fake intelligence: they learn.

In many gamesthe dragon has 10,000 HP and a script.

Herethe dragon has a trained policy.

In many gamesthe NPC is a speech bubble.

HereDarkover and Kemancouver play by your rules: same arena, same shop, same quests, same map.

Behind it sits an invisible lab in NetLogo, where whole species fight thousands (sometimes millions) of battles in the dark. What survives isn’t a cutscene: it’s a JSON file of Q-values that the .NET runtime imports as combat instinct. Not “AI on a slide”, but a learning architecture stitched into the lore.

Aetherion doesn’t need another monster with a longer health bar. It needs adversaries who remember how you beat them yesterday.

— from the design notes

Screenshots

Top-down pixel-art exploration with other players on the same map. Click an image to enlarge it; inside, the ← → keys switch screenshots and Esc closes.

The world: Aetherion

For centuries the Veil, a barrier forged by ancient mages and warriors, kept the mortal world apart from the Void. Then it cracked. Forgotten creatures bleed out of the fissures, forests sicken, the dead wake with half their memories, and shadows learn to wear human names.

The order of the Sentinels of the Veil vanished after the first great rupture. The player carries a Mark tied to that order; it throbs near the fissures like an instrument tuned to the wrong kind of silence.

The tone is light dark fantasy: heroism, mystery, ancient magic, sacrifice, hope, and humour when it counts. No gore, no adult content: it’s rated All ages.

Pocket glossary

Veil

The border that protected everything. Now it’s a scar.

Rift

The tear through which the Void breathes.

Aether

Residual energy of the Veil: fuel for magic and for omens.

Echo

A remnant of a mind or creature that replays combat patterns.

Mark

The Sentinels’ legacy, etched into the hero’s body.

In the lore an Echo isn’t just a monster: it’s fighting memory. In the code, that’s the perfect metaphor for trained policies: patterns that survived thousands of simulated deaths and came back to the living world.

Places

No “area 1, area 2” here. Every place has its own name and art direction, and the world map and diagnostic maps already exist as finished art.

The village

Cobbled streets, houses with signs and workshops, the Casa dos Artesãos and people coming and going. This is where the quest “Ecos na Estrada dos Sussurros” begins: find Mira on the Road of Whispers.

Caverna dos Ecos

Its mouth lies outside the wall, near the Arsenal da Guarda. Below are volcanic galleries, bridges over magma and the crystal of the Santuário Oculto. On the deep levels you’re not alone: agents walk the same grid.

Private rooms

A corner of your own, with a bed, fireplace, chest and bookshelf. The game sums it up: “safe rest · private channel”. The one in the screenshot belongs to Sazinho.

Map legend

  • Valebruma · a city under purple storms; starting point, forge, healing, gossip and fear
  • Lago Espelhado · water that shows you what you’d rather not see
  • Santuário Oculto · a trail and ritual silence
  • Bosque Enfermo · corrupted green, beasts and spirits that beg for healing or fire
  • Minas de Ferro Negro · tunnels, traps and Grothar, the Heart of the Mine
  • Torre de Arken · puzzles, grimoires, automatons and Seraphine: fight her or redeem her
  • Fortaleza da Fenda · the final siege against Malachar, Herald of the Rift
  • Caverna dos Ecos · descents beneath Valebruma: magma floors, bridges and crystals

Playing together: groups, quests and combat

The map is shared: player presence syncs in real time over SignalR, and the HUD shows your group and who’s online in the area. In the screenshots you can spot name tags over characters, the group panel and the leave button, plus touch controls.

QUESTEcos na Estrada dos Sussurros

Find Mira on the Estrada dos Sussurros (0/1)

→ Estrada dos Sussurros

Arc 1: the quest chain

  1. PrologueA Noite das Cinzasa tutorial under attack; the Mark awakens
  2. Ch. 1Estrada dos Sussurrosambushes, a moral choice and an abandoned Sentinel outpost
  3. Ch. 2O Bosque Enfermohealing, a mini-boss and a runic fragment
  4. Ch. 3As Minas de Ferro NegroGrothar
  5. Ch. 4A Torre de ArkenSeraphine: blade or mercy
  6. Ch. 5A Fortaleza da FendaMalachar and three endings

Stable narrative flags (SavedBlacksmith, SeraphineSpared, ArtifactPreserved…) make the epilogue remember what you did, not just the level you grinded to. There are three endings:

Veil SealedHerald’s SacrificeRift Contained (hook for arc 2)

Origins, classes and factions

  • Three origins: Guardian of Valebruma (duty and defence), Wandering Scholar (mana, grimoire and dangerous questions) and Borderlands Survivor (agility, pragmatism and a torn map). None is better on paper; each changes the world’s first smell.
  • Warrior, fuelled by Fury: melee, stances and taunts. Paths: Guardian, Berserker and Weapon Master.
  • Mage, with mana and Resonance, which rewards sequences (the Aether likes rhythm). Paths: Pyromancy, Cryomancy and Arcane.
  • Factions: the Sentinels of the Veil (a historical ghost), the Valebruma Guard, the Cult of the Rift, the Wandering Market and the Arken Archive.

Turn-based combat that explains itself

Damage, loot, gold and XP are never born on the client: cheating dies at the door. The log and tooltips explain why you bled. Fire against skin that melts, ice against hot blood, resistances that punish lazy magic.

Difficulty runs from Story to Normal, Veteran and Nightmare (post-arc). And Nightmare isn’t “+200% health”: it’s better patterns, focus on the vulnerable target and resource management.

Agents that learn

The bestiary runs on two philosophies. Slimes, rats and low goblins use fixed AI: rules and probability, honest and cheap (“low HP → heal”). Orcs, elementals, dragons and The Architect use trainable AI: nobody hands them the rule “if HP < 20%, heal”. They work it out through reward and punishment, or die trying, millions of times, far from the player’s eyes.

From the NetLogo lab to C#

  1. The C# game defines stats, skills and rules.
  2. NetLogo, in training mode, runs thousands or millions of battles with no animation.
  3. The agent observes a discretised state: HP band, distance, MP, status…
  4. ε-greedy: it explores a lot at first, and less and less over time.
  5. Updates Q(s,a) ← Q + α [r + γ max Q(s′,a′) − Q].
  6. Exports one JSON per species or boss.
  7. The PolicyImporter (.NET) picks the action at runtime via argmax or softmax.

The canonical state is the very same string in the simulator and in the game:

hp=low|ehp=mid|mp=high|dist=close|self=buff|foe=vuln|lastSelf=fire|lastFoe=defend
  • Per-species memory: common goblins share one Q-table, the Goblin King has his own, and every boss carries its own policy.
  • Archived self-play: old versions (V1…V10) are kept so the agent doesn’t become an expert at beating only yesterday’s self.
  • Curriculum: simple opponent → intermediate → varied classes → equipment → strategies → random combat → opponents that are trained too.
  • Weakness pays, resistance costs: in training, exploiting elemental weakness is rewarded. The boss doesn’t need dialogue to look smart; it learned that Fireball on a stone golem is an expensive mistake.

Residents, not just enemies

Darkover

An autonomous NPC player. Runs DarkoverBrain with tabular Q-learning and the same services you use (battle, shop, quests, travel). Shows up on the map and can be recruited.

Kemancouver

Explorer and world memory: explores, chats and shares facts through the AgentKnowledgeBridge.

Agent dialogue

An orchestrator with local Ollama gives the world a voice, with audited quality and an offline fallback.

Ecoeterno

A farming bot running a real HTTP loop (combat, shop, quests) that keeps the server under constant pressure: a living load test. Its name blends the Portuguese for “echo” and “eternal”: the echo that never stops repeating.

Darkover doesn’t cheat: it has its own identity and character and runs the loop tick → policy → executor → reward (ΔXP, gold, quests, survival and novelty, minus death). When it finishes the arc it switches to Curiosity mode: the end of the content becomes the start of intelligent wandering.

The Architect

The smartest enemy in the initial system, at level 100: multiple phases, target selection, buffs and debuffs, weaknesses, resource conservation, combos, pattern reactions, summoning and terrain. It was trained against Warrior, Mage, Tank, Healer, Assassin, Archer and Hybrid, not against a single lab build.

Stack & tooling

The part I’m proudest of is the tooling. Every hero needs gear, so here’s the inventory:

  • Main weaponASP.NET Core MVC 8 · Razor · SignalRWeb layer, with real-time map presence.
  • GrimoireDomainEntities, enums and exceptions: fantasy rules written as code.
  • ShieldGameEngineServer-authoritative combat, progression and AI.
  • ArmourEF Core · IdentityInfrastructure: persistence, identity, seeding and auditing.
  • Arcane tomeNetLogo 6 + table extensionQ-Learning combat training with JSON export.
  • RingPolicyImporterPolicy runtime: argmax or softmax.
  • FamiliarBackgroundServices · Ollama (optional)Agents with persisted policies.
  • LanternCanvas/JS · Web AudioWorld client, with adaptive-quality VFX and prefers-reduced-motion support.

Tool bag

  • Identical canonical state in simulator and game
  • Self-play archive (V1…V10)
  • 7-step training curriculum up to The Architect
  • Win-rate and convergence metrics
  • AgentKnowledgeBridge for shared memory
  • Agent dialogue with audited quality and offline fallback
  • Farming bot as a continuous load test
  • World map and diagnostic maps
  • Stable narrative flags for the epilogue
  • Story bible and GDD

The solution splits into EchoesOfAether.Domain, GameEngine, Application, Infrastructure and Web. The engineering pillars: server authority, readable combat, distributed narrative, two strong identities and extensibility (new classes, areas and chapters without rewriting the engine).

Dev log & roadmap

Echoes of Aether is in active development. It isn’t a shipped AAA; it’s a vision I can already execute, with lore, simulation and runtime on the same thread. No dates for now: it’s a personal project, and it moves at the Aether’s pace.

Already forged

  • Story bible and GDD
  • Combat
  • Enemy seed data
  • Multiplayer map presence
  • RL agents
  • NetLogo lab
  • Map art

Next quests

  • Complete Arc 1, from the Prologue to the Fortress of the Rift
  • Nightmare difficulty, after the arc
  • Controller (gamepad) support planned
  • Arc 2, picking up from the “Rift Contained” ending

Arc 1 content target

Planned, not shipped: this is the size the arc is aiming for.

areas
12
quests
25
NPCs
20
enemies
30
mini-bosses
6
bosses
3
items
80
pieces of gear
30
skills
30+
endings
3

Pocket scrolls (project one-liners)

An RPG where difficulty has a curriculum.

Enemies that trained off the map.

Companions that use the same API you do.

Nightmare isn’t HP. It’s policy.

Enjoyed the devlog, or want to talk games, simulation or reinforcement learning?

Write to me

Screenshot viewer