feat: 灵根改为1~5根+容量公式(1÷根数),权重表进配置;文档同步

This commit is contained in:
2026-08-08 17:10:21 +08:00
parent 8a01806ab0
commit 5ad0272d79
7 changed files with 55 additions and 37 deletions
+8 -6
View File
@@ -21,7 +21,7 @@ var id: int = 0 # 唯一编号(DiscipleManager 分配)
var name: String = ""
var age: int = 0
var aptitude: Aptitude = Aptitude.ORDINARY
var roots: Array[SpiritRoot] = [] # 普通弟子 1~3 根;天灵根固定 1 根
var roots: Array[SpiritRoot] = [] # 普通弟子 1~5 根;天灵根固定 1 根
var is_heavenly: bool = false # 天灵根标记(仅天骄资质,概率见配置)
var join_year: int = 0 # 入宗年份(0 = 未入宗/候选),accept 时快照
var join_month: int = 0 # 入宗月份
@@ -39,11 +39,13 @@ func get_roots_text() -> String:
names.append(ROOT_NAMES[root])
return "".join(names)
## 灵根数量修炼倍率(根数越少越快,D5 修炼循环消费)。
## 数值来自 GameConfig.root_count_speed,按根数-1 索引,越界钳制
func get_root_count_speed() -> float:
var idx := clampi(roots.size() - 1, 0, GameConfig.root_count_speed.size() - 1)
return GameConfig.root_count_speed[idx]
## 灵根数量灵气容量倍率(根数越少灵气越纯、修炼越快,D5 修炼循环消费)。
## 容量规则:单灵根 1 单位灵气充满,双灵根只充 1/2,三灵根 1/3,以此类推(容量 = 1 ÷ 根数)
## 无灵根无法练气,容量为 0(体修路线未来另行结算,暂不生成)。
func get_root_count_capacity() -> float:
if roots.is_empty():
return 0.0
return 1.0 / roots.size()
func get_realm_text() -> String:
if realm_index == 0:
+16 -2
View File
@@ -137,12 +137,13 @@ func _generate_name() -> String:
return surname + given
## 随机生成灵根。
## 天灵根:固定 1 根五行;普通弟子:1~3互不重复(根数越少修炼越快)
## 天灵根:固定 1 根五行;普通弟子:按配置权重掷 1~5,元素从五行中抽取、概率均等
## 无灵根暂不生成(体修路线预留)。
## @param heavenly: 是否天灵根
func _generate_roots(heavenly: bool) -> Array[Disciple.SpiritRoot]:
if heavenly:
return [randi() % Disciple.SpiritRoot.size() as Disciple.SpiritRoot]
var count := randi_range(1, 3)
var count := _roll_root_count()
var pool := Disciple.SpiritRoot.values()
pool.shuffle()
var result: Array[Disciple.SpiritRoot] = []
@@ -150,6 +151,19 @@ func _generate_roots(heavenly: bool) -> Array[Disciple.SpiritRoot]:
result.append(pool[i])
return result
## 按配置权重掷灵根数量(1~5 根),权重来自 GameConfig.root_count_weights。
func _roll_root_count() -> int:
var weights := GameConfig.root_count_weights
var total := 0
for w in weights:
total += w
var roll := randi() % total
for i in weights.size():
if roll < weights[i]:
return i + 1
roll -= weights[i]
return 1
## 按权重掷资质(入宗分流),权重来自 GameConfig 当前难度配置。
func _roll_aptitude() -> Disciple.Aptitude:
var weights := GameConfig.get_aptitude_weights()
+8 -8
View File
@@ -19,6 +19,8 @@ var recruit_interval_years := 0.1
var recruit_applicant_count := 3
## 天灵根概率(仅天骄资质中再掷一次)。
var heavenly_root_chance := 0.5
## 灵根数量权重(按根数-1 索引:1根~5根,和=100 即百分比概率)。
var root_count_weights: Array[int] = [20, 20, 20, 20, 20]
# —— 修炼系统(对应 cfg 的 [cultivation] 节)——
## 基础修炼速度(修为/游戏日)。
@@ -27,8 +29,6 @@ var cultivation_base_speed := 10.0
var qi_concentration := 1.0
## 资质修炼倍率(按下品/中品/上品/天骄索引)。
var aptitude_speed: Array[float] = [0.6, 1.0, 1.5, 2.0]
## 灵根数量修炼倍率(按根数-1 索引:1根/2根/3根)。
var root_count_speed: Array[float] = [1.0, 0.8, 0.6]
## 天灵根额外修炼速度倍率。
var heavenly_bonus := 1.5
@@ -55,6 +55,12 @@ func _load_config() -> void:
recruit_interval_years = cfg.get_value("recruitment", "recruit_interval_years", recruit_interval_years)
recruit_applicant_count = cfg.get_value("recruitment", "recruit_applicant_count", recruit_applicant_count)
heavenly_root_chance = cfg.get_value("recruitment", "heavenly_root_chance", heavenly_root_chance)
var root_raw: Variant = cfg.get_value("recruitment", "root_count_weights", [])
if root_raw is Array and root_raw.size() == root_count_weights.size():
var arr_roots: Array[int] = []
for w in root_raw:
arr_roots.append(int(w))
root_count_weights = arr_roots
# 修炼系统
cultivation_base_speed = cfg.get_value("cultivation", "base_speed", cultivation_base_speed)
qi_concentration = cfg.get_value("cultivation", "qi_concentration", qi_concentration)
@@ -65,12 +71,6 @@ func _load_config() -> void:
for v in apt_raw:
arr.append(float(v))
aptitude_speed = arr
var root_raw: Variant = cfg.get_value("cultivation", "root_count_speed", [])
if root_raw is Array and root_raw.size() == root_count_speed.size():
var arr2: Array[float] = []
for v in root_raw:
arr2.append(float(v))
root_count_speed = arr2
# 逐档读取难度权重(INI 数组字面量,如 [45, 35, 15, 5]
for key in aptitude_weights_by_difficulty.keys():
var raw: Variant = cfg.get_value("recruitment_" + key, "aptitude_weights", [])