
A seguito delle numerose richieste dei lettori, inizia un ampio ciclo di articoli sull'applicazione della tecnologia di calcolo serverless per lo sviluppo di un'applicazione reale. In questo ciclo verrà trattato lo sviluppo dell'applicazione, il testing e la distribuzione agli utenti finali utilizzando strumenti moderni: architettura a microservizi dell'applicazione (in variante serverless, basata su ), cluster per il deployment dell'applicazione, database , focalizzati sulla cloud clustering e applicazione, e anche su un bus cloud . L'applicazione implementa il gioco "Byliny", una delle varianti del popolare gioco da salotto "Mafia".
Che cos'è "Byliny"?
Questa è una versione del gioco "Mafia", conosciuta anche come "Werewolf". Si basa su un gioco di squadra in cui i partecipanti devono scoprire, passo dopo passo, chi è chi e cercare di vincere. Sfortunatamente, giocare online fa perdere un elemento importante del gioco, ovvero l'interazione personale, e le regole della classica "Mafia" sono abbastanza semplici. Pertanto, per un processo di gioco più non lineare e interessante, di solito vengono aggiunti altri personaggi, mantenendo comunque le caratteristiche principali della "Mafia" originale, come il passaggio tra giorno e notte, le mosse che si svolgono solo di notte e alleanze tra i partecipanti. Inoltre, una differenza importante nel gioco online è che il conduttore (o Maestro del gioco, Narratore) è di solito un programma informatico.
Descrizione del gioco
Le regole del gioco che voglio realizzare sono prese da un vecchio bot irc che ho conservato nel mio archivio personale circa 10 anni fa. "Byliny" ha una premessa che inizia ogni gioco:
Nel regno dei tre re, nello stato dei tre stati, oltre sette mari, vivevano alcuni villaggi, e in essi Giovani valorosi e Belle fanciulle. Coltivavano il grano, ma andavano nel boschetto vicino a raccogliere funghi e bacche… E così continuò per secoli, finché una terribile catastrofe non colpì la Terra e il male cominciò a diffondersi nel mondo! Le notti divennero lunghe e fredde, e nella oscurità si aggiravano nel bosco e arrivavano nel villaggio creature malvagie e spaventose. Arrivò da qualche parte Zmej Gorynyč e cominciò a rapire le belle fanciulle e a rubare tutto il prezioso ai contadini. La dannosa e avara Baba-Jaga, arrivata sulla scopa da foreste lontane, confondette la mente degli abitanti, e persino alcuni abbandonarono il loro mestiere e si avventurarono nel bosco per diventare briganti, formando una banda. I malviventi incontrarono Lešij, capace di trasformarsi in alberi e cespugli, che cominciò a sorvegliare i pacifici contadini e a servire i briganti, fiutando se i valorosi giovani stessero preparando qualche piano per liberare i loro insediamenti dal male. I valorosi giovani e le belle fanciulle, stanchi delle razzie dei briganti e delle terribili morti per mano del temuto Lich Odnoglazij, raccolsero dell'oro e invitarono da una città vicina un noto combattente — Ivan-Tsarević, promettendo di liberarli dai briganti. Nella radura del bosco Ivan salvò da un'imminente morte il Lupo Grigio, caduto nella trappola dei banditi. In cambio, il Lupo promise di informare il Principe di varie creature malefiche della foresta. Passava di lì una nota guaritrice Vasilisa la Saggia, e quando vide il pericolo, rimase a prendersi cura degli abitanti colpiti dagli attacchi dei malvagi. Oltre la foresta apparve un palazzo nero, dove, secondo le voci, si era stabilito Koshchey l'Immortale, ogni notte si recava nei villaggi e incantava i Buoni Giovani e le Belle Rosse, affinché non osassero disobbedire i suoi ordini, tutti facevano come diceva lui. E nella Foresta Senza Vita si era stabilito Cat-Bayun, e chiunque lo incontrava si addormentava in un sonno eterno dopo le sue storie o moriva per le sue artigli di ferro.

Il tredicesimo regno
Come già evidente, i giocatori si dividono in diversi gruppi:
- cittadini pacifici (Buoni Giovani, Belle Rosse, Ivan-Tsar, Lupo Grigio e Vasilisa la Saggia)
- banditi (i veri e propri banditi, ma anche Baba Jaga e Leshy)
- indipendenti (Zmey Gorynych, Likhо l'Occhio Unico, la Principessa-Rana, Koshchey l'Immortale, Cat-Bayun)
L'obiettivo del gioco, come detto sopra, è sopravvivere e vincere. Gli avversari devono uscire dal gioco in un modo o nell'altro, mentre gli indipendenti devono rimanere in vita fino alla fine. Nel gioco c'è l'oro, una sorta di valuta di gioco che i giocatori guadagnano solo all'interno del gioco. I vincitori ricevono oro. Maggiore è l'oro, più alto è il punteggio del giocatore.
Mi soffermerò un po' di più sulla descrizione dei personaggi.

