🇺🇦 Дизайн та імплементація ігрової механіки на основі задач в грі "Дике Поле: Слобода"

Search for a command to run...

No comments yet. Be the first to comment.
This is the series related to my experience building game with Flutter and Dart. It is basically a diary. At first I implement feature and then add a post about it. https://locadederta.com/sloboda
Introduction In this article I will show you how you can use OOP and LinkedList to generate 2D Map with terrain details in Dart and Flutter. The map feature is intended to be included in my city building game Loca Deserta: Sloboda. In part 1 we will...
Build. Craft. Explore.

Заселяємо південь України!

Hey! We just published the second content update for our game Sloboda 2. This update is free for anyone who already purchased our game. If you want to purchase it, then pick your platforms: Apple App Store: https://apps.apple.com/us/app/loca-deserta-...

Привіт, компана! Ось і настав час Січневого оновлення для нашої гри Слобода 2! Це оновлення безкоштовне для всіх, хто придбав гру. Якщо ж ще не придбали, то можете це зробити по цих посиланнях: Apple App Store: https://apps.apple.com/ua/app/loca-dese...

Статистика запуску гри Трохи більше двох тижнів тому ми випустили гру на всіх магазинах. І одразу ж попали в Топ платних ігор 🇺🇦українського App Store! Купити можна на iOS по посиланню: https://apps.apple.com/ua/app/loca-deserta-sloboda-2/id164250...

Ви уже могли читати першу статтю в моїй серії імплементацій ігрових механік: Дизайн та реалізація механізму подій в покроковій грі . В цій же статті я покажу дизайн та імплементацію ігрової механіки на основі задач, яку я зробив в своїй грі Слобода. Вихідний код гри знаходиться на GitHub: https://github.com/gladimdim/sloboda
Покрокову гру легше реалізовувати, тому для першої ітерації була вибрана саме ця механіка. У розробника завжди є єдина точка зміни стану гри - гравець натиснув кнопку "Завершити хід". Під час обробки події дуже легко обробити всі стани будівель, інвентаря, подій, статистики.
Наприклад, алгоритм обробки генерації ресурсів складається з таких кроків:
Якщо пункт №1 не проходить перевірку, то продовжити з наступною будівлею.
Але такий підхід дуже спрощує і сам ігролад: гравець може виставити, наприклад, виробництво їжі на максимум і просто заспамити гру ходами. Через 10 ходів в інвентарі буде сотні їжі, яка уже може бути використана для інших виробництв. І за 5-10 хвилин гравець уже програв 20-30 ігрових років і має сотні ресурсів. Грає стає не цікавою. Хоч я і додав катастрофічні ігрові події, які можуть повністю вичистити склад або людей, але відновити дієздатність Слободи все одно займає 1-2 хвилини клацання на кнопку "Завершити хід".
В цьому типу гри уже немає кнопки "Хід", натомість, всі маніпуляції з Слободою відбуваються через запуск задач для генерації ресурсів. Задачі займають якийсь час для завершення. В кінці терміну гравець може зібрати результат виконання.
Наприклад, ресурс "Поле" генерує їжу, для виробництва необхідно лише 3 вільних людей:

Коли час на виконання задачі закінчився, можна зібрати ресурси до інвентаря:

Може бути запущено багато задач на одній з ресурсних будівлях:


Він має додаткову властивість bool isStarted, яка визначає чи задача уже почала своє виконання.
DateTime finishAt містить час, коли задача буде виконана. Встановлюється автоматично в правильну дату, якщо задача стартується.
Метод start розпочинає виконання задачі:

Також вона запускає внутрішній таймер, який тікає кожну секунду і перевіряє, чи виконана задача:

І не забуваємо підчищяти за собою таймери і потоки:

У нас є клас Taskable, тепер можна розширити функціонал ResourceBuilding , щоб будівля могла працювати із задачами.
Для початку додамо наступний новий клас RTResourceTask. Він розширяє клас зі списком задач і потоком. В цей потік будуть кидаться повідомлення, якщо задача виконана. Це буде місток між UI, будівлею і задачами в ній:

Taskable defaultTask буде визначатися кожною будівлею окремо. Це буде шаблон для створення задачі, коли гравець натисне кнопку «Почати задачу».
Приклад стандартної задачі для Будинку Мисливця:

Тепер кожен раз, коли додається задача до будівлі, потік зі змінами в статусі задачі додається до потоку змін будівлі. І за допомогою StreamBuilder віджета можна оновлювати стан виконання задач на екрані:

Весь дизайн виявився напрочуд простим. Всього одним класом Taskable та розширенням RTResourceTask ресурсних будівель, вдалося змінити механіку гри з покрової на задачну.
Вихідний код гри знаходиться тут: https://github.com/gladimdim/sloboda
Сама гра доступна онлайн: http://locadeserta.com/sloboda, або в Google Play Store: https://play.google.com/store/apps/details?id=com.gladimdim.sloboda