diff --git a/_docs/api.md b/_docs/api.md
index ade2d4e4..f717f0c3 100644
--- a/_docs/api.md
+++ b/_docs/api.md
@@ -168,52 +168,35 @@ core.doFunc(func, _this)
## actions.js
-actions.js主要是处理一些和用户交互相关的内容。
+主要是处理一些和用户交互相关的内容。
```text
-onup: fn(loc: {x: number, y: number, size: number})
-当点击(触摸)事件放开时
-
-pressKey: fn(keyCode: number)
-按住某个键时
-
-keyUp: fn(keyCode: number, altKey?: bool, fromReplay?: bool)
-根据放开键的code来执行一系列操作
-
-ondown: fn(loc: {x: number, y: number, size: number})
-点击(触摸)事件按下时
-
-registerAction: fn(action: string, name: string, func: string|fn(params: ?), priority?: number)
-此函数将注册一个用户交互行为。
-action: 要注册的交互类型,如 ondown, onclick, keyDown 等等。
-name: 你的自定义名称,可被注销使用;同名重复注册将后者覆盖前者。
-func: 执行函数。
-如果func返回true,则不会再继续执行其他的交互函数;否则会继续执行其他的交互函数。
-priority: 优先级;优先级高的将会被执行。此项可不填,默认为0
-
-onkeyDown: fn(e: Event)
-按下某个键时
+doRegisteredAction: fn(action: string, params: ?)
+执行一个用户交互行为
keyDown: fn(keyCode: number)
根据按下键的code来执行一系列操作
-onStatusBarClick: fn(e?: Event)
-点击自绘状态栏时
+keyDownCtrl: fn() -> bool
+长按Ctrl键时
+
+keyUp: fn(keyCode: number, altKey?: bool, fromReplay?: bool)
+根据放开键的code来执行一系列操作
longClick: fn(x: number, y: number, fromEvent?: bool)
长按
-unregisterAction: fn(action: string, name: string)
-注销一个用户交互行为
-
-keyDownCtrl: fn() -> bool
-长按Ctrl键时
+onStatusBarClick: fn(e?: Event)
+点击自绘状态栏时
onclick: fn(x: number, y: number, stepPostfix?: ?)
具体点击屏幕上(x,y)点时,执行的操作
-doRegisteredAction: fn(action: string, params: ?)
-执行一个用户交互行为
+ondown: fn(loc: {x: number, y: number, size: number})
+点击(触摸)事件按下时
+
+onkeyDown: fn(e: Event)
+按下某个键时
onkeyUp: fn(e: Event)
放开某个键时
@@ -223,11 +206,28 @@ onmousewheel: fn(direct: number)
onmove: fn(loc: {x: number, y: number, size: number})
当在触摸屏上滑动时
+
+onup: fn(loc: {x: number, y: number, size: number})
+当点击(触摸)事件放开时
+
+pressKey: fn(keyCode: number)
+按住某个键时
+
+registerAction: fn(action: string, name: string, func: string|fn(params: ?), priority?: number)
+此函数将注册一个用户交互行为。
+action: 要注册的交互类型,如 ondown, onclick, keyDown 等等。
+name: 你的自定义名称,可被注销使用;同名重复注册将后者覆盖前者。
+func: 执行函数。
+如果func返回true,则不会再继续执行其他的交互函数;否则会继续执行其他的交互函数。
+priority: 优先级;优先级高的将会被执行。此项可不填,默认为0
+
+unregisterAction: fn(action: string, name: string)
+注销一个用户交互行为
```
## control.js
-control.js将负责整个游戏的核心控制系统,分为如下几个部分:
+负责整个游戏的核心控制系统,分为如下几个部分:
- requestAnimationFrame相关
- 标题界面,开始和重新开始游戏
- 自动寻路和人物行走相关
@@ -240,35 +240,212 @@ control.js将负责整个游戏的核心控制系统,分为如下几个部分
- 界面resize相关
```text
-showStatusBar: fn()
-显示状态栏
+addBuff: fn(name: string, value: number)
+增减主角某个属性的百分比修正倍率,加减法叠加和抵消。等价于 core.setBuff(name, core.getBuff(name) + value)
+例如:core.addBuff('atk', -0.1); // 主角获得一层“攻击力减一成”的负面效果
+name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
+value: 倍率的增量
-startReplay: fn(list: [string])
-开始播放录像
+addFlag: fn(name: string, value: number)
+增减一个flag变量,等价于 core.setFlag(name, core.getFlag(name, 0) + value)
+例如:core.addFlag('hatred', 1); // 增加1点仇恨值
+name: 变量名,支持中文
+value: 变量的增量
-triggerReplay: fn()
-播放或暂停录像回放
+addGameCanvasTranslate: fn(x?: number, y?: number)
+加减画布偏移
-screenFlash: fn(color: [number], time: number, times?: number, callback?: fn())
-画面闪烁
-例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过
-color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填
-time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去
-times: 闪烁的总次数,不填或填0都视为1
-callback: 闪烁全部完毕后的回调函数,可选
+addStatus: fn(name: string, value: number)
+增减主角的某个属性,等价于core.setStatus(name, core.getStatus(name) + value)
+例如:core.addStatus('atk', 100'); // 给主角攻击力加100
+name: 属性的英文名
+value: 属性的增量
-setCurtain: fn(color?: [number], time?: number, callback?: fn())
-更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数
-例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒
-color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]
-time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
-callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction
+autosave: fn(removeLast?: bool)
+自动存档
-updateDamage: fn(floorId?: string, ctx?: string|CanvasRenderingContext2D)
-更新地图显伤
-例如:core.updateDamage(); // 更新当前地图的显伤,绘制在显伤层(废话)
-floorId: 地图id,不填视为当前地图。预览地图时填写
-ctx: 绘制到的画布,如果填写了就会画在该画布而不是显伤层
+bookReplay: fn()
+回放时查看怪物手册
+
+checkAutosave: fn()
+实际将自动存档写入存储
+
+checkBgm: fn()
+检查bgm状态
+
+checkBlock: fn()
+检查并执行领域、夹击、阻击事件
+
+checkRouteFolding: fn()
+检查录像折叠信息
+
+chooseReplayFile: fn()
+选择录像文件
+
+clearAutomaticRouteNode: fn(x?: number, y?: number)
+清除自动寻路路线
+
+clearContinueAutomaticRoute: fn(callback?: fn())
+清空剩下的自动寻路列表
+
+clearRouteFolding: fn()
+清空录像折叠信息
+
+clearStatus: fn()
+清除游戏状态和数据
+
+clearStatusBar: fn()
+清空状态栏
+
+continueAutomaticRoute: fn()
+继续剩下的自动寻路操作
+
+debug: fn()
+开启调试模式, 此模式下可以按Ctrl键进行穿墙, 并忽略一切事件。
+此模式下不可回放录像和上传成绩。
+
+doSL: fn(id?: string, type?: string)
+实际进行存读档事件
+
+drawDamage: fn(string|CanvasRenderingContext2D)
+仅绘制地图显伤
+
+drawHero: fn(status?: string, offset?: number, frame?: number)
+绘制主角和跟随者并重置视野到以主角为中心
+例如:core.drawHero(); // 原地绘制主角的静止帧并重置视野野
+status: 只能为 stop, leftFoot 和 rightFoot,不填用stop。
+offset: 相对主角逻辑位置的偏移量,不填视为无偏移。
+frame: 绘制的第几帧
+
+equipboxReplay: fn()
+回放录像时打开装备栏
+
+fillPosWithPoint: fn(pos?: ?)
+显示离散的寻路点
+
+gatherFollowers: fn()
+立刻聚集所有的跟随者
+
+getAllSaves: fn(callback?: fn())
+获得所有存档内容
+
+getBuff: fn(name: string) -> number
+读取主角某个属性的百分比修正倍率,初始值为1
+例如:core.getBuff('atk'); // 主角当前能发挥出多大比例的攻击力
+name: 属性的英文名
+
+getFlag: fn(name: string, defaultValue?: ?)
+读取一个flag变量
+name: 变量名,支持中文
+defaultValue: 当变量不存在时的返回值,可选(事件流中默认填0)。
+
+getHeroLoc: fn(name: string) -> string|number
+读取主角的位置和/或朝向
+例如:core.getHeroLoc(); // 读取主角的位置和朝向
+name: 要读取横坐标还是纵坐标还是朝向还是都读取
+返回值:name ? core.status.hero.loc[name] : core.status.hero.loc
+
+getLvName: fn(lv?: number) -> string|number
+根据级别的数字获取对应的名称,后者定义在全塔属性
+例如:core.getLvName(); // 获取主角当前级别的名称,如“下级佣兵”
+lv: 级别的数字,不填则视为主角当前的级别
+返回值:级别的名称,如果不存在就还是返回数字
+
+getMappedName: fn(name: string) -> string
+获得映射文件名
+
+getNakedStatus: fn(name: string)
+获得勇士原始属性(无装备和衰弱影响)
+
+getRealStatus: fn(name: string)
+计算主角的某个属性,包括百分比修正
+例如:core.getRealStatus('atk'); // 计算主角的攻击力,包括百分比修正。战斗使用的就是这个值
+name: 属性的英文名,请注意只能用于数值类属性哦,否则乘法会得到NaN
+
+getRealStatusOrDefault: fn(status?: ?, name?: string)
+从status中获得实际属性(增幅后的),如果不存在则从勇士属性中获取
+
+getSave: fn(index?: number, callback?: fn(data: ?))
+获得某个存档内容
+
+getSaveIndexes: fn(callback?: fn())
+获得所有存在存档的存档位
+
+getSaves: fn(ids?: ?, callback?: fn())
+获得某些存档内容
+
+getStatus: fn(name: string) -> number
+读取主角的某个属性,不包括百分比修正
+例如:core.getStatus('atk'); // 读取主角的攻击力
+name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.getHeroLoc(name),其他的会直接读取 core.status.hero[name]
+
+getStatusLabel: fn(name: string) -> string
+获得某个状态的名字,如atk->攻击,def->防御等
+
+getStatusOrDefault: fn(status?: ?, name?: string)
+从status中获得属性,如果不存在则从勇士属性中获取
+
+hasFlag: fn(name: string) -> bool
+判定一个flag变量是否存在且不为false、0、''、null、undefined和NaN
+例如:core.hasFlag('poison'); // 判断主角当前是否中毒
+name: 变量名,支持中文
+此函数等价于 !!core.getFlag(name)
+
+hasSave: fn(index?: number) -> bool
+判断某个存档位是否存在存档
+
+hideStartAnimate: fn(callback?: fn())
+淡出标题画面
+例如:core.hideStartAnimate(core.startGame); // 淡出标题画面并开始新游戏,跳过难度选择
+callback: 标题画面完全淡出后的回调函数
+
+hideStatusBar: fn(showToolbox?: bool)
+隐藏状态栏
+showToolbox: 是否不隐藏竖屏工具栏
+
+isMoving: fn() -> bool
+当前是否正在移动
+
+isPlaying: fn() -> bool
+游戏是否已经开始
+
+isReplaying: fn() -> bool
+是否正在播放录像
+
+loadData: fn(data?: ?, callback?: fn())
+从本地读档
+
+lockControl: fn()
+锁定用户控制,常常用于事件处理
+
+moveAction: fn(callback?: fn())
+尝试前进一步,如果面前不可被踏入就会直接触发该点事件
+请勿直接使用此函数,如有需要请使用「勇士前进一步或撞击」事件
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
+
+moveDirectly: fn(destX?: number, destY?: number, ignoreSteps?: number)
+瞬间移动
+
+moveHero: fn(direction?: string, callback?: fn())
+连续前进,不撞南墙不回头
+例如:core.moveHero(); // 连续前进
+direction: 可选,如果设置了就会先转身到该方向
+callback: 可选,如果设置了就只走一步
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
+
+moveOneStep: fn(callback?: fn())
+每移动一格后执行的事件
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
+
+moveViewport: fn(steps?: ?, time?: number, callback?: fn())
+移动视野范围
+
+nearHero: fn(x: number, y: number, n?: number) -> bool
+判定主角是否身处某个点的锯齿领域(取曼哈顿距离)
+例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域
+x: 领域的中心横坐标
+y: 领域的中心纵坐标
+n: 领域的半径,不填视为1
nextX: fn(n?: number) -> number
获取主角面前第n格的横坐标
@@ -280,69 +457,82 @@ nextY: fn(n?: number) -> number
例如:core.jumpHero(core.nextX(2), core.nextY(2)); // 主角向前跃过一格,即跳跃靴道具的使用效果
n: 目标格与主角的距离,面前为正数,背后为负数,脚下为0,不填视为1
-clearContinueAutomaticRoute: fn(callback?: fn())
-清空剩下的自动寻路列表
-
-updateViewport: fn()
-更新大地图的可见区域
-
-getMappedName: fn(name: string) -> string
-获得映射文件名
-
-addFlag: fn(name: string, value: number)
-增减一个flag变量,等价于 core.setFlag(name, core.getFlag(name, 0) + value)
-例如:core.addFlag('hatred', 1); // 增加1点仇恨值
-name: 变量名,支持中文
-value: 变量的增量
-
-setFlag: fn(name: string, value: ?)
-设置一个flag变量
-例如:core.setFlag('poison', true); // 令主角中毒
-name: 变量名,支持中文
-value: 变量的新值,不填或填null视为删除
-
-viewMapReplay: fn()
-回放录像时浏览地图
-
-playSound: fn(sound: string)
-播放一个音效
-
-stopSound: fn()
-停止所有SE
-
-addGameCanvasTranslate: fn(x?: number, y?: number)
-加减画布偏移
-
-addBuff: fn(name: string, value: number)
-增减主角某个属性的百分比修正倍率,加减法叠加和抵消。等价于 core.setBuff(name, core.getBuff(name) + value)
-例如:core.addBuff('atk', -0.1); // 主角获得一层“攻击力减一成”的负面效果
-name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
-value: 倍率的增量
-
-drawHero: fn(status?: string, offset?: number, frame?: number)
-绘制主角和跟随者并重置视野到以主角为中心
-例如:core.drawHero(); // 原地绘制主角的静止帧并重置视野野
-status: 只能为 stop, leftFoot 和 rightFoot,不填用stop。
-offset: 相对主角逻辑位置的偏移量,不填视为无偏移。
-frame: 绘制的第几帧
-
pauseBgm: fn()
暂停背景音乐的播放
-setReplaySpeed: fn(speed: number)
-设置播放速度
-
pauseReplay: fn()
暂停播放
-doSL: fn(id?: string, type?: string)
-实际进行存读档事件
+playBgm: fn(bgm: string, startTime?: number)
+播放背景音乐,中途开播但不计入存档且只会持续到下次场景切换。如需长期生效请将背景音乐的文件名赋值给flags.__bgm__
+例如:core.playBgm('bgm.mp3', 30); // 播放bgm.mp3,并跳过前半分钟
+bgm: 背景音乐的文件名,支持全塔属性中映射前的中文名
+startTime: 跳过前多少秒,不填则不跳过
-setStatus: fn(name: string, value: number)
-设置主角的某个属性
-例如:core.setStatus('atk', 100); // 设置攻击力为100
-name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.setHeroLoc(name, value),其他的会直接对 core.status.hero[name] 赋值
-value: 属性的新值
+playSound: fn(sound: string)
+播放一个音效
+
+registerAnimationFrame: fn(name: string, needPlaying: bool, func?: fn(timestamp: number))
+注册一个 animationFrame
+name: 名称,可用来作为注销使用
+needPlaying: 是否只在游戏运行时才执行(在标题界面不执行)
+func: 要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数
+
+registerReplayAction: fn(name: string, func: fn(action?: string) -> bool)
+注册一个录像行为
+name: 自定义名称,可用于注销使用
+func: 具体执行录像的函数,可为一个函数或插件中的函数名;
+需要接受一个action参数,代表录像回放时的下一个操作
+func返回true代表成功处理了此录像行为,false代表没有处理此录像行为。
+
+registerResize: fn(name: string, func: fn(obj: ?))
+注册一个resize函数
+name: 名称,可供注销使用
+func: 可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。
+
+removeFlag: fn(name: string)
+删除某个flag/变量
+
+removeSave: fn(index?: number, callback?: fn())
+删除某个存档
+
+replay: fn()
+回放下一个操作
+
+resize: fn()
+屏幕分辨率改变后重新自适应
+
+resumeBgm: fn(resumeTime?: number)
+恢复背景音乐的播放
+resumeTime: 从哪一秒开始恢复播放
+
+resumeReplay: fn()
+恢复播放
+
+rewindReplay: fn()
+回退到上一个录像节点
+
+saveAndStopAutomaticRoute: fn()
+保存剩下的寻路,并停止
+
+saveData: fn()
+存档到本地
+
+saveReplay: fn()
+回放时存档
+
+screenFlash: fn(color: [number], time: number, times?: number, callback?: fn())
+画面闪烁
+例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过
+color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填
+time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去
+times: 闪烁的总次数,不填或填0都视为1
+callback: 闪烁全部完毕后的回调函数,可选
+
+setAutoHeroMove: fn(steps: [?])
+连续行走
+例如:core.setAutoHeroMove([{direction: "up", step: 1}, {direction: "left", step: 3}]); // 上左左左
+steps: 压缩的步伐数组,每项表示朝某方向走多少步
setAutomaticRoute: fn(destX: number, destY: number, stepPostfix: [{x: number, y: number, direction: string}])
半自动寻路,用于鼠标或手指拖动
@@ -351,16 +541,28 @@ destX: 鼠标或手指的起拖点横坐标
destY: 鼠标或手指的起拖点纵坐标
stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。
-triggerHero: fn(type?: string, time?: number, callback?: fn())
-改变勇士的显隐状态
+setBuff: fn(name: string, value: number)
+设置主角某个属性的百分比修正倍率,初始值为1,
+倍率存放在flag: '__'+name+'_buff__' 中
+例如:core.setBuff('atk', 0.5); // 主角能发挥出的攻击力减半
+name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
+value: 新的百分比修正倍率,不填(效果上)视为1
-gatherFollowers: fn()
-立刻聚集所有的跟随者
+setCurtain: fn(color?: [number], time?: number, callback?: fn())
+更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数
+例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒
+color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]
+time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
+callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction
-getStatus: fn(name: string) -> number
-读取主角的某个属性,不包括百分比修正
-例如:core.getStatus('atk'); // 读取主角的攻击力
-name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.getHeroLoc(name),其他的会直接读取 core.status.hero[name]
+setFlag: fn(name: string, value: ?)
+设置一个flag变量
+例如:core.setFlag('poison', true); // 令主角中毒
+name: 变量名,支持中文
+value: 变量的新值,不填或填null视为删除
+
+setGameCanvasTranslate: fn(ctx: string|CanvasRenderingContext2D, x: number, y: number)
+设置大地图的偏移量
setHeroLoc: fn(name: string, value: string|number, noGather?: bool)
设置勇士位置
@@ -371,141 +573,27 @@ name: 要设置的坐标属性
value: 新值
noGather: 是否聚集跟随者
-getLvName: fn(lv?: number) -> string|number
-根据级别的数字获取对应的名称,后者定义在全塔属性
-例如:core.getLvName(); // 获取主角当前级别的名称,如“下级佣兵”
-lv: 级别的数字,不填则视为主角当前的级别
-返回值:级别的名称,如果不存在就还是返回数字
-
-addStatus: fn(name: string, value: number)
-增减主角的某个属性,等价于core.setStatus(name, core.getStatus(name) + value)
-例如:core.addStatus('atk', 100'); // 给主角攻击力加100
-name: 属性的英文名
-value: 属性的增量
-
-speedUpReplay: fn()
-加速播放
-
-loadData: fn(data?: ?, callback?: fn())
-从本地读档
-
-debug: fn()
-开启调试模式, 此模式下可以按Ctrl键进行穿墙, 并忽略一切事件。
-此模式下不可回放录像和上传成绩。
-
-moveOneStep: fn(callback?: fn())
-每移动一格后执行的事件
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-
-clearStatus: fn()
-清除游戏状态和数据
-
-updateFollowers: fn()
-更新跟随者坐标
-
-waitHeroToStop: fn(callback?: fn())
-等待主角停下
-例如:core.waitHeroToStop(core.vibrate); // 等待主角停下,然后视野左右抖动1秒
-callback: 主角停止后的回调函数
-
-hideStatusBar: fn(showToolbox?: bool)
-隐藏状态栏
-showToolbox: 是否不隐藏竖屏工具栏
-
-getBuff: fn(name: string) -> number
-读取主角某个属性的百分比修正倍率,初始值为1
-例如:core.getBuff('atk'); // 主角当前能发挥出多大比例的攻击力
-name: 属性的英文名
-
-setToolbarButton: fn(useButton?: bool)
-改变工具栏为按钮1-8
-
-getSaves: fn(ids?: ?, callback?: fn())
-获得某些存档内容
-
-replay: fn()
-回放下一个操作
-
-getStatusOrDefault: fn(status?: ?, name?: string)
-从status中获得属性,如果不存在则从勇士属性中获取
-
-unregisterReplayAction: fn(name: string)
-注销一个录像行为
-
-setBuff: fn(name: string, value: number)
-设置主角某个属性的百分比修正倍率,初始值为1,
-倍率存放在flag: '__'+name+'_buff__' 中
-例如:core.setBuff('atk', 0.5); // 主角能发挥出的攻击力减半
-name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
-value: 新的百分比修正倍率,不填(效果上)视为1
-
-continueAutomaticRoute: fn()
-继续剩下的自动寻路操作
-
-saveReplay: fn()
-回放时存档
-
-setAutoHeroMove: fn(steps: [?])
-连续行走
-例如:core.setAutoHeroMove([{direction: "up", step: 1}, {direction: "left", step: 3}]); // 上左左左
-steps: 压缩的步伐数组,每项表示朝某方向走多少步
-
-fillPosWithPoint: fn(pos?: ?)
-显示离散的寻路点
-
-unregisterResize: fn(name: string)
-注销一个resize函数
-
-saveAndStopAutomaticRoute: fn()
-保存剩下的寻路,并停止
-
-hideStartAnimate: fn(callback?: fn())
-淡出标题画面
-例如:core.hideStartAnimate(core.startGame); // 淡出标题画面并开始新游戏,跳过难度选择
-callback: 标题画面完全淡出后的回调函数
-
-getAllSaves: fn(callback?: fn())
-获得所有存档内容
-
-updateHeroIcon: fn(name: string)
-更新状态栏的勇士图标
+setHeroMoveInterval: fn(callback?: fn())
+设置行走的效果动画
setMusicBtn: fn()
设置音乐图标的显隐状态
-isPlaying: fn() -> bool
-游戏是否已经开始
+setReplaySpeed: fn(speed: number)
+设置播放速度
-triggerBgm: fn()
-开启或关闭背景音乐的播放
+setStatus: fn(name: string, value: number)
+设置主角的某个属性
+例如:core.setStatus('atk', 100); // 设置攻击力为100
+name: 属性的英文名,其中'x'、'y'和'direction'会被特殊处理为 core.setHeroLoc(name, value),其他的会直接对 core.status.hero[name] 赋值
+value: 属性的新值
-moveHero: fn(direction?: string, callback?: fn())
-连续前进,不撞南墙不回头
-例如:core.moveHero(); // 连续前进
-direction: 可选,如果设置了就会先转身到该方向
-callback: 可选,如果设置了就只走一步
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
+setToolbarButton: fn(useButton?: bool)
+改变工具栏为按钮1-8
-getRealStatusOrDefault: fn(status?: ?, name?: string)
-从status中获得实际属性(增幅后的),如果不存在则从勇士属性中获取
-
-removeSave: fn(index?: number, callback?: fn())
-删除某个存档
-
-registerAnimationFrame: fn(name: string, needPlaying: bool, func?: fn(timestamp: number))
-注册一个 animationFrame
-name: 名称,可用来作为注销使用
-needPlaying: 是否只在游戏运行时才执行(在标题界面不执行)
-func: 要执行的函数,或插件中的函数名;可接受timestamp(从页面加载完毕到当前所经过的时间)作为参数
-
-getHeroLoc: fn(name: string) -> string|number
-读取主角的位置和/或朝向
-例如:core.getHeroLoc(); // 读取主角的位置和朝向
-name: 要读取横坐标还是纵坐标还是朝向还是都读取
-返回值:name ? core.status.hero.loc[name] : core.status.hero.loc
-
-stopAutomaticRoute: fn()
-停止自动寻路操作
+setViewport: fn(x?: number, y?: number)
+设置视野范围
+x,y: 左上角相对大地图的像素坐标,不需要为32倍数
setWeather: fn(type?: string, level?: number)
设置天气,不计入存档。如需长期生效请使用core.events._action_setWeather()函数
@@ -513,173 +601,58 @@ setWeather: fn(type?: string, level?: number)
type: 新天气的类型,不填视为晴天
level: 新天气(晴天除外)的级别,必须为不大于10的正整数,不填视为5
-updateStatusBar: fn(doNotCheckAutoEvents?: bool)
-立刻刷新状态栏和地图显伤
-doNotCheckAutoEvents: 是否不检查自动事件
-
-autosave: fn(removeLast?: bool)
-自动存档
-
-clearStatusBar: fn()
-清空状态栏
-
-moveAction: fn(callback?: fn())
-尝试前进一步,如果面前不可被踏入就会直接触发该点事件
-与「勇士前进一步或撞击」事件等价
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-
-hasFlag: fn(name: string) -> bool
-判定一个flag变量是否存在且不为false、0、''、null、undefined和NaN
-例如:core.hasFlag('poison'); // 判断主角当前是否中毒
-name: 变量名,支持中文
-此函数等价于 !!core.getFlag(name)
-
-rewindReplay: fn()
-回退到上一个录像节点
-
-toolboxReplay: fn()
-回放录像时打开道具栏
-
-playBgm: fn(bgm: string, startTime?: number)
-播放背景音乐,中途开播但不计入存档且只会持续到下次场景切换。如需长期生效请将背景音乐的文件名赋值给flags.__bgm__
-例如:core.playBgm('bgm.mp3', 30); // 播放bgm.mp3,并跳过前半分钟
-bgm: 背景音乐的文件名,支持全塔属性中映射前的中文名
-startTime: 跳过前多少秒,不填则不跳过
-
-isReplaying: fn() -> bool
-是否正在播放录像
-
-isMoving: fn() -> bool
-当前是否正在移动
-
-getSaveIndexes: fn(callback?: fn())
-获得所有存在存档的存档位
-
-unlockControl: fn()
-解锁用户控制行为
-
-syncSave: fn(type?: string)
-同步存档到服务器
-
-removeFlag: fn(name: string)
-删除某个flag/变量
-
-registerResize: fn(name: string, func: fn(obj: ?))
-注册一个resize函数
-name: 名称,可供注销使用
-func: 可以是一个函数,或者是插件中的函数名;可以接受obj参数,详见resize函数。
-
-stopReplay: fn(force?: bool)
-停止播放
-
-bookReplay: fn()
-回放时查看怪物手册
-
-turnHero: fn(direction?: string)
-主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心
-例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果
-direction: 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一
-
-resumeReplay: fn()
-恢复播放
-
-resize: fn()
-屏幕分辨率改变后重新自适应
-
-equipboxReplay: fn()
-回放录像时打开装备栏
-
-getSave: fn(index?: number, callback?: fn(data: ?))
-获得某个存档内容
-
-setViewport: fn(x?: number, y?: number)
-设置视野范围
-x,y: 左上角相对大地图的像素坐标,不需要为32倍数
-
-chooseReplayFile: fn()
-选择录像文件
-
-lockControl: fn()
-锁定用户控制,常常用于事件处理
-
-updateCheckBlock: fn(floorId?: string)
-更新领域、夹击、阻击的伤害地图
-
-checkBlock: fn()
-检查并执行领域、夹击、阻击事件
-
-clearAutomaticRouteNode: fn(x?: number, y?: number)
-清除自动寻路路线
-
-getFlag: fn(name: string, defaultValue?: ?)
-读取一个flag变量
-name: 变量名,支持中文
-defaultValue: 当变量不存在时的返回值,可选(事件流中默认填0)。
-
-getNakedStatus: fn(name: string)
-获得勇士原始属性(无装备和衰弱影响)
-
-nearHero: fn(x: number, y: number, n?: number) -> bool
-判定主角是否身处某个点的锯齿领域(取曼哈顿距离)
-例如:core.nearHero(6, 6, 6); // 判定主角是否身处点(6,6)的半径为6的锯齿领域
-x: 领域的中心横坐标
-y: 领域的中心纵坐标
-n: 领域的半径,不填视为1
-
-stepReplay: fn()
-单步播放
-
-hasSave: fn(index?: number) -> bool
-判断某个存档位是否存在存档
-
showStartAnimate: fn(noAnimate?: bool, callback?: fn())
进入标题画面
例如:core.showStartAnimate(); // 重启游戏但不重置bgm
noAnimate: 可选,true表示不由黑屏淡入而是立即亮屏
callback: 可选,完全亮屏后的回调函数
-moveViewport: fn(steps?: ?, time?: number, callback?: fn())
-移动视野范围
-
-syncLoad: fn()
-从服务器加载存档
-
-setHeroMoveInterval: fn(callback?: fn())
-设置行走的效果动画
-
-registerReplayAction: fn(name: string, func: fn(action?: string) -> bool)
-注册一个录像行为
-name: 自定义名称,可用于注销使用
-func: 具体执行录像的函数,可为一个函数或插件中的函数名;
-需要接受一个action参数,代表录像回放时的下一个操作
-func返回true代表成功处理了此录像行为,false代表没有处理此录像行为。
-
-checkAutosave: fn()
-实际将自动存档写入存储
-
-resumeBgm: fn(resumeTime?: number)
-恢复背景音乐的播放
-resumeTime: 从哪一秒开始恢复播放
-
-setGameCanvasTranslate: fn(ctx: string|CanvasRenderingContext2D, x: number, y: number)
-设置大地图的偏移量
-
-checkBgm: fn()
-检查bgm状态
+showStatusBar: fn()
+显示状态栏
speedDownReplay: fn()
减速播放
-getRealStatus: fn(name: string)
-计算主角的某个属性,包括百分比修正
-例如:core.getRealStatus('atk'); // 计算主角的攻击力,包括百分比修正。战斗使用的就是这个值
-name: 属性的英文名,请注意只能用于数值类属性哦,否则乘法会得到NaN
+speedUpReplay: fn()
+加速播放
-saveData: fn()
-存档到本地
+startReplay: fn(list: [string])
+开始播放录像
-unregisterAnimationFrame: fn(name: string)
-注销一个animationFrame
+stepReplay: fn()
+单步播放
+
+stopAutomaticRoute: fn()
+停止自动寻路操作
+
+stopReplay: fn(force?: bool)
+停止播放
+
+stopSound: fn()
+停止所有SE
+
+syncLoad: fn()
+从服务器加载存档
+
+syncSave: fn(type?: string)
+同步存档到服务器
+
+toolboxReplay: fn()
+回放录像时打开道具栏
+
+triggerBgm: fn()
+开启或关闭背景音乐的播放
+
+triggerDebuff: fn(action: string, type: string|[string])
+获得或移除毒衰咒效果
+action: 要获得还是移除,'get'为获得,'remove'为移除
+type: 获得或移除的内容(poison/weak/curse),可以为字符串或数组
+
+triggerHero: fn(type?: string, time?: number, callback?: fn())
+改变勇士的显隐状态
+
+triggerReplay: fn()
+播放或暂停录像回放
tryMoveDirectly: fn(destX: number, destY: number)
尝试瞬移,如果该点有图块/事件/阻激夹域捕则会瞬移到它旁边再走一步(不可踏入的话当然还是触发该点事件),这一步的方向优先和瞬移前主角的朝向一致
@@ -687,22 +660,120 @@ tryMoveDirectly: fn(destX: number, destY: number)
destX: 目标点的横坐标
destY: 目标点的纵坐标
-moveDirectly: fn(destX?: number, destY?: number, ignoreSteps?: number)
-瞬间移动
+turnHero: fn(direction?: string)
+主角转向并计入录像,不会导致跟随者聚集,会导致视野重置到以主角为中心
+例如:core.turnHero(); // 主角顺时针旋转90°,即单击主角或按下Z键的效果
+direction: 主角的新朝向,可为 up, down, left, right, :left, :right, :back 七种之一
+
+unlockControl: fn()
+解锁用户控制行为
+
+unregisterAnimationFrame: fn(name: string)
+注销一个animationFrame
+
+unregisterReplayAction: fn(name: string)
+注销一个录像行为
+
+unregisterResize: fn(name: string)
+注销一个resize函数
+
+updateCheckBlock: fn(floorId?: string)
+更新领域、夹击、阻击的伤害地图
+
+updateDamage: fn(floorId?: string, ctx?: string|CanvasRenderingContext2D)
+重算并绘制地图显伤
+例如:core.updateDamage(); // 更新当前地图的显伤,绘制在显伤层(废话)
+floorId: 地图id,不填视为当前地图。预览地图时填写
+ctx: 绘制到的画布,如果填写了就会画在该画布而不是显伤层
+
+updateFollowers: fn()
+更新跟随者坐标
+
+updateHeroIcon: fn(name: string)
+更新状态栏的勇士图标
+
+updateStatusBar: fn(doNotCheckAutoEvents?: bool)
+立刻刷新状态栏和地图显伤
+doNotCheckAutoEvents: 是否不检查自动事件
+
+updateViewport: fn()
+更新大地图的可见区域
+
+viewMapReplay: fn()
+回放录像时浏览地图
+
+waitHeroToStop: fn(callback?: fn())
+等待主角停下
+例如:core.waitHeroToStop(core.vibrate); // 等待主角停下,然后视野左右抖动1秒
+callback: 主角停止后的回调函数
```
## enemys.js
-enemys.js中定义了一系列和怪物相关的API函数。
+定义了一系列和怪物相关的API函数。
```text
+canBattle: fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> bool
+判定主角当前能否打败某只敌人
+例如:core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)
+enemy: 敌人id或敌人对象
+x: 敌人的横坐标,可选
+y: 敌人的纵坐标,可选
+floorId: 敌人所在的地图,可选
+返回值:true表示可以打败,false表示无法打败
+
+getCurrentEnemys: fn(floorId?: string) -> [enemy]
+获得某张地图的敌人集合,用于手册绘制
+例如:core.getCurrentEnemys('MT0') // 主塔0层的敌人集合
+floorId: 地图id,可选
+返回值:敌人集合,按伤害升序排列,支持多朝向怪合并
+
+getDamage: fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> number
+获得某只敌人对主角的总伤害
+例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
+enemy: 敌人id或敌人对象
+x: 敌人的横坐标,可选
+y: 敌人的纵坐标,可选
+floorId: 敌人所在的地图,可选
+返回值:总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null
+
+getDamageInfo: fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {damage: number, per_damage: number, hero_per_damage: number, init_damage: number, mon_hp: number, mon_atk: number, mon_def: number, turn: number}
+获得战斗伤害信息
+例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
+enemy: 敌人id或敌人对象
+hero: 可选,此时的勇士属性
+x: 敌人的横坐标,可选
+y: 敌人的纵坐标,可选
+floorId: 敌人所在的地图,可选
+返回值:伤害计算信息,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null
+
+getDamageString: fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> {color: string, damage: string}
+获得某只敌人的地图显伤,包括颜色
+例如:core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤
+enemy: 敌人id或敌人对象
+x: 敌人的横坐标,可选
+y: 敌人的纵坐标,可选
+floorId: 敌人所在的地图,可选
+返回值:damage: 表示伤害值或为'???',color: 形如'#RrGgBb'
+
+getDefDamage: fn(enemy: string|enemy, k?: number, x?: number, y?: number, floorId?: string) -> number
+计算再加若干点防御能使某只敌人对主角的总伤害降低多少
+例如:core.getDefDamage('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少
+enemy: 敌人id或敌人对象
+k: 假设主角增加的防御力,可选,默认为1
+x: 敌人的横坐标,可选
+y: 敌人的纵坐标,可选
+floorId: 敌人所在的地图,可选
+
+getEnemyInfo: fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {hp: number, atk: number, def: number, money: number, exp: number, special: [number], point: number, guards: [?]}
+获得怪物真实属性
+hero: 可选,此时的勇士属性
+此函数将会计算包括坚固、模仿、光环等若干效果,将同时被怪物手册和伤害计算调用
+
getEnemys: fn()
获得所有怪物原始数据的一个副本。
请使用core.material.enemys获得当前各项怪物属性。
-getSpecials: fn() -> [[?]]
-获得所有特殊属性的定义
-
getSpecialColor: fn(enemy: string|enemy) -> [string]
获得某个怪物所有特殊属性的颜色
@@ -724,6 +795,16 @@ getSpecialText: fn(enemy: string|enemy) -> [string]
enemy: 敌人id或敌人对象,如core.material.enemys.greenSlime
返回值:字符串数组
+getSpecials: fn() -> [[?]]
+获得所有特殊属性的定义
+
+hasEnemyLeft: fn(enemyId?: string, floorId?: string|[string]) -> bool
+检查某些楼层是否还有漏打的(某种)敌人
+例如:core.hasEnemyLeft('greenSlime', ['sample0', 'sample1']) // 样板0层和1层是否有漏打的绿头怪
+enemyId: 敌人id,可选,null表示任意敌人
+floorId: 地图id或其数组,可选,不填为当前地图
+返回值:地图中是否还存在该种敌人
+
hasSpecial: fn(special: number|[number]|string|number, test: number) -> bool
判定某种特殊属性的有无
例如:core.hasSpecial('greenSlime', 1) // 判定绿头怪有无先攻属性
@@ -740,70 +821,6 @@ x: 敌人的横坐标,可选
y: 敌人的纵坐标,可选
floorId: 敌人所在的地图,可选
返回:两列的二维数组,每行表示一个临界及其减伤
-
-getDefDamage: fn(enemy: string|enemy, k?: number, x?: number, y?: number, floorId?: string) -> number
-计算再加若干点防御能使某只敌人对主角的总伤害降低多少
-例如:core.getDefDamage('greenSlime', 10, 0, 0, 'MT0') // 再加10点防御能使绿头怪的伤害降低多少
-enemy: 敌人id或敌人对象
-k: 假设主角增加的防御力,可选,默认为1
-x: 敌人的横坐标,可选
-y: 敌人的纵坐标,可选
-floorId: 敌人所在的地图,可选
-
-canBattle: fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> bool
-判定主角当前能否打败某只敌人
-例如:core.canBattle('greenSlime',0,0,'MT0') // 能否打败主塔0层左上角的绿头怪(假设有)
-enemy: 敌人id或敌人对象
-x: 敌人的横坐标,可选
-y: 敌人的纵坐标,可选
-floorId: 敌人所在的地图,可选
-返回值:true表示可以打败,false表示无法打败
-
-getEnemyInfo: fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {hp: number, atk: number, def: number, money: number, exp: number, special: [number], point: number, guards: [?]}
-获得怪物真实属性
-hero: 可选,此时的勇士属性
-此函数将会计算包括坚固、模仿、光环等若干效果,将同时被怪物手册和伤害计算调用
-
-getDamageInfo: fn(enemy: string|enemy, hero?: ?, x?: number, y?: number, floorId?: string) -> {damage: number, per_damage: number, hero_per_damage: number, init_damage: number, mon_hp: number, mon_atk: number, mon_def: number, turn: number}
-获得战斗伤害信息
-例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
-enemy: 敌人id或敌人对象
-hero: 可选,此时的勇士属性
-x: 敌人的横坐标,可选
-y: 敌人的纵坐标,可选
-floorId: 敌人所在的地图,可选
-返回值:伤害计算信息,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null
-
-getDamage: fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> number
-获得某只敌人对主角的总伤害
-例如:core.getDamage('greenSlime',0,0,'MT0') // 绿头怪的总伤害
-enemy: 敌人id或敌人对象
-x: 敌人的横坐标,可选
-y: 敌人的纵坐标,可选
-floorId: 敌人所在的地图,可选
-返回值:总伤害,如果因为没有破防或无敌怪等其他原因无法战斗,则返回null
-
-getDamageString: fn(enemy: string|enemy, x?: number, y?: number, floorId?: string) -> {color: string, damage: string}
-获得某只敌人的地图显伤,包括颜色
-例如:core.getDamageString('greenSlime', 0, 0, 'MT0') // 绿头怪的地图显伤
-enemy: 敌人id或敌人对象
-x: 敌人的横坐标,可选
-y: 敌人的纵坐标,可选
-floorId: 敌人所在的地图,可选
-返回值:damage: 表示伤害值或为'???',color: 形如'#RrGgBb'
-
-getCurrentEnemys: fn(floorId?: string) -> [enemy]
-获得某张地图的敌人集合,用于手册绘制
-例如:core.getCurrentEnemys('MT0') // 主塔0层的敌人集合
-floorId: 地图id,可选
-返回值:敌人集合,按伤害升序排列,支持多朝向怪合并
-
-hasEnemyLeft: fn(enemyId?: string, floorId?: string|[string]) -> bool
-检查某些楼层是否还有漏打的(某种)敌人
-例如:core.hasEnemyLeft('greenSlime', ['sample0', 'sample1']) // 样板0层和1层是否有漏打的绿头怪
-enemyId: 敌人id,可选,null表示任意敌人
-floorId: 地图id或其数组,可选,不填为当前地图
-返回值:地图中是否还存在该种敌人
```
## events.js
@@ -815,65 +832,27 @@ events.js将处理所有和事件相关的操作,主要分为五个部分:
- 点击状态栏图标所进行的操作
- 一些具体事件的执行内容
-
```text
+afterBattle: fn(enemyId?: string, x?: number, y?: number)
+战斗结束后触发的事件
+
afterChangeFloor: fn(floorId?: string)
转换楼层结束的事件
-popEventLoc: fn()
-将当前点坐标入栈
+afterGetItem: fn(id?: string, x?: number, y?: number, isGentleClick?: bool)
+获得一个道具后的事件
afterOpenDoor: fn(doorId?: string, x?: number, y?: number)
开一个门后触发的事件
-checkLvUp: fn()
-检查升级事件
+afterPushBox: fn()
+推箱子后的事件
-insertAction: fn(action: string|?|[?], x?: number, y?: number, callback?: fn(), addToLast?: bool)
-插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent
-例如:core.insertAction('一段文字'); // 插入一个显示文章
-action: 单个事件指令,或事件指令数组
-x: 新的当前点横坐标,可选
-y: 新的当前点纵坐标,可选
-callback: 新的回调函数,可选
-addToLast: 插入的位置,true表示插入到末尾,否则插入到开头
+autoEventExecuted: fn(symbol?: string, value?: ?) -> bool
+当前是否执行过某个自动事件
-unfollow: fn(name?: string)
-取消跟随
-name: 取消跟随的行走图,不填则取消全部跟随者
-
-hasVisitedFloor: fn(floorId?: string) -> bool
-是否到达过某个楼层
-
-startEvents: fn(list?: [?], x?: number, y?: number, callback?: fn())
-开始执行一系列自定义事件
-
-setHeroIcon: fn(name: string, noDraw?: bool)
-更改主角行走图
-例如:core.setHeroIcon('npc48.png', true); // 把主角从阳光变成样板0层左下角的小姐姐,但不立即刷新
-name: 新的行走图文件名,可以是全塔属性中映射前的中文名。映射后会被存入core.status.hero.image
-noDraw: true表示不立即刷新(刷新会导致大地图下视野重置到以主角为中心)
-
-changingFloor: fn(floorId?: string, heroLoc?: {x: number, y: number, direction: string})
-楼层转换中
-
-setEvents: fn(list?: [?], x?: number, y?: number, callback?: fn())
-直接设置事件列表
-
-setValue: fn(name: string, operator: string, value: ?, prefix?: string)
-数值操作
-
-precompile: fn(data?: ?)
-预编辑事件
-
-vibrate: fn(time?: number, callback?: fn())
-视野左右抖动
-例如:core.vibrate(); // 视野左右抖动1秒
-time: 抖动时长,单位为毫秒。必须为半秒的倍数,不填或小于1秒都视为1秒
-callback: 抖动平息后的回调函数,可选
-
-confirmRestart: fn()
-询问是否需要重新开始
+autoEventExecuting: fn(symbol?: string, value?: ?) -> bool
+当前是否在执行某个自动事件
battle: fn(id: string, x?: number, y?: number, force?: bool, callback?: fn())
战斗,如果填写了坐标就会删除该点的敌人并触发战后事件
@@ -884,38 +863,84 @@ y: 敌人的纵坐标,可选
force: true表示强制战斗,可选
callback: 回调函数,可选
-follow: fn(name: string)
-跟随
-name: 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册
-
beforeBattle: fn(enemyId?: string, x?: number, y?: number) -> bool
战斗前触发的事件;返回false代表不进行战斗
-registerEvent: fn(type: string, func: fn(data: ?, x?: number, y?: number, prefix?: string))
-注册一个自定义事件
-type: 事件类型
-func: 事件的处理函数,可接受(data, x, y, prefix)参数
-data为事件内容,x和y为当前点坐标(可为null),prefix为当前点前缀
+changeFloor: fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn())
+场景切换
+例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户定义的值
+floorId: 传送的目标地图id,可以填':before'和':after'分别表示楼下或楼上
+stair: 传送的位置
+heroLoc: 传送的坐标;会覆盖stair
+time: 传送的黑屏时间,单位为毫秒;不填为用户设置值
+callback: 传送的回调函数
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-flyTo: fn(toId?: string, callback?: fn()) -> bool
-飞往某一层
+changingFloor: fn(floorId?: string, heroLoc?: {x: number, y: number, direction: string})
+楼层转换中
-afterGetItem: fn(id?: string, x?: number, y?: number, isGentleClick?: bool)
-获得一个道具后的事件
+checkAutoEvents: fn()
+检测自动事件
+
+checkLvUp: fn()
+检查升级事件
+
+closeDoor: fn(x: number, y: number, id: string, callback?: fn())
+关门,目标点必须为空地
+例如:core.closeDoor(0, 0, 'yellowWall', core.jumpHero); // 在左上角关掉一堵黄墙,然后主角原地跳跃半秒
+x: 横坐标
+y: 纵坐标
+id: 门的id,也可以用三种基础墙
+callback: 门完全关上后的回调函数,可选
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
+
+confirmRestart: fn()
+询问是否需要重新开始
doAction: fn(keepUI?: true)
执行下一个事件指令,常作为回调
例如:core.setCurtain([0,0,0,1], undefined, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果
keepUI: true表示不清除UI画布和选择光标
-openBook: fn(fromUserAction?: bool)
-点击怪物手册时的打开操作
+doEvent: fn(data?: ?, x?: number, y?: number, prefix?: string)
+执行一个自定义事件
-save: fn(fromUserAction?: bool)
-点击存档按钮时的打开操作
+doSystemEvent: fn(type: string, data?: ?, callback?: fn())
+执行一个系统事件
-load: fn(fromUserAction?: bool)
-点击读档按钮时的打开操作
+eventMoveHero: fn(steps: [step], time?: number, callback?: fn())
+强制移动主角(包括后退),这个函数的作者已经看不懂这个函数了
+例如:core.eventMoveHero(['forward'], 125, core.jumpHero); // 主角强制前进一步,用时1/8秒,然后主角原地跳跃半秒
+steps: 步伐数组,注意后退时跟随者的行为会很难看
+time: 每步的用时,单位为毫秒。0或不填则取主角的移速,如果后者也不存在就取0.1秒
+callback: 移动完毕后的回调函数,可选
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
+
+flyTo: fn(toId?: string, callback?: fn()) -> bool
+飞往某一层
+
+follow: fn(name: string)
+跟随
+name: 要跟随的一个合法的4x4的行走图名称,需要在全塔属性注册
+
+gameOver: fn(ending?: string, fromReplay?: bool, norank?: bool)
+游戏结束
+例如:core.gameOver(); // 游戏失败
+ending: 结局名,省略表示失败
+fromReplay: true表示在播放录像,可选
+norank: true表示不计入榜单,可选
+
+getCommonEvent: fn(name: string) -> [?]
+获得一个公共事件
+
+getItem: fn(id: string, num?: number, x?: number, y?: number, callback?: fn())
+获得道具并提示,如果填写了坐标就会删除该点的该道具
+例如:core.getItem('book'); // 获得敌人手册并提示
+id: 道具id,必填
+num: 获得的数量,不填视为1,填了就别填坐标了
+x: 道具的横坐标,可选
+y: 道具的纵坐标,可选
+callback: 回调函数,可选
getNextItem: fn(noRoute?: bool)
轻按获得面前的物品或周围唯一物品
@@ -924,68 +949,24 @@ noRoute: 若为true则不计入录像
hasAsync: fn() -> bool
当前是否有未处理完毕的异步事件
-openEquipbox: fn(fromUserAction?: bool)
-点击装备栏时的打开操作
+hasVisitedFloor: fn(floorId?: string) -> bool
+是否到达过某个楼层
-recoverEvents: fn(data?: ?)
-恢复一个事件
-
-setGlobalFlag: fn(name: string, value: bool)
-设置一个系统开关
-例如:core.setGlobalFlag('steelDoorWithoutKey', true); // 使全塔的所有铁门都不再需要钥匙就能打开
-name: 系统开关的英文名
-value: 开关的新值,您可以用!core.flags[name]简单地表示将此开关反转
-
-moveImage: fn(code: number, to?: [number], opacityVal?: number, time?: number, callback?: fn())
-移动一张图片并/或改变其透明度
-例如:core.moveImage(1, null, 0.5); // 1秒内把1号图片变为50%透明
+hideImage: fn(code: number, time?: number, callback?: fn())
+隐藏一张图片
+例如:core.hideImage(1, 1000, core.jumpHero); // 1秒内淡出1号图片,然后主角原地跳跃半秒
code: 图片编号
-to: 新的左上角坐标,省略表示原地改变透明度
-opacityVal: 新的透明度,省略表示不变
-time: 移动用时,单位为毫秒。不填视为1秒
-callback: 图片移动完毕后的回调函数,可选
+time: 淡出时间,单位为毫秒
+callback: 图片完全消失后的回调函数,可选
-openSettings: fn(fromUserAction?: bool)
-点击设置按钮时的操作
-
-afterPushBox: fn()
-推箱子后的事件
-
-unregisterSystemEvent: fn(type: string)
-注销一个系统事件
-
-trigger: fn(x?: number, y?: number, callback?: fn())
-触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等
-callback: 执行完毕的回调函数
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-
-restart: fn()
-重新开始游戏;此函数将回到标题页面
-
-doEvent: fn(data?: ?, x?: number, y?: number, prefix?: string)
-执行一个自定义事件
-
-win: fn(reason?: string, norank?: bool, noexit?: bool)
-游戏获胜事件
-
-setGlobalAttribute: fn(name: string, value: string)
-设置全塔属性
-
-openToolbox: fn(fromUserAction?: bool)
-点击工具栏时的打开操作
-
-setVolume: fn(value: number, time?: number, callback?: fn())
-调节bgm的音量
-例如:core.setVolume(0, 100, core.jumpHero); // 0.1秒内淡出bgm,然后主角原地跳跃半秒
-value: 新的音量,为0或不大于1的正数。注意系统设置中是这个值的平方根的十倍
-time: 渐变用时,单位为毫秒。不填或小于100毫秒都视为0
-callback: 渐变完成后的回调函数,可选
-
-pushEventLoc: fn(x?: number, y?: number, floorId?: string) -> bool
-将当前点坐标入栈
-
-openKeyBoard: fn(fromUserAction?: bool)
-点击虚拟键盘时的打开操作
+insertAction: fn(action: string|?|[?], x?: number, y?: number, callback?: fn(), addToLast?: bool)
+插入一段事件;此项不可插入公共事件,请用 core.insertCommonEvent
+例如:core.insertAction('一段文字'); // 插入一个显示文章
+action: 单个事件指令,或事件指令数组
+x: 新的当前点横坐标,可选
+y: 新的当前点纵坐标,可选
+callback: 新的回调函数,可选
+addToLast: 插入的位置,true表示插入到末尾,否则插入到开头
insertCommonEvent: fn(name?: string, args?: [?], x?: number, y?: number, callback?: fn(), addToLast?: bool)
插入一个公共事件
@@ -997,30 +978,145 @@ y: 新的当前点纵坐标,可选
callback: 新的回调函数,可选
addToLast: 插入的位置,true表示插入到末尾,否则插入到开头
-hideImage: fn(code: number, time?: number, callback?: fn())
-隐藏一张图片
-例如:core.hideImage(1, 1000, core.jumpHero); // 1秒内淡出1号图片,然后主角原地跳跃半秒
-code: 图片编号
-time: 淡出时间,单位为毫秒
-callback: 图片完全消失后的回调函数,可选
+jumpHero: fn(ex?: number, ey?: number, time?: number, callback?: fn())
+主角跳跃,跳跃勇士。ex和ey为目标点的坐标,可以为null表示原地跳跃。time为总跳跃时间。
+例如:core.jumpHero(); // 主角原地跳跃半秒
+ex: 跳跃后的横坐标
+ey: 跳跃后的纵坐标
+time: 跳跃时长,单位为毫秒。不填视为半秒
+callback: 跳跃完毕后的回调函数,可选
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-visitFloor: fn(floorId?: string)
-到达某楼层
+load: fn(fromUserAction?: bool)
+点击读档按钮时的打开操作
+
+lose: fn(reason?: string)
+游戏失败事件
+
+moveImage: fn(code: number, to?: [number], opacityVal?: number, time?: number, callback?: fn())
+移动一张图片并/或改变其透明度
+例如:core.moveImage(1, null, 0.5); // 1秒内把1号图片变为50%透明
+code: 图片编号
+to: 新的左上角坐标,省略表示原地改变透明度
+opacityVal: 新的透明度,省略表示不变
+time: 移动用时,单位为毫秒。不填视为1秒
+callback: 图片移动完毕后的回调函数,可选
+
+onSki: fn(number?: number) -> bool
+当前是否在冰上
+
+openBook: fn(fromUserAction?: bool)
+点击怪物手册时的打开操作
+
+openDoor: fn(x: number, y: number, needKey?: bool, callback?: fn())
+开门(包括三种基础墙)
+例如:core.openDoor(0, 0, true, core.jumpHero); // 打开左上角的门,需要钥匙,然后主角原地跳跃半秒
+x: 门的横坐标
+y: 门的纵坐标
+needKey: true表示需要钥匙,会导致机关门打不开
+callback: 门完全打开后或打不开时的回调函数,可选
+【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
+
+openEquipbox: fn(fromUserAction?: bool)
+点击装备栏时的打开操作
+
+openKeyBoard: fn(fromUserAction?: bool)
+点击虚拟键盘时的打开操作
openQuickShop: fn(fromUserAction?: bool)
点击快捷商店按钮时的打开操作
-afterBattle: fn(enemyId?: string, x?: number, y?: number)
-战斗结束后触发的事件
+openSettings: fn(fromUserAction?: bool)
+点击设置按钮时的操作
+
+openToolbox: fn(fromUserAction?: bool)
+点击工具栏时的打开操作
+
+popEventLoc: fn()
+将当前点坐标入栈
+
+precompile: fn(data?: ?)
+预编辑事件
pushBox: fn(data?: ?)
推箱子
-autoEventExecuted: fn(symbol?: string, value?: ?) -> bool
-当前是否执行过某个自动事件
+pushEventLoc: fn(x?: number, y?: number, floorId?: string) -> bool
+将当前点坐标入栈
-onSki: fn(number?: number) -> bool
-当前是否在冰上
+recoverEvents: fn(data?: ?)
+恢复一个事件
+
+registerEvent: fn(type: string, func: fn(data: ?, x?: number, y?: number, prefix?: string))
+注册一个自定义事件
+type: 事件类型
+func: 事件的处理函数,可接受(data, x, y, prefix)参数
+data为事件内容,x和y为当前点坐标(可为null),prefix为当前点前缀
+
+registerSystemEvent: fn(type: string, func: fn(data?: ?, callback?: fn()))
+注册一个系统事件
+type: 事件名
+func: 为事件的处理函数,可接受(data,callback)参数
+
+resetGame: fn(hero?: ?, hard?: ?, floorId?: string, maps?: ?, values?: ?)
+初始化游戏
+
+restart: fn()
+重新开始游戏;此函数将回到标题页面
+
+save: fn(fromUserAction?: bool)
+点击存档按钮时的打开操作
+
+setEnemy: fn(id: string, name: string, value: ?, prefix?: string)
+设置一项敌人属性并计入存档
+例如:core.setEnemy('greenSlime', 'def', 0); // 把绿头怪的防御设为0
+id: 敌人id
+name: 属性的英文缩写
+value: 属性的新值,可选
+prefix: 独立开关前缀,一般不需要,下同
+
+setEvents: fn(list?: [?], x?: number, y?: number, callback?: fn())
+直接设置事件列表
+
+setFloorInfo: fn(name: string, values: ?, floorId?: string, prefix?: string)
+设置一项楼层属性并刷新状态栏
+例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果
+name: 要修改的属性名
+values: 属性的新值。
+floorId: 楼层id,不填视为当前层
+prefix: 独立开关前缀,一般不需要
+
+setGlobalAttribute: fn(name: string, value: string)
+设置全塔属性
+
+setGlobalFlag: fn(name: string, value: bool)
+设置一个系统开关
+例如:core.setGlobalFlag('steelDoorWithoutKey', true); // 使全塔的所有铁门都不再需要钥匙就能打开
+name: 系统开关的英文名
+value: 开关的新值,您可以用!core.flags[name]简单地表示将此开关反转
+
+setHeroIcon: fn(name: string, noDraw?: bool)
+更改主角行走图
+例如:core.setHeroIcon('npc48.png', true); // 把主角从阳光变成样板0层左下角的小姐姐,但不立即刷新
+name: 新的行走图文件名,可以是全塔属性中映射前的中文名。映射后会被存入core.status.hero.image
+noDraw: true表示不立即刷新(刷新会导致大地图下视野重置到以主角为中心)
+
+setValue: fn(name: string, operator: string, value: ?, prefix?: string)
+数值操作
+
+setVolume: fn(value: number, time?: number, callback?: fn())
+调节bgm的音量
+例如:core.setVolume(0, 100, core.jumpHero); // 0.1秒内淡出bgm,然后主角原地跳跃半秒
+value: 新的音量,为0或不大于1的正数。注意系统设置中是这个值的平方根的十倍
+time: 渐变用时,单位为毫秒。不填或小于100毫秒都视为0
+callback: 渐变完成后的回调函数,可选
+
+showGif: fn(name?: string, x?: number, y?: number)
+绘制一张动图或擦除所有动图
+例如:core.showGif(); // 擦除所有动图
+name: 动图文件名,可以是全塔属性中映射前的中文名
+x: 动图在视野中的左上角横坐标
+y: 动图在视野中的左上角纵坐标
showImage: fn(code: number, image: string|image, sloc?: [number], loc?: [number], opacityVal?: number, time?: number, callback?: fn())
显示一张图片
@@ -1033,19 +1129,8 @@ opacityVal: 不透明度,为小于1的正数。不填视为1
time: 淡入时间,单位为毫秒。不填视为0
callback: 图片完全显示出来后的回调函数,可选
-getItem: fn(id: string, num?: number, x?: number, y?: number, callback?: fn())
-获得道具并提示,如果填写了坐标就会删除该点的该道具
-例如:core.getItem('book'); // 获得敌人手册并提示
-id: 道具id,必填
-num: 获得的数量,不填视为1,填了就别填坐标了
-x: 道具的横坐标,可选
-y: 道具的纵坐标,可选
-callback: 回调函数,可选
-
-registerSystemEvent: fn(type: string, func: fn(data?: ?, callback?: fn()))
-注册一个系统事件
-type: 事件名
-func: 为事件的处理函数,可接受(data,callback)参数
+startEvents: fn(list?: [?], x?: number, y?: number, callback?: fn())
+开始执行一系列自定义事件
startGame: fn(hard: string, seed: number, route: string, callback?: fn())
开始新游戏
@@ -1055,130 +1140,258 @@ seed: 随机种子,相同的种子保证了录像的可重复性
route: 经由base64压缩后的录像,用于从头开始的录像回放
callback: 回调函数,可选
-doSystemEvent: fn(type: string, data?: ?, callback?: fn())
-执行一个系统事件
-
-resetGame: fn(hero?: ?, hard?: ?, floorId?: string, maps?: ?, values?: ?)
-初始化游戏
-
-setFloorInfo: fn(name: string, values: ?, floorId?: string, prefix?: string)
-设置一项楼层属性并刷新状态栏
-例如:core.setFloorInfo('ratio', 2, 'MT0'); // 把主塔0层的血瓶和宝石变为双倍效果
-name: 要修改的属性名
-values: 属性的新值。
-floorId: 楼层id,不填视为当前层
-prefix: 独立开关前缀,一般不需要
-
-openDoor: fn(x: number, y: number, needKey?: bool, callback?: fn())
-开门(包括三种基础墙)
-例如:core.openDoor(0, 0, true, core.jumpHero); // 打开左上角的门,需要钥匙,然后主角原地跳跃半秒
-x: 门的横坐标
-y: 门的纵坐标
-needKey: true表示需要钥匙,会导致机关门打不开
-callback: 门完全打开后或打不开时的回调函数,可选
+trigger: fn(x?: number, y?: number, callback?: fn())
+触发(x,y)点的系统事件;会执行该点图块的script属性,同时支持战斗(会触发战后)、道具(会触发道具后)、楼层切换等等
+callback: 执行完毕的回调函数
【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-setEnemy: fn(id: string, name: string, value: ?, prefix?: string)
-设置一项敌人属性并计入存档
-例如:core.setEnemy('greenSlime', 'def', 0); // 把绿头怪的防御设为0
-id: 敌人id
-name: 属性的英文缩写
-value: 属性的新值,可选
-prefix: 独立开关前缀,一般不需要,下同
-
-autoEventExecuting: fn(symbol?: string, value?: ?) -> bool
-当前是否在执行某个自动事件
-
-checkAutoEvents: fn()
-检测自动事件
-
-showGif: fn(name?: string, x?: number, y?: number)
-绘制一张动图或擦除所有动图
-例如:core.showGif(); // 擦除所有动图
-name: 动图文件名,可以是全塔属性中映射前的中文名
-x: 动图在视野中的左上角横坐标
-y: 动图在视野中的左上角纵坐标
-
-unregisterEvent: fn(type: string)
-注销一个自定义事件
-
-jumpHero: fn(ex?: number, ey?: number, time?: number, callback?: fn())
-主角跳跃,跳跃勇士。ex和ey为目标点的坐标,可以为null表示原地跳跃。time为总跳跃时间。
-例如:core.jumpHero(); // 主角原地跳跃半秒
-ex: 跳跃后的横坐标
-ey: 跳跃后的纵坐标
-time: 跳跃时长,单位为毫秒。不填视为半秒
-callback: 跳跃完毕后的回调函数,可选
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-
-closeDoor: fn(x: number, y: number, id: string, callback?: fn())
-关门,目标点必须为空地
-例如:core.closeDoor(0, 0, 'yellowWall', core.jumpHero); // 在左上角关掉一堵黄墙,然后主角原地跳跃半秒
-x: 横坐标
-y: 纵坐标
-id: 门的id,也可以用三种基础墙
-callback: 门完全关上后的回调函数,可选
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-
-eventMoveHero: fn(steps: [step], time?: number, callback?: fn())
-强制移动主角(包括后退),这个函数的作者已经看不懂这个函数了
-例如:core.eventMoveHero(['forward'], 125, core.jumpHero); // 主角强制前进一步,用时1/8秒,然后主角原地跳跃半秒
-steps: 步伐数组,注意后退时跟随者的行为会很难看
-time: 每步的用时,单位为毫秒。0或不填则取主角的移速,如果后者也不存在就取0.1秒
-callback: 移动完毕后的回调函数,可选
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-
-changeFloor: fn(floorId: string, stair?: string, heroLoc?: {x?: number, y?: number, direction?: string}, time?: number, callback?: fn())
-场景切换
-例如:core.changeFloor('MT0'); // 传送到主塔0层,主角坐标和朝向不变,黑屏时间取用户定义的值
-floorId: 传送的目标地图id,可以填':before'和':after'分别表示楼下或楼上
-stair: 传送的位置
-heroLoc: 传送的坐标;会覆盖stair
-time: 传送的黑屏时间,单位为毫秒;不填为用户设置值
-callback: 传送的回调函数
-【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】
-
-getCommonEvent: fn(name: string) -> [?]
-获得一个公共事件
-
-lose: fn(reason?: string)
-游戏失败事件
-
-gameOver: fn(ending?: string, fromReplay?: bool, norank?: bool)
-游戏结束
-例如:core.gameOver(); // 游戏失败
-ending: 结局名,省略表示失败
-fromReplay: true表示在播放录像,可选
-norank: true表示不计入榜单,可选
-
-useFly: fn(fromUserAction?: bool)
-点击楼层传送器时的打开操作
-
tryUseItem: fn(itemId: string)
尝试使用一个道具
例如:core.tryUseItem('pickaxe'); // 尝试使用破墙镐
itemId: 道具id,其中敌人手册、传送器和飞行器会被特殊处理
+
+unfollow: fn(name?: string)
+取消跟随
+name: 取消跟随的行走图,不填则取消全部跟随者
+
+unregisterEvent: fn(type: string)
+注销一个自定义事件
+
+unregisterSystemEvent: fn(type: string)
+注销一个系统事件
+
+useFly: fn(fromUserAction?: bool)
+点击楼层传送器时的打开操作
+
+vibrate: fn(time?: number, callback?: fn())
+视野左右抖动
+例如:core.vibrate(); // 视野左右抖动1秒
+time: 抖动时长,单位为毫秒。必须为半秒的倍数,不填或小于1秒都视为1秒
+callback: 抖动平息后的回调函数,可选
+
+visitFloor: fn(floorId?: string)
+到达某楼层
+
+win: fn(reason?: string, norank?: bool, noexit?: bool)
+游戏获胜事件
```
-## map.js
+## icons.js
-maps.js负责一切和地图相关的处理内容,包括如下几个方面: 插件编写中内置了一些常用的插件。
-- 地图的初始化,保存和读取,地图数组的生成
-- 是否可移动或瞬间移动的判定
-- 地图的绘制
-- 获得某个点的图块信息
-- 启用和禁用图块,改变图块
-- 移动/跳跃图块,淡入淡出图块
+图标信息
+
+```text
+getAllIconIds: fn() -> [string]
+获得所有图标的ID
+
+getClsFromId: fn(id?: string) -> string
+根据ID获得其图标类型
+
+getIcons: fn()
+获得所有图标类型
+
+getTilesetOffset: fn(id?: string) -> {image: ?, x: number, y: number}
+根据图块数字或ID获得所在的tileset和坐标信息
+```
+
+## items.js
+
+道具相关的函数
+
+```text
+addItem: fn(itemId: string, itemNum?: number)
+静默增减某种道具的持有量 不会更新游戏画面或是显示提示
+例如:core.addItem('yellowKey', -2) // 没收两把黄钥匙
+itemId: 道具id
+itemNum: 增加量,负数表示没收
+
+canEquip: fn(equipId: string, hint?: bool) -> bool
+检查能否穿上某件装备
+例如:core.canEquip('sword5', true) // 主角可以装备神圣剑吗,如果不能会有提示
+equipId: 装备id
+hint: 无法穿上时是否提示(比如是因为未持有还是别的什么原因)
+返回值:true表示可以穿上,false表示无法穿上
+
+canUseItem: fn(itemId: string) -> bool
+检查能否使用某种道具
+例如:core.canUseItem('pickaxe') // 能否使用破墙镐
+itemId: 道具id
+返回值:true表示可以使用
+
+compareEquipment: fn(compareEquipId: string, beComparedEquipId: string) -> {value: ?, percentage: ?}
+比较两件(类型可不同)装备的优劣
+例如:core.compareEquipment('sword5', 'shield5') // 比较神圣剑和神圣盾的优劣
+compareEquipId: 装备甲的id
+beComparedEquipId: 装备乙的id
+返回值:两装备的各属性差,甲减乙,0省略
+
+getEquip: fn(equipType: number) -> string
+检查主角某种类型的装备目前是什么
+例如:core.getEquip(1) // 主角目前装备了什么盾牌
+equipType: 装备类型,自然数
+返回值:装备id,null表示未穿戴
+
+getEquipTypeById: fn(equipId: string) -> number
+判定某件装备的类型
+例如:core.getEquipTypeById('shield5') // 1(盾牌)
+equipId: 装备id
+返回值:类型编号,自然数
+
+getEquipTypeByName: fn(name?: string)
+根据类型获得一个可用的装备孔
+
+getItemEffect: fn(itemId: string, itemNum?: number)
+即捡即用类的道具获得时的效果
+例如:core.getItemEffect('redPotion', 10) // 执行获得10瓶红血的效果
+itemId: 道具id
+itemNum: 道具数量,可选,默认为1
+
+getItemEffectTip: fn(itemId: string) -> string
+即捡即用类的道具获得时的额外提示
+例如:core.getItemEffectTip(redPotion) // (获得 红血瓶)',生命+100'
+itemId: 道具id
+返回值:图块属性itemEffectTip的内容
+
+getItems: fn()
+获得所有道具
+
+hasEquip: fn(itemId: string) -> bool
+检查主角是否穿戴着某件装备
+例如:core.hasEquip('sword5') // 主角是否装备了神圣剑
+itemId: 装备id
+返回值:true表示已装备
+
+hasItem: fn(itemId: string) -> bool
+检查主角是否持有某种道具(不包括已穿戴的装备)
+例如:core.hasItem('yellowKey') // 主角是否持有黄钥匙
+itemId: 道具id
+返回值:true表示持有
+
+itemCount: fn(itemId: string) -> number
+统计某种道具的持有量
+例如:core.itemCount('yellowKey') // 持有多少把黄钥匙
+itemId: 道具id
+返回值:该种道具的持有量,不包括已穿戴的装备
+
+loadEquip: fn(equipId: string, callback?: fn())
+尝试穿上某件背包里面的装备并提示
+例如:core.loadEquip('sword5') // 尝试装备上背包里面的神圣剑,无回调
+equipId: 装备id
+callback: 穿戴成功或失败后的回调函数
+
+quickLoadEquip: fn(index: number)
+快速换装
+例如:core.quickLoadEquip(1) // 快速换上1号套装
+index: 套装编号,自然数
+
+quickSaveEquip: fn(index: number)
+保存当前套装
+例如:core.quickSaveEquip(1) // 将当前套装保存为1号套装
+index: 套装编号,自然数
+
+removeItem: fn(itemId?: string, itemNum?: number)
+删除某个物品
+
+setItem: fn(itemId: string, itemNum?: number)
+设置某种道具的持有量
+例如:core.setItem('yellowKey', 3) // 设置黄钥匙为3把
+itemId: 道具id
+itemNum: 新的持有量,可选,自然数,默认为0
+
+unloadEquip: fn(equipType: number, callback?: fn())
+脱下某个类型的装备
+例如:core.unloadEquip(1) // 卸下盾牌,无回调
+equipType: 装备类型编号,自然数
+callback: 卸下装备后的回调函数
+
+useItem: fn(itemId: string, noRoute?: bool, callback?: fn())
+使用一个道具
+例如:core.useItem('pickaxe', true) // 使用破墙镐,不计入录像,无回调
+itemId: 道具id
+noRoute: 是否不计入录像,快捷键使用的请填true,否则可省略
+callback: 道具使用完毕或使用失败后的回调函数
+```
+
+## loader.js
+
+资源加载相关的函数
+
+```text
+freeBgm: fn(name: string)
+释放一个bgm的缓存
+
+loadBgm: fn(name: string)
+加载一个bgm
+
+loadImage: fn(dir: name, imgName: name, callback?: fn())
+加载某一张图片
+
+loadImages: fn(dir: string, names: [string], toSave: ?, callback?: fn())
+加载一系列图片
+
+loadImagesFromZip: fn(url: string, names: [string], toSave?: ?, onprogress?: ?, onfinished?: ?)
+从zip中加载一系列图片
+
+loadOneMusic: fn(name: string)
+加载一个音乐或音效
+
+loadOneSound: fn(name: string)
+加载一个音效
+```
+
+## maps.js
+
+负责一切和地图相关的处理内容,包括如下几个方面:
+- 地图的初始化,保存和读取,地图数组的生成
+- 是否可移动或瞬间移动的判定
+- 地图的绘制
+- 获得某个点的图块信息
+- 启用和禁用图块,改变图块
+- 移动/跳跃图块,淡入淡出图块
- 全局动画控制,动画的绘制
```text
-noPass: fn(x: number, y: number, floorId?: string) -> bool
-判定某个点是否不可被踏入(不基于主角生命值和图块cannotIn属性)
-例如:core.noPass(0, 0); // 判断地图左上角能否被踏入
-x: 目标点的横坐标
-y: 目标点的纵坐标
-floorId: 目标点所在的地图id,不填视为当前地图
-返回值:true表示可踏入
+addGlobalAnimate: fn(block?: block)
+添加一个全局动画
+
+animateBlock: fn(loc?: [number]|[[number]], type?: string, time?: number, callback?: fn())
+显示/隐藏某个块时的动画效果
+
+animateSetBlock: fn(number: number|string, x: number, y: number, floorId?: string, time?: number, callback?: fn())
+动画形式转变某点图块
+
+animateSetBlocks: fn(number: number|string, locs: [?], floorId?: string, time?: number, callback?: fn())
+动画形式同时转变若干点图块
+
+automaticRoute: fn(destX: number, destY: number) -> [{x: number, y: number, direction: string}]
+自动寻路
+例如:core.automaticRoute(0, 0); // 自动寻路到地图左上角
+destX: 目标点的横坐标
+destY: 目标点的纵坐标
+返回值:每步走完后主角的loc属性组成的一维数组
+
+canMoveDirectly: fn(destX: number, destY: number) -> number
+能否瞬移到某点,并求出节约的步数。
+例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角
+destX: 目标点的横坐标
+destY: 目标点的纵坐标
+返回值:正数表示节约的步数,-1表示不可瞬移
+
+canMoveDirectlyArray: fn(locs?: [[number]])
+获得某些点可否通行的信息
+
+canMoveHero: fn(x?: number, y?: number, direction?: string, floorId?: string) -> bool
+单点单朝向的可通行性判定;受各图层cannotInOut、起点cannotMove和canGoDeadZone影响,不受canPass和noPass影响
+x: 起点横坐标,不填视为主角当前的
+y: 起点纵坐标,不填视为主角当前的
+direction: 移动的方向,不填视为主角面对的方向
+floorId: 地图id,不填视为当前地图
+
+compressMap: fn(mapArr: [[number]], floorId?: string) -> [[number]]
+压缩地图
+
+decompressMap: fn(mapArr: [[number]], floorId?: string) -> [[number]]
+解压缩地图
drawAnimate: fn(name: string, x: number, y: number, alignWindow: bool, callback?: fn()) -> number
播放动画,注意即使指定了主角的坐标也不会跟随主角移动,如有需要请使用core.drawHeroAnimate(name, callback)函数
@@ -1190,16 +1403,91 @@ alignWindow: 是否是相对窗口的坐标
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)
+drawBg: fn(floorId?: string, ctx?: CanvasRenderingContext2D)
+绘制背景层(含贴图,其与背景层矩阵的绘制顺序可通过复写此函数来改变)
+例如:core.drawBg(); // 绘制当前地图的背景层
+floorId: 地图id,不填视为当前地图
+ctx: 某画布的ctx,用于绘制缩略图,一般不需要
+
+drawBlock: fn(block?: block, animate?: number)
+绘制一个图块
+
+drawBoxAnimate: fn()
+绘制UI层的box动画
+
+drawEvents: fn(floorId?: string, blocks?: [block], ctx?: CanvasRenderingContext2D)
+绘制事件层
+例如:core.drawEvents(); // 绘制当前地图的事件层
+floorId: 地图id,不填视为当前地图
+blocks: 一般不需要
+ctx: 某画布的ctx,用于绘制缩略图,一般不需要
+
+drawFg: fn(floorId?: string, ctx?: CanvasRenderingContext2D)
+绘制前景层(含贴图,其与前景层矩阵的绘制顺序可通过复写此函数来改变)
+例如:core.drawFg(); // 绘制当前地图的前景层
+floorId: 地图id,不填视为当前地图
+ctx: 某画布的ctx,用于绘制缩略图,一般不需要
+
drawHeroAnimate: fn(name: string, callback?: fn()) -> number
播放跟随勇士的动画
name: 动画名
callback: 动画停止后的回调函数,可选
返回值:一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数)
-stopAnimate: fn(id: number, doCallback?: bool)
-立刻停止一个动画播放
-id: 播放动画的编号,即drawAnimate或drawHeroAnimate的返回值
-doCallback: 是否执行该动画的回调函数
+drawMap: fn(floorId?: string)
+地图重绘
+例如:core.drawMap(); // 重绘当前地图,常用于更改贴图或改变自动元件后的刷新
+floorId: 地图id,可省略表示当前楼层
+callback: 重绘完毕后的回调函数,可选
+
+drawThumbnail: fn(floorId?: string, blocks?: [block], options?: ?)
+绘制缩略图
+例如:core.drawThumbnail(); // 绘制当前地图的缩略图
+floorId: 地图id,不填视为当前地图
+blocks: 一般不需要
+options: 绘制信息,可选。可以增绘主角位置和朝向、采用不同于游戏中的主角行走图、增绘显伤、提供flags用于存读档,同时包含要绘制到的画布名或画布的ctx或还有其他信息,如起绘坐标、绘制大小、是否绘制全图、截取中心
+
+enemyExists: fn(x: number, y: number, id?: string, floorId?: string) -> bool
+某个点是否存在(指定的)怪物
+
+extractBlocks: fn(map?: ?)
+根据需求解析出blocks
+
+extractBlocksForUI: fn(map?: ?, flags?: ?)
+根据需求为UI解析出blocks
+
+generateGroundPattern: fn(floorId?: string)
+生成groundPattern
+
+generateMovableArray: fn(floorId?: string) -> [[[string]]]
+可通行性判定
+例如:core.generateMovableArray(); // 判断当前地图主角从各点能向何方向移动
+floorId: 地图id,不填视为当前地图
+返回值:从各点可移动方向的三维数组
+
+getBgMapArray: fn(floorId?: string, noCache?: bool) -> [[number]]
+生成背景层矩阵
+例如:core.getBgMapArray('MT0'); // 生成主塔0层的背景层矩阵,使用缓存
+floorId: 地图id,不填视为当前地图
+noCache: 可选,true表示不使用缓存
+返回值:背景层矩阵,注意对其阵元的访问是[y][x]
+
+getBgNumber: fn(x?: number, y?: number, floorId?: string, noCache?: bool) -> number
+判定某点的背景层的数字
+例如:core.getBgNumber(); // 判断主角脚下的背景层图块的数字
+x: 横坐标,不填为勇士坐标
+y: 纵坐标,不填为勇士坐标
+floorId: 地图id,不填视为当前地图
+noCache: 可选,true表示不使用缓存而强制重算
+
+getBlock: fn(x: number, y: number, floorId?: string, showDisable?: bool) -> block
+获得某个点的block
+
+getBlockById: fn(id: string) -> block
+根据ID获得图块
+
+getBlockByNumber: fn(number: number) -> block
+根据数字获得图块
getBlockCls: fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string
判定某个点的图块类型
@@ -1210,17 +1498,42 @@ floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否不返回null,true表示不返回null
返回值:图块类型,即“地形、四帧动画、矮敌人、高敌人、道具、矮npc、高npc、自动元件、额外地形”之一
-drawMap: fn(floorId?: string)
-地图重绘
-例如:core.drawMap(); // 重绘当前地图,常用于更改贴图或改变自动元件后的刷新
-floorId: 地图id,可省略表示当前楼层
-callback: 重绘完毕后的回调函数,可选
+getBlockId: fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string
+判定某个点的图块id
+例如:if(core.getBlockId(x1, y1) != 'greenSlime' && core.getBlockId(x2, y2) != 'redSlime') core.openDoor(x3, y3); // 一个简单的机关门事件,打败或炸掉这一对绿头怪和红头怪就开门
+x: 横坐标
+y: 纵坐标
+floorId: 地图id,不填视为当前地图
+showDisable: 隐藏点是否不返回null,true表示不返回null
+返回值:图块id,该点无图块则返回null
-nearStair: fn() -> bool
-当前位置是否在楼梯边;在楼传平面塔模式下对箭头也有效
+getBlockInfo: fn(block?: number|string|block) -> blockInfo
+获得某个图块或素材的信息,包括ID,cls,图片,坐标,faceIds等等
-turnBlock: fn(direction?: string, x?: number, y?: number, floorId?: string)
-事件转向
+getBlockNumber: fn(x: number, y: number, floorId?: string, showDisable?: bool) -> number
+判定某个点的图块数字
+x: 横坐标
+y: 纵坐标
+floorId: 地图id,不填视为当前地图
+showDisable: 隐藏点是否不返回null,true表示不返回null
+返回值:图块数字,该点无图块则返回null
+
+getFgMapArray: fn(floorId?: string, noCache?: bool) -> [[number]]
+生成前景层矩阵
+例如:core.getFgMapArray('MT0'); // 生成主塔0层的前景层矩阵,使用缓存
+floorId: 地图id,不填视为当前地图
+noCache: 可选,true表示不使用缓存
+返回值:前景层矩阵,注意对其阵元的访问是[y][x]
+
+getFgNumber: fn(x: number, y: number, floorId?: string, noCache?: bool) -> number
+判定某点的前景层的数字
+例如:core.getFgNumber(); // 判断主角脚下的前景层图块的数字
+x: 横坐标,不填为勇士坐标
+y: 纵坐标,不填为勇士坐标floorId: 地图id,不填视为当前地图
+noCache: 可选,true表示不使用缓存而强制重算
+
+getIdOfThis: fn(id?: string) -> string
+获得当前事件点的ID
getMapArray: fn(floorId?: string, noCache?: bool) -> [[number]]
生成事件层矩阵
@@ -1229,9 +1542,43 @@ floorId: 地图id,不填视为当前地图
showDisable: 可选,true表示隐藏的图块也会被表示出来
返回值:事件层矩阵,注意对其阵元的访问是[y][x]
+getMapBlocksObj: fn(floorId?: string, noCache?: bool)
+以x,y的形式返回每个点的事件
+
getMapNumber: fn(x: number, y: number, floorId?: string, noCache?: bool) -> number
获得事件层某个点的数字
+getNumberById: fn(id: string) -> number
+根据图块id得到数字(地图矩阵中的值)
+例如:core.getNumberById('yellowWall'); // 1
+id: 图块id
+返回值:图块的数字,定义在project\maps.js(请注意和project\icons.js中的“图块索引”相区分!)
+
+hideBgFgMap: fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())
+隐藏前景/背景地图
+
+hideBlock: fn(x: number, y: number, floorId?: string)
+隐藏一个图块,对应于「隐藏事件」且不删除
+例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块
+x: 横坐标
+y: 纵坐标
+floorId: 地图id,不填视为当前地图
+
+hideBlockByIndex: fn(index?: number, floorId?: string)
+根据图块的索引来隐藏图块
+
+hideBlockByIndexes: fn(indexes?: [number], floorId?: string)
+一次性隐藏多个block
+
+hideFloorImage: fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())
+隐藏一个楼层贴图
+
+initBlock: fn(x: number, y: number, id: string|number, addInfo?: bool, eventFloor?: ?) -> block
+初始化一个图块
+
+isMapBlockDisabled: fn(floorId?: string, x?: number, y?: number, flags?: ?) -> bool
+某个点图块是否被强制启用或禁用
+
jumpBlock: fn(sx: number, sy: number, ex: number, ey: number, time?: number, keep?: bool, callback?: fn())
跳跃图块;从V2.7开始不再有音效
例如:core.jumpBlock(0, 0, 0, 0); // 令地图左上角的图块原地跳跃半秒,再花半秒淡出
@@ -1243,82 +1590,11 @@ time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 落地或淡出后的回调函数,可选
-replaceBlock: fn(fromNumber: number, toNumber: number, floorId?: string|[string])
-批量替换图块
-例如:core.replaceBlock(21, 22, core.floorIds); // 把游戏中地上当前所有的黄钥匙都变成蓝钥匙
-fromNumber: 旧图块的数字
-toNumber: 新图块的数字
-floorId: 地图id或其数组,不填视为当前地图
+loadFloor: fn(floorId?: string, map?: ?)
+从文件或存档中加载某个楼层
-drawBlock: fn(block?: block, animate?: number)
-绘制一个图块
-
-resetMap: fn(floorId?: string|[string])
-重置地图
-
-animateSetBlock: fn(number: number|string, x: number, y: number, floorId?: string, time?: number, callback?: fn())
-动画形式转变某点图块
-
-animateSetBlocks: fn(number: number|string, locs: [?], floorId?: string, time?: number, callback?: fn())
-动画形式同时转变若干点图块
-
-compressMap: fn(mapArr: [[number]], floorId?: string) -> [[number]]
-压缩地图
-
-enemyExists: fn(x: number, y: number, id?: string, floorId?: string) -> bool
-某个点是否存在(指定的)怪物
-
-npcExists: fn(x: number, y: number, floorId?: string) -> bool
-某个点是否存在NPC
-
-getBlockByNumber: fn(number: number) -> block
-根据数字获得图块
-
-removeBlock: fn(x: number, y: number, floorId?: string)
-删除一个图块,对应于「隐藏事件」并同时删除
-例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块
-x: 横坐标
-y: 纵坐标
-floorId: 地图id,不填视为当前地图
-
-hideBlock: fn(x: number, y: number, floorId?: string)
-隐藏一个图块,对应于「隐藏事件」且不删除
-例如:core.hideBlock(0, 0); // 隐藏地图左上角的图块
-x: 横坐标
-y: 纵坐标
-floorId: 地图id,不填视为当前地图
-
-removeBlockByIndex: fn(index: number, floorId?: string)
-根据block的索引删除该块
-
-stairExists: fn(x: number, y: number, floorId?: string) -> bool
-某个点是否存在楼梯
-
-isMapBlockDisabled: fn(floorId?: string, x?: number, y?: number, flags?: ?) -> bool
-某个点图块是否被强制启用或禁用
-
-setMapBlockDisabled: fn(floorId?: string, x?: number, y?: number, disabled?: bool)
-设置某个点图块的强制启用或禁用状态
-
-decompressMap: fn(mapArr: [[number]], floorId?: string) -> [[number]]
-解压缩地图
-
-automaticRoute: fn(destX: number, destY: number) -> [{x: number, y: number, direction: string}]
-自动寻路
-例如:core.automaticRoute(0, 0); // 自动寻路到地图左上角
-destX: 目标点的横坐标
-destY: 目标点的纵坐标
-返回值:每步走完后主角的loc属性组成的一维数组
-
-resizeMap: fn(floorId?: string)
-更改地图画布的尺寸
-
-getFgNumber: fn(x: number, y: number, floorId?: string, noCache?: bool) -> number
-判定某点的前景层的数字
-例如:core.getFgNumber(); // 判断主角脚下的前景层图块的数字
-x: 横坐标,不填为勇士坐标
-y: 纵坐标,不填为勇士坐标floorId: 地图id,不填视为当前地图
-noCache: 可选,true表示不使用缓存而强制重算
+loadMap: fn(data?: ?, floorId?: string)
+将存档中的地图信息重新读取出来
moveBlock: fn(x: number, y: number, steps: [string], time?: number, keep?: bool, callback?: fn())
移动图块
@@ -1330,16 +1606,51 @@ time: 单步和淡出用时,单位为毫秒。不填视为半秒
keep: 是否不淡出,true表示不淡出
callback: 移动或淡出后的回调函数,可选
-getBgNumber: fn(x?: number, y?: number, floorId?: string, noCache?: bool) -> number
-判定某点的背景层的数字
-例如:core.getBgNumber(); // 判断主角脚下的背景层图块的数字
-x: 横坐标,不填为勇士坐标
-y: 纵坐标,不填为勇士坐标
-floorId: 地图id,不填视为当前地图
-noCache: 可选,true表示不使用缓存而强制重算
+nearStair: fn() -> bool
+当前位置是否在楼梯边;在楼传平面塔模式下对箭头也有效
-getIdOfThis: fn(id?: string) -> string
-获得当前事件点的ID
+noPass: fn(x: number, y: number, floorId?: string) -> bool
+判定某个点是否不可被踏入(不基于主角生命值和图块cannotIn属性)
+例如:core.noPass(0, 0); // 判断地图左上角能否被踏入
+x: 目标点的横坐标
+y: 目标点的纵坐标
+floorId: 目标点所在的地图id,不填视为当前地图
+返回值:true表示可踏入
+
+npcExists: fn(x: number, y: number, floorId?: string) -> bool
+某个点是否存在NPC
+
+removeBlock: fn(x: number, y: number, floorId?: string)
+删除一个图块,对应于「隐藏事件」并同时删除
+例如:core.removeBlock(0, 0); // 尝试删除地图左上角的图块
+x: 横坐标
+y: 纵坐标
+floorId: 地图id,不填视为当前地图
+
+removeBlockByIndex: fn(index: number, floorId?: string)
+根据block的索引删除该块
+
+removeBlockByIndexes: fn(indexes?: [number], floorId?: string)
+一次性删除多个block
+
+removeGlobalAnimate: fn(x?: number, y?: number, name?: string)
+删除一个或所有全局动画
+
+replaceBlock: fn(fromNumber: number, toNumber: number, floorId?: string|[string])
+批量替换图块
+例如:core.replaceBlock(21, 22, core.floorIds); // 把游戏中地上当前所有的黄钥匙都变成蓝钥匙
+fromNumber: 旧图块的数字
+toNumber: 新图块的数字
+floorId: 地图id或其数组,不填视为当前地图
+
+resetMap: fn(floorId?: string|[string])
+重置地图
+
+resizeMap: fn(floorId?: string)
+更改地图画布的尺寸
+
+saveMap: fn(floorId?: string)
+将当前地图重新变成数字,以便于存档
searchBlock: fn(id: string, floorId?: string, showDisable?: bool) -> [{floorId: string, index: number, x: number, y: number, block: block}]
搜索图块, 支持通配符和正则表达式
@@ -1349,95 +1660,6 @@ floorId: 地图id,不填视为当前地图
showDisable: 隐藏点是否计入,true表示计入
返回值:一个详尽的数组,一般只用到其长度
-hideBgFgMap: fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())
-隐藏前景/背景地图
-
-getBlockInfo: fn(block?: number|string|block) -> blockInfo
-获得某个图块或素材的信息,包括ID,cls,图片,坐标,faceIds等等
-
-canMoveDirectlyArray: fn(locs?: [[number]])
-获得某些点可否通行的信息
-
-hideFloorImage: fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())
-隐藏一个楼层贴图
-
-extractBlocks: fn(map?: ?)
-根据需求解析出blocks
-
-extractBlocksForUI: fn(map?: ?, flags?: flags)
-根据需求为UI解析出blocks
-
-getBlockId: fn(x: number, y: number, floorId?: string, showDisable?: bool) -> string
-判定某个点的图块id
-例如:if(core.getBlockId(x1, y1) != 'greenSlime' && core.getBlockId(x2, y2) != 'redSlime') core.openDoor(x3, y3); // 一个简单的机关门事件,打败或炸掉这一对绿头怪和红头怪就开门
-x: 横坐标
-y: 纵坐标
-floorId: 地图id,不填视为当前地图
-showDisable: 隐藏点是否不返回null,true表示不返回null
-返回值:图块id,该点无图块则返回null
-
-getBlockNumber: fn(x: number, y: number, floorId?: string, showDisable?: bool) -> number
-判定某个点的图块数字
-x: 横坐标
-y: 纵坐标
-floorId: 地图id,不填视为当前地图
-showDisable: 隐藏点是否不返回null,true表示不返回null
-返回值:图块数字,该点无图块则返回null
-
-loadFloor: fn(floorId?: string, map?: ?)
-从文件或存档中加载某个楼层
-
-generateMovableArray: fn(floorId?: string)
-可通行性判定
-例如:core.generateMovableArray(); // 判断当前地图主角从各点能向何方向移动
-floorId: 地图id,不填视为当前地图
-返回值:从各点可移动方向的三维数组
-
-terrainExists: fn(x: number, y: number, id?: string, floorId?: string) -> bool
-某个点是否存在(指定的)地形
-
-getBlockById: fn(id: string) -> block
-根据ID获得图块
-
-drawBg: fn(floorId?: string, ctx?: CanvasRenderingContext2D)
-绘制背景层(含贴图,其与背景层矩阵的绘制顺序可通过复写此函数来改变)
-例如:core.drawBg(); // 绘制当前地图的背景层
-floorId: 地图id,不填视为当前地图
-ctx: 某画布的ctx,用于绘制缩略图,一般不需要
-
-showBlock: fn(x: number, y: number, floorId?: string)
-显示(隐藏或显示的)图块,此函数将被“显示事件”指令和勾选了“不消失”的“移动/跳跃事件”指令(如阻击怪)的终点调用
-例如:core.showBlock(0, 0); // 显示地图左上角的图块
-x: 横坐标
-y: 纵坐标
-floorId: 地图id,不填视为当前地图
-
-getMapBlocksObj: fn(floorId?: string, noCache?: bool)
-以x,y的形式返回每个点的事件
-
-removeGlobalAnimate: fn(x?: number, y?: number, name?: string)
-删除一个或所有全局动画
-
-drawEvents: fn(floorId?: string, blocks?: [block], ctx?: CanvasRenderingContext2D)
-绘制事件层
-例如:core.drawEvents(); // 绘制当前地图的事件层
-floorId: 地图id,不填视为当前地图
-blocks: 一般不需要
-ctx: 某画布的ctx,用于绘制缩略图,一般不需要
-
-canMoveDirectly: fn(destX: number, destY: number) -> number
-能否瞬移到某点,并求出节约的步数。
-例如:core.canMoveDirectly(0, 0); // 能否瞬移到地图左上角
-destX: 目标点的横坐标
-destY: 目标点的纵坐标
-返回值:正数表示节约的步数,-1表示不可瞬移
-
-saveMap: fn(floorId?: string)
-将当前地图重新变成数字,以便于存档
-
-drawBoxAnimate: fn()
-绘制UI层的box动画
-
setBgFgBlock: fn(name: string, number: number|string, x: number, y: number, floorId?: string)
转变图层块
例如:core.setBgFgBlock('bg', 167, 6, 6); // 把当前地图背景层的中心块改为滑冰
@@ -1447,27 +1669,6 @@ x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
-drawFg: fn(floorId?: string, ctx?: CanvasRenderingContext2D)
-绘制前景层(含贴图,其与前景层矩阵的绘制顺序可通过复写此函数来改变)
-例如:core.drawFg(); // 绘制当前地图的前景层
-floorId: 地图id,不填视为当前地图
-ctx: 某画布的ctx,用于绘制缩略图,一般不需要
-
-getBlock: fn(x: number, y: number, floorId?: string, showDisable?: bool) -> block: block
-获得某个点的block
-
-initBlock: fn(x: number, y: number, id: string|number, addInfo?: bool, eventFloor?: ?) -> block
-初始化一个图块
-
-addGlobalAnimate: fn(block?: block)
-添加一个全局动画
-
-animateBlock: fn(loc?: [number]|[[number]], type?: string, time?: number, callback?: fn())
-显示/隐藏某个块时的动画效果
-
-loadMap: fn(data?: ?, floorId?: string)
-将存档中的地图信息重新读取出来
-
setBlock: fn(number: number|string, x: number, y: number, floorId?: string)
转变图块
例如:core.setBlock(1, 0, 0); // 把地图左上角变成黄墙
@@ -1476,266 +1677,48 @@ x: 横坐标
y: 纵坐标
floorId: 地图id,不填视为当前地图
-getFgMapArray: fn(floorId?: string, noCache?: bool) -> [[number]]
-生成前景层矩阵
-例如:core.getFgMapArray('MT0'); // 生成主塔0层的前景层矩阵,使用缓存
-floorId: 地图id,不填视为当前地图
-noCache: 可选,true表示不使用缓存
-返回值:前景层矩阵,注意对其阵元的访问是[y][x]
-
-getBgMapArray: fn(floorId?: string, noCache?: bool) -> [[number]]
-生成背景层矩阵
-例如:core.getBgMapArray('MT0'); // 生成主塔0层的背景层矩阵,使用缓存
-floorId: 地图id,不填视为当前地图
-noCache: 可选,true表示不使用缓存
-返回值:背景层矩阵,注意对其阵元的访问是[y][x]
-
-canMoveHero: fn(x?: number, y?: number, direction?: string, floorId?: string) -> bool
-单点单朝向的可通行性判定;受各图层cannotInOut、起点cannotMove和canGoDeadZone影响,不受canPass和noPass影响
-x: 起点横坐标,不填视为主角当前的
-y: 起点纵坐标,不填视为主角当前的
-direction: 移动的方向,不填视为主角面对的方向
-floorId: 地图id,不填视为当前地图
-
-drawThumbnail: fn(floorId?: string, blocks?: [block], options?: ?)
-绘制缩略图
-例如:core.drawThumbnail(); // 绘制当前地图的缩略图
-floorId: 地图id,不填视为当前地图
-blocks: 一般不需要
-options: 额外的绘制项,可选。可以增绘主角位置和朝向、采用不同于游戏中的主角行走图、增绘显伤、提供flags用于存读档
-
-hideBlockByIndex: fn(index?: number, floorId?: string)
-根据图块的索引来隐藏图块
-
-getNumberById: fn(id: string) -> number
-根据图块id得到数字(地图矩阵中的值)
-例如:core.getNumberById('yellowWall'); // 1
-id: 图块id
-返回值:图块的数字,定义在project\maps.js(请注意和project\icons.js中的“图块索引”相区分!)
-
-removeBlockByIndexes: fn(indexes?: [number], floorId?: string)
-一次性删除多个block
-
-hideBlockByIndexes: fn(indexes?: [number], floorId?: string)
-一次性隐藏多个block
-
-generateGroundPattern: fn(floorId?: string)
-生成groundPattern
+setMapBlockDisabled: fn(floorId?: string, x?: number, y?: number, disabled?: bool)
+设置某个点图块的强制启用或禁用状态
showBgFgMap: fn(name?: string, loc?: [number]|[[number]], floorId?: string, callback?: fn())
显示前景/背景地图
+showBlock: fn(x: number, y: number, floorId?: string)
+显示(隐藏或显示的)图块,此函数将被“显示事件”指令和勾选了“不消失”的“移动/跳跃事件”指令(如阻击怪)的终点调用
+例如:core.showBlock(0, 0); // 显示地图左上角的图块
+x: 横坐标
+y: 纵坐标
+floorId: 地图id,不填视为当前地图
+
showFloorImage: fn(loc?: [number]|[[number]], floorId?: string, callback?: fn())
显示一个楼层贴图
+
+stairExists: fn(x: number, y: number, floorId?: string) -> bool
+某个点是否存在楼梯
+
+stopAnimate: fn(id: number, doCallback?: bool)
+立刻停止一个动画播放
+id: 播放动画的编号,即drawAnimate或drawHeroAnimate的返回值
+doCallback: 是否执行该动画的回调函数
+
+terrainExists: fn(x: number, y: number, id?: string, floorId?: string) -> bool
+某个点是否存在(指定的)地形
+
+turnBlock: fn(direction?: string, x?: number, y?: number, floorId?: string)
+事件转向
```
## ui.js
-ui.js负责一切UI界面的绘制。主要包括三个部分:
-- 设置某个画布的属性的相关API
+负责一切UI界面的绘制。主要包括三个部分:
+- 设置某个画布的属性与在某个画布上绘制的相关API
- 具体的某个UI界面的绘制
- 动态创建画布相关的API
```text
-resizeCanvas: fn(name: string, x: number, y: number)
-重新设置一个自定义画布的大小
-
-deleteCanvas: fn(name: string)
-删除一个自定义画布
-
-drawSLPanel: fn(index?: ?, refresh?: bool)
-绘制存档/读档界面
-
-drawKeyBoard: fn()
-绘制虚拟键盘
-
-drawStorageRemove: fn()
-绘制存档删除页面
-
-deleteAllCanvas: fn()
-清空所有的自定义画布
-
-drawIcon: fn(name: string|CanvasRenderingContext2D, id: string, x: number, y: number, w?: number, h?: number, frame?: number)
-在某个canvas上绘制一个图标
-
-drawFly: fn(page?: ?)
-绘制楼层传送器
-
-setOpacity: fn(name: string|CanvasRenderingContext2D, opacity: number)
-设置某个canvas整体的透明度;此函数直接改变画布本身,对已经绘制的内容也生效
-如果仅想对接下来的绘制生效请使用setAlpha
-
-drawAbout: fn()
-绘制“关于”界面
-
-getTextContentHeight: fn(content: string, config?: ?)
-获得某段文字的预计绘制高度;参数说明详见 drawTextContent
-
-drawSwitchs: fn()
-绘制系统设置界面
-
-drawSyncSelect: fn()
-绘制存档同步选择页面
-
-drawArrow: fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)
-在某个canvas上绘制一个箭头
-
-drawReplay: fn()
-绘制回放界面
-
-strokeEllipse: fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string, lineWidth?: number)
-在某个canvas上绘制一个椭圆的边框
-
-fillCircle: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, style?: string)
-在某个canvas上绘制一个圆
-参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
-
-clearTip: fn()
-清除左上角提示内容
-
-strokeRoundRect: fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, lineWidth?: number, angle?: number)
-在某个canvas上绘制一个圆角矩形的边框
-
-getContextByName: fn(canvas: string|CanvasRenderingContext2D) -> CanvasRenderingContext2D
-根据画布名找到一个画布的context;支持系统画布和自定义画布。如果不存在画布返回null。
-也可以传画布的context自身,则返回自己。
-
-drawImage: fn(name: string|CanvasRenderingContext2D, image: string|image, x: number, y: number, w?: number, h?: number, x1?: number, y1?: number, w1?: number, h1?: number, angle?: number)
-在一个画布上绘制图片
-后面的8个坐标参数与canvas的drawImage的八个参数完全相同。
-name: 可以是系统画布之一,也可以是任意自定义动态创建的画布名 画布名称或者画布的context
-image: 要绘制的图片,可以是一个全塔属性中定义的图片名(会从images中去获取;支持加':x',':y',':o'翻转),图片本身,或者一个画布。
-angle:旋转角度
-参考资料:http://www.w3school.com.cn/html5/canvas_drawimage.asp
-
-drawTip: fn(text: string, id?: string, frame?: number)
-左上角绘制一段提示
-text: 要提示的字符串,支持${}语法
-id: 要绘制的图标ID
-frame: 要绘制该图标的第几帧
-
-drawBackground: fn(left: string, top: string, right: string, bottom: string, posInfo?: {px: number, py: number, direction: string})
-绘制一个背景图,可绘制winskin或纯色背景;支持小箭头绘制
-
-fillEllipse: fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string)
-在某个canvas上绘制一个椭圆
-
-setFillStyle: fn(name: string|CanvasRenderingContext2D, style: string)
-设置某个canvas的绘制属性(如颜色等)
-参考资料:https://www.w3school.com.cn/tags/canvas_fillstyle.asp
-
-drawText: fn(contents: string, callback?: fn())
-地图中间绘制一段文字
-
-drawConfirmBox: fn(text: string, yesCallback?: fn(), noCallback?: fn())
-绘制一个确认框
-此项会打断事件流,如需不打断版本的请使用core.myconfirm()
-text: 要绘制的内容,支持 ${} 语法
-yesCallback: 点击确认后的回调
-noCallback: 点击取消后的回调
-
-fillPolygon: fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string)
-在某个canvas上绘制一个多边形
-
-drawStatistics: fn(floorIds?: string)
-绘制“数据统计”界面
-
-fillText: fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, font?: string, maxWidth?: number)
-在某个画布上绘制一段文字
-text: 要绘制的文本
-style: 绘制的样式
-font: 绘制的字体
-最大宽度,超过此宽度会自动放缩
-参考资料:https://www.w3school.com.cn/tags/canvas_filltext.asp
-
-setTextBaseline: fn(name: string|CanvasRenderingContext2D, baseline: string)
-设置某个canvas的基准线
-baseline: 可为alphabetic, top, hanging, middle, ideographic, bottom
-参考资料:https://www.w3school.com.cn/tags/canvas_textbaseline.asp
-
-drawSettings: fn()
-绘制系统菜单栏
-
-loadCanvas: fn(name: string|CanvasRenderingContext2D)
-加载某个canvas状态
-
-splitLines: fn(name: string|CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string)
-字符串自动换行的分割;具有标点禁则功能
-
-setAlpha: fn(name: string|CanvasRenderingContext2D, alpha: number)
-设置某个canvas接下来绘制的不透明度;不会影响已经绘制的内容
-如果需要修改画布本身的不透明度请使用setOpacity
-参考资料:https://www.w3school.com.cn/tags/canvas_globalalpha.asp
-
-setLineWidth: fn(name: string|CanvasRenderingContext2D, lineWidth: number)
-设置某个canvas的线宽度
-参考资料:https://www.w3school.com.cn/tags/canvas_linewidth.asp
-
-drawEquipbox: fn(index?: ?)
-绘制装备界面
-
-drawTextBox: fn(content: string, showAll?: bool)
-绘制一个对话框
-
-relocateCanvas: fn(name: string, x: number, y: number)
-重新定位一个自定义画布
-
-closePanel: fn()
-结束一切事件和绘制,关闭UI窗口,返回游戏进程
-
-textImage: fn(content: string, lineHeight?: number) -> image
-文本图片化
-
-drawStatusBar: fn()
-绘制状态栏
-
-setStrokeStyle: fn(name: string|CanvasRenderingContext2D, style: string)
-设置某个canvas边框属性
-参考资料:https://www.w3school.com.cn/tags/canvas_strokestyle.asp
-
-clearUI: fn()
-清空UI层内容
-
-drawWindowSkin: fn(background: string, ctx: string|CanvasRenderingContext2D, x: number, y: number, w: string, h: string, direction?: string, px?: number, py?: number)
-绘制WindowSkin
-
-drawGameInfo: fn()
-绘制游戏信息界面
-
-fillRect: fn(name: string|CanvasRenderingContext2D, string, x: number, y: number, width: number, height: number, style?: string, angle?: number)
-绘制一个矩形。style可选为绘制样式
-text: 要绘制的文本
-x,y: 绘制的坐标
-width,height: 绘制的长宽
-style: 绘制的样式
-angle: 旋转的角度,弧度制,如Math.PI/2代表90度
-参考资料:https://www.w3school.com.cn/tags/canvas_fillrect.asp
-
-drawScrollText: fn(content: string, time: number, lineHeight?: number, callback?: fn())
-绘制滚动字幕
-
-strokePolygon: fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string, lineWidth?: number)
-在某个canvas上绘制一个多边形的边框
-
-strokeCircle: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: ?, style?: string, lineWidth?: number)
-在某个canvas上绘制一个圆的边框
-参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
-
-drawLocalSaveSelect: fn()
-绘制单存档界面
-
-drawWaiting: fn(text: string)
-绘制等待界面
-
-setFont: fn(name: string|CanvasRenderingContext2D, font: string)
-设置某个canvas的文字字体
-参考资料:https://www.w3school.com.cn/tags/canvas_font.asp
-
-drawChoices: fn(content?: string, choices?: [?])
-绘制一个选项界面
-
-setFontForMaxWidth: fn(name: string|CanvasRenderingContext2D, text: string, maxWidth: number, font?: ?) -> string
-根据最大宽度自动缩小字体
+calWidth: fn(name: string|CanvasRenderingContext2D, text: string, font?: string) -> number
+计算某段文字的宽度
+参考资料:https://www.w3school.com.cn/tags/canvas_measuretext.asp
clearMap: fn(name: string|CanvasRenderingContext2D, x?: number, y?: number, width?: number, height?: number)
清空某个画布图层
@@ -1743,80 +1726,14 @@ name为画布名,可以是系统画布之一,也可以是任意自定义动
如果name也可以是'all',若为all则为清空所有系统画布。
参考资料:https://www.w3school.com.cn/tags/canvas_clearrect.asp
-drawTextContent: fn(ctx: string|CanvasRenderingContext2D, content: string, config: ?)
-绘制一段文字到某个画布上面
-ctx: 要绘制到的画布
-content: 要绘制的内容;转义字符不允许保留 \t, \b 和 \f
-config: 绘制配置项,目前暂时包含如下内容(均为可选)
-left, top:起始点位置;maxWidth:单行最大宽度;color:默认颜色;align:左中右
-fontSize:字体大小;lineHeight:行高;time:打字机间隔;font:默认字体
-返回值:绘制信息
+clearTip: fn()
+清除左上角提示内容
-calWidth: fn(name: string|CanvasRenderingContext2D, text: string, font?: string) -> number
-计算某段文字的宽度
-参考资料:https://www.w3school.com.cn/tags/canvas_measuretext.asp
+clearUI: fn()
+清空UI层内容
-fillArc: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string)
-在某个canvas上绘制一个扇形
-参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
-
-drawWindowSelector: fn(background: ?, x: number, y: number, w: number, h: number)
-绘制选择光标
-
-strokeArc: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string, lineWidth?: number)
-在某个canvas上绘制一段弧
-参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
-
-drawLine: fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)
-在某个canvas上绘制一条线
-参考资料:https://www.w3school.com.cn/tags/canvas_lineto.asp
-
-drawPagination: fn(page?: ?, totalPage?: ?, y?: number)
-绘制分页
-
-drawBookDetail: fn(index?: ?)
-绘制怪物属性的详细信息
-
-drawToolbox: fn(index?: ?)
-绘制道具栏
-
-drawHelp: fn()
-绘制帮助页面
-
-drawQuickShop: fn()
-绘制快捷商店选择栏
-
-drawCenterFly: fn()
-绘制中心对称飞行器
-
-strokeRect: fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, lineWidth?: number, angle?: number)
-绘制一个矩形的边框
-style: 绘制的样式
-lineWidth: 线宽
-angle: 旋转角度,弧度制,如Math.PI/2为90度
-参考资料:https://www.w3school.com.cn/tags/canvas_strokerect.asp
-
-drawBook: fn(index?: ?)
-绘制怪物手册
-
-fillRoundRect: fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, angle?: number)
-在某个canvas上绘制一个圆角矩形
-
-fillBoldText: fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, strokeStyle?: string, font?: string)
-在某个画布上绘制一个描边文字
-text: 要绘制的文本
-style: 绘制的样式
-strokeStyle: 要绘制的描边颜色
-font: 绘制的字体
-
-drawSyncSave: fn()
-绘制存档同步界面
-
-saveCanvas: fn(name: string|CanvasRenderingContext2D)
-保存某个canvas状态
-
-drawCursor: fn()
-绘制键盘光标
+closePanel: fn()
+结束一切事件和绘制,关闭UI窗口,返回游戏进程
createCanvas: fn(name: string, x: number, y: number, width: number, height: number, zIndex: number) -> CanvasRenderingContext2D
动态创建一个画布。
@@ -1826,19 +1743,305 @@ width,height: 创建的长宽。
zIndex: 创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。
返回创建的画布的context,也可以通过core.dymCanvas[name]调用。
+deleteAllCanvas: fn()
+清空所有的自定义画布
+
+deleteCanvas: fn(name: string)
+删除一个自定义画布
+
+drawAbout: fn()
+绘制“关于”界面
+
+drawArrow: fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)
+在某个canvas上绘制一个箭头
+
+drawBackground: fn(left: string, top: string, right: string, bottom: string, posInfo?: {px: number, py: number, direction: string})
+绘制一个背景图,可绘制winskin或纯色背景;支持小箭头绘制
+
+drawBook: fn(index?: ?)
+绘制怪物手册
+
+drawBookDetail: fn(index?: ?)
+绘制怪物属性的详细信息
+
+drawCenterFly: fn()
+绘制中心对称飞行器
+
+drawChoices: fn(content?: string, choices?: [?])
+绘制一个选项界面
+
+drawConfirmBox: fn(text: string, yesCallback?: fn(), noCallback?: fn())
+绘制一个确认框
+此项会打断事件流,如需不打断版本的请使用core.myconfirm()
+text: 要绘制的内容,支持 ${} 语法
+yesCallback: 点击确认后的回调
+noCallback: 点击取消后的回调
+
+drawCursor: fn()
+绘制键盘光标
+
+drawEquipbox: fn(index?: ?)
+绘制装备界面
+
+drawFly: fn(page?: ?)
+绘制楼层传送器
+
+drawGameInfo: fn()
+绘制游戏信息界面
+
+drawHelp: fn()
+绘制帮助页面
+
+drawIcon: fn(name: string|CanvasRenderingContext2D, id: string, x: number, y: number, w?: number, h?: number, frame?: number)
+在某个canvas上绘制一个图标
+
+drawImage: fn(name: string|CanvasRenderingContext2D, image: string|image, x: number, y: number, w?: number, h?: number, x1?: number, y1?: number, w1?: number, h1?: number, angle?: number)
+在一个画布上绘制图片
+后面的8个坐标参数与canvas的drawImage的八个参数完全相同。
+name: 可以是系统画布之一,也可以是任意自定义动态创建的画布名 画布名称或者画布的context
+image: 要绘制的图片,可以是一个全塔属性中定义的图片名(会从images中去获取;支持加':x',':y',':o'翻转),图片本身,或者一个画布。
+angle:旋转角度
+参考资料:http://www.w3school.com.cn/html5/canvas_drawimage.asp
+
+drawKeyBoard: fn()
+绘制虚拟键盘
+
+drawLine: fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)
+在某个canvas上绘制一条线
+参考资料:https://www.w3school.com.cn/tags/canvas_lineto.asp
+
+drawLocalSaveSelect: fn()
+绘制单存档界面
+
+drawMaps: fn(index?: ?, x?: number, y?: number)
+绘制浏览地图界面
+
+drawNotes: fn()
+绘制存档笔记
+
+drawPagination: fn(page?: ?, totalPage?: ?, y?: number)
+绘制分页
+
+drawQuickShop: fn()
+绘制快捷商店选择栏
+
+drawReplay: fn()
+绘制回放界面
+
+drawSLPanel: fn(index?: ?, refresh?: bool)
+绘制存档/读档界面
+
+drawScrollText: fn(content: string, time: number, lineHeight?: number, callback?: fn())
+绘制滚动字幕
+
+drawSettings: fn()
+绘制系统菜单栏
+
+drawStatistics: fn(floorIds?: string)
+绘制“数据统计”界面
+
+drawStatusBar: fn()
+绘制状态栏
+
+drawStorageRemove: fn()
+绘制存档删除页面
+
+drawSwitchs: fn()
+绘制系统设置界面
+
+drawSyncSave: fn()
+绘制存档同步界面
+
+drawSyncSelect: fn()
+绘制存档同步选择页面
+
+drawText: fn(contents: string, callback?: fn())
+地图中间绘制一段文字
+
+drawTextBox: fn(content: string, showAll?: bool)
+绘制一个对话框
+
+drawTextContent: fn(ctx: string|CanvasRenderingContext2D, content: string, config: ?)
+绘制一段文字到某个画布上面
+ctx: 要绘制到的画布
+content: 要绘制的内容;转义字符不允许保留 \t, \b 和 \f
+config: 绘制配置项,目前暂时包含如下内容(均为可选)
+left, top:起始点位置;maxWidth:单行最大宽度;color:默认颜色;align:左中右
+fontSize:字体大小;lineHeight:行高;time:打字机间隔;font:字体名
+返回值:绘制信息
+
+drawTip: fn(text: string, id?: string, frame?: number)
+左上角绘制一段提示
+text: 要提示的字符串,支持${}语法
+id: 要绘制的图标ID
+frame: 要绘制该图标的第几帧
+
+drawToolbox: fn(index?: ?)
+绘制道具栏
+
+drawWaiting: fn(text: string)
+绘制等待界面
+
+drawWindowSelector: fn(background: ?, x: number, y: number, w: number, h: number)
+绘制选择光标
+
+drawWindowSkin: fn(background: string, ctx: string|CanvasRenderingContext2D, x: number, y: number, w: string, h: string, direction?: string, px?: number, py?: number)
+绘制WindowSkin
+
+fillArc: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string)
+在某个canvas上绘制一个扇形
+参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
+
+fillBoldText: fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, strokeStyle?: string, font?: string)
+在某个画布上绘制一个描边文字
+text: 要绘制的文本
+style: 绘制的样式
+strokeStyle: 要绘制的描边颜色
+font: 绘制的字体
+
+fillCircle: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, style?: string)
+在某个canvas上绘制一个圆
+参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
+
+fillEllipse: fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string)
+在某个canvas上绘制一个椭圆
+
+fillPolygon: fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string)
+在某个canvas上绘制一个多边形
+
+fillRect: fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, angle?: number)
+绘制一个矩形。
+x,y: 绘制的坐标
+width,height: 绘制的长宽
+style: 绘制的样式
+angle: 旋转的角度,弧度制,如Math.PI/2代表90度
+参考资料:https://www.w3school.com.cn/tags/canvas_fillrect.asp
+
+fillRoundRect: fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, angle?: number)
+在某个canvas上绘制一个圆角矩形
+
+fillText: fn(name: string|CanvasRenderingContext2D, text: string, x: number, y: number, style?: string, font?: string, maxWidth?: number)
+在某个画布上绘制一段文字
+text: 要绘制的文本
+style: 绘制的样式
+font: 绘制的字体
+最大宽度,超过此宽度会自动放缩
+参考资料:https://www.w3school.com.cn/tags/canvas_filltext.asp
+
+getContextByName: fn(canvas: string|CanvasRenderingContext2D) -> CanvasRenderingContext2D
+根据画布名找到一个画布的context;支持系统画布和自定义画布。如果不存在画布返回null。
+也可以传画布的context自身,则返回自己。
+
+getTextContentHeight: fn(content: string, config?: ?)
+获得某段文字的预计绘制高度;参数说明详见 drawTextContent
+
+getToolboxItems: fn(cls: string) -> [string]
+获得所有应该在道具栏显示的某个类型道具
+
+loadCanvas: fn(name: string|CanvasRenderingContext2D)
+加载某个canvas状态
+
+relocateCanvas: fn(name: string, x: number, y: number)
+重新定位一个自定义画布
+
+resizeCanvas: fn(name: string, x: number, y: number)
+重新设置一个自定义画布的大小
+
+saveCanvas: fn(name: string|CanvasRenderingContext2D)
+保存某个canvas状态
+
+setAlpha: fn(name: string|CanvasRenderingContext2D, alpha: number)
+设置某个canvas接下来绘制的不透明度;不会影响已经绘制的内容
+如果需要修改画布本身的不透明度请使用setOpacity
+参考资料:https://www.w3school.com.cn/tags/canvas_globalalpha.asp
+
+setFillStyle: fn(name: string|CanvasRenderingContext2D, style: string)
+设置某个canvas的绘制属性(如颜色等)
+参考资料:https://www.w3school.com.cn/tags/canvas_fillstyle.asp
+
+setFont: fn(name: string|CanvasRenderingContext2D, font: string)
+设置某个canvas的文字字体
+参考资料:https://www.w3school.com.cn/tags/canvas_font.asp
+
+setFontForMaxWidth: fn(name: string|CanvasRenderingContext2D, text: string, maxWidth: number, font?: ?) -> string
+根据最大宽度自动缩小字体
+
+setLineWidth: fn(name: string|CanvasRenderingContext2D, lineWidth: number)
+设置某个canvas的线宽度
+参考资料:https://www.w3school.com.cn/tags/canvas_linewidth.asp
+
+setOpacity: fn(name: string|CanvasRenderingContext2D, opacity: number)
+设置某个canvas整体的透明度;此函数直接改变画布本身,对已经绘制的内容也生效
+如果仅想对接下来的绘制生效请使用setAlpha
+
+setStrokeStyle: fn(name: string|CanvasRenderingContext2D, style: string)
+设置某个canvas边框属性
+参考资料:https://www.w3school.com.cn/tags/canvas_strokestyle.asp
+
setTextAlign: fn(name: string|CanvasRenderingContext2D, align: string)
设置某个canvas的对齐
参考资料:https://www.w3school.com.cn/tags/canvas_textalign.asp
-drawMaps: fn(index?: ?, x?: number, y?: number)
-绘制浏览地图界面
+setTextBaseline: fn(name: string|CanvasRenderingContext2D, baseline: string)
+设置某个canvas的基准线
+baseline: 可为alphabetic, top, hanging, middle, ideographic, bottom
+参考资料:https://www.w3school.com.cn/tags/canvas_textbaseline.asp
+
+splitLines: fn(name: string|CanvasRenderingContext2D, text: string, maxWidth?: number, font?: string)
+字符串自动换行的分割;具有标点禁则功能
+
+strokeArc: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: number, start: number, end: number, style?: string, lineWidth?: number)
+在某个canvas上绘制一段弧
+参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
+
+strokeCircle: fn(name: string|CanvasRenderingContext2D, x: number, y: number, r: ?, style?: string, lineWidth?: number)
+在某个canvas上绘制一个圆的边框
+参考资料:https://www.w3school.com.cn/tags/canvas_arc.asp
+
+strokeEllipse: fn(name: string|CanvasRenderingContext2D, x: number, y: number, a: number, b: number, angle?: number, style?: string, lineWidth?: number)
+在某个canvas上绘制一个椭圆的边框
+
+strokePolygon: fn(name: string|CanvasRenderingContext2D, nodes?: [[number]], style?: string, lineWidth?: number)
+在某个canvas上绘制一个多边形的边框
+
+strokeRect: fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, style?: string, lineWidth?: number, angle?: number)
+绘制一个矩形的边框
+style: 绘制的样式
+lineWidth: 线宽
+angle: 旋转角度,弧度制,如Math.PI/2为90度
+参考资料:https://www.w3school.com.cn/tags/canvas_strokerect.asp
+
+strokeRoundRect: fn(name: string|CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number, style?: string, lineWidth?: number, angle?: number)
+在某个canvas上绘制一个圆角矩形的边框
+
+textImage: fn(content: string, lineHeight?: number) -> image
+文本图片化
```
## utils.js
-utils.js是一个工具函数库,里面有各个样板中使用到的工具函数。
+工具函数库,里面有各个样板中使用到的工具函数。
```text
+arrayToRGB: fn(color: [number]) -> string
+颜色数组转字符串
+例如:core.arrayToRGB([102, 204, 255]); // "#66ccff"
+color: 一行三列的数组,必须为不大于255的自然数
+返回值:该颜色的#xxxxxx字符串表示
+
+arrayToRGBA: fn(color: [number]) -> string
+颜色数组转字符串
+例如:core.arrayToRGBA([102, 204, 255, 0.3]); // "rgba(102,204,255,0.3)"
+color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1
+返回值:该颜色的rgba(...)字符串表示
+
+calValue: fn(value: string, prefix?: string)
+计算一个表达式的值,支持status:xxx等的计算。
+例如:core.calValue('status:hp + status:def'); // 计算主角的生命值加防御力
+value: 待求值的表达式
+prefix: 独立开关前缀,一般可省略
+返回值:求出的值
+
clamp: fn(x: number, a: number, b: number) -> number
将x限定在[a,b]区间内,注意a和b可交换
例如:core.clamp(1200, 1, 1000); // 1000
@@ -1846,12 +2049,6 @@ x: 原始值,!x为true时x一律视为0
a: 下限值,大于b将导致与b交换
b: 上限值,小于a将导致与a交换
-rand: fn(num?: number) -> number
-不支持SL的随机数
-例如:1 + core.rand(6); // 随机生成一个小于7的正整数,模拟骰子的效果
-num: 填正数表示生成小于num的随机自然数,否则生成小于1的随机正数
-返回值:随机数,即使读档也不会改变结果
-
clone: fn(data?: ?, filter?: fn(name: string, value: ?) -> bool, recursion?: bool)
深拷贝一个对象(函数将原样返回)
例如:core.clone(core.status.hero, (name, value) => (name == 'items' || typeof value == 'number'), false); // 深拷贝主角的属性和道具
@@ -1864,42 +2061,23 @@ cloneArray: fn(data?: [number]|[[number]]) -> [number]|[[number]]
深拷贝一个1D或2D数组对象
例如:core.cloneArray(core.status.thisMap.map)
-setLocalForage: fn(key: string, value?: ?, successCallback?: fn(), errorCallback?: fn())
-往数据库写入一段数据
+copy: fn(data: string) -> bool
+尝试复制一段文本到剪切板。
-getGlobal: fn(key: string, defaultValue?: ?)
-读取一个全局存储,适用于global:xxx,支持录像。
-例如:if (core.getGlobal('一周目已通关', false) === true) core.getItem('dagger'); // 二周目游戏进行到此处时会获得一把屠龙匕首
-key: 全局变量名称,支持中文
-defaultValue: 可选,当此全局变量不存在或值为null、undefined时,用此值代替
-返回值:全局变量的值
+decodeBase64: fn(str: string) -> string
+base64解密
+例如:core.decodeBase64('YWJjZA=='); // "abcd"
+str: 密文
+返回值:明文
-replaceText: fn(text: string, prefix?: string) -> string
-将一段文字中的${}(表达式)进行替换。
-例如:core.replaceText('衬衫的价格是${status:hp}镑${item:yellowKey}便士。'); // 把主角的生命值和持有的黄钥匙数量代入这句话
-text: 模板字符串,可以使用${}计算js表达式,支持“状态、物品、变量、独立开关、全局存储、图块id、图块类型、敌人数据、装备id”等量参与运算
-返回值:替换完毕后的字符串
+decodeRoute: fn(route: string) -> [string]
+录像解压的最后一步,即一压的逆过程
+例如:core.decodeRoute(core.encodeRoute(core.status.route)); // 一压当前录像再解压-_-|
+route: 录像解压倒数第二步的结果,即一压的结果
+返回值:原始录像
-removeLocalStorage: fn(key: string)
-移除本地存储
-
-unzip: fn(blobOrUrl?: ?, success?: fn(data: ?), error?: fn(error: string), convertToText?: bool, onprogress?: fn(loaded: number, total: number))
-解压一段内容
-
-formatTime: fn(time: number) -> string
-格式化时间
-
-readFile: fn(success?: fn(data: string), error?: fn(message: string), readType?: bool)
-尝试请求读取一个本地文件内容 [异步]
-success: 成功后的回调
-error: 失败后的回调
-readType: 不设置则以文本读取,否则以DataUrl形式读取
-
-readFileContent: fn(content: string)
-文件读取完毕后的内容处理 [异步]
-
-formatDate: fn(date: ?) -> string
-格式化日期为字符串
+decompress: fn(value: ?)
+解压缩一个数据
download: fn(filename: string, content: string)
弹窗请求下载一个文本文件
@@ -1913,41 +2091,168 @@ base64加密
str: 明文
返回值:密文
-strlen: fn(str: string) -> number
-求字符串的国标码字节数,也可用于等宽字体下文本的宽度测算。请注意样板的默认字体Verdana不是等宽字体
-例如:core.strlen('无敌ad'); // 6
-str: 待测字符串
-返回值:字符串的国标码字节数,每个汉字为2,每个ASCII字符为1
+encodeRoute: fn(route: [string]) -> string
+录像压缩缩
+例如:core.encodeRoute(core.status.route); // 压缩当前录像
+route: 原始录像,自定义内容(不予压缩,原样写入)必须由0-9A-Za-z和下划线、冒号组成,所以中文和数组需要用JSON.stringify预处理再base64压缩才能交由一压
+返回值:一压的结果
-myprompt: fn(hint: string, value: string, callback?: fn(data?: string))
-让用户输入一段文字
+formatBigNumber: fn(x: number, onMap?: bool) -> string
+大数字格式化,单位为10000的倍数(w,e,z,j,g),末尾四舍五入
+例如:core.formatBigNumber(123456789, false); // "12346w"
+x: 原数字
+onMap: 可选,true表示用于地图显伤,结果总字符数最多为5,否则最多为6
+返回值:格式化结果
-getCookie: fn(name: string) -> string
-访问浏览器cookie
-
-decodeRoute: fn(route: string) -> [string]
-录像解压的最后一步,即一压的逆过程
-例如:core.decodeRoute(core.encodeRoute(core.status.route)); // 一压当前录像再解压-_-|
-route: 录像解压倒数第二步的结果,即一压的结果
-返回值:原始录像
+formatDate: fn(date: ?) -> string
+格式化日期为字符串
formatDate2: fn(date: ?) -> string
格式化日期为最简字符串
-unshift: fn(a: [?], b: ?) -> [?]
-将b(可以是另一个数组)插入数组a的开头,此函数用于弥补a.unshift(b)中b只能是单项的不足。
-例如:core.unshift(todo, {type: 'unfollow'}); // 在事件指令数组todo的开头插入“取消所有跟随者”指令
+formatSize: fn(size: number) -> string
+格式化文件大小
+
+formatTime: fn(time: number) -> string
+格式化时间
+
+getCookie: fn(name: string) -> string
+访问浏览器cookie
+
+getGlobal: fn(key: string, defaultValue?: ?)
+读取一个全局存储,适用于global:xxx,支持录像。
+例如:if (core.getGlobal('一周目已通关', false) === true) core.getItem('dagger'); // 二周目游戏进行到此处时会获得一把屠龙匕首
+key: 全局变量名称,支持中文
+defaultValue: 可选,当此全局变量不存在或值为null、undefined时,用此值代替
+返回值:全局变量的值
+
+getGuid: fn() -> string
+获得或生成浏览器唯一的guid
+
+getLocalForage: fn(key: string, defaultValue?: ?, successCallback?: fn(data: ?), errorCallback?: fn())
+从本地数据库读出一段数据
+
+getLocalStorage: fn(key: string, defaultValue?: ?)
+获得本地存储
+
+hideWithAnimate: fn(obj?: ?, speed?: number, callback?: fn())
+动画使某对象消失
+
+http: fn(type: string, url: string, formData: ?, success?: fn(data: string), error?: fn(message: string), mimeType?: string, responseType?: string, onprogress?: fn(loaded: number, total: number))
+发送一个HTTP请求 [异步]
+type: 请求类型,只能为GET或POST
+url: 目标地址
+formData: 如果是POST请求则为表单数据
+success: 成功后的回调
+error: 失败后的回调
+
+inArray: fn(array?: ?, element?: ?) -> bool
+判定array是不是一个数组,以及element是否在该数组中。
+array: 可能的数组,不为数组或不填将导致返回值为false
+element: 待查找的元素
+返回值:如果array为数组且具有element这项,就返回true,否则返回false
+
+isset: fn(v?: ?) -> bool
+判断一个值是否不为null,undefined和NaN
+例如:core.isset(0/0); // false,因为0/0等于NaN
+v: 待测值,可选
+返回值:false表示待测值为null、undefined、NaN或未填写,true表示为其他值。
+
+matchRegex: fn(pattern: string, string: string) -> string
+是否满足正则表达式
+
+matchWildcard: fn(pattern: string, string: string) -> bool
+通配符匹配,用于搜索图块等批量处理。
+例如:core.playSound(core.matchWildcard('*Key', itemId) ? 'item.mp3' : 'door.mp3'); // 判断捡到的是钥匙还是别的道具,从而播放不同的音效
+pattern: 模式串,每个星号表示任意多个(0个起)字符
+string: 待测串
+返回值:true表示匹配成功,false表示匹配失败
+
+myconfirm: fn(hint: string, yesCallback?: fn(), noCallback?: fn())
+显示确认框,类似core.drawConfirmBox(),但不打断事件流
+例如:core.myconfirm('重启游戏?', core.restart); // 弹窗询问玩家是否重启游戏
+hint: 弹窗的内容,支持 ${} 语法
+yesCallback: 确定后的回调函数
+noCallback: 取消后的回调函数,可选
+
+myprompt: fn(hint: string, value: string, callback?: fn(data?: string))
+让用户输入一段文字
+
+push: fn(a: [?], b: ?) -> [?]
+将b(可以是另一个数组)插入数组a的末尾,此函数用于弥补a.push(b)中b只能是单项的不足。
+例如:core.push(todo, {type: 'unfollow'}); // 在事件指令数组todo的末尾插入“取消所有跟随者”指令
a: 原数组
-b: 待插入的新首项或前缀数组
+b: 待插入的新末项或后缀数组
返回值:插入完毕后的新数组,它是改变原数组a本身得到的
+rand: fn(num?: number) -> number
+不支持SL的随机数
+例如:1 + core.rand(6); // 随机生成一个小于7的正整数,模拟骰子的效果
+num: 填正数表示生成小于num的随机自然数,否则生成小于1的随机正数
+返回值:随机数,即使读档也不会改变结果
+
+rand2: fn(num?: number) -> number
+支持SL的随机数,并计入录像
+例如:1 + core.rand2(6); // 随机生成一个小于7的正整数,模拟骰子的效果
+num: 正整数,0或不填会被视为2147483648
+返回值:属于 [0, num) 的随机数
+
+readFile: fn(success?: fn(data: string), error?: fn(message: string), readType?: bool)
+尝试请求读取一个本地文件内容 [异步]
+success: 成功后的回调
+error: 失败后的回调
+readType: 不设置则以文本读取,否则以DataUrl形式读取
+
+readFileContent: fn(content: string)
+文件读取完毕后的内容处理 [异步]
+
+removeLocalForage: fn(key: string, successCallback?: fn(), errorCallback?: fn())
+移除本地数据库的数据
+
+removeLocalStorage: fn(key: string)
+移除本地存储
+
+replaceText: fn(text: string, prefix?: string) -> string
+将一段文字中的${}(表达式)进行替换。
+例如:core.replaceText('衬衫的价格是${status:hp}镑${item:yellowKey}便士。'); // 把主角的生命值和持有的黄钥匙数量代入这句话
+text: 模板字符串,可以使用${}计算js表达式,支持“状态、物品、变量、独立开关、全局存储、图块id、图块类型、敌人数据、装备id”等量参与运算
+返回值:替换完毕后的字符串
+
+replaceValue: fn(value: string) -> string
+对一个表达式中的特殊规则进行替换,如status:xxx等。
+例如:core.replaceValue('status:atk+item:yellowKey'); // 把这两个冒号表达式替换为core.getStatus('hp')和core.itemCount('yellowKey')这样的函数调用
+value: 模板字符串,注意独立开关不会被替换
+返回值:替换完毕后的字符串
+
same: fn(a?: ?, b?: ?) -> bool
判定深层相等, 会逐层比较每个元素
例如:core.same(['1', 2], ['1', 2]); // true
+setGlobal: fn(key: string, value?: ?)
+设置一个全局存储,适用于global:xxx,录像播放时将忽略此函数。
+例如:core.setBlobal('一周目已通关', true); // 设置全局存储“一周目已通关”为true,方便二周目游戏中的新要素。
+key: 全局变量名称,支持中文
+value: 全局变量的新值,不填或null表示清除此全局存储
+
+setLocalForage: fn(key: string, value?: ?, successCallback?: fn(), errorCallback?: fn())
+往数据库写入一段数据
+
+setLocalStorage: fn(key: string, value?: ?)
+设置本地存储
+
+setStatusBarInnerHTML: fn(name: string, value: ?, css?: string)
+填写非自绘状态栏
+例如:core.setStatusBarInnerHTML('hp', core.status.hero.hp, 'color: #66CCFF'); // 更新状态栏中的主角生命,使用加载画面的宣传色
+name: 状态栏项的名称,如'hp', 'atk', 'def'等。必须是core.statusBar中的一个合法项
+value: 要填写的内容,大数字会被格式化为至多6个字符,无中文的内容会被自动设为斜体
+css: 额外的css样式,可选。如更改颜色等
+
setTwoDigits: fn(x: number) -> string
两位数显示
+showWithAnimate: fn(obj?: ?, speed?: number, callback?: fn())
+动画显示某对象
+
splitImage: fn(image?: string|image, width?: number, height?: number) -> [image]
等比例切分一张图片
例如:core.splitImage(core.material.images.images['npc48.png'], 32, 48); // 把npc48.png切分成若干32×48px的小人
@@ -1956,11 +2261,11 @@ width: 子图的宽度,单位为像素。原图总宽度必须是其倍数,
height: 子图的高度,单位为像素。原图总高度必须是其倍数,不填视为正方形
返回值:子图组成的数组,在原图中呈先行后列,从左到右、从上到下排列。
-decompress: fn(value: ?)
-解压缩一个数据
-
-showWithAnimate: fn(obj?: ?, speed?: number, callback?: fn())
-动画显示某对象
+strlen: fn(str: string) -> number
+求字符串的国标码字节数,也可用于等宽字体下文本的宽度测算。请注意样板的默认字体Verdana不是等宽字体
+例如:core.strlen('无敌ad'); // 6
+str: 待测字符串
+返回值:字符串的国标码字节数,每个汉字为2,每个ASCII字符为1
subarray: fn(a?: [?], b?: [?]) -> [?]|null
判定一个数组是否为另一个数组的前缀,用于录像接续播放。请注意函数名没有大写字母
@@ -1974,146 +2279,32 @@ turnDirection: fn(turn: string, direction?: string) -> string
turn: 转向的方向,可为 up,down,left,right,:left,:right,:back 七种
direction: 当前方向
-myconfirm: fn(hint: string, yesCallback?: fn(), noCallback?: fn())
-显示确认框,类似core.drawConfirmBox(),但不打断事件流
-例如:core.myconfirm('重启游戏?', core.restart); // 弹窗询问玩家是否重启游戏
-hint: 弹窗的内容,支持 ${} 语法
-yesCallback: 确定后的回调函数
-noCallback: 取消后的回调函数,可选
-
-calValue: fn(value: string, prefix?: string)
-计算一个表达式的值,支持status:xxx等的计算。
-例如:core.calValue('status:hp + status:def'); // 计算主角的生命值加防御力
-value: 待求值的表达式
-prefix: 独立开关前缀,一般可省略
-返回值:求出的值
-
-encodeRoute: fn(route: [string]) -> string
-录像压缩缩
-例如:core.encodeRoute(core.status.route); // 压缩当前录像
-route: 原始录像,自定义内容(不予压缩,原样写入)必须由0-9A-Za-z和下划线、冒号组成,所以中文和数组需要用JSON.stringify预处理再base64压缩才能交由一压
-返回值:一压的结果
-
-decodeBase64: fn(str: string) -> string
-base64解密
-例如:core.decodeBase64('YWJjZA=='); // "abcd"
-str: 密文
-返回值:明文
-
-http: fn(type: string, url: string, formData: ?, success?: fn(data: string), error?: fn(message: string), mimeType?: string, responseType?: string, onprogress?: fn(loaded: number, total: number))
-发送一个HTTP请求 [异步]
-type: 请求类型,只能为GET或POST
-url: 目标地址
-formData: 如果是POST请求则为表单数据
-success: 成功后的回调
-error: 失败后的回调
-
-getLocalStorage: fn(key: string, defaultValue?: ?)
-获得本地存储
-
-arrayToRGB: fn(color: [number]) -> string
-颜色数组转字符串
-例如:core.arrayToRGB([102, 204, 255]); // "#66ccff"
-color: 一行三列的数组,必须为不大于255的自然数
-返回值:该颜色的#xxxxxx字符串表示
-
-arrayToRGBA: fn(color: [number]) -> string
-颜色数组转字符串
-例如:core.arrayToRGBA([102, 204, 255, 0.3]); // "rgba(102,204,255,0.3)"
-color: 一行三列或一行四列的数组,前三个元素必须为不大于255的自然数。第四个元素(如果有)必须为0或不大于1的数字,第四个元素不填视为1
-返回值:该颜色的rgba(...)字符串表示
-
-formatBigNumber: fn(x: number, onMap?: bool) -> string
-大数字格式化,单位为10000的倍数(w,e,z,j,g),末尾四舍五入
-例如:core.formatBigNumber(123456789, false); // "12346w"
-x: 原数字
-onMap: 可选,true表示用于地图显伤,结果总字符数最多为5,否则最多为6
-返回值:格式化结果
-
-removeLocalForage: fn(key: string, successCallback?: fn(), errorCallback?: fn())
-移除本地数据库的数据
-
-matchWildcard: fn(pattern: string, string: string) -> bool
-通配符匹配,用于搜索图块等批量处理。
-例如:core.playSound(core.matchWildcard('*Key', itemId) ? 'item.mp3' : 'door.mp3'); // 判断捡到的是钥匙还是别的道具,从而播放不同的音效
-pattern: 模式串,每个星号表示任意多个(0个起)字符
-string: 待测串
-返回值:true表示匹配成功,false表示匹配失败
-
-setLocalStorage: fn(key: string, value?: ?)
-设置本地存储
-
-hideWithAnimate: fn(obj?: ?, speed?: number, callback?: fn())
-动画使某对象消失
-
-copy: fn(data: string) -> bool
-尝试复制一段文本到剪切板。
-
-isset: fn(v?: ?) -> bool
-判断一个值是否不为null,undefined和NaN
-例如:core.isset(0/0); // false,因为0/0等于NaN
-v: 待测值,可选
-返回值:false表示待测值为null、undefined、NaN或未填写,true表示为其他值。
-
-replaceValue: fn(value: string) -> string
-对一个表达式中的特殊规则进行替换,如status:xxx等。
-例如:core.replaceValue('status:atk+item:yellowKey'); // 把这两个冒号表达式替换为core.getStatus('hp')和core.itemCount('yellowKey')这样的函数调用
-value: 模板字符串,注意独立开关不会被替换
-返回值:替换完毕后的字符串
-
-getLocalForage: fn(key: string, defaultValue?: ?, successCallback?: fn(data: ?), errorCallback?: fn())
-从本地数据库读出一段数据
-
-inArray: fn(array?: ?, element?: ?) -> bool
-判定array是不是一个数组,以及element是否在该数组中。
-array: 可能的数组,不为数组或不填将导致返回值为false
-element: 待查找的元素
-返回值:如果array为数组且具有element这项,就返回true,否则返回false
-
-setGlobal: fn(key: string, value?: ?)
-设置一个全局存储,适用于global:xxx,录像播放时将忽略此函数。
-例如:core.setBlobal('一周目已通关', true); // 设置全局存储“一周目已通关”为true,方便二周目游戏中的新要素。
-key: 全局变量名称,支持中文
-value: 全局变量的新值,不填或null表示清除此全局存储
-
-rand2: fn(num?: number) -> number
-支持SL的随机数,并计入录像
-例如:1 + core.rand2(6); // 随机生成一个小于7的正整数,模拟骰子的效果
-num: 正整数,0或不填会被视为2147483648
-返回值:属于 [0, num) 的随机数
-
-setStatusBarInnerHTML: fn(name: string, value: ?, css?: string)
-填写非自绘状态栏
-例如:core.setStatusBarInnerHTML('hp', core.status.hero.hp, 'color: #66CCFF'); // 更新状态栏中的主角生命,使用加载画面的宣传色
-name: 状态栏项的名称,如'hp', 'atk', 'def'等。必须是core.statusBar中的一个合法项
-value: 要填写的内容,大数字会被格式化为至多6个字符,无中文的内容会被自动设为斜体
-css: 额外的css样式,可选。如更改颜色等
-
-matchRegex: fn(pattern: string, string: string) -> string
-是否满足正则表达式
-
-push: fn(a: [?], b: ?) -> [?]
-将b(可以是另一个数组)插入数组a的末尾,此函数用于弥补a.push(b)中b只能是单项的不足。
-例如:core.push(todo, {type: 'unfollow'}); // 在事件指令数组todo的末尾插入“取消所有跟随者”指令
+unshift: fn(a: [?], b: ?) -> [?]
+将b(可以是另一个数组)插入数组a的开头,此函数用于弥补a.unshift(b)中b只能是单项的不足。
+例如:core.unshift(todo, {type: 'unfollow'}); // 在事件指令数组todo的开头插入“取消所有跟随者”指令
a: 原数组
-b: 待插入的新末项或后缀数组
+b: 待插入的新首项或前缀数组
返回值:插入完毕后的新数组,它是改变原数组a本身得到的
-formatSize: fn(size: number) -> string
-格式化文件大小
-
-lzw_encode: fn(s: string) -> string
-LZW压缩算法,来自https://gist.github.com/revolunet/843889
-
-lzw_decode: fn(s: string) -> string
-LZW解压算法,来自https://gist.github.com/revolunet/843889
+unzip: fn(blobOrUrl?: ?, success?: fn(data: ?), error?: fn(error: string), convertToText?: bool, onprogress?: fn(loaded: number, total: number))
+解压一段内容
```
-## plugins.js
+## plugin.js
插件编写中内置了一些常用的插件。
```text
+autoRemoveMaps: fn(floorId: string)
+根据楼层分区信息自动砍层与恢复
+
+canOpenShop: fn(id: string) -> bool
+当前能否打开某个商店
+
+canUseQuickShop: fn(id: string) -> string
+当前能否使用某个快捷商店
+如果返回一个字符串,则代表不能,返回的字符串作为不能的提示;返回null表示可以使用
+
drawLight: fn(name: string|CanvasRenderingContext2D, color?: number, lights?: [[number]], lightDec?: number)
绘制一段灯光效果
name:必填,要绘制到的画布名;可以是一个系统画布,或者是个自定义画布;如果不存在则创建
@@ -2123,26 +2314,19 @@ lightDec:可选,0到1之间,光从多少百分比才开始衰减(在此
例如:core.plugin.drawLight('test', 0.2, [[25,11,46,0.1]]); // 创建一个test图层,不透明度0.2,其中在(25,11)点存在一个半径为46的灯光效果,灯光中心不透明度0.1。
core.plugin.drawLight('test2', 0.9, [[25,11,46],[105,121,88],[301,221,106]]); // 创建test2图层,且存在三个灯光效果,分别是中心(25,11)半径46,中心(105,121)半径88,中心(301,221)半径106。
-openShop: fn(shopId: string, noRoute?: bool)
-打开一个全局商店
-shopId: 要开启的商店ID
-noRoute: 打开行为是否不计入录像
-
isShopVisited: fn(id: string) -> bool
某个全局商店是否被访问过
listShopIds: fn() -> [string]
列出所有应当显示的快捷商店列表
-canOpenShop: fn(id: string) -> bool
-当前能否打开某个商店
+openItemShop: fn(itemShopId: string)
+打开一个道具商店
-setShopVisited: fn(id: string, visited?: bool)
-设置某个商店的访问状态
-
-canUseQuickShop: fn(id: string) -> string
-当前能否使用某个快捷商店
-如果返回一个字符串,则代表不能,返回的字符串作为不能的提示;返回null表示可以使用
+openShop: fn(shopId: string, noRoute?: bool)
+打开一个全局商店
+shopId: 要开启的商店ID
+noRoute: 打开行为是否不计入录像
removeMaps: fn(fromId: string, toId?: string)
删除某一些楼层;删除后不会存入存档,不可浏览地图也不可飞到。
@@ -2158,6 +2342,6 @@ toId: 恢复到的楼层编号;可选,不填则视为fromId
例如:core.resumeMaps("MT1", "MT300") 恢复MT1~MT300之间的全部层
core.resumeMaps("MT10") 只删恢复MT10层
-openItemShop: fn(itemShopId: string)
-打开一个道具商店
+setShopVisited: fn(id: string, visited?: bool)
+设置某个商店的访问状态
```
diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js
index 6779ea01..acde71b0 100644
--- a/_server/CodeMirror/defs.js
+++ b/_server/CodeMirror/defs.js
@@ -2119,7 +2119,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
"!type": "fn(func: name|fn(), _this?: ?)"
},
"control": {
- "!doc": "游戏控制",
+ "!doc": "负责整个游戏的核心控制系统,分为如下几个部分:
- requestAnimationFrame相关
- 标题界面,开始和重新开始游戏
- 自动寻路和人物行走相关
- 画布、位置、阻激夹域、显伤等相关
- 录像的回放相关
- 存读档,自动存档,同步存档等相关
- 人物属性和状态、位置、变量等相关
- 天气、色调、音乐和音效的播放
- 状态栏和工具栏相关
- 界面resize相关",
"showStatusBar": {
"!doc": "显示状态栏",
"!type": "fn()"
@@ -2696,7 +2696,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
}
},
"utils": {
- "!doc": "工具类函数",
+ "!doc": "工具函数库,里面有各个样板中使用到的工具函数。",
"scan": {
"!doc": "朝向到x,y映射",
"up": {
@@ -2930,7 +2930,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
}
},
"actions": {
- "!doc": "用户操作相关的函数",
+ "!doc": "主要是处理一些和用户交互相关的内容。",
"onup": {
"!doc": "当点击(触摸)事件放开时",
"!type": "fn(loc: {x: number, y: number, size: number})"
@@ -3028,7 +3028,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
}
},
"maps": {
- "!doc": "地图处理相关的函数",
+ "!doc": "负责一切和地图相关的处理内容,包括如下几个方面:
- 地图的初始化,保存和读取,地图数组的生成
- 是否可移动或瞬间移动的判定
- 地图的绘制
- 获得某个点的图块信息
- 启用和禁用图块,改变图块
- 移动/跳跃图块,淡入淡出图块
- 全局动画控制,动画的绘制",
"noPass": {
"!doc": "判定某个点是否不可被踏入(不基于主角生命值和图块cannotIn属性)
例如:core.noPass(0, 0); // 判断地图左上角能否被踏入
x: 目标点的横坐标
y: 目标点的纵坐标
floorId: 目标点所在的地图id,不填视为当前地图
返回值:true表示可踏入",
"!type": "fn(x: number, y: number, floorId?: string) -> bool"
@@ -3323,7 +3323,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
}
},
"ui": {
- "!doc": "UI绘制相关的函数",
+ "!doc": "负责一切UI界面的绘制。主要包括三个部分:
- 设置某个画布的属性与在某个画布上绘制的相关API
- 具体的某个UI界面的绘制
- 动态创建画布相关的API",
"resizeCanvas": {
"!doc": "重新设置一个自定义画布的大小",
"!type": "fn(name: string, x: number, y: number)"
@@ -3664,7 +3664,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
}
},
"enemys": {
- "!doc": "怪物处理的相关函数",
+ "!doc": "定义了一系列和怪物相关的API函数。",
"getEnemys": {
"!doc": "获得所有怪物原始数据的一个副本。
请使用core.material.enemys获得当前各项怪物属性。",
"!type": "fn()"
@@ -3731,7 +3731,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
}
},
"events": {
- "!doc": "事件处理相关的函数",
+ "!doc": "events.js将处理所有和事件相关的操作,主要分为五个部分:
- 游戏的开始和结束
- 系统事件的处理
- 自定义事件的处理
- 点击状态栏图标所进行的操作
- 一些具体事件的执行内容",
"afterChangeFloor": {
"!doc": "转换楼层结束的事件",
"!type": "fn(floorId?: string)"
@@ -4026,7 +4026,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
}
},
"plugin": {
- "!doc": "插件编写",
+ "!doc": "插件编写中内置了一些常用的插件。",
"drawLight": {
"!doc": "绘制一段灯光效果
name:必填,要绘制到的画布名;可以是一个系统画布,或者是个自定义画布;如果不存在则创建
color:可选,只能是一个0~1之间的数,为不透明度的值。不填则默认为0.9。
lights:可选,一个数组,定义了每个独立的灯光。其中每一项是三元组 [x,y,r] x和y分别为该灯光的横纵坐标,r为该灯光的半径。
lightDec:可选,0到1之间,光从多少百分比才开始衰减(在此范围内保持全亮),不设置默认为0。比如lightDec为0.5代表,每个灯光部分内圈50%的范围全亮,50%以后才开始快速衰减。
例如:core.plugin.drawLight('test', 0.2, [[25,11,46,0.1]]); // 创建一个test图层,不透明度0.2,其中在(25,11)点存在一个半径为46的灯光效果,灯光中心不透明度0.1。
core.plugin.drawLight('test2', 0.9, [[25,11,46],[105,121,88],[301,221,106]]); // 创建test2图层,且存在三个灯光效果,分别是中心(25,11)半径46,中心(105,121)半径88,中心(301,221)半径106。",
"!type": "fn(name: string|CanvasRenderingContext2D, color?: number, lights?: [[number]], lightDec?: number)"
diff --git a/libs/items.js b/libs/items.js
index b54db525..33a0841b 100644
--- a/libs/items.js
+++ b/libs/items.js
@@ -211,12 +211,14 @@ items.prototype.removeItem = function (itemId, itemNum) {
items.prototype.getEquipTypeByName = function (name) {
var names = core.status.globalAttribute.equipName;
+ var types = [];
for (var i = 0; i < names.length; ++i) {
- if (names[i] === name && !core.status.hero.equipment[i]) {
- return i;
+ if (names[i] === name) {
+ types.push(i);
+ if (!core.status.hero.equipment[i]) return i;
}
}
- return -1;
+ return types.length == 1 ? types[0] : -1;
}
items.prototype.getEquipTypeById = function (equipId) {