diff --git a/src/Character/DiscipleManager.gd b/src/Character/DiscipleManager.gd index ac559c5..c9a9581 100644 --- a/src/Character/DiscipleManager.gd +++ b/src/Character/DiscipleManager.gd @@ -1,6 +1,4 @@ # 初始版本不提供添加弟子的接口 - - class_name DiscipleManager extends Node @@ -14,6 +12,7 @@ const INITIAL_ROSTER := [ # 1 玄真(宗主):修士·炼气9层,五行全高,炼丹3级 { "name": "玄真", + "id" : 1, "metal": 45, "wood": 38, "water": 22, "fire": 31, "earth": 19, "efficiency": 85, "realm_level": 1, "sub_realm_level": 9, @@ -23,6 +22,7 @@ const INITIAL_ROSTER := [ # 2 凌霄:修士·炼气4层,金火旺 { "name": "凌霄", + "id" : 2, "metal": 62, "wood": 12, "water": 15, "fire": 44, "earth": 20, "efficiency": 76, "realm_level": 1, "sub_realm_level": 4, @@ -32,6 +32,7 @@ const INITIAL_ROSTER := [ # 3 青禾:凡人带灵根(木47≥20 可修炼破境),药草天赋 { "name": "青禾", + "id" : 3, "metal": 8, "wood": 47, "water": 25, "fire": 12, "earth": 10, "efficiency": 68, "realm_level": 0, "sub_realm_level": 1, @@ -41,6 +42,7 @@ const INITIAL_ROSTER := [ # 4 阿福:凡人杂役(无灵根,五行均<20) { "name": "阿福", + "id" : 4, "metal": 5, "wood": 12, "water": 8, "fire": 9, "earth": 10, "efficiency": 41, "realm_level": 0, "sub_realm_level": 1, @@ -50,6 +52,7 @@ const INITIAL_ROSTER := [ # 5 阿禄:凡人杂役(无灵根) { "name": "阿禄", + "id" : 5, "metal": 3, "wood": 6, "water": 5, "fire": 8, "earth": 15, "efficiency": 35, "realm_level": 0, "sub_realm_level": 1, @@ -61,103 +64,101 @@ const INITIAL_ROSTER := [ var _disciples: Array[Disciple] = [] # 弟子列表 var _master_id: int = 0 # 管理器的发号计数,id 的唯一来源 -# ---- 工厂 ---- +func _enter_tree() -> void: + pass +# ---- 工厂 ---- # 初始编队(复用 _create_from_data) -func spawn_initial_roster() -> Array[Disciple]: - for data in INITIAL_ROSTER: - var disciple = _create_from_data(data) - if disciple != null: - add_disciple(disciple) - # _disciples.append(disciple) - # emit_signal("disciple_added", disciple) - else: - push_error("Failed to spawn disciple from data: %s" % data) - pass +func spawn_initial_roster() -> void: + for data in INITIAL_ROSTER: + var disciple = _create_from_data(data) + if disciple != null: + add_disciple(disciple) + else: + push_error("Failed to spawn disciple from data: %s" % data) + pass # 补 id → Disciple.create() # 从数据字典创建 Disciple 实例,若失败返回 null func _create_from_data(data: Dictionary) -> Disciple: - var disciple := Disciple.create(data) - if disciple == null: - push_error("Failed to create disciple from data: %s" % data) - return null - disciple.id = _master_id - _master_id += 1 - return disciple - pass + var copy := data.duplicate() # 可写副本(浅拷贝,顶层加键足够) + copy["id"] = _master_id + _master_id += 1 + var disciple := Disciple.create(copy) + if disciple == null: + push_error("Failed to create disciple from data: %s" % data) + return null + return disciple # ---- 仓储 ---- # 公开接口:添加弟子 func add_disciple(d : Disciple) -> void: - if d == null: - push_error("Cannot add null disciple.") - return - _disciples.append(d) - emit_signal("disciple_added", d) + if d == null: + push_error("Cannot add null disciple.") + return + _disciples.append(d) + emit_signal("disciple_added", d) # 移除弟子 func remove_disciple(d : Disciple) -> bool: - if d != null and _disciples.has(d): - _disciples.erase(d) - emit_signal("disciple_removed", d) - return true - return false + if d != null and _disciples.has(d): + _disciples.erase(d) + emit_signal("disciple_removed", d) + return true + return false # 公开接口:通过id获取弟子 func get_disciple(id : int) -> Disciple: - for d in _disciples: - if d.id == id: - return d - return null + for d in _disciples: + if d.id == id: + return d + return null # 公开接口:获取所有弟子(返回副本,避免外部修改原数组) func get_all() -> Array[Disciple]: - return _disciples.duplicate() # 返回副本,避免外部修改原数组 + return _disciples.duplicate() # 返回副本,避免外部修改原数组 # ---- 修改唯一入口 ---- # 调 d.set_attr + 发信号(name 特判) func set_attr(d :Disciple, attr: String, value: Variant) -> bool: - if _disciples.has(d): - var old_value = d.get_attr(attr) - if d.set_attr(attr, value): - emit_signal("disciple_attr_changed", d, attr, old_value, value) - return true - return false + if _disciples.has(d): + var old_value = d.get_attr(attr) + if d.set_attr(attr, value): + emit_signal("disciple_attr_changed", d, attr, old_value, value) + return true + return false # ---- 经验晋级(领域操作)---- # 跨小境界继承循环;跨大境界清零;满级不涨;无灵根拒绝 func add_cultivation_exp(d : Disciple, amount : int) -> void: - if _disciples.has(d): - var old_realm = d.realm_level - var old_sub_realm = d.sub_realm_level - d.add_cultivation_exp(amount) - if d.realm_level != old_realm or d.sub_realm_level != old_sub_realm: - emit_signal("disciple_attr_changed", d, "realm_level", old_realm, d.realm_level) - emit_signal("disciple_attr_changed", d, "sub_realm_level", old_sub_realm, d.sub_realm_level) + if _disciples.has(d): + var old_realm = d.realm_level + var old_sub_realm = d.sub_realm_level + d.add_cultivation_exp(amount) + if d.realm_level != old_realm or d.sub_realm_level != old_sub_realm: + emit_signal("disciple_attr_changed", d, "realm_level", old_realm, d.realm_level) + emit_signal("disciple_attr_changed", d, "sub_realm_level", old_sub_realm, d.sub_realm_level) # skill∈{farming,herb,alchemy},查 SKILL_EXP_CAPS,溢出继承至满级 func add_skill_exp(d : Disciple, skill: String, amount : int) -> void: - if _disciples.has(d): - var old_level = d.get_skill_level(skill) - d.add_skill_exp(skill, amount) - var new_level = d.get_skill_level(skill) - if new_level != old_level: - emit_signal("disciple_attr_changed", d, skill + "_level", old_level, new_level) + if _disciples.has(d): + var old_level = d.get_skill_level(skill) + d.add_skill_exp(skill, amount) + var new_level = d.get_skill_level(skill) + if new_level != old_level: + emit_signal("disciple_attr_changed", d, skill + "_level", old_level, new_level) # ---- 月度结算(预留)---- # 月收益 = f(efficiency),依赖经济扣灵石 —— 取决于下列问题 func settle_month() -> void: - pass + pass # ---- 存档 ---- func to_dict(): - pass + pass func load_from_dict(): - pass - - + pass diff --git a/src/Character/DiscipleManager.gd.uid b/src/Character/DiscipleManager.gd.uid new file mode 100644 index 0000000..9074554 --- /dev/null +++ b/src/Character/DiscipleManager.gd.uid @@ -0,0 +1 @@ +uid://bstiea1nx61b8