← 迷途之梦 · 官方数据 续作开发基础 v0.2

《迷途之梦》续作开发基础 · v0.2

写于「完整通读全部源码 + 用自动操作用户端完整通关一轮」之后。 目的只有一个:下次要往游戏里加东西时,不用再重新读一遍代码。 源码目录:lost-dream/ 可执行版:E:\godotgame\迷途之梦-未成品\迷途之梦.exe 引擎:Godot 4.5 stable(Forward+),1920×1080 设计分辨率,窗口 1280×720,物理 120Hz。 重要事实:用户端 迷途之梦.pck(MD5 0130E5A2…)与源码 build/迷途之梦.pck 完全一致, 也就是说 E:\godotgame\迷途之梦-未成品\ 里那个 exe 就是当前源码构建的,不存在「exe 比源码旧」的问题。

0. 一句话现状

能玩通的完整流程 9 个屏幕、3 个战斗章、2 个 Boss、1 段现实层探索;内容量约 10–18 分钟。 系统骨架(章节数据化、存档、暂停、音效、后处理)都在,缺的是「第 3 章以后的剧情、第二个现实层场景、结局分支」。


1. 当前版本的完整流程

标题
 → 序章(现实层卧室:失眠 / 吃药 / 时间倒流到 7 月 / 失眠开始 / 快进回 10 月)
 → 入梦白幕
 → 教学关「热身」(空镜头对话 → 美美浮现 → E 拔剑 → 五个练习)
 → 第一章「鹿人店的一天」:5 波训练 → 记忆碎片(解锁重击/斩惑)→ Boss「假面」(26 血,二阶段)
 → 第一章完过场(白 → 白天房间对话 → 黑屏核桃对话 →「第 一 章 · 完」)
 → 第二章「家」(现实层探索:房间 → 客厅 → 书房找蓝色医书 → 读书/纸条/入夜 → 回床边吃药入睡)
 → 第二章梦境(鹿人店夜战 3 波,无 Boss,打完 3 句过渡台词)
 → 第二章「丛林」(3 波:野猪 + 藤蔓)→ Boss「丛 林 石 像」(33 血;血量掉到 17 时**掉头**,变成身体 10 血 + 飞头 7 血)
 → 结束卡「——垂直切片 · 完——」→ 回标题

章节 id:1(鹿人店战斗)→ 2(家,kind=house,睡后 force_arena 复用 id 2 的战斗数据)→ 21(丛林)。 这套「一个 id 同时挂现实层和梦境战斗」的做法见 scenes/chapters.gd 第 61–158 行。


2. 本轮实测通关记录(可复现)

2.1 怎么测的

唯一的例外是「同一波卡死 150 秒」时临时打开 player.god_mode(本轮没有触发)。

教学五步、记忆碎片、危险翻滚 / 破梦 / 重击控场、看门狗、截图。

命令(源码跑):

E:\godot\Godot_v4.5-stable_win64_console.exe --path <lost-dream> -- --auto --bot --autodir=<截图目录>

2.2 实测时间线(自动操作,含对话快进)

主记录取自第三轮(playtest-通关实录/通关日志-自动操作.txt):

t(秒) 事件 备注
0.4标题1.5 秒后按键
2.6进入序章
14.9进入教学关32 个序章步骤走完
34.0进入第一章13 句入梦对话 + 拔剑 + 教学五步共 19 秒
34–104第一章 5 波 + 碎片 + 假面死亡 2 次(第 4 波 1 次、假面 1 次)
104.8第一章完过场梦醒 / 黑屏 / 章节卡,约 15 秒
120.0进入第二章「家」卧室 → 客厅 → 书房 → 读书(约 20 秒)→ 回卧室睡觉
165.9第二章梦境 3 波死亡 1 次
199.1第二章「丛林」3 波 + 石头 Boss,死亡 1 次
~252结束卡
264自动退出整局 264 秒

整局 264 秒(自动操作,死亡 4 次),正常游玩约 10–18 分钟。全流程无卡死、无崩溃、无脚本报错。

对照组:同一套自动操作但不带「危险翻滚 / 破梦 / 重击」辅助时,会在「丛林 · 三」(3 野猪 + 2 藤蔓) 连续死亡 15 次、每次重开同一波满血,永远过不去(日志见 对照组-无战斗辅助-丛林卡死.txt)。 这是本轮最有价值的一条实测结论——丛林关的失败不是操作问题,是数值/机制问题(见 §7.2)。

2.3 截图索引(docs/playtest-通关实录/)

文件 内容
01_enter_title.png标题
02_enter_prologue.png序章卧室
03_enter_arena_ch1_tut.png教学关(鹿人店夜景)
04_enter_arena_ch1.png第一章第一波
05_death_1.png第一次死亡(水面浮起)
06_boss_appear.png假面登场
07_death_2.png死在 Boss 手里
08_boss_phase_2.png假面二阶段(红眼)
09_enter_chapter_end.png第一章完过场(白幕)
10_enter_house.png进入第二章「家」
11–15_house_*.png卧室 / 客厅 / 书房 / 回客厅 / 回卧室
16_enter_arena_ch2.png第二章梦境(鹿人店夜战)
17_death_3.png第二章死亡
18_enter_arena_ch21.png丛林
19_boss_appear.png石头 Boss 登场(公告期,本体还没生成)
20_death_4.png石头 Boss 战死亡
21_enter_end_card.png结束卡进入
22_final_end_card.png结束卡
23_石头Boss本体.png石头 Boss 本体(--state=boss3 --auto 补拍)
24_假面本体.png假面本体 + 血条(--state=boss 补拍)

