大幅优化文档

This commit is contained in:
ckcz123 2020-06-07 18:32:20 +08:00
parent a52c151dd8
commit 7980de899c
170 changed files with 2336 additions and 3708 deletions

View File

@ -10,7 +10,7 @@ HTML5 canvas制作的魔塔样板支持全平台游戏
* [Docs / 使用文档说明](https://ckcz123.github.io/mota-js/)
* [Video / 视频教程](https://www.bilibili.com/video/av32781473/)
![样板](./_docs/img/sample0.png)
![样板](./_docs/img/sample0.jpg)
## 目录结构

View File

@ -1,685 +0,0 @@
# 附录: API列表
?> 目前版本**v2.6**,上次更新时间:* {docsify-updated} *
**这里只列出所有可能会被造塔者用到的常用API更多的有关内容请在代码内进行查询。**
如有任何疑问,请联系小艾寻求帮助。
可以在chrome浏览器的控制台中`ctrl+shift+I`找到Console中直接进行调用以查看效果。
**以下所有异步API都会加上[异步]的说明,存在此说明的请勿在事件处理的自定义脚本中使用。**
!> 最常用的新手向命令,强烈建议每个人了解
``` text
core.status.floorId
获得当前层的floorId。
core.status.maps
获得所有楼层的地图信息。
core.status.thisMap
获得当前楼层信息其等价于core.status.maps[core.status.floorId]。
core.floors
获得所有楼层的信息。例如core.floors[core.status.floorId].events可获得本楼层的所有自定义事件。
core.status.hero
获得当前勇士状态信息。例如core.status.hero.atk就是当前勇士的攻击力数值。
core.material.enemys
获得所有怪物信息。例如core.material.enemys.greenSlime就是获得绿色史莱姆的属性数据。
core.material.items
获得所有道具的信息。
core.debug()
开启调试模式。此模式下可以按Ctrl键进行穿墙并忽略一切事件。
此模式下不可回放录像和上传成绩。
core.updateStatusBar()
立刻刷新状态栏和地图显伤。
core.setStatus('atk', 1000)
将攻击力设置为1000这里把atk可以改成hp, def, mdef, money, exp等等。
本句等价于 core.status.hero.atk = 1000
core.getStatus('atk')
返回当前攻击力数值。本句等价于 core.status.hero.atk。
core.setHeroLoc('x', 5)
设置勇士位置。这句话的意思是将勇士当前位置的横坐标设置为5。
同理可以设置勇士纵坐标 core.setHeroLoc('y', 3)。
值得注意的是,这句话虽然会使勇士改变位置,但并不会使界面重新绘制;如需立刻重新绘制地图还需调用:
core.clearMap('hero'); core.drawHero();
来对界面进行更新。
core.setItem('pickaxe', 10)
将破墙镐个数设置为10个。这里可以写任何道具的ID。
core.addItem('pickaxe', 2)
将破墙镐的个数增加2个无任何特效。这里可以写任何道具的ID。
core.getItem('pickaxe', 4)
令勇士获得4个破墙镐。这里可以写任何道具的ID。
和addItem相比使用getItem会播放获得道具的音效也会在左上角绘制获得提示。
core.removeItem('pickaxe', 3)
删除3个破墙镐。第二项可忽略默认值为1。
core.itemCount('pickaxe')
返回当前破墙镐的个数。这里可以写任何道具的ID。
core.hasItem('pickaxe')
返回当前是否存在某个道具。等价于 core.itemCount('pickaxe')>0 。
core.getEquip(0)
获得0号装备类型武器的当前装备的itemId。如果不存在则返回null。
这里可以写任意装备类型从0开始和全塔属性中的equipName一一对应。
core.hasEquip('sword1')
获得当前某个具体的装备是否处于正在被装备状态。
core.setFlag('xyz', 2)
设置某个flag/变量的值为2。这里可以写任何的flag变量名。
core.getFlag('xyz', 7)
获得某个flag/变量的值;如果该变量不存在,则返回第二个参数。
比如 core.getFlag('point', 2) 则获得变量point的值如果该变量从未定义过则返回2。
core.hasFlag('xyz')
返回是否存在某个变量且不为0。等价于 core.getFlag('xyz', 0)!=0 。
core.removeFlag('xyz')
删除某个flag/变量。
core.insertAction(list, x, y, callback)
插入并执行一段自定义事件。在这里你可以写任意的自定义事件列表,有关详细写法请参见文档-事件。
x和y如果设置则覆盖"当前事件点"的坐标callback如果设置则覆盖事件执行完毕后的回调函数。
例如: core.insertAction(["楼层切换", {"type":"changeFloor", "floorId": "MT3"}])
将依次显示剧情文本,并执行一个楼层切换的自定义事件。
--------
从V2.5.4开始提出了“公共事件”的说法,这里也可以插入一个公共事件名。
例如core.insertAction("毒衰咒处理") 将插入公共事件“毒衰咒处理”。
core.changeFloor(floorId, stair, heroLoc, time, callback) [异步]
立刻切换到指定楼层。
floorId为目标楼层IDstair为到达的目标楼梯heroLoc为到达的指定点time为动画时间callback为切换完毕后的回调。
例如:
core.changeFloor('MT2', 'upFloor', null, 600) 切换到MT2层的上楼点动画事件600ms
core.changeFloor('MT5', null, {'x': 3, 'y': 6}, 0) 无动画切换到MT5层的(3,6)位置。
core.resetMap()
重置当前楼层地图和楼层属性。
此函数参数有三种形式:
- 不加任何参数表示重置当前层core.resetMap()
- 加上一个floorId表示重置某一层core.resetMap("MT1")
- 使用一个数组表示重置若干层core.resetMap(["MT1", "MT2", "MT3"])
---------------------------
** 说明从V2.5.5开始存档方式发生了改变,在编辑器修改了地图后现在将直接生效,无需再重置地图。
R
录像回放的快捷键;这不是一个控制台命令,但是也把它放在这里供使用。
录像回放在修改地图或新增数据后会很有用。
```
!> 一些相对高级的命令,针对有一定脚本经验的人
``` text
========== 可直接从core中调用的最常被使用的函数 ==========
core.js实际上是所有API的入口路由核心API的实现在其他几个文件中core.js主要进行转发操作。
core.nextX(n)
获得勇士面向的第n个位置的x坐标n可以省略默认为1即正前方
core.nextY(n)
获得勇士面向的第n个位置的y坐标n可以省略默认为1即正前方
core.nearHero(x, y)
判断某个点是否和勇士的距离不超过1。
core.openDoor(id, x, y, needKey, callback) [异步]
尝试开门操作。id为目标点的IDx和y为坐标needKey表示是否需要使用钥匙callback为开门完毕后的回调函数。
id可为null代表使用地图上的值。
例如core.openDoor('yellowDoor', 10, 3, false, function() {console.log("1")})
此函数返回true代表成功开门并将执行callback回调返回false代表无法开门且不会执行回调函数。
core.battle(id, x, y, force, callback) [异步]
执行战斗事件。id为怪物的idx和y为坐标force为bool值表示是否是强制战斗callback为战斗完毕后的回调函数。
id可为null代表使用地图上的值。
例如core.battle('greenSlime', null, null, true)
core.trigger(x, y) [异步]
触发某个地点的事件。
core.isReplaying()
当前是否正在录像播放中
core.drawBlock(block)
重绘某个图块。block应为core.status.thisMap.blocks中的一项。
core.drawMap(floorId, callback)
重绘某一层的地图。floorId为要绘制楼层的floorIdcallback为绘制完毕后的回调函数。
core.terrainExists(x, y, id, floorId)
检测某个点是否存在(指定的)地形。
x和y为坐标id为地形ID可为null表示任意地形floorId为楼层ID可忽略表示当前楼层。
core.enemyExists(x, y, id, floorId)
检测某个点是否存在(指定的)怪物。
x和y为坐标id为怪物ID可为null表示任意怪物floorId为楼层ID可忽略表示当前楼层。
core.getBlock(x, y, floorId, showDisable)
获得某个点的当前图块信息。
x和y为坐标floorId为楼层ID可忽略或null表示当前楼层。
showDisable如果为true则对于禁用的点和事件也会进行返回。
如果该点不存在图块则返回null。
否则,返回值如下: {"index": xxx, "block": xxx}
其中index为该点在该楼层blocks数组中的索引block为该图块实际内容。
core.getBlockId(x, y, floorId, showDisable)
获得某个点的图块ID。
x和y为坐标floorId为楼层ID可忽略或null表示当前楼层。
showDisable如果为true则对于禁用的点和事件也会进行返回。
如果该点不存在图块则返回null否则返回该点的图块ID。
core.getBlockCls(x, y, floorId, showDisable)
获得某个点的图块cls。
x和y为坐标floorId为楼层ID可忽略或null表示当前楼层。
showDisable如果为true则对于禁用的点和事件也会进行返回。
如果该点不存在图块则返回null否则返回该点的图块cls。
core.showBlock(x, y, floorId)
将某个点从禁用变成启用状态。
core.hideBlock(x, y, floorId)
将某个点从启用变成禁用状态,但不会对其进行删除。
此函数不会实际将该块从地图中进行删除,而是将该点设置为禁用,以供以后可能的启用事件。
core.removeBlock(x, y, floorId)
将从启用变成禁用状态,并尽可能将其从地图上删除。
和hideBlock相比如果该点不存在自定义事件比如门或普通的怪物则将直接从地图中删除。
如果存在自定义事件,则简单的禁用它,以供以后可能的启用事件。
core.setBlock(number, x, y, floorId)
改变图块。number为要改变到的图块数字x和y为坐标floorId为楼层ID可忽略表示当前楼层。
core.useItem(itemId, noRoute, callback)
尝试使用某个道具。itemId为道具IDnoRoute如果为真则该道具的使用不计入录像。
callback为成功或失败后的回调。
core.canUseItem(itemId)
返回当前能否使用某个道具。
core.loadEquip(itemId, callback)
装备上某个装备。itemId为装备的IDcallback为成功或失败后的回调。
core.unloadEquip(equipType, callback)
卸下某个部位的装备。equipType为装备类型从0开始callback为成功或失败后的回调。
core.getNextItem()
轻按。
core.drawTip(text, itemIcon)
在左上角绘制一段提示信息2秒后消失。itemIcon为道具图标的索引。
core.drawText(contents, callback) [异步]
绘制一段文字。
不推荐使用此函数尽量使用core.insertAction(contents)来显示剧情文本。
core.closePanel()
结束一切事件和绘制关闭UI窗口返回游戏进程。
core.replaceText(text, prefix, need, times)
将一段文字中的${}进行计算并替换。
core.calValue(value, prefix, need, times)
计算表达式的实际值。这个函数可以传入status:atk等这样的参数。
core.getLocalStorage(key, defaultValue)
从localStorage中获得某个数据已被parse如果对应的key不存在则返回defaultValue。
core.getLocalForage(key, defaultValue, successCallback, errorCallback)
从localForage中获得某个数据已被parse如果对应的key不存在则返回defaultValue。
如果成功则通过successCallback回调失败则通过errorCallback回调。
core.hasSave(index)
判定当前某个存档位是否存在存档返回true/false。
index为存档编号0代表自动存档大于0则为正常的存档位。
core.clone(data)
深拷贝某个对象。
core.isset(x)
测试x是否不为null不为undefined也不为NaN。
core.rand(num)
使用伪种子生成伪随机数。该随机函数能被录像支持。
num如果设置大于0则生成一个[0, num-1]之间的数否则生成一个0到1之间的浮点数。
此函数为伪随机算法SL大法无效。即多次SL后调用的该函数返回的值都是相同的。
core.rand2(num)
使用系统的随机数算法得到的随机数。该随机函数能被录像支持。
num如果设置大于0则生成一个[0, num-1]之间的数否则生成一个0到2147483647之间的整数。
此函数使用了系统的Math.random()函数支持SL大法。
但是,此函数会将生成的随机数值存入录像,因此如果调用次数太多则会导致录像文件过大。
core.restart() [异步]
返回标题界面。
========== core.actions.XXX 和游戏控制相关的函数 ==========
actions.js主要用来进行用户交互行为的处理。
所有用户行为,比如按键、点击、滑动等等,都会被此文件接收并进行操作。
========== core.control.XXX 和游戏控制相关的函数 ==========
control.js主要用来进行游戏控制比如行走控制、自动寻路、存读档等等游戏核心内容。
core.control.setGameCanvasTranslate(canvasId, x, y)
设置大地图的偏移量
core.control.updateViewport()
更新大地图的可见区域
core.control.gatherFollowers()
立刻聚集所有的跟随者
core.control.replay()
回放下一个操作
========== core.enemys.XXX 和怪物相关的函数 ==========
enemys.js主要用来进行怪物相关的内容比如怪物的特殊属性伤害和临界计算等。
core.enemys.hasSpecial(special, test)
测试怪物是否含有某个特殊属性。
常见用法: core.enemys.hasSpecial(monster.special, 3) ## 测试是否拥有坚固
core.enemys.getSpecialText(enemyId)
返回一个列表包含该怪物ID对应的所有特殊属性。
core.enemys.getSpecialHint(enemy, special)
获得怪物某个(或全部)特殊属性的文字说明。
core.enemys.canBattle(enemyId, x, y, floorId)
返回当前能否战胜某个怪物。
后面三个参数是怪物坐标和楼层。
core.enemys.getDamage(enemyId, x, y, floorId)
返回当前对某个怪物的战斗伤害。如果无法战斗返回null。
后面三个参数是怪物坐标和楼层。
core.enemys.nextCriticals(enemyId, number, x, y, floorId)
返回一个列表为接下来number可忽略默认为1个该怪物的临界值和临界减伤。
列表每一项类似 [x,y] 表示临界值为x且临界减伤为y。
如果无临界值,则返回空列表。
core.enemys.getDefDamage(enemyId, k, x, y, floorId)
获得k可忽略默认为1防减伤值。
core.enemys.getDamageInfo(enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId)
获得实际战斗信息,比如伤害,回合数,每回合伤害等等。
此函数是实际战斗过程的计算。
core.enemys.calDamage(enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId)
获得在某个勇士属性下怪物伤害实际返回的是上面getDamageInfo中伤害的数值。
core.enemys.getCurrentEnemys(floorId)
获得某一层楼剩余所有怪物的信息(供怪物手册使用)
========== core.events.XXX 和事件相关的函数 ==========
events.js主要用来进行事件处理比如自定义事件以及某些条件下可能会被触发的事件。
大多数事件API都在脚本编辑中存在这里只列出部分比较重要的脚本编辑中不存在的API。
core.events.gameOver(ending, fromReplay)
游戏结束并上传的事件。
该函数将提问是否上传和是否下载录像,并返回标题界面。
core.events.doEvents(list, x, y, callback) [异步]
开始执行某个事件。
请不要执行此函数,尽量使用 core.insertAction(list, x, y, callback) 来开始执行一段事件。
core.events.doAction()
执行下一个事件。此函数中将对所有自定义事件类型分别处理。
core.events.getCommonEvent(name)
根据名称获得一个公共事件如果不存在对应的公共事件则返回null。
core.events.openShop(shopId, needVisited) [异步]
打开一个全局商店。needVisited表示是否需要该商店已被打开过。
core.events.disableQuickShop(shopId)
禁用一个全局商店
core.events.canUseQuickShop(shopId)
当前能否使用某个快捷商店
core.events.setHeroIcon(name)
设置勇士行走图
========== core.items.XXX 和道具相关的函数 ==========
items.js将处理和道具相关的内容比如道具的使用获取和删除等等。
core.items.compareEquipment(equipId1, equipId2)
比较两个装备的属性变化值
========== core.loader.XXX 和游戏加载相关的函数 ==========
loader.js将主要用来进行资源的加载比如加载音乐、图片、动画等等。
========== core.maps.XXX 和地图处理相关的函数 ==========
maps.js主要用来进行地图相关的的操作。包括绘制地图获取地图上的点等等。
core.maps.getNumberById(id)
根据ID来获得对应的数字。如果该ID不存在对应的数字则返回0。
core.maps.canMoveHero(x,y,direction,floorId)
判断能否前往某个方向。x,y为坐标可忽略为当前点direction为方向可忽略为当前方向。
floorId为楼层ID可忽略为当前楼层。
core.maps.canMoveDirectly(destX, destY)
判断当前能否瞬间移动到某个点。
该函数如果返回0则不可瞬间移动大于0则可以瞬间移动且返回值是跨度即少走的步数
core.maps.removeBlockByIndexes(index, floorId)
根据索引删除或禁用某块。
core.maps.removeBlockByIndexes(indexes, floorId)
根据索引删除或禁用若干块。
core.maps.drawAnimate(name, x, y, alignWindow, callback)
播放一段动画name为动画名需在全塔属性注册x和y为坐标0-12之间callback可选为播放完毕的回调函数。
播放过程是异步的如需等待播放完毕请使用insertAction插入一条type:waitAsync事件。
此函数将随机返回一个数字id为此异步动画的唯一标识符。
core.maps.stopAnimate(id, doCallback)
立刻停止一个异步动画。
id为该动画的唯一标识符由drawAnimate函数返回doCallback可选若为true则会执行该动画所绑定的回调函数。
========== core.ui.XXX 和对话框绘制相关的函数 ==========
ui.js主要用来进行UI窗口的绘制比如对话框、怪物手册、楼传器、存读档界面等等。
core.ui.getContextByName(canvas)
根据画布名找到一个画布的context支持系统画布和自定义画布。如果不存在画布返回null。
也可以传画布的context自身则返回自己。
core.clearMap(name)
清空某个画布图层。
name为画布名可以是系统画布之一也可以是任意自定义动态创建的画布名还可以直接传画布的context本身。下同
如果name也可以是'all'若为all则为清空所有系统画布。
core.ui.fillText(name, text, x, y, style, font)
在某个画布上绘制一段文字。
text为要绘制的文本x,y为要绘制的坐标style可选为绘制的样式font可选为绘制的字体。下同
core.ui.fillBoldText(name, text, x, y, style, font)
在某个画布上绘制一个描黑边的文字。
core.ui.fillRect(name, x, y, width, height, style)
绘制一个矩形。style可选为绘制样式。
core.ui.strokeRect(name, x, y, width, height, style)
绘制一个矩形的边框。
core.ui.drawLine(name, x1, y1, x2, y2, style, lineWidth)
绘制一条线。lineWidth可选为线宽。
core.ui.drawArrow(name, x1, y1, x2, y2, style, lineWidth)
绘制一个箭头。
core.ui.setFont(name, font) / core.ui.setLineWidth(name, lineWidth)
设置一个画布的字体/线宽。
core.ui.setAlpha(name, font) / core.ui.setOpacity(name, font)
设置一个画布的绘制不透明度和画布本身的不透明度。
两者区别如下:
- setAlpha是设置"接下来绘制的内容的不透明度"不会对已经绘制的内容产生影响。比如setAlpha('ui', 0.5)则会在接下来的绘制中使用0.5的不透明度。
- setOpacity是设置"画布本身的不透明度"已经绘制的内容也会产生影响。比如我已经在UI层绘制了一段文字再setOpacity则也会看起来变得透明。
尽量不要对系统画布使用setOpacity因为会对已经绘制的内容产生影响自定义创建的画布则不受此限制。
core.ui.setFillStyle(name, style) / core.ui.setStrokeStyle(name, style)
设置一个画布的填充样式/描边样式。
core.ui.setTextAlign(name, align)
设置一个画布的文字对齐模式。
core.ui.calWidth(name, text, font)
计算一段文字在画布上的绘制宽度
font可选如果存在则会先设置该画布上的字体。
core.ui.drawImage(name, image, x, y, w, h, x1, y1, w1, h1)
在一个画布上绘制图片。
name为画布名可以是系统画布之一也可以是任意自定义动态创建的画布名还可以直接传画布的context本身。
image为要绘制的图片可以是一个全塔属性中定义的图片名会从images中去获取图片本身或者一个画布。
后面的8个坐标参数与canvas的drawImage的八个参数完全相同。
请查看 http://www.w3school.com.cn/html5/canvas_drawimage.asp 了解更多。
core.ui.createCanvas(name, x, y, width, height, zIndex)
动态创建一个画布。name为要创建的画布名如果已存在则会直接取用当前存在的。
x,y为创建的画布相对窗口左上角的像素坐标width,height为创建的长宽。
zIndex为创建的纵向高度关系到画布之间的覆盖z值高的将覆盖z值低的系统画布的z值可在个性化中查看。
返回创建的画布的context也可以通过core.dymCanvas[name]调用。
core.ui.relocateCanvas(name, x, y)
重新定位一个自定义画布。
core.ui.resizeCanvas(name, x, y)
重新设置一个自定义画布的大小。
core.ui.deleteCanvas(name)
删除一个自定义画布。
core.ui.deleteAllCanvas()
清空所有的自定义画布。
core.ui.drawThumbnail(floorId, canvas, blocks, x, y, size, heroLoc, heroIcon)
绘制一个缩略图,比如楼传器界面,存读档界面等情况。
floorId为目标楼层IDcanvas为要绘制到的图层blocks为要绘制的所有图块。
x,y为该图层开始绘制的起始点坐标size为每一格的像素heroLoc为勇士坐标heroIcon为勇士图标。
========== core.utils.XXX 工具类的辅助函数 ==========
utils.js主要用来进行一些辅助函数的计算。
core.utils.splitLines(canvas, text, maxLength, font)
自动切分长文本的换行。
canvas为图层text为要自动换行的内容maxLength为每行最长像素font为文本的字体。
core.utils.cropImage(image, size)
纵向对图片进行切分(裁剪)。
core.utils.push(a,b)
向某个数组后插入另一个数组或元素
core.utils.unshift(a, b)
向某个数组前插入另一个数组或元素
core.utils.encodeBase64(str)
Base64加密字符串
core.utils.decodeBase64(str)
Base64解密字符串
core.utils.formatBigNumber(x, onMap)
大数据的格式化
core.utils.subarray(a, b)
检查b是否是a的从头开始子串。
如果是则返回a删去b的一段否则返回null。
core.utils.same(a, b)
比较a和b两个对象是否相同
core.utils.clamp(x, a, b)
将x限制在[a,b]之间的范围内
core.utils.arrayToRGB(color)
将形如[255,0,0]之类的数组转成#FF0000这样的RGB形式。
core.utils.arrayToRGBA(color)
将形如[255,0,0,1]之类的数组转成rgba(255,0,0,1)这样的RGBA形式。
core.utils.encodeRoute(list)
压缩加密路线。可以使用core.encodeRoute(core.status.route)来压缩当前路线。
core.utils.decodeRoute(route)
解压缩(解密)路线。
core.utils.readFile(success, error, readType) [异步]
尝试请求读取一个本地文件内容。
success和error为成功/失败后的回调readType不设置则以文本读取否则以DataUrl形式读取。
core.utils.readFileContent(content) [异步]
文件读取完毕后的内容处理。
core.utils.download(filename, content)
尝试生成并下载一个文件。
core.utils.copy(data)
尝试复制一段文本到剪切板。
core.utils.http(type, url, formData, success, error) [异步]
发送一个异步HTTP请求。
type为'GET'或者'POST'url为目标地址formData如果是POST请求则为表单数据。
success为成功后的回调error为失败后的回调。
```

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,7 @@
# 修改编辑器
?> 在这一节中,让我们来了解如何修改编辑器(包括配置表格和事件编辑器)
在改动core时, 有时会相应的更改project中存储数据的结构, 而表格和事件编辑器不做相应更改的话就无法顺畅的编辑改动了结构的数据了, 此文档帮助造塔者进行`配置表格`的修改, 以及修改_server/MotaAction.g4和其他相关文件来调整事件编辑器的图块.
## 修改表格
@ -312,3 +314,7 @@ return code;
<pre><code> '特效/声音':[<b style='color:green'>
MotaActionBlocks['meteorite_s'].xmlText(),
</b>MotaActionBlocks['sleep_s'].xmlText(),</code></pre>
==========================================================================================
[继续阅读下一章API列表](api)

View File

@ -1,9 +1,11 @@
# 元件说明
?> 目前版本**v2.7**,上次更新时间:* {docsify-updated} *
在这个部分,将详细讲解编辑器的每个部件的用法。
?> 在这个部分,将详细讲解编辑器的每个部件的用法。
## 素材区
素材区在展开状态下,从左到右分为若干列:
1. `project\materials\terrains.png`:位于素材区第一列(最上面两个图块不在这张图片里,它们分别是擦除和空气墙),其中从楼梯开始往下有系统含义,请勿随意修改其图块属性。
2. `project\materials\animates.png`位于素材区第二列共4帧。主要为星空、岩浆、三色墙、六色门、四向出入口箭头、四种路障。
3. `project\materials\enemys.png`32×32px像素下同的怪物您可以随意修改它们的任何属性。如果嫌两帧太少还可以作为32×48px怪物画在靠下2/3部分。
@ -13,96 +15,103 @@
7. `project\autotiles`:自动元件,会随着在地图上的连续摆放而自动采取适当的绘制方式。
8. `project\tilesets`额外素材用来突破其他素材合计不得超过1000个的限制。您可以在这个区域拖动来批量框选再在地图区单击成片绘制或拖动平铺。
您可以随时使用`core.getBlockCls(x, y, floorId, showDisable)`这一API来获取游戏中某个位置的图块类别其中自动元件和额外素材会分别返回“autotile”和“tileset”其他的则会返回所在的图片文件名不含后缀
## 地图编辑快捷键Z
![image](img/v2.7/editor.png)如图所示您可以在此对地图进行清空或删除操作也可以新建或批量新建任意宽高的空白地图。其中“导出并复制地图”是指显示出左侧的矩阵并复制一般用来跨塔复制地图您也可以直接改动其中的数字再点击“从框中导入地图”就能将改动的结果同步到地图上。下面的“楼层ID、中文名、状态栏名”分别对应楼层属性快捷键V的floorId、title和name其中floorId也作为文件名不能使用中文title会显示在楼传界面和楼层切换黑屏name也允许使用中文。
![image](img/editor.jpg)
如图所示,您可以在此对地图进行清空或删除操作,也可以新建或批量新建任意宽高的空白地图。
其中“导出并复制地图”是指显示出左侧的矩阵并复制(一般用来跨塔复制地图),您也可以直接改动其中的数字,再点击“从框中导入地图”就能将改动的结果同步到地图上。
下面的“楼层ID、中文名、状态栏名”分别对应楼层属性快捷键V的floorId、title和name其中floorId也作为文件名不能使用中文title会显示在楼传界面和楼层切换黑屏name也允许使用中文。
## 图块属性快捷键C
![image](img/v2.7/mapsC.png)
![image](img/mapsC.jpg)
如上图,除怪物和道具外,所有素材的图块属性都定义在`project\maps.js`中。道具和怪物属性也支持清空和批量复制,下面逐一讲解各条目的含义和用法:
1. 图块ID`core.getBlockId(x, y, floorId, showDisable)`的返回结果不允许使用中文和纯数字。请注意额外素材tileset的图块ID由素材图片的顺序和图块在图片上的位置确定无法更改也请勿随意调换图片的顺序。样板已注册的图块中建议只修改怪物和NPC的图块ID修改方法为上图最下方的“修改图块id为”。
2. 图块数字见前面的描述额外素材的数字由ID去掉字母X得到。
3. 图块类别:即前面所说的`core.getBlockCls(x, y, floorId, showDisable)`的返回结果。
4. 图块名称:怪物在手册中、道具在道具栏中、其他图块在剧情对话中的默认名称,可以随意修改。但原则上不推荐不同的怪物和道具有重复的名称,否则会影响事件编辑器的中文替换功能。
在讲解其他属性之前,这里简单介绍一下素材的注册机制。
1. **图块ID**图块的唯一标识符`core.getBlockId(x, y, floorId, showDisable)`,不允许使用中文和纯数字。请注意,额外素材`tileset`的图块ID由素材图片的顺序和图块在图片上的位置确定无法更改也请勿随意调换图片的顺序。样板已注册的图块中建议只修改怪物和NPC的图块ID修改方法为上图最下方的**修改图块id为**
2. **图块数字:**见前面的描述额外素材的数字由ID去掉字母X得到。
3. **图块类别:**图块素材的类型。
4. **图块名称:**怪物在手册中、道具在道具栏中、其他图块在剧情对话中的默认名称,可以随意修改。但原则上不推荐不同的怪物和道具有重复的名称,否则会影响事件编辑器的中文替换功能。
除自动元件和额外素材外其余图块只有在注册后才拥有上面所说的ID和数字。
你可以随时使用 `core.getBlockId(x, y, floorId, showDisable)` 获得地图上任何一个点的图块ID`core.getBlockCls(x, y, floorId, showDisable)` 或的地图上任何一个点的图块类别;详见[API列表](api)
未注册的图块则只有“索引”索引为n表示该图块在图片的第n+1
在讲解其他属性之前,这里简单介绍一下素材的注册机制:
ID和索引的对应关系定义在project\icons.js中。
尝试用未注册的图块如道具一列中的某些魔杖和飞羽或者利用便捷PS工具新追加的图块在地图上绘制就会出现红色的问号方框。
此时请在数据区手动注册此图块只需填写一个新ID和数字1000以内即可。
也可以点击“自动注册”按钮批量注册该图片的所有未注册素材自动注册出的ID非常难看建议立即手动修改为有意义的英数或拼音。
* 除自动元件和额外素材外其余图块只有在注册后才拥有上面所说的ID和数字。
* 未注册的图块则只有“索引”索引为n表示该图块在图片的第n+1
* ID和索引的对应关系定义在`project\icons.js`中。
* 尝试用未注册的图块如利用便捷PS工具新追加的图块在地图上绘制就会出现红色的问号方框。
* 此时请在数据区手动注册此图块只需填写一个新ID和数字1000以内即可。
* 也可以点击“自动注册”按钮批量注册该图片的所有未注册素材自动注册出的ID无任何意义建议手动修改成有意义的内容。
自动元件的注册与此不同除了替换样板现有的几个外如果还需要追加新的请在地图区下方的下拉框中切换到“追加素材”快捷键M然后导入文件到画板autotile再点击“追加”按钮即可。非Windows系统追加其他素材也主要依靠这种方式具体用法请自行探索。
### 非怪物非道具属性
1. 触发器目前素材区只有第一列最下面两个图块使用pushBox这一触发器请勿修改之也请勿对别的图块使用这一触发器。其余触发器中custom一般不需要ski用于画在背景层的图块来实现滑冰效果openDoor用于制作门。怪物和道具的触发器分别是battle和getItem不能修改
关于推箱子存在三种图块目标点flower、没推到位的黄箱子box、推到位的绿箱子boxed
推箱子的前方不能存在任何事件层图块flower除外否则会推不动。
每推一步箱子后将触发“脚本编辑——推箱子后”,您可以在里面统计上述三种图块的数量,进行对应的处理。
2. 可通行性:勾选后勇士才可以踏入此图块,否则只能撞击此图块。(怪物被锁定为不可通行,道具被锁定为可通行)
3. 碰触脚本勇士踏入或撞击此图块时执行的脚本该项会被eval相当于一种自定义的触发器您可以参考踩灯和四种路障去填写它。
4. 不可出入方向:对三个图层的图块都有效。不可出方向指的是勇士站在这种图块上不能向哪个方向走(包括撞击),不可入方向指的是勇士不能从哪个方向走向这种图块(包括撞击,如勾选了“上”则不能从上方向下走向这个图块),请参考素材区第一列最下面的四个箭头。
5. 可破震勾选后此图块将成为破墙镐pickaxe和地震卷轴earthquake这两个道具的目标。
6. 动画帧数您可以修改此帧数来让本来有4帧的图块只用前3帧循环播放另外制作门时请务必将此帧数改为1表示门在打开前静止在第1帧。
7. 门信息只对4帧的图块自动元件除外有效您可以点击“编辑按钮”来填写此图块作为门的开关耗时、开关音效以及需要哪些钥匙各多少把可以填写任何消耗类道具也可以选择某些道具只需持有一定数量而不消耗。修改此信息后您需要将上面的“动画帧数”改为1并可能需要将“触发器”改为openDoor不改的话将无法通过撞击来开门但可以像三色墙一样用来制作暗墙
8. 行走图朝向只对npc48有效。设置后当勇士撞击该npc时npc会尝试转身面向勇士对话事件结束前请使用“事件转向”指令将其转回去
走动时也会尝试自动转向请参考样板0层使用的小姐姐。
1. **触发器:**当碰触到地图上此图块时触发的系统事件,详见[事件](event)。
* **battle**: (未列出)战斗;当撞上一个怪物且没有覆盖触发器时(参见[事件](event))将自动调用此触发器产生战斗,并此战后事件。
* **getItem**: (未列出)获得道具;当撞上一个道具且没有覆盖触发器时(参见[事件](event))将自动调用此触发器获得它,并触发道具后事件。
* **changeFloor**: (未列出)楼层切换;对于地图上绑定的绿点将自动调用此触发器产生楼层切换事件。
* **openDoor**: 用于制作门效果,当撞上此图块时将尝试开门(仅对`animates`和`npc48`生效);具体开门动画参见下面的门信息。
* **pushBox**: 推箱子信息;请勿对非箱子使用此触发器。
* **ski**: 冰信息;拥有此触发器的图块放置在背景层时,走上去将触发滑冰效果。
* **custom**: 自定义系统触发器;你可以使用 `core.registerSystemEvent` 来自己定义一个系统触发器,参见[API列表](api)。
2. **可通行性:**勾选后勇士才可以踏入此图块,否则只能撞击此图块。(怪物被锁定为不可通行,道具被锁定为可通行,如有需要可以修改点上的不可通行性)
3. **碰触脚本:**勇士踏入或撞击此图块时执行的脚本该项会被eval相当于一种自定义的触发器您可以参考踩灯和四种路障去填写它。
4. **不可出入方向:**对三个图层的图块都有效。不可出方向指的是勇士站在这种图块上不能向哪个方向走(包括撞击),不可入方向指的是勇士不能从哪个方向走向这种图块(包括撞击)。例如,勾选了“上”则不能从上方向下走向这个图块。请参考素材区第一列最下面的四个箭头。
5. **可破震:**勾选后此图块将成为破墙镐pickaxe和地震卷轴earthquake这两个道具的目标。
6. **动画帧数:**您可以修改此帧数来让本来有4帧的图块只用前3帧循环播放另外制作门时请务必将此帧数改为1表示门在打开前静止在第1帧。
7. **门信息:**只对`animates`和`npc48`有效您可以点击“编辑按钮”来填写此图块作为门的开关耗时、开关音效以及需要哪些钥匙各多少把可以填写任何消耗类道具也可以选择某些道具只需持有一定数量而不消耗。修改此信息后您需要将上面的“动画帧数”改为1并可能需要将“触发器”改为openDoor不改的话将无法通过撞击来开门但可以像三色墙一样用来制作暗墙
8. **行走图朝向:**只对npc48有效。设置后当勇士撞击该npc时npc会尝试转身面向勇士对话事件结束前请使用“事件转向”指令将其转回去。走动时也会尝试自动转向请参考样板0层使用的小姐姐。
### 道具属性
样板自带的道具都在样板0层摆好了您可以直接进入游戏捡起它们就会看到该道具的注意事项这里不再赘述。
1. 道具类别虽然和图块类别的英文缩写都是cls但有本质区别请注意区分。道具的图块类别都是items而道具类别分为以下几种
1. items是的你没看错又是items这个词请注意和图块类别的items相区分。它表示即捡即用类不进背包的道具如四种血瓶、三种宝石等。这类道具需要用到的其他属性有“即捡即用效果”、“即捡即用提示”、“碰触或使用事件”。
2. tools进背包的消耗类道具如钥匙和解药瓶、便携式血瓶蓝瓶生命魔杖、破震炸飞和跳鞋等。这类道具需要用到的其他属性有“道具描述”、“不显示在道具栏”、“回放不绘制道具栏”、“碰触或使用事件”、“使用效果”、“能否使用”。
3. constants进背包的永久道具每件在背包的数量要么为1要么为0如手册、楼传、幸运金币、十字架、护符、二倍斩等这类道具需要用到的其他属性和tools一致。
4. equips装备它需要用到的其他属性有“道具描述”、“道具的装备属性”、“能否装备”。
所以如果您想把四种血瓶和三种宝石改为便携式就只需把其道具类别改为tools当然楼层属性中的宝石血瓶效果一项也就失效了
1. **道具类别:**虽然和图块类别的英文缩写都是cls但有本质区别请注意区分。道具的图块类别都是items而道具类别分为以下几种
* items是的你没看错又是`items`这个词,请注意和图块类别的`items`相区分。它表示即捡即用类不进背包的道具,如四种血瓶、三种宝石等。这类道具需要用到的其他属性有“即捡即用效果”、“即捡即用提示”、“碰触或使用事件”。
* tools进背包的消耗类道具如钥匙和解药瓶、便携式血瓶蓝瓶生命魔杖、破震炸飞和跳鞋等。这类道具需要用到的其他属性有“道具描述”、“不显示在道具栏”、“回放不绘制道具栏”、“碰触或使用事件”、“使用效果”、“能否使用”。
* constants进背包的永久道具每件在背包的数量要么为1要么为0如手册、楼传、幸运金币、十字架、护符、二倍斩等这类道具需要用到的其他属性和tools一致。
* equips装备它需要用到的其他属性有“道具描述”、“道具的装备属性”、“能否装备”。
* 例如如果您想把四种血瓶和三种宝石改为便携式就只需把其道具类别改为tools当然楼层属性中的宝石血瓶效果一项也就失效了
* 如果想把大黄门钥匙变为钥匙盒红黄蓝钥匙各一把只需把其道具类别从tools改为items
* 如果想把剑盾变成装备,只需把其道具类别改为`equips`,等等
2. **道具描述:**对除即捡即用类外的道具都有效。一个字符串,为道具在道具栏里的描述,也作为首次捡到时的提示信息的一部分(如果全塔属性中开启了这一提示功能的话)。支持使用`${表达式计算}`语法(如四种血瓶和三种宝石那样,但不支持中文替换),此语法的详细规则见“显示文章正文的转义序列”,和“值块和冒号缩写量”。
3. **不显示在道具栏:**对tools和constants有效勾选此项后该道具在背包中将不显示出来。常用于不能主动使用或已有专门的使用按钮的道具来节省显示篇幅如手册、楼传、幸运金币、十字架、护符和钥匙等。
4. **回放不绘制道具栏:**勾选此项后,录像回放中使用此道具将不显示黑黑的道具栏。常用于频繁使用的道具,如楼传、技能和冰冻徽章等。
5. **即捡即用效果:**如题该项会被eval一般为一行下述的代码 `core.status.hero.xxx += yyy * core.status.thisMap.ratio`
* 其中xxx为勇士的某种状态如生命hp、生命上限hpmax、魔力mana、魔力上限manamax、护盾mef、攻防和金经
* yyy为此道具的基础效果如四种血瓶和三种宝石的基础效果定义在了全塔属性中
* `core.status.thisMap.ratio`则是指该道具所在楼层的“楼层属性”最下面的“宝石血瓶效果”。
6. **即捡即用提示:**实际显示时会被接在“获得xxx”后面所以该项总是一个以逗号开头的字符串同样支持`${表达式计算}`语法。
7. **碰触或使用事件:**对除equips外都有效。该项用于代替“即捡即用效果”但会使勇士停下脚步且会晚于afterGetItem事件被执行和“使用效果”如样板中的黄宝石和生命魔杖。如果您的js语法基础薄弱那么它将是您的不二之选。
8. **使用效果:**对tools和constants有效。该项会被eval一般为一个js函数较为简单的使用效果如解药瓶也可能是一行代码破炸冰的目标个数请直接在该项中修改。总的来说因为事件比起脚本更容易实现异步特效且录像安全性更好所以如非必要不建议用此项。
9. **能否使用:**对tools和constants有效。该项也会被eval一般为一个js函数较为简单的使用条件如解药瓶也可能是一行形如`core.hasFlag('xxx')`的代码。如果该道具在任何情况下都不能主动使用请留null并最好勾选“不显示在道具栏”以节约显示篇幅如果该道具在任何情况下都可以使用请填“true”如果使用条件较为复杂也推荐直接填“true”先斩后奏在使用效果中再行判定并在使用失败的场合使用`core.addItem('xxx')`静默返还一件该道具,如样板中的破墙镐和炸弹。
10. **能否装备:**对equips有效请注意在装上装备后如果条件不再满足也不会自动卸下。和“能否使用”不同此项留null表示任何情况下都可以装备。
11. **道具的装备属性:**在介绍此项之前请先留意一下“全塔属性”中的“装备孔”一项。该项为一个字符串数组最多允许6项13×13样板或8项15×15样板。每一项为装备的类型名称建议是两个汉字如“武器”、“防具”。类型允许重复如可以让勇士最多同时装备两块盾牌。
* 装备类型一个自然数和前面的“装备孔”对应如0表示武器1表示防具。如果装备孔有重复的名称则这里也直接写名称不用加引号穿戴时会自动尝试寻找第一个同类型的空闲装备位没有空闲的话会提示玩家先卸下一件。
* 普攻动画:`project\animates`文件夹中任何一个文件的名称(不带后缀,但需要在全塔属性中注册过),只对第一个装备孔有效。普攻动画会播放在和勇士战斗的怪物位置处,如果是强制战斗的天降怪物,则会播放在勇士身上并跟随,请自行注意。详见“文件注册”使用动画。
* 数值提升项若干个键值对表示该装备增加属性的常数值支持负数。7个常用属性可以通过下拉框选取自定义的新属性也可以手动输入。
* 百分比提升项:若干个键值对,表示该装备增加属性的百分比(支持负数,如填-10就表示减少10%),修改方法同上。
* 装备对属性的影响原理:在穿脱装备时,会根据数值提升项和百分比提升项,分别调用`core.status.hero.xxx += yyy和core.addBuff('xxx', yyy)`这两个API衰弱的附加和解除同理而状态栏的显示值和战斗中的使用值则是`core.getStatus('xxx')`和buff值相乘再向下取整所得。
* PC端按下Ctrl+0~9可以保存当前套装Alt+0~9快速更换套装。
如果想把大黄门钥匙变为钥匙盒红黄蓝钥匙各一把只需把其道具类别从tools改为items.如果想把剑盾变成装备,只需把其道具类别改为`equips`.
2. 道具描述:对除即捡即用类外的道具都有效。一个字符串,为道具在道具栏里的描述,也作为首次捡到时的提示信息的一部分(如果全塔属性中开启了这一提示功能的话)。支持使用`${表达式计算}`语法(如四种血瓶和三种宝石那样,但不支持中文替换),此语法的详细规则见“显示文章正文的转义序列”,和“值块和冒号缩写量”。
3. 不显示在道具栏对tools和constants有效勾选此项后该道具在背包中将不显示出来。常用于不能主动使用或已有专门的使用按钮的道具来节省显示篇幅如手册、楼传、幸运金币、十字架、护符和钥匙等。
4. 回放不绘制道具栏:勾选此项后,录像回放中使用此道具将不显示黑黑的道具栏。常用于频繁使用的道具,如楼传、技能和冰冻徽章等。
5. 即捡即用效果如题该项会被eval一般为一行下述的代码
`core.status.hero.xxx += yyy * core.status.thisMap.ratio`
道具相关API请阅读[API列表](api)。
其中xxx为勇士的某种状态如生命hp、生命上限hpmax、魔力mana、魔力上限manamax、护盾mef、攻防和金经yyy为此道具的基础效果如四种血瓶和三种宝石的基础效果定义在了全塔属性中而最后的ratio则是指该道具所在楼层的“楼层属性”最下面的“宝石血瓶效果”。
6. 即捡即用提示:实际显示时会被接在“获得
xxx”后面所以该项总是一个以逗号开头的字符串同样支持`${表达式计算}`语法。
7. 碰触或使用事件对除equips外都有效。该项用于代替“即捡即用效果”但会使勇士停下脚步且会晚于afterGetItem事件被执行和“使用效果”如样板中的黄宝石和生命魔杖。如果您的js语法基础薄弱那么它将是您的不二之选。
8. 使用效果对tools和constants有效。该项会被eval一般为一个js函数较为简单的使用效果如解药瓶也可能是一行代码破炸冰的目标个数请直接在该项中修改。总的来说因为事件比起脚本更容易实现异步特效且录像安全性更好所以如非必要不建议用此项。
9. 能否使用对tools和constants有效。该项也会被eval一般为一个js函数较为简单的使用条件如解药瓶也可能是一行形如`core.hasFlag('xxx')`的代码。如果该道具在任何情况下都不能主动使用请留null并最好勾选“不显示在道具栏”以节约显示篇幅如果该道具在任何情况下都可以使用请填“true”如果使用条件较为复杂也推荐直接填“true”先斩后奏在使用效果中再行判定并在使用失败的场合使用`core.addItem('xxx')`静默返还一件该道具,如样板中的破墙镐和炸弹。
10. 能否装备对equips有效请注意在装上装备后如果条件不再满足也不会自动卸下。和“能否使用”不同此项留null表示任何情况下都可以装备。
11. 道具的装备属性在介绍此项之前请先留意一下“全塔属性”中的“装备孔”一项。该项为一个字符串数组最多允许6项13×13样板或8项15×15样板。每一项为装备的类型名称建议是两个汉字如“武器”、“防具”。类型允许重复如可以让勇士最多同时装备两块盾牌。
接下来介绍道具的装备属性,点击“编辑”按钮进入其图形化编辑模式。该项分为以下几个方面:
1. 类型一个自然数和前面的“装备孔”对应如0表示武器1表示防具。如果装备孔有重复的名称则这里也直接写名称不用加引号穿戴时会自动尝试寻找第一个同类型的空闲装备位没有空闲的话会提示玩家先卸下一件。
2. 普攻动画:`project\animates`文件夹中任何一个文件的名称(不带后缀,但需要在全塔属性中注册过),只对第一个装备孔有效。普攻动画会播放在和勇士战斗的怪物位置处,如果是强制战斗的天降怪物,则会播放在勇士身上并跟随,请自行注意。详见“文件注册”使用动画。
3. 数值提升项若干个键值对表示该装备增加属性的常数值支持负数。7个常用属性可以通过下拉框选取自定义的新属性也可以手动输入。
4. 百分比提升项:若干个键值对,表示该装备增加属性的百分比(支持负数,如填$-$10就表示减少10%),修改方法同上。
装备对属性的影响原理是:在穿脱装备时,会根据数值提升项和百分比提升项,分别调用`core.status.hero.xxx += yyy和core.addBuff('xxx', yyy)`[^10]这两个API衰弱的附加和解除同理而状态栏的显示值和战斗中的使用值则是`core.getStatus('xxx')`和buff值相乘再向下取整所得。
PC端按下Ctrl+0—9可以保存当前套装Alt+0—9快速更换套装。
道具相关API请阅读libs\items.js双击默认会运行请用文本编辑器打开
### 怪物属性
1. 手册映射ID如前所述npc48提供了“行走图朝向”来实现多朝向而怪物则没有这么好的待遇。如果您制作了四种面朝不同方向但属性完全一致的怪物那么您可以将其中三种怪物的“手册映射ID”填写为剩下一种怪物的ID这样手册中确切地说`core.getCurrentEnemys()`函数的因变量)就会统一显示为剩下那一种怪物。
2. 生命、攻防、金经如题注意金经必须在“全塔属性”快捷键B中的“状态栏显示项”中也勾选才能真正被启用。持有幸运金币时打怪获得的金币翻倍附加诅咒状态时打怪不获得金经。
3. 加点若全塔属性勾选了“加点”则此项为正数时将作为与该怪物每场战斗胜利后传递给“公共事件——加点事件”的参数即那里的flag:arg1默认表示加点的倍率您可以自行修改该事件。
4. 不可炸勾选后该怪物不会成为炸弹的目标有阻击怪在场的情况下请务必给有战后事件的怪物如机关门守卫和boss勾选此项否则玩家可能会偷梁换柱地炸掉该怪物并把阻击怪推过去打死来触发战后事件。
5. 特殊属性:一个由正整数组成的一维数组,您可以点击“勾选框编辑”按钮来修改它。所有特殊属性都定义在“脚本编辑——怪物特殊属性”,您可以在那里追加新的。它们大体分为四类:
1. **手册映射ID**如前所述npc48提供了“行走图朝向”来实现多朝向而怪物则没有这么好的待遇。如果您制作了四种面朝不同方向但属性完全一致的怪物那么您可以将其中三种怪物的“手册映射ID”填写为剩下一种怪物的ID这样手册中确切地说`core.getCurrentEnemys()`函数的因变量)就会统一显示为剩下那一种怪物。
2. **生命、攻防、金经:**如题注意金经必须在“全塔属性”快捷键B中的“状态栏显示项”中也勾选才能真正被启用。持有幸运金币时打怪获得的金币翻倍附加诅咒状态时打怪不获得金经。
3. **加点:**若全塔属性勾选了“加点”则此项为正数时将作为与该怪物每场战斗胜利后传递给“公共事件——加点事件”的参数即那里的flag:arg1默认表示加点的倍率您可以自行修改该事件。
4. **不可炸:**勾选后该怪物不会成为炸弹的目标有阻击怪在场的情况下请务必给有战后事件的怪物如机关门守卫和boss勾选此项否则玩家可能会偷梁换柱地炸掉该怪物并把阻击怪推过去打死来触发战后事件。
5. **特殊属性:**一个由正整数组成的一维数组,您可以点击“勾选框编辑”按钮来修改它。所有特殊属性都定义在“脚本编辑——怪物特殊属性”,您可以在那里追加新的。它们大体分为四类:
1. 手册中属性值的修正:(按照结算顺序)模仿、坚固、光环,修正后的属性也将被用于战斗,详见“脚本编辑——怪物真实属性”。
2. 战损的修正这类最多先攻、魔攻、连击次数为n、破甲比例为defValue、反击比例为atkValue回合数为勇士的攻击回合数、净化倍数为n1表示单纯无视护盾、吸血比例为value是否加到自身为add、仇恨每场战斗的仇恨增值由全塔属性指定、无敌、固伤数值为damage、支援。其中又以仇恨和固伤不能被护盾直接抵消而和无敌较为特殊详见“脚本编辑——战斗伤害信息”。
3. 战后的影响中毒、衰弱、诅咒、仇恨的累加和减半、自爆、退化扣减值分别为atkValue和defValue、重生详见“脚本编辑——战后脚本”和“公共事件——毒衰咒处理”。
4. 阻激夹域捕即对主角行走的妨害详见“脚本编辑——阻激夹域伤害”该函数也负责了血网图块ID为lavaNet请勿修改的伤害。
4. 阻激夹域捕捉即对主角行走的妨害详见“脚本编辑——阻激夹域伤害”该函数也负责了血网图块ID为lavaNet请勿修改的伤害。
阻激域的伤害都为value且在夹击之前结算领域的形状和半径与光环一致。
@ -118,72 +127,61 @@ PC端按下Ctrl+0—9可以保存当前套装Alt+0—9快速更换套装。
core.status.hero.flags.no_zone = true; // 禁用领域
core.status.hero.flags.no_ambush = true; // 禁用捕捉
core.getItem('amulet'); // 禁用血网等路障
core.setEnemy('greenSlime', 'name', '绿史莱姆'); // 设置怪物属性,并计入存档
core.setEnemy('greenSlime', 'atk', 100); // 设置怪物属性,并计入存档
core.getDamageString(enemy, x, y, floorId); // 获取某只怪的地图显伤字符串和颜色
core.getCurrentEnemys(floorId); // 获取某层楼的(映射后)怪物列表,按战损递增排列
core.hasEnemyLeft(enemyId, floorId); // 漏怪检测,两个参数都允许使用一维数组
core.hasSpecial(src, n); // 检测src是否含有编号为n的特殊属性src分为以下几种情况
core.hasSpecial(special, test); // 检测special是否有test这一个特殊属性
```
如果src为一个数组检查n是否在其中。为一个数字检查是否和n全等
为字符串视为怪物ID去检查。为对象将其special域作为src递归检查
如果您想在数据区的表格中追加新的属性项,或修改已有项的格式、范围和长短注释,请点击数据区顶部的“配置表格”按钮,并参照已有的项去追加和修改,具体可查阅[修改编辑器](editor)
如果您想在数据区的表格中追加新的属性项,或修改已有项的格式、范围和长短注释,请点击数据区顶部的“配置表格”按钮,并参照已有的项去追加和修改,具体可查阅@zhaouv撰写的另一篇文档。
## 楼层属性快捷键V
![image](img/v2.7/floorsV.png)
1. 楼层IDproject\\floors中的文件名不允许使用中文也不能直接修改。修改方法见上图底部修改后必须立即刷新浏览器页面。
2. 楼层名:楼层在楼传、上下楼黑屏和浏览地图界面的名称。
3. 状态栏显示:勇士在此楼层时状态栏左上角上楼梯图标右边的文字,允许使用中文,但请注意控制字数。
4. 宽度和高度:如题,
如果地图被加宽或加高,则“偏移”表示右移或下移的格子数(左边缘或上边缘用空格子填补)。
如果地图被减窄或减矮,则“偏移”表示左移或上移的格子数(被移出左边缘或上边缘的图块将丢失)。
5. 几个勾选框:
1. 可楼传:如果不勾选,则此楼层禁止成为楼传的目标楼层,勇士在此楼层也禁止使用楼传。
2. 快捷商店:如果不勾选,则勇士在此楼层禁止快捷使用商店。事件中的“启用全局商店同时打开”不受影响,详见“插件编写——全局商店”。
3. 不可浏览如果勾选则此楼层无法通过PageUp/PageDown键浏览也不会计入B键数据统计。
4. 不可瞬移如果勾选则勇士在此楼层无法用E键和单击瞬移常用于用自动事件去监听勇士坐标时。
5. 是否是地下层:如果勾选,则非平面模式下勇士在此楼层原地使用楼传会传送到上楼点,详见“脚本编辑——楼层飞行”。
6. 首次到达事件、每次到达事件:如题,详见“脚本编辑——切换楼层后”。
7. 并行处理脚本一个字符串为勇士在此楼层时浏览器每帧都会执行一次eval的脚本最快每秒60次。一般用来制作一些定时特效如bgs、bgv详见“脚本编辑——并行脚本”。
8. 上下楼点:两个自然数构成的一维数组,将作为“楼层转换”事件(在地图上以图块左下角出现绿色小方块作为标记)和“楼层切换”指令中“上下楼梯”以及非平面楼传的目标坐标。如果不设置,则在传送时会尝试从地图中搜索上下楼梯图块。因此当某个楼层没有楼梯或有多个楼梯时(如《[新新魔塔](http://ckcz123.com/games/xinxin/editor.html)》),请务必设置这个属性。点击“编辑”按钮从地图选点即可。
9. 楼传落点:格式和设置方法同上。如果设置了此项,则楼传在此层的落点将强制变为该点,无视平面模式下的离开点和上面的上下楼点以及该层实际的楼梯位置。
10. 地面图块可以填写任何一个图块ID此项也会作为手册和剧情对话中的帧动画背景。
11. 色调一行四列的数组前三项为小于256的自然数分别表示红、绿、蓝最后一项为$[0,1]$的浮点数表示不透明度可以点击“编辑”按钮用取色器调色见样板的主塔40层。值得一提的是很多事件也以颜色作为参数这些都是可以使用取色器调色的。
![image](img/floorsV.jpg)
与RPG Maker不同HTML5 canvas的色调合成公式是“此值×不透明度 +
原值×(1$-$不透明度)”,所以即使给此项的红绿蓝填写相等的值也无法实现完美的灰色。如有需求,请使用[插件库](http://h5mota.com/plugins)的“仿RM光照”。
12. 天气一行两列的数组第一项为字符串“rain”、“snow”或“fog”第二项为不大于10的正整数分别表示1—10级的雨天见样板的主塔40层、雪天由大小不一的白色实心圆组成详见样板1层和雾天由project\\materials\\fog.png放大后随时间加入不规则扰动得到
色调层在天气层上方、UI层下方如不透明色调会遮盖天气浏览地图看不到色调关于图层的详细说明参见“个性化”
13. 背景音乐:如题,当在游戏中触发楼层切换时(包括读档),如果
`core.status.hero.flags.__color__、__weather__、__bgm__`没有值,游戏当时的画面色调、天气、背景音乐就会变为楼层属性中的这三个设置项,详见“脚本编辑——切换楼层中”。
14. 宝石血瓶效果如题必须填写且必须为非负数。此项的用法为core.status.thisMap.ratio请参考四种血瓶和三种宝石的捡拾效果。
您还可以将其用于其他各种场合作为系数,如血网的伤害、中毒后每步的损血等。
15. 楼层贴图至此我们会发现图块只有32×32px和32×48px两种尺寸且后者只能画在事件层每个图块最多只能有4帧。
所以您可以在npcs.png中看到魔龙和章鱼被大卸八块使用起来非常不方便。
所幸样板提供了“楼层贴图”,该项允许您使用任何尺寸、任何帧数的素材,
唯一的缺点是不支持伸缩、移动跳跃和淡入淡出效果。
点击“编辑”按钮进入事件编辑器,每张图片的写法为(可从入口方块拖出,然后双击预览第一帧的效果):
1. 图片名name如题图片需要放在project\images文件夹并注册。
2. 翻转(:x/:y/:o您可以对贴图的每帧进行三种翻转当然帧顺序在原图中依然是从左到右的。
3. 图层bg/fg/auto此项决定贴图绘制在哪个图层您可以全部画在背景层或前景层。也可以选择“自适配”让贴图的上半部分画在前景层下半部分画在背景层比如树木等。如果选择了自适配最好让下面的绘制坐标和宽高都是32的倍数。
4. 绘制坐标xy贴图在地图中的左上角像素坐标譬如x和y都填32则表示贴图左上角和“地图左上角格子的右下角”重合。
5. 初始禁用Y/N如果勾选了此项则此贴图初始时不显示您可以在事件中再将其显示出来。
6. 裁剪起点坐标xy和宽高wh此项规定了贴图在按帧切分前从原图中取哪一部分x和y为所取部分在原图中的左上角坐标不填视为两个0w和h为所取部分的宽高不填表示一直取到右下角
7. 帧数frame不填视为1如果填写了大于1的整数就会把上述裁剪得到的结果再从左到右等分为若干份并在实际绘制时从左到右逐帧可能还带有翻转循环绘制每帧的持续时间和其他图块一致。
总之,每张贴图是按照“裁剪”—“左右等分”—“逐帧翻转”的顺序得到的。
贴图本身只具有观赏性您仍然需要使用空气墙等手段去控制其绘制区域各个点的通行性。在使用贴图来表现魔龙和章鱼这类大型怪物时可以预先注册两种一样属性的怪物。一种透明另一种为缩小到32×32px且只有两到四帧的版本。将前者画在地图上怪物属性的“手册映射ID”填后者最后在该点的战后事件中隐藏贴图即可。最后附上贴图和图块绘制顺序的修改方法libs\maps.js
``` js
1. **楼层ID**`project/floors`中的文件名,不允许使用中文也不能直接修改。修改方法见上图底部,修改后必须立即刷新浏览器页面。
2. **楼层名:**楼层在楼传、上下楼黑屏和浏览地图界面的名称。
3. **状态栏显示:**勇士在此楼层时状态栏左上角上楼梯图标右边的文字,允许使用中文,但请注意控制字数。
4. **地图宽度和高度:**可在表格最下方修改。
* 如果地图被加宽或加高,则“偏移”表示右移或下移的格子数(左边缘或上边缘用空格子填补)。
* 如果地图被减窄或减矮,则“偏移”表示左移或上移的格子数(被移出左边缘或上边缘的图块将丢失)。
5. **几个勾选框:**
* 可楼传:如果不勾选,则此楼层禁止成为楼传的目标楼层,勇士在此楼层也禁止使用楼传。
* 快捷商店:如果不勾选,则勇士在此楼层禁止快捷使用商店。事件中的“启用全局商店同时打开”不受影响,详见“插件编写——全局商店”。
* 不可浏览如果勾选则此楼层无法通过PageUp/PageDown键浏览也不会计入B键数据统计。
* 不可瞬移如果勾选则勇士在此楼层无法用E键和单击瞬移常用于用自动事件去监听勇士坐标时。
* 是否是地下层:如果勾选,则非平面模式下勇士在此楼层原地使用楼传会传送到上楼点,详见“脚本编辑——楼层飞行”。
6. **首次到达事件、每次到达事件:**如题,详见“脚本编辑——切换楼层后”。
7. **并行处理脚本:**一个字符串为勇士在此楼层时浏览器每帧都会执行一次eval的脚本最快每秒60次。一般用来制作一些定时特效如bgs、bgv详见“脚本编辑——并行脚本”。
8. **上下楼点:**两个自然数构成的一维数组,将作为“楼层转换”事件(在地图上以图块左下角出现绿色小方块作为标记)和“楼层切换”指令中“上下楼梯”以及非平面楼传的目标坐标。
* 如果不设置,则在传送时会尝试从地图中搜索上下楼梯图块。因此当某个楼层没有楼梯或有多个楼梯时(如《[新新魔塔](http://ckcz123.com/games/xinxin/editor.html)》),请务必设置这个属性。点击“编辑”按钮从地图选点即可。
9. **楼传落点:**格式和设置方法同上。如果设置了此项,则楼传在此层的落点将强制变为该点,无视平面模式下的离开点和上面的上下楼点以及该层实际的楼梯位置。
10. **地面图块:**可以填写任何一个图块ID此项也会作为手册和剧情对话中的帧动画背景。
11. **色调:**一行四列的数组前三项为小于256的自然数分别表示红、绿、蓝最后一项为0到1的浮点数表示不透明度可以点击“编辑”按钮用取色器调色见样板的主塔40层
* 值得一提的是,很多事件也以颜色作为参数,这些都是可以使用取色器调色的。
12. **天气:**一行两列的数组第一项为字符串“rain”、“snow”或“fog”第二项为不大于10的正整数分别表示1—10级的雨天见样板的主塔40层、雪天由大小不一的白色实心圆组成详见样板1层和雾天由`project/materials/fog.png`放大后随时间加入不规则扰动得到)。
* 色调层在天气层上方、UI层下方如不透明色调会遮盖天气浏览地图看不到色调关于图层的详细说明参见“个性化”
13. **背景音乐:**如题,当在游戏中触发楼层切换时(包括读档),如果`flag:__color__、flag:__weather__、flag:__bgm__`没有值,游戏当时的画面色调、天气、背景音乐就会变为楼层属性中的这三个设置项,详见“脚本编辑——切换楼层中”。
14. **宝石血瓶效果:**如题必须填写且必须为非负数。此项的用法为core.status.thisMap.ratio请参考四种血瓶和三种宝石的捡拾效果。
* 您还可以将其用于其他各种场合作为系数,如血网的伤害、中毒后每步的损血等。
15. **楼层贴图:**
* 由于样板提供的图块只有32×32px和32×48px两种尺寸且后者只能画在事件层每个图块最多只能有4帧因此对于一些大图块十分不便。
* 你可以使用“楼层贴图”,该项允许您使用任何尺寸、任何帧数的素材,唯一的缺点是不支持伸缩、移动跳跃和淡入淡出效果。
* 点击“编辑”按钮进入事件编辑器,每张图片的写法为(可从入口方块拖出,然后双击预览第一帧的效果):
1. 图片名name如题图片需要放在`project/images`文件夹并注册。
2. 翻转(:x/:y/:o您可以对贴图的每帧进行三种翻转当然帧顺序在原图中依然是从左到右的。
3. 图层bg/fg/auto此项决定贴图绘制在哪个图层您可以全部画在背景层或前景层。也可以选择“自适配”让贴图的上半部分画在前景层下半部分画在背景层比如树木等。如果选择了自适配最好让下面的绘制坐标和宽高都是32的倍数。
4. 绘制坐标xy贴图在地图中的左上角像素坐标譬如x和y都填32则表示贴图左上角和“地图左上角格子的右下角”重合。
5. 初始禁用Y/N如果勾选了此项则此贴图初始时不显示您可以在事件中再将其显示出来。
6. 裁剪起点坐标xy和宽高wh此项规定了贴图在按帧切分前从原图中取哪一部分x和y为所取部分在原图中的左上角坐标不填视为两个0w和h为所取部分的宽高不填表示一直取到右下角
7. 帧数frame不填视为1如果填写了大于1的整数就会把上述裁剪得到的结果再从左到右等分为若干份并在实际绘制时从左到右逐帧可能还带有翻转循环绘制每帧的持续时间和其他图块一致。
* 贴图本身只具有观赏性,您仍然需要使用空气墙等手段去控制其绘制区域各个点的通行性。
* 在使用贴图来表现魔龙和章鱼这类大型怪物时可以预先注册两种一样属性的怪物。一种透明另一种为缩小到32×32px且只有两到四帧的版本。将前者画在地图上怪物属性的“手册映射ID”填后者最后在该点的战后事件中隐藏贴图即可。
* 你可以在插件重复写`drawBg`和`drawFg`函数以控制贴图和图块的绘制顺序,详见[脚本](script)。
``` js
////// 绘制背景层 //////
maps.prototype.drawBg = function (floorId, ctx) {
core.maps.drawBg = function (floorId, ctx) {
var onMap = ctx == null;
if (onMap) {
ctx = core.canvas.bg;
@ -191,54 +189,40 @@ PC端按下Ctrl+0—9可以保存当前套装Alt+0—9快速更换套装。
}
this._drawBg_drawBackground(floorId, ctx);
// ------ 调整这两行的顺序来控制是先绘制贴图还是先绘制背景图块
// 后绘制的覆盖先绘制的。
this._drawFloorImages(floorId, ctx, 'bg');
this._drawBgFgMap(floorId, ctx, 'bg', onMap);
} // 后绘制的覆盖先绘制的。
```
}
```
## 全塔属性快捷键B
全塔属性共分为四部分:文件注册、初始勇士、全局数值、系统开关,您可以随时折叠其中任何一个部分。
![image](img/v2.7/firstDataB.png)
![image](img/firstDataB.jpg)
### 文件注册
这部分基本上都是经由多选框半自动完成的,下面逐一讲解:
1. 楼层列表project\floors文件夹中的文件名不含后缀此数组的顺序决定了楼传和上下楼器fly、upFly、downFly的顺序。
如果您不慎将勇士的出生楼层注销了或不慎删除了某些楼层的js文件导致编辑器页面打开后一片白屏请手动打开project\data.js去小心地修改floorIds以和实际的文件名相匹配并将出生楼层改为一个存在的楼层。
其他更复杂的白屏请在控制台根据报错信息安卓手机则使用ES文件浏览器查看日志去小心地修改文件如某个楼层文件有问题则可以注销它如果难以独立解决欢迎加QQ群959329661寻求帮助。
2. 使用图片project\images文件夹中的文件名需要后缀必须全英数单击“编辑”按钮编辑器会自动扫描文件系统中格式合适的图片如jpg、png和gif
您可以预览并将需要的图片勾选。请注意勇士的初始行走图必须在这里注册。另外winskin.png只许替换为相同规格的图片而不要注销否则道具商店插件无法正常绘制。
3. 额外素材project\tilesets中的文件名需要后缀只支持png
注册方法同上,最大的区别在于这个数组的顺序必须保持好。如果随意调换其中的顺序,或注销不在数组末尾的图片,就会导致地图上最终呈现的素材发生错位。因此,新勾选的图片总会被自动追加到数组的末尾。
比起常规素材,额外素材最大的好处有几点:
1. 图片没有数量限制。常规素材的总数量最多只允许不到一千个,而额外素材每张图片上的图块数量最多允许一千个。
2. 查看和绘制更为方便。常规素材每个图块独占一行,每列为一帧,导致不方便观察,且用多个图块拼图必须逐图块绘制。额外素材都是静止的,所以每个图块只占一格,多个图块可以在准备素材时就直接以相邻的样子绘制在同一张图片上,绘制地图时直接从素材区拖动来批量框选,再在地图区单击成片绘制或拖动平铺。
3. 批量替换也更为方便。譬如您如果想制作形如“一场大战/天灾过后/多年以后,村庄/城镇化为了一片废墟”的效果,可以预先准备两张甚至更多张相同规格的额外素材图片,然后在适当的时候遍历某个/某些楼层的图块ID将以“X1”开头的图块统一替换为“X2”开头等。发布单机版游戏时您也可以提供多张相同规格的额外素材图片供玩家直接替换。当然使用这类做法的话就没法再使用“额外素材合并”了。
当您即将发布您的游戏时可以使用“额外素材合并”工具将用到的额外素材图块重新拼成更少的图片以减少游戏体积和加快在线游戏的加载。执行此操作后额外素材的图块ID和数字包括第一位都将被打乱因此请勿在制作中以任何方式直接引用其ID和数字。如确有此需求请间接引用、等量代换如“将$(x_1,y_1)$处的图块设置为和$(x_2,y_2)$处一样”、“判断$(x_3,y_3)$和$(x_4,y_4)$处的图块是否相同”。
4. 使用动画project\\animates文件夹中的文件名不含后缀请注意与`animates.png`相区分)。
要使用动画您可以使用“RM动画导出”工具从RPG Maker XP
1.03及其制作的游戏中导出动画也可以用动画编辑器修改已有的动画或用图片新建。但这些办法都只适用于Windows系统非Windows系统建议直接从我们的官网下载他人的作品取用其中的动画。
动画不支持在编辑器中预览Windows系统可以使用“动画编辑器”预览但没有音效。
RPG Maker的动画存储方式是将用到的图片独立存放而所有动画的帧信息包括第几帧该用什么音效会闪烁整个画面或当前图块会集结在同一个文件中。
而我们的存储方式则不同是对每个动画将其用到的各张图片直接以base64硬编码进同一个animate文件每个动画为一个animate文件。
这样做的缺点是如果多个动画使用了相同的图片那么图片会被重复存储,优点则是跨作品迁移动画更加方便。
animate文件为文本文件文件末尾记录了动画的帧信息文件开头则记录了动画的伸缩比和唯一音效会和动画同时开播
在导出动画时会出现一个输入框并提示动画的唯一音效名。不管该文件名是什么语种请直接点击下一步。音效文件会被尝试自动复制随后您只需手动注册该动画和音效并将音效文件名改为全英数。如果复制失败则需要您手动去该RPG
Maker XP 1.03项目的SE文件夹中将这个文件复制出来所以刚才最好记一下这个名字放在您的H5魔塔项目的project\sounds文件夹中并改名为全英数然后手动注册该动画和音效。
如果要查看或修改一个动画和音效的对应关系(比如从官网上别的作品扒来的动画),请直接在注册时预览并修改。
动画的播放速度为20FPS即每帧50毫秒。这里给出几个相关API
``` js
1. **楼层列表:**`project/floors`文件夹中的文件名不含后缀此数组的顺序决定了楼传和上下楼器fly、upFly、downFly的顺序。
* 如果您不慎将勇士的出生楼层注销了或不慎删除了某些楼层的js文件导致编辑器页面打开后一片白屏请手动打开`project/data.js`去小心地修改floorIds以和实际的文件名相匹配并将出生楼层改为一个存在的楼层。
* 其他更复杂的白屏请在控制台根据报错信息安卓手机则使用ES文件浏览器查看日志去小心地修改文件如某个楼层文件有问题则可以注销它如果难以独立解决欢迎加QQ群959329661寻求帮助。
2. **使用图片:**`project/images`文件夹中的文件名需要后缀必须全英数单击“编辑”按钮编辑器会自动扫描文件系统中格式合适的图片如jpg、png和gif
* 您可以预览并将需要的图片勾选。请注意,勇士的初始行走图必须在这里注册。另外,`winskin.png`只许替换为相同规格的图片而不要注销,否则道具商店插件无法正常绘制。
3. **额外素材:**`project/tilesets`中的文件名需要后缀只支持png
* 注册方法同上,最大的区别在于这个数组的顺序必须保持好。如果随意调换其中的顺序,或注销不在数组末尾的图片,就会导致地图上最终呈现的素材发生错位。因此,新勾选的图片总会被自动追加到数组的末尾。
* 比起常规素材,额外素材最大的好处有几点:
1. 图片没有数量限制。常规素材的总数量最多只允许不到一千个,而额外素材每张图片上的图块数量最多允许一千个。
2. 查看和绘制更为方便。常规素材每个图块独占一行,每列为一帧,导致不方便观察,且用多个图块拼图必须逐图块绘制。额外素材都是静止的,所以每个图块只占一格,多个图块可以在准备素材时就直接以相邻的样子绘制在同一张图片上,绘制地图时直接从素材区拖动来批量框选,再在地图区单击成片绘制或拖动平铺。
3. 批量替换也更为方便。譬如您如果想制作形如“一场大战/天灾过后/多年以后,村庄/城镇化为了一片废墟”的效果,可以预先准备两张甚至更多张相同规格的额外素材图片,然后在适当的时候遍历某个/某些楼层的图块ID将以“X1”开头的图块统一替换为“X2”开头等。发布单机版游戏时您也可以提供多张相同规格的额外素材图片供玩家直接替换。当然使用这类做法的话就没法再使用“额外素材合并”了。
* 当您即将发布您的游戏时可以使用“额外素材合并”工具将用到的额外素材图块重新拼成更少的图片以减少游戏体积和加快在线游戏的加载。执行此操作后额外素材的图块ID和数字包括第一位都将被打乱因此请勿在制作中以任何方式直接引用其ID和数字。如确有此需求请间接引用、等量代换。
4. **使用动画:**`project/animates`文件夹中的文件名(不含后缀,请注意与`animates.png`相区分)。
* 要使用动画您可以使用“RM动画导出”工具从RPG Maker XP 1.03及其制作的游戏中导出动画也可以用动画编辑器修改已有的动画或用图片新建。但这些办法都只适用于Windows系统非Windows系统建议直接从我们的官网下载他人的作品取用其中的动画。
* 每个动画将其用到的各张图片直接以base64硬编码进同一个animate文件每个动画为一个animate文件。这样做的缺点是如果多个动画使用了相同的图片那么图片会被重复存储优点则是跨作品迁移动画更加方便。animate文件为文本文件文件末尾记录了动画的帧信息文件开头则记录了动画的伸缩比和唯一音效会和动画同时开播
* 在导出动画时,会出现一个输入框并提示动画的唯一音效名。不管该文件名是什么语种,请直接点击下一步。音效文件会被尝试自动复制,随后您只需手动注册该动画和音效并将音效文件名改为全英数。
* 可以在编辑器中预览动画和修改音效。
* 可以使用如下动画相关的脚本对动画进行处理,或在事件中使用「播放动画」事件。
``` js
core.drawAnimate(name, x, y, alignWindow, callback);
// 播放一个动画name为不带后缀的动画文件名x和y为播放的格子坐标。
// alignWindow表示该坐标在大地图中是绝对坐标还是相对坐标填true表示相对坐标。
@ -248,136 +232,98 @@ PC端按下Ctrl+0—9可以保存当前套装Alt+0—9快速更换套装。
core.drawHeroAnimate(name, callback); // 和上面类似,但该动画会跟随勇士移动。
// 每场战斗后,都会根据怪物坐标尝试用前者播放普攻动画。若坐标不存在
// (天降强制战斗),则会尝试用后者播放。看上去就像勇士在打自己,请自行注意。
```
详见“脚本编辑——战后脚本”。上述两个函数都会返回一个每次不同的正整数id您可以使用`core.stopAnimate(id, doCallback)`函数来立即停止一个正在播放的动画其中doCallback为true表示停止时执行原动画的回调。
1. 使用音乐project\bgms文件夹中的文件名需要后缀默认只支持wav、mp3和ogg
如果玩家使用的是手机且没有连接WiFiiOS和部分浏览器无法获知网络状态将始终视为流量党那么背景音乐默认不会开启可以在标题画面点击右下角的圆形按钮来开启。
发布到官网的作品还可以从<https://h5mota.com/music/>远程加载背景音乐您可以点击此链接试听和下载其他作品的背景音乐。是否启用远程加载、以及启用时远程加载的根目录由main.js指定。因此从官网下载其他作品的离线版本后请先关闭远程加载功能才能正常加载本地注册的音乐。
使用core.material.bgms可以查看所有的背景音乐如果需要同时播放多个背景音乐并独立控制时刻和音量请直接对它们使用play()方法并修改其currentTime可读和volume属性。
2. 使用音效project\sounds文件夹中的文件名写法同上。和动画不同
音效的播放不支持回调,只支持提前停止,而且一停就会停止所有的。
音效的音量是固定的无法调节。此外样板没有背景音效bgs、bgv的默认实现。如有需求请使用并行脚本处理。
音乐和音效在使用多选框注册时都支持试听您可以看到它们的总时长和已播时长精确到秒从而指定音乐的开播秒数或配合使用“等待n毫秒”事件或并行脚本处理。
3. 使用字体project\fonts文件夹中的文件名只支持ttf格式不写后缀
不建议给在线游戏版本添加中文字体,因为文件真的很大……
4. 文件映射:如前所述,样板所有需要加载的文件名都必须是全英数。
这一项允许你给文件取别名,别名可以使用任何语言的文字。
5. 装备孔:见“道具的装备属性”。
6. 标题音乐:如题,请注意部分浏览器不会在刚打开某个页面时就播放音频,必须用户操作一下才行。
7. 主样式一些css设置项单击“编辑”按钮可以看到具体含义和用法这里不再赘述横竖屏标题画面背景支持gif动图
8. 游戏名:标题画面和网页选项卡上显示的名字,可以和官网别的作品重名。
9. 唯一英文标识符:必须修改,且不得和官网别的作品重名。只能使用全英数,如果您不确定一个标识符是否已被别的作品使用,请输入 ckcz123.com/games/xxx 如出现404就说明xxx未被使用。
10. 游戏版本当您的游戏发生版本更迭后旧版本的存档直接读取可能会出现bug.因此届时您可以修改此项来让旧存档无法直接读取,只能回放其录像。
11. 难度分歧:单击“编辑”按钮进入事件编辑器,每个难度分为以下几项。
1. 名称:标题界面单击“开始游戏”后出现的二级菜单中的文字。
一般为该难度的最简要的介绍,如减伤比例、初始福利等。
2. 简写横屏状态栏左下角竖屏右下角也作为数字键切换按钮和存读档界面缩略图上的文字也会出现在在线游戏排行榜和旧版官网的作品卡片上。允许使用中文但请注意控制字数用core.status.hard表示。
3. 变量hard值若同一结局有多个难度有人通关则上述排行榜只统计此值最高的难度。
4. 颜色:上述“简写”的颜色,用`core.status.hero.flags.__hardColor__`表示,默认为红色。详见“脚本编辑——更新状态栏”。
5. 事件:此事件比下述的“开场剧情”更早执行,一般用来设置初始福利。
如果将难度分歧数组留空那么标题界面单击“开始游戏”就会直接进入开场剧情。即core.hideStartAnimate(core.startGame)
core.stopAnimate(id, doCallback); // 停止一段动画
```
5. **使用音乐:**`project/bgms`文件夹中的文件名需要后缀默认只支持wav、mp3和ogg
* 如果玩家使用的是手机且没有连接WiFiiOS和部分浏览器无法获知网络状态将始终视为流量党那么背景音乐默认不会开启可以在标题画面点击右下角的圆形按钮来开启。
* 发布到官网的作品还可以从<https://h5mota.com/music/>远程加载背景音乐,您可以点击此链接试听和下载其他作品的背景音乐。
* 是否启用远程加载、以及启用时远程加载的根目录由main.js指定。因此从官网下载其他作品的离线版本后请先关闭远程加载功能才能正常加载本地注册的音乐。
* 使用core.material.bgms可以查看所有的背景音乐如果需要同时播放多个背景音乐并独立控制时刻和音量请直接对它们使用play()方法并修改其currentTime可读和volume属性。
6. **使用音效:**`project/sounds`文件夹中的文件名(写法同上)。和动画不同,音效的播放不支持回调,只支持提前停止,而且一停就会停止所有的。
* 音效的音量是固定的无法调节。此外样板没有背景音效bgs、bgv的默认实现。如有需求请使用并行脚本处理。
* 音乐和音效在使用多选框注册时都支持试听您可以看到它们的总时长和已播时长精确到秒从而指定音乐的开播秒数或配合使用“等待n毫秒”事件或并行脚本处理。
7. **使用字体:**project\fonts文件夹中的文件名只支持ttf格式不写后缀。不建议给在线游戏版本添加中文字体因为文件真的很大……
8. **文件映射:**如前所述,样板所有需要加载的文件名都必须全部是英文或数字。这一项允许你给文件取别名,别名可以使用任何语言的文字。
9. **装备孔:**见“道具的装备属性”。
10. **标题音乐:**如题,请注意部分浏览器不会在刚打开某个页面时就播放音频,必须用户操作一下才行。
11. **主样式:**一些css设置项单击“编辑”按钮可以看到具体含义和用法这里不再赘述横竖屏标题画面背景支持gif动图
12. **游戏名:**标题画面和网页选项卡上显示的名字,可以和官网别的作品重名。
13. **唯一英文标识符:** **必须修改,且不得和官网别的作品重名**。只能使用字母数字下划线,如果您不确定一个标识符是否已被别的作品使用,请输入[https://h5mota.com/games/xxx](https://h5mota.com/games/xxx)如出现404就说明此项未被使用。
14. **游戏版本:**当您的游戏发生版本更迭后旧版本的存档直接读取可能会出现bug.因此届时您可以修改此项来让旧存档无法直接读取,只能回放其录像。
15. **难度分歧:**单击“编辑”按钮进入事件编辑器,每个难度分为以下几项。
* 名称:标题界面单击“开始游戏”后出现的二级菜单中的文字。一般为该难度的最简要的介绍,如减伤比例、初始福利等。
* 简写横屏状态栏左下角竖屏右下角也作为数字键切换按钮和存读档界面缩略图上的文字也会出现在在线游戏排行榜和旧版官网的作品卡片上。允许使用中文但请注意控制字数用core.status.hard表示。
* 变量hard值若同一结局有多个难度有人通关则上述排行榜只统计此值最高的难度。
* 颜色:上述“简写”的颜色,用`core.status.hero.flags.__hardColor__`表示,默认为红色。详见“脚本编辑——更新状态栏”。
* 事件:此事件比下述的“开场剧情”更早执行,一般用来设置初始福利。
* 如果将难度分歧数组留空,那么标题界面单击“开始游戏”就会直接进入开场剧情。
### 初始勇士
1. 初始楼层、朝向和坐标:如题,请注意初始楼层必须在上述的“楼层列表”中。初始坐标一般通过右击地图上的空地快速绑定,但您也可以手动在这里填写负数或超出初始楼层宽高的值。然后使用“无视地形移动勇士”或“跳跃勇士”等改变勇士位置的事件指令,做出“勇士从地图外进入”的演出效果。
如需根据难度分歧或用户选项来改变它们请在“开场剧情”中修改core.firstData.floorId和core.firstData.hero.loc
2. 行走图如题必须在“使用图片”中注册过。宽高必须为4的倍数宽度至少为128px即每帧32px。高度不限剧情对话中和状态栏中会尝试保持比例压缩到每帧32px宽。
在游戏中勇士当前的行走图文件名用core.status.hero.flags.heroIcon表示只读
3. 帧动画:勾选此项后,勇士在剧情对话中(朝上视为朝下)和原地不动时会循环播放四帧踏步动画,一般用于长翅膀的勇士。
4. 勇士名:如题,也会作为剧情对话中`\t[hero]`的默认标题。
5. 初始等级:如果开启了自动进阶功能,请不要修改此项。
6. 生命上限、魔力上限、初始生命/魔力/攻防/护盾/金经:如题。
注意生命上限和金经需要在系统开关中勾选后才会启用,魔力上限填负数代表没有上限。
7. 初始装备、游戏变量建议留空事件中的变量初始时都会视为0脚本中也有办法做到
8. 永久道具、消耗道具、初始拥有装备个数:点击“注释”按钮,按照提示进行修改。
9. 标题事件:需要配合系统开关中勾选“标题开启事件化”来使用,可以在“开始游戏”、“读取存档”之余添加一些额外的功能。如成就系统、音像和回想鉴赏,但这并不是唯一的方法,请自行研究。
10. 开场剧情:会在难度分歧事件之后执行,可以在这里设置各种变量的初始值、穿上初始拥有的装备、隐藏勇士和一些初始不希望显示的图层块、追加跟随者等。
11. 全局商店详见“QTE与全局商店”。
12. 等级提升:需要配合系统开关中勾选“等级”、“经验”和“升级”来使用,每个等级分为以下几项:
1. 需求:刷新状态栏时,如果勇士当前等级是此等级的前一级,且经验值大于等于此需求,就会触发升级。
因此如果您想设计“低难度初始等级较高”,请直接增加经验。
触发升级后会再次检查下一个等级,直到经验不足或等级已满。
所以您不必担心一次获得太多经验连续触发升级会出bug.
2. 称号状态栏显示的等级默认是个正整数会尝试替换为这里的称号调用core.getLvName()函数),请注意控制字数。
3. 是否扣除经验:如果勾选了此项,则触发升级时经验值会扣除需求值。
4. 事件:触发升级时执行的事件,如全面提升属性。
1. **初始楼层、朝向和坐标:**如题,请注意初始楼层必须在上述的“楼层列表”中。初始坐标一般通过右击地图上的空地快速绑定,但您也可以手动在这里填写负数或超出初始楼层宽高的值。然后使用“无视地形移动勇士”或“跳跃勇士”等改变勇士位置的事件指令,做出“勇士从地图外进入”的演出效果。
* 如需根据难度分歧或用户选项来改变它们请在“开场剧情”中修改core.firstData.floorId和core.firstData.hero.loc
2. **行走图:**如题必须在“使用图片”中注册过。宽高必须为4的倍数宽度至少为128px即每帧32px。高度不限剧情对话中和状态栏中会尝试保持比例压缩到每帧32px宽。
* 在游戏中勇士当前的行走图文件名用core.status.hero.image表示只读
3. **帧动画:**勾选此项后,勇士在剧情对话中(朝上视为朝下)和原地不动时会循环播放四帧踏步动画,一般用于长翅膀的勇士。
4. **勇士名:**如题,也会作为剧情对话中`\t[hero]`的默认标题。
5. **初始等级:**如果开启了自动进阶功能,请不要修改此项。
6. **生命上限、魔力上限、初始生命/魔力/攻防/护盾/金经:**如题。注意生命上限和金经需要在系统开关中勾选后才会启用,魔力上限填负数代表没有上限。
7. **初始装备、游戏变量:**建议留空事件中的变量初始时都会视为0脚本中也有办法做到
8. **永久道具、消耗道具、初始拥有装备个数:**点击“注释”按钮,按照提示进行修改。
9. **标题事件:**需要配合系统开关中勾选“标题开启事件化”来使用,可以在“开始游戏”、“读取存档”之余添加一些额外的功能。如成就系统、音像和回想鉴赏,但这并不是唯一的方法,请自行研究。
10. **开场剧情:**会在难度分歧事件之后执行,可以在这里设置各种变量的初始值、穿上初始拥有的装备、隐藏勇士和一些初始不希望显示的图层块、追加跟随者等。
11. **全局商店:**详见“QTE与全局商店”。
12. **等级提升:**需要配合系统开关中勾选“等级”、“经验”和“升级”来使用,每个等级分为以下几项:
* 需求:刷新状态栏时,如果勇士当前等级是此等级的前一级,且经验值大于等于此需求,就会触发升级。
* 称号状态栏显示的等级默认是个正整数会尝试替换为这里的称号调用core.getLvName()函数),请注意控制字数。
* 是否扣除经验:如果勾选了此项,则触发升级时经验值会扣除需求值。
* 事件:触发升级时执行的事件,如全面提升属性。
### 全局数值
![image](img/v2.7/values&flagsB.png)
这个类型的数值会保存在core.values中可以直接在游戏中修改。
1. 血网伤害和中毒伤害:如题,如果不想用常数,请修改“脚本编辑”的“阻激夹域伤害”和“每步后操作”。
2. 衰弱效果填小于1的正数代表扣减的比例否则为扣减的常数。
扣减和恢复的原理和装备相同,详见“公共事件——毒衰咒处理”、解衰药水和万能药水的使用效果。
3. 三种宝石和四种血瓶的值如题此值为基础值。实际效果还需乘以楼层属性最下面的“宝石血瓶效果”限即捡即用类详见这七种道具的属性。此外B键数据统计是按照此值乘以“宝石血瓶效果”统计的与道具的实际效果无关请自行注意。
4. 反击、破甲、净化比例如果反击、破甲、净化怪物没有指定atkValue、defValue和n就会用这三个值。请注意反击的总回合数是勇士的攻击回合数净化比例填1表示单纯无视护盾。
5. 仇恨增值每进行一场战斗core.status.hero.flags.hatred的增加量。如果不想用常数请修改“脚本编辑——战后脚本”。
6. 全局帧动画时间即怪物和NPC的振动速度建议改为300毫秒。
7. 竖状态栏自绘行数需要配合系统开关“开启自绘状态栏”使用建议改为4.
![image](img/values_flagsB.jpg)
这个类型的数值会保存在core.values中可以直接在游戏中修改。
1. **血网伤害和中毒伤害:**如题,如果不想用常数,请修改“脚本编辑”的“阻激夹域伤害”和“每步后操作”。
2. **衰弱效果:**填小于1的正数代表扣减的比例否则为扣减的常数。扣减和恢复的原理和装备相同详见“公共事件——毒衰咒处理”、解衰药水和万能药水的使用效果。
3. **三种宝石和四种血瓶的值:**如题此值为基础值。实际效果还需乘以楼层属性最下面的“宝石血瓶效果”限即捡即用类详见这七种道具的属性。此外B键数据统计是按照此值乘以“宝石血瓶效果”统计的与道具的实际效果无关请自行注意。
4. **反击、破甲、净化比例:**如果反击、破甲、净化怪物没有指定atkValue、defValue和n就会用这三个值。请注意反击的总回合数是勇士的攻击回合数净化比例填1表示单纯无视护盾。
5. **仇恨增值:**每进行一场战斗core.status.hero.flags.hatred的增加量。如果不想用常数请修改“脚本编辑——战后脚本”。
6. **全局帧动画时间:**即怪物和NPC的振动速度建议改为300毫秒。
7. **竖状态栏自绘行数:**需要配合系统开关“开启自绘状态栏”使用建议改为4.
### 系统开关
这个类型的开关会保存在core.flags中只读请注意和core.status.hero.flags相区分。如需在游戏中修改请使用“设置系统开关”事件。
1. 状态栏显示项如题总个数请控制在12个以内否则竖屏可能塞不下。
多说一句,这些项的图标都在`project\materials\icons.png`中。
该文件夹下也提供了一个`icons_old.png`可供替换。
“血限”、“金币”和“经验”必须勾选才会启用(指会处理生命溢出、金经会显示在手册、打怪也会掉落),
必须勾选“升级”才会启用自动进阶“升级扣除模式”如果不勾选就会同时显示下一级的需求NEXT和当前经验EXP如果勾选了的话否则会只显示两者的差依然用NEXT图标
如果同时勾选了“钥匙”和“绿钥”,则每种钥匙的数量都会被缩小尺寸显示,因此如非必要请不要勾选“绿钥”。
2. 楼传需在楼梯边:如果勾选了此项,则只有勇士在楼梯旁边(如果开启了下述的平面模式则还包括四种三帧箭头旁边)时才允许使用楼传。
请注意,此项是在楼传道具使用条件之外额外进行的判定,目的是给出不同的提示信息。因此如果您要修改楼传的使用条件(指总的使用条件,具体能否飞到某层的条件则在“脚本编辑——楼层飞行”),则可能需要一并取消此勾选。
3. 楼传开平面模式:如果勾选了此项,则勇士在使用楼传飞往某层时会落在上次离开该层的位置。此外,上述“在楼梯边”也会包括“在四种三帧箭头旁边”。
4. 铁门不消耗钥匙:如果勾选了此项,则铁门无需钥匙也能撞开。
勾选后您可以将铁门的开门动画ps为墙壁状来批量制作暗道。
直接把三色墙等的图块的“触发器”改为openDoor也是可以的。
5. 首次道具进行提示勾选后首次捡到非即捡即用类道具都会弹窗提示晚于afterGetItem事件被执行
6. 状态栏装备按钮:勾选后,状态栏的楼传按钮会变为装备栏按钮,但玩家仍然可以双击道具栏来呼出装备栏。
7. 加点和负伤前者勾选后怪物的加点值会在“脚本编辑——战后脚本”中作为参数core.status.hero.flags.arg1被传递给“公共事件——加点事件”。
后者勾选后,战斗结束时如果勇士的护盾没有完全被打破,则剩余的护盾值会加到其生命上。所以勾选此项后,护盾可以这样“间接”抵消掉仇恨伤害和固伤。
8. 夹击不超伤害值:勾选此项后,夹击伤害将封顶至夹击怪的战损。
同时被四只怪夹击时,取两个战损中较小的。
9. 二分临界我们知道打败怪物所需的回合数取决于勇士的攻击减去怪物的防御。这个值并非每增大1都能使回合数减少因而有了“临界”的说法即“再至少增加多少攻击力才能减少回合数”。然而当您修改“脚本编辑——战斗伤害信息”函数后攻击力的增加可能反而导致回合数也增加于是临界值计算出错。您可以勾选此开关来修复代价是游戏可能较卡请自行权衡。
10. 标题开启事件化:勾选此项后,标题画面将改为执行前述的“标题事件”,请自行研究。
11. 开启自绘状态栏:勾选此项后,状态栏将改用“脚本编辑——自绘状态栏”来绘制,同时“脚本编辑——点击状态栏”也将启用,请自行研究。
12. 三个显伤:略,玩家依然可以在设置菜单中开关之。
13. 允许轻按:勾选此项后,玩家可以按下空格/大键盘数字7/双击勇士来拾取相邻的唯一道具,或面前的道具。
14. 允许穿透楼梯:在狭窄的区域拦路放置一个可通行的“楼层转换”事件时(图块左下角出现绿色标记),玩家可能希望勇士能直接走过去。您可以逐个去设置其能否被这样走过,或者让其依据本勾选项。
值得注意的是,当玩家从允许穿透的楼梯向一个不可走的方向(如旁边是墙,或不勾选下一个开关时的致命领域)手动寻路时,可以停在楼梯上(进而再轻按拾取周围物品等)。不建议您利用这类极端情况去迫使玩家进行非常规操作,毕竟穿透楼梯和不能踏入致命领域的本意是方便玩家,不是么?
15. 允许将死领域“脚本编辑——阻激夹域伤害”会将地图中每个点的阻激夹域和血网伤害加总如果不勾选此开关则当勇士生命小于等于相邻空格子的总伤害没有则视为0勇士无法走向该格子。
值得注意的是这种判定方式并没有考虑“走这一步后、结算该点伤害前”可能的加血或该点伤害变化因此您可能需要根据“脚本编辑——每步后操作”去修改core.canMoveHero()函数。
16. 允许瞬移:若不勾选此开关,将全程禁用瞬移功能。一般只建议在需要的楼层逐层勾选禁止瞬移(主要为了用自动事件去监听勇士的坐标),详见`core.maps._canMoveDirectly_checkGlobal()`函数。
17. 伤害禁用商店勾选此项后每当勇士踩到阻激夹域和血网并受到伤害时所有全局商店都将被禁用需要重新去启用譬如勇士去撞击该商店的实体NPC。详见`core.control._checkBlock_disableQuickShop()`函数。
18. 虚化前景层:前景层会遮挡事件层,这对魔塔来说有时可能不太友好。
勾选此项后,事件层有东西(如道具)时将虚化该格子的前景层,使得该东西以半透明状态可见。
1. **状态栏显示项:**如题总个数请控制在12个以内否则竖屏可能塞不下。
* 这些项的图标都在`project\materials\icons.png`中。该文件夹下也提供了一个`icons_old.png`可供替换。
* “血限”、“金币”和“经验”必须勾选才会启用(指会处理生命溢出、金经会显示在手册、打怪也会掉落),
* 必须勾选“升级”才会启用自动进阶“升级扣除模式”如果不勾选就会同时显示下一级的需求NEXT和当前经验EXP如果勾选了的话否则会只显示两者的差依然用NEXT图标
* 如果同时勾选了“钥匙”和“绿钥”,则每种钥匙的数量都会被缩小尺寸显示,因此如非必要请不要勾选“绿钥”。
2. **楼传需在楼梯边:**如果勾选了此项,则只有勇士在楼梯旁边(如果开启了下述的平面模式则还包括四种三帧箭头旁边)时才允许使用楼传。
* 请注意,此项是在楼传道具使用条件之外额外进行的判定,目的是给出不同的提示信息。
* 因此如果您要修改楼传的使用条件(指总的使用条件,具体能否飞到某层的条件则在“脚本编辑——楼层飞行”),则可能需要一并取消此勾选。
3. **楼传开平面模式:**如果勾选了此项,则勇士在使用楼传飞往某层时会落在上次离开该层的位置。此外,上述“在楼梯边”也会包括“在四种三帧箭头旁边”。
4. **铁门不消耗钥匙:**如果勾选了此项,则铁门无需钥匙也能撞开。
5. **首次道具进行提示:**勾选后首次捡到非即捡即用类道具都会弹窗提示晚于afterGetItem事件被执行
6. **状态栏装备按钮:**勾选后,状态栏的楼传按钮会变为装备栏按钮,但玩家仍然可以双击道具栏来呼出装备栏。
7. **加点:**勾选后怪物的加点值会在“脚本编辑——战后脚本”中作为参数core.status.hero.flags.arg1被传递给“公共事件——加点事件”。
8. **负伤:**勾选后,战斗结束时如果勇士的护盾没有完全被打破,则剩余的护盾值会加到其生命上。所以勾选此项后,护盾可以这样“间接”抵消掉仇恨伤害和固伤。
9. **夹击不超伤害值:**勾选此项后,夹击伤害将封顶至夹击怪的战损。同时被四只怪夹击时,取两个战损中较小的。
10. **二分临界:**我们知道打败怪物所需的回合数取决于勇士的攻击减去怪物的防御。这个值并非每增大1都能使回合数减少因而有了“临界”的说法即“再至少增加多少攻击力才能减少回合数”。然而当您修改“脚本编辑——战斗伤害信息”函数后攻击力的增加可能反而导致回合数也增加于是临界值计算出错。您可以勾选此开关来修复代价是游戏可能较卡请自行权衡。
11. **标题开启事件化:**勾选此项后,标题画面将改为执行前述的“标题事件”,请自行研究。
12. **开启自绘状态栏:**勾选此项后,状态栏将改用“脚本编辑——自绘状态栏”来绘制,同时“脚本编辑——点击状态栏”也将启用,请自行研究。
13. **三个显伤:**略,玩家依然可以在设置菜单中开关之。
14. **允许轻按:**勾选此项后,玩家可以按下空格/大键盘数字7/双击勇士来拾取相邻的唯一道具,或面前的道具。
15. **允许穿透楼梯:**在狭窄的区域拦路放置一个可通行的“楼层转换”事件时(图块左下角出现绿色标记),玩家可能希望勇士能直接走过去。您可以逐个去设置其能否被这样走过,或者让其依据本勾选项。
* 值得注意的是,当玩家从允许穿透的楼梯向一个不可走的方向(如旁边是墙,或不勾选下一个开关时的致命领域)手动寻路时,可以停在楼梯上(进而再轻按拾取周围物品等)。不建议您利用这类极端情况去迫使玩家进行非常规操作,毕竟穿透楼梯和不能踏入致命领域的本意是方便玩家,不是么?
16. **允许将死领域:**“脚本编辑——阻激夹域伤害”会将地图中每个点的阻激夹域和血网伤害加总如果不勾选此开关则当勇士生命小于等于相邻空格子的总伤害没有则视为0勇士无法走向该格子。
* 值得注意的是这种判定方式并没有考虑“走这一步后、结算该点伤害前”可能的加血或该点伤害变化因此如有必要可根据“脚本编辑——每步后操作”去修改core.canMoveHero()函数。
17. **允许瞬移:**若不勾选此开关,将全程禁用瞬移功能。一般只建议在需要的楼层逐层勾选禁止瞬移。
18. **伤害禁用商店:**勾选此项后每当勇士踩到阻激夹域和血网并受到伤害时所有全局商店都将被禁用需要重新去启用譬如勇士去撞击该商店的实体NPC
19. **虚化前景层:**前景层会遮挡事件层,这对魔塔来说有时可能不太友好。勾选此项后,事件层有东西(如道具)时将虚化该格子的前景层,使得该东西以半透明状态可见。
上面就是整个样板中的各个元件说明。通过这种方式,你就已经可以做出一部没有任何事件的塔了。

View File

@ -1,72 +1,82 @@
# 事件
?> 目前版本**v2.7**,上次更新时间:* {docsify-updated} *<br>
?> 在这一节中,让我们来了解事件系统的基本原理
## 事件编辑地图选点快捷键X
![image](img/v2.7/eventsX.png)
![image](img/eventsX.jpg)
样板所有的事件都是依靠“触发器”完成的。例如勇士碰到绑定好的楼梯可以触发changeFloor碰到门可以触发openDoor碰到怪物可以触发battle碰到道具可以触发getItem碰到箱子可以触发pushBox走上冰面背景层可以触发ski.
这些触发器都是系统自带的已经存在处理机制不需要我们操心。我们真正所需要关心的其实只是自定义的事件如NPC
这些触发器都是系统自带的(称为系统事件)已经存在处理机制不需要我们操心。我们真正所需要关心的其实只是自定义的事件如NPC
地图选点快捷键X一共有七项在地图中以图块左下角用七色小方块标记。
红色为普通事件,橙色为自动事件,黄色为战后事件,绿色为楼层转换,青色为(拾获)道具后事件,靛色(不是事件)为勇士站在该点不能朝哪些方向走,紫(粉)色为开门后事件。此外还有一些事件不在地图上,如“首次到达”、“每次到达”(这两个的触发原理,详见“脚本编辑——切换楼层后”)、“道具效果”、“公共事件”和全塔属性中那五个事件。
* **红色:**普通事件
* **橙色:**自动事件
* **黄色:**战后事件
* **绿色:**楼层转换
* **青色:**获得道具后事件
* **靛色:**不是事件,为勇士站在该点不能朝哪些方向走
* **紫(粉)色:**开门后事件。
此外还有一些事件不在地图上,如“首次到达”、“每次到达”(这两个的触发原理,详见“脚本编辑——切换楼层后”)、“道具效果”、“公共事件”和全塔属性中那五个事件。
### 事件的机制
地图上的所有事件都存在两种状态:启用和禁用。
- 启用状态下,该事件才处于可见状态,可被触发、交互与处理。
- 禁用状态下,该事件几乎相当于不存在,不可见、不可被触发、不可交互,只能通过“插入事件”指令远程调用。
* 启用状态下,该事件才处于可见状态,可被触发、交互与处理。
* 禁用状态下,该事件几乎相当于不存在,不可见、不可被触发、不可交互,只能通过“插入事件”指令远程调用。
所有事件默认情况下初始都是启用的,只有普通事件可以通过不勾选“启用”来初始隐藏。
在事件列表中使用“显示事件”和“隐藏事件”可以将一个禁用事件给启用,或将一个启用事件给禁用,甚至直接从地图中删除。
如想让一个普通事件或楼层转换事件绿隐形但不禁用请将其“转变图块为”0空地或17空气墙
【重要警告】:
**【重要警告】:**
1. 打怪开门捡道具后如果有对应的坐标则该点的事件会被从地图中删除重生怪除外它只会被暂时隐藏。然后会尝试执行该点的战后事件、开门后事件或拾获道具后事件您可以勾选“轻按时不触发”。如果执行则“当前点坐标”core.status.event.data的坐标也会变为该点。
所以这三个XX后事件其实是有可能被多次触发或意外触发的如打死或炸掉某个有战后事件的怪推了个阻击怪过去打死请自行注意。
* 所以这三个XX后事件其实是有可能被多次触发或意外触发的如打死或炸掉某个有战后事件的怪推了个阻击怪过去打死请自行注意。
2. “移动事件”(如阻击和捕捉)和“跳跃事件”(如支援)会将起点处的事件从地图中删除,如果不勾选“不消失”(如阻击),则会在终点处“转变图块”并“显示事件”。但事件的内容不会被跟着移动到终点,推箱子同理,但在终点只转变图块而不予显示。
### 楼梯、传送门事件
![image](img/v2.7/changeFloor.png)
![image](img/changeFloor.jpg)
当您在地图上绘制楼梯、或绘制四种三帧箭头并右击绑定后就创建了一个“楼层转换”事件您可以在事件编辑器右侧看到一行代码json请注意对照。
此事件与core.changeFloor(floorId, stair, heroLoc, time,
callback)函数相对应,只是多了一项“穿透性”。
此事件与`core.changeFloor(floorId, stair, heroLoc, time, callback)`函数相对应,只是多了一项“穿透性”。
每个这样的事件都是上图的写法,下面逐一讲解其各项的含义和用法:
1. 目标楼层floorId如题如果选择了“楼层ID”就需要在第二个框中输入目标楼层的ID会自动提示补全也可以双击整个紫色块从地图选点。如果选择了其他三种则json代码中“:before”、“:next”、“:now”分别表示“前一楼”、“后一楼”顺序由“全塔属性——楼层列表”指定上下楼器同理和“当前楼”函数中也是一样的写法。
2. 目标位置stair如果选择了“坐标”则需要在后面两个框里输入同样可以地图选点在函数中则将stair填null并填写heroLoc也可以选择下拉框中的其他几项在函数中则将heroLoc填null如保持不变:now、中心对称:symmetry、左右对称`:symmetry_x`)、上下对称(`:symmetry_y`或任何一个图块ID.
填写三种对称位置时请注意,坐标计算以当前楼层而不是目标楼层为准,尤其要注意防止勇士出界。
填写图块ID时请注意“上下楼梯”提供在了下拉框中实际传送时会优先尝试取用目标层的“楼层属性——上下楼点”。其次尝试像其他ID一样从目标楼层搜索因此请确保该图块在目标楼层中存在且唯一。
3. 朝向有八种写法可以直接填写改变后的朝向up、down、left、right也可以填写转身的角度:left、:right、:back或不变。
4. 动画时间指黑屏的毫秒数可以填0或不小于100的整数不填则使用玩家设定值。
5. 穿透性:见[系统开关]允许穿透楼梯。
1. **目标楼层floorId**如题如果选择了“楼层ID”就需要在第二个框中输入目标楼层的ID会自动提示补全也可以双击整个紫色块从地图选点。如果选择了其他三种则json代码中`:before`、`:next`、`:now`分别表示“前一楼”、“后一楼”(顺序由“全塔属性——楼层列表”指定,上下楼器同理)和“当前楼”,函数中也是一样的写法。
2. **目标位置stair**如果选择了“坐标”则需要在后面两个框里输入(同样可以地图选点,在函数中则将`stair`填`null`并填写`heroLoc`),也可以选择下拉框中的其他几项(在函数中则将`heroLoc`填`null`),如保持不变(`:now`)、中心对称(`:symmetry`)、左右对称(`:symmetry_x`)、上下对称(`:symmetry_y`或任何一个图块ID.
* 填写三种对称位置时请注意,坐标计算以当前楼层而不是目标楼层为准,尤其要注意防止勇士出界。
* 填写图块ID时请注意“上下楼梯”提供在了下拉框中实际传送时会优先尝试取用目标层的“楼层属性——上下楼点”。其次尝试像其他ID一样从目标楼层搜索因此请确保该图块在目标楼层中存在且唯一。
3. **朝向:**有八种写法,可以直接填写改变后的朝向(`up, down, left, right`),也可以填写转身的角度(`:left, :right, :back`)或不变。
4. **动画时间:**指黑屏的毫秒数可以填0或不小于100的整数不填则使用玩家设定值。
5. **穿透性:**见[系统开关](start)允许穿透楼梯。
值得注意的是,绑定了楼层转换事件的门、怪物、道具、箱子,其系统行为(开门、战斗、拾取、推行)将不再发生(阻激夹域等地图属性不受影响),而是被覆盖为上下楼。
## 普通事件(红)
普通事件在启用后可以被勇士碰触而触发,它们都有着这样的开头:
覆盖触发器(Y/N)启用(Y/N)通行状态(Y/N)显伤(Y/N)
1. 覆盖触发器如前所述门、怪物、道具、箱子都已经被绑定了系统触发器。如果您需要让地图上的个别这类图块在被勇士碰触时不发生系统行为开门、战斗、拾取、推行而是执行您在下面自定义的事件比如触碰boss先进行一段对话再强制战斗请勾选此项。阻激夹域等地图属性不受影响
2. 启用:如果不勾选此项,则此事件初始时是隐藏的。
`覆盖触发器(Y/N) 启用(Y/N) 通行状态(Y/N?) 显伤(Y/N)`
如前所述非常不推荐仅仅为了初始隐藏一些图块如战利品、陷阱门墙、埋伏怪等就去绑定一堆没有指令的普通事件。更安全的做法是“从0转变图块”支持淡入效果和“关门”这样还有音效多香
3. 通行状态:除怪物和道具外,所有图块本身都具有“可通行性”属性。
1. **覆盖触发器:**如前所述门、怪物、道具、箱子都已经被绑定了系统触发器。如果您需要让地图上的个别这类图块在被勇士碰触时不发生系统行为开门、战斗、拾取、推行而是执行您在下面自定义的事件比如触碰boss先进行一段对话再强制战斗请勾选此项。阻激夹域等地图属性不受影响
2. **启用:**如果不勾选此项,则此事件初始时是隐藏的。
* 如前所述,非常不推荐仅仅为了初始隐藏一些图块(如战利品、陷阱门墙、埋伏怪等)就去绑定一堆没有指令的普通事件。
* 更安全的做法是“从0转变图块”支持淡入效果和“关门”这样还有音效多香
3. **通行状态:**除怪物和道具外,所有图块本身都具有“可通行性”属性。
* 您可以设置此项去覆盖地图中这一点的可通行性譬如强行让一格空地不可通行勇士撞击时出现一堵墙51层魔塔第23层的效果
4. **显伤:**在对怪物使用覆盖触发器后,表面上看不出它和一般怪物的不同。
* 如有必要(比如触碰这怪物根本不战斗),可不勾选显伤以示区别。
* 如数量较多可注册一个相同素材的NPC比如样板中的仙子。
* 如需在一段剧情中关闭所有显伤,可以简单移除怪物手册
您可以设置此项去覆盖地图中这一点的可通行性譬如强行让一格空地不可通行勇士撞击时出现一堵墙51层魔塔第23层的效果
4. 显伤:在对怪物使用覆盖触发器后,表面上看不出它和一般怪物的不同。
如有必要(比如触碰这怪物根本不战斗),可不勾选显伤以示区别。
如数量较多可注册一个相同素材的NPC比如样板中的仙子。
如需在一段剧情中关闭所有显伤请调用core.removeItem(book)
## 自动事件(橙)
在“右键绑定机关门”中,我们已经初见了自动事件的端倪。
在游戏中我们经常需要监听大量乱七八糟的状态根据状态的变化去做出及时的处理比如勇士生命小于等于0会触发游戏失败。比如51层魔塔第39层监听9扇黄门的状态来触发中心对称飞行器的出现、第49层监听8名魔法警卫的状态来封印假魔王。
@ -76,25 +86,31 @@ callback)函数相对应,只是多了一项“穿透性”。
而自动事件则不然,它不需要您去主动考虑所有“改变状态”的原因,而是简单地在每次刷新状态栏时,检查是否满足触发条件,满足的话就执行。
每个自动事件具有以下几个属性:
1. 触发条件:自动事件最重要的属性,为支持冒号缩写量的逻辑表达式。
譬如上述两个例子中触发条件就是“某两个点没有图块而某7个点图块为黄门”和“某四个点没有图块而某四个点图块为魔法警卫”。
1. **触发条件:**自动事件最重要的属性,为支持冒号缩写量的逻辑表达式。
* 譬如上述两个例子中触发条件就是“某两个点没有图块而某7个点图块为黄门”和“某四个点没有图块而某四个点图块为魔法警卫”。
* 关于冒号缩写量,详见[只读块]值块和冒号缩写量。
2. **优先级:**一般不需要改动。当多个自动事件的条件同时满足时,优先执行此级别较大的。
* 此级别也相等时,允许跨层触发则优先执行楼层较矮的。
* 同一楼层优先执行横坐标较小的,横坐标相等时优先执行纵坐标较小的,同一点处优先执行页码较小的。
3. **仅在本层检测:**如题一般不需要改动。除非您要制作一些全局的效果如“勇士生命低于上限的1/3时改变背景音乐”。
4. **事件流中延迟执行:**勾选此项后,在执行其他事件时触发此自动事件则会将其内容追加到待执行事件的末尾,否则插队到待执行事件的开头。
5. **允许多次执行:**如果不勾选,则此事件最多只会被触发一次。即使勾选了,每次执行的过程中也会暂时禁止自己被触发。勾选后,请记得在此事件的指令中将条件变得不满足。
每个点初始提供了两个自动事件页,您还可以再在数据区最上面单击“添加自动事件页”。
关于冒号缩写量,详见[只读块]值块和冒号缩写量。
2. 优先级:一般不需要改动。当多个自动事件的条件同时满足时,优先执行此级别较大的。此级别也相等时,允许跨层触发则优先执行楼层较矮的。同一楼层优先执行横坐标较小的,横坐标相等时优先执行纵坐标较小的,同一点处优先执行页码较小的。每个点初始提供了两个自动事件页,您还可以再在数据区最上面单击“添加自动事件页”。
3. 仅在本层检测如题一般不需要改动。除非您要制作一些全局的效果如“勇士生命低于上限的1/3时改变背景音乐”。
4. 事件流中延迟执行:勾选此项后,在执行其他事件时触发此自动事件则会将其内容追加到待执行事件的末尾,否则插队到待执行事件的开头。
5. 允许多次执行:如果不勾选,则此事件最多只会被触发一次。即使勾选了,每次执行的过程中也会暂时禁止自己被触发。勾选后,请记得在此事件的指令中将条件变得不满足。
## 公共事件(逗号键)
有几个事件,如战后加点、毒衰咒处理、回收钥匙商店,会在战后脚本或全局商店等处频繁用到。于是它们被整理成了公共事件,您也可以追加自己的。
公共事件在内容上和其他事件并无不同,只是在插入公共事件时(如core.insertCommonEvent(“回收钥匙商店”))可以提供一个“参数列表”
公共事件在内容上和其他事件并无不同,只是在插入公共事件时(如`core.insertCommonEvent("回收钥匙商店")`)可以提供一个`参数列表`。
参数列表是一个一维数组其每项会被依次代入core.status.hero.flags.arg1、arg2、……而arg0则会记录公共事件的中文名,因此请不要在一个公共事件里又插入另一个公共事件
参数列表是一个一维数组,其每项会被依次代入`core.status.hero.flags.arg1、arg2、……`,而`arg0`则会记录公共事件的中文名。
在整个事件流结束后即勇士恢复行动请注意不是公共事件结束后这些以arg加纯数字命名的变量、以及以@temp开头的临时变量都会被清空。
## 滑冰事件
滑冰ski是一个非常特殊的触发器使用此触发器的图块需要画在背景层。
冰上可以画门、怪物、道具等任何图块您还可以在前景层画上四种单向通行箭头样板1层右下方那些把三个图层的游戏性都发挥出来。
@ -103,43 +119,39 @@ callback)函数相对应,只是多了一项“穿透性”。
比如撞到怪物会强制战斗,打不过直接游戏失败。走到道具上会捡起来,撞到门则要看有没有钥匙,有的话会把门打开。
默认情况下触发事件后勇士会停下来。如果要继续滑冰可以在这些点的战后事件、开门后事件、拾获道具后事件这里最好勾选“轻按时不触发”中判断勇士还在不在冰上core.onSki()函数),在冰上的话就命令“勇士前进一格或撞击”。
默认情况下,触发事件后勇士会停下来。如果要继续滑冰,可以在这些点的战后事件、开门后事件、(拾获)道具后事件(这里最好勾选“轻按时不触发”)中判断勇士还在不在冰上(`core.onSki()`函数),在冰上的话就命令“勇士前进一格或撞击”。
## 事件编辑器
![image](img/v2.7/blockly.png)
![image](img/blockly.jpg)
当您从数据区单击任何一个事件类属性的“编辑”按钮时,就会呼出事件编辑器,上图给出了事件编辑器的全貌。
左下角为指令类别,可以点击它们呼出各类指令菜单,如左上方的值块菜单。
中央为指令区,被一个标识事件类型的紫色块包覆(即左下角的“入口方块”,图中为开门后事件),所有的指令都塞在里面。
右上角为json区会随着指令区的编辑而自动变化。core.insertAction()函数的自变量就是它们所以学有余力的话也建议您经常左右对照去了解每个指令对应的json写法。
右上角为json区会随着指令区的编辑而自动变化。`core.insertAction()`函数的自变量就是它们所以学有余力的话也建议您经常左右对照去了解每个指令对应的json写法。
右下角为调色器,当您单击指令块中的颜色按钮时(如图中“画面闪烁”指令的白块)就会自动呼出,可以进行诸如十进制和十六进制颜色格式互转等操作。
左上角为功能区,各功能的含义和用法如下:
1. 确认Ctrl+S将指令区的指令组翻译为json写回表格和文件并关闭事件编辑器。如果手动修改了json区却没有点击变黄的解析按钮或指令区存在异步事件没有用“等待所有异步事件执行完毕”图中第二条褐色指令去等待则单击确认按钮会弹窗警告。此时如果想放弃对json区的修改请随便点一下指令区的一个块即可。
2. 解析将手动修改后的json区翻译回指令组同步到指令区一般用于跨作品复制事件或长距离批量挪动和复制指令。因为blockly使用Ctrl+V粘贴出的块总是出现在原块的旁边而拖动块时块又跟不上滚轮`-_-`||
3. 取消:放弃本次编辑,关闭事件编辑器,表格和文件会停留在打开事件编辑器前的状态。
4. 搜索事件块:当您想不起来需要的指令在哪个类别时,请使用此项,如输入“勇”字就会列出所有带有“勇士”一词的指令。
5. 地图选点在编辑事件尤其是大篇幅事件的过程中如果需要频繁保存并退出事件编辑器去浏览地图尤其是浏览别的楼层就很不方便。单击此按钮您可以浏览所有楼层及其全景。通过点击地图去确认一个点的坐标并复制任何一个楼层ID以填入需要的地方。需要填坐标的指令也可以直接双击其指令块从地图选点填入坐标和楼层从而避免了肉眼数格子和手敲的麻烦和出错的隐患。
6. 变量出现位置搜索您可以搜索所有以“变量xxx”形式出现在事件中的变量的出现位置请注意“形式”和“事件”。以下形式都是无法被搜索到的比如仇恨值、阻激夹域捕的禁用开关
``` js
core.status.hero.flags.xxx
hero.flags.xxx、flags.xxx
core.getFlag('xxx')
core.hasFlag('xxx')
core.getBuff('xxx')
```
在碰触脚本、道具使用条件和装备条件等会被eval的项以及脚本编辑、插件编写等处直接core.insertAction()的自变量中,也是无法搜索到的。
7. 开启中文名替换勾选此项后“flag、status、item、switch、temp、global、enemy”等冒号缩写量的前缀以及怪物和道具的ID才会允许用中文在指令块中书写如“变量、状态、物品、独立开关、临时变量、全局存储、怪物”。\
当然json中还是只能用英文的。此外如果您需要使用中文名相同的道具或怪物或在`${}`以外的文本中将上述几个词和冒号连用则也需要关闭此功能以避免blockly和json互译出错。
8. 展开值块逻辑运算在值块菜单中我们可以看到第一个就是二元运算块但是它并不完整。比如没有位运算包括逻辑异或和取余因此如果解析的优先级与js的优先级不一致请在表达式中适当的位置添加圆括弧或取消勾选此项。
1. **确认Ctrl+S**将指令区的指令组翻译为json写回表格和文件并关闭事件编辑器。如果手动修改了json区却没有点击变黄的解析按钮或指令区存在异步事件没有用“等待所有异步事件执行完毕”图中第二条褐色指令去等待则单击确认按钮会弹窗警告。此时如果想放弃对json区的修改请随便点一下指令区的一个块即可。
2. **解析:**将手动修改后的json区翻译回指令组同步到指令区一般用于跨作品复制事件或长距离批量挪动和复制指令。因为blockly使用Ctrl+V粘贴出的块总是出现在原块的旁边而拖动块时块又跟不上滚轮。
3. **取消:**放弃本次编辑,关闭事件编辑器,表格和文件会停留在打开事件编辑器前的状态。
4. **搜索事件块:**当您想不起来需要的指令在哪个类别时,请使用此项,如输入“勇”字就会列出所有带有“勇士”一词的指令。
5. **地图选点:**在编辑事件尤其是大篇幅事件的过程中如果需要频繁保存并退出事件编辑器去浏览地图尤其是浏览别的楼层就很不方便。单击此按钮您可以浏览所有楼层及其全景。通过点击地图去确认一个点的坐标并复制任何一个楼层ID以填入需要的地方。需要填坐标的指令也可以直接双击其指令块从地图选点填入坐标和楼层从而避免了肉眼数格子和手敲的麻烦和出错的隐患。
6. **变量出现位置搜索:**您可以搜索所有以“变量xxx”形式出现在事件中的变量的出现位置请注意“形式”和“事件”。以下形式都是无法被搜索到的比如仇恨值、阻激夹域捕的禁用开关
7. **开启中文名替换:**勾选此项后“flag、status、item、switch、temp、global、enemy”等冒号缩写量的前缀以及怪物和道具的ID才会允许用中文在指令块中书写如“变量、状态、物品、独立开关、临时变量、全局存储、怪物”。当然json中还是只能用英文的。此外如果您需要使用中文名相同的道具或怪物或在`${}`以外的文本中将上述几个词和冒号连用则也需要关闭此功能以避免blockly和json互译出错。
8. **展开值块逻辑运算:**在值块菜单中我们可以看到第一个就是二元运算块但是它并不完整。比如没有位运算包括逻辑异或和取余因此如果解析的优先级与js的优先级不一致请在表达式中适当的位置添加圆括弧或取消勾选此项。
## 值块和冒号缩写量
值块并不能单独构成指令,但它们可以被嵌入数值操作、设置怪物属性和很多事件控制类指令。而冒号缩写量的用法就更多了,比如用于`${表达式计算}`和其他任何支持填表达式的地方。\
值块并不能单独构成指令,但它们可以被嵌入数值操作、设置怪物属性和很多事件控制类指令。而冒号缩写量的用法就更多了,比如用于`${表达式计算}`和其他任何支持填表达式的地方。
值块大体上分为三种:勾选框与运算块、只读块、可读写块,其中后两类对应着冒号缩写量。
### 勾选框与运算块附js比较运算大图鉴
包括勾选框块true和false两个逻辑常量、否定运算块和二元运算块。
@ -154,7 +166,7 @@ callback)函数相对应,只是多了一项“穿透性”。
`'2' < 10; 10 <= '10'; '10' < 2; null >= 0; null <= 0; 1/0 > 1/-0`
![image](img/v2.7/compare.png)
![image](img/compare.jpg)
弱(不)等于(==和!=)非常难用,建议放弃,统一使用(不)等于(===和!==)。
@ -177,78 +189,40 @@ undefined倒是不用担心它除了和null弱相等外和其他值都没
所以样板中充斥着形如x=x||y和z=x||y的代码y算是x的默认值。
若干个由“异或”连起来的true或false总结果取决于其中true的个数的奇偶奇数个true则总结果为1偶数个true则总结果为0.
### 只读块怪物属性、图块ID、图块类别、装备孔 {#只读块}
### 只读块怪物属性、图块ID、图块类别、装备孔
尽管这几个值块是只读的,但您仍然可以使用“设置怪物属性”、“穿脱装备”和“转变图块”等指令去改变它们。
1. 怪物属性冒号缩写量写作“怪物绿头怪生命”json代码中写作“enemy:greenSlime:hp”。怪物中文名有重复的话请在事件编辑器顶部关闭中文替换功能道具中文名同理。
常见的怪物属性都提供在了下拉框中,如果下拉框里没有(如通过配置表格新增的属性),可以修改`_server\MotaAction.g4`文件最后的那些表来追加其中文简称,也可以放弃解析回中文块而是就用缩写量。
2. 图块ID冒号缩写量写作“图块IDx,y”json代码中写作“blockId:x,y”
1. **怪物属性:**冒号缩写量写作`怪物:绿头怪:生命`json代码中写作`enemy:greenSlime:hp`。怪物中文名有重复的话请在事件编辑器顶部关闭中文替换功能,道具中文名同理。
* 常见的怪物属性都提供在了下拉框中,如果下拉框里没有(如通过配置表格新增的属性),可以修改`_server\MotaAction.g4`文件最后的那些表来追加其中文简称,也可以放弃解析回中文块而是就用缩写量。
2. **图块ID**冒号缩写量写作`图块IDx,y`json代码中写作`blockId:x,y`。请注意逗号始终要用英文的此值块实际直接调用的API为`core.getBlockId(x,y)`即本值块和对应的冒号缩写量只支持本层可以获知本层某个点的图块ID.
3. **图块类别:**冒号缩写量写作`图块类别x,y`json代码中写作`blockCls:x,y`。同上,实际调用`core.getBlockCls(x,y)`,可以获知本层某个点的图块类别。
4. **装备孔:**冒号缩写量写作`装备孔n`json代码中写作`equip:n`。实际调用`core.getEquip(n)`可以获知勇士第n个装备孔中的装备ID.
请注意逗号始终要用英文的此值块实际直接调用的API为core.getBlockId(x,y)即本值块和对应的冒号缩写量只支持本层可以获知本层某个点的图块ID.
3. 图块类别冒号缩写量写作“图块类别x,y”json代码中写作“blockCls:x,y”
同上实际调用core.getBlockCls(x,y),可以获知本层某个点的图块类别。
4. 装备孔冒号缩写量写作“装备孔n”json代码中写作“equip:n”.
实际调用core.getEquip(n)可以获知勇士第n+1个装备孔中的装备ID.
### 可读写块status、item、flag、switch、temp、global
比起只读块,可读写块允许作为“数值操作”指令的左块:
1. 状态冒号缩写量为“状态生命”等json代码中写作“status:hp”等。\
作为左块时会调用core.setStatus()其他时候会调用core.getStatus()[^34]\
当前楼层的ID不属于勇士状态请使用core.status.floorId获取只读。\
core.setStatus()和core.getStatus()的第一个自变量为“x”、“y”或“direction”时会被特殊处理为core.setHeroLoc()和core.getHeroLoc()来读写core.status.hero.loc此外还有一些勇士状态也不支持中文替换。
2. 物品冒号缩写量为“物品炸弹”等json代码中写作“item:bomb”等。\
作为左块时会调用core.getItem()或core.setItem()其他时候会调用core.itemCount()来统计背包中的道具数量。\
此外最常用的9个勇士状态和三色钥匙提供在了下拉框中。您可以修改`_server\MotaAction.g4`文件最后的`FixedId_List`来追加向“楼层转换”、“门信息”和“装备属性”的下拉框追加新的楼梯ID、钥匙ID和勇士状态名也是一样的道理当然不追加也不影响手写。
3. 变量冒号缩写量为“变量hatred”等json代码中写作“flag:hatred”等。
道具中文名有重复的话请在事件编辑器顶部关闭中文替换功能,怪物中文名同理。
作为左块时会调用core.setFlag()其他时候会调用core.getFlag(xxx, 0)
这类最多,而且冒号的右侧本身就支持中文。
这两个API实际操作的就是前文多次提到的core.status.hero.flags只不过在事件中未定义的变量都视为0更为安全。
如果您忘记了自己在哪些事件用过哪些变量,请善用事件编辑器顶部的“搜索变量出现位置”。
4. 独立开关如果您有一大批NPC都具有“首次对话不同于之后各次对话”之类的特点那么为他们设置一大批不重名的变量就很繁琐。独立开关叫独立变量更准确就是为这种场合而生的它对每层楼首次到达和每次到达中和每个坐标都是独立的。
冒号缩写量写作“独立开关A—Z”json代码中写作“switch:A—Z”
每个坐标处的独立开关有26个用大写拉丁字母A—Z表示。MTn层xy点的独立开关A本质上是一个flag变量——`core.status.hero.flags.MTn@x@y@A`,如果需要在其他点访问,就需要用这样的写法。
这里以51层魔塔的商人们为例涉及到的指令在后面会一一讲解
如果 独立开关A
标题商人图像this对话框效果this正文xxx
隐藏事件同时删除500毫秒
否则
显示确认框我有n个yyy道具你出zzz金币就卖给你。
确定的场合:
如果 zzz > 状态:金币
标题商人图像this对话框效果this正文你的金钱不足
否则
数值操作 状态:金币 减少 zzz
数值操作 物品yyy 增加 n
数值操作 独立开关A 设为 √
取消的场合;
5. 临时变量冒号缩写量写作“临时变量A—Z”json代码中写作`temp:A-Z`
临时变量泛指所有“以@temp”开头的flag变量一共也有26个。
临时变量一般用于计数循环和数组迭代每当事件流结束勇士恢复行动临时变量和参数变量以arg+纯数字命名)都会被清空。
6. 全局存储冒号缩写量写作“全局存储xxx”json代码中写作`global:xxx`
和变量一样,冒号右侧本身支持中文。全局存储一般用来保存一些跨存档的信息,如成就系统、回想和音像鉴赏的收集进度、多周目数据等。
用于左块时会调用core.setGlobal()其他时候会调用core.getGlobal()
前者在正常游戏中会一并将设置值计入录像,录像回放时则忽略。
后者会从浏览器localForage中读取数据回放时则直接从录像中读取。
1. **状态:**冒号缩写量为`状态:生命`等json代码中写作`status:hp`等。
* 作为左块时会调用`core.setStatus()`,其他时候会调用`core.getStatus()`
2. **物品:**冒号缩写量为`物品:炸弹`等json代码中写作`item:bomb`等
* 作为左块时会调用`core.getItem()`或`core.setItem()`,其他时候会调用`core.itemCount()`来统计背包中的道具数量。
* 此外最常用的9个勇士状态和三色钥匙提供在了下拉框中。您可以修改`_server/MotaAction.g4`文件最后的`FixedId_List`来追加向“楼层转换”、“门信息”和“装备属性”的下拉框追加新的楼梯ID、钥匙ID和勇士状态名也是一样的道理当然不追加也不影响手写。
3. **变量:**冒号缩写量为`变量hatred`等json代码中写作`flag:hatred`等。
* 作为左块时会调用`core.setFlag()`,其他时候会调用`core.getFlag(xxx, 0)`
* 请注意:变量类型支持中文,如`变量:开门个数`
* 这两个API实际操作的就是前文多次提到的`core.status.hero.flags`只不过在事件中未定义的变量都视为0更为安全。
* 如果您忘记了自己在哪些事件用过哪些变量,请善用事件编辑器顶部的“搜索变量出现位置”。
4. **独立开关:**如果您有一大批NPC都具有“首次对话不同于之后各次对话”之类的特点那么为他们设置一大批不重名的变量就很繁琐。独立开关叫独立变量更准确就是为这种场合而生的它对每层楼首次到达和每次到达中和每个坐标都是独立的。
* 冒号缩写量写作`独立开关A—Z`json代码中写作`switch:A—Z`
* 每个坐标处的独立开关有26个用大写拉丁字母A—Z表示。MTn层xy点的独立开关A本质上是一个flag变量——`flag:MTn@x@y@A`,如果需要在其他点访问,就需要用这样的写法
5. **临时变量:**冒号缩写量写作“临时变量A—Z”json代码中写作`temp:A-Z`
* 临时变量泛指所有以`@temp@`开头的flag变量一共也有26个。
* 临时变量一般用于计数循环和数组迭代每当事件流结束勇士恢复行动临时变量和参数变量以arg+纯数字命名)都会被清空。
6. **全局存储:**冒号缩写量写作`全局存储xxx`json代码中写作`global:xxx`
* 和变量一样,冒号右侧本身支持中文。全局存储一般用来保存一些跨存档的信息,如成就系统、回想和音像鉴赏的收集进度、多周目数据等。
* 用于左块时会调用`core.setGlobal()`,其他时候会调用`core.getGlobal()`
==========================================================================================
[继续阅读下一章:个性化](personalization)
[继续阅读下一章:事件指令](instruction)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 KiB

BIN
_docs/img/blockly.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

BIN
_docs/img/changefloor.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

BIN
_docs/img/compare.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 23 KiB

BIN
_docs/img/console2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

BIN
_docs/img/editor.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

BIN
_docs/img/eventsx.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
_docs/img/firstdatab.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

BIN
_docs/img/floorsv.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Some files were not shown because too many files have changed in this diff Show More