Карантинная визуальная новелла в Excel

Доброго времени суток, господа и дамы.

Уже полтора года я не писал ничего про Excel-страдания, но недавно произошло несколько событий. Первое — я заболел COVID-19 и заполучил, помимо потери вкуса и обоняния, кучу свободного времени. Второе — на DTF появилась статья от alien Alina про разработку игр в упомянутой офисной программе. Вот, кстати, и она:

Вдохновленный статьей, я сел за код.

Изначально я понятия не имел, что хочу получить в результате. Было решено плыть по течению и начать с самых основ. Я поставил себе только одну цель — закончить игру за период самоизоляции, то есть за две недели.

Выбор палитры

Самый трудоемкий процесс игрового цикла, если речь идет об Exсel — это отрисовка игровых объектов на экране (закрашивание нужных ячеек листа). Для того, чтобы рендеринг происходил быстрее, требуется использовать встроенную в рабочую книгу стандартную палитру из 56 цветов. Вторая особенность — заполнение «экрана» попиксельно занимает значительно больше времени, чем заполнение его целыми диапазонами одного цвета. Эти два фактора повлияли на окончательный выбор палитры. Практически сразу я вспомнил о GameBoy — замечательной консоли из конца прошлого века. Это портативное чудо техники поддерживало аж 4 цвета: черный и три оттенка серого. Однако из-за особенностей монохромного жидкокристаллического экрана, эти цвета имели зеленый оттенок.

Графику я традиционно рисую в замечательной Aseprite, тем более, что в ней можно выбрать готовую GameBoy-палитру.

Карантинная визуальная новелла в Excel

Хранение игровых данных

Прежде, чем писать код, нужно определиться с форматом хранения данных игровых объектов. Excel — это идеальная программа для подобных вещей. Мало того, что листы представляют собой двумерные массивы, так и обращаться к этим листам из кода проще простого.

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

Texture

На этот лист я поместил сведения о спрайтах. Каждая ячейка — это один пиксель изображения. Она содержит информацию о цвете (от 1 до 4, то есть от светло-зеленого до темно-зеленого). Когда движок рендерит объект, он берет информацию о его текстуре из массива спрайт-листа (по координатам X и Y).

Спрайт-лист в Aseprite:

Карантинная визуальная новелла в Excel

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

Как же я переносил PNG изображения в Excel и собирал информацию о цвете пикселей? Сперва я нашел на просторах интернета утилиту, написанную в Excel, которая позволяет перенести BMP изображение на лист (т.е. закрасить нужные ячейки в цвет пикселей). Этой утилитой я и воспользовался.

Спрайт-лист в Excel (можно заметить очертания спрайтов):

Карантинная визуальная новелла в Excel

В рабочей книге с игрой я написал небольшой скрипт, который ищет цвет ячейки и возвращает цифру от 1 до 4. Этим способом я пользовался до тех пор, пока спрайт-лист не стал слишком большим, и утилита начала его обрезать.

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

Assets

На этом листе хранится информация о всех возможных игровых объектах (данные о текстуре, анимации, коллизии и типе объекта). Эти объекты — базовые, то есть из них собираются уровни.

Карантинная визуальная новелла в Excel

Animation

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

Карантинная визуальная новелла в Excel

Maps

Все листы, названия которых начинаются с ключевого слова MAP, содержат информацию об игровых уровнях. Каждый объект (или инстанс) — это информация о названии базового объекта с листа Assets, координатах его положения в плоскости, слое рендеринга и тэге для связи с активными объектами (о них позже).

Карантинная визуальная новелла в Excel

Так как я «офигенный» программист, то естественно ничего не продумал с самого начала, поэтому игрок всегда находится на четвертом слое, иначе игра ломается. Только игрок. И больше ничего. Вообще. Обожаю костыли.

