fix: 刺放置方向问题
This commit is contained in:
1 parent
6ba47dfd88
commit
bf0f065432
8 files changed
+580
-120
No files matched your search
@@ -55,3 +55,42 @@
|
||||
- 用户要求:把死亡效果从血洼/血点/飞溅碎块改成简单的**红叉**即可。
|
||||
- `js/level.js`:`addDeathMark` 只记 `{x,y}`(不再生成 parts 碎块);`drawDeathMark` 改为画一个带深色描边的红色 X(半边长 9,lineWidth 5 黑描边 + 3 红主体);`update()` 去掉碎块演化循环(红叉为常驻静态标记)。仍只在死亡地点显示、只保留上一次、整关重开清空。
|
||||
- `tools/death-test.mjs` 措辞「血迹」→「红叉」。全套仍全绿。
|
||||
|
||||
## 自制关卡:可变宽高 + 传送门 + 多面地图 + 极简导入导出(用户新需求)
|
||||
- 需求:编辑器里可自定义地图宽高;引入「传送门(W)」,一个地图可含**多面(子关卡)**;导入导出对非专业者友好。
|
||||
- 经 `AskUserQuestion` 确认三处设计:
|
||||
- 传送门配对 = **显式指定目标**(每个门直接选「去哪个面 + 哪个门」,不自动两两配对);
|
||||
- 面尺寸 = **每个面独立宽高**(clamp 12–160 × 8–80);
|
||||
- 导入导出 = **一键文件 + 分享码**(下载 .json / 复制分享码;从文件导入 / 粘贴导入)。
|
||||
- `js/level.js`:`reset()` 里从 `this.data.doors` 读取门目标 `to:{face,door}` 写到 warp 实体的 `e.to`;`e.doorId` 取门 id、`e.pair` 兜底取相邻序号、`e.cool/hidden` 支持。
|
||||
- `js/player.js`:warp 分支识别「跨面目标对象(`to.face` 为 number 且无 x/y)」→ 调 `this.onPortal(e)` 交主程序处理,否则走原 `spawn`/坐标/`pair` 逻辑;save 分支把 `face` 写进 `savePoint`。
|
||||
- `js/main.js`:`G.map[]` + `G.face`;`startLevel` 在 `data.faces` 存在时建多面;`doPortal(e)`→`switchFace` 换激活 Level、`dest.cool=40` 防回弹;`doRespawnFace()` 回到 `savePoint.face`;HUD 多面时显示 `面N/M`。
|
||||
- `js/editor.js` 重写:状态 `faces[]`(每面 `{name,w,h,seq,grid,doors}`);`resize(w,h)` 可变高、裁剪越界门、`addFace/copyFace/delFace`;门放 `W` 自动注册 id,`renderDoors()` 每门两个下拉(目标面+目标门,禁自连);`buildData()` 输出 `{name,type:'custom',startFace:0,faces:[...]}`;`validate()` 校验每面有 1 个 S 且 ≥1 个 X、门不自连;导入导出 `download/copyCode/importFile/importMap`(兼容旧单 grid `doors` 格式自动包成 1 面);3 处 `confirm()` 加 `typeof confirm==='function'` 守卫以兼容 Node。
|
||||
- `index.html` + `css/style.css`:编辑器区改为 `ed-name/ed-w/ed-h/ed-resize` + 面面板(`ed-addface/copyface/delface` + `#ed-faces`) + 门面板(`#ed-doors`) + 一键导入导出(`ed-download/ed-copy/ed-file/ed-import/ed-export` + `#ed-json` textarea);`.editor-main{overflow:auto}`。
|
||||
- 新增 `tools/map-test.mjs`(4 项:跨面门目标挂载 / `onPortal` 触发 / `savePoint.face` 记录 / 旧格式兼容)。`/tmp/ed_harness.mjs` 8 断言(buildData 双面、门目标读写、validate、importMap 保留、增删面计数、resize、旧单 grid 导入、缺 S 拦截)全过。
|
||||
- 验证:`death/map/check/solve/smoke/save/key/dom-smoke/ice` 九套全绿;23 关可达性未退化;预览服务 `8123` 返回 200。
|
||||
|
||||
## 编辑器:去掉导入导出,传送门改为「属性面板」方式(用户新需求)
|
||||
- 用户要求:去掉导入/导出,只用「保存」;把多关传送门设置改成「修改属性」方式——在自制关卡**右侧**显示一列「属性列表」,展示**当前选中方块**的可设属性(含跳转到下一关),其他有属性的方块也放进去。
|
||||
- `js/editor.js` 改动:
|
||||
- 删除 `download/copyCode/importFile/importMap/importPaste/exportToTextarea/mapString/renderDoors` 全部导入导出与独立传送门面板逻辑;保留 `save()` 与「我的地图」「面」面板。
|
||||
- 新增 **每格属性** 模型 `f.props[ty][tx]`(null 或对象),与 `grid` 同形;`blank/propsBlank` 同步、`resize/copyFace/hydrate` 都维护 props。
|
||||
- 新增 `SCHEMA`:按方块类型声明可编辑字段(`portal` / `text` / `num` / `select`)。`W`→跳转到下一关(两下拉写 `doors[].to`);`T`→提示文字;`O`→朝向/间隔/速度/延迟;`C`→区域宽高/镜头模式/缩放;`B`→类型/血量。
|
||||
- 选中格 `this.selTile`:画布点击即选中并高亮(黄框);调色板首项 `⌖ 查看属性` 为只查看不修改的画笔。右侧 `#ed-props` 由 `renderProps()` 按 `SCHEMA` 渲染。
|
||||
- `buildData()` 按扫描顺序把 `props` 导出为 `messages/turrets/camzones/bosses` 数组(引擎按扫描下标读取,顺序一致);`doors` 原样导出。
|
||||
- `hydrate(o)` 反向:按扫描顺序把这些数组回填到 `f.props[ty][tx]`。
|
||||
- `index.html`:删除「导入/导出」区块(按钮 + `#ed-json`)与「传送门(显式指定目标)」面板;新增 `#ed-props` 属性列表面板;`editor-tip` 文案更新。
|
||||
- `css/style.css`:新增 `#ed-props/.prop-head/.prop-empty/.prop-row/.prop-lab/.prop-in/.prop-ctl` 样式;删除无用的 `#ed-json/.io-btns/.door-row` 样式。
|
||||
- 验证:Node 桩冒烟(`/tmp/ed_props_harness2.mjs`,14 断言全过:各类型 renderProps 不抛异常、buildData 各数组导出正确、hydrate 往返恢复、validate 门自指/缺 S 拦截);`death/map/check/solve/smoke/save/key/dom-smoke/ice` 九套仍全绿。
|
||||
|
||||
## 编辑器:放置不覆盖 + 刺合并为单类型(方向走属性面板)(用户再次要求)
|
||||
- 需求:①放置方块时若当前格已有方块则不覆盖;②把「上/下/左/右」四个刺合并成**一个刺**,上下左右方向改到右侧属性面板调。
|
||||
- 引擎侧不动:`js/level.js` 的 `CHAR2TILE` 仍是 `^=SPIKE_U / v=SPIKE_D / <=SPIKE_L / >=SPIKE_R`,`spikeBox()` 按 T.SPIKE_* 收紧判定。所以只在**编辑器层**做「单 char + props.dir ↔ 四字符」双向翻译,`solve/check` 等可达性完全不受影响。
|
||||
- `js/editor.js`:
|
||||
- `PALETTE` 删掉 `v < >`,只留 `['^','刺',...]`;新增 `SPIKE_CHAR{up:^,down:v,left:<,right:>}` / `SPIKE_DIR`(反向) / `SPIKE_ARROW{up:↑,...}`。
|
||||
- `SCHEMA` 增加 `'^': [{type:'select',key:'dir',def:'up',opts:[上/下/左/右]}]`;`renderProps` 的 select 分支改为 `cur ?? fd.def` 兜底默认值。
|
||||
- `act()` 放置段新增:`if(!erase && ch!=='.' && prev!=='.') { this.renderProps(); return; }` —— 放实方块遇已有方块直接跳过(仍选中该格以便看属性);擦除/橡皮 `ch==='.'` 与 `?` 查看工具不受此限。
|
||||
- `draw()` 刺格不再写 `^`,改写 `SPIKE_ARROW[dir]`(↑↓←→)让方向在画布上可见。
|
||||
- `buildData()` 导出 grid 时把每格 `^` 按 `props.dir` 翻译成 `^ v < >`;`hydrate()` 反向把 `^ v < >` 统一还原成 `^` 并写 `props.dir`。往返一致。
|
||||
- `index.html`:`editor-tip` 改为说明「不会覆盖已有方块」「刺只有一个、方向在右侧属性面板调」。
|
||||
- 验证:Node 桩冒烟(`/tmp/ed_noclip_spike.mjs`,13 断言全过:不覆盖/擦除/橡皮、buildData 四向翻译、renderProps('^') 不抛、hydrate 往返一致);`death/map/check/solve/smoke/save/key/dom-smoke/ice` 九套全绿。
|
||||
Reference in new issue
Block a user