164 lines
5.3 KiB
GDScript
164 lines
5.3 KiB
GDScript
# 初始版本不提供添加弟子的接口
|
||
|
||
|
||
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 用 int(0凡人/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
|
||
|
||
|