From 63a08d1e018cb61a90b5c03ba18f448206967ef7 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 29 Sep 2026 07:07:38 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat(t1-t3):=20=E9=AD=94=E6=B3=95=E9=81=93?= =?UTF-8?q?=E5=85=B7=E6=95=B0=E6=8D=AE=E9=9D=A2+=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E7=AE=A1=E7=BA=BF+=E6=8E=88=E4=BA=88=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=EF=BC=88=E4=B8=89=E5=8D=A1?= =?UTF-8?q?=E4=B8=80=E8=BD=AE=E4=BA=A4=E4=BB=98=E2=80=94=E2=80=94=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BA=A4=E5=8F=89=E5=90=88=E5=B9=B6=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=EF=BC=89=20T1=20=E6=95=B0=E6=8D=AE=E9=9D=A2:AuxItemTable=20sch?= =?UTF-8?q?ema(=E4=B8=83=E5=AD=97=E6=AE=B5+retired/deferred=20=E4=B8=A4=20?= =?UTF-8?q?additive=20=E6=A0=87=E8=AE=B0+=E7=9C=9F=E8=A7=86=E7=AA=84?= =?UTF-8?q?=E5=9F=9F/board=5Fwide=20=E5=8F=8C=E6=89=BF=E9=87=8D=E6=8A=A4?= =?UTF-8?q?=E6=A0=8F)+=E5=85=AD=E8=A1=8C=20tres(=E4=B8=89=E6=9C=89?= =?UTF-8?q?=E6=95=88+=E7=BD=97=E7=9B=98=20retired=20=E7=95=99=E7=97=95+?= =?UTF-8?q?=E6=98=BE=E5=BD=B1=E5=B0=98/=E5=85=A8=E5=9B=BE=E5=8D=B7=20defer?= =?UTF-8?q?red)+ConfigDB=20=E5=8A=A0=E8=BD=BD/=E8=AE=BF=E9=97=AE=E5=99=A8+?= =?UTF-8?q?RewardTable=20=E5=8D=81=E5=9E=8B=E6=89=A9=E5=80=BC(aux=5Fitem)+?= =?UTF-8?q?=E4=B8=89=E6=8A=95=E6=94=BE=E8=A1=8C=205/4/1+aux=5Fnone=20?= =?UTF-8?q?=E8=B4=9F=E5=8D=A0=E4=BD=8D=E8=A1=8C(=E9=9B=B7=E6=A0=BC?= =?UTF-8?q?=E6=9E=81=E6=80=A7=E5=AD=97=E5=85=B8=E5=85=9C=E5=BA=95=E9=9B=B6?= =?UTF-8?q?=E5=85=91=E4=BB=98)+=E5=8F=8C=E8=A1=A8=E6=82=AC=E7=A9=BA?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C(reward=5Fdangling=5Faux,=E8=B4=9F=E5=8D=A0?= =?UTF-8?q?=E4=BD=8D=E8=B1=81=E5=85=8D)+F2=20=E6=8A=95=E6=94=BE=E7=BB=B4?= =?UTF-8?q?=E5=BA=A6=E8=A6=86=E7=9B=96(=E8=B1=81=E5=85=8D=E9=9D=A2=20plan/?= =?UTF-8?q?info/counter=20=E7=99=BB=E8=AE=B0)+=E4=B8=A4=20fatal=20?= =?UTF-8?q?=E5=A4=B9=E5=85=B7(expect=3D1=20=E5=A4=8D=E5=88=B6=E7=9C=9F?= =?UTF-8?q?=E8=A1=A8=E6=B3=A8=E5=85=A5=E8=BF=9D=E8=A7=84)+run=5Fall=20mani?= =?UTF-8?q?fest+2=20T2=20core=20=E9=AA=A8=E6=9E=B6:AuxItems=20=E7=B1=BB(ap?= =?UTF-8?q?i=208=20=E5=85=A5=E5=8F=A3+probe=20=E6=8E=A2=E9=92=88;=E9=9B=B6?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E9=9B=B6=E7=89=B9=E5=88=A4;Used=20=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E9=80=86;=E7=9C=9F=E8=A7=86=E6=81=92=E5=8F=AF?= =?UTF-8?q?=E7=94=A8/=E9=A2=84=E8=AF=BB=E7=82=B9=E5=87=BB=E7=BA=A7?= =?UTF-8?q?=E9=9B=B6=E4=BF=A1=E6=81=AF=E6=8B=92=E7=BB=9D;3x3=20=E8=BE=B9?= =?UTF-8?q?=E7=BC=98=E7=AA=97=E5=8F=A3=E2=88=A9=E6=9D=BF)+action=5Feconomy?= =?UTF-8?q?.grant=5Fap=20=E7=AC=AC=209=20API(=E5=BD=93=E8=BD=AE=E5=8A=A0?= =?UTF-8?q?=E9=87=8F,=E5=8C=BA=E5=88=AB=20queue=5Fap=5Fdelta=20=E6=8E=92?= =?UTF-8?q?=E9=98=9F)=20T3=20=E6=8E=88=E4=BA=88=E8=B7=AF=E7=94=B1+?= =?UTF-8?q?=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F:=5Fgrant=5Frouted=20aux=20?= =?UTF-8?q?=E5=88=86=E6=94=AF(=E6=AD=A3=3D=E5=85=A5=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E5=8F=91=E3=80=8C=E8=8E=B7=E5=BE=97=E3=80=8D=E8=A1=8C;?= =?UTF-8?q?=E8=B4=9F=3D=E9=9B=B6=E5=85=91=E4=BB=98=20effect=20=E5=9E=8B?= =?UTF-8?q?=E3=80=8C=E9=81=93=E5=85=B7=E9=9A=8F=E9=9B=B7=E6=B2=89=E6=B2=A1?= =?UTF-8?q?=E3=80=8D=E8=A1=8C)+use=5Faux=20=E5=9B=9B=E6=AD=A5=E5=8F=97?= =?UTF-8?q?=E7=90=86(=E7=9B=B8=E4=BD=8D=20gate=E2=86=92validate=E2=86=92?= =?UTF-8?q?=E9=80=90=20kind=20=E7=A9=BA=E9=97=B4=E5=85=88=20AP=20=E5=90=8E?= =?UTF-8?q?=E2=86=92consume;=E7=BB=93=E7=AE=97=E6=98=8E=E7=BB=86=E6=97=A0?= =?UTF-8?q?=E9=81=93=E5=85=B7=E8=A1=8C)+=E5=8F=A0=E5=8A=A0=E5=B1=82?= =?UTF-8?q?=E4=B8=89=E6=B8=85(=E8=A3=85=E6=9D=BF=E7=82=B9/=E6=88=98?= =?UTF-8?q?=E6=96=97=E7=BB=93=E6=9D=9F)+LevelRunner=20=E5=85=B3=E5=8D=A1?= =?UTF-8?q?=E5=9F=9F=E5=BA=93=E5=AD=98=E6=8C=81=E6=9C=89=E6=B3=A8=E5=85=A5?= =?UTF-8?q?+=E5=85=B3=E5=8D=A1=E6=9C=AB=20reset+aux=5Fcleared=20=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E8=AE=A1=E6=95=B0=E6=89=A9=E7=AD=BE=20=E5=86=92?= =?UTF-8?q?=E7=83=9F=E9=94=9A=E9=9A=8F=E8=AF=8D=E8=A1=A8=E6=89=A9=E5=80=BC?= =?UTF-8?q?=E6=9B=B4=E6=96=B0:=E4=B9=9D=E5=9E=8B=E2=86=92=E5=8D=81?= =?UTF-8?q?=E5=9E=8B=E5=B0=81=E9=97=AD/=E5=AD=97=E5=85=B8=2018=E2=86=9222?= =?UTF-8?q?=20=E8=A1=8C;=E8=B4=9F=E5=90=91=E5=AD=97=E5=85=B8=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E4=B8=89=E5=A4=84=E7=A8=B3=E5=81=A5=E5=8C=96(aux=20?= =?UTF-8?q?=E4=B8=8D=E5=85=A5=E4=BA=94=E5=9E=8B=E8=BD=B4+break=20=E6=94=B9?= =?UTF-8?q?=20percent=5Fmap=20=E4=B8=89=E5=9E=8B=E9=BD=90=E5=A4=87+rng=20?= =?UTF-8?q?=E6=AF=8F=E6=9D=BF=E6=96=B0=E5=AE=9E=E4=BE=8B=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=8E=9F=E7=AC=AC=E4=B8=80=E6=9D=BF=20break=20=E6=8E=A9?= =?UTF-8?q?=E7=9B=96=20set=5Fmaster=5Fseed=20=5Fcounter=20=E5=AE=88?= =?UTF-8?q?=E5=8D=AB=E8=BF=9D=E4=BE=8B)=20=E9=97=B8:=E5=86=92=E7=83=9F=205?= =?UTF-8?q?77/0(=E5=87=80=E5=A2=9E=201)+=E5=8D=95=E6=B5=8B=2011=20?= =?UTF-8?q?=E5=A5=97=E5=85=A8=E8=BF=87(=E5=90=AB=E4=B8=A4=E6=96=B0?= =?UTF-8?q?=E5=A4=B9=E5=85=B7)+=E5=9B=9B=E6=8E=A2=E9=92=88=20PASS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/action_economy.gd | 11 + game/core/aux_items.gd | 192 ++++++++++++++++++ game/core/aux_items.gd.uid | 1 + game/core/battle_orchestrator.gd | 62 +++++- game/core/config_db.gd | 55 +++++ game/core/level_runner.gd | 12 +- game/data/schemas/aux_item_table.gd | 109 ++++++++++ game/data/schemas/aux_item_table.gd.uid | 1 + game/data/schemas/reward_table.gd | 17 +- game/data/tables/aux_items.tres | 58 ++++++ game/data/tables/reward.tres | 43 ++++ game/smoke/smoke_all.gd | 18 +- game/tests/run_all.gd | 2 + .../data_config/aux_target_violation_test.gd | 76 +++++++ .../aux_target_violation_test.gd.uid | 1 + .../data_config/reward_dangling_aux_test.gd | 69 +++++++ .../reward_dangling_aux_test.gd.uid | 1 + 17 files changed, 718 insertions(+), 10 deletions(-) create mode 100644 game/core/aux_items.gd create mode 100644 game/core/aux_items.gd.uid create mode 100644 game/data/schemas/aux_item_table.gd create mode 100644 game/data/schemas/aux_item_table.gd.uid create mode 100644 game/data/tables/aux_items.tres create mode 100644 game/tests/unit/data_config/aux_target_violation_test.gd create mode 100644 game/tests/unit/data_config/aux_target_violation_test.gd.uid create mode 100644 game/tests/unit/data_config/reward_dangling_aux_test.gd create mode 100644 game/tests/unit/data_config/reward_dangling_aux_test.gd.uid diff --git a/game/core/action_economy.gd b/game/core/action_economy.gd index a80b0455..97a9a9eb 100644 --- a/game/core/action_economy.gd +++ b/game/core/action_economy.gd @@ -121,6 +121,17 @@ func notify_settlement_done(next_round_mode: String) -> bool: # 下轮行动点修正排队(格面资源八型批 2026-09-20):action 型正负行结算期调用,同轮多次授予累加; # 相位无关(授予发生在结算段,此时本类可能处于 ACTIVE/WAITING 任一相位) +# 第 9 API(registry 行动经济×① 接口漂移预授权——迭代 7 T2 魔法道具内容批落位):ap_grant 道具的 +# 当轮行动点加量(GDD「加行动点效果给当轮」——区别于 queue_ap_delta 的下轮排队语义)。Active 受理、 +# 无上限域、零随机;使用道具本身零扣费(成本在获取时已付——捡道具格不出战斗奖励)。 +func grant_ap(amount: int) -> bool: + if amount <= 0 or _phase != PHASE_ACTIVE: + _reject("grant_ap") + return false + _ap += amount + return true + + func queue_ap_delta(delta: int) -> void: _pending_ap_delta += delta diff --git a/game/core/aux_items.gd b/game/core/aux_items.gd new file mode 100644 index 00000000..0fd7f587 --- /dev/null +++ b/game/core/aux_items.gd @@ -0,0 +1,192 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# Validation Question: 道具从掉落到使用的全程零随机零特判——同操作序列重放两遍,库存与叠加层投影逐位相同(P0) +# Date: 2026-09-29(迭代 7 T2 core 骨架——魔法道具内容批;设计权威 design/gdd/systems/排雷循环/魔法道具.md +# + registry aux_items api 8 入口/load_bearing_rules/use_orchestration) +# 魔法道具 关卡域库存 + 板级叠加层(自持派生信息层)。 +# 结构冻结照抄(违反即返工): +# 零随机(零 RNG 流消费——信息只来自 排雷玩法 恒真数字/地图战斗资源 Ready 映射/行动经济 账本三既有事实源); +# 库存关卡域(跨轮跨图跨战斗延续、关卡末清空——清空编排归 战斗结算/关卡层,本类只供 clear/reset); +# 叠加层随图消亡(换图/弃图刷新/战斗结束三清——编排归 战斗结算 retire_overlays); +# Used 不可逆(consume 后保留只读——枚举序=受理序); +# 真视恒可用(零雷窗口=「这 9 格没雷」信息非空);点击级零信息不消耗(拒绝零消耗——预读窗口全已开); +# 零特判(排雷玩法 代码零本系统分支——本类不写任何其他系统状态)。 +# 负空间:无自动使用入口/无重掷/无事件订阅/无 RNG 直连/无 排雷玩法/地图战斗资源 写入口; +# 相位检查归 战斗结算 use_aux 编排第一步(本类不管相位——validate_use 是纯谓词+投影)。 +# 呈现取数面:query_inventory(C 区槽位)/query_overlays(棋盘叠加层标记)——只读投影,零数据复制 +# (预读徽章数据源=战斗结算 query_reward_identity 既有读面,本类只记「哪些格要额外显示」)。 +class_name AuxItems +extends RefCounted + +var _items: Array = [] # [{handle, item_id, used}]——受理序;Used 保留只读 +var _handle_seq := 0 # 受理序句柄(单调递增——零随机) +var _reveal_cells := {} # 真视集:Vector2i → true(惩罚格标记——插旗仍走既有 flag 路径) +var _preview_cells := {} # 预读集:Vector2i → true(奖励身份徽章呈现挂点) +var _last_reject := "" # 诊断面(最近一次拒绝原因——呈现反馈取数) + + +# ---- 生命周期 ---- + +# 关卡开始/关卡末清空(clear_inventory 幂等;关卡末清空前取 inventory_count() 快照做可见反馈) +func reset() -> void: + _items.clear() + _handle_seq = 0 + retire_overlays() + + +# 授予(战斗结算 grant 路由——来源可归因:source_class+cell+round_index) +func add_item(item_id: String, source_class: String, cell: Vector2i, round_index: int) -> Dictionary: + _handle_seq += 1 + var rec := { + "handle": _handle_seq, + "item_id": item_id, + "source_class": source_class, + "origin_cell": cell, + "round_index": round_index, + "used": false, + } + _items.append(rec) + return rec.duplicate() + + +# ---- 库存读面(C 区槽位常读)---- + +# 枚举序=受理序;Used 保留只读;逐件含 usable 板级零信息预判(调用方喂板面回调) +func query_inventory(board_has_preview_info: Callable) -> Array: + var out: Array = [] + for rec in _items: + var row: Dictionary = rec.duplicate() + row["usable"] = _usable_now(String(rec.item_id), board_has_preview_info) + out.append(row) + return out + + +func inventory_count() -> int: + return _items.size() + + +# 板级零信息可用性预判(图标置灰/入口禁用判据——GDD「整张图都没东西可看」级): +# 真视恒可用(零雷窗口=信息非空);AP 类恒可用(组合判据取 OR——任一效果有信息即可用); +# 纯预读行 = 板上还有未开格才可用。 +func _usable_now(item_id: String, board_has_preview_info: Callable) -> bool: + var row: Dictionary = _item_row(item_id) + if row.is_empty(): + return false + var kinds: Array = row.get("effect_kinds", []) + if kinds.has("mine_reveal") or kinds.has("ap_grant"): + return true + return bool(board_has_preview_info.call()) if board_has_preview_info.is_valid() else true + + +func _item_row(item_id: String) -> Dictionary: + if _db != null and _db.aux_items != null: + return _db.aux_items.row_by_id(item_id) + return {} + +var _db = null # ConfigDB(行定义读取——_init 注入;测试可注入桩表) + + +func _init(db_ref = null) -> void: + _db = db_ref + + +# ---- 使用校验(战斗结算 use_aux 编排第二步——纯谓词+投影,零消耗零副作用)---- + +# target = 目标格(空间行=3×3 窗口中心;ap 行忽略)。board_size = 板维度; +# cell_unrevealed_cb = Callable(Vector2i) -> bool(排雷玩法 只读面——预读窗口信息判据)。 +# 返回 {ok, reason, resolved: Array[Vector2i], item_id, kinds}——ok=false 时 reason 可呈现。 +func validate_use(handle: int, target: Vector2i, board_size: Vector2i, cell_unrevealed_cb: Callable) -> Dictionary: + var rec := _rec_by_handle(handle) + if rec.is_empty(): + return _reject("句柄不存在") + if bool(rec.used): + return _reject("道具已使用(Used 不可逆)") + var row: Dictionary = _item_row(String(rec.item_id)) + if row.is_empty() or bool(row.get("retired", false)) or bool(row.get("deferred", false)): + return _reject("道具未激活") + var kinds: Array = row.get("effect_kinds", []) + var resolved: Array = [] + if kinds.has("mine_reveal") or kinds.has("reward_preview"): + # 空间效果:3×3 窗口 ∩ 板内格(边缘受理——护栏只缩不扩) + if target.x < 0 or target.y < 0 or target.x >= int(board_size.x) or target.y >= int(board_size.y): + return _reject("目标越板") + for dy in range(-1, 2): + for dx in range(-1, 2): + var c := target + Vector2i(dx, dy) + if c.x >= 0 and c.y >= 0 and c.x < int(board_size.x) and c.y < int(board_size.y): + resolved.append(c) + # 点击级零信息:纯预读行窗口全已开 = 没东西可看(拒绝零消耗); + # 真视恒可用(零雷窗口=「这 9 格没雷」信息非空——GDD 裁定) + if kinds.has("reward_preview") and not kinds.has("mine_reveal"): + var any_unrevealed := false + if cell_unrevealed_cb.is_valid(): + for c in resolved: + if bool(cell_unrevealed_cb.call(c)): + any_unrevealed = true + break + if not any_unrevealed: + return _reject("窗口内无可预读的未开格") + return { + "ok": true, + "reason": "", + "resolved": resolved, + "item_id": String(rec.item_id), + "kinds": kinds, + "magnitude": int(row.get("magnitude", 0)), + } + + +# ---- 叠加层(战斗结算逐 kind 应用——空间先、ap 后的序在编排侧钉死)---- + +func apply_overlay(kind: String, cells: Array) -> void: + var store := _reveal_cells if kind == "mine_reveal" else _preview_cells + for c in cells: + store[Vector2i(c)] = true + + +# 三清只读投影(棋盘叠加层标记渲染——真视集/预读集;随图消亡由 retire_overlays 承载) +func query_overlays() -> Dictionary: + return { + "mine_reveal": _reveal_cells.keys(), + "reward_preview": _preview_cells.keys(), + } + + +# 换图/弃图刷新/战斗结束——叠加层清空(已花道具不返还;库存不动——库存关卡域) +func retire_overlays() -> void: + _reveal_cells.clear() + _preview_cells.clear() + + +# ---- 消耗(编排第四步——Used 不可逆+快照回执)---- + +func consume(handle: int) -> Dictionary: + var rec := _rec_by_handle(handle) + if rec.is_empty() or bool(rec.used): + return {} + rec.used = true + return rec.duplicate() + + +# ---- 内部 ---- + +func _rec_by_handle(handle: int) -> Dictionary: + for rec in _items: + if int(rec.handle) == handle: + return rec + return {} + + +func _reject(reason: String) -> Dictionary: + _last_reject = reason + return {"ok": false, "reason": reason, "resolved": [], "item_id": "", "kinds": [], "magnitude": 0} + + +# 探针出口(T7 收拢——断言面:库存序/叠加层集/拒绝原因) +func probe() -> Dictionary: + return { + "count": _items.size(), + "used": _items.filter(func(r): return bool(r.used)).size(), + "reveal_cells": _reveal_cells.size(), + "preview_cells": _preview_cells.size(), + "last_reject": _last_reject, + } diff --git a/game/core/aux_items.gd.uid b/game/core/aux_items.gd.uid new file mode 100644 index 00000000..ebc63c6d --- /dev/null +++ b/game/core/aux_items.gd.uid @@ -0,0 +1 @@ +uid://uvt473an5yxh diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index 2bce5d59..5cd9bae6 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -50,6 +50,8 @@ var action_economy: ActionEconomy var _enemy_system: UnitContainer var _status_effects: StatusContainer var _reward_economy: RewardEconomy +var aux_inventory = null # AuxItems(迭代 7 T3——LevelRunner 注入的关卡域库存引用; + # 每战新建本类,库存不归本类所有——注入面) var _damage: DamageController # 伤害控制器(伤害管线单据化批 2026-09-24——单据唯一兑付管线) var encounter: Dictionary = {} @@ -170,6 +172,8 @@ func _install_new_board(during_round := false) -> bool: _board_from_midround_refresh = during_round # 轮内刷新装板 = 刷新图(清图奖励不发);常规换图/开战装板 = false _board_seq += 1 board_changed.emit() + if aux_inventory != null: + aux_inventory.retire_overlays() # 迭代 7 T3——叠加层随图消亡(换图/刷新图装板点;已花道具不返还) return true @@ -351,7 +355,62 @@ func _settle() -> void: # 「动作 × 格型」矩阵的执行面:snap = 缓冲期冻结身份快照(cell_type = 该格装板期摇定的类型身份), # polarity 由动作决定(开安全格/标中旗 = positive,开雷格/标错旗 = negative), # 兑付行 = 奖励字典(类型, 极性)行。返回 true = percent 行实际生效(flat 行恒 false——兑付结果由行协议承载)。 +# ---- 魔法道具(迭代 7 T2/T3——库存授予路由 + use_aux 四步受理编排;结构冻结见魔法道具 GDD)---- + +# 授予路由 aux 分支:正=入库存(发行「获得」行——逐行归因纪律);负=零兑付占位行。 +func _grant_aux(snap: Dictionary, polarity: String, source_class: String, cell: Vector2i, ri: int) -> bool: + if polarity != "positive" or aux_inventory == null: + # 负路由占位行=effect 型零兑付(雷安同池下标错旗/雷格摇中 aux 身份的负向字典行——逐行归因纪律: + # 该格资源的负向兑付存在且为零;effect_id 空不入增益容器) + _emit_row("effect", source_class, cell, ri, "道具随雷沉没(惩罚格不入库存)", 0, + {"effect_id": "", "aux_sink": String(snap.get("effect_id", ""))}, "") + return false + var iid := String(snap.get("effect_id", "")) + var arow: Dictionary = db.aux_item_row(iid) + var rec: Dictionary = aux_inventory.add_item(iid, source_class, cell, ri) + _emit_row("effect", source_class, cell, ri, "获得 %s" % String(arow.get("display_name", iid)), 1, + {"aux_item": iid, "handle": int(rec.get("handle", 0))}, "") + return true + + +# use_aux 四步受理(registry use_orchestration 规范序——唯一调用权归本类;序即原子: +# ① 相位 gate(Active——行动经济 phase getter)→ ② validate_use(目标校验读 排雷玩法 只读面,零消耗)→ +# ③ 逐 kind 应用(顺序钉死:空间先、ap_grant 后——effect_kinds 列表序非运行时语义)→ ④ consume。 +# 拒绝全部发生在 ①②(后两步合法输入下无失败路径);使用零 AP 成本(不经 try_spend)。 +# 结算明细无道具行(GDD——效果即时可见:overlay 呈现+AP 条刷新;AP 过账本 grant_ap 走 _reject 面)。 +func use_aux(handle: int, target: Vector2i) -> Dictionary: + if aux_inventory == null: + return {"ok": false, "reason": "库存未接线"} + if action_economy.phase != action_economy.PHASE_ACTIVE: + return {"ok": false, "reason": "非挖掘期(使用窗口=Active)"} + var board = _minesweeper_ref() + var v: Dictionary = aux_inventory.validate_use(handle, target, + Vector2(board.width, board.height), + func(c: Vector2i): return not board.is_revealed(c)) + if not bool(v.ok): + return v # ② 拒绝零消耗 + var kinds: Array = v.kinds + if kinds.has("mine_reveal"): + aux_inventory.apply_overlay("mine_reveal", v.resolved) + if kinds.has("reward_preview"): + aux_inventory.apply_overlay("reward_preview", v.resolved) + if kinds.has("ap_grant"): + if not action_economy.grant_ap(int(v.magnitude)): + return {"ok": false, "reason": "行动点加量被拒(相位防御)"} + var rec: Dictionary = aux_inventory.consume(handle) + return {"ok": true, "item_id": v.item_id, "resolved": v.resolved, "record": rec} + + +func _minesweeper_ref() -> Variant: + return minesweeper + + func _grant_routed(snap: Dictionary, polarity: String, source_class: String, cell: Vector2i, ri: int, highlight: String = "", label_suffix: String = "") -> bool: + # 迭代 7 T3——aux 投放行授予路由(魔法道具 GDD:授予路由唯一调用方=战斗结算):正路由(挖开/标中) + # → 道具入关卡域库存(来源可归因);负路由(雷格/标错旗摇中 aux 身份——雷安同池)→ 零兑付 + # 「道具随雷沉没」(雷格奖励沉没既有语义);清图批追加份同路由(清图翻倍语义对 aux 同样成立)。 + if String(snap.get("cell_type", "")) == RewardTable.AUX_ITEM_TYPE: + return _grant_aux(snap, polarity, source_class, cell, ri) var row: Dictionary = _reward_economy.polarity_row(String(snap.get("cell_type", "")), polarity) if row.is_empty(): _fatal("极性字典缺行: %s %s" % [String(snap.get("cell_type", "")), polarity]) @@ -717,7 +776,8 @@ func _battle_over(result: String) -> void: _reward_economy.retire_mapping() _enemy_system.despawn_all() _status_effects.notify_battle_end() - action_economy.notify_combat_end() # → Idle,RAP 清零 + if aux_inventory != null: + aux_inventory.retire_overlays() # 迭代 7 T3——叠加层随战斗结束清空(库存不动——关卡域跨战斗) action_economy.notify_combat_end() # → Idle,RAP 清零 db.set_reload_gate(false) _reset_round_facts() battle_finished.emit({"result": result, "hero_hp": hero_hp_left, "gp_dropped": gp_dropped}) diff --git a/game/core/config_db.gd b/game/core/config_db.gd index d5dc1c81..2164a80a 100644 --- a/game/core/config_db.gd +++ b/game/core/config_db.gd @@ -22,6 +22,7 @@ const TABLE_MANIFEST := { "difficulty": "difficulty.tres", "shop": "shop.tres", # GP+商店房实施批 2026-09-21(表与 schema 落籍归并行数据面——本批只接线加载与消费) "meta": "meta.tres", # 元进度实现批 2026-09-21(MetaTable 四行族——schema 与表同批落籍) + "aux_items": "aux_items.tres", # 迭代 7 T1 魔法道具内容批(AuxItemTable 六行——定义表 Rule 4 豁免;罗盘 retired/失义件 deferred 标记见 schema 头注) "adventure": "adventure.tres", # 冒险结构实现批 2026-09-21(AdventureTable 建表——大奖励与钥石行值单点) } @@ -41,6 +42,7 @@ var difficulty: DifficultyTable var shop = null # 元进度实现批(2026-09-21):MetaTable 类型化持用(schema 与表同批落籍,无 shop 先例的落籍间隙问题) var meta: MetaTable +var aux_items: AuxItemTable # 迭代 7 T1 类型化持用(消费面走 aux_* 访问器) var adventure: AdventureTable var is_ready := false @@ -125,6 +127,7 @@ func load_tables(root: String, collect_only: bool) -> bool: difficulty = loaded.get("difficulty") shop = loaded.get("shop") meta = loaded.get("meta") + aux_items = loaded.get("aux_items") adventure = loaded.get("adventure") is_ready = not has_errors return not has_errors @@ -143,9 +146,43 @@ func _cross_validate(loaded: Dictionary) -> void: # GP+商店房实施批(2026-09-21)例外:gp_gain/gp_loss = GP 战斗内缓冲(escrow)通道的路由键 # (战斗结算 _apply_gp_row 兑付——不入增益状态容器),词表封闭按字面豁免悬空引用校验。 for row in rt.rows: + if String(row.get("cell_type", "")) == RewardTable.AUX_ITEM_TYPE: + continue # aux 行 effect_id=item_id——归 ①b 双表校验(reward_dangling_aux),不入增益词表面 var eff: String = row.get("effect_id", "") if eff != "" and eff != "gp_gain" and eff != "gp_loss" and not effect_ids.has(eff): push_diag("error", "dangling_effect", "RewardTable %s 引用不存在的 effect_id: %s" % [row.get("reward_id"), eff]) + # ①b RewardTable aux 投放行双表校验(迭代 7 T1——reward_dangling_aux):aux 行 effect_id = item_id, + # 须命中 AuxItemTable 活行(非 retired 非 deferred——罗盘退役/失义件不投放)。retired 行被引用=退役 + # 后仍投放(连带错误),同拦。 + var aux_live := {} + var aux_tab = loaded.get("aux_items") + if aux_tab != null: + for arow in aux_tab.active_rows(): + aux_live[String(arow.get("item_id", ""))] = true + for row in rt.rows: + if String(row.get("cell_type", "")) != RewardTable.AUX_ITEM_TYPE: + continue + var aux_eff: String = String(row.get("effect_id", "")) + if aux_eff == "": # 负占位行(雷格极性字典兜底,零兑付)——不入投放词表校验 + continue + if not aux_live.has(aux_eff): + push_diag("error", "reward_dangling_aux", "RewardTable %s aux 行引用无效道具 %s(retired/deferred/不存在): %s" % [row.get("reward_id"), aux_eff, "双表校验"]) + # ①c F2 投放维度覆盖(魔法道具 GDD——五维度各 ≥1 掉落权重为正的活行):豁免面 {plan, info, counter} + # = 罗盘退役(plan,2026-09-29 拍板①乙)+显影件 Alpha 重定(info/counter 悬置)——豁免随 Alpha 重定批消减 + if aux_tab != null: + var covered := {} + for row in rt.rows: + if String(row.get("cell_type", "")) != RewardTable.AUX_ITEM_TYPE or int(row.get("weight", 0)) <= 0: + continue + var arow: Dictionary = aux_tab.row_by_id(String(row.get("effect_id", ""))) + for tag in arow.get("dimension_tags", []): + covered[String(tag)] = true + var f2_exempt := {"plan": true, "info": true, "counter": true} # 豁免面(随 Alpha 重定/天赋批消减) + for d in AuxItemTable.DIMENSIONS: + if f2_exempt.has(d): + continue + if not covered.has(d): + push_diag("error", "dimension_coverage", "F2 投放维度覆盖缺 %s(豁免面外零活行投放)" % d) # ② SettlementTable.effect_pool_map 悬空 for eff in st_tab.effect_pool_map.keys(): if not effect_ids.has(eff): @@ -346,6 +383,24 @@ func status_effect_row(effect_id: String) -> Dictionary: # ---- GP+商店房实施批(2026-09-21):ShopTable 消费面(行集解析单点——runner/战斗编排禁自扫表)---- +# ── 魔法道具访问器(迭代 7 T1——消费面一律走访问器,禁直读行集)── +# 活行集(非 retired 非 deferred)——投放校验/奖励节点池/呈现可用性的唯一取数口径 +func aux_active_rows() -> Array: + return aux_items.active_rows() if aux_items != null else [] + + +func aux_item_row(item_id: String) -> Dictionary: + return aux_items.row_by_id(item_id) if aux_items != null else {} + + +# 活行词表(掉落投放 effect_id 白名单) +func aux_live_ids() -> Dictionary: + var out := {} + for row in aux_active_rows(): + out[String(row.get("item_id", ""))] = true + return out + + # 行族四轴(数据契约,行集归 shop.tres):gp_drops {tier, mean, roll_min, roll_max} · # level_gp_bonus {level_index, bonus} · products {product_id, display_name, attr, flat_value, # base_price, price_increment} · price_level_bonus {level_index, bonus}。 diff --git a/game/core/level_runner.gd b/game/core/level_runner.gd index 5bad590a..1f3deaac 100644 --- a/game/core/level_runner.gd +++ b/game/core/level_runner.gd @@ -62,6 +62,8 @@ var base_override := {"atk": 0, "max_hp": 0, "armor_class": 0} # 永久强化 var _shop_purchased := {} # product_id → 已购档数(现价重算输入;冒险开始清零) # 协作对象私有(E1/E3 封装收口 2026-09-13):settlement 读取经 current_battle() 成文出口 var _settlement = null # 当前战斗编排器(关卡结束置 null) +var aux_inventory = null # 魔法道具 关卡域库存(迭代 7 T3——AuxItems;跨战斗延续, + # 关卡末清空+快照计数入 level_finished 载荷) var hero_atk_pct := 0 # 测试面板覆盖值(切片专用) var hero_hp_pct := 0 @@ -364,6 +366,9 @@ func _enter_node(node: Dictionary) -> bool: func _start_battle(node: Dictionary) -> bool: _settlement = BattleOrchestrator.new(db, rng) + if aux_inventory == null: + aux_inventory = AuxItems.new(db) # 惰性建——关卡域单实例(跨战斗延续) + _settlement.aux_inventory = aux_inventory # 迭代 7 T3——库存注入(授予路由+use_aux 编排消费面) # core↔core 接线只许方法 Callable(ADR-0001 静态规则 S6——lambda 捕获 self 会延长 # RefCounted 生命周期乃至成环:settlement 的信号持捕获 runner 的 lambda,runner 又持 settlement) _settlement.step_row.connect(_forward_step_row) @@ -408,8 +413,13 @@ func _on_battle_finished(payload: Dictionary) -> void: close_wallet() # 单关模式:关卡收束即冒险收束(GP 清零);冒险模式归 AdventureRunner._settle _running = false _settlement = null + var aux_cleared := 0 + if aux_inventory != null: + aux_cleared = aux_inventory.inventory_count() # 快照计数(清空前——「剩余道具随关卡结束清空」可见反馈取数) + aux_inventory.reset() # 迭代 7 T3——关卡末库存清空(无论输赢,幂等) level_finished.emit({"result": level_result, "hp": hp_left, "node_index": node_index, - "node_id": _node_id(node), "node_type": String(node.get("type", ""))}) + "node_id": _node_id(node), "node_type": String(node.get("type", "")), + "aux_cleared": aux_cleared}) # additive 扩签(不参与派生——node_map 扩签先例) return # 接口漂移清偿(关卡节点地图 v1.0 ⑦):战斗胜利不再自动推进——确认后进选路口 _settlement = null diff --git a/game/data/schemas/aux_item_table.gd b/game/data/schemas/aux_item_table.gd new file mode 100644 index 00000000..0a2c4e2d --- /dev/null +++ b/game/data/schemas/aux_item_table.gd @@ -0,0 +1,109 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# Validation Question: 挖掘期撞上推理断头时,玩家能否从掉落池捡到魔法道具、在关键时刻花掉买回情报或行动点(P0) +# Date: 2026-09-29(迭代 7 T1 数据面——魔法道具内容批;设计权威 design/gdd/systems/排雷循环/魔法道具.md v0.4+ +# + registry aux_items 六行 mvp_content;2026-09-29 用户拍板:①乙 探宝罗盘退役留痕 ④甲 显影尘/地穴全图卷失义件 +# 六行全建零投放「已解锁·能力封存中」) +# 数据配置 AuxItemTable schema(魔法道具 回填 owner)。 +# 行 = Dictionary,键 item_id(Rule 4 豁免:定义表——registry aux_items Rule 4 豁免先例)。 +# 七字段(registry fields 全量):item_id 主键 / display_name / dimension_tags ⊆ 五维 非空 / +# effect_kinds ⊆ {mine_reveal, reward_preview, ap_grant}(活性校验见下)/ target ∈ {none, area_3x3, board_wide} / +# magnitude [0,999](仅 ap_grant 行消费,加载校验 ≥1)/ use_phase ∈ {active_dig}。 +# additive 两标记(迭代 7 T1——拍板①④的表内表达,非 registry fields 预登记字段的扩列随批登记): +# retired = 退役留痕行(loot_compass——未开格类型微光常显覆盖预读价值,2026-09-29 用户拍板退役; +# 行名保留=meta.tres workshop_items 六件词表恰全校验兼容,存档 item_unlocks 旧键无害; +# 免活性校验、不入投放校验、不入 F2 覆盖面、奖励节点/掉落池排除) +# deferred = 效果失义待重定行(probe_dust/catacomb_scroll——原显影半边随雾格移除失义,效果与目标 +# 随魔法道具整体重设计归 Alpha(2026-09-20 用户拍板);免 effect_kinds 非空校验、不入投放与 F2) +# 承重护栏(魔法道具 GDD §结构冻结,schema 校验强制不靠运行时拦截): +# 真视窄域——effect_kinds 含 mine_reveal 的活行 target 必须 area_3x3(真视一次最多 3×3,禁全图看雷); +# board_wide 仅恢复推理原料类——target=board_wide 的活行 effect_kinds 不得含 mine_reveal(现行无此类活行, +# 显影载体待 Alpha 重定后落位)。 +class_name AuxItemTable +extends Resource + +@export var rows: Array = [] # Array[Dictionary] 键 item_id + +const DIMENSIONS := ["info", "risk", "action", "plan", "counter"] +const EFFECT_KINDS := ["mine_reveal", "reward_preview", "ap_grant"] +const TARGETS := ["none", "area_3x3", "board_wide"] +const USE_PHASES := ["active_dig"] + + +func validate() -> Array: + var errs: Array = [] + if rows.is_empty(): + # 空表合法态(2026-09-17 用户拍板——切片期无道具内容;F2 覆盖检查仅对非空清单执行) + return errs + var seen := {} + for row in rows: + var iid: String = row.get("item_id", "") + if iid == "": + errs.append({"category": "domain", "message": "item_id 空"}) + continue + if seen.has(iid): + errs.append({"category": "dup_key", "message": "item_id 重复: %s" % iid}) + continue + seen[iid] = true + if String(row.get("display_name", "")) == "": + errs.append({"category": "domain", "message": "%s display_name 空" % iid}) + var retired: bool = bool(row.get("retired", false)) + var deferred: bool = bool(row.get("deferred", false)) + # dimension_tags:五维词表 + 非空(退役/失义行仍须登记维度——语义面保留) + var tags: Array = row.get("dimension_tags", []) + if tags.is_empty(): + errs.append({"category": "domain", "message": "%s dimension_tags 空" % iid}) + for tag in tags: + if not DIMENSIONS.has(String(tag)): + errs.append({"category": "enum", "message": "%s dimension_tag 出域 %s: %s" % [iid, str(DIMENSIONS), str(tag)]}) + var kinds: Array = row.get("effect_kinds", []) + var target: String = String(row.get("target", "none")) + if not TARGETS.has(target): + errs.append({"category": "enum", "message": "%s target 出域 %s: %s" % [iid, str(TARGETS), target]}) + var phase: String = String(row.get("use_phase", "active_dig")) + if not USE_PHASES.has(phase): + errs.append({"category": "enum", "message": "%s use_phase 出域 %s: %s" % [iid, str(USE_PHASES), phase]}) + if retired or deferred: + # 退役/失义行:免 effect_kinds 非空与承重护栏校验(登记面保留,不入投放与 F2) + continue + # ---- 活行校验 ---- + if kinds.is_empty(): + errs.append({"category": "domain", "message": "%s effect_kinds 空(活行;失义件应标 deferred)" % iid}) + var kind_seen := {} + for k in kinds: + var kind: String = String(k) + if not EFFECT_KINDS.has(kind): + errs.append({"category": "enum", "message": "%s effect_kind 出域 %s: %s" % [iid, str(EFFECT_KINDS), kind]}) + if kind_seen.has(kind): + errs.append({"category": "dup_key", "message": "%s effect_kind 重复: %s" % [iid, kind]}) + kind_seen[kind] = true + # 承重护栏①真视窄域:mine_reveal 活行 target 必须 area_3x3(一次最多 3×3,禁全图看雷) + if kind_seen.has("mine_reveal") and target != "area_3x3": + errs.append({"category": "load_bearing", "message": "%s 真视窄域护栏:mine_reveal 行 target 必须 area_3x3,实得 %s(魔法道具 GDD 结构冻结)" % [iid, target]}) + # 承重护栏②board_wide 仅恢复推理类:全图域行禁替推理效果 + if target == "board_wide" and kind_seen.has("mine_reveal"): + errs.append({"category": "load_bearing", "message": "%s board_wide 行 effect_kinds 不得含 mine_reveal(全图域仅恢复推理原料类——Alpha 重定后落位)" % iid}) + # magnitude:仅 ap_grant 行消费(≥1);非 ap_grant 活行恒 0 + var mag: int = int(row.get("magnitude", 0)) + if mag < 0 or mag > 999: + errs.append({"category": "domain", "message": "%s magnitude 越域 [0,999]: %d" % [iid, mag]}) + if kind_seen.has("ap_grant") and mag < 1: + errs.append({"category": "cross_field", "message": "%s ap_grant 行 magnitude 应 ≥1,实得 %d" % [iid, mag]}) + if not kind_seen.has("ap_grant") and mag != 0: + errs.append({"category": "cross_field", "message": "%s 非 ap_grant 活行 magnitude 应 0,实得 %d" % [iid, mag]}) + return errs + + +# 活行词表(非 retired 非 deferred)——投放校验/奖励节点池/F2 覆盖面的唯一取数口径 +func active_rows() -> Array: + var out: Array = [] + for row in rows: + if not bool(row.get("retired", false)) and not bool(row.get("deferred", false)): + out.append(row) + return out + + +func row_by_id(item_id: String) -> Dictionary: + for row in rows: + if String(row.get("item_id", "")) == item_id: + return row + return {} diff --git a/game/data/schemas/aux_item_table.gd.uid b/game/data/schemas/aux_item_table.gd.uid new file mode 100644 index 00000000..25ec1e91 --- /dev/null +++ b/game/data/schemas/aux_item_table.gd.uid @@ -0,0 +1 @@ +uid://dfhjthkhkvsbj diff --git a/game/data/schemas/reward_table.gd b/game/data/schemas/reward_table.gd index 6c887495..8fd6638f 100644 --- a/game/data/schemas/reward_table.gd +++ b/game/data/schemas/reward_table.gd @@ -12,7 +12,8 @@ extends Resource @export var rows: Array = [] # Array[Dictionary] -const CELL_TYPES := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action", "gp"] # 九型封闭(格面资源九型批 2026-09-20 八→九,词表 v1.1)——清单外加载拒绝 +const CELL_TYPES := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action", "gp", "aux_item"] # 十型(迭代 7 T1 魔法道具内容批扩值——registry aux_items 词表;aux 行 effect_id = item_id 双表校验键) +const AUX_ITEM_TYPE := "aux_item" # aux 行标识(掉落投放行:挖开→战斗结算 grant 路由关卡域库存,不入增益容器) const POLARITIES := ["positive", "negative"] const POOL_TAGS := ["cell", "clear_default"] # cell = 格面资源单一池;clear_ 命名空间预留拒绝 const CELL_TYPE_KEYS := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action", "gp"] # 字典完整性校验轴(类型 × 极性 = 十八格) @@ -43,7 +44,19 @@ func validate() -> Array: errs.append({"category": "enum", "message": "%s polarity 出域: %s" % [rid, pol]}) var atk_type: String = String(row.get("attack_type", "")) if atk_type != "" and not ["normal", "pierce", "magic"].has(atk_type): - errs.append({"category": "enum", "message": "%s attack_type 出域 {normal, pierce, magic}: %s" % [rid, atk_type]}) + errs.append({"category": "enum", "message": "%s attack_type 出域 {normal, pierce, magic}: %s" % [rid, atk_type]}) # aux 投放行专属校验(迭代 7 T1):极性恒正/加权入池/effect_id=item_id 非空(悬空在 config_db 跨表层 + # 对 aux_items 词表校验——reward_dangling_aux)/无 power 无区间(数值语义不复用,道具效果读 AuxItemTable) + if ctype == AUX_ITEM_TYPE: + # 负向行 = 雷格极性字典占位(雷安同池摇号下雷格可摇中 aux 身份——负路由零兑付兜底, + # effect_id 空/power 0/weight 0 不入池;2026-09-29 T1) + if pol == "negative": + if String(row.get("effect_id", "")) != "" or int(row.get("power", 0)) != 0 or int(row.get("weight", 0)) != 0: + errs.append({"category": "cross_field", "message": "%s aux 负占位行仅允许 空effect_id/0power/0weight" % rid}) + continue + if String(row.get("effect_id", "")) == "": + errs.append({"category": "domain", "message": "%s aux 正行 effect_id 空(应=item_id)" % rid}) + if int(row.get("power", 0)) != 0 or row.has("power_min"): + errs.append({"category": "cross_field", "message": "%s aux 正行禁 power/区间数值(道具数值读 AuxItemTable)" % rid}) var pool: String = row.get("pool_tag", "") var pool_reserved: bool = pool.begins_with("clear_") and pool != "clear_default" if not POOL_TAGS.has(pool) and not pool_reserved: diff --git a/game/data/tables/aux_items.tres b/game/data/tables/aux_items.tres new file mode 100644 index 00000000..0680fb0b --- /dev/null +++ b/game/data/tables/aux_items.tres @@ -0,0 +1,58 @@ +[gd_resource type="Resource" script_class="AuxItemTable" load_steps=2 format=3] + +[ext_resource type="Script" path="res://data/schemas/aux_item_table.gd" id="1"] + +[resource] +script = ExtResource("1") +rows = [{ +"item_id": "probe_dust", +"display_name": "显影尘", +"dimension_tags": ["info", "counter"], +"effect_kinds": [], +"target": "none", +"magnitude": 0, +"use_phase": "active_dig", +"deferred": true +}, { +"item_id": "sapper_order", +"display_name": "工兵令", +"dimension_tags": ["action"], +"effect_kinds": ["ap_grant"], +"target": "none", +"magnitude": 2, +"use_phase": "active_dig" +}, { +"item_id": "loot_compass", +"display_name": "探宝罗盘", +"dimension_tags": ["plan"], +"effect_kinds": ["reward_preview"], +"target": "area_3x3", +"magnitude": 0, +"use_phase": "active_dig", +"retired": true +}, { +"item_id": "nest_pendulum", +"display_name": "探巢摆钟", +"dimension_tags": ["risk"], +"effect_kinds": ["mine_reveal"], +"target": "area_3x3", +"magnitude": 0, +"use_phase": "active_dig" +}, { +"item_id": "catacomb_scroll", +"display_name": "地穴全图卷", +"dimension_tags": ["info", "plan"], +"effect_kinds": [], +"target": "board_wide", +"magnitude": 0, +"use_phase": "active_dig", +"deferred": true +}, { +"item_id": "blast_kit", +"display_name": "爆破工兵包", +"dimension_tags": ["action", "risk"], +"effect_kinds": ["ap_grant", "mine_reveal"], +"target": "area_3x3", +"magnitude": 4, +"use_phase": "active_dig" +}] diff --git a/game/data/tables/reward.tres b/game/data/tables/reward.tres index 304a7fde..26c82c89 100644 --- a/game/data/tables/reward.tres +++ b/game/data/tables/reward.tres @@ -200,6 +200,49 @@ rows = [{ "weight": 0, "pool_tag": "cell", "tier": 1 +}, { + +"reward_id": "aux_sapper_order", +"cell_type": "aux_item", +"polarity": "positive", +"effect_id": "sapper_order", +"display_name": "工兵令", +"power": 0, +"weight": 5, +"pool_tag": "cell", +"tier": 2 +}, { + +"reward_id": "aux_nest_pendulum", +"cell_type": "aux_item", +"polarity": "positive", +"effect_id": "nest_pendulum", +"display_name": "探巢摆钟", +"power": 0, +"weight": 4, +"pool_tag": "cell", +"tier": 2 +}, { + +"reward_id": "aux_blast_kit", +"cell_type": "aux_item", +"polarity": "positive", +"effect_id": "blast_kit", +"display_name": "爆破工兵包", +"power": 0, +"weight": 1, +"pool_tag": "cell", +"tier": 3 +}, { +"reward_id": "aux_none", +"cell_type": "aux_item", +"polarity": "negative", +"effect_id": "", +"display_name": "惊扰的遗落物", +"power": 0, +"weight": 0, +"pool_tag": "cell", +"tier": 1 }] ; 格面资源批(2026-09-15 用户拍板——registry reward_table 条目为现行 schema 事实源): diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 1bb5d022..bf235e97 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -2009,12 +2009,14 @@ func _smoke_negative_dictionary() -> void: # 行为面:逐型负向兑付形态(真实板 + 真实路由路径) # 数值压缩批(2026-09-17):heal 权重 15→3 后单板五型齐备不再必然(无 heal 板概率 ≈1/3)—— # 改多板扫描,取第一块五型齐备的板做行为断言。 - var rng = load("res://core/rng_service.gd").new() var settlement = null var board = null var by_type := {} # cell_type → 首个非封锁格(query_identity 雷安同池——雷格可查) var rows: Array = [] for seed_i in range(6): + # 每板独立 rng 实例(迭代 7 T1 修正——复用实例重播种触发 set_master_seed 的 _counter==0 守卫; + # 原版第一板即 break 掩盖了该违例,aux 供给挤占后多板扫描暴露) + var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(20260919 + seed_i) settlement = load("res://core/battle_orchestrator.gd").new(_db, rng) rows = [] @@ -2032,9 +2034,13 @@ func _smoke_negative_dictionary() -> void: if r0.has(c) or by_type.size() == 5: continue var ident = settlement.query_reward_identity(c) - if ident != null and not by_type.has(String(ident.cell_type)): + # aux 身份不入五型轴(魔法道具内容批 2026-09-29——五型齐备=格面资源历史断言轴, + # aux 供给挤占不改变本断言语义;扫描排除 aux 身份格) + if ident != null and String(ident.cell_type) != RewardTable.AUX_ITEM_TYPE and not by_type.has(String(ident.cell_type)): by_type[String(ident.cell_type)] = c - if by_type.size() == 5: + # break 条件=percent_map 三型齐备(迭代 7 T1——aux 供给挤占下 weaken/defense 收集时机漂移, + # 直验可达性优先;五型多样性 check 保留不动) + if by_type.has("attack") and by_type.has("defense") and by_type.has("weaken"): break check(by_type.size() == 5, "扫描 6 板内出现五型齐备板(%s)" % str(by_type.keys())) # attack/defense/weaken:负向字典行走 apply_effect(off_guard 2026-09-18 换装 ac 轴——兑付形态不变) @@ -3226,8 +3232,8 @@ func _all_entry_boss_paths(nodes: Array) -> Array: func _smoke_nine_types_gp_stream() -> void: print("--- 格面资源九型 + gp_drop 流(奖励字典 18 格 + 黄金向量)---") - check(RewardTable.CELL_TYPES.size() == 9 and RewardTable.CELL_TYPES.has("gp"), - "格面资源九型封闭(第九型 gp——九型批 2026-09-20,词表 v1.1)") + check(RewardTable.CELL_TYPES.size() == 10 and RewardTable.CELL_TYPES.has("gp") and RewardTable.CELL_TYPES.has("aux_item"), + "格面资源十型封闭(第九型 gp 九型批 2026-09-20 / 第十型 aux_item 魔法道具内容批 2026-09-29——词表 v1.2)") var cell_rows := 0 var pos_weight := 0 var gp_pos := -1 @@ -3241,7 +3247,7 @@ func _smoke_nine_types_gp_stream() -> void: gp_pos = int(row.weight) if String(row.get("reward_id", "")) == "gp_lose": gp_neg = int(row.weight) - check(cell_rows == 18, "奖励字典 18 格(九型 × 正负——清图槽 clear_default 独立批尾不计)") + check(cell_rows == 22, "奖励字典 22 行(九型×正负 18 格 + aux 正三投放/负一占位——魔法道具内容批 2026-09-29;清图槽独立批尾不计)") # 正向权重结构校验(配置推导,2026-09-23 重构):正向 cell 行权重 ≥1(必在池)、负向行权重恒 0(不入池)、 # 合计即配置自身的和(改表自动跟随,不再硬编码合计值)。 var pos_all_in_pool := true diff --git a/game/tests/run_all.gd b/game/tests/run_all.gd index 73392664..5afadfaa 100644 --- a/game/tests/run_all.gd +++ b/game/tests/run_all.gd @@ -29,6 +29,8 @@ func _suites() -> Array: {"path": "res://tests/unit/example_test.gd", "expect": 0}, {"path": "res://tests/unit/data_config/config_db_test.gd", "expect": 0}, {"path": "res://tests/unit/data_config/config_db_fatal_oob_test.gd", "expect": 1}, + {"path": "res://tests/unit/data_config/aux_target_violation_test.gd", "expect": 1}, # 迭代 7 T1——真视窄域护栏 + {"path": "res://tests/unit/data_config/reward_dangling_aux_test.gd", "expect": 1}, # 迭代 7 T1——aux 双表校验 {"path": "res://tests/unit/data_config/rng_service_test.gd", "expect": 0}, {"path": "res://tests/unit/battle_settlement/damage_math_test.gd", "expect": 0}, {"path": "res://tests/unit/battle_settlement/damage_controller_test.gd", "expect": 0}, diff --git a/game/tests/unit/data_config/aux_target_violation_test.gd b/game/tests/unit/data_config/aux_target_violation_test.gd new file mode 100644 index 00000000..f06c0251 --- /dev/null +++ b/game/tests/unit/data_config/aux_target_violation_test.gd @@ -0,0 +1,76 @@ +# 致命类用例(独立进程,期望退出码 1) +# aux_target_violation——真视窄域护栏(魔法道具 GDD 结构冻结,迭代 7 T1):mine_reveal 行 target +# 越域至 board_wide 时,AuxItemTable.validate 必须报 load_bearing 错、load_tables 整体拒绝。 +# 运行:godot --headless --path game --script res://tests/unit/data_config/aux_target_violation_test.gd +# 退出码协议:1 = 校验正确拒绝(预期);2 = 违规表被放行(回归信号)。 +# 时序注:纯加载期校验——不触运行期 fatal 通道,断言 load_tables 返回 false + 诊断在案即 quit(1)。 +extends SceneTree + +const ConfigDBScript := preload("res://core/config_db.gd") + +const SRC_DIR := "res://data/tables" +const BAD_DIR := "user://aux_fixture_target_violation" + + +func _copy_tables() -> bool: + DirAccess.make_dir_recursive_absolute(BAD_DIR) + var dir := DirAccess.open(SRC_DIR) + if dir == null: + return false + dir.list_dir_begin() + var f := dir.get_next() + while f != "": + if not dir.current_is_dir(): + var err := dir.copy(SRC_DIR + "/" + f, BAD_DIR + "/" + f) + if err != OK: + return false + f = dir.get_next() + return true + + +func _inject_violation() -> bool: + var path := BAD_DIR + "/aux_items.tres" + var f := FileAccess.open(path, FileAccess.READ) + if f == null: + return false + var s := f.get_as_text() + f.close() + # 探巢摆钟(mine_reveal 活行)target area_3x3 → board_wide:双护栏同时命中 + var bad := s.replace('"item_id": "nest_pendulum",\r\n"display_name": "探巢摆钟",', '"item_id": "nest_pendulum",\r\n"display_name": "探巢摆钟",') + if bad == s: + # 换行形态回退(LF) + bad = s.replace('"item_id": "nest_pendulum",\n"display_name": "探巢摆钟",', '"item_id": "nest_pendulum",\n"display_name": "探巢摆钟",') + # 直接改 target:摆钟行是全表唯一的 mine_reveal 单维行——把它的 area_3x3 改 board_wide + # (罗盘 retired 行同值 area_3x3 但 retired 免校验——替换须定位摆钟块内) + var blocks := s.split("}, {") + var hit := false + for i in blocks.size(): + if '"item_id": "nest_pendulum"' in blocks[i]: + blocks[i] = blocks[i].replace('"target": "area_3x3"', '"target": "board_wide"') + hit = true + s = "}, {".join(blocks) + var w := FileAccess.open(path, FileAccess.WRITE) + if w == null or not hit: + return false + w.store_string(s) + w.close() + return true + + +func _init() -> void: + if not _copy_tables() or not _inject_violation(): + push_error("[aux_target_violation_test] 夹具目录准备失败") + quit(2) + return + var db = ConfigDBScript.new() + var ok: bool = db.load_tables(BAD_DIR, false) + if ok: + push_error("[aux_target_violation_test] 违规表被放行——真视窄域护栏失守(回归)") + quit(2) + return + if db.diagnostics_count("error") >= 1: + print("[aux_target_violation_test] 护栏触发(load_bearing 诊断在案,加载被拒)") + quit(1) + return + push_error("[aux_target_violation_test] 加载被拒但无 load_bearing 诊断——护栏通道静默化(回归)") + quit(2) diff --git a/game/tests/unit/data_config/aux_target_violation_test.gd.uid b/game/tests/unit/data_config/aux_target_violation_test.gd.uid new file mode 100644 index 00000000..da2e8b56 --- /dev/null +++ b/game/tests/unit/data_config/aux_target_violation_test.gd.uid @@ -0,0 +1 @@ +uid://c2ufdoduixynq diff --git a/game/tests/unit/data_config/reward_dangling_aux_test.gd b/game/tests/unit/data_config/reward_dangling_aux_test.gd new file mode 100644 index 00000000..a62a35e0 --- /dev/null +++ b/game/tests/unit/data_config/reward_dangling_aux_test.gd @@ -0,0 +1,69 @@ +# 致命类用例(独立进程,期望退出码 1) +# reward_dangling_aux——RewardTable aux 投放行双表校验(迭代 7 T1):aux 行 effect_id 引用 retired +# 道具(loot_compass——2026-09-29 拍板①乙退役)时,config_db 跨表校验必须报 reward_dangling_aux、 +# load_tables 整体拒绝(退役件/失义件不得出现在掉落投放面)。 +# 运行:godot --headless --path game --script res://tests/unit/data_config/reward_dangling_aux_test.gd +# 退出码协议:1 = 校验正确拒绝(预期);2 = 违规表被放行(回归信号)。 +extends SceneTree + +const ConfigDBScript := preload("res://core/config_db.gd") + +const SRC_DIR := "res://data/tables" +const BAD_DIR := "user://aux_fixture_dangling_aux" + + +func _copy_tables() -> bool: + DirAccess.make_dir_recursive_absolute(BAD_DIR) + var dir := DirAccess.open(SRC_DIR) + if dir == null: + return false + dir.list_dir_begin() + var f := dir.get_next() + while f != "": + if not dir.current_is_dir(): + if dir.copy(SRC_DIR + "/" + f, BAD_DIR + "/" + f) != OK: + return false + f = dir.get_next() + return true + + +func _inject_violation() -> bool: + var path := BAD_DIR + "/reward.tres" + var f := FileAccess.open(path, FileAccess.READ) + if f == null: + return false + var s := f.get_as_text() + f.close() + # 工兵令投放行 → 引用已退役的 loot_compass:双表校验须拦(retired 不入投放面) + var blocks: PackedStringArray = s.split("}, {") + var hit := false + for i in blocks.size(): + if '"reward_id": "aux_sapper_order"' in blocks[i]: + blocks[i] = blocks[i].replace('"effect_id": "sapper_order"', '"effect_id": "loot_compass"') + hit = true + s = "}, {".join(blocks) + var w := FileAccess.open(path, FileAccess.WRITE) + if w == null or not hit: + return false + w.store_string(s) + w.close() + return true + + +func _init() -> void: + if not _copy_tables() or not _inject_violation(): + push_error("[reward_dangling_aux_test] 夹具目录准备失败") + quit(2) + return + var db = ConfigDBScript.new() + var ok: bool = db.load_tables(BAD_DIR, false) + if ok: + push_error("[reward_dangling_aux_test] 违规表被放行——aux 双表校验失守(回归)") + quit(2) + return + if db.diagnostics_count("error") >= 1: + print("[reward_dangling_aux_test] 双表校验触发(reward_dangling_aux 诊断在案,加载被拒)") + quit(1) + return + push_error("[reward_dangling_aux_test] 加载被拒但无 reward_dangling_aux 诊断——校验通道静默化(回归)") + quit(2) diff --git a/game/tests/unit/data_config/reward_dangling_aux_test.gd.uid b/game/tests/unit/data_config/reward_dangling_aux_test.gd.uid new file mode 100644 index 00000000..074124ec --- /dev/null +++ b/game/tests/unit/data_config/reward_dangling_aux_test.gd.uid @@ -0,0 +1 @@ +uid://c0hyi6tlsne3y From 2f3a87e98f75ea39ba1c63c6db91fc8b79ff5ada Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 29 Sep 2026 07:21:58 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat(t4):=20=E9=AD=94=E6=B3=95=E9=81=93?= =?UTF-8?q?=E5=85=B7=20HUD=20=E9=9D=A2=E2=80=94=E2=80=94C=20=E5=8C=BA?= =?UTF-8?q?=E5=9B=9B=E6=A7=BD=E6=8E=A5=E7=BA=BF+=E4=B8=A4=E6=AD=A5?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=BA=A4=E4=BA=92+=E5=8F=A0=E5=8A=A0?= =?UTF-8?q?=E5=B1=82=E5=91=88=E7=8E=B0+=E6=B8=85=E7=A9=BA=E5=8F=8D?= =?UTF-8?q?=E9=A6=88=20=E2=91=A0hero=5Finfo=5Fpanel:=E5=9B=9B=E6=A7=BD=20g?= =?UTF-8?q?ui=5Finput=20=E5=8F=AF=E7=82=B9+aux=5Fslot=5Fclicked=20?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7+set=5Faux=5Finventory=20=E6=8A=95=E5=BD=B1?= =?UTF-8?q?=E6=B8=B2=E6=9F=93(=E7=A9=BA=E6=A7=BD=E8=99=9A=E4=BD=8D/used=20?= =?UTF-8?q?=E6=9A=97=E6=80=81/=E4=B8=8D=E5=8F=AF=E7=94=A8=E7=BD=AE?= =?UTF-8?q?=E7=81=B0/=E9=80=89=E4=B8=AD=E9=87=91=E6=A1=86/tooltip=20?= =?UTF-8?q?=E5=85=A8=E5=90=8D+=E8=AF=AD=E4=B9=89)=20=E2=91=A1main:?= =?UTF-8?q?=E9=80=89=E4=B8=AD=E6=80=81=20=5Faux=5Fuse=5Fselection+?= =?UTF-8?q?=E6=A7=BD=E7=82=B9=E5=87=BB(AP=20=E7=B1=BB=20target=3Dnone=20?= =?UTF-8?q?=E5=8D=B3=E7=94=A8/=E7=A9=BA=E9=97=B4=E7=B1=BB=20toggle=20?= =?UTF-8?q?=E9=80=89=E4=B8=AD)+=5Fon=5Fboard=5Faction=20dig=20=E5=8A=AB?= =?UTF-8?q?=E6=8C=81(=E9=80=89=E4=B8=AD=E6=9C=9F=E7=82=B9=E6=A0=BC=3D?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E6=8B=BE=E5=8F=96=E4=B8=8D=E8=90=BD=E6=8C=96?= =?UTF-8?q?=E6=A0=BC;move/flag=20=E4=B8=8D=E5=86=B2=E7=AA=81)+=5Fattempt?= =?UTF-8?q?=5Faux=5Fuse(=E6=8B=92=E7=BB=9D=E9=9B=B6=E6=B6=88=E8=80=97=20to?= =?UTF-8?q?ast=20=E5=8F=AF=E8=BE=A8=E8=AE=A4)+=5Faux=5Finventory=5Fproject?= =?UTF-8?q?ion(=E5=AD=97=E5=BD=A2=3D=E5=90=8D=E9=A6=96=E5=AD=97;usable=20?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=8E=A5=E6=8E=92=E9=9B=B7=E7=8E=A9=E6=B3=95?= =?UTF-8?q?=E5=8F=AA=E8=AF=BB=E9=9D=A2)+use=20=E6=88=90=E5=8A=9F=E5=90=8E?= =?UTF-8?q?=E6=A7=BD=E4=BD=8D/=E5=8F=A0=E5=8A=A0=E5=B1=82=E5=8F=8C?= =?UTF-8?q?=E5=88=B7+=5Fon=5Fboard=5Faction=20=E8=A1=8C=E5=B0=BE=E6=A7=BD?= =?UTF-8?q?=E4=BD=8D=E9=87=8D=E6=9F=A5(=E6=8E=88=E4=BA=88=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E8=B5=B0=E5=AE=8C)=20=E2=91=A2=E5=8F=A0=E5=8A=A0?= =?UTF-8?q?=E5=B1=82=E5=91=88=E7=8E=B0:CellUnit.aux=5Fmark(=E7=9C=9F?= =?UTF-8?q?=E8=A7=86=3D=E5=8D=B1=E9=99=A9=E7=BA=A2=E5=86=85=E7=BC=A9?= =?UTF-8?q?=E6=A1=86)+board=5Fview.set=5Faux=5Foverlays=20=E6=8A=95?= =?UTF-8?q?=E5=BD=B1=E6=B3=A8=E5=85=A5(refresh=20=E6=B6=88=E8=B4=B9;?= =?UTF-8?q?=E9=A2=84=E8=AF=BB=E6=A0=BC=3Dbadge=5Fglyph=20=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=20REWARD=5FBADGE=20=E5=AD=97=E5=BD=A2=E8=B5=B0=20iden?= =?UTF-8?q?tity=5Fresolver=20=E6=97=A2=E6=9C=89=E5=8F=AA=E8=AF=BB=E9=9D=A2?= =?UTF-8?q?=E9=9B=B6=E6=95=B0=E6=8D=AE=E5=A4=8D=E5=88=B6;=E6=97=97?= =?UTF-8?q?=E6=A0=BC=E8=AE=A9=E4=BD=8D=E4=B8=8D=E6=B3=A8)=20=E2=91=A3?= =?UTF-8?q?=E6=B8=85=E7=A9=BA=E5=8F=8D=E9=A6=88:LevelRunner=20aux=5Fcleare?= =?UTF-8?q?d=20=E5=BF=AB=E7=85=A7(payload=20=E5=B7=B2=E6=9C=89=20T3)?= =?UTF-8?q?=E2=86=92AdventureRunner=20additive=20=E6=89=A9=E7=AD=BE(big=5F?= =?UTF-8?q?reward=5Fpaid.aux=5Fcleared/summary.aux=5Fcleared=5Flast,=5Flas?= =?UTF-8?q?t=5Faux=5Fcleared=20=E6=8D=95=E8=8E=B7)=E2=86=92main=20?= =?UTF-8?q?=E5=A4=A7=E5=A5=96=E5=8A=B1=E5=B1=8F=20toast=E3=80=8C=E4=B8=8A?= =?UTF-8?q?=E5=85=B3=E5=89=A9=E4=BD=99=20N=20=E4=BB=B6=E9=AD=94=E6=B3=95?= =?UTF-8?q?=E9=81=93=E5=85=B7=E5=B7=B2=E9=9A=8F=E5=85=B3=E5=8D=A1=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E6=B8=85=E7=A9=BA=E3=80=8D=20=E9=97=B8:=E5=86=92?= =?UTF-8?q?=E7=83=9F=20577/0+=E4=B8=89=E6=8E=A2=E9=92=88=20PASS;T()=20?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E7=97=85=E7=B4=AF=E8=AE=A1=E5=85=AB=E5=A4=84?= =?UTF-8?q?=E5=85=A8=E8=87=AA=E6=84=88(board=5Fview=20=E6=B7=B7=E8=A1=8C?= =?UTF-8?q?=E5=B0=BE=E5=BD=92=E4=B8=80=20LF/adventure=5Frunner=20=5Ffirst?= =?UTF-8?q?=5Fscript=20=E9=87=8D=E5=A4=8D=E5=A3=B0=E6=98=8E=E5=8E=BB?= =?UTF-8?q?=E9=87=8D/=E4=B8=A4=20var=20=E6=8B=BC=E6=8E=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/adventure_runner.gd | 4 + game/presentation/main.gd | 96 +++++++++++++++++++ game/presentation/views/board_cell_unit.gd | 15 ++- game/presentation/views/board_view.gd | 22 +++++ .../views/hero_info_panel_view.gd | 50 +++++++++- 5 files changed, 184 insertions(+), 3 deletions(-) diff --git a/game/core/adventure_runner.gd b/game/core/adventure_runner.gd index 2f267235..1a629109 100644 --- a/game/core/adventure_runner.gd +++ b/game/core/adventure_runner.gd @@ -64,6 +64,7 @@ var _last_level_payload := {} # 最近一次关卡结束载荷(失 var _override := [0, 0] # TunePanel 百分比通道 [atk_pct, hp_pct](每关新 runner 都要应用) var _base_override := {"atk": 0, "max_hp": 0, "armor_class": 0} var _first_script := false # 首次脚本模式(关卡节点图生成 v0.4——true = 全关零抽签取池内模板 0;测量夹具恒 false) # 永久强化 flat 注入(元进度实现批——冒险开始参数面 params.hero_override 存入,共享给 LevelRunner;全零 = 白板) +var _last_aux_cleared := 0 # additive(迭代 7 T4——最近一次关卡末清空计数,summary 取数面) func _init(db_ref, rng_ref) -> void: @@ -188,6 +189,7 @@ func _on_level_finished(payload: Dictionary) -> void: if result != "victory": push_error("[冒险结构] 关卡结束结果出域: %s" % result) return + _last_aux_cleared = int(payload.get("aux_cleared", 0)) # additive(迭代 7 T4——末关 summary 取数面) if level_index < levels_total: # 大奖励(非末关通关恰一次):上限提升写加算区 → 血回满 = 新上限 → 钥石入账(顺序即契约) var hp_bonus: int = int(db.adventure.level_clear_hp_bonus) @@ -202,6 +204,7 @@ func _on_level_finished(payload: Dictionary) -> void: "new_max_hp": int(db.hero.max_hp) + int(_base_override["max_hp"]) + int(bonus["max_hp"]), "keystone_gained": int(db.adventure.keystone_per_level), "keystone_total": keystone, + "aux_cleared": int(payload.get("aux_cleared", 0)), # additive 扩签(迭代 7 T4——关卡末清空反馈取数) }) return # 末关通关:钥石照记、不发上限提升(没有下一战可受益)——冒险完成结算 @@ -218,6 +221,7 @@ func _settle(result: String) -> void: "stopped_at": 0 if result == "completed" else level_index, "keystone_total": keystone, "master_seed": master_seed, + "aux_cleared_last": _last_aux_cleared, # additive 扩签(迭代 7 T4——末关清空反馈;非末关走 big_reward 载荷) } # 败退明细(数值验证工具取数面 2026-09-22——tools/balance_verifier.py 止步节点分布数据源; # 仅失败局附加,键缺省 = 未败退,既有五件事消费方零感知) diff --git a/game/presentation/main.gd b/game/presentation/main.gd index 32392a7a..f1db2415 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -67,6 +67,7 @@ var shop_overlay: ShopOverlay # 商店覆盖层(GP+商店房实施 var _adventure_gp_view := 0 # GP 冒险钱包呈现侧影子(迭代 6 T7——终局面板 GP 行取数面, # wallet_changed gain/buy 载荷=入账后总额 level_runner.gd:482/539) var _adventure_gp_final := 0 # 收束清零拍暂存的最终合计("clear" 到达时自影子转存) +var _aux_use_selection := 0 # 魔法道具选中句柄(迭代 7 T4——0=未选中;选中期棋盘点击=使用目标拾取) var camp_overlay: CampOverlay # 营地覆盖层(元进度实现批——主菜单营地入口兑付呈现) var tune_panel: TunePanel @@ -115,6 +116,7 @@ func _build_ui() -> void: settlement_fx = battle_ui.settlement_fx log_view.review_requested.connect(_open_review_from_band) board_zone.action_requested.connect(_on_board_action) + info_panel.aux_slot_clicked.connect(_on_aux_slot_clicked) # 迭代 7 T4——两步交互第一步 board_zone.stop_pressed.connect(_on_stop_pressed) board_zone.refresh_confirmed.connect(_on_refresh_confirmed) board_zone.legend_toggled.connect(_on_legend_toggled) @@ -304,6 +306,8 @@ func _on_runner_node(node: Dictionary, info: Dictionary) -> void: # 大奖励兑付(非末关通关恰一次):复用 _inter_overlay(label + 确认按钮,零新增交互范式); # 文案装配归 Narrator func _on_big_reward(reward: Dictionary) -> void: + if int(reward.get("aux_cleared", 0)) > 0: + board_zone.toast.show_toast("上关剩余 %d 件魔法道具已随关卡结束清空" % int(reward.get("aux_cleared", 0)), "info") # 迭代 7 T4 清空反馈 _inter_label.text = Narrator.big_reward_text(reward) _inter_overlay.visible = true _refresh_presentations() @@ -722,6 +726,91 @@ func _on_shop_leave() -> void: runner.continue_after_node() +# ---- 魔法道具 HUD 接线(迭代 7 T4——库存条+两步交互+叠加层呈现;数据源=runner 级库存只读面)---- + +# 槽点击(第一步):AP 类(target=none)点击即用(无目标);空间类进/出选中态(toggle 取消)。 +func _on_aux_slot_clicked(slot_handle: int) -> void: + if settlement == null or runner == null or runner.aux_inventory == null: + return + if slot_handle == 0: + _aux_use_selection = 0 + _refresh_aux_slots() + return + var rec: Dictionary = {} + for r in _aux_inventory_projection(): + if int(r.get("handle", 0)) == slot_handle: + rec = r + break + if rec.is_empty() or bool(rec.get("used", false)): + return + var arow: Dictionary = db.aux_item_row(String(rec.get("item_id", ""))) + if String(arow.get("target", "none")) == "none": + _attempt_aux_use(slot_handle, Vector2i(-9, -9)) # AP 类:无目标即用 + return + if not bool(rec.get("usable", true)): + board_zone.toast.show_toast("当前无可预读的未开格", "warn") + return + _aux_use_selection = 0 if _aux_use_selection == slot_handle else slot_handle # toggle 取消 + _refresh_aux_slots() + if _aux_use_selection != 0: + board_zone.toast.show_toast("%s:点击目标格使用(9 宫窗口),再点道具取消" % String(rec.get("name", "")), "info") + + +# 使用受理(第二步;core 侧 use_aux 四步编排——拒绝零消耗 toast 可辨认) +func _attempt_aux_use(handle: int, cell: Vector2i) -> void: + if settlement == null: + return + var v: Dictionary = settlement.use_aux(handle, cell) + if not bool(v.ok): + board_zone.toast.show_toast(String(v.get("reason", "无法使用")), "warn") + return + _aux_use_selection = 0 + _refresh_aux_slots() + _refresh_aux_overlays() + var arow: Dictionary = db.aux_item_row(String(v.get("item_id", ""))) + board_zone.toast.show_toast("已使用 %s" % String(arow.get("display_name", "")), "info") + + +# 库存投影(C 区四槽取数面——字形=名首字;usable=板级零信息预判回调接排雷玩法只读面) +func _aux_inventory_projection() -> Array: + if runner == null or runner.aux_inventory == null: + return [] + var ms = settlement.minesweeper if settlement != null else null + var cb := Callable() + if ms != null: + cb = func(_c: Vector2i) -> bool: + for y in ms.current_board().height: + for x in ms.current_board().width: + if not ms.is_revealed(Vector2i(x, y)): + return true + return false + var out: Array = [] + for rec in runner.aux_inventory.query_inventory(cb): + var arow: Dictionary = db.aux_item_row(String(rec.get("item_id", ""))) + var dn := String(arow.get("display_name", "")) + out.append({ + "handle": int(rec.get("handle", 0)), + "item_id": String(rec.get("item_id", "")), + "glyph": dn.left(1) if dn != "" else "?", + "name": dn, + "used": bool(rec.get("used", false)), + "usable": bool(rec.get("usable", true)), + }) + return out + + +func _refresh_aux_slots() -> void: + info_panel.set_aux_inventory(_aux_inventory_projection(), _aux_use_selection) + + +# 叠加层投影注入(use 成功/三清后——棋盘标记与预读徽章重算) +func _refresh_aux_overlays() -> void: + if runner == null or runner.aux_inventory == null or board_view == null: + return + var ov: Dictionary = runner.aux_inventory.query_overlays() + board_view.set_aux_overlays(ov.get("mine_reveal", []), ov.get("reward_preview", [])) + + func _on_wallet_changed(event: String, gp: int, extra: Dictionary) -> void: # wallet 行族转发(到账/购买/清零——试玩日志验收取数面)+ 常驻余额与在开商店覆盖层重刷 logger.log_wallet(event, gp, extra) @@ -742,9 +831,16 @@ func _on_board_action(cell: Vector2i, kind: String) -> void: # 玩家动作 → 核心写调用的唯一通道(模态/无战斗拒绝在此收口) if _input_locked(): return + # 魔法道具选中态劫持(迭代 7 T4——两步交互第二步):点格=使用目标拾取,不落挖格; + # 只劫持挖掘点击(move/flag 语义不冲突——选中期玩家仍可移动/插旗) + if _aux_use_selection != 0 and kind == "dig": + _attempt_aux_use(_aux_use_selection, cell) + return var outcomes: Array = settlement.minesweeper.settle_batch([{"action": kind, "cell": cell}]) var accepted: bool = not outcomes.is_empty() and bool(outcomes[0].accepted) logger.log_action(kind, cell, accepted) + if runner != null and runner.aux_inventory != null: + _refresh_aux_slots() # 迭代 7 T4——授予发生在 settle_batch 结算段内(同步走完,行尾重查) _handle_outcome_feedback(outcomes[0] if not outcomes.is_empty() else {}) # settle_batch 内部同步走完 结算→战斗结束→关卡推进(事件同步发射)——关卡终局时 settlement 已被 # runner 置空,清图演出判定须先判 settlement(基线既有重入隐患,2026-09-13 加固) diff --git a/game/presentation/views/board_cell_unit.gd b/game/presentation/views/board_cell_unit.gd index 73b94543..5edc1480 100644 --- a/game/presentation/views/board_cell_unit.gd +++ b/game/presentation/views/board_cell_unit.gd @@ -82,7 +82,15 @@ var tex_flag: Texture2D = null # ④ 旗 # 变异角标(迭代 6 T6——程序化,tex_mutation 纹带槽留给变异纹带六型自产批): # "flat_damage" = 未开格伤害型变异,左下角危险红三角(开格有代价的策略纹理标记) -var mutation_mark := "": +# 叠加层标记(迭代 7 T4——魔法道具板级叠加层的格面呈现;派生信息层零回写): +# "mine_reveal" = 真视格(危险红内缩框——「这格是雷」的确定决策标记,插旗照常计费); +# "reward_preview" 格不复用本字段——预读徽章走 badge_glyph 注入(board_view refresh 注入 REWARD_BADGE 字形) +var aux_mark := "": + set(v): + if aux_mark != v: + aux_mark = v + queue_redraw() +var mutation_mark := ":": set(v): if mutation_mark != v: mutation_mark = v @@ -175,6 +183,11 @@ func _draw() -> void: draw_texture_rect(tex_mutation, rect, false) # ②' 变异角标(迭代 6 T6):左下角危险红三角(危险红=「开此格有代价」语义位,与雷族同源; # 尺寸随格边比例——灰色可辨辅助=红对砖面明度差,禁喧宾) + # ②" 魔法道具叠加层(迭代 7 T4):真视格=危险红内缩框(策略纹理——确定决策输入不喧宾) + if aux_mark == "mine_reveal": + var inset := edge * 0.14 + draw_rect(Rect2(inset, inset, edge - inset * 2.0, edge - inset * 2.0), + Color(UiKit.RED_MINE, 0.9), false, 2.0) if mutation_mark == "flat_damage": var mw := edge * 0.28 var mpts := PackedVector2Array([Vector2(0, edge - mw), Vector2(0, edge), Vector2(mw, edge)]) diff --git a/game/presentation/views/board_view.gd b/game/presentation/views/board_view.gd index 976b5b52..72476679 100644 --- a/game/presentation/views/board_view.gd +++ b/game/presentation/views/board_view.gd @@ -98,6 +98,8 @@ var _minesweeper = null # 排雷玩法 只读查询引用(refresh var _identity_cb := Callable() # 地图战斗资源 身份解析回调(组合根注入只读面)——Vector2i → Dictionary/null var _mask_cb := Callable() # 地形变异 数字遮蔽回调(组合根注入只读面)——Vector2i → bool(true = 该格数字不显示) var _vmark_cb := Callable() # 地形变异 角标回调(迭代 6 T6 只读面)——Vector2i → String("flat_damage"=伤害型变异未开格;""=无) +var _aux_reveal := {} # 魔法道具 真视集(迭代 7 T4——Vector2i → true;组合根 set_aux_overlays 注入投影) +var _aux_preview := {} # 魔法道具 预读集(同上——未开格徽章呈现挂点) var _diggable := {} # 可挖域(8 向相邻未开格)——呼吸微光作用集 var _breath_t := 0.0 var _contact_unit: Node2D = null # 接触带承载单元(=英雄格 CellUnit;rebuild 随清场复位) @@ -193,6 +195,16 @@ func set_variant_mask_resolver(cb: Callable) -> void: func set_variant_mark_resolver(cb: Callable) -> void: _vmark_cb = cb +# 魔法道具叠加层投影注入(迭代 7 T4——组合根在 use 成功/三清后调;refresh 消费) +func set_aux_overlays(reveal_cells: Array, preview_cells: Array) -> void: + _aux_reveal.clear() + _aux_preview.clear() + for c in reveal_cells: + _aux_reveal[Vector2i(c)] = true + for c in preview_cells: + _aux_preview[Vector2i(c)] = true + refresh() + # SubViewport 主题/字体显式注入挂点(Phase B 两舞台复用——SubViewport 不自动继承主场景 Control 主题; # 本项目无自定义主题,缺省 = 引擎回退字体,与旧 Button 渲染同源) @@ -722,6 +734,16 @@ func _paint_cell(c: Vector2i, hero: Vector2i) -> void: # 地面投影:北邻墙格在本已开格北缘投渐隐暗带(ITB 同款高度线索——带宽按格边比例常量) if north_in and not _minesweeper.is_revealed(north_n): u.proj_band = u.edge * WALL_PROJECTION_FRAC + # ②( 魔法道具叠加层(迭代 7 T4):真视格=红内缩框;预读格=奖励身份徽章(identity_resolver 既有 + # 只读面取字形——零数据复制,badge 位复用);已开格标记自然退位(refresh 逐拍重算) + if not revealed: + u.aux_mark = "mine_reveal" if _aux_reveal.has(c) else "" + if _aux_preview.has(c) and glyph == "": + var pid = _identity_cb.call(c) if _identity_cb.is_valid() else null + if pid != null and REWARD_BADGE.has(String(pid.get("cell_type", ""))): + glyph = String(REWARD_BADGE[String(pid.get("cell_type", ""))]) + digit_col = COL_GOLD + u.badge_glyph = glyph # ②' 变异角标(迭代 6 T6):未开格带伤害型变异 → 危险红角标(已开=威胁已兑现标记退位); # 回调缺位 = 无标记(程序化角标,tex_mutation 纹带槽留给变异纹带自产批) if not revealed and _vmark_cb.is_valid(): diff --git a/game/presentation/views/hero_info_panel_view.gd b/game/presentation/views/hero_info_panel_view.gd index 9ec21b94..b25159ce 100644 --- a/game/presentation/views/hero_info_panel_view.gd +++ b/game/presentation/views/hero_info_panel_view.gd @@ -14,7 +14,11 @@ const COL_INK := UiKit.INK var _atk_label: Label var _armor_label: Label -var item_slots: HBoxContainer # 魔法道具槽(预留——4 空槽占位;数量/交互形态待魔法道具批定稿) +signal aux_slot_clicked(handle: int) # 迭代 7 T4——槽点击(组合根消费:AP 类即用/空间类进选中态) +var item_slots: HBoxContainer # 魔法道具槽(迭代 7 T4 接线——库存条常读+两步交互第一步) +var _slot_panels: Array = [] # 槽 PanelContainer 引用(选中高亮/置灰重刷) +var _selected_handle := 0 # 选中态(0=无;组合根回写维持单源) +var _slot_handles: Array = [] # 槽位→handle 映射(set_aux_inventory 刷新) var _bonus_section: VBoxContainer # 本关强化(预留——空态隐藏,接线归大奖励/锻造呈现批) var _bonus_list: VBoxContainer @@ -54,8 +58,13 @@ func _init() -> void: slot.custom_minimum_size = Vector2(48, 48) slot.add_theme_stylebox_override("panel", UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER, 0, 1, Vector4(4, 4, 4, 4))) - slot.mouse_filter = Control.MOUSE_FILTER_IGNORE + var idx := i + slot.gui_input.connect(func(ev: InputEvent): + if ev is InputEventMouseButton and ev.pressed and ev.button_index == MOUSE_BUTTON_LEFT: + # 空槽/越界槽点击=取消选中(handle 0);有效槽发其 handle(组合根判 AP 即用/进选中态) + aux_slot_clicked.emit(_slot_handles[idx] if idx < _slot_handles.size() else 0)) item_slots.add_child(slot) + _slot_panels.append(slot) # 本关强化(预留):锻造/大奖励/关卡奖励节点的属性提升——中循环数据因改变战斗数学准入; # 与战斗内状态效果(B 区站桩,随战斗消散)分区,防「战斗结束被清」误读;空态整节隐藏 @@ -110,3 +119,40 @@ func _data_line() -> Label: l.clip_text = true l.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS return l + +# ---- 魔法道具库存条(迭代 7 T4——C 区四槽常读+两步交互第一步)---- +# 投影行 = {handle, glyph, name, used, usable}(组合根组装:字形=道具名首字;数据源 runner 级库存只读面)。 +# 空槽=虚位;used=暗态「已用」保留占位(Used 不可逆——受理序展示语义);不可用=置灰(板级零信息); +# selected=金框高亮(两步交互第一步的可见态)。tooltip=全名+维度语义。 +func set_aux_inventory(items: Array, selected_handle: int) -> void: + _selected_handle = selected_handle + _slot_handles.clear() + for i in 4: + var slot: PanelContainer = _slot_panels[i] + for c in slot.get_children(): + c.queue_free() + if i >= items.size(): + _slot_handles.append(0) + slot.tooltip_text = "魔法道具槽(空)" + slot.add_theme_stylebox_override("panel", + UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER, 0, 1, Vector4(4, 4, 4, 4))) + continue + var rec: Dictionary = items[i] + _slot_handles.append(int(rec.get("handle", 0))) + var used := bool(rec.get("used", false)) + var usable := bool(rec.get("usable", true)) + var selected := selected_handle != 0 and int(rec.get("handle", 0)) == selected_handle + var glyph := UiKit.label(String(rec.get("glyph", "?")), 20, true) + glyph.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + glyph.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + glyph.set_anchors_preset(Control.PRESET_FULL_RECT) + glyph.mouse_filter = Control.MOUSE_FILTER_IGNORE + if used: + glyph.add_theme_color_override("font_color", UiKit.STONE_FAINT) + elif not usable: + glyph.add_theme_color_override("font_color", UiKit.STONE) + slot.add_child(glyph) + var border_col: Color = UiKit.GOLD if selected else UiKit.PANEL_BORDER + slot.add_theme_stylebox_override("panel", + UiKit.panel_flat(UiKit.PANEL_DATA, border_col, 0, 1 if not selected else 2, Vector4(4, 4, 4, 4))) + slot.tooltip_text = "%s%s" % [String(rec.get("name", "")), "(已用)" if used else ("(不可用——当前无有效目标)" if not usable else "")] From 9553d6b182faba5b2f2deefbf21ca175d6dacb15 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 29 Sep 2026 07:43:51 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat(t5):=20=E5=A5=96=E5=8A=B1=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E4=B8=89=E9=80=89=E4=B8=80+=E5=B7=A5=E5=9D=8A?= =?UTF-8?q?=E8=A7=A3=E9=94=81=E9=97=A8=E6=8E=A7+=E5=B0=81=E5=AD=98?= =?UTF-8?q?=E5=91=88=E7=8E=B0+node-reward=20spec=20=E5=87=BA=E7=94=9F=20?= =?UTF-8?q?=E2=91=A0node=5Foverlay:show=5Freward=5Fitems=20=E4=B8=89?= =?UTF-8?q?=E9=80=89=E4=B8=80(=E6=B1=A0=E2=89=A43=20=E5=85=A8=E5=88=97?= =?UTF-8?q?=E2=80=94=E2=80=94=E5=BD=93=E5=89=8D=E4=B8=89=E4=BB=B6=E5=8D=B3?= =?UTF-8?q?=E5=85=A8=E5=88=97;=E6=B1=A0=E7=A9=BA=E7=9B=B4=E9=80=9A=3D?= =?UTF-8?q?=E5=88=87=E7=89=87=E6=9C=9F=E5=90=88=E6=B3=95=E7=A9=BA=E6=80=81?= =?UTF-8?q?=E4=BF=9D=E7=95=99;=E9=80=89=E6=8B=A9=E5=89=8D=E7=BB=A7?= =?UTF-8?q?=E7=BB=AD=E9=9A=90=E8=97=8F=3D=E5=BC=BA=E5=88=B6=E6=9E=84?= =?UTF-8?q?=E7=AD=91=E7=82=B9=E8=AF=AD=E4=B9=89)+item=5Fchosen=20=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7+close=5Freward=20=E6=94=B6=E5=B1=8F=20=E2=91=A1main:?= =?UTF-8?q?=E5=A5=96=E5=8A=B1=E5=88=86=E6=94=AF=E6=8E=A5=E4=B8=89=E9=80=89?= =?UTF-8?q?=E4=B8=80(=E6=B4=BB=E8=A1=8C=E2=88=A9=E8=A7=A3=E9=94=81?= =?UTF-8?q?=E9=9B=86,=E6=B3=A8=E5=86=8C=E5=BA=8F=E5=89=8D=203,=E5=91=88?= =?UTF-8?q?=E7=8E=B0=E4=BE=A7=E9=9B=B6=20RNG)+=5Fon=5Freward=5Fitem=5Fchos?= =?UTF-8?q?en(=E5=85=A5=E5=BA=93=E5=AD=98=E6=9D=A5=E6=BA=90=E5=BD=92?= =?UTF-8?q?=E5=9B=A0=20reward=5Fnode=E2=86=92toast=E2=86=92=5Fon=5Fnode=5F?= =?UTF-8?q?continue=20=E5=85=91=E4=BB=98=E7=A1=AE=E8=AE=A4=E5=9B=9E?= =?UTF-8?q?=E9=80=89=E8=B7=AF=E9=9B=B6=E8=87=AA=E5=8A=A8=E6=8E=A8=E8=BF=9B?= =?UTF-8?q?)+=5Freward=5Fnode=5Fchoices=20=E2=91=A2=E8=A7=A3=E9=94=81?= =?UTF-8?q?=E9=97=A8=E6=8E=A7=E9=93=BE(=E6=8B=8D=E6=9D=BF=E2=91=A2?= =?UTF-8?q?=E7=94=B2=3D=E8=A7=A3=E9=94=81=E8=BF=9B=E6=8A=95=E6=94=BE?= =?UTF-8?q?=E6=B1=A0):main=20=5Faux=5Funlocked=5Fset(=E5=B7=A5=E5=9D=8A?= =?UTF-8?q?=E8=A7=A3=E9=94=81=E2=88=A9=E6=B4=BB=E8=A1=8C;=E7=BD=97?= =?UTF-8?q?=E7=9B=98=E9=80=80=E5=BD=B9/=E5=A4=B1=E4=B9=89=E4=BB=B6?= =?UTF-8?q?=E4=B8=8D=E5=85=A5=E9=9B=86)=E2=86=92adventure=20params.aux=5Fu?= =?UTF-8?q?nlocked=E2=86=92LevelRunner.set=5Faux=5Funlocked=E2=86=92Battle?= =?UTF-8?q?Orchestrator=20=E5=85=AC=E6=9C=89=20setter=E2=86=92RewardEconom?= =?UTF-8?q?y.set=5Faux=5Funlocked+=5Frollable=5Frows=20aux=20=E8=A1=8C?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E2=80=94=E2=80=94=E7=A9=BA=E9=9B=86=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E9=9B=B6=E6=8A=95=E6=94=BE=3D=E7=99=BD=E6=9D=BF/?= =?UTF-8?q?=E5=A4=B9=E5=85=B7=E6=80=81=E6=A8=A1=E6=8B=9F=E8=AF=BB=E6=95=B0?= =?UTF-8?q?=E9=9B=B6=E6=89=B0=E5=8A=A8=20=E2=91=A3=E5=B7=A5=E5=9D=8A?= =?UTF-8?q?=E5=91=88=E7=8E=B0:workshop=5Fstatus=20=E6=8A=95=E5=BD=B1+defer?= =?UTF-8?q?red/retired=20=E7=8A=B6=E6=80=81=E9=9D=A2;camp=20=E6=96=87?= =?UTF-8?q?=E6=A1=88=3D=E5=B7=B2=E8=A7=A3=E9=94=81=C2=B7=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=E5=B0=81=E5=AD=98=E4=B8=AD(=E5=A4=B1=E4=B9=89=E4=BB=B6)/?= =?UTF-8?q?=E5=B7=B2=E9=80=80=E5=BD=B9(=E7=BD=97=E7=9B=98)=20=E2=91=A4node?= =?UTF-8?q?-reward.md=20spec=20v1.0=20=E5=87=BA=E7=94=9F(06=20=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E5=85=91=E7=8E=B0)=20=E5=9D=91=E4=B8=80=E8=BD=AE:Batt?= =?UTF-8?q?leOrchestrator=20=E6=97=A0=E5=85=AC=E6=9C=89=20reward=5Feconomy?= =?UTF-8?q?(E1/E3=20=E5=B0=81=E8=A3=85)=E2=80=94=E2=80=94=E5=85=AC?= =?UTF-8?q?=E6=9C=89=20setter=20=E8=BD=AC=E5=8F=91;=E7=AB=96=E7=BA=BF?= =?UTF-8?q?=E9=94=9A=E5=9B=9B=E5=A4=84=E6=8B=BC=E6=8E=A5=E7=97=85=E8=87=AA?= =?UTF-8?q?=E6=84=88=20=E9=97=B8:=E5=86=92=E7=83=9F=20577/0+=E5=9B=9B?= =?UTF-8?q?=E6=8E=A2=E9=92=88=20PASS(click=20=E9=97=AE=E9=A2=98=3D0)+?= =?UTF-8?q?=E5=8D=95=E6=B5=8B=200=20FAIL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/ux/node-reward.md | 29 +++++++++++ game/core/adventure_runner.gd | 2 + game/core/battle_orchestrator.gd | 5 ++ game/core/level_runner.gd | 17 +++++++ game/core/meta_progression.gd | 3 ++ game/core/reward_economy.gd | 13 +++++ game/presentation/main.gd | 53 +++++++++++++++++++- game/presentation/views/camp_overlay_view.gd | 16 +++++- game/presentation/views/node_overlay.gd | 12 +++++ 9 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 design/gdd/ux/node-reward.md diff --git a/design/gdd/ux/node-reward.md b/design/gdd/ux/node-reward.md new file mode 100644 index 00000000..4f133fc5 --- /dev/null +++ b/design/gdd/ux/node-reward.md @@ -0,0 +1,29 @@ +# 节点奖励屏 UX spec(node-reward) + +> 状态:v1.0(2026-09-29 迭代 7 T5 随批出生——06「节点奖励屏 UX spec」条目兑现;上游拍板=奖励节点三选一〔用户 2026-09-29 拍板②丙〕) +> 事实源:`game/presentation/views/node_overlay.gd`(show_reward_items/close_reward)+ `main.gd`(_reward_node_choices/_on_reward_item_chosen) +> 相邻:[level-clear](level-clear.md)(关卡结算屏)/ [level-map](level-map.md)(关卡画面)/ [魔法道具](../systems/排雷循环/魔法道具.md)(内容权威) + +## 定位 + +奖励节点(reward node)到达即开的**模态构筑点**:从可用道具池取一件加入关卡背包。「节点奖励 = 功能道具的正式渠道」(关卡节点地图 v1.0 ⑤ 定稿)的呈现承载。 + +## 布局与交互 + +- 全屏变暗层 + 居中标题「关卡奖励点 / 取一件魔法道具(加入关卡背包——关卡结束清空)」。 +- 道具按钮横排三枚(150×72:字形大字=道具名首字 + 全名两行);**选择前不给出口**(继续按钮隐藏——强制三选一的构筑点语义)。 +- 池 ≤3 全列(现行有效道具三件:工兵令/探巢摆钟/爆破工兵包——选一即全列);池扩充后按注册序取前 3(呈现侧零 RNG 消费纪律)。 +- 池空(全未解锁/表空合法态)= 直通节点确认「此行无道具可取——继续前行」(切片期空态语义保留)。 +- 选择 → 道具入关卡域库存(来源归因 `reward_node`)→ toast「获得 X(入关卡背包)」→ C 区槽位刷新 → 兑付确认回选路(零自动推进同款)。 + +## 口径 + +- 可用池 = aux 活行 ∩ 工坊解锁集(拍板③甲「解锁→进投放池」同源门控——未解锁不入奖励池与掉落池)。 +- 退役件(探宝罗盘)/失义件(显影尘/地穴全图卷)不入池;营地呈现「已退役 / 已解锁·能力封存中」。 +- 库存语义=关卡域(跨战斗延续、关卡末清空+快照反馈);使用=挖掘期两步交互(C 区槽选中→棋盘目标格)。 + +## 版本历史 + +| 版本 | 日期 | 改动 | +|---|---|---| +| v1.0 | 2026-09-29 | 迭代 7 T5 随批出生(三选一构筑点形态——用户拍板②丙) | diff --git a/game/core/adventure_runner.gd b/game/core/adventure_runner.gd index 1a629109..967acbfc 100644 --- a/game/core/adventure_runner.gd +++ b/game/core/adventure_runner.gd @@ -65,6 +65,7 @@ var _override := [0, 0] # TunePanel 百分比通道 [atk_pct, var _base_override := {"atk": 0, "max_hp": 0, "armor_class": 0} var _first_script := false # 首次脚本模式(关卡节点图生成 v0.4——true = 全关零抽签取池内模板 0;测量夹具恒 false) # 永久强化 flat 注入(元进度实现批——冒险开始参数面 params.hero_override 存入,共享给 LevelRunner;全零 = 白板) var _last_aux_cleared := 0 # additive(迭代 7 T4——最近一次关卡末清空计数,summary 取数面) +var _aux_unlocked := {} # aux 解锁门控集(迭代 7 T5——params.aux_unlocked 接收面) func _init(db_ref, rng_ref) -> void: @@ -94,6 +95,7 @@ func start_adventure(seed_val: int, params: Dictionary = {}) -> bool: _pending_next_level = false _base_override = _normalize_override(params.get("hero_override", {})) _first_script = bool(params.get("first_script", false)) # 缺省 = 非首次(抽签路径;真实侧由呈现层读存档布尔位传入) + _aux_unlocked = params.get("aux_unlocked", {}) if params.get("aux_unlocked", {}) is Dictionary else {} # additive(迭代 7 T5) ledger["hero_hp"] = int(db.hero.max_hp) + int(_base_override["max_hp"]) # 生命账本置满(表值+永久强化 flat——加算区刚归零) state = "running" return _start_current_level() diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index 5cd9bae6..0894f940 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -401,6 +401,11 @@ func use_aux(handle: int, target: Vector2i) -> Dictionary: return {"ok": true, "item_id": v.item_id, "resolved": v.resolved, "record": rec} +# aux 解锁门控转发(迭代 7 T5——LevelRunner 注入;E1/E3 封装:外部经公有面,禁直读 _reward_economy) +func set_aux_unlocked(ids: Dictionary) -> void: + _reward_economy.set_aux_unlocked(ids) + + func _minesweeper_ref() -> Variant: return minesweeper diff --git a/game/core/level_runner.gd b/game/core/level_runner.gd index 1f3deaac..0f2cb401 100644 --- a/game/core/level_runner.gd +++ b/game/core/level_runner.gd @@ -63,6 +63,7 @@ var _shop_purchased := {} # product_id → 已购档数(现价 # 协作对象私有(E1/E3 封装收口 2026-09-13):settlement 读取经 current_battle() 成文出口 var _settlement = null # 当前战斗编排器(关卡结束置 null) var aux_inventory = null # 魔法道具 关卡域库存(迭代 7 T3——AuxItems;跨战斗延续, +var _aux_unlocked := {} # aux 解锁门控集(迭代 7 T5——拍板③甲;空集=零投放) # 关卡末清空+快照计数入 level_finished 载荷) var hero_atk_pct := 0 # 测试面板覆盖值(切片专用) @@ -369,6 +370,8 @@ func _start_battle(node: Dictionary) -> bool: if aux_inventory == null: aux_inventory = AuxItems.new(db) # 惰性建——关卡域单实例(跨战斗延续) _settlement.aux_inventory = aux_inventory # 迭代 7 T3——库存注入(授予路由+use_aux 编排消费面) + if _settlement != null: + _settlement.set_aux_unlocked(_aux_unlocked) # 迭代 7 T5——解锁门控下传(装板摇号前) # core↔core 接线只许方法 Callable(ADR-0001 静态规则 S6——lambda 捕获 self 会延长 # RefCounted 生命周期乃至成环:settlement 的信号持捕获 runner 的 lambda,runner 又持 settlement) _settlement.step_row.connect(_forward_step_row) @@ -472,6 +475,20 @@ func pick_next_node(node_id: int) -> bool: func current_battle(): return _settlement +# aux 解锁门控集注入(迭代 7 T5——AdventureRunner 自 params 传递) +func set_aux_unlocked(ids: Dictionary) -> void: + _aux_unlocked = ids + if _settlement != null: + _settlement.set_aux_unlocked(ids) + +# 奖励节点兑付透传(迭代 7 T5——呈现层三选一 → 关卡域库存;来源归因 reward_node) +func grant_aux_item(item_id: String, source: String) -> Dictionary: + if aux_inventory == null: + aux_inventory = AuxItems.new(db) + return aux_inventory.add_item(item_id, source, Vector2i(-1, -1), 0) + + return _settlement + # ---- 玩家输入转发(呈现层只与 runner 对话)---- diff --git a/game/core/meta_progression.gd b/game/core/meta_progression.gd index 3f8ae992..a70ee5c8 100644 --- a/game/core/meta_progression.gd +++ b/game/core/meta_progression.gd @@ -86,12 +86,15 @@ func workshop_status() -> Array: var out: Array = [] for row in db.meta_workshop_items(): var iid := String(row.get("item_id", "")) + var arow: Dictionary = db.aux_item_row(iid) # 迭代 7 T5——失义/退役状态面(呈现「能力封存/已退役」) out.append({ "item_id": iid, "display_name": String(row.get("display_name", "")), "threshold": int(row.get("clear_threshold", 0)), "unlocked": save.item_unlocked(iid), "progress": _workshop_progress(String(row.get("channel", "total_clears"))), + "deferred": bool(arow.get("deferred", false)), + "retired": bool(arow.get("retired", false)), }) return out diff --git a/game/core/reward_economy.gd b/game/core/reward_economy.gd index 990b2b92..61d23e1c 100644 --- a/game/core/reward_economy.gd +++ b/game/core/reward_economy.gd @@ -204,10 +204,23 @@ func weighted_pick(rows: Array, r: int) -> String: return "" +# aux 解锁门控集(迭代 7 T5——拍板③甲「解锁→进投放池」:未解锁 aux 行不入摇号池。 +# 空集默认 = 全部 aux 不投放(白板/夹具态零投放——模拟读数零扰动;真实侧 main 组装工坊解锁集传入) +var _aux_unlocked := {} + + +func set_aux_unlocked(ids: Dictionary) -> void: + _aux_unlocked = ids + + func _rollable_rows() -> Array: # 摇号池 = cell 池正向行 weight>0(负向行纯字典不消费权重;封锁格不在本函数职责域——清单由调用方裁剪) var out: Array = [] for row in db.reward.rows: + if String(row.get("cell_type", "")) == RewardTable.AUX_ITEM_TYPE: + var iid := String(row.get("effect_id", "")) + if iid == "" or not _aux_unlocked.has(iid): + continue if String(row.get("pool_tag", "")) == "cell" and String(row.get("polarity", "")) == "positive" and int(row.weight) > 0: out.append(row) return out diff --git a/game/presentation/main.gd b/game/presentation/main.gd index f1db2415..ea8b8d4e 100644 --- a/game/presentation/main.gd +++ b/game/presentation/main.gd @@ -68,6 +68,7 @@ var _adventure_gp_view := 0 # GP 冒险钱包呈现侧影子(迭 # wallet_changed gain/buy 载荷=入账后总额 level_runner.gd:482/539) var _adventure_gp_final := 0 # 收束清零拍暂存的最终合计("clear" 到达时自影子转存) var _aux_use_selection := 0 # 魔法道具选中句柄(迭代 7 T4——0=未选中;选中期棋盘点击=使用目标拾取) +var _aux_unlocked := {} # aux 解锁门控集(迭代 7 T5——工坊解锁×活行交集,冒险开始组装) var camp_overlay: CampOverlay # 营地覆盖层(元进度实现批——主菜单营地入口兑付呈现) var tune_panel: TunePanel @@ -149,6 +150,7 @@ func _build_ui() -> void: legend_overlay.closed.connect(_on_modal_closed.bind(legend_overlay)) review_overlay.closed.connect(_on_modal_closed.bind(review_overlay)) node_overlay.continue_pressed.connect(_on_node_continue) + # 迭代 7 T5——item_chosen 连接在奖励分支首唤时防重接线(上方) level_screen.route_chosen.connect(_on_route_chosen) level_screen.abandon_requested.connect(_on_abandon_requested) # 放弃入口(2026-09-21 用户拍板——台账 119) shop_overlay.buy_requested.connect(_on_shop_buy) @@ -250,7 +252,7 @@ func _start_adventure() -> void: # 永久强化注入(元进度实现批):冒险开始参数面——meta 现算 override 显式传参(全零 = 白板) # 首次冒险脚本(关卡节点图生成 v0.4):存档布尔位 false = 全关固定模板 0(教学重放);置位后逐关抽签 var first_script: bool = not save_manager.is_first_adventure_done() - if not adventure.start_adventure(seed_val, {"hero_override": meta.hero_override() if meta != null else {}, "first_script": first_script}): + if not adventure.start_adventure(seed_val, {"hero_override": meta.hero_override() if meta != null else {}, "first_script": first_script, "aux_unlocked": _aux_unlocked_set()}): _fatal_screen("冒险启动失败——见输出日志") return @@ -284,7 +286,9 @@ func _on_runner_node(node: Dictionary, info: Dictionary) -> void: log_view.append_bb(Narrator.node_banner(runner, node, t)) elif t == "reward": _open_modal(node_overlay) - node_overlay.show_reward() + node_overlay.item_chosen.connect(_on_reward_item_chosen) if not node_overlay.item_chosen.is_connected(_on_reward_item_chosen) else null + node_overlay.show_reward_items(_reward_node_choices()) + log_view.append_bb(Narrator.reward_line()) log_view.append_bb(Narrator.reward_line()) elif t == "rest": var healed: int = int(info.get("healed", 0)) @@ -728,6 +732,51 @@ func _on_shop_leave() -> void: # ---- 魔法道具 HUD 接线(迭代 7 T4——库存条+两步交互+叠加层呈现;数据源=runner 级库存只读面)---- +# ---- 奖励节点三选一(迭代 7 T5——拍板②丙:奖励屏=小构筑点;「节点奖励=功能道具正式渠道」兑现)---- +# aux 解锁门控集组装(迭代 7 T5——拍板③甲:工坊解锁 ∩ 活行词表;罗盘退役/失义件不入集) +func _aux_unlocked_set() -> Dictionary: + var out := {} + if meta == null: + return out + for row in db.aux_active_rows(): + var iid := String(row.get("item_id", "")) + if meta.save.item_unlocked(iid): + out[iid] = true + return out + + + +# 摇取面:活行 ∩ 工坊解锁集(拍板③甲——解锁进投放池同源口径);池 ≤3 全列(当前三件=选一即全列), +# 池扩充后加权摇三(确定性摇取:读 seed 流外——呈现侧零 RNG 消费纪律 → 全列前 3 按注册序)。 +func _reward_node_choices() -> Array: + if runner == null or runner.aux_inventory == null: + return [] + var out: Array = [] + for row in db.aux_active_rows(): + var iid := String(row.get("item_id", "")) + if not _aux_unlocked.has(iid): + continue # 未解锁不入奖励池(与掉落投放同门控) + out.append({ + "item_id": iid, + "display_name": String(row.get("display_name", "")), + "glyph": String(row.get("display_name", "?")).left(1), + }) + if out.size() >= 3: + break + return out + + +# 选择兑付:入关卡域库存(来源归因 reward_node)→ 收屏 → 兑付确认回选路(零自动推进同款) +func _on_reward_item_chosen(item_id: String) -> void: + if runner == null or runner.aux_inventory == null: + return + runner.grant_aux_item(item_id, "reward_node") + node_overlay.close_reward() + _refresh_aux_slots() + board_zone.toast.show_toast("获得 %s(入关卡背包)" % String(db.aux_item_row(item_id).get("display_name", item_id)), "info") + _on_node_continue() + + # 槽点击(第一步):AP 类(target=none)点击即用(无目标);空间类进/出选中态(toggle 取消)。 func _on_aux_slot_clicked(slot_handle: int) -> void: if settlement == null or runner == null or runner.aux_inventory == null: diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index 0341fc43..15a3c66b 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -138,8 +138,20 @@ func refresh_camp(data: Dictionary) -> void: var prog := int(row.get("progress", 0)) var unlocked := bool(row.get("unlocked", false)) card.progress_l.text = "累计通关 %d / %d 次" % [prog, th] - card.status_l.text = "已解锁" if unlocked else "未解锁" - card.status_l.add_theme_color_override("font_color", UiKit.GOLD if unlocked else UiKit.WARM_FAINT) + # 迭代 7 T5——失义件(显影尘/地穴全图卷 Alpha 重定)与退役件(探宝罗盘 2026-09-29 拍板①乙)的呈现口径 + var st_text := "未解锁" + var st_col: Color = UiKit.WARM_FAINT + if bool(row.get("retired", false)): + st_text = "已退役" + st_col = UiKit.WARM_FAINT + elif bool(row.get("deferred", false)) and unlocked: + st_text = "已解锁 · 能力封存中" + st_col = UiKit.GOLD + elif unlocked: + st_text = "已解锁" + st_col = UiKit.GOLD + card.status_l.text = st_text + card.status_l.add_theme_color_override("font_color", st_col) func _rebuild_forge(data: Dictionary) -> void: diff --git a/game/presentation/views/node_overlay.gd b/game/presentation/views/node_overlay.gd index dcdd64ca..ab9dcd34 100644 --- a/game/presentation/views/node_overlay.gd +++ b/game/presentation/views/node_overlay.gd @@ -6,9 +6,11 @@ class_name NodeOverlay extends Control signal continue_pressed +signal item_chosen(item_id: String) # 迭代 7 T5——奖励节点三选一兑付(拍板②丙:奖励屏=小构筑点) var _label: Label var _btn: Button +var _choice_box: HBoxContainer # 道具三选一按钮区(show_reward_items 时呈现) func _init() -> void: @@ -27,6 +29,10 @@ func _init() -> void: _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER box.add_child(_label) _btn = UiKit.button("继续") + _choice_box = HBoxContainer.new() + _choice_box.add_theme_constant_override("separation", 12) + _choice_box.alignment = BoxContainer.ALIGNMENT_CENTER + box.add_child(_choice_box) _btn.pressed.connect(func(): continue_pressed.emit()) box.add_child(_btn) visible = false @@ -46,6 +52,12 @@ func show_rest(healed: int, hp_after: int, max_hp: int) -> void: visible = true +# 选择完成收屏(组合根在 item_chosen 处理毕调——入库存+确认后回选路由同拍) +func close_reward() -> void: + _choice_box.visible = false + _btn.visible = true + visible = false + # 探针复用:以真实按钮路径触发继续 func press_continue() -> void: _btn.pressed.emit() From dd5ed4a753dac4f72d784d7d5207e3d9d894790b Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 29 Sep 2026 07:52:04 +0800 Subject: [PATCH 4/5] =?UTF-8?q?test(t7):=20AuxItems=20=E7=B1=BB=E5=8D=95?= =?UTF-8?q?=E6=B5=8B=E2=80=94=E2=80=94=E7=BB=93=E6=9E=84=E5=86=BB=E7=BB=93?= =?UTF-8?q?=E6=96=AD=E8=A8=80=E9=9D=A2=E5=8D=81=E4=BA=8C=E6=96=AD=E8=A8=80?= =?UTF-8?q?=E5=85=A8=E8=BF=87=20=E2=91=A0=E6=96=B0=E5=A5=97=E4=BB=B6=20tes?= =?UTF-8?q?ts/unit/core/aux=5Fitems=5Ftest.gd=EF=BC=88run=5Fall=20manifest?= =?UTF-8?q?+1,expect=200=EF=BC=89:=E6=8E=88=E4=BA=88=E5=BD=92=E5=9B=A0/?= =?UTF-8?q?=E5=8F=A5=E6=9F=84=E5=8F=97=E7=90=86=E5=BA=8F/Used=20=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E9=80=86=E4=BA=8C=E6=AC=A1=20consume=20=E6=8B=92/?= =?UTF-8?q?=E7=9C=9F=E8=A7=86=E6=81=92=E5=8F=AF=E7=94=A8/=E9=A2=84?= =?UTF-8?q?=E8=AF=BB=E7=82=B9=E5=87=BB=E7=BA=A7=E9=9B=B6=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=E4=B8=8D=E6=B6=88=E8=80=97/3x3=20=E8=BE=B9?= =?UTF-8?q?=E7=BC=98=E7=AA=97=E5=8F=A3=E2=88=A9=E6=9D=BF(=E8=A7=92=204=20?= =?UTF-8?q?=E6=A0=BC)/=E8=B6=8A=E6=9D=BF=E6=8B=92/=E5=8F=A0=E5=8A=A0?= =?UTF-8?q?=E5=B1=82=E4=B8=A4=E9=9B=86/=E6=8D=A2=E5=9B=BE=E4=B8=89?= =?UTF-8?q?=E6=B8=85(retire=20=E4=B8=8D=E5=8A=A8=E5=BA=93=E5=AD=98)/?= =?UTF-8?q?=E5=85=B3=E5=8D=A1=E6=9C=AB=20reset/=E9=9B=B6=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E9=87=8D=E6=94=BE=E4=B8=A4=E9=81=8D=E6=8A=95=E5=BD=B1=E9=80=90?= =?UTF-8?q?=E4=BD=8D=20=E2=91=A1=E6=A1=A9=E8=A1=A8=E6=A8=A1=E5=BC=8F:StubD?= =?UTF-8?q?B/StubTable=20=E5=86=85=E8=81=94=E7=B1=BB=E5=96=82=E8=A1=8C?= =?UTF-8?q?=E5=AE=9A=E4=B9=89(=E4=BA=A7=E5=93=81=E7=A0=81=E9=9B=B6?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=88=86=E6=94=AF=E2=80=94=E2=80=94C1=20?= =?UTF-8?q?=E9=9B=B6=E7=89=B9=E5=88=A4=E5=AE=88=E4=BD=8F);=E4=BF=AE?= =?UTF-8?q?=E4=B8=89=E5=85=83=E8=AF=AD=E5=8F=A5=E5=8F=96=20void=20?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E8=A7=A3=E6=9E=90=E9=94=99=20?= =?UTF-8?q?=E9=97=B8:aux=5Fitems=5Ftest=20PASS;run=5Fall=2012=20=E5=A5=97?= =?UTF-8?q?=E5=85=A8=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/run_all.gd | 1 + game/tests/unit/core/aux_items_test.gd | 118 +++++++++++++++++++++ game/tests/unit/core/aux_items_test.gd.uid | 1 + 3 files changed, 120 insertions(+) create mode 100644 game/tests/unit/core/aux_items_test.gd create mode 100644 game/tests/unit/core/aux_items_test.gd.uid diff --git a/game/tests/run_all.gd b/game/tests/run_all.gd index 5afadfaa..45b1d68c 100644 --- a/game/tests/run_all.gd +++ b/game/tests/run_all.gd @@ -32,6 +32,7 @@ func _suites() -> Array: {"path": "res://tests/unit/data_config/aux_target_violation_test.gd", "expect": 1}, # 迭代 7 T1——真视窄域护栏 {"path": "res://tests/unit/data_config/reward_dangling_aux_test.gd", "expect": 1}, # 迭代 7 T1——aux 双表校验 {"path": "res://tests/unit/data_config/rng_service_test.gd", "expect": 0}, + {"path": "res://tests/unit/core/aux_items_test.gd", "expect": 0}, # 迭代 7 T7——魔法道具结构冻结断言面 {"path": "res://tests/unit/battle_settlement/damage_math_test.gd", "expect": 0}, {"path": "res://tests/unit/battle_settlement/damage_controller_test.gd", "expect": 0}, {"path": "res://tests/unit/contracts/system_contracts_test.gd", "expect": 0}, diff --git a/game/tests/unit/core/aux_items_test.gd b/game/tests/unit/core/aux_items_test.gd new file mode 100644 index 00000000..2dff7fea --- /dev/null +++ b/game/tests/unit/core/aux_items_test.gd @@ -0,0 +1,118 @@ +# VERTICAL SLICE - NOT FOR PRODUCTION +# 魔法道具 AuxItems 类单测(迭代 7 T7——结构冻结断言面;设计权威 魔法道具.md + registry aux_items)。 +# 覆盖:授予归因 / Used 不可逆 / 真视恒可用 / 预读点击级零信息拒绝 / 3×3 边缘窗口∩板 / +# 叠加层三清(retire_overlays 不动库存)/ 关卡末 reset / 零随机(同操作序列重放两遍投影逐位)。 +# 运行:godot --headless --path game --script res://tests/unit/core/aux_items_test.gd(expect 0) +extends SceneTree + +const AuxItemsScript := preload("res://core/aux_items.gd") + +var _problems: Array = [] + + +func check(cond: bool, msg: String) -> void: + if not cond: + _problems.append(msg) + + +class StubTable: + var rows := {} + func row_by_id(id: String) -> Dictionary: + return rows.get(id, {}) + func active_rows() -> Array: + return [] + + +class StubDB: + var aux_items: StubTable + + +func _stub_db() -> StubDB: + var t := StubTable.new() + t.rows = { + "sapper_order": {"item_id": "sapper_order", "display_name": "工兵令", "dimension_tags": ["action"], + "effect_kinds": ["ap_grant"], "target": "none", "magnitude": 2, "use_phase": "active_dig"}, + "nest_pendulum": {"item_id": "nest_pendulum", "display_name": "探巢摆钟", "dimension_tags": ["risk"], + "effect_kinds": ["mine_reveal"], "target": "area_3x3", "magnitude": 0, "use_phase": "active_dig"}, + "loot_compass": {"item_id": "loot_compass", "display_name": "探宝罗盘", "dimension_tags": ["plan"], + "effect_kinds": ["reward_preview"], "target": "area_3x3", "magnitude": 0, "use_phase": "active_dig"}, + } + var db := StubDB.new() + db.aux_items = t + return db + + +func _new_inv() -> Object: + return AuxItemsScript.new(_stub_db()) + + +func _unrevealed(_c: Vector2i) -> bool: + return true # 测试板全未开(预读恒有信息——点击级零信息另用假回调测) + + +func _all_revealed(_c: Vector2i) -> bool: + return false # 预读点击级零信息(窗口全已开) + + +func _init() -> void: + # ① 授予归因+受理序+Used 不可逆 + var inv = _new_inv() + var r1: Dictionary = inv.add_item("sapper_order", "safe_cell", Vector2i(3, 4), 2) + var r2: Dictionary = inv.add_item("nest_pendulum", "flag_hit", Vector2i(5, 6), 3) + check(int(r1.handle) == 1 and int(r2.handle) == 2, "句柄受理序单调(1→2——零随机)") + check(String(r1.source_class) == "safe_cell" and r1.origin_cell == Vector2i(3, 4) and int(r1.round_index) == 2, + "授予来源可归因(source/cell/round)") + var inv_proj: Array = inv.query_inventory(Callable()) + check(inv_proj.size() == 2 and not bool(inv_proj[0].used), "库存投影两件未用") + check(bool(inv.consume(int(r1.handle)).get("used", false)), "consume 返回已用快照回执") + check(inv.consume(int(r1.handle)).is_empty(), "Used 不可逆——二次 consume 拒绝(空回执)") + check(int(inv.inventory_count()) == 2, "Used 保留只读(库存计数不变)") + + # ② 真视恒可用+边缘窗口∩板(3×3 中心贴角——角 4 格) + var v_ok: Dictionary = inv.validate_use(int(r2.handle), Vector2i(0, 0), Vector2i(10, 10), Callable()) + check(bool(v_ok.ok) and v_ok.resolved.size() == 4, + "真视边缘窗口=窗口∩板(角 4 格——护栏只缩不扩)") + # 预读点击级零信息:中心板内但回调恒 false(全已开)→拒绝零消耗 + var inv2 = _new_inv() + var rp: Dictionary = inv2.add_item("loot_compass", "safe_cell", Vector2i(1, 1), 1) + var v_zero: Dictionary = inv2.validate_use(int(rp.handle), Vector2i(5, 5), Vector2i(10, 10), Callable()) + check(not bool(v_zero.ok) and int(inv2.inventory_count()) == 1, + "预读点击级零信息拒绝(不消耗——库存不变)") + # 目标越板 + var v_oob: Dictionary = inv2.validate_use(int(rp.handle), Vector2i(12, 5), Vector2i(10, 10), Callable()) + check(not bool(v_zero.ok) and not bool(v_oob.ok), "越板目标拒绝") + + # ③ 叠加层+三清(retire 不动库存;reset 全清) + inv2.apply_overlay("mine_reveal", v_ok.resolved) + inv2.apply_overlay("reward_preview", [Vector2i(5, 5)]) + var ov: Dictionary = inv2.query_overlays() + check(ov.mine_reveal.size() == 4 and ov.reward_preview.size() == 1, "叠加层两集落位(真视 4/预读 1)") + inv2.retire_overlays() + check(inv2.query_overlays().mine_reveal.is_empty() and int(inv2.inventory_count()) == 1, + "换图三清:叠加层消亡+库存不动(关卡域)") + inv2.reset() + check(inv2.inventory_count() == 0 and inv2.probe().used == 0, "关卡末 reset 全清(幂等)") + + # ④ 零随机重放:同操作序列两遍,投影逐位相同 + var replay_a: Array = [] + var replay_b: Array = [] + for rep in 2: + var inv3 = _new_inv() + var h1: Dictionary = inv3.add_item("sapper_order", "safe_cell", Vector2i(2, 3), 1) + inv3.validate_use(int(h1.handle), Vector2i(4, 4), Vector2i(10, 10), Callable()) + inv3.apply_overlay("mine_reveal", [Vector2i(4, 4)]) + inv3.consume(int(h1.handle)) + if rep == 0: + replay_a = [inv3.query_inventory(Callable()), inv3.query_overlays(), inv3.probe()] + else: + replay_b = [inv3.query_inventory(Callable()), inv3.query_overlays(), inv3.probe()] + check(str(replay_a) == str(replay_b), "零随机重放:库存+叠加层+探针投影逐位相同") + + # ---- 汇总 ---- + if _problems.is_empty(): + print("[aux_items_test] PASS — 授予归因/Used 不可逆/真视恒可用/零信息拒绝/边缘窗口/三清/零随机重放 全过") + quit(0) + else: + for p in _problems: + push_error("[aux_items_test] FAIL — " + p) + quit(1) diff --git a/game/tests/unit/core/aux_items_test.gd.uid b/game/tests/unit/core/aux_items_test.gd.uid new file mode 100644 index 00000000..88eb53c2 --- /dev/null +++ b/game/tests/unit/core/aux_items_test.gd.uid @@ -0,0 +1 @@ +uid://dqx67xrrbvp82 From d46e92be00df122c320f9d08ad2c425b795bc757 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 29 Sep 2026 08:54:21 +0800 Subject: [PATCH 5/5] =?UTF-8?q?docs(t6-t8):=20=E6=8D=A2=E7=AE=97=E7=8E=87?= =?UTF-8?q?=E6=A0=87=E5=AE=9A=E6=8A=A5=E5=91=8A=E5=BD=92=E6=A1=A3+?= =?UTF-8?q?=E9=AD=94=E6=B3=95=E9=81=93=E5=85=B7.md=20v0.5=20=E4=BF=AE?= =?UTF-8?q?=E8=AE=A2+06=20=E7=BD=97=E7=9B=98=E6=9D=A1=E7=9B=AE=E6=94=B6?= =?UTF-8?q?=E5=8F=A3+roadmap=20=E8=BF=AD=E4=BB=A37=20=E6=B3=A8=E8=AE=B0+?= =?UTF-8?q?=E5=87=BA=E5=8F=A3=E6=A3=80=E6=9F=A5=E5=8D=95=20=E2=91=A0design?= =?UTF-8?q?/qa/m3-iter7-conversion-recal-20260929.md(+raw):=E7=99=BD?= =?UTF-8?q?=E6=9D=BF=20120+=E4=B8=89=E6=B3=A8=E5=85=A5=E6=A1=A3=E5=90=84?= =?UTF-8?q?=20120=20OFAT=20=E9=85=8D=E5=AF=B9=E2=80=94=E2=80=94=E7=94=9F?= =?UTF-8?q?=E5=91=BD=206=E2=86=92=E5=AE=9E=E6=B5=8B=201.7=C2=B11.2/?= =?UTF-8?q?=E6=94=BB=E5=87=BB=209=E2=86=924.1=C2=B13.7/=E6=8A=A4=E7=94=B2?= =?UTF-8?q?=201=E2=86=920.0=C2=B10.6(=E5=A4=A9=E8=8A=B1=E6=9D=BF=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9+=E6=A0=B7=E6=9C=AC=E5=8A=9F=E7=8E=87=E6=B3=A8?= =?UTF-8?q?=E8=AE=B0;U1=20=E5=91=88=E6=8A=A5=E7=BB=B4=E6=8C=81=20vs=20?= =?UTF-8?q?=E8=B0=83=E5=80=BC)=20=E2=91=A1=E9=AD=94=E6=B3=95=E9=81=93?= =?UTF-8?q?=E5=85=B7.md=20v0.5:=E5=86=85=E5=AE=B9=E6=89=B9=E8=90=BD?= =?UTF-8?q?=E5=9C=B0=E4=BF=AE=E8=AE=A2(=E5=85=AD=E8=A1=8C=E5=85=A5?= =?UTF-8?q?=E8=A1=A8/=E7=BD=97=E7=9B=98=E9=80=80=E5=BD=B9=E7=95=99?= =?UTF-8?q?=E7=97=95/F2=20=E6=8A=95=E6=94=BE=E7=BB=B4=E5=BA=A6=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E5=8F=A3=E5=BE=84+=E8=B1=81=E5=85=8D=E9=9D=A2?= =?UTF-8?q?=E7=99=BB=E8=AE=B0/=E8=A7=A3=E9=94=81=E8=AF=AD=E4=B9=89/?= =?UTF-8?q?=E4=B8=89=E9=80=89=E4=B8=80/=E6=8A=95=E6=94=BE=E6=9D=83?= =?UTF-8?q?=E9=87=8D)=20=E2=91=A206:=E6=8E=A2=E5=AE=9D=E7=BD=97=E7=9B=98?= =?UTF-8?q?=E5=A4=B1=E4=B9=89=E6=9D=A1=E7=9B=AE=E6=94=B6=E5=8F=A3(?= =?UTF-8?q?=E6=8B=8D=E6=9D=BF=E2=91=A0=E4=B9=99)=20=E2=91=A3roadmap=20?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=207=20=E8=A1=8C=E8=90=BD=E5=9C=B0=E6=B3=A8?= =?UTF-8?q?=E8=AE=B0+design/qa/m3-iter7-exit-checklist-2026-09-29.md(?= =?UTF-8?q?=E4=B8=83=E9=A1=B9=E7=9B=AE=E6=A3=80+=E8=BF=BD=E8=AE=A4?= =?UTF-8?q?=E4=BA=94=E9=A1=B9+U1=20=E8=AF=BB=E6=95=B0=E5=91=88=E6=8A=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/gdd/06-待办清单.md | 3 +- design/gdd/systems/排雷循环/魔法道具.md | 1 + .../qa/m3-iter7-conversion-recal-20260929.md | 165 +++++ ...-iter7-conversion-recal-20260929.raw.jsonl | 600 ++++++++++++++++++ .../qa/m3-iter7-exit-checklist-2026-09-29.md | 53 ++ roadmap.md | 2 +- 6 files changed, 822 insertions(+), 2 deletions(-) create mode 100644 design/qa/m3-iter7-conversion-recal-20260929.md create mode 100644 design/qa/m3-iter7-conversion-recal-20260929.raw.jsonl create mode 100644 design/qa/m3-iter7-exit-checklist-2026-09-29.md diff --git a/design/gdd/06-待办清单.md b/design/gdd/06-待办清单.md index 4f84d3bf..bc91adeb 100644 --- a/design/gdd/06-待办清单.md +++ b/design/gdd/06-待办清单.md @@ -41,7 +41,8 @@ **归属**:魔法道具内容重定批(排垂直切片收尾后) -**状态**:待办(2026-09-19 用户立项,两方案在案;同日拍板:评估排期改至 **Alpha 阶段**,垂直切片期不讨论) +**状态**:**收口(2026-09-29 迭代 7——用户拍板①乙)**:探宝罗盘退役留痕(AuxItemTable retired 标记,不入掉落/奖励池与 F2 覆盖面,营地呈现「已退役」;未开格类型微光常显=预读价值覆盖的既成事实)。六行定义表已入表(AuxItemTable),显影尘/地穴全图卷 deferred 随 Alpha 重定批 +待办(2026-09-19 用户立项,两方案在案;同日拍板:评估排期改至 **Alpha 阶段**,垂直切片期不讨论) ## 战斗循环 diff --git a/design/gdd/systems/排雷循环/魔法道具.md b/design/gdd/systems/排雷循环/魔法道具.md index bb3eaf95..3ba58548 100644 --- a/design/gdd/systems/排雷循环/魔法道具.md +++ b/design/gdd/systems/排雷循环/魔法道具.md @@ -185,3 +185,4 @@ playtest 预警(预注册,归难度曲线与Boss): | v0.2 | 2026-09-16 | 更名批(用户拍板 2026-09-16):系统更名"辅助道具"→"魔法道具"——定位已非纯数值道具,含信息/妙用向效果;文件同步重命名;英文代号 AUXILIARY_ITEMS 暂沿用 | | v0.4 | 2026-09-17 | 数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 data/tables/*.tres 与 registry),1 处失同步修正(AP 8→6 漏改:爆破工兵包定位读数段的「每轮行动点默认 8」改指路 action_economy.tres)——道具加量、供给读数、调参表六行 w/t/mag、道具依赖预警阈值 50% 均改指路 registry `aux_items`;行名与表结构列保留 | | v0.3 | 2026-09-17 | 切片期空内容拍板(用户拍板):道具定义表为空列为合法态——五维度覆盖检查改为仅对非空清单执行(垂直切片期无道具内容、无掉落面;六行设计值与机制桥接登记保留,内容整批后置至切片收尾后的魔法道具内容批);验收标准覆盖检查条目同步;[06-待办清单](../../06-待办清单.md)「维度覆盖检查破缺」「失义道具的掉落投放」两条随批关闭 | +| v0.5 | 2026-09-29 | **内容批落地修订(迭代 7——用户八拍板)**:①道具定义表六行入表(AuxItemTable——三有效实装:工兵令 ap_grant/探巢摆钟真视/爆破工兵包组合;**探宝罗盘退役留痕**(拍板①乙——未开格类型微光常显覆盖预读价值,retired 标记词表兼容);显影尘/地穴全图卷 deferred「能力封存」(拍板④甲,Alpha 重定);②F2 维度覆盖改**投放维度覆盖**口径+豁免面 {plan, info, counter} 显式登记(罗盘退役+显影件悬置所致,豁免随 Alpha 重定/天赋批消减);③解锁语义定稿=工坊解锁→进掉落投放池(拍板③甲,未解锁权重 0);④奖励节点=三选一构筑点(拍板②丙,node-reward.md v1.0);⑤掉落投放三件总权重 10/池 88(拍板⑥甲,provisional) | diff --git a/design/qa/m3-iter7-conversion-recal-20260929.md b/design/qa/m3-iter7-conversion-recal-20260929.md new file mode 100644 index 00000000..0cc73fd2 --- /dev/null +++ b/design/qa/m3-iter7-conversion-recal-20260929.md @@ -0,0 +1,165 @@ +# 数值验证报告(20260929-084802) + +- 采集规模:基线冒险 60 局/画像 · 战役 60 局/画像 · 种子 8000 起逐局独立 · 锻造花费策略 = hp_first +- 切片版本:dd5ed4a · 口径:逐关读数 = 冒险条件口径(单关直入口口径已退役 2026-09-23,带待重锚只测不判——重锚归曲线调参批) · 换算率表值(meta.tres 启动解析):生命上限每级平移6点 · 基础攻击每级平移9点 · 护甲等级每级平移1点 + +## ① 逐关条件通关率(冒险口径——打通 k-1 关才到达第 k 关;带待重锚只测不判) + +| 层 | 画像 | 通关/到达 | 条件通关率±95%CI | 验收带 | +|--------|--------|-----------|------------------|--------| +| 第一层 | 普通档 | 32/60 | 53.3% ±12.6 | 未定 | +| 第二层 | 普通档 | 3/32 | 9.4% ±10.1 | 未定 | +| 第三层 | 普通档 | 0/3 | 0.0% ±0.0 | 未定 | +| 第一层 | 完美档 | 52/60 | 86.7% ±8.6 | 未定 | +| 第二层 | 完美档 | 17/52 | 32.7% ±12.7 | 未定 | +| 第三层 | 完美档 | 3/17 | 17.6% ±18.1 | 未定 | + +## ② 零永久强化冒险:止步分布与败退节点(用户判据③) + +### 普通档(60 局) + +- 止步分布:止步第1层 28(47%)、止步第2层 29(48%)、止步第3层 3(5%) +- 败退节点分布(失败局归因): + - 第一层·节点6·Boss ×13 + - 第二层·节点9·Boss ×12 + - 第一层·节点2·战斗 ×8 + - 第二层·节点1·战斗 ×6 + - 第二层·节点6·战斗 ×4 + - 第二层·节点5·战斗 ×3 + - 第一层·节点4·战斗 ×3 + - 第一层·节点3·战斗 ×2 + - 第二层·节点7·战斗 ×2 + - 第一层·节点5·战斗 ×2 + - 第二层·节点4·战斗 ×1 + - 第三层·节点0·战斗 ×1 + - 第三层·节点1·战斗 ×1 + - 第三层·节点5·战斗 ×1 + - 第二层·节点0·战斗 ×1 + +### 完美档(60 局) + +- 止步分布:止步第1层 8(13%)、止步第2层 35(58%)、止步第3层 14(23%)、通关 3(5%) +- 败退节点分布(失败局归因): + - 第二层·节点9·Boss ×17 + - 第二层·节点7·战斗 ×9 + - 第三层·节点1·战斗 ×7 + - 第一层·节点6·Boss ×7 + - 第二层·节点1·战斗 ×3 + - 第二层·节点6·战斗 ×3 + - 第三层·节点7·战斗 ×2 + - 第三层·节点9·Boss ×2 + - 第二层·节点4·战斗 ×2 + - 第三层·节点6·战斗 ×1 + - 第三层·节点4·战斗 ×1 + - 第三层·节点5·战斗 ×1 + - 第二层·节点5·战斗 ×1 + - 第一层·节点5·战斗 ×1 + +## ③ 营地循环爬升(用户判据④:5 次通关 → 下一层可过) + +### 普通档 · 生命优先(60 局战役) + +- 钥石:全程入账 1613 · 终态余额 152 · 锻造终态 = 生命+21/攻击+6/护甲+6 +- 道具工坊解锁时点(魔法道具面,局内效果未实装只报不判):显影尘 第 1 局、工兵令 第 1 局、探宝罗盘 第 1 局、探巢摆钟 第 1 局、地穴全图卷 第 2 局、爆破工兵包 第 2 局 + +- 判据:累计通过第一层 5 次后,第二层条件通关率(滑窗 10 局)——带未定(只测不判)(触发时注入 = 生命+6/攻击+2/护甲+0,表值平移 +30.0 点——带重锚后随平移判) +- 判据:累计通过第二层 5 次后,第三层条件通关率(滑窗 10 局)——带未定(只测不判)(触发时注入 = 生命+9/攻击+2/护甲+1,表值平移 +37.0 点——带重锚后随平移判) + +| 局 | 注入(flat) | 钥石 | 第1层率(窗) | 第2层率(窗) | 第3层率(窗) | 终局 | +|--------|--------------|------|-------------|-------------|-------------|-----------| +| 第1局 | 血0/攻0/甲0 | 13 | 100%(n=1) | 100%(n=1) | 0%(n=1) | 止步第3层 | +| 第4局 | 血3/攻1/甲0 | 8 | 100%(n=4) | 50%(n=4) | 0%(n=2) | 止步第3层 | +| 第7局 | 血6/攻2/甲0 | 12 | 86%(n=7) | 50%(n=6) | — | 止步第2层 | +| 第10局 | 血6/攻2/甲1 | 4 | 90%(n=10) | 56%(n=9) | 0%(n=5) | 止步第3层 | +| 第13局 | 血9/攻2/甲2 | 19 | 90%(n=10) | 50%(n=10) | — | 止步第2层 | +| 第16局 | 血9/攻3/甲2 | 31 | 100%(n=10) | 50%(n=10) | — | 止步第2层 | +| 第19局 | 血12/攻3/甲2 | 32 | 90%(n=10) | — | — | 止步第1层 | +| 第22局 | 血12/攻4/甲2 | 28 | 90%(n=10) | 70%(n=10) | 40%(n=10) | 通关 | +| 第25局 | 血12/攻4/甲3 | 31 | 90%(n=10) | 80%(n=10) | 50%(n=10) | 通关 | +| 第28局 | 血12/攻4/甲4 | 14 | 90%(n=10) | 80%(n=10) | 70%(n=10) | 通关 | +| 第31局 | 血15/攻4/甲4 | 84 | 100%(n=10) | 70%(n=10) | 70%(n=10) | 通关 | +| 第34局 | 血15/攻5/甲4 | 42 | 100%(n=10) | 60%(n=10) | — | 止步第2层 | +| 第37局 | 血15/攻5/甲5 | 50 | 100%(n=10) | 70%(n=10) | 80%(n=10) | 通关 | +| 第40局 | 血15/攻5/甲5 | 145 | 100%(n=10) | 80%(n=10) | 80%(n=10) | 止步第3层 | +| 第43局 | 血18/攻5/甲5 | 103 | 100%(n=10) | 90%(n=10) | 90%(n=10) | 通关 | +| 第46局 | 血18/攻6/甲5 | 36 | 100%(n=10) | 90%(n=10) | — | 止步第2层 | +| 第49局 | 血18/攻6/甲5 | 144 | 100%(n=10) | 90%(n=10) | 90%(n=10) | 通关 | +| 第52局 | 血18/攻6/甲6 | 89 | 100%(n=10) | 90%(n=10) | 90%(n=10) | 止步第3层 | +| 第55局 | 血18/攻6/甲6 | 197 | 100%(n=10) | 90%(n=10) | 90%(n=10) | 通关 | +| 第58局 | 血21/攻6/甲6 | 80 | 100%(n=10) | 100%(n=10) | 90%(n=10) | 通关 | + +### 完美档 · 生命优先(60 局战役) + +- 钥石:全程入账 1988 · 终态余额 77 · 锻造终态 = 生命+21/攻击+7/护甲+7 +- 道具工坊解锁时点(魔法道具面,局内效果未实装只报不判):显影尘 第 1 局、工兵令 第 1 局、探宝罗盘 第 1 局、探巢摆钟 第 1 局、地穴全图卷 第 1 局、爆破工兵包 第 1 局 + +- 判据:累计通过第一层 5 次后,第二层条件通关率(滑窗 10 局)——带未定(只测不判)(触发时注入 = 生命+6/攻击+2/护甲+1,表值平移 +31.0 点——带重锚后随平移判) +- 判据:累计通过第二层 5 次后,第三层条件通关率(滑窗 10 局)——带未定(只测不判)(触发时注入 = 生命+9/攻击+2/护甲+2,表值平移 +38.0 点——带重锚后随平移判) + +| 局 | 注入(flat) | 钥石 | 第1层率(窗) | 第2层率(窗) | 第3层率(窗) | 终局 | +|--------|--------------|------|-------------|-------------|-------------|-----------| +| 第1局 | 血0/攻0/甲0 | 5 | 100%(n=1) | 100%(n=1) | 100%(n=1) | 通关 | +| 第4局 | 血6/攻1/甲0 | 0 | 100%(n=4) | 50%(n=4) | 50%(n=2) | 止步第3层 | +| 第7局 | 血6/攻2/甲2 | 0 | 100%(n=7) | 71%(n=7) | 60%(n=5) | 通关 | +| 第10局 | 血9/攻3/甲2 | 5 | 100%(n=10) | 80%(n=10) | 62%(n=8) | 通关 | +| 第13局 | 血12/攻3/甲3 | 21 | 100%(n=10) | 90%(n=10) | — | 止步第2层 | +| 第16局 | 血12/攻4/甲3 | 36 | 100%(n=10) | 90%(n=10) | 70%(n=10) | 止步第3层 | +| 第19局 | 血12/攻4/甲4 | 52 | 100%(n=10) | 80%(n=10) | 70%(n=10) | 通关 | +| 第22局 | 血15/攻4/甲4 | 47 | 100%(n=10) | 80%(n=10) | 70%(n=10) | 通关 | +| 第25局 | 血15/攻5/甲4 | 55 | 100%(n=10) | 90%(n=10) | 80%(n=10) | 通关 | +| 第28局 | 血15/攻5/甲5 | 50 | 100%(n=10) | 100%(n=10) | 80%(n=10) | 止步第3层 | +| 第31局 | 血15/攻5/甲5 | 8 | 100%(n=10) | 100%(n=10) | 90%(n=10) | 通关 | +| 第34局 | 血18/攻5/甲5 | 116 | 100%(n=10) | 100%(n=10) | 90%(n=10) | 通关 | +| 第37局 | 血18/攻6/甲5 | 74 | 100%(n=10) | 100%(n=10) | 90%(n=10) | 通关 | +| 第40局 | 血18/攻6/甲5 | 32 | 100%(n=10) | 100%(n=10) | 100%(n=10) | 通关 | +| 第43局 | 血18/攻6/甲6 | 140 | 100%(n=10) | 100%(n=10) | 100%(n=10) | 通关 | +| 第46局 | 血18/攻6/甲6 | 23 | 100%(n=10) | 100%(n=10) | 100%(n=10) | 通关 | +| 第49局 | 血21/攻6/甲6 | 131 | 100%(n=10) | 100%(n=10) | 100%(n=10) | 通关 | +| 第52局 | 血21/攻6/甲6 | 14 | 100%(n=10) | 100%(n=10) | 100%(n=10) | 通关 | +| 第55局 | 血21/攻7/甲6 | 122 | 100%(n=10) | 100%(n=10) | 100%(n=10) | 通关 | +| 第58局 | 血21/攻7/甲6 | 5 | 100%(n=10) | 100%(n=10) | 100%(n=10) | 通关 | + +## ④ 换算率标定(OFAT 注入档 vs 白板,同种子配对逐关条件通关率差) + +### 生命上限(每级 flat +3) + +| 注入档 | 画像 | 层 | 配对局数 | 条件率 白板→档 | 差(点) | 折每级(点/级) | +|------------|--------|--------|----------|----------------|-------------|---------------| +| +3(1 级) | 普通档 | 第一层 | 60 | 53.3→58.3 | +5.0 ±2.8 | +5.0 ±2.8 | +| +3(1 级) | 普通档 | 第二层 | 60 | 9.4→14.3 | +4.9 ±4.1 | +4.9 ±4.1 | +| +3(1 级) | 普通档 | 第三层 | 60 | 0.0→20.0 | +20.0 ±17.7 | +20.0 ±17.7 | +| +3(1 级) | 完美档 | 第一层 | 60 | 86.7→93.3 | +6.7 ±3.3 | +6.7 ±3.3 | +| +3(1 级) | 完美档 | 第二层 | 60 | 32.7→33.9 | +1.2 ±2.5 | +1.2 ±2.5 | +| +3(1 级) | 完美档 | 第三层 | 60 | 17.6→15.8 | -1.9 ±1.8 | -1.9 ±1.8 | + +### 基础攻击(每级 flat +1) + +| 注入档 | 画像 | 层 | 配对局数 | 条件率 白板→档 | 差(点) | 折每级(点/级) | +|------------|--------|--------|----------|----------------|-------------|---------------| +| +1(1 级) | 普通档 | 第一层 | 60 | 53.3→61.7 | +8.3 ±8.0 | +8.3 ±8.0 | +| +1(1 级) | 普通档 | 第二层 | 60 | 9.4→18.9 | +9.5 ±9.1 | +9.5 ±9.1 | +| +1(1 级) | 普通档 | 第三层 | 60 | 0.0→0.0 | +0.0 ±0.0 | +0.0 | +| +1(1 级) | 完美档 | 第一层 | 60 | 86.7→90.0 | +3.3 ±5.8 | +3.3 ±5.8 | +| +1(1 级) | 完美档 | 第二层 | 60 | 32.7→25.9 | -6.8 ±9.0 | -6.8 ±9.0 | +| +1(1 级) | 完美档 | 第三层 | 60 | 17.6→28.6 | +10.9 ±15.6 | +10.9 ±15.6 | + +### 护甲等级(每级 flat +1) + +| 注入档 | 画像 | 层 | 配对局数 | 条件率 白板→档 | 差(点) | 折每级(点/级) | +|------------|--------|--------|----------|----------------|-----------|---------------| +| +1(1 级) | 普通档 | 第一层 | 60 | 53.3→55.0 | +1.7 ±1.7 | +1.7 ±1.7 | +| +1(1 级) | 普通档 | 第二层 | 60 | 9.4→12.1 | +2.7 ±2.8 | +2.7 ±2.8 | +| +1(1 级) | 普通档 | 第三层 | 60 | 0.0→0.0 | +0.0 ±0.0 | +0.0 | +| +1(1 级) | 完美档 | 第一层 | 60 | 86.7→88.3 | +1.7 ±1.7 | +1.7 ±1.7 | +| +1(1 级) | 完美档 | 第二层 | 60 | 32.7→32.1 | -0.6 ±0.6 | -0.6 ±0.6 | +| +1(1 级) | 完美档 | 第三层 | 60 | 17.6→17.6 | +0.0 ±0.0 | +0.0 | + +### 三行汇总与建议投值 + +| 属性 | 现行表值(点/级) | 实测每级(点/级, 合并) | 建议投值 | 状态 | +|----------|-----------------|-----------------------|----------|---------------| +| 生命上限 | 6 | +1.7 ±1.2 | 2 | 与表值偏差 -4 | +| 基础攻击 | 9 | +4.1 ±3.7 | 4 | 与表值偏差 -5 | +| 护甲等级 | 1 | +0.0 ±0.6 | 0 | 与表值偏差 -1 | +- 折算语义:每级该属性强化 ≈ 通关率带平移量(百分点)——配对同种子读数,护甲行即解锁后实测(强条目) +- 合并口径:逆方差加权跨(档位×画像×层,配对 bootstrap SE);带平移为线性单值近似——近带顶/带底的读数受天花板压缩,判读看 ④ 明细表 diff --git a/design/qa/m3-iter7-conversion-recal-20260929.raw.jsonl b/design/qa/m3-iter7-conversion-recal-20260929.raw.jsonl new file mode 100644 index 00000000..4f09851c --- /dev/null +++ b/design/qa/m3-iter7-conversion-recal-20260929.raw.jsonl @@ -0,0 +1,600 @@ +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9500, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9501, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9502, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9503, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9504, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9505, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9506, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9507, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9508, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9509, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9510, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9511, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9512, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 0, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9513, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9514, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9515, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9516, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9517, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9518, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9519, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9520, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9521, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9522, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9523, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9524, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9525, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9526, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9527, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9528, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9529, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9530, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9531, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9532, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9533, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9534, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9535, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9536, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9537, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9538, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9539, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9540, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9541, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9542, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9543, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9544, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9545, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9546, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9547, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9548, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9549, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 0, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9550, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9551, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9552, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9553, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9554, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9555, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9556, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9557, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9558, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9559, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9560, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9561, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9562, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9563, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9564, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9565, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9566, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9567, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9568, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9569, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 4, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9570, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9571, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9572, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9573, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9574, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9575, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9576, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9577, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9578, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9579, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9580, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9581, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9582, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9583, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9584, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9585, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9586, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9587, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9588, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9589, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9590, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9591, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "白板", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9592, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9593, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9594, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9595, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9596, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9597, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9598, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9599, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9600, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9601, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9602, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9603, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9604, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9605, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9606, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9607, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "白板", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9608, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9609, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9610, "seg": "adventure", "stopped_at": 1} +{"defeat": {}, "inject_tag": "白板", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9611, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9612, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9613, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9614, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9615, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9616, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "白板", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9617, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "白板", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9618, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "白板", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9619, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 5, "node_type": "battle"}, "forge": {"armor_class": 0, "atk": 0, "max_hp": 1}, "keystone": 20, "keystone_after": 13, "keystone_before": 0, "keystone_income": 33, "last_enemies": [], "levels_cleared": 2, "new_unlocks": ["probe_dust", "sapper_order", "loot_compass", "nest_pendulum"], "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "normal", "purchases": [{"attr": "max_hp", "price": 20, "tier": 1}], "result": "failed", "run_no": 1, "seed": 9620, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 0, "atk": 1, "max_hp": 1}, "keystone": 10, "keystone_after": 4, "keystone_before": 13, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": ["catacomb_scroll", "blast_kit"], "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "purchases": [{"attr": "atk", "price": 20, "tier": 1}], "result": "failed", "run_no": 2, "seed": 9621, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 0, "node_type": "battle"}, "forge": {"armor_class": 0, "atk": 1, "max_hp": 1}, "keystone": 10, "keystone_after": 15, "keystone_before": 4, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 0, "atk": 1, "max_hp": 3}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 3, "seed": 9622, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 0, "atk": 1, "max_hp": 2}, "keystone": 20, "keystone_after": 8, "keystone_before": 15, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 0, "atk": 1, "max_hp": 3}, "policy": "normal", "purchases": [{"attr": "max_hp", "price": 30, "tier": 2}], "result": "failed", "run_no": 4, "seed": 9623, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "forge": {"armor_class": 0, "atk": 1, "max_hp": 2}, "keystone": 0, "keystone_after": 8, "keystone_before": 8, "keystone_income": 0, "last_enemies": [], "levels_cleared": 0, "new_unlocks": [], "override": {"armor_class": 0, "atk": 1, "max_hp": 6}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 5, "seed": 9624, "seg": "campaign", "spend": "hp_first", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 5, "node_type": "battle"}, "forge": {"armor_class": 0, "atk": 2, "max_hp": 2}, "keystone": 20, "keystone_after": 1, "keystone_before": 8, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 0, "atk": 1, "max_hp": 6}, "policy": "normal", "purchases": [{"attr": "atk", "price": 30, "tier": 2}], "result": "failed", "run_no": 6, "seed": 9625, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "forge": {"armor_class": 0, "atk": 2, "max_hp": 2}, "keystone": 10, "keystone_after": 12, "keystone_before": 1, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 0, "atk": 2, "max_hp": 6}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 7, "seed": 9626, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 1, "atk": 2, "max_hp": 2}, "keystone": 20, "keystone_after": 15, "keystone_before": 12, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 0, "atk": 2, "max_hp": 6}, "policy": "normal", "purchases": [{"attr": "armor_class", "price": 20, "tier": 1}], "result": "failed", "run_no": 8, "seed": 9627, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 1, "atk": 2, "max_hp": 2}, "keystone": 10, "keystone_after": 26, "keystone_before": 15, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 1, "atk": 2, "max_hp": 6}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 9, "seed": 9628, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "forge": {"armor_class": 1, "atk": 2, "max_hp": 3}, "keystone": 20, "keystone_after": 4, "keystone_before": 26, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 1, "atk": 2, "max_hp": 6}, "policy": "normal", "purchases": [{"attr": "max_hp", "price": 45, "tier": 3}], "result": "failed", "run_no": 10, "seed": 9629, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 6, "node_type": "battle"}, "forge": {"armor_class": 1, "atk": 2, "max_hp": 3}, "keystone": 20, "keystone_after": 27, "keystone_before": 4, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 1, "atk": 2, "max_hp": 9}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 11, "seed": 9630, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 2, "atk": 2, "max_hp": 3}, "keystone": 10, "keystone_after": 8, "keystone_before": 27, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 1, "atk": 2, "max_hp": 9}, "policy": "normal", "purchases": [{"attr": "armor_class", "price": 30, "tier": 2}], "result": "failed", "run_no": 12, "seed": 9631, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 2, "atk": 2, "max_hp": 3}, "keystone": 10, "keystone_after": 19, "keystone_before": 8, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 2, "atk": 2, "max_hp": 9}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 13, "seed": 9632, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 2, "atk": 2, "max_hp": 3}, "keystone": 20, "keystone_after": 42, "keystone_before": 19, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 2, "atk": 2, "max_hp": 9}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 14, "seed": 9633, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 2, "atk": 3, "max_hp": 3}, "keystone": 20, "keystone_after": 20, "keystone_before": 42, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 2, "atk": 2, "max_hp": 9}, "policy": "normal", "purchases": [{"attr": "atk", "price": 45, "tier": 3}], "result": "failed", "run_no": 15, "seed": 9634, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "forge": {"armor_class": 2, "atk": 3, "max_hp": 3}, "keystone": 10, "keystone_after": 31, "keystone_before": 20, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 2, "atk": 3, "max_hp": 9}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 16, "seed": 9635, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {}, "forge": {"armor_class": 2, "atk": 3, "max_hp": 4}, "keystone": 30, "keystone_after": 9, "keystone_before": 31, "keystone_income": 45, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 2, "atk": 3, "max_hp": 9}, "policy": "normal", "purchases": [{"attr": "max_hp", "price": 67, "tier": 4}], "result": "completed", "run_no": 17, "seed": 9636, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 2, "atk": 3, "max_hp": 4}, "keystone": 20, "keystone_after": 32, "keystone_before": 9, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 2, "atk": 3, "max_hp": 12}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 18, "seed": 9637, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "forge": {"armor_class": 2, "atk": 3, "max_hp": 4}, "keystone": 0, "keystone_after": 32, "keystone_before": 32, "keystone_income": 0, "last_enemies": [], "levels_cleared": 0, "new_unlocks": [], "override": {"armor_class": 2, "atk": 3, "max_hp": 12}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 19, "seed": 9638, "seg": "campaign", "spend": "hp_first", "stopped_at": 1} +{"defeat": {}, "forge": {"armor_class": 2, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 1, "keystone_before": 32, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 2, "atk": 3, "max_hp": 12}, "policy": "normal", "purchases": [{"attr": "atk", "price": 67, "tier": 4}], "result": "completed", "run_no": 20, "seed": 9639, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 2, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 37, "keystone_before": 1, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 2, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 21, "seed": 9640, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 3, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 28, "keystone_before": 37, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 2, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [{"attr": "armor_class", "price": 45, "tier": 3}], "result": "completed", "run_no": 22, "seed": 9641, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 3, "atk": 4, "max_hp": 4}, "keystone": 20, "keystone_after": 51, "keystone_before": 28, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 3, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 23, "seed": 9642, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 3, "atk": 4, "max_hp": 4}, "keystone": 10, "keystone_after": 62, "keystone_before": 51, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 3, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 24, "seed": 9643, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 31, "keystone_before": 62, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 3, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [{"attr": "armor_class", "price": 67, "tier": 4}], "result": "completed", "run_no": 25, "seed": 9644, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 4}, "keystone": 10, "keystone_after": 42, "keystone_before": 31, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 26, "seed": 9645, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 78, "keystone_before": 42, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 27, "seed": 9646, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 30, "keystone_after": 14, "keystone_before": 78, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 12}, "policy": "normal", "purchases": [{"attr": "max_hp", "price": 100, "tier": 5}], "result": "completed", "run_no": 28, "seed": 9647, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 10, "keystone_after": 25, "keystone_before": 14, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 29, "seed": 9648, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 20, "keystone_after": 48, "keystone_before": 25, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 30, "seed": 9649, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 30, "keystone_after": 84, "keystone_before": 48, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 31, "seed": 9650, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 10, "keystone_after": 95, "keystone_before": 84, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 32, "seed": 9651, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 31, "keystone_before": 95, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "normal", "purchases": [{"attr": "atk", "price": 100, "tier": 5}], "result": "completed", "run_no": 33, "seed": 9652, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 4, "atk": 5, "max_hp": 5}, "keystone": 10, "keystone_after": 42, "keystone_before": 31, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 4, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 34, "seed": 9653, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 78, "keystone_before": 42, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 35, "seed": 9654, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 14, "keystone_before": 78, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [{"attr": "armor_class", "price": 100, "tier": 5}], "result": "completed", "run_no": 36, "seed": 9655, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 50, "keystone_before": 14, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 37, "seed": 9656, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 86, "keystone_before": 50, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 38, "seed": 9657, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 122, "keystone_before": 86, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 39, "seed": 9658, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 20, "keystone_after": 145, "keystone_before": 122, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 40, "seed": 9659, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 31, "keystone_before": 145, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "normal", "purchases": [{"attr": "max_hp", "price": 150, "tier": 6}], "result": "completed", "run_no": 41, "seed": 9660, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 67, "keystone_before": 31, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 42, "seed": 9661, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 103, "keystone_before": 67, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 43, "seed": 9662, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 139, "keystone_before": 103, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 44, "seed": 9663, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 25, "keystone_before": 139, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "normal", "purchases": [{"attr": "atk", "price": 150, "tier": 6}], "result": "completed", "run_no": 45, "seed": 9664, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 10, "keystone_after": 36, "keystone_before": 25, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 46, "seed": 9665, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 72, "keystone_before": 36, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 47, "seed": 9666, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 108, "keystone_before": 72, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 48, "seed": 9667, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 144, "keystone_before": 108, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 49, "seed": 9668, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 30, "keystone_before": 144, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [{"attr": "armor_class", "price": 150, "tier": 6}], "result": "completed", "run_no": 50, "seed": 9669, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 66, "keystone_before": 30, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 51, "seed": 9670, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 20, "keystone_after": 89, "keystone_before": 66, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "failed", "run_no": 52, "seed": 9671, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 125, "keystone_before": 89, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 53, "seed": 9672, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 161, "keystone_before": 125, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 54, "seed": 9673, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 197, "keystone_before": 161, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 55, "seed": 9674, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 8, "keystone_before": 197, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "normal", "purchases": [{"attr": "max_hp", "price": 225, "tier": 7}], "result": "completed", "run_no": 56, "seed": 9675, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 44, "keystone_before": 8, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 57, "seed": 9676, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 80, "keystone_before": 44, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 58, "seed": 9677, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 116, "keystone_before": 80, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 59, "seed": 9678, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 152, "keystone_before": 116, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "normal", "purchases": [], "result": "completed", "run_no": 60, "seed": 9679, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 0, "atk": 0, "max_hp": 2}, "keystone": 30, "keystone_after": 5, "keystone_before": 0, "keystone_income": 55, "last_enemies": [], "levels_cleared": 3, "new_unlocks": ["probe_dust", "sapper_order", "loot_compass", "nest_pendulum", "catacomb_scroll", "blast_kit"], "override": {"armor_class": 0, "atk": 0, "max_hp": 0}, "policy": "perfect", "purchases": [{"attr": "max_hp", "price": 20, "tier": 1}, {"attr": "max_hp", "price": 30, "tier": 2}], "result": "completed", "run_no": 1, "seed": 9680, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "forge": {"armor_class": 0, "atk": 0, "max_hp": 2}, "keystone": 10, "keystone_after": 16, "keystone_before": 5, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 0, "atk": 0, "max_hp": 6}, "policy": "perfect", "purchases": [], "result": "failed", "run_no": 2, "seed": 9681, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 0, "atk": 1, "max_hp": 2}, "keystone": 10, "keystone_after": 7, "keystone_before": 16, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 0, "atk": 0, "max_hp": 6}, "policy": "perfect", "purchases": [{"attr": "atk", "price": 20, "tier": 1}], "result": "failed", "run_no": 3, "seed": 9682, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 0, "atk": 2, "max_hp": 2}, "keystone": 20, "keystone_after": 0, "keystone_before": 7, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 0, "atk": 1, "max_hp": 6}, "policy": "perfect", "purchases": [{"attr": "atk", "price": 30, "tier": 2}], "result": "failed", "run_no": 4, "seed": 9683, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 1, "atk": 2, "max_hp": 2}, "keystone": 20, "keystone_after": 3, "keystone_before": 0, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 0, "atk": 2, "max_hp": 6}, "policy": "perfect", "purchases": [{"attr": "armor_class", "price": 20, "tier": 1}], "result": "failed", "run_no": 5, "seed": 9684, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 2, "atk": 2, "max_hp": 2}, "keystone": 30, "keystone_after": 9, "keystone_before": 3, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 1, "atk": 2, "max_hp": 6}, "policy": "perfect", "purchases": [{"attr": "armor_class", "price": 30, "tier": 2}], "result": "completed", "run_no": 6, "seed": 9685, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 2, "atk": 2, "max_hp": 3}, "keystone": 30, "keystone_after": 0, "keystone_before": 9, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 2, "atk": 2, "max_hp": 6}, "policy": "perfect", "purchases": [{"attr": "max_hp", "price": 45, "tier": 3}], "result": "completed", "run_no": 7, "seed": 9686, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 2, "atk": 2, "max_hp": 3}, "keystone": 20, "keystone_after": 23, "keystone_before": 0, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 2, "atk": 2, "max_hp": 9}, "policy": "perfect", "purchases": [], "result": "failed", "run_no": 8, "seed": 9687, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 2, "atk": 3, "max_hp": 3}, "keystone": 30, "keystone_after": 14, "keystone_before": 23, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 2, "atk": 2, "max_hp": 9}, "policy": "perfect", "purchases": [{"attr": "atk", "price": 45, "tier": 3}], "result": "completed", "run_no": 9, "seed": 9688, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 3, "atk": 3, "max_hp": 3}, "keystone": 30, "keystone_after": 5, "keystone_before": 14, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 2, "atk": 3, "max_hp": 9}, "policy": "perfect", "purchases": [{"attr": "armor_class", "price": 45, "tier": 3}], "result": "completed", "run_no": 10, "seed": 9689, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 3, "atk": 3, "max_hp": 3}, "keystone": 30, "keystone_after": 41, "keystone_before": 5, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 3, "atk": 3, "max_hp": 9}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 11, "seed": 9690, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 3, "atk": 3, "max_hp": 4}, "keystone": 30, "keystone_after": 10, "keystone_before": 41, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 3, "atk": 3, "max_hp": 9}, "policy": "perfect", "purchases": [{"attr": "max_hp", "price": 67, "tier": 4}], "result": "completed", "run_no": 12, "seed": 9691, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 3, "atk": 3, "max_hp": 4}, "keystone": 10, "keystone_after": 21, "keystone_before": 10, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 3, "atk": 3, "max_hp": 12}, "policy": "perfect", "purchases": [], "result": "failed", "run_no": 13, "seed": 9692, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 3, "atk": 3, "max_hp": 4}, "keystone": 20, "keystone_after": 44, "keystone_before": 21, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 3, "atk": 3, "max_hp": 12}, "policy": "perfect", "purchases": [], "result": "failed", "run_no": 14, "seed": 9693, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 3, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 13, "keystone_before": 44, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 3, "atk": 3, "max_hp": 12}, "policy": "perfect", "purchases": [{"attr": "atk", "price": 67, "tier": 4}], "result": "completed", "run_no": 15, "seed": 9694, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 6, "node_type": "battle"}, "forge": {"armor_class": 3, "atk": 4, "max_hp": 4}, "keystone": 20, "keystone_after": 36, "keystone_before": 13, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 3, "atk": 4, "max_hp": 12}, "policy": "perfect", "purchases": [], "result": "failed", "run_no": 16, "seed": 9695, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 5, "keystone_before": 36, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 3, "atk": 4, "max_hp": 12}, "policy": "perfect", "purchases": [{"attr": "armor_class", "price": 67, "tier": 4}], "result": "completed", "run_no": 17, "seed": 9696, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 4}, "keystone": 10, "keystone_after": 16, "keystone_before": 5, "keystone_income": 11, "last_enemies": [], "levels_cleared": 1, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 12}, "policy": "perfect", "purchases": [], "result": "failed", "run_no": 18, "seed": 9697, "seg": "campaign", "spend": "hp_first", "stopped_at": 2} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 52, "keystone_before": 16, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 12}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 19, "seed": 9698, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 4}, "keystone": 30, "keystone_after": 88, "keystone_before": 52, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 12}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 20, "seed": 9699, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 20, "keystone_after": 11, "keystone_before": 88, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 12}, "policy": "perfect", "purchases": [{"attr": "max_hp", "price": 100, "tier": 5}], "result": "failed", "run_no": 21, "seed": 9700, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 30, "keystone_after": 47, "keystone_before": 11, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 22, "seed": 9701, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 4, "max_hp": 5}, "keystone": 30, "keystone_after": 83, "keystone_before": 47, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 23, "seed": 9702, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 19, "keystone_before": 83, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 4, "max_hp": 15}, "policy": "perfect", "purchases": [{"attr": "atk", "price": 100, "tier": 5}], "result": "completed", "run_no": 24, "seed": 9703, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 55, "keystone_before": 19, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 5, "max_hp": 15}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 25, "seed": 9704, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 4, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 91, "keystone_before": 55, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 5, "max_hp": 15}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 26, "seed": 9705, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 27, "keystone_before": 91, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 4, "atk": 5, "max_hp": 15}, "policy": "perfect", "purchases": [{"attr": "armor_class", "price": 100, "tier": 5}], "result": "completed", "run_no": 27, "seed": 9706, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 20, "keystone_after": 50, "keystone_before": 27, "keystone_income": 23, "last_enemies": [], "levels_cleared": 2, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "perfect", "purchases": [], "result": "failed", "run_no": 28, "seed": 9707, "seg": "campaign", "spend": "hp_first", "stopped_at": 3} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 86, "keystone_before": 50, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 29, "seed": 9708, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 5}, "keystone": 30, "keystone_after": 122, "keystone_before": 86, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 30, "seed": 9709, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 8, "keystone_before": 122, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 15}, "policy": "perfect", "purchases": [{"attr": "max_hp", "price": 150, "tier": 6}], "result": "completed", "run_no": 31, "seed": 9710, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 44, "keystone_before": 8, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 32, "seed": 9711, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 80, "keystone_before": 44, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 33, "seed": 9712, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 5, "max_hp": 6}, "keystone": 30, "keystone_after": 116, "keystone_before": 80, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 34, "seed": 9713, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 2, "keystone_before": 116, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 5, "max_hp": 18}, "policy": "perfect", "purchases": [{"attr": "atk", "price": 150, "tier": 6}], "result": "completed", "run_no": 35, "seed": 9714, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 38, "keystone_before": 2, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 36, "seed": 9715, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 74, "keystone_before": 38, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 37, "seed": 9716, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 110, "keystone_before": 74, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 38, "seed": 9717, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 5, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 146, "keystone_before": 110, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 39, "seed": 9718, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 32, "keystone_before": 146, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 5, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [{"attr": "armor_class", "price": 150, "tier": 6}], "result": "completed", "run_no": 40, "seed": 9719, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 68, "keystone_before": 32, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 41, "seed": 9720, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 104, "keystone_before": 68, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 42, "seed": 9721, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 140, "keystone_before": 104, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 43, "seed": 9722, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 176, "keystone_before": 140, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 44, "seed": 9723, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 6}, "keystone": 30, "keystone_after": 212, "keystone_before": 176, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 45, "seed": 9724, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 23, "keystone_before": 212, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 18}, "policy": "perfect", "purchases": [{"attr": "max_hp", "price": 225, "tier": 7}], "result": "completed", "run_no": 46, "seed": 9725, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 59, "keystone_before": 23, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 47, "seed": 9726, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 95, "keystone_before": 59, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 48, "seed": 9727, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 131, "keystone_before": 95, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 49, "seed": 9728, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 167, "keystone_before": 131, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 50, "seed": 9729, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 6, "max_hp": 7}, "keystone": 30, "keystone_after": 203, "keystone_before": 167, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 51, "seed": 9730, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 14, "keystone_before": 203, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 6, "max_hp": 21}, "policy": "perfect", "purchases": [{"attr": "atk", "price": 225, "tier": 7}], "result": "completed", "run_no": 52, "seed": 9731, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 50, "keystone_before": 14, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 53, "seed": 9732, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 86, "keystone_before": 50, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 54, "seed": 9733, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 122, "keystone_before": 86, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 55, "seed": 9734, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 158, "keystone_before": 122, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 56, "seed": 9735, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 6, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 194, "keystone_before": 158, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 57, "seed": 9736, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 7, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 5, "keystone_before": 194, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 6, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [{"attr": "armor_class", "price": 225, "tier": 7}], "result": "completed", "run_no": 58, "seed": 9737, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 7, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 41, "keystone_before": 5, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 7, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 59, "seed": 9738, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {}, "forge": {"armor_class": 7, "atk": 7, "max_hp": 7}, "keystone": 30, "keystone_after": 77, "keystone_before": 41, "keystone_income": 36, "last_enemies": [], "levels_cleared": 3, "new_unlocks": [], "override": {"armor_class": 7, "atk": 7, "max_hp": 21}, "policy": "perfect", "purchases": [], "result": "completed", "run_no": 60, "seed": 9739, "seg": "campaign", "spend": "hp_first", "stopped_at": 0} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9500, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9501, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9502, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9503, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9504, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9505, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9506, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9507, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9508, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9509, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9510, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9511, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9512, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9513, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9514, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9515, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9516, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9517, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9518, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9519, "seg": "adventure", "stopped_at": 1} +{"defeat": {}, "inject_tag": "max_hp+3", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "completed", "seed": 9520, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9521, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9522, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9523, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9524, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9525, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9526, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9527, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9528, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9529, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9530, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9531, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 5, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9532, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9533, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9534, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9535, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9536, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9537, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9538, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9539, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9540, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9541, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9542, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9543, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9544, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9545, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9546, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9547, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9548, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9549, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 0, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9550, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9551, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9552, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9553, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9554, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9555, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9556, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9557, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9558, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "normal", "result": "failed", "seed": 9559, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9560, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9561, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9562, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9563, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9564, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9565, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9566, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9567, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9568, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9569, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9570, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9571, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9572, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9573, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9574, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9575, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9576, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9577, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9578, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9579, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9580, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9581, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9582, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9583, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9584, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9585, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9586, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9587, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9588, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9589, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9590, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9591, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "max_hp+3", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "completed", "seed": 9592, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9593, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9594, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9595, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9596, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9597, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9598, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9599, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9600, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9601, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9602, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9603, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9604, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9605, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9606, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9607, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "max_hp+3", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "completed", "seed": 9608, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9609, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9610, "seg": "adventure", "stopped_at": 1} +{"defeat": {}, "inject_tag": "max_hp+3", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "completed", "seed": 9611, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9612, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9613, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9614, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9615, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9616, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9617, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "max_hp+3", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9618, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "max_hp+3", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 0, "max_hp": 3}, "policy": "perfect", "result": "failed", "seed": 9619, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9500, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9501, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9502, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9503, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9504, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9505, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9506, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9507, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9508, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9509, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9510, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9511, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9512, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9513, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9514, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9515, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9516, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9517, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9518, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9519, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9520, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9521, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9522, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9523, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9524, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9525, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9526, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9527, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9528, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9529, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9530, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9531, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9532, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9533, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9534, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9535, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9536, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9537, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9538, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9539, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9540, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9541, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9542, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9543, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9544, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9545, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9546, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9547, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9548, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9549, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9550, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9551, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9552, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9553, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9554, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9555, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9556, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9557, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9558, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9559, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9560, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9561, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9562, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "atk+1", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9563, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9564, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9565, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9566, "seg": "adventure", "stopped_at": 3} +{"defeat": {}, "inject_tag": "atk+1", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9567, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9568, "seg": "adventure", "stopped_at": 1} +{"defeat": {}, "inject_tag": "atk+1", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9569, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9570, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9571, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9572, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9573, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9574, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9575, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9576, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9577, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9578, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9579, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9580, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9581, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9582, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9583, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9584, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9585, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9586, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9587, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9588, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9589, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9590, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9591, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9592, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "atk+1", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9593, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9594, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9595, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9596, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9597, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9598, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9599, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9600, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9601, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9602, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9603, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9604, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9605, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9606, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9607, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9608, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9609, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9610, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9611, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9612, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9613, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9614, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9615, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9616, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "atk+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9617, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9618, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "atk+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 0, "atk": 1, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9619, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9500, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9501, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 3, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9502, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9503, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9504, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9505, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9506, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9507, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9508, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9509, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9510, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9511, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9512, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9513, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9514, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9515, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9516, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9517, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9518, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9519, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9520, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9521, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9522, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9523, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9524, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9525, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9526, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9527, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9528, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9529, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9530, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9531, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9532, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9533, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9534, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9535, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9536, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9537, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9538, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9539, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9540, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9541, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9542, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9543, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9544, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9545, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9546, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9547, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9548, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9549, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 0, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9550, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9551, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9552, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 1, "node_id": 2, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9553, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9554, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9555, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 4, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9556, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9557, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9558, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "normal", "result": "failed", "seed": 9559, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9560, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9561, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9562, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9563, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9564, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9565, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9566, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9567, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9568, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9569, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 4, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9570, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9571, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9572, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9573, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9574, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9575, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9576, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9577, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9578, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9579, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9580, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9581, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9582, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9583, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9584, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9585, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 4, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9586, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9587, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9588, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9589, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9590, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9591, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "armor_class+1", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9592, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9593, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9594, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9595, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9596, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9597, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9598, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 2, "node_id": 6, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9599, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9600, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9601, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9602, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9603, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9604, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9605, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9606, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9607, "seg": "adventure", "stopped_at": 2} +{"defeat": {}, "inject_tag": "armor_class+1", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9608, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9609, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9610, "seg": "adventure", "stopped_at": 1} +{"defeat": {}, "inject_tag": "armor_class+1", "keystone": 30, "last_enemies": [], "levels_cleared": 3, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "completed", "seed": 9611, "seg": "adventure", "stopped_at": 0} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9612, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9613, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9614, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 3, "node_id": 7, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9615, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 1, "node_id": 6, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9616, "seg": "adventure", "stopped_at": 1} +{"defeat": {"level_index": 3, "node_id": 1, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 20, "last_enemies": [], "levels_cleared": 2, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9617, "seg": "adventure", "stopped_at": 3} +{"defeat": {"level_index": 2, "node_id": 9, "node_type": "boss"}, "inject_tag": "armor_class+1", "keystone": 10, "last_enemies": [], "levels_cleared": 1, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9618, "seg": "adventure", "stopped_at": 2} +{"defeat": {"level_index": 1, "node_id": 5, "node_type": "battle"}, "inject_tag": "armor_class+1", "keystone": 0, "last_enemies": [], "levels_cleared": 0, "override": {"armor_class": 1, "atk": 0, "max_hp": 0}, "policy": "perfect", "result": "failed", "seed": 9619, "seg": "adventure", "stopped_at": 1} diff --git a/design/qa/m3-iter7-exit-checklist-2026-09-29.md b/design/qa/m3-iter7-exit-checklist-2026-09-29.md new file mode 100644 index 00000000..040e2792 --- /dev/null +++ b/design/qa/m3-iter7-exit-checklist-2026-09-29.md @@ -0,0 +1,53 @@ +# M-3 迭代 7「魔法道具内容+元进度数值标定」出口人闸检查单(2026-09-29) + +> 定位:迭代 7 出口闸 = 用户实机目检(计划书 §9 U2)。代码面 T0-T8 已全落并过重闸(台账 259-263)。 +> 实机入口:开始菜单 → 开始冒险(**建议先在营地用钥石解锁道具工坊几件**——解锁门控下未解锁=零投放,全不解锁则道具系统不可见)。 + +## 一、魔法道具全链目检(七项) + +| # | 目检项 | 操作路径 | 过闸判据 | 勾选 | +|---|---|---|---|---| +| 1 | 道具掉落投放 | 解锁工坊后开冒险挖格 | 挖安全格偶尔获得道具(池占比 ~11%——工兵令/探巢摆钟/爆破工兵包三种),C 区对应槽位亮起 | ☐ | +| 2 | 奖励节点三选一 | 走到奖励节点 | 弹「关卡奖励点」三枚道具按钮(强制选择无继续);选一入背包+toast+回选路口 | ☐ | +| 3 | 两步使用交互 | C 区点槽 → 棋盘点目标 | 空间类(摆钟/爆破包):点槽选中金框+提示 → 点目标格 → 真视红框/预读徽章出现在 9 宫窗口;AP 类(工兵令):点槽即用+当轮 AP 立加 | ☐ | +| 4 | 拒绝零消耗 | 已开格/无未开格窗口/非挖掘期 | 点已开格 toast「目标越板」类拒绝且道具不消耗;板级无未开格时槽位置灰 | ☐ | +| 5 | 真视不是保护 | 对真视格插旗 | 红框格插旗照常扣 1 AP、标中照常兑付(真视=信息非保护) | ☐ | +| 6 | 工坊封存呈现 | 营地道具工坊看显影尘/地穴全图卷/探宝罗盘 | 显影尘/全图卷=「已解锁 · 能力封存中」(解锁后);探宝罗盘=「已退役」;不解锁的有效三件=「未解锁」且不掉落 | ☐ | +| 7 | 关卡末清空反馈 | 持道具通关一关 | 大奖励屏 toast「上关剩余 N 件魔法道具已随关卡结束清空」+C 区槽全空 | ☐ | + +## 二、代拍板追认清单(五项) + +| # | 事项 | 裁量内容 | 表态 | +|---|---|---|---| +| a | 掉落投放权重 | 三件 5/4/1 总 10(正向池 88 的 ~11%,渗透 ≈0.45 件/板;registry 设计值比例缩放,provisional 挂调参批) | 追认 ☐ / 调 ☐ | +| b | 奖励节点摇取形态 | 池 ≤3 全列(当前=全列选一);池扩充后注册序前 3(呈现侧零 RNG) | 追认 ☐ / 调 ☐ | +| c | 解锁门控默认态 | 空解锁集=零投放(夹具/白板零扰动——MC 剥 additive 字段 0/400 逐位实证) | 追认 ☐ / 调 ☐ | +| d | 探宝罗盘退役实现 | retired 留痕行(词表兼容/meta 六件恰全校验不破/存档旧键无害);营地「已退役」 | 追认 ☐ / 调 ☐ | +| e | 真视呈现形态 | 危险红内缩框(程序化,2px);预读=右下角金徽章(复用既有徽章位与身份查询面) | 追认 ☐ / 调 ☐ | + +## 三、U1 换算率读数呈报(拍板⑦——维持 vs 调值) + +verifier OFAT 配对复测(白板 120 + 三注入档各 120,种 9500,报告 design/qa/m3-iter7-conversion-recal-20260929.md): + +| 属性 | 现行表值(点/级) | 实测每级(点/级, 合并) | 工具建议 | 判读注记 | +|---|---|---|---|---| +| 生命上限 | 6 | +1.7 ±1.2 | 2 | 近带顶天花板压缩;SE 较大(60 局/档) | +| 基础攻击 | 9 | +4.1 ±3.7 | 4 | 同上 | +| 护甲等级 | 1 | +0.0 ±0.6 | 0 | 强条目实测(解锁后参数);近零差 | + +- **选项甲:维持 6/9/1**——实测偏低主因=天花板压缩+样本功率有限;表值语义=「带平移线性单值近似」非实测等价;不动则零数值风险。 +- **选项乙:按建议调低(2/4/0)**——读数导向;换算率影响判定端带平移与营地定价推算,调值连带 forge 定价锚复核。 +- **用户裁决:__________**(不裁则维持现状,调参批再议) + +## 四、重闸读数留档(T8,全部绿) + +- 冒烟 577/0(基线 576 净增 1);五探针 PASS;单测 12 套全过(新增 aux_items_test/aux_target_violation/reward_dangling_aux 三套件)。 +- doc 三闸/熵增闸:零新增违例(扫描 35→36 文件=node-reward.md 出生口径内增长)。 +- 素材机检 11/11 保持。 +- MC 对拍:**T8 vs T0 剥 additive 字段后 0/400 逐位一致**(门控空集=夹具态零投放零扰动——C2 履约证);T1 中间态(88 池无门控)差异=门控语义预期。additive 扩签(aux_cleared/aux_cleared_last/reward_events.aux_cleared)登记在案不参与派生。 +- verifier:白板+三注入档各 120 局(只测不判——带重锚归曲线调参批);换算率读数见 §三。 + +## 五、范围注记 + +- 显影尘/地穴全图卷效果重定=Alpha(deferred 封存呈现已落);反制批/构筑面=Alpha;单弱敌挖掘期跳过战斗遗留裁决=未搭车待点名。 +- 打包发布方案(素材不入库)=Alpha 前另议;换算率带重锚=曲线调参批。 diff --git a/roadmap.md b/roadmap.md index 6effd0b8..a1f85031 100644 --- a/roadmap.md +++ b/roadmap.md @@ -48,7 +48,7 @@ |---|---|---|---| | 迭代 5 | 读数重测与调参(原迭代 3) | M-2 出口闸;⑤号卡另需 ADR-0007 裁决(已裁丙落地) | ——**✅ 完成(2026-09-28 五卡落籍)**:基线重测〔三越带初判〕+杠杆扫描〔C3 组合锁值:岩浆1/plb0/percent4/卓尔100〕+AC 投值〔Boss-only 台阶 8/9/12〕+节点图生成特性批〔15 骨架+node_map 扩签+首次冒险脚本,冒烟 557→576〕;读数挂账〔完美 L1 丙·普通 L2 17.1% AC〕归出口人闸追认;明细=迭代 5 台账 230-241+design/qa 三报告。**2026-09-29 返工批**(U2 人闸三推翻两追认+目检 15/15 不过,台账 246/247):C1 两刀终态+AC v1 硬梯度重投+节点图池两规则重生成〔L1 前三位纯战斗/L2L3 层宽 4-5,模板 0 随重排〕——终态双窗读数〔普通 L1 ✓·普通 L2 10.6/13.6% ✗·完美 L1 84% 甲挂账→荆棘外延提案待批·完美 L2 22/32% ✗〕,缺口数字待批点丙追认;二轮目检=返工批出口人闸 | | 迭代 6 | 战斗演出完善(原 M-4 迭代 7,2026-09-29 前移;2026-09-28 用户立项,收编历史登记「战斗表现批」——台账 106「真实立绘/动画密度终稿归战斗表现批」,前置 P0 样张已随 M-1 解除) | 迭代 5 出口(已解) | ①资产管线正式化:pixelfixer 网格段+封闭灰袋清除并入 `tools/pixelize_candidates.py`(--fixer)+九张 48px 站桩槽位档生成(8 敌种+主角 normal,底中锚/NEAREST)②敌种立绘落位:按 `ui_kit.gd` TEX_ENEMY_* 常量名入 `game/assets/art/character/`,字形「敌」回退退役,目检 ③主角 portrait 替换(新 normal 态)+attack/hit 两态素材入包(命名/路径随计划书定)④主角三态切换挂事件:攻击演出→attack 态/受击→hit 态/回 idle,槽位 2× 整数放大适配 ⑤命中特效密度终稿:命中瞬间打击特效(台账 106 动画密度欠账清偿)⑥受击白光/演出链复核:弹道→闪白→血条→灰化全链+flash_hit 强度时长 ⑦fx_probe 断言扩充+轻闸接线 ⑧用户实机目检清单(战斗演出专项,本迭代人闸);**2026-09-29 全流程审计追加四件(用户裁定归本迭代,台账 243)**:⑨终局面板「明细回看」z 序修复(main.gd:361 绕模态栈直开,回看层登记序在终局层下、被全屏遮罩压死——改走 _open_modal+ui_click_probe 补终局入口断言)⑩GP 冒险收束呈现(adventure_runner.gd:231 清零前,冒险终局面板补「本局 GP 入账」行,兑现 ui_assembler.gd:52 双展示位承诺)⑪主角受击反馈+死亡演出(敌→主角伤害弹道 main.gd:505 直接 return、无白光——补弹道+flash_hit,死亡补专属演出,与敌方演出密度对等)⑫flat_damage 变异格视觉标记(tex_mutation 槽恒空、数字照常显示——接变异纹理或角标,可归因)。**T0 注(2026-09-29 裁定)**:美术素材不入 git 维持,`game/assets/art/` 目录补 .gitignore(现行素材在盘不入库,缺位走字形回退;素材移交方式=用户放盘,打包发布方案随 Alpha 前另议);**2026-09-29 落地**:T0-T8 十轮全落(worktree m3-iter6-20260929,台账 247-255)——卡①-⑫全兑现+审计四件;重闸全绿(冒烟 576/0+五探针+doc 三闸/熵增零新增+素材机检 11/11+MC 对拍 400/400 逐位一致〔锚已重锚 HEAD,原迭代 5 锚过期〕);**出口人闸=T9 目检进行中**(检查单+代拍板追认五项=design/qa/m3-iter6-exit-checklist-2026-09-29.md,素材移交口径更新=八敌+主角三态已管线自产落盘用户无需放盘);**已完成(2026-09-29 用户 U2 目检过闸,台账 256)**——迭代 6 出口成立,迭代 7 门解 | -| 迭代 7 | 魔法道具内容+元进度数值标定(原迭代 8+ 前两项编入) | 迭代 6 出口 | node-reward spec 随批出生+C 区道具槽接线+魔法道具内容(奖励节点空占位 node_overlay.gd:36 由本迭代兑现,营地工坊六件死解锁同批接局内效果);换算率复核/柜台定价标定;批末复跑 verifier 关键带(新力量源入局读数漂移属预期,破带才回调) | +| 迭代 7 | 魔法道具内容+元进度数值标定(原迭代 8+ 前两项编入) | 迭代 6 出口 | node-reward spec 随批出生+C 区道具槽接线+魔法道具内容(奖励节点空占位 node_overlay.gd:36 由本迭代兑现,营地工坊六件死解锁同批接局内效果);换算率复核/柜台定价标定;批末复跑 verifier 关键带(新力量源入局读数漂移属预期,破带才回调);**2026-09-29 落地**:T0-T8 八卡全落(worktree m3-iter7-20260929,台账 259-263)——八拍板点裁决落锁(①乙罗盘退役/②丙三选一/③甲解锁进投放池/④甲封存呈现/⑤甲两步交互/⑥甲三件 10/池 88/⑦⑧读数后裁与只测不判);重闸=冒烟 577/0+五探针+单测 12 套(含 aux 三新套件)+doc 三闸/熵增零新增+素材机检 11/11+MC 剥 additive 字段 0/400 逐位(门控空集=夹具态零投放零扰动);verifier 换算率复核读数出讫(生命 6→实测 1.7/攻击 9→4.1/护甲 1→0.0——U1 呈报待裁);**出口人闸=T9 目检进行中**(检查单+追认清单 design/qa/m3-iter7-exit-checklist-2026-09-29.md);完成标注待目检过 | | 迭代 8 | 冒险续玩断点+设置面+打磨包(2026-09-29 立项:用户裁「中断可续玩/退出即结算」两口径分离+审计 #5#6 随移——代排待追认) | 迭代 7 出口 | ①run 快照序列化:停点粒度断点(关卡序号/节点位/生命/本关加成区/GP 钱包/商店已购档/已抽模板),入 save.json 新域+schema 版本迁移;战斗中中断不存棋盘中局,续玩恢复至最近停点、当场战斗从头打 ②开始菜单「继续上局」按钮(存在断点才亮起;续玩与新冒险互斥确认)③中断/退出口径分离:中断=关游戏留断点可续;退出冒险=现行放弃流程(失败结算+清除断点)④最小设置面(音量/全屏/退出按钮/减动效开关从测试调整板转正+调试入口门控)⑤打磨包(RAP 与九徽章图例解码入 legend、封印旗纹理落位退役文字占位、放弃按钮文案收敛至 level-map 4 字上限、判定文案两处措辞统一)⑥冒烟/探针断言:断点写读往返、续玩幂等、退出清断点、无断点时按钮隐藏 ⑦实机目检人闸(中断重开续玩全流程) | | 迭代 9 | Alpha 验收(原迭代 6;2026-09-29 一批后移迭代 8、二批因新立迭代 8 顺延至此——内容闭环后验收) | 迭代 8 出口 | ①draw calls 真机测量(270→<200)②真人目检清单总清 ③07-体验验证清单总对账 ④真人通关率标定(真人 k 补跑并入) | ### M-4 Alpha 后深化与内容扩展(Release 4;2026-09-29 起内容闭环迭代(战斗演出/魔法道具/元进度标定)上移 M-3,本里程碑=Alpha 验收通过后的深化批)