Skip to main content

Простая ферма (базовые механики)

Ищите как создать бот с игрой Ферма в Телеграм? В этой статье мы расскажем как создать бот с игрой Ферма с помощью @MenuBuilderBot. Мы раскроем БАЗОВЫЕ принципы игровой механики получения юзером прибыли от покупки растений (деревьев) и сбора урожая.

Надо понимать, что самих базовых принципов не достаточно для создания КАЧЕСТВЕННОЙ ИГРЫ "с погружением", однако понимая основы - вы можете приложить их к вашему конкретному проекту в той форме в которой вам это нужно. Для создания необходимого антуража, базовая игровая механика должна быть окружена и обоснована сюжетным сценарием, а также вспомогательным функционалом (пополнением баланса, наличием различных видов балансов для разных внутриигровых валют или предметов, присутствием различных способов оформить базовую механику в какой-то сценарно обоснованный вид, наличием возможности юзеру САМОМУ указывать или выбирать отдельные параметры).

❖ Необходимые навыки

ПРЕДУПРЕЖДЕНИЕ: Данное пособие НЕ ставит перед собой задачу обучения новичков и исходит из того что вы имеете базовые навыки работы с конструктором и УЖЕ ГОТОВЫ создавать более сложные проекты. Руководство раскрывает ПРИНЦИПИАЛЬНУЮ СХЕМУ работы отдельных игровых механик, в частности базовые ПРИНЦИПЫ РАБОТЫ СО ВРЕМЕНЕМ. Если в процессе изучения представленного материала ваших базовых знаний окажется не достаточно, советуем изучить основы прежде чем продолжать - обучать вас "как создавать кнопки" в этом руководстве мы не будем.

Несмотря на то что пособие рассчитано на подготовленных админов, для упрощения начального понимания приведённых схем - они приведены В САМОМ БАЗОВОМ СВОЁМ ВИДЕ. В дальнейшем, поняв принципы их работы, вы сможете усложнять их по мере необходимости - подобный подход позволит вам САМИ сформировать ПРАВИЛЬНЫЕ ПРИНЦИПЫ РАБОТЫ с новым функционалом и знаниями - даст понять, что НЕ НУЖНО БЕЗДУМНО КОПИРОВАТЬ приведённые подходы (а потом приходить в поддержку и говорить что ничего не работает и вы ничего не понимаете) - нужно понять их принцип на простых примерах и затем по мере роста понимания переходить к более сложным вариантам применения.

Список необходимых навыков:

Создание Кнопок и Сообщений
Переменные
Макросы
Баланс в боте
Условия
Action-ы
Выражения
Работа с Датой и Временем

❖ Принципиальная схема механики игры Ферма в боте

В данной схеме:
• Юзер улучшает сад покупая деревья которые плодоносят каждый день.
• Разные деревья приносят разное количество плодов за единицу времени.
• Юзер собирает урожай один раз в день (деревья не приносят плодов если предыдущий урожай не собран).
• Собранный урожай попадает на Склад, откуда его можно продать получив монеты на Баланс.

Подготовительные действия

На данном этапе мы подготавливаем функционал нашего бота для создания игровых механик.

● Числовая переменная «balance» у вас уже есть - там хранится Основной Баланс юзера.

● Создайте Числовые переменные для хранения видов деревьев (сад):
«fa_app_trees» - в ней будет хранится количество Яблоневых деревьев.
«fa_pea_trees» - в ней будет хранится количество Грушевых деревьев.
«fa_ora_trees» - в ней будет хранится количество Апельсиновых деревьев.

● Создайте Числовые переменные для хранения собранных фруктов (склад):
«fa_app_items» - в ней будет хранится количество Яблок.
«fa_pea_items» - в ней будет хранится количество Груш.
«fa_ora_items» - в ней будет хранится количество Апельсин.

● Создайте переменные Даты и Времени для хранения даты последнего сбора урожая:
«fa_app_collect» - в ней будет хранится дата сбора Яблок.
«fa_pea_collect» - в ней будет хранится дата сбора Груш.
«fa_ora_collect» - в ней будет хранится дата сбора Апельсинов.

Проверка состояния

Кнопка проверки состояния - позволит игроку узнать основные игровые показатели на данный момент.

● Создайте кнопку «Мой Сад» с сообщением например:

Мой Сад
🍏:  {floor(dt_passedm("%fa_app_collect%", 24) * %fa_app_trees% * 10 / 24)}, время роста: {dt_passed_hm("%fa_app_collect%")}🍐:  {floor(dt_passedm("%fa_pea_collect%", 24) * %fa_pea_trees% * 30 / 24)}, время роста: {dt_passed_hm("%fa_pea_collect%")}
🍊:  {floor(dt_passedm("%fa_ora_collect%", 24) * %fa_ora_trees% * 50 / 24)}, время роста: {dt_passed_hm("%fa_ora_collect%")}

