feat(pool): 迭代20 T2 池结构案D 换代(专长实装批 A段二)
四级档位:TIERS common/excellent/rare/legendary(跨层框架档名映射承袭)——TIER_QUOTAS 70/25/3/0=98 直映射零偏离已裁结构锚(传说=头奖位留空);配额/件值字段物理改名 (旧 rare→excellent、旧 rarest→rare)+凭证四 kind 占位(rap/attune_battery/time_sand/ perfect_insurance,配额暂 0=T4 落路由同批投放)。 概率与上限解耦(案②令牌池+提前退役):curio_cap_* 每 kind 独立字段(99=无上限占位, 实数归调参批)+专长 cap 行字段面;taken 身份维计数(relic:<feat_id>)拿了才计刷出不计; cap 满在候选视图剔除(牌库本体不动=概率位独立存活);断点 bonus_taken 身份维键随档还原。 曝光槽:三选一=2 格全池+1 格优秀档以上子池(子池独立洗牌同 stream 续消费;子池空回退 全池;池空直通同族兜底);凭证(feat_ticket)不进抽签池只经保底注入;商店货架同 cap 过滤。 潜伏缺陷修正:效果引擎 has 算子 null 安全(敌技伤害载荷无 terrain_kind 事实回落 null 时 判「不在场」而非 String(null) 抛错——候选流变化后 devour 件首次被持有而暴露)。 测试:pool_case_d_test 新套(V6 令牌三态/V7 曝光槽回退/V8 解耦提前退役)入 run_all 20 套; smoke 三档锚/数值对/池构成/上限带四处断言换代(V14),冒烟 848/0+probe_gate --click 全绿。
This commit is contained in:
1 parent
a57489e970
commit
0640b0c06d
10 files changed
+384
-103
No files matched your search
@@ -24,16 +24,21 @@ extends Resource
|
||||
## 类内异质性:金币与回复是即时兑付,不进持有集、不持续生效。)
|
||||
## 三选一提升池 kind 词表(封闭——断点附随件与牌库剔除态依赖它;扩件走本表+registry 修订)。
|
||||
## treasure_item 池种退役(迭代 11 第①批 T7——同调批出池);heal 恢复件新入池(v2.2 令牌池追认 b)。
|
||||
const CURIO_KINDS: Array[String] = ["attack", "max_hp", "armor", "gp", "ap", "heal", "refresh"] # T6 扩第七类(refresh=资源类成员——作为奇物授予的三选一重抽次数,作用对象=三选一界面非角色;见 registry refresh_boundary)
|
||||
## 令牌档位词表(v2.2 三档位——稀有度命名对齐 MC 策略判读序 316-f:1 级最稀有=rarest 优先)
|
||||
const TIERS: Array[String] = ["common", "rare", "rarest"]
|
||||
## 迭代 20 T4——资源凭证五件入池:rap 储备金袋/attune_battery 同调电池/time_sand 时沙/
|
||||
## perfect_insurance 完美保险(配额暂 0——T4 落路由同批给投放数,防无路由 kind 出候选)。
|
||||
const CURIO_KINDS: Array[String] = ["attack", "max_hp", "armor", "gp", "ap", "heal", "refresh",
|
||||
"rap", "attune_battery", "time_sand", "perfect_insurance"] # T6 扩第七类(refresh=资源类成员——作为奇物授予的三选一重抽次数,作用对象=三选一界面非角色;见 registry refresh_boundary)
|
||||
## 令牌档位词表(迭代 20 T2 换代——跨层四级稀有度框架〔01-核心循环 v1.5 档名映射:普通→普通、
|
||||
## 稀有→优秀、罕见→稀有、传说=新增头奖位〕;1 级最稀有=legendary 优先)
|
||||
const TIERS: Array[String] = ["common", "excellent", "rare", "legendary"]
|
||||
const TIER_COMMON := "common"
|
||||
const TIER_EXCELLENT := "excellent"
|
||||
const TIER_RARE := "rare"
|
||||
const TIER_RAREST := "rarest"
|
||||
## 档位配额结构锚(v2.2 追认 b 定稿——validate() 硬断言;改总量=重裁非调参)。
|
||||
## 罕见档 5→3:原「道具件 2」席位随 treasure_item 池种退役(迭代 11 第①批 T7,落地晚于追认 b)收窄,
|
||||
## 池总量 100→98——TP0 台账自决+人工清单披露项。
|
||||
const TIER_QUOTAS := {"common": 70, "rare": 25, "rarest": 3}
|
||||
const TIER_LEGENDARY := "legendary"
|
||||
## 档位配额结构锚(迭代 20 T2 四级换代——70/25/3 直映射改名承袭〔普通 70/优秀 25/稀有 3〕+
|
||||
## 传说 0=头奖位留空,池总量 98 不变=零偏离已裁结构锚数字〔配额纪律:改总量须用户重裁〕;
|
||||
## validate() 硬断言;改总量=重裁非调参)。
|
||||
const TIER_QUOTAS := {"common": 70, "excellent": 25, "rare": 3, "legendary": 0}
|
||||
|
||||
# —— 通关部分回血(固定型,非末关通关兑付)——
|
||||
@export var clear_heal_pct: int = 20 # [0,100] knob——回复生效上限的百分比,封顶上限不回满
|
||||
@@ -44,31 +49,55 @@ const TIER_QUOTAS := {"common": 70, "rare": 25, "rarest": 3}
|
||||
@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 档位构成)——
|
||||
# —— 令牌配额(kind × tier 计数;未列组合 = 0。迭代 20 T2 四级换代:旧 rare→excellent、
|
||||
# 旧 rarest→rare 物理承袭〔70/25/3 零偏离〕+凭证四 kind 占位 rare 档配额 0〔T4 落路由同批投放〕)——
|
||||
@export var curio_quota_attack_common: int = 18 # [0,99]
|
||||
@export var curio_quota_attack_rare: int = 5 # [0,99]
|
||||
@export var curio_quota_attack_excellent: int = 5 # [0,99]
|
||||
@export var curio_quota_max_hp_common: int = 17 # [0,99]
|
||||
@export var curio_quota_max_hp_rare: int = 5 # [0,99]
|
||||
@export var curio_quota_max_hp_excellent: int = 5 # [0,99]
|
||||
@export var curio_quota_armor_common: int = 17 # [0,99]
|
||||
@export var curio_quota_armor_rare: int = 5 # [0,99]
|
||||
@export var curio_quota_armor_excellent: int = 5 # [0,99]
|
||||
@export var curio_quota_gp_common: int = 18 # [0,99]
|
||||
@export var curio_quota_gp_rare: int = 5 # [0,99]
|
||||
@export var curio_quota_heal_rare: int = 3 # [0,99]——恢复件(原 5;T6 挤占 2 席位予 refresh——用户 2026-10-05 裁方案B,总量 98 锚不变)
|
||||
@export var curio_quota_refresh_rare: int = 2 # [0,99]——刷新次数件(T6 新入池资源类成员;provisional 归曲线调参批)
|
||||
@export var curio_quota_ap_rarest: int = 3 # [0,99]——AP 件(罕见档;道具件 2 席位随池种退役收窄)
|
||||
@export var curio_quota_gp_excellent: int = 5 # [0,99]
|
||||
@export var curio_quota_heal_excellent: int = 3 # [0,99]——恢复件(原 5;T6 挤占 2 席位予 refresh——用户 2026-10-05 裁方案B,总量 98 锚不变)
|
||||
@export var curio_quota_refresh_excellent: int = 2 # [0,99]——刷新次数件(T6 新入池资源类成员;provisional 归曲线调参批)
|
||||
@export var curio_quota_ap_rare: int = 3 # [0,99]——AP 件(稀有档;旧罕见档物理承袭)
|
||||
@export var curio_quota_rap_rare: int = 0 # [0,99]——储备金袋(T4 路由同批投放;provisional 归调参批)
|
||||
@export var curio_quota_attune_battery_rare: int = 0 # [0,99]——同调电池(同上)
|
||||
@export var curio_quota_time_sand_rare: int = 0 # [0,99]——时沙(同上)
|
||||
@export var curio_quota_perfect_insurance_rare: int = 0 # [0,99]——完美保险(同上)
|
||||
|
||||
# —— 令牌件值(小/大数值对——v2.2 追认 b 定稿:20/50、+1/+2、+1/+2、+5/+10、恢复+6、AP+1)——
|
||||
@export var curio_value_attack_common: int = 1 # [0,999] knob——小增伤
|
||||
@export var curio_value_attack_rare: int = 2 # [0,999] knob——大增伤
|
||||
@export var curio_value_attack_excellent: int = 2 # [0,999] knob——大增伤
|
||||
@export var curio_value_max_hp_common: int = 5 # [0,999] knob——小生命
|
||||
@export var curio_value_max_hp_rare: int = 10 # [0,999] knob——大生命
|
||||
@export var curio_value_max_hp_excellent: int = 10 # [0,999] knob——大生命
|
||||
@export var curio_value_armor_common: int = 1 # [0,999] knob——小护甲
|
||||
@export var curio_value_armor_rare: int = 2 # [0,999] knob——大护甲
|
||||
@export var curio_value_gp_common: int = 20 # [0,999] knob——小GP
|
||||
@export var curio_value_gp_rare: int = 50 # [0,999] knob——大GP
|
||||
@export var curio_value_heal_rare: int = 6 # [0,999] knob——恢复(当即回血,封顶生效上限)
|
||||
@export var curio_value_refresh_rare: int = 1 # [0,9] knob(provisional)——刷新次数件兑付值(三选一重抽次数 +N——_attune_refresh_x 增量,不进加算区)
|
||||
@export var curio_value_ap_rarest: int = 1 # [0,10] knob——AP 件每场战斗首轮行动点基线增量
|
||||
@export var curio_value_armor_excellent: int = 2 # [0,999] knob——大护甲
|
||||
@export var curio_value_gp_common: int = 20 # [0,999] knob——小GP
|
||||
@export var curio_value_gp_excellent: int = 50 # [0,999] knob——大GP
|
||||
@export var curio_value_heal_excellent: int = 6 # [0,999] knob——恢复(当即回血,封顶生效上限)
|
||||
@export var curio_value_refresh_excellent: int = 1 # [0,9] knob(provisional)——刷新次数件兑付值(三选一重抽次数 +N——_attune_refresh_x 增量,不进加算区)
|
||||
@export var curio_value_ap_rare: int = 1 # [0,10] knob——AP 件每场战斗首轮行动点基线增量
|
||||
@export var curio_value_rap_rare: int = 3 # [0,99] knob(provisional)——储备金袋 RAP +N
|
||||
@export var curio_value_attune_battery_rare: int = 1 # [0,9] knob(provisional)——同调电池充能 +N
|
||||
@export var curio_value_time_sand_rare: int = 2 # [0,99] knob(provisional)——时沙 下轮 AP +N
|
||||
@export var curio_value_perfect_insurance_rare: int = 1 # [0,9] knob(provisional)——完美保险 资格保护次数
|
||||
|
||||
# —— 已拿上限 cap(迭代 20 T2 概率与上限解耦〔奇物.md 池结构案D〕——案②令牌池+提前退役:
|
||||
# 概率位=档+令牌数〔牌库物理张数〕、上限=本字段〔拿了才计、刷出不计〕;cap 满后该 kind 从候选
|
||||
# 视图剔除〔提前退役〕。99=实质无上限占位,实数归调参批;专长 cap 在 feats.tres 行字段〕)——
|
||||
@export var curio_cap_attack: int = 99 # [1,99]
|
||||
@export var curio_cap_max_hp: int = 99 # [1,99]
|
||||
@export var curio_cap_armor: int = 99 # [1,99]
|
||||
@export var curio_cap_gp: int = 99 # [1,99]
|
||||
@export var curio_cap_ap: int = 99 # [1,99]
|
||||
@export var curio_cap_heal: int = 99 # [1,99]
|
||||
@export var curio_cap_refresh: int = 99 # [1,99]
|
||||
@export var curio_cap_rap: int = 99 # [1,99]
|
||||
@export var curio_cap_attune_battery: int = 99 # [1,99]
|
||||
@export var curio_cap_time_sand: int = 99 # [1,99]
|
||||
@export var curio_cap_perfect_insurance: int = 99 # [1,99]
|
||||
|
||||
# —— 专长获取门票(迭代 15 卡② T5——非 Boss 渠道的专长入口形态,奇物.md v2.7 渠道轴定位;
|
||||
# 四口径契约④:拿到即开不可囤积/罕见只在概率不在价格/一局限购一次/计步保底连续 5 展示未出
|
||||
@@ -97,45 +126,72 @@ func curio_apply_route(kind: String) -> String:
|
||||
return String(CURIO_APPLY_ROUTES.get(kind, ""))
|
||||
|
||||
|
||||
## 令牌配额读数(未列 kind×tier 组合 = 0——heal 无普通档/ap 无普通稀有档按 v2.2 构成)
|
||||
## 令牌配额读数(未列 kind×tier 组合 = 0——迭代 20 T2 四级构成:属性四类 common/excellent、
|
||||
## heal/refresh excellent、ap rare、凭证四 kind rare 占位 0)
|
||||
func curio_quota(kind: String, tier: String) -> int:
|
||||
match [kind, tier]:
|
||||
["attack", TIER_COMMON]: return curio_quota_attack_common
|
||||
["attack", TIER_RARE]: return curio_quota_attack_rare
|
||||
["attack", TIER_EXCELLENT]: return curio_quota_attack_excellent
|
||||
["max_hp", TIER_COMMON]: return curio_quota_max_hp_common
|
||||
["max_hp", TIER_RARE]: return curio_quota_max_hp_rare
|
||||
["max_hp", TIER_EXCELLENT]: return curio_quota_max_hp_excellent
|
||||
["armor", TIER_COMMON]: return curio_quota_armor_common
|
||||
["armor", TIER_RARE]: return curio_quota_armor_rare
|
||||
["armor", TIER_EXCELLENT]: return curio_quota_armor_excellent
|
||||
["gp", TIER_COMMON]: return curio_quota_gp_common
|
||||
["gp", TIER_RARE]: return curio_quota_gp_rare
|
||||
["heal", TIER_RARE]: return curio_quota_heal_rare
|
||||
["refresh", TIER_RARE]: return curio_quota_refresh_rare
|
||||
["ap", TIER_RAREST]: return curio_quota_ap_rarest
|
||||
["gp", TIER_EXCELLENT]: return curio_quota_gp_excellent
|
||||
["heal", TIER_EXCELLENT]: return curio_quota_heal_excellent
|
||||
["refresh", TIER_EXCELLENT]: return curio_quota_refresh_excellent
|
||||
["ap", TIER_RARE]: return curio_quota_ap_rare
|
||||
["rap", TIER_RARE]: return curio_quota_rap_rare
|
||||
["attune_battery", TIER_RARE]: return curio_quota_attune_battery_rare
|
||||
["time_sand", TIER_RARE]: return curio_quota_time_sand_rare
|
||||
["perfect_insurance", TIER_RARE]: return curio_quota_perfect_insurance_rare
|
||||
return 0
|
||||
|
||||
|
||||
## 令牌件值(kind × tier;v2.2 数值对——小/大两档)
|
||||
## 令牌件值(kind × tier;四级构成随配额表)
|
||||
func curio_value(kind: String, tier: String = TIER_COMMON) -> int:
|
||||
match [kind, tier]:
|
||||
["attack", TIER_COMMON]: return curio_value_attack_common
|
||||
["attack", TIER_RARE]: return curio_value_attack_rare
|
||||
["attack", TIER_EXCELLENT]: return curio_value_attack_excellent
|
||||
["max_hp", TIER_COMMON]: return curio_value_max_hp_common
|
||||
["max_hp", TIER_RARE]: return curio_value_max_hp_rare
|
||||
["max_hp", TIER_EXCELLENT]: return curio_value_max_hp_excellent
|
||||
["armor", TIER_COMMON]: return curio_value_armor_common
|
||||
["armor", TIER_RARE]: return curio_value_armor_rare
|
||||
["armor", TIER_EXCELLENT]: return curio_value_armor_excellent
|
||||
["gp", TIER_COMMON]: return curio_value_gp_common
|
||||
["gp", TIER_RARE]: return curio_value_gp_rare
|
||||
["heal", TIER_RARE]: return curio_value_heal_rare
|
||||
["refresh", TIER_RARE]: return curio_value_refresh_rare
|
||||
["ap", TIER_RAREST]: return curio_value_ap_rarest
|
||||
["gp", TIER_EXCELLENT]: return curio_value_gp_excellent
|
||||
["heal", TIER_EXCELLENT]: return curio_value_heal_excellent
|
||||
["refresh", TIER_EXCELLENT]: return curio_value_refresh_excellent
|
||||
["ap", TIER_RARE]: return curio_value_ap_rare
|
||||
["rap", TIER_RARE]: return curio_value_rap_rare
|
||||
["attune_battery", TIER_RARE]: return curio_value_attune_battery_rare
|
||||
["time_sand", TIER_RARE]: return curio_value_time_sand_rare
|
||||
["perfect_insurance", TIER_RARE]: return curio_value_perfect_insurance_rare
|
||||
return 0
|
||||
|
||||
|
||||
## 档位判读序(MC 策略 316-f——1 级最稀有:rarest > rare > common;并列同档取最左由调用方稳定序保证)
|
||||
## 已拿上限读数(迭代 20 T2 案②——kind 维度;专长 cap 走 feats.tres 行字段不走本面)
|
||||
func curio_cap(kind: String) -> int:
|
||||
match kind:
|
||||
"attack": return curio_cap_attack
|
||||
"max_hp": return curio_cap_max_hp
|
||||
"armor": return curio_cap_armor
|
||||
"gp": return curio_cap_gp
|
||||
"ap": return curio_cap_ap
|
||||
"heal": return curio_cap_heal
|
||||
"refresh": return curio_cap_refresh
|
||||
"rap": return curio_cap_rap
|
||||
"attune_battery": return curio_cap_attune_battery
|
||||
"time_sand": return curio_cap_time_sand
|
||||
"perfect_insurance": return curio_cap_perfect_insurance
|
||||
return 99
|
||||
|
||||
|
||||
## 档位判读序(MC 策略 316-f——1 级最稀有:legendary > rare > excellent > common;并列同档取最左由调用方稳定序保证)
|
||||
func tier_rank(tier: String) -> int:
|
||||
match tier:
|
||||
TIER_RAREST: return 3
|
||||
TIER_RARE: return 2
|
||||
TIER_LEGENDARY: return 4
|
||||
TIER_RARE: return 3
|
||||
TIER_EXCELLENT: return 2
|
||||
TIER_COMMON: return 1
|
||||
return 0
|
||||
|
||||
@@ -148,9 +204,12 @@ func tier_total(tier: String) -> int:
|
||||
return total
|
||||
|
||||
|
||||
## 牌库总量(结构锚——罕见档随道具件退役收窄后 98 张)
|
||||
## 牌库总量(结构锚——四级换代后 98 张不变:70+25+3+0)
|
||||
func deck_total() -> int:
|
||||
return tier_total(TIER_COMMON) + tier_total(TIER_RARE) + tier_total(TIER_RAREST)
|
||||
var total := 0
|
||||
for tier in TIERS:
|
||||
total += tier_total(tier)
|
||||
return total
|
||||
|
||||
|
||||
func validate() -> Array:
|
||||
@@ -168,10 +227,12 @@ func validate() -> Array:
|
||||
var v := curio_value(kind, tier)
|
||||
if v < 0 or v > 999:
|
||||
errs.append({"category": "domain", "message": "curio_value(%s,%s) 越域 [0,999]: %d" % [kind, tier, v]})
|
||||
if curio_cap(kind) < 1 or curio_cap(kind) > 99:
|
||||
errs.append({"category": "domain", "message": "curio_cap(%s) 越域 [1,99]: %d" % [kind, curio_cap(kind)]})
|
||||
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]})
|
||||
errs.append({"category": "domain", "message": "档位配额结构失锚(四级锚 70/25/3/0——%s 应=%d 实=%d;改总量须重裁)" % [tier, int(TIER_QUOTAS.get(tier, -1)), total]})
|
||||
if curio_candidate_count < 1 or curio_candidate_count > 6:
|
||||
errs.append({"category": "domain", "message": "curio_candidate_count 越域 [1,6]: %d" % curio_candidate_count})
|
||||
return errs
|
||||
@@ -7,33 +7,37 @@ script = ExtResource("1")
|
||||
clear_heal_pct = 20
|
||||
curio_candidate_count = 3
|
||||
curio_quota_attack_common = 18
|
||||
curio_quota_attack_rare = 5
|
||||
curio_quota_attack_excellent = 5
|
||||
curio_quota_max_hp_common = 17
|
||||
curio_quota_max_hp_rare = 5
|
||||
curio_quota_max_hp_excellent = 5
|
||||
curio_quota_armor_common = 17
|
||||
curio_quota_armor_rare = 5
|
||||
curio_quota_armor_excellent = 5
|
||||
curio_quota_gp_common = 18
|
||||
curio_quota_gp_rare = 5
|
||||
curio_quota_heal_rare = 3
|
||||
curio_quota_refresh_rare = 2
|
||||
curio_quota_ap_rarest = 3
|
||||
curio_quota_gp_excellent = 5
|
||||
curio_quota_heal_excellent = 3
|
||||
curio_quota_refresh_excellent = 2
|
||||
curio_quota_ap_rare = 3
|
||||
curio_value_attack_common = 1
|
||||
curio_value_attack_rare = 2
|
||||
curio_value_attack_excellent = 2
|
||||
curio_value_max_hp_common = 5
|
||||
curio_value_max_hp_rare = 10
|
||||
curio_value_max_hp_excellent = 10
|
||||
curio_value_armor_common = 1
|
||||
curio_value_armor_rare = 2
|
||||
curio_value_armor_excellent = 2
|
||||
curio_value_gp_common = 20
|
||||
curio_value_gp_rare = 50
|
||||
curio_value_heal_rare = 6
|
||||
curio_value_refresh_rare = 1
|
||||
curio_value_ap_rarest = 1
|
||||
curio_value_gp_excellent = 50
|
||||
curio_value_heal_excellent = 6
|
||||
curio_value_refresh_excellent = 1
|
||||
curio_value_ap_rare = 1
|
||||
feat_ticket_chance = 20
|
||||
feat_ticket_quota = 2
|
||||
feat_ticket_limit = 1
|
||||
feat_ticket_pity_step = 5
|
||||
|
||||
; TP0 令牌池换代(2026-10-03,node-reward v2.2 追认 b 落地):三选一池 = 固定配额令牌池——
|
||||
; 迭代 20 T2 池结构案D 换代(2026-10-11,奇物.md 池结构与抽取 v1):四级档位 70/25/3/0 = 98 张
|
||||
; (普通 70/优秀 25/稀有 3/传说 0=头奖位留空——旧 70/25/3 直映射改名承袭零偏离已裁结构锚);
|
||||
; 概率与上限解耦(案②令牌池+提前退役):概率位=档+令牌数、已拿上限=curio_cap_*(拿了才计);
|
||||
; 曝光槽=三选一 2 格全池+1 格优秀档以上子池(子池空回退全池);凭证不进子池。
|
||||
; 前史 TP0 令牌池换代(2026-10-03,node-reward v2.2 追认 b 落地):三选一池 = 固定配额令牌池——
|
||||
; 普通 70/稀有 25/罕见 3 = 98 张(罕见档原列「道具件 2」随 treasure_item 池种退役收窄——台账自决披露项);
|
||||
; 洗牌不放回抽 3、选中踢池未选回池、池耗即枯竭;
|
||||
; 种类次数上限退役(池消耗即上限;货架库存同账本=牌库剩余令牌数)。
|
||||
|
||||
Reference in new issue
Block a user