ECW Dev. Пост нытья
Просто обожаю переписывать с нуля:
...
На самом деле я не знаю, зачем сломал то, что работало в последний раз (там работали прям диалоги, небольшая карта, само сражение).
А теперь весь этот код не валиден.
Поскольку всё его внутреннее взаимодействие нужно перевести на новый базовый класс. Раньше это была связка game.attributes и game.values. Теперь это всё (и многое другое) будет объединять game.entity. Стоит ли пояснять, что из-за этого структура вообще всех игровых объектов сломана?
Также помимо этого необходимо создать протокол взаимодействия игры с интерфейсом. Чтобы потом игра стала сессией, а интерфейс - клиентом.
И всё это необходимо только по факту того, что игра в жанре пошаговой тактики/стратегии. Конечно, есть примеры хороших пошаговых одиночных игр, но у меня-то идея в комбинировании юнитов и их эффектов.
Это всё идёт из условных настольных игр, где важен не только принцип "камень-ножницы-бумага", но и начальные условия для игроков.
Возможно, это можно описать так: хочется создать детерменированный полигон. Игрок изначально знает правила игры, и как всё устроено, но выбор юнитов и их взаимодействие между собой могут сами по себе рождать закономерности и связки. Конечно же, проверять это интереснее в дуели с другим игроком, нежели с AI-болванчиком (хотя, сейчас ИИ можно так обучить, что будет не хуже игрока играть). Кстати об этом: ещё одна причина некоторого "усложнения" игровых механик: создать такую среду, в которой обучение ИИ было бы затруднительно. То есть, игровые ситуации должны формировать такие следующие ситуации, которые не дают однозначного ответа об их качестве (ведёт к победе или поражению).
Поэтому и производится уже 5-ый рефакторинг - чтобы предоставить инструменты создания юнитов, эффектов и умений такие, которые могли бы описывать и реализовывать нетривиальные механики.
Ссылаясь на этот пост, можно выделить такие механизмы поведения при наличии особенности "Преклонение":
1. Если существо разумное, оно не может атаковать персонажа и не может двигаться в радиусе 2 клеток.
2. Если существо не разумное - ему пофиг.
Буквально одно свойство юнита определяет, будет оно унижено, или, не чувствуя разницы, продолжит нормально действовать в игре.
Кстати, об обучаемости, имеется ещё один вариант угнетения ИИ: сокрытие данных. Конечно, ИИ может рассчитывать вероятности и так далее, но если мы используем сокрытие для некоторых действий (как ловушка), то будь расчёт хоть 100 раз правильным, это можно использовать для вынуждения оппонента совершить неправильный ход.
А ещё...
Обнаружил, что у меня менеджер конфига подвязан к графической библиотеке из-за менеджера ресурсов, и чтобы правильно встроить в игровую библиотеку, нужно менеджер конфигов переписывать так, чтобы он работал изолировано от всего остального.
Велик
А это обёртка для передачи данных из сессии в интерфейс. И это тоже душная .. история:
1. Выбрать, должны ли данные отправляться клиенту.
2. Выбрать, должен ли конкретный клиент видеть эти данные.
3. Записать данные в пакет.
4. Как-нибудь там пакетики через эмуляцию сетевого интерфейса дойдут до клиента.
5. Получить пакет в правильном месте.
6. Считать данные из пакета и записать куда нужно.
7. Сменить состояние интерфейса на основе полученных данных.
В чём же нытьё?
Да потому что если игровая логика пишется прямо внутри клиента, можно уложить всё в два шага:
1. Обновили игровые данные.
2. Интерфейс когда ему нужно, где нужно, почитал полностью актуальные валидные данные.
Так это мы ещё пока не обсуждаем вопросы возможной рассинхронизации, при которой надо сделать так, чтобы даже если что-то сломалось, этот слом был контролируемым с выходом в ангар.
А ещё, поскольку я упоролся в написание отрисовщика для интерфейса, вероятно, и отрисовку карты в будущем захочется сделать через этот же отрисовщик, но там нужно будет (о, да, снова рефакторить отрисовщик, чтобы добавить ему возможность отрисовывать объекты послойно, чтобы batch работал).
А ещё анимации нужно додумывать в отрисовщике, а ещё смену одного отрисовщика на другой отрисовщик с поддержкой анимации.
Ещё вспомнил, что
Необходимо разделить логику игровой сессии и интерфейса так, чтобы можно было вызывать реализацию сражения без реализации истории. То есть, у нас как бы game::battle, который может существовать либо сам по себе, либо в рамках game::mission. И как бы ладно, ок, главное только, чтобы сетевое общение с интерфейсом происходило одинаковыми каналами.
А это:
, - реализация, вымученная, выстраданная, которая вместе с другими штуками пойдёт в урну. Я там писал где-то в начале про game::values? Вот s_value_3 как раз оттуда. Чтобы мы могли не просто числа прибавлять-убавлять. А добавлять нелинейные эффекты, баффы, дебаффы, корректно вычитать их, не ломая базовое значение и ограничивать, чтобы нельзя было накастовать 9991154214 ед. здоровья юниту.
Кстати говоря, возможно именно из-за этой проблемы вычисления модификаторов я начал переписывать когда-то давно проект в первый раз, заменяя поля:
.....
Хотя, казалось бы, здесь же есть всё, что нужно??? Иногда кажется, что самая первая версия проекта идеально сочетала в себе вообще всё, и была более продуманной и законченной чем то, что есть сейчас...