fea: 添加地图管理

This commit is contained in:
cancerai committed 2026-10-22 23:16:27 +08:00
1 parent cc2883458c
commit 22157d4baa
7 files changed
+201 -44

No files matched your search

+36
View File
@@ -104,3 +104,39 @@
- `pause()` 里按 `G.fromEditor` 改 `#scr-pause [data-act="quit"]` 的 textContent;`UI.init` 的 `quit` 改为 `() => (G.fromEditor ? toEditor() : toLevels())`。
- 结算屏(scr-result)的 quit 未动,仍为「关卡选择」——用户只要求暂停界面。
- 验证:Node 桩冒烟(`/tmp/ed_pause_quit.mjs`,5 断言:两种来源标签切换、quit 两种跳转、从关卡选择启动自制关复位 fromEditor);`death/map/check/solve/smoke/save/key/dom-smoke/ice` 九套全绿。
## 编辑器:保存=更新当前地图 / 打开=新图 / 新增「导入地图」按钮(用户要求)
- 需求:①点「保存」不再每次新建,而是保存当前地图;②每次打开编辑器都是新地图;③加一个「导入地图」按钮,从以前保存的地图里选。
- `js/save.js`:新增 `updateCustom(lv)`(按 id 就地替换,id 不存在则追加 + flush)。`addCustom` 保留未删以兼容旧调用。
- `js/editor.js`:
- `open()` 改为**每次重置**为空白新图(宽高沿用 `#ed-w/#ed-h` 输入值)并 `this.cur=null`;抽出 `show()` 只重绘不重置。
- `save()`:`makeCustomLevel` 后若 `this.cur` 存在则 `lv.id = this.cur`,统一走 `Save.updateCustom` → 首次新建、之后就地更新(id 不变、列表不涨)。
- 新增导入:`openImport()`(弹窗 `#ed-importbox` 列 `Save.customs()`,空则提示)、`closeImport()`、`pickImport(id)`(hydrate + 设 cur + 关弹窗)。
- `updateSaveState()`:`#ed-savestate` 显示「→ 更新「XX」」/「→ 另存为新图」,在 open/show/save/pickImport/删除/列表点击后刷新。
- 「我的地图」列表点击仍是导入(设 cur + hydrate + 更新提示);删除正在编辑的地图时 `cur` 复位为 null。
- `index.html`:工具栏加 `data-act="ed-import"` 按钮 + `#ed-savestate` 提示;`#scr-editor` 内加 `#ed-importbox` 弹窗(`.modal`)。
- `css/style.css`:`.modal/.modal-panel/.imp-row/.imp-empty/.modal-btns/.save-state` 样式。
- 关键坑:`toEditor()`(暂停菜单「返回编辑器」)不能调 `open()`——那会把正在试玩的地图清空。改为 `Editor.faces ? Editor.show() : Editor.open()`。
- 验证:Node 桩冒烟(`/tmp/ed_save_import.mjs`,22 断言:open 恒新图/cur=null、首存新建+再存就地更新 id 不变、新图再存新增、导入载入+保存更新原图、删除解除关联、show 保留、savestate 提示切换、空存档导入提示);暂停菜单测试 5 断言仍过;`death/map/check/solve/smoke/save/key/dom-smoke/ice` 九套全绿。
## 编辑器去掉「我的地图」+ 关卡选择自制页加地图管理(删除)(用户要求)
- 需求:①编辑器右侧去掉「我的地图」,只保留「导入地图」;②关卡选择的自制页要有地图管理选项,可删除某个地图。
- 编辑器瘦身:`index.html` 删掉 `<h3>我的地图</h3><div id="my-levels">`;`js/editor.js` 删除 `renderMyLevels()` 及其 4 处调用(init/show/save/pickImport)。导入地图弹窗 `#ed-importbox` 成为唯一入口,`updateSaveState()`(保存去向提示)保留。
- 自制页管理(`js/ui.js`):
- `UI.manage` 状态;`#manage-btn`(放在 `#scr-levels` 的 panel-head,`hidden` 类控制只在「自制」分类显示)。
- `setManage(on)` 切管理态(按钮文案 管理↔完成 + `.on` 高亮 + 重绘);`show('scr-levels')` 与切 tab 都会 `setManage(false)` 复位。
- `renderLevels()`:管理态且 `builtin===false` 时给卡片加 `.manage` 类 + 追加 `.lv-del`(✕)按钮,且**不给卡片绑 play**(避免误点开始);`delCustom(l)` = confirm → `Save.removeCustom(id)` → `renderLevels()`。
- `confirm` 用 `typeof confirm === 'function' &&` 守卫以便 Node 测试。
- `js/main.js`:`UI.init` 加 `manage: () => UI.setManage(!UI.manage)`。
- `css/style.css`:`.head-btns/.head-btns .btn.on`、`.lv-card.manage`(cursor:default、禁 hover 位移)、`.lv-del`(右上角红色 ✕)。
- 验证:Node 桩冒烟(`/tmp/ed_manage.mjs`,18 断言:管理按钮仅自制页可见、管理态渲染 ✕、删除指定图、confirm 取消不删、退出复位、切分类隐藏按钮并复位、管理态点卡不开始);编辑器 22 断言 + 暂停 5 断言仍过;`death/map/check/solve/smoke/save/key/dom-smoke/ice` 九套全绿;`grep renderMyLevels|my-levels` 无残留。
## 修复:管理按钮在其他分类仍显示 + 文案改「管理地图」(用户要求)
- 需求复述:①「管理地图」按钮**只在自制分类显示**,其他分类一律不显示;②按钮文字改成「管理地图」。
- **根因**:CSS 里只有 `.screen.hidden` / `#hud.hidden` / `.modal.hidden` / `#touch.hidden` 这类限定选择器,**没有通用 `.hidden{display:none}` 规则**。`js/ui.js` 给 `#manage-btn`(class=`btn tiny hidden`)加 `hidden` 类根本匹配不上任何规则 → 按钮在全部/跳刺/耐久/BOSS/坑向分类都照样显示。JS 逻辑(`classList.toggle('hidden', filter!=='custom')`)一直是对的,纯 CSS 漏规则。
- 修复:
- `css/style.css`:新增通用 `.hidden{display:none !important}`(放在 `.screen.hidden` 附近)。所有 `hidden` 类使用场景(screens/hud/boss-bar/modal/touch/manage-btn)语义一致,无副作用。
- `index.html`:按钮文案 `管理` → `管理地图`。
- `js/ui.js`:`renderLevels`/`setManage` 里重复的按钮刷新逻辑收敛为新方法 `updateManageBtn()`(hidden + 文案 + .on 一处维护,防漂移);`setManage(on)` 语义改为「非自制分类的开启请求按退出处理」(按钮不可见时必须自动复位管理态,不能 return 留下隐藏的激活态)。
- 教训:**JS 层 class 断言测试测不出 CSS 漏规则**(class 加上了但样式不存在)。已在 `/tmp/ed_manage.mjs` 增加 CSS 回归断言:正则检查 `css/style.css` 存在通用 `.hidden{...display:none...}` 规则。
- 验证:`/tmp/ed_manage.mjs` 24 断言全过(含 CSS 回归、setManage 非法请求复位、show 复位、文案切换);其余 3 个编辑器 harness(save_import 22 / pause_quit 5 / noclip_spike 13 / props 14)仍全过;`death/map/check/solve/smoke/save/key/dom-smoke/ice` 九套全绿;预览 8123 返回 200 且按钮文案/规则已生效。