"Нові Билини". Для dev, ops та допитливих людей

"Нові Билини". Для dev, ops та допитливих людей

На численні прохання читачів починається великий цикл статей про застосування технології безсерверних обчислень для розробки реальної програми. У цьому циклі буде розглянуто розробку програми, тестування та постачання кінцевим користувачам з використанням сучасних засобів: мікросервісної архітектури програми (у serverless варіанті, на базі OpenFaaS), кластера кубернети для розгортання програми, бази даних MongoDB, орієнтованої на хмарні кластеризацію та застосування, а також хмарної шини НАТИ. Додаток реалізує гру «Билини», один із варіантів популярної салонної гри «Мафія».

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

Це варіант гри "Мафія", вона ж "Werewolf". В її основі командна гра, за якої учасники мають крок за кроком дізнатися, хто є хто, та спробувати виграти. На жаль, при грі по мережі зникає така важлива складова гри, як особиста взаємодія, а правила класичної «Мафії» досить прості, тому для більш нелінійного та цікавого ігрового процесу зазвичай додаються інші персонажі, але в цілому зберігаються основні риси оригінальної «Мафії», Наприклад зміна дня і ночі, ходи лише вночі, і навіть союзи між учасниками. Також важливою відмінністю гри по мережі є те, що ведучий (він же Майстер гри, Казник) зазвичай комп'ютерна програма.

опис гри

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

У тридев'ятому царстві, у тридесятій державі, за сімома морями, жили собі поживали кілька сіль, а в них Добрі молодці и Червоні дівчата. Сіяли вони хліб, та ходили в навколишній лісок по гриби та ягоди… І тривало так з віку у вік, поки страшна катастрофа не потрясла Землю і не стало зло розповзатися світом! Ночі стали довгими й холодними, а темряві нишпорили лісом і забредали в село недобрі та страшні тварюки. Прилетів звідкись Змій Горинич і нагодився красти Червоних дівчат і відбирати все цінне у селян. Шкідлива та жадібна Баба Яга, що прилетіла на ступі з далеких лісів, збентежила розум жителів, і навіть дехто кинув ремесло і пішов у ліс розбійничати, сколотив там зграю. Лиходії зустріли Лісовика, що вмів перетворюватися на дерева та кущі, він став стежити за мирними селянами і служити розбійникам, винюхуючи, чи не починають чогось Добрі молодці для позбавлення своїх поселень від нечисті. Добрі молодці і Червоні дівчата, що втомилися від набігів Розбійників, та жахливих смертей від рук страшного Лиха Одноокого, зібрали золота і запросили із сусіднього міста відомого борця. Івана-Царевича, що пообіцяв позбавити село від розбійників На галявині в лісі Іван врятував від неминучої загибелі Сірого Вовка, що потрапив у яму-пастку Розбійників. Натомість Вовк пообіцяв повідомляти Царевичу про різні лісові погані. Мимо проїжджала відома цілителька Василина Премудра, а коли побачила біду — залишилася виходжувати жителів, які постраждали від лихих нападів. За лісом з'явився чорний палац, у якому, за чутками, оселився Чахлик Невмерущий, щоночі він навідувався в села і зачаровував Добрих Молодців і Червоних Дівиць, щоб вони не сміли не послухатися його наказу, все робили так, як він скаже. А в Неживому Лісі оселився Кіт-Баюні кожен, хто його зустрічав, засинав мертвим сном після його казок або гинув від його залізних кігтів.

"Нові Билини". Для dev, ops та допитливих людей
тридев'яте царство

Як уже видно, гравці діляться на кілька груп:

  • мирні жителі (Добри Молодці, Красни Дівиці, Іван-Царевич, Сірий Вовк та Василина Премудра)
  • розбійники (власне розбійники, а також Баба-Яга та Лісовик)
  • незалежні (Змій-Горинич, Лихо Однооке, Царівна-Жаба, Кощій Безсмертний, Кіт-Баюн)

Мета гри, як було сказано вище, залишитися живим і перемогти. Противники повинні так чи інакше залишити гру, а незалежним так само слід залишитися живими до кінця гри. У грі є золото, своєрідна ігрова валюта, яку гравці заробляють лише усередині гри. Ті, хто виграв, отримують золото. Чим більше золота, тим вищий рейтинг гравця.

Зупинюся докладніше на описі персонажів.

"Нові Билини". Для dev, ops та допитливих людей
Добрий Молодець

"Нові Билини". Для dev, ops та допитливих людей
Червона Дівчина

Добрий Молодець и Червона Дівчина - Наймасовіша і основна роль у грі. Це мирні жителі, які ночами сплять, а вдень працюють. Вночі на них нападає хтось із розбійників, Змій Горинич та інші ролі, а Василина Премудра їх лікує. З деякою, невеликою ймовірністю Добрий молодець або Червона дівчина можуть пережити напад без шкоди (можливо, втративши при цьому золото), проте при цьому всі дізнаються псевдонім гравця наступного дня після нападу захисту. Вночі ці гравці не роблять жодних ходів, а аналізують ігрову ситуацію, виходячи з повідомлень в ігровому чаті. Вдень ці гравці вирішують шляхом голосування, хто з них не є Добрим молодцем або Червоною дівчиною. Гравець, за якого проголосувала більшість інших гравців, йде з гри, ті, що залишилися, отримують або втрачають золото. Якщо гравці не вибрали когось більшістю голосів, ніхто з гравців не буде страчений.

