Moves modifier logic to utilize a central StatsComponent for managing and applying stat modifications. This change centralizes stat management and simplifies the application of modifiers, enhancing code maintainability and reducing redundancy. It also moves modifier files to the correct directory.
68 lines
2 KiB
GDScript
68 lines
2 KiB
GDScript
@icon("res://assets/editor/64x64/fc1098.png")
|
|
extends Node2D
|
|
class_name ModifierManager
|
|
|
|
signal modifier_added(modifier)
|
|
signal modifier_removed(modifier)
|
|
signal stats_updated()
|
|
|
|
var stats_component: StatsComponent
|
|
|
|
# Stores all active modifiers
|
|
var modifiers: Array[Modifier] = []
|
|
|
|
func _ready() -> void:
|
|
Log.pr("ModifierManager initialized")
|
|
Log.pr("StatsComponent: ", stats_component)
|
|
|
|
func set_stats(stats: StatsComponent) -> void:
|
|
self.stats_component = stats
|
|
|
|
func add_modifier(modifier: Modifier) -> void:
|
|
modifiers.append(modifier)
|
|
modifier.on_equip(get_parent())
|
|
emit_signal("modifier_added", modifier)
|
|
recalculate_stats()
|
|
|
|
func remove_modifier(modifier_id: String) -> void:
|
|
for i in range(modifiers.size()):
|
|
if modifiers[i].id == modifier_id:
|
|
var modifier = modifiers[i]
|
|
modifier.on_unequip(get_parent())
|
|
modifiers.remove_at(i)
|
|
emit_signal("modifier_removed", modifier)
|
|
recalculate_stats()
|
|
break
|
|
|
|
func recalculate_stats() -> void:
|
|
# Reset stats to base values
|
|
stats_component.reset_stats()
|
|
|
|
# Sort modifiers by priority
|
|
modifiers.sort_custom(func(a, b): return a.priority > b.priority)
|
|
|
|
# First pass: Apply OVERRIDE modifiers (highest priority first)
|
|
for modifier in modifiers:
|
|
if modifier.modifier_type == Modifier.ModifierType.OVERRIDE:
|
|
_apply_modifier_stats(modifier)
|
|
|
|
# Second pass: Apply ADDITIVE modifiers
|
|
for modifier in modifiers:
|
|
if modifier.modifier_type == Modifier.ModifierType.ADDITIVE:
|
|
_apply_modifier_stats(modifier)
|
|
|
|
# Third pass: Apply MULTIPLICATIVE modifiers
|
|
for modifier in modifiers:
|
|
if modifier.modifier_type == Modifier.ModifierType.MULTIPLICATIVE:
|
|
_apply_modifier_stats(modifier)
|
|
|
|
# Last pass: Apply CONDITIONAL modifiers
|
|
for modifier in modifiers:
|
|
if modifier.modifier_type == Modifier.ModifierType.CONDITIONAL:
|
|
_apply_modifier_stats(modifier)
|
|
|
|
emit_signal("stats_updated")
|
|
|
|
func _apply_modifier_stats(modifier: Modifier) -> void:
|
|
if modifier.has_method("apply_stats_modification"):
|
|
modifier.apply_stats_modification(stats_component)
|