日志:通关日志-自动操作.txt(每 4 秒一次状态快照,含 t= 时间戳)、 对照组-无战斗辅助-丛林卡死.txt(同一套操作但去掉战斗辅助,证明丛林关卡死)、 关卡单测-丛林.txt(--state=arena3 单章跑通,93 秒)。

2.4 实测确认「真的能用」的东西

2.5 实测暴露的问题(按影响排序)

1. 第二章丛林是难度断崖:不带战斗辅助时在「丛林 · 三」(3 野猪 + 2 藤蔓)连续死亡 15 次, 每次重开都是同一波满血,等于卡死;加上「看到起手就翻滚 + 破梦 + 重击控场」后才 1 次过关。 2. 藤蔓的减速是死亡螺旋(2026-10-27 已修,见文末「改动记录」):改版前被打中 → 6 秒内移速减半、不能翻滚、跳不高。 而丛林同时有 3 只冲锋野猪。一旦中了第一下,玩家几乎没有任何主动脱身手段(翻滚正是唯一解)。 3. 章节之间不回血:GameState.hp 跨章保留。三轮实测进入第二章梦境时血量分别是 1 / 1 / 2, 也就是第一章打完 Boss 剩多少血就带着多少血进第二章整章,而第二章、第三章都没有任何回血手段 (GameState.heal_player 全项目 0 调用)。 4. 石头 Boss 33 血比假面 26 血还厚,且没有二阶段、招式只有落石 + 石拳(2026-10-27 已加「掉头」两段式)。 5. 存档卡「进度」文字在石头 Boss 段仍显示 「Boss · 假面」(arena.gd:723 写死)。 6. 退出游戏时有 RIDs of type "CanvasItem" were leaked 警告(不影响游玩,属于退出清理不干净)。


3. 代码地图

3.1 目录职责

文件 行数 职责 关键点
scenes/main.gd276总流程与屏幕切换所有画面都是代码 new 出来的 Node2D;调试入口在 40–63 行
scenes/chapters.gd173章节数据表DATA 9–159 行;get_data 缺 id 时静默回退第 1 章(165)
scenes/arena.gd932战斗关总装波次 / 碎片 / Boss / 死亡重入 / 暂停 / 存档全在这
scenes/house.gd808第二章现实层探索4 个房间 + 单向平台 + 读书演出 + 花蕊虚影
scenes/tutorial_flow.gd139教学五步状态机每一步都要求真的做出来
scenes/dialogue.gd134打字机对话每句可带 who/color/text/hold/sfx
scenes/prologue.gd342序章脚本剧SCRIPT 7–40 行;date/line/eat/day/night/rewind/forward/end
scenes/chapter_end.gd147第一章完过场台词 9–29 行;卡片「第 一 章 · 完」写死 64 行
scenes/end_card.gd66结束卡_lines 8–15 行写死
scenes/title.gd125标题逐字浮现 + 狐狸立绘
scenes/arena_bg.gd412战斗背景有图用图 / 没图程序化;地面线 86%
scenes/room_bg.gd72现实层卧室背景day/night/eaten 三态
scenes/bot_driver.gd99--bot 自动操作只会走位 + 平A + 偶尔翻滚
actors/player.gd774玩家状态机数值全在 17–49 行
actors/enemy.gd228敌人基类重力/受击/眩晕/死亡/镜头夹取
actors/mask_boss.gd376Boss「假面」横扫/跃击/突进/扇形弹幕
actors/stone_boss.gd94Boss「丛林石像」继承 MaskBoss,只用落石 + 石拳
actors/{shadow_soldier,eye_floater,charger,boar,vine,practice_dummy}.gd61–132六个小怪见 §4
actors/projectile.gd / rock.gd42 / 39敌方投射物 / 落石纯手工判定,不走物理层
actors/sprite_rig.gd242位图主角两张图(meimei.png / sword.png)+ 变换演动作
actors/fox_rig.gd366死代码程序化狐狸,已被 SpriteRig 取代,无引用
ui/hud.gd166战斗 HUD血/碎片/连击/波次大字/Boss 血条/冷却/死亡计数
ui/pause_layer.gd204战斗暂停菜单7 项,纯键盘
ui/save_panel.gd182存档面板2×2 四格,自己算鼠标命中
autoload/game_state.gd309全局状态/输入/字体/存档MAX_HP=5,4 格存档写在 exe 同级
autoload/sfx.gd404全程序化音效 + BGM15 个合成音色 + 8 条 mp3 切段
autoload/feel.gd69顿帧/慢动作/震屏直接改 Engine.time_scale
autoload/router.gd32全屏淡入淡出layer 200,最高层
autoload/history.gd56U 键历史对话最近 24 条
autoload/settings_ui.gd180非战斗场景的 Esc 菜单默认隐藏;标题/序章/house 里的读档入口
dev/auto_pilot.gd500本轮新增:自动通关仅 --auto 时挂载

