Audamir

časť 30

Ako je poskladaná hra Audamir: vrstvy, registrácia, jeden ťah a sedadlá

Mapa celku hry Audamir: realm používa hru a hra jadro, čo sa zapíše pri štarte, cesta jedného ťahu a kto odpovedá za sedadlo. Čo to drží pokope, čo sa pri stavbe ukázalo inak než v návrhu a čo je dlh, s číslami z dnešnej hry.

· doplnené 6. novembra 2026 · 18 min čítania

Hra Audamir začínala ako jedna hra s kockami a územiami. Dnes má štyri hry v dvoch realmoch: kocky a územia s kampaňou, ktorá na nich stavia, v Kastgarde a Kolónia s Čiarami v Rokgarde; k tomu ešte dva realmy, v ktorých hra zatiaľ nie je. Jednotlivé stavby majú vlastné články: o zmluve medzi realmom a hrou je Z jednej hry viac hier, o presune Kastgardu do vlastného priečinka Presun, ktorý nesmie nič zmeniť, o stavebnici dosiek Dve hry na jednej doske a o textoch a názvoch súborov Texty ako stromy (pripravovaný článok č. 38). Tento článok je mapa celku: ako sa to dnes drží pokope, kde sa jednotlivé kusy stretávajú a hlavne čo ich drží, aby zmena, ktorá porušuje pravidlá, zhodila kontrolu, a nie až hráča.

Odpovedá na otázku, ktorú sa dá pýtať aj pri cudzom projekte: ako je taká hra poskladaná, aby sa dalo pridávať režimy a svety bez prepisovania, a ako sa to stráži (nie len nakreslí)? Obrázky nie sú ilustrácie. Sú nakreslené z merania stromu hry (verzia 0.122.0, stav zo 6. novembra 2026) a z prečítaného kódu; kde je to len schéma, titulok pod obrázkom to hovorí. Podkladom bola schéma architektúry z 29. októbra. Je o týždeň staršia než hra, a preto je každé tvrdenie nižšie overené v dnešnom kóde; kde sa dnes od schémy líši, text to povie.

Smer pravidiel je moje rozhodnutie z 27. a 28. októbra 2026. Pri tomto článku sa čítal dnešný kód, spúšťali sa nástroje hry a skúšalo sa, čo zhodia.

Tri vrstvy a jedno pravidlo smeru

Štyri slová, ktoré sa nižšie opakujú. Balík je priečinok kódu so zoznamom svojich súborov (dnes deväť balíkov a 338 súborov js/). Realm je to, čo hráč vidí: karta na domovskej obrazovke, hub s dlaždicami, vlastná úroveň a vlastné mince. Hra je sada pravidiel s vlastnou doskou, AI a záznamom (v kóde „ruleset“): stacks, campaign, colony, chains. Jadro (core) je to, čo používajú všetci: generátor náhody, mriežka, profil, správca realmov a obal aplikácie.

Pravidlo smeru sa zmestí do vety: realm používa svoje hry, hra používa jadro, jadro nepoužíva nikoho. Hra nepoužíva svoj realm a realmy sa navzájom nepoužívajú; jediný výnimočný vzťah je hra, ktorá stavia na inej hre svojho realmu (campaign stavia na stacks).

Vrstvy hry Audamir podľa grafu závislostíSchéma deviatich balíkov kódu. Hore sú štyri realmy: Kastgard (17 súborov), Rokgard (21), Vitgard (12) a Telgard (12). Pod nimi sú hry: v Kastgarde stacks (81) a campaign (41), v Rokgarde colony (19) a lines (20); Vitgard a Telgard zatiaľ nemajú hru. Dole je jadro core so 115 súbormi. Čierne šípky ukazujú smer, v ktorom sa balík smie používať: realm svoje hry, hra jadro. Červené šípky idú proti smeru: súbory jadra, ktoré používajú balíky nad sebou. Tých hrán je 95 z 1 370 v 21 súboroch, najviac 59 do stacks a 24 do campaign.realmyhryjadroKastgard17Rokgard21Vitgard12Telgard12stacks81campaign41colony19lines20bezhrybezhrycorespoločné jadro a obal aplikácie · 115 súborovknižnica 35 · obrazovky 44 · dáta 23 · texty 1359242111smie používať: realm svoje hry, hra jadroproti smeru, zmerané: číslo je počet hrán z jadrarealm, v ktorom zatiaľ nie je hraSpolu 95 z 1 370 hrán v 21 súboroch.Nakreslených je 88; ďalších 7: jadro → Kastgard 2, jadro → Rokgard 1, stacks → campaign 4.
Deväť balíkov a hrany medzi nimi, z analýzy nástroja tools/packages.js hry (verzia 0.122.0, 6. 11. 2026). Číslo v rámčeku je počet súborov balíka. Červené šípky sú hrany, ktoré idú proti smeru; číslo je ich počet z jadra do daného balíka.

