commit
3a9a9c5f5a
259
API列表.txt
259
API列表.txt
@ -1,19 +1,20 @@
|
|||||||
附录:API列表(V2.6.3版)
|
# 附录:API列表
|
||||||
|
|
||||||
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
这里将列出所有被转发到core的API,没有被转发的函数此处不会列出,请自行在代码中查看。
|
这里将列出所有被转发到core的API,没有被转发的函数此处不会列出,请自行在代码中查看。
|
||||||
|
|
||||||
本文档较大,如有什么需求请自行Ctrl+F进行搜索。
|
本附录量较大,如有什么需求请自行Ctrl+F进行搜索。
|
||||||
|
|
||||||
如有任何疑问,请联系小艾寻求帮助。
|
如有任何疑问,请联系小艾寻求帮助。
|
||||||
|
|
||||||
------------------------------------ [core.js] ------------------------------------
|
## core.js
|
||||||
|
|
||||||
core.js中只有很少的几个函数,主要是游戏开始前的初始化等。
|
core.js中只有很少的几个函数,主要是游戏开始前的初始化等。
|
||||||
|
|
||||||
但是,core中定义了很多游戏运行时的状态,这些状态很多都会被使用到。
|
但是,core中定义了很多游戏运行时的状态,这些状态很多都会被使用到。
|
||||||
|
|
||||||
|
``` text
|
||||||
|
|
||||||
|
|
||||||
core.__SIZE__, core.__PIXELS__
|
core.__SIZE__, core.__PIXELS__
|
||||||
游戏窗口大小;对于13x13的游戏而言这两个值分别是13和416,15x15来说分别是15和480。
|
游戏窗口大小;对于13x13的游戏而言这两个值分别是13和416,15x15来说分别是15和480。
|
||||||
|
|
||||||
@ -163,17 +164,13 @@ core.doFunc(func, _this)
|
|||||||
执行一个函数,func为函数体或者插件中的函数名,_this为使用的this。
|
执行一个函数,func为函数体或者插件中的函数名,_this为使用的this。
|
||||||
如果func为一个字符串,则视为插件中的函数名,同时_this将被设置成core.plugin。
|
如果func为一个字符串,则视为插件中的函数名,同时_this将被设置成core.plugin。
|
||||||
此函数剩余参数将作为参数被传入func。
|
此函数剩余参数将作为参数被传入func。
|
||||||
|
```
|
||||||
|
|
||||||
|
## actions.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [actions.js] ------------------------------------
|
|
||||||
|
|
||||||
actions.js主要是处理一些和用户交互相关的内容。
|
actions.js主要是处理一些和用户交互相关的内容。
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
core.registerAction(action, name, func, priority)
|
core.registerAction(action, name, func, priority)
|
||||||
注册一个用户交互行为。
|
注册一个用户交互行为。
|
||||||
action:要注册的交互类型,如 ondown, onclick, keyDown 等等。
|
action:要注册的交互类型,如 ondown, onclick, keyDown 等等。
|
||||||
@ -259,11 +256,9 @@ core.longClick()
|
|||||||
请勿直接覆盖或调用此函数,如有需要请注册一个"keyDownCtrl"的交互函数。
|
请勿直接覆盖或调用此函数,如有需要请注册一个"keyDownCtrl"的交互函数。
|
||||||
注册的交互函数如果某一项返回true,则之后仍然会继续触发该长按,
|
注册的交互函数如果某一项返回true,则之后仍然会继续触发该长按,
|
||||||
如果全部返回false则将停止本次长按行为,直到手指离开屏幕并重新进行长按为止。
|
如果全部返回false则将停止本次长按行为,直到手指离开屏幕并重新进行长按为止。
|
||||||
|
```
|
||||||
|
|
||||||
|
## control.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [control.js] ------------------------------------
|
|
||||||
|
|
||||||
control.js将负责整个游戏的核心控制系统,分为如下几个部分:
|
control.js将负责整个游戏的核心控制系统,分为如下几个部分:
|
||||||
- requestAnimationFrame相关
|
- requestAnimationFrame相关
|
||||||
@ -277,9 +272,7 @@ control.js将负责整个游戏的核心控制系统,分为如下几个部分
|
|||||||
- 状态栏和工具栏相关
|
- 状态栏和工具栏相关
|
||||||
- 界面resize相关
|
- 界面resize相关
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
// ------ requestAnimationFrame 相关 ------ //
|
// ------ requestAnimationFrame 相关 ------ //
|
||||||
|
|
||||||
core.registerAnimationFrame(name, needPlaying, func)
|
core.registerAnimationFrame(name, needPlaying, func)
|
||||||
@ -345,7 +338,7 @@ core.setHeroMoveInterval(callback)
|
|||||||
|
|
||||||
|
|
||||||
core.moveOneStep(x, y)
|
core.moveOneStep(x, y)
|
||||||
每走完一步后执行的操作,被转发到了脚本编辑中。
|
每走完一步后执行的操作,被转发到了脚本编辑中,执行脚本编辑moveOneStep中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.moveAction(callback)
|
core.moveAction(callback)
|
||||||
@ -356,6 +349,7 @@ core.moveAction(callback)
|
|||||||
core.moveHero(direction, callback)
|
core.moveHero(direction, callback)
|
||||||
令勇士朝一个方向行走。如果设置了callback,则只会行走一步,并执行回调。
|
令勇士朝一个方向行走。如果设置了callback,则只会行走一步,并执行回调。
|
||||||
否则,将一直朝该方向行走,直到core.status.heroStop为true为止。
|
否则,将一直朝该方向行走,直到core.status.heroStop为true为止。
|
||||||
|
direction可为"up","down","right","left",分别对应上,下,右,左。
|
||||||
|
|
||||||
|
|
||||||
core.isMoving()
|
core.isMoving()
|
||||||
@ -368,10 +362,11 @@ core.waitHeroToStop(callback)
|
|||||||
|
|
||||||
core.turnHero(direction)
|
core.turnHero(direction)
|
||||||
转向。如果设置了direction则会转到该方向,否则会右转。该函数会自动计入录像。
|
转向。如果设置了direction则会转到该方向,否则会右转。该函数会自动计入录像。
|
||||||
|
direction可为"up","down","right","left",分别对应上,下,右,左。
|
||||||
|
|
||||||
|
|
||||||
core.moveDirectly(destX, destY)
|
core.moveDirectly(destX, destY)
|
||||||
尝试瞬间移动到某点,被转发到了脚本编辑中。
|
尝试瞬间移动到某点,被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
此函数返回非负值代表成功进行瞬移,返回值是省略的步数;如果返回-1则代表没有成功瞬移。
|
此函数返回非负值代表成功进行瞬移,返回值是省略的步数;如果返回-1则代表没有成功瞬移。
|
||||||
|
|
||||||
|
|
||||||
@ -506,12 +501,12 @@ core.syncSave(type) / core.syncLoad()
|
|||||||
|
|
||||||
|
|
||||||
core.saveData()
|
core.saveData()
|
||||||
获得要存档的内容,实际转发到了脚本编辑中。
|
获得要存档的内容,实际转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.loadData(data, callback)
|
core.loadData(data, callback)
|
||||||
实际执行一次读档行为,data为读取到的数据,callback为执行完毕的回调。
|
实际执行一次读档行为,data为读取到的数据,callback为执行完毕的回调。
|
||||||
实际转发到了脚本编辑中。
|
实际转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.getSave(index, callback)
|
core.getSave(index, callback)
|
||||||
@ -541,19 +536,23 @@ core.removeSave(index)
|
|||||||
// ------ 属性、状态、位置、变量等 ------ //
|
// ------ 属性、状态、位置、变量等 ------ //
|
||||||
|
|
||||||
core.setStatus(name, value)
|
core.setStatus(name, value)
|
||||||
设置勇士当前的某个属性。
|
设置勇士当前的某个属性,name可为"atk","def","hp"等。
|
||||||
|
如core.setStatus("atk", 100)则为设置勇士攻击为100。
|
||||||
|
|
||||||
|
|
||||||
core.addStatus(name, value)
|
core.addStatus(name, value)
|
||||||
加减勇士当前的某个属性。等价于 core.setStatus(name, core.getStatus(name) + value)
|
加减勇士当前的某个属性,name可为"atk","def","hp"等。
|
||||||
|
如core.addStatus("atk", 100)则为增加勇士攻击100点。
|
||||||
|
等价于 core.setStatus(name, core.getStatus(name) + value)。
|
||||||
|
|
||||||
|
|
||||||
core.getStatus(name)
|
core.getStatus(name)
|
||||||
获得勇士的某个原始属性值。
|
获得勇士的某个原始属性值,该值不受百分比增幅影响。
|
||||||
|
譬如你有一件道具加10%的攻击,你可以使用该函数获得你的攻击被增幅前的数值
|
||||||
|
|
||||||
|
|
||||||
core.getStatusOrDefault(status, name)
|
core.getStatusOrDefault(status, name)
|
||||||
尝试从status中获得某个原始属性值;如果status为null或不存在对应属性值则从勇士属性中获取。
|
尝试从status中获得某个原始属性值,该值不受百分比增幅影响;如果status为null或不存在对应属性值则从勇士属性中获取。
|
||||||
此项在伤害计算函数中使用较多,例如传递新的攻击和防御来计算临界和1防减伤。
|
此项在伤害计算函数中使用较多,例如传递新的攻击和防御来计算临界和1防减伤。
|
||||||
|
|
||||||
|
|
||||||
@ -579,12 +578,14 @@ core.getBuff(name)
|
|||||||
|
|
||||||
|
|
||||||
core.setHeroLoc(name, value, noGather)
|
core.setHeroLoc(name, value, noGather)
|
||||||
设置勇士位置属性。name只能为'x', 'y'和'direction'之一。
|
设置勇士位置属性。name只能为'x'(勇士x坐标), 'y'(勇士y坐标)和'direction'(勇士朝向)之一。
|
||||||
如果noGather为true,则不会聚集所有的跟随者。
|
如果noGather为true,则不会聚集所有的跟随者。
|
||||||
|
譬如core.setHeroLoc("x", 1, true)则为设置勇士x坐标为1,不聚集所有跟随者。
|
||||||
|
|
||||||
|
|
||||||
core.getHeroLoc(name)
|
core.getHeroLoc(name)
|
||||||
获得勇士的某个位置属性。如果name为null则直接返回core.status.hero.loc。
|
获得勇士的某个位置属性。如果name为null则直接返回core.status.hero.loc。
|
||||||
|
譬如core.getHeroLoc("x")则返回勇士当前x坐标
|
||||||
|
|
||||||
|
|
||||||
core.getLvName(lv)
|
core.getLvName(lv)
|
||||||
@ -593,19 +594,26 @@ core.getLvName(lv)
|
|||||||
|
|
||||||
core.setFlag(name, value)
|
core.setFlag(name, value)
|
||||||
设置某个自定义变量或flag。如果value为null则会调用core.removeFlag进行删除。
|
设置某个自定义变量或flag。如果value为null则会调用core.removeFlag进行删除。
|
||||||
|
这里的变量与事件中使用的变量等价
|
||||||
|
譬如core.setFlag("xxx",1)则为设置变量xxx为1。
|
||||||
|
|
||||||
|
|
||||||
core.addFlag(name, value)
|
core.addFlag(name, value)
|
||||||
加减某个自定义的变量或flag。等价于 core.setFlag(name, core.getFlag(name, 0) + value)
|
加减某个自定义的变量或flag。等价于 core.setFlag(name, core.getFlag(name, 0) + value)
|
||||||
|
这里的变量与事件中使用的变量等价
|
||||||
|
譬如core.addFlag("xxx",1)则为增加变量xxx1
|
||||||
|
|
||||||
|
|
||||||
core.getFlag(name, defaultValue)
|
core.getFlag(name, defaultValue)
|
||||||
获得某个自定义的变量或flag。如果该flag不存在(从未赋值过),则返回defaultValue值。
|
获得某个自定义的变量或flag。如果该flag不存在(从未赋值过),则返回defaultValue的值。
|
||||||
|
这里的变量与事件中使用的变量等价
|
||||||
|
譬如core.getFlag("xxx",1)则为获得变量xxx的值,如变量xxx不存在则返回1
|
||||||
|
|
||||||
|
|
||||||
core.hasFlag(name)
|
core.hasFlag(name)
|
||||||
判定是否拥有某个自定义变量或flag。等价于 !!core.getFlag(name, 0)
|
判定是否拥有某个自定义变量或flag。等价于 !!core.getFlag(name, 0)
|
||||||
|
这里的变量与事件中使用的变量等价
|
||||||
|
譬如core.hasFlag("xxx",1)则为判断变量xxx是否存在
|
||||||
|
|
||||||
core.removeFlag(name)
|
core.removeFlag(name)
|
||||||
删除一个自定义变量或flag。
|
删除一个自定义变量或flag。
|
||||||
@ -626,6 +634,8 @@ core.setWeather(type, level)
|
|||||||
|
|
||||||
core.setCurtain(color, time, callback)
|
core.setCurtain(color, time, callback)
|
||||||
更改画面色调。color为更改到的色调,是个三元或四元组;time为渐变时间,0代表立刻切换。
|
更改画面色调。color为更改到的色调,是个三元或四元组;time为渐变时间,0代表立刻切换。
|
||||||
|
譬如core.setCurtain([255,255,255,1], 0)即为无回调无等待更改画面色调为白色
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
core.screenFlash(color, time, times, callback)
|
core.screenFlash(color, time, times, callback)
|
||||||
@ -665,7 +675,6 @@ core.updateStatusBar(doNotCheckAutoEvents)
|
|||||||
更新状态栏,被转发到了脚本编辑中。此函数还会根据是否在回放来设置工具栏的图标。
|
更新状态栏,被转发到了脚本编辑中。此函数还会根据是否在回放来设置工具栏的图标。
|
||||||
如果doNotCheckAutoEvents为true则此时不检查自动事件。
|
如果doNotCheckAutoEvents为true则此时不检查自动事件。
|
||||||
|
|
||||||
|
|
||||||
core.showStatusBar() / core.hideStatusBar(showToolbox)
|
core.showStatusBar() / core.hideStatusBar(showToolbox)
|
||||||
显示和隐藏状态栏。
|
显示和隐藏状态栏。
|
||||||
如果showToolbox为true,则在竖屏模式下不隐藏工具栏,方便手机存读档操作。
|
如果showToolbox为true,则在竖屏模式下不隐藏工具栏,方便手机存读档操作。
|
||||||
@ -698,17 +707,13 @@ core.unregisterResize(name)
|
|||||||
core.resize()
|
core.resize()
|
||||||
屏幕分辨率改变后的重新自适应。
|
屏幕分辨率改变后的重新自适应。
|
||||||
此函数将根据当前的屏幕分辨率信息,生成一个obj,并传入各个注册好的resize函数中执行。
|
此函数将根据当前的屏幕分辨率信息,生成一个obj,并传入各个注册好的resize函数中执行。
|
||||||
|
```
|
||||||
|
|
||||||
|
## enemys.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [enemys.js] ------------------------------------
|
|
||||||
|
|
||||||
enemys.js中定义了一系列和怪物相关的API函数。
|
enemys.js中定义了一系列和怪物相关的API函数。
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
core.hasSpecial(special, test)
|
core.hasSpecial(special, test)
|
||||||
判断是否含有某个特殊属性。test为要检查的特殊属性编号。
|
判断是否含有某个特殊属性。test为要检查的特殊属性编号。
|
||||||
special为要测试的内容,允许接收如下类型参数:
|
special为要测试的内容,允许接收如下类型参数:
|
||||||
@ -719,7 +724,7 @@ special为要测试的内容,允许接收如下类型参数:
|
|||||||
|
|
||||||
|
|
||||||
core.getSpecials()
|
core.getSpecials()
|
||||||
获得所有特殊属性的列表。实际上被转发到了脚本编辑中。
|
获得所有特殊属性的列表。实际上被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.getSpecialText(enemy)
|
core.getSpecialText(enemy)
|
||||||
@ -759,7 +764,7 @@ number为要计算的临界值数量,不填默认为1。
|
|||||||
|
|
||||||
|
|
||||||
core.getDefDamage(enemy, k, x, y, floorId)
|
core.getDefDamage(enemy, k, x, y, floorId)
|
||||||
获得某个怪物的k防减伤值。k可不填默认为1。
|
获得某个怪物的k防减伤值。k可不填默认为1,x,y,floorId为当前xy坐标和楼层。
|
||||||
|
|
||||||
|
|
||||||
core.getEnemyInfo(enemy, hero, x, y, floorId)
|
core.getEnemyInfo(enemy, hero, x, y, floorId)
|
||||||
@ -784,13 +789,11 @@ core.getCurrentEnemys(floorId)
|
|||||||
|
|
||||||
core.hasEnemyLeft(enemyId, floorId)
|
core.hasEnemyLeft(enemyId, floorId)
|
||||||
检查某个楼层是否还有剩余的(指定)怪物。
|
检查某个楼层是否还有剩余的(指定)怪物。
|
||||||
floorId为楼层ID,可忽略表示当前楼层。也可以传数组如["MT0","MT1"]同时检测多个楼层。
|
floorId为楼层ID,可忽略表示当前楼层。也可以填数组如["MT0","MT1"]同时检测多个楼层。
|
||||||
enemyId如果不填或null则检查是否剩余任何怪物,否则只检查是否剩余指定的某类怪物。
|
enemyId如果不填或null则检查是否剩余任何怪物,否则只检查是否剩余指定的某类怪物。
|
||||||
|
```
|
||||||
|
|
||||||
|
## events.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [events.js] ------------------------------------
|
|
||||||
|
|
||||||
events.js将处理所有和事件相关的操作,主要分为五个部分:
|
events.js将处理所有和事件相关的操作,主要分为五个部分:
|
||||||
- 游戏的开始和结束
|
- 游戏的开始和结束
|
||||||
@ -800,8 +803,7 @@ events.js将处理所有和事件相关的操作,主要分为五个部分:
|
|||||||
- 一些具体事件的执行内容
|
- 一些具体事件的执行内容
|
||||||
|
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
// ------ 游戏的开始和结束 ------ //
|
// ------ 游戏的开始和结束 ------ //
|
||||||
|
|
||||||
core.resetGame(hero, hard, floorId, maps, values)
|
core.resetGame(hero, hard, floorId, maps, values)
|
||||||
@ -817,16 +819,16 @@ seed为开始时要设置的的种子,route为要开始播放的录像,callb
|
|||||||
|
|
||||||
core.setInitData()
|
core.setInitData()
|
||||||
根据难度分歧来初始化难度,包括设置flag:hard,设置初始属性等。
|
根据难度分歧来初始化难度,包括设置flag:hard,设置初始属性等。
|
||||||
该函数实际被转发到了脚本编辑中。
|
该函数实际被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.win(reason, norank)
|
core.win(reason, norank)
|
||||||
游戏胜利,reason为结局名,norank如果为真则该结局不计入榜单。
|
游戏胜利,reason为结局名,norank如果为真则该结局不计入榜单。
|
||||||
该函数实际被转发到了脚本编辑中。
|
该函数实际被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.lose(reason)
|
core.lose(reason)
|
||||||
游戏失败,reason为结局名。该函数实际被转发到了脚本编辑中。
|
游戏失败,reason为结局名。该函数实际被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.gameOver(ending, fromReplay, norank)
|
core.gameOver(ending, fromReplay, norank)
|
||||||
@ -866,7 +868,7 @@ id为怪物的ID,x和y为怪物坐标,force如果为真将强制战斗,cal
|
|||||||
|
|
||||||
|
|
||||||
core.beforeBattle(enemyId, x, y)
|
core.beforeBattle(enemyId, x, y)
|
||||||
战前事件。实际被转发到了脚本编辑中,可以在这里加上一些战前特效。
|
战前事件。实际被转发到了脚本编辑中,执行脚本编辑中的内容,可以用于加上一些战前特效。
|
||||||
此函数在“检测能否战斗和自动存档”【之后】执行。
|
此函数在“检测能否战斗和自动存档”【之后】执行。
|
||||||
如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。
|
如果需要更早的战前事件,请在插件中覆重写 core.events.doSystemEvent 函数。
|
||||||
此函数返回true则将继续本次战斗,返回false将不再战斗。
|
此函数返回true则将继续本次战斗,返回false将不再战斗。
|
||||||
@ -874,7 +876,7 @@ core.beforeBattle(enemyId, x, y)
|
|||||||
|
|
||||||
core.afterBattle(enemyId, x, y, callback)
|
core.afterBattle(enemyId, x, y, callback)
|
||||||
战后事件,将执行扣血、加金币经验、特殊属性处理、战后事件处理等操作。
|
战后事件,将执行扣血、加金币经验、特殊属性处理、战后事件处理等操作。
|
||||||
实际被转发到了脚本编辑中。
|
实际被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.openDoor(x, y, needKey, callback)
|
core.openDoor(x, y, needKey, callback)
|
||||||
@ -883,16 +885,17 @@ core.openDoor(x, y, needKey, callback)
|
|||||||
|
|
||||||
|
|
||||||
core.afterOpenDoor(doorId, x, y, callback)
|
core.afterOpenDoor(doorId, x, y, callback)
|
||||||
开完一个门后执行的事件,实际被转发到了脚本编辑中。
|
开完一个门后执行的事件,实际被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.getItem(id, num, x, y, callback)
|
core.getItem(id, num, x, y, callback)
|
||||||
获得若干个道具。itemId为道具ID,itemNum为获得的道具个数,不填默认为1。
|
获得若干个道具。itemId为道具ID,itemNum为获得的道具个数,不填默认为1。
|
||||||
x和y为道具点的坐标,如果设置则会擦除地图上的该点。
|
x和y为道具点的坐标,如果设置则会擦除地图上的该点,也可不填。
|
||||||
|
譬如core.getItem("yellowKey",2)会直接获得两把黄钥匙。
|
||||||
|
|
||||||
|
|
||||||
core.afterGetItem(id, x, y, callback)
|
core.afterGetItem(id, x, y, callback)
|
||||||
获得一个道具后执行的事件,实际被转发到了脚本编辑中。
|
获得一个道具后执行的事件,实际被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.getNextItem(noRoute)
|
core.getNextItem(noRoute)
|
||||||
@ -929,7 +932,7 @@ core.pushBox(data)
|
|||||||
|
|
||||||
|
|
||||||
core.afterPushBox()
|
core.afterPushBox()
|
||||||
推箱子之后触发的事件,实际被转发到了脚本编辑中。
|
推箱子之后触发的事件,实际被转发到了脚本编辑中,执行脚本编辑中的内容。
|
||||||
|
|
||||||
|
|
||||||
core.changeLight(id, x, y)
|
core.changeLight(id, x, y)
|
||||||
@ -962,10 +965,11 @@ core.startEvents(list, x, y, callback)
|
|||||||
此函数将调用core.setEvents,然后停止勇士,再执行core.doAction()。
|
此函数将调用core.setEvents,然后停止勇士,再执行core.doAction()。
|
||||||
|
|
||||||
|
|
||||||
core.doAction()
|
core.doAction(keepUI)
|
||||||
执行下一个自定义事件。
|
执行下一个自定义事件。
|
||||||
此函数将检测事件列表是否全部执行完毕,如果是则执行回调函数。
|
此函数将检测事件列表是否全部执行完毕,如果是则执行回调函数。
|
||||||
否则,将从事件列表中弹出下一个事件,并调用core.doEvent进行执行。
|
否则,将从事件列表中弹出下一个事件,并调用core.doEvent进行执行。
|
||||||
|
如果keepUI为true,则不会清掉UI层和selector,适合于自己用脚本的绘制。
|
||||||
|
|
||||||
|
|
||||||
core.insertAction(action, x, y, callback, addToLast)
|
core.insertAction(action, x, y, callback, addToLast)
|
||||||
@ -983,6 +987,15 @@ core.getCommonEvent(name)
|
|||||||
core.recoverEvents(data)
|
core.recoverEvents(data)
|
||||||
恢复事件现场。一般用于呼出怪物手册、呼出存读档页面等时,恢复事件执行流。
|
恢复事件现场。一般用于呼出怪物手册、呼出存读档页面等时,恢复事件执行流。
|
||||||
|
|
||||||
|
|
||||||
|
core.checkAutoEvents()
|
||||||
|
检测自动事件并执行。
|
||||||
|
|
||||||
|
|
||||||
|
core.precompile(events)
|
||||||
|
尝试预编译一段事件。
|
||||||
|
|
||||||
|
|
||||||
// ------ 点击状态栏图标时执行的一些操作 ------ //
|
// ------ 点击状态栏图标时执行的一些操作 ------ //
|
||||||
|
|
||||||
core.openBook(fromUserAction)
|
core.openBook(fromUserAction)
|
||||||
@ -1030,15 +1043,21 @@ core.follow(name) / core.unfollow(name)
|
|||||||
|
|
||||||
core.setValue(name, value, prefix) / core.addValue(name, value, prefix)
|
core.setValue(name, value, prefix) / core.addValue(name, value, prefix)
|
||||||
设置/增减某个数值。name可以是status:xxx,item:xxx或flag:xxx。
|
设置/增减某个数值。name可以是status:xxx,item:xxx或flag:xxx。
|
||||||
value可以是一个表达式,将调用core.calValue()计算。prefix为前缀,独立开关使用。
|
value可以是一个表达式,将调用core.calValue()计算。prefix为前缀,独立开关使用,脚本中一般忽略。
|
||||||
|
|
||||||
|
|
||||||
core.doEffect(effect, need, times)
|
core.doEffect(effect, need, times)
|
||||||
执行一个effect操作。该函数目前仅被全局商店的status:xxx+=yyy所调用。
|
执行一个effect操作。该函数目前仅被全局商店的status:xxx+=yyy所调用。
|
||||||
|
|
||||||
|
|
||||||
|
core.setEnemy(id, name, value, prefix)
|
||||||
|
设置一个怪物属性。id为怪物的ID,name为要设置的项,比如hp,atk,def等等。
|
||||||
|
value可以是一个表达式,将调用core.calValue()计算。prefix为前缀,独立开关使用,脚本中一般忽略。
|
||||||
|
|
||||||
|
|
||||||
core.setFloorInfo(name, values, floorId, prefix)
|
core.setFloorInfo(name, values, floorId, prefix)
|
||||||
设置某层楼的楼层属性。
|
设置某层楼的楼层属性,其中name为该楼层属性对应的条目,values为要设置的值,floorId为楼层id,prefix一般直接忽略。
|
||||||
|
譬如core.setFloorInfo("name","4", "MT1")则为设置MT1显示在状态栏中的层数为4
|
||||||
|
|
||||||
|
|
||||||
core.setGlobalAttribute(name, value)
|
core.setGlobalAttribute(name, value)
|
||||||
@ -1126,17 +1145,13 @@ core.tryUseItem(itemId)
|
|||||||
|
|
||||||
core.afterUseBomb()
|
core.afterUseBomb()
|
||||||
使用炸弹或圣锤后的事件。实际被转发到了脚本编辑中。
|
使用炸弹或圣锤后的事件。实际被转发到了脚本编辑中。
|
||||||
|
```
|
||||||
|
|
||||||
|
## icons.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [icons.js] ------------------------------------
|
|
||||||
|
|
||||||
icons.js主要是负责素材相关信息,比如某个素材在对应的图片上的位置。
|
icons.js主要是负责素材相关信息,比如某个素材在对应的图片上的位置。
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
core.getClsFromId(id)
|
core.getClsFromId(id)
|
||||||
根据某个素材的ID获得该素材的cls
|
根据某个素材的ID获得该素材的cls
|
||||||
|
|
||||||
@ -1144,17 +1159,13 @@ core.getClsFromId(id)
|
|||||||
core.getTilesetOffset(id)
|
core.getTilesetOffset(id)
|
||||||
根据某个素材来获得对应的tileset和坐标信息。
|
根据某个素材来获得对应的tileset和坐标信息。
|
||||||
如果该素材不是tileset,则返回null。
|
如果该素材不是tileset,则返回null。
|
||||||
|
```
|
||||||
|
|
||||||
|
## items.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [items.js] ------------------------------------
|
|
||||||
|
|
||||||
items.js主要负责一切和道具相关的内容。
|
items.js主要负责一切和道具相关的内容。
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
core.getItemEffect(itemId, itemNum)
|
core.getItemEffect(itemId, itemNum)
|
||||||
即捡即用类的道具获得时的效果。实际对应道具图块属性中的itemEffect框。
|
即捡即用类的道具获得时的效果。实际对应道具图块属性中的itemEffect框。
|
||||||
|
|
||||||
@ -1205,8 +1216,9 @@ core.addItem(itemId, itemNum)
|
|||||||
|
|
||||||
|
|
||||||
core.getEquipTypeByName(name)
|
core.getEquipTypeByName(name)
|
||||||
根据装备位名称来找到一个空的装备孔,适用于多重装备。
|
根据装备位名称来找到一个空的装备孔,适用于多重装备,装备位名称可在全塔属性中设置。
|
||||||
如果没有一个装备孔是该装备名称,则返回-1。
|
如果没有一个装备孔是该装备名称,则返回-1。
|
||||||
|
譬如:core.getEquipTypeByName("武器")默认返回全塔属性中武器对应的装备孔号0。
|
||||||
|
|
||||||
|
|
||||||
core.getEquipTypeById(equipId)
|
core.getEquipTypeById(equipId)
|
||||||
@ -1219,11 +1231,12 @@ core.canEquip(equipId, hint)
|
|||||||
|
|
||||||
|
|
||||||
core.loadEquip(equipId, callback)
|
core.loadEquip(equipId, callback)
|
||||||
穿上某个装备。
|
穿上某个装备,equipId为装备id。
|
||||||
|
|
||||||
|
|
||||||
core.unloadEquip(equipType, callback)
|
core.unloadEquip(equipType, callback)
|
||||||
脱下某个装备孔的装备。
|
脱下某个装备孔的装备。
|
||||||
|
譬如core.unloadEquip(0)则为脱下0号装备孔中的装备,默认0号装备孔对应“武器”,1号装备孔对应“盾牌”
|
||||||
|
|
||||||
|
|
||||||
core.compareEquipment(compareEquipId, beComparedEquipId)
|
core.compareEquipment(compareEquipId, beComparedEquipId)
|
||||||
@ -1238,6 +1251,10 @@ core.quickSaveEquip(index)
|
|||||||
|
|
||||||
core.quickLoadEquip()
|
core.quickLoadEquip()
|
||||||
读取当前套装。index为读取的套装编号。
|
读取当前套装。index为读取的套装编号。
|
||||||
|
|
||||||
|
|
||||||
|
core.getEquippedStatus(name)
|
||||||
|
获得装备直接增加的属性数据。
|
||||||
```
|
```
|
||||||
|
|
||||||
## loader.js
|
## loader.js
|
||||||
@ -1273,11 +1290,9 @@ core.loadBgm(name)
|
|||||||
|
|
||||||
core.freeBgm(name)
|
core.freeBgm(name)
|
||||||
释放一个bgm的内存并移出缓存列表。如果该bgm正在播放则也会立刻停止。
|
释放一个bgm的内存并移出缓存列表。如果该bgm正在播放则也会立刻停止。
|
||||||
|
```
|
||||||
|
|
||||||
|
## map.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [maps.js] ------------------------------------
|
|
||||||
|
|
||||||
maps.js负责一切和地图相关的处理内容,包括如下几个方面:
|
maps.js负责一切和地图相关的处理内容,包括如下几个方面:
|
||||||
- 地图的初始化,保存和读取,地图数组的生成
|
- 地图的初始化,保存和读取,地图数组的生成
|
||||||
@ -1288,9 +1303,7 @@ maps.js负责一切和地图相关的处理内容,包括如下几个方面:
|
|||||||
- 移动/跳跃图块,淡入淡出图块
|
- 移动/跳跃图块,淡入淡出图块
|
||||||
- 全局动画控制,动画的绘制
|
- 全局动画控制,动画的绘制
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
// ------ 地图的初始化,保存和读取,地图数组的生成 ------ //
|
// ------ 地图的初始化,保存和读取,地图数组的生成 ------ //
|
||||||
|
|
||||||
core.loadFloor(floorId, map)
|
core.loadFloor(floorId, map)
|
||||||
@ -1299,7 +1312,7 @@ map为存档信息,如果某项在map中不存在则会从core.floors中读取
|
|||||||
|
|
||||||
|
|
||||||
core.getNumberById(id)
|
core.getNumberById(id)
|
||||||
给定一个图块ID,找到对应的数字。
|
给定一个图块ID,找到图块对应的图块编号。
|
||||||
|
|
||||||
|
|
||||||
core.initBlock(x, y, id, addInfo, eventFloor)
|
core.initBlock(x, y, id, addInfo, eventFloor)
|
||||||
@ -1435,7 +1448,7 @@ toDraw为要绘制到的信息(可为null,或为一个画布名),包括
|
|||||||
// ------ 获得某个点的图块信息 ------ //
|
// ------ 获得某个点的图块信息 ------ //
|
||||||
|
|
||||||
core.noPass(x, y, floorId)
|
core.noPass(x, y, floorId)
|
||||||
判定某个点是否有noPass的图块。
|
判定某个点是否有noPass(不可通行)的图块。
|
||||||
|
|
||||||
|
|
||||||
core.npcExists(x, y, floorId)
|
core.npcExists(x, y, floorId)
|
||||||
@ -1443,7 +1456,7 @@ core.npcExists(x, y, floorId)
|
|||||||
|
|
||||||
|
|
||||||
core.terrainExists(x, y, id, floorId)
|
core.terrainExists(x, y, id, floorId)
|
||||||
判定某个点是否有(指定的)地形存在。
|
判定某个点是否有(id对应的)地形存在。
|
||||||
如果id为null,则只要存在terrains即为真,否则还会判定对应点的ID。
|
如果id为null,则只要存在terrains即为真,否则还会判定对应点的ID。
|
||||||
|
|
||||||
|
|
||||||
@ -1456,7 +1469,7 @@ core.nearStair()
|
|||||||
|
|
||||||
|
|
||||||
core.enemyExists(x, y, id, floorId)
|
core.enemyExists(x, y, id, floorId)
|
||||||
判定某个点是否有(指定的)怪物存在。
|
判定某个点是否有(id对应的)怪物存在。
|
||||||
如果id为null,则只要存在怪物即为真,否则还会判定对应点的怪物ID。
|
如果id为null,则只要存在怪物即为真,否则还会判定对应点的怪物ID。
|
||||||
请注意,如果需要判定某个楼层是否存在怪物请使用core.hasEnemyLeft()函数。
|
请注意,如果需要判定某个楼层是否存在怪物请使用core.hasEnemyLeft()函数。
|
||||||
|
|
||||||
@ -1513,14 +1526,17 @@ core.removeBlock(x, y, floorId)
|
|||||||
|
|
||||||
|
|
||||||
core.removeBlockById(index, floorId)
|
core.removeBlockById(index, floorId)
|
||||||
|
每个楼层的图块存成一个数组,index即为该数组中的索引,每个索引对应该地图中的一个图块
|
||||||
根据索引从地图的block数组中尽可能删除一个图块。floorId可不填或null表示当前楼层。
|
根据索引从地图的block数组中尽可能删除一个图块。floorId可不填或null表示当前楼层。
|
||||||
|
|
||||||
|
|
||||||
core.removeBlockByIds(floorId, ids)
|
core.removeBlockByIds(floorId, ids)
|
||||||
|
ids为由索引组成的数组,如[0,1]等
|
||||||
根据索引数组从地图的block数组中尽可能删除一系列图块。floorId可不填或null表示当前楼层。
|
根据索引数组从地图的block数组中尽可能删除一系列图块。floorId可不填或null表示当前楼层。
|
||||||
|
|
||||||
|
|
||||||
core.canRemoveBlock(block, floorId)
|
core.canRemoveBlock(block, floorId)
|
||||||
|
block为图块信息,可由core.getBlock获取
|
||||||
判定当前能否完全删除某个图块。floorId可不填或null表示当前楼层。
|
判定当前能否完全删除某个图块。floorId可不填或null表示当前楼层。
|
||||||
如果该点存在自定义事件,或者是重生怪,则不可进行删除。
|
如果该点存在自定义事件,或者是重生怪,则不可进行删除。
|
||||||
|
|
||||||
@ -1564,7 +1580,7 @@ number为要设置到的图块数字,x,y和floorId为目标点坐标和楼层
|
|||||||
|
|
||||||
core.resetMap(floorId)
|
core.resetMap(floorId)
|
||||||
重置某层或若干层的地图和楼层属性。
|
重置某层或若干层的地图和楼层属性。
|
||||||
floorId可为某个楼层ID,或者一个楼层数组(同时重置若干层);如果不填则只重置当前楼层。
|
floorId可为某个楼层ID,或者一个楼层数组如["MT1","MT2"](同时重置若干层);如果不填则只重置当前楼层。
|
||||||
|
|
||||||
// ------ 移动/跳跃图块,淡入淡出图块 ------ //
|
// ------ 移动/跳跃图块,淡入淡出图块 ------ //
|
||||||
|
|
||||||
@ -1611,20 +1627,16 @@ core.drawAnimate(name, x, y, callback)
|
|||||||
core.stopAnimate(id, doCallback)
|
core.stopAnimate(id, doCallback)
|
||||||
立刻停止某个动画的播放。id为上面core.drawAnimate的返回值。
|
立刻停止某个动画的播放。id为上面core.drawAnimate的返回值。
|
||||||
如果doCallback为真,则会执行该动画所对应的回调函数。
|
如果doCallback为真,则会执行该动画所对应的回调函数。
|
||||||
|
```
|
||||||
|
|
||||||
|
## ui.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [ui.js] ------------------------------------
|
|
||||||
|
|
||||||
ui.js负责一切UI界面的绘制。主要包括三个部分:
|
ui.js负责一切UI界面的绘制。主要包括三个部分:
|
||||||
- 设置某个画布的属性的相关API
|
- 设置某个画布的属性的相关API
|
||||||
- 具体的某个UI界面的绘制
|
- 具体的某个UI界面的绘制
|
||||||
- 动态创建画布相关的API
|
- 动态创建画布相关的API
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
// ------ 设置某个画布的属性的相关API ------//
|
// ------ 设置某个画布的属性的相关API ------//
|
||||||
这系列函数的name一般都是画布名,可以是系统画布或动态创建的画布。
|
这系列函数的name一般都是画布名,可以是系统画布或动态创建的画布。
|
||||||
但也同时也允许直接传画布的context本身,将返回自身。
|
但也同时也允许直接传画布的context本身,将返回自身。
|
||||||
@ -1641,11 +1653,16 @@ core.clearMap(name)
|
|||||||
该函数的name也可以是'all',若为'all'则为清空所有系统画布。
|
该函数的name也可以是'all',若为'all'则为清空所有系统画布。
|
||||||
|
|
||||||
|
|
||||||
core.fillText(name, text, x, y, style, font)
|
core.fillText(name, text, x, y, style, font, maxWidth)
|
||||||
在某个画布上绘制一段文字。
|
在某个画布上绘制一段文字。
|
||||||
text为要绘制的文本,x,y为要绘制的坐标,style可选为绘制的样式,font可选为绘制的字体。(下同)
|
text为要绘制的文本,x,y为要绘制的坐标,style可选为绘制的样式,font可选为绘制的字体。(下同)
|
||||||
|
style可直接使用"red","white"等或用"rgba(255,255,255,1)"或用"#FFFFFF"等方式来获得字体对应的颜色
|
||||||
|
font的格式为"20px Verdana"前者为字体大小,后者为字体
|
||||||
|
如果maxWidth不为null,则视为文字最大宽度,如果超过此宽度则会自动放缩文字直到自适应为止。
|
||||||
请注意textAlign和textBaseline将决定绘制的左右对齐和上下对齐方式。
|
请注意textAlign和textBaseline将决定绘制的左右对齐和上下对齐方式。
|
||||||
具体可详见core.setTextAlign()和core.setTextBaseline()函数。
|
具体可详见core.setTextAlign()和core.setTextBaseline()函数。
|
||||||
|
譬如:core.fillText("ui", "这是要描绘的文字", 10, 10, "red", "20px Verdana", 100)
|
||||||
|
即是在ui图层上,以10,10为起始点,描绘20像素大小,Verdana字体的红色字,长度不超过100像素
|
||||||
|
|
||||||
|
|
||||||
core.fillBoldText(name, text, x, y, style, font)
|
core.fillBoldText(name, text, x, y, style, font)
|
||||||
@ -1653,7 +1670,7 @@ core.fillBoldText(name, text, x, y, style, font)
|
|||||||
|
|
||||||
|
|
||||||
core.fillRect(name, x, y, width, height, style)
|
core.fillRect(name, x, y, width, height, style)
|
||||||
绘制一个矩形。style可选为绘制样式。如果设置将调用core.setFillStyle()。(下同)
|
绘制一个矩形。width, height为矩形宽高,style可选为绘制样式。如果设置将调用core.setFillStyle()。(下同)
|
||||||
|
|
||||||
|
|
||||||
core.strokeRect(name, x, y, width, height, style, lineWidth)
|
core.strokeRect(name, x, y, width, height, style, lineWidth)
|
||||||
@ -1662,11 +1679,11 @@ lineWidth如果设置将调用core.setLineWidth()。(下同)
|
|||||||
|
|
||||||
|
|
||||||
core.drawLine(name, x1, y1, x2, y2, style, lineWidth)
|
core.drawLine(name, x1, y1, x2, y2, style, lineWidth)
|
||||||
绘制一条线。
|
绘制一条线,x1y1为起始点像素,x2y2为终止点像素。
|
||||||
|
|
||||||
|
|
||||||
core.drawArrow(name, x1, y1, x2, y2, style, lineWidth)
|
core.drawArrow(name, x1, y1, x2, y2, style, lineWidth)
|
||||||
绘制一个箭头。
|
绘制一个箭头,x1y1为起始点像素,x2y2为终止点像素。
|
||||||
|
|
||||||
|
|
||||||
core.setFont(name, font) / core.setLineWidth(name, lineWidth)
|
core.setFont(name, font) / core.setLineWidth(name, lineWidth)
|
||||||
@ -1688,7 +1705,7 @@ core.setFillStyle(name, style) / core.setStrokeStyle(name, style)
|
|||||||
|
|
||||||
|
|
||||||
core.setTextAlign(name, align)
|
core.setTextAlign(name, align)
|
||||||
设置一个画布的文字横向对齐模式,这里的align只能为'left', 'right'和'center'。
|
设置一个画布的文字横向对齐模式,这里的align只能为'left', 'right'和'center',分别对应左对齐,右对齐,居中。
|
||||||
默认为'left'。
|
默认为'left'。
|
||||||
|
|
||||||
|
|
||||||
@ -1719,6 +1736,13 @@ core.drawImage(name, image, x, y, w, h, x1, y1, w1, h1)
|
|||||||
http://www.w3school.com.cn/html5/canvas_drawimage.asp
|
http://www.w3school.com.cn/html5/canvas_drawimage.asp
|
||||||
这里的image允许传一个图片,画布。也允许传递图片名,将从你导入的图片中获取图片内容。
|
这里的image允许传一个图片,画布。也允许传递图片名,将从你导入的图片中获取图片内容。
|
||||||
|
|
||||||
|
|
||||||
|
core.drawIcon(name, id, x, y, w, h)
|
||||||
|
在一张画布上绘制一个图标。
|
||||||
|
id为注册过的图标ID,也可以使用状态栏的图标ID,例如lv, hp, up, save, settings等。
|
||||||
|
x和y为绘制的左上角坐标;w和h可选为绘制的宽高,如果不填或null则使用该图标的默认宽高。
|
||||||
|
|
||||||
|
|
||||||
// ------ 具体的某个UI界面的绘制 ------ //
|
// ------ 具体的某个UI界面的绘制 ------ //
|
||||||
core.closePanel()
|
core.closePanel()
|
||||||
结束一切事件和UI绘制,关闭UI窗口,返回游戏。
|
结束一切事件和UI绘制,关闭UI窗口,返回游戏。
|
||||||
@ -1729,11 +1753,16 @@ core.clearUI()
|
|||||||
重置UI窗口。此函数将清掉所有的UI帧动画和光标,清空UI画布,并将alpha设为1。
|
重置UI窗口。此函数将清掉所有的UI帧动画和光标,清空UI画布,并将alpha设为1。
|
||||||
|
|
||||||
|
|
||||||
core.drawTip(text, id)
|
core.drawTip(text, id, clear)
|
||||||
在左上角以气泡的形式绘制一段提示。
|
在左上角以气泡的形式绘制一段提示。
|
||||||
text为文字内容,仅支持${}的表达式计算,不支持换行和变色。
|
text为文字内容,仅支持${}的表达式计算,不支持换行和变色。
|
||||||
id可选,为同时绘制的图标ID,如果不为null则会同时绘制该图标(仅对32x32的素材有效)。
|
id可选,为同时绘制的图标ID,如果不为null则会同时绘制该图标(仅对32x32的素材有效)。
|
||||||
也可以使用状态栏的图标ID,例如lv, hp, up, save, settings等。
|
也可以使用状态栏的图标ID,例如lv, hp, up, save, settings等。
|
||||||
|
如果clear为true,则会清空当前所有正在显示的提示。
|
||||||
|
|
||||||
|
|
||||||
|
core.clearTip()
|
||||||
|
清空当前所有正在显示的提示。
|
||||||
|
|
||||||
|
|
||||||
core.drawText(content, callback)
|
core.drawText(content, callback)
|
||||||
@ -1763,7 +1792,8 @@ posInfo如果不为null则是一个含position, px和py的对象,表示一个
|
|||||||
core.drawTextContent(ctx, content, config)
|
core.drawTextContent(ctx, content, config)
|
||||||
根据配置在某个画布上绘制一段文字。此函数会被core.drawTextBox()所调用。
|
根据配置在某个画布上绘制一段文字。此函数会被core.drawTextBox()所调用。
|
||||||
ctx为画布名或画布本身,如果不设置则会忽略该函数。
|
ctx为画布名或画布本身,如果不设置则会忽略该函数。
|
||||||
content为要绘制的文字内容,支持所有的文字效果(如\n,${},\r,\\i,\\c,\\d,\\e等),但不支持支持\t和\b的语法。
|
content为要绘制的文字内容,支持所有的文字效果(如\n,${},\r,\\i,\\c,\\d,\\e等)
|
||||||
|
,但不支持支持\t和\b的语法。
|
||||||
config为绘制的配置项,目前可以包括如下几项:
|
config为绘制的配置项,目前可以包括如下几项:
|
||||||
- left, top:在该画布上绘制的左上角像素位置,不设置默认为(0,0)。
|
- left, top:在该画布上绘制的左上角像素位置,不设置默认为(0,0)。
|
||||||
> 该函数绘制时会将textBaseline设置为'top',因此只需要考虑第一个字的左上角位置。
|
> 该函数绘制时会将textBaseline设置为'top',因此只需要考虑第一个字的左上角位置。
|
||||||
@ -1772,8 +1802,9 @@ config为绘制的配置项,目前可以包括如下几项:
|
|||||||
- bold:是否粗体。如果不设置默认为false。
|
- bold:是否粗体。如果不设置默认为false。
|
||||||
- align:文字对齐方式,仅在maxWidth设置时有效,默认为'left'。
|
- align:文字对齐方式,仅在maxWidth设置时有效,默认为'left'。
|
||||||
- fontSize:字体大小,如果不设置则使用剧情文本设置中的正文字体大小。
|
- fontSize:字体大小,如果不设置则使用剧情文本设置中的正文字体大小。
|
||||||
- lineHeight:绘制的行距值,如果不设置则使用fontSize*1.3(即1.3被行距)。
|
- lineHeight:绘制的行距值,如果不设置则使用fontSize*1.3(即1.3倍行距)。
|
||||||
- time:打字机效果。若不为0,则会逐个字进行绘制,并设置core.status.event.interval定时器。
|
- time:打字机效果。若不为0,则会逐个字进行绘制,并设置core.status.event.interval定时器。
|
||||||
|
- interval:字符间的间距。值表示绘制每个字符之间间隔的距离,默认为0。
|
||||||
|
|
||||||
|
|
||||||
core.drawTextBox(content, showAll)
|
core.drawTextBox(content, showAll)
|
||||||
@ -1798,7 +1829,7 @@ core.textImage(content, lineHeight)
|
|||||||
|
|
||||||
core.drawChoices(content, choices)
|
core.drawChoices(content, choices)
|
||||||
绘制一个选项框。
|
绘制一个选项框。
|
||||||
content可选,为选项上方的提示文字,支持所有的文字效果(如\n,${},\r,\\i,\\c,\\d,\\e等),也支持\t效果。
|
content可选,为选项上方的提示文字,支持所有的文字效果(如\n,${},\r,\\i,\\c,\\d,\\e等),也支持\t。
|
||||||
choices必选,为要绘制的选项内容,是一个列表。其中的每一项:
|
choices必选,为要绘制的选项内容,是一个列表。其中的每一项:
|
||||||
- 可以是一个字符串,表示选项文字,将使用剧情文本设置中的正文颜色来绘制,仅支持${}表达式计算。
|
- 可以是一个字符串,表示选项文字,将使用剧情文本设置中的正文颜色来绘制,仅支持${}表达式计算。
|
||||||
- 或者是一个包含text, color和icon的对象。
|
- 或者是一个包含text, color和icon的对象。
|
||||||
@ -1865,7 +1896,7 @@ z值为创建的纵向高度(关系到画布之间的覆盖),z值高的将
|
|||||||
|
|
||||||
|
|
||||||
core.ui.relocateCanvas(name, x, y)
|
core.ui.relocateCanvas(name, x, y)
|
||||||
重新定位一个自定义画布。x和y为画布的左上角坐标。
|
重新定位一个自定义画布。x和y为画布的左上角坐标,name为画布名。
|
||||||
|
|
||||||
|
|
||||||
core.ui.resizeCanvas(name, width, height, styleOnly)
|
core.ui.resizeCanvas(name, width, height, styleOnly)
|
||||||
@ -1881,21 +1912,22 @@ core.ui.deleteCanvas(name)
|
|||||||
|
|
||||||
core.ui.deleteAllCanvas()
|
core.ui.deleteAllCanvas()
|
||||||
删除所有的自定义画布。
|
删除所有的自定义画布。
|
||||||
|
```
|
||||||
|
|
||||||
|
## utils.js
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ [utils.js] ------------------------------------
|
|
||||||
|
|
||||||
utils.js是一个工具函数库,里面有各个样板中使用到的工具函数。
|
utils.js是一个工具函数库,里面有各个样板中使用到的工具函数。
|
||||||
|
|
||||||
|
```text
|
||||||
|
|
||||||
|
|
||||||
core.replayText(text, need, times)
|
core.replayText(text, need, times)
|
||||||
将一段文字中的${}(表达式)进行替换。need和time一般可以直接忽略。
|
将一段文字中的${}(表达式)进行替换。need和time一般可以直接忽略。
|
||||||
|
|
||||||
|
|
||||||
|
core.replaceValue(value)
|
||||||
|
对一个表达式中的特殊规则进行替换,如status:xxx等。
|
||||||
|
请注意,此项不会对独立开关如switch:A进行替换。
|
||||||
|
|
||||||
|
|
||||||
core.calValue(value, prefix, need, time)
|
core.calValue(value, prefix, need, time)
|
||||||
计算一个表达式的值,支持status:xxx等的计算。
|
计算一个表达式的值,支持status:xxx等的计算。
|
||||||
prefix为前缀(switch:xxx的独立开关使用),need和time一般可以直接忽略。
|
prefix为前缀(switch:xxx的独立开关使用),need和time一般可以直接忽略。
|
||||||
@ -2058,6 +2090,7 @@ core.matchWildcard(pattern, string)
|
|||||||
|
|
||||||
core.encodeBase64(str) / core.decodeBase64(str)
|
core.encodeBase64(str) / core.decodeBase64(str)
|
||||||
将字符串进行base64加密或解密。
|
将字符串进行base64加密或解密。
|
||||||
|
可用于解压缩录像数据
|
||||||
|
|
||||||
|
|
||||||
core.convertBase(str, fromBase, toBase)
|
core.convertBase(str, fromBase, toBase)
|
||||||
@ -2082,6 +2115,7 @@ num如果设置大于0,则生成一个[0, num-1]之间的数;否则生成一
|
|||||||
|
|
||||||
core.readFile(success, error, accept)
|
core.readFile(success, error, accept)
|
||||||
读取一个本地文件内容。success和error分别为读取成功或失败的回调函数。
|
读取一个本地文件内容。success和error分别为读取成功或失败的回调函数。
|
||||||
|
accept如果设置则控制能选择的文件类型。
|
||||||
iOS平台暂不支持读取文件操作。
|
iOS平台暂不支持读取文件操作。
|
||||||
|
|
||||||
|
|
||||||
@ -2141,3 +2175,4 @@ mimeType和responseType如果设置将会覆盖默认值。
|
|||||||
|
|
||||||
lzw_encode(s) / lzw_decode(s)
|
lzw_encode(s) / lzw_decode(s)
|
||||||
LZW压缩算法,来自https://gist.github.com/revolunet/843889
|
LZW压缩算法,来自https://gist.github.com/revolunet/843889
|
||||||
|
```
|
||||||
|
|||||||
15
README.md
15
README.md
@ -57,6 +57,21 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏!
|
|||||||
|
|
||||||
## 更新说明
|
## 更新说明
|
||||||
|
|
||||||
|
### 2019.12.1 HTML5魔塔样板V2.6.5
|
||||||
|
|
||||||
|
* [x] 事件:设置怪物属性;穿脱装备
|
||||||
|
* [x] 新值块:enemy:xxx:atk可获得怪物数据
|
||||||
|
* [x] 新值块:blockId:x,y获得某点图块ID
|
||||||
|
* [x] 部分事件预编译,加快执行速度
|
||||||
|
* [x] 在系统设置中可以设置bgm的播放音量
|
||||||
|
* [x] 通关事件可以不退出游戏
|
||||||
|
* [x] 失败时允许直接读取自动存档
|
||||||
|
* [x] NPC48自动注册可以自动绑定faceIds
|
||||||
|
* [x] 编辑器Alt+1-9存图块,1-9读取图块
|
||||||
|
* [x] 编辑器现在可以跨楼层复制粘贴图块了
|
||||||
|
* [x] 可以对flags.进行自动补全
|
||||||
|
* [x] 部分Bug修复,大量细节优化
|
||||||
|
|
||||||
### 2019.10.29 HTML5魔塔样板V2.6.4
|
### 2019.10.29 HTML5魔塔样板V2.6.4
|
||||||
|
|
||||||
* [x] 自动事件,多事件页
|
* [x] 自动事件,多事件页
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# V2.0版本介绍
|
# V2.0版本介绍
|
||||||
|
|
||||||
?> 目前版本**v2.6.3*,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5*,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。
|
目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。
|
||||||
|
|
||||||
|
|||||||
12
_docs/api.md
12
_docs/api.md
@ -1,6 +1,6 @@
|
|||||||
# 附录:API列表
|
# 附录:API列表
|
||||||
|
|
||||||
?> 目前版本**v2.6.3**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
这里将列出所有被转发到core的API,没有被转发的函数此处不会列出,请自行在代码中查看。
|
这里将列出所有被转发到core的API,没有被转发的函数此处不会列出,请自行在代码中查看。
|
||||||
|
|
||||||
@ -987,10 +987,15 @@ core.getCommonEvent(name)
|
|||||||
core.recoverEvents(data)
|
core.recoverEvents(data)
|
||||||
恢复事件现场。一般用于呼出怪物手册、呼出存读档页面等时,恢复事件执行流。
|
恢复事件现场。一般用于呼出怪物手册、呼出存读档页面等时,恢复事件执行流。
|
||||||
|
|
||||||
|
|
||||||
core.checkAutoEvents()
|
core.checkAutoEvents()
|
||||||
检测自动事件并执行。
|
检测自动事件并执行。
|
||||||
|
|
||||||
|
|
||||||
|
core.precompile(events)
|
||||||
|
尝试预编译一段事件。
|
||||||
|
|
||||||
|
|
||||||
// ------ 点击状态栏图标时执行的一些操作 ------ //
|
// ------ 点击状态栏图标时执行的一些操作 ------ //
|
||||||
|
|
||||||
core.openBook(fromUserAction)
|
core.openBook(fromUserAction)
|
||||||
@ -1918,6 +1923,11 @@ core.replayText(text, need, times)
|
|||||||
将一段文字中的${}(表达式)进行替换。need和time一般可以直接忽略。
|
将一段文字中的${}(表达式)进行替换。need和time一般可以直接忽略。
|
||||||
|
|
||||||
|
|
||||||
|
core.replaceValue(value)
|
||||||
|
对一个表达式中的特殊规则进行替换,如status:xxx等。
|
||||||
|
请注意,此项不会对独立开关如switch:A进行替换。
|
||||||
|
|
||||||
|
|
||||||
core.calValue(value, prefix, need, time)
|
core.calValue(value, prefix, need, time)
|
||||||
计算一个表达式的值,支持status:xxx等的计算。
|
计算一个表达式的值,支持status:xxx等的计算。
|
||||||
prefix为前缀(switch:xxx的独立开关使用),need和time一般可以直接忽略。
|
prefix为前缀(switch:xxx的独立开关使用),need和time一般可以直接忽略。
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 元件说明
|
# 元件说明
|
||||||
|
|
||||||
?> 目前版本**v2.6.3**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。
|
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 事件
|
# 事件
|
||||||
|
|
||||||
?> 目前版本**v2.6.3**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
本章内将对样板所支持的事件进行介绍。
|
本章内将对样板所支持的事件进行介绍。
|
||||||
|
|
||||||
@ -315,6 +315,8 @@
|
|||||||
|
|
||||||
从V2.6开始,也可以使用`global:xxx`代表全局存储(和存档无关的存储)。
|
从V2.6开始,也可以使用`global:xxx`代表全局存储(和存档无关的存储)。
|
||||||
|
|
||||||
|
从V2.6.5开始,也可以使用`enemy:id:atk`来获得某个怪物的属性,`blockId:x,y`来获得某个点的图块ID,`equip:x`来获得某个装备孔的装备ID。
|
||||||
|
|
||||||
``` js
|
``` js
|
||||||
[
|
[
|
||||||
"你当前的攻击力是${status:atk}, 防御是${status:def},坐标是(${status:x},${status:y})",
|
"你当前的攻击力是${status:atk}, 防御是${status:def},坐标是(${status:x},${status:y})",
|
||||||
@ -322,15 +324,21 @@
|
|||||||
"你的红黄蓝钥匙总数为${item:yellowKey+item:blueKey+item:redKey}",
|
"你的红黄蓝钥匙总数为${item:yellowKey+item:blueKey+item:redKey}",
|
||||||
"你访问某个老人的次数为${flag:man_times}",
|
"你访问某个老人的次数为${flag:man_times}",
|
||||||
"当前的存档编号是${global:saveIndex}",
|
"当前的存档编号是${global:saveIndex}",
|
||||||
|
"绿色史莱姆的攻击力是${enemy:greenSlime:atk}",
|
||||||
|
"(2,3)点的图块ID是${blockId:2,3},图块类型是${blockCls:2,3}",
|
||||||
|
"装备孔0的当前装备ID是${equip:0}",
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- `status:xxx` 获取勇士属性时只能使用如下几个:hp(生命值),atk(攻击力),def(防御力),mdef(魔防值),money(金币),experience(经验),x(勇士的横坐标),y(勇士的纵坐标),direction(勇士的方向)。
|
- `status:xxx` 获取勇士属性时只能使用如下几个:hp(生命值),atk(攻击力),def(防御力),mdef(魔防值),money(金币),experience(经验),x(勇士的横坐标),y(勇士的纵坐标),direction(勇士的方向)。
|
||||||
- `item:xxx` 中的xxx为道具ID。所有道具的ID定义在items.js中,请自行查看。例如,`item:centerFly` 代表中心对称飞行器的个数。
|
- `item:xxx` 中的xxx为道具ID。所有道具的ID定义在items.js中,请自行查看。例如,`item:centerFly` 代表中心对称飞行器的个数。
|
||||||
- `flag:xxx` 中的xxx为一个自定义的变量/Flag(支持中文);如果没有对其进行赋值则默认值为0。
|
- `flag:xxx` 中的xxx为一个自定义的变量/Flag(支持中文);如果没有对其进行赋值则默认值为0。
|
||||||
- `global:xxx` 中的xxx为一个全局存储的名称(支持中文);如果没有对其进行赋值则默认值为0。
|
- `global:xxx` 中的xxx为一个全局存储的名称(支持中文);如果没有对其进行赋值则默认值为0。
|
||||||
|
- `enemy:xxx:yyy` 中的xxx为怪物ID;yyy为要获得的项,比如hp, atk, def等等
|
||||||
|
- `blockId:x,y` 和 `blockCls:x,y` 中的x,y为坐标值
|
||||||
|
- `equip:x` 中的x为装备孔编号,从0开始。
|
||||||
|
|
||||||
### autoText:自动剧情文本
|
### autoText:自动剧情文本
|
||||||
|
|
||||||
@ -478,7 +486,9 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
另外注意一点的是,如果hp被设置成了0或以下,将触发lose事件,直接死亡。
|
从V2.6.5开始,默认`addValue`不会刷新状态栏、地图显伤和自动事件,除非设置了`"refresh": true`。
|
||||||
|
|
||||||
|
在刷新的情况下,如果hp被设置成了0或以下,将触发lose事件,直接死亡。
|
||||||
|
|
||||||
### addValue:增减勇士的某个属性、道具个数,或某个变量/Flag的值
|
### addValue:增减勇士的某个属性、道具个数,或某个变量/Flag的值
|
||||||
|
|
||||||
@ -499,6 +509,7 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
从V2.6.5开始,默认`addValue`不会刷新状态栏、地图显伤和自动事件,除非设置了`"refresh": true`。
|
||||||
|
|
||||||
### setEnemy:设置怪物属性
|
### setEnemy:设置怪物属性
|
||||||
|
|
||||||
@ -1063,9 +1074,9 @@ time为可选的,指定的话将作为楼层切换动画的时间。
|
|||||||
|
|
||||||
``` js
|
``` js
|
||||||
[
|
[
|
||||||
{"type": "changePos", "id": "pickaxe"}, // 尝试使用破
|
{"type": "useItem", "id": "pickaxe"}, // 尝试使用破
|
||||||
{"type": "changePos", "id": "bomb"}, // 尝试使用炸
|
{"type": "useItem", "id": "bomb"}, // 尝试使用炸
|
||||||
{"type": "changePos", "id": "centerFly"} // 尝试使用飞
|
{"type": "useItem", "id": "centerFly"} // 尝试使用飞
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -1077,6 +1088,32 @@ time为可选的,指定的话将作为楼层切换动画的时间。
|
|||||||
|
|
||||||
不可使用“怪物手册”(请使用【呼出怪物手册】事件)或楼层传送器(如果[覆盖楼传事件](personalization#覆盖楼传事件)则可忽视本项)。
|
不可使用“怪物手册”(请使用【呼出怪物手册】事件)或楼层传送器(如果[覆盖楼传事件](personalization#覆盖楼传事件)则可忽视本项)。
|
||||||
|
|
||||||
|
### loadEquip:装上装备
|
||||||
|
|
||||||
|
使用`{"type": "loadEquip"}`可以装上一个装备。
|
||||||
|
|
||||||
|
``` js
|
||||||
|
[
|
||||||
|
{"type": "loadEquip", "id": "sword1"}, // 尝试装上铁剑
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
id必填,为需要装备的ID。
|
||||||
|
|
||||||
|
使用装备时仍会检查条件(比如装备是否存在,能否装备等等)。
|
||||||
|
|
||||||
|
### unloadEquip:卸下装备
|
||||||
|
|
||||||
|
使用`{"type": "unloadEquip"}`卸下某个装备孔的装备。
|
||||||
|
|
||||||
|
``` js
|
||||||
|
[
|
||||||
|
{"type": "unloadEquip", "pos": 0}, // 卸下装备孔0的装备
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
pos必填,为要卸下的装备孔编号,从0开始。
|
||||||
|
|
||||||
### openShop:打开一个全局商店
|
### openShop:打开一个全局商店
|
||||||
|
|
||||||
使用openShop可以打开一个全局商店。有关全局商店的说明可参见[全局商店](#全局商店)。
|
使用openShop可以打开一个全局商店。有关全局商店的说明可参见[全局商店](#全局商店)。
|
||||||
|
|||||||
BIN
_docs/img/events/7.png
Normal file
BIN
_docs/img/events/7.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 187 KiB |
@ -1,6 +1,6 @@
|
|||||||
# HTML5 魔塔样板说明文档
|
# HTML5 魔塔样板说明文档
|
||||||
|
|
||||||
?> 目前版本**v2.6.3**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。
|
众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 个性化
|
# 个性化
|
||||||
|
|
||||||
?> 目前版本**v2.6.3**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。
|
有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 脚本
|
# 脚本
|
||||||
|
|
||||||
?> 目前版本**v2.6.3**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
在V2.6版本中,基本对整个项目代码进行了重写,更加方便造塔者的使用和复写函数。
|
在V2.6版本中,基本对整个项目代码进行了重写,更加方便造塔者的使用和复写函数。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 快速上手
|
# 快速上手
|
||||||
|
|
||||||
?> 目前版本**v2.6.3**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.5**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
|
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
|
||||||
|
|
||||||
|
|||||||
@ -359,6 +359,8 @@ action
|
|||||||
| setViewport_s
|
| setViewport_s
|
||||||
| moveViewport_s
|
| moveViewport_s
|
||||||
| useItem_s
|
| useItem_s
|
||||||
|
| loadEquip_s
|
||||||
|
| unloadEquip_s
|
||||||
| openShop_s
|
| openShop_s
|
||||||
| disableShop_s
|
| disableShop_s
|
||||||
| follow_s
|
| follow_s
|
||||||
@ -587,26 +589,28 @@ return code;
|
|||||||
*/;
|
*/;
|
||||||
|
|
||||||
setValue_s
|
setValue_s
|
||||||
: '数值操作' ':' '名称' idString_e '值' expression Newline
|
: '数值操作' ':' '名称' idString_e '值' expression '刷新状态栏和显伤' Bool Newline
|
||||||
|
|
||||||
|
|
||||||
/* setValue_s
|
/* setValue_s
|
||||||
tooltip : setValue:设置勇士的某个属性、道具个数, 或某个变量/Flag的值
|
tooltip : setValue:设置勇士的某个属性、道具个数, 或某个变量/Flag的值
|
||||||
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=setvalue%EF%BC%9A%E8%AE%BE%E7%BD%AE%E5%8B%87%E5%A3%AB%E7%9A%84%E6%9F%90%E4%B8%AA%E5%B1%9E%E6%80%A7%E3%80%81%E9%81%93%E5%85%B7%E4%B8%AA%E6%95%B0%EF%BC%8C%E6%88%96%E6%9F%90%E4%B8%AA%E5%8F%98%E9%87%8Fflag%E7%9A%84%E5%80%BC
|
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=setvalue%EF%BC%9A%E8%AE%BE%E7%BD%AE%E5%8B%87%E5%A3%AB%E7%9A%84%E6%9F%90%E4%B8%AA%E5%B1%9E%E6%80%A7%E3%80%81%E9%81%93%E5%85%B7%E4%B8%AA%E6%95%B0%EF%BC%8C%E6%88%96%E6%9F%90%E4%B8%AA%E5%8F%98%E9%87%8Fflag%E7%9A%84%E5%80%BC
|
||||||
colour : this.dataColor
|
colour : this.dataColor
|
||||||
var code = '{"type": "setValue", "name": "'+idString_e_0+'", "value": "'+expression_0+'"},\n';
|
Bool_0 = Bool_0 ? ', "refresh": true' : '';
|
||||||
|
var code = '{"type": "setValue", "name": "'+idString_e_0+'", "value": "'+expression_0+'"' + Bool_0 + '},\n';
|
||||||
return code;
|
return code;
|
||||||
*/;
|
*/;
|
||||||
|
|
||||||
addValue_s
|
addValue_s
|
||||||
: '数值增减' ':' '名称' idString_e '+=' expression Newline
|
: '数值增减' ':' '名称' idString_e '+=' expression '刷新状态栏和显伤' Bool Newline
|
||||||
|
|
||||||
|
|
||||||
/* addValue_s
|
/* addValue_s
|
||||||
tooltip : addValue:增减勇士的某个属性、道具个数, 或某个变量/Flag的值
|
tooltip : addValue:增减勇士的某个属性、道具个数, 或某个变量/Flag的值
|
||||||
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=addValue%ef%bc%9a%e5%a2%9e%e5%87%8f%e5%8b%87%e5%a3%ab%e7%9a%84%e6%9f%90%e4%b8%aa%e5%b1%9e%e6%80%a7%e3%80%81%e9%81%93%e5%85%b7%e4%b8%aa%e6%95%b0%ef%bc%8c%e6%88%96%e6%9f%90%e4%b8%aa%e5%8f%98%e9%87%8f%2fFlag%e7%9a%84%e5%80%bc
|
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=addValue%ef%bc%9a%e5%a2%9e%e5%87%8f%e5%8b%87%e5%a3%ab%e7%9a%84%e6%9f%90%e4%b8%aa%e5%b1%9e%e6%80%a7%e3%80%81%e9%81%93%e5%85%b7%e4%b8%aa%e6%95%b0%ef%bc%8c%e6%88%96%e6%9f%90%e4%b8%aa%e5%8f%98%e9%87%8f%2fFlag%e7%9a%84%e5%80%bc
|
||||||
colour : this.dataColor
|
colour : this.dataColor
|
||||||
var code = '{"type": "addValue", "name": "'+idString_e_0+'", "value": "'+expression_0+'"},\n';
|
Bool_0 = Bool_0 ? ', "refresh": true' : '';
|
||||||
|
var code = '{"type": "addValue", "name": "'+idString_e_0+'", "value": "'+expression_0+'"' + Bool_0 + '},\n';
|
||||||
return code;
|
return code;
|
||||||
*/;
|
*/;
|
||||||
|
|
||||||
@ -1244,6 +1248,32 @@ var code = '{"type": "useItem", "id": "'+IdString_0+'"},\n';
|
|||||||
return code;
|
return code;
|
||||||
*/;
|
*/;
|
||||||
|
|
||||||
|
loadEquip_s
|
||||||
|
: '装上装备' IdString Newline
|
||||||
|
|
||||||
|
|
||||||
|
/* loadEquip_s
|
||||||
|
tooltip : loadEquip: 装上装备
|
||||||
|
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=useItem%ef%bc%9a%e4%bd%bf%e7%94%a8%e9%81%93%e5%85%b7
|
||||||
|
colour : this.dataColor
|
||||||
|
default : ["sword1"]
|
||||||
|
var code = '{"type": "loadEquip", "id": "'+IdString_0+'"},\n';
|
||||||
|
return code;
|
||||||
|
*/;
|
||||||
|
|
||||||
|
unloadEquip_s
|
||||||
|
: '卸下装备孔' Int '的装备' Newline
|
||||||
|
|
||||||
|
|
||||||
|
/* unloadEquip_s
|
||||||
|
tooltip : unloadEquip: 卸下装备
|
||||||
|
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=useItem%ef%bc%9a%e4%bd%bf%e7%94%a8%e9%81%93%e5%85%b7
|
||||||
|
colour : this.dataColor
|
||||||
|
default : [0]
|
||||||
|
var code = '{"type": "unloadEquip", "pos": '+Int_0+'},\n';
|
||||||
|
return code;
|
||||||
|
*/;
|
||||||
|
|
||||||
openShop_s
|
openShop_s
|
||||||
: '打开全局商店' IdString Newline
|
: '打开全局商店' IdString Newline
|
||||||
|
|
||||||
@ -2636,6 +2666,19 @@ return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|||||||
*/;
|
*/;
|
||||||
|
|
||||||
|
|
||||||
|
//这一条不会被antlr识别,总是会被归到idString_e
|
||||||
|
idString_6_e
|
||||||
|
: '装备孔:' Int
|
||||||
|
|
||||||
|
|
||||||
|
/* idString_6_e
|
||||||
|
colour : this.idstring_eColor
|
||||||
|
default : [0]
|
||||||
|
var code = 'equip:'+Int_0;
|
||||||
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
||||||
|
*/;
|
||||||
|
|
||||||
|
|
||||||
evFlag_e
|
evFlag_e
|
||||||
: '独立开关' Letter_List
|
: '独立开关' Letter_List
|
||||||
|
|
||||||
@ -2854,6 +2897,7 @@ this.block('idString_2_e').output='idString_e';
|
|||||||
this.block('idString_3_e').output='idString_e';
|
this.block('idString_3_e').output='idString_e';
|
||||||
this.block('idString_4_e').output='idString_e';
|
this.block('idString_4_e').output='idString_e';
|
||||||
this.block('idString_5_e').output='idString_e';
|
this.block('idString_5_e').output='idString_e';
|
||||||
|
this.block('idString_6_e').output='idString_e';
|
||||||
this.block('evFlag_e').output='idString_e';
|
this.block('evFlag_e').output='idString_e';
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -3272,6 +3316,14 @@ ActionParser.prototype.parseAction = function() {
|
|||||||
this.next = MotaActionBlocks['useItem_s'].xmlText([
|
this.next = MotaActionBlocks['useItem_s'].xmlText([
|
||||||
data.id,this.next]);
|
data.id,this.next]);
|
||||||
break;
|
break;
|
||||||
|
case "loadEquip": // 装上装备
|
||||||
|
this.next = MotaActionBlocks['loadEquip_s'].xmlText([
|
||||||
|
data.id,this.next]);
|
||||||
|
break;
|
||||||
|
case "unloadEquip": // 卸下装备
|
||||||
|
this.next = MotaActionBlocks['unloadEquip_s'].xmlText([
|
||||||
|
data.pos,this.next]);
|
||||||
|
break;
|
||||||
case "openShop": // 打开一个全局商店
|
case "openShop": // 打开一个全局商店
|
||||||
this.next = MotaActionBlocks['openShop_s'].xmlText([
|
this.next = MotaActionBlocks['openShop_s'].xmlText([
|
||||||
data.id,this.next]);
|
data.id,this.next]);
|
||||||
@ -3346,6 +3398,7 @@ ActionParser.prototype.parseAction = function() {
|
|||||||
this.next = MotaActionBlocks['setValue_s'].xmlText([
|
this.next = MotaActionBlocks['setValue_s'].xmlText([
|
||||||
this.tryToUseEvFlag_e('idString_e', [data.name]),
|
this.tryToUseEvFlag_e('idString_e', [data.name]),
|
||||||
MotaActionBlocks['evalString_e'].xmlText([data.value]),
|
MotaActionBlocks['evalString_e'].xmlText([data.value]),
|
||||||
|
data.refresh || false,
|
||||||
this.next]);
|
this.next]);
|
||||||
break;
|
break;
|
||||||
case "setValue2":
|
case "setValue2":
|
||||||
@ -3353,6 +3406,7 @@ ActionParser.prototype.parseAction = function() {
|
|||||||
this.next = MotaActionBlocks['addValue_s'].xmlText([
|
this.next = MotaActionBlocks['addValue_s'].xmlText([
|
||||||
this.tryToUseEvFlag_e('idString_e', [data.name]),
|
this.tryToUseEvFlag_e('idString_e', [data.name]),
|
||||||
MotaActionBlocks['evalString_e'].xmlText([data.value]),
|
MotaActionBlocks['evalString_e'].xmlText([data.value]),
|
||||||
|
data.refresh || false,
|
||||||
this.next]);
|
this.next]);
|
||||||
break;
|
break;
|
||||||
case "setEnemy":
|
case "setEnemy":
|
||||||
@ -3922,7 +3976,7 @@ MotaActionFunctions.replaceToName = function (str) {
|
|||||||
return map[c] ? ("怪物:" + b + ":" + map[c]) : c;
|
return map[c] ? ("怪物:" + b + ":" + map[c]) : c;
|
||||||
}).replace(/enemy:/g, "怪物:");
|
}).replace(/enemy:/g, "怪物:");
|
||||||
|
|
||||||
str = str.replace(/blockId:/g, "图块ID:").replace(/blockCls:/g, "图块类别:");
|
str = str.replace(/blockId:/g, "图块ID:").replace(/blockCls:/g, "图块类别:").replace(/equip:/g, "装备孔:");
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3952,7 +4006,7 @@ MotaActionFunctions.replaceFromName = function (str) {
|
|||||||
return map[d] ? ("enemy:" + c + ":" + map[d]) : d;
|
return map[d] ? ("enemy:" + c + ":" + map[d]) : d;
|
||||||
}).replace(/怪物[::]/g, "enemy:");
|
}).replace(/怪物[::]/g, "enemy:");
|
||||||
|
|
||||||
str = str.replace(/图块I[dD][::]/g, "blockId:").replace(/图块类别[::]/g, "blockCls:");
|
str = str.replace(/图块I[dD][::]/g, "blockId:").replace(/图块类别[::]/g, "blockCls:").replace(/装备孔[::]/g, "equip:");
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -608,6 +608,16 @@ editor.prototype.addUsedFlags = function (s) {
|
|||||||
s.replace(/flag:([a-zA-Z0-9_\u4E00-\u9FCC]+)/g, function (s0, s1) {
|
s.replace(/flag:([a-zA-Z0-9_\u4E00-\u9FCC]+)/g, function (s0, s1) {
|
||||||
editor.used_flags[s1] = true; return s0;
|
editor.used_flags[s1] = true; return s0;
|
||||||
});
|
});
|
||||||
|
s.replace(/flags\.([a-zA-Z_]\w*)/g, function (s0, s1) {
|
||||||
|
editor.used_flags[s1] = true; return s0;
|
||||||
|
});
|
||||||
|
if (window.flags) {
|
||||||
|
for (var s in editor.used_flags) {
|
||||||
|
if (!(s in window.flags)) {
|
||||||
|
window.flags[s] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
editor.prototype.listen = function () {
|
editor.prototype.listen = function () {
|
||||||
|
|||||||
@ -100,10 +100,10 @@ editor_blockly = function () {
|
|||||||
],
|
],
|
||||||
'数据相关':[
|
'数据相关':[
|
||||||
MotaActionBlocks['addValue_s'].xmlText([
|
MotaActionBlocks['addValue_s'].xmlText([
|
||||||
MotaActionBlocks['idString_1_e'].xmlText(['status','生命'])
|
MotaActionBlocks['idString_1_e'].xmlText(['status','生命']), '', false
|
||||||
]),
|
]),
|
||||||
MotaActionBlocks['setValue_s'].xmlText([
|
MotaActionBlocks['setValue_s'].xmlText([
|
||||||
MotaActionBlocks['idString_1_e'].xmlText(['status','生命'])
|
MotaActionBlocks['idString_1_e'].xmlText(['status','生命']), '', false
|
||||||
]),
|
]),
|
||||||
MotaActionBlocks['setEnemy_s'].xmlText(),
|
MotaActionBlocks['setEnemy_s'].xmlText(),
|
||||||
MotaActionBlocks['setFloor_s'].xmlText(),
|
MotaActionBlocks['setFloor_s'].xmlText(),
|
||||||
@ -120,6 +120,8 @@ editor_blockly = function () {
|
|||||||
MotaActionBlocks['changePos_1_s'].xmlText(),
|
MotaActionBlocks['changePos_1_s'].xmlText(),
|
||||||
MotaActionBlocks['battle_s'].xmlText(),
|
MotaActionBlocks['battle_s'].xmlText(),
|
||||||
MotaActionBlocks['useItem_s'].xmlText(),
|
MotaActionBlocks['useItem_s'].xmlText(),
|
||||||
|
MotaActionBlocks['loadEquip_s'].xmlText(),
|
||||||
|
MotaActionBlocks['unloadEquip_s'].xmlText(),
|
||||||
MotaActionBlocks['openShop_s'].xmlText(),
|
MotaActionBlocks['openShop_s'].xmlText(),
|
||||||
MotaActionBlocks['disableShop_s'].xmlText(),
|
MotaActionBlocks['disableShop_s'].xmlText(),
|
||||||
MotaActionBlocks['setHeroIcon_s'].xmlText(),
|
MotaActionBlocks['setHeroIcon_s'].xmlText(),
|
||||||
@ -232,6 +234,7 @@ editor_blockly = function () {
|
|||||||
MotaActionBlocks['idString_3_e'].xmlText(),
|
MotaActionBlocks['idString_3_e'].xmlText(),
|
||||||
MotaActionBlocks['idString_4_e'].xmlText(),
|
MotaActionBlocks['idString_4_e'].xmlText(),
|
||||||
MotaActionBlocks['idString_5_e'].xmlText(),
|
MotaActionBlocks['idString_5_e'].xmlText(),
|
||||||
|
MotaActionBlocks['idString_6_e'].xmlText(),
|
||||||
MotaActionBlocks['evalString_e'].xmlText(),
|
MotaActionBlocks['evalString_e'].xmlText(),
|
||||||
],
|
],
|
||||||
'常见事件模板':[
|
'常见事件模板':[
|
||||||
@ -684,7 +687,7 @@ function omitedcheckUpdateFunction(event) {
|
|||||||
var previewBlock = function (b) {
|
var previewBlock = function (b) {
|
||||||
var types = [
|
var types = [
|
||||||
"previewUI_s", "clearMap_s", "clearMap_1_s", "setAttribute_s", "fillText_s",
|
"previewUI_s", "clearMap_s", "clearMap_1_s", "setAttribute_s", "fillText_s",
|
||||||
"fillBoldText_s", "drawTextContent_s", "fillRect_s", "strokeRect_s", "drawLine_s",
|
"fillBoldText_s", "fillRect_s", "strokeRect_s", "drawLine_s",
|
||||||
"drawArrow_s", "fillPolygon_s", "strokePolygon_s", "fillCircle_s", "strokeCircle_s",
|
"drawArrow_s", "fillPolygon_s", "strokePolygon_s", "fillCircle_s", "strokeCircle_s",
|
||||||
"drawImage_s", "drawImage_1_s", "drawIcon_s", "drawBackground_s", "drawSelector_s", "drawSelector_1_s"
|
"drawImage_s", "drawImage_1_s", "drawIcon_s", "drawBackground_s", "drawSelector_s", "drawSelector_1_s"
|
||||||
];
|
];
|
||||||
@ -744,7 +747,7 @@ function omitedcheckUpdateFunction(event) {
|
|||||||
'comment_s',
|
'comment_s',
|
||||||
'show_s',
|
'show_s',
|
||||||
'hide_s',
|
'hide_s',
|
||||||
'setValue_s',
|
'addValue_s',
|
||||||
'if_s',
|
'if_s',
|
||||||
'battle_s',
|
'battle_s',
|
||||||
'openDoor_s',
|
'openDoor_s',
|
||||||
@ -962,6 +965,16 @@ function omitedcheckUpdateFunction(event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 提供 flags.xxx 补全
|
||||||
|
index = content.lastIndexOf("flags.");
|
||||||
|
if (index >= 0) {
|
||||||
|
var token = content.substring(index+6);
|
||||||
|
return Object.keys(editor.used_flags || {}).filter(function (one) {
|
||||||
|
return one != token && one.startsWith(token)
|
||||||
|
&& /^[a-zA-Z_]\w*$/.test(one);
|
||||||
|
}).sort();
|
||||||
|
}
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -146,11 +146,15 @@ editor_file = function (editor, callback) {
|
|||||||
var templateActions = [];
|
var templateActions = [];
|
||||||
|
|
||||||
var image = info.images;
|
var image = info.images;
|
||||||
|
var bindFaceIds = false;
|
||||||
|
|
||||||
if (image=='autotile') {
|
if (image=='autotile') {
|
||||||
callback('不能对自动元件进行自动注册!');
|
callback('不能对自动元件进行自动注册!');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (image=='npc48' && confirm("你想绑定npc48的朝向么?\n如果是,则会连续四个一组的对npc48的faceIds进行自动绑定。")) {
|
||||||
|
bindFaceIds = true;
|
||||||
|
}
|
||||||
var c=image.toUpperCase().charAt(0);
|
var c=image.toUpperCase().charAt(0);
|
||||||
|
|
||||||
// terrains id
|
// terrains id
|
||||||
@ -162,15 +166,20 @@ editor_file = function (editor, callback) {
|
|||||||
var allIds = [];
|
var allIds = [];
|
||||||
editor.ids.forEach(function (v) {
|
editor.ids.forEach(function (v) {
|
||||||
if (v.images==image) {
|
if (v.images==image) {
|
||||||
allIds[v.y]=true;
|
allIds[v.y]=v;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
var per_height = image.endsWith('48')?48:32;
|
var per_height = image.endsWith('48')?48:32;
|
||||||
|
|
||||||
|
var faceIds = []; // down, left, right, up
|
||||||
|
|
||||||
var idnum=300;
|
var idnum=300;
|
||||||
for (var y=0; y<editor.widthsX[image][3]/per_height;y++) {
|
for (var y=0; y<editor.widthsX[image][3]/per_height;y++) {
|
||||||
if (allIds[y]) continue;
|
if (allIds[y] != null) {
|
||||||
|
faceIds.push(allIds[y]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
while (editor.core.maps.blocksInfo[idnum]) idnum++;
|
while (editor.core.maps.blocksInfo[idnum]) idnum++;
|
||||||
|
|
||||||
// get id num
|
// get id num
|
||||||
@ -182,7 +191,8 @@ editor_file = function (editor, callback) {
|
|||||||
else {
|
else {
|
||||||
iconActions.push(["add", "['" + image + "']['" + id + "']", y])
|
iconActions.push(["add", "['" + image + "']['" + id + "']", y])
|
||||||
}
|
}
|
||||||
mapActions.push(["add", "['" + idnum + "']", {'cls': image, 'id': id}])
|
mapActions.push(["add", "['" + idnum + "']", {'cls': image, 'id': id}]);
|
||||||
|
faceIds.push({idnum: idnum, id: id});
|
||||||
if (image=='items')
|
if (image=='items')
|
||||||
templateActions.push(["add", "['items']['" + id + "']", editor.file.comment._data.items_template]);
|
templateActions.push(["add", "['items']['" + id + "']", editor.file.comment._data.items_template]);
|
||||||
else if (image.indexOf('enemy')==0)
|
else if (image.indexOf('enemy')==0)
|
||||||
@ -190,6 +200,17 @@ editor_file = function (editor, callback) {
|
|||||||
idnum++;
|
idnum++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bindFaceIds) {
|
||||||
|
for (var i = 0; i < faceIds.length - 3; i+=4) {
|
||||||
|
var down = faceIds[i], left = faceIds[i+1], right = faceIds[i+2], up = faceIds[i+3];
|
||||||
|
var obj = {down: down.id, left: left.id, right: right.id, up: up.id};
|
||||||
|
mapActions.push(["add", "['" + down.idnum + "']['faceIds']", obj]);
|
||||||
|
mapActions.push(["add", "['" + left.idnum + "']['faceIds']", obj]);
|
||||||
|
mapActions.push(["add", "['" + right.idnum + "']['faceIds']", obj]);
|
||||||
|
mapActions.push(["add", "['" + up.idnum + "']['faceIds']", obj]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mapActions.length==0) {
|
if (mapActions.length==0) {
|
||||||
callback("没有要注册的项!");
|
callback("没有要注册的项!");
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -823,6 +823,13 @@ actions.prototype._selectChoices = function (length, keycode, callback) {
|
|||||||
if (keycode == 13 || keycode == 32 || keycode == 67) {
|
if (keycode == 13 || keycode == 32 || keycode == 67) {
|
||||||
callback.apply(this, [this.HSIZE, topIndex + core.status.event.selection]);
|
callback.apply(this, [this.HSIZE, topIndex + core.status.event.selection]);
|
||||||
}
|
}
|
||||||
|
//左右方向键调整 音量 行走速度
|
||||||
|
if(core.status.event.id == "switchs" && (core.status.event.selection == 2 || core.status.event.selection == 3))
|
||||||
|
{
|
||||||
|
if (keycode == 37) callback.apply(this, [this.HSIZE - 2, topIndex + core.status.event.selection]);
|
||||||
|
if (keycode == 39) callback.apply(this, [this.HSIZE + 2, topIndex + core.status.event.selection]);
|
||||||
|
}
|
||||||
|
|
||||||
if (keycode >= 49 && keycode <= 57) {
|
if (keycode >= 49 && keycode <= 57) {
|
||||||
var index = keycode - 49;
|
var index = keycode - 49;
|
||||||
if (index < length) {
|
if (index < length) {
|
||||||
@ -1910,11 +1917,14 @@ actions.prototype._keyUpSL = function (keycode) {
|
|||||||
|
|
||||||
////// 系统设置界面时的点击操作 //////
|
////// 系统设置界面时的点击操作 //////
|
||||||
actions.prototype._clickSwitchs = function (x, y) {
|
actions.prototype._clickSwitchs = function (x, y) {
|
||||||
if (x < this.CHOICES_LEFT || x > this.CHOICES_RIGHT) return;
|
|
||||||
var choices = core.status.event.ui.choices;
|
var choices = core.status.event.ui.choices;
|
||||||
var topIndex = this.HSIZE - parseInt((choices.length - 1) / 2) + (core.status.event.ui.offset || 0);
|
var topIndex = this.HSIZE - parseInt((choices.length - 1) / 2) + (core.status.event.ui.offset || 0);
|
||||||
if (y >= topIndex && y < topIndex + choices.length) {
|
|
||||||
var selection = y - topIndex;
|
var selection = y - topIndex;
|
||||||
|
if (x < this.CHOICES_LEFT || x > this.CHOICES_RIGHT) {
|
||||||
|
if (selection != 2 && selection != 3) return;
|
||||||
|
if (x != this.HSIZE - 2 && x != this.HSIZE + 2) return;
|
||||||
|
}
|
||||||
|
if (selection >= 0 && selection < choices.length) {
|
||||||
core.status.event.selection = selection;
|
core.status.event.selection = selection;
|
||||||
switch (selection) {
|
switch (selection) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -1922,18 +1932,24 @@ actions.prototype._clickSwitchs = function (x, y) {
|
|||||||
case 1:
|
case 1:
|
||||||
return this._clickSwitchs_sound();
|
return this._clickSwitchs_sound();
|
||||||
case 2:
|
case 2:
|
||||||
return this._clickSwitchs_moveSpeed();
|
if (x == this.HSIZE - 2) return this._clickSwitchs_userVolume(-1);
|
||||||
|
if (x == this.HSIZE + 2) return this._clickSwitchs_userVolume(1);
|
||||||
|
return;
|
||||||
case 3:
|
case 3:
|
||||||
return this._clickSwitchs_displayEnemyDamage();
|
if (x == this.HSIZE - 2) return this._clickSwitchs_moveSpeed(-10);
|
||||||
|
if (x == this.HSIZE + 2) return this._clickSwitchs_moveSpeed(10);
|
||||||
|
return;
|
||||||
case 4:
|
case 4:
|
||||||
return this._clickSwitchs_displayCritical();
|
return this._clickSwitchs_displayEnemyDamage();
|
||||||
case 5:
|
case 5:
|
||||||
return this._clickSwitchs_displayExtraDamage();
|
return this._clickSwitchs_displayCritical();
|
||||||
case 6:
|
case 6:
|
||||||
return this._clickSwitchs_localForage();
|
return this._clickSwitchs_displayExtraDamage();
|
||||||
case 7:
|
case 7:
|
||||||
return this._clickSwitchs_clickMove();
|
return this._clickSwitchs_localForage();
|
||||||
case 8:
|
case 8:
|
||||||
|
return this._clickSwitchs_clickMove();
|
||||||
|
case 9:
|
||||||
core.status.event.selection = 0;
|
core.status.event.selection = 0;
|
||||||
core.ui.drawSettings();
|
core.ui.drawSettings();
|
||||||
break;
|
break;
|
||||||
@ -1952,14 +1968,20 @@ actions.prototype._clickSwitchs_sound = function () {
|
|||||||
core.ui.drawSwitchs();
|
core.ui.drawSwitchs();
|
||||||
}
|
}
|
||||||
|
|
||||||
actions.prototype._clickSwitchs_moveSpeed = function () {
|
actions.prototype._clickSwitchs_userVolume = function (delta) {
|
||||||
core.myprompt("请输入行走速度(每走一步的时间,单位毫秒,默认100)", core.values.moveSpeed, function (value) {
|
var value = Math.round(Math.sqrt(100 * core.musicStatus.userVolume));
|
||||||
value = parseInt(value) || core.values.moveSpeed;
|
core.musicStatus.userVolume = core.clamp(Math.pow(value + delta, 2) / 100, 0, 1);
|
||||||
value = core.clamp(value, 10, 500);
|
//audioContext 音效 不受designVolume 影响
|
||||||
core.values.moveSpeed = value;
|
if (core.musicStatus.gainNode != null) core.musicStatus.gainNode.gain.value = core.musicStatus.userVolume;
|
||||||
core.setLocalStorage("moveSpeed", value);
|
if (core.musicStatus.playingBgm) core.material.bgms[core.musicStatus.playingBgm].volume = core.musicStatus.userVolume * core.musicStatus.designVolume;
|
||||||
|
core.setLocalStorage('userVolume', core.musicStatus.userVolume);
|
||||||
|
core.ui.drawSwitchs();
|
||||||
|
}
|
||||||
|
|
||||||
|
actions.prototype._clickSwitchs_moveSpeed = function (delta) {
|
||||||
|
core.values.moveSpeed = core.clamp(core.values.moveSpeed + delta, 50, 200);
|
||||||
|
core.setLocalStorage("moveSpeed", core.values.moveSpeed);
|
||||||
core.ui.drawSwitchs();
|
core.ui.drawSwitchs();
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
actions.prototype._clickSwitchs_displayEnemyDamage = function () {
|
actions.prototype._clickSwitchs_displayEnemyDamage = function () {
|
||||||
|
|||||||
@ -1465,6 +1465,10 @@ control.prototype._replayAction_equip = function (action) {
|
|||||||
var index = ownEquipment.indexOf(equipId), per = core.__SIZE__-1;
|
var index = ownEquipment.indexOf(equipId), per = core.__SIZE__-1;
|
||||||
if (index<0) return false;
|
if (index<0) return false;
|
||||||
core.status.route.push(action);
|
core.status.route.push(action);
|
||||||
|
if (core.material.items[equipId].hideInReplay) {
|
||||||
|
core.loadEquip(equipId, core.replay);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
core.status.event.data = {"page":Math.floor(index/per)+1, "selectId":null};
|
core.status.event.data = {"page":Math.floor(index/per)+1, "selectId":null};
|
||||||
index = index%per+per;
|
index = index%per+per;
|
||||||
core.ui.drawEquipbox(index);
|
core.ui.drawEquipbox(index);
|
||||||
@ -2247,7 +2251,7 @@ control.prototype._playBgm_play = function (bgm, startTime) {
|
|||||||
// 缓存BGM
|
// 缓存BGM
|
||||||
core.loader.loadBgm(bgm);
|
core.loader.loadBgm(bgm);
|
||||||
// 播放当前BGM
|
// 播放当前BGM
|
||||||
core.material.bgms[bgm].volume = core.musicStatus.volume;
|
core.material.bgms[bgm].volume = core.musicStatus.userVolume * core.musicStatus.designVolume;
|
||||||
core.material.bgms[bgm].currentTime = startTime || 0;
|
core.material.bgms[bgm].currentTime = startTime || 0;
|
||||||
core.material.bgms[bgm].play();
|
core.material.bgms[bgm].play();
|
||||||
core.musicStatus.playingBgm = bgm;
|
core.musicStatus.playingBgm = bgm;
|
||||||
@ -2320,7 +2324,7 @@ control.prototype.playSound = function (sound) {
|
|||||||
core.musicStatus.playingSounds[id] = source;
|
core.musicStatus.playingSounds[id] = source;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.material.sounds[sound].volume = core.musicStatus.volume;
|
core.material.sounds[sound].volume = core.musicStatus.userVolume;
|
||||||
core.material.sounds[sound].play();
|
core.material.sounds[sound].play();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -61,7 +61,8 @@ function core() {
|
|||||||
'lastBgm': null, // 上次播放的bgm
|
'lastBgm': null, // 上次播放的bgm
|
||||||
'gainNode': null,
|
'gainNode': null,
|
||||||
'playingSounds': {}, // 正在播放的SE
|
'playingSounds': {}, // 正在播放的SE
|
||||||
'volume': 1.0, // 音量
|
'userVolume': 1.0, // 用户音量
|
||||||
|
'designVolume': 1.0, //设计音量
|
||||||
'cachedBgms': [], // 缓存BGM内容
|
'cachedBgms': [], // 缓存BGM内容
|
||||||
'cachedBgmCount': 4, // 缓存的bgm数量
|
'cachedBgmCount': 4, // 缓存的bgm数量
|
||||||
}
|
}
|
||||||
@ -250,12 +251,14 @@ core.prototype._init_flags = function () {
|
|||||||
var locs = loc.split(","), x = parseInt(locs[0]), y = parseInt(locs[1]);
|
var locs = loc.split(","), x = parseInt(locs[0]), y = parseInt(locs[1]);
|
||||||
for (var index in autoEvents[loc]) {
|
for (var index in autoEvents[loc]) {
|
||||||
var autoEvent = core.clone(autoEvents[loc][index]);
|
var autoEvent = core.clone(autoEvents[loc][index]);
|
||||||
if (autoEvent && autoEvent.data) {
|
if (autoEvent && autoEvent.condition && autoEvent.data) {
|
||||||
autoEvent.floorId = floorId;
|
autoEvent.floorId = floorId;
|
||||||
autoEvent.x = x;
|
autoEvent.x = x;
|
||||||
autoEvent.y = y;
|
autoEvent.y = y;
|
||||||
autoEvent.index = index;
|
autoEvent.index = index;
|
||||||
autoEvent.symbol = floorId + "@" + x + "@" + y + "@" + index;
|
autoEvent.symbol = floorId + "@" + x + "@" + y + "@" + index;
|
||||||
|
autoEvent.condition = core.replaceValue(autoEvent.condition);
|
||||||
|
autoEvent.data = core.precompile(autoEvent.data);
|
||||||
core.initStatus.autoEvents.push(autoEvent);
|
core.initStatus.autoEvents.push(autoEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -302,6 +305,8 @@ core.prototype._init_platform = function () {
|
|||||||
}
|
}
|
||||||
core.musicStatus.bgmStatus = core.getLocalStorage('bgmStatus', true);
|
core.musicStatus.bgmStatus = core.getLocalStorage('bgmStatus', true);
|
||||||
core.musicStatus.soundStatus = core.getLocalStorage('soundStatus', true);
|
core.musicStatus.soundStatus = core.getLocalStorage('soundStatus', true);
|
||||||
|
//新增 userVolume 默认值1.0
|
||||||
|
core.musicStatus.userVolume = core.getLocalStorage('userVolume', 1.0);
|
||||||
["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"].forEach(function (t) {
|
["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"].forEach(function (t) {
|
||||||
if (navigator.userAgent.indexOf(t) >= 0) {
|
if (navigator.userAgent.indexOf(t) >= 0) {
|
||||||
if (t == 'iPhone' || t == 'iPad' || t == 'iPod') core.platform.isIOS = true;
|
if (t == 'iPhone' || t == 'iPad' || t == 'iPod') core.platform.isIOS = true;
|
||||||
|
|||||||
221
libs/events.js
221
libs/events.js
@ -234,7 +234,14 @@ events.prototype._gameOver_askRate = function (ending) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ending == null) {
|
if (ending == null) {
|
||||||
|
core.status.event.selection = 0;
|
||||||
|
core.ui.drawConfirmBox("你想读取自动存档么?", function () {
|
||||||
|
core.ui.closePanel();
|
||||||
|
core.doSL("autoSave", "load");
|
||||||
|
}, function () {
|
||||||
|
core.ui.closePanel();
|
||||||
core.restart();
|
core.restart();
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -931,6 +938,8 @@ events.prototype.insertAction = function (action, x, y, callback, addToLast) {
|
|||||||
}
|
}
|
||||||
if (!action) return;
|
if (!action) return;
|
||||||
|
|
||||||
|
action = this.precompile(action);
|
||||||
|
|
||||||
if (core.status.event.id != 'action') {
|
if (core.status.event.id != 'action') {
|
||||||
this.startEvents(action, x, y, callback);
|
this.startEvents(action, x, y, callback);
|
||||||
}
|
}
|
||||||
@ -1039,6 +1048,98 @@ events.prototype.popEventLoc = function () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype.precompile = function (data) {
|
||||||
|
var array = this.__precompile_getArray();
|
||||||
|
if (typeof data == 'string') {
|
||||||
|
return this.__precompile_text(data);
|
||||||
|
}
|
||||||
|
if (data instanceof Array) {
|
||||||
|
for (var i = 0; i < data.length; ++i) {
|
||||||
|
data[i] = this.precompile(data[i]);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
if (data && data.type) {
|
||||||
|
if (this["_precompile_" + data.type]) {
|
||||||
|
data = this["_precompile_" + data.type](data);
|
||||||
|
}
|
||||||
|
if (array.texts.indexOf(data.type) >= 0) {
|
||||||
|
data.text = this.__precompile_text(data.text);
|
||||||
|
}
|
||||||
|
if (array.locs.indexOf(data.type) >= 0) {
|
||||||
|
data.loc = this.__precompile_array(data.loc);
|
||||||
|
}
|
||||||
|
if (array.values.indexOf(data.type) >= 0) {
|
||||||
|
data.value = core.replaceValue(data.value);
|
||||||
|
}
|
||||||
|
if (array.uievents.indexOf(data.type) >= 0) {
|
||||||
|
data.x = core.replaceValue(data.x);
|
||||||
|
data.y = core.replaceValue(data.y);
|
||||||
|
data.width = core.replaceValue(data.width);
|
||||||
|
data.height = core.replaceValue(data.height);
|
||||||
|
}
|
||||||
|
if (data.type in array.others) {
|
||||||
|
array.others[data.type].forEach(function (field) {
|
||||||
|
data[field] = core.replaceValue(data[field]);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
events.prototype.__precompile_getArray = function () {
|
||||||
|
var texts = [
|
||||||
|
"text", "autoText", "scrollText", "tip", "textImage", "input", "input2",
|
||||||
|
"choices", "confirm", "fillText", "fillBoldText", "drawTextContent"
|
||||||
|
];
|
||||||
|
var locs = [
|
||||||
|
"show", "hide", "setBlock", "showFloorImg", "hideFloorImg", "showBgFgMap",
|
||||||
|
"hideBgFgMap", "setBgFgBlock", "animate", "setViewport", "move", "jumoHero",
|
||||||
|
"changeFloor", "changePos", "showTextImage", "showGif", "openDoor",
|
||||||
|
"closeDoor", "battle", "trigger", "insert"
|
||||||
|
];
|
||||||
|
var values = [
|
||||||
|
"setValue", "setValue2", "addValue", "setEnemy", "setFloor", "setGlobalValue",
|
||||||
|
];
|
||||||
|
var uievents = [
|
||||||
|
"clearMap", "fillText", "fillBoldText", "fillRect", "strokeRect", "strokeCircle",
|
||||||
|
"drawIcon", "drawSelector", "drawBackground",
|
||||||
|
];
|
||||||
|
var others = {
|
||||||
|
"strokeCircle": ["r"],
|
||||||
|
"drawLine": ["x1", "y1", "x2", "y2"],
|
||||||
|
"drawArrow": ["x1", "y1", "x2", "y2"],
|
||||||
|
"drawImage": ["x", "y", "w", "h", "x1", "y1", "w1", "h1"],
|
||||||
|
"drawTextContent": ["left", "top"],
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
texts: texts,
|
||||||
|
locs: locs,
|
||||||
|
values: values,
|
||||||
|
uievents: uievents,
|
||||||
|
others: others
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
events.prototype.__precompile_text = function (text) {
|
||||||
|
return text.replace(/\${(.*?)}/g, function (word, value) {
|
||||||
|
return "${" + core.replaceValue(value) + "}";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
events.prototype.__precompile_array = function (value) {
|
||||||
|
if (typeof value == 'string') {
|
||||||
|
value = core.replaceValue(value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
if (value instanceof Array) {
|
||||||
|
for (var i = 0; i < value.length; ++i) {
|
||||||
|
value[i] = this.__precompile_array(value[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
// ------ 样板提供的的自定义事件 ------ //
|
// ------ 样板提供的的自定义事件 ------ //
|
||||||
|
|
||||||
events.prototype.__action_checkReplaying = function () {
|
events.prototype.__action_checkReplaying = function () {
|
||||||
@ -1231,6 +1332,12 @@ events.prototype._action_jump = function (data, x, y, prefix) {
|
|||||||
this.__action_doAsyncFunc(data.async, core.jumpBlock, from[0], from[1], to[0], to[1], data.time, data.keep);
|
this.__action_doAsyncFunc(data.async, core.jumpBlock, from[0], from[1], to[0], to[1], data.time, data.keep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_jump = function (data) {
|
||||||
|
data.from = this.__precompile_array(data.from);
|
||||||
|
data.to = this.__precompile_array(data.to);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_jumpHero = function (data, x, y, prefix) {
|
events.prototype._action_jumpHero = function (data, x, y, prefix) {
|
||||||
var loc = this.__action_getHeroLoc(data.loc, prefix);
|
var loc = this.__action_getHeroLoc(data.loc, prefix);
|
||||||
this.__action_doAsyncFunc(data.async, core.jumpHero, loc[0], loc[1], data.time);
|
this.__action_doAsyncFunc(data.async, core.jumpHero, loc[0], loc[1], data.time);
|
||||||
@ -1258,6 +1365,12 @@ events.prototype._action_showImage = function (data, x, y, prefix) {
|
|||||||
data.code, data.image, data.sloc, data.loc, data.opacity, data.time);
|
data.code, data.image, data.sloc, data.loc, data.opacity, data.time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_showImage = function (data) {
|
||||||
|
data.sloc = this.__precompile_array(data.sloc);
|
||||||
|
data.loc = this.__precompile_array(data.loc);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_showTextImage = function (data, x, y, prefix) {
|
events.prototype._action_showTextImage = function (data, x, y, prefix) {
|
||||||
var loc = this.__action_getLoc(data.loc, 0, 0, prefix);
|
var loc = this.__action_getLoc(data.loc, 0, 0, prefix);
|
||||||
if (core.isReplaying()) data.time = 0;
|
if (core.isReplaying()) data.time = 0;
|
||||||
@ -1281,6 +1394,11 @@ events.prototype._action_moveImage = function (data, x, y, prefix) {
|
|||||||
this.__action_doAsyncFunc(data.async, core.moveImage, data.code, data.to, data.opacity, data.time);
|
this.__action_doAsyncFunc(data.async, core.moveImage, data.code, data.to, data.opacity, data.time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_moveImage = function (data) {
|
||||||
|
data.to = this.__precompile_array(data.to);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_setFg = function (data, x, y, prefix) {
|
events.prototype._action_setFg = function (data, x, y, prefix) {
|
||||||
return this._action_setCurtain(data, x, y, prefix);
|
return this._action_setCurtain(data, x, y, prefix);
|
||||||
}
|
}
|
||||||
@ -1339,6 +1457,16 @@ events.prototype._action_useItem = function (data, x, y, prefix) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._action_loadEquip = function (data, x, y, prefix) {
|
||||||
|
core.loadEquip(data.id);
|
||||||
|
core.doAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
events.prototype._action_unloadEquip = function (data, x, y, prefix) {
|
||||||
|
core.unloadEquip(data.pos);
|
||||||
|
core.doAction();
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_openShop = function (data, x, y, prefix) {
|
events.prototype._action_openShop = function (data, x, y, prefix) {
|
||||||
core.status.shops[data.id].visited = true;
|
core.status.shops[data.id].visited = true;
|
||||||
this.setEvents([]);
|
this.setEvents([]);
|
||||||
@ -1453,6 +1581,15 @@ events.prototype._action_setVolume = function (data, x, y, prefix) {
|
|||||||
|
|
||||||
events.prototype._action_setValue = function (data, x, y, prefix) {
|
events.prototype._action_setValue = function (data, x, y, prefix) {
|
||||||
this.setValue(data.name, data.value, prefix);
|
this.setValue(data.name, data.value, prefix);
|
||||||
|
if (data.refresh) {
|
||||||
|
if (core.status.hero.hp <= 0) {
|
||||||
|
core.status.hero.hp = 0;
|
||||||
|
core.updateStatusBar();
|
||||||
|
core.events.lose();
|
||||||
|
} else {
|
||||||
|
core.updateStatusBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1462,6 +1599,15 @@ events.prototype._action_setValue2 = function (data, x, y, prefix) {
|
|||||||
|
|
||||||
events.prototype._action_addValue = function (data, x, y, prefix) {
|
events.prototype._action_addValue = function (data, x, y, prefix) {
|
||||||
this.addValue(data.name, data.value, prefix);
|
this.addValue(data.name, data.value, prefix);
|
||||||
|
if (data.refresh) {
|
||||||
|
if (core.status.hero.hp <= 0) {
|
||||||
|
core.status.hero.hp = 0;
|
||||||
|
core.updateStatusBar();
|
||||||
|
core.events.lose();
|
||||||
|
} else {
|
||||||
|
core.updateStatusBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1542,6 +1688,13 @@ events.prototype._action_if = function (data, x, y, prefix) {
|
|||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_if = function (data) {
|
||||||
|
data.condition = core.replaceValue(data.condition);
|
||||||
|
data["true"] = this.precompile(data["true"]);
|
||||||
|
data["false"] = this.precompile(data["false"]);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_switch = function (data, x, y, prefix) {
|
events.prototype._action_switch = function (data, x, y, prefix) {
|
||||||
var key = core.calValue(data.condition, prefix)
|
var key = core.calValue(data.condition, prefix)
|
||||||
var list = [];
|
var list = [];
|
||||||
@ -1557,6 +1710,15 @@ events.prototype._action_switch = function (data, x, y, prefix) {
|
|||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_switch = function (data) {
|
||||||
|
data.condition = core.replaceValue(data.condition);
|
||||||
|
for (var i = 0; i < data.caseList.length; i++) {
|
||||||
|
data.caseList[i]["case"] = core.replaceValue(data.caseList[i]["case"]);
|
||||||
|
data.caseList[i].action = this.precompile(data.caseList[i].action);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_choices = function (data, x, y, prefix) {
|
events.prototype._action_choices = function (data, x, y, prefix) {
|
||||||
data.choices = data.choices.filter(function (x) {
|
data.choices = data.choices.filter(function (x) {
|
||||||
if (x.condition == null || x.condition == '') return true;
|
if (x.condition == null || x.condition == '') return true;
|
||||||
@ -1583,6 +1745,16 @@ events.prototype._action_choices = function (data, x, y, prefix) {
|
|||||||
core.ui.drawChoices(data.text, data.choices);
|
core.ui.drawChoices(data.text, data.choices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_choices = function (data) {
|
||||||
|
if (!(data.choices instanceof Array)) return data;
|
||||||
|
for (var i = 0; i < data.choices.length; ++i) {
|
||||||
|
data.choices[i].condition = core.replaceValue(data.choices[i].condition);
|
||||||
|
data.choices[i].text = this.__precompile_text(data.choices[i].text);
|
||||||
|
data.choices[i].action = this.precompile(data.choices[i].action);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_confirm = function (data, x, y, prefix) {
|
events.prototype._action_confirm = function (data, x, y, prefix) {
|
||||||
core.status.event.ui = {"text": data.text, "yes": data.yes, "no": data.no};
|
core.status.event.ui = {"text": data.text, "yes": data.yes, "no": data.no};
|
||||||
if (core.isReplaying()) {
|
if (core.isReplaying()) {
|
||||||
@ -1609,6 +1781,12 @@ events.prototype._action_confirm = function (data, x, y, prefix) {
|
|||||||
core.ui.drawConfirmBox(data.text);
|
core.ui.drawConfirmBox(data.text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_confirm = function (data) {
|
||||||
|
data.yes = this.precompile(data.yes);
|
||||||
|
data.no = this.precompile(data.no);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_while = function (data, x, y, prefix) {
|
events.prototype._action_while = function (data, x, y, prefix) {
|
||||||
if (core.calValue(data.condition, prefix)) {
|
if (core.calValue(data.condition, prefix)) {
|
||||||
core.unshift(core.status.event.data.list,
|
core.unshift(core.status.event.data.list,
|
||||||
@ -1618,6 +1796,12 @@ events.prototype._action_while = function (data, x, y, prefix) {
|
|||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_while = function (data) {
|
||||||
|
data.condition = core.replaceValue(data.condition);
|
||||||
|
data.data = this.precompile(data.data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_dowhile = function (data, x, y, prefix) {
|
events.prototype._action_dowhile = function (data, x, y, prefix) {
|
||||||
core.unshift(core.status.event.data.list,
|
core.unshift(core.status.event.data.list,
|
||||||
{"todo": core.clone(data.data), "total": core.clone(data.data), "condition": data.condition}
|
{"todo": core.clone(data.data), "total": core.clone(data.data), "condition": data.condition}
|
||||||
@ -1625,6 +1809,12 @@ events.prototype._action_dowhile = function (data, x, y, prefix) {
|
|||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_dowhile = function (data) {
|
||||||
|
data.condition = core.replaceValue(data.condition);
|
||||||
|
data.data = this.precompile(data.data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_break = function (data, x, y, prefix) {
|
events.prototype._action_break = function (data, x, y, prefix) {
|
||||||
core.status.event.data.list.shift();
|
core.status.event.data.list.shift();
|
||||||
core.doAction();
|
core.doAction();
|
||||||
@ -1641,11 +1831,11 @@ events.prototype._action_continue = function (data, x, y, prefix) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
events.prototype._action_win = function (data, x, y, prefix) {
|
events.prototype._action_win = function (data, x, y, prefix) {
|
||||||
this.win(data.reason, data.norank, data.noexit);
|
this.win(core.replaceText(data.reason), data.norank, data.noexit);
|
||||||
}
|
}
|
||||||
|
|
||||||
events.prototype._action_lose = function (data, x, y, prefix) {
|
events.prototype._action_lose = function (data, x, y, prefix) {
|
||||||
this.lose(data.reason);
|
this.lose(core.replaceText(data.reason));
|
||||||
}
|
}
|
||||||
|
|
||||||
events.prototype._action_restart = function (data, x, y, prefix) {
|
events.prototype._action_restart = function (data, x, y, prefix) {
|
||||||
@ -1809,6 +1999,11 @@ events.prototype._action_previewUI = function (data, x, y, prefix) {
|
|||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_previewUI = function (data) {
|
||||||
|
data.action = this.precompile(data.action);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype.__action_doUIEvent = function (data) {
|
events.prototype.__action_doUIEvent = function (data) {
|
||||||
this.__action_doUIEvent_doOne(data);
|
this.__action_doUIEvent_doOne(data);
|
||||||
var current = core.status.event.data.list[0];
|
var current = core.status.event.data.list[0];
|
||||||
@ -1849,6 +2044,11 @@ events.prototype._action_fillPolygon = function (data, x, y, prefix) {
|
|||||||
this.__action_doUIEvent(data);
|
this.__action_doUIEvent(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_fillPolygon = function (data) {
|
||||||
|
data.nodes = this.__precompile_array(data.nodes);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_strokeRect = function (data, x, y, prefix) {
|
events.prototype._action_strokeRect = function (data, x, y, prefix) {
|
||||||
this.__action_doUIEvent(data);
|
this.__action_doUIEvent(data);
|
||||||
}
|
}
|
||||||
@ -1857,6 +2057,11 @@ events.prototype._action_strokePolygon = function (data, x, y, prefix) {
|
|||||||
this.__action_doUIEvent(data);
|
this.__action_doUIEvent(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._precompile_strokePolygon = function (data) {
|
||||||
|
data.nodes = this.__precompile_array(data.nodes);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
events.prototype._action_fillCircle = function (data, x, y, prefix) {
|
events.prototype._action_fillCircle = function (data, x, y, prefix) {
|
||||||
this.__action_doUIEvent(data);
|
this.__action_doUIEvent(data);
|
||||||
}
|
}
|
||||||
@ -2099,17 +2304,11 @@ events.prototype.setValue = function (name, value, prefix, add) {
|
|||||||
this._setValue_setFlag(name, value);
|
this._setValue_setFlag(name, value);
|
||||||
this._setValue_setSwitch(name, value, prefix);
|
this._setValue_setSwitch(name, value, prefix);
|
||||||
this._setValue_setGlobal(name, value);
|
this._setValue_setGlobal(name, value);
|
||||||
core.updateStatusBar();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
events.prototype._setValue_setStatus = function (name, value) {
|
events.prototype._setValue_setStatus = function (name, value) {
|
||||||
if (name.indexOf("status:") !== 0) return;
|
if (name.indexOf("status:") !== 0) return;
|
||||||
core.setStatus(name.substring(7), value);
|
core.setStatus(name.substring(7), value);
|
||||||
if (core.status.hero.hp <= 0) {
|
|
||||||
core.status.hero.hp = 0;
|
|
||||||
core.updateStatusBar();
|
|
||||||
core.events.lose();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
events.prototype._setValue_setItem = function (name, value) {
|
events.prototype._setValue_setItem = function (name, value) {
|
||||||
@ -2341,16 +2540,16 @@ events.prototype.showGif = function (name, x, y) {
|
|||||||
////// 淡入淡出音乐 //////
|
////// 淡入淡出音乐 //////
|
||||||
events.prototype.setVolume = function (value, time, callback) {
|
events.prototype.setVolume = function (value, time, callback) {
|
||||||
var set = function (value) {
|
var set = function (value) {
|
||||||
core.musicStatus.volume = value;
|
core.musicStatus.designVolume = value;
|
||||||
if (core.musicStatus.playingBgm)
|
if (core.musicStatus.playingBgm)
|
||||||
core.material.bgms[core.musicStatus.playingBgm].volume = value;
|
core.material.bgms[core.musicStatus.playingBgm].volume = core.musicStatus.userVolume * core.musicStatus.designVolume;
|
||||||
}
|
}
|
||||||
if (!time || time < 100) {
|
if (!time || time < 100) {
|
||||||
set(value);
|
set(value);
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var currVolume = core.musicStatus.volume;
|
var currVolume = core.musicStatus.designVolume;
|
||||||
time /= Math.max(core.status.replay.speed, 1);
|
time /= Math.max(core.status.replay.speed, 1);
|
||||||
var per_time = 10, step = 0, steps = parseInt(time / per_time);
|
var per_time = 10, step = 0, steps = parseInt(time / per_time);
|
||||||
if (steps <= 0) steps = 1;
|
if (steps <= 0) steps = 1;
|
||||||
|
|||||||
@ -1496,7 +1496,10 @@ ui.prototype.drawSwitchs = function() {
|
|||||||
var choices = [
|
var choices = [
|
||||||
"背景音乐: "+(core.musicStatus.bgmStatus ? "[ON]" : "[OFF]"),
|
"背景音乐: "+(core.musicStatus.bgmStatus ? "[ON]" : "[OFF]"),
|
||||||
"背景音效: "+(core.musicStatus.soundStatus ? "[ON]" : "[OFF]"),
|
"背景音效: "+(core.musicStatus.soundStatus ? "[ON]" : "[OFF]"),
|
||||||
"行走速度: "+parseInt(core.values.moveSpeed),
|
//显示为 0~10 十挡
|
||||||
|
" < 音量:" + Math.round(Math.sqrt(100 * core.musicStatus.userVolume)) + " > ",
|
||||||
|
//数值越大耗时越长
|
||||||
|
" < 步时:" + core.values.moveSpeed + " > ",
|
||||||
"怪物显伤: "+(core.flags.displayEnemyDamage ? "[ON]" : "[OFF]"),
|
"怪物显伤: "+(core.flags.displayEnemyDamage ? "[ON]" : "[OFF]"),
|
||||||
"临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"),
|
"临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"),
|
||||||
"领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"),
|
"领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"),
|
||||||
|
|||||||
@ -66,19 +66,16 @@ utils.prototype.replaceText = function (text, need, times) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 计算表达式的值 //////
|
utils.prototype.replaceValue = function (value) {
|
||||||
utils.prototype.calValue = function (value, prefix, need, times) {
|
if (typeof value == "string" && value.indexOf(":") >= 0) {
|
||||||
if (!core.isset(value)) return null;
|
|
||||||
if (typeof value === 'string') {
|
|
||||||
if (value.indexOf(':') >= 0) {
|
|
||||||
if (value.indexOf('status:') >= 0)
|
if (value.indexOf('status:') >= 0)
|
||||||
value = value.replace(/status:([a-zA-Z0-9_]+)/g, "core.getStatus('$1')");
|
value = value.replace(/status:([a-zA-Z0-9_]+)/g, "core.getStatus('$1')");
|
||||||
if (value.indexOf('item:') >= 0)
|
if (value.indexOf('item:') >= 0)
|
||||||
value = value.replace(/item:([a-zA-Z0-9_]+)/g, "core.itemCount('$1')");
|
value = value.replace(/item:([a-zA-Z0-9_]+)/g, "core.itemCount('$1')");
|
||||||
if (value.indexOf('flag:') >= 0)
|
if (value.indexOf('flag:') >= 0)
|
||||||
value = value.replace(/flag:([a-zA-Z0-9_\u4E00-\u9FCC]+)/g, "core.getFlag('$1', 0)");
|
value = value.replace(/flag:([a-zA-Z0-9_\u4E00-\u9FCC]+)/g, "core.getFlag('$1', 0)");
|
||||||
if (value.indexOf('switch:' >= 0))
|
//if (value.indexOf('switch:' >= 0))
|
||||||
value = value.replace(/switch:([a-zA-Z0-9_]+)/g, "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)");
|
// value = value.replace(/switch:([a-zA-Z0-9_]+)/g, "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)");
|
||||||
if (value.indexOf('global:') >= 0)
|
if (value.indexOf('global:') >= 0)
|
||||||
value = value.replace(/global:([a-zA-Z0-9_\u4E00-\u9FCC]+)/g, "core.getGlobal('$1', 0)");
|
value = value.replace(/global:([a-zA-Z0-9_\u4E00-\u9FCC]+)/g, "core.getGlobal('$1', 0)");
|
||||||
if (value.indexOf('enemy:')>=0)
|
if (value.indexOf('enemy:')>=0)
|
||||||
@ -87,6 +84,20 @@ utils.prototype.calValue = function (value, prefix, need, times) {
|
|||||||
value = value.replace(/blockId:(\d+),(\d+)/g, "core.getBlockId($1, $2)");
|
value = value.replace(/blockId:(\d+),(\d+)/g, "core.getBlockId($1, $2)");
|
||||||
if (value.indexOf('blockCls:')>=0)
|
if (value.indexOf('blockCls:')>=0)
|
||||||
value = value.replace(/blockCls:(\d+),(\d+)/g, "core.getBlockCls($1, $2)");
|
value = value.replace(/blockCls:(\d+),(\d+)/g, "core.getBlockCls($1, $2)");
|
||||||
|
if (value.indexOf('equip:')>=0)
|
||||||
|
value = value.replace(/equip:(\d)/g, "core.getEquip($1)");
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
////// 计算表达式的值 //////
|
||||||
|
utils.prototype.calValue = function (value, prefix, need, times) {
|
||||||
|
if (!core.isset(value)) return null;
|
||||||
|
if (typeof value === 'string') {
|
||||||
|
if (value.indexOf(':') >= 0) {
|
||||||
|
if (value.indexOf('switch:' >= 0))
|
||||||
|
value = value.replace(/switch:([a-zA-Z0-9_]+)/g, "core.getFlag('" + (prefix || ":f@x@y") + "@$1', 0)");
|
||||||
|
value = this.replaceValue(value);
|
||||||
}
|
}
|
||||||
return eval(value);
|
return eval(value);
|
||||||
}
|
}
|
||||||
|
|||||||
6
main.js
6
main.js
@ -2,7 +2,7 @@ function main() {
|
|||||||
|
|
||||||
//------------------------ 用户修改内容 ------------------------//
|
//------------------------ 用户修改内容 ------------------------//
|
||||||
|
|
||||||
this.version = "2.6.4"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。
|
this.version = "2.6.5"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。
|
||||||
|
|
||||||
this.useCompress = false; // 是否使用压缩文件
|
this.useCompress = false; // 是否使用压缩文件
|
||||||
// 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。
|
// 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。
|
||||||
@ -189,8 +189,8 @@ function main() {
|
|||||||
this.floors = {}
|
this.floors = {}
|
||||||
this.canvas = {};
|
this.canvas = {};
|
||||||
|
|
||||||
this.__VERSION__ = "2.6.4";
|
this.__VERSION__ = "2.6.5";
|
||||||
this.__VERSION_CODE__ = 78;
|
this.__VERSION_CODE__ = 87;
|
||||||
}
|
}
|
||||||
|
|
||||||
main.prototype.init = function (mode, callback) {
|
main.prototype.init = function (mode, callback) {
|
||||||
|
|||||||
@ -78,7 +78,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
|||||||
"firstData": {
|
"firstData": {
|
||||||
"title": "魔塔样板",
|
"title": "魔塔样板",
|
||||||
"name": "template",
|
"name": "template",
|
||||||
"version": "Ver 2.6.4",
|
"version": "Ver 2.6.5",
|
||||||
"floorId": "sample0",
|
"floorId": "sample0",
|
||||||
"hero": {
|
"hero": {
|
||||||
"name": "阳光",
|
"name": "阳光",
|
||||||
|
|||||||
@ -138,8 +138,7 @@ var icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 =
|
|||||||
"npc0": 0,
|
"npc0": 0,
|
||||||
"npc1": 1,
|
"npc1": 1,
|
||||||
"npc2": 2,
|
"npc2": 2,
|
||||||
"npc3": 3,
|
"npc3": 3
|
||||||
"npc4": 4
|
|
||||||
},
|
},
|
||||||
"enemys": {
|
"enemys": {
|
||||||
"greenSlime": 0,
|
"greenSlime": 0,
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 27 KiB |
BIN
project/images/npc48.png
Normal file → Executable file
BIN
project/images/npc48.png
Normal file → Executable file
Binary file not shown.
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 5.4 KiB |
@ -98,11 +98,10 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e =
|
|||||||
"130": {"cls":"npcs","id":"pinkShop"},
|
"130": {"cls":"npcs","id":"pinkShop"},
|
||||||
"131": {"cls":"npcs","id":"blueShop"},
|
"131": {"cls":"npcs","id":"blueShop"},
|
||||||
"132": {"cls":"npcs","id":"princess"},
|
"132": {"cls":"npcs","id":"princess"},
|
||||||
"133": {"cls":"npc48","id":"npc0"},
|
"133": {"cls":"npc48","id":"npc0","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"}},
|
||||||
"134": {"cls":"npc48","id":"npc1"},
|
"134": {"cls":"npc48","id":"npc1","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"}},
|
||||||
"135": {"cls":"npc48","id":"npc2"},
|
"135": {"cls":"npc48","id":"npc2","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"}},
|
||||||
"136": {"cls":"npc48","id":"npc3"},
|
"136": {"cls":"npc48","id":"npc3","faceIds":{"down":"npc0","left":"npc1","right":"npc2","up":"npc3"}},
|
||||||
"137": {"cls":"npc48","id":"npc4"},
|
|
||||||
"151": {"cls":"autotile","id":"autotile1","noPass":true},
|
"151": {"cls":"autotile","id":"autotile1","noPass":true},
|
||||||
"152": {"cls":"autotile","id":"autotile2","noPass":true},
|
"152": {"cls":"autotile","id":"autotile2","noPass":true},
|
||||||
"153": {"cls":"autotile","id":"autotile3","noPass":true},
|
"153": {"cls":"autotile","id":"autotile3","noPass":true},
|
||||||
|
|||||||
BIN
常用工具/动画编辑器.exe
Normal file
BIN
常用工具/动画编辑器.exe
Normal file
Binary file not shown.
BIN
常用工具/怪物数据生成机.exe
Normal file
BIN
常用工具/怪物数据生成机.exe
Normal file
Binary file not shown.
39
更新说明.txt
39
更新说明.txt
@ -1,4 +1,41 @@
|
|||||||
HTML5魔塔样板V2.6.3
|
HTML5魔塔样板V2.6.5
|
||||||
|
|
||||||
|
事件:设置怪物属性;穿脱装备
|
||||||
|
新值块:enemy:xxx:atk可获得怪物数据
|
||||||
|
新值块:blockId:x,y获得某点图块ID
|
||||||
|
部分事件预编译,加快执行速度
|
||||||
|
在系统设置中可以设置bgm的播放音量
|
||||||
|
通关事件可以不退出游戏
|
||||||
|
失败时允许直接读取自动存档
|
||||||
|
NPC48自动注册可以自动绑定faceIds
|
||||||
|
编辑器Alt+1-9存图块,1-9读取图块
|
||||||
|
编辑器现在可以跨楼层复制粘贴图块了
|
||||||
|
可以对flags.进行自动补全
|
||||||
|
部分Bug修复,大量细节优化
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
HTML5魔塔样板V2.6.4
|
||||||
|
|
||||||
|
自动事件,多事件页
|
||||||
|
增加开场logo动画
|
||||||
|
拓展:游戏时动态修改地图和怪物数据
|
||||||
|
插件:道具商店,支持买入和卖出道具
|
||||||
|
编辑器可以搜索变量出现位置
|
||||||
|
变量的中文替换
|
||||||
|
可以给图块绑定自定义脚本,碰触时触发
|
||||||
|
编辑器右键可以绑定机关门和出生点
|
||||||
|
支持多个drawTip同时出现
|
||||||
|
闪烁光标同时支持多个同时存在
|
||||||
|
插件:镜头平滑移动,默认禁用
|
||||||
|
素材的快速追加
|
||||||
|
批量导出动画
|
||||||
|
部分Bug修复,大量细节优化
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
HTML5魔塔样板V2.6.3
|
||||||
|
|
||||||
标题界面大幅美化,增加闪烁光标,支持键盘开始游戏
|
标题界面大幅美化,增加闪烁光标,支持键盘开始游戏
|
||||||
事件编辑器支持自动补全,能对flag和API列表等进行补全
|
事件编辑器支持自动补全,能对flag和API列表等进行补全
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user