Buon Giovane

Ragazza Rossa
Buon Giovane e Ragazza Rossa — il ruolo più comune e fondamentale nel gioco. Questi sono i cittadini che di notte dormono e di giorno lavorano. Di notte vengono attaccati da alcuni dei briganti, Zmey Gorynych e altri ruoli, mentre Vasilisa la Saggia li cura. Con una piccola probabilità, il Buon Giovane o la Bella Rossa possono sopravvivere all'attacco senza subire danni (forse perdendo dell'oro), ma tutti scopriranno il soprannome del giocatore il giorno successivo all'attacco. Di notte, questi giocatori non effettuano mosse, ma analizzano la situazione di gioco in base ai messaggi nella chat di gioco. Di giorno, questi giocatori decidono, attraverso il voto, chi tra loro non è Buon Giovane o Bella Rossa. Il giocatore che riceve il maggior numero di voti da parte degli altri giocatori viene eliminato dal gioco, mentre i restanti guadagnano o perdono oro. Se i giocatori non scelgono nessuno con la maggioranza dei voti, nessuno verrà condannato.

Ivan Tsarevich
Ivan Tsarevich — originariamente un protettore anonimo dei pacifici cittadini. Di notte verifica i ruoli degli altri giocatori, poiché conosce solo un suo alleato: il Lupo Grigio. Con la partecipazione diretta del Lupo Grigio (che può anche controllare i ruoli degli altri giocatori), Ivan Tsarevich, invece di controllare, può uccidere un altro personaggio durante la notte. Se in seguito al controllo Ivan Tsarevich vede il ruolo di Buon Giovanotto o Bella Rossa di un giocatore, può invitarli a unirsi a lui e presentarli al Lupo Grigio e ad altri Buoni Giovanotti e Belle Rosse. Ivan può essere ostacolato dalla Principessa Rana, che può sedurlo di notte senza rivelare il suo ruolo agli altri giocatori durante il giorno. Se Ivan scopre da solo la Principessa Rana, può offrirle di unirsi ai pacifici cittadini, ma se la Principessa rifiuta, muore per mano di Ivan. Il Drago della Montagna può anche ostacolare i controlli di Ivan Tsarevich, ma, a differenza della Principessa Rana, durante il giorno rivelerà agli altri giocatori chi tra loro è Ivan Tsarevich. Durante il giorno Ivan Tsarevich non si differenzia dagli altri Buoni Giovanotti.

Lupo Grigio
Lupo Grigio — assistente di Ivan Tsarevich, il cui fiuto acuto aiuta Ivan a trovare altri Buoni Giovani e Belle Rosse. Il Lupo Grigio informa questi giocatori su chi sia Ivan Tsarevich e comunica anche di altri giocatori con i ruoli di Buoni Giovani e Belle Rosse. Se il Lupo scopre un bandito o un altro avversario, informa immediatamente Ivan Tsarevich, affinché possa adottare misure la notte successiva. Se il Lupo viene attaccato dalla Principessa-Rana, si trasforma in un normale Buon Giovane e non può controllare chiunque, e la Principessa non saprà che in realtà era il Lupo Grigio, poiché il Lupo non dorme di notte. Tuttavia, durante il giorno, il Lupo scopre chi tra i giocatori è la Principessa-Rana e può tentare di persuadere gli altri Buoni Giovani e Belle Rosse che ha portato a Ivan Tsarevich a votare per l'esecuzione della Principessa-Rana. Inoltre, la notte successiva, può cercare di convincere anonimamente la Principessa-Rana a schierarsi con i cittadini pacifici, affinché non faccia del male a nessuno di loro. Il Lupo può anche sacrificarsi di notte per salvare Ivan Tsarevich o Vasilisa la Saggia, se sospetta che possano essere colpiti da banditi o siano stati zombificati da Koschei (il Lupo ha un'immunità innata agli incantesimi di Koschei), ma dopo il sacrificio il Lupo esce dal gioco.

