Many changes
Handle it
This commit is contained in:
parent
bf09402bc5
commit
214e0aa5e0
366 changed files with 24353 additions and 2096 deletions
84
player/scripts/modifier_management.gd
Normal file
84
player/scripts/modifier_management.gd
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
class_name ModifierManager extends Node
|
||||
|
||||
signal modifier_added(modifier)
|
||||
signal modifier_removed(modifier)
|
||||
signal stats_updated()
|
||||
|
||||
# Stores all active modifiers
|
||||
var modifiers: Array[Modifier] = []
|
||||
|
||||
# Base stats (before modifiers)
|
||||
var base_stats: Dictionary = {}
|
||||
|
||||
# Final calculated stats
|
||||
var final_stats: Dictionary = {}
|
||||
|
||||
func _init(initial_base_stats: Dictionary = {}):
|
||||
base_stats = initial_base_stats.duplicate()
|
||||
final_stats = initial_base_stats.duplicate()
|
||||
|
||||
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
|
||||
final_stats = base_stats.duplicate()
|
||||
|
||||
# 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)
|
||||
|
||||
# Apply caps and floors to stats
|
||||
_apply_stat_limits()
|
||||
|
||||
emit_signal("stats_updated")
|
||||
|
||||
func _apply_modifier_stats(modifier: Modifier) -> void:
|
||||
if modifier.has_method("apply_stats_modification"):
|
||||
modifier.apply_stats_modification(final_stats, base_stats)
|
||||
|
||||
func _apply_stat_limits() -> void:
|
||||
# Example: Cap fire rate
|
||||
if final_stats.has("fire_rate"):
|
||||
final_stats.fire_rate = min(final_stats.fire_rate, 20.0) # Max 20 shots per second
|
||||
final_stats.fire_rate = max(final_stats.fire_rate, 0.5) # Min 0.5 shots per second
|
||||
|
||||
# Example: Cap projectile size
|
||||
if final_stats.has("projectile_size"):
|
||||
final_stats.projectile_size = min(final_stats.projectile_size, 5.0) # Max 5x normal size
|
||||
final_stats.projectile_size = max(final_stats.projectile_size, 0.2) # Min 0.2x normal size
|
||||
|
||||
func get_stat(stat_name: String, default_value = 0):
|
||||
return final_stats.get(stat_name, default_value)
|
||||
Loading…
Add table
Add a link
Reference in a new issue