Novi Bujlin. Za dev, ops in radovedne ljudi

Novi Bujlin. Za dev, ops in radovedne ljudi

По многочисленным просьбам читателей начинается большой цикл статей о применении технологии бессерверных вычислений для разработки реального приложения. В этом цикле будет рассмотрена разработка приложения, тестирование и поставка конечным пользователям с использованием современных средств: микросервисной архитектуры приложения (в serverless варианте, на базе OpenFaaS), кластера kubernetes для развертывания приложения, базы данных MongoDB, ориентированной на облачные кластеризацию и применение, а также облачной шины NATS. Приложение реализует игру «Былины», один из вариантов популярной салонной игры «Мафия».

Что такое «Былины»?

Это вариант игры «Мафия», она же «Werewolf». В ее основе командная игра, при которой участники должны шаг за шагом узнать, кто есть кто, и попытаться выиграть. К сожалению, при игре по сети пропадает такая важная составляющая игры, как личное взаимодействие, а правила классической «Мафии» достаточно простые, поэтому для более нелинейного и интересного игрового процесса обычно добавляются другие персонажи, но в целом сохраняются основные черты оригинальной «Мафии», к примеру смена дня и ночи, ходы только ночью, а также союзы между участниками. Также важным отличием игры по сети является то, что ведущий (он же Мастер игры, Сказочник) это обычно компьютерная программа.

Описание игры

Правила игры, которую я хочу реализовать, взяты из старого irc-бота, которого я сохранил в личном архиве лет 10 назад. У «Былин» есть предыстория, которой начинается каждая игра:

В тридевятом царстве, в тридесятом государстве, за семью морями, жили себе поживали несколько деревушек, а в них Добры молодцы in Красны девицы. Сеяли они хлеб, да ходили в окрестный лесок по грибы и ягоды… И продолжалось так из века в век, пока страшная катастрофа не потрясла Землю и не стало зло расползаться по миру! Ночи сделались длинными и холодными, а темноте рыскали по лесу и забредали в деревню недобрые и страшные твари. Прилетел откуда-то Змей Горыныч и повадился воровать Красных девиц да отбирать все ценное у селян. Вредная и жадная Баба-Яга, прилетевшая на ступе из дальних лесов, смутила разум жителей, и даже кое-кто бросил ремесло и ушел в лес разбойничать, сколотил там шайку. Лиходеи повстречали Leshy, capable of turning into trees and bushes, began to watch the peaceful villagers and serve the robbers, sniffing whether the Brave Youths were planning something to free their settlements from evil. Brave youths and Beautiful maidens, tired of the attacks of the Robbers and the terrible deaths from the hands of the dreadful One-Eyed Haughty, gathered gold and invited a famous fighter from a neighboring city — Ivan Tsarevich, who promised to rid the village of the robbers. In a glade in the forest, Ivan saved from imminent death Gray Wolf, who had fallen into a robbers' pit. In return, the Wolf promised to inform the Tsarevich about various forest evils. A well-known healer Vasilisa the Wise, passing by, when she saw the trouble — stayed to care for the inhabitants who suffered from attacks by the evil ones. Behind the forest, a black palace appeared, where, according to rumors, settled Koschei the Deathless, who visited the villages every night and enchanted the Brave Youths and Beautiful Maidens, so they would not dare to disobey his orders, doing everything as he commanded. And in the Lifeless Forest settled Cat Bayun, and everyone who encountered him fell into a deadly sleep after his tales or perished by his iron claws.

Novi Bujlin. Za dev, ops in radovedne ljudi
The Three-Nine Kingdom

As can already be seen, players are divided into several groups:

  • peaceful inhabitants (Brave Youths, Beautiful Maidens, Ivan Tsarevich, Gray Wolf, and Vasilisa the Wise)
  • robbers (the robbers themselves, as well as Baba Yaga and Leshy)
  • independents (Zmey Gorynych, One-Eyed Haughty, Princess Frog, Koschei the Deathless, Cat Bayun)

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 remain alive until the end of the game. There is gold in the game, a kind of in-game currency that players earn only within the game. The winners receive gold. The more gold, the higher the player's rating.

I will elaborate a little more on the character descriptions.

Novi Bujlin. Za dev, ops in radovedne ljudi
Brave Youth

Novi Bujlin. Za dev, ops in radovedne ljudi
Beautiful Maiden

