Кризис
Кризис - это то, в рамках чего энтити выполняют действия (абилки). Хотя, формально, они могут использовать абилки и вне боя, бой дает рад преимуществ - те же очередность, доступ к истории действий, плюс ряд дополнительных штук.
Особенности нейминга
Он иногда называется энкаунтер, он же бой. Я как-то настолько свободно жонглирую всеми этими терминами, что может встретиться любой из них; они эквивалентны.
Класс кризиса (Crisis)
Поля класса Crisis
uid: str- Айдишник, уникальная строка. Он так же primary_key в базе данных, поэтому его уникальность поддерживается на уровне бд.
current: bool- То, является ли бой "активным" (текущим). Если бой не активен, то он не принимает новых участников и находясь в нем нельзя ходить.
turns: list[Turn]- Список с прошедшими ходами в бою. Имеет специфичный класс для хранения, подробнее о нем будет ниже.
participants: list[Entity]- Список участников, он же порядок ходов. Тут хранится не сама энтити, а бдшный референс на нее.
sides: dict- Словарь, в котором ключ это название стороны, а значение это массив с референсами на энтити. По умолчанию выглядит как
{"own": []}. Как можно догадаться, own это особый сайд, означающий "сам за себя". Если энтити вступает в бой, не указывая сторону, она вступает в бой на стороне own. each_turn_statuses: list[Status]- Эти статусы накладываются каждый ход на каждую энтити в бою. Если вы не хотите, чтобы они бесконечно стакались, не забудьте про лимит или оверрайд.
on_join_statuses: list[Status]- Эти статусы накладываются на каждую энтити при ее входе в бой.
on_leave_statuses: list[Status]- Эти статусы накладываются на каждую энтити при ее выходе из боя.
time: CombatTime- Это энам, может быть
DAYилиNIGHT, само по себе ничего не делает, но может использоваться в абилках.
Методы класса Crisis
add_each_turn_status(status: Status)- Добавляет статус на каждый ход.
add_on_join_status(status: Status)- Добавляет статус в список on_join_statuses.
add_on_leave_status(status: Status)- Добавляет статус в список on_leave_statuses.
remove_each_turn_status(status: Status)- Убирает статус на каждый ход.
remove_on_join_status(status: Status)- Убирает статус из списка on_join_statuses.
remove_on_leave_status(status: Status)- Убирает статус из списка on_leave_statuses.
flip_participants(first_participant: Entity, second_participant: Entity)- Меняет двух указанных участников в бою местами.
initiative(rand: bool = False)- По умолчанию перемешивает всех участников в бою, заставляя каждого кинуть виртуальный бросок на восприятие и выставляя порядок энтити в бою согласно результатам броска. Если rand=True, то порядок будет полностью рандомный.
get_entity_side_name(entity: Enitity) -> str | None- Узнать сайд энтити в бою.
pick_new_side(entity, new_side: str)- Позволяет энтити выбрать новый сайд. Если такого сайда еще нет, он будет создан, если сайд уже есть, энтити будет в него добавлена.
add_participant(entity, side: str = None, index: int = None)- Позволяет добавить участника в бой. В аргументах можно сразу выбрать сторону (иначе будет выбрана own) и нужный индекс в очереди, сдвигая очередь на один. Их можно не указывать, тогда просто добавить энтити в конец очереди.
remove_participant(entity: Entity)- Убирает энтити из боя. Ожидается инстанс класса энтити.
deactivate()- Деактивирует кризис.
activate()- Активирует кризис.
get_current_order(uid: bool = False)- Возвращает список участников боя с с display_name каждой энтити, если uid False. Если он True, то вместо display_name будет uid.
is_it_turn_of(entity: Entity)- Возвращает True, если сейчас ход переданной энтити, в противном случае False. Одидается инстанс класса энтити.
Взаимодействие боевых и небоевых
Как уже было сказано, можно использовать абилки даже если энтити не в бою. Но если энтити в бою, она не может использовать абилки на энтити в других боях. Так же, если она не в бою, а цель - в бою, то абилку использовать тоже не получится.
Ходы (Turn)
Есть отдельный класс Turn, новый экземпляр которого добавляется в список crisis.turn каждый раз, когда энтити начинает ход.
Поля класса Turn
turn_id- Личный номер хода. Первый ход всегда будет с айдишником 1.
actioneer- Энтити, который делает определенное действие.
actions- Все действия энтити в списке (list). Хранятся в виде словаря со значениями, дублирующими аргументы вызова функции боевки.
У этого класса нет никаких методов и вообще это лишь организация хранилища, не более того.
Пример экшена
Вот, как выглядит код создания словаря, который добавляется в actions:
{"source": self.uuid,
"target": target.uuid if target else None,
"action": ability_container.ability.uid,
"def_ability": def_ability.ability.uid if def_ability else None,
"result": res_ctx.result.value}
Это для одиночных абилок, а не АОЕ, но там почти то же самое, разве что будут списки там, где параметров может быть несколько.
Основное назначение этого класса - он позволяет понять, что активировали в прошлом в этом бою участники. Итерация не должна быть очень затратной, но можно извлечь много полезного.