"Нові Билини". Для dev, ops та допитливих людей
Іван Царевич

Іван Царевич - Спочатку анонімний захисник мирних жителів. Ночами перевіряє ролі інших гравців, бо знає лише одного свого союзника Сірого Вовка. За безпосередньою участю Сірого Вовка (який також може перевіряти ролі інших гравців) Іван-Царевич замість перевірки вночі може вбити іншого персонажа. Якщо в результаті перевірки Іван-Царевич бачить роль Доброго Молодця чи Червоної Дівчини у гравця, то може запросити їх до себе та познайомити із Сірим Вовком та іншими Добрими Молодцями та Червоними Дівчинами. Івану може перешкодити Царівна-Жаба, яка його може вночі спокусити, при цьому не надаючи його ролі іншим гравцям вдень. Якщо Іван сам виявить Царівну-Жабу, може їй запропонувати приєднатися до мирним жителям, проте якщо Царівна відмовить, вона гине від руки Івана. Змій-Горинич також може заважати перевіркам Івана-Царевича, але, на відміну від Царівни-Жаби, вдень він розповість решті гравців, хто з них — Іван-Царевич. Вдень Іван-Царевич нічим не відрізняється від інших добрих молодців.

"Нові Билини". Для dev, ops та допитливих людей
Сірий Вовк

Сірий Вовк — помічник Івана-Царевича, чий гострий нюх допомагає Іванові знайти інших Добрих Молодців та Червоних Дівиць. Сірий Вовк говорить цим гравцям, хто Іван-Царевич, а також повідомляє про інших гравців з ролями Добрих Молодців та Червоних Дівиць. Якщо Вовк виявить розбійника чи іншого супротивника, він негайно повідомляє Івана-Царевича, щоб той наступної ночі вжив заходів. Якщо на Вовка нападе Царівна-Жаба, він перетворюється на звичайного Доброго молодця і не може перевірити будь-кого, а Царівна не дізнається, що насправді це був Сірий Вовк, бо Вовк уночі не спить. Однак сам Вовк при цьому вдень дізнається, хто з гравців — Царівна-Жаба, і може спробувати схилити решту Добрих Молодців та Червоних Дівиць, яких привів до Івана-Царевича, голосувати за страту Царівни-Жаби. Також наступної ночі може спробувати анонімно схилити Царівну-Жабу на бік мирних жителів, щоб вона не чіпала нікого з них. Вовк уночі може пожертвувати собою, щоб врятувати Івана-Царевича чи Василису Премудру, якщо він припускає, що ті раптом потраплять під удар розбійників, або ж були зомбовані Кощієм (у Вовка вражений імунітет до чарів Кощія), але Вовк після самопожертви вибуває з гри.

"Нові Билини". Для dev, ops та допитливих людей
Василина Премудра

Василина Премудра — грає за мирних жителів, проте вони про неї не знають, бо Василина дуже скромна. Також Василина Премудра, коли лікує, не ставить запитань і як добрий лікар лікує всіх підряд. Але якщо її ліки вип'є Кощій, Лихо чи Лісовик — не жити їм довше одного дня, оскільки Василина лікує лише людей. Змію Гориничу чи Коту-Баюну ліки Василини Премудрою теж не допоможуть, але й шкоди не завдадуть. Також Василису вночі не чіпає Кот-Баюн, оскільки за травами лікувальними Василиса до Безжиттєвого Лісу не ходить. Крім того, жіночі чари Царівни-Жаби на Василису не діють. Якщо її пацієнта спробують вбити двічі, медицина виявиться безсилою. Василина не врятує і від магічних атак, наприклад, від прокляття Ліхом. Вдень Василиса поводиться як Червона Дівиця, і лише скороминущий, трохи сумний погляд може трохи натякнути, що вона найкращий лікар у Тридев'ятому царстві.

"Нові Билини". Для dev, ops та допитливих людей
розбійник

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

"Нові Билини". Для dev, ops та допитливих людей
лісовик

лісовик ночами шпигунить для Розбійників, повідомляючи їм про знайдені ролі в їхньому Логові, але вдень не голосує, оскільки не живе в селі. Однак інші гравці можуть проголосувати за Лісовика і, таким чином, стратити його. Так як Лісовик виходець із боліт, його не може спокусити Царівна-Жаба, а якщо й спробує, то Лісовик помітить її будинок, і мешканці села дізнаються, хто вона така насправді. Не варто Льошому побоюватися і чар Кощія, а от Василиса може залікувати його до смерті. Якщо Кот-Баюн спробує напасти на Лісовика, то ризикує втратити свої залізні пазурі, і доведеться потім Коту присипляти жертв одним лише мурчанням.

"Нові Билини". Для dev, ops та допитливих людей
Баба Яга

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

"Нові Билини". Для dev, ops та допитливих людей
Змій Горинич

