
По многочислени искания от читателите започва голям цикъл статии за приложението на технологията на безсървърните изчисления за разработка на реално приложение. В този цикъл ще се разгледа разработката на приложението, тестуването и доставката до крайните потребители с помощта на съвременни средства: микросервисна архитектура на приложението (в безсървърен вариант, на базата на ), клъстера за разгръщане на приложението, базата данни , с насоченост към облачната кластеризация и приложение, а също и облачната шина . Приложението реализира играта „Бълини“, един от вариантите на популярната салонна игра „Мафия“.
Какво е „Бълини“?
Това е вариант на играта „Мафия“, известна още и като „Вълкодав“. В основата е отборна игра, при която участниците трябва стъпка по стъпка да разберат кой е кой и да се опитат да победят. За съжаление, при игра по мрежата се губи толкова важен елемент от играта, какъвто е личното взаимодействие, а правилата на класическата „Мафия“ са доста прости, затова за по-нелинеен и интересен игрови процес обикновено се добавят други персонажи, но основните черти на оригиналната „Мафия“ остават, например смяната на ден и нощ, ходовете само през нощта, както и съюзите между участниците. Също така, важно отличие на играта по мрежата е, че водещият (той е и Майсторът на играта, Сказачът) обикновено е компютърна програма.
Описание на играта
Правилата на играта, която искам да реализирам, са взети от стар irc-бот, който запазих в личния си архив преди около 10 години. „Бълините“ имат предистория, с която започва всяка игра:
В тридеветото царство, в тридесетото държавство, зад седемте морета, живеели си няколко селца, а в тях Добри младци и Червени девици. Сеели те хляб, но и ходели в околния лес за гъби и плодове… И така продължавало от векове на век, докато ужасна катастрофа не разтресла Земята и злото не започнало да се разпространява по света! Нощите станали дълги и студени, а в тъмното изобилствали и се навъртали в селото недобри и страшни твари. Прилетял отнякъде Змей Горанов и се заловил да краде Червените девици и да взема всичко ценно от селяните. Вредна и жадна Баба-Яга, пристигнал отдалеч по стъпка вълшебност, разтревожи разума на местните жители, и дори някои оставиха занаята си и се отбиха в гората да станат разбойници, и там съставиха шайка. Лиходеите се срещнаха с Лешия, способния да се преобразува в дървета и храсти, който започна да наблюдава мирните селяни и да служи на разбойниците, изследвайки дали Добри герои не замислят нещо за освобождението на селото си от нечистото. Добри герои и Червени девици, изнемощели от нападенията на Разбойниците и ужасните смъртни случаи от ръцете на страшното Лихо Одноглазото, събрали злато и поканили от съседния град известния борец — Иван-Царевич, който обещал да освободи селото от разбойниците. На поляна в гората Иван спаси от неизбежна гибел Сивия Вълк, уловен в капан на Разбойниците. В замяна Вълкът обеща да информира Царевича за различни ловки същества. Минаваше известната лечителка Василиса Премудрая, и когато видя бедствието — остана да се грижи за жителите, пострадали от нападенията на лихите. Иззад гората се появи черен дворец, в който, по слухове, се настанил Кощей Бессмертный, всяка нощ той идвал в селата и омагьосвал Добри Младци и Червени Девици, за да не осмеляват да противоречат на заповедите му; всички правеха как той нареди. А в Безжизнената Гора обитаваше Кот-Баюн, и всеки, който го срещал, заспивал мъртво след неговите приказки или загивал от неговите железни нокти.

Тридевето царство
Както вече е видно, играчите се делят на няколко групи:
- мирни жители (Добри Младци, Червени Девици, Иван-Царевич, Сивия Вълк и Василиса Премудрая)
- разбойници (собствено разбойниците, както и Баба Яга и Лешия)
- независими (Змей Горыныч, Лихо Одноглазото, Царевна Лягушка, Кощей Бессмертный, Кот-Баюн)
Целта на играта, както вече беше казано, е да оцелееш и да победиш. Противниците трябва по един или друг начин да напуснат играта, а независимите също следва да останат живи до края на играта. В играта има злато, своеобразна игрова валута, която играчите печелят само вътре в играта. Спечелилите получават злато. Колкото повече злато, толкова по-висок е рейтингът на играча.
Нека се спра малко по-подробно на описанието на персонажите.

