Skip to content

Адаптация

Адаптация - это что-то вроде "приспособленности" энтити к тому или иному региону. Эта механика сильно завязана на передаче гео-координат энтити и ваще поддержки конечным движком таких координат. Если вам это не сильно нужно, то вы можете игнорировать адаптацию, так как это достаточно вторичная механика.

Поля класса 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:

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
В нем тоже есть знакомые методы get() и mod(), хотя я пока и не представляю их юзкейс.

То, что с _positive защищает от положительных значений, тогда как с _negative защищает от отрицательных. Например, вещи с temperature_negative защищают от холода, тогда как temperature_positive - от жары.

Эта таблица резистов входит во все баффаемые предметы, а так же в саму энтити.

  • Если итоговая (от региона + врожденная) адаптация положительная, то из нее вычитается положительный (_positive) резист. При этом полученное число не может быть меньше нуля.
  • Если итоговая адаптация отрицательная, то к ней приплюсовывется негативный (_negative) резист. Полученное число не может быть больше нуля.

Таким образом, как можно видеть, резисты приближают адаптацию к нулю, которая считается "эквилибриумом", куда нужно стремиться.

Эффекты адаптации

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

Эти эффекты должны рассчитываться из итоговой адаптации, например, если после всех резистов и сложений у вас температура 50, то это не очень хорошо. Хотя тут все это будет писаться в функциях самого Питона и вполне возможно, можно будет с этим поиграться и придумать даже баффы в зависимости от тех или иных параметров. В общем, stay tuned.