3.2 屏幕切换与信号

main.gd
  _goto_title() ──► TitleScreen ──pressed──► _goto_prologue()
  _goto_prologue() ──► Prologue ──finished──► _goto_tutorial()
  _goto_tutorial() ──► Arena(tutorial=true) ──finished──► _goto_chapter(1)
  _goto_chapter(id) ──► (kind=="house") HouseScene ──finished──► _goto_chapter(2, force_arena)
                     └─► Arena(id) ──finished──► _on_arena_finished(id)
                                                   ├ id<=1 → ChapterEnd → _goto_chapter(2)
                                                   └ id>1  → EndCard
  Arena ──chapter_requested(id, wave, boss)──► _goto_chapter(...)   # 读档跨章 / 第二章→丛林

_swap()(main.gd:97–102)负责清掉上一个屏幕并解除暂停。

3.3 CanvasLayer 层级(决定了「谁能盖住谁」)

-100 背景(ArenaBG)
   0 世界/角色/玩家(z 1~4)
  10 后处理 post.gdshader(ColorRect)
  15 破梦/斩惑大字 + 屏幕层刀光
  18 过场对话
  20 HUD
  50 ChapterEnd 的白/黑幕
  55 HouseScene 的后处理
  60 HouseScene 的对话
  65/70/80 日期卡 / 章节卡
 120 FlashLight 闪白
 140 DeathInterlude 床头桌一闪
 150 入梦白幕 / HouseScene 的 fade
 160 PauseLayer
 170 Boss 收尾白幕
 180 SavePanel / History
 190 SettingsUI
 200 Router 转场(最高)

3.4 输入映射(game_state.gd:83–100)

move_left/right=A/D/←→ jump=空格 attack=J/鼠标左 heavy=K/鼠标右 roll=Shift/L interact=E pause=Esc confirm=Enter/空格/E debug_kill=F1 debug_shot=F12 手柄:A=跳、X=攻、Y=重、B=滚、Start=暂停。 注意:Dialogue / Prologue / TitleScreen / PauseLayer / SavePanel 全都直接判 KEY_*, 不吃 InputMap——加键位时这两套都要改。


4. 数值总表(改数值先看这里)

4.1 玩家(actors/player.gd)

项 值 行
血量5(game_state.gd:9)
移速 / 加速 / 减速430 / 3600 / 3400(空中 2000)17–20
跳跃初速 / 重力 / 截断−930 / 2500 / 0.4222–24
二段跳−837(0.9×)252
翻滚0.34s,无敌 0.05–0.26,速度 660,CD 0.1027–30
空中冲刺1150 速 0.15s,无敌 0.1832–33
受击无敌0.75s34
三段轻击1/1/2 伤,框 118/124/140 宽,后摇 32% 可取消37–41
破梦5 伤,360×260,无敌 1.15s,CD 10s42
重击3 伤,245×165,眩晕 1.0s(Boss 0.35s)44
斩惑6 伤,绕身 400×96,0.3s 硬后摇,CD 10s47–49
完美闪避翻滚 0.02–0.26 内被命中 → 0.32 倍慢动作 + 2.5s 窗口525–562
空中砸地落地半径 130、2 伤566–592
场地边界90–1830(arena.gd:153–154)

4.2 敌人

敌人 文件 HP 行为 伤害
影卒shadow_soldier.gd3走近 96px → 举刀 0.42s → 突刺 470 → 收招 0.55s1
浮瞳eye_floater.gd2保持 330px 悬浮,蓄力 0.5s → 460 速弹幕1
奔角charger.gd4520px 内蓄力 0.7s → 900 速冲锋 → 撞墙硬直 1s1
野猪boar.gd7同奔角(继承),血更厚,scale 1.71
藤蔓vine.gd3不动,2 秒一次:近身 0.55s 抽打(可跑开)/ 中距离吐绿色种子(330 速,可滚可跳);命中「缠绕」3 秒(可翻滚)1 + bind
木桩practice_dummy.gd99990.9s 举刀 → 0.26s 挥,0 伤害0

4.3 Boss

Boss 文件 HP 招式
假面mask_boss.gd26横扫(0.55s 单帧判定,半径 236)/ 跃击地震(左右两发冲击波)/ 2–3 连突进 980 速;半血二阶段加扇形 5 连弹
丛林石像stone_boss.gd33落石 ×3(0.9s 圈,74px、2 伤)/ 砸地(0.5s 抬手 + 红色落点预警,270px、2 伤);≤17 血掉头 → 身体 10 血 + 飞头 7 血(stone_head.gd:浮瞳同款弹 / 锁定冲撞)

4.4 章节数据(scenes/chapters.gd)

id 标题 kind 波次 碎片 Boss
1第一章 · 鹿人店的一天arena5 波(2/4/4/4/5 只)第 2 波后假面
2第二章 · 家house3 波(梦境)无无(打完转 21)
21第二章 · 丛林arena3 波(3/4/5 只)无石像

5. 内容接口手册(「我要加 X」→ 改哪里)

5.1 改台词 / 加一段对话(不碰逻辑)

