fix(rules): a cone/line template excludes the caster's whole footprint, not just the anchor cell (SRD aiming-a-spell.md: 'It starts from any corner of your square' - every occupied square is origin space and never inside its own area) - cone_cells/line_cells take caster_cells; combat passes caster.occupied_cells(); 1x1 casters bit-identical; documented simplification: a grazed caster cell still consumes a length slot

This commit is contained in:
2026-09-19 16:34:22 +02:00
parent 2e468ba619
commit 1e2de7f89d
3 changed files with 111 additions and 12 deletions
+8 -2
View File
@@ -7255,9 +7255,15 @@ class CombatEngine:
else:
origin = caster.pos
if effect.shape == "cone":
cells = cone_cells(self._grid, origin, aim, span_cells)
cells = cone_cells(
self._grid, origin, aim, span_cells,
caster_cells=caster.occupied_cells(),
)
else:
cells = line_cells(self._grid, origin, aim, span_cells)
cells = line_cells(
self._grid, origin, aim, span_cells,
caster_cells=caster.occupied_cells(),
)
affected = [
state
for state in self._states