diff --git a/README.md b/README.md
index cfc384fe..1006b2c4 100644
--- a/README.md
+++ b/README.md
@@ -8,8 +8,9 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏!
* [List / HTML5魔塔游戏列表](https://h5mota.com/)
* [Demo / 样板效果](https://ckcz123.com/games/template/)
* [Docs / 使用文档说明](https://ckcz123.github.io/mota-js/)
+

## 目录结构
@@ -53,6 +54,19 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏!
## 更新说明
+### 2018.9.18 V2.4.1
+
+* [x] 增加背景层和前景层的图块绘制,多层图块可叠加
+* [x] 背景层/前景层图块的显示、隐藏、修改等事件
+* [x] 专门的装备页面(Q键开启);装备系统大改造
+* [x] 灯光和漆黑层效果,通过插件函数方式给出
+* [x] 将状态栏更新和阻激夹域的计算移动到脚本编辑中
+* [x] 增加控制免疫阻激夹域的flag:no_zone等
+* [x] 打字机效果时点击显示全部文字
+* [x] 修复更改画面色调的Bug
+* [x] 修复更改剧情文本属性后读档恢复原样的问题
+* [x] 部分细节优化
+
### 2018.8.28 V2.4
* [x] 大地图的支持
@@ -293,7 +307,7 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏!
- [JS代码压缩工具](http://github.com/ckcz123/JSCompressor/):能对Javascript代码进行压缩和整合,从而减少IO请求量。
- [便捷PS工具](http://github.com/ckcz123/ps/):能只用复制和粘贴来快速对素材进行PS操作。
- [地图生成器](http://github.com/ckcz123/map_generator/):能从一张截图识别出来具体的数字数组,方便复刻已有的塔。
-- [怪物数据导出器](http://github.com/ckcz123/enemy_export/):能从RMXP中带出怪物数据,以供H5使用。
+- [怪物数据导出器](http://github.com/ckcz123/enemy_export/):能从RMXP中导出怪物数据,以供H5使用。
- [伤害和临界值计算器](http://github.com/ckcz123/magic-tower-calculator/):一个能帮助计算怪物的伤害和临界值的小工具。
## 联系我们
@@ -321,4 +335,6 @@ HTML5魔塔交流群群号: `539113091`
[@fux4](https://github.com/fux4) 打通了RM和H5之间的障壁(从而使RM动画导出器和怪物数据导出器成为可能),同时也是部分新功能(如跳跃、跟随、画面震动)等的编写者。
+[@tocque](https://github.com/tocque) 装备栏的编写者。
+
以及[百度贴吧魔塔吧](https://tieba.baidu.com/f?kw=%E9%AD%94%E5%A1%94)和H5魔塔交流群`539113091`内的诸位魔塔爱好者们对本样板的大力支持!
diff --git a/_server/README.md b/_server/README.md
index 2d6a8d08..374db923 100644
--- a/_server/README.md
+++ b/_server/README.md
@@ -70,7 +70,7 @@ editor.file.editFunctions(["change","['events']['afterChangeLight']","function(x
生成表格并绑定事件的函数
```javascript
editor.mode.loc();
-editor.mode.emenyitem();
+editor.mode.enemyitem();
editor.mode.floor();
editor.mode.tower();
editor.mode.functions();
@@ -83,7 +83,7 @@ editor.mode.onmode('save');//保存
editor.mode.onmode('nextChange');//下次onmode时前端进行切换
editor.mode.onmode('loc');
-editor.mode.onmode('emenyitem');
+editor.mode.onmode('enemyitem');
editor.mode.onmode('floor');
editor.mode.onmode('tower');
editor.mode.onmode('functions');
diff --git a/_server/comment.js b/_server/comment.js
index 9f7bb124..cceaf71f 100644
--- a/_server/comment.js
+++ b/_server/comment.js
@@ -23,7 +23,7 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"equips"
]
},
- "_data": "只能取keys(钥匙) items(宝石、血瓶) constants(永久物品) tools(消耗道具) equip(装备)"
+ "_data": "只能取keys(钥匙) items(宝石、血瓶) constants(永久物品) tools(消耗道具) equips(装备)"
},
"name": {
"_leaf": true,
@@ -38,36 +38,9 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"_data": "道具在道具栏中显示的描述"
},
"equip": {
- "_leaf": false,
- "_type": "object",
- "_data": {
- "type": {
- "_leaf": true,
- "_type": "textarea",
- "_data": "如果是装备,其类别,与equipName按顺序对应(从0开始)"
- },
- "atk": {
- "_leaf": true,
- "_type": "textarea",
- "_data": "如果是装备,其增加的攻击数值"
- },
- "def": {
- "_leaf": true,
- "_type": "textarea",
- "_data": "如果是装备,其增加的防御数值"
- },
- "mdef": {
- "_leaf": true,
- "_type": "textarea",
- "_data": "如果是装备,其增加的魔防数值"
- },
- "animate": {
- "_leaf": true,
- "_type": "textarea",
- "_string": true,
- "_data": "如果是装备,其攻击动画,仅对type为0的装备有效"
- }
- }
+ "_leaf": true,
+ "_type": "textarea",
+ "_data": "装备属性设置,仅对cls为equips有效。\n如果此项不为null,需要是一个对象,里面可含\"type\",\"atk\",\"def\",\"mdef\",\"animate\"五项,分别对应装备部位、攻防魔防和动画。\n具体详见文档(元件说明-装备)和已有的几个装备的写法。"
},
}
},
@@ -238,7 +211,7 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"pushBox"
]
},
- "_data": "图块的默认触发器"
+ "_data": "该图块的默认触发器"
},
"noPass": {
"_leaf": true,
@@ -250,7 +223,7 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
false
]
},
- "_data": "图块默认可通行状态"
+ "_data": "该图块是否不可通行;true代表不可通行,false代表可通行,null代表使用系统缺省值"
}
}
},
diff --git a/_server/editor.js b/_server/editor.js
index 07741e42..6b53043a 100644
--- a/_server/editor.js
+++ b/_server/editor.js
@@ -709,8 +709,8 @@ editor.prototype.listen = function () {
}
tip.infos = JSON.parse(JSON.stringify(editor.info));
editor_mode.onmode('nextChange');
- editor_mode.onmode('emenyitem');
- //editor_mode.emenyitem();
+ editor_mode.onmode('enemyitem');
+ //editor_mode.enemyitem();
}
}
}
@@ -779,7 +779,7 @@ editor.prototype.listen = function () {
dataSelection.style.height = ysize - 6 + 'px';
tip.infos = JSON.parse(JSON.stringify(editor.info));
editor_mode.onmode('nextChange');
- editor_mode.onmode('emenyitem');
+ editor_mode.onmode('enemyitem');
}
var fields = Object.keys(editor.file.comment._data.floors._data.loc._data);
diff --git a/_server/editor_mode.js b/_server/editor_mode.js
index 47ddbd94..3fe44261 100644
--- a/_server/editor_mode.js
+++ b/_server/editor_mode.js
@@ -4,7 +4,7 @@ editor_mode = function (editor) {
function editor_mode() {
this.ids = {
'loc': 'left2',
- 'emenyitem': 'left3',
+ 'enemyitem': 'left3',
'floor': 'left4',
'tower': 'left5',
'functions': 'left8',
@@ -208,7 +208,7 @@ editor_mode = function (editor) {
editor.drawEventBlock();
});
break;
- case 'emenyitem':
+ case 'enemyitem':
if (editor_mode.info.images == 'enemys' || editor_mode.info.images == 'enemy48') {
editor.file.editEnemy(editor_mode.info.id, actionList, function (objs_) {/*console.log(objs_);*/
@@ -310,7 +310,7 @@ editor_mode = function (editor) {
if (Boolean(callback)) callback();
}
- editor_mode.prototype.emenyitem = function (callback) {
+ editor_mode.prototype.enemyitem = function (callback) {
//editor.info=editor.ids[editor.indexs[201]];
if (!core.isset(editor.info)) return;
diff --git a/docs/V2.0.md b/docs/V2.0.md
index 2c87474d..0df0686a 100644
--- a/docs/V2.0.md
+++ b/docs/V2.0.md
@@ -1,6 +1,6 @@
# V2.0版本介绍
-?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
+?> 目前版本**v2.4.1**,上次更新时间:* {docsify-updated} *
目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。
diff --git a/docs/api.md b/docs/api.md
index c7ced584..e411229f 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -1,6 +1,6 @@
# 附录: API列表
-?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
+?> 目前版本**v2.4.1**,上次更新时间:* {docsify-updated} *
**这里只列出所有可能会被造塔者用到的常用API,更多的有关内容请在代码内进行查询。**
@@ -72,8 +72,17 @@ core.setItem('pickaxe', 10)
将破墙镐个数设置为10个。这里可以写任何道具的ID。
+core.addItem('pickaxe', 2)
+将破墙镐的个数增加2个,无任何特效。这里可以写任何道具的ID。
+
+
core.getItem('pickaxe', 4)
-另勇士获得四个破墙镐。这里可以写任何道具的ID。
+令勇士获得4个破墙镐。这里可以写任何道具的ID。
+和addItem相比,使用getItem会播放获得道具的音效,也会在左上角绘制获得提示。
+
+
+core.removeItem('pickaxe', 3)
+删除3个破墙镐。第二项可忽略,默认值为1。
core.itemCount('pickaxe')
@@ -84,6 +93,15 @@ 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变量名。
@@ -229,12 +247,12 @@ core.canUseItem(itemId)
返回当前能否使用某个道具。
-core.addItem(itemId, number)
-将某个道具增加number个。
+core.loadEquip(itemId, callback)
+装备上某个装备。itemId为装备的ID,callback为成功或失败后的回调。
-core.removeItem(itemId)
-将某个道具个数-1;如果道具个数归0则从道具列表删除。
+core.unloadEquip(equipType, callback)
+卸下某个部位的装备。equipType为装备类型,从0开始;callback为成功或失败后的回调。
core.getNextItem()
@@ -266,6 +284,11 @@ core.getLocalStorage(key, defaultValue)
从localStorage中获得某个数据(已被parse);如果对应的key不存在则返回defaultValue。
+core.getLocalForage(key, defaultValue, successCallback, errorCallback)
+从localForage中获得某个数据(已被parse),如果对应的key不存在则返回defaultValue。
+如果成功则通过successCallback回调,失败则通过errorCallback回调。
+
+
core.clone(data)
深拷贝某个对象。
@@ -399,6 +422,10 @@ core.events.setHeroIcon(name)
items.js将处理和道具相关的内容,比如道具的使用,获取和删除等等。
+core.items.compareEquipment(equipId1, equipId2)
+比较两个装备的属性变化值
+
+
========== core.loader.XXX 和游戏加载相关的函数 ==========
loader.js将主要用来进行资源的加载,比如加载音乐、图片、动画等等。
diff --git a/docs/element.md b/docs/element.md
index 882f54f5..0fd64fc8 100644
--- a/docs/element.md
+++ b/docs/element.md
@@ -1,6 +1,6 @@
# 元件说明
-?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
+?> 目前版本**v2.4.1**,上次更新时间:* {docsify-updated} *
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。
@@ -24,7 +24,58 @@
如果需要让剑盾等变成装备,可以直接在`data.js`中设置`'equipment': true`即可。
-有关装备更为详细的资料可参见[自定义装备](personalization#自定义装备)的说明。
+从V2.4.1开始,HTML5魔塔样板终于拥有了属于自己的装备页面。
+
+### 装备栏的设置,装备类型
+
+在全塔属性中,有一个`equipName`项,其定义了本塔的所有可装备的装备栏。
+
+其需要是一个不小于1且不大于6的数组,其中每一项为装备栏的名称,**建议是两个汉字**。
+
+例如下面这种写法就是定义了四个装备孔,名称分别为武器、防御、首饰和魔杖。
+
+``` js
+"equipName": ["武器","防具","首饰","魔杖"]
+```
+
+这么定义好后,装备类型即为每个装备孔的索引(从0开始)。
+
+即,武器的装备类型是0,防御的装备类型是1,首饰的装备类型是2,魔杖的装备类型是3。
+
+### 设置每个装备的属性
+
+如果要将一个道具设置为装备,首先需要将其`cls`设为`equips`。
+
+然后在图块属性的`equip`一项中设置装备的具体属性。该项写法如下:
+``` js
+{"type": 0, "atk": 0, "def": 0, "mdef":0, "animate": "hand"}
+```
+
+type为该装备的类型,必填,和上面装备栏一一对应。例如,0就是武器,2就是首饰等等。
+
+atk/def/mdef为该装备分别增加的攻防魔防数值(支持负数);如果不加也可省略不写。
+
+animate为该装备的攻击动画,仅对type为0时有效。具体可参见[动画和天气系统](#动画和天气系统)。
+
+下面是几个写法例子。
+
+``` js
+{"type": 0, "atk": 10} // 装备类型是武器,效果是攻击+10,使用默认的攻击动画
+{"type": 0, "atk": 40, "animate": "sword"} // 装备类型为武器,效果是攻击+10,攻击动画是sword
+{"type": 1, "def": 40} // 装备类型是防具,效果是防御+40
+{"type": 1, "def": 100, "mdef": 100} // 装备类型是防具,效果是防御和魔防各+100
+{"type": 3, "atk": -20, "def": 50, "mdef": 50} // 装备类型是魔杖,效果是攻击-20,防御和魔防各+50
+```
+
+### 检测是否存在装备
+
+可以使用`core.hasEquip(itemId)`来检测是否装上某个装备。
+
+使用`core.hasItem(itemId)`来检测是否存在一个未装上的装备。
+
+使用`core.getEquip(equipType)`来获得某个装备类型的当前装备。
+
+更多相关API详见[附录:API列表](api)。
## 门
@@ -32,6 +83,8 @@
开门后可触发该层的`afterOpenDoor`事件,有关事件的详细介绍请参见第四章。
+如果要新增自己的门,请参见[新增门和对应的钥匙](personalization#新增门和对应的钥匙)。
+
## 暗墙
本塔支持暗墙。
@@ -139,16 +192,26 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数
领域怪还可以设置`range`选项代表该领域怪的范围,不写则默认为1。
+**将`flag:no_zone`设置为true可以取消领域效果。**
+
阻击怪同样需要设置value,代表阻击伤害的数值。如果勇士生命值扣减到0,则直接死亡触发lose事件。
+**将`flag:no_snipe`设置为true可以取消阻击效果。**
+
!> 阻击怪后退的地点不能有任何事件存在,即使是已经被禁用的自定义事件!
激光怪同样需要设置value,代表激光伤害的数值。
请注意如果吸血、领域、阻击中任何两个同时存在,则value会冲突。**因此请勿将吸血、领域、阻击或激光放置在同一个怪物身上。**
+**将`flag:no_laser`设置为true可以免疫激光效果。**
+
退化怪需要设置'atkValue'和'defValue'表示退化的数值;也可以不设置默认为0。
+夹击可以通过全塔属性中的`betweenAttackCeil`设为true可以将伤害向上取整。
+
+**将`flag:no_betweenAttack`设置为true可以免疫夹击效果。**
+
固伤怪则需要设置`damage`选项,代表战前扣血数值。
如有额外需求,可参见[自定义怪物属性](personalization#自定义自定义怪物属性),里面讲了如何设置一个新的怪物属性。
diff --git a/docs/event.md b/docs/event.md
index 4786774d..bc1a9561 100644
--- a/docs/event.md
+++ b/docs/event.md
@@ -1,6 +1,6 @@
# 事件
-?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
+?> 目前版本**v2.4.1**,上次更新时间:* {docsify-updated} *
本章内将对样板所支持的事件进行介绍。
diff --git a/docs/index.md b/docs/index.md
index 4bfabadd..b4ca28de 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,6 +1,6 @@
# HTML5 魔塔样板说明文档
-?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
+?> 目前版本**v2.4.1**,上次更新时间:* {docsify-updated} *
众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。
@@ -12,9 +12,9 @@
> 这个魔塔样板,可以让你在完全不懂任何编程的情况下,做出自己的H5魔塔。不会代码?没关系!只要你想做,就能做出来!
继续查看文档的详细介绍,让你学会如何使用这一个样板来制作属于自己的HTML5魔塔。
-
+
==========================================================================================
[继续阅读下一章:现在就做出自己的第一部H5魔塔!](start)
diff --git a/docs/personalization.md b/docs/personalization.md
index be460129..87280538 100644
--- a/docs/personalization.md
+++ b/docs/personalization.md
@@ -1,6 +1,6 @@
# 个性化
-?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
+?> 目前版本**v2.4.1**,上次更新时间:* {docsify-updated} *
有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。
@@ -308,25 +308,13 @@ function (enemy, hero_hp, hero_atk, hero_def, hero_mdef) {
}
// ... 下略
```
-3. 免疫领域、夹击、阻击效果:在`control.js`中,找到checkBlock函数,并编辑成如果有神圣盾标记,则将伤害变成0。
+3. 免疫领域、夹击、阻击效果:在2.4.1之后,可以直接将flag:no_zone设为true来免疫领域效果,其他几个同理。
``` js
-// 检查领域、夹击、阻击事件
-control.prototype.checkBlock = function () {
- var x=core.getHeroLoc('x'), y=core.getHeroLoc('y');
- var damage = core.status.checkBlock.damage[x+core.bigmap.width*y];
- if (damage>0) {
- if (core.hasFlag("shield5")) damage = 0; // 如果存在神圣盾,则将伤害变成0
- core.status.hero.hp -= damage;
-
- // 检查阻击事件
- var snipe = [];
- var scan = {
- 'up': {'x': 0, 'y': -1},
- 'left': {'x': -1, 'y': 0},
- 'down': {'x': 0, 'y': 1},
- 'right': {'x': 1, 'y': 0}
- }
-// ... 下略
+// 同样写在道具的itemEffect中
+core.setFlag("no_zone", true); // 免疫领域
+core.setFlag("no_snipe", true); // 免疫阻击
+core.setFlag("no_laser", true); // 免疫激光
+core.setFlag("no_betweenAttack", true); // 免疫夹击
```
4. 如果有更高的需求,例如想让吸血效果变成一半,则还是在上面这些地方进行对应的修改即可。
@@ -375,6 +363,7 @@ control.prototype.useFly = function (need) {
```
修改时,请先把`null`改成空字符串`""`,然后再双击进行编辑。
+
+
## 自定义怪物属性
如果你对现有的怪物不满意,想自行添加怪物属性也是可以的。具体参见脚本编辑-getSpecials。
diff --git a/docs/start.md b/docs/start.md
index 46d5346d..6e330a4a 100644
--- a/docs/start.md
+++ b/docs/start.md
@@ -1,6 +1,6 @@
# 快速上手
-?> 目前版本**v2.4**,上次更新时间:* {docsify-updated} *
+?> 目前版本**v2.4.1**,上次更新时间:* {docsify-updated} *
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
@@ -201,6 +201,8 @@ HTML5的塔都是可以进行控制台调试的。
- `core.getItem('pickaxe', 2)` 令勇士获得两个破墙镐。
- `core.itemCount('pickaxe')` 返回勇士某个道具的个数。
- `core.hasItem('pickaxe')` 返回勇士是否拥有某个道具。等价于`core.itemCount('pickaxe')!=0`。
+- `core.getEquip(0)` 返回0号装备类型(武器)的当前装备的itemId,不存在则返回null
+- `core.hasEquip('sword1')` 返回某个装备当前是否处于被装备状态
- `core.setFlag('xxx', 1)` 设置某个flag/自定义变量的值。
- `core.getFlag('xxx', 10)` 获得某个flag/自定义变量的值;如果该项不存在(未被定义),则返回第二个参数的值。
- `core.hasFlag('xxx')` 返回是否存在某个变量且不为0。等价于`core.getFlag('xxx', 0)!=0`。
@@ -210,7 +212,6 @@ HTML5的塔都是可以进行控制台调试的。
- `core.getBlock(3, 5, 'MT1')` 获得当前地图上某一个块的信息。第三个参数为floorId,可省略表示当前楼层。
- `core.getBlockId(3, 5, 'MT1')` 获得当前地图上某一个点的图块ID。第三个参数为floorId,可省略表示当前楼层。
- `core.resetMap()` 重置当前层地图。**当修改地图后再读档,修改的地图不会立刻生效,此时可以使用resetMap来重置当前楼层的地图。**
-- `localStorage` 获得所有的存档数据。可以用 `core.getLocalStorage('save1')` 来具体获得某个存档。
- ……
更多API和详细参数介绍可参见[API列表](api)。
diff --git a/editor-mobile.html b/editor-mobile.html
index 5d5a7d8b..90b4810f 100644
--- a/editor-mobile.html
+++ b/editor-mobile.html
@@ -88,7 +88,7 @@
-
+
@@ -264,7 +264,7 @@
-
+
@@ -236,7 +236,7 @@