Vasilisa la Saggia
Vasilisa la Saggia — recita per i cittadini pacifici, ma loro non lo sanno, poiché Vasilisa è molto modesta. Anche Vasilisa la Saggia, quando cura, non fa domande e come un buon dottore cura tutti indiscriminatamente. Ma se a bere il suo rimedio è Koschei, Likhо o Leshiy — non vivranno più di un giorno, poiché Vasilisa cura solo gli esseri umani. Il Serpente Gorynych o il Gatto Bayun non trarranno alcun beneficio dai rimedi di Vasilisa la Saggia, ma non verranno nemmeno danneggiati. Inoltre, di notte Vasilisa non viene toccata dal Gatto Bayun, poiché per le erbe medicinali Vasilisa non si reca nella Foresta Senza Vita. Inoltre, i sortilegi femminili della Principessa Rana non hanno effetto su Vasilisa. Se il suo paziente viene attaccato due volte, la medicina sarà impotente. Vasilisa non salverà nemmeno dagli attacchi magici, come la maledizione di Likhо. Di giorno, Vasilisa si comporta come la Bella Fanciulla Rossa, e solo uno sguardo fugace e leggermente triste può suggerire che è la migliore guaritore nel Tredicesimo regno.

Bandito
Banditi, a differenza di tutti i ruoli precedenti, si conoscono tra loro, poiché vivono nello stesso Covile, e conoscono anche il Leshy e Baba Yaga, quindi possono agire in modo coerente sin dal primo turno. Solo il Capobanda svolge azioni di notte e non vota durante il giorno, mentre gli altri Briganti si fingono faticosamente Nobili Giovani e Belle Donne Rosse. Se il Capobanda esce dal gioco per qualsiasi motivo, il suo posto è immediatamente preso da uno degli altri Briganti. Innanzitutto, i Briganti cercano di mettere fuori combattimento Ivan Tsarevich, prima che egli possa radunare abbastanza forze dai Nobili Giovani e dalle Belle Donne Rosse per opporsi attivamente ai Briganti durante il giorno.

Leshy
Leshy di notte spia per i Predoni, informandoli sui ruoli trovati nel loro Rifugio, ma di giorno non vota poiché non vive nel villaggio. Tuttavia, gli altri giocatori possono votare per il Leshy e così condannarlo a morte. Poiché il Leshy proviene dalle paludi, non può essere sedotto dalla Principessa-Rana, e se ci prova, il Leshy marchierà la sua casa, e gli abitanti del villaggio scopriranno chi è realmente. Non deve temere incantesimi di Koschey, ma Vasilisa potrebbe curarlo fino alla morte. Se il Gatto-Bajun prova ad attaccare il Leshy, rischia di perdere le sue unghie di ferro, e poi dovrà anestetizzare le sue vittime solo con un semplice ronron.

Baba-Jaga
Baba-Jaga lavora anche con i Ladri, incantando di notte: può infliggere malattie ad altri giocatori o proteggere un alleato da un attacco. La sua magia è persino più potente della maledizione del Lich. Durante il giorno, Baba Yaga è attiva: chi è sotto la sua protezione non può essere giustiziato nemmeno dalla maggioranza dei voti. Tuttavia, la scorta di radici magiche per la protezione diurna è limitata, quindi Baba Yaga non può proteggere nessuno, neppure se stessa, più di tre volte nel corso della partita. Durante il giorno, Baba Yaga si traveste da normale Ragazza Rossa e vota come tutti.

Zmej Gorynych
Zmej Gorynych vola di notte sopra villaggi, foreste e paludi, impegnandosi in razzie, rivelando di giorno il ruolo derubato. Durante il giorno, il Serpente dorme, quindi non vota, ma può essere giustiziato dalla maggioranza dei voti. Il Serpente è molto pericoloso per tutti, specialmente per i Ladri e Ivan Tsarevich. A Zmej non importa chi derubare, ma se viene scoperto da Volkov o Leshij, può diventare un prezioso alleato. Se uccidi il Serpente di notte, c'è una certa probabilità di ottenere un oggetto molto prezioso: la Pelliccia di Serpente, che proteggerà il suo possessore una volta da un attacco fisico.

Lich Ochiuto
Lich Ochiuto di notte uccide tutti quelli che incontra lungo il suo cammino, mentre chi non riesce a uccidere (Leshiy, il Gatto-Bayun o il Serpente Gorynych) viene maledetto, in modo che chiunque tenti di comunicare con il maledetto quella stessa notte morirà entro il giorno. Il maledetto stesso muore anche, l'unico a non morire è il Gatto-Bayun, che semplicemente si mette a dormire per riprendersi, saltando il turno della notte successiva. Solo Baba-Yaga può salvare dalla maledizione di Likh. La maledizione non ha effetto su chi ha vinto contro il Gatto-Bayun: lui, proprio come il Gatto, si mette a dormire saltando il turno.

