2026-05-29 19:54:56 +08:00

90 lines
2.1 KiB
GDScript

class_name PlayerState
extends RefCounted
signal changed
var data: Dictionary = {}
var _game_config
func setup(player_data: Dictionary, game_config = null) -> void:
data = player_data
_game_config = game_config
changed.emit()
func set_data(player_data: Dictionary) -> void:
data = player_data
changed.emit()
func player_data() -> Dictionary:
return data
func token() -> String:
return str(data.get("token", ""))
func int_value(key: String, fallback: int = 0) -> int:
return int(data.get(key, fallback))
func set_value(key: String, value: Variant) -> void:
data[key] = value
changed.emit()
func add_exp(add_exp: int) -> void:
if add_exp <= 0:
return
var level := int(data.get("level", 1))
var next_exp := int(data.get("exp", 0)) + add_exp
var max_level := _max_player_level()
while level < max_level:
var exp_max := _player_exp_max(level)
if next_exp < exp_max:
break
next_exp -= exp_max
level += 1
data["get_level_gift"] = 0
if level >= max_level:
next_exp = mini(next_exp, _player_exp_max(level))
data["level"] = level
data["exp"] = maxi(next_exp, 0)
changed.emit()
func replace_land(land_data: Dictionary) -> void:
if land_data.is_empty():
return
var land_list = data.get("landList", [])
if not land_list is Array:
data["landList"] = [land_data.duplicate(true)]
changed.emit()
return
var target_position := int(land_data.get("position", -1))
var replaced := false
for index in range(land_list.size()):
if land_list[index] is Dictionary and int(land_list[index].get("position", -1)) == target_position:
land_list[index] = land_data.duplicate(true)
replaced = true
break
if not replaced:
land_list.append(land_data.duplicate(true))
data["landList"] = land_list
changed.emit()
func _player_exp_max(level: int) -> int:
if _game_config != null and _game_config.has_method("get_player_exp_max"):
return maxi(int(_game_config.get_player_exp_max(level)), 1)
return maxi(level, 1)
func _max_player_level() -> int:
if _game_config != null and _game_config.has_method("get_max_player_level"):
return maxi(int(_game_config.get_max_player_level()), 1)
return 60