diff --git a/docs/intermediate/flags.md b/docs/intermediate/flags.md new file mode 100644 index 0000000..4f85a3b --- /dev/null +++ b/docs/intermediate/flags.md @@ -0,0 +1,62 @@ +# Flag 变量 + +Flag 系统(`state.flags`)是数据端提供的**全局可存档变量**。任何需要跨事件、跨楼层保留的简单状态,都可以存进 Flag;它会随存档一起保存与恢复。 + +## 字段 + +Flag 中的每一项是一个**字段**(`IFlagCommonField`),字段名与值一一对应。字段对象提供 `set(value)`(设置值)、`add(value)`(对数字值增减)与 `get()`(取值)。一般不需要直接操作字段对象,用下面的系统接口即可。 + +## 全部接口 + +`IFlagSystem` 提供如下接口: + +| 接口 | 说明 | +| --- | --- | +| `occupied(field)` | 判断字段是否被占用 | +| `setField(field, value)` | 以指定值插入字段,返回字段对象 | +| `getField(field)` | 取字段对象,不存在返回 `null` | +| `getOrInsert(field, defaultValue)` | 取字段,不存在则以默认值创建 | +| `getOrInsertComputed(field, defaultValue)` | 同上,但默认值由函数惰性计算 | +| `deleteField(field)` | 删除字段 | +| `setFieldValue(field, value)` | 设置字段的值 | +| `addFieldValue(field, value)` | 对数字字段增减 | +| `getFieldValue(field)` | 取字段的值,不存在返回 `undefined` | +| `getFieldValueDefaults(field, defaultValue)` | 取字段的值,不存在则以默认值创建并返回 | + +`getOrInsertComputed` 只在字段确实不存在时才执行默认值函数,适合默认值计算量较大的场景。`getFieldValue` 没有默认值,需要默认值时用 `getFieldValueDefaults`。 + +```ts +state.flags.setFieldValue('door-open', true); +const open = state.flags.getFieldValue('door-open'); + +state.flags.addFieldValue('kill-count', 1); +const count = state.flags.getFieldValueDefaults('kill-count', 0); +``` + +## 使用建议 + +Flag 会进入存档,因此**不建议滥用**:不再需要的变量应及时用 `deleteField` 删除,否则它会一直留在存档里。能用局部状态或对象自身数据表达的,就不必放进 Flag。 + +```ts +if (!state.flags.occupied('temp-flag')) { + state.flags.setFieldValue('temp-flag', 1); +} + +// 用完后删除,避免残留进存档 +state.flags.deleteField('temp-flag'); +``` + +Flag 常与游戏关键动作配合使用,例如在钩子中读写,见[钩子](./hooks.md)。 + +## 示例:记录开关与计数 + +```ts +// 记录一个开关 +state.flags.setFieldValue('boss-defeated', true); + +// 记录一个计数 +const times = state.flags.getOrInsert('open-count', 0); +times.add(1); +``` + +想从 `state` 出发找到 Flag 对象,见[数据端总览](./data-state-overview.md)。 diff --git a/docs/intermediate/map-tiles.md b/docs/intermediate/map-tiles.md new file mode 100644 index 0000000..1a61b64 --- /dev/null +++ b/docs/intermediate/map-tiles.md @@ -0,0 +1,50 @@ +# 地图图块 + +地图图块存放在图层(`IMapLayer`)上。本篇讲解图块的读取、写入、批量操作与迭代,接口都定义在图层的静态部分(`ILayerStatic`)。 + +## 取到图层 + +图块操作针对图层。你可以从楼层的 `layerList` 中取到图层,事件层则通过 `eventLayer` 取得: + +```ts +const map = state.maps.getMap('floor-1')!; +for (const layer of map.layerList) { + // layer 即 IMapLayer +} +``` + +## 读取与写入单点 + +- `getBlock(x, y)`:取指定点的静态图块数字(无图块返回 0,不在地图上返回 -1); +- `setBlock(block, x, y)`:设置指定点的静态图块; +- `removeBlock(x, y)`:移除指定点的静态图块。 + +```ts +layer.setBlock(21, 3, 5); +const num = layer.getBlock(3, 5); +layer.removeBlock(3, 5); +``` + +## 批量读写 + +- `putMapData(array, x, y, width)`:把一维数组写入地图,数组第一项对应 `(x, y)`,`width` 为矩形范围的宽度; +- `getMapData()`:取整张地图的图块数组; +- `getMapData(x, y, width, height)`:取指定矩形区域的图块数组。 + +返回的数组是对内部存储的拷贝,修改它不会直接改动地图。 + +```ts +const region = layer.getMapData(0, 0, 3, 3); +``` + +## 迭代非空图块 + +`iterateBlocks()` 返回所有非空图块,每个元素包含该点的位置 `locator`、图块数字 `tile`、静态图块 `static` 与动态图块 `dynamics`。非空指图块数字不为 0,因此只挂事件、没有图块的格子不会被迭代到。 + +```ts +for (const block of layer.iterateBlocks()) { + const num = block.tile; +} +``` + +图层与事件层的结构见[地图结构](./map-structure.md);想从 `state` 出发找到地图对象,见[数据端总览](./data-state-overview.md)。