90 lines
2.1 KiB
GDScript
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
|