想改的 文件 位置
序章全部scenes/prologue.gdSCRIPT 7–40 行({"t":"line","who":…,"text":…})
章节入梦对话scenes/chapters.gd各章 "intro"(第一章 15–29,第二章 67–71,梦境 73–95)
丛林无开场白同上21 章 "intro": [],要加就填
波次标题/提示同上"waves"[i].title / prompt
打完转下一章的过渡台词同上"next_lines"(116–120)
Boss 登场台词同上"boss_intro"(155–157,目前只有 1 句)
第一章完:梦醒台词 / 核桃黑屏scenes/chapter_end.gdWAKE_LINES 9–15 / BLACK_LINES 19–29
第二章探索:拿书 / 读书 / 纸条 / 入夜 / 吃药scenes/house.gdBOOK_LINES 59–63 / READ_LINES 66–79 / NOTE_LINES 82–100 / NIGHT_LINES 103–110 / BED_LINES 113–132
结束卡scenes/end_card.gd_lines 8–15
教学五步文案scenes/tutorial_flow.gdTITLES 8–14 / PROMPTS 16–22
玩家操作提示autoload/game_state.gdguide_text() 173–193
敌人/波次提示scenes/arena.gdhud.prompt(...) 调用点

注意:Dialogue 会自动折行(每行 46 字,dialogue.gd:57–63),每句停留 0.95 + 0.075×字数 秒。 一行 32 个汉字是舒服的长度。说话人颜色用 "color": "#rrggbb",不写就是浅橙。

5.2 加一波怪

1. scenes/chapters.gd 对应章节 "waves" 数组里加一项:

   {"title": "训 练 · 六", "prompt": "提示文字", "enemies": [["boar", 1300.0], ["vine", 1700.0]]}

enemies 里是 [kind, x],地面 y 统一 780,x 建议放在 384–1536 内(镜头可见范围)。 2. 新 kind 要在 arena.gd:_spawn_enemy()(410–434)的 match 里注册。

5.3 加一个新敌人

class_name MyEnemy
extends Enemy

func _ready() -> void:
	max_hp = 5
	radius = 24.0
	body_top = -70.0
	super._ready()
	scale = Vector2(1.4, 1.4)

func _think(delta: float) -> void:    # 状态机:用 state / state_t
	...

func _contact_hit_active() -> bool:   # 只有这些状态会造成接触伤害
	return state == "lunge"

func body_color() -> Color: return Color("#1a1528")
func accent_color() -> Color: return Color("#7d4fd0")
func _draw_ghost(c, w, p) -> void: ...
func _draw_body(col, pulse) -> void: ...

然后在 arena.gd:_spawn_enemy 注册。注意:

5.4 加一个新 Boss

最省事的做法是继承 MaskBoss(stone_boss.gd 就是模板,94 行):

class_name MyBoss
extends MaskBoss

const HP := 30

func _ready() -> void:
	super._ready()
	max_hp = HP; hp = HP
	body_top = -200.0
	scale = Vector2(1.8, 1.8)
	state = "idle"; _decide_cd = 1.2

func _think(delta: float) -> void:   # 覆盖招式表即可
	...

func _draw() -> void:                # 纯程序化绘制
	...

然后在章节数据里写 "boss": true, "boss_kind": "mykind", "boss_title": "...", "boss_prompt": "...", "boss_intro": [...], 并在 arena.gd:635 的 if boss_kind == "stone" 旁边加分支。

Boss 相关的东西现在是参数化的:名字(hud.set_boss_name)、登场大字、提示、登场台词都从章节数据读。 没参数化的:血条右侧的「二阶段」字样(hud.gd:138)、存档进度里的「Boss · 假面」(arena.gd:723)。

5.5 加一整章(重点)

1. scenes/chapters.gd 的 DATA 里加一条:

   31: {
       "id": 31, "title": "第三章 · …", "save_label": "第三章 · …",
       "bg": "res://assets/bg/xxx.jpg",
       "intro": [...],            # 入梦对话(空镜头)
       "dream_intro": [...],       # 若 kind=house,这一段是睡过去之后的梦话
       "waves": [...],
       "fragment_after": -1,       # 第几波后出碎片
       "boss": true, "boss_kind": "mykind", "boss_title": "...", "boss_prompt": "...",
   }

2. scenes/main.gd 决定路由:

3. 过场:chapter_end.gd 的卡片写死「第 一 章 · 完」和日期「十 月 23 日」,新章要参数化或复制一份。 4. 存档:不用改,chapter_id 已经存了;但 save_panel.gd 的章节名是读存档里的 chapter 字段,所以要保证新章 save_label 写对。

5.6 换背景图

意思是"图片高度的 86% 处"对齐到游戏地面 y=780。新图的地面不在 86% 就会浮空或陷进地里。 要么选一张地面正好在 86% 的图,要么把 PHOTO_GROUND 从 const 改成章节字段(推荐,见 §6)。

5.7 加音效 / 音乐

现在 4 条挥剑全是 from: 0.0(只靠 dur/pitch 区分),听起来像同一段开头——想更像不同招式,给 from 填不同起点。

5.8 加 UI


6. 阻碍拓展的硬编码清单(按严重度)

