Adds a modifier system allowing dynamic modification of weapon stats and behavior. This includes: - Creating ModifierLibrary to manage available modifiers. - Adds ModifierManager to handle equipping and unequipping modifiers - Adds a new RangedWeaponComponent to handle firing projectiles and managing modifiers. - Introduces a DebugUI for in-game modifier management. - Introduces an "Unlimited Power" modifier that changes the projectile scene. - Modifies stats components to work with the new modifier system. This system allows for more flexible and customizable weapon functionality.
95 lines
2.2 KiB
GDScript
95 lines
2.2 KiB
GDScript
@icon("res://assets/editor/64x64/fc681.png")
|
|
extends Node2D
|
|
class_name StatsComponent
|
|
|
|
var base_stats: Dictionary[String, Variant] = {
|
|
"base": {
|
|
"health": 100,
|
|
"max_health": 100,
|
|
"armor": 0,
|
|
"max_armor": 0,
|
|
"energy": 100,
|
|
"max_energy": 100,
|
|
"speed": 200.0,
|
|
},
|
|
"melee": {
|
|
"damage": 10,
|
|
"attack_rate": 1,
|
|
"element": Global.ELEMENTS.NONE,
|
|
},
|
|
"ranged": {
|
|
"damage": 10,
|
|
"attack_rate": 1,
|
|
"element": Global.ELEMENTS.NONE,
|
|
"projectile_speed": 500.0,
|
|
"projectile_size": 1.0,
|
|
"projectile_lifetime": 1.0,
|
|
"projectile_quantity": 1,
|
|
"projectile_explode_quantity": 0,
|
|
"projectile_explode_damage": 0.5,
|
|
"pierce_count": 0
|
|
}
|
|
}
|
|
|
|
var stats: Dictionary = {}
|
|
|
|
func _init() -> void:
|
|
if not stats:
|
|
reset_stats()
|
|
|
|
func reset_stats() -> void:
|
|
stats = base_stats.duplicate(true)
|
|
Log.pr("StatsComponent reset to base stats")
|
|
|
|
func get_stat(stat_name: String) -> Variant:
|
|
var stat = get_nested_stat(stat_name)
|
|
if stat:
|
|
return stat
|
|
else:
|
|
Log.pr("Stat not found: ", stat_name)
|
|
return null
|
|
|
|
func update_stat(stat_name: String, value: Variant) -> void:
|
|
var updating_stat = get_nested_stat(stat_name)
|
|
if updating_stat:
|
|
set_nested_stat(stat_name, value)
|
|
Log.pr("Updated stat: ", stat_name, " to ", value)
|
|
else:
|
|
Log.pr("Stat not found: ", stat_name)
|
|
|
|
func get_nested_stat(path: String) -> Variant:
|
|
var keys = path.split(".")
|
|
var current = stats
|
|
|
|
for key in keys:
|
|
if current is Dictionary and current.has(key):
|
|
current = current[key]
|
|
else:
|
|
return null # Path doesn't exist
|
|
|
|
return current
|
|
|
|
func set_nested_stat(path: String, value) -> bool:
|
|
var keys = path.split(".")
|
|
var current = stats
|
|
|
|
# Navigate to the parent of the final key
|
|
for i in range(keys.size() - 1):
|
|
var key = keys[i]
|
|
|
|
# Check if key exists and is a dictionary
|
|
if not current.has(key) or not current[key] is Dictionary:
|
|
Log.error("Invalid stat path: " + path + " (key '" + key + "' doesn't exist or isn't a dictionary)")
|
|
return false
|
|
|
|
current = current[key]
|
|
|
|
# Check if final key exists
|
|
var final_key = keys[keys.size() - 1]
|
|
if not current.has(final_key):
|
|
Log.error("Invalid stat path: " + path + " (key '" + final_key + "' doesn't exist)")
|
|
return false
|
|
|
|
# Set the value at the final key
|
|
current[final_key] = value
|
|
return true
|