2026-05-30 20:23:54 +08:00

36 lines
1.4 KiB
GDScript

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)