Змій Горинич ночами літає над селами, лісами та болотами і займається пограбуванням, розкриваючи вдень роль пограбованого. Вдень Змій спить, тому не голосує, але його можуть страчувати більшістю голосів. Змій дуже небезпечний для всіх, особливо для Розбійників та Івана-Царевича. Змію все одно, кого грабувати, але якщо його розкриє Вовк чи Лісовик, він може стати цінним союзником. Якщо вбити Змія вночі, можна, певною мірою, отримати дуже цінний предмет — Зміїну Шкуру, яка захистить її власника один раз від фізичної атаки.

"Нові Билини". Для dev, ops та допитливих людей
Лихо Однооке

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

"Нові Билини". Для dev, ops та допитливих людей
Царівна жаба

Царівна жаба не може перемогти у грі, зате може заробити дуже багато грошей, спокушаючи інших гравців ночами. Спокушений при цьому пропускає хід. Жаба не може спокусити Василису Премудру, також їй варто уникати Лісовика, який її здасть усім наступного дня. Якщо Іван-Царевич чи Ватажок Розбійників знайдуть Жабу, то можуть запросити на бік мирних жителів чи Розбійників, при цьому Іван не приймає відмови Жаби, а от Ватажок не такий розбірливий. Але Царівна досить хитра, може стати подвійним агентом, адже попри те, що вона сама не може перемогти, — це чудовий шанс набрати золота, адже шанси дотягнути до кінця гри сильно зростають! Вдень Царівна-Жаба прикидається Червоною Дівицею та голосує з усіма разом.

"Нові Билини". Для dev, ops та допитливих людей
Чахлик Невмерущий

Чахлик Невмерущий живе в замку. Ночами він ходить навколишніми селами і зомбує Добрих Молодців та Червоних Дівиць, які переходять до нього на службу і беззаперечно виконують усі доручення. Відмовившись виконати наказ, наприклад, голосувати вдень по-іншому, ніж було сказано Кощеєм, або писати повідомлення вдень у чаті, якщо Кощій це заборонив, Слуга Кощея гине. Таким чином Кощій здатний вплинути на результати голосування вдень, хоч сам особисто не голосує. Якщо Кощія вб'ють, усі його жертви також гинуть. Василиса може вилікувати Слугу Кощея, який згодом повертається до своєї вихідної ролі. У Змія-Горинича та Вовка вроджений імунітет до зомбування, тож Кощій при всьому бажанні не може звернути їх до себе на службу. Також Вовк може виручити з біди Івана чи Василису, пожертвувавши собою. Врятовані Вовком набуває Вовчий імунітет до зомбування.

"Нові Билини". Для dev, ops та допитливих людей
Кіт-Баюн

Кіт-Баюн живе в лісі, ночами полює. Вдень спить у себе в дуплі, тож у голосуванні не бере участі. Проте вдень його можуть страчувати більшістю голосів. Кіт може атакувати двома способами: мурчати - і тоді його жертва засинає і не може ходити вночі, а також голосувати наступного дня - або вбивати відразу залізними пазурами. Атака пазурами не працює на Змії-Гориничі, а, атакувавши Лісовика, Кіт і зовсім може залишитися без кігтів! Лихо не може проклясти Кота, який після прокляття просто спатиме одну ніч. Якщо хтось здолає Кота-Баюна перемогти, від будь-якої хвороби та недуги, включаючи прокляття Лиха, зцілиться. Ця здатність Кота зберігається за гравцем до кінця гри. Слуги Кощія не можуть вдень голосувати за Кота, але можуть побічно дізнатися, хто Кіт, не повідомляючи про це Кощію. Кот-Баюн не вступає в союзи з Іваном чи Розбійниками, тож вони для Кота — першорядна мета.

Використовувані технології

Для написання гри я вибрав технологію безсерверних обчислень (serverless) на основі OpenFaaS, оскільки вона є досить простою для організації гри, і разом з тим досить розвинена, щоб писати складні ігрові правила без зайвих ускладнень. Також я використовуватиму кластер Kubernetes, оскільки цей спосіб розгортання додатків дозволяє досить просто і надійно отримати швидке розгортання, можливість легкого масштабування. Для створення ігрової логіки можна обійтися тільки OpenFaaS, проте я також спробую зробити Казковика у вигляді окремого контейнера, щоб порівняти складність реалізації. Як основну мову програмування для мікросервісів та функцій я вибрав Go, оскільки вже давно вивчаю його у вільний час на заміну Perl, а для взаємодії користувачів з мікросервісами та функціями використовуватиметься js на основі якогось фреймворку. Про остаточне рішення я розповім у відповідній статті циклу. Для спілкування функцій між собою я вибрав NATS.io, оскільки вже стикався з нею раніше, і досить легка інтеграція в Kubernetes.

Анонс

  • Запровадження
  • Установка оточення для розробки, розбиття задач на функції
  • Роботи над backend
  • Роботи над frontend
  • Налаштування CICD, організація тестування
  • Запуск пробного сеансу гри
  • Підсумки

Джерело: habr.com

Додати коментар або відгук