
Na žiadosť mnohých čitateľov sa začína veľký cyklus článkov o aplikácii technológie serverless výpočtov na vývoj skutočnej aplikácie. V tomto cykle sa bude skúmať vývoj aplikácie, testovanie a dodanie koncovým používateľom s využitím moderných prostriedkov: mikroservisnej architektúry aplikácie (v serverless variante, založenej na ), klastru na nasadenie aplikácie, databázy , orientovanej na cloudovú klasterizáciu a aplikáciu, ako aj na cloudový bus . Aplikácia implementuje hru „Byliny“, jednu z variant populárnej salónnej hry „Mafia“.
Čo sú „Byliny“?
Je to variant hry „Mafia“, tiež známa ako „Werewolf“. Jej základom je tímová hra, pri ktorej účastníci musia krok za krokom zistiť, kto je kto, a pokúsiť sa vyhrať. Bohužiaľ, pri hraní cez sieť sa vytráca taká dôležitá súčasť hry, ako osobná interakcia, a pravidlá klasickej „Mafie“ sú dostatočne jednoduché, preto sa pre zaujímavejší a menej lineárny herný proces zvyčajne pridávajú ďalšie postavy, no v zásade zostávajú zachované hlavné črty originálnej „Mafie“, ako napríklad striedanie dňa a noci, ťahy len v noci, ako aj spojenectvá medzi účastníkmi. Dôležitým rozdielom hry cez sieť je aj to, že moderátor (ten istý Hlavný hráč, Rozprávač) je zvyčajne počítačový program.
Popis hry
Pravidlá hry, ktorú chcem realizovať, sú prevzaté zo starého irc-bota, ktorý som si uchoval vo svojom osobnom archíve pred asi 10 rokmi. „Byliny“ majú príbeh, ktorým každá hra začína:
V tridsiatom kráľovstve, v tridsiatom štáte, za siedmimi moriami, žili si niektoré dedinky, a v nich Dobrí mladí muži a Krásne dievčatá. Siali obilie, a chodili do okolitých lesov na huby a bobule... A pokračovalo to tak z generácie na generáciu, kým strašná katastrofa nepodmanila Zem a zlo nezačalo prenikať do sveta! Noci sa stali dlhými a chladnými, a v tme sa potulovali po lese a zavítali do dediny zlé a strašidelné bytosti. Priletel odniekiaľ Zmej Gorynych a začal kradnúť krásne dievčatá a brať všetko cenné od rolníkov. Zlá a chamtivá Baba-Jaga, ktorá priletela na metle z ďalekých lesov, zmiatla rozum obyvateľov, a dokonca niektorí zanechali remeslo a odišli do lesa lúpiť, kde si tam zriadili bandu. Zločinci sa stretli Leshy, who could transform into trees and bushes, began to watch over the peaceful villagers and serve the robbers, sniffing if the Brave Young Men were planning something to free their settlements from evil spirits. The Brave Young Men and the Beautiful Maidens, tired of the bandit raids and terrible deaths at the hands of the fearsome One-Eyed Evil, gathered gold and invited a renowned fighter from a neighboring city — Ivan Tsarevich, who promised to rid the village of robbers. In a glade in the forest, Ivan saved from impending doom Gray Wolf, who had fallen into a bandit's pit trap. In return, the Wolf promised to inform the Tsarevich about various forest evils. A famous healer passed by Vasilisa the Wise, and when she saw the trouble — she stayed to nurse the residents who had suffered from the attacks of miscreants. Behind the forest appeared a black palace, where, according to rumors, settled Koschei the Deathless, who visited the villages every night and enchanted the Brave Young Men and Beautiful Maidens so that they would not dare disobey his orders, and all did as he commanded. In the Lifeless Forest lived Cat-Baian, and anyone who encountered him fell into a dead sleep after his tales or perished by his iron claws.

The Three-Nine Kingdoms
As can already be seen, players are divided into several groups:
- peaceful inhabitants (Brave Young Men, Beautiful Maidens, Ivan Tsarevich, Gray Wolf, and Vasilisa the Wise)
- bandits (the bandits themselves, as well as Baba Yaga and Leshy)
- independents (Zmey Gorynych, One-Eyed Evil, Tsarevna Frog, Koschei the Deathless, Cat-Baian)
The goal of the game, as mentioned above, is to stay alive and win. Opponents must leave the game one way or another, and independents must also survive until the end of the game. There is gold in the game, a kind of in-game currency that players earn only inside the game. The winners receive gold. The more gold, the higher the player’s rating.
Let me elaborate a bit more on the character descriptions.

Brave Young Man

