Bang!
Online

Karetní hra · Týmový projekt
Bang! Online: tři westernové karty rubem nahoru s BANG! textem a šerifskou hvězdou.

Bang! Online je digitální verze klasické westernové karetní hry pro 4–7 hráčů (šerif, jeho pomocníci, bandité, odpadlík). Náročná část Bangu není nakreslit karty, ale správně naprogramovat, kdo hraje, kdo reaguje a co se stane, když někdo uprostřed reakce zemře a spustí schopnost.

Přispěla jsem do týmového projektu. Věnovala jsem se hlavně hernímu enginu, schopnostem hrdinů a synchronizaci UI s tím, co se právě děje ve hře.

Role Vývojářka v týmu
Typ Karetní hra · WIP
Období Od února 2026
Technologie
TypeScript React 19 Vite 6 tRPC v11 WebSocket subscriptions Drizzle ORM better-sqlite3 pnpm workspaces Railway deploy

Server drží kanonický stav hry a přes tRPC WebSocket subscriptions ho posílá všem připojeným klientům. Když engine přejde do nové fáze (například „čeká na záchranu Pivem"), všechny prohlížeče to vidí okamžitě.

Herní logika (definice karet, sekvence tahů, reakcí) žije v samostatném shared/ package. Server ho používá pro execution, klient pro type-safe UI. Tak je vyloučené, aby se klientská a serverová představa o pravidlech rozjela.

Herní engine je srdce projektu. Nejzajímavější situace, které jsem tam doplňovala:

  • Simultánní reakce (Indiáni, Kulomet): karta střílí na všechny protihráče najednou. Každý musí odpovědět Bangem nebo Vedle. Když někdo uprostřed reakce zemře, jeho schopnost může řetězec ovlivnit, ale zbytek fronty musí pokračovat, nesmí se vynulovat.
  • Losovací karty (dynamit, vězení): karta se táhne z balíčku, ale schopnosti některých hrdinů do losu můžou zasáhnout. Engine se zastaví a čeká na hráčovo rozhodnutí, místo aby losování rovnou vyhodnotil.
  • Záchrana Pivem: pokud hráč dostane smrtelný zásah, může zahrát Pivo a vrátit se na 1 život. Engine musí počkat na jeho rozhodnutí, jinak hráč zemře předčasně.
  • Přežití rejoinu: pořadí kola a stav hráče musí sedět, když někdo obnoví stránku a vrátí se do hry. Ošetřila jsem, aby po opuštění a návratu nebyl přeskočen třeba i šerif.

Herní obsah Bang! nejsou jen bang-karty. Každý hrdina má unikátní pasivní schopnost, která reaguje na herní událost (dostane poškození, líže kartu, umře). Věnovala jsem se registru akčních karet a schopnostem hrdinů.

Implementovala jsem pět postav: El Gringo (ukradne kartu tomu, kdo mu dá poškození), Bart Cassidy (líže kartu za každé poškození), Black Jack (líže navíc při ♥ nebo ♦), Jourdonnais (virtuální barel proti Bangu) a Vulture Sam (bere karty po zemřelých). Navíc odměna pro šerifa za zabití bandity. Získá 3 karty i uprostřed hromadné reakce z Indiánů/Kulometu.

UI musí být okamžitě synchronní s tím, co dělá engine, jinak hráč vidí zastaralé volby nebo tlačítka, která nedávají smysl.

  • Přežije refresh: jméno hráče a session token v localStorage. Když někdo omylem zavře záložku, po návratu je zpátky ve hře, ne v lobby.
  • Konkrétní reakce, ne obecné typy: tlačítka pro reakci ukazují přesně, jakou kartou reaguješ (♥8 Vedle), ne jen „Vedle".
  • Zvýraznění karet: nově lízlá karta blikne, po 3 vteřinách zhasne. Malá věc, díky které hráč nepřehlédne, co dostal.
  • Přehlednost boje: kdo na koho dosáhne výstřelem, kdo padl a v jaké roli, jaká byla poslední odhozená karta.
Rozehraná partie: hráči s pasivními schopnostmi a životy, dostřel zbraně, odhozená karta, výzva k reakci „Select a target", log hry.

Dvě situace, které mi u projektu nejvíc zabraly hlavu:

Když někdo zemře uprostřed hromadné reakce

Indiáni vystřelí na všechny protihráče najednou. Každý musí odpovědět. Pokud někdo z nich při této reakci zemře, jeho schopnost (Bart Cassidy si líže kartu za poškození, El Gringo ukradne poškozovateli kartu) se může spustit ve stejný okamžik.

Engine si musí zapamatovat, kde ve frontě reakcí byl, schopnost vyřídit a pak plynule pokračovat. Bez toho by se hra zasekla nebo někoho přeskočila.

Kdy hra rozhoduje sama a kdy má čekat

Většina karet vyřeší svůj efekt hned. Ale losovací karty (dynamit vybuchne na určitých kartách, vězení tě přeskočí) mají háček: některé hrdinské schopnosti do losu můžou zasáhnout a výslednou kartu změnit.

Engine se zastaví, ukáže losovací kartu a čeká, jestli hráč se schopností chce zasáhnout. Až po jeho rozhodnutí výsledek vyhodnotí jako platný.

Hra je nasazená na Railway a hratelná v prohlížeči. Multiplayer 4–7 hráčů s kompletním base gamem plus Dodge City expansion (31 postav, ~130 karet) funguje bez zásadních bugů. Chain reakce Indiánů i Kulometu se drží fronty i když někdo uprostřed zemře.