iter10 T3-T9: 奖励重构实装——adventure表扩列(回血20/池六种/权重/上限/同调位过渡键)+boss_keystone重锚3-2+rng扩签reward_pick+E-S加权洗牌+三选一停点(零自动推进/可中断)+加算区四轴AP(BattleOrchestrator排队兑现)+钥石逐杀掉落(收束无二次派生)+同调位约束(停点替换两路/战斗沉没/节点拒绝)+BonusPickOverlay+Narrator文案族+save v3迁移+冒烟619/0(+23断言)+断点P5往返单测+run_all 15套全绿

This commit is contained in:
DKChan committed 2026-10-01 04:30:13 +08:00
1 parent 49b263fbc8
commit 71502ceecd
18 files changed
+992 -169

No files matched your search

+88 -13
View File
@@ -1,23 +1,98 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 三关连探冒险(地精洞窟 → 幽暗地域 → 灰矮人矿城)能否以一条命走完,通关兑付的大奖励
# 与钥石合计在冒险摘要里成立(P0)
# Date: 2026-09-21(冒险结构实现批——AdventureTable 建表,registry adventure_table 条目 2026-09-15 登记)
# Validation Question: 三关连探冒险(地精洞窟 → 幽暗地域 → 灰矮人矿城)能否以一条命走完,通关兑付的
# 部分回血与提升三选一、Boss 逐杀钥石掉落在冒险摘要里成立(P0)
# Date: 2026-09-21(冒险结构实现批建表;2026-10-01 迭代 10 奖励重构批扩列——registry adventure_table 条目同批改写)
# 数据配置 AdventureTable schema(冒险结构 关卡大奖励行值;单行全局,Rule 4 豁免——HeroTable/SettlementTable 先例)。
# 两字段 knob(调参表归 冒险结构;数值所有权归 难度曲线与Boss 曲线调参批,全部 provisional):
# level_clear_hp_bonus = 关卡大奖励 HP 上限提升(写统一冒险加算区 max_hp 轴——与商店购买同一本账,
# 经 begin_battle 覆盖值通道对后续每战生效;值锚 = 难度曲线与Boss 区间平移换算率,上调须重扫通关率带)。
# keystone_per_level = 每通关一关钥石入账值(末关通关照记;消费方 元进度——本表只记账不做消费)。
# 迭代 10 重构(2026-09-30 用户拍板案丙):大奖励「固定三件套」退役——level_clear_hp_bonus(血回满+上限提升件)
# 与 keystone_per_level(钥石每关入账)两字段退役;改三层奖励框架 = 部分回血(clear_heal_pct)+ 提升三选一
# (池六种:件值/权重/次数上限三组列)+ Boss/精英击杀钥石掉落(行值归 meta.tres boss_keystone,不在本表)。
# 全部 knob provisional-pending-曲线调参批(数值所有权归 难度曲线与Boss,上调须重扫通关率带)。
class_name AdventureTable
extends Resource
@export var level_clear_hp_bonus: int = 10 # [0,999] knob——关卡大奖励 HP 上限提升
@export var keystone_per_level: int = 10 # [0,999] knob——每通关一关钥石入账
## 三选一提升池件 id 词表(封闭——断点附随件与牌库剔除态依赖它;扩件走本表+registry 修订)
const BONUS_IDS: Array[String] = ["attack", "max_hp", "armor", "gp", "aux_item", "ap"]
## 无次数上限件的 cap 哨兵值(gp/aux_item——牌库恒非空的结构保证)
const BONUS_CAP_UNLIMITED := -1
# —— 通关部分回血(固定型,非末关通关兑付)——
@export var clear_heal_pct: int = 20 # [0,100] knob——回复生效上限的百分比,封顶上限不回满
# —— 三选一件值(兑付面)——
@export var bonus_attack_flat: int = 1 # [0,999] knob——攻击轴累加(覆盖值通道)
@export var bonus_max_hp_flat: int = 5 # [0,999] knob——生命上限轴累加(不连带当前生命)
@export var bonus_armor_flat: int = 1 # [0,999] knob——护甲轴累加
@export var bonus_gp_amount: int = 20 # [0,999] knob——GP 袋定额入钱包
@export var bonus_ap_flat: int = 1 # [0,10] knob——AP 件每场战斗首轮行动点基线增量
@export var bonus_aux_item_count: int = 1 # [1,9] knob——魔法道具件授予件数(受同调位约束)
# —— 三选一权重(加权洗牌不放回,E-S weight-key)——
@export var bonus_weight_attack: int = 3 # [1,99] knob
@export var bonus_weight_max_hp: int = 3 # [1,99] knob
@export var bonus_weight_armor: int = 3 # [1,99] knob
@export var bonus_weight_gp: int = 3 # [1,99] knob
@export var bonus_weight_aux: int = 1 # [1,99] knob——魔法道具件(受同调位约束)
@export var bonus_weight_ap: int = 1 # [1,99] knob——AP 件(全冒险最紧上限)
# —— 全冒险获取次数上限(达上限件先剔出牌库;gp/aux_item 无上限)——
@export var bonus_cap_attack: int = 3 # [0,99] knob
@export var bonus_cap_max_hp: int = 3 # [0,99] knob
@export var bonus_cap_armor: int = 3 # [0,99] knob
@export var bonus_cap_ap: int = 2 # [0,99] knob——全冒险最紧
# —— 同调位过渡读数源(正主 = attunement_growth.tres 谓词表,同调实施批落地后切换)——
@export var transitional_sync_slots: int = 1 # [0,9] knob——道具持有上限
func bonus_value(id: String) -> int:
match id:
"attack": return bonus_attack_flat
"max_hp": return bonus_max_hp_flat
"armor": return bonus_armor_flat
"gp": return bonus_gp_amount
"ap": return bonus_ap_flat
"aux_item": return bonus_aux_item_count
return 0
func bonus_weight(id: String) -> int:
match id:
"attack": return bonus_weight_attack
"max_hp": return bonus_weight_max_hp
"armor": return bonus_weight_armor
"gp": return bonus_weight_gp
"aux_item": return bonus_weight_aux
"ap": return bonus_weight_ap
return 0
## 次数上限(gp/aux_item 返回 BONUS_CAP_UNLIMITED = 无上限,牌库恒非空的结构保证)
func bonus_cap(id: String) -> int:
match id:
"attack": return bonus_cap_attack
"max_hp": return bonus_cap_max_hp
"armor": return bonus_cap_armor
"ap": return bonus_cap_ap
return BONUS_CAP_UNLIMITED
func validate() -> Array:
var errs: Array[Dictionary] = []
if level_clear_hp_bonus < 0 or level_clear_hp_bonus > 999:
errs.append({"category": "domain", "message": "level_clear_hp_bonus 越域 [0,999]: %d" % level_clear_hp_bonus})
if keystone_per_level < 0 or keystone_per_level > 999:
errs.append({"category": "domain", "message": "keystone_per_level 越域 [0,999]: %d" % keystone_per_level})
if clear_heal_pct < 0 or clear_heal_pct > 100:
errs.append({"category": "domain", "message": "clear_heal_pct 越域 [0,100]: %d" % clear_heal_pct})
for id in BONUS_IDS:
var v := bonus_value(id)
if v < 0 or v > 999:
errs.append({"category": "domain", "message": "bonus_value(%s) 越域 [0,999]: %d" % [id, v]})
var w := bonus_weight(id)
if w < 1 or w > 99:
errs.append({"category": "domain", "message": "bonus_weight(%s) 越域 [1,99]: %d" % [id, w]})
for id in ["attack", "max_hp", "armor", "ap"]:
var c := bonus_cap(id)
if c < 0 or c > 99:
errs.append({"category": "domain", "message": "bonus_cap(%s) 越域 [0,99]: %d" % [id, c]})
if bonus_aux_item_count < 1 or bonus_aux_item_count > 9:
errs.append({"category": "domain", "message": "bonus_aux_item_count 越域 [1,9]: %d" % bonus_aux_item_count})
if transitional_sync_slots < 0 or transitional_sync_slots > 9:
errs.append({"category": "domain", "message": "transitional_sync_slots 越域 [0,9]: %d" % transitional_sync_slots})
return errs
+26 -7
View File
@@ -4,11 +4,30 @@
[resource]
script = ExtResource("1")
level_clear_hp_bonus = 5
keystone_per_level = 10
clear_heal_pct = 20
bonus_attack_flat = 1
bonus_max_hp_flat = 5
bonus_armor_flat = 1
bonus_gp_amount = 20
bonus_ap_flat = 1
bonus_aux_item_count = 1
bonus_weight_attack = 3
bonus_weight_max_hp = 3
bonus_weight_armor = 3
bonus_weight_gp = 3
bonus_weight_aux = 1
bonus_weight_ap = 1
bonus_cap_attack = 3
bonus_cap_max_hp = 3
bonus_cap_armor = 3
bonus_cap_ap = 2
transitional_sync_slots = 1
; 冒险结构实现批(2026-09-21 建表——registry adventure_table 条目同批注记更新):
; 关卡大奖励三件套的数值半边(上限提升)+ 钥石每关入账值;单行全局 Rule 4 豁免(HeroTable/SettlementTable 先例)。
; 大奖励 = 非末关通关恰一次:上限提升(写统一冒险加算区 max_hp 轴)+ 血回满(= 新上限)+ 钥石入账;
; 末关通关不发上限提升、钥石照记(设计意图:奖励只朝下一战生效)。钥石消费方 = 元进度(本表只记账)。
; 两值全部 provisional-pending-曲线调参批(值锚与上调约束归 难度曲线与Boss)。
; 迭代 10 奖励重构批(2026-10-01 扩列——registry adventure_table 条目同批改写):
; 大奖励 = 非末关通关恰一次:部分回血(clear_heal_pct,封顶上限不回满、满血回 0 合法)
; + 提升三选一(池六种加权洗牌不放回 E-S weight-key 掷 3,玩家点选兑付恰一件;消费 reward_pick 封闭流)。
; 权重:属性/GP 各 3、道具/AP 各 1;次数上限:属性件各 3、AP 件 2(达上限件先剔牌库)——gp/道具无次数上限。
; 同调位过渡键 transitional_sync_slots=1(道具持有上限;正主 = attunement_growth.tres 谓词表,同调实施批切换)。
; 末关通关不发三选一与回血(奖励只朝下一战生效)。
; 退役字段:level_clear_hp_bonus(血回满+上限提升件)、keystone_per_level(钥石改 Boss/精英击杀掉落,行值归 meta.tres boss_keystone)。
; 全部 provisional-pending-曲线调参批(值锚与上调约束归 难度曲线与Boss;回血 20% 系难度上压方向,带重扫随批呈报)。
+11 -5
View File
@@ -25,16 +25,16 @@ forge_products = [{
}]
boss_keystone = [{
"level_index": 1,
"first_kill": 5,
"repeat_kill": 1
"first_kill": 3,
"repeat_kill": 2
}, {
"level_index": 2,
"first_kill": 8,
"first_kill": 3,
"repeat_kill": 2
}, {
"level_index": 3,
"first_kill": 12,
"repeat_kill": 3
"first_kill": 3,
"repeat_kill": 2
}]
workshop_items = [{
"item_id": "probe_dust",
@@ -100,3 +100,9 @@ conversion = [{
; 护甲行强条目重测义务随批履行:重测暴露并修复护甲断链(begin_battle hero_armor_class 参数此前
; 零消费——_defender_ac 主角分支本次接线,缺参/-1 = 表值兜底);修复后甲轴读数 +1.2±0.4 为
; 解锁后参数实测,非基线外推。战役轨迹三花费序(生命/攻击/护甲优先)随批采集验证。
;
; 迭代 10 奖励重构批(2026-10-01——boss_keystone 重锚,P-B 乙拍板):三关统一 首杀 3 / 复杀 2
; (原 5/1 · 8/2 · 12/3 退役)——贴近「Boss 掉 2–3 个钥石」用户示例量级、保持 first_kill ≥ repeat_kill
; 结构;子选项「复杀统一 2」归代拍板白名单(另一子选项 = 按关 2/2/3 递进)。钥石渠道自本批起 =
; Boss/精英击杀逐杀掉落(大奖励 keystone_per_level 渠道退役;精英掉 1 预留行随怪物批实装落)。
; 产出结构变化 → 元进度标定义务重开(06-待办清单 2026-10-01 登记条)。provisional 归曲线调参批。