merge: 放弃入口界面呈现批落籍——选路停点放弃按钮+冒险结构 v0.7(台账 119)
This commit is contained in:
commit
32c6169ca9
6 files changed
+56
-9
No files matched your search
@@ -170,7 +170,7 @@ GP(显示名「金币」)是冒险内的一次性属性提升货币:战斗
|
||||
|
||||
重开 = 全新一轮冒险:注入新主种子、从第一关、满血、空手——不是"重打刚才那一关"。上一局清零的是生命账本、库存与种子;唯一保留面是冒险摘要,它给每次死亡一个可对照的坐标("这局到第二层"),重开因此是新局面而不是复读。
|
||||
|
||||
主动放弃按与失败同型结算:已获得的大奖励不追回、已到手的保留,摘要标记未打穿。放弃请求只在非战斗期受理,战斗进行中一律拒绝(战斗域单事务在飞)。MVP 没有放弃的界面入口,语义先行预留,入口呈现后置。
|
||||
主动放弃按与失败同型结算:已获得的大奖励不追回、已到手的保留,摘要标记未打穿。放弃请求只在非战斗期受理,战斗进行中一律拒绝(战斗域单事务在飞)。放弃的界面入口挂在[关卡节点地图](关卡节点地图.md)的选路覆盖层上——选路停点天然是非战斗期,按钮只在冒险模式开放(单关测试直入口没有可放弃的冒险对象);战斗进行中没有选路停点,入口因此天然不可达,拒绝分支仅作防御兜底。
|
||||
|
||||
主种子(本文含义:冒险开始时注入的一个随机种子,本局全部随机性都派生自它)在冒险开始时注入恰一次。冒险内的雷图生成、奖励抽取、遭遇掷骰与 GP 掉落掷定(消费 gp_drop 封闭流)全部派生自它,冒险内不重置、不逐关播种——早期切片"每关开局各自播种"是没有冒险层时的历史简化,已改写为全冒险单一种子。冒险的可复现域 = 主种子 + 各随机流计数器,供复盘与快照(见[存档序列化](../表现与支撑/存档序列化.md))。重开抽到的种子与上一局相同是允许的(随机源范围小,撞种子不算错误),但生成新种子不得复用玩法里的随机数。
|
||||
|
||||
@@ -230,8 +230,6 @@ GP(显示名「金币」)是冒险内的一次性属性提升货币:战斗
|
||||
|
||||
| 优先级 | 内容 | 后置原因 |
|
||||
|---|---|---|
|
||||
| P1 | 两关序列生效(第二关行集扩展批) | 前提 = 难度曲线与Boss的第二关深度轴行值填充批;未落地前以单关冒险运行(合法态) |
|
||||
| P1 | 放弃入口的界面呈现 | MVP 无界面入口——仅语义预留(非战斗期受理、同失败型结算);呈现归 HUD框架与 UX 批 |
|
||||
| P2 | 大奖励形态扩展(三选一 / 攻击型 / 通关加成) | 冒险表扩列结构位已留;设计随元进度定稿 |
|
||||
| P2 | 冒险开始参数面消费 | 预留给未来跨局加成注入(MVP 空参数,结构同覆盖值通道);归元进度 |
|
||||
| P2 | 冒险长度扩展(多于两关) | MVP 两关对比愿景单局 20–40 分钟;扩关 = 内容批,节奏按真人单关时长数据定 |
|
||||
@@ -265,7 +263,7 @@ GP(显示名「金币」)是冒险内的一次性属性提升货币:战斗
|
||||
- 收束次序:通关宣布到达时库存已被关卡节点地图先行清空;重复的关卡结束宣布被拒绝,账本与摘要零变化。
|
||||
- 覆盖义务:冒烟断言——行集内每个战斗与关底节点(关、深)在敌人与棋盘生成的数值表中有精确行;序列关数 = 行集关数。
|
||||
- 生效前提未兑现(第二关行缺行):以单关冒险运行(合法态),两关断言显式跳过而非失败。
|
||||
- 放弃:战斗中的放弃请求被拒绝;非战斗期放弃按失败同型结算,已获大奖励不追回。
|
||||
- 放弃:战斗中的放弃请求被拒绝;非战斗期放弃按失败同型结算,已获大奖励不追回;放弃入口仅在选路停点呈现且只在冒险模式开放(单关测试直入口无放弃按钮)。
|
||||
- 种子域:冒险内零随机流自开,一切随机派生自主种子(含 GP 掉落掷定的 gp_drop 封闭流);同种子同操作序列两局逐位可复现。
|
||||
- GP 账本封闭:钱包只有三个收口——战斗完成入账恰一次(掉落掷定 + 关级加值 + 战斗内缓冲合计)、商店购买出账、冒险收束清零;战斗内缓冲与钱包隔离,战斗进行中钱包零变动。
|
||||
- GP 不留痕:GP 不入存档、不入冒险摘要;重开后钱包从零开始。
|
||||
@@ -285,3 +283,4 @@ GP(显示名「金币」)是冒险内的一次性属性提升货币:战斗
|
||||
| v0.4 | 2026-09-17 | 数值纪律收口批:正文与调参表 knob 现行值改指路存根(事实源 data/tables/*.tres 与 registry),3 处失同步修正(示例轨迹改纯符号〔旧 50/50 生命轴示例作废〕、大奖励 +10/+10 改读 adventure_table 行值并删换算率数字锚、调参表 30/10/10 三格改读 level.tres / adventure_table) |
|
||||
| v0.5 | 2026-09-20 | **GP+商店房批(用户拍板——与关卡节点地图 v1.1 / 战斗结算 v0.23 / 地图战斗资源 v0.15 / 难度曲线与Boss v0.18 / registry / 切片同批)**:① 新增「GP 冒险账本」节——钱包三收口(战斗完成统一入账 / 商店购买出账 / 冒险收束清零)+ 战斗内缓冲隔离语义(格面兑付入缓冲、战斗完成统一到账、战斗域零钱包状态);② 统一冒险加算区成文——商店购买与关卡大奖励上限提升同一本账(三轴 {攻击, 生命上限, 护甲等级},经覆盖值通道生效;购血 = 上限与当前生命同步 +Δ);③ GP 掉落掷定消费 gp_drop 封闭随机流(主种子派生)登记进主种子节与调参表;④ GP 不入存档、不入冒险摘要;范围表 / 大奖励表 / 依赖表 / 验收标准同步。数值全 provisional-pending-曲线调参批,行值读 shop.tres |
|
||||
| v0.6 | 2026-09-21 | **冒险结构实现批落地登记(切片 AdventureRunner + LevelRunner 账本外置 + AdventureTable 建表——与切片代码 / registry / 03 / 06 / roadmap 同批)**:本批只记实现批状态,正文规则口径零改动。落地面 = 三关正式序列生效(首页「开始冒险」)、接口契约四件套正式侧承载(开始关卡 start_level_external / 战斗结果上报共享账本直写 / 治疗封顶回报 apply_rest / 关卡结束 level_finished)、生命账本与 GP 冒险账本上交冒险结构层、大奖励非末关恰兑付一次(末关钥石照记)、冒险摘要五件事产出、主种子恰一次注入(registry rng_service new_adventure 调用权同批登记)、结算受理只算一次;06 待办「两关序列未生效」「切片行进代码与定稿的接口漂移」「冒险表未建表」三条随批解决移除。**规划书冲突按代码为准登记两处**:①大奖励 `_pending_next_level` 置位先于 emit(信号同步派发——处理器内立即确认需标记已就位);②放弃受理补 state=running 守卫(契约 7 结算受理只算一次的 abandoned 侧对齐) |
|
||||
| v0.7 | 2026-09-21 | **放弃入口界面呈现批(用户拍板「放弃接口也要有」——台账 119,推翻本文原「MVP 无界面入口、呈现后置」条款)**:① 放弃入口挂[关卡节点地图](关卡节点地图.md)选路覆盖层(选路停点 = 天然非战斗期;战斗中拒绝转为防御兜底分支——入口在战斗期不可达);② 入口只在冒险模式开放,单关测试直入口没有可放弃的冒险对象;③ 正文改现行口径(放弃节 / 验收标准放弃条),P1 后置表「放弃入口的界面呈现」随落地移除(同表「两关序列生效」系 v0.6 已落地漏收口,顺手同口径移除);④ 验收闸 = ui_probe 三断言(默认隐藏 / 冒险模式可见 / 首战中按下被拒 state 保持 running)+ 冒烟既有放弃两态 API 断言 |
|
||||
@@ -16,8 +16,10 @@
|
||||
| 2026-09-15 | 命名清偿批;格面资源批(五段结算/极性路由/可选类删除);攻击类型与奖励抽象分离;护甲等级登记批;伤害量值区间批 |
|
||||
| 2026-09-16 | 行动点压速批 8→6;护甲等级掷点批落地(smoke 233 全绿);AP6+AC 验收判读口径 v1.0;06-待办清单建账改版;系统更名批;敌人技能池提案对答启动 |
|
||||
| 2026-09-17 | 敌人技能池提案定稿(1c63830);技能池实施批落地(smoke 263 全绿,待收编);魔法道具切片期空内容拍板;关卡节点地图定稿批解锁;跨会话状态持久化批(快照节 + 本文件 + 守卫文案升级) |
|
||||
| 2026-09-20 | 第三关内容批(灰矮人矿城行集 + 测试直入口,smoke 375 全绿);GP+商店房实施批(九型格面+随机掉落+Boss前商店房+统一加算区,smoke 437 全绿);八型批呈现层漏网修复(真人试玩卡断——行协议呈现层同步闸 11 断言) |
|
||||
| 2026-09-21 | **冒险结构实现批:切片从三个单关 demo 升级为一局完整三关冒险**(AdventureRunner+LevelRunner 账本外置+AdventureTable 建表;三关正式序列生效;smoke 482 全绿);存档序列化批(SaveManager 落地:单档 JSON 存档读写/版本迁移/损坏兜底 + 元进度四件与冒险摘要入档)——元进度批(钥石消费)挂点就位 |
|
||||
| 2026-09-18 | 加法核数值语言拍板落地(台账 75)+ 80 遍模拟试玩基线(台账 76);无伤通关根因批(行动点压速 8→6);英雄双轴批(甲/攻类型可配置);伤害道具批五型→七型;战斗数值盘问会话四收口;关卡节点地图 v1.0 定稿(分支节点图拍板);元进度定名永久强化+营地三柜台 |
|
||||
| 2026-09-19 | 验收读数重测批落地(4708940);掷点流种子偏置根因修复 A+B 案(R3 混淆派生 + MC unique 模式);插旗不可逆批(台账 87,冒烟 331);普通画像 v2 基础定式拍板(普通=基础定式/完美=上界仪);技能池新效应词汇批(妨害技+必中附加分量,smoke 306);清图支配性对账重跑(c8e5afd);迭代闭环仪表盘落地(台账 78);worktree 铁律立规 |
|
||||
| 2026-09-20 | 第三关内容批(灰矮人矿城行集 + 测试直入口,smoke 375 全绿);GP+商店房实施批(九型格面+随机掉落+Boss前商店房+统一加算区,smoke 437 全绿);八型批呈现层漏网修复(真人试玩卡断——行协议呈现层同步闸 11 断言);第一层定名「地精洞窟」 |
|
||||
| 2026-09-21 | **冒险结构实现批:切片从三个单关 demo 升级为一局完整三关冒险**(AdventureRunner+LevelRunner 账本外置+AdventureTable 建表;三关正式序列生效;smoke 482 全绿);存档序列化批(SaveManager 落地:单档 JSON 存档读写/版本迁移/损坏兜底 + 元进度四件与冒险摘要入档,smoke 518 全绿);放弃入口界面呈现批(用户拍板「放弃接口也要有」——选路停点挂放弃按钮,台账 119)——元进度批(钥石消费)挂点就位 |
|
||||
|
||||
## 路线图(主线路线与门)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
1. 用 Godot 4.7.2 打开本目录(含 `project.godot` 的文件夹)
|
||||
2. 按 F5 运行(主场景 `presentation/main.tscn`)
|
||||
3. **主入口:`▶ 开始冒险(三关连探:地精洞窟 → 幽暗地域 → 灰矮人矿城)`**——一条命走完三关(冒险结构实现批 2026-09-21:生命/GP/加算区跨关同账、非末关通关发大奖励〔上限提升+血回满+钥石〕、任意战斗倒下冒险终、结算屏出冒险摘要五件事);首关节点链:战→战→赏→战→战→疗→王。`▶ 测试直入口 · 第二关 / 第三关` 保留单关试玩模式
|
||||
3. **主入口:`▶ 开始冒险(三关连探:地精洞窟 → 幽暗地域 → 灰矮人矿城)`**——一条命走完三关(冒险结构实现批 2026-09-21:生命/GP/加算区跨关同账、非末关通关发大奖励〔上限提升+血回满+钥石〕、任意战斗倒下冒险终、结算屏出冒险摘要五件事;选路停点可「放弃冒险」(同失败结算,2026-09-21 用户拍板补入口));首关节点链:战→战→赏→战→战→疗→王。`▶ 测试直入口 · 第二关 / 第三关` 保留单关试玩模式
|
||||
4. `测试用 · 角色数值调整板`:攻击/生命百分比加成(模拟天赋树解锁)+ 批量模拟(输出通关率/承伤期望/败北节点分布)
|
||||
|
||||
headless 冒烟(55 项断言,含关卡线性推进/满配通关/裸装败北/回放确定性,约 30 秒):
|
||||
|
||||
@@ -137,6 +137,7 @@ func _build_ui() -> void:
|
||||
review_overlay.closed.connect(_on_modal_closed.bind(review_overlay))
|
||||
node_overlay.continue_pressed.connect(_on_node_continue)
|
||||
route_overlay.route_chosen.connect(_on_route_chosen)
|
||||
route_overlay.abandon_requested.connect(_on_abandon_requested) # 放弃入口(2026-09-21 用户拍板——台账 119)
|
||||
shop_overlay.buy_requested.connect(_on_shop_buy)
|
||||
shop_overlay.leave_pressed.connect(_on_shop_leave)
|
||||
_end_overlay.review_pressed.connect(_on_end_review)
|
||||
@@ -223,6 +224,7 @@ func _start_full_level(level_index: int = 1) -> void:
|
||||
runner.wallet_changed.connect(_on_wallet_changed)
|
||||
_level_active = true
|
||||
_adventure_mode = false
|
||||
route_overlay.set_abandon_available(false) # 单关测试直入口无冒险可放弃(放弃语义对象 = 整局冒险)
|
||||
_reset_run_scope()
|
||||
log_view.clear()
|
||||
var seed_val := _seed_value()
|
||||
@@ -250,6 +252,7 @@ func _start_adventure() -> void:
|
||||
adventure.adventure_finished.connect(_on_adventure_finished)
|
||||
adventure.level_started.connect(_on_adventure_level_started)
|
||||
_level_active = true
|
||||
route_overlay.set_abandon_available(true) # 放弃入口挂选路停点(天然非战斗期——2026-09-21 用户拍板)
|
||||
_reset_run_scope()
|
||||
log_view.clear()
|
||||
var seed_val := _seed_value()
|
||||
@@ -311,7 +314,7 @@ func _on_level_finished(payload: Dictionary) -> void:
|
||||
_level_active = false
|
||||
var result: String = String(payload.get("result", ""))
|
||||
settlement = null
|
||||
route_overlay.visible = false # 终局兜底(选路口非 Boss 节点才有——防御性收层)
|
||||
_close_modal(route_overlay) # 终局兜底(放弃入口新场景:选路层在开态——走模态栈恢复其遮挡面;未开过时 close 容错)
|
||||
_sync_settlement_visuals() # → 全关
|
||||
info_panel.set_status_cleared_feedback() # 状态槽全清可见反馈(增益状态×4④)
|
||||
stage.gray_all_enemies() # 死亡兜底:站桩灰化残位(禁瞬消语义的战斗收尾面)
|
||||
@@ -344,7 +347,7 @@ func _on_adventure_finished(summary: Dictionary) -> void:
|
||||
_level_active = false
|
||||
var result: String = String(summary.get("result", ""))
|
||||
settlement = null
|
||||
route_overlay.visible = false # 终局兜底(选路口非 Boss 节点才有——防御性收层)
|
||||
_close_modal(route_overlay) # 终局兜底(放弃入口新场景:选路层在开态——走模态栈恢复其遮挡面;未开过时 close 容错)
|
||||
_sync_settlement_visuals() # → 全关
|
||||
info_panel.set_status_cleared_feedback() # 状态槽全清可见反馈(增益状态×4④)
|
||||
stage.gray_all_enemies() # 死亡兜底:站桩灰化残位(禁瞬消语义的战斗收尾面)
|
||||
@@ -608,6 +611,17 @@ func _on_route_chosen(node_id: int) -> void:
|
||||
push_error("[组合根] 选路被拒(编号 %d 不在候选)" % node_id)
|
||||
|
||||
|
||||
func _on_abandon_requested() -> void:
|
||||
# 放弃入口(2026-09-21 用户拍板「放弃接口也要有」——推翻 冒险结构.md「MVP 无界面入口」后置条款;
|
||||
# 入口挂选路停点 = 天然非战斗期,拒绝分支仅防御在案):受理 → 冒险放弃结算(同失败型,
|
||||
# 已获大奖励不追回)→ adventure_finished 同步到达 → 终局面收层
|
||||
if not _adventure_mode or adventure == null:
|
||||
return
|
||||
if not adventure.abandon():
|
||||
logger.log_ux("ux_reject", {"source": "abandon", "sub_reason": "battle_in_flight"})
|
||||
board_zone.toast.show_toast("战斗进行中——无法放弃", "warn")
|
||||
|
||||
|
||||
# ---- 商店覆盖层与 GP 钱包(GP+商店房实施批——写调用唯一归组合根)----
|
||||
|
||||
func _on_shop_buy(product_id: String) -> void:
|
||||
|
||||
@@ -5,10 +5,14 @@
|
||||
# 唯一前进通道 = 点候选按钮 → route_chosen(node_id) → 组合根转 runner.pick_next_node。
|
||||
# 高内聚边界:只读 runner 成文出口(nodes()/visited_ids()/node_index/next_candidate_ids())做渲染,
|
||||
# 无任何写面;图形为程序化占位质量(占位纪律)。
|
||||
# 放弃入口(2026-09-21 用户拍板「放弃接口也要有」——台账 119;推翻 冒险结构.md「MVP 无界面入口」
|
||||
# 后置条款):选路停点 = 天然非战斗期(接口契约:战斗中放弃一律拒绝),按钮常驻本层底部;
|
||||
# 可见性归组合根(冒险模式开、单关测试直入口关——放弃的语义对象是"整局冒险")。
|
||||
class_name RouteOverlay
|
||||
extends Control
|
||||
|
||||
signal route_chosen(node_id: int)
|
||||
signal abandon_requested
|
||||
|
||||
const COL_ROOM_DONE := UiKit.GOLD_DIM # 已到——暗金
|
||||
const COL_ROOM_CURRENT := UiKit.GOLD # 当前——奖励金
|
||||
@@ -21,6 +25,7 @@ const NODE_LABELS := {"battle": "战", "reward": "赏", "rest": "疗", "boss": "
|
||||
var _runner = null
|
||||
var _btn_box: VBoxContainer
|
||||
var _title: Label
|
||||
var abandon_btn: Button # 放弃入口(可见性归组合根 set_abandon_available——冒险模式开/单关测试直入口关)
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
@@ -45,9 +50,23 @@ func _init() -> void:
|
||||
_btn_box = VBoxContainer.new()
|
||||
_btn_box.add_theme_constant_override("separation", 6)
|
||||
box.add_child(_btn_box)
|
||||
abandon_btn = UiKit.button("🏳 放弃冒险(同失败结算——已获大奖励保留)")
|
||||
abandon_btn.add_theme_color_override("font_color", UiKit.FLAG_RED)
|
||||
abandon_btn.pressed.connect(_emit_abandon)
|
||||
abandon_btn.visible = false
|
||||
box.add_child(abandon_btn)
|
||||
visible = false
|
||||
|
||||
|
||||
# 放弃入口可见性(组合根在冒险启动/单关直入口启动时切换——语义对象 = 整局冒险)
|
||||
func set_abandon_available(v: bool) -> void:
|
||||
abandon_btn.visible = v
|
||||
|
||||
|
||||
func _emit_abandon() -> void:
|
||||
abandon_requested.emit()
|
||||
|
||||
|
||||
# 打开选路口(cands = 候选节点引用数组;runner 只读用于整图渲染)
|
||||
func open_choices(cands: Array, runner) -> void:
|
||||
_runner = runner
|
||||
|
||||
@@ -13,10 +13,23 @@ func _ready() -> void:
|
||||
var main = load("res://presentation/main.tscn").instantiate()
|
||||
add_child(main)
|
||||
await get_tree().process_frame
|
||||
# ---- 放弃入口(2026-09-21 用户拍板——台账 119):默认隐藏(单关测试直入口无冒险可放弃)----
|
||||
if main.route_overlay.abandon_btn == null or main.route_overlay.abandon_btn.visible:
|
||||
print("[ui_probe] FAIL — 放弃按钮默认应隐藏(单关测试直入口关)")
|
||||
get_tree().quit(1)
|
||||
return
|
||||
main._start_full_level()
|
||||
await get_tree().process_frame
|
||||
await get_tree().process_frame
|
||||
var problems: Array = []
|
||||
# ---- 放弃入口·冒险模式可见 + 战斗中按下被拒(真实按钮路径——入口挂选路停点,战斗中拒绝为防御分支)----
|
||||
if main.route_overlay.abandon_btn == null or not main.route_overlay.abandon_btn.visible:
|
||||
problems.append("冒险模式放弃按钮未开放(选路停点入口在案)")
|
||||
else:
|
||||
main.route_overlay.abandon_btn.pressed.emit()
|
||||
await get_tree().process_frame
|
||||
if main.adventure == null or String(main.adventure.state) != "running":
|
||||
problems.append("首战中放弃未被拒(战斗域单事务在飞——state 应保持 running)")
|
||||
# ---- 既有断言(回归基线)----
|
||||
if main.board_view._cells.is_empty():
|
||||
problems.append("棋盘格未生成(cells=0)")
|
||||
|
||||
Reference in new issue
Block a user