V Kastgarde sú dve hry (stacks má 81 súborov, campaign 41) a v Rokgarde dve (colony 19 a chains 20, v hre sa volajú Kolónia a Čiary). Vitgard a Telgard majú po 12 súborov, z toho tri kódu a deväť textov. Hru nemajú, a preto ich hráč nevidí: domovská obrazovka a huby sa kreslia len pre realmy, ktoré majú aspoň jednu hru (DESIGN §104.3).

Druhá vec na obrázku je červená, a pravidlo „jadro nepozná hru“ dnes neplatí celé. Nástroj tools/packages.js počíta hranu vtedy, keď súbor používa globálnu hodnotu, ktorú definuje súbor iného balíka (hľadá mená v kóde bez komentárov a textov, mená v zozname modulov a súbory pomenované cez require alebo importScripts). Hrán je 1 370 a 95 z nich ide proti smeru, v 21 súboroch: 59 z jadra do stacks, 24 do campaign, 8 do ostatných balíkov a 4 zo stacks do campaign. Dôvod je v tom, čo jadro dnes je. Nie je to len knižnica (35 súborov v js/core/), ale aj obal aplikácie (44 súborov v js/ui/): samotný js/ui/app.js má 3 124 riadkov a 40 z tých hrán, celé js/ui/ 64. V js/data/ je ďalších 9 hrán a v samotnej knižnici 18, v šiestich súboroch. Typický prípad je modetable.js: tabuľka režimov sa načíta skôr než správca realmov, a preto musí vedieť, ktoré tabuľky režimov existujú.

Preto stráž smeru nie je jedno tvrdé „nič“, ale dve pravidlá. Sedem z deviatich balíkov (obe Rokgardove hry a jeho realm, Vitgard, Telgard, realm Kastgard a campaign) je čistých: akákoľvek hrana proti smeru zhodí kontrolu. Dva (core a stacks) majú západku: tabuľka v súbore tools/packages-table.json zapisuje pre každý súbor, koľko hrán proti smeru smie mať. Viac nesmie, menej sa dá zapísať (--lower-ratchet) a vtedy číslo už nevzrastie. Obe pravidlá sa dali skúsiť na kópii stromu hry (git archive, hra sa nemenila). Do game.js v Kolónii pribudol riadok, ktorý siaha na Rules zo stacks:

$ node tools/packages.js --check
direction: 1371 edges between the files of js/,
  96 break the rule (…)
  FAIL rokgard/colony -> kastgard/stacks:
    js/realms/rokgard/games/colony/core/game.js
    -> js/realms/kastgard/games/stacks/core/rules.js
    (Rules)
rokgard/colony: does NOT pass (…)
packages:check found a problem in 1 place.
(kód ukončenia 1; riadky sú zalomené a skrátené)

Do súboru jadra, ktorý už jednu hranu má (js/core/phase.js), pribudlo meno z engine kociek. Čistý balík by zlyhal hneď; tu zlyhala západka:

ratchet: 1 problem
  - ratchet: js/core/phase.js has 2 edges that
    break the direction, the table allows 1
    (…/stacks/core/ai.js, …/stacks/core/engine.js)
packages:check found a problem in 1 place.
(kód ukončenia 1; riadky sú zalomené a skrátené)

Prečo to nie je len dekorácia, ukazuje ďalší obrázok: čo sa so západkou stalo, kým kód rástol.

Západka smeru: hrany proti smeru a počet súborov v časeDva grafy v čase od 29. októbra do 5. novembra 2026. Horný: počet hrán, ktoré idú proti smeru používania balíkov; klesol zo 120 na 95 (31. 10. kampaň odišla z obalu aplikácie na 105, 1. 11. štatistiky na 94, 4. 11. výzva stránky pridala jednu). Dolný: počet súborov kódu v tabuľke balíkov vzrástol zo 187 na 338.hrany proti smeru05010012031. 10. 120 → 1051. 11. 105 → 944. 11. 94 → 95súbory kódu v tabuľke balíkov010020030018733830. 10.1. 11.3. 11.5. 11.95 hrán je v 21 súboroch. Počet súborov vzrástol 1,8-krát, počet hrán od 29. 10. nebol vyšší než 120.
Súčet ratchet a počet súborov v tabuľke balíkov pri každom commite, ktorý menil tools/packages-table.json (29. 10. až 5. 11. 2026), čítané z gitu hry. Prvý zápis západky bol 29. 10. o 23:30.

