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) {