Beautiful Maiden
Brave Young Man a Beautiful Maiden — najmasovejšia a základná úloha v hre. Toto sú pokojní obyvatelia, ktorí v noci spia a cez deň pracujú. V noci na nich zaútočí niekto z lupičov, Zmaj Gorynych a iné úlohy, a Vasilisa Premudra ich lieči. S určitým, malým pravdepodobnosťou môže Dobrá mládenec alebo Červená dievčina prežiť útok bez ujmy (možno pri tom stratiac zlato), avšak všetci sa dozvedia pseudonym hráča hneď nasledujúci deň po útoku na ochranu. V noci títo hráči nerobia nijaké ťahy, ale analyzujú hernú situáciu na základe správ v hernom chate. Cez deň títo hráči rozhodujú prostredníctvom hlasovania, kto z nich nie je Dobrá mládenec alebo Červená dievčina. Hráč, za ktorého hlasovalo väčšina ostatných hráčov, odchádza z hry, zostávajúci získavajú alebo strácajú zlato. Ak hráči nevybrali nikoho väčšinou hlasov, nikto z hráčov nebude poprávený.

Ivan-Cárevič
Ivan-Cárevič — pôvodne anonymný ochranca pokojných obyvateľov. V noci preveruje úlohy ostatných hráčov, pretože pozná len jedného svojho spojenca — Sivého Vlka. Pri priamom zapojení Sivého Vlka (ktorý tiež môže preveriť úlohy ostatných hráčov) môže Ivan-Cárevič namiesto preverovania v noci zabiť inú postavu. Ak pri kontrole Ivan-Cárevič vidí úlohu Dobrého Mládenca alebo Červenej Dievčiny u hráča, môže ich pozvať k sebe a zoznámiť so Sivým Vlk a ostatnými Dobrými Mládencami a Červenými Dievčinami. Ivanovi môže zabrániť Cárevna-Jazýčka, ktorá ho môže v noci zviesť, a pritom neprezradiť jeho úlohu ostatným hráčom cez deň. Ak Ivan sám odhalí Cárevnu-Jazýčku, môže jej navrhnúť pripojiť sa k pokojným obyvateľom, avšak ak Cárevna odmietne, zomrie z ruky Ivana. Zmaj-Gorynych tiež môže prekážať Ivanovým kontrolám, ale na rozdiel od Cárevny-Jazýčky, cez deň povie ostatným hráčom, kto z nich je Ivan-Cárevič. Cez deň sa Ivan-Cárevič ničím nelíši od ostatných Dobrých Mládenec.

Sivý Vlk
Sivý Vlk — pomocník Ivana-Careviča, ktorého bystrý nos pomáha Ivanovi nájsť ďalších Dobrých Mladcov a Červených Dievčat. Sivý Vlk hovorí týmto hráčom, kto je Ivan-Carevič, a tiež informuje o ďalších hráčoch s rolami Dobrých Mladcov a Červených Dievčat. Ak Vlk objaví zbojníka alebo iného protivníka, okamžite to oznámi Ivanovi-Carevičovi, aby ten na nasledujúcu noc prijal opatrenia. Ak na Vlka zaútočí Carevná-Jazvec, premení sa na bežného Dobrého mladca a nemôže nikomu kontrolovať, a Carevná si nevšimne, že to v skutočnosti bol Sivý Vlk, pretože Vlk v noci nespí. Avšak Vlk cez deň zistí, kto z hráčov je Carevná-Jazvec, a môže sa pokúsiť presvedčiť ostatných Dobrých Mladcov a Červené Dievčatá, ktoré priviedol k Ivanovi-Carevičovi, hlasovať za popravu Carevny-Jazvec. Tiež na nasledujúcu noc sa môže pokúsiť anonymne presvedčiť Carevnu-Jazvec na stranu pokojného obyvateľstva, aby nikoho z nich neohrozila. Vlk v noci môže obetovať seba, aby zachránil Ivana-Careviča alebo Vasílii Premúdru, ak predpokladá, že tí sa náhodou dostanú pod útok zbojníkov, alebo že boli zombifikovaní Kosejom (Vlk má vrodenú imunitu voči čarom Koseja), ale Vlk po obetovaní vypadáva zo hry.

Vasilisa the Wise
Vasilisa the Wise — hrá za pokojných obyvateľov, avšak oni o nej nevedia, pretože Vasília je veľmi skromná. Takisto Vasília Premúdra, keď lieči, nepýta sa na otázky a ako dobrý doktor lieči všetkých bez rozlišovania. Ale ak jej liek vypije Kosej, Licho alebo Lešij — nebudú žiť dlhšie ako jeden deň, pretože Vasília lieči iba ľudí. Had Gorynych alebo Mačka-Bajunovi lieky Vasílie Premúdrej tiež nepomôžu, ale ani žiadnu škodu nenapáchajú. Tiež Vasíliu v noci netrápi Mačka-Bajun, pretože pre liečivé byliny Vasília nechodí do Bezživotného Lesa. Okrem toho ženské čary Carevny-Jazvec na Vasíliu neúčinkujú. Ak sa jej pacienta pokúsia zabiť dvakrát, medicína bude bezmocná. Vasília ani nezachráni pred magickými útokmi, napríklad pred kliatbou Licha. Cez deň sa Vasília správa ako Červené Dievča, a iba krátky, trochu smutný pohľad môže naznačiť, že je najlepšou liečiteľkou v Triddesiatom kráľovstve.

