Привет, хабровчане!

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

Напомню, в чем суть этой таблицы. Игра-планировщик завязана на реальной жизни: еда, спорт, работа, прогулки итд – все это влияет на состояние Героя, полученный опыт, пройденный путь. Герой в мире пост-апокалипсиса пешком передвигается по «карте» из точки А в точку В. Придумал механику условных NPC – врагов и дружественных персонажей – торговлю условными ресурсами, а также доску объявлений с квестами и дополнительными наградами.

Интерфейс Героя
Интерфейс Героя

О чем расскажу

В настоящий момент это 10-я более-менее стабильная версия моей таблицы. В статье вкратце пробегусь по всем механикам. Позднее подробнее остановлюсь на наиболее интересных моментах: «внутреннем мире» Героя, как формируется Мир, взаимоотношения с противниками и союзниками.

При работе с формулами мне помогли мои базовые знания в программировании (PHP) и создание SQL-запросов. Ну и, конечно, справочник формул для гугл-таблиц.

Нереклама:

На создание подобной таблицы меня вдохновили RPG-планировщик Do it now и симулятор выживания Day R. В логике таблицы помогал ориентироваться сервис блок-схем lucid.app/. Рефлексию разделял со мной планировщик kaiten.ru.

Календарь

Тут ввожу исходные из реальной жизни: еда, вода сон, работа, спорт, прогулки и другие.

Чтобы немного упростить заполнение таблицы, применил формулу, которая скрывает все строки с датой старше сегодняшней. При наступлении текущей даты, таблица самозаполняется нолями.

В общем-то тут ничего интересного, обычный ввод данных.

Исходный расчет

Данные из «Календаря» попадают в этот лист – самый массивный и самый важный. По сути, фундамент всего планировщика.

Слева – параметры для вычисления очков, введенные вручную, и сумма выполненных пунктов из «Календаря».

Справа – итоговые вычисления.

Основные параметры Героя:

  • базовые жизненные показатели;

  • пополнение здоровья;

  • автоматические голод и жажда (уменьшаются каждый час);

  • качества характера Героя, влияющие на взаимоотношения с условными NPC.

  • травмы и болезни;

  • Погода (спарсил с сайта gismeteo);

  • Результаты выполненных/проваленных заданий.

У каждого действия есть коэффициент качества – отношения между запланированными и выполненными делами. В итоговый расчет уходят данные, помноженные на этот коэффициент.

При отрицательных показателях Герой не умирает, а уменьшается количество опыта. Это влияет на путешествие по  Миру – Герой просто идет в обратную. В этом и есть смысл названия игры «Путь домой»: Дом у Героя там, куда он (я) стремится – назад или вперед.

Чтобы создать в мире Героя смерть, нужны некие «точки отталкивания» в конкретный момент времени или хотя бы каждый день. Отслеживать эти «точки» ресурсозатратно. Пришлось придумать альтернативу.

Уровни

Тут расчеты выглядят проще:

В левой половине я вручную прописал уровни и количество опыта для их достижения. Всего 99 уровней и 1010 000 опыта. С помощью довольно простой формулы с каждым уровнем я слегка увеличиваю максимальные жизненные показатели Героя и заработанный опыт.

«Мир» и путь Героя

Самый интересный лист, попивший из меня кровушки. Без карты мира вся эта затея не имела бы смысла.

Карту я перерисовывал множество раз. Она была двухмерной, спиральной, многоуровневой, локальной… Всякий раз я сталкивался либо со запутанными расчетами, либо с ограничением ресурсов моего ноутбука.

В результате я остановился на таком одномерном варианте «карты»:

Пройденный путь – это заработанный опыт, помноженный на уровень.
Пройденный путь – это заработанный опыт, помноженный на уровень.

Герой передвигается в столбце Q сверху вниз. Сам путь состоит из населенных пунктов и случайно сгенерированных полей между ними, таких как поляна, лес, развалины, лагерь торговцев, лагерь бандитов и ид — всего полей 9 вариантов.

Для удобства я задал полям индивидуальный цвет с помощью условного форматирования:

Вот так выглядит пройденный путь (свернул немного строк, чтобы уместить маршрут в один экран):

Слева от «карты» – расчеты конкретного поля, пройденного пути и местоположения Героя. Справа серым шрифтом – приблизительный расчет времени, сколько занимает путь каждого отрезка.

Поле – это непредсказуемое число от 0 до 999 в столбце N. Каждый диапазон соответствует конкретному полю в столбце Q. Например, если N <= 200 – это «поляна», если N <= 300 – это «болото» … … если N >= 1000 – это «город».

Формулы RAND() или RANDBETWEEN() для Q не подошли, потому что они меняют значения при каждом обновлении таблицы. Мне нужные были не случайные, а непредсказуемые числа, чтобы карта сгенерировалась один раз. Решение я все-таки нашел, расскажу о нем в следующих статьях.

Не пройдённый путь я закрасил с помощью несложной формулы условного форматирования:

