feat: 资质概率按难度配置化,新增普通/困难两档权重
- game_config.cfg 新增 difficulty 档位与 [recruitment_normal]/[recruitment_hard] 权重表 - GameConfig 解析各档权重,get_aptitude_weights() 按当前难度返回 - DiscipleManager 资质判定改读配置权重,删除代码常量 - 设计文档补充配置写法说明(VariantParser 数组字面量陷阱) - 计划表同步 D3 进度
This commit is contained in:
@@ -14,8 +14,6 @@ var disciples: Array[Disciple] = []
|
||||
## 候选弟子池(未入宗,等待玩家选择)。
|
||||
var applicants: Array[Disciple] = []
|
||||
|
||||
## 入宗分流权重(按资质四类):下品 / 中品 / 上品 / 天骄。
|
||||
const APTITUDE_WEIGHTS: Array[int] = [45, 35, 15, 5]
|
||||
## 天灵根生成概率(3%)。
|
||||
const HEAVENLY_CHANCE := 0.03
|
||||
|
||||
@@ -149,14 +147,15 @@ func _generate_roots(heavenly: bool) -> Array[Disciple.SpiritRoot]:
|
||||
result.append(pool[i])
|
||||
return result
|
||||
|
||||
## 按权重掷资质(入宗分流)。
|
||||
## 按权重掷资质(入宗分流),权重来自 GameConfig 当前难度配置。
|
||||
func _roll_aptitude() -> Disciple.Aptitude:
|
||||
var weights := GameConfig.get_aptitude_weights()
|
||||
var total := 0
|
||||
for w in APTITUDE_WEIGHTS:
|
||||
for w in weights:
|
||||
total += w
|
||||
var roll := randi() % total
|
||||
for i in APTITUDE_WEIGHTS.size():
|
||||
if roll < APTITUDE_WEIGHTS[i]:
|
||||
for i in weights.size():
|
||||
if roll < weights[i]:
|
||||
return i as Disciple.Aptitude
|
||||
roll -= APTITUDE_WEIGHTS[i]
|
||||
roll -= weights[i]
|
||||
return Disciple.Aptitude.ORDINARY
|
||||
|
||||
+27
-1
@@ -7,6 +7,8 @@ extends Node
|
||||
const CONFIG_PATH := "res://resources/game_config.cfg"
|
||||
|
||||
# —— 招募系统(对应 cfg 的 [recruitment] 节)——
|
||||
## 当前难度档位(对应下方各难度节,如 "normal"/"hard")。
|
||||
var difficulty := "normal"
|
||||
## 开局候选人数。
|
||||
var opening_applicant_count := 5
|
||||
## 开局必须选满数。
|
||||
@@ -16,6 +18,12 @@ var recruit_interval_years := 0.1
|
||||
## 定期弹窗候选人数。
|
||||
var recruit_applicant_count := 3
|
||||
|
||||
## 各难度资质权重表(键 = 难度档位,值 = 下品/中品/上品/天骄 权重)。
|
||||
var aptitude_weights_by_difficulty: Dictionary = {
|
||||
"normal": [45, 35, 15, 5],
|
||||
"hard": [60, 30, 8, 2],
|
||||
}
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_load_config()
|
||||
@@ -23,10 +31,28 @@ func _ready() -> void:
|
||||
## 读取配置文件;缺失的项保持代码默认值,不会报错。
|
||||
func _load_config() -> void:
|
||||
var cfg := ConfigFile.new()
|
||||
if cfg.load(CONFIG_PATH) != OK:
|
||||
var err := cfg.load(CONFIG_PATH)
|
||||
if err != OK:
|
||||
push_warning("GameConfig: 配置文件不存在,使用默认值")
|
||||
return
|
||||
difficulty = cfg.get_value("recruitment", "difficulty", difficulty)
|
||||
opening_applicant_count = cfg.get_value("recruitment", "opening_applicant_count", opening_applicant_count)
|
||||
opening_pick_count = cfg.get_value("recruitment", "opening_pick_count", opening_pick_count)
|
||||
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)
|
||||
# 逐档读取难度权重(INI 数组字面量,如 [45, 35, 15, 5])
|
||||
for key in aptitude_weights_by_difficulty.keys():
|
||||
var raw: Variant = cfg.get_value("recruitment_" + key, "aptitude_weights", [])
|
||||
if raw is Array and raw.size() > 0:
|
||||
var arr: Array[int] = []
|
||||
for w in raw:
|
||||
arr.append(int(w))
|
||||
aptitude_weights_by_difficulty[key] = arr
|
||||
|
||||
## 当前难度下的资质权重(下品/中品/上品/天骄)。
|
||||
func get_aptitude_weights() -> Array[int]:
|
||||
var raw: Array = aptitude_weights_by_difficulty.get(difficulty, aptitude_weights_by_difficulty["normal"])
|
||||
var result: Array[int] = []
|
||||
for w in raw:
|
||||
result.append(int(w))
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user