Prvý zápis bol 120 hrán (29. októbra). Kým počet súborov vzrástol z 187 na 338, hrany klesli na 105 (31. októbra, kampaň odišla z obalu aplikácie), na 94 (1. novembra, štatistiky sa presunuli z jadra do balíka Kastgardu) a štvrtého novembra sa zvýšili o jednu, keď sa zlúčila výzva stránky (js/ui/app.js 39 → 40). Zvýšenie je zapísané v tabuľke, takže je v histórii. Pravidlo sa dá poľaviť, ale len viditeľne.

Registrácia pri štarte: čisté dáta a jeden správca

Keď sa stránka načíta, každý balík zapíše čisté dáta a funkcie; nič sa ešte nespúšťa. Je to manifest realmu (meno, hry, režimy, dlaždice, úroveň a minca), adaptér hry (jeden zmrazený objekt, ktorý ukazuje na kód hry: ako sa začína, aký má cyklus, záznam, AI a fakty hotovej partie), sekcia (hra, ktorá stavia na inej) a obsah, ktorý hra pridáva do spoločných zoznamov: minihry, hlavolamy, lekcie a tipy. Obrázok ukazuje, čo kto zapisuje; je to vyhľadanie volaní Realms.register(, Rulesets.register( a ďalších v súboroch balíkov.

Čo zapíše každý balík, keď sa načítaTabuľka osem balíkov a toho, čo pri načítaní skriptov zapíšu do registrov: manifest realmu (Kastgard, Rokgard, Vitgard, Telgard), adaptér hry (stacks, colony, lines), sekciu (campaign), úroveň a mincu realmu (štyri realmy) a obsah (campaign pridáva 5 minihier, 23 hlavolamov, 1 lekciu a 15 tipov). Pod tabuľkou je správca realmov s piatimi krokmi: zostava, requires, sekcie, extends, start(ctx). Z registrov sa potom kreslí domovská obrazovka, huby dlaždíc, rozohrané hry (zo slotov režimov) a okná stránok, ako sú štatistiky a pravidlá.manifestrealmuadaptérhrysekciaúroveňa mincaobsah (čo pridáva)Kastgardstackscampaign5 minihier23 hlavolamov1 lekcia, 15 tipovRokgardcolonylinesVitgardTelgardzatiaľ len dáta a funkciesprávca realmovjs/core/realms.js: nepozná žiadnu hruzostavarequiressekcieextendsstart(ctx)zlyhá jeden realm: nespustí sa len on, ostatné bežiaobrazovky sa kreslia z registrovdomovskáobrazovka:karta realmuhuby:dlaždicerežimovrozohrané hry:slotyrežimovokná stránok:štatistiky,pravidláNový režim hry, ktorá už je, je riadok v tabuľke režimov jej realmu.Nová hra a nový realm ešte sahajú aj na spoločné miesta (text).
Čo zapisuje ktorý balík, keď sa načíta: vyhľadanie volaní Realms.register(, Rulesets.register(, Realms.registerSection( a Economy.register( v súboroch balíkov (hra 0.122.0, 6. 11. 2026); obsah kampane je spočítaný z jej modulov. Správca a obrazovky sú schéma podľa kódu.

Skutočný príklad je Rokgard. Jeho manifest vymenúva hry, ktoré realm hrá, adaptér každej hry sa zaregistruje na konci jej súboru ruleset.js a režim je jeden záznam tabuľky v modes.js (úryvky sú skrátené a zalomené):

// js/realms/rokgard/data/realm.js (skrátené)
const manifest = {
  id: 'rokgard', name: 'Rokgard',
  rulesets: ['colony', 'chains'],
  // …
};
Realms.register(manifest, api);

// js/realms/rokgard/games/colony/core/ruleset.js
return Rulesets.register(adapter);

// js/realms/rokgard/data/modes.js: Colony (skrátené)
{
  id: 'colony', ruleset: 'colony', tile: 'colony',
  slot: 'colony', counts: ['history', 'realms'],
  end: { branch: 'colony', card: 'colony' },
  again: 'colony-again', back: 'colony-setup',
  restart: { how: 'confirm', start: 'same-setup' },
  hud: { tips: false, narrator: false, quips: false },
},

Správca realmov (js/core/realms.js, 998 riadkov) potom prečíta zostavu (Build.realms; zostava napríklad môže vynechať sekciu kampane), skontroluje manifesty a to, čo si realmy navzájom pripájajú (requires, extends), zoradí ich podľa závislostí a zavolá start(ctx). Realm vidí len ctx (svoju časť profilu, generátor, texty, zvuk), nikdy iný realm. Ak pri jednom realme nastane výnimka alebo vyprší čas, zlyhá len on a ostatné bežia. A hlavne nepozná žiadnu hru: test prečíta jeho kód bez komentárov a zhodí zmenu, ktorá by v ňom pomenovala realm, hru alebo modul hry.

Obrazovky sa potom kreslia z registrov: domovská obrazovka robí kartu z každého realmu, ktorý má hru, hub dlaždice z tabuľky jeho režimov, zoznam rozohraných hier je zoznam slotov režimov (Kniežatstvá[1], Kmene, voľná hra, denná výzva a ďalšie) a okná štatistík, pravidiel či nastavení sa zostavujú z toho, čo realm registruje (pages).

Sľub „nový režim nepotrebuje riadok v obale“ platí len napoly. Režim je riadok tabuľky (slot, koncová karta, tlačidlá „znova“ a „späť“, čo smie ukázať HUD) a obrazovky tabuľku čítajú, takže režim, ktorý hrá rovnakú hru ako ostatné, je len dáta. Riadok režimu Kolónia však pomenúva obslužné funkcie (colony-again, colony-setup) a tie definuje obal (napríklad 'chains-again': () => ChainsView.again() v js/ui/app.js). Nová hra sa obalu dotkne vždy. Tabuľka v DESIGN §104.5 z 31. októbra vymenúva 20 registračných miest a 13 z nich je v súboroch, ktoré upravuje každá hra (napríklad index.html, sw.js, riadok realmu v modetable.js, riadky v js/ui/app.js). Dnes to vidno aj hrubým počítaním: Čiary stoja v index.html na 13 riadkoch (obrazovka a desať skriptov), v sw.js na 5, v tools/compat.html na 4 a v style.css na 8. Pri stavbe Čiar to bolo 91 riadkov v 14 súboroch obalu (DESIGN §80.6). Registrácia ich teda zmenšila, nie zrušila.

Jeden ťah od ťuknutia po obraz

Cesta jedného ťahu v hre s kockami, pri jednom ťuknutí na políčko. Vľavo ide vstup dole, vpravo obraz hore.

Jeden ťah od ťuknutia po obrazSchéma dvoch stĺpcov. Vľavo ide vstup zhora nadol: BoardInput zmení dotyk na udalosť tap, ovládač hry Interaction.tap vyberie útočníka a cieľ, Flow.humanAttack nechá pravidlá overiť ťah, zapíše ho do záznamu a vykoná, pravidlá a engine vyhodnotia hod zo stavu hry a vznikne nový stav. Vpravo ide obraz zdola nahor: háčiky Flow oznámia zmenu, StacksBoard.view urobí popis jednej chvíle dosky, vykresľovač ho nakreslí na plátno. Pod tým sú dve škatule: záznam a prehrávanie udalostí a koniec partie s fakty hry.vstup: zhora nadolobraz: zdola nahorBoardInputdotyk alebo klik → udalosťtap { cell }coreInteraction.tapovládač hry s kockami: vyberieútočníka a cieľcoreFlow.humanAttackpravidlá overia ťah, záznamsi ho zapíše, ťah sa vykonáhraRules + Enginehod zo stavu hry (seed, soľ,kolo) a nový stav hryhraplátnoobraz na obrazovkevykresľovač doskykreslí popis dosky, nevolápravidlá a nečíta hrucoreStacksBoard.viewpopis jednej chvíle dosky:čo je na ktorom políčkuhraháčiky FlowonAttackEnd, onState: obalaplikácie ide prekresliťhrapotom, z toho istého stavu a záznamuzáznam → udalostiReplay.run prehrá rozhodnutia:prehrávač, obraz, hudba, analýzačítajú tie isté udalostihrakoniec partiefacts() hry: výsledok, dĺžka, skóre→ skúsenosti, mince, úspechy(zatiaľ len Colony a Čiary)hracorebalík core (knižnica a obal aplikácie)hrabalík hry kastgard/stacks
Cesta jedného ťahu v hre s kockami: schéma kódu, nie meranie. Mená sú prečítané v kóde hry 0.122.0 (6. 11. 2026), balík každej škatule je podľa tools/packages-table.json (core alebo hra kastgard/stacks).

Vstup ide dole. Dotyk alebo klik zachytí BoardInput (140 riadkov, js/ui/board-input.js). Rozozná ťuknutie od ťahania (do šiestich pixelov je to ťuknutie), od štípnutia dvoma prstami i od kolieska a pošle udalosť tap s číslom políčka. Nevie, aká hra beží: posiela ju ovládaču hry, ktorého mu dá obal. V hre s kockami je ním Interaction.tap (js/ui/interaction.js). Ten vie, že sa najprv vyberie útočník a potom cieľ, a že na dotyku sa podľa nastavenia potvrdzuje druhým ťuknutím. Potom zavolá Flow.humanAttack(from, to). Flow ťah overí pravidlami (políčko musí patriť sedadlu 0 a útok musí byť dovolený), zapíše ho do záznamu a vykoná: hod kociek sa vypočíta zo stavu hry a Engine.resolveAttack z neho urobí nový stav. Kolónia a Čiary majú vlastný ovládač (ColonyView, ChainsView) a vlastný cyklus hry, ktorý odpovedá tým istým menám, takže spoločné časti obrazovky (stavový riadok, tlačidlá) nevedia, ktorý z nich beží.

Obraz ide hore. Keď útok skončí, Flow zavolá háčiky obalu (onAttackEnd, onState) a obal prekreslí. Pohľad dosky robí StacksBoard.view(game, ui) (122 riadkov, js/realms/kastgard/games/stacks/ui/board.js): popis jednej chvíle dosky, teda čo je na ktorom políčku (vlastník, stoh kociek, terén), aké šance sa ukážu na hranách a ktoré políčka ešte vezmú kocku. Je čistý a len číta; test ho spustí nad zmrazenou kópiou hry v každom stave zbierky scén, ktoré sa kreslia, a porovná, či sa hra nezmenila. Vykresľovač js/ui/board.js (577 riadkov) ten popis nakreslí. Nevolá pravidlá a nečíta hru. Kolónia a Čiary majú vlastný popis dosky, vykresľovač je spoločný.

Stav je funkcia troch vecí. Partia je nastavenie, číslo hry (seed) a rozhodnutia. Preto záznam formátu 2 (Záznam partie, ktorý sa prehrá (pripravovaný článok č. 51)) nemusí uložiť nič iné než rozhodnutia každého sedadla a Replay.run ho z nich zahrá znova: mapa vznikne zo seedu a Flow hrá s rozhodnutiami zo záznamu. Z hry vychádza prúd udalostí (start, útok s cestou z jedného políčka na druhé, round, over). Prehrávač záznamu ich číta cez BoardEvents (338 riadkov, js/core/board-events.js: slová act a set, teda kto čo urobil a ako sa zmenil obsah políčok). Obraz partie, hudba a analýza ich čítajú priamo z prúdu Replay. Nikto z nich hru nemení; rozprávač tiež len pozoruje (Prvé tri minúty a prvé týždne).

Koniec partie je zatiaľ rozdelený na dva spôsoby. Adaptér hry vie vydať facts(game, ctx): výsledok, dĺžku, sedadlo človeka, úroveň AI a skóre. recordBoard v js/ui/app.js z nich urobí riadok histórie, skúsenosti, mince a úspechy realmu, ale len pre Kolóniu a Čiary. Hra s kockami má vlastnú cestu v showEnd. Jej facts existuje a test ju porovnáva so starou cestou (na dvanástich zlatých záznamoch a 32 partiách z 16 nastavení aj bajt po bajte profil, DESIGN §53.3 z 27. októbra), no nič ho nečíta.

Sedadlá: kto odpovedá na otázku „aký je tvoj ťah“

Každé sedadlo za stolom odpovedá cyklu hry na tú istú otázku: aký je tvoj ťah? Odpoveď sa líši len tým, kto ju dáva.

Sedadlá: kto odpovedá na otázku „aký je tvoj ťah“Schéma sedadiel hry. Štyri druhy sedadiel: človek (sedadlo 0, ťuk na dosku, Interaction.tap a Flow.humanAttack), AI v hlavnom vlákne (Kastgard, mozog cyklu hry a funkcia AI.choose), AI vo workeri (Colony a Čiary, funkcia choose a worker s AI) a vzdialený hráč, ktorý je len plán. Všetky štyri odpovedajú tomu istému cyklu hry Flow, ktorý sa pýta, aký je ťah sedadla, a výsledkom je stav hry a udalosti. Dole sú režimy, ktoré menia len to, kto kde sedí: sledovať hru (všetky sedadlá AI), nech dohrá AI (AI prevezme sedadlo človeka), prehrávanie záznamu (sedadlá čítajú rozhodnutia zo záznamu) a plánovaná výzva, aréna a hra s priateľmi.človeksedadlo 0ťuk na doskuInteraction.tap→ Flow.humanAttackAI v hlavnomvlákne(Kastgard)mozog Flow:attack(…) →AI.chooseAI vo workeri(Colony aČiary)choose(…) →worker s AI,ťah späťvzdialenýhráč(plán)ťah po sieti(zatiaľnič)Flow: cyklus hrypýta sa sedadla na ťah (človeka čaká), každé rozhodnutie má ten istý tvarstav hry a udalostiz nich sa číta obrazovka, záznam aj štatistikyrežimy len menia, kto kde sedísledovaťhru:každé sedadloje AInech dohrá AI:AI prevezmetvojesedadloprehrávaniezáznamu:sedadlá čítajúzo záznamuvýzva, aréna,hra s priateľmi(plán)plán, v kóde hry zatiaľ nič nie je (stav 6. 11. 2026)
Sedadlá: schéma kódu, nie meranie. Mená sú prečítané v kóde hry 0.122.0 (6. 11. 2026). Čiarkovane je to, čo je len plán (ROADMAP kap. 4 a 11, docs/ARENA.md); v js/ hry nie je sieťový kód.

Človek odpovie ťuknutím: cez dvere Flow.humanAttack (a ich súrodencov: presun kociek, rozloženie kociek, koniec ťahu). Cyklus hry na to čaká. AI v Kastgarde odpovie funkciou. Flow má mozog pre sedadlá, ktoré nie sú človek, a ten je zmluva s dvoma funkciami, attack(game, player, k, rng) a place(…). Bežný mozog Bots.brain volá AI.choose(game, player, …) v hlavnom vlákne stránky; úroveň (1 až 3) a osobnosť sedadla si berie zo stavu hry. AI v Kolónii a v Čiarach odpovedá funkciou choose(game, player, level). Pohľad ju posiela workeru (worker/bot.js) ako snímku stavu a dostane ťah späť, lebo hľadanie úrovne 3 trvá až sekundu (v Čiarach na veľkej doske) a worker nechá stránku živú; ak worker zlyhá, zahrá sa najjednoduchší legálny ťah.

Ďalšie dva „mozgy“ nie sú AI hry, ale tá istá otázka. Pri prehrávaní záznamu dostane Flow skript, ktorý číta rozhodnutia zo záznamu, a žiadna AI sa nespýta. Nech dohrá AI nechá AI hrať cez tie isté dvere ako človeka (Flow.autoHuman), takže partia je tá istá hra s tými istými hodmi. Režimy teda menia, kto kde sedí, a nie pravidlá.

Poctivo k tomu patrí, že sedadlo je dnes skôr smer než hotová abstrakcia. Cyklus hry má jeden mozog pre všetky sedadlá, ktoré nie sú človek, nie samostatný ovládač pre každé sedadlo, a človek je vždy sedadlo 0 (humanAttack pozerá, či je políčko vlastníka 0). Režim Sledovať hru preto musí vypnúť štyri miesta, kde kód počíta so sedadlom 0 ako s človekom (hlavička watch.js). Skutočné druhé ľudské sedadlo by sa bez zásahu do cyklu hry nezaobišlo.

Vzdialené sedadlá, aréna a hra s priateľmi sú plán. ROADMAP kapitola 4 (miestnosti s kódom, AI za chýbajúcich) hovorí „nothing is built“, docs/ARENA.md je koncept z 23. októbra, ktorý je „not approved and not started“, a v js/ nie je sieťový kód (hľadanie WebSocket, RTCPeerConnection a EventSource tam nič nenašlo; nálezy sú len v nástrojoch hry, napríklad na kontrolu v prehliadači). Postavené je to, čo by sa na také sedadlo hodilo: záznam s rozhodnutiami každého sedadla a prehrávanie, ktoré overí partiu od cudzieho hráča bez AI. To je podľa mňa základ, nie sieť, a stav plánov nie je sľub.

Čo to drží pokope

Obrázky by boli len kresba, keby ich nikto nestrážil. Pri tomto projekte sú to testy a nástroje, ktoré zhodia zmenu, ktorá porušuje pravidlo; skúšky sú z kópie stromu hry:

StrážNástrojSkúška
smer použitiapackages.js --checkriadok v Kolónii siaha na Rules → FAIL rokgard/colony -> kastgard/stacks (vyššie)
správca realmov nepozná hrutest „the manager knows no game“v realms.js pribudne reťazec 'colony' → test vypíše 7: const favourite = 'colony';
názvy súborov podľa rolefile-template.js --checkcore/colony-extras.js v Kolónii → názov nesie „colony“, ktoré už hovorí priečinok; premenuj ho podľa účelu
rozloženie testovtests-layout.js --checktest v koreni tests/ → patrí do priečinka balíka, ktorého správanie dokazuje
čistota súboru knižnicetest „the file is pure“ (board-events.test.js)neskúšané, test je prečítaný → zakazuje DOM, hodiny, úložisko, náhodu, require a mená hier

Dve odpovede v tabuľke majú dôležitú vlastnosť: hovoria, ako to opraviť. Súbor s nevhodným názvom dostane vetu „premenuj ho podľa toho, na čo slúži, bez mena balíka (role Kolónie v core/ sú game, ai, flow, setup, ruleset, events)“. Test v koreni tests/ dostane „polož ho do priečinka balíka, ktorého správanie dokazuje, alebo do tests/tools/ pre nástroj“. Podľa mňa je to dôvod, prečo sa takáto stráž nevypne pri prvom meškaní: pravidlo, ktoré len zhodí build a nepovie, čo robiť, sa obchádza.

Test čistoty board-events.js ukazuje tretí druh stráže, nie smer hrán, ale charakter súboru. Súbor board-events.js musí byť čistá funkcia, takže jeho kód (bez komentárov a textov) nesmie obsahovať document, window, localStorage, Date, Math.random, fetch ani require(, a nesmie pomenovať hru ani jej ťah (dice, colony, attack a ďalšie). Čistota jadra bez DOM nie je len želanie: tie isté súbory beží hra v prehliadači, v testoch bez prehliadača a vo workeri.

Kód a testy podľa balíkovPre každý z deviatich balíkov dva pruhy: riadky kódu a dát (bez katalógov textov) a riadky testov, ktoré ležia v priečinku balíka. Najväčšie je jadro core (27 598 riadkov kódu a 43 724 riadkov testov), potom stacks (21 823 a 28 651) a campaign (6 029 a 8 055). Vitgard a Telgard majú po asi 185 riadkov kódu a 143 riadkov testov.kód a dátatestycore102 / 121 súb.27 59843 724kastgard - stacks72 / 67 súb.21 82328 651kastgard - campaign32 / 26 súb.6 0298 055kastgard8 / 4 súb.2 0181 088rokgard - colony10 / 9 súb.1 9993 068rokgard - lines11 / 10 súb.2 5854 479rokgard12 / 9 súb.1 6372 620telgard3 / 2 súb.186143vitgard3 / 2 súb.185143Pod menom: súbory kódu / súbory testov.Spolu 64 060 riadkov kódu a dát a 91 971 riadkov testov.K tomu 102 súborov testov nástrojov (13 247 riadkov);texty (katalógy deviatich jazykov) sa nepočítajú.
Riadky súborov js/ bez katalógov textov a riadky súborov *.test.js, ktoré ležia v priečinku balíka (hra 0.122.0, 6. 11. 2026). Pod menom je počet súborov kódu a súborov testov.

Testy ležia tam, kde kód: test súboru js/<priečinok>/x.js je v zrkadle tests/<priečinok balíka>/<priečinok>/x.test.js. Nástroj tests-layout.js hlási 352 súborov testov (250 testov balíkov a 102 testov nástrojov). Test čistého balíka smie pomenovať len súbory jadra a svojho balíka, s jednou zapísanou výnimkou: test Kolónie potrebuje skutočnú hru s kockami, aby dokázal, že obe hry odmietnu snímku tej druhej. Všetkých testov je 4 609; plný verify.js na čistom strome prešiel (4 608 prešlo, 1 preskočený, 1 890 sekúnd), čo opisuje článok o pečiatke (pripravovaný článok č. 37).

Čo sa pri stavbe ukázalo inak a čo je dlh

Pri stavbe sa architektúra od návrhu odchýlila a práve tie odchýlky sú poučné. Štyri sa našli už počas práce. Prvá: jadro nie je čisté, má 95 hrán nahor (vyššie). Druhá: Kastgard sa fyzicky presunul do js/realms/kastgard/ až 31. októbra (028), no id realmu v kóde zostalo stacks, lebo id sa nemení, keď sa mení meno (tak to hovorí hlavička manifestu). Premenovalo sa až 6. novembra 2026 na kastgard a hlavička má od vtedy jednu zapísanú výnimku. Prepísalo sa len to, čo si hráč uložil pod starým id: predpona úspechov (stacks_… na kastgard_…) a rozloženie domovskej obrazovky, raz, pri štarte hry; čas aj poradie úspechov ostali. Id hry, jej pravidiel a balíka kastgard/stacks ani kľúče textov hry sa nezmenili. Dokázalo sa to na dátach starého kódu: 51 profilov, 1 193 kľúčov, 357 prechodov a 13 rozložení vyšlo po prepise rovnako, okrem premenovaného id. Opačným smerom to neplatí: starý kód nové dáta načíta, no nepozná nové ids, takže by znova odomkol úspechy a vyplatil Zlaté kocky; na starý kód sa preto po publikácii nevracia. Tretia: mená a postavenie sa menili. Realm hier na doske sa volal Sporgard, potom Taflgard a od 31. októbra Rokgard, kampaň bola najprv realm, potom sekcia a od 31. októbra hra, ktorá stavia na inej hre, hoci sa v kóde stále pripája volaním Realms.registerSection (028, Dve premenovania za jeden deň (pripravovaný článok č. 44)). Štvrtá: jedno jadro textov pre všetkých sa rozdelilo na stromy v balíkoch, aby nový realm nemusel písať do cudzích súborov (038).

Piata sa našla až pri čítaní kódu pre tento článok. Zmluva hovorí, že správca realmov vie od realmu žiadať hub, saves, daily a weekly. Hľadanie v js/ ukázalo, že tie hooky volajú len testy: dlaždice, rozohrané hry a denná výzva sa čítajú z tabuľky režimov a z obalu. Zmluva je v kóde, otestovaná a čaká na volajúceho.

Dnešný stav častí z návrhu v jednej tabuľke (hra 0.122.0, 6. 11. 2026):

ČasťStav (hra 0.122.0, 6. 11.)
pohľad dosky, vykresľovač, StacksBoard.viewhotové; aj Kolónia a Čiary majú vlastný popis dosky
BoardInput a jedno rozhodovanie k ovládaču hryhotové (29. 10.); ovládače: Interaction, ColonyView, ChainsView
BoardEvents (act, set)hotové (30. 10.); číta ich prehrávač záznamu hry s kockami; adaptér Kolónie existuje, ale stránka ho nenačíta (len testy); obraz, hudba a analýza čítajú ešte prúd Replay
facts()používa ho Kolónia a Čiary; hra s kockami má vlastnú cestu
správca realmov, manifesty, sekcie, start(ctx)hotové, štyri realmy a jedna sekcia; hooky hub, saves, daily, weekly bez volajúceho
profil, úroveň a minca podľa realmuhotové; skriňa Rokgardu 5. 11.
AIKastgard v hlavnom vlákne, Kolónia a Čiary vo workeri; spoločná súprava na hľadanie (krok B9) čaká: dve samostatné vyhľadávania, 474 a 490 riadkov
vzdialené sedadlá, aréna, hra s priateľmiplán, v kóde hry nič

Dlh má teda päť pomenovaných kusov: 95 hrán proti smeru (z toho 40 v app.js), facts pre hru s kockami, hooky bez volajúceho, spoločné miesta pri novej hre a súprava na hľadanie pre AI dosiek. Všetky sú v dokumentoch hry; žiadny nie je sľub, že sa spraví.

Čo si z toho odnášam

  • Pravidlo bez západky je prianie. „Jadro nepozná hru“ je pekná veta, ale hodnotu má až s tabuľkou, ktorá povie, že dnes 95 hrán platí a viac nebude. Číslo sa dá znížiť a zvýšenie je viditeľné v histórii.
  • Schéma sa starne rýchlejšie než kód. Návrh z 29. októbra mal po týždni zastarané stavy (krok B3 „nezlúčené“, udalosti „plánované“, profil po realmoch „beží“), dve nepravdivé tvrdenia (že jadro nepozná hru a že rozohrané hry a výzvy čítajú obrazovky od správcu realmov) a jedno prehnané (že každé sedadlo má ovládač svojho druhu). Preto sa obrázky kreslia z nástroja, nie z hlavy, a majú dátum.
  • Registrácia zmenšuje spoločné miesta, nezruší ich. Z 20 registračných miest je 13 v súboroch, ktoré upravuje každá hra. Pravda je užitočnejšia než veta „bez zásahu do obalu“.
  • Sedadlo je smer, nie hotová vec. Cyklus hry má jeden mozog a človeka na sedadle 0. Sieť by ho zmenila tak, ako ho zmenil režim Sledovať hru.
  • Stráž má povedať, ako to opraviť. Správa, ktorá nepovie postup, sa po čase obchádza; tie z tabuľky ho hovoria.
  • Čo je plán, má byť čiarkované. V obrázkoch aj v texte sa plán a stav oddeľujú: rozdiel, ktorý hráča, čitateľa aj vývojára najviac mýli.

Zdroje a poznámky

  • Stav a dáta: hra Audamir 0.122.0 (6. 11. 2026); hra sa len čítala. Návrh z 29. 10. 2026 je v dokumentoch hry (docs/mockups/architecture.html).
  • Balíky, hrany a riadky: node tools/packages.js --check (338 súborov, 1 370 hrán, 95 proti smeru v 21 súboroch), tools/packages-table.json a história západky v jej commitoch; testy podľa testDirs tabuľky.
  • Registrácia, ťah a sedadlá: hľadanie volaní register v súboroch balíkov, js/ui/board-input.js, js/core/board-events.js, flow.js a bots.js; DESIGN §53.3, §80.6, §104.3 a §104.5.

Poznámky

  1. Do verzie 0.65.6 z 31. októbra 2026 sa volal Klasik. ↩︎