Сперва я думал, что мне придется создавать собственный редактор уровней, но в какой-то момент я наткнулся на замечательную программу под названием Tiled. Она позволяет создавать тайл-сеты из спрайт-листов с указанием пользовательских параметров для каждого тайла, а также с легкостью рисовать уровни и сохранять их в разных форматах, в том числе JSON.

Карантинная визуальная новелла в Excel

Я снова расчехлил свой Python и написал целый класс, который преобразовывает тайл-сеты и данные уровней в нужный мне формат.

ActiveObjects

На этом листе находится информация об активных объектах. Некоторые такие объекты нужно активировать нажатием кнопки действия, а некоторые — путем пересечения активной зоны. Все объекты связаны с инстансами на карте и позволяют совершать с ними разные непотребства: телепортировать, перемещать, изменять анимацию, включать/отключать коллизию, посылать текстовые сообщения и т.д.

Сами объекты без проблем редактируются с указанием кастомных параметров в том же самом Tiled.

Карантинная визуальная новелла в Excel

Идея?

А вот с идеями у меня было туго. Уже после первых тестов движка я понял, что лезть в степь платформеров и шутеров не стоит. Фреймрейт недвусмысленно на это намекал. При отсутствии на экране большого количества разных цветов он держится на уровне 20-25 кадров в секунду, но в обратном случае падает аж до 10-12 кадров. Фреймрейт зависит и от размера уровня. Оптимальный вариант — 1500-2000 тайлов. А это, уж поверьте, не так много.

Что остается? Например, RPG. Но этот жанр несколько не соответствует поставленным мной целям. RPG должна быть комплексной и большой, и создать такую игру за две недели мне кажется невозможным.

Карантинная визуальная новелла в Excel

В конце концов я обратился к визуальным новеллам. В качестве референса взял To the Moon и приступил к разработке. (Дисклеймер: я прекрасно понимаю, что моя поделка ни в коем случае не может соперничать с этим шедевром).

Карантинная визуальная новелла в Excel

По сюжету мы играем за последнего оставшегося в живых монаха, который недавно похоронил всех своих товарищей и жителей соседней деревни. Все они погибли от эпидемии чумы. Обнаружив, что тоже заражен, монах решается исполнить последнюю волю своего наставника — умершего ранее аббата монастыря. Задача простая — забрать в соседней деревне некий сверток и отнести его в другое поселение маленькой девочке. Осталось только запастись едой и не забыть верную Библию.

Итоги недели

Итак, за первую неделю я успел сваять кривой и косой игровой движок, полный костылей и странных решений, нарисовать целый альбом графики, придумать завязку сюжета и собрать несколько игровых уровней.

Карантинная визуальная новелла в Excel

За следующие семь дней мне надо успеть нарисовать еще больше графики, собрать еще больше уровней, попытаться написать интересный сюжет и, что самое важное — создать систему сохранений. В настоящий момент игра всегда начинается с нуля, что непозволительно для визуальной новеллы.

Благодарю за внимание. Через неделю подведение итогов и релиз (какое громкое слово я подобрал) на itch.io. Надеюсь, что я успею завершить игру хотя бы на 60%. Пока писал статью, подумал о возможности переноса в будущем сей задумки на нормальный игровой движок, но с обязательным сохранением двухбитного зеленого стиля. Уж больно он мне понравился.

До встречи.

5959
13 комментариев

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

5
Ответить

Как раз наоборот. Просадка кадров связана с тем, что процесс закрашивания ячеек очень затратный:)

1
Ответить

Пост и так уже в геймдеве, где 425 459 подписчиков. Репосты не особо помогут. Только чуть позже можно репостнуть для тех людей в ленте, кто ещё не видел.

2
Ответить

Люблю такую херню.

2
Ответить

Обязательно потом поделись ссылочкой на проект, на работе поиграюсь)

1
Ответить

Обязательно. В следующей заметке выложу. Правда придется свыкнуться с низким фреймрейтом:)

Ответить