14
README.md
@ -55,6 +55,20 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏!
|
|||||||
|
|
||||||
## 更新说明
|
## 更新说明
|
||||||
|
|
||||||
|
### 2019.6.7 V2.6.2
|
||||||
|
|
||||||
|
* [x] 可以拖动地图上的图块和事件,复制剪切和跨楼层粘贴
|
||||||
|
* [x] 新增事件的地图选点功能,可以在地图上选择落点
|
||||||
|
* [x] 现在素材区可以进行折叠与自动换列了
|
||||||
|
* [x] 新增UI绘制系列事件,并且可以进行预览
|
||||||
|
* [x] 显示文本事件的标题解析
|
||||||
|
* [x] 新增常用工具:额外素材合并工具
|
||||||
|
* [x] 进一步提升24倍速的播放速度
|
||||||
|
* [x] 楼层转换增加对称点
|
||||||
|
* [x] 增加编辑器快捷键说明,H键查看
|
||||||
|
* [x] 文档-事件增加事件编辑器截图
|
||||||
|
* [x] 大量细节优化,所有已知的Bug修复
|
||||||
|
|
||||||
### 2019.5.2 V2.6.1
|
### 2019.5.2 V2.6.1
|
||||||
|
|
||||||
* [x] 区域优化的录像播放功能,R键使用
|
* [x] 区域优化的录像播放功能,R键使用
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# V2.0版本介绍
|
# V2.0版本介绍
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。
|
目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 附录:API列表
|
# 附录:API列表
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
这里将列出所有被转发到core的API,没有被转发的函数此处不会列出,请自行在代码中查看。
|
这里将列出所有被转发到core的API,没有被转发的函数此处不会列出,请自行在代码中查看。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 元件说明
|
# 元件说明
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。
|
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。
|
||||||
|
|
||||||
|
|||||||
138
_docs/event.md
@ -1,6 +1,6 @@
|
|||||||
# 事件
|
# 事件
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
本章内将对样板所支持的事件进行介绍。
|
本章内将对样板所支持的事件进行介绍。
|
||||||
|
|
||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
它能通过拖动、复制粘贴等方式帮助你快速生成事件列表,而不用手动打大量字符。
|
它能通过拖动、复制粘贴等方式帮助你快速生成事件列表,而不用手动打大量字符。
|
||||||
|
|
||||||
下述所说的都是在事件编辑器右边所展示的,该事件的代码化写法。
|
下述所说的都是在事件编辑器右边所展示的,该事件的代码化写法;部分增加了可视化事件编辑器的截图示意(感谢秋橙的制作)。
|
||||||
|
|
||||||
强烈建议要对每个事件的写法进行了解,因为在脚本编辑,`insertAction`等地方需要插入自定义事件时,还是很有必要的。
|
强烈建议要对每个事件的写法进行了解,因为在脚本编辑,`insertAction`等地方需要插入自定义事件时,还是很有必要的。
|
||||||
|
|
||||||
@ -154,6 +154,8 @@
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
该项可以简写成直接的字符串的形式,即下面这种方式也是可以的:
|
该项可以简写成直接的字符串的形式,即下面这种方式也是可以的:
|
||||||
|
|
||||||
``` js
|
``` js
|
||||||
@ -188,7 +190,9 @@
|
|||||||
|
|
||||||
从V2.5.2以后,新增了绘制大头像的功能。绘制大头像图的基本写法是`\t[1.png]`或者`\t[标题,1.png]`。
|
从V2.5.2以后,新增了绘制大头像的功能。绘制大头像图的基本写法是`\t[1.png]`或者`\t[标题,1.png]`。
|
||||||
|
|
||||||
从V2.6开始,所有图块都允许只写ID,对于非怪物则没有标题。
|
从V2.6开始,所有图块都允许只写ID,对于非怪物则仅当图块属性中设置了name才有标题(否则不显示标题)。
|
||||||
|
|
||||||
|
另外注意的是,名字可以用null从而只显示动画而不显示标题。
|
||||||
|
|
||||||
``` js
|
``` js
|
||||||
[
|
[
|
||||||
@ -202,10 +206,13 @@
|
|||||||
"\t[1.png]绘制1.png这个头像图",
|
"\t[1.png]绘制1.png这个头像图",
|
||||||
"\t[标题,1.png]同时绘制标题和1.png这个头像图",
|
"\t[标题,1.png]同时绘制标题和1.png这个头像图",
|
||||||
"\t[sword1]获得铁剑,没有标题",
|
"\t[sword1]获得铁剑,没有标题",
|
||||||
"\t[man]没有标题的npc动画"
|
"\t[man]没有标题的npc动画",
|
||||||
|
"\t[null,greenSlime]只绘制怪物动画而不显示标题"
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
!> 大头像的头像图需要在全塔属性中注册,且必须是png格式,不可以用jpg或者其他格式,请自行转换。
|
!> 大头像的头像图需要在全塔属性中注册,且必须是png格式,不可以用jpg或者其他格式,请自行转换。
|
||||||
|
|
||||||
除此以外,我们还能实现“对话框效果”,只要有`\b[...]`就可以。
|
除此以外,我们还能实现“对话框效果”,只要有`\b[...]`就可以。
|
||||||
@ -231,9 +238,7 @@
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
从V2.6开始,`\b`提供了更多功能,包括:
|

|
||||||
|
|
||||||
- `\b[hero]`
|
|
||||||
|
|
||||||
!> `\t[...]`必须在`\b[...]`前面!不然两者都无法正常显示。
|
!> `\t[...]`必须在`\b[...]`前面!不然两者都无法正常显示。
|
||||||
|
|
||||||
@ -247,6 +252,8 @@
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
从V2.5.3以后,也可以使用`\f[...]`来同时绘制一张图片。
|
从V2.5.3以后,也可以使用`\f[...]`来同时绘制一张图片。
|
||||||
|
|
||||||
其基本写法是`\f[img,x,y]`,或者`\f[img,x,y,w,h]`,或者`\f[img,sx,sy,sw,sh,x,y,w,h]`。
|
其基本写法是`\f[img,x,y]`,或者`\f[img,x,y,w,h]`,或者`\f[img,sx,sy,sw,sh,x,y,w,h]`。
|
||||||
@ -262,6 +269,8 @@
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
从V2.5.5以后,也可以使用`\\i[...]`来在对话框中绘制一个图标。
|
从V2.5.5以后,也可以使用`\\i[...]`来在对话框中绘制一个图标。
|
||||||
|
|
||||||
这里可以使用一个合法ID(32x48图块除外),或使用一个系统图标(`core.statusBar.icons`中的内容)。
|
这里可以使用一个合法ID(32x48图块除外),或使用一个系统图标(`core.statusBar.icons`中的内容)。
|
||||||
@ -273,6 +282,8 @@
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
**可以在控制台中输入`core.statusBar.icons`以查看所有的系统图标定义。**
|
**可以在控制台中输入`core.statusBar.icons`以查看所有的系统图标定义。**
|
||||||
|
|
||||||
!> 注意,在事件块中,允许只写一个反斜杠`\i`,系统会自动转义成`\\i`;但是在脚本中必须两个反斜杠都写上!
|
!> 注意,在事件块中,允许只写一个反斜杠`\i`,系统会自动转义成`\\i`;但是在脚本中必须两个反斜杠都写上!
|
||||||
@ -299,6 +310,8 @@
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
- `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。
|
||||||
@ -314,6 +327,8 @@
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
text为文本正文内容,和上面的写法完全一致。
|
text为文本正文内容,和上面的写法完全一致。
|
||||||
|
|
||||||
time为可选项,代表该自动文本的时间。可以不指定,不指定默认为3000毫秒。
|
time为可选项,代表该自动文本的时间。可以不指定,不指定默认为3000毫秒。
|
||||||
@ -334,6 +349,8 @@ time为可选项,代表该自动文本的时间。可以不指定,不指定
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
text为正文文本内容。可以使用`${ }`来计算表达式的值,且使用`\n`手动换行。系统不会对滚动剧情文本进行自动换行。
|
text为正文文本内容。可以使用`${ }`来计算表达式的值,且使用`\n`手动换行。系统不会对滚动剧情文本进行自动换行。
|
||||||
|
|
||||||
time为可选项,代表总的滚动时间。默认为5000毫秒。
|
time为可选项,代表总的滚动时间。默认为5000毫秒。
|
||||||
@ -359,6 +376,8 @@ async可选,如果为true则会异步执行(即不等待当前事件执行
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
title为可选项,如果设置则为一个RGB三元组或RGBA四元组,表示标题(名字)颜色。 默认值:`[255,215,0,1]`
|
title为可选项,如果设置则为一个RGB三元组或RGBA四元组,表示标题(名字)颜色。 默认值:`[255,215,0,1]`
|
||||||
|
|
||||||
text为可选项,如果设置则为一个RGB三元组或RGBA四元组,表示正文颜色。 默认值:`[255,255,255,1]`
|
text为可选项,如果设置则为一个RGB三元组或RGBA四元组,表示正文颜色。 默认值:`[255,255,255,1]`
|
||||||
@ -389,6 +408,8 @@ time为可选项,表示文字添加的速度。若此项设置为0将直接全
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
text必填,为显示的内容,支持`${}`的表达式计算。
|
text必填,为显示的内容,支持`${}`的表达式计算。
|
||||||
|
|
||||||
icon是可选的,如果设置则会绘制图标,其可以是一个有效的ID,或者`core.statusBar.icons`中的系统图标。
|
icon是可选的,如果设置则会绘制图标,其可以是一个有效的ID,或者`core.statusBar.icons`中的系统图标。
|
||||||
@ -403,6 +424,8 @@ icon是可选的,如果设置则会绘制图标,其可以是一个有效的I
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
这个事件将在运行时被游戏跳过。
|
这个事件将在运行时被游戏跳过。
|
||||||
|
|
||||||
### setValue:设置勇士的某个属性、道具个数,或某个变量/Flag的值
|
### setValue:设置勇士的某个属性、道具个数,或某个变量/Flag的值
|
||||||
@ -436,6 +459,8 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
另外注意一点的是,如果hp被设置成了0或以下,将触发lose事件,直接死亡。
|
另外注意一点的是,如果hp被设置成了0或以下,将触发lose事件,直接死亡。
|
||||||
|
|
||||||
### addValue:增减勇士的某个属性、道具个数,或某个变量/Flag的值
|
### addValue:增减勇士的某个属性、道具个数,或某个变量/Flag的值
|
||||||
@ -455,6 +480,8 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### setFloor:设置楼层属性
|
### setFloor:设置楼层属性
|
||||||
|
|
||||||
使用`{"type":"setFloor"}`可以设置某层楼的楼层属性。
|
使用`{"type":"setFloor"}`可以设置某层楼的楼层属性。
|
||||||
@ -471,6 +498,8 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name为必填项,代表要修改的楼层属性,和楼层属性中的一一对应。
|
name为必填项,代表要修改的楼层属性,和楼层属性中的一一对应。
|
||||||
|
|
||||||
floorId为可选项,代表要修改的楼层ID;可以省略代表当前楼层。
|
floorId为可选项,代表要修改的楼层ID;可以省略代表当前楼层。
|
||||||
@ -489,6 +518,8 @@ value为必填项,代表要修改到的数值。其应该和楼层属性中的
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name必填项,代表要修改的全局属性。
|
name必填项,代表要修改的全局属性。
|
||||||
|
|
||||||
value为必填项,代表要修改到的结果。此项无需再手动加单引号。
|
value为必填项,代表要修改到的结果。此项无需再手动加单引号。
|
||||||
@ -503,6 +534,8 @@ value为必填项,代表要修改到的结果。此项无需再手动加单引
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name必填项,代表要修改的全局数值,其和全塔属性中的values一一对应。
|
name必填项,代表要修改的全局数值,其和全塔属性中的values一一对应。
|
||||||
|
|
||||||
value为必填项,代表要修改到的结果。该项必须是个数值。
|
value为必填项,代表要修改到的结果。该项必须是个数值。
|
||||||
@ -517,6 +550,8 @@ value为必填项,代表要修改到的结果。该项必须是个数值。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name必填项,代表要修改的系统开关,其是全塔属性中的flags中的一部分。
|
name必填项,代表要修改的系统开关,其是全塔属性中的flags中的一部分。
|
||||||
|
|
||||||
value为必填项,只能为true或false,代表要修改到的结果。
|
value为必填项,只能为true或false,代表要修改到的结果。
|
||||||
@ -537,6 +572,8 @@ value为必填项,只能为true或false,代表要修改到的结果。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
show事件需要用loc指定目标点的坐标,可以简单的写[x,y]代表一个点,也可以写个二维数组[[x1,y1],[x2,y2],...]来同时显示多个点。
|
show事件需要用loc指定目标点的坐标,可以简单的写[x,y]代表一个点,也可以写个二维数组[[x1,y1],[x2,y2],...]来同时显示多个点。
|
||||||
|
|
||||||
从V2.2开始,loc也可以用变量来代替,例如 `"loc": ["flag:x", "flag:y"]`。下同。
|
从V2.2开始,loc也可以用变量来代替,例如 `"loc": ["flag:x", "flag:y"]`。下同。
|
||||||
@ -575,6 +612,8 @@ NPC对话事件结束后如果需要NPC消失也需要调用 `{"type": "hide"}`
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### trigger:立即触发另一个地点的事件
|
### trigger:立即触发另一个地点的事件
|
||||||
|
|
||||||
`{"type":"trigger"}` 会立刻触发当层另一个地点的自定义事件。
|
`{"type":"trigger"}` 会立刻触发当层另一个地点的自定义事件。
|
||||||
@ -588,6 +627,8 @@ NPC对话事件结束后如果需要NPC消失也需要调用 `{"type": "hide"}`
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
其后面带有loc选项,代表另一个地点的坐标。
|
其后面带有loc选项,代表另一个地点的坐标。
|
||||||
|
|
||||||
keep可选,如果此项为true则不会结束当前的事件列表,否则会中断当前的事件流。
|
keep可选,如果此项为true则不会结束当前的事件列表,否则会中断当前的事件流。
|
||||||
@ -613,6 +654,8 @@ keep可选,如果此项为true则不会结束当前的事件列表,否则会
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
`insert`的写法有两种,可以写`name`,或者`loc`。
|
`insert`的写法有两种,可以写`name`,或者`loc`。
|
||||||
|
|
||||||
- 如果写了`"name": "xxx"`,则会去公共事件列表中找寻对应的事件,并执行。
|
- 如果写了`"name": "xxx"`,则会去公共事件列表中找寻对应的事件,并执行。
|
||||||
@ -650,6 +693,8 @@ revisit和trigger完全相同,只不过是立刻触发的还是本地点的事
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
revisit其实是trigger的简写,只不过是loc固定为当前点。
|
revisit其实是trigger的简写,只不过是loc固定为当前点。
|
||||||
|
|
||||||
revisit常常使用在一些商人之类的地方,当用户购买物品后不是离开,而是立刻重新访问重新进入购买页面。
|
revisit常常使用在一些商人之类的地方,当用户购买物品后不是离开,而是立刻重新访问重新进入购买页面。
|
||||||
@ -669,6 +714,8 @@ revisit常常使用在一些商人之类的地方,当用户购买物品后不
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### setBlock:设置某个图块
|
### setBlock:设置某个图块
|
||||||
|
|
||||||
我们可以采用 `{"type": "setBlock"}` 来改变某个地图块。
|
我们可以采用 `{"type": "setBlock"}` 来改变某个地图块。
|
||||||
@ -682,6 +729,8 @@ revisit常常使用在一些商人之类的地方,当用户购买物品后不
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
floorId为可选的,表示要更改的目标楼层。如果忽略此项,则默认为当前楼层。
|
floorId为可选的,表示要更改的目标楼层。如果忽略此项,则默认为当前楼层。
|
||||||
|
|
||||||
loc为可选的,表示要更改地图块的坐标。如果忽略此项,则默认为当前事件点。
|
loc为可选的,表示要更改地图块的坐标。如果忽略此项,则默认为当前事件点。
|
||||||
@ -712,6 +761,8 @@ number为**要更改到的数字**,有关“数字”的定义详见参见[素
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
loc为要隐藏的贴图的左上角坐标,可以简单的写[x,y]代表一个点,也可以写个二维数组[[x1,y1],[x2,y2],...]来同时显示多个点。
|
loc为要隐藏的贴图的左上角坐标,可以简单的写[x,y]代表一个点,也可以写个二维数组[[x1,y1],[x2,y2],...]来同时显示多个点。
|
||||||
|
|
||||||
如果同时存在若干个贴图都是是该坐标为左上角,则这些贴图全部会被隐藏。
|
如果同时存在若干个贴图都是是该坐标为左上角,则这些贴图全部会被隐藏。
|
||||||
@ -744,6 +795,8 @@ floorId为目标点的楼层,如果是当前楼层可以忽略不写。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name为必选的,且只能是`bg`和`fg`之一,分别代表背景图层和前景图层。
|
name为必选的,且只能是`bg`和`fg`之一,分别代表背景图层和前景图层。
|
||||||
|
|
||||||
loc为要隐藏的贴图的左上角坐标,可以简单的写[x,y]代表一个点,也可以写个二维数组[[x1,y1],[x2,y2],...]来同时显示多个点。
|
loc为要隐藏的贴图的左上角坐标,可以简单的写[x,y]代表一个点,也可以写个二维数组[[x1,y1],[x2,y2],...]来同时显示多个点。
|
||||||
@ -774,6 +827,8 @@ floorId为目标点的楼层,如果是当前楼层可以忽略不写。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name为必选的,且只能是`bg`和`fg`之一,分别代表背景层和前景层。
|
name为必选的,且只能是`bg`和`fg`之一,分别代表背景层和前景层。
|
||||||
|
|
||||||
floorId为可选的,表示要更改的目标楼层。如果忽略此项,则默认为当前楼层。
|
floorId为可选的,表示要更改的目标楼层。如果忽略此项,则默认为当前楼层。
|
||||||
@ -794,6 +849,8 @@ loc为可选的,表示要更改地图块的坐标。如果忽略此项,则
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name是可选的,代表目标行走图的文件名。
|
name是可选的,代表目标行走图的文件名。
|
||||||
|
|
||||||
!> **目标行走图必须在全塔属性的this.images中被定义过,且宽度必须是128像素(高度不限)。**
|
!> **目标行走图必须在全塔属性的this.images中被定义过,且宽度必须是128像素(高度不限)。**
|
||||||
@ -836,6 +893,8 @@ name是可选的,代表目标行走图的文件名。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
默认的等待事件可以被Ctrl跳过,下面两种情况下不可呗跳过:
|
默认的等待事件可以被Ctrl跳过,下面两种情况下不可呗跳过:
|
||||||
- 加上`"noSkip": true`后
|
- 加上`"noSkip": true`后
|
||||||
- 当前存在尚未执行完毕的异步事件。
|
- 当前存在尚未执行完毕的异步事件。
|
||||||
@ -851,6 +910,8 @@ name是可选的,代表目标行走图的文件名。
|
|||||||
],
|
],
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
从V2.6开始,有两种写法:
|
从V2.6开始,有两种写法:
|
||||||
- 写id,则视为和空降怪物进行强制战斗,不会执行一些战后事件,也不会隐藏任何点。
|
- 写id,则视为和空降怪物进行强制战斗,不会执行一些战后事件,也不会隐藏任何点。
|
||||||
- 写loc(可选,不填默认当前点),则视为和某点怪物进行强制战斗,会隐藏该点并且插入该点战后事件执行。
|
- 写loc(可选,不填默认当前点),则视为和某点怪物进行强制战斗,会隐藏该点并且插入该点战后事件执行。
|
||||||
@ -871,6 +932,8 @@ name是可选的,代表目标行走图的文件名。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
loc指定门的坐标,floorId指定门所在的楼层ID。如果是当前层则可以忽略floorId选项。
|
loc指定门的坐标,floorId指定门所在的楼层ID。如果是当前层则可以忽略floorId选项。
|
||||||
|
|
||||||
如果loc所在的点是一个墙壁,则作为暗墙来开启。
|
如果loc所在的点是一个墙壁,则作为暗墙来开启。
|
||||||
@ -896,6 +959,8 @@ async可选,如果为true则会异步执行(即不等待当前事件执行
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
id为你要关门的ID,需要是一个合法的门,系统默认只支持如下几种:
|
id为你要关门的ID,需要是一个合法的门,系统默认只支持如下几种:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -924,6 +989,8 @@ changeFloor的事件写法大致如下。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
可以看到,与上面的楼梯、传送门的写法十分类似。
|
可以看到,与上面的楼梯、传送门的写法十分类似。
|
||||||
|
|
||||||
但是相比那个而言,不支持stair楼梯位置(只能写坐标),没有穿透选项。
|
但是相比那个而言,不支持stair楼梯位置(只能写坐标),没有穿透选项。
|
||||||
@ -948,6 +1015,8 @@ time为可选的,指定的话将作为楼层切换动画的时间。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### useItem:使用道具
|
### useItem:使用道具
|
||||||
|
|
||||||
调用`{"type": "useItem"}`可以使用一个道具。
|
调用`{"type": "useItem"}`可以使用一个道具。
|
||||||
@ -960,6 +1029,8 @@ time为可选的,指定的话将作为楼层切换动画的时间。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
使用道具事件会消耗对应的道具。
|
使用道具事件会消耗对应的道具。
|
||||||
|
|
||||||
如果当前不可使用该道具(如没有,或者达不到使用条件),则会进行提示并跳过本事件。
|
如果当前不可使用该道具(如没有,或者达不到使用条件),则会进行提示并跳过本事件。
|
||||||
@ -996,7 +1067,7 @@ name所指定的图片必须存在,在全塔属性中的images中被定义过
|
|||||||
``` js
|
``` js
|
||||||
[
|
[
|
||||||
{"type": "unfollow", "name": "npc.png"}, // 将 npc.png 这个行走图取消跟随
|
{"type": "unfollow", "name": "npc.png"}, // 将 npc.png 这个行走图取消跟随
|
||||||
{"type": "follow"}, // 取消所有跟随
|
{"type": "unfollow"}, // 取消所有跟随
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -1029,6 +1100,8 @@ async可选,如果为true则会异步执行(即不等待当前事件执行
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
name为动画名,**请确保动画在全塔属性中的animates中被定义过。**
|
name为动画名,**请确保动画在全塔属性中的animates中被定义过。**
|
||||||
|
|
||||||
loc为动画的位置,可以是`[x,y]`表示在(x,y)点显示,也可以是字符串`"hero"`表示在勇士点显示。
|
loc为动画的位置,可以是`[x,y]`表示在(x,y)点显示,也可以是字符串`"hero"`表示在勇士点显示。
|
||||||
@ -1052,6 +1125,8 @@ loc可忽略,如果忽略则显示为事件当前点。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
code为图片编号,如果两张图片重叠,编号较大会覆盖编号较小的。该值需要在1~50之间。
|
code为图片编号,如果两张图片重叠,编号较大会覆盖编号较小的。该值需要在1~50之间。
|
||||||
|
|
||||||
image为图片名。**请确保图片在全塔属性中的images中被定义过。**
|
image为图片名。**请确保图片在全塔属性中的images中被定义过。**
|
||||||
@ -1138,6 +1213,8 @@ loc为动图左上角坐标,以像素为单位进行计算。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
code为图片编号。该值需要在1~50之间。
|
code为图片编号。该值需要在1~50之间。
|
||||||
|
|
||||||
to为终点图片左上角坐标,以像素为单位进行计算,不填写则视为当前图片位置。
|
to为终点图片左上角坐标,以像素为单位进行计算,不填写则视为当前图片位置。
|
||||||
@ -1160,6 +1237,8 @@ async可选,如果为true则会异步执行(即不等待当前事件执行
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
color为需要更改画面色调的颜色。它是一个数组,分别指定目标颜色的R,G,B,A值。
|
color为需要更改画面色调的颜色。它是一个数组,分别指定目标颜色的R,G,B,A值。
|
||||||
- 常见RGB颜色: 纯黑[0,0,0],纯白[255,255,255],纯红[255,0,0],等等。
|
- 常见RGB颜色: 纯黑[0,0,0],纯白[255,255,255],纯红[255,0,0],等等。
|
||||||
- 第四元为Alpha值,即不透明度,为一个0到1之间的数。可以不指定,则默认为Alpha=1
|
- 第四元为Alpha值,即不透明度,为一个0到1之间的数。可以不指定,则默认为Alpha=1
|
||||||
@ -1227,6 +1306,8 @@ level为天气的强度等级,在1-10之间。1级为最弱,10级为最强
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
time选项必须指定,为每移动一步所需要用到的时间。
|
time选项必须指定,为每移动一步所需要用到的时间。
|
||||||
|
|
||||||
loc为需要移动的事件位置。可以省略,如果省略则移动本事件。
|
loc为需要移动的事件位置。可以省略,如果省略则移动本事件。
|
||||||
@ -1257,6 +1338,8 @@ keep为一个可选项,代表该事件移动完毕后是否消失。如果该
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
即,在移动的到达点指定一个事件,然后move事件中指定"keep":true,然后就可以触发目标点的事件了。
|
即,在移动的到达点指定一个事件,然后move事件中指定"keep":true,然后就可以触发目标点的事件了。
|
||||||
|
|
||||||
async可选,如果为true则会异步执行(即不等待当前事件执行完毕,立刻执行下一个事件)。
|
async可选,如果为true则会异步执行(即不等待当前事件执行完毕,立刻执行下一个事件)。
|
||||||
@ -1381,6 +1464,8 @@ async可选,如果为true则会异步执行(即不等待当前事件执行
|
|||||||
|
|
||||||
使用方法: `{"type": "setVolume", "value": 90, "time": 500, "async": true}`
|
使用方法: `{"type": "setVolume", "value": 90, "time": 500, "async": true}`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
value为音量大小,在0到100之间,默认为100。设置后,BGM将使用该音量进行播放。SE的音量大小不会发生改变。
|
value为音量大小,在0到100之间,默认为100。设置后,BGM将使用该音量进行播放。SE的音量大小不会发生改变。
|
||||||
|
|
||||||
可以设置time为音量渐变时间。
|
可以设置time为音量渐变时间。
|
||||||
@ -1440,6 +1525,8 @@ async可选,如果为true则会异步执行(即不等待当前事件执行
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
text为提示文字,可以在这里给输入提示文字。这里同样可以使用${ }来计算表达式的值。
|
text为提示文字,可以在这里给输入提示文字。这里同样可以使用${ }来计算表达式的值。
|
||||||
|
|
||||||
当执行input事件时,将显示一个弹窗,并提示用户输入一个内容。
|
当执行input事件时,将显示一个弹窗,并提示用户输入一个内容。
|
||||||
@ -1459,6 +1546,8 @@ text为提示文字,可以在这里给输入提示文字。这里同样可以
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
text为提示文字,可以在这里给输入提示文字。这里同样可以使用${ }来计算表达式的值。
|
text为提示文字,可以在这里给输入提示文字。这里同样可以使用${ }来计算表达式的值。
|
||||||
|
|
||||||
当执行input2事件时,将显示一个弹窗,并提示用户输入一个内容。
|
当执行input2事件时,将显示一个弹窗,并提示用户输入一个内容。
|
||||||
@ -1510,6 +1599,8 @@ text为提示文字,可以在这里给输入提示文字。这里同样可以
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
需要额外注意的几点:
|
需要额外注意的几点:
|
||||||
|
|
||||||
- 给定的表达式(condition)一般需要返回true或false。
|
- 给定的表达式(condition)一般需要返回true或false。
|
||||||
@ -1575,6 +1666,8 @@ nobreak是可选的,如果设置,则在当前条件满足并插入事件后
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
需要额外注意的几点:
|
需要额外注意的几点:
|
||||||
|
|
||||||
- 各个条件分支的判断是顺序执行的,因此若多个分支的条件都满足,将只执行最靠前的分支。
|
- 各个条件分支的判断是顺序执行的,因此若多个分支的条件都满足,将只执行最靠前的分支。
|
||||||
@ -1603,6 +1696,7 @@ nobreak是可选的,如果设置,则在当前条件满足并插入事件后
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### choices:给用户提供选项
|
### choices:给用户提供选项
|
||||||
|
|
||||||
@ -1708,12 +1802,16 @@ yes和no均为必填项,即用户点击确认或取消后执行的事件。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### dowhile:后置条件循环
|
### dowhile:后置条件循环
|
||||||
|
|
||||||
`type:dowhile`可以制作一个后置条件循环。
|
`type:dowhile`可以制作一个后置条件循环。
|
||||||
|
|
||||||
其写法与参数和`type:while`完全一致,不过与其不同的是,会先执行一次事件列表,再对条件进行判定,就和C/C++中的 `do {...} while (...);` 语法一样。
|
其写法与参数和`type:while`完全一致,不过与其不同的是,会先执行一次事件列表,再对条件进行判定,就和C/C++中的 `do {...} while (...);` 语法一样。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### break:跳出循环
|
### break:跳出循环
|
||||||
|
|
||||||
使用 `{"type": "break"}` 可以跳出当前循环。
|
使用 `{"type": "break"}` 可以跳出当前循环。
|
||||||
@ -1743,6 +1841,8 @@ yes和no均为必填项,即用户点击确认或取消后执行的事件。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
!> 如果continue事件不在任何循环中被执行,则和exit等价,即会立刻结束当前事件!
|
!> 如果continue事件不在任何循环中被执行,则和exit等价,即会立刻结束当前事件!
|
||||||
|
|
||||||
### wait:等待用户操作
|
### wait:等待用户操作
|
||||||
@ -1782,6 +1882,8 @@ yes和no均为必填项,即用户点击确认或取消后执行的事件。
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### waitAsync:等待所有异步事件执行完毕
|
### waitAsync:等待所有异步事件执行完毕
|
||||||
|
|
||||||
上面有很多很多的异步事件(也就是执行时不等待执行完毕)。
|
上面有很多很多的异步事件(也就是执行时不等待执行完毕)。
|
||||||
@ -2099,7 +2201,7 @@ core.insertAction([
|
|||||||
|
|
||||||
从V2.5.3开始,针对每个事件都提供了独立开关。
|
从V2.5.3开始,针对每个事件都提供了独立开关。
|
||||||
|
|
||||||
独立开关的写法是`switch:A`, `switch:A`直到`switch:Z`,共计26个;不过样板中的值块默认只提供前6个。
|
独立开关的写法是`switch:A`, `switch:A`直到`switch:Z`,共计26个。
|
||||||
|
|
||||||
独立开关算是特殊的flag,它在事件中使用时会和事件的楼层及坐标进行绑定;换句话说每个事件对应的`switch:A`都是不同的。
|
独立开关算是特殊的flag,它在事件中使用时会和事件的楼层及坐标进行绑定;换句话说每个事件对应的`switch:A`都是不同的。
|
||||||
|
|
||||||
@ -2110,6 +2212,8 @@ core.insertAction([
|
|||||||
|
|
||||||
通过独立开关的方式,我们无需对某些NPC的对话都设立单独的互不重复flag,只需要关注该事件自身的逻辑即可。
|
通过独立开关的方式,我们无需对某些NPC的对话都设立单独的互不重复flag,只需要关注该事件自身的逻辑即可。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 同一个点的多事件处理
|
## 同一个点的多事件处理
|
||||||
|
|
||||||
我们可以发现,就目前而且,每个点的事件是和该点进行绑定,并以该点坐标作为唯一索引来查询。
|
我们可以发现,就目前而且,每个点的事件是和该点进行绑定,并以该点坐标作为唯一索引来查询。
|
||||||
@ -2154,6 +2258,8 @@ core.insertAction([
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### 获得圣水后变成墙
|
### 获得圣水后变成墙
|
||||||
|
|
||||||
这个例子要求获得圣水时不前进(也就是不能走到圣水地方),然后把圣水位置变成墙。
|
这个例子要求获得圣水时不前进(也就是不能走到圣水地方),然后把圣水位置变成墙。
|
||||||
@ -2181,6 +2287,8 @@ core.insertAction([
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
总之,记住如下两点:
|
总之,记住如下两点:
|
||||||
|
|
||||||
- 可以使用setBlock来更改一个图块。
|
- 可以使用setBlock来更改一个图块。
|
||||||
@ -2362,11 +2470,13 @@ if (core.flags.enableAddPoint && point > 0) {
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
`id`, `textInList`, `mustEnable`和上述完全相同。
|
`id`, `textInList`, `mustEnable`和上述完全相同。
|
||||||
|
|
||||||
`commonEvent`为公共事件名,即选择此项时要执行的公共事件。
|
`commonEvent`为公共事件名,即选择此项时要执行的公共事件。
|
||||||
|
|
||||||
`args`为向该公共事件传递的参数,参见[type:insert](#insert:插入公共事件或另一个地点的事件并执行)的说明。
|
`args`可选,为向该公共事件传递的参数,参见[type:insert](#insert:插入公共事件或另一个地点的事件并执行)的说明。
|
||||||
|
|
||||||
## 系统引发的自定义事件
|
## 系统引发的自定义事件
|
||||||
|
|
||||||
@ -2404,6 +2514,8 @@ if (core.flags.enableAddPoint && point > 0) {
|
|||||||
},
|
},
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
!> 多个机关门请分别设置开门变量如door1, door2等等。请勿存在两个机关门用相同的变量!
|
!> 多个机关门请分别设置开门变量如door1, door2等等。请勿存在两个机关门用相同的变量!
|
||||||
|
|
||||||
除此以外,每层楼还提供了`firstArrive`和`eachArrive`事件,分别为首次到达该楼层和每次到达该楼层时执行的事件。
|
除此以外,每层楼还提供了`firstArrive`和`eachArrive`事件,分别为首次到达该楼层和每次到达该楼层时执行的事件。
|
||||||
@ -2523,6 +2635,8 @@ if (core.flags.enableAddPoint && point > 0) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
另外,从V2.6开始,脚本编辑中提供了战前事件`beforeBattle`,这里不再详细展开,如有需求可自行前往研究。
|
另外,从V2.6开始,脚本编辑中提供了战前事件`beforeBattle`,这里不再详细展开,如有需求可自行前往研究。
|
||||||
|
|
||||||
## 经验升级(进阶/境界塔)
|
## 经验升级(进阶/境界塔)
|
||||||
@ -2552,6 +2666,8 @@ if (core.flags.enableAddPoint && point > 0) {
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
`levelUp`是一个数组,里面分别定义了每个等级的信息。里面每一项有三个参数`need`, `title`, `effect`
|
`levelUp`是一个数组,里面分别定义了每个等级的信息。里面每一项有三个参数`need`, `title`, `effect`
|
||||||
- `need` 该等级所需要的经验值,可以是个表达式。请确保数组中的need依次递增。
|
- `need` 该等级所需要的经验值,可以是个表达式。请确保数组中的need依次递增。
|
||||||
- `title` 该等级的名称,比如“佣兵下级”等。该项可以忽略,以使用系统默认的等级。该项将显示在状态栏中。
|
- `title` 该等级的名称,比如“佣兵下级”等。该项可以忽略,以使用系统默认的等级。该项将显示在状态栏中。
|
||||||
@ -2605,6 +2721,8 @@ if (core.flags.enableAddPoint && point > 0) {
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
==========================================================================================
|
==========================================================================================
|
||||||
|
|
||||||
[继续阅读下一章:个性化](personalization)
|
[继续阅读下一章:个性化](personalization)
|
||||||
|
|||||||
BIN
_docs/img/events/1.jpg
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
_docs/img/events/10.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
_docs/img/events/11.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
_docs/img/events/12.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
_docs/img/events/13.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
_docs/img/events/14.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
_docs/img/events/15.jpg
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
_docs/img/events/16.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
_docs/img/events/17.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
_docs/img/events/18.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
_docs/img/events/19.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
_docs/img/events/2.jpg
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
_docs/img/events/20.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
_docs/img/events/21.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
_docs/img/events/22.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
_docs/img/events/23.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
_docs/img/events/24.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
_docs/img/events/25.jpg
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
_docs/img/events/26.jpg
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
_docs/img/events/27.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
_docs/img/events/28.jpg
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
_docs/img/events/29.jpg
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
_docs/img/events/3.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
_docs/img/events/30.jpg
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
_docs/img/events/31.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
_docs/img/events/32.jpg
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
_docs/img/events/33.jpg
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
_docs/img/events/34.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
_docs/img/events/35.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
_docs/img/events/36.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
_docs/img/events/37.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
_docs/img/events/38.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
_docs/img/events/39.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
_docs/img/events/4.jpg
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
_docs/img/events/40.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
_docs/img/events/41.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
_docs/img/events/42.jpg
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
_docs/img/events/43.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
_docs/img/events/44.jpg
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
_docs/img/events/45.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
_docs/img/events/46.jpg
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
_docs/img/events/47.jpg
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
_docs/img/events/48.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
_docs/img/events/49.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
_docs/img/events/5.jpg
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
_docs/img/events/50.jpg
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
_docs/img/events/51.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
_docs/img/events/52.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
_docs/img/events/53.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
_docs/img/events/54.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
_docs/img/events/55.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
_docs/img/events/56.jpg
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
_docs/img/events/57.jpg
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
_docs/img/events/58.jpg
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
_docs/img/events/59.jpg
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
_docs/img/events/6.jpg
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
_docs/img/events/60.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
_docs/img/events/7.jpg
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
_docs/img/events/8.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
_docs/img/events/9.jpg
Normal file
|
After Width: | Height: | Size: 19 KiB |
@ -1,6 +1,6 @@
|
|||||||
# HTML5 魔塔样板说明文档
|
# HTML5 魔塔样板说明文档
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。
|
众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 个性化
|
# 个性化
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。
|
有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 脚本
|
# 脚本
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
在V2.6版本中,基本对整个项目代码进行了重写,更加方便造塔者的使用和复写函数。
|
在V2.6版本中,基本对整个项目代码进行了重写,更加方便造塔者的使用和复写函数。
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 快速上手
|
# 快速上手
|
||||||
|
|
||||||
?> 目前版本**v2.6.1**,上次更新时间:* {docsify-updated} *
|
?> 目前版本**v2.6.2**,上次更新时间:* {docsify-updated} *
|
||||||
|
|
||||||
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
|
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
|
||||||
|
|
||||||
|
|||||||
@ -393,7 +393,7 @@ if (EvalString_0==''){
|
|||||||
if (IdString_0=='')title='\\t['+EvalString_0+']';
|
if (IdString_0=='')title='\\t['+EvalString_0+']';
|
||||||
else title='\\t['+EvalString_0+','+IdString_0+']';
|
else title='\\t['+EvalString_0+','+IdString_0+']';
|
||||||
}
|
}
|
||||||
if(EvalString_1 && !(/^(up|down)(,hero)?(,([+-]?\d+),([+-]?\d+))?$/.test(EvalString_1))) {
|
if(EvalString_1 && !(/^(up|center|down|hero|null)(,(hero|null|\d+,\d+|\d+))?$/.test(EvalString_1))) {
|
||||||
throw new Error('对话框效果的用法请右键点击帮助');
|
throw new Error('对话框效果的用法请右键点击帮助');
|
||||||
}
|
}
|
||||||
EvalString_1 = EvalString_1 && ('\\b['+EvalString_1+']');
|
EvalString_1 = EvalString_1 && ('\\b['+EvalString_1+']');
|
||||||
@ -3406,7 +3406,7 @@ ActionParser.prototype.getTitleAndPosition = function (string) {
|
|||||||
string = string.replace(/\\t\[(([^\],]+),)?([^\],]+)\]/g, function (s0, s1, s2, s3) {
|
string = string.replace(/\\t\[(([^\],]+),)?([^\],]+)\]/g, function (s0, s1, s2, s3) {
|
||||||
if (s3) title = s3;
|
if (s3) title = s3;
|
||||||
if (s2) { icon = s3; title = s2; }
|
if (s2) { icon = s3; title = s2; }
|
||||||
if (icon.endsWith('.png')) { title += "," + icon; icon = ''; }
|
if (icon && !/^[0-9a-zA-Z_][0-9a-zA-Z_:]*$/.test(icon)) { title += "," + icon; icon = ''; }
|
||||||
return "";
|
return "";
|
||||||
}).replace(/\\b\[(.*?)\]/g, function (s0, s1) {
|
}).replace(/\\b\[(.*?)\]/g, function (s0, s1) {
|
||||||
position = s1; return "";
|
position = s1; return "";
|
||||||
|
|||||||
@ -531,6 +531,25 @@ editor.prototype.movePos = function (startPos, endPos, callback) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editor.prototype.exchangePos = function (startPos, endPos, callback) {
|
||||||
|
if (!startPos || !endPos) return;
|
||||||
|
if (startPos.x == endPos.x && startPos.y == endPos.y) return;
|
||||||
|
var startInfo = editor.copyFromPos(startPos);
|
||||||
|
var endInfo = editor.copyFromPos(endPos);
|
||||||
|
editor.pasteToPos(startInfo, endPos);
|
||||||
|
editor.pasteToPos(endInfo, startPos);
|
||||||
|
editor.updateMap();
|
||||||
|
editor.file.saveFloorFile(function (err) {
|
||||||
|
if (err) {
|
||||||
|
printe(err);
|
||||||
|
throw(err)
|
||||||
|
}
|
||||||
|
;printf('交换事件成功');
|
||||||
|
editor.drawPosSelection();
|
||||||
|
if (callback) callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
editor.prototype.clearPos = function (clearPos, pos, callback) {
|
editor.prototype.clearPos = function (clearPos, pos, callback) {
|
||||||
var fields = Object.keys(editor.file.comment._data.floors._data.loc._data);
|
var fields = Object.keys(editor.file.comment._data.floors._data.loc._data);
|
||||||
pos = pos || editor.pos;
|
pos = pos || editor.pos;
|
||||||
|
|||||||
@ -123,7 +123,7 @@ editor.constructor.prototype.listen=function () {
|
|||||||
var loc = eToLoc(e);
|
var loc = eToLoc(e);
|
||||||
var pos = locToPos(loc,true);
|
var pos = locToPos(loc,true);
|
||||||
editor.showMidMenu(e.clientX,e.clientY);
|
editor.showMidMenu(e.clientX,e.clientY);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if (!selectBox.isSelected()) {
|
if (!selectBox.isSelected()) {
|
||||||
var loc = eToLoc(e);
|
var loc = eToLoc(e);
|
||||||
@ -137,20 +137,19 @@ editor.constructor.prototype.listen=function () {
|
|||||||
uc.strokeStyle = '#FF0000';
|
uc.strokeStyle = '#FF0000';
|
||||||
uc.lineWidth = 3;
|
uc.lineWidth = 3;
|
||||||
if(editor.isMobile)editor.showMidMenu(e.clientX,e.clientY);
|
if(editor.isMobile)editor.showMidMenu(e.clientX,e.clientY);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
holdingPath = 1;
|
holdingPath = 1;
|
||||||
mouseOutCheck = 2;
|
mouseOutCheck = 2;
|
||||||
setTimeout(clear1);
|
setTimeout(clear1);
|
||||||
e.stopPropagation();
|
|
||||||
uc.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__);
|
uc.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__);
|
||||||
var loc = eToLoc(e);
|
var loc = eToLoc(e);
|
||||||
var pos = locToPos(loc,true);
|
var pos = locToPos(loc,true);
|
||||||
stepPostfix = [];
|
stepPostfix = [];
|
||||||
stepPostfix.push(pos);
|
stepPostfix.push(pos);
|
||||||
fillPos(pos);
|
fillPos(pos);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
eui.onmousemove = function (e) {
|
eui.onmousemove = function (e) {
|
||||||
@ -178,14 +177,13 @@ editor.constructor.prototype.listen=function () {
|
|||||||
//editor_mode.loc();
|
//editor_mode.loc();
|
||||||
//tip.whichShow(1);
|
//tip.whichShow(1);
|
||||||
// tip.showHelp(6);
|
// tip.showHelp(6);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (holdingPath == 0) {
|
if (holdingPath == 0) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
mouseOutCheck = 2;
|
mouseOutCheck = 2;
|
||||||
e.stopPropagation();
|
|
||||||
var loc = eToLoc(e);
|
var loc = eToLoc(e);
|
||||||
var pos = locToPos(loc,true);
|
var pos = locToPos(loc,true);
|
||||||
var pos0 = stepPostfix[stepPostfix.length - 1]
|
var pos0 = stepPostfix[stepPostfix.length - 1]
|
||||||
@ -204,18 +202,19 @@ editor.constructor.prototype.listen=function () {
|
|||||||
stepPostfix.push(pos);
|
stepPostfix.push(pos);
|
||||||
fillPos(pos);
|
fillPos(pos);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
eui.onmouseup = function (e) {
|
eui.onmouseup = function (e) {
|
||||||
if (!selectBox.isSelected()) {
|
if (!selectBox.isSelected()) {
|
||||||
//tip.whichShow(1);
|
//tip.whichShow(1);
|
||||||
editor.movePos(startPos, endPos);
|
// editor.movePos(startPos, endPos);
|
||||||
|
editor.exchangePos(startPos, endPos);
|
||||||
startPos = endPos = null;
|
startPos = endPos = null;
|
||||||
uc.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__);
|
uc.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
holdingPath = 0;
|
holdingPath = 0;
|
||||||
e.stopPropagation();
|
|
||||||
if (stepPostfix && stepPostfix.length) {
|
if (stepPostfix && stepPostfix.length) {
|
||||||
editor.preMapData = JSON.parse(JSON.stringify({map:editor.map,fgmap:editor.fgmap,bgmap:editor.bgmap}));
|
editor.preMapData = JSON.parse(JSON.stringify({map:editor.map,fgmap:editor.fgmap,bgmap:editor.bgmap}));
|
||||||
if(editor.brushMod!=='line'){
|
if(editor.brushMod!=='line'){
|
||||||
@ -258,6 +257,7 @@ editor.constructor.prototype.listen=function () {
|
|||||||
stepPostfix = [];
|
stepPostfix = [];
|
||||||
uc.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__);
|
uc.clearRect(0, 0, core.__PIXELS__, core.__PIXELS__);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -279,7 +279,6 @@ editor.constructor.prototype.listen=function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
document.getElementById('mid').onmousewheel = function (e) {
|
document.getElementById('mid').onmousewheel = function (e) {
|
||||||
e.preventDefault();
|
|
||||||
var wheel = function (direct) {
|
var wheel = function (direct) {
|
||||||
var index=editor.core.floorIds.indexOf(editor.currentFloorId);
|
var index=editor.core.floorIds.indexOf(editor.currentFloorId);
|
||||||
var toId = editor.currentFloorId;
|
var toId = editor.currentFloorId;
|
||||||
@ -305,6 +304,7 @@ editor.constructor.prototype.listen=function () {
|
|||||||
catch (ee) {
|
catch (ee) {
|
||||||
console.log(ee);
|
console.log(ee);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
editor.preMapData = null;
|
editor.preMapData = null;
|
||||||
@ -747,19 +747,7 @@ editor.constructor.prototype.listen=function () {
|
|||||||
editor.preMapData = null;
|
editor.preMapData = null;
|
||||||
reDo = null;
|
reDo = null;
|
||||||
editor_mode.onmode('');
|
editor_mode.onmode('');
|
||||||
var now = editor.pos, last = editor.lastRightButtonPos[1];
|
editor.exchangePos(editor.pos, editor.lastRightButtonPos[1]);
|
||||||
if (now.x == last.x && now.y == last.y) return;
|
|
||||||
editor.pasteToPos(editor.lastCopyedInfo[1], now);
|
|
||||||
editor.pasteToPos(editor.lastCopyedInfo[0], last);
|
|
||||||
editor.updateMap();
|
|
||||||
editor.file.saveFloorFile(function (err) {
|
|
||||||
if (err) {
|
|
||||||
printe(err);
|
|
||||||
throw(err)
|
|
||||||
}
|
|
||||||
;printf('两位置的事件已互换');
|
|
||||||
editor.drawPosSelection();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var clearEvent = document.getElementById('clearEvent');
|
var clearEvent = document.getElementById('clearEvent');
|
||||||
|
|||||||
@ -481,6 +481,8 @@ uievent.selectPoint = function (floorId, x, y, hideFloor, callback) {
|
|||||||
uievent.updateSelectPoint = function (redraw) {
|
uievent.updateSelectPoint = function (redraw) {
|
||||||
uievent.elements.title.innerText = '地图选点 ('+uievent.values.x+","+uievent.values.y+')';
|
uievent.elements.title.innerText = '地图选点 ('+uievent.values.x+","+uievent.values.y+')';
|
||||||
if (redraw) {
|
if (redraw) {
|
||||||
|
core.setAlpha('uievent', 1);
|
||||||
|
core.clearMap('uievent');
|
||||||
core.drawThumbnail(uievent.values.floorId, null, null,
|
core.drawThumbnail(uievent.values.floorId, null, null,
|
||||||
{ctx: 'uievent', centerX: uievent.values.left + core.__HALF_SIZE__,
|
{ctx: 'uievent', centerX: uievent.values.left + core.__HALF_SIZE__,
|
||||||
centerY: uievent.values.top + core.__HALF_SIZE__});
|
centerY: uievent.values.top + core.__HALF_SIZE__});
|
||||||
|
|||||||
@ -225,6 +225,12 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = {
|
|||||||
"_range": "false",
|
"_range": "false",
|
||||||
"_data": "图块类别"
|
"_data": "图块类别"
|
||||||
},
|
},
|
||||||
|
"name": {
|
||||||
|
"_leaf": true,
|
||||||
|
"_type": "textarea",
|
||||||
|
"_string": true,
|
||||||
|
"_data": "图块名称"
|
||||||
|
},
|
||||||
"trigger": {
|
"trigger": {
|
||||||
"_leaf": true,
|
"_leaf": true,
|
||||||
"_type": "select",
|
"_type": "select",
|
||||||
|
|||||||
@ -1858,6 +1858,11 @@ actions.prototype._keyUpSL = function (keycode) {
|
|||||||
this._clickSL(this.LAST, this.LAST);
|
this._clickSL(this.LAST, this.LAST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (keycode >= 48 && keycode <= 57) {
|
||||||
|
if (keycode == 48) keycode = 58;
|
||||||
|
core.ui.drawSLPanel((keycode - 49) * 1000 + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (keycode == 13 || keycode == 32 || keycode == 67) {
|
if (keycode == 13 || keycode == 32 || keycode == 67) {
|
||||||
if (offset == 0)
|
if (offset == 0)
|
||||||
core.doSL("autoSave", core.status.event.id);
|
core.doSL("autoSave", core.status.event.id);
|
||||||
|
|||||||
@ -570,6 +570,12 @@ control.prototype.setAutoHeroMove = function (steps) {
|
|||||||
////// 设置行走的效果动画 //////
|
////// 设置行走的效果动画 //////
|
||||||
control.prototype.setHeroMoveInterval = function (callback) {
|
control.prototype.setHeroMoveInterval = function (callback) {
|
||||||
if (core.status.heroMoving > 0) return;
|
if (core.status.heroMoving > 0) return;
|
||||||
|
if (core.status.replay.speed == 24) {
|
||||||
|
core.moveOneStep(core.nextX(), core.nextY());
|
||||||
|
if (callback) callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
core.status.heroMoving=1;
|
core.status.heroMoving=1;
|
||||||
|
|
||||||
var toAdd = 1;
|
var toAdd = 1;
|
||||||
@ -1346,6 +1352,7 @@ control.prototype._replay_error = function (action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
control.prototype.__replay_getTimeout = function () {
|
control.prototype.__replay_getTimeout = function () {
|
||||||
|
if (core.status.replay.speed == 24) return 0;
|
||||||
return 750 / Math.max(1, core.status.replay.speed);
|
return 750 / Math.max(1, core.status.replay.speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -434,7 +434,7 @@ events.prototype._openDoor_animate = function (id, x, y, callback) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
core.drawImage('event', core.material.images.animates, 32 * state, 32 * door, 32, 32, 32 * x, 32 * y, 32, 32);
|
core.drawImage('event', core.material.images.animates, 32 * state, 32 * door, 32, 32, 32 * x, 32 * y, 32, 32);
|
||||||
}, speed / Math.max(core.status.replay.speed, 1));
|
}, core.status.replay.speed == 24 ? 1 : speed / Math.max(core.status.replay.speed, 1));
|
||||||
core.animateFrame.asyncId[animate] = true;
|
core.animateFrame.asyncId[animate] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1395,7 +1395,7 @@ events.prototype._action_choices = function (data, x, y, prefix) {
|
|||||||
core.status.route.push("choices:" + index);
|
core.status.route.push("choices:" + index);
|
||||||
core.insertAction(data.choices[index].action);
|
core.insertAction(data.choices[index].action);
|
||||||
core.doAction();
|
core.doAction();
|
||||||
}, 750 / Math.max(1, core.status.replay.speed))
|
}, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.control._replay_error(action);
|
core.control._replay_error(action);
|
||||||
@ -1418,7 +1418,7 @@ events.prototype._action_confirm = function (data, x, y, prefix) {
|
|||||||
if (index == 0) core.insertAction(data.yes);
|
if (index == 0) core.insertAction(data.yes);
|
||||||
else core.insertAction(data.no);
|
else core.insertAction(data.no);
|
||||||
core.doAction();
|
core.doAction();
|
||||||
}, 750 / Math.max(1, core.status.replay.speed))
|
}, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed))
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.control._replay_error(action);
|
core.control._replay_error(action);
|
||||||
@ -1986,7 +1986,7 @@ events.prototype.closeDoor = function (x, y, id, callback) {
|
|||||||
}
|
}
|
||||||
core.clearMap('event', 32 * x, 32 * y, 32, 32);
|
core.clearMap('event', 32 * x, 32 * y, 32, 32);
|
||||||
core.drawImage('event', core.material.images.animates, 32 * (4-state), 32 * door, 32, 32, 32 * x, 32 * y, 32, 32);
|
core.drawImage('event', core.material.images.animates, 32 * (4-state), 32 * door, 32, 32, 32 * x, 32 * y, 32, 32);
|
||||||
}, speed / Math.max(core.status.replay.speed, 1));
|
}, core.status.replay.speed == 24 ? 1 : speed / Math.max(core.status.replay.speed, 1));
|
||||||
core.animateFrame.asyncId[animate] = true;
|
core.animateFrame.asyncId[animate] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2194,7 +2194,7 @@ events.prototype.eventMoveHero = function(steps, time, callback) {
|
|||||||
if (core.events._eventMoveHero_moving(++step, moveSteps))
|
if (core.events._eventMoveHero_moving(++step, moveSteps))
|
||||||
step = 0;
|
step = 0;
|
||||||
}
|
}
|
||||||
}, time / 8 / core.status.replay.speed);
|
}, core.status.replay.speed == 24 ? 1 : time / 8 / core.status.replay.speed);
|
||||||
|
|
||||||
core.animateFrame.asyncId[animate] = true;
|
core.animateFrame.asyncId[animate] = true;
|
||||||
}
|
}
|
||||||
|
|||||||
11
libs/maps.js
@ -363,7 +363,8 @@ maps.prototype._getBgFgMapArray = function (name, floorId, noCache) {
|
|||||||
return core.status[name + "maps"][floorId];
|
return core.status[name + "maps"][floorId];
|
||||||
|
|
||||||
var arr = core.clone(core.floors[floorId][name + "map"] || []);
|
var arr = core.clone(core.floors[floorId][name + "map"] || []);
|
||||||
if (main.mode == 'editor') arr = core.clone(editor[name + "map"]) || arr;
|
if (main.mode == 'editor' && !(uievent && uievent.isOpen))
|
||||||
|
arr = core.clone(editor[name + "map"]) || arr;
|
||||||
for (var x = 0; x < width; x++) {
|
for (var x = 0; x < width; x++) {
|
||||||
for (var y = 0; y < height; y++) {
|
for (var y = 0; y < height; y++) {
|
||||||
arr[y] = arr[y] || [];
|
arr[y] = arr[y] || [];
|
||||||
@ -1223,7 +1224,7 @@ maps.prototype.getBlockInfo = function (block) {
|
|||||||
if (block == 0) return null;
|
if (block == 0) return null;
|
||||||
block = this.initBlock(0, 0, block, true);
|
block = this.initBlock(0, 0, block, true);
|
||||||
}
|
}
|
||||||
var number = block.id, id = block.event.id, cls = block.event.cls,
|
var number = block.id, id = block.event.id, cls = block.event.cls, name = block.event.name,
|
||||||
image = null, posX = 0, posY = 0, animate = block.event.animate,
|
image = null, posX = 0, posY = 0, animate = block.event.animate,
|
||||||
height = block.event.height || 32, faceIds = {};
|
height = block.event.height || 32, faceIds = {};
|
||||||
|
|
||||||
@ -1231,6 +1232,7 @@ maps.prototype.getBlockInfo = function (block) {
|
|||||||
else if (id == 'airwall') {
|
else if (id == 'airwall') {
|
||||||
if (!core.material.images.airwall) return null;
|
if (!core.material.images.airwall) return null;
|
||||||
image = core.material.images.airwall;
|
image = core.material.images.airwall;
|
||||||
|
name = "空气墙";
|
||||||
}
|
}
|
||||||
else if (cls == 'tileset') {
|
else if (cls == 'tileset') {
|
||||||
var offset = core.icons.getTilesetOffset(id);
|
var offset = core.icons.getTilesetOffset(id);
|
||||||
@ -1246,9 +1248,12 @@ maps.prototype.getBlockInfo = function (block) {
|
|||||||
image = core.material.images[cls];
|
image = core.material.images[cls];
|
||||||
posY = core.material.icons[cls][id];
|
posY = core.material.icons[cls][id];
|
||||||
faceIds = block.event.faceIds || {};
|
faceIds = block.event.faceIds || {};
|
||||||
|
if (core.material.enemys[id]) {
|
||||||
|
name = core.material.enemys[id].name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {number: number, id: id, cls: cls, image: image, posX: posX, posY: posY, height: height, faceIds: faceIds, animate: animate};
|
return {number: number, id: id, cls: cls, name: name, image: image, posX: posX, posY: posY, height: height, faceIds: faceIds, animate: animate};
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 搜索某个图块出现的所有位置 //////
|
////// 搜索某个图块出现的所有位置 //////
|
||||||
|
|||||||
@ -535,7 +535,7 @@ ui.prototype._getTitleAndIcon = function (content) {
|
|||||||
else {
|
else {
|
||||||
var blockInfo = core.getBlockInfo(s4);
|
var blockInfo = core.getBlockInfo(s4);
|
||||||
if (blockInfo != null) {
|
if (blockInfo != null) {
|
||||||
if (core.material.enemys[s4]) title = core.material.enemys[s4].name;
|
if (blockInfo.name) title = blockInfo.name;
|
||||||
image = blockInfo.image;
|
image = blockInfo.image;
|
||||||
icon = blockInfo.posY;
|
icon = blockInfo.posY;
|
||||||
height = blockInfo.height;
|
height = blockInfo.height;
|
||||||
@ -544,7 +544,10 @@ ui.prototype._getTitleAndIcon = function (content) {
|
|||||||
else title = s4;
|
else title = s4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (s3) title = s3;
|
if (s3 != null) {
|
||||||
|
title = s3;
|
||||||
|
if (title == 'null') title = null;
|
||||||
|
}
|
||||||
return "";
|
return "";
|
||||||
});
|
});
|
||||||
return {
|
return {
|
||||||
|
|||||||
6
main.js
@ -2,7 +2,7 @@ function main() {
|
|||||||
|
|
||||||
//------------------------ 用户修改内容 ------------------------//
|
//------------------------ 用户修改内容 ------------------------//
|
||||||
|
|
||||||
this.version = "2.6.1"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。
|
this.version = "2.6.2"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。
|
||||||
|
|
||||||
this.useCompress = false; // 是否使用压缩文件
|
this.useCompress = false; // 是否使用压缩文件
|
||||||
// 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。
|
// 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。
|
||||||
@ -188,8 +188,8 @@ function main() {
|
|||||||
this.floors = {}
|
this.floors = {}
|
||||||
this.canvas = {};
|
this.canvas = {};
|
||||||
|
|
||||||
this.__VERSION__ = "2.6.1";
|
this.__VERSION__ = "2.6.2";
|
||||||
this.__VERSION_CODE__ = 36;
|
this.__VERSION_CODE__ = 54;
|
||||||
}
|
}
|
||||||
|
|
||||||
main.prototype.init = function (mode, callback) {
|
main.prototype.init = function (mode, callback) {
|
||||||
|
|||||||
@ -77,7 +77,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
|||||||
"firstData": {
|
"firstData": {
|
||||||
"title": "魔塔样板",
|
"title": "魔塔样板",
|
||||||
"name": "template",
|
"name": "template",
|
||||||
"version": "Ver 2.6.1",
|
"version": "Ver 2.6.2",
|
||||||
"floorId": "sample0",
|
"floorId": "sample0",
|
||||||
"hero": {
|
"hero": {
|
||||||
"name": "阳光",
|
"name": "阳光",
|
||||||
|
|||||||
@ -1229,8 +1229,10 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
|||||||
if (enemyDamage != null && enemyDamage < value)
|
if (enemyDamage != null && enemyDamage < value)
|
||||||
value = enemyDamage;
|
value = enemyDamage;
|
||||||
}
|
}
|
||||||
damage[loc] = (damage[loc] || 0) + value;
|
if (value > 0) {
|
||||||
type[loc] = "夹击伤害";
|
damage[loc] = (damage[loc] || 0) + value;
|
||||||
|
type[loc] = "夹击伤害";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
常用工具/额外素材合并工具.exe
Normal file
18
更新说明.txt
@ -1,4 +1,20 @@
|
|||||||
HTML5魔塔样板V2.6.1
|
HTML5魔塔样板V2.6.2
|
||||||
|
|
||||||
|
可以拖动地图上的图块和事件,复制剪切和跨楼层粘贴
|
||||||
|
新增事件的地图选点功能,可以在地图上选择落点
|
||||||
|
现在素材区可以进行折叠与自动换列了
|
||||||
|
新增UI绘制系列事件,并且可以进行预览
|
||||||
|
显示文本事件的标题解析
|
||||||
|
新增常用工具:额外素材合并工具
|
||||||
|
进一步提升24倍速的播放速度
|
||||||
|
楼层转换增加对称点
|
||||||
|
增加编辑器快捷键说明,H键查看
|
||||||
|
文档-事件增加事件编辑器截图
|
||||||
|
大量细节优化,所有已知的Bug修复
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
HTML5魔塔样板V2.6.1
|
||||||
|
|
||||||
区域优化的录像播放功能,R键使用
|
区域优化的录像播放功能,R键使用
|
||||||
强制战斗可以指定怪物坐标,将自动隐藏并执行该点战后事件
|
强制战斗可以指定怪物坐标,将自动隐藏并执行该点战后事件
|
||||||
|
|||||||