diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4
index 4fc0c32f..48e10939 100644
--- a/_server/blockly/MotaAction.g4
+++ b/_server/blockly/MotaAction.g4
@@ -1000,7 +1000,7 @@ function_s
/* function_s
-tooltip : function: 自定义JS脚本\n可以双击进行多行编辑,常见可能会被用到的系统API请参见文档的附录
+tooltip : 可双击多行编辑,请勿使用异步代码。常见API参见文档附录。
helpUrl : https://ckcz123.github.io/mota-js/#/event?id=function%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89js%E8%84%9A%E6%9C%AC
default : ["alert(core.getStatus(\"atk\"));"]
colour : this.dataColor
@@ -1385,8 +1385,7 @@ ActionParser.prototype.parseAction = function() {
break;
case "tip":
this.next = MotaActionBlocks['tip_s'].xmlText([
- data.data,this.next]);
- this.parseAction();
+ data.text,this.next]);
break;
case "show": // 显示
if (!(data.loc[0] instanceof Array))
diff --git a/_server/data.comment.js b/_server/data.comment.js
index 65db31e4..d431715b 100644
--- a/_server/data.comment.js
+++ b/_server/data.comment.js
@@ -415,6 +415,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"_bool": "bool",
"_data": "是否允许等级提升(进阶);如果上面enableExperience为false,则此项恒视为false"
},
+ "enableKeys": {
+ "_leaf": true,
+ "_type": "checkbox",
+ "_bool": "bool",
+ "_data": "是否在状态栏显示三色钥匙数量"
+ },
"enableDebuff": {
"_leaf": true,
"_type": "checkbox",
diff --git a/_server/editor_file.js b/_server/editor_file.js
index 711a1bb1..82247ee0 100644
--- a/_server/editor_file.js
+++ b/_server/editor_file.js
@@ -104,6 +104,7 @@ editor_file = function (editor, callback) {
}
datastr = datastr.concat(['\n}']);
datastr = datastr.join('');
+ alertWhenCompress();
fs.writeFile(filename, encode(datastr), 'base64', function (err, data) {
callback(err);
});
@@ -717,9 +718,17 @@ editor_file = function (editor, callback) {
}))
}
+ var alertWhenCompress = function(){
+ if(editor.useCompress===true){
+ editor.useCompress=null;
+ setTimeout("alert('当前游戏使用的是压缩文件,修改完成后请重新压缩')",1000)
+ }
+ }
+
var saveSetting = function (file, actionList, callback) {
//console.log(file);
//console.log(actionList);
+ alertWhenCompress();
if (file == 'icons') {
actionList.forEach(function (value) {
diff --git a/_server/fs.js b/_server/fs.js
index 59bd1441..c95065d3 100644
--- a/_server/fs.js
+++ b/_server/fs.js
@@ -2,37 +2,44 @@
fs = {};
+ var _isset = function (val) {
+ if (val == undefined || val == null || (typeof val=='number' && isNaN(val))) {
+ return false;
+ }
+ return true
+ }
+
var _http = function (type, url, formData, success, error, mimeType, responseType) {
var xhr = new XMLHttpRequest();
xhr.open(type, url, true);
- if (core.isset(mimeType))
+ if (_isset(mimeType))
xhr.overrideMimeType(mimeType);
- if (core.isset(responseType))
+ if (_isset(responseType))
xhr.responseType = responseType;
xhr.onload = function(e) {
if (xhr.status==200) {
- if (core.isset(success)) {
+ if (_isset(success)) {
success(xhr.response);
}
}
else {
- if (core.isset(error))
+ if (_isset(error))
error("HTTP "+xhr.status);
}
};
xhr.onabort = function () {
- if (core.isset(error))
+ if (_isset(error))
error("Abort");
}
xhr.ontimeout = function() {
- if (core.isset(error))
+ if (_isset(error))
error("Timeout");
}
xhr.onerror = function() {
- if (core.isset(error))
+ if (_isset(error))
error("Error on Connection");
}
- if (core.isset(formData))
+ if (_isset(formData))
xhr.send(formData);
else xhr.send();
}
diff --git a/docs/api.md b/docs/api.md
index fbd09055..92bc289b 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -43,7 +43,8 @@ core.material.items
core.debug()
-将攻防设置为10000,近似于无敌模式。
+开启调试模式。此模式下可以按Ctrl键进行穿墙,并忽略一切事件。
+此模式下不可回放录像和上传成绩。
core.updateStatusBar()
@@ -312,27 +313,21 @@ core.enemys.getExtraDamage(enemyId)
core.enemys.nextCriticals(enemyId, number)
-返回接下来number个该怪物的临界。列表每一项类似 "x:y" 表示临界值为x,该临界减伤为y。
+返回一个列表,为接下来number(可忽略,默认为1)个该怪物的临界值和临界减伤。
+列表每一项类似 [x,y] 表示临界值为x,且临界减伤为y。
+如果无临界值,则返回空列表。
-core.enemys.getCritical(enemyId)
-返回怪物的下一个临界值。无临界(如坚固、魔防等)返回'???'。
+core.enemys.getDefDamage(enemyId, k)
+获得k(可忽略,默认为1)防减伤值。
-core.enemys.getCriticalDamage(enemyId)
-获得怪物的下一个临界减伤。
-
-
-core.enemys.getDefDamage(enemyId)
-获得一防减伤值。
-
-
-core.enemys.getDamageInfo(enemyId, hero_hp, hero_atk, hero_def, hero_mdef)
+core.enemys.getDamageInfo(enemy, hero_hp, hero_atk, hero_def, hero_mdef)
获得实际战斗信息,比如伤害,回合数,每回合伤害等等。
此函数是实际战斗过程的计算。
-core.enemys.calDamage(enemyId, hero_hp, hero_atk, hero_def, hero_mdef)
+core.enemys.calDamage(enemy, hero_hp, hero_atk, hero_def, hero_mdef)
计算战斗伤害;实际返回的是上面getDamageInfo中伤害的数值。
@@ -371,6 +366,10 @@ core.events.canUseQuickShop(shopId)
当前能否使用某个快捷商店
+core.events.setHeroIcon(name)
+设置勇士行走图
+
+
========== core.items.XXX 和道具相关的函数 ==========
items.js将处理和道具相关的内容,比如道具的使用,获取和删除等等。
diff --git a/docs/element.md b/docs/element.md
index 11816adf..f17aa927 100644
--- a/docs/element.md
+++ b/docs/element.md
@@ -30,10 +30,32 @@
本塔支持6种门,黄蓝红绿铁花。前五种门需要有对应的钥匙打开,花门只能通过调用`openDoor`事件进行打开。
-本塔支持暗墙,但是暗墙也必须通过`openDoor`事件开启。例如,样板2层的小偷事件,就是可以打开一个暗墙的。
-
开门后可触发该层的`afterOpenDoor`事件,有关事件的详细介绍请参见第四章。
+## 暗墙
+
+本塔支持暗墙。
+
+要制作一个暗墙非常简单:在该点直接放一个普通墙壁,然后事件写“开门”,坐标为该点就行。
+
+``` js
+// 该点画一个普通的墙壁,比如`yellowWall`
+
+// 在该点的事件events中:
+"x,y": [
+ {"type": "openDoor", "loc": [x,y]} // 直接使用开门事件即可。
+]
+```
+
+系统会自动调用animates中的开暗墙动画。
+
+目前只有如下ID支持以这种方式开门:
+
+``` text
+yellowDoor, blueDoor, redDoor, greenDoor, specialDoor, steelDoor,
+yellowWall, blueWall, whiteWall, lava, star
+```
+
## 怪物
本塔支持的怪物列表参见`project/enemys.js`。其与images目录下的`enemys.png`素材按顺序一一对应。
diff --git a/docs/event.md b/docs/event.md
index 7fe90b60..b1559bcc 100644
--- a/docs/event.md
+++ b/docs/event.md
@@ -1513,7 +1513,7 @@ core.insertAction([
而在我们的存档中,是不会对怪物数据进行存储的,只会存各个变量和Flag,因此我们需要在读档后根据变量或Flag来调整怪物数据。
-我们可以在functions.js中的`afterLoadData`进行处理。
+我们可以在脚本编辑中的`afterLoadData`进行处理。
``` js
////// 读档事件后,载入事件前,可以执行的操作 //////
@@ -1576,7 +1576,7 @@ core.insertAction([
// effect也允许写一个function,代表本次升级将会执行的操作,比如可以显示一段提示文字,或者触发一个事件
{"need": 40, "effect": function () {
- core.drawText("恭喜升级!");
+ core.drawTip("恭喜升级!");
core.status.hero.hp *= 2;
core.status.hero.atk += 100;
core.status.hero.def += 100;
diff --git a/docs/personalization.md b/docs/personalization.md
index 3791e943..91993245 100644
--- a/docs/personalization.md
+++ b/docs/personalization.md
@@ -582,7 +582,7 @@ core.statusBar.mana.style.fontStyle = 'normal'; // 这一行会取消斜体。
我们可以在魔力那一行显示当前值和最大值:
``` js
-core.setStatus('mana', Math.min(core.getStatus('mana'), core.getStatus('manaMax')); // 如果魔力存在上限,则不能超过其上限值
+core.setStatus('mana', Math.min(core.getStatus('mana'), core.getStatus('manaMax'))); // 如果魔力存在上限,则不能超过其上限值
core.statusBar.mana.innerHTML = core.getStatus('mana') + '/' + core.getStatus('manaMax', 0); // 显示比如 6/30 这样
```
@@ -676,13 +676,13 @@ if (core.getFlag('skill', 0)==1) { // 开启了技能1
你只需要如下几步来达到多角色的效果。
-1. 每个勇士弄一张行走图。相关信息参见[自定义事件:setHeroIcon](event#setHeroIcon:更改角色行走图)。
+1. 每个角色弄一张行走图。相关信息参见[自定义事件:setHeroIcon](event#setHeroIcon:更改角色行走图)。
2. [覆盖楼传事件](#覆盖楼传事件),这样可以通过点工具栏的楼层传送按钮来切换角色。当然你也完全可以自己写一个道具,或[自定义快捷键](#自定义快捷键)来进行绑定。
3. 在脚本编辑的setInitData中初始化新角色的属性值。
```js
// 所有需要保存的内容;这些保存的内容不会多角色共用,在切换时会进行恢复。
// 你也可以自行新增或删除,比如不共用金币则可以加上"money"的初始化,不共用道具则可以加上"items"的初始化,
- // 多勇士共用hp的话则删除hp,等等。
+ // 多角色共用hp的话则删除hp,等等。总之,不共用的属性都在这里进行定义就好。
var initData = {
"floorId": "MT0", // 该角色楼层ID
"icon": "hero2.png", // 角色的行走图名称
diff --git a/docs/start.md b/docs/start.md
index 4fe8ecc9..180d2002 100644
--- a/docs/start.md
+++ b/docs/start.md
@@ -30,6 +30,8 @@
* “JS代码压缩工具”能对JS代码进行压缩,从而减少IO请求数和文件大小。
* “伤害和临界值计算器”是一个很便捷的小工具,能对怪物的伤害和临界值进行计算。
+!> **整个造塔过程中,启动服务必须全程处于开启状态!切不可手滑关闭,否则做的都是无用功!**
+
## 绘制地图
有两种绘制地图的方式:从头绘制地图;从RMXP中导入已有的地图。
@@ -186,7 +188,7 @@ HTML5的塔都是可以进行控制台调试的。
- `core.status.hero` 获得当前勇士状态信息。例如`core.status.hero.atk`就是当前勇士的攻击力数值。
- `core.material.enemys` 获得所有怪物信息。例如`core.material.enemys.greenSlime`就是获得绿色史莱姆的属性数据。
- `core.material.items` 获得所有道具的信息。例如`core.material.items.pickaxe`就是获得破墙镐的信息。
-- `core.debug()` 无敌模式;使用此命令将会把攻防都置为10000,方便进行乱撞。
+- `core.debug()` 开启调试模式;此模式下可以按住Ctrl键进行穿墙。
- `core.updateStatusBar()` 立刻更新状态栏和地图显伤。
- `core.setStatus('atk', 1000)` 直接设置勇士的某项属性。本句等价于 `core.status.hero.atk = 1000`。
- `core.getStatus('atk')` 返回勇士当前某项属性数值。本句等价于 `core.status.hero.atk`。
diff --git a/editor.html b/editor.html
index f83105d0..c21f70bd 100644
--- a/editor.html
+++ b/editor.html
@@ -429,6 +429,8 @@ if (location.protocol.indexOf("http")!=0) {