def add_unit_to_battle_in_progress(
battle_organization: BattleOrganization,
world_unit: WorldUnit
):
battle = battle_organization.side.battle
if world_unit.owner_character:
battle_character = BattleCharacter.objects.get_or_create(
battle_organization=battle_organization,
character=world_unit.owner_character,
present_in_battle=(
world_unit.owner_character.location.tile == world_unit.location.tile
)
)[0]
battle_character_in_turn = BattleCharacterInTurn.objects.get_or_create(
battle_character=battle_character,
battle_turn=battle.get_latest_turn()
)
else:
battle_character = None
battle_unit = BattleUnit.objects.create(
battle_organization=battle_organization,
owner=battle_character,
world_unit=world_unit,
starting_manpower=world_unit.get_fighting_soldiers().count(),
battle_side=battle_organization.side,
name=world_unit.name,
type=world_unit.type
)
create_contubernia(battle_unit)
position_generator = joining_contubernium_position_generator()
for contub in battle_unit.battlecontubernium_set.all():
coords = next(position_generator)
while battle.get_latest_turn().get_contubernium_in_position(coords) is not None:
coords = next(position_generator)
contub.x_offset_to_formation = coords.x
contub.z_offset_to_formation = coords.z
contub.starting_x_pos = coords.x if battle_organization.side.z else -coords.x
contub.starting_z_pos = coords.z + 10 if battle_organization.side.z else -coords.z - 10
contub.save()
battle_unit.starting_x_pos = math.floor(battle_unit.battlecontubernium_set.all().aggregate(Avg('starting_x_pos'))['starting_x_pos__avg'])
battle_unit.starting_z_pos = math.floor(battle_unit.battlecontubernium_set.all().aggregate(Avg('starting_z_pos'))['starting_z_pos__avg'])
battle_unit.save()
set_contubernia_starting_pos(battle_unit)
评论列表
文章目录