feat(combat): grant soft cover (+4 AC) to ranged attacks through creatures

This commit is contained in:
2026-08-17 22:49:50 +02:00
parent f67cd017e4
commit bb53d049ee
5 changed files with 129 additions and 19 deletions
+28
View File
@@ -88,3 +88,31 @@ def test_cover_melee_uses_same_corner_rule_in_phase0() -> None:
def test_cover_same_square_is_false() -> None:
grid = make_grid(["."])
assert has_cover(grid, (0, 0), (0, 0), ranged=True) is False
def test_soft_cover_creature_between_grants_cover() -> None:
"""A creature between shooter and target grants cover on ranged attacks."""
grid = make_grid([".....", ".....", "....."])
occupied = frozenset({(1, 2)})
assert has_cover(grid, (1, 0), (1, 4), ranged=True, occupied=occupied) is True
def test_soft_cover_melee_ignores_creatures() -> None:
"""Melee attacks ignore creatures for soft cover (CRB: ranged only)."""
grid = make_grid([".....", ".....", "....."])
occupied = frozenset({(1, 2)})
assert has_cover(grid, (1, 0), (1, 4), ranged=False, occupied=occupied) is False
def test_soft_cover_creature_behind_target_ignored() -> None:
"""A creature behind the target does not grant cover."""
grid = make_grid(["......", "......"])
occupied = frozenset({(1, 5)})
assert has_cover(grid, (1, 0), (1, 4), ranged=True, occupied=occupied) is False
def test_soft_cover_creature_off_axis_ignored() -> None:
"""A creature off the attack line does not grant cover."""
grid = make_grid([".....", "....."])
occupied = frozenset({(0, 2)})
assert has_cover(grid, (1, 0), (1, 4), ranged=True, occupied=occupied) is False