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