74 lines
No EOL
2.5 KiB
Python
74 lines
No EOL
2.5 KiB
Python
"""McRogueFace - Cell Highlighting (Targeting) (animated)
|
|
|
|
Documentation: https://mcrogueface.github.io/cookbook/grid_cell_highlighting
|
|
Repository: https://github.com/jmccardle/McRogueFace/blob/master/docs/cookbook/grid/grid_cell_highlighting_animated.py
|
|
|
|
This code is extracted from the McRogueFace documentation and can be
|
|
run directly with: ./mcrogueface path/to/this/file.py
|
|
"""
|
|
|
|
class TargetingSystem:
|
|
"""Handle ability targeting with visual feedback."""
|
|
|
|
def __init__(self, grid, player):
|
|
self.grid = grid
|
|
self.player = player
|
|
self.highlights = HighlightManager(grid)
|
|
self.current_ability = None
|
|
self.valid_targets = set()
|
|
|
|
def start_targeting(self, ability):
|
|
"""Begin targeting for an ability."""
|
|
self.current_ability = ability
|
|
px, py = self.player.pos
|
|
|
|
# Get valid targets based on ability
|
|
if ability.target_type == 'self':
|
|
self.valid_targets = {(px, py)}
|
|
elif ability.target_type == 'adjacent':
|
|
self.valid_targets = get_adjacent(px, py)
|
|
elif ability.target_type == 'ranged':
|
|
self.valid_targets = get_radius_range(px, py, ability.range)
|
|
elif ability.target_type == 'line':
|
|
self.valid_targets = get_line_range(px, py, ability.range)
|
|
|
|
# Filter to visible tiles only
|
|
self.valid_targets = {
|
|
(x, y) for x, y in self.valid_targets
|
|
if grid.is_in_fov(x, y)
|
|
}
|
|
|
|
# Show valid targets
|
|
self.highlights.add('attack', self.valid_targets)
|
|
|
|
def update_hover(self, x, y):
|
|
"""Update when cursor moves."""
|
|
if not self.current_ability:
|
|
return
|
|
|
|
# Clear previous AoE preview
|
|
self.highlights.remove('danger')
|
|
|
|
if (x, y) in self.valid_targets:
|
|
# Valid target - highlight it
|
|
self.highlights.add('select', [(x, y)])
|
|
|
|
# Show AoE if applicable
|
|
if self.current_ability.aoe_radius > 0:
|
|
aoe = get_radius_range(x, y, self.current_ability.aoe_radius, True)
|
|
self.highlights.add('danger', aoe)
|
|
else:
|
|
self.highlights.remove('select')
|
|
|
|
def confirm_target(self, x, y):
|
|
"""Confirm target selection."""
|
|
if (x, y) in self.valid_targets:
|
|
self.cancel_targeting()
|
|
return (x, y)
|
|
return None
|
|
|
|
def cancel_targeting(self):
|
|
"""Cancel targeting mode."""
|
|
self.current_ability = None
|
|
self.valid_targets = set()
|
|
self.highlights.clear() |