Brave Youth in Beautiful Maiden — osnovna in najmasovnejša vloga v igri. To so mirni ljudje, ki ponoči spijo, podnevi pa delajo. Ponoči jih napade kdo izmed roparjev, Zmaj Gorynych in druge vloge, Vaselisa Premudra pa jih zdravi. Z določenim, manjšim deležem verjetnosti lahko Dober mladenič ali Rdeča deklica preživita napad brez škode (morda ob tem izgubita zlato), vendar pa vsi naslednji dan po napadu izvejo vzdevek igralca zaščitne vloge. Ponoči ti igralci ne izvajajo nobenih potez, temveč analizirajo igro glede na sporočila v igri. Konec dneva pa ti igralci odločajo z glasovanjem, kdo med njimi ni Dober mladenič ali Rdeča deklica. Igralec, za katerega glasuje večina ostalih igralcev, izpade iz igre, preostali pa pridobijo ali izgubijo zlato. Če igralci ne izberejo nikogar z večino glasov, noben igralec ne bo usmrčen.

Novi Bujlin. Za dev, ops in radovedne ljudi
Ivan-Carevič

Ivan-Carevič — prvotno anonimni zaščitnik mirnih ljudi. Ponoči preverja vloge drugih igralcev, saj pozna le enega svojega zaveznika — Sivega Volka. Z neposredno udeležbo Sivega Volka (ki prav tako lahko preverja vloge drugih igralcev) lahko Ivan-Carevič, namesto preverjanja, ponoči ubije drugo osebo. Če pri preverjanju Ivan-Carevič vidi vlogo Dobrega mladeniča ali Rdeče deklice pri igralcu, jih lahko povabi k sebi in predstavi Sivega Volka ter druge Dobre mladeniče in Rdeče deklice. Ivanu lahko ovirajo Carica-Ribe, ki ga lahko ponoči zapelje in pri tem ne razkrije njegove vloge drugim igralcem podnevi. Če Ivan sam odkrije Carico-Ribo, ji lahko ponudi, da se pridruži mirnim ljudem, vendar, če Carica zavrne, umre iz roke Ivana. Zmaj-Gorynych prav tako lahko ovira Ivanova preverjanja, toda, v nasprotju z Carico-Ribo, bo podnevi povedal ostalim igralcem, kdo od njih je Ivan-Carevič. Podnevi Ivan-Carevič ne razlikuje od drugih Dobrih mladeničev.

Novi Bujlin. Za dev, ops in radovedne ljudi
Sivi Volk

Sivi Volk — pomagač Ivana Carjeviča, čiji oštar njuh pomaže Ivanu da pronađe druge Dobre Momke i Crvene Devojke. Sivi Vuk govori tim igračima ko je Ivan Carjević, kao i obaveštava o drugim igračima sa ulogama Dobrih Momaka i Crvenih Devojaka. Ako Vuk otkrije razbojnika ili drugog neprijatelja, odmah obaveštava Ivana Carjeviča kako bi on preduzeo mere sledeće noći. Ako na Vuka napadne Princeza-Žaba, on se pretvara u običnog Dobrog Momka i ne može nikoga da proveri, a Princeza neće znati da je zapravo to bio Sivi Vuk, jer Vuk noću ne spava. Međutim, sam Vuk tokom dana saznaje ko je od igrača Princeza-Žaba, i može pokušati da natera ostale Dobre Momke i Crvene Devojke, koje je doveo Ivanu Carjeviču, da glasaju za smaknuće Princeze-Žabe. Takođe, može pokušati anonimno da uveri Princezu-Žabu da se priključi mirnim stanovnicima, kako ne bi dirala nikoga od njih. Vuk noću može žrtvovati sebe da spasi Ivana Carjeviča ili Vasilisu Premudru, ukoliko pretpostavlja da će oni naići na napad razbojnika, ili su možda zombirani Koščejem (Vuk ima urođeni imunitet na čari Koščeja), ali Vuk nakon samopomoći ispada iz igre.

Novi Bujlin. Za dev, ops in radovedne ljudi
Vasilisa the Wise

Vasilisa the Wise — igra za mirne stanovnike, ali oni to ne znaju, jer je Vasilisa veoma skromna. Takođe, Vasilisa Premudra, kada leči, ne postavlja pitanja i kao dobar doktor leči sve bez razmišljanja. Ali ako njenu medicine popije Koščej, Liho ili Lešij — njima neće biti više od jednog dana, jer Vasilisa leči samo ljude. Zmaju Gorynychu ili Kotu-Bajunu lekovi Vasilise Premudre takođe neće pomoći, ali im ni štete neće doneti. Takođe, Vasilisu noću ne dotiče Kot-Bajun, jer za lekovitim biljem Vasilisa ne ide u Beživotnu Šumu. Pored toga, ženske čari Princeze-Žabe na Vasilisu ne deluju. Ako dve puta pokušaju da ubiju njenog pacijenta, medicina će biti beskorisna. Vasilisa neće spasiti ni od magičnih napada, kao što je prokletstvo Liho. Tokom dana Vasilisa se ponaša kao Crvena Devojka, a samo prolazan, blago tužan pogled može malo nagovestiti da je ona najbolji lekar u Tridevetom carstvu.