Добри Младци

Червени Девици
Добри Младци и Червени Девици — основната и най-разпространена роля в играта. Това са мирни жители, които спят през нощта и работят през деня. През нощта те биват нападнати от някого от разбойниците, Змей Горыныч и други роли, а Василиса Премудрая ги лекува. С известна, малка вероятност Добър молодец или Червена девица могат да оцелят нападението без поражения (възможно е да загубят злато), но при това всички ще разберат псевдонима на играча на следващия ден след нападението. През нощта тези играчи не предприемат никакви действия, а анализират игровата ситуация въз основа на съобщенията в игровия чат. През деня те решават чрез гласуване кой от тях не е Добър молодец или Червена девица. Играчът, за когото гласуват повечето други играчи, напуска играта, а останалите получават или губят злато. Ако играчите не изберат никого с мнозинство, никой от играчите няма да бъде осъден.

Иван-Царевич
Иван-Царевич — първоначално анонимен защитник на мирните жители. През нощта проверява ролите на другите играчи, тъй като познава само един свой съюзник — Серия Вълк. При непосредственото участие на Серия Вълк (който също може да проверява ролите на другите играчи), Иван-Царевич, вместо да проверява, през нощта може да убие друг персонаж. Ако в резултат на проверката Иван-Царевич види ролята на Добър молодец или Червена девица при играча, той може да ги покани при себе си и да ги запознае със Серия Вълк и другите Добри молодци и Червени девици. Иван може да бъде възпрепятстван от Царевна-Лягушка, която може да го съблазни през нощта, без да разкрива ролята му на другите играчи през деня. Ако Иван сам открие Царевна-Лягушка, може да й предложи да се присъедини към мирните жители, но ако Царевна откаже, тя загива от ръката на Ивана. Змей-Горыныч също може да пречи на проверките на Иван-Царевич, но, за разлика от Царевната-Лягушка, през деня той ще разкаже на останалите играчи кой е Иван-Царевич. През деня Иван-Царевич не се различава от другите Добри молодци.

Серий Вълк
Серий Вълк — помощник на Иван-Царевича, чий свръхчувствителен нос помага на Иван да намери другите Добри Младежи и Красиви Девици. Сивият Вълк казва на тези играчи кой е Иван-Царевич и съобщава за другите играчи с роли на Добри Младежи и Красиви Девици. Ако Вълкът открие разбойник или друг враг, незабавно съобщава на Иван-Царевич, за да може той да вземе мерки следващата нощ. Ако на Вълка му нападне Царевна-Лягушка, той се превръща в обикновен Добър младеж и не може да провери никого, а Царевна не разбира, че всъщност е Сивият Вълк, тъй като Вълкът не спи през нощта. Въпреки това самият Вълк през деня разбира кой от играчите е Царевна-Лягушка и може да се опита да убеди останалите Добри Младежи и Красиви Девици, които е довел при Иван-Царевич, да гласуват за смъртта на Царевна-Лягушка. Освен това на следващата нощ може анонимно да се опита да убеди Царевна-Лягушка на страната на мирните жители, за да не засяга никого от тях. Вълкът през нощта може да се жертва, за да спаси Иван-Царевич или Василиса Премудрая, ако предполага, че те могат да попаднат под удар на разбойниците или са били зомбирани от Кощей (Вълкът има вроден имунитет към магиите на Кощей), но след саможертвата Вълкът излиза от играта.

