Balancing

This commit is contained in:
Dan 2026-01-28 20:18:44 +00:00
parent 90d6c5c926
commit 22d7326565
6 changed files with 116 additions and 105 deletions

View file

@ -18,10 +18,8 @@ var cost_scaling_multiplier: float = 1.5
var cost_linear_increase: int = 100
var cost_ladder: Array[int] = []
# Effect scaling
var effect_scaling_type: int = 1 # 0=Linear, 1=Exponential
var effect_scaling_multiplier: float = 1.2
var effect_linear_increase: float = 0.1
# Effect ladder
var effect_ladder: Array[float] = []
# Base modifiers
var base_modifiers: Dictionary = {}
@ -38,9 +36,7 @@ static func from_resource(resource: UnlockDataResource) -> UnlockDataLightweight
data.cost_scaling_multiplier = resource.cost_scaling_multiplier
data.cost_linear_increase = resource.cost_linear_increase
data.cost_ladder = resource.cost_ladder.duplicate()
data.effect_scaling_type = resource.effect_scaling_type
data.effect_scaling_multiplier = resource.effect_scaling_multiplier
data.effect_linear_increase = resource.effect_linear_increase
data.effect_ladder = resource.effect_ladder.duplicate()
data.base_modifiers = resource.base_modifiers.duplicate(true)
# Start fresh
data.is_unlocked = false
@ -59,9 +55,7 @@ func clone() -> UnlockDataLightweight:
copy.cost_scaling_multiplier = cost_scaling_multiplier
copy.cost_linear_increase = cost_linear_increase
copy.cost_ladder = cost_ladder # Shared - read-only
copy.effect_scaling_type = effect_scaling_type
copy.effect_scaling_multiplier = effect_scaling_multiplier
copy.effect_linear_increase = effect_linear_increase
copy.effect_ladder = effect_ladder # Shared - read-only
copy.base_modifiers = base_modifiers # Shared - read-only
# Mutable state
copy.is_unlocked = false
@ -85,33 +79,25 @@ func get_next_cost() -> int:
func get_current_modifiers() -> Dictionary:
if not is_unlocked or current_rank == 0:
return {}
if current_rank == 1:
return base_modifiers.duplicate()
return get_modifiers_at_rank(current_rank)
## Same logic as UnlockDataResource.get_modifiers_at_rank()
func get_modifiers_at_rank(rank: int) -> Dictionary:
if not is_scaling or rank == 0:
if rank == 0:
return {}
# For one-shot unlocks or empty ladder, return base_modifiers
if effect_ladder.size() == 0:
return base_modifiers.duplicate()
if rank == 1:
return base_modifiers.duplicate()
var ladder_index = rank - 1
if ladder_index >= effect_ladder.size():
ladder_index = effect_ladder.size() - 1 # Use last value if rank exceeds ladder
var scaled_modifiers = {}
var result = {}
for key in base_modifiers.keys():
var base_value = base_modifiers[key]
if effect_scaling_type == 0: # Linear
var additional_ranks = rank - 1
scaled_modifiers[key] = base_value + (effect_linear_increase * additional_ranks)
else: # Exponential
var base_bonus = base_value - 1.0
var scaled_bonus = base_bonus * pow(effect_scaling_multiplier, rank - 1)
scaled_modifiers[key] = 1.0 + scaled_bonus
return scaled_modifiers
result[key] = effect_ladder[ladder_index]
return result
## Same logic as UnlockDataResource.can_rank_up()
func can_rank_up() -> bool: