Skip to content

Кризис

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

Особенности нейминга

Он иногда называется энкаунтер, он же бой. Я как-то настолько свободно жонглирую всеми этими терминами, что может встретиться любой из них; они эквивалентны.

Класс кризиса (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}

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

Основное назначение этого класса - он позволяет понять, что активировали в прошлом в этом бою участники. Итерация не должна быть очень затратной, но можно извлечь много полезного.