74 lines
No EOL
2.3 KiB
Python
74 lines
No EOL
2.3 KiB
Python
"""McRogueFace - Cell Highlighting (Targeting) (basic)
|
|
|
|
Documentation: https://mcrogueface.github.io/cookbook/grid_cell_highlighting
|
|
Repository: https://github.com/jmccardle/McRogueFace/blob/master/docs/cookbook/grid/grid_cell_highlighting_basic.py
|
|
|
|
This code is extracted from the McRogueFace documentation and can be
|
|
run directly with: ./mcrogueface path/to/this/file.py
|
|
"""
|
|
|
|
def get_line_range(start_x, start_y, max_range):
|
|
"""Get cells in cardinal directions (ranged attack)."""
|
|
cells = set()
|
|
|
|
for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
|
|
for dist in range(1, max_range + 1):
|
|
x = start_x + dx * dist
|
|
y = start_y + dy * dist
|
|
|
|
# Stop if wall blocks line of sight
|
|
if not grid.at(x, y).transparent:
|
|
break
|
|
|
|
cells.add((x, y))
|
|
|
|
return cells
|
|
|
|
def get_radius_range(center_x, center_y, radius, include_center=False):
|
|
"""Get cells within a radius (spell area)."""
|
|
cells = set()
|
|
|
|
for x in range(center_x - radius, center_x + radius + 1):
|
|
for y in range(center_y - radius, center_y + radius + 1):
|
|
# Euclidean distance
|
|
dist = ((x - center_x) ** 2 + (y - center_y) ** 2) ** 0.5
|
|
if dist <= radius:
|
|
if include_center or (x, y) != (center_x, center_y):
|
|
cells.add((x, y))
|
|
|
|
return cells
|
|
|
|
def get_cone_range(origin_x, origin_y, direction, length, spread):
|
|
"""Get cells in a cone (breath attack)."""
|
|
import math
|
|
cells = set()
|
|
|
|
# Direction angles (in radians)
|
|
angles = {
|
|
'n': -math.pi / 2,
|
|
's': math.pi / 2,
|
|
'e': 0,
|
|
'w': math.pi,
|
|
'ne': -math.pi / 4,
|
|
'nw': -3 * math.pi / 4,
|
|
'se': math.pi / 4,
|
|
'sw': 3 * math.pi / 4
|
|
}
|
|
|
|
base_angle = angles.get(direction, 0)
|
|
half_spread = math.radians(spread / 2)
|
|
|
|
for x in range(origin_x - length, origin_x + length + 1):
|
|
for y in range(origin_y - length, origin_y + length + 1):
|
|
dx = x - origin_x
|
|
dy = y - origin_y
|
|
dist = (dx * dx + dy * dy) ** 0.5
|
|
|
|
if dist > 0 and dist <= length:
|
|
angle = math.atan2(dy, dx)
|
|
angle_diff = abs((angle - base_angle + math.pi) % (2 * math.pi) - math.pi)
|
|
|
|
if angle_diff <= half_spread:
|
|
cells.add((x, y))
|
|
|
|
return cells |