Релятивные баффы
Я решил, что эта тема слишком комплексная для впихивания на страничку с энтити, и касается куда большего спектра сущностей, чем статусы, поэтому рассматриваться они будут на собственной, хоть и небольшой странички.
Итак, релятивные баффы! Они сложные. Смысл релятивных баффов в том, чтобы в зависимости от тэгов на себе, на враге, на своем оружии или на используемой абилке получить бонус к урону или к точности (роллу). Это крайне крутая возможность, дающая вам возможность, например, сделать зелье, которое увеличивает урон по горящим врагам в два раза или уменьшить точность стрельбы по врагам, носящим штаны (если, конечно, сделать такой тэг). Формально это является баффом, но работает очень специфично. Разберемся, как.
Начнем с того, как они выглядят (в составе класса 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
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 ожидается флоат.
Собственно, этого достаточно. Дальше все будет сделано полностью автоматически и от вас не требуются никакие усилия в самих абилках, чтобы определить эффект ситуативных баффов, они применяются автоматически. Кроме, конечно, того случая, когда вы не пользуетесь финишерами и декораторами - если так, то посмотрите как это сделано в них и воспроизведите в своей абилке.