Zbojník
Zbojníci, na rozdiel od všetkých predchádzajúcich rolí, sa navzájom poznajú, pretože žijú v jednom Doupěte, a tiež poznajú Lesovika a Babu Jagu, a preto môžu konať súhlasne už od prvého ťahu. Ale len Vodca bandy koná v noci a nehlasuje počas dňa, kým ostatní Zbojníci pilne predstierajú, že sú Dobrí Mladíci a Červené Dievčatá. Ak Vodca vypadne z hry z akéhokoľvek dôvodu, jeho miesto okamžite zaberie jeden z ostatných Zbojníkov. V prvom rade sa Zbojníci snažia vyradiť Ivana-Careviča, kým nezískal dostatok síl od Dobrák a Červených Dievčat na aktívne odporovanie Zbojníkom cez deň.

Lesník
Lesník v noci špehuje pre Zbojníkov, informuje ich o nájdených rolách v ich Doupěti, ale cez deň nehlasuje, pretože nežije v dedine. Iní hráči však môžu hlasovať za Lesníka a tak ho popraviť. Keďže Lesník pochádza z močiarov, nemôže ho zvádzať Princezná Žaba, a ak sa o to pokúsi, Lesník označí jej dom, a obyvatelia dediny sa dozvedia, kto je v skutočnosti. Lesník sa nemusí obávať ani mágie Koshcheya, ale Vasilisa ho môže uzdraviť až k smrti. Ak sa Mačka-Bajun pokúsi zaútočiť na Lesníka, riskuje, že stratí svoje železné pazúry, a nakoniec bude Mačka musieť uspať obete len svojím mňaukaním.

Baba-Jaga
Baba-Jaga rovnako spolupracuje so Zbojníkmi, v noci kúzli: môže buď naškodiť iným hráčom, alebo ochrániť niekoho zo spojencov pred útokom. Jej kúzlo je dokonca silnejšie ako kliatba Licha. Cez deň je Baba Jaga tiež aktívna: toho, koho má pod ochranou, nemožno popraviť ani väčšinou hlasov. Avšak zásoby kúzelných koreňov na dennú ochranu sú obmedzené, takže Baba Jaga nemôže ochrániť nikoho, vrátane seba, viac ako trikrát za hru. Pri tom si cez deň Baba Jaga hrá na obyčajnú Červenú Dievčinu a hlasuje so všetkými.

Had Gorynych
Had Gorynych v noci lieta nad dedinami, lesmi a močiarami, zaoberá sa lúpežou a cez deň zohráva úlohu obete. Cez deň Zmij spí, a preto nehlasuje, no môže byť popravený většinou hlasov. Zmij je veľmi nebezpečný pre všetkých, najmä pre Zbojníkov a Ivana-Careviča. Zmijovi je jedno, koho okradne, ale ak ho odhalí Vl kom, alebo Leshij, môže sa stať cenným spojencem. Ak Zmija zabijete v noci, môžete s určitou pravdepodobnosťou získať veľmi cenný predmet — Zmijovu Kožu, ktorá ochráni svojho majiteľa raz pred fyzickým útokom.

Zlomyseľný Jednooký
Zlomyseľný Jednooký v noci zabíja všetkých, ktorí mu prídu do cesty, a tých, ktorých zabiť nemôže (Leshij, Kocúr-Bajun alebo Zmij Gorynych) — prekľaje, takže každý, kto sa pokúsi komunikovať s prekliatym v tú istú noc, zomrie počas dňa. Samotný prekliaty pritom tiež zahynie, nezomiera len Kocúr-Bajun, ktorý sa jednoducho vráti spať, aby si získal sily, pričom preskočí svoj ťah nasledujúcu noc. Pred prekliatím môže zachrániť len Baba-Jaga. Prekliatie neplatí ani na toho, kto porazil Kocúra-Bajuna: on, rovnako ako Kocúr, sa jednoducho vráti spať a preskočí ťah.