Обычно с помощью этой формулы в таблицах выделяют цветом целую строку в соответствии с условием. А я создал «туман войны»:]
Обычно с помощью этой формулы в таблицах выделяют цветом целую строку в соответствии с условием. А я создал «туман войны»:]

где столбец P – это пройденный путь Героя от начала конкретного поля.

Еще в этом листе формируются и подсчитываются условные NPC. В зависимости от «поля», меняется вероятность встречи с конкретным персонажем:

Например, в городе Герой скорее всего встретит торговца (0,8), а в лагере с бандитами – точно столкнется с бандитами (1). Условные NPC влияют на базовые показатели (здоровье и энергию), а также добычу условных ресурсов (у.р.).

Рюкзак и торговля ресурсами

Вот так незатейливо выглядит процесс торговли с дружественными персонажами:

Расчеты передаются слева направо
Расчеты передаются слева направо

В зеленой половине – дружественные NPC. Таблица подсчитывает количество встреч с ними, рассчитывает стоимость одной единицы у.р., общее количество вырученных денег.

В красной половине таблицы – результаты встречи с бандитами, мошенниками и другими противниками. Они крадут и здоровье, и ресурсы, и деньги.

Показатели «Харизма» и «Удача» влияют на стоимость единицы у.р (по умолчанию 100 ₽). Если «Мораль» упадет ниже единицы – то действия NPC поменяются на противоположные: бывшие союзники начнут атаковать и грабить Героя, а с бандитами Герой начнет жарить спирт торговать.

Задания, или доска объявлений

Лист «Задания»:

По сути, представляет из себя аналог базы данных в MySQL, где я формирую задачу, важность задачи, награду и сроки выполнения
По сути, представляет из себя аналог базы данных в MySQL, где я формирую задачу, важность задачи, награду и сроки выполнения

Далее подводится расчет всех выполненных/невыполненных заданий, и результаты отправляются в лист «Исходный расчет».

В листе «Герой» (эдакая сводная таблица) с помощью формулы QUERY() вывел упрощенный вариант этой базы, где я могу либо поставить галочку о выполненном задании, либо откупиться, если финансы Героя это позволяют.

Цвета обозначают уровень сложности квеста (1 — зеленый, 2 — желтый, 3 — красный). Чем выше словень сложности, тем больше опыта и денег Герой заработает.
Цвета обозначают уровень сложности квеста (1 — зеленый, 2 — желтый, 3 — красный). Чем выше словень сложности, тем больше опыта и денег Герой заработает.

Чекбоксы прописал вручную, а на пустых строках скрыл их условным форматированием. С помощью фильтра в столбце «Осталось дней» убираю те задания, срок которых уже прошел:

Итог. Что было самым сложным

С чем особенно приходилось проявлять внимательность:

  • Нужно всегда следить за последовательностью, особенно в многоуровневых условиях. Формула IFS() останавливает поиск в тот момент, когда находит соответствие. Это часто приводило к ошибкам там, где и не подумаешь искать.

  • Систематизация процессов должна быть умеренной. Одна из самых частых ошибок — «циклическая зависимость», потому что складывал значения, произрастающие друг из друга. Поначалу я все процессы делил на листы, и ничего в итоге не работало. Поэтому я поступил так, как и люблю поступать всегда – свалил все вычисления в кучу, чтобы волшебным образом все заработало.

  • Сложно ≠ правильно. Перусложненные формулы и запросы в QUERY() или многоэтажных условиях – главные «спонсоры» ошибок, которые практически невозможно обнаружить или исправить.

  • Поиск баланса. Жизненные показатели постоянно улетали в космос или бездну. Баланс начисления и потребления долго искал методом тыка и путем банальной логики. Продолжаю искать и сейчас.

  • Работать надо с холодной головой и не отвлекаться на ерунду. Много часов/дней ушло на мелочные идеи, спонтанно возникшие во время продумывания основной механики. Результат 0151 ни продуманной механики, ни мелочи.

  • Иногда надо начать сначала, чтобы избежать выгорания. Начинать сначала снова меня вдохновляли успехи в рабочих буднях, когда нужно было систематизировать несколько параллельных проектов, принимать работы от нескольких авторов по разным направлениям, отслеживать сроки выполнения.

Сам по себе процесс создания «Пути домой» был для меня увлекательной игрой и дорогой приключений. Которая еще не закончилась. В общем пока на этом все, благодарю за внимание:]

 

Комментарии (4)


  1. AlexLive27 Автор
    24.10.2023 08:24

    Буду рад, если в комментариях поделитесь похожими наработками в жанре выживания или стратегии, например, на Python:]


  1. Happybox
    24.10.2023 08:24
    +1

    Спасибо. Надо будет попробовать на досуге


  1. vint59
    24.10.2023 08:24
    +1

    круто!


    1. AlexLive27 Автор
      24.10.2023 08:24

      Спасибо)


  1. AlexLive27 Автор
    24.10.2023 08:24

    Буду рад, если в комментариях поделитесь похожими наработками в жанре выживания или стратегии, например, на Python:]