【高】加第三/四章之前必须处理

2026-10-28 更新:house 章节 id / 地面线 / 碎片位置 / get_data 报错 / 结束卡 + 路由 已经全部改掉(见 §15.1)。 表里 1–7 号现在都已完成,只剩 8 号(现实层房间数据化)。
# 位置 问题 修法
1scenes/house.gd:156GameState.chapter_id = 2 写死改成从 main 传入的章节 id(HouseScene 加 var chapter := 2,main 里赋值)
2scenes/arena_bg.gd:10,91地面线 86% 是 const加 photo_ground 字段,章节数据里可覆盖
3scenes/arena.gd:585记忆碎片坐标写死 (960, 520),Chapters.DATA 里没有这个字段加 "shard_pos": [960, 520],Arena 读
4scenes/arena.gd:723存档进度写死「Boss · 假面」改成 String(_data.get("boss_title","Boss"))
5scenes/main.gd:231<br>239 / 264if chapter <= 1 硬判第一章完;两处 _goto_chapter(2) 写死加 "end_flow" 字段(chapter_end / end_card / custom)
6scenes/chapters.gd:162–165get_data 缺 id 静默回退第 1 章缺 id 时 push_error 并回退,方便发现漏配
7scenes/end_card.gd:8–15<br>scenes/chapter_end.gd:64,86结束卡文案 / 「第一章·完」/ 日期写死按 GameState.flags 或章节 id 参数化(三结局的前置)
8scenes/house.gd:29–56,21–264 个房间、门位、平台、目标(找书)全写死想做第三个现实层场景,就把 ROOMS/PLATFORMS 提成参数(工作量中等)

【中】影响体验/手感,建议随内容一起改

# 位置 问题
9~~vine.gd 藤蔓减速 6 秒 + 禁止翻滚~~已修(2026-10-27):缠绕改为 3 秒、移速 ×0.6、跳高 ×0.65、翻滚仍可用;抽打补距离检查;新增种子弹;节奏改 2 秒
10arena.gd 全篇章节间不回血;建议每章开场回满、或给 1 个回血道具/碎片
11autoload/feel.gd:31–56hitstop 结束无条件 time_scale = 1.0,会截断正在进行的慢动作;且 Engine.time_scale 没有引用计数
12autoload/router.gd:18–32fade_out/fade_in 不 kill 旧 tween;arena.gd:237,300,370 三处调用没有 await,可能和后续 _swap 打架13fx/post.gdshader15 个 uniform 里 grain/aberration/scanline/brightness/tint 从未被设置,只有默认值生效
14scenes/arena.gd:702–715_reset_post() 没复位 spot_radius(Boss 收尾会压到 0.015,重开后第一次聚光半径不对)
15actors/sprite_rig.gd没有 "dash" 状态,但 player.gd:649 会写 rig.state = "dash"(空中冲刺没有专属姿态)
16actors/fox_rig.gd366 行死代码(已被 SpriteRig 取代),改玩法时容易误改
17autoload/sfx.gdshatter 音效无调用;4 条挥剑 cut from 全 0;stop_drone 无调用
18ui/pause_layer.gdresume_requested 无人连接、guide_requested 从不 emit(死信号);菜单 7 项写死
19ui/save_panel.gd:78–85↑ 和 ↓ 行为完全相同(都是 (_sel+2)%4),2×2 网格导航其实是坏的
20scenes/prologue.gd:224–247return 之后有 20 多行死代码
21autoload/history.gd:40–56打开时 paused=true,关掉时若 PauseLayer 可见就提前 return,可能留下"面板开着但没暂停"的状态
22退出游戏RIDs ... leaked / ObjectDB instances leaked(退出清理,不影响游玩)
23actors/enemy.gd:108–126_keep_in_view() 只夹中心点,Boss 体型 1.55–1.9 倍时会有半个身子露在屏幕外(23_石头Boss本体.png 里就能看到,玩家在左端时石头 Boss 被裁到只剩一半)

【低】文档与实现不一致(别照着文档改)


7. 设计层面的实测结论

1. 翻滚仍然是一招通吃:0.34s 里 0.21s 无敌、0.1s 冷却、无消耗 → 48% 时间可以无敌。 上一版文档的这条结论本轮再次被验证(bot 靠"看到起手就滚"就能撑过大部分场面)。 2. 丛林章是当前唯一的难度断崖:3 野猪 + 2 藤蔓(2026-10-27 改了藤蔓后缓和了不少,但仍是全游戏最难的一段)。 建议在加第三章之前先把它调到"死 2–3 次能过"。 3. 石头 Boss 的问题不是难,是磨:33 血、无二阶段、招式只有两种,熟练后是重复劳动。 要么降到 26–28 血,要么加一个二阶段(它继承 MaskBoss,加招式成本很低)。 4. 章节之间的资源没有重置:血、碎片、死亡计数全部跨章带走。碎片数在第三章还显示第一章捡的那 1 个, 而第二章、第三章都没有碎片可捡 → 这个数字现在没有意义。 5. 剧情是"骨架占位":第二章探索的文本(医书、纸条、花蕊大夫)反而比战斗章完整,说明文本质量不是瓶颈, 瓶颈是"每一章都要新做一套场景/敌人/过场"。