Princezná-Rozprávka
Princezná-Rozprávka nedokáže vyhrať hru, ale môže zarobiť veľmi veľa peňazí, zvádzajúc ostatných hráčov v noci. Zlovený pritom preskočí svoj ťah. Žaba nemôže zviesť Vasilisu Premúdru a mala by sa vyhýbať Leshijovi, ktorý ju prezradí všetkým nasledujúci deň. Ak Ivan-Carevič alebo Vodca Zbojníkov nájdu Žabu, môžu ju pozvať na stranu mierových obyvateľov alebo Zbojníkov, pričom Ivan neprijíma odmietnutie Žaby, ale Vodca nie je tak náročný. No Princezná je dosť prefíkaná, môže sa stať dvojitým agentom, pretože aj keď sama nemôže vyhrať, — je to skvelá príležitosť získať zlato, pretože šance na dosiahnutie konca hry sa výrazne zvyšujú! Cez deň sa Princezná-Rozprávka pretvaruje na Červenú Dievčinu a hlasuje so všetkými ostatnými.

Koschei the Deathless
Koschei the Deathless žije vo svojom zámku. V noci chodí po okolitých dedinách a zombifikuje Dobré Mládežníky a Červené Dievčatá, ktoré prechádzajú k nemu na službu a bezpodmienečne plnia všetky príkazy. Odmietnutím vykonať príkaz, napríklad hlasovať cez deň inak ako to prikazuje Košej, alebo písať správy cez deň v chate, ak to Košej zakázal, Slúha Košeja zahynie. Týmto spôsobom môže Košej ovplyvniť výsledky hlasovania cez deň, hoci sám osobne nehlasuje. Ak Košeja zabijú, všetky jeho obete tiež zomierajú. Vasiliša môže uzdraviť Sluhu Košeja, ktorý sa potom vráti k svojej pôvodnej úlohe. Zmaj-Gorýnyč a Vlk majú vrodenú imunitu voči zombifikácii, takže Košej aj so všetkou svojou túžbou nemôže premeniť ich na svoju službu. Vlk tiež môže zachrániť Ivana alebo Vasilišu obetovaním sa. Zachránený Vlk získava Vlkú imunitu voči zombifikácii.

Cat-Baian
Cat-Baian žije v lese, v noci loví. Cez deň spí vo svojom dube, takže sa nezúčastňuje hlasovania. Avšak cez deň ho môžu popraviť väčšinou hlasov. Mačka môže útočiť dvoma spôsobmi: mňaučaním – a vtedy jeho obeť zaspáva a nemôže chodiť v noci, a tiež hlasovať na nasledujúci deň, – alebo zabíjaním ihneď železnými pazúrmi. Útok pazúrmi nefunguje na Zmaj-Gorýnyč, a ak zaútočí na Lešého, Mačka môže ostať bez pazúrov! Lich nemôže prekliat' Mačku, ktorá po prekliatí jednoducho spí jednu noc. Ak niekto dokáže poraziť Mačku-Bajúna, vylieči sa z akejkoľvek choroby a neduhu, vrátane prekliatia Licha. Táto Mačkova schopnosť zostáva u hráča až do konca hry. Sluhovia Košeja nemôžu cez deň hlasovať za Mačku, ale môžu nepriamo zistiť, kto Mačka je, bez toho, aby to oznámili Košeja. Mačka-Bajún nevstupuje do aliancií s Ivanom alebo Zbojníkmi, takže oni sú pre Mačku prioritným cieľom.
Používané technológie
Na napísanie hry som si vybral technológiu bezserverového spracovania (serverless) založenú na OpenFaaS, pretože je dostatočne jednoduchá na organizovanie hry a zároveň dostatočne rozvinutá na písanie zložitých herných pravidiel bez zbytočného komplikovania. Takisto budem používať klaster Kubernetes, pretože tento spôsob nasadzovania aplikácií umožňuje pomerne jednoduché a spoľahlivé rýchle nasadenie a ľahké škálovanie. Na vytvorenie hernej logiky môžem vystačiť iba s OpenFaaS, avšak pokúsim sa tiež vytvoriť Rozprávača ako samostatný kontajner, aby som porovnal zložitosť implementácie. Ako hlavný programovací jazyk pre mikroslužby a funkcie som si vybral , pretože sa mu už dlhodobo venujem vo voľnom čase ako náhrade za Perl, a na interakciu používateľov s mikroslužbami a funkciami sa bude používať js založený na nejakom frameworku. O konečnom rozhodnutí sa podelím v príslušnom článku cyklu. Na komunikáciu funkcií medzi sebou som zvolil NATS.io, pretože som sa s ňou už predtým stretol a jej integrácia do Kubernetes je dosť jednoduchá.
Oznámenie
- Úvod
- Nastavenie prostredia pre vývoj, rozdelenie úlohy na funkcie
- Práce na backendu
- Práce na frontende
- Nastavenie CICD, organizácia testovania
- Spustenie skúšobnej relácie hry
- Zhrnutie
Zdroj: habr.com