Novi Bujlin. Za dev, ops in radovedne ljudi
Razbojnik

Razbojnici, v nasprotju z vsemi predhodnimi vlogami, se poznajo med seboj, saj živijo v istem Gnezdu, prav tako poznajo Leshija in Babu-Jago, zato lahko usklajeno delujejo že od prvega koraka. Toda le vođa bandi deluje ponoči in ne glasuje čez dan, medtem ko se ostali Razbojniki marljivo pretvarjajo v Dobrih Mladeničih in Rdečih Devicah. Če vođa izpade iz igre iz kateregakoli razloga, ga takoj zamenja eden od preostalih Razbojniki. V prvi vrsti se Razbojniki trudijo onesposobiti Ivana-Careviča, preden ta zbere dovolj moči iz Dobrih Mladeničev in Rdečih Devic za aktivno nasprotovanje Razbojniki čez dan.

Novi Bujlin. Za dev, ops in radovedne ljudi
Leshij

Leshij ponoči vohuni za Razbojniki, jim sporoča o najdenih vlogah v njihovem Gnezdu, vendar čez dan ne glasuje, saj ne živi v vasi. Vendar lahko drugi igralci glasujejo za Leshija in tako ga usmrti. Ker je Leshij iz močvirja, ga ne more zapeljati Kraljična-Riba, in če poskusi, Leshij označi njen dom, tako da prebivalci vasi izvejo, kdo je v resnici. Ni mu treba skrbeti niti za čare Koseja, toda Vasilisa ga lahko ozdravi do smrti. Če Kotu-Bajunu poskuša napasti Leshija, tvegati, da izgubi svoje železne kremplje, in bo moral kasneje Mačetu uspavati žrtve le z godrnjanjem.

Novi Bujlin. Za dev, ops in radovedne ljudi
Баба-Яга

Баба-Яга prav tako deluje skupaj z Razbojniki, ponoči čara: lahko bodisi pošlje bolezen drugim igralcem, bodisi zaščiti nekoga iz zaveznikov pred napadom. Njeno čaranje je celo močnejše od prekletstva Hmire. Čez dan je Baba-Jaga prav tako aktivna: tisti, ki ga ima pod zaščito, ne more biti usmrčen niti z večino glasov. Vendar je zaloga čarobnih korenin za dnevno zaščito omejena, tako da Baba-Jaga ne more zaščititi nikogar, vključno s seboj, več kot trikrat na igro. Čez dan Baba-Jaga tudi priča kot navadna Rdeča Devica in glasuje skupaj z vsemi.

Novi Bujlin. Za dev, ops in radovedne ljudi
Zmaj-Gorynych

Zmaj-Gorynych s ponočjo leti nad vasi, gozdovi in močvirji ter se ukvarja z ropanjem, čez dan pa razkriva vlogo okradenega. Podnevi Zmaj spi, zato ne glasuje, a ga lahko obsodijo z večino glasov. Zmaj je zelo nevaren za vse, še posebej za Razbojnike in Ivana-Careviča. Zmaju je vseeno, koga bo oropal, a če ga razkrije Volk oziroma Lešiji, lahko postane dragocen zaveznik. Če Zmaja ubiješ ponoči, lahko z določeno verjetnostjo dobiš zelo dragocen predmet — Zmajevo Kožo, ki bo zaščitila svojega nosilca enkrat pred fizičnim napadom.

Novi Bujlin. Za dev, ops in radovedne ljudi
Zlo Enooko

Zlo Enooko ponoči ubija vse, ki mu pridejo na pot, tiste, ki jih ne more ubiti (Lešij, Mačka-Bajuna ali Zmaja Gorynyča), pa prekleta, tako da vsak, ki poskuša komunicirati s prekletim to noč, umre v roku dneva. Sam prekletec pri tem tudi umre, le Maček-Bajun ne, saj se preprosto uleže spat, da si nabere moči, s čimer izpusti svoj naslednji krog. Edina, ki lahko reši od prekletstva, je Baba-Jaga. Prekletstvo ne deluje na tistega, ki je premagal Mačka-Bajuna: on, tako kot Maček, preprosto zaspi in preskoči svoj krog.

Novi Bujlin. Za dev, ops in radovedne ljudi
Carica-Ribica