Principessa-Rana
Principessa-Rana non può vincere nel gioco, ma può guadagnare molti soldi seducendo gli altri giocatori di notte. Il sedotto nel frattempo salta il turno. La rana non può sedurre Vasilisa la Saggia e deve anche evitare il Leshy, che la consegnerà a tutti il giorno dopo. Se Ivan Tsarevich o il Capo dei Briganti trovano la Rana, possono invitarla dalla parte dei civili o dei Briganti, e Ivan non accetta il rifiuto della Rana, mentre il Capo non è così esigente. Ma la Principessa è abbastanza astuta, può diventare una doppia agente, perché nonostante non possa vincere da sola, è un'ottima occasione per accumulare oro, poiché le probabilità di arrivare fino alla fine del gioco aumentano notevolmente! Durante il giorno, la Principessa-Rana si finge una Bella Rossa e vota insieme a tutti.

Koshchey l'Immortale
Koshchey l'Immortale abita nel suo castello. Di notte si aggira per i villaggi circostanti e incanta i Buoni Giovani e le Belle Rosse, che si uniscono a lui e obbediscono senza questionare a tutte le sue richieste. Rifiutando di eseguire un ordine, per esempio votare di giorno in un modo diverso da quanto detto da Koshchei, o scrivere messaggi durante il giorno in chat, se Koshchei lo ha vietato, il Servo di Koshchei perisce. In questo modo, Koshchei può influenzare i risultati delle votazioni di giorno, anche se lui stesso non vota. Se Koshchei viene ucciso, tutte le sue vittime muoiono anch'esse. Vasilisa può curare il Servo di Koshchei, il quale poi ritorna al suo ruolo originale. Zmey Gorynych e il Lupo hanno un'immunità innata all'incantamento, quindi Koshchei, per quanto ci provi, non può portarli al suo servizio. Inoltre, il Lupo può salvare Ivan o Vasilisa, sacrificando se stesso. I salvati dal Lupo acquisiscono l'immunità Lupo all'incantamento.

Cat-Bayun
Cat-Bayun vive nel bosco e caccia di notte. Di giorno dorme nel suo tronco, quindi non partecipa al voto. Tuttavia, durante il giorno, può essere condannato dalla maggioranza dei voti. Il Gatto può attaccare in due modi: facendo le fusa, e allora la sua vittima si addormenta e non può muoversi di notte, e può anche votare il giorno dopo, oppure uccidendo subito con le sue unghie di ferro. L'attacco con le unghie non funziona contro il Serpente-Gorynych, e, attaccando il Leshy, il Gatto potrebbe rimanere addirittura senza artigli! Il Malefico non può maledire il Gatto, che dopo la maledizione semplicemente dormirà per una notte. Se qualcuno riesce a sconfiggere il Gatto-Baion, guarirà da qualsiasi malattia e male, incluso la maledizione del Malefico. Questa abilità del Gatto rimane con il giocatore fino alla fine del gioco. I servitori di Koschei non possono votare per il Gatto di giorno, ma possono scoprire indirettamente chi è il Gatto, senza comunicarlo a Koschei. Il Gatto-Baion non stringe alleanze con Ivan o i Banditi, quindi sono per il Gatto un obiettivo primario.
Tecnologie utilizzate
Per la creazione del gioco ho scelto la tecnologia di calcolo serverless basata su OpenFaaS, in quanto è abbastanza semplice per organizzare il gioco e, allo stesso tempo, abbastanza sviluppata da permettere la scrittura di regole di gioco complesse senza eccessive complicazioni. Utilizzerò anche un cluster Kubernetes, poiché questo metodo di distribuzione delle applicazioni consente una rapida implementazione e un facile scaling. Per creare la logica di gioco, posso affidarmi solo a OpenFaaS, ma cercherò anche di realizzare il Narratore come contenitore separato per confrontare la complessità di implementazione. Come linguaggio di programmazione principale per microservizi e funzioni ho scelto , poiché lo studio da tempo nel mio tempo libero come alternativa a Perl, e per l'interazione degli utenti con i microservizi e le funzioni verrà utilizzato js basato su un certo framework. Condividerò la decisione finale in un articolo pertinente della serie. Per la comunicazione tra le funzioni ho scelto NATS.io, poiché ho già avuto esperienze precedenti con esso e ha un'integrazione abbastanza semplice in Kubernetes.
Annuncio
- Introduzione
- Impostazione dell'ambiente di sviluppo, suddivisione del compito in funzioni
- Lavori sul backend
- Lavori sul frontend
- Configurazione del CICD, organizzazione dei test
- Avvio di una sessione di prova del gioco
- Risultati
Fonte: habr.com
