← zpět na projekty← back to projects

Harrowgate: hra, kterou stavím jako vedoucí týmu AI agentůHarrowgate: a game I build by leading a team of AI agents

Kooperativní taktický dungeon crawler pro 1–4 hráče · three.js prototyp · ve vývojiCo-op tactical dungeon crawler for 1–4 players · three.js prototype · in development

O jakou hru jdeWhat the game is

Harrowgate je taktický roguelike dungeon crawler pro jednoho až čtyři hráče, sólo nebo v kooperaci. Inspirací je DnD a Baldur's Gate 3. Hra vyrostla z prototypu Turn Duels, původně tahové PvP hry jeden na jednoho.Harrowgate is a tactical roguelike dungeon crawler for one to four players, solo or co-op. It's inspired by DnD and Baldur's Gate 3. It grew out of Turn Duels, a 1v1 turn-based PvP prototype.

Hráč začíná ve městě Harrowgate. U brány (Gate) si družina vybere dungeon a stupeň obtížnosti Harrow 0 až 3. Výprava je jedna procedurálně generovaná mapa se čtyřmi zónami podle hloubky: v zónách 2 až 4 čekají elitní nepřátelé, v zóně 4 mini-boss. U značky Harrow družina hlasuje, jestli vstoupí do arény strážce dungeonu (Warden). Když strážce padne, otevře se portál a družina hlasuje o návratu s kořistí. Pokud padne celá družina, přijde o nesenou brašnu i měšec. Zkušenosti a zlato uložené v bance zůstanou. Kámen návratu (Stone of Return) zachrání výbavu padlého hráče.You start in the town of Harrowgate. At the Gate the party picks a dungeon and a Harrow tier from 0 to 3. A delve is one procedurally generated map with four depth zones: elites in zones 2 to 4, a mini-boss in zone 4. At the Harrow marker the party votes on whether to enter the arena of the dungeon's Warden. Once the Warden dies, an exit portal opens and the party votes to extract with the loot. If the whole party wipes, it loses the carried satchel and purse. XP and gold in the bank stay. A Stone of Return keeps a fallen player's pack.

MěstoTown

  • Cech s úkoly v hodnostech F až S. Na postup do vyšší hodnosti je potřeba zabít strážce, získat z něj materiál a nechat si z něj udělat talisman. Materiály se dají i prodat.A guild with quests ranked F to S. Ranking up means killing a Warden, taking its material and turning it into a talisman. Materials can also be sold.
  • Obchody se zbraněmi, zbrojí, trinkety a smíšeným zbožím, v každém 9 předmětů. Nabídka se obmění po každé dokončené výpravě a hodnost v cechu určuje, z jak hluboké zóny předměty můžou být.Weapon, armor, trinket and general shops with 9 items each. Stock rerolls after every finished delve, and your guild rank caps how deep a zone the items can come from.
  • Trezor, banka, výbava na výpravu (5 spotřebních předmětů a zásoby na cestu, Trail Supplies) a správa schopností.A vault, a bank, a loadout (5 consumables plus Trail Supplies) and skills.
  • Hostinec: jídlo a pití dávají bonusy na příští výpravu, speciální nabídka se mění s každou výpravou.A tavern: food and drink give buffs for the next delve, and the special changes every delve.
  • Party Hall, kde se skládá družina. Strážce brány Ronald vysvětlí základy. Městem prochází každý hráč sám, to je záměr. Aukční síň se připravuje.The Party Hall, where you form a party. Gatekeeper Ronald explains the basics. Town is solo by design. An Auction House is in progress.

PrůzkumExploration

  • Každá výprava má nový seed.Every delve has a new seed.
  • Mlhu války družina odkrývá ze společné zásoby výdrže (stamina). Prozkoumanou mapu ukazuje minimapa.The party reveals fog of war by spending from a shared stamina pool. A minimap shows the explored map.
  • U táboráku družina hlasuje Rest, nebo Guard. Trail Supplies doplní výdrž úplně, hlídka snižuje šanci na přepadení.At a campfire the party votes Rest or Guard. Trail Supplies give a full refill, and guarding lowers the chance of an ambush.
  • Svatyně nabízejí požehnání nebo kletbu, o kterých družina hlasuje. Další modifikátory přidává jídlo z hostince.Shrines offer blessings or curses, decided by party vote. Tavern meals add more modifiers.
  • Truhly (některé s pastí), pasti, dveře, které jde vyrazit, klíče a byliny.Chests (some trapped), traps, doors you can bash, keys and herbs.