Максимальное время роста - один день (24 часа). После этого количество фруктов перестает расти до тех пор, пока вы их не соберёте.

На вашем складе:
🍏:  %fa_app_items%
🍐:  %fa_pea_items%
🍊:  %fa_ora_items%

Рост фруктов рассчитывается по формуле. После 24 часов рост прекращается.
Вот как она работает (на примере Яблонь):
1. Считаем сколько прошло ЧАСОВ с момента последнего сбора урожая (в дробных часах):
dt_passedm("%fa_app_collect%", 24) - прошедшее время в часах, но НЕ больше 24 часов.
2. Количество прошедших часов (из формулы выше) умножаем на количество деревьев в саду и количество их плодов в час:
%fa_app_trees% * 10 / 24 - количество деревьев умножаем на их урожайность в ДЕНЬ (10) и делим на количество часов в сутках (24) - получаем количество в час.
3. Оборачиваем результат в Функцию floor() - чтобы в сообщении были только целые числа (не может быть половина Яблока).

Улучшаем Сад

Кнопка Улучшить - позволяет увеличивать количество деревьев каждого типа. Одна кнопка - улучшает один тип деревьев на заданное количество.

● Создайте кнопку «Улучшить Сад».

● Добавьте кнопке Сообщение с описанием характеристик каждого типа деревьев (пример для Яблок):

🍏 Яблоневый Сад
Текущий уровень: %fa_app_trees%
Производит: {(%fa_app_trees%)*10} 🍏 в день
Следующий Уровень: {%fa_app_trees%+1}
Будет производить: {(%fa_app_trees% + 1)*10} 🍏 в день
Стоимость улучшения: {pow(10,(%fa_app_trees% + 1))} монет

● Создайте кнопку «Улучшить Яблоневый Сад» с Условием «{%balance% >= pow(10,(%fa_app_trees% + 1))}» и сообщением ошибки «Недостаточно средств».

В описанном примере, стоимость каждого улучшения Сада (каждого уровня) растёт в геометрической прогрессии и представляет собой: базовую стоимость одного дерева (на уровне ноль) в степени количества существующих деревьев (уровней) плюс 1. Данный вариант представлен тут как пример одного из способов увеличивать стоимость уровней, математическими методами - не описывая каждый уровень отдельно.
Уровень 1 - 10 монет
Уровень 2 - 100 монет
Уровень 3 - 1000 монет и т.д. 

