class_name StaminaRules extends RefCounted const DEFAULT_MAX := 20 const DEFAULT_RECOVER_AMOUNT := 2 const DEFAULT_RECOVER_INTERVAL := 3600 const DEFAULT_STEAL_COST := 10 static func snapshot(player_data: Dictionary) -> Dictionary: var max_value := maxi(int(player_data.get("stamina_max", DEFAULT_MAX)), 1) var value := clampi(int(player_data.get("stamina", max_value)), 0, max_value) var next_recover_time := int(player_data.get("stamina_next_recover_time", 0)) var recover_amount := maxi(int(player_data.get("stamina_recover_amount", DEFAULT_RECOVER_AMOUNT)), 1) var recover_interval := maxi(int(player_data.get("stamina_recover_interval", DEFAULT_RECOVER_INTERVAL)), 1) if value < max_value and next_recover_time > 0: var now := int(Time.get_unix_time_from_system()) if now >= next_recover_time: var passed_intervals := 1 + int((now - next_recover_time) / recover_interval) value = mini(max_value, value + passed_intervals * recover_amount) return { "value": value, "max": max_value, "recover_amount": recover_amount, "recover_interval": recover_interval, "steal_cost": steal_cost(player_data), } static func has_steal_cost(player_data: Dictionary) -> bool: return int(snapshot(player_data).get("value", DEFAULT_MAX)) >= steal_cost(player_data) static func steal_cost(player_data: Dictionary) -> int: return maxi(int(player_data.get("stamina_cost_steal", DEFAULT_STEAL_COST)), 1)