Василиса Премудрая
Василиса Премудрая — играе за мирните жители, но те не знаят за нея, тъй като Василиса е много скромна. Освен това, Василиса Премудрая, когато лекува, не задава въпроси и като добър доктор лекува всички наред. Но ако нейното лекарство изпие Кощей, Лихо или Леший — няма да живеят повече от един ден, тъй като Василиса лекува само хора. Змей Горыныч или Кот-Баюн също няма да получат помощ от лекарствата на Василиса Премудрая, но и вреда няма да понесат. Също така, Василиса не може да бъде безпокоена от Кот-Баюн през нощта, докато за лечебни билки не ходи в Безжизнената гора. Освен това, женските чари на Царевна-Лягушка не действат на Василиса. Ако нейният пациент бъде опитван да бъде убит два пъти, медицината е безсилна. Василиса не може да спаси и от магически атаки, например от проклятието на Лихо. През деня Василиса се държи като Красна Девица, а само мимолетен, леко тъжен поглед може да намекне, че тя е най-добрият лечител в Тридеветото царство.

Разбойник
Разбойници, за разлика от всички предишни роли, те се познават помежду си, тъй като живеят в едно Логово, както и познават Лешия и Баба-Яга, затова могат да действат организирано още от първия ход. Но само Главатарят на бандата извършва действия през нощта и не гласува през деня, докато останалите Разбойници старателно се преструват на Добри Младци и Червени Девици. Ако Главатарят бъде елиминиран по каквато и да е причина, неговото място веднага заема един от оставащите Разбойници. В първия ред, Разбойниците се опитват да неутрализират Ивана-Царевича, преди той да е събрал достатъчно сили от Добри Младци и Червени Девици, за активно противопоставяне на Разбойниците през деня.

Леший
Леший през нощта шпионира за Разбойниците, съобщавайки им за намерените роли в тяхното Логово, но през деня не гласува, тъй като не живее в селото. Въпреки това, другите играчи могат да гласуват за Лешия и така да го екзекутират. Тъй като Леший произлиза от блатата, Царевна-Лягушка не може да го изкуши, а ако все пак се опита, Леший ще маркира дома ѝ, и жителите на селото ще разберат коя е тя наистина. Леший не трябва да се страхува и от заклинанията на Кощей, но Василиса може да го излекува до смърт. Ако Кот-Баюн се опита да нападне Лешия, рискува да изгуби своите железни нокти и след това ще трябва да приспива жертвите само с мъркане.

Баба-Яга
Баба-Яга също работи заедно с Разбойниците, през нощта магьосничи: може или да наложи болест на другите играчи, или да защити някого от съюзниците си от нападение. Нейната магия е дори по-силна от проклятието на Лихата. През деня Баба-Яга също е активна: онзи, който е под нейната защита, не може да бъде екзекутиран дори с мнозинството от гласовете. Въпреки това, запасът от магически корени за дневна защита е ограничен, така че Баба-Яга не може да защити никого, включително себе си, повече от три пъти в играта. През деня Баба-Яга се преструва на обикновена Червена Девица и гласува заедно с всички.

Змей-Горыныч
Змей-Горыныч нощем той лети над селата, гори и блата, извършвайки кражби и разкривайки ролята на ограбения през деня. През деня Змей спи, затова не гласува, но може да бъде осъден с мнозинство гласове. Змей е много опасен за всички, особено за Разбойниците и Иван-Царевича. Няма значение кого да отвлече, но ако Волк или Леший го разкрият, може да стане ценен съюзник. Ако убиеш Змея през нощта, има вероятност да получиш много ценен предмет — Змейската Шкура, която ще защити собственика си веднъж от физическа атака.

Лихо Одноглазое
Лихо Одноглазое убива всички, които попаднат на пътя му през нощта, а тези, които не може да убие (Лешия, Кот-Баюна или Змея Горыныча) — проклина, така че всеки, който се опита да общува с прокълнатия през същата нощ, ще умре в рамките на следващия ден. Самият прокълнат също умира, единствено Кот-Баюн не умира, а просто ляга да спи, за да си възвърне силите, пропускайки следващата нощ. Единственият, който може да спаси от проклятието на Лихо, е Баба-Яга. Проклятието не действа и на онзи, който е победил Кот-Баюн: той, както и Кот, просто ляга да спи и пропуска хода.

