Files
ImmortalSect/src/Character/DiscipleManager.gd
T

164 lines
5.3 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 初始版本不提供添加弟子的接口
class_name DiscipleManager
extends Node
signal disciple_added(disciple: Disciple)
signal disciple_removed(disciple: Disciple)
signal disciple_attr_changed(disciple: Disciple, attr_name: String, old_value: Variant, new_value: Variant)
## 开局随机编队(一次性随机生成的数据,非程序化 RNG;占位,可手调)
## 字段与 Disciple.create() 构造键一致;realm_level 用 int0凡人/1练气,=Disciple.Realm 枚举值)
const INITIAL_ROSTER := [
# 1 玄真(宗主):修士·炼气9层,五行全高,炼丹3级
{
"name": "玄真",
"metal": 45, "wood": 38, "water": 22, "fire": 31, "earth": 19,
"efficiency": 85,
"realm_level": 1, "sub_realm_level": 9,
"farming_level": 1, "herb_level": 2, "alchemy_level": 3,
"loyalty": 90,
},
# 2 凌霄:修士·炼气4层,金火旺
{
"name": "凌霄",
"metal": 62, "wood": 12, "water": 15, "fire": 44, "earth": 20,
"efficiency": 76,
"realm_level": 1, "sub_realm_level": 4,
"farming_level": 2, "herb_level": 1, "alchemy_level": 1,
"loyalty": 55,
},
# 3 青禾:凡人带灵根(木47≥20 可修炼破境),药草天赋
{
"name": "青禾",
"metal": 8, "wood": 47, "water": 25, "fire": 12, "earth": 10,
"efficiency": 68,
"realm_level": 0, "sub_realm_level": 1,
"farming_level": 2, "herb_level": 3, "alchemy_level": 0,
"loyalty": 60,
},
# 4 阿福:凡人杂役(无灵根,五行均<20)
{
"name": "阿福",
"metal": 5, "wood": 12, "water": 8, "fire": 9, "earth": 10,
"efficiency": 41,
"realm_level": 0, "sub_realm_level": 1,
"farming_level": 2, "herb_level": 1, "alchemy_level": 0,
"loyalty": 50,
},
# 5 阿禄:凡人杂役(无灵根)
{
"name": "阿禄",
"metal": 3, "wood": 6, "water": 5, "fire": 8, "earth": 15,
"efficiency": 35,
"realm_level": 0, "sub_realm_level": 1,
"farming_level": 3, "herb_level": 1, "alchemy_level": 0,
"loyalty": 45,
},
]
var _disciples: Array[Disciple] = [] # 弟子列表
var _master_id: int = 0 # 管理器的发号计数,id 的唯一来源
# ---- 工厂 ----
# 初始编队(复用 _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
# 补 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
# ---- 仓储 ----
# 公开接口:添加弟子
func add_disciple(d : Disciple) -> void:
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
# 公开接口:通过id获取弟子
func get_disciple(id : int) -> Disciple:
for d in _disciples:
if d.id == id:
return d
return null
# 公开接口:获取所有弟子(返回副本,避免外部修改原数组)
func get_all() -> Array[Disciple]:
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
# ---- 经验晋级(领域操作)----
# 跨小境界继承循环;跨大境界清零;满级不涨;无灵根拒绝
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)
# 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)
# ---- 月度结算(预留)----
# 月收益 = f(efficiency),依赖经济扣灵石 —— 取决于下列问题
func settle_month() -> void:
pass
# ---- 存档 ----
func to_dict():
pass
func load_from_dict():
pass