这条鱼越长越大。每一次更新都来自真实对局反馈——欢迎边摸鱼边提意见。
UI.confirm 机制——避免误触直接清空进度。点「取消」或背景 / ✕ 关闭均不重开;只有点「重新开始」才真正重开一局。reset() 只调 fitCamera() 而丢失「手机默认放大」视角(又退回整图适配的小图)。现 reset() 末尾在 fitCamera() 之后补调 applyMobileDefaultZoom():仅手机版生效,把缩放恢复到 CFG.mobileDefaultZoom = 1.0 默认放大(桌面版自 return,不受影响);且用 Math.max(zoom, fit) 兜底,平板 fit 已够大时不强行改。web/tools/repro_restart_confirm.js:校验①按钮点击触发二次确认、未确认前不重开②确认后真正重开③手机版重开缩放恢复为 mobileDefaultZoom 且相机回世界中心④桌面版不受手机默认缩放影响,14/14 全绿。连同 mobile 14/14 + smoke 32/32 + icons 4/4 + 管道相关 11 套全绿。Game.previewToolPath(tool, fromW, toW):拖动时实时计算从按下点到光标点的网格阶梯路径,逐段/逐格标记 ok(金币足够且可放置);commitToolPath() 在松开手时按预览路径实际扣金币并创建实体(管道建 Pipe 段并续接 pipeChain,城墙逐格建 Wall)。render.js 新增工具路径预览渲染块,input.js 的 pipe/wall 拖动分支改为「计算预览 + 松开提交」。exists 跳过重画,避免「明明已铺好却显示红色报错」的误导)。城墙拖动改为先预览后提交,更可控、不会在移动过程里误铺一串墙;手机端平移改由「手」工具或双指拖动承担,管道/城墙工具下拖动专用于连续铺设。fitCamera() 本体不动——「全景适配」按钮(tczFit)与窗口 resize 仍走整图 fit,仅初始 / reset 在 isMobile 时叠加放大幅度(平板 fit 已够大则不强行改,Math.max(zoom,fit) 兜底)。applyMobileDefaultZoom 在 main.js 设置 isMobile 后补调用(构造函数里 isMobile 尚未赋值,单独补),并在 reset() 末尾调用。回归 smoke 32/32 + icons 4/4 + mobile 12/12 全绿;实测手机 390×844 默认 zoom=1.0(原 0.191),桌面不变pv.self 判定(render.js previewPipe),而非 canPlaceAt(后者对 pipe 工具本就跳过实体 / 资源检测,恒为绿)。当鼠标方向指向富矿「随机第二格」(富矿 spawn 时随机占 上/下/左/右 一格)时,previewPipe 的 1 格落点被 pipeSnapCell 重定向回资源中心,使 toEp===anchor → self=true → 红色。第二格在其它方向时则绿。普通资源只有中心格,恒绿。修复:管道预览起点统一用绿色(self 只是「在该点起链、暂未画出管段」的正常态,并非不可放置,placePipeSeg 允许从资源起链),消除误导.ach-toast b 缺少 white-space: nowrap,当弹窗宽度不足时浏览器将每个汉字折行到新行。修复:给 .ach-toast b 加 white-space: nowrap 强制名称单行显示(与右侧 .bp 已有的 nowrap 对称)。回归 smoke 32/32 + icons 4/4 通过