Combat foundation complete
This commit is contained in:
@@ -86,7 +86,12 @@ class Effect:
|
||||
|
||||
elif self.effect_type in [EffectType.BUFF, EffectType.DEBUFF]:
|
||||
# Buff/Debuff: modify stats
|
||||
result["stat_affected"] = self.stat_affected.value if self.stat_affected else None
|
||||
# Handle stat_affected being Enum or string
|
||||
if self.stat_affected:
|
||||
stat_value = self.stat_affected.value if hasattr(self.stat_affected, 'value') else self.stat_affected
|
||||
else:
|
||||
stat_value = None
|
||||
result["stat_affected"] = stat_value
|
||||
result["stat_modifier"] = self.power * self.stacks
|
||||
if self.effect_type == EffectType.BUFF:
|
||||
result["message"] = f"{self.name} increases {result['stat_affected']} by {result['stat_modifier']}"
|
||||
@@ -159,9 +164,17 @@ class Effect:
|
||||
Dictionary containing all effect data
|
||||
"""
|
||||
data = asdict(self)
|
||||
data["effect_type"] = self.effect_type.value
|
||||
# Handle effect_type (could be Enum or string)
|
||||
if hasattr(self.effect_type, 'value'):
|
||||
data["effect_type"] = self.effect_type.value
|
||||
else:
|
||||
data["effect_type"] = self.effect_type
|
||||
# Handle stat_affected (could be Enum, string, or None)
|
||||
if self.stat_affected:
|
||||
data["stat_affected"] = self.stat_affected.value
|
||||
if hasattr(self.stat_affected, 'value'):
|
||||
data["stat_affected"] = self.stat_affected.value
|
||||
else:
|
||||
data["stat_affected"] = self.stat_affected
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
@@ -193,16 +206,21 @@ class Effect:
|
||||
|
||||
def __repr__(self) -> str:
|
||||
"""String representation of the effect."""
|
||||
# Helper to safely get value from Enum or string
|
||||
def safe_value(obj):
|
||||
return obj.value if hasattr(obj, 'value') else obj
|
||||
|
||||
if self.effect_type in [EffectType.BUFF, EffectType.DEBUFF]:
|
||||
stat_str = safe_value(self.stat_affected) if self.stat_affected else 'N/A'
|
||||
return (
|
||||
f"Effect({self.name}, {self.effect_type.value}, "
|
||||
f"{self.stat_affected.value if self.stat_affected else 'N/A'} "
|
||||
f"Effect({self.name}, {safe_value(self.effect_type)}, "
|
||||
f"{stat_str} "
|
||||
f"{'+' if self.effect_type == EffectType.BUFF else '-'}{self.power * self.stacks}, "
|
||||
f"{self.duration}t, {self.stacks}x)"
|
||||
)
|
||||
else:
|
||||
return (
|
||||
f"Effect({self.name}, {self.effect_type.value}, "
|
||||
f"Effect({self.name}, {safe_value(self.effect_type)}, "
|
||||
f"power={self.power * self.stacks}, "
|
||||
f"duration={self.duration}t, stacks={self.stacks}x)"
|
||||
)
|
||||
|
||||
@@ -130,6 +130,7 @@ class EnemyTemplate:
|
||||
gold_reward_max: Maximum gold dropped
|
||||
difficulty: Difficulty classification for encounter building
|
||||
tags: Classification tags (e.g., ["humanoid", "goblinoid"])
|
||||
location_tags: Location types where this enemy appears (e.g., ["forest", "dungeon"])
|
||||
image_url: Optional image reference for UI
|
||||
|
||||
Combat-specific attributes:
|
||||
@@ -149,6 +150,7 @@ class EnemyTemplate:
|
||||
gold_reward_max: int = 5
|
||||
difficulty: EnemyDifficulty = EnemyDifficulty.EASY
|
||||
tags: List[str] = field(default_factory=list)
|
||||
location_tags: List[str] = field(default_factory=list)
|
||||
image_url: Optional[str] = None
|
||||
|
||||
# Combat attributes
|
||||
@@ -194,6 +196,10 @@ class EnemyTemplate:
|
||||
"""Check if enemy has a specific tag."""
|
||||
return tag.lower() in [t.lower() for t in self.tags]
|
||||
|
||||
def has_location_tag(self, location_type: str) -> bool:
|
||||
"""Check if enemy can appear at a specific location type."""
|
||||
return location_type.lower() in [t.lower() for t in self.location_tags]
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
"""
|
||||
Serialize enemy template to dictionary.
|
||||
@@ -213,6 +219,7 @@ class EnemyTemplate:
|
||||
"gold_reward_max": self.gold_reward_max,
|
||||
"difficulty": self.difficulty.value,
|
||||
"tags": self.tags,
|
||||
"location_tags": self.location_tags,
|
||||
"image_url": self.image_url,
|
||||
"base_damage": self.base_damage,
|
||||
"crit_chance": self.crit_chance,
|
||||
@@ -259,6 +266,7 @@ class EnemyTemplate:
|
||||
gold_reward_max=data.get("gold_reward_max", 5),
|
||||
difficulty=difficulty,
|
||||
tags=data.get("tags", []),
|
||||
location_tags=data.get("location_tags", []),
|
||||
image_url=data.get("image_url"),
|
||||
base_damage=data.get("base_damage", 5),
|
||||
crit_chance=data.get("crit_chance", 0.05),
|
||||
|
||||
Reference in New Issue
Block a user