● Добавьте «Action Чисел» (списываем средства с баланса - рассчитывая по формуле количество монет)
Переменная для изменения: balance
Тип операции: Изменить Значение
Значение: -{pow(10,(%fa_app_trees% + 1)} (базовую стоимость уровня (10) возводим в степень с номером следующего уровня)
Условие: нет
Сообщение о Неудаче: нет
Сообщение об Успехе: не обязательно

● Добавьте «Action Чисел» (улучшаем сад)
Переменная для изменения: fa_app_trees
Тип операции: Изменить Значение
Значение: 1 (один)
Условие: нет
Сообщение о Неудаче: нет
Сообщение об Успехе: не обязательно

● Добавьте Сообщение кнопке: «Яблоневый Сад улучшен до уровня %fa_app_trees%!».

ВАЖНО: Надо понимать, что в данном случае описывается лишь общий (генерализированный) механизм и по хорошему (поскольку полученная прибыль рассчитывается по времени), при покупке нового дерева надо бы пересчитывать уже выросшие на данный момент фрукты в отдельную переменную и текущую (рассчитанную по формуле) сумму показывать как сумму рассчитанной прибыли и зафиксированной. Потому что при покупке нового дерева без фиксации суммы и обновления времени, общее количество фруктов будет рассчитываться по старому времени, однако с новым количеством деревьев - в результате чего получится что новое дерево плодоносило с того момента как игрок собирал урожай последний раз (что не корректно и открывает простор для абьюза).

Как другой вариант реализации - можно например сразу собирать урожай (см. ниже) в момент покупки нового дерева (повышения уровня сада) - но данное действие потребует какого-то сценарного обоснования, чтобы у игрока не складывалось впечатление что накопленное количество фруктов (рассчитанное по формуле) пропадает после улучшения.

Универсального решения тут нет - всё зависит от того в какую форму описываемая механика облечена в вашем конкретном проекте. В данном пособии - мы не создаём игру, а описываем подходы к реализации типичных игровых механик.

Сбор урожая

Кнопка Сбора Урожая позволяет перевести на "Склад", рассчитанное по формуле ("выросшее") количество фруктов для каждого вида деревьев.

● Создайте кнопку «Собрать Урожай» с сообщением например:

Урожай:
🍏 Яблоки: {floor(dt_passedm("%fa_app_collect%", 24) * %fa_app_trees% * 10 / 24)}
🍐 Груши: {floor(dt_passedm("%fa_pea_collect%", 24) * %fa_pea_trees% * 30 / 24)}
🍊 Апельсины: {floor(dt_passedm("%fa_ora_collect%", 24) * %fa_ora_trees% * 50 / 24)}

Сбор урожая для отдельной культуры - мы рассмотрим на примере Яблок - для сбора остальных культур процесс будет аналогичным.

● Внутри кнопки «Собрать Урожай», создайте кнопку «Собрать Яблоки»:

● Добавьте «Action Чисел» (выводим выросшее на Склад)
Переменная для изменения: fa_app_items
Тип операции: Изменить Значение
Значение: {floor(dt_passedm("%fa_app_collect%", 24) * %fa_app_trees% * 10 / 24)}
Условие: нет
Сообщение о Неудаче: нет
Сообщение об Успехе: не обязательно

Механизм расчёта выросшего описан выше в разделе "Проверка состояния" кнопка «Мой Сад».

● Добавьте «Action Чисел» (устанавливаем новое время отсчёта прибыли)
Переменная для изменения: fa_app_collect
Тип операции: Задать Значение
Значение: {dt_now()} (время "сейчас")
Условие: нет
Сообщение о Неудаче: нет
Сообщение об Успехе: не обязательно

Данной кнопке можно добавить команду (без перехода) и дёргать её «Action-ом Команд», каждый раз при улучшении Яблоневого Сада - перенося выросшее и устанавливая новое время (см. выше).

● Добавьте Сообщение кнопке: «Яблоки (%fa_app_items_v%) перенесены на Склад!».

Продажа фруктов

Кнопка продажи фруктов позволяет обменять урожай на Складе на Монеты по заданной цене.

Продажу отдельной культуры - мы рассмотрим на примере Яблок - для продажи остальных культур процесс будет аналогичным.

● Создайте кнопку «Продать Фрукты» с сообщением например:

Продажа фруктов:
🍏 Яблоко:  2 монеты
🍐 Груша:  5 монет
🍊 Апельсин:  10 монет
Мой склад:
🍏 Яблоки:  %fa_app_items% ({%fa_app_items% * 2} монет)
🍐 Груши:  %fa_pea_items% ({%fa_pea_items% * 5} монет)
🍊 Апельсины:  %fa_ora_items% ({%fa_ora_items% * 10} монет)

● Внутри кнопки «Продать Фрукты», создайте кнопку «Продать Яблоки»:

● Добавьте «Action Чисел» (начисляем сумму на Баланс)
Переменная для изменения: balance
Тип операции: Изменить Значение
Значение: {%fa_app_items% * 2}
Условие: нет
Сообщение о Неудаче: нет
Сообщение об Успехе: не обязательно

● Добавьте «Action Чисел» (списываем проданные фрукты)
Переменная для изменения: fa_app_items
Тип операции: Изменить Значение
Значение: {%fa_app_items% - %fa_app_items%} (вычитаем число само из себя - см. ниже)
Условие: нет
Сообщение о Неудаче: нет
Сообщение об Успехе: не обязательно

При списании проданных фруктов, мы используем режим "изменить значение" и отнимаем число само от себя, вместо того чтобы просто "задать значение" переменной равное 0 (нулю). Нужно это для того чтобы в сообщении кнопки можно было показать количество проданных фруктов - если "задать значение" то макрос "_v" - не сработает.

● Добавьте Сообщение кнопке: «Продано %fa_app_items_v% Яблок, получено %balance_v% монет!».

В представленном виде продажа фруктов скорее напоминает airdrop. Для того чтобы стать похожей на игровую механику, продажа тоже должна быть сопряжена с определённого рода сложностями - какими именно - решать вам (например продавать можно только определённое количество в день и т.п.).

❖ Варианты улучшения базовой механики

Возможность собрать весь урожай за раз

Можно предоставить игрокам возможность (за оплату) собрать ВЕСЬ урожай нажатием ОДНОЙ кнопки. Для этого создайте кнопку которая при помощи «Action-а Чисел» будет списывать заданную вами сумму оплаты с Баланса, после чего продублируйте в этой кнопке функционал из раздела "Сбор урожая" для каждой доступной культуры.

ВАРИАНТ ОПТИМИЗАЦИИ: каждой из кнопок для сбора отдельной культуры, задайте свою команду. Тогда в кнопке которая собирает ВЕСЬ урожай за раз - можно будет не дублировать Action-ны, а вызвать кнопку сбора каждой культуры её командой (при помощи Action-а Команд) и получить тот же результат с меньшим количеством Action-ов. Особенно актуально если в кнопках сбора будет больше действий чем два (два - в базовом варианте).

Улучшенные сорта деревьев

Вынесите урожайность каждого типа Дерева в отдельную переменную и увеличивайте сохранённое там число при помощи механик аналогичных тем что вы использовали при улучшении Сада. При каждом улучшении не забывайте что проводить его нужно только после сбора урожая или с пересчётом выросшего на момент улучшения.