Интерактивная цифровая настолка Ужасы Аркхэма
5 постов
Больше чем за неделю получилось написать много функционала, примерный список того, что успел сделать:
Новая панель действия, куда вынесены все возможные действия игрока, фикс ходов и возможных действий, рефакторинг работы session manager.
Исправления действия Движение, в основном мелкие баги и исключения, теперь движение работает только по кнопке из панели действий и запрашивает подтверждение.
Добавлены ассеты жетонов навыков и иконок, убраны все заглушки с панелей.
Новое действие Улучшение навыка, позволяет раз в раунд прокачать любой навык с возможностью замены уже улучшенного навыка в зависимости от количествоа Сосредоточенности сыщика.
Новое действие Сбор средств - получаем деньги в свой ход.
Исправление сломанной анимации правой панели при её вызове и наведении.
Добавлено действие Атака, игрок может напасть на монстра и победить его при нахождении с ним в одной области
Действие Уклонение, также при нахождении в бою с монстром игрок может попытаться уклониться от него и тем самым сделать его изнуренным.
Реализован бросок кубика, пока только в виде логика и лога, без отрисовки бросков, позже этот обязательный визуал конечно же будет ярко представлен как основной акцент игры. Грани 5 и 6 (и 4 в случае благословения) подсвечены зеленым, а грань 1 красным.
Монстры появляются по сценарию из стартовой колоды на нужные места. Прописаны характеры монстров - охотящийся, прячущийся, патрулирующий. Монстры ищут и атакуют игроков исходя из их параметров.
Фазы в виде заглушек, в Фазе действия можем делать всё то, что было описано ранее, в Фазе монстров монстры начинают свои действия, движутся к нестабильной области (заглушка), атакуют сыщиков и наносят им урон и ужас. Фаза контактов и Фаза мифов пока в виде заглушки. Добавлены анимации и фриз состояния во время объявления фаз.
Сохранение и загрузка игры - все состояния, фазы, статистика, собранные карты, позиции сыщиков и монстров корректно сохраняются.
Естественно это всё сопровождалось множеством фиксом и правками, кое-где рефакторингом, написанием новых синглтонов и процедур. В этом посте не будет много формул и каких-то умозаключений, просто кратко пройдусь по всем пунктам выше, покажу на примере как это работает и выглядит, как обычно жду мнения в комментариях и готов к объективным правкам и изменениям!
1 Панель действий
Теперь во время Фазы действия у игрока над его панелью сыщика есть небольшая панель со всеми возможными действиями. Томми в этом ходу находится в бою с монстров, на что указывает иконка монстра возле его портрета, поэтому он может сделать лишь три действия - Уклониться, Улучшить навык и Атаковать.
По умолчанию при всех доступных действиях панель выглядит следующим образом
Особое действие будет сверять возможные сценарные события, такие как прорыв Барьера, Закрытие портала и т.д., сейчас это заглушка.
Дизайн скорее всего останется таким же, здесь не хочется ничего выдумывать, только мини иконки позже уберу на более подходящие стилистически в духе Аркхэма.
2 Действие Движение и 9 Фазы с заглушками
Так как тут были в основном мелкие фиксы, а ход стал возможен только с панели по кнопке Движение, то заодно особо показывать нечего, заодно продемонстрирую анимацию показа фаз.
3 жетоны навыков и иконки
Покажу красивую картинку, долго выбирал стилистику, в итоге пришел к таким вот жетонам, несколько добавил сразу на будущее для доп функционала, многие узнают почти все жетоны мифов и навыков.
Все жетоны вырезаны в отдельные ассеты, здесь я их просто скомпоновал на подложку коврика, чтобы показать все вместе не прикрепляя каждый отдельно. Мне больше всего нравятся жетоны навыков, книжка знаний особенно.
А так выглядят значки в панели сыщика, навык Сила уже улучшен, поэтому он подсвечен красным. Правую панель покажу дальше при активации действия Улучшение навыка.
Также сразу видно, что сосредоточенность в виде одной единицы уже потрачена, можно изучить еще один навык (не силу), а после уже решать что из прокачанного заменять.
4 Улучшение навыка и 7 Атака
Активировать действие можно в любой момент, даже во время боя с монстром. Если Сосредоточенность переполнена, то игра предоставит выбор какой улучшенный навык заменить - на примере ниже мы качаем Томми навык Воля вместо улучшенного навыка Внимание, а затем успешно атакуем и убиваем Фигуру в мантии. Пожалуй добавлю уведомление о том, точно ли игрок хочет заменить N навык на M в случае отсутствия свободной сосредоточенности или при попытке качнуть свободный навык.
5 Сбор средств
Проще некуда, нажали кнопку, подтвердили желание обогатиться - открылась панель и отработала анимация, денег стало больше.
6 Исправление анимации
Просто была проблема с одновременным вызовом из нескольких функций, которые друг друга перебивали и панель дергалась, просто убрал лишнее с небольшим рефакторингом.
8 Уклонение
Тут как и с атакой, отличие только в том, что при успешном уклонении монстр становится изнуренным и не нападет в свою фазу, а просто станет готовым, а также мы получим дополнительное действие. На примере ниже качаем навык Внимание, которое добавляет лишний кубик на бросок Уклонения и затем делаем успешный бросок. Монстр при этом помечается как изнуренный и в свой ход уже не нападет.
9 Бросок кубика, 10 Монстры и 11 Фазы
Выше уже были примеры с заглушками фаз, при каждой активации фазы стейт замораживается, показывается небольшая анимация и далее запускается конкретная фаза. Сейчас реализованы две - Фаза действия и Фаза монстров. В первой ходит игрок, во второй соответственно активируются и выполняют свои действия монстры.
Кубик пока реализован текстово, просто рандомайзер рисует "грани" в зависимости от количества "выбрасываемых" кубиков и ждет подтверждения от игрока. Далее дополню это графически.
Монстры на карте показаны в виде карточек, на них можно навести курсор и увеличить, перевернуть и посмотреть свойства, всё по правилам обычной игры. Карточка перевернута той сторонй, смотря в каком состоянии сейчас монстр - рубашкой если он в обычном состоянии, лицевой если изнурен, также добавляется дополнительная отметка о том, изнурен ли монстр. При вступлении в бой с сыщиком карточка монстра дополнительно отображается в панели этого сыщика, также добавлю мини иконку в левую панель, где находятся все сыщики, для быстрого понимания кт ос кем находится в бою.
12 Сохранение и загрузка
Можно было бы реализовать и позже, но мне надоело использовать тестовые кнопки для подгрузки сыщиков для разных тестов сценариев и фичей, так что добавил три слота как и задумывалось изначально.
Сохраняется весь стейт игры, также записываются дополнительные ID различных событий, количества ходов, перемещений, фаз, убийств монстров, уклонений, атак и т.д., как минимум для наполнения статистики сессии в конце игры и общей статистики, как максимум для получения достижений, которые также буду реализовывать.
Впереди выходные и свободное время, а значит будет возможность сделать в два раза больше!
Перешел к разработке и наполнению контента фаз, сейчас прописываю логику одной из самой многочисленной на возможности фазы, а именно действий сыщиков. Здесь они могут передвигаться, изучать улики, атаковать монстров, уклоняться от них, совершать обмен, копить деньги, изучать навыки, а также выполнять различные сценарые действия, открывающиеся по ходу сюжета.
Начал с действия Движение, как самого первого доступного. По правилам игры совершать каждое действие мы можем лишь один раз в фазу действия, то есть нельзя походить на три клетки игрового поля (две бесплатно, третья за деньги), а потом сделать еще один ход на 4 клетки (две бесплатно и еще две за бОльшие деньги).
Перед тем как продолжить, совсем забыл сказать, что еще успел реализовать жетоны сыщиков на игровом поле, передал им их параметры из файла состояния (урон и ужас, деньги, улики), сделал окна уведомлений при наведении на сами жетоны и легкую анимацию увеличения жетона. Кроме того, прописал на каждую область свою дополнительную объектную маску, теперь все сыщики на одной и той области района кучкуются рядом в своем месте, монстры будут появляться рядышком, жетоны безысходности выше, какие-нибудь еще жетоны в другом месте и т.д., ничто не будет друг другу мешать.
Вот они, шесть сыщиков, нижние трое изо всех сил закрывают надпись Вокзал - это я исправлю позже. При наведении на них отрабатывает всплывающее окно с главной информацией и жетон сыщика выделяется, как у Агнес Бейкер.
А здесь Майкл Макглен хотел бы расстрелять кого-то на улице из своей Чикагской пишущей машинки, но пока не умеет и не может...
В общем, касательно ходов. Есть файл состояния, который для каждого сыщика понимает, что с ним происходит в данный момент времени и глобально, например в данный момент времени это понимание того, сколько действий он уже совершил, например если походил - то в этом общем ходу у него еще осталось одно доступное действие, но второй раз походить он не сможет. А глобально это его жизни и ужас, жетоны улик и денег, навыков.
Этому файлу также передаются дополнительные эффекты различных карт, способностей и состояний. Например в видео выше вторым ходит сыщик Томми Малдун, у которого есть стартовая выбранная карта Мотоцикл. Карта Мотоцикл позволяет Томми ходить бесплатно не на две области, а на три, а уже на четвертую ходить за дополнительный доллар. На 5 областей ходить в игре никто не может (не считая телепортацию или другие механики), но тут я допустил небольшую ошибку и пока что менеджер ходов считает, что раз у Томми есть мотоцикл, то он бесплатно походит на три области, за доллар на четвертую и еще за доллар на пятую. К моменту написания поста я уже это пофиксил, и теперь он просто ходит на четвертую область за доллар.
В следующем видео уже подробно разобраны варианты действия Движение на примере одного сыщика Агнес Бейкер. Не обращайте внимание на завершение фазы - сейчас это заглушка, сбрасывающая счетчик совершенных действий для файла состояния. И то, что окно подтверждения действия находится в левом верхнем углу, сейчас оно уже по центру. Подтверждение нам нужно, чтобы случайно не кликнуть по карте и не походить туда, куда не хотели. Я пока не думал по поводу кнопки отмены последнего действия, это привнесет слишком много возможностей для игроков, скажем, не совсем честных, а подтверждение хода как раз является легальной возможностью не ошибиться с ходом.
Как устроены маршруты? По умолчанию, когда начался ход сыщика и он еще ничего не делал (действие Движение доступно), мы видим на карте белые точки возможных бесплатных ходов, в нашем случае это путь от области Вокзала до других смежных областей, улиц и областей соседних районов. Если же мы наводим курсор на интересующую нас область, то статические возможные маршруты пропадают и появляется активный анимированный. Можно провести дальнейший маршрут, увидев варианты хода за деньги (желтый третий шаг за 1$ или оранжевый четвертый шаг за суммарные 2$). А еще можно навести на центр района и увидеть все возможные пути от него, куда дотягивается игрок, либо же его максимальный кратчайший путь, который до этого района доведет (это если выбрать недосягаемый в данный момент район, как на 21 секунде в видео ниже).
Менеджер путей также рисует не один путь, а все возможные одинаковые, если их несколько, при чем если на одном из одинаковых по дальности путей будет стоять монстр - игра поведет сыщика по безопасному пути. Совершив действие никакие маршруты рисоваться не будут (тут увидел не совсем корректное поведение на видео, статический маршрут рисуется в момент выбора точки, куда хочет походить игрок, хотя его уже нужно убрать на моменте появления окна подтверждения хода - исправил это, а также добавил невозможность каких-либо действий при появлении окна подтврждения, кроме как согласия на ход или отмены), игроку остается только совершить другое действие, например атаковать монстр или изучить улицу, если у него еще остались очки действия, либо же закончить свой ход.
Сама же реализация ходов достаточно проста, у нас есть построенные графы связей всех областй, районов и улиц. Именно с помощью них мы и соединяли карту согласно сценарию. Основано всё на дискретной математике, граф это её классическая структура, а основан он на двух элементах - вершины (игровые области, районы и улицы) и рёбра (маршруты между ними). В игре граф неориентированный и невзвешенный, неориентированный это когда мы спокойно можем пройти от Вокзала до Аркхэмской лечебницы туда и обратно по одному маршруту, а невзвешенный это о, что мы можем делать это за одну стоимость в обе стороны (точнее расстояние у нас считается одинаковым в два шага).
В памяти игры все графы хранятся в созданном мной словаре, для каждого сценария он свой исходя из районов и их местоположений. Словарь же состоит из списка смежностей, который выглядит например вот так:
{
"train_station": ["str_northside_merchant", "str_northside_downtown", "arkham_advertiser", "curiosity_shop"],
"curiosity_shop": ["train_station", "arkham_advertiser"],
... }
То есть вокзал у нас соседствует с областями Аркхэм Эдвертайзер и Лавкой древностей и улицами Нортсайд - Торговый район и Нортсайд - Даунтаун, а вот Лавка древностей соседствует всего-лишь с Вокзалом и Аркхэм Эдвертайзер. Благодаря этому словарю каждая вершина знает список своих прямых соседей и позволяет понимать движку куда можно сделать ход из текущей точки.
Поиск же кратчайших путей (или одинаковых) строится на классическом BFS (Breadth-First Search), он же Поиск в ширину - фундаментальный алгоритм теории графов, который обходит вершины по уровням.
G = (V, E) это наше игровое поле из неориентированного невзвешенного графа. Топология связей задается списком смежности моего словаря Adj(u), который возвращает множество соседних локаций для текущей вершины.
Он начинает с начальной точки и последовательно исследует всех её соседей, прежде чем перейти на следующий «уровень» удаления, гарантированно находя кратчайший путь в наших невзвешенных графах. Он берет стартовую точку сыщика и проверяет всех её ближайших соседей (это 1-й круг, дальность = 1 шаг). Затем он берет соседей этих соседей (2-й круг, дальность = 2 шага) и так далее. Тот путь, который первым доберется до целевой точки, гарантированно является самым коротким. Я только добавил возможность рисовать все найденные короткие маршруты как одинаковые альтернативы, не останавливаясь на первом найденном.
Вот и всё с действием Движение! Дальше занимаюсь действими Изучение навыка, Изучение улики и Сбор средств, это будет намного быстрее и проще. Уже 8 подписчиков! Очень жду ваши комментарии и реакции, хочется по ходу разработки понимать где и что можно исправить или дополнить.
В процессе дополнения или просто просмотра старых функций, особенно тех, которые писались в самом начале, часто приходишь либо к оптимизации или вообще полного рефакторинга кода, либо к изменению визуала из-за желания исправить какие-либо косяки или просто потому, что захотелось сделать интерфейс по-новому.
Туман, первый шейдер, который написал еще для главного меню, начал окончательно мозолить глаза, кроме того при его относительно длительном перемещении был виден явный косяк бесшовности - прямоугольная, почти прозрачная текстура наложения, из которой он собирался и поверх которой накладывался, плыла по экрану и оставляла четкую прямую линию.
Квадрат Малевича. Если присмотреться, то видна горизонтальная линия по нижней части, как будто отбирает треть картинки. Кроме того такой подход с текстурой и шумом при сильно приближении выдавал мыло.
Самый первый туман работал по принципу классического скроллинга текстуры, который использовался еще в играх эпохи первой PlayStation. Грубо говоря как работают анимированные обои на скринсейвере. Координаты текстуры линейно смещались по вектору скорости в зависимости от времени, ну а время (скорость) тумана я настраивал произвольно для рандомизации:
Шейдер брал готовую статичную картинку шума и просто сдвигал сетку рендеринга. С точки зрения геометрии, здесь использовался один цветной прямоугольник (2 треугольника, 4 вершины). Это совсем , я бы сказал, что совершенно не критично для современных ресурсов процессора, разве что происходил постоянный Cache Miss при потере бесшовности, ну и тем более легко для видеокарты, но, чтобы минимизировать обрывы картинки при движении камеры, подложку под игровым миром приходилось делать физически огромной, либо оборачивать в ноду слоя параллакса. Я делал статичный размер около 3500x4500px и, конечно, это уже весомо влияло на производительность.
И здесь в верхней части то же самое, две части тумана рисуются совершенно по-разному, не сочетаясь между собой, а в динамике это проявлялось еще зуже, особенно при сильном отдалении камеры.
В общем, было вполне приемлемо, но пришло время двигаться дальше, прощай туман version 1.
Второй метод - убираем швы (добавляем бесшовность), убираем текстуру наложения и шум, начинем генерировать его на лету, никаких готовых картинок, чистая математика. В тех вариантах, что я начал пробовать и перебирать, в основно использовались два следующих метода.
Фрактальный броуновский шум с кубической интерполяцией Перлина:
И сам готовый шум после этого циклически закручивался сам в себя через так называемый Domain Warping (искажение области определения):
Мощный метод в процедурной генерации и компьютерной графике, который позволяет создавать органические и природные текстуры, искажая или деформируя шум перед их использованием.
Что касается самой геометрии и прорисовки, то здесь стало еще проще, в объекте теперь использовалось только 2 треугольника. Еще я сразу добавил, точнее допили старую фичу - при подступе к районам городам в начале уменьшать туман на 80% (вернее увеличивать его прозрачность), а в центре района и вовсе убирать на 100%. Это заставило движок в начале рисовать нужные маски поверх районов в буфер, а затем уже накладывать генерирующийся шейдер на него.
Проблема оказалась также в намного большей ресурсозависимости, но не из-за методов построения геометрии и функций, а потому что движку приходилось по 60 раз отрисовывать циклы нескольких октав шума, тригонометрических формул, матриц поворота, ведь теперь мы всё делали на лету. Видеокарте не поплохело, но так делать не надо. Зато конечно текстурная нагрузка в плане тумана упало ровно в 0%.
Тут 10 шакалов из 10, но только такой пример остался в буфере - туман в какой-то момент просто превратился в непрозрачную разлитую ртуть. Сильное искажение, смешивание цветов и альфа канала, сетка сжалась в мелкие фрактальные части, которые давали засвет.
Промежуточный вариант, точнее один из наиболее удачных настроек лучшего из дцати промежуточных. Это уже больше похоже на туман, который я хотел, но все еще слишком рваный и мелкотекстурный.
Наконец третий метод, если свести попытки на категории, дал нужный результат. Он объединил простоту первой версии и бесшовность со скоростью второй. Такой гибридный подход используется в современных играх в качестве тумана войны.
Я взял тот же низкочастотный шум, увеличил его почти в десять тысяч раз, получил пушистые и большие облака тумана. Количество прорисовок снизилось в те же 10000 раз, высвободив ресурсы. Допилил поле ореолов для районов, теперь не просто работает простая радиальная маска, а все районы и улицы имеют свою маску прозрачности, отдают точные координаты своего положения на карте. Динамическое поле ореолов, чаще называемое полем знаковых расстояний (SDF - Signed Distance Field), - это математическая или текстурная карта, которая хранит информацию о кратчайшем расстоянии от каждой точки пространства до ближайшей границы какого-либо объекта или контура. Убраны все маски, буферы прорисовки и текстуры. Один объект, простейший черный прямоугольник 2900x2200 пикселей с парой вершин и треугольников, потребление полигонов минимально, а всё, что уходит из зоны видимости игровой камеры - полностью отсекается на уровне потребляемых ресурсов. Текстурный процессор также обрабатывает это легко, пропуская через себя запекаемый шейдер шума с включенным аппаратным сглаживанием и бесшовностью. Видеокарта также тянет узор из кэш памяти на аппаратнмо уровне.
А здесь то же самое, но с настройками тумана в качестве Мин из меню игры, на случай, если кто-то будет запускать на самом слабом ПК. Можно и полностью отключить туман в настройках при желании.
На видео та текущая финальная версия, которая написана на данный момент. Разве что чуть докрутил параметры плотности тумана и сделал его подступы к районам поближе. А еще починил SDR/HDR при записи видео, так что теперь видите всё так, как и я вижу это у себя.
Времени на выходных было меньше, чем хотелось бы, так что это практически всё, что сделал за недолгие два часа. Успел добавить еще последние колоды и автоматизацию для них. На последнем скриншоте видна часть финального результата игрового стола - динамически в зависимости от сценария появляются все нужные колоды Контактов с картами каждого района и улиц, расположил их с небольшим интервалом справа от колоды Архива. В логику сразу прописал оставшиеся три района базовой версии вместе с ассетами на будущее.
Есть мысли позже сделать какое-то обрамление или рамку с текстурами и двигающимися щупальцами Ктулху по краям экрана, но это надо эксперементировать, будет ли так лучше...
На этом пока всё. На неделе приступаю к проработкам фаз действия сыщиков и монстров.
Растем, пост для моих уже 4 подписчиков! Оставляйте комментарии, чтобы хоть было понятно в каком формате продолжать, много или мало информации за раз, нужны ли эти формулы и объяснения. Спасибо!
Обещал сделать все колоды карт до конца дня - на 90% получилось. Напомню, что в предыдущем посте на игровом столе была тестово сделана только колода Аномалий (Брешь во времени для первого сценария Пришествие Азатота). Рассказываю, что вышло и как делал.
Вот как это вообще выглядит. В статике не так интересно, поэтому ниже прикреплю видео (и снова с убитым HDR, но кажется я нашел как принудительно записывать контент в SDR для отображения реальной сочности визуала). Единственное, что я не успел сделать - отрисовать дополнительные колододержатели для карт колоды Контактов и раскидать эти карты рандомно по соответствующим сценарию колодам районов и улиц, потому что их там целых 48 (по 8 карт на район и по 8 на улицы), и для каждой нужно сделать свою лицевую сторону да нацепить разные рубашки. На самом деле это уже просто небольшой повтор всех предыдущих действий, потому что суммарное количество юзабельных карт в колодах базовой игры 475, из которых не хватает как раз этих 48 карт контактов и еще около 50 карт мостров, всё остальное уже перенесено за пол дня, хотя "труд" очень однообразный и ошибиться при заполнении контента легко.
На рубашки колод для оживления интерфейса накидывал простые ненавязчивые шейдеры, для каждой колоды выбирал свою тематику.
Например для колоды Аномалий шейдерный эффект трещин пустоты, он же диаграма Вороного.
Это называется мозаикой Вороного. Она названа в честь математика Российской империи Георгия Вороного, который формализовал этот метод в 1908 году.
Для колоды Монстров сделал клубящийся белесый туман с помощью функции волновой интерференции sin(p.x + sin(p.y + TIME * speed)) * cos(p.y + cos(p.x + TIME * speed)), а внутри карты сохраняется прозрачность и рассеивается туман ближе к центру с помощью функции Эрмита.
Кубическая интерполяции Эрмита. Названа в честь французского математика Шарля Эрмита (1822–1901). Используется в компьютерной графике, чтобы сглаживать резкие переходы и избавляться от пиксельных «лесенок», да да, то самое сглаживание x4 в играх.
Мягкий блик на колодах Союзников, Заклинаний, Особых карт и Предметов сделал с помощью обычной функции линейной интерполяции.
Самая вызываемая математическая функция в любом графическом движке. Просто вспомните любые эффекты скользящих бликов в играх. А раньше она использовалась еще вавилонскими математиками и астрономами для предсказания положения планет по таблицам.
Как оказалось, математика всё-таки пригодилась в жизни хотя бы раз. Если без шуток, то написание шейдеров оказалось сложным балансом между сделать красиво и оптимизировано, во время экспериментов и подбора эффектов пару раз FPS очень даже приседал.
А здесь пример с малыми колодами. На Темной сделке как раз активировался шейдер прорыва карты (дрожание с проявляющимся и усиливающимся от края к центру покраснением), очень неприятные карты, кто играл тот понимает, сделал эффект наиболее предостерегающим.
Еще в процессе создание рамок поверх карт. В таком виде как ниже, особенно при увеличенной карте, выглядит не очень, нужна текстурная рамка со скругленными углами и возможно небольшим анимационынм эффектом свечения или перелива.
Правая панель с колодами используемыми игроков напрямую. Тут пока нет жетонов денег и навыков. Текстовые заглушки с названиями также будут убраны, как и стандартные панели будут заменены на красивые ассеты.
То же самое в динамике. Не сразу сообразил, что для эффекта ховера нужно обязательно делать функцию анти джиглера, иначе увеличение карты приводило к смещению её реального физического объекта, потери фокуса указателя и как следствие эффекта дребезжания если неудачно ерзать мышкой по границе карт. На видео эта функция уже добавлена и никаких волнений нет.
С картами колод Кодекса и Архива тоже всё оказалось достаточно просто. Согласно сценариям мы должны сразу выложить определенные карты архива в колоду Кодекса. Для первого сценария это карты под номером 2 и 3, соответственно смотрим в ресурс нашего сценария, считываем ID нужных карт и сразу добавлем их из колоды Архива. Оставшиеся в колоде карты обязательно сортируем по порядку, первая карта в этом сценарии не используемся, так что останавливаемся на лицевой стороне карты номер 4. Тут же реализована такая же карусель выбора карт, которая сделана и в панели инвентаря сыщика, можно выбрать нужную карту щелкнув по её выступающей части, ну а по умолчанию они идут друг за другом. Первой же открывается та карта, по чьей миниатюре нажмет игрок (если бы в Кодексе было три карты и игрок щелкнул по миниатюре средней, то слева и справа от нее было бы по карте).
Учитывая, что карт в колоде Кодекса много не бывает, верхняя панель не большая, там будет только основание состояние игры в виде количества безысходностей, особых жетонов, аномалий и прочих сценарных эффектов. Карты Кодекса будут сами переворачиваться (с уведомлением, которое нельзя будет прописать), если игрок выполнит или провалит соответствующее карте условие.
Все остальные колоды сразу были разложены согласно правилам игры, которые нужно перемешаны, другие расположены по порядку, те же Заголовки отобраны случайно в количестве 13 штук из всего списка.
Пока вот так, в выходные не будет много времени, возможно только разложу последнюю колоду, а может займусь визуализацией логики действия Движение первой фазы, в неё будет включена расстановка жетонов сыщиков на стартовую область согласно сценария, а также сами дальнейшие ходы игроков с учетом бонусов от их карт, визуальные подсказки на карте для возможных ходов по областям, возможность траты денег на доп ходы и остальное, что может быть связано с действием Движение.
Вроде даже не длиннопост получился, думал еще показать как колодостроение выглядит под капотом, какие ресурсы есть у карт и наследуемых к ним объектам, как они все параметризуются, но это достойно как минимум отдельного поста, да и вообще не факт, что будет большинству интересно.
Пост для моего единственного подписчика :(
Спасибо за просмотр!
Привет пикабушникам! Более 8 лет сижу здесь как зарегистрированный пользователь и около 14 лет читаю ресурс, за это время никогда ничего не писал и в целом просто смотрел интересные мне теги, без подписок, комментирования, да даже плюсов и минусов особо не раздавал.
Учитывая, что более чем тесно по профессии связан с IT, автоматизацией и хайлоадом - решил воплотить давние мечты и написать свою игру. Последние полгода пилю проект, участвую в нем большую часть времени один, немного помогает девушка с графическими ассетами и один раз нанял художника нарисовать то, что я сам не сумел бы. Сейчас отдыхаю от этого проекта, потому что он в целом весьма сложный и комплексный, ну и я не тороплюсь чтобы не перегореть. Расскажу о нем также в другом посте, если этот зайдет.
В перерыве от основного проекта во время очередного захода игр в настольный Аркхэм 3 редакции пришла в голову мысль оцифровать его, чтобы поиграть с теми друзьями, кто живет очень далеко, а также немного расслабиться и попробовать написать игру в другом жанре, да и попроще. На тот момент казалось, что это будет в меру легко и займет около месяца. Частично так и оказалось, но конечно же возникли и свои интересные моменты.
В чем я ошибся, так это что разработка будет простой. Учесть сотни карт, сценарии, аномалии, безысходности, активные и пассивные способности сыщиков, карты контактов и событий и прочие состояния оказалось непросто. Но, весь бэкенд написан, логика сформирована, сейчас уже допиливаю UI и встраиваю логику в визуал. В общем, смотрите, что получается. Не знаю, как пикабу обрабатывает картинки, возможно HDR немного протухнет, но не суть.
Сразу предупрежу, пока я накатываю фронт на бэкенд - я не пытаюсь сразу сделать красивые кнопки, визуал. Не все ассеты финальные, много где будет замена или подгонка. Что-то сгенерировано нейросетями и для меня это ок, потому что проект не коммерческий.
Что у нас тут есть: возможность создать как одиночную игру, так и сетевую, либо же присоединитсья к сетевой игре. Всё пишется в кросс платформе с помощью C# для WIndows, Linux и Mac, поддержка iOS и Android планшетов теоретически тоже будет на выходе, по разрешению честный 2к со скейлингом до FullHD, меньше уже вероятно будут проблемы с UI, но у кого сейчас экран меньше? Сетевая игра реализована через ENetMultiplayerPeer, обычный хост+клиент на базе протокола UDP с RPC вызовами, вся сетевая часть будет крутиться на хосте, а именно том игроке, который этот хост организует. Подключение соответственно по IP, так что кто захочет поиграть с друзьями - либо у хоста должен быть белый IP, либо DDNS, либо качать тунгл, хамачи или что-то, что организует локальную сеть.
У меня прописана вся логика для базовой версии игры с четырьмя сценариями, а также предусмотрены заглушки для первого дополнения Во мраке ночи. Надеюсь, что еще два дополнения Под темными волнами и Секреты ордена не привнесут столько нового геймдизайна, что мне придется сильно капиталить весь кор игры, если коненчо я вообще доберусь до этих дополнений, но пока то желание есть.
Играть можно в одиночную игру как самому или с кем-то в режиме Hot seat от 1 до 6 сыщиков, либо в случае сетевой игры каждый игрок берет себе по сыщику.
Здесь всё согласно правилам игры, вся логика и правила за очень небольшим исключением прописана по официальному рулбуку. В обычной настолке мы тоже можем играть одни против игры, при чем как одним сыщиком, так и взять за свое управление нескольких. От этого просто будет меняться динамика, некоторые возможности и иногда сложность игры. Кроме того существует огромное количество кастомных сценариев и так называемых "хомрулов", например убирается один из жетонов мифов или добавляется простой для облегчения или усложнения партии. Я пока что закладываю некоторый функционал на такие облегчения и усложнения, но в целом без серьезных изменений для стандартного игрового процесса.
Ассеты многие рисовал нейронкой, многие брал из бесплатно доступных PnP коллекций (те самые качественные сканы, которые можно распечатать где угодно, чтобы не покупать настольную игру и иметь возможность поиграть, а также на случай потери или порчи некоторых карточек). Как писал выше - какой-то визуал ближе к релизу поменяется, но в любом случае я далеко не всегда придавал огромное значение расположению блоков информации, иконкам (ну пока что), шрифтам - всё это еще будет меняться, когда будет готов весь фронт, чтобы не повторять одно и то же по несколько раз.
Конвертер видео сурово сожрал HDR, а мне было лень разбираться. В общем в реальности всё совсем не такое серое, эффекты намного ярче и симпатичнее.
Можем выбрать всех доступных сыщиков (включая сыщиков из допов в дальнейшем), почитать про их сильные и слабые стороны, увидеть основные статы, стартовые карты, а также выбрать вторую (или третью, смотря какой сыщик) стартовую карту. После этого начинается сам процесс игры.
Перед началом партии можем еще раз все прочитать, убедиться, что выбрали верно или выбрать других сыщиков.
Что у нас появляется дальше:
Игровое поле согласно сценарию, в нашем выбранном базовом сценарии Пришествие Азатота это 5 карт определенных районов, связанных между собой определенными улицами. Для всех сценариев уже построены нужные районы и улицы, связи между ними. Графы и связность очень важны и сделать их было достаточно сложно, но от этого зависят ходы сыщиков и монстров, да и не только.
Планшет/панель активного сыщика (если играем в одиночную) или соответственно планшет/панель именно нашего сыщика при игре в сетевую. На ней наши динамические параметры, собранные улики, все карты способностей, союзников, вещей и т.д. А также кнопки следующего хода, его передачи или окончания фазы
Панель с основными задачами сценария - картами кодекса, количеством безысходностей и аномалий, каких-либо дополнительных условий сценария.
Панель с другими сыщиками, по которой можно понять, кто сейчас ходит и кто главный хост/первый игрок, а также нажать и посмотреть подробную информацию. Также конечно там сразу отображаются здоровье, ужас и собранные улики.
Колоды карт, с которыми мы явно не взаимодействуем - я расположил их на игровое поле, в свою фазу они просто будут анимироваться и производить соответствующие эффекты.
Правая панель с магазином, картами союзников, заклинаний, особых карт. Также там визуальные жетоны денег и навыков. В общем всё то, что игрок сможем чаще выбирать и брать.
Игровое поле это был мой отдельный приоритет, на который ушло два дня, я хотел сделать что-то интересное, пусть не 3D, но на мой взгляд карта это как раз тот самый важный визуал, который должен притягивать взгляд, так что здесь старался сделать интереснее.
Еще более приближенный район Ривертаун, обратите внимание на выделенную область Кладбища, срабатывает небольшой эффект выделения, освещения и параллакса. На видео будет понятнее.
Всю карту можно скроллить, зумить в обе стороны, картинки районов полностью повторяют оригиналы, но с совершенно другой графикой. Вот несколько примеров чистых ассетов, особенно мне понравились визуализации улиц, смотрится странно, но вполне в духе Лавкрафта.
Собственно как это выглядит в динамике, зум релизован мышкой, передвижение по карте также либо мышкой либо через стрелки на клавиатуре или WASD.
По самой карте где надо напылен процедурно генерируемый туман, убрать его или уменьшить можно в настройках игры, хотя ресурсов он особо не потребляет, как никак 2D и простоые шейдеры. Под картой также сгенерирован с помощью случайного seed процедурный мир в виде леса, озер, дорог, опушек и гор вокруг города, чтобы не делать простой скучный темный фон. Город ничего не перекрывает, выстраивается только до определенных границ.
Для выбора карт реализованы обычные типовые карусели с увеличением, прокрутой, эффектами, шейдерами. На колоды также накинуты различные эффеткы и шейдеры, как можно увидеть в видео выше - не все колоды лежат на столе, этим я занимаюсь прямо сейчас и уже к вечеру они будут реализованы со своими эффектами.
В сыром виде все это выглядит страшно и непонятно, иерархия сцен, скриптов и ассетов глубокая, сейчас у меня примерно 45 тысяч строк кода. Может это и немного, но игру я начал писать чуть больше недели назад в свободное время вечером.
А вот пример той самой процедурно генерируемой подложки без районов, UI, виньеток и прочих эффектов.
Посты писать дело не простое, как и редактировать видосы, так что пожалуй для первой части это всё, что было не лень и не стыдно показать.
Теперь кратко, что сейчас есть и над чем идет работа.
Сделано:
Начало игры, выбор сыщиков, адаптивные параметры
Настройки и сохранение игры
Карта, районы, области, улицы
Вся игровая логика колод и сценария, все параметры ресурсов карт
Эфффекты всех карт, переписаны все сценарии
Многие шейдеры, эффекты, которые потом наследуются и меняются на нужные
Отрисованы кор ассеты - карты, колоды, эффекты
С большего собран игровой стол и меню
В реализации:
Доработка игрового движка и файла состояния всех событий
Реализация механики зачитки карт
Лог фаз в виде в виде действий игроков
Ассеты обложек и лицевых сторон некоторых колод, а также визуалы панелей, кнопок
Конец первой фазы (ходы сыщиков)
Чат
Прикрутить SFX и музыку, возможность голосового общения средствами игры
По поводу механики розыгрыша карт. Если в оригинале вы просто переворачивали карточку и зачитывали всё с неё, то теперь это будет делать гейм менеджер. Например, вместо розыгрыша карты контакта по время фазы контакта игроку нужно зачитать карту аномалии, потому что он стоит в районе аномалии на области с двумя жетонами безысходности. Как это делают в настолке? Другой игрок берет карту аномалии, смотрит раздел количества безысходностей, а именно 0, 1, 2-3 , выбирает нужный и читает: "Вам грозит опасность, бла бла бла, проявите Волю (проверка воли, бросьте кубик), чтобы..." и дальше молчит и ждет, какой результат кубика выбросит игрок. Если он выбрасывает успех - зачитывается успех и предпринимаются предписанные картой действия, карта убирается в отбой. Это по ЛОРу, чтобы игрок попавший в аномалию сразу не знал, что его ждет и что будет, если он проиграет, то же самое касается других карт выбора. Другое дело, если играть в оидночку, ведь тогда сразу видна вся карта и хочешь не хочешь, но прочитаешь то, что не надо бы читать (если конечно играть честно). Собственно моя задача предписывать гейм менеджеру читать именно то, что нужно исходя из сложившихся условий и автоматически совершать выбор после действий игрока. Это не сложно, но состояний и действий в игре огромное количество и нужно все предусмотреть и протестировать.
Жду вашу оценку и комментарии, особенно от любителей настольных игр и тем более от всех, кто играл и играет в Ужас Аркхэма или Древний Ужас, неважно каких именно серий. Ни в чем не претендую на истину, просто делаю, что самому нравится и что не сильно умею (я хоть и в IT, но совсем не разработчик и тем более никогда не работал в геймдеве). Если зайдет и понравится, то опубликую вторую часть, принимать советы и замечания по разработке, выкладывать результаты, т.к. игру пишу активно. А там и до публикации основного проекта доберусь. Пока что займусь наполнением оставшихся колод на игрвоой стол. Всем спасибо! Как говорится, панамка готова.