Skip to content

Релятивные баффы

Я решил, что эта тема слишком комплексная для впихивания на страничку с энтити, и касается куда большего спектра сущностей, чем статусы, поэтому рассматриваться они будут на собственной, хоть и небольшой странички.

Итак, релятивные баффы! Они сложные. Смысл релятивных баффов в том, чтобы в зависимости от тэгов на себе, на враге, на своем оружии или на используемой абилке получить бонус к урону или к точности (роллу). Это крайне крутая возможность, дающая вам возможность, например, сделать зелье, которое увеличивает урон по горящим врагам в два раза или уменьшить точность стрельбы по врагам, носящим штаны (если, конечно, сделать такой тэг). Формально это является баффом, но работает очень специфично. Разберемся, как.

Начнем с того, как они выглядят (в составе класса Buffs):

buffs=Buffs(relative=RelativeBuffs(
    target_tag_buffs={
        "elf": [{"type": "extra_precision", "amount": 10}, {"type": "mod_damage", "amount": 1.25}]
    },
    own_tag_buffs={
        "undead": [{"type": "extra_damage", "amount": 15}]
    }
))
Как видно, сам объект класса RelativeBuffs это лишь вместилище полей со словарями. Всего этих полей 4:

Поля класса RelativeBuffs

own_tag_buffs: dict
Тэги, перечисленные тут, будут искаться на себе.
target_tag_buffs: dict
Тэги, перечисленные тут, будут искаться на враге.
own_ability_tag_buffs: dict
Тэги, перечисленные тут, будут искаться на юзаемой абилке.
own_weapon_tag_buffs: dict
Тэги, перечисленные тут, будут искаться на собственном оружии. Применимо только для тех абилок, которые передают в качестве AbilityLocation соответствующее место абилки. Короче говоря, просто держать в руках меч недостаточно, нужно юзать абилку этого самого меча.

Внутри каждого из этих атрибутов словари, причем, в целом, они заполняются одинаково:

  • Ключ каждого такого словаря это uid тэга, который должен давать или не давать определенный бафф. Я хотел тут хранить сами тэги, но орм отнеслась к этому негативно.
  • Затем значение это массив из других словарей. Эти другие словари обязательно имеют в себе type и amount. В принципе, type может дублироваться, хотя в этом нет никакого смысла, ошибкой это не будет.

Amount говорит сам за себя. Это число. Оно работает так же, как и числа в генерализованных баффах в плане флоатов и интегеров (если не знаете, как это, обратитесь к их описанию на страничке энтити)

Типы релятивных баффов

Этих типов всего 4. Тут нет никакой дополнительной валидации, я так же хотел делать их энамом, но орм слабо меня понял и отказывается в дважды вложенном словаре заниматься их десериализацией, поэтому это строки. Будьте осторожны! Возможно в будущем я научу ОРМ это делать, но это явно не сильно приоритетная задача.

extra_precision
Бонус к точности. Amount ожидается интегер.
mod_precision
Модификатор точности. Amount ожидается флоат.
extra_damage
Бонус к урону. Amount ожидается интегер.
mod_damage
Модификатор точности. Amount ожидается флоат.

Собственно, этого достаточно. Дальше все будет сделано полностью автоматически и от вас не требуются никакие усилия в самих абилках, чтобы определить эффект ситуативных баффов, они применяются автоматически. Кроме, конечно, того случая, когда вы не пользуетесь финишерами и декораторами - если так, то посмотрите как это сделано в них и воспроизведите в своей абилке.