tileset只有noPass属性。设置noPass为false的瞬间就会写入project/maps.js
其它情况只要不是items就不可过。
写入可通行性对tileset只用写canPass就好
读档：```core.utils.decompress(core.saves.cache['template_save3'] );```
解码录像 core.decodeRoute(a.route);

可通行性，关键在getBlockByNumber函数。它从core.status.number2Block中获取信息。而number2Block不存在该属性时会initBlock
initBlock从blocksInfo中读

改变canPass后：（模仿setBlock）
originBlock = core.getBlock(x, y, floorId, true);获取originBlock
core.status.maps[floorId].blocks全要改
core.status.mapBlockObjs全要改

enemyInfo进存档的手法非常简单粗暴 就是存了个变量

extractBlocks->_mapIntoBlocks->initBlock

cannotOut和cannotIn的关键
箭头还在getBlockByNumber中

首先抽象一下 思考一下顶层设计
ItemBox类
需要的属性：当前持有的Item和数量 当前的页数

使用道具时，情况会改变，所以，每次重绘时，都需要获取一遍core.status.hero.items，然后依据此获取一个列表itemList。根据当前页数(currPage)获取该绘制的内容。

整个道具栏做成一个大按钮，还需要属性selectedItem 每次根据selectedItem重绘右侧的物品详细说明

按钮可往前不往后，以防一页的道具全用光会不去

点击时：点左侧 根据位置和itemList和currPage推导处在哪里，更新selectedItem，更新右侧 左侧是一个大按钮
点下方 左右 currPage
右侧按键：
使用 尝试使用selectedItem
批量使用 新功能
隐藏/显示 修改道具的隐藏属性
显示隐藏 页面级属性 showHidedItem

最高级 MenuPage 名为boxPage
拥有背景和背景中的两个箭头和道具栏|装备栏的字样
按键切换两栏 监听tab等
右下角的×

toolBox 拥有底部两按钮，右侧的一切，中间的大按钮
equipBox 拥有
```js
const itemClsName = {
    "constants": "永久道具",
    "tools": "消耗道具",
}
const itemNum = 12;

core.initThisEventInfo();
let info = core.status.thisUIEventInfo
info.index = 1;
core.setIndexAndSelect('select');
let ctx =core.canvas.ui;
core.status.thisEventClickArea = [];

let info1 = core.drawBoxBackground(ctx);
info1.itemNum = itemNum;
core.drawItemListbox(ctx, info1.obj);
core.drawToolboxRightbar(ctx, info1);

```

!mypromt callback疑似需要改回去

难绷的bug太多了 自动拾取，自动清怪，追猎等等。

moveBlock:
```js
let [x, y, steps, time, keep] = [0,0,['down'],1,false];
let blockArr = core.maps._getAndRemoveBlock(x, y);
let block = blockArr[0], blockInfo = blockArr[1];
let canvases = core.maps._initDetachedBlock(blockInfo, x, y, block.event.animate !== false);
core.maps._moveDetachedBlock(blockInfo, 32 * x, 32 * y, 1, canvases);
```
1.blockArr:[block,blockInfo]组成，同时会removeBlock
block,blockInfo有一个什么都没有，则blockArr什么都没有，则返回
接下来处理moveSteps，得到['down',1];
_initDetachedBlock返回三个canvas的对象 {headCanvas,bodyCanvas,damageCanvas}
_moveDetachedBlock：疑似是通过该函数不断移动实现移动效果

模板字符串居然不能随意填字符串，逆天
arguments对象是 JavaScript 中的一个特殊对象，它自动提供给每一个函数作为局部变量。它是类数组对象，但缺少真正数组的许多方法。