Адаптация
Адаптация - это что-то вроде "приспособленности" энтити к тому или иному региону. Эта механика сильно завязана на передаче гео-координат энтити и ваще поддержки конечным движком таких координат. Если вам это не сильно нужно, то вы можете игнорировать адаптацию, так как это достаточно вторичная механика.
Поля класса Region
uid: str- Уникальный юид региона.
display_name: str- Отображаемое имя региона.
adaptation: AdaptationTable- Поле с таблицой адаптации.
dimension: str- Название измерения, в котором находится регион. По умолчанию OVERWORLD.
shape: list[tuple[int]]- Форма региона. Это массив с массивами, изображающими координату точек на 2D-полотне. Пример можно видеть ниже.
y_axis: dict[str, int]- Словарь с двумя ключами - "min" и "max", изображающими максимальную и минимальную высоту региона. Таким образом все регионы могут быть многоугольными фигурами, но, одинаковыми в своей высоте. Мы посчитали, что расчет точек для 2D-пространства куда быстрее полноценнных 3D-объектов, поэтому тут специально было сделано такое упрощение.
Итак, для начала работы вам нужно создать регионы в content/regions.py:
Region(uid="cold_island",
display_name="Холодный остров",
shape=[(0, 0), (0, 10), (10, 10), (10, 0)],
y_axis={"min": 0, "max": 255}).save()
Выглядит усредненный регион как-то так. Shape это набор точек, означающих форму (полигон) региона, тогда как y_axis в словаре min и max задаются высоты. Подразумевается, что координата энтити передается в формате xyz, то есть он существует в трехмерном мире.
Самое важное для нас - это AdaptationTable. Это класс со следующими полями:
Поля класса AdaptationTable
temperature: int- Окружающая температура.
air: int- Чистота/качество/насыщенность воздуха.
terrain: int- Сложность местности.
oceanic: int- "Океанистость" региона. Делалось конкретно под ролевой проект Stargazer, предлагаю вам заменить для своего.
natura: int- "Природность" региона - насколько он загружен биомассой. То есть, чем выше значение, тем больше он похож на цветущие заросшие джунгли.
ecology: int- Экологическое загрязнение региона.
Подразумевается, что все значения идут от -100 до +100 и означают, собственно, во первых направленность, а во вторых силу эффекта. Например, температура -50 может означать "холодно", а +50 означает "жарко", тогда как +100 означает "адское пекло". Эти значения условны и не привязаны к литрам, цельсиям или килограммам.
Так же у него есть весьма стандартные методы get(resist_type: str) и mod(adaptation_type: str, mod: str), которые ничем не отличаются от геттеров и моддеров у StatsTable, ResistTable, Attributes или Skills, кроме самой сути валидации значений, поэтому
Адаптация у энтити
У каждой энтити есть аж три класса с адаптацией.
adaptation_embedded: AdaptationTable- Это врожденная адаптация. То есть, например у персонажа может быть врожденные +50 к температуре, тогда, если он будет в местности, где 50 температуры, то для него это будет все 100. Так можно изобразить слабость и воспримчивость. Впрочем, верно и то, что если будет -50, ему будет комфортно.
adaptation_resist: AdaptationResistTable- Врожденный резист. Тут все понятно, он просто складывается с остальными.
adaptation_current: AdaptationTable- Текущая адаптация. Это, по сути, кэш - процессор адаптации записывает итоговое значение (после вычета резистов) сюда. Это нужно для того, чтобы не надо было хранить последний регион, где энтити была, и вы могли сделать с ней что-то особенное в зависимости от ваших статов. Например, нанести урон, если она замерзает или вы находитесь в высокогорном регионе.
Есть класс AdaptationResistTable, который, в немного упрощенном виде, выглядит как-то так:
class AdaptationResistTable:
temperature_positive: float
temperature_negative: float
air_positive: float
air_negative: float
terrain_positive: float
terrain_negative: float
oceanic_positive: float
oceanic_negative: float
natura_positive: float
natura_negative: float
ecology_positive: float
ecology_negative: float
То, что с _positive защищает от положительных значений, тогда как с _negative защищает от отрицательных. Например, вещи с temperature_negative защищают от холода, тогда как temperature_positive - от жары.
Эта таблица резистов входит во все баффаемые предметы, а так же в саму энтити.
- Если итоговая (от региона + врожденная) адаптация положительная, то из нее вычитается положительный (_positive) резист. При этом полученное число не может быть меньше нуля.
- Если итоговая адаптация отрицательная, то к ней приплюсовывется негативный (_negative) резист. Полученное число не может быть больше нуля.
Таким образом, как можно видеть, резисты приближают адаптацию к нулю, которая считается "эквилибриумом", куда нужно стремиться.
Эффекты адаптации
Их пока нет. Плак-плак. Ну зато смотрите какая красивая красная рамочка с красным жучком на щите. Когда-нибудь они будут обязательно.
Эти эффекты должны рассчитываться из итоговой адаптации, например, если после всех резистов и сложений у вас температура 50, то это не очень хорошо. Хотя тут все это будет писаться в функциях самого Питона и вполне возможно, можно будет с этим поиграться и придумать даже баффы в зависимости от тех или иных параметров. В общем, stay tuned.