BojCombat

  • Tahový boj s iniciativou d20 + bonus povolání.Turn-based combat with d20 + class bonus initiative.
  • Monstra si vás všimnou sluchem nebo zrakem. Vidí v zorném kuželu a jen tam, kam mají přímý výhled (line of sight). Do boje se přidávají celé smečky. Kdo nepřítele nezaznamená, je překvapen a přijde o první tah; to platí i pro družinu při přepadení.Monsters notice you by hearing or sight: they have a vision cone and need line of sight. Whole packs join fights. Anyone who fails to notice the attacker is surprised and loses their first turn, and that goes for the party too when it's ambushed.
  • Reakce a útoky příležitosti. Útok na dálku potřebuje přímý výhled a dohled závisí na povolání.Reactions and opportunity attacks. Ranged attacks need line of sight, and sight range depends on class.
  • Čtyři povolání (Warrior, Mage, Archer, Cleric). Každé má pevné základní schopnosti a až 5 volitelných z nabídky 8 (Cleric 9). Volitelné schopnosti se vylepšují runami a mistrovstvím.Four classes (Warrior, Mage, Archer, Cleric). Each has pinned basic abilities plus up to 5 equipped electives from a catalog of 8 (9 for the Cleric). Electives are upgraded with runes and mastery.
  • Kořist od Common po Legendary s 0 až 4 náhodnými vlastnostmi (affixy).Loot from Common to Legendary with 0 to 4 affixes.

Dungeony a bossové. Sedm dungeonů podle hodnosti, k tomu tutoriál. Životy a poškození bossů se přizpůsobují velikosti družiny.Dungeons and bosses. Seven dungeons by rank, plus a tutorial. Boss HP and damage scale with party size.

Forest Depths (F)Forest Depths (F)
The RootwardenThe Rootwarden
Gloomy Woods (E)Gloomy Woods (E)
Blightroot TreantBlightroot Treant
Forgotten Crypt (D)Forgotten Crypt (D)
Wraith LordWraith Lord
Whispering Canyon (C)Whispering Canyon (C)
Sandstorm SphinxSandstorm Sphinx
Sunken Citadel (B)Sunken Citadel (B)
Rimecrown KingRimecrown King
Ash Wasteland (A)Ash Wasteland (A)
Hellfire EfreetHellfire Efreet
Void Rift (S)Void Rift (S)
Void WeaverVoid Weaver

Hru s přáteli sdílíte odkazem ?room=KÓD.You share a game with friends via a ?room=CODE link.

Jak hru stavímHow it's built

Na Harrowgate pracuji sám, ale kód nepíšu sám. Vedu několik AI agentů, hlavně Devin Local a Codex (a mám připravenou i konfiguraci pro opencode). Moje práce je podobná práci vedoucího vývoje: rozdělit práci na úkoly, nastavit pravidla, zkontrolovat výsledek a rozhodnout, co se sloučí.I work on Harrowgate alone, but I don't write the code alone. I direct several AI agents, mainly Devin Local and Codex (with an opencode config ready too). The job looks like a lead developer's: break the work into tasks, set the rules, review the results and decide what gets merged.

Pravidla pro agenty.Rules for agents. V repozitáři je soubor AGENTS.md s 22 KB pravidel: jak psát kód, jak testovat, co agent smí a nesmí. Agent tak nezačíná od nuly a nemusím mu pokaždé vysvětlovat totéž.The repo has an AGENTS.md file with 22 KB of rules: how to write code, how to test, what an agent may and may not do. Agents don't start from zero, and I don't have to repeat myself.