Царевна-Лягушка
Царевна-Лягушка не може да победи в играта, но може да спечели много пари, съблазнявайки другите играчи през нощта. Съблазненият пропуска хода си. Лягушката не може да съблазни Василиса Премудрая, също така е добре да избягва Лешия, който ще я сдаде на всички на следващия ден. Ако Иван-Царевич или Главарят на Разбойниците намерят Лягушката, те могат да я поканят на страната на мирните жители или Разбойниците, като Иван не приема отказа на Лягушката, а Главарят не е толкова взискателен. Но Царевна е достатъчно хитра, може да стане двоен агент, защото, въпреки че сама не може да победи, — това е отличен шанс да натрупа злато, тъй като шансовете да изкарат до края на играта значително се увеличават! През деня Царевна-Лягушка се преструва на Красна Девица и гласува заедно с всички.

Кощей Бессмертный
Кощей Бессмертный живее в замъка си. Нощем обикаля околните села и зомбира Добри Момци и Червени Девици, които идват при него на служба и безпрекословно изпълняват всичките му нареждания. Отказвайки се да изпълнят заповед, например да гласуват по друг начин през деня отколкото е казал Кощей, или да пишат съобщения през деня в чата, ако Кощей е забранил, Слугата на Кощей загива. По този начин, Кощей е способен да влияе на резултатите от гласуването през деня, макар самият той никога да не гласува. Ако Кощей бъде убит, всички негови жертви също загиват. Василиса може да излекува Слугата на Кощей, който след това се връща към първоначалната си роля. Змея-Горыныча и Вълка имат вроден имунитет към зомбирането, така че Кощей, дори и да иска, не може да ги накара да служат на него. Освен това, Вълкът може да спаси Ивана или Василиса, жертвайки себе си. Спасените от Вълка получават Вълчи имунитет към зомбирането.

Кот-Баюн
Кот-Баюн живее в гората, нощем ловува. През деня спи в дупката си, затова не участва в гласуването. Въпреки това, през деня може да бъде обесен с мнозинство гласове. Котът може да атакува по два начина: да мърка — и тогава жертвата му заспива и не може да ходи нощем, а също така да гласува на следващия ден, — или да убива веднага с желязни нокти. Атаката с нокти не работи на Змея-Горыныча, а нападайки Лешия, Котът изобщо може да остане без нокти! Лихо не може да прокълне Кота, който след проклятието просто ще спи една нощ. Ако някой успее да победи Кота-Баюна, ще се излекува от всяка болест и недъг, включително проклятието на Лихо. Тази способност на Кота остава за играча до края на играта. Слугите на Кощей не могат да гласуват за Кота през деня, но могат индиректно да разберат кой е Кот, без да уведомяват Кощей. Кот-Баюн не завързва съюзи с Иван или Разбойниците, така че те за Кота са първостепенна цел.
Използвани технологии
За разработката на игра избрах технологии безсървърни изчисления (serverless) на базата на OpenFaaS, тъй като тя е достатъчно проста за организация на играта, а същевременно е достатъчно напреднала, за да напиша сложни игрови правила без излишни усложнения. Също така, ще използвам Kubernetes клъстър, тъй като този метод на разгръщане на приложения позволява лесно и надеждно бързо разгръщане и възможност за лесно мащабиране. За създаване на игровата логика може да се разчита само на OpenFaaS, но също така ще опитам да направя Приказника като отделен контейнер, за да сравня сложността на реализацията. Като основен език за програмиране на микросервизи и функции избрах , тъй като отдавна го изучавам в свободното си време като заместител на Perl, а за взаимодействие на потребителите с микросервисите и функциите ще се използва js на базата на някакъв фреймуърк. За окончателното решение ще разказвам в съответната статия от цикъла. За комуникация между функциите избрах NATS.io, тъй като вече съм се сблъсквал с нея преди и интеграцията ѝ в Kubernetes е сравнително лесна.
Анонс
- Въведение
- Настройка на среда за разработка, разделяне на задачите на функции
- Работа по backend
- Работа по frontend
- Настройка на CICD, организиране на тестове
- Стартиране на пробна сесия на играта
- Резюме
Източник: habr.com
