mota-js/_docs/api.md
2019-04-03 00:23:12 +08:00

1848 lines
70 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 脚本
?> 目前版本**v2.6**,上次更新时间:* {docsify-updated} *
在V2.6版本中,基本对整个项目代码进行了重写,更加方便
## 控制台的使用
在Chrome浏览器中Ctrl+Shift+I可打开控制台。
![](img/console.jpg)
控制台中有很多的标签,最常用的是`Console`, `Sources`和`Elements`。
有关更详尽的控制台使用可自行搜索[Chrome开发者工具](https://www.baidu.com/s?wd=chrome%20%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7)了解更多。
### Console命令行
Console页为命令行。可以在这里输入一些命令进行调试。
比如,进入游戏后,输入`core.status.hero.atk`即可获得勇士的当前攻击力数值。`core.status.hero.atk=100`可以设置攻击力为100。
更多的API可参见[附录API列表](#附录API列表)。
除此以外游戏中的报错等信息也是可以在Console中进行查看的。
![](img/console1.jpg)
### Sources断点调试
Sources页可以查看JS源代码并进行断点调试等。
例如,如果相对脚本编辑中的伤害计算函数进行断点调试:
1. 在左边找到`project/functions.js`,单击打开文件
2. 并找到对应的行可以Ctrl+F搜索比如搜索`getDamageInfo`
3. 在行号上点一下打断点,会出现一个蓝色标签
之后,当代码运行到你的断点处时,将自动停止运行。
![](img/sources.jpg)
可以将鼠标移动到变量上,将弹窗形式显示这个变量的各项数值,从而查看变量值是否符合预期。
图中红色框内有几个按钮,从左到右分别是:**继续执行****执行到下一行****进入当前函数****跳出当前函数****单步执行**。
通过这几个按钮,可以一行一行的对代码进行执行,执行过程中能不断查看各个变量的数值变化,从而定位问题所在。
红圈下方是Call Stack即当前的函数调用链从哪些地方调用过来的
Sources还有更多有趣的功能在此不做介绍有兴趣的可自行网上搜索了解。
### Elements网页元素查看
Elements页可以查看网页的源代码调整css布局等。
![](img/elements.jpg)
不过对魔塔样板来说,最重要的是红圈中的按钮。点击此按钮可以进入**手机模式**。
手机模式下,左边可以对屏幕分辨率进行调整和模拟。
这可以很有效的帮我们进行测试样板在手机端的表现。
## 整体项目架构
``` text
├── /_server/ # 为可视化地图编辑器提供一些支持的目录
├── /libs/ # ---- 系统库目录 ----
│ ├─ /thirdparty/ # 游戏所用到的第三方库文件
│ ├─ actions.js # 用户交互处理
│ ├─ core.js # 系统核心文件(游戏入口,接口&转发)
│ ├─ control.js # 游戏逻辑控制
│ ├─ data.js # 全塔属性等
│ ├─ enemys.js # 怪物相关处理
│ ├─ events.js # 各个事件的执行
│ ├─ icons.js # 图标和素材
│ ├─ items.js # 道具效果
│ ├─ loader.js # 各个资源加载
│ ├─ maps.js # 地图数据和绘制
│ ├─ ui.js # UI窗口绘制
│ └─ utils.js # 工具类函数
├── /project/ # ---- 项目目录 ----
│ ├─ /animates/ # 动画目录
│ ├─ /floors/ # 楼层文件
│ ├─ /images/ # 图片素材
│ ├─ /sounds/ # bgm和音效
│ ├─ data.js # 全塔属性
│ ├─ enemys.js # 怪物属性
│ ├─ events.js # 公共事件
│ ├─ functions.js # 脚本编辑
│ ├─ icons.js # 素材和ID的对应关系定义
│ ├─ items.js # 道具的定义和效果
│ ├─ maps.js # 地图和数字的对应关系
│ └─ plugins.js # 自定义插件
├── /常用工具/ # 辅助造塔的小工具
├── editor.html # 地图编辑器
├── editor-mobile.html # 手机版的地图编辑器
├── index.html # 主程序,游戏的入口
├── main.js # JS程序的入口将动态对所需JS进行加载
├── style.css # 游戏所需要用到的样式表
└── 启动服务.exe # 一个本地的HTTP服务器通过它来运行游戏
```
`_server`为**地图编辑器目录**,里面存放了地图编辑器相关的各项内容。
`libs`为**系统库目录**,里面存放了各个系统核心函数。
从V2.6开始请勿直接修改libs下的代码如有需要修改系统库函数请尝试在插件中[复写函数](#复写函数)。
`project`为**项目目录**你所造的塔的数据全部存放在project下。在不同样板之间接档也是直接迁移project目录即可。
## 函数的转发
在本样板中,`core.js`里面基本是没有定义什么函数的,所有的游戏内函数都在其他几个文件中实现。
例如,常见的获得某个变量值`getFlag`是定义在`control.js`中的:
```js
////// 获得某个自定义变量或flag //////
control.prototype.getFlag = function(name, defaultValue) {
if (!core.status.hero) return defaultValue;
var value = core.status.hero.flags[name];
return value != null ? value : defaultValue;
}
```
也就是,我们可以通过`core.control.getFlag(name, value)`来调用此函数。
但是这样会十分不便,我们希望能直接调用`core.getFlag(name, value)`而不需要中间的control。
为了达到这个目的,样板设置了**函数转发**,即**将其他文件中定义的函数转发到core中执行**。
上述`getFlag`代码的转发实际上是增加了如下函数:
```js
////// getFlag函数的转发 //////
core.getFlag = function (name, defaultValue) {
return core.control.getFlag(name, defaultValue);
}
// 转发后,即可通过 core.getFlag() 来实际调用 core.control.getFlag()
```
转发是自动完成的,其满足如下两条规则:
- **在libs中其他文件定义的函数如果不以下划线`_`开头,就会进行转发。**
- **如果core中已经存在同名函数则会在控制台中打出一条报错信息并不转发该函数。**
具体函数的转发实现代码可参见`core.js`的`_forwardFunc`函数。
!> 除此以外,插件中以`this.xxx`来定义的函数也会被转发!
例如,你可以直接调用`core.drawLight()`来实际调用插件中的`core.plugin.drawLight`。
## 复写函数
样板的功能毕竟是写死的,有时候我们也需要修改样板的一些行为。
在V2.6以前需要直接打开libs目录下的对应文件并进行修改。但是开libs下的文件就会出现各种问题
- 不容易随着新样板来接档迁移
- 也不好找到自己改过什么,从而能整理成新的插件在别的塔使用
- ……
好消息的是从V2.6开始,我们再也不需要开文件了,而是可以直接在插件中对原始函数进行复写。
如果我想对xxx文件中的yyy函数进行重写其模式一般是`core.xxx.yyy = function (参数列表) { ... }`
下面是几个例子,从简单到复杂。
### 重写怪物手册的背景图绘制使用winskin而不是默认的黑色
直接重写怪物手册的背景图绘制,使用`core.drawBackground`来用winskin绘制一个背景图。
```js
// 重写ui.js中的_drawBook_drawBackground函数
core.ui._drawBook_drawBackground = function () {
// core.__PIXEL__为定义的一个宏对于13x13的值是416对于15x15的值是480
core.drawBackground(0, 0, core.__PIXEL__, core.__PIXEL__);
}
```
### 重写点击楼传事件
重写点击楼传事件使得点击楼传按钮时能使用一个道具比如item:fly
```js
// 重写events.js的useFly函数即点击楼传按钮时的事件
core.events.useFly = function (fromUserAction) {
if (core.isMoving()) {
core.drawTip("请先停止勇士行动");
return;
}
if (core.status.lockControl || core.status.event.id != null) return;
if (core.canUseItem('fly')) core.useItem('fly');
else core.drawTip("当前无法使用"+core.material.items.fly.name);
}
```
其他的几个按钮,如快捷商店`openQuickShop`,虚拟键盘`openKeyBoard`的重写也几乎完全一样。
### 楼层切换时根据flag来播放不同的音效
整体复制并重写整个楼传切换前的函数,将`core.playSound('floor.mp3')`替换成根据flag来判定。
```js
// 复制重写events.js中的_changeFloor_beforeChange修改音效
core.events._changeFloor_beforeChange = function (info, callback) {
// 直接替换原始函数中的 core.playSound('floor.mp3');
if (core.getFlag("floorSound") == 0) core.playSound('floor0.mp3');
if (core.getFlag("floorSound") == 1) core.playSound('floor1.mp3');
if (core.getFlag("floorSound") == 2) core.playSound('floor2.mp3');
// ...
// 下面是原始函数中的剩余代码,保持不变
window.setTimeout(function () {
if (info.time == 0)
core.events._changeFloor_changing(info, callback);
else
core.show(core.dom.floorMsgGroup, info.time / 2, function () {
core.events._changeFloor_changing(info, callback);
});
}, 25)
}
```
### 每次打开全局商店时播放一个音效
打开全局商店是在`events.js`中的`openShop`函数,因此需要对其进行重写。
然而,我们只需要在这个函数执行之前插一句音效播放,所以并不需要重写整个函数,而是直接插入一行就行。
```js
var openShop = core.events.openShop; // 先把原始函数用一个变量记录下来
core.events.openShop = function (shopId, needVisited) {
core.playSound("shop.mp3"); // 播放一个音效
return openShop(shopId, needVisited); // 直接调用原始函数
}
```
### 每次绘制地图前在控制台打出一条信息
绘制地图在`maps.js`的`drawMap`函数,因此需要对其进行重写。
由于只需要额外在函数执行前增加一句控制台输出,所以直接插入一行即可。
但是需要注意的是,`drawMap`中使用了`this._drawMap_drawAll()`,因此使用函数时需要用`call`或者`apply`来告知this是什么。
```js
var drawMap = core.maps.drawMap; // 先把原始函数用一个变量记录下来
core.maps.drawMap = function (floorId, callback) {
console.log("drawMap..."); // 控制台打出一条信息
drawMap.call(core.maps, floorId, callback); // 需要使用`call`来告知this是core.maps
}
```
详见[call和apply的用法](https://www.jianshu.com/p/80ea0d1c04f8)。
## 附录API列表
这里将列出所有被转发到core的API没有被转发的函数此处不会列出请自行在代码中查看。
本附录量较大如有什么需求请自行Ctrl+F进行搜索。
如有任何疑问,请联系小艾寻求帮助。
### core.js
core.js中只有很少的几个函数主要是游戏开始前的初始化等。
但是core中定义了很多游戏运行时的状态这些状态很多都会被使用到。
``` text
core.__SIZE__, core.__PIXELS__
游戏窗口大小对于13x13的游戏而言这两个值分别是13和41615x15来说分别是15和480。
core.material
游戏中的所有资源列表,具体分为如下内容:
core.material.animates (动画)
core.material.bgms (背景音乐)
core.material.enemys (怪物信息,来自于 project/enemys.js
core.material.icons (图标信息,来自于 project/icons.js
core.material.images 图片素材存放了各项素材图片如items.png等
core.material.images.autotile (所有的自动元件图片)
core.material.images.tilesets (所有的额外素材图片)
core.material.images.images (用户引入的其他图片)
core.material.items (道具信息)
core.material.sounds (音效)
core.animateFrame
主要是记录和requestAnimationFrame相关的一些数据常用的如下
core.animateFrame.totalTime (游戏总的运行时时间)
core.animateFrame.weather (当前的天气信息)
core.animateFrame.asyncId (当前的异步处理事件的内容)
core.musicStatus
主要是记录和音效相关的内容,常用的如下:
core.musicStatus.bgmStatus (音乐开启状态)
core.musicStatus.soundStatus (音效开启状态)
core.musicStatus.playingBgm 当前正在播放的BGM
core.musicStatus.lastBgm 最近一次尝试播放的BGM
core.musicStatus.volume (当前的音量)
core.musicStatus.cachedBgms (背景音乐的缓存内容)
core.musicStatus.cacheBgmCount 背景音乐的缓存数量默认值是4
core.platform
游戏平台相关信息,常见的几个如下:
core.platform.isPC (是否是电脑端)
core.platform.isAndroid (是否是安卓端)
core.platform.isIOS 是否是iOS端
core.platform.useLocalForage (是否开启了新版存档)
core.platform.extendKeyBoard (是否开启了拓展键盘)
core.domStyle
游戏的界面信息,包含如下几个:
core.domStyle.scale (当前的放缩比)
core.domStyle.isVertical (当前是否是竖屏状态)
core.domStyle.showStatusBar (当前是否显示状态栏)
core.domStyle.toolbarBtn (当前是否显示工具栏)
core.bigmap
当前的地图的尺寸信息,主要包含如下几个
core.bigmap.width (当前地图的宽度)
core.bigmap.height (当前地图的高度)
core.bigmap.offsetX 当前地图针对窗口左上角的偏移像素x
core.bigmap.offsetX 当前地图针对窗口左上角的偏移像素y
core.bigmap.tempCanvas (一个临时画布,可以用来临时绘制很多东西)
core.saves
和存档相关的信息,包含如下几个:
core.saves.saveIndex (上次保存或读取的存档编号)
core.saves.ids (当前存在存档的编号列表)
core.saves.autosave (自动存档的信息)
core.saves.favorite (收藏的存档)
core.saves.favoriteNames (自定义存档的名称)
core.status
游戏的状态相关,是整个游戏中最重要的东西,其核心是如下几条:
请注意每次重新开始、存档或读档时core.status都会重新初始化。
core.status.played (当前是否在游戏中)
core.status.gameOver 当前是否已经游戏结束即win或lose
core.status.hero 勇士信息此项和全塔属性中的hero大体是对应的
core.status.hero.name 勇士名
core.status.hero.lv 当前等级
core.status.hero.hpmax 当前生命上限
core.status.hero.hp 当前生命值
core.status.hero.manamax 当前魔力上限
core.status.hero.mana 当前魔力值
core.status.hero.atk 当前攻击力
core.status.hero.def 当前防御力
core.status.hero.mdef 当前魔防值
core.status.hero.money 当前金币值
core.status.hero.experience 当前经验值
core.status.hero.loc 当前的位置信息
core.status.hero.equipment 当前装上的装备
core.status.hero.items 当前拥有的道具信息
core.status.hero.flags 当前的各项flag信息
core.status.hero.step 当前的步数值
core.status.hero.statistics 当前的统计信息
core.status.floorId (当前所在的楼层)
core.status.maps (所有的地图信息)
core.status.thisMap 当前的地图信息等价于core.status.maps[core.status.floorId]
core.status.bgmaps (所有背景层的信息)
core.status.fgmaps (所有的前景层的信息)
core.status.checkBlock (地图上的阻激夹域信息,也作为光环的缓存)
core.status.lockControl (当前是否是控制锁定状态)
core.status.automaticRoute (当前的自动寻路信息)
core.status.route (当前记录的录像)
core.status.replay (录像回放时要用到的信息)
core.status.shops (所有全局商店信息)
core.status.textAttribute 当前的文字属性如颜色、背景等信息和setText事件对应
core.status.globalAttribute (当前的全局属性,如边框色、装备栏等)
core.status.curtainColor (当前色调层的颜色)
core.status.globalAnimateObjs (当前的全局帧动画效果)
core.status.floorAnimateObjs (当前的楼层贴图帧动画效果)
core.status.boxAnimateObjs (当前的盒子帧动画效果,例如怪物手册中的怪物)
core.status.autotileAnimateObjs (当前楼层的自动元件动画效果)
core.status.globalAnimateStatus (当前的帧动画的状态)
core.status.animateObjs (当前的播放动画信息)
core.floorIds
一个数组表示所有的楼层ID和全塔属性中的floorIds一致。
core.floors
从楼层文件中读取全部的地图数据。
和core.status.maps不同的是后者在每次重新开始和读档时都会重置也允许被修改会存入存档
而core.floors全程唯一不允许被修改。
core.statusBar
状态栏信息例如状态栏图片图标以及各个内容的DOM定义等。
core.statusBar.images 所有的系统图标和icons.png对应
core.statusBar.icons (状态栏中绘制的图标内容)
core.values
所有的全局数值信息和全塔属性中的values一致。
此项允许被直接修改,会存入存档。
core.flags
所有的全塔开关和全塔属性中的flags一致。
此项不允许被直接修改如有需要请使用“设置系统开关”事件或者调用core.setGlobalFlag这个API。
core.plugin
定义的插件函数。
core.doFunc(func, _this)
执行一个函数func为函数体或者插件中的函数名_this为使用的this。
如果func为一个字符串则视为插件中的函数名同时_this将被设置成core.plugin。
此函数剩余参数将作为参数被传入func。
```
### actions.js
actions.js主要是处理一些和用户交互相关的内容。
``` js
core.registerAction(action, name, func, priority)
注册一个用户交互行为。
action要注册的交互类型如 ondown, onclick, keyDown 等等。
name你的自定义名称可被注销使用同名重复注册将后者覆盖前者。
func执行函数可以是一个具体的函数体或者是一个插件中的函数名。
priority优先级优先级高的被注册项将会被执行。此项可不填默认为0。
返回如果func返回true则不会再继续执行其他的交互函数否则会继续执行其他的交互函数。
core.unregisterAction(action, name)
注销一个用户交互行为。
core.doRegisteredAction(action)
执行一个用户交互行为。
此函数将在该交互行为所注册的所有函数中,按照优先级从高到底依次执行。
此函数剩余的参数将会作为参数传入该执行函数中。
当某个执行函数返回true时将终止这一过程。
core.onkeyDown(e)
当按下某个键时的操作e为KeyboardEvent。
请勿直接覆盖或调用此函数,如有需要请注册一个"onkeyDown"的交互函数。
core.onkeyUp(e)
当放开某个键时的操作e为KeyboardEvent。
请勿直接覆盖或调用此函数,如有需要请注册一个"onkeyDown"的交互函数。
core.pressKey(keyCode)
当按住某个键不动时的操作,目前只对方向键有效。
如果需要添加对于其他键的长按请复写_sys_onkeyDown和_sys_onkeyUp。
请勿直接覆盖或调用此函数,如有需要请注册一个"pressKey"的交互函数。
core.keyDown(keyCode)
当按下某个键时的操作参数为该键的keyCode值。
请勿直接覆盖或调用此函数,如有需要请注册一个"keyDown"的交互函数。
core.keyUp(keyCode, altKey, fromReplay)
当按下某个键时的操作参数为该键的keyCode值。
altKey标志了Alt键是否同时被按下fromReplay表示是否是从录像回放中调用的。
请勿直接覆盖或调用此函数,如有需要请注册一个"keyUp"的交互函数。
core.ondown(loc)
当点击屏幕时的操作。loc为点击的信息。
请勿直接覆盖或调用此函数,如有需要请注册一个"ondown"的交互函数。
注册的ondown交互函数需要接受x, y, px, py四个参数代表点击的位置和像素坐标。
core.onmove(loc)
当在屏幕上滑动时的操作。loc为当前的坐标信息。
请勿直接覆盖或调用此函数,如有需要请注册一个"onmove"的交互函数。
注册的onmove交互函数需要接受x, y, px, py四个参数代表当前的的位置和像素坐标。
core.onup()
当从屏幕上离开时的操作。请注意此函数是没有参数的。
请勿直接覆盖或调用此函数,如有需要请注册一个"onup"的交互函数。
core.onclick(x, y)
当点击屏幕上的某点位置时执行的操作请注意这里的x和y是位置坐标。
一般而言一个完整的ondown到onup将触发一个onclick事件。
请勿直接覆盖或调用此函数,如有需要请注册一个"onclick"的交互函数。
core.onmousewheel(direct)
当滚动鼠标滑轮时执行的操作。direct为滑轮方向上为1下为-1。
请勿直接覆盖或调用此函数,如有需要请注册一个"onmousewheel"的交互函数。
core.keyDownCtrl()
当长按Ctrl键不动时执行的操作。
请勿直接覆盖或调用此函数,如有需要请注册一个"keyDownCtrl"的交互函数。
core.longClick()
当长按住屏幕时执行的操作。
请勿直接覆盖或调用此函数,如有需要请注册一个"keyDownCtrl"的交互函数。
注册的交互函数如果某一项返回true则之后仍然会继续触发该长按
如果全部返回false则将停止本次长按行为直到手指离开屏幕并重新进行长按为止。
```
### control.js
control.js将负责整个游戏的核心控制系统分为如下几个部分
- requestAnimationFrame相关
- 标题界面,开始和重新开始游戏
- 自动寻路和人物行走相关
- 画布、位置、阻激夹域、显伤等相关
- 录像的回放相关
- 存读档,自动存档,同步存档等相关
- 人物属性和状态、位置、变量等相关
- 天气、色调、音乐和音效的播放
- 状态栏和工具栏相关
- 界面resize相关
```text
// ------ requestAnimationFrame 相关 ------ //
core.registerAnimationFrame(name, needPlaying, func)
注册一个animationFrame。它将在每次浏览器的帧刷新时约16.6ms)被执行。
name你的自定义名称可被注销使用同名重复注册将后者覆盖前者。
needPlaying如果此项为true则仅在游戏开始后才会被执行标题界面不执行
func执行函数可以是一个具体的函数体或者是一个插件中的函数名。
func可以接受一个timestamp作为参数表示从整个页面加载完毕到当前时刻所经过的毫秒数。
如果func执行报错将在控制台打出一条信息并自动进行注销。
core.unregisterAnimationFrame(name)
注销一个animationFrame参数是你的上面的自定义名称。
// ------ 开始界面相关 ------ //
core.showStartAnimate(noAnimate, callback)
重置所有内容并显示游戏标题界面。
noAnimate如果为true则不会有淡入动画callback为执行完毕的回调。
core.hideStartAnimate(callback)
淡出隐藏游戏标题界面callback为执行完毕的回调。
core.isPlaying()
当前是否正在游戏中。
core.clearStatus()
清除所有的游戏状态和数据,包括状态栏的显示。
// ------ 自动寻路、人物行走 ------ //
core.stopAutomaticRoute()
停止自动寻路的操作
core.saveAndStopAutomaticRoute()
保存剩下的寻路路线并停止自动寻路操作。主要用于打怪开门后继续寻路使用。
core.continueAutomaticRoute()
继续剩下的自动寻路操作。主要用于打怪开门后继续寻路使用。
core.clearContinueAutomaticRoute()
清空剩下的自动寻路操作。
core.setAutomaticRoute(destX, destY, stepPostfix)
尝试开始进行一个自动寻路。stepPostfix是鼠标拖动的路径。
此函数将检测是否在寻路中(在则停止或双击瞬移),检测是否点击自己(转身或轻按),
检测是否能单击瞬移,最后找寻自动寻路路线并开始寻路。
core.setAutoHeroMove(steps)
设置勇士的自动行走路线,并立刻开始行走。
core.setHeroMoveInterval(callback)
设置勇士行走动画。callback是每一步行走完毕后的回调。
core.moveOneStep(x, y)
每走完一步后执行的操作,被转发到了脚本编辑中。
core.moveAction(callback)
尝试执行单步行走。callback是执行完毕的回调。
如果勇士面对的方向是noPass的将直接触发事件并执行回调。
core.moveHero(direction, callback)
令勇士朝一个方向行走。如果设置了callback则只会行走一步并执行回调。
否则将一直朝该方向行走直到core.status.heroStop为true为止。
core.isMoving()
当前是否正在处于行走状态
core.waitHeroToStop(callback)
停止勇士的行走,等待行动结束后,再异步执行回调。
core.turnHero(direction)
转向。如果设置了direction则会转到该方向否则会右转。该函数会自动计入录像。
core.moveDirectly(destX, destY)
尝试瞬间移动到某点,被转发到了脚本编辑中。
此函数返回非负值代表成功进行瞬移,返回值是省略的步数;如果返回-1则代表没有成功瞬移。
core.tryMoveDirectly(destX, destY)
尝试单击瞬移到某点。
如果该点可被直接瞬间移动到,则直接瞬移到该点;否则尝试瞬移到相邻的上下左右点并行走一步。
core.drawHero(status, offset)
绘制勇士。
status可选为'stop','leftFoot'和'rightFoot'之一不填或null默认是'stop'。
offset可选表示具体当前格子的偏移量。不填默认为0。
此函数将重新计算地图的偏移量,调整窗口位置,绘制勇士和跟随者信息。
// ------ 画布、位置、阻激夹域、显伤 ------ //
core.setGameCanvasTranslate(canvas, x, y)
设置某个画布的偏移量
core.addGameCanvasTranslate(x, y)
加减所有系统画布ui和data除外的偏移量。主要是被“画面震动”所使用。
core.updateViewport()
根据大地图的偏移量来更新窗口的视野范围。
core.nextX(n) / core.nextY(m)
获得勇士面对的第n个位置的横纵坐标。n可不填默认为1。
core.nearHero(x, y)
判定某个点是否和勇士的距离不大于1。
core.gatherFollowers()
聚集所有的跟随者到勇士的位置。
core.updateFollowers()
更新跟随者们的坐标。
core.updateCheckBlock(floorId)
更新阻激夹域的信息,被转发到了脚本编辑中。
core.checkBlock()
检查勇士坐标点的阻激夹域信息。
core.updateDamage(floorId, ctx)
更新全地图的显伤。floorId可选默认为当前楼层。
ctx可选为画布如果不为空则将会绘制到该画布上而不是damage层上。
// ------ 录像相关 ------ //
core.chooseReplayFile()
弹出选择文件窗口,让用户选择录像文件。
core.startReplay(list)
开始播放一段录像。list为录像的操作数组。
core.triggerReplay()
播放或暂停录像实际上是pauseReplay或resumeReplay之一。
core.pauseReplay() / core.resumeReplay()
暂停和继续录像播放。
core.speedUpReplay() / core.speedDownReplay()
加速和减速录像播放。
core.setReplaySpeed(speed)
直接设置录像回放速度。
core.stopReplay(force)
停止录像回放。如果force为true则强制停止。
core.rewindReplay()
回退一个录像节点。
core.saveReplay() / core.bookReplay() / core.viewMapReplay()
回放录像时的存档、查看怪物手册、浏览地图操作。
core.isReplaying()
当前是否正在录像播放中。
core.registerReplayAction(name, func)
注册一个自定义的录像行为。
name自定义名称可用户注销使用。
func具体执行录像的函数是一个函数体或者插件中的函数名。
func需要接受action参数代表录像回放时的当前操作行为。
如果func返回true则代表成功处理了此次操作返回false代表没有进行处理。
请注意回放录像时的二次记录问题(即回放时录像会重新记录路线)。
core.unregisterReplayAction(name)
注销一个录像行为。此函数一般不应当被使用。
// ------ 存读档相关 ------ //
core.autosave(remoreLast)
进行一个自动存档,实际上是加入到缓存之中。
removeLast如果为true则会从路线中删除最后一项再存打怪开门前的状态
在事件处理中不允许调用本函数,如有需要请呼出存档页面。
core.checkAutosave()
将缓存的自动存档写入存储中。平均每五秒钟,或在窗口失去焦点时被执行。
core.doSL(id, type)
实际执行一个存读档事件。id为存档编号自动存档为'autoSave'。
type只能为'save', 'load', 'replayLoad'之一,代表存档、读档和从存档回放录像。
core.syncSave(type) / core.syncLoad()
向服务器同步存档从服务器加载存档。type如果为'all'则会向服务器同步所有存档。
core.saveData()
获得要存档的内容,实际转发到了脚本编辑中。
core.loadData(data, callback)
实际执行一次读档行为data为读取到的数据callback为执行完毕的回调。
实际转发到了脚本编辑中。
core.getSave(index, callback)
获得某个存档位的存档。index为存档编号0代表自动存档。
core.getSaves(ids, callback)
获得若干个存档位的存档。ids为一个存档编号数组0代表自动存档。
core.getAllSaves(callback)
获得全部的存档内容。目前仅被同步全部存档和下载全部存档所调用。
core.getSaveIndexes(callback)
刷新全部的存档信息将哪些档位有存档的记录到core.saves.ids中。
core.hasSave(index)
判定某个存档位是否存在存档。index为存档编号0代表自动存档。
core.removeSave(index)
删除某个存档。index为存档编号0代表自动存档。
// ------ 属性、状态、位置、变量等 ------ //
core.setStatus(name, value)
设置勇士当前的某个属性。
core.addStatus(name, value)
加减勇士当前的某个属性。等价于 core.setStatus(name, core.getStatus(name) + value)
core.getStatus(name)
获得勇士的某个原始属性值。
core.getStatusOrDefault(status, name)
尝试从status中获得某个原始属性值如果status为null或不存在对应属性值则从勇士属性中获取。
此项在伤害计算函数中使用较多例如传递新的攻击和防御来计算临界和1防减伤。
core.getRealStatus(name)
获得勇士的某个计算属性值。该属性值是在加成buff之后得到的。
该函数等价于 core.getStatus(name) * core.getBuff(name)
core.getRealStatusOrDefault(status, name)
尝试从status中获得某个原始属性值再进行增幅如果不存在则获取勇士本身的计算属性值。
core.setBuff(name, value)
设置勇士的某个属性的增幅值。value为1代表无增幅。
core.addBuff(name, value)
增减勇士的某个属性的增幅值。等价于 core.setBuff(name, core.getBuff(name) + value)
core.getBuff(name)
获得勇士的某个属性的增幅值。默认值是1。
core.setHeroLoc(name, value, noGather)
设置勇士位置属性。name只能为'x', 'y'和'direction'之一。
如果noGather为true则不会聚集所有的跟随者。
core.getHeroLoc(name)
获得勇士的某个位置属性。如果name为null则直接返回core.status.hero.loc。
core.getLvName(lv)
获得某个等级对应的名称其在全塔属性的levelUp中定义。如果不存在则返回原始数值。
core.setFlag(name, value)
设置某个自定义变量或flag。如果value为null则会调用core.removeFlag进行删除。
core.addFlag(name, value)
加减某个自定义的变量或flag。等价于 core.setFlag(name, core.getFlag(name, 0) + value)
core.getFlag(name, defaultValue)
获得某个自定义的变量或flag。如果该flag不存在从未赋值过则返回defaultValue值。
core.hasFlag(name)
判定是否拥有某个自定义变量或flag。等价于 !!core.getFlag(name, 0)
core.removeFlag(name)
删除一个自定义变量或flag。
core.lockControl() / core.unlockControl()
锁定和解锁控制。常常应用于事件处理。
core.debug()
开启调试模式。此模式下可以按住Ctrl进行穿墙。
// ------ 天气,色调,音乐和音效 ------ //
core.setWeather(type, level)
设置当前的天气。type只能为'rain', 'snow'或'fog'level为1-10之间代表强度信息。
core.setCurtain(color, time, callback)
更改画面色调。color为更改到的色调是个三元或四元组time为渐变时间0代表立刻切换。
core.screenFlash(color, time, times, callback)
画面闪烁。color为色调三元或四元组time为单次闪烁时间times为总闪烁次数。
core.playBgm(bgm, startTime)
播放一个bgm。startTime可以控制开始时间不填默认为0。
如果bgm不存在、不被支持或当前不允许播放背景音乐则会跳过。
core.pauseBgm() / core.resumeBgm()
暂停和恢复当前bgm的播放。
core.triggerBgm()
更改当前bgm的播放状态。
core.playSound(sound) / core.stopSound()
播放一个音效,停止全部音效。
如果sound不存在、不被支持或当前不允许播放音效则会忽略。
core.checkBgm()
检查bgm的状态。
有的时候刚打开页面时浏览器是不允许自动播放标题界面bgm的一定要经过一次用户操作行为。
这时候我们可以给开始按钮增加core.checkBgm(),如果之前没有成功播放则重新播放。
// ------ 状态栏和工具栏相关 ------ //
core.clearStatusBar()
清空状态栏的数据。
core.updateStatusBar()
更新状态栏,被转发到了脚本编辑中。此函数还会根据是否在回放来设置工具栏的图标。
core.showStatusBar() / core.hideStatusBar(showToolbox)
显示和隐藏状态栏。
如果showToolbox为true则在竖屏模式下不隐藏工具栏方便手机存读档操作。
core.updateHeroIcon()
更新状态栏上的勇士图标。
core.updateGlobalAttribute()
更新全局属性,例如状态栏的背景图等。
core.setToolbarButton(useButtom)
设置工具栏是否是拓展键盘。
// ------ resize 相关 ------ //
core.registerResize(name, func)
注册一个resize函数。
name为自定义名称可供注销使用。
func可以是一个函数或插件中的函数名可以接受一个obj作为参数。
具体详见resize函数。
core.unregisterResize(name)
注销一个resize函数。
core.resize()
屏幕分辨率改变后的重新自适应。
此函数将根据当前的屏幕分辨率信息生成一个obj并传入各个注册好的resize函数中执行。
```
### enemys.js
enemys.js中定义了一系列和怪物相关的API函数。
```js
core.hasSpecial(special, test)
判断是否含有某个特殊属性test为要检查的特殊属性编号
special为要测试的内容允许接收如下类型参数
- 一个数字将直接和test进行判等
- 一个数组将检查test是否在该数组之中存在
- 一个怪物信息将检查test是否在该怪物的特殊属性中存在
- 一个字符串视为怪物ID将检查该怪物的特殊属性
core.getSpecials()
获得所有特殊属性的列表实际上被转发到了脚本编辑中
core.getSpecialText(enemy)
获得某个怪物的全部特殊属性名称enemy可以是怪物信息或怪物ID
将返回一个数组每一项是该怪物所拥有的一个特殊属性的名称
core.getSpecialHint(enemy, special)
获得怪物的某个特殊属性的描述enemy可以是怪物信息或怪物IDspecial为该特殊属性编号
core.canBattle(enemy, x, y, floorId)
判定当前能否战胜某个怪物
enemy可以是怪物信息或怪物IDx,y,floorId为当前坐标和楼层。(下同
能战胜返回true不能战胜返回false
core.getDamage(enemy, x, y, floorId)
获得某个怪物的全部伤害值
如果没有破防或无法战斗则返回null否则返回具体的伤害值
core.getExtraDamage(enemy, x, y, floorId)
获得某个怪物的额外伤害值不可被魔防减伤)。
目前暂时只包含了仇恨和固伤两者如有需要可复写该函数
core.getDamageString(enemy, x, y, floorId)
获得某个怪物伤害字符串和颜色信息以便于在地图上绘制显伤
core.nextCriticals(enemy, number, x, y, floorId)
获得接下来的N个临界值和临界减伤enemy可以是怪物信息或怪物IDx,y,floorId为当前坐标和楼层
number为要计算的临界值数量不填默认为1
如果全塔属性中的useLoop开关被开启则将使用循环法或二分法计算临界否则使用回合法计算临界
返回一个二维数组 [[x1,y1],[x2,y2],...] 表示接下来的每个临界值和减伤值
core.getDefDamage(enemy, k, x, y, floorId)
获得某个怪物的k防减伤值k可不填默认为1
core.getEnemyInfo(enemy, hero, x, y, floorId)
获得某个怪物的实际计算时的属性该函数实际被转发到了脚本编辑中
hero可为null或一个对象具体将使用core.getRealStatusOrDefault(hero, "atk")来获得攻击力数值
该函数应当返回一个对象记录了怪物的实际计算时的属性
core.getDamageInfo(enemy, hero, x, y, floorId)
获得某个怪物的战斗信息该函数实际被转发到了脚本编辑中
hero可为null或一个对象具体将使用core.getRealStatusOrDefault(hero, "atk")来获得攻击力数值
如果该函数返回null则代表不可战斗如没有破防或无敌等)。
否则该函数应该返回一个对象记录了战斗伤害信息如战斗回合数等
从V2.5.5开始该函数也允许直接返回一个数字代表战斗伤害值此时回合数将视为0
core.updateEnemys()
更新怪物数据该函数实际被转发到了脚本编辑中详见文档-事件-更新怪物数据
core.getCurrentEnemys(floorId)
获得某个楼层不重复的怪物信息floorId不填默认为当前楼层该函数会被怪物手册所调用
该函数将返回一个列表每一项都是一个不同的怪物按照伤害值从小到大排序
另外值得注意的是如果设置了某个怪物的displayIdInBook则会返回对应的怪物
core.hasEnemyLeft(floorId)
检查某个楼层是否还有剩余的怪物等价于 core.getCurrentEnemys(floorId).length > 0
```
### events.js
events.js将处理所有和事件相关的操作主要分为五个部分
- 游戏的开始和结束
- 系统事件的处理
- 自定义事件的处理
- 点击状态栏图标所进行的操作
- 一些具体事件的执行内容
```js
// ------ 游戏的开始和结束 ------ //
core.resetGame(hero, hard, floorId, maps, values)
重置整个游戏该函数实际被转发到了脚本编辑中
core.startGame(hard, seed, route, callback)
开始新游戏
hard为难度字符串会被设置为core.status.hard
seed为开始时要设置的的种子route为要开始播放的录像callback为回调函数
该函数将重置整个游戏调用setInitData执行startText事件上传游戏人数统计信息等
core.setInitData()
根据难度分歧来初始化难度包括设置flag:hard设置初始属性等
该函数实际被转发到了脚本编辑中
core.win(reason, norank)
游戏胜利reason为结局名norank如果为真则该结局不计入榜单
该函数实际被转发到了脚本编辑中
core.lose(reason)
游戏失败reason为结局名该函数实际被转发到了脚本编辑中
core.gameOver(ending, fromReplay, norank)
游戏结束ending为获胜结局名null代表失败fromReplay标识是否是录像触发的
此函数将询问是否上传成绩如果ending不是null是否下载录像等并重新开始
core.restart()
重新开始游戏本质上就是播放标题界面的BGM并调用showStartAnimate
core.confirmRestart()
确认用户是否需要重新开始
// ------ 系统事件处理 ------ //
core.registerSystemEvent(type, func)
注册一个系统事件即通过图块的默认触发器所触发的事件
type为一个要注册的事件类型func为要执行的函数体或插件中的函数名
func需要接受(data, callback)作为参数分别是触发点的图块信息和执行完毕时的回调
如果注册一个已经存在的系统事件比如openDoor则会覆盖系统的默认函数
core.unregisterSystemEvent(type)
注销一个系统事件type是上面你注册的事件类型
core.doSystemEvent(type, data, callback)
执行一个系统事件type为事件类型data为该事件点的图块信息callback为执行完毕的回调
core.battle(id, x, y, force, callback)
和怪物进行战斗
id为怪物的IDx和y为怪物坐标force如果为真将强制战斗callback为执行完毕的回调
如果填写了怪物坐标则会删除对应点的图块并执行该点战后事件
如果是在事件流的执行过程中调用此函数则不会进行自动存档且会强制战斗
core.beforeBattle(enemyId, x, y)
战前事件实际被转发到了脚本编辑中可以在这里加上一些战前特效
此函数在检测能否战斗和自动存档”【之后执行
如果需要更早的战前事件请在插件中覆重写 core.events.doSystemEvent 函数
此函数返回true则将继续本次战斗返回false将不再战斗
core.afterBattle(enemyId, x, y, callback)
战后事件将执行扣血加金币经验特殊属性处理战后事件处理等操作
实际被转发到了脚本编辑中
core.openDoor(x, y, needKey, callback)
尝试开一个门x和y为门的坐标needKey表示是否需要钥匙callback为执行完毕的回调
如果不是一个有效的门需要钥匙且未持有等均会忽略此事件并直接执行callback
core.afterOpenDoor(doorId, x, y, callback)
开完一个门后执行的事件实际被转发到了脚本编辑中
core.getItem(id, num, x, y, callback)
获得若干个道具itemId为道具IDitemNum为获得的道具个数不填默认为1
x和y为道具点的坐标如果设置则会擦除地图上的该点
core.afterGetItem(id, x, y, callback)
获得一个道具后执行的事件实际被转发到了脚本编辑中
core.getNextItem(noRoute)
轻按即获得面对的道具如果noRoute为真则这个轻按行为不会计入录像
core.changeFloor(floorId, stair, heroLoc, time, callback, fromLoad)
楼层切换floorId为目标楼层IDstair为是什么楼梯heroLoc为目标点坐标
time为切换时间callback为切换完毕的回调fromLoad标志是否是从读档造成的切换
floorId也可以填":before"":next"表示前一层和后一层
heroLoc为{"x": 0, "y": 0, "direction": "up"}的形式不存在则从勇士位置取
如果stair不为null则会在该楼层中找对应的图块作为目标点的坐标并覆盖heroLoc
一般设置的是"upFloor""downFloor"但也可以用任何其他的图块ID
core.changingFloor(floorId, heroLoc, fromLoad)
正在执行楼层切换中执行的操作实际被转发到了脚本编辑中
core.hasVisitedFloor(floorId)
是否曾经到达过某一层
core.visitFloor(floorId)
标记曾经到达了某一层
core.passNet(data)
执行一个路障处理这里只有毒衰咒网的处理血网被移动到了updateCheckBlock中
core.pushBox(data)
执行一个推箱子事件
core.afterPushBox()
推箱子之后触发的事件实际被转发到了脚本编辑中
core.changeLight(id, x, y)
踩灯后的事件
// ------ 自定义事件的处理 ------ //
core.registerEvent(type, func)
注册一个自定义事件type为事件名func为执行事件的函数体或插件中的函数名
func可以接受(data, x, y, prefix)参数其中data为事件内容x和y为该点坐标prefix为该点前缀
同名注册的事件将进行覆盖
请记得在自定义处理事件完毕后调用core.doAction()再继续执行下一个事件
core.unregisterEvent(type)
注销一个自定义事件
core.doEvent(data, x, y, prefix)
执行一个自定义事件data为事件内容将根据data.type去注册的事件列表中查找对应的执行函数
x和y为该点坐标prefix为该点前缀执行事件时也会把(data, x, y, prefix)传入执行函数
core.setEvents(list, x, y, callback)
设置自定义事件的执行列表坐标和回调函数
core.startEvents(list, x, y, callback)
开始执行一系列的自定义事件list为事件列表x和y为事件坐标callback为执行完毕的回调
此函数将调用core.setEvents然后停止勇士再执行core.doAction()
core.doAction()
执行下一个自定义事件
此函数将检测事件列表是否全部执行完毕如果是则执行回调函数
否则将从事件列表中弹出下一个事件并调用core.doEvent进行执行
core.insertAction(action, x, y, callback, addToLast)
向当前的事件列表中插入一个或多个事件并执行
如果当前并不是在事件执行流中则会调用core.startEvents()开始执行事件否则仅仅执行插入操作
action为要插入的事件可以是一个单独的事件或者是一个事件列表
x,y,callback如果设置了且不为null则会覆盖当前的坐标和回调函数
addToLast如果为真则会插入到事件执行列表的尾部否则是插入到执行列表的头部
core.getCommonEvent(name)
根据名称获得某个公共事件内容
core.recoverEvents(data)
恢复事件现场一般用于呼出怪物手册呼出存读档页面等时恢复事件执行流
// ------ 点击状态栏图标时执行的一些操作 ------ //
core.openBook(fromUserAction)
尝试打开怪物手册fromUserAction标志是否是从用户的行为触发如按键或点击状态栏。(下同
不建议复写此函数否则呼出怪物手册事件会出问题
core.useFly(fromUserAction)
尝试使用楼传器可以安全的复写此函数参见文档-个性化-覆盖楼传事件
core.flyTo(toId, callback)
尝试飞行到某个楼层被转发到了脚本编辑中
如果此函数返回true代表成功进行了飞行false代表不能进行飞行
core.openEquipbox(fromUserAction) / core.openToolbox(fromUserAction)
尝试打开道具栏和装备栏可以安全复写这两个函数
core.openQuickShop(fromUserAction) / core.openKeyBoard(fromUserAction)
尝试打开快捷商店和虚拟键盘可以安全复写这两个函数
core.save(fromUserAction) / core.load(fromUserAction)
尝试打开存读档页面
不建议复写这两个函数否则呼出存读档页面事件会出问题
core.openSettings(fromUserAction)
尝试打开系统菜单不建议复写此函数
// ------ 一些具体事件的执行内容 ------ //
core.hasAsync()
当前是否存在未执行完毕的异步事件请注意正在播放的动画也算异步事件
core.follow(name) / core.unfollow(name)
跟随勇士/取消跟随name为行走图名称
在取消跟随时如果指定了name则会从跟随列表中选取一个该行走图取消否则取消所有跟随
跟随和取消跟随都会调用core.gatherFollowers()来聚集所有的跟随者
core.setValue(name, value, prefix) / core.addValue(name, value, prefix)
设置/增减某个数值name可以是status:xxxitem:xxx或flag:xxx
value可以是一个表达式将调用core.calValue()计算prefix为前缀独立开关使用
core.doEffect(effect, need, times)
执行一个effect操作该函数目前仅被全局商店的status:xxx+=yyy所调用
core.setFloorInfo(name, values, floorId, prefix)
设置某层楼的楼层属性
core.setGlobalAttribute(name, value)
设置一个全局属性如边框颜色等
core.setGlobalFlag(name, value)
设置一个全局开关如enableXXX等
如果需要设置一个全局数值如红宝石数值可以直接简单的修改core.values因此没有单独列出函数
core.closeDoor(x, y, id, callback)
执行一个关门事件如果不是一个合法的门或者该点不为空地则会忽略本事件
core.showImage(code, image, sloc, loc, opacityVal, time, callback)
显示一张图片code为图片编号image为图片内容或图片名
sloc为[x,y,w,h]形式表示在原始图片上裁剪的区域也可直接设为null表示整张图片
loc为[x,y,w,h]形式表示在界面上绘制的位置和大小w和h可忽略表示使用绘制大小
opacityVal为绘制的不透明度time为淡入时间
此函数将创建一个画布其z-index是100+code即图片编号为1则是101编号50则是150
请注意curtain层的z-index是125UI层的z-index是140因此可以通过图片编号来调整覆盖关系
core.hideImage(code, time, callback)
隐藏一张图片code为图片编号time为淡出时间
core.moveImage(code, to, opacityVal, time, callback)
移动一张图片code为图片编号to为[x,y]表示目标位置opacityVal目标不透明度time为移动时间
core.showGif(name, x, y)
绘制一张gif图片或取消所有绘制内容如果name不设置则视为取消x和y为左上角像素坐标
core.setVolume(value, time, callback)
设置音量value为目标音量大小在0到1之间time为音量渐变的时间
core.vibrate(time, callback)
画面震动time为震动时间
请注意画面震动时间必须是500的倍数系统也会自动把time调整为上整的500倍数值
core.eventMoveHero(steps, time, callback)
使用事件移动勇士time为每步的移动时间
steps为移动数组可以接受'up','down','left','right','forward''backward'
使用事件移动勇士将不会触发任何地图上的事件
core.jumpHero(ex, ey, time, callback)
跳跃勇士ex和ey为目标点的坐标可以为null表示原地跳跃time为总跳跃时间
core.openShop(shopId, needVisited)
打开一个全局商店needVisited表示是否需要该商店原本就是启用状态
如果该商店对应的实际上是一个全局事件则会直接插入并执行
core.disableQuickShop(shopId)
禁用一个全局商店即把一个商店从启用变成禁用状态
core.canUseQuickShop(shopId)
当前能否使用某个全局商店实际被转发到了脚本编辑中
如果此函数返回null则表示可以使用返回一个字符串表示不可以该字符串表示不可以的原因
core.setHeroIcon(name, noDraw)
设置勇士的行走图
name为行走图名称noDraw如果为真则不会调用core.drawHero()函数进行刷新
core.checkLvUp()
检查升级事件该函数将判定当前是否升级或连续升级然后执行升级事件
core.tryUseItem(itemId)
尝试使用一个道具
对于怪物手册和楼传器将分别调用core.openBook()和core.useFly()函数
对于中心对称飞行器则会调用core.drawCenterFly()函数
对于其他的道具将检查是否拥有能否使用并且进行使用
core.afterUseBomb()
使用炸弹或圣锤后的事件实际被转发到了脚本编辑中
```
### icons.js
icons.js主要是负责素材相关信息比如某个素材在对应的图片上的位置。
```js
core.getClsFromId(id)
根据某个素材的ID获得该素材的cls
core.getTilesetOffset(id)
根据某个素材来获得对应的tileset和坐标信息
如果该素材不是tileset则返回null
```
### items.js
items.js主要负责一切和道具相关的内容。
```js
core.getItemEffect(itemId, itemNum)
即捡即用类的道具获得时的效果实际对应道具图块属性中的itemEffect框
core.getItemEffectTip(itemId)
即捡即用类的道具获得时的额外提示比如“,攻击+100”。
实际对应道具图块属性中的itemEffectTip框
core.useItem(itemId, noRoute, callback)
尝试使用一个道具实际对应道具图块属性中的useItemEffect框
此函数也会调用一遍core.canUseItem()如果无法使用将直接返回
noRoute如果为真则这次使用道具的过程不会被计入录像
使用道具完毕后对于消耗道具将自动扣除永久道具不会扣除
core.canUseItem(itemId)
当前能否使用某个道具
有些系统道具如破炸和上下楼器等会在计算出目标点的坐标后存入core.status.event.ui
使用道具时将直接从core.status.event.ui调用不会重新计算
core.itemCount(itemId)
获得某个道具的个数
core.hasItem(itemId)
当前是否拥有某个道具等价于 core.itemCount(itemId) > 0
请注意装备上的装备不视为拥有该道具即core.hasEquip()和core.hasItem()是完全不同的
core.hasEquip(itemId)
当前是否装备上某个装备
请注意装备上的装备不视为拥有该道具即core.hasEquip()和core.hasItem()是完全不同的
core.getEquip(equipType)
获得某个装备位的当前装备equipType为装备类型从0开始
如果该装备位没有装备则返回null否则返回当前装备的ID
core.setItem(itemId, itemNum)
设置某个道具的个数
core.addItem(itemId, itemNum)
增减某个道具的个数itemNum可不填默认为1
core.getEquipTypeByName(name)
根据装备位名称来找到一个空的装备孔适用于多重装备
如果没有一个装备孔是该装备名称则返回-1
core.getEquipTypeById(equipId)
获得某个装备的装备类型
如果其type写的是装备名多重装备则调用core.getEquipTypeByName()函数
core.canEquip(equipId, hint)
当前能否穿上某个装备如果hint为真则不可装备时会气泡提示原因
core.loadEquip(equipId, callback)
穿上某个装备
core.unloadEquip(equipType, callback)
脱下某个装备孔的装备
core.compareEquipment(compareEquipId, beComparedEquipId)
比较两个套装的差异
此函数将对所有的勇士属性包括生命魔力攻防魔防金币等进行比较
如果存在差异的将作为一个对象返回其差异内容
core.quickSaveEquip(index)
保存当前套装index为保存的套装编号
core.quickLoadEquip()
读取当前套装index为读取的套装编号
```
### loader.js
loader.js主要负责资源加载相关的内容。
```js
core.loadImage(imgName, callback)
project/images/ 中加载一张图片imgName为图片名
callback为执行完毕的回调函数接收(imgName, image)即图片名和图片内容作为参数
如果图片不存在或加载失败则会在控制台打出一条错误日志不会执行回调
core.loadImages(names, toSave, callback)
project/images/ 中加载若干张图片
names为一个图片名的列表toSave为加载并存到的对象
callback为全部加载完毕执行的回调
core.loadOneMusic(name)
project/sounds/ 或第三方中加载一个音乐并存入core.material.bgms中name为音乐名
core.loadOneSound(name)
project/sounds/ 中加载一个音效并存入core.material.sounds中name为音效名
core.loadBgm(name)
预加载一个bgm并加入缓存列表core.musicStatus.cachedBgms
此函数将会检查bgm的缓存预加载和静音播放
如果缓存列表溢出(core.musicStatus.cacheBgmCount)则通过LRU算法选择一个bgm并调用core.freeBgm()
core.freeBgm(name)
释放一个bgm的内存并移出缓存列表如果该bgm正在播放则也会立刻停止
```
### map.js
maps.js负责一切和地图相关的处理内容包括如下几个方面
- 地图的初始化,保存和读取,地图数组的生成
- 是否可移动或瞬间移动的判定
- 地图的绘制
- 获得某个点的图块信息
- 启用和禁用图块,改变图块
- 移动/跳跃图块,淡入淡出图块
- 全局动画控制,动画的绘制
```js
// ------ 地图的初始化,保存和读取,地图数组的生成 ------ //
core.loadFloor(floorId, map)
从楼层或者存档中生成core.status.maps的内容
map为存档信息如果某项在map中不存在则会从core.floors中读取
core.getNumberById(id)
给定一个图块ID找到对应的数字
core.initBlock(x, y, id, addInfo, eventFloor)
给定一个数字初始化一个图块信息
x和y为坐标id为数字或者可以:t或:f结尾表示初始是启用还是禁用状态
addInfo如果为true则会填充上图块的默认信息比如给怪物添加battle触发器
eventFloor如果设置为某个楼层信息则会填充上该点的自定义或楼层切换事件
core.compressMap(mapArr, floorId)
压缩地图mapArr为要压缩的二维数组floorId为对应的楼层
此函数将把mapArr和对应的楼层中的数组进行比较并只取差异值进行存储
通过这种压缩地图的方式不仅节省了存档空间还支持了任意修改地图的接档
core.decompressMap(mapArr, floorId)
解压缩地图mapArr为压缩后的地图floorId为对应的楼层
此函数返回解压后的二维数组
core.saveMap(floorId)
将某层楼的数据生成存档所保存的内容在core.saveData()中被调用
core.loadMap(data, floorId)
从data中读取楼层数据并调用core.loadFloor()进行初始化
core.resizeMap(floorId)
根据某层楼的地图大小来调整大地图的画布大小floorId可为null表示当前层
core.getMapArray(floorId, showDisable)
生成某层楼的二维数组floorId可不填代表当前楼层
showDisable若为真则对于禁用的点会加上:f表示否则视为0
core.getMapBlocksObj(floorId, showDisable)
以x,y的形式返回每个点的图块信息floorId可不填表示当前楼层
此函数将返回 {"0,0": {...}, "0,1": {...}} 这样的结构其中内部为对应点的block信息
core.getBgMapArray(floorId, noCache)
获得某层楼的背景层的二维数组floorId可不填表示当前楼层
如果noCache为真则重新从剧本中读取而不使用缓存数据
core.getFgMapArray(floorId, noCache)
获得某层楼的前景层的二维数组floorId可不填表示当前楼层
如果noCache为真则重新从剧本中读取而不使用缓存数据
core.getBgNumber(x, y, floorId, noCache)
获得某层楼的背景层中某个点的数字floorId可不填表示当前楼层
如果noCache为真则重新从剧本中读取而不使用缓存数据
本函数实际等价于 core.getBgMapArray(floorId, noCache)[y][x]
core.getBgNumber(x, y, floorId, noCache)
获得某层楼的前景层中某个点的数字参数和方法同上
// ------ 是否可移动或瞬间移动的判定 ------ //
core.generateMovableArray(floorId, x, y, direction)
生成全图或某个点的可通行方向数组floorId为楼层Id可不填默认为当前点
这里的可通行方向数组指的是["up","down","left","right"]中的一个或多个组成的数组
- 如果不设置x和y则会返回一个三维数组其中每个点都是一个该点可通行方向的数组
- 如果设置了x和y但没有设置direction则只会返回该点的可通行方向数组
- 如果设置了x和y以及direction则会判定direction是否在该点可通行方向数组中并返回true或false
可以使用core.inArray()来判定某个方向是否在可通行方向数组中
core.canMoveHero(x, y, direction, floorId)
某个点是否可朝某个方向移动x和y可选不填或为null则默认为勇士当前点
direction可选不填或为null则默认勇士当前朝向floorId不填则默认为当前楼层
此函数将直接调用 core.generateMovableArray() 进行判定
core.canMoveDirectly(destX, destY)
当前能否瞬间移动到某个点
如果可以瞬移则返回非负数其值为该次瞬移所少走的步数如果不能瞬移则返回-1
core.automaticRoute(destX, destY)
找寻到目标点的一条自动寻路路径
// ------ 绘制地图相关 ------ //
core.drawBlock(block, animate)
重新绘制一个图块block为图块信息
如果animate不为null则代表是通过全局动画的绘制其值为当前的帧数
core.generateGroundPattern(floorId)
生成某个楼层的地板信息floorId不填默认为当前楼层
该函数可被怪物手册对话框帧动画等地方使用
core.drawMap(floorId, callback)
绘制某层楼的地图floorId为目标楼层ID可不填表示当前楼层
此函数会将core.status.floorId设置为floorId并设置core.status.thisMap
将依次调用core.drawBg(), core.drawEvents()和core.drawFg()函数最后绘制勇士和更新地图显伤
core.drawBg(floorId, ctx)
绘制背景层floorId为目标楼层ID可不填表示当前楼层
如果ctx不为null则背景层将绘制在该画布上而不是bg层上drawThumbnail使用)。
可以通过复写该函数调整_drawFloorImages和_drawBgFgMap的顺序来调整背景图块和贴图的遮挡顺序
core.drawEvents(floorId, blocks, ctx)
绘制事件层floorId为目标楼层ID可不填表示当前楼层
block表示要绘制的图块列表可不填使用当前楼层的图块列表
如果ctx不为null则背景层将绘制在该画布上而不是event层上drawThumbnail使用)。
core.drawFg(floorId, ctx)
绘制前景层floorId为目标楼层ID可不填表示当前楼层
如果ctx不为null则背景层将绘制在该画布上而不是fg层上drawThumbnail使用)。
可以通过复写该函数调整_drawFloorImages和_drawBgFgMap的顺序来调整前景图块和贴图的遮挡顺序
core.drawThumbnail(floorId, blocks, options, toDraw)
绘制一个楼层的缩略图floorId为目标楼层ID可不填表示当前楼层
block表示要绘制的图块列表可不填使用当前楼层的图块列表
options为绘制选项可为null包括
heroLoc: 勇士位置heroIcon勇士图标默认当前勇士damage是否绘制显伤
flags当前的flags在存读档时使用
toDraw为要绘制到的信息可为null或为一个画布名包括
ctx要绘制到的画布x,y起点横纵坐标默认0size绘制大小默认416/480
all是否绘制全图默认falsecenterX,centerY截取中心默认为地图正中心
// ------ 获得某个点的图块信息 ------ //
core.noPass(x, y, floorId)
判定某个点是否有noPass的图块
core.npcExists(x, y, floorId)
判定某个点是否有NPC的存在
core.terrainExists(x, y, id, floorId)
判定某个点是否有指定的地形存在
如果id为null则只要存在terrains即为真否则还会判定对应点的ID
core.stairExists(x, y, floorId)
判定某个点是否存在楼梯
core.nearStair()
判定当前勇士是否在楼梯上或旁边距离不超过1)。
core.enemyExists(x, y, id, floorId)
判定某个点是否有指定的怪物存在
如果id为null则只要存在怪物即为真否则还会判定对应点的怪物ID
请注意如果需要判定某个楼层是否存在怪物请使用core.hasEnemyLeft()函数
core.getBlock(x, y, floorId, showDisable)
获得某个点的当前图块信息x和y为坐标floorId为楼层ID可忽略或null表示当前楼层
showDisable如果为true则对于禁用的点和事件也会进行返回
如果该点不存在图块则返回null
否则返回值如下 {"index": xxx, "block": xxx}
其中index为该点在该楼层blocks数组中的索引block为该图块实际内容
core.getBlockId(x, y, floorId, showDisable)
获得某个点的图块ID如果该点不存在图块则返回null
core.getBlockCls(x, y, floorId, showDisable)
获得某个点的图块类型如果该点不存在图块则返回null
core.getBlockInfo(block)
根据某个的图块信息获得其详细的素材信息
如果参数block为字符串则视为图块ID如果参数为数字则视为图块的数字
此函数将返回一个非常详尽的素材信息目前包括如下几项
number素材数字id素材idcls素材类型image素材所在的素材图片animate素材的帧数
posX, posY素材在该素材图片上的位置height素材的高度faceIdsNPC朝向记录
core.searchBlock(id, floorId, showDisable)
搜索一个图块出现过的所有位置id为图块ID也可以传入图块的数字
floorId为要搜索的楼层可以是一个楼层ID或者一个楼层数组如果floorId不填则只搜索当前楼层
showDisable如果为真则对于禁用的图块也会返回
此函数将返回一个数组每一项为一个搜索到的结果
{"floorId": ..., "index": ..., "block": {...}, "x": ..., "y": ...}
即包含该图块所在的楼层ID在该楼层的blocks数组的索引图块内容和横纵坐标
// ------ 启用和禁用图块,改变图块 ------ //
core.showBlock(x, y, floorId)
将某个点从禁用变成启用状态floorId可不填或null表示当前楼层
core.hideBlock(x, y, floorId)
将某个点从启用变成禁用状态但不会对其进行删除floorId可不填或null表示当前楼层
此函数不会实际将该块从地图中进行删除而是将该点设置为禁用以供以后可能的启用事件
core.removeBlock(x, y, floorId)
将从启用变成禁用状态并尽可能将其从地图上删除
和hideBlock相比如果该点不存在自定义事件比如门或普通的怪物则将直接从地图中删除
如果存在自定义事件则简单的禁用它以供以后可能的启用事件
core.removeBlockById(index, floorId)
根据索引从地图的block数组中尽可能删除一个图块floorId可不填或null表示当前楼层
core.removeBlockByIds(floorId, ids)
根据索引数组从地图的block数组中尽可能删除一系列图块floorId可不填或null表示当前楼层
core.canRemoveBlock(block, floorId)
判定当前能否完全删除某个图块floorId可不填或null表示当前楼层
如果该点存在自定义事件或者是重生怪则不可进行删除
core.showBgFgMap(name, loc, floorId, callback)
显示某层楼中某个背景/前景层的图块name只能为'bg''fg'表示背景或前景层
loc为该点坐标floorId可不填默认为当前楼层callback为执行完毕的回调
core.hideBgFgMap(name, loc, floorId, callback)
隐藏某层楼中某个背景/前景层的图块name只能为'bg''fg'表示背景或前景层
loc为该点坐标floorId可不填默认为当前楼层callback为执行完毕的回调
core.showFloorImage(loc, floorId, callback)
显示某层楼中的某个楼层贴图loc为该贴图的左上角坐标floorId可省略表示当前楼层
core.hideFloorImage(loc, floorId, callback)
隐藏某层楼中的某个楼层贴图loc为该贴图的左上角坐标floorId可省略表示当前楼层
core.setBlock(number, x, y, floorId)
改变某个楼层的某个图块
number为要改变到的数字也可以传入图块id将调用core.getNumberById()来获得数字)。
x,y和floorId为目标点坐标和楼层可忽略为当前点和当前楼层
core.replaceBlock(fromNumber, toNumber, floorId)
将某个或某些楼层中的所有某个图块替换成另一个图块
fromNumber和toNumber为要被替换和替换到的数字
floorId可为某个楼层ID或者一个楼层数组如果不填只视为当前楼层
值得注意的是使用此函数转了的点上的自定义事件可能无法被执行
如有需要再对那些存在事件的点执行core.setBlock()即可
core.setBgFgBlock(name, number, x, y, floorId)
设置前景/背景层的某个图块name只能为'bg''fg'表示前景或背景层
number为要设置到的图块数字x,y和floorId为目标点坐标和楼层可忽略为当前点和当前楼层
core.resetMap(floorId)
重置某层或若干层的地图和楼层属性
floorId可为某个楼层ID或者一个楼层数组同时重置若干层如果不填则只重置当前楼层
// ------ 移动/跳跃图块,淡入淡出图块 ------ //
core.moveBlock(x, y, steps, time, keep, callback)
移动一个图块x和y为图块的坐标
steps为移动的数组每一项只能是"up","down","left","right"之一
time为每一步的移动时间不填默认为500ms
如果keep为真则在移动完毕后将自动调用一个setBlock事件改变目标点的图块即不消失
否则会按照time时间来淡出消失callback会执行完毕后的回调
core.jumpBlock(sx, sy, ex, ey, time, keep, callback)
跳跃一个图块sx和sy为图块的坐标ex和ey为目标坐标time为整个跳跃过程中的全程用时不填默认500
如果keep为真则在移动完毕后将自动调用一个setBlock事件改变目标点的图块即不消失
否则会按照time时间来淡出消失callback会执行完毕后的回调
core.animateBlock(loc, type, time, callback)
淡入/淡出一个或多个图块
loc为一个图块坐标或者一个二维数组表示一系列图块坐标将同时显示和隐藏)。
type只能为'show''hide'表示是淡入但是淡出time为动画时间callback为执行完毕的回调
// ------ 全局动画控制,动画的绘制 ------ //
core.addGlobalAnimate(block)
添加一个全局帧动画
core.removeGlobalAnimate(x, y, name)
删除一个或全部的全局帧动画name可为'bg',null或'fg'表示某个图层
x和y如果为null则会删除全部的全局帧动画否则只会删除该点的该层的帧动画
core.drawBoxAnimate()
绘制UI层的box动画如怪物手册和对话框中的帧动画等
core.drawAnimate(name, x, y, callback)
绘制一个动画name为动画名x和y为绘制的基准坐标callback为绘制完毕的回调函数
此函数将播放动画音效并异步开始绘制该动画
此函数会返回一个动画id可以通过core.stopAnimate()立刻停止该动画的播放
core.stopAnimate(id, doCallback)
立刻停止某个动画的播放id为上面core.drawAnimate的返回值
如果doCallback为真则会执行该动画所对应的回调函数
```
### ui.js
### utils.js