8. 下一步路线建议(按性价比排序)

优先级 事项 工作量 收益
P0把 §6 的 1–8 号硬编码参数化(house 章节 id、地面线、碎片位置、Boss 名、结束卡、章节路由、存档进度文字)0.5–1 天后面每加一章都省事;现在不改,加第三章时会一次性撞上
P0藤蔓减速改短 / 允许翻滚;每章开场回满血2–3 小时直接解决唯一的难度断崖
P1标题页加「继续游戏」(现在只能进关卡后按 Esc 读档)半天玩家体验最大的一个缺口
P1石头 Boss 加二阶段(继承 MaskBoss,抄假面的扇形弹幕)半天让丛林 Boss 不再只是血包
P2第三章:按 剧本-v1-待填.txt 的「新增场景申请表」填 → 我接进 Chapters.DATA看你填多少内容推进
P2结局系统:GameState.flags 已就绪,end_card.gd 参数化后按 flags 走不同结尾1 天三结局的前置
P3存档改到 user://(现在写在 exe 同级,装 Program Files 会写不进去)2 小时上架前必须做
P3字体子集化(msyh 19.7MB + simhei 9.7MB 占了 pck 大头)半天包体从 32MB 降到 ~6MB

9. 工具与命令

9.1 跑源码

E:\godot\Godot_v4.5-stable_win64.exe        --path <lost-dream>          # 有窗口,带调试
E:\godot\Godot_v4.5-stable_win64_console.exe --path <lost-dream>         # 带控制台输出(看 print)

9.2 调试入口(main.gd:40–63)

-- --state=title|prologue|tutorial|arena|arena2|dream2|arena3|boss|boss3|fragment|chapterend|chapter2end|epilogue|end
-- --bot            自动战斗(BotDriver)
-- --auto           自动通关(dev/auto_pilot.gd,本轮新增)
-- --autodir=<路径>  自动通关的截图目录
-- --god            无敌(注意:god 下完美闪避触发不了)
-- --tutskip        教学关自动推进
-- --slow           0.25 倍速
-- --keybinds       直接打开按键设置面板
-- --keytest        按键绑定自检(改键/冲突/存读/恢复默认)
-- --sfxtest        音效试听
-- --spottest       小必杀效果常开
-- --shot=<路径> --delay=秒        截图后退出
-- --shots=<前缀> --count=N --interval=秒   连拍
-- --savetest[=load] / --pausetest  直接打开存档面板 / 暂停菜单
-- --room=study|living|kitchen|bedroom   HouseScene 直接进某间房

两个坑:

想测重击要从第一章打上去或加 --state=fragment。

9.3 自动通关(本轮新增)

E:\godot\Godot_v4.5-stable_win64_console.exe --path <lost-dream> -- --auto --bot --autodir=<截图目录>

行为:自动点标题 → 快进序章 → 教学五步 → 战斗(bot + 危险翻滚/破梦/重击)→ 第一章完 → house 导航(找书/读书/回床睡觉)→ 第二三章战斗 → 结束卡截图 → 自动退出。 每 4 秒打一行状态;同一波卡 150 秒会临时开无敌并警告。

用途:每次加完章节后跑一遍,5 分钟内验证"全流程不崩、能到结束卡",并自动出一套截图。 实测 264 秒通关,跑完进程自己退出。

9.4 打包(2026-10-27 实测:只导 pck 不需要导出模板)

exe + 外置 pck 的结构下,更新游戏内容只要重打 pck,exe 完全不用动:

E:\godot\Godot_v4.5-stable_win64_console.exe --headless --path <lost-dream> \
    --export-pack "Windows Desktop" <输出目录>\迷途之梦.pck

然后把产物覆盖到 exe 同级目录(同名 迷途之梦.pck)。

docs/playtest-通关实录/ 现在有 23MB 实机截图,不排除的话 pck 会从 34MB 涨到 56MB。

新 pck 同时存进 build/迷途之梦.pck(34,244,384 字节)。


10. 需要你拍板的问题

1. 下一步是「补第二章体验」还是「开第三章」? 我建议先花一天把 P0 的硬编码和藤蔓/回血改掉,再开新章——否则新章会把这批债再复制一遍。 2. 第三章的场景是什么?(梼杌洞府 / 天庭 / 回忆里的某个地方 / 继续现实层) 如果是新的现实层地点,house.gd 那套 4 房间结构要参数化,工作量比战斗章大。 3. 要不要保留「每章一个 id 两套内容(现实层 + 梦境)」这个模式? 现在 chapter 2 同时是 house 和梦境战斗,靠 force_arena 复用;第三章如果也这样,建议加个 "dream_battle_waves" 字段分开。 4. 结局要不要现在做? 如果要,end_card.gd 必须先参数化,GameState.flags 已经是现成的。 5. 难度目标:你想要「死 2–3 次能过」还是「一命通关」?这决定藤蔓/野猪/Boss 血的调整幅度。


*附:本轮的实测证据(截图 + 日志)在 docs/playtest-通关实录/;自动通关代码在 dev/auto_pilot.gd。*


11. 改动记录 · 2026-10-27(藤蔓 / 石像 / 第二章对话)