Carica-Ribica ne more zmagati v igri, a lahko zasluži veliko denarja, saj zapeljuje druge igralce ponoči. Zapeljani pri tem preskoči svoj krog. Ribica ne more zapeljati Vasilis Premudre, prav tako se ji splača izogibati Lešiju, ki jo bo naslednji dan izdal vsem. Če Ivan-Carevič ali Vodja Razbojnkov najdeta Ribico, jo lahko povabita na stran mirnih prebivalcev ali Razbojnkov, pri tem pa Ivan ne prenaša Ribičinega zavrnitve, medtem ko Vodja ni tako izbirčen. A Carica je dovolj prebrisana, lahko postane dvojna agenta, saj kljub temu, da sama ne more zmagati, — je to odlična priložnost za nabiranje zlata, saj se možnosti, da dočaka konec igre, močno povečajo! Podnevi Carica-Ribica pretvarja, da je Rdeča Devica in glasuje skupaj z vsemi.

Novi Bujlin. Za dev, ops in radovedne ljudi
Koschei the Deathless

Koschei the Deathless živi v svojem gradu. Ponoči hodi po okoliških vaseh in zombira Dobrih Junakov in Rdečih Devic, ki nato preidejo na njegovo stran in brezpogojno izvršujejo vse naloge. Če zavrnejo izvrševanje ukaza, na primer glasovati podnevi drugače, kot je naročil Košče, ali pisati sporočila podnevi v klepetu, če je to Košče prepovedal, SLuga Koščeja umre. Tako lahko Košče vpliva na rezultate glasovanja podnevi, čeprav sam osebno ne glasuje. Če Košče umre, umrejo tudi vse njegove žrtve. Vasilisa lahko pozdravi SLugo Koščeja, ki se nato vrne v svojo prvotno vlogo. Zmaj-Gorynyč in Volk imata prirojen imunitet proti zombiranju, tako da jih Košče kljub vsem svojim prizadevanjem ne more obrniti na svojo stran. Poleg tega lahko Volk reši Ivana ali Vasiliso iz težav in se pri tem žrtvuje. Rešeni Volk pridobi Volčjo imuniteto proti zombiranju.

Novi Bujlin. Za dev, ops in radovedne ljudi
Cat Bayun

Cat Bayun živi v gozdu, ponoči lovi. Podnevi spi v svoji votlini, zato se glasovanja ne udeležuje. Vendar ga lahko podnevi obesi večina glasov. Maček lahko napade na dva načina: z mrmranjem — in takrat njegova žrtev zaspi in ne more hoditi ponoči, prav tako ne more glasovati naslednji dan, — ali pa takoj ubija z železnimi kremplji. Napad s kremplji ne deluje na Zmaja-Gorynyča, napad na Leshija pa lahko Mačka celo pahne brez krempljev! Zlo ne more prekleti Mačka, ki po prekletstvu preprosto spi eno noč. Kdor premaga Mačka-Bayuna, se pozdravi od vseh bolezni in nevšečnosti, vključno s prekletstvom Zla. Ta Mačkova sposobnost ostane pri igralcu do konca igre. SLuge Koščeja ne morejo podnevi glasovati za Mačka, lahko pa posredno izvejo, kdo je Maček, ne da bi o tem obvestili Koščeja. Maček-Bayun ne sklepa zavezništva z Ivanom ali Razbojniki, zato so ti za Mačka prioriteta.

Uporabljene tehnologije

Za ustvarjanje igre sem izbral tehnologijo strežniških brezstrežnikov (serverless) na osnovi OpenFaaS, saj je dovolj preprosta za organizacijo igre, hkrati pa dovolj razvita za pisanje zapletenih pravil brez nepotrebnega zapletanja. Prav tako bom uporabil Kubernetes klaster, saj ta način uvajanja aplikacij omogoča dokaj preprosto in zanesljivo hitro uvajanje ter možnost enostavne razširljivosti. Za ustvarjanje igralne logike lahko uporabim le OpenFaaS, poskusil pa bom tudi razviti Pripovedovalca kot ločeno posodo, da primerjam težavnost izvedbe. Kot glavni programski jezik za mikrostoritve in funkcije sem izbral Go, saj ga že dolgo spoznavam v prostem času kot zamenjavo za Perl, za interakcijo uporabnikov z mikrostoritvami in funkcijami pa bom uporabil js na osnovi nekega okvira. O končni odločitvi bom spregovoril v ustreznem članku cikla. Za komunikacijo med funkcijami sem izbral NATS.io, saj sem se z njo že srečal prej in ima dokaj enostavno integracijo v Kubernetes.

Najava

  • Uvod
  • Namestitev okolja za razvoj, razdelitev naloge na funkcije
  • Delo na backendu
  • Delo na frontend
  • Nastavitev CICD, organizacija testiranja
  • Zagon preizkusne seje igre
  • Zaključki

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster