36 lines
1.4 KiB
GDScript
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)
|