Merge branch 'master' into m4iter14-narrow-20261005

This commit is contained in:
DKChan committed 2026-10-05 08:36:32 +08:00
commit 74678d80bc
54 files changed
+1288 -2023

No files matched your search

+61 -52
View File
@@ -13,9 +13,18 @@
class_name AdventureTable
extends Resource
## 概念指路:本表的属性值提升与资源,与 relics.tres 的专长,同属一个对象——
## 「奇物」(一次冒险内各渠道给予玩家的增益总称)。定义见 design/gdd/systems/冒险循环/奇物.md。
## 它们是它的分类轴上的枚举(专长 / 属性值提升 / 资源),不是三套系统;
## 本表承载属性值提升与资源的种类配额与件值。
## (2026-10-05 命名统一 + v2.0 改名:旧称「数值件」→ 属性提升;顶层「特性」→「奖励」→「奇物」。
## 常量与字段随之前缀 feature_*,**尚未**随顶层改名换到 reward_*——见 06-待办清单。
## 分类轴三个枚举:属性值提升〔生命上限 / AC / 攻击〕;资源〔行动点上限 /
## 刷新次数 / 金币 / 回复,命名待定〕——本表两类混编;刷新次数与专长获取两项尚未入表。
## 类内异质性:金币与回复是即时兑付,不进持有集、不持续生效。)
## 三选一提升池 kind 词表(封闭——断点附随件与牌库剔除态依赖它;扩件走本表+registry 修订)。
## aux_item 池种退役(迭代 11 第①批 T7——同调批出池);heal 恢复件新入池(v2.2 令牌池追认 b)。
const BONUS_IDS: Array[String] = ["attack", "max_hp", "armor", "gp", "ap", "heal"]
const FEATURE_KINDS: Array[String] = ["attack", "max_hp", "armor", "gp", "ap", "heal"]
## 令牌档位词表(v2.2 三档位——稀有度命名对齐 MC 策略判读序 316-f:1 级最稀有=rarest 优先)
const TIERS: Array[String] = ["common", "rare", "rarest"]
const TIER_COMMON := "common"
@@ -30,65 +39,65 @@ const TIER_QUOTAS := {"common": 70, "rare": 25, "rarest": 3}
@export var clear_heal_pct: int = 20 # [0,100] knob——回复生效上限的百分比,封顶上限不回满
# —— 三选一候选数(2026-10-02 修复批 T2 魔法数结构化)——
@export var bonus_candidate_count: int = 3 # [1,6] knob——令牌洗牌不放回抽取张数上界
@export var feature_candidate_count: int = 3 # [1,6] knob——令牌洗牌不放回抽取张数上界
@export var shop_refresh_free: int = 0 # [0,9] knob(MC-1 provisional——进店免费刷新次数;基础 0=Q2 裁,天赋增益位预留)
@export var shop_refresh_cost_base: int = 20 # [1,999] knob(MC-1 provisional——GP 刷新基价)
@export var shop_refresh_cost_curve: float = 1.8 # [1.0,4.0] knob(MC-1 provisional——按已付费刷新数幂曲线,A 链同族)
# —— 令牌配额(kind × tier 计数;未列组合 = 0——heal 只入稀有/ap 只入罕见,v2.2 档位构成)——
@export var token_attack_common: int = 18 # [0,99]
@export var token_attack_rare: int = 5 # [0,99]
@export var token_max_hp_common: int = 17 # [0,99]
@export var token_max_hp_rare: int = 5 # [0,99]
@export var token_armor_common: int = 17 # [0,99]
@export var token_armor_rare: int = 5 # [0,99]
@export var token_gp_common: int = 18 # [0,99]
@export var token_gp_rare: int = 5 # [0,99]
@export var token_heal_rare: int = 5 # [0,99]——恢复件(新入池种类,当即回血)
@export var token_ap_rarest: int = 3 # [0,99]——AP 件(罕见档;道具件 2 席位随池种退役收窄)
@export var feature_quota_attack_common: int = 18 # [0,99]
@export var feature_quota_attack_rare: int = 5 # [0,99]
@export var feature_quota_max_hp_common: int = 17 # [0,99]
@export var feature_quota_max_hp_rare: int = 5 # [0,99]
@export var feature_quota_armor_common: int = 17 # [0,99]
@export var feature_quota_armor_rare: int = 5 # [0,99]
@export var feature_quota_gp_common: int = 18 # [0,99]
@export var feature_quota_gp_rare: int = 5 # [0,99]
@export var feature_quota_heal_rare: int = 5 # [0,99]——恢复件(新入池种类,当即回血)
@export var feature_quota_ap_rarest: int = 3 # [0,99]——AP 件(罕见档;道具件 2 席位随池种退役收窄)
# —— 令牌件值(小/大数值对——v2.2 追认 b 定稿:20/50、+1/+2、+1/+2、+5/+10、恢复+6、AP+1)——
@export var bonus_attack_flat: int = 1 # [0,999] knob——小增伤
@export var bonus_attack_flat_large: int = 2 # [0,999] knob——大增伤
@export var bonus_max_hp_flat: int = 5 # [0,999] knob——小生命
@export var bonus_max_hp_flat_large: int = 10 # [0,999] knob——大生命
@export var bonus_armor_flat: int = 1 # [0,999] knob——小护甲
@export var bonus_armor_flat_large: int = 2 # [0,999] knob——大护甲
@export var bonus_gp_amount: int = 20 # [0,999] knob——小GP
@export var bonus_gp_amount_large: int = 50 # [0,999] knob——大GP
@export var bonus_heal_flat: int = 6 # [0,999] knob——恢复(当即回血,封顶生效上限)
@export var bonus_ap_flat: int = 1 # [0,10] knob——AP 件每场战斗首轮行动点基线增量
@export var feature_value_attack_common: int = 1 # [0,999] knob——小增伤
@export var feature_value_attack_rare: int = 2 # [0,999] knob——大增伤
@export var feature_value_max_hp_common: int = 5 # [0,999] knob——小生命
@export var feature_value_max_hp_rare: int = 10 # [0,999] knob——大生命
@export var feature_value_armor_common: int = 1 # [0,999] knob——小护甲
@export var feature_value_armor_rare: int = 2 # [0,999] knob——大护甲
@export var feature_value_gp_common: int = 20 # [0,999] knob——小GP
@export var feature_value_gp_rare: int = 50 # [0,999] knob——大GP
@export var feature_value_heal_rare: int = 6 # [0,999] knob——恢复(当即回血,封顶生效上限)
@export var feature_value_ap_rarest: int = 1 # [0,10] knob——AP 件每场战斗首轮行动点基线增量
## 令牌配额读数(未列 kind×tier 组合 = 0——heal 无普通档/ap 无普通稀有档按 v2.2 构成)
func bonus_token_count(kind: String, tier: String) -> int:
func feature_quota(kind: String, tier: String) -> int:
match [kind, tier]:
["attack", TIER_COMMON]: return token_attack_common
["attack", TIER_RARE]: return token_attack_rare
["max_hp", TIER_COMMON]: return token_max_hp_common
["max_hp", TIER_RARE]: return token_max_hp_rare
["armor", TIER_COMMON]: return token_armor_common
["armor", TIER_RARE]: return token_armor_rare
["gp", TIER_COMMON]: return token_gp_common
["gp", TIER_RARE]: return token_gp_rare
["heal", TIER_RARE]: return token_heal_rare
["ap", TIER_RAREST]: return token_ap_rarest
["attack", TIER_COMMON]: return feature_quota_attack_common
["attack", TIER_RARE]: return feature_quota_attack_rare
["max_hp", TIER_COMMON]: return feature_quota_max_hp_common
["max_hp", TIER_RARE]: return feature_quota_max_hp_rare
["armor", TIER_COMMON]: return feature_quota_armor_common
["armor", TIER_RARE]: return feature_quota_armor_rare
["gp", TIER_COMMON]: return feature_quota_gp_common
["gp", TIER_RARE]: return feature_quota_gp_rare
["heal", TIER_RARE]: return feature_quota_heal_rare
["ap", TIER_RAREST]: return feature_quota_ap_rarest
return 0
## 令牌件值(kind × tier;v2.2 数值对——小/大两档)
func bonus_value(kind: String, tier: String = TIER_COMMON) -> int:
func feature_value(kind: String, tier: String = TIER_COMMON) -> int:
match [kind, tier]:
["attack", TIER_COMMON]: return bonus_attack_flat
["attack", TIER_RARE]: return bonus_attack_flat_large
["max_hp", TIER_COMMON]: return bonus_max_hp_flat
["max_hp", TIER_RARE]: return bonus_max_hp_flat_large
["armor", TIER_COMMON]: return bonus_armor_flat
["armor", TIER_RARE]: return bonus_armor_flat_large
["gp", TIER_COMMON]: return bonus_gp_amount
["gp", TIER_RARE]: return bonus_gp_amount_large
["heal", TIER_RARE]: return bonus_heal_flat
["ap", TIER_RAREST]: return bonus_ap_flat
["attack", TIER_COMMON]: return feature_value_attack_common
["attack", TIER_RARE]: return feature_value_attack_rare
["max_hp", TIER_COMMON]: return feature_value_max_hp_common
["max_hp", TIER_RARE]: return feature_value_max_hp_rare
["armor", TIER_COMMON]: return feature_value_armor_common
["armor", TIER_RARE]: return feature_value_armor_rare
["gp", TIER_COMMON]: return feature_value_gp_common
["gp", TIER_RARE]: return feature_value_gp_rare
["heal", TIER_RARE]: return feature_value_heal_rare
["ap", TIER_RAREST]: return feature_value_ap_rarest
return 0
@@ -104,8 +113,8 @@ func tier_rank(tier: String) -> int:
## 档位令牌总数(货架/校验读面)
func tier_total(tier: String) -> int:
var total := 0
for kind in BONUS_IDS:
total += bonus_token_count(kind, tier)
for kind in FEATURE_KINDS:
total += feature_quota(kind, tier)
return total
@@ -118,18 +127,18 @@ func validate() -> Array:
var errs: Array[Dictionary] = []
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 kind in BONUS_IDS:
for kind in FEATURE_KINDS:
for tier in TIERS:
var c := bonus_token_count(kind, tier)
var c := feature_quota(kind, tier)
if c < 0 or c > 99:
errs.append({"category": "domain", "message": "token_count(%s,%s) 越域 [0,99]: %d" % [kind, tier, c]})
var v := bonus_value(kind, tier)
var v := feature_value(kind, tier)
if v < 0 or v > 999:
errs.append({"category": "domain", "message": "bonus_value(%s,%s) 越域 [0,999]: %d" % [kind, tier, v]})
errs.append({"category": "domain", "message": "feature_value(%s,%s) 越域 [0,999]: %d" % [kind, tier, v]})
for tier in TIERS:
var total := tier_total(tier)
if total != int(TIER_QUOTAS.get(tier, -1)):
errs.append({"category": "domain", "message": "档位配额结构失锚(v2.2 追认 b——%s 应=%d 实=%d;改总量须重裁)" % [tier, int(TIER_QUOTAS.get(tier, -1)), total]})
if bonus_candidate_count < 1 or bonus_candidate_count > 6:
errs.append({"category": "domain", "message": "bonus_candidate_count 越域 [1,6]: %d" % bonus_candidate_count})
if feature_candidate_count < 1 or feature_candidate_count > 6:
errs.append({"category": "domain", "message": "feature_candidate_count 越域 [1,6]: %d" % feature_candidate_count})
return errs
+4 -4
View File
@@ -13,8 +13,8 @@
# requires Array[node_id](显式前置——父开子脉内链)/ effects Dictionary(stat 四线 flat:
# atk/max_hp/hit/armor_class;rule 键封闭 RULE_KEYS)/ fork_group/fork_side(a/b——同组互斥、
# 营地免费切换)。
# 🔴 层级纪律(任务书红线 2):局外树只放全局规则件——effects 禁流派标签(relic 流派件永不入树,
# archetype 键出域=加载致命);流派件只走局内随机渠道。
# 🔴 层级纪律(任务书红线 2):局外树只放全局规则件——effects 禁流派标签(relic 特性永不入树,
# archetype 键出域=加载致命);规则改写型特性只走局内随机渠道。
# A/B 只放规则面(定稿 1.3——全树互斥面 ≤10-15% 首期 4 组);两侧「不同强非强弱」MC 验差 <~3pp(T10)。
# 彩蛋 ≤3(定稿 1.4——点满某脉某排免费觉醒;发现率 <5% 改灰色预告——T10 追认单呈报)。
class_name MetaTreeTable
@@ -76,9 +76,9 @@ func validate() -> Array:
for ek in fx.keys():
if not (STAT_KEYS.has(String(ek)) or RULE_KEYS.has(String(ek))):
errs.append({"category": "zero_flat", "message": "%s effects 键出域(四线/rule 词表封闭): %s" % [nid, String(ek)]})
# 🔴 层级纪律:局外树禁流派件(archetype 键出域=加载致命)
# 🔴 层级纪律:局外树禁规则改写型特性(archetype 键出域=加载致命)
if fx.has("archetype"):
errs.append({"category": "load_bearing", "message": "%s effects 含 archetype(🔴 层级纪律——流派件禁入局外树)" % nid})
errs.append({"category": "load_bearing", "message": "%s effects 含 archetype(🔴 层级纪律——特性禁入局外树)" % nid})
# A/B 互斥对结构:fork 行必带 fork_group+side;同组恰 a/b 各一
if kind == "fork":
var fg := String(row.get("fork_group", ""))
+9 -3
View File
@@ -1,8 +1,14 @@
# VERTICAL SLICE - NOT FOR PRODUCTION
# Validation Question: 七核心流派各 ≥3 件入局内随机渠道后,标签+档位激活引擎能否机械判「成型」、
# 机制件带能否挂进令牌池稀有/罕见档随机投放(P0——迭代 12 双层 BD 实施批 T1)
# 专长带能否挂进令牌池稀有/罕见档随机投放(P0——迭代 12 双层 BD 实施批 T1)
# Date: 2026-10-04(双层 BD 实施批 T1——任务书五裁定稿;设计权威 双层BD体系-整合定稿-2026-10-03 v3)
# 数据配置 RelicTable schema(双层BD/机制件 回填 owner 批末落文;行 = Dictionary 键 relic_id,Rule 4 豁免
# 概念指路:本表的专长,与 adventure.tres 的属性值提升、资源,同属一个对象——
# 「奇物」(一次冒险内各渠道给予玩家的增益总称)。定义见 design/gdd/systems/冒险循环/奇物.md。
# 它们是它分类轴上的枚举(专长 / 属性值提升 / 资源),不是三套系统;本表承载「专长」(专长 Feat)的逐项定义。
# (2026-10-05 命名统一 + 分类重构:旧称「流派件」→「规则改写型特性」→ 现定名「专长」;
# 表名与 relic_id 沿用历史命名,与统一词族对齐归后续批次——见 06-待办清单「命名统一」条目。
# 目标渠道:专长走关底 Boss 击败后专属三选一(不新增节点类型),见奇物文档 2.1 节。)
# 数据配置 RelicTable schema(奇物·专长定义表;行 = Dictionary 键 relic_id,Rule 4 豁免
# 定义表——AuxItemTable 先例)。
# 行字段:relic_id 主键 / display_name / rarity ∈ {common, rare, rarest}(对齐令牌池三档命名——
# 投放档映射:common/rare→稀有令牌档、rarest→罕见令牌档;relic 令牌永不入普通档=「挂稀有/罕见档」
@@ -12,7 +18,7 @@
# 仅校验键域不禁纯增益(专项论证件以 positive_only 批注登记,人工清单呈报)。
# 档位激活(整合定稿 设计工具 1——以撒套装/小骨铭文):同标签计数 ≥2→档一(流派核心规则)/≥4→档二
# (完全体);散件单体保底=每件效果独立生效,档位只做质变(反例 B-2)——引擎纯函数 RelicsEngine。
# 🔴 层级纪律(任务书红线 2):流派件只走局内随机渠道(三选一/商店/格面)——本表行永不入同调位
# 🔴 层级纪律(任务书红线 2):专长只走局内随机渠道(三选一/商店/格面)——本表行永不入同调位
# (aux_items 表)/局外树(T8 节点表);扫雷触发点铁律:每流派 ≥1 行 hook ∈ MINE_HOOKS(加载校验,
# 违反=红线①触碰面)。
class_name RelicTable
+1 -1
View File
@@ -10,7 +10,7 @@
# 现价公式 = base_price + price_level_bonus(关卡) + price_increment × 该商品已购档数(已购档数在 冒险结构)。
# price_level_bonus = 关级定价加值行(level_index 连续从 1 递增)。
# pool_shelf = 共享池货架行(M-4 迭代 11 第②批 T1——任务书 v1.3 P1 共享池/P4 ceil):键 kind_id 词表
# 封闭 = 四切边后种(SHELF_KINDS:attack/max_hp/armor/ap——GP 袋负交易切边、机制件三轴 doctrine 切边);
# 封闭 = 四切边后种(SHELF_KINDS:attack/max_hp/armor/ap——GP 袋负交易切边、规则改写型特性三轴 doctrine 切边);
# 库存=上限即库存(账本在 冒险结构 _bonus_taken 单点共享,行族不记库存);price_a/price_b = 乘法价格
# 因子(公式 ceil(base × b^(关序−1) × A^(本次进店已购次数)),provisional 投值——P5 甲研究拍板后置追认)。
# products 行族 + 加法定价随 legacy 模式(shop=off 对照承载)保留,退役归 off 锚换代批。
+21 -21
View File
@@ -5,27 +5,27 @@
[resource]
script = ExtResource("1")
clear_heal_pct = 20
bonus_candidate_count = 3
token_attack_common = 18
token_attack_rare = 5
token_max_hp_common = 17
token_max_hp_rare = 5
token_armor_common = 17
token_armor_rare = 5
token_gp_common = 18
token_gp_rare = 5
token_heal_rare = 5
token_ap_rarest = 3
bonus_attack_flat = 1
bonus_attack_flat_large = 2
bonus_max_hp_flat = 5
bonus_max_hp_flat_large = 10
bonus_armor_flat = 1
bonus_armor_flat_large = 2
bonus_gp_amount = 20
bonus_gp_amount_large = 50
bonus_heal_flat = 6
bonus_ap_flat = 1
feature_candidate_count = 3
feature_quota_attack_common = 18
feature_quota_attack_rare = 5
feature_quota_max_hp_common = 17
feature_quota_max_hp_rare = 5
feature_quota_armor_common = 17
feature_quota_armor_rare = 5
feature_quota_gp_common = 18
feature_quota_gp_rare = 5
feature_quota_heal_rare = 5
feature_quota_ap_rarest = 3
feature_value_attack_common = 1
feature_value_attack_rare = 2
feature_value_max_hp_common = 5
feature_value_max_hp_rare = 10
feature_value_armor_common = 1
feature_value_armor_rare = 2
feature_value_gp_common = 20
feature_value_gp_rare = 50
feature_value_heal_rare = 6
feature_value_ap_rarest = 1
; TP0 令牌池换代(2026-10-03,node-reward v2.2 追认 b 落地):三选一池 = 固定配额令牌池——
; 普通 70/稀有 25/罕见 3 = 98 张(罕见档原列「道具件 2」随 aux_item 池种退役收窄——台账自决披露项);
+1 -1
View File
@@ -411,5 +411,5 @@ rows = [{
; ≥ 4×(row−1));锻造脉 3 节点收编 forge_levels(钥石付价=现行迁移零痛);钥石脉=工坊解锁收编
; (free 迁移点亮)+刷新升级移植;同调脉 socket 3(钥石=规则面首站)+Fork 4 对(A/B 集中同调脉
; 营地免费切换——effects 首期两 rule 键真实接线余组 stat 面 provisional);彩蛋 1(锻造满排觉醒)。
; 🔴 层级纪律:局外树只放全局规则件——零 archetype 键(schema 校验强制);流派件只走局内随机渠道。
; 🔴 层级纪律:局外树只放全局规则件——零 archetype 键(schema 校验强制);规则改写型特性只走局内随机渠道。
; 数值全 provisional 归 M-4 数值批;A/B 两侧差 <~3pp 验收=T10 MC。
+4 -4
View File
@@ -260,15 +260,15 @@ rows = [{
}
}]
; 双层 BD 实施批(2026-10-04):机制件表——行 = 流派件定义
; 双层 BD 实施批(2026-10-04):规则改写型特性表——行 = 特性定义
; (relic_id/display_name/rarity/archetype/hook/effects)。
; T2 魔法流四件(整合定稿 §2.3 S1):奥术余烬〔普通·rider+1 必中附加〕/魔网织者〔稀有·magic vs
; magic 克制罚修正〕/湛蓝誓约〔稀有·magic vs heavy 克制加成〕/魔能共鸣〔罕见锚点·rider+2+每战首次
; 开格奥术矢——「每关首次」字面落地为「每战首次」台账披露待追认〕;magic 档一(≥2 件)rider+1 /
; 档二(≥4 件)rider 可暴击——引擎 tiers_for 承载。T3-T6 逐流派续填(flag 4/pierce 4/normal 4/
; dig 4/charge 3/devour 4——整合定稿 §2.3 七流派件面)。
; dig 4/charge 3/devour 4——整合定稿 §2.3 七流派的件面)。
; 稀有度→投放档映射:common/rare → 稀有令牌档、rarest → 罕见令牌档(relic 永不入普通令牌档
; ——「机制件带挂稀有/罕见档」追认 b 接线口径,普通档 70 张纯数值维持)。
; 🔴 层级纪律:本表行永不入同调位(aux_items)/局外树(T8 节点表)——流派件只走局内随机渠道。
; ——「规则改写型特性带挂稀有/罕见档」追认 b 接线口径,普通档 70 张纯数值维持)。
; 🔴 层级纪律:本表行永不入同调位(aux_items)/局外树(T8 节点表)——规则改写型特性只走局内随机渠道。
; 数值全 provisional 归 M-4 数值批;effects 键白名单封闭(零裸 flat 同族护栏)。
+1 -1
View File
@@ -94,7 +94,7 @@ price_b = 1.1
;(用户拍板骨架先行、数值整体后置,行值归 难度曲线与Boss)。
; GP 商店房重构批(M-4 迭代 11 第②批 T1,2026-10-03——任务书 v1.3 全裁 P1 共享池/P4 ceil/P5 甲):
; pool_shelf 行族 = 共享池货架(kind_id 词表封闭四切边后种 attack/max_hp/armor/ap——GP 袋负交易切边、
; 机制件三轴 doctrine 切边;库存=上限即库存,账本在 冒险结构 _bonus_taken 单点共享,行族不记库存);
; 规则改写型特性三轴 doctrine 切边;库存=上限即库存,账本在 冒险结构 _bonus_taken 单点共享,行族不记库存);
; 价格公式换代(pool 模式)= ceil(base_price × b^(关序−1) × A^(本次进店已购次数)),price_a=1.8/price_b=1.1
; provisional 投值(零人工令改 provisional+后置追认,原 P5 甲研究拍板后置);products 行族 + 加法定价
; 随 legacy 模式(shop=off 对照承载)保留不退役,退役归 off 锚换代批。货架行值全部 provisional 归