11.1 藤蔓(actors/vine.gd 重写 · 新增 vine_seed.gd、fx/vine_bind.gd)

项 改版前 改版后
攻击节奏0.95 秒一轮、无冷却2 秒一次(两招共用)
抽打判定无距离检查(必中)出手那一帧判 absf(dx) < 250,跑出去能躲
新招式—绿色种子:330 速、半径 10、1 伤、命中挂缠绕;近身 45% 概率也会吐
缠绕时长6 秒3 秒
缠绕时翻滚禁用仍可用(0.85 倍速)
缠绕跳跃×0.2×0.65
缠绕表现只有闪白身上缠三圈绿藤 + 叶子(VineBind)

关键修复:apply_vine_slow() 不再被"必中"的无条件调用触发;Projectile 新增 bind 字段,由种子命中时挂上。

11.2 石像(stone_boss.gd 重写 · 新增 stone_head.gd)

11.3 第二章入梦对话(scenes/arena.gd:_intro)

改成和第一章教学关一致:

入梦白幕 → 空镜头对话(主角隐藏 + 物理停用)→ 恍惚(去色/扭曲/淡入)→ 主角浮现 → E 拔剑 → 波次

改版前是"拔剑之后、角色已经能动的时候"播对话(边跑边说话),现在是独立的过场。

11.4 顺手修掉的两处

11.5 验证

→ 用原 exe 跑完整 --auto --bot,25 张截图直到 final_end_card,说明打包产物里的新脚本/新类都正常。

注意:新增了 class_name(VineSeed / VineBind / StoneHead),需要在编辑器里打开一次项目(或跑 godot --headless --path . --import)让 Godot 重建全局类缓存,否则会报 Could not find type。

12. 键位系统(2026-10-27 新增)

12.1 结构

文件 职责
autoload/keybinds.gd动作表 BINDABLE、改键/冲突/恢复默认、读写 keybinds.json、apply_all() 重建 InputMap
ui/keybind_panel.gd全屏手绘面板(9 行列表,↑↓ 选择,Enter 改键,Del 恢复该项,Backspace 全部恢复)
ui/pause_layer.gd菜单新增「按 键 设 置」(第 7 项),发 keybind_requested
autoload/settings_ui.gd非战斗菜单同样新增一项,自己持有面板
scenes/arena.gd创建面板(CanvasLayer 195),接 keybind_requested

12.2 可绑的 9 个动作

move_left / move_right / jump / attack / heavy / roll / interact / pause / history

不绑的:confirm(对话/菜单确认,固定 Enter/空格/E)、方向键导航、debug_*。 这样保证"改键之后菜单还能操作"。

12.3 三个实现要点(改这块之前先看)

1. 只重建键盘事件:apply_all() 会把 InputEventKey 剔掉再加新的,手柄/鼠标事件原样保留(否则接手柄的玩家会被改键踢掉)。 2. 配置值 vs 生效值:_raw_keys() 是 json 里写的,keys_of() 是 apply_all() 算出来的"实际生效"。 两者分开是为了处理"手改 json 造成跨动作撞键"——现在按 BINDABLE 顺序先到先得,后面的显示「未绑定」。 3. 关闭菜单跟随 pause 动作:PauseLayer / SettingsUI 的关闭不再判 KEY_ESCAPE,改成 event.is_action_pressed("pause"); History 也改成跟随 history 动作。但对话继续、菜单导航仍然是裸 keycode(见 §6 第 18 条)。

12.4 存档

keybinds.json 写在 exe 同级(和 save1.json 一起),写不进去时退到 user://keybinds.json,读的时候两边都找。 格式:

{"version":1,"keys":{"jump":[32],"attack":[74],"roll":[4194325,76], ...}}

值是 physical_keycode(不是 keycode),对非 QWERTY 布局更友好。

12.5 验证


13. 第二章结尾过场(2026-10-27 新增)

13.1 流程

丛林石像被打死(身体 + 飞头都死)
  → Arena._stone_epilogue()
      慢动作 → 画面虚化(wave 1.0 / desaturate 0.9 / 暗角 2.3)
      → 主角淡出消失(rig.modulate.a → 0,物理停用)
      → 核桃的 11 句对话(画面里没有人)
      → Router.fade_out 到暗
  → main._goto_chapter2_end()
  → Chapter2End(scenes/chapter2_end.gd)
      黑屏 + 闹钟音效(新增 Sfx "alarm")→「叮叮叮……(闹钟响了)」
      → 黑屏上缓缓浮出日期卡「十 月 24 日」(上浮 + 淡入)
      → 黑幕淡开露出白天的房间 → 醒来 5 句(发现没有闹钟 → 慌了 → 喊花大夫)
      → 旁白「空的药瓶被撞翻……慕容雪川离开了房间」
      → 黑幕压上 → 黑屏对话 8 句(核桃 + 梼前辈:闹钟/纸条/「当初为什么活下来」)
      → 「第 二 章 · 完」
  → 结束卡

13.2 和第一章的区别