Úkoly a pull requesty.Tasks and pull requests. Každá změna má číslo úkolu a vlastní pull request. Commity mají tvar TD-xxx: popis (#PR) , takže u každé změny je jasné, k čemu patří. Mezi 26. zářím a 12. říjnem 2026 vzniklo takhle 100 commitů. Repozitář existuje od 1. září 2026.Every change has a task number and its own pull request. Commits follow TD-xxx: description (#PR) , so every change traces back to its task. Between 26 September and 12 October 2026 that produced 100 commits. The repo has existed since 1 September 2026.

Skilly.Skills. Opakované postupy mám sepsané jako skilly:Repeated workflows are written down as skills:

  • swarm:swarm: více AI pracovníků běží paralelně, každý ve vlastním git worktree. Koordinátor jejich práci spojuje přes pull requesty, které prošly kontrolou, a rozhoduje, který model dostane jaký úkol.several AI workers run in parallel, each in its own git worktree. A coordinator integrates their work through reviewed pull requests and routes each task to a suitable model.
  • unslop:unslop: odstraňuje typické znaky generovaného textu a kódu.strips the typical signs of generated text and code.
  • ship:ship: postup pro dotažení změny až k vydání.the process for taking a change all the way to release.

Paralelní agenti se nesmí srazit.Parallel agents must not collide. Když běží víc agentů najednou, každý spouští vlastní dev server a testy. Proto jsem udělal systém přidělování portů, aby si agenti nepřekáželi.When several agents run at once, each starts its own dev server and tests. So I built a port allocation system to keep them out of each other's way.

Dokumentace.Documentation. Repozitář má zhruba 860 souborů a asi 50 návrhových dokumentů ve složce docs/: lore, povolání, itemizace, síťový protokol, rešerše přechodu na jiný engine a export dat pro Godot. Agenti z nich vycházejí, takže rozhodnutí nejsou jen v mé hlavě.The repo has about 860 files and around 50 design docs in docs/: lore, classes, itemization, the network protocol, engine migration research and Godot data export. Agents work from them, so decisions don't live only in my head.

Zvuk.Audio. Ve hře je 385 zvukových efektů a 9 hudebních skladeb. Zvukové efekty vznikaly v ElevenLabs, hudbu složil hudební model od Googlu (Gemini) a Codex z ní udělal smyčky. Agenti připravují jen prompty a zkušební běhy (dry-run). Placené generování nespouštějí, to dělám já.The game has 385 sound effects and 9 music tracks. The sound effects were produced in ElevenLabs; the music was composed with Google's Gemini music model and Codex turned it into loops. Agents only prepare prompts and dry runs. They never run paid generation; I do that.

  1. ÚkolTaskTD-xxxTD-xxx
  2. Agent ve vlastním git worktreeAgent in its own git worktreevlastní dev server a portyown dev server and ports
  3. KontrolyCheckstypecheck · ESLint · Prettier · testy · knip · buildtypecheck · ESLint · Prettier · tests · knip · buildneprošlo → opravafailed → fix
  4. Pull request po kontroleReviewed pull requestTD-xxx: popis (#PR)TD-xxx: description (#PR)
  5. Sloučení: rozhoduji jáMerge: my decision
Postup práce agentůAgent workflow

Kvalita: co musí projít, než se něco sloučíQuality: what has to pass before anything merges

U AI agentů nestačí, že kód „vypadá dobře“. Každý pull request musí projít:With AI agents, "looks fine" isn't enough. Every pull request has to pass:

  • typovou kontrolou TypeScriptu,TypeScript typecheck,
  • ESLintem a Prettierem,ESLint and Prettier,
  • testy,tests,
  • kontrolou mrtvého kódu (knip),a dead-code check (knip),
  • buildem.the build.

Navíc běží Jenkins CI na mém vlastním Windows PC s linuxovým Docker agentem. Spouští unit testy, serverové testy, E2E testy, testy animací, testy, které z prohlížeče sbírají důkazy (screenshoty a záznamy), a testy shody replayů. Generátor dungeonů se testuje na sadě 200 seedů. Balanc ladím simulacemi, kterým říkám „boss ladder“. Některé kontroly běží každou noc.On top of that, Jenkins CI runs on my own Windows PC with a Linux Docker agent. It runs unit, server, E2E and animation tests, browser-evidence tests and replay-parity tests. The dungeon generator is tested against a corpus of 200 seeds. Balance is tuned with what I call "boss ladder" simulations. Some checks run nightly.

Zajímavé technické problémyInteresting technical problems

Deterministický engine.A deterministic engine. Herní logika je čistý deterministický engine: pseudonáhodný generátor se seedem, výstup jako proud událostí a běží stejně v Node i v prohlížeči. Stejný seed a stejné akce dají vždy stejný výsledek. Díky tomu jdou hry přehrát znovu, testovat bez grafiky a porovnávat.The game logic is a pure deterministic engine: a seeded PRNG, output as an event stream, running the same in Node and in the browser. The same seed and the same actions always give the same result. That makes games replayable, testable without graphics, and comparable.

Multiplayer bez autoritativního herního serveru.Multiplayer without an authoritative game server. Hráči se propojují přes WebSocket relay a hra běží v deterministickém lockstepu: každý klient počítá stejnou simulaci. Po každé akci (pohyb, schopnost…) hostitel rozešle hash herního stavu a ostatní klienti ho porovnají se svým. Pořadí akcí (intentů) určuje hostitel. Když se klienti rozejdou (desync), je to vidět okamžitě, hned u akce, která ho způsobila, ne až po deseti tazích, kdy už nejde zjistit, kde chyba vznikla. Hra pak stav znovu sesynchronizuje. Kdo vypadne, znovu se připojí přes WebSocket a vrátí se do rozehrané výpravy.Players connect through a WebSocket relay and the game runs in deterministic lockstep: every client computes the same simulation. After every action (a move, an ability…), the host broadcasts a hash of the game state and the other clients compare it with their own. The host sets the order of player intents. If clients diverge (desync), it shows up immediately, right at the action that caused it, not ten turns later when you can no longer tell where it went wrong, and the game resyncs. A player who drops reconnects over WebSocket and resumes the run in progress.

Server pro účty a postavy.A server for accounts and characters. Node a SQLite pro účty, relace a postavy, vše v Dockeru. Postavy, trezor a banka přežijí mezi hrami.Node and SQLite for accounts, sessions and characters, all in Docker. Characters, the vault and the bank persist between runs.

Procedurální mapy, které musí být hratelné.Procedural maps that have to be playable. Generátor musí pro každý seed vytvořit průchozí mapu se smysluplnou obtížností. Proto korpus 200 seedů: změna v generátoru, která rozbije jen některé seedy, se ukáže v testech.The generator has to produce a traversable map with sensible difficulty for every seed. Hence the 200-seed corpus: a generator change that breaks only some seeds shows up in tests.

Grafika.Graphics. Prototyp běží na Vite a Three.js s voxelovým lesem.The prototype runs on Vite and Three.js, with a voxel forest.

Stav a plánStatus and roadmap

  • Teď:Now:prototyp v three.js. Hotové je město (kromě aukční síně), celá smyčka výpravy, procedurální mapy a arény bossů pro všech 7 dungeonů, boj, itemizace, hostinec, cech, multiplayer včetně opětovného připojení a tutoriál.a three.js prototype. Done: the town (except the Auction House), the full delve loop, procgen and boss arenas for all 7 dungeons, combat, itemization, the tavern, the guild, multiplayer with reconnect, and the tutorial.
  • Konec roku 2026 (nejspíš):End of 2026 (likely):webové demo na itch.io.a web demo on itch.io.
  • Potom:Then:přepis do Godotu, všechny modely, lore a balanc. Rešerše přechodu a export dat pro Godot jsou už v dokumentaci.a rewrite in Godot, all models, lore and balance. The engine migration research and Godot data export are already documented.
  • Q2/Q3 2027:Q2/Q3 2027:plánované plné vydání na Steamu.planned full Steam release.

Co to říká o tom, jak pracujiWhat it says about how I work

AI mi píše většinu kódu, ale za výsledek odpovídám já. Proto do projektu dávám to, co by dal vedoucí vývoje do týmu lidí: jasná pravidla, malé úkoly s vlastními pull requesty, automatické kontroly, které nejde obejít, a dokumentaci, ze které se dá vycházet. Paralelní agenti mají izolované prostředí a vlastní porty, protože jinak by se jejich práce navzájem rozbíjela. Placené služby spouštím jen já. A když hra v multiplayeru přestane sedět, chci to vědět po prvním tahu, ne od hráče.AI writes most of my code, but I'm accountable for the result. So I give the project what a lead developer would give a team of people: clear rules, small tasks with their own pull requests, automated checks that can't be skipped, and documentation worth building on. Parallel agents get isolated workspaces and their own ports, because otherwise they'd break each other's work. Only I run paid services. And when multiplayer goes out of sync, I want to know after the first turn, not from a player.

Stejný přístup používám i mimo hry: rychle postavit, ale ověřit a bezpečně spustit.I use the same approach outside games: build fast, then verify and ship safely.

Ozvěte se, když potřebujete prototyp nebo interní nástroj postavený s AI, úpravu e‑shopu nebo integrace, nebo někoho, kdo změnu dovede od zadání po bezpečné spuštění.Get in touch if you need an AI-built prototype or internal tool, e-commerce or integration work, or someone to take a change from requirements to a safe launch.

Napište mi Email me

← zpět na projekty← back to projects