mirror of
https://github.com/motajs/template.git
synced 2026-10-30 13:10:19 +08:00
docs(10): add heading anchors to cross-doc links(D-74)
This commit is contained in:
parent
932725455b
commit
343296c63c
@ -135,3 +135,18 @@
|
||||
**验证:** prettier(CRLF、单 H1)→ `cmd /c "pnpm exec tsx docs/.vitepress/init.ts && pnpm docs:build"` 退出 0、`build complete`、无 dead link(含新增锚点)。
|
||||
|
||||
**待报告(源码细节):** `compareEquip` 的实现仍保留逐键回退:某一侧未提供某个键时,该侧取 `this.attribute.getFinalAttribute(key)`(真实最终属性)。目标槽非空且只有单侧提供该键时,结果会受现役装备影响,与「按空槽比较」的语义不完全一致;文档按用户明确的空槽语义书写。
|
||||
|
||||
### 批次 G(D-74 高级 I / 中级链接锚点)执行记录(2026-10-23)
|
||||
|
||||
- D-74/U8-01:扫描 `docs/intermediate/*.md`、`docs/advanced/*.md`、`docs/advanced/ii/*.md` 的全部 217 条跨文档链接,为明确指向具体章节的 55 处链接补上标题锚点;指向整篇文档的链接保持原样。分布如下:
|
||||
- `[代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」` → `./code-basics.md#照抄教程里的代码时-怎么处理-import`(33 处,分布在 19 篇中级文档);
|
||||
- `[src 导览](./src-tour.md) 的「包从哪来」` → `./src-tour.md#包从哪来-src、packages-user-与-packages`(11 处,分布在 9 篇中级文档);
|
||||
- `[怪物光环](./enemy-aura.md)的「光环、计算后怪物与『读写外部』」` → `#光环、计算后怪物与「读写外部」`(2 处:`enemy-map-damage.md`、`enemy-query.md`);
|
||||
- 内置特殊属性编号引用 → `./enemy-specials.md#内置属性编号表`(2 处:`enemy-combat-script.md`、`enemy-final.md`);
|
||||
- `[代码基础]` 的泛型、函数章节引用 → `#泛型-类型的「函数」`、`#函数`(各 1 处,`enemy-specials.md`);
|
||||
- `enemy-specials.md` → `./combat-overview.md#什么时候重建`(1 处);
|
||||
- `enemy-calculator.md`、`hero-equipment.md` 的修饰器章节引用 → `./hero-attribute.md#修饰器-数值与百分比加成`(2 处);
|
||||
- `enemy-status-hooks.md` 的 `save` 参数引用 → `./hero-attribute.md#save-参数与读档一致性`(1 处);
|
||||
- `advanced/plugin-system.md` → `./saveable-content.md#验证`(1 处)。
|
||||
- `hooks.md` 的「切换楼层前后」指向「需求 → 钩子对照表」中的表格行而非标题,无对应锚点,保持原样。
|
||||
- **验证:** prettier(CRLF、全部 unchanged)→ `cmd /c "pnpm exec tsx docs/.vitepress/init.ts && pnpm docs:build"` 退出 0、`build complete in 20.29s`;逐项检查 `public/_docs` 生成 HTML 的 `id`,本次新增锚点与此前批次 F 的 5 个锚点全部可解析。
|
||||
|
||||
@ -501,7 +501,7 @@ export function checkMyPlugin(state: ICoreState): void {
|
||||
|
||||
`PluginStatus` 与 `ICoreState` 从 `@user/data-state` 引入,`IMyPlugin` 是你写在插件 `types.ts` 里的对外接口。`status` 应为 `Loaded`,`plugin` 应是你 `new` 的那个实例。如果是 `null`,先检查 `list.ts` 有没有真的 `new` 并放进数组。
|
||||
|
||||
想确认依赖阻断,可以把 `dataDeps` 里的某个 id 改成一个不存在的名字再启动:控制台应报缺失依赖错误(`77`,带插件 id 与缺失的依赖 id),并且你的插件没有任何时机输出。插件注册的存档内容如何验证,见[可存档内容](./saveable-content.md)的「验证」一节。
|
||||
想确认依赖阻断,可以把 `dataDeps` 里的某个 id 改成一个不存在的名字再启动:控制台应报缺失依赖错误(`77`,带插件 id 与缺失的依赖 id),并且你的插件没有任何时机输出。插件注册的存档内容如何验证,见[可存档内容](./saveable-content.md#验证)的「验证」一节。
|
||||
|
||||
## 边界与注意
|
||||
|
||||
|
||||
@ -90,7 +90,7 @@ math.add(1, 2);
|
||||
|
||||
1. **直接粘片段**。你所在文件的顶部通常**已经有**这些引入,不用再粘一遍;
|
||||
2. 粘完若编辑器提示「找不到名称 Xxx」,说明这个文件还没引入它,再回到**文件顶部**补一行对应的 `import`(写法同上面的 `import { add } from './math'`);
|
||||
3. 不确定某个名字该从哪个包装入,看 [src 导览](./src-tour.md) 的「包从哪来」。
|
||||
3. 不确定某个名字该从哪个包装入,看 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」。
|
||||
|
||||
不要把片段里没出现的 `import` 也一并照抄,重复引入反而会让编辑器报错。
|
||||
|
||||
|
||||
@ -34,14 +34,14 @@ awake(装配)→ initialize(加载前)→ afterLoad(加载后)
|
||||
|
||||
## 注册插件
|
||||
|
||||
插件在 `src/data/plugin/list.ts` 的 `dataPlugins` 数组中登记;`IDataPluginDefine` 来自 `@user/data-state`(包名含义见 [src 导览](./src-tour.md) 的「包从哪来」):
|
||||
插件在 `src/data/plugin/list.ts` 的 `dataPlugins` 数组中登记;`IDataPluginDefine` 来自 `@user/data-state`(包名含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」):
|
||||
|
||||
```ts
|
||||
/** 数据端插件列表 */
|
||||
export const dataPlugins: IDataPluginDefine[] = [new DataShopPlugin()];
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
数据端启动时按这个列表加装插件。把你自己写的插件 `new` 出来加进数组即可(插件目录见[源码导览](./src-tour.md))。
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ class MySystem {
|
||||
}
|
||||
```
|
||||
|
||||
本教程后续的代码示例都假设 `state` 已经在当前作用域中(由上面任一方式获得),因此示例不再重复它的来源;示例也一律**省略 `import`**,照抄时怎么处理引入见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」。
|
||||
本教程后续的代码示例都假设 `state` 已经在当前作用域中(由上面任一方式获得),因此示例不再重复它的来源;示例也一律**省略 `import`**,照抄时怎么处理引入见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」。
|
||||
|
||||
## 常用对象与获取方式
|
||||
|
||||
|
||||
@ -70,7 +70,7 @@
|
||||
|
||||
范围对象由 `@motajs/common` 提供,常用的有 `FullRange`(全场)、`RectRange`(矩形)、`ManhattanRange`(曼哈顿距离/菱形)与 `RayRange`(射线)。
|
||||
|
||||
下方示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md) 的「包从哪来」。
|
||||
下方示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」。
|
||||
|
||||
## 光环、计算后怪物与「读写外部」
|
||||
|
||||
@ -165,7 +165,7 @@ apply(
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:新增字段的名字与含义、`apply` 里改的属性换成你自己的。如果只是想改现有数值的算法(例如把取整改成四舍五入),只改 `apply` 里对应那一段,不用动参数接口。
|
||||
|
||||
@ -396,7 +396,7 @@ export class WeakAura implements IEnemyAuraView<
|
||||
state.enemyContext.registerAuraConverter(new WeakAuraConverter());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`30`、类名、`priority`、`apply` 里改的属性。
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@ state.enemyContext.getDamageSystem()?.useCalculator(new MainDamageCalculator());
|
||||
|
||||
- 只是让怪物某项属性更高:不要改计算器,放进光环、查询或最终效果,让 `enemy.getAttribute(...)` 读到新值即可;
|
||||
- 要让属性按回合数累积、按条件改变倍率、或增加新的伤害分支:在 `calculate` 的对应段落里改公式;
|
||||
- 只是给勇士一侧加临时数值:用[勇士属性](./hero-attribute.md)里的修饰器,计算器会自动读到最终属性。
|
||||
- 只是给勇士一侧加临时数值:用[勇士属性](./hero-attribute.md#修饰器-数值与百分比加成)里的修饰器,计算器会自动读到最终属性。
|
||||
|
||||
## 示例:等差数列属性
|
||||
|
||||
@ -66,7 +66,7 @@ state.enemyContext.getDamageSystem()?.useCalculator(new MainDamageCalculator());
|
||||
|
||||
「等差数列属性」指怪物攻击每回合按固定值递增。属性本身在一次计算中是常量,所以不能靠给 `atk` 加值实现;要在 `calculate` 里把「每回合伤害」按等差数列求和:
|
||||
|
||||
示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md) 的「包从哪来」。下面用 `[模板]` 标出可原样照抄的行,用 `[需改]` 标出必须按需求改的行。
|
||||
示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」。下面用 `[模板]` 标出可原样照抄的行,用 `[需改]` 标出必须按需求改的行。
|
||||
|
||||
**目标**:让怪物的每回合伤害按固定公差逐回合递增(本示例公差为 5)。
|
||||
|
||||
@ -102,7 +102,7 @@ calculate(
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`step`(公差,本示例为 `5`)换成你要的递增规则。注意 `turn` 在内置方法里已经算过,插入时不要重复声明同名变量——把新增两行放在 `damage += (turn - 1) * enemyPerDamage;` 之后即可。
|
||||
|
||||
@ -211,7 +211,7 @@ export class ArithmeticCalculator implements IDamageCalculator<
|
||||
state.enemyContext.getDamageSystem()?.useCalculator(new ArithmeticCalculator());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`step`(公差,本示例为 `5`)与 `base` 的算法换成你要的递增规则。
|
||||
|
||||
|
||||
@ -80,7 +80,7 @@ async before(
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`hasSpecial(18)` 的判断与提示文字换成你自己的。
|
||||
|
||||
@ -109,7 +109,7 @@ async after(
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:回复量 `20` 与回复的属性换成你自己的。如果希望回血发生在奖励结算**之前**,就把这段放在 `after` 开头而不是末尾。
|
||||
|
||||
@ -180,7 +180,7 @@ state.combat.addCombatScript(new XxxCombatScript());
|
||||
|
||||
### 示例:拥有某特殊属性时无法战斗
|
||||
|
||||
下面的脚本检查怪物是否拥有 code 18 的特殊属性(无敌,编号见[特殊属性](./enemy-specials.md)的「内置属性编号表」),有则直接放弃战斗(示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md) 的「包从哪来」)。代码中用 `[模板]` 标出可原样照抄的行,用 `[需改]` 标出必须按需求改的行。
|
||||
下面的脚本检查怪物是否拥有 code 18 的特殊属性(无敌,编号见[特殊属性](./enemy-specials.md#内置属性编号表)的「内置属性编号表」),有则直接放弃战斗(示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」)。代码中用 `[模板]` 标出可原样照抄的行,用 `[需改]` 标出必须按需求改的行。
|
||||
|
||||
**目标**:带「无敌」(code 18)的怪物不能被打,点它时直接放弃战斗并给出提示。
|
||||
|
||||
@ -218,7 +218,7 @@ export class SealCombatScript implements ICombatScript<IEnemyAttr, IHeroAttr> {
|
||||
state.combat.addCombatScript(new SealCombatScript());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`priority`(本示例 `100`,越大越先执行,内置脚本是 `0`)、`hasSpecial(18)` 的判断与提示文字换成你自己的。
|
||||
|
||||
@ -264,7 +264,7 @@ export class HealAfterCombatScript implements ICombatScript<
|
||||
state.combat.addCombatScript(new HealAfterCombatScript());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`priority`(本示例 `-10`,设成负值排在内置脚本之后)、回复量 `20` 与回复的属性换成你自己的。
|
||||
|
||||
|
||||
@ -28,9 +28,9 @@ state.enemyContext.registerFinalEffect(effect);
|
||||
|
||||
内置方法体的结构很简单:先取出勇士的最终攻防,然后按 code 依次判断,命中就改怪物的基础属性。加一条新效果,就是在这串判断后面再接一段。
|
||||
|
||||
以「仿攻」为例:让怪物的攻击力等于勇士的最终攻击力。它与内置的模仿类似,区别是只改攻击、不改防御(这里的 code 32 是示例自选的未占用编号;内置的最终效果是坚固 code 3、模仿 code 8,内置编号见[特殊属性](./enemy-specials.md))。
|
||||
以「仿攻」为例:让怪物的攻击力等于勇士的最终攻击力。它与内置的模仿类似,区别是只改攻击、不改防御(这里的 code 32 是示例自选的未占用编号;内置的最终效果是坚固 code 3、模仿 code 8,内置编号见[特殊属性](./enemy-specials.md#内置属性编号表))。
|
||||
|
||||
示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md) 的「包从哪来」。下面代码用 `[模板]` 标出可原样照抄的行,用 `[需改]` 标出必须按需求改的行。
|
||||
示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」。下面代码用 `[模板]` 标出可原样照抄的行,用 `[需改]` 标出必须按需求改的行。
|
||||
|
||||
**目标**:让带「仿攻」(code 32)的怪物,攻击力始终等于勇士的最终攻击力。
|
||||
|
||||
@ -51,7 +51,7 @@ map.set(
|
||||
);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
再在 `final.ts` 的 `apply` 末尾接一个分支——
|
||||
|
||||
@ -171,7 +171,7 @@ export class AttackCopyFinal implements IEnemyFinalEffect<
|
||||
state.enemyContext.registerFinalEffect(new AttackCopyFinal());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:编号(`32`)、类名、`priority` 与 `apply` 里的效果换成你自己的。
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
|
||||
转换器拿到的 `handler.enemy` 是**计算后怪物**(`getComputedEnemy()`),也就是光环、查询、最终效果都算完后的结果。因此光环通过 `applySpecial` 给怪物新增的特殊属性会真实生效:例如某个光环给一只怪物加了「领域」(code 13),这只怪物就确实拥有领域地图伤害,勇士踩进范围会掉血。
|
||||
|
||||
旧样板做不到动态给怪物添加特殊属性,这一点是现版本才有的能力。反过来说,如果一种属性既要读外部环境、又要修改外部环境,不要硬塞进地图伤害或单个光环里,而应拆成「查询效果 + 光环效果」,再用一个新怪物属性桥接(见[怪物光环](./enemy-aura.md)的「光环、计算后怪物与『读写外部』」)。
|
||||
旧样板做不到动态给怪物添加特殊属性,这一点是现版本才有的能力。反过来说,如果一种属性既要读外部环境、又要修改外部环境,不要硬塞进地图伤害或单个光环里,而应拆成「查询效果 + 光环效果」,再用一个新怪物属性桥接(见[怪物光环](./enemy-aura.md#光环、计算后怪物与「读写外部」)的「光环、计算后怪物与『读写外部』」)。
|
||||
|
||||
## 注册
|
||||
|
||||
@ -104,7 +104,7 @@ convert(
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:只需要把 `FaceGroup.Dir4` 换成 `FaceGroup.Dir8`。`LaserDamageView` 的构造函数把朝向处理器经 `dir.mapMovement()` 映射成方向列表,八方向组自然给出八项;其中「原地不动」的未知方向偏移为零,`RayRange` 会自动跳过它,不必额外处理。
|
||||
|
||||
@ -243,7 +243,7 @@ map.set(
|
||||
);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
再写伤害视图与转换器——
|
||||
|
||||
|
||||
@ -55,7 +55,7 @@ state.enemyContext.registerSpecialQueryEffect(new AssimilationQueryEffect());
|
||||
|
||||
常规查询与特殊查询的 `priority` 和光环共用同一套优先级,从高到低处理。高优先级的效果先执行,低优先级能看到它留下的结果;反过来不行。查询新增的光环只能影响之后的阶段,规则与[怪物光环](./enemy-aura.md)一致。
|
||||
|
||||
查询属于「依赖外部、但只改自己」的那一类。如果一种属性确实同时需要「依赖外部」与「修改外部」,不要把它硬做成一种查询或一种光环,而应拆成查询 + 光环两个效果,再用一个新怪物属性桥接(见[怪物光环](./enemy-aura.md)的「光环、计算后怪物与『读写外部』」)。
|
||||
查询属于「依赖外部、但只改自己」的那一类。如果一种属性确实同时需要「依赖外部」与「修改外部」,不要把它硬做成一种查询或一种光环,而应拆成查询 + 光环两个效果,再用一个新怪物属性桥接(见[怪物光环](./enemy-aura.md#光环、计算后怪物与「读写外部」)的「光环、计算后怪物与『读写外部』」)。
|
||||
|
||||
## 查询上下文 ctx
|
||||
|
||||
@ -199,7 +199,7 @@ state.enemyContext.registerSpecialQueryEffect(new XxxSpecialQueryEffect());
|
||||
|
||||
## 示例:抱团
|
||||
|
||||
「抱团」的规则是:范围内每有一个带同种特殊属性的怪物,自身攻击力就增加固定值。它只需要读周围、改自己的攻击,所以用常规查询实现(示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md) 的「包从哪来」)。
|
||||
「抱团」的规则是:范围内每有一个带同种特殊属性的怪物,自身攻击力就增加固定值。它只需要读周围、改自己的攻击,所以用常规查询实现(示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」)。
|
||||
|
||||
**目标**:带「抱团」(示例 code 40)的怪物,范围内每多一个同种特殊属性的怪物,自身攻击加固定值。
|
||||
|
||||
@ -252,7 +252,7 @@ export class GroupQueryEffect implements IEnemyCommonQueryEffect<
|
||||
state.enemyContext.registerCommonQueryEffect(40, new GroupQueryEffect());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`priority`、触发用的 `special.code` 与注册时的 code(本示例 40)、`radius` / `atk` 的读法换成你自己的。
|
||||
|
||||
@ -353,7 +353,7 @@ export class AssimilationQueryEffect implements IEnemySpecialQueryEffect<
|
||||
state.enemyContext.registerSpecialQueryEffect(new AssimilationQueryEffect());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`priority`、`shouldQuery` 里的判断(本示例 `hasSpecial(41)`)、`add` / `modify` 的合并逻辑换成你自己的。
|
||||
|
||||
@ -398,7 +398,7 @@ export class HornQueryEffect implements IEnemyCommonQueryEffect<
|
||||
state.enemyContext.registerCommonQueryEffect(42, new HornQueryEffect());
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:`priority`、注册时的 code(本示例 42)、`special.value` 的用法换成你自己的。
|
||||
|
||||
|
||||
@ -57,7 +57,7 @@
|
||||
- 参数是数字:`enemy.getSpecial<number>(4)`,之后 `value` 就是 `number`,可以直接参与计算;
|
||||
- 参数是对象:`enemy.getSpecial<ISpecial23Value>(23)`,之后 `value.range`、`value.hpBuff` 等字段都能直接读取。
|
||||
|
||||
`T` 也可以省略(写成 `getSpecial(4)`)。但省略后引擎推断不出具体类型,`value` 会退化为一个取不到具体类型的宽泛类型,必须自己断言之后才能当数字或对象用。因此读取已知属性时,建议把 `<T>` 显式写出来。`T` 的写法(尖括号里填类型)就是[代码基础](./code-basics.md)里讲的泛型。
|
||||
`T` 也可以省略(写成 `getSpecial(4)`)。但省略后引擎推断不出具体类型,`value` 会退化为一个取不到具体类型的宽泛类型,必须自己断言之后才能当数字或对象用。因此读取已知属性时,建议把 `<T>` 显式写出来。`T` 的写法(尖括号里填类型)就是[代码基础](./code-basics.md#泛型-类型的「函数」)里讲的泛型。
|
||||
|
||||
每个特殊属性对象实现 `ISpecial<T>`,常用成员是 `code`、`value` 与 `getDescription()`:
|
||||
|
||||
@ -117,7 +117,7 @@ map.set(
|
||||
- 写字符串时,这段文字是固定的,例如坚固永远显示「坚固」;
|
||||
- 写函数时,引擎会在需要显示时把这条特殊属性对象传进来(就是参数 `special`),你就能用它的 `value` 拼出动态文字——上面的连击在 `value` 为 2 时显示「2连击」,为 3 时显示「3连击」。
|
||||
|
||||
函数这种「接收参数、返回结果」的写法,见[代码基础](./code-basics.md)的函数一节。
|
||||
函数这种「接收参数、返回结果」的写法,见[代码基础](./code-basics.md#函数)的函数一节。
|
||||
|
||||
参数可以不只是数字。比如吸血用对象保存比例与是否加到自身:
|
||||
|
||||
@ -218,13 +218,13 @@ map.set(
|
||||
);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:先搜一遍 `special.ts` 中已有的 `map.set(...)`,确认这个 code 没被占用;再把编号、名称、默认值与颜色换成你自己的。有参数且参数是对象时,还要按上面的步骤在顶部补一个 `ISpecial{code}Value` 参数接口。
|
||||
|
||||
**怎么验证**:把这条新属性挂到怪物上(在怪物数据里填上 code 50 与参数),编辑器应能识别并显示名称与描述;再按「属性实现位置」实现的效果应在战斗中生效。
|
||||
|
||||
**注意**:别破坏编辑器识别约定——`//#region` 标记、`// {code} - {name}` 与 `/** {code} - {name} */` 注释、参数接口名 `ISpecial{code}Value`(见下方「编辑器识别约定」)。刷新上下文通常无需手动:重建由怪物上下文惰性处理(放 / 移怪物、注册效果、绑定勇士都会自动标记),读取计算后怪物时自动重算;只有绕开正常流程、直接改怪物对象时才需要手动 `state.enemyContext.markDirty(view)`(必要时 `state.enemyContext.buildup()` 全量重建)。详见[战斗总览](./combat-overview.md)的「什么时候重建」。
|
||||
**注意**:别破坏编辑器识别约定——`//#region` 标记、`// {code} - {name}` 与 `/** {code} - {name} */` 注释、参数接口名 `ISpecial{code}Value`(见下方「编辑器识别约定」)。刷新上下文通常无需手动:重建由怪物上下文惰性处理(放 / 移怪物、注册效果、绑定勇士都会自动标记),读取计算后怪物时自动重算;只有绕开正常流程、直接改怪物对象时才需要手动 `state.enemyContext.markDirty(view)`(必要时 `state.enemyContext.buildup()` 全量重建)。详见[战斗总览](./combat-overview.md#什么时候重建)的「什么时候重建」。
|
||||
|
||||
`createSpecials(state)` 返回 `Map<number, SpecialCreation<any>>`。`initializeEnemy`(`src/data/enemy/initialize.ts`,数据端集中注册内置怪物功能的入口函数)会遍历这个 Map,逐个调用 `state.enemyManager.registerSpecial(code, cons)`。也就是说,内置属性与你自己新增的属性走的是同一套注册流程:只要把新属性放进这个 Map,它就会随 `initializeEnemy` 一起完成注册。
|
||||
|
||||
|
||||
@ -105,7 +105,7 @@ map.set(
|
||||
);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**第一步:在战斗钩子里「挂上状态」。** 加在 `EnemyCombatHooks.onAfterCombat` 末尾——
|
||||
|
||||
@ -157,7 +157,7 @@ if (double) {
|
||||
|
||||
三处都在内置类里,所以不必注册;如果你确实另写了钩子或脚本类,才需要在 `initializeEnemy` 里 `addHook` / `addCombatScript`(见下一节)。
|
||||
|
||||
状态里用到的临时加减或百分比,优先用修饰器实现,概念与 `save` 参数见[勇士属性](./hero-attribute.md)。
|
||||
状态里用到的临时加减或百分比,优先用修饰器实现,概念与 `save` 参数见[勇士属性](./hero-attribute.md#save-参数与读档一致性)。
|
||||
|
||||
## 自己写钩子类
|
||||
|
||||
@ -204,7 +204,7 @@ state.combat.addHook(new XxxHooks(state));
|
||||
|
||||
### 示例:蓄力(下次战斗伤害乘二)
|
||||
|
||||
下面仍以「蓄力」为例,演示自写类的形态。它只是填空示范,不是模板本身:一个钩子负责挂状态,一个脚本负责消费(示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md) 的「包从哪来」)。
|
||||
下面仍以「蓄力」为例,演示自写类的形态。它只是填空示范,不是模板本身:一个钩子负责挂状态,一个脚本负责消费(示例里的 `@motajs/*`、`@user/*` 是包名,含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」)。
|
||||
|
||||
```ts
|
||||
// [需改] 类名
|
||||
@ -250,7 +250,7 @@ state.combat.addHook(new ChargedHooks(state));
|
||||
state.combat.addCombatScript(new ConsumeDoubleScript(state));
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:编号(`45`)、类名、flag 名、`priority` 与翻倍写法换成你自己的。第三步「计算器只读」与上面改内置的写法完全相同,不再重复。
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
## 内建函数(BuiltInFunction)
|
||||
|
||||
事件里能调用的每一个动作都叫**内建函数**,接口为 `BuiltInFunction`(来自 `@motajs/anon-tokyo`——引擎里负责把事件脚本解释执行的包,其归属层级见 [src 导览](./src-tour.md) 的「包从哪来」):
|
||||
事件里能调用的每一个动作都叫**内建函数**,接口为 `BuiltInFunction`(来自 `@motajs/anon-tokyo`——引擎里负责把事件脚本解释执行的包,其归属层级见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」):
|
||||
|
||||
```ts
|
||||
interface BuiltInFunction<P, E> {
|
||||
@ -121,7 +121,7 @@ export class EventSetFlag implements BuiltInFunction<
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
再把新类加进注册数组:
|
||||
|
||||
@ -138,7 +138,7 @@ export function createEventRegistrations(): BuiltInFunction[] {
|
||||
|
||||
**怎么验证**:在事件语句里写一句 `setFlag(...)` 调用它,运行后读对应 Flag,应能看到写入的值(Flag 的读写见 [Flag 变量](./flags.md))。
|
||||
|
||||
**注意**:`BuiltInFunction` 来自 `@motajs/anon-tokyo`、`IBlockEventEnv` 来自 `@user/data-system`(包名含义见 [src 导览](./src-tour.md) 的「包从哪来」),顶部缺哪个再补哪个;参数接口建议放进 `src/data/event/types.ts`,与内置参数放在一起。
|
||||
**注意**:`BuiltInFunction` 来自 `@motajs/anon-tokyo`、`IBlockEventEnv` 来自 `@user/data-system`(包名含义见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」),顶部缺哪个再补哪个;参数接口建议放进 `src/data/event/types.ts`,与内置参数放在一起。
|
||||
|
||||
## 示例:勇士回血
|
||||
|
||||
@ -166,7 +166,7 @@ export class EventHealHero implements BuiltInFunction<
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `'healHero'` 换成你的事件名;把 `add('hp', param.hp)` 换成你要调整的属性与数值。
|
||||
|
||||
|
||||
@ -88,7 +88,7 @@ const times = state.flags.getOrInsert('open-count', 0);
|
||||
times.add(1);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `'boss-defeated'`、`'open-count'` 换成你的字段名,把 `true`、`1` 换成你的值。只需一次读写的开关用「值」那组更简单;要反复增减的计数,用 `getOrInsert` 拿到字段对象后再 `add` 更省事。
|
||||
|
||||
|
||||
@ -57,7 +57,7 @@ attr.addModifier('def', defDown);
|
||||
attr.deleteModifier('def', defDown);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(`ValueModifier`、`PercentageModifier` 来自 `@user/data-base`);文件顶部通常已有,不要再粘,报缺少时再补(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(`ValueModifier`、`PercentageModifier` 来自 `@user/data-base`);文件顶部通常已有,不要再粘,报缺少时再补(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
想要一段**临时**加成时,就先 `addModifier(...)` 挂上修饰器,在不再需要时用 `deleteModifier(...)` 把它移除,加成随即消失;反之,只要一直不移除,它就是永久加成。
|
||||
|
||||
@ -100,7 +100,7 @@ const weaken = new PercentageModifier(-0.2);
|
||||
state.hero.getModifiableAttribute().addModifier('def', weaken);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(`PercentageModifier` 来自 `@user/data-base`);文件顶部通常已有,不要再粘,报缺少时再补(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(`PercentageModifier` 来自 `@user/data-base`);文件顶部通常已有,不要再粘,报缺少时再补(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `'atk'`、`'def'` 换成你要改的属性名,把 `15`、`-0.2` 换成你的数值(`-0.2` 即 -20%)。
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ state.hero.equip.equip(uid, 0);
|
||||
const off = state.hero.equip.unequip(0);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员,一般无需额外引入);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员,一般无需额外引入);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `'sword'` 换成你的装备 id 或图块数字;把 `0`(槽位)换成目标槽的索引或名称;`uid`、`off` 不需要时可省去接收。
|
||||
|
||||
@ -63,7 +63,7 @@ const total = state.hero.items.equipment.count('sword');
|
||||
|
||||
## 装备的加成
|
||||
|
||||
每件装备实例(`IEquipmentState`)对勇士属性提供**数值加成**与**百分比加成**,分别通过 `getValue` / `getPercentage` 读取,`setValue` / `setPercentage` 修改。这两类加成本质上就是[勇士属性](./hero-attribute.md)中的修饰器:装备时把对应的 `ValueModifier` / `PercentageModifier` 挂到勇士属性上,卸下时移除,因此不必手动维护加成数值。
|
||||
每件装备实例(`IEquipmentState`)对勇士属性提供**数值加成**与**百分比加成**,分别通过 `getValue` / `getPercentage` 读取,`setValue` / `setPercentage` 修改。这两类加成本质上就是[勇士属性](./hero-attribute.md#修饰器-数值与百分比加成)中的修饰器:装备时把对应的 `ValueModifier` / `PercentageModifier` 挂到勇士属性上,卸下时移除,因此不必手动维护加成数值。
|
||||
|
||||
```ts
|
||||
const equipState = state.hero.items.equipment.get(uid);
|
||||
|
||||
@ -47,7 +47,7 @@ state.hero.items.useItem('yellow-key');
|
||||
const count = state.hero.items.itemCount('yellow-key');
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员,一般无需额外引入);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员,一般无需额外引入);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `'yellow-key'` 换成你的道具 id 或图块数字;只用得到哪几行就留哪几行,不必全抄。
|
||||
|
||||
@ -88,7 +88,7 @@ export const item200: ItemEffect = {
|
||||
};
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(`ItemEffect` 等类型来自内容层);这是**内容层**文件,不是你平时写逻辑的 `src/data`。若编辑器提示缺少名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(`ItemEffect` 等类型来自内容层);这是**内容层**文件,不是你平时写逻辑的 `src/data`。若编辑器提示缺少名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `item200` 的编号换成你的道具编号;把 `useEffect` 里的效果换成你要的(这里是把 `+5` 攻击与提示文字改成你的)。
|
||||
|
||||
|
||||
@ -59,7 +59,7 @@ state.emitTip(
|
||||
);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:只保留你要用的那几行;提示文字换成你自己的。
|
||||
|
||||
|
||||
@ -115,7 +115,7 @@ export class MainHeroAttributeHooks implements IHeroAttributeHooks<IHeroAttr> {
|
||||
}
|
||||
```
|
||||
|
||||
> 复制说明:这段就是内置类的现有代码,不需要新增文件;若编辑器提示缺少某个名字,再在文件顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:这段就是内置类的现有代码,不需要新增文件;若编辑器提示缺少某个名字,再在文件顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `void name;` / `void value;` 换成你的处理;示例只是提示,也可以改成加属性、记 flag、触发事件等。
|
||||
|
||||
@ -163,7 +163,7 @@ const hook = new MyHeroAttributeHooks(state);
|
||||
const controller = state.hero.attribute.addHook(hook);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`;文件顶部通常已有,不要再粘。若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:类名、`implements` 后面的钩子族接口、方法名(对照上两张表),以及 `addHook` 前面的目标主对象。
|
||||
|
||||
|
||||
@ -74,7 +74,7 @@ const ground = [...map.layerList].find(layer => layer.alias === 'ground');
|
||||
const second = [...map.layerList].find(layer => layer.zIndex === 2);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `'floor-1'` 换成你的楼层 id;把 `'ground'` / `2` 换成你要找的别名或纵深;只保留你要用的那种找法。
|
||||
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
|
||||
## 新增自定义录像指令
|
||||
|
||||
录像指令属于**引擎内容**,需要改动 `packages-user` 下的包(这个目录是什么、和 `src` 是什么关系,见 [src 导览](./src-tour.md) 的「包从哪来」),而不是只在 `src` 里写几行代码。新增一条自定义录像指令大致分三步:
|
||||
录像指令属于**引擎内容**,需要改动 `packages-user` 下的包(这个目录是什么、和 `src` 是什么关系,见 [src 导览](./src-tour.md#包从哪来-src、packages-user-与-packages) 的「包从哪来」),而不是只在 `src` 里写几行代码。新增一条自定义录像指令大致分三步:
|
||||
|
||||
1. 在录像指令码枚举 `ReplayCode` 中分配一个新码。该枚举属于录像格式的一部分,遵循「只增不改」——新语义必须用新码,不能复用旧码;
|
||||
2. 实现 `IReplayCommand`:`type` 指明是主动还是被动录像,`execute(step)` 执行这一步对应的操作并返回 `ReplayCommandResult`;若需要「连续步骤的后处理」,再实现可选的 `finalize()`;
|
||||
|
||||
@ -56,7 +56,7 @@ const num = state.tileStore.num('blueShopLeft')!;
|
||||
const id = state.tileStore.id(num);
|
||||
```
|
||||
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员,一般无需额外引入);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
> 复制说明:片段已省略 `import`(这里用到的都是 `state` 上的成员,一般无需额外引入);若编辑器提示缺少某个名字,再在顶部补对应的 `import`(详见 [代码基础](./code-basics.md#照抄教程里的代码时-怎么处理-import) 的「照抄教程里的代码时,怎么处理 import」)。
|
||||
|
||||
**改什么**:把 `'blueShopLeft'` 换成你的图块 id。
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user