第一章完(chapter_end.gd) 第二章完(chapter2end.gd)
结尾演出Arena 的白圈收尾(全屏白 → 灰 → 黑)不播白圈,改成场景虚化 + 主角消失
对话位置醒来之后(房间里)斩杀瞬间(梦里),画面里没有主角
过渡白 → 白天房间黑 → 闹钟 → 睁眼
音效无(只有对话)新增 alarm 三连「叮」
第二章故意不用白圈:白圈是"战斗胜利"的符号,而这一场要的是"梦突然醒了"的错位感。

13.3 新增的调试入口

13.4 顺手修的一处

_stone_epilogue() 开头 hud.set_boss(-1.0):原来 Boss 血条会留在屏幕上和尾声对话叠在一起(调试入口第一次截图时发现的)。


14. 改动记录 · 2026-10-28(章节回血 / 可读性 / HUD 重排)

这一轮只做「让当前版本能验收」的事,石像与野猪的数值一律没动(按你的要求)。

14.1 章节之间回满血

main._on_tutorial_finished(进第一章)、main._on_chapter_end_finished(进第二章·家)、 main._on_house_finished(进第二章梦境)、arena._next_stage(梦境 → 丛林)。

(switch/final/15_enter_arena_ch2.png、16_enter_arena_ch21.png)。

14.2 亮背景可读性(新增 GameState.draw_text)

static func draw_text(ci, font, pos, text, align, width, font_size, color): 先 draw_string_outline(描边宽度 = 字号 × 0.10,最低 2,Color(0.03,0.02,0.05,alpha×0.7))再 draw_string。 它只加字周边的暗边,不改基线、不改排版宽度,所以原有坐标全部照旧。

用在这些地方:

文件 用到的位置
ui/hud.gd碎片计数、连击、波次大字(Boss 登场名也走这里)、Boss 名、二阶段、破梦/斩惑、冷却、提示、死亡计数
scenes/dialogue.gd说话人名字、正文(逐字显示也走它)

没动的:标题、结束卡、章节卡、日期卡(都在深色底上,加了反而脏)。

14.3 HUD 底部重排(消除叠字)

元素 旧 y 新 y
Boss 血条980952
操作提示1020 / 26px1020 / 24px
破梦·斩惑1040 / 10721052 / 1074
冷却文字 + 条1040 / 10461052 / 1060
死亡计数(右)10601064
Dialogue 底部提示988976

以前「提示 / 破梦 / 完美闪避后 2.5 秒 / 冷却条」四层挤在 60px 里,实测会压字;现在每层至少隔 7px。

14.4 文案与版本号

「梦到这里就断了。」/「—— 垂 直 切 片 · 完 ——」/「如果有明天的话。」/「下一段梦,还没做完。」

14.5 验收

(第一章 1 次、第二章梦境 0 次、丛林石像 6 次 —— 石像段仍是唯一的卡点)。

已覆盖 E:\godotgame\迷途之梦-未成品\迷途之梦.pck,旧包备份为 迷途之梦.pck.bak-调平前。


15. 改动记录 · 2026-10-28(工程收口:硬编码参数化 / 主菜单 / 存档改 user://)

15.1 §6 的 1–5 号硬编码全部改掉

# 原来 现在
1house.gd 写死 GameState.chapter_id = 2HouseScene 新增 var chapter := 2,main._goto_chapter 在 add_child 前赋值;入梦对话也读 Chapters.get_data(chapter)
2arena_bg.gd 地面线写死 const PHOTO_GROUND = 0.86实例变量 photo_ground,Arena._build_world 用章节数据 "photo_ground" 覆盖(不写就还是 0.86)
3arena.gd 碎片坐标写死 (960, 520)章节数据 "shard_pos": [x, y](第一章已显式写 960/520)
4chapters.get_data 缺 id 静默回退先 push_error 报出缺哪个 id,再回退第一章
5end_card.gd 文案写死 + main 用 chapter <= 1 / == 21 硬判章节数据新增 "end_flow"(chapter_end / chapter2_end / end_card)、"end_next"(过场之后进哪章)、"end_card"(结束卡文案数组);main._on_arena_finished 只读 end_flow

顺手一起的:

15.2 新的一页:主菜单 scenes/main_menu.gd

标题(任意键)→ 主菜单 → 开始游戏 / 继续游戏 / 音量设置 / 按键设置 / 攻略 / 退出游戏
                            └─ Esc 回标题

直接 apply_save + 进章,不弹面板;列表下方常驻「最近存档:章节 时间(存档 N)」。 没有存档时这一项是灰的,后面带「(没有存档)」。

15.3 存档改到 user://(上架前置)

Windows 实际位置:%APPDATA%\Godot\app_userdata\迷途之梦\。

(反过来的话,老的 save.json 会抢掉第 1 格——实测踩过一次)。原文件不删。

15.4 存档字段新增

字段 用途
in_arena继续游戏时决定落在 Arena 还是 HouseScene(第二章的「家」和「梦境」共用一个 id)
tutorial存在教学关里的档,继续时回到教学关而不是第一章

SettingsUI 的 load_requested 信号同步加了这个参数(4 个参数),main._on_settings_load 负责分流; 战斗关自己的 chapter_requested 一律 force_arena = true。

15.5 验收

丛林石像那段死了 10 次、触发 150 秒看门狗无敌——石像数值按你的要求没动。