85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
|
|
"""McRogueFace - Damage Flash Effect (complete)
|
||
|
|
|
||
|
|
Documentation: https://mcrogueface.github.io/cookbook/effects_damage_flash
|
||
|
|
Repository: https://github.com/jmccardle/McRogueFace/blob/master/docs/cookbook/effects/effects_damage_flash_complete.py
|
||
|
|
|
||
|
|
This code is extracted from the McRogueFace documentation and can be
|
||
|
|
run directly with: ./mcrogueface path/to/this/file.py
|
||
|
|
"""
|
||
|
|
|
||
|
|
import mcrfpy
|
||
|
|
|
||
|
|
class DamageEffects:
|
||
|
|
"""Manages visual damage feedback effects."""
|
||
|
|
|
||
|
|
# Color presets
|
||
|
|
DAMAGE_RED = (255, 50, 50)
|
||
|
|
HEAL_GREEN = (50, 255, 50)
|
||
|
|
POISON_PURPLE = (150, 50, 200)
|
||
|
|
FIRE_ORANGE = (255, 150, 50)
|
||
|
|
ICE_BLUE = (100, 200, 255)
|
||
|
|
|
||
|
|
def __init__(self, grid):
|
||
|
|
self.grid = grid
|
||
|
|
self.color_layer = None
|
||
|
|
self._setup_color_layer()
|
||
|
|
|
||
|
|
def _setup_color_layer(self):
|
||
|
|
"""Ensure grid has a color layer for effects."""
|
||
|
|
self.grid.add_layer("color")
|
||
|
|
self.color_layer = self.grid.layers[-1]
|
||
|
|
|
||
|
|
def flash_entity(self, entity, color, duration=0.3):
|
||
|
|
"""Flash an entity with a color tint."""
|
||
|
|
# Flash at entity's grid position
|
||
|
|
x, y = int(entity.x), int(entity.y)
|
||
|
|
self.flash_cell(x, y, color, duration)
|
||
|
|
|
||
|
|
def flash_cell(self, x, y, color, duration=0.3):
|
||
|
|
"""Flash a specific grid cell."""
|
||
|
|
if not self.color_layer:
|
||
|
|
return
|
||
|
|
|
||
|
|
cell = self.color_layer.at(x, y)
|
||
|
|
if cell:
|
||
|
|
cell.color = mcrfpy.Color(color[0], color[1], color[2], 180)
|
||
|
|
|
||
|
|
# Fade out
|
||
|
|
anim = mcrfpy.Animation("a", 0.0, duration, "easeOut")
|
||
|
|
anim.start(cell.color)
|
||
|
|
|
||
|
|
def damage(self, entity, amount, duration=0.3):
|
||
|
|
"""Standard damage flash."""
|
||
|
|
self.flash_entity(entity, self.DAMAGE_RED, duration)
|
||
|
|
|
||
|
|
def heal(self, entity, amount, duration=0.4):
|
||
|
|
"""Healing effect - green flash."""
|
||
|
|
self.flash_entity(entity, self.HEAL_GREEN, duration)
|
||
|
|
|
||
|
|
def poison(self, entity, duration=0.5):
|
||
|
|
"""Poison damage - purple flash."""
|
||
|
|
self.flash_entity(entity, self.POISON_PURPLE, duration)
|
||
|
|
|
||
|
|
def fire(self, entity, duration=0.3):
|
||
|
|
"""Fire damage - orange flash."""
|
||
|
|
self.flash_entity(entity, self.FIRE_ORANGE, duration)
|
||
|
|
|
||
|
|
def ice(self, entity, duration=0.4):
|
||
|
|
"""Ice damage - blue flash."""
|
||
|
|
self.flash_entity(entity, self.ICE_BLUE, duration)
|
||
|
|
|
||
|
|
def area_damage(self, center_x, center_y, radius, color, duration=0.4):
|
||
|
|
"""Flash all cells in a radius."""
|
||
|
|
for dy in range(-radius, radius + 1):
|
||
|
|
for dx in range(-radius, radius + 1):
|
||
|
|
if dx * dx + dy * dy <= radius * radius:
|
||
|
|
self.flash_cell(center_x + dx, center_y + dy, color, duration)
|
||
|
|
|
||
|
|
# Setup
|
||
|
|
effects = DamageEffects(grid)
|
||
|
|
|
||
|
|
# Usage examples
|
||
|
|
effects.damage(player, 10) # Red flash
|
||
|
|
effects.heal(player, 5) # Green flash
|
||
|
|
effects.poison(enemy) # Purple flash
|
||
|
|
effects.area_damage(5, 5, 3, effects.FIRE_ORANGE) # Area effect
|