From 3b1c8b8a8095e673e54abc65c59c94e23dc72e5d Mon Sep 17 00:00:00 2001 From: oc Date: Sat, 30 Mar 2019 22:08:15 +0800 Subject: [PATCH 1/5] Fix animate async --- libs/actions.js | 4 ++-- libs/control.js | 23 ++++++++++------------- libs/events.js | 6 +++++- libs/maps.js | 16 ++++++---------- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index ad1c3c1d..90a42d46 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -717,7 +717,7 @@ actions.prototype._sys_keyDownCtrl = function () { } if (core.status.event.id == 'action' && core.status.event.data.type == 'sleep' && !core.status.event.data.current.noSkip) { - if (core.timeout.sleepTimeout && Object.keys(core.animateFrame.asyncId).length == 0) { + if (core.timeout.sleepTimeout && !core.hasAsync()) { clearTimeout(core.timeout.sleepTimeout); core.timeout.sleepTimeout = null; core.doAction(); @@ -752,7 +752,7 @@ actions.prototype._sys_longClick_lockControl = function (x, y) { // 长按可以跳过等待事件 if (core.status.event.id == 'action' && core.status.event.data.type == 'sleep' && !core.status.event.data.current.noSkip) { - if (core.timeout.sleepTimeout && Object.keys(core.animateFrame.asyncId).length == 0) { + if (core.timeout.sleepTimeout && !core.hasAsync()) { clearTimeout(core.timeout.sleepTimeout); core.timeout.sleepTimeout = null; core.doAction(); diff --git a/libs/control.js b/libs/control.js index fa0eaf5a..fce75b34 100644 --- a/libs/control.js +++ b/libs/control.js @@ -169,25 +169,22 @@ control.prototype._animationFrame_animate = function (timestamp) { if (timestamp - core.animateFrame.animateTime < 50 || !core.status.animateObjs || core.status.animateObjs.length == 0) return; core.clearMap('animate'); // 更新帧 - var animateObjs = []; - for (var i=0;i 0 || (core.status.animateObjs || []).length > 0; +} + ////// 跟随 ////// events.prototype.follow = function (name) { core.status.hero.followers = core.status.hero.followers || []; diff --git a/libs/maps.js b/libs/maps.js index 9d05a272..bc874952 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -1832,18 +1832,17 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { // 播放音效 core.playSound(animate.se); - var animateId = parseInt(Math.random() * 100000000); + var id = setTimeout(null); core.status.animateObjs.push({ + "id": id, "animate": animate, "centerX": centerX, "centerY": centerY, "index": 0, - "id": animateId, "callback": callback }); - core.animateFrame.asyncId[animateId] = true; - return animateId; + return id; } ////// 绘制动画的某一帧 ////// @@ -1881,7 +1880,6 @@ maps.prototype.stopAnimate = function (id, doCallback) { for (var i = 0; i < core.status.animateObjs.length; i++) { var obj = core.status.animateObjs[i]; if (obj.id == id) { - delete core.animateFrame.asyncId[obj.id]; if (doCallback) { (function (callback) { setTimeout(function () { @@ -1890,10 +1888,8 @@ maps.prototype.stopAnimate = function (id, doCallback) { })(obj.callback); } } - core.status.animateObjs.splice(i, 1); - if (core.status.animateObjs.length == 0) { - core.clearMap('animate'); - } - break; } + core.status.animateObjs = core.status.animateObjs.filter(function (x) { return x.id != id }); + if (core.status.animateObjs.length == 0) + core.clearMap('animate'); } From 48c1555e30a528010ff0f355fef211e9e769b38d Mon Sep 17 00:00:00 2001 From: oc Date: Sat, 30 Mar 2019 23:27:45 +0800 Subject: [PATCH 2/5] Add docs --- _docs/_sidebar.md | 1 - _docs/element.md | 91 +++++++++++------------------------------ _docs/img/keyboard.png | Bin 0 -> 54598 bytes _docs/index.md | 3 +- _docs/start.md | 19 ++++++++- 5 files changed, 43 insertions(+), 71 deletions(-) create mode 100644 _docs/img/keyboard.png diff --git a/_docs/_sidebar.md b/_docs/_sidebar.md index a7960592..039c2ea0 100644 --- a/_docs/_sidebar.md +++ b/_docs/_sidebar.md @@ -3,5 +3,4 @@ - [元件说明](element) - [事件](event) - [个性化](personalization) -- [V2.0版本介绍](V2.0) - [附录:API列表](api) diff --git a/_docs/element.md b/_docs/element.md index 8d352fef..4fed9b92 100644 --- a/_docs/element.md +++ b/_docs/element.md @@ -1,6 +1,6 @@ # 元件说明 -?> 目前版本**v2.5.5**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.6**,上次更新时间:* {docsify-updated} * 在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。 @@ -56,6 +56,8 @@ type为该装备的类型,必填,和上面装备栏一一对应。例如,0 atk/def/mdef为该装备分别增加的攻防魔防数值(支持负数);如果不加也可省略不写。 +从V2.6开始,可以拓展到任何勇士的属性,如hpmax, atk, def, mdef, experience等等;自行添加的属性包括攻速speed也能使用。 + animate为该装备的攻击动画,仅对type为0时有效。具体可参见[动画和天气系统](#动画和天气系统)。 percentage为该装备是否按比例增加属性。 @@ -151,49 +153,13 @@ yellowWall, blueWall, whiteWall 怪物的特殊属性所对应的数字(special)在脚本编辑中的`getSpecials`中定义,请勿对已有的属性进行修改。 -``` js -function() { - // 获得怪物的特殊属性,每一行定义一个特殊属性。 - // 分为三项,第一项为该特殊属性的数字,第二项为特殊属性的名字,第三项为特殊属性的描述 - // 可以直接写字符串,也可以写个function将怪物传进去 - return [ - [1, "先攻", "怪物首先攻击"], - [2, "魔攻", "怪物无视勇士的防御"], - [3, "坚固", "勇士每回合最多只能对怪物造成1点伤害"], - [4, "2连击", "怪物每回合攻击2次"], - [5, "3连击", "怪物每回合攻击3次"], - [6, function(enemy) {return (enemy.n||4)+"连击";}, function(enemy) {return "怪物每回合攻击"+(enemy.n||4)+"次";}], - [7, "破甲", "战斗前,怪物附加角色防御的"+Math.floor(100*core.values.breakArmor||0)+"%作为伤害"], - [8, "反击", "战斗时,怪物每回合附加角色攻击的"+Math.floor(100*core.values.counterAttack||0)+"%作为伤害,无视角色防御"], - [9, "净化", "战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"], - [10, "模仿", "怪物的攻防和勇士攻防相等"], - [11, "吸血", function (enemy) {return "战斗前,怪物首先吸取角色的"+Math.floor(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":"");}], - [12, "中毒", "战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"], - [13, "衰弱", "战斗后,勇士陷入衰弱状态,攻防暂时下降"+(core.values.weakValue>=1?core.values.weakValue+"点":parseInt(core.values.weakValue*100)+"%")], - [14, "诅咒", "战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"], - [15, "领域", function (enemy) {return "经过怪物周围"+(enemy.range||1)+"格时自动减生命"+(enemy.value||0)+"点";}], - [16, "夹击", "经过两只相同的怪物中间,勇士生命值变成一半"], - [17, "仇恨", "战斗前,怪物附加之前积累的仇恨值作为伤害"+(core.flags.hatredDecrease?";战斗后,释放一半的仇恨值":"")+"。(每杀死一个怪物获得"+(core.values.hatred||0)+"点仇恨值)"], - [18, "阻击", function (enemy) {return "经过怪物的十字领域时自动减生命"+(enemy.value||0)+"点,同时怪物后退一格";}], - [19, "自爆", "战斗后勇士的生命值变成1"], - [20, "无敌", "勇士无法打败怪物,除非拥有十字架"], - [21, "退化", function (enemy) {return "战斗后勇士永久下降"+(enemy.atkValue||0)+"点攻击和"+(enemy.defValue||0)+"点防御";}], - [22, "固伤", function (enemy) {return "战斗前,怪物对勇士造成"+(enemy.damage||0)+"点固定伤害,无视勇士魔防。";}], - [23, "重生", "怪物被击败后,角色转换楼层则怪物将再次出现"], - [24, "激光", function (enemy) {return "经过怪物同行或同列时自动减生命"+(enemy.value||0)+"点";}] - ]; -} -``` - 多属性可采用数组的写法,比如`'special': [1,3]`视为同时拥有先攻和坚固属性;`'special': [5,10,14,18]`视为拥有3连击、魔防、诅咒、阻击四个属性。 -怪物可以负伤,在`data.js`的全局变量`enableNegativeDamage`中指定。 - -下面的`getSpecialHint`函数则给定了每个特殊属性的详细描述。这个描述将在怪物手册中看到。 +怪物可以负伤,在全塔属性的全局变量`enableNegativeDamage`中指定。 打败怪物后可以进行加点操作。有关加点塔的制作可参见[加点事件](event#加点事件)。 -如果`data.js`中的enableExperience为false,即不启用经验的话,怪物手册里将不显示怪物的经验值,打败怪物也不获得任何经验。 +如果全塔属性中的enableExperience为false,即不启用经验的话,怪物手册里将不显示怪物的经验值,打败怪物也不获得任何经验。 拿到幸运金币后,打怪获得的金币将翻倍。 @@ -286,16 +252,12 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数 ## 路障,楼梯,传送门 -血网的伤害数值、中毒后每步伤害数值、衰弱时暂时攻防下降的数值,都在 `data.js` 的values内定义。 +血网的伤害数值、中毒后每步伤害数值、衰弱时暂时攻防下降的数值,都在全塔属性的values内定义。 路障同样会尽量被自动寻路绕过。 有关楼梯和传送门,必须在该层样板的changeFloor里指定传送点的目标。 -![楼层转换](./img/changefloor.png) - -!> **请注意这里的`"x,y"`代表该点的横坐标为x,纵坐标为y;即从左到右第x列,从上到下的第y行(从0开始计算)。如(6,0)代表最上面一行的正中间一列。** - floorId指定的是目标楼层的唯一标识符(ID)。 也可以写`"floorId": ":before"`和`"floorId": ":next"`表示上一楼和下一楼。 @@ -347,7 +309,7 @@ floorId指定的是目标楼层的唯一标识符(ID)。 从V2.4开始,H5魔塔开始支持大地图。 -大地图在创建时可以指定宽高,要求**宽和高都不得小于13,且宽高之积不超过1000**。 +大地图在创建时可以指定宽高,要求**宽和高都不得小于13(15x15版本则是不小于15),且宽高之积不超过1000**。 大地图一旦创建成功则不得修改宽高数值。 @@ -355,13 +317,12 @@ floorId指定的是目标楼层的唯一标识符(ID)。 现在我们的H5魔塔支持播放动画,也支持天气系统了。 -要播放动画,你需要先使用“RM动画导出器”将动画导出,放在animates目录下,然后再data.js中定义。 +要播放动画,你需要先使用“RM动画导出器”将动画导出,放在animates目录下,然后在全塔属性的animates中定义。 ``` js -"animates": [// 在此存放所有可能使用的动画,必须是animate格式,在这里不写后缀名 - // 动画必须放在animates目录下;文件名不能使用中文,不能带空格或特殊字符 - "hand", "sword", "zone", "yongchang", "thunder" // 根据需求自行添加 -] +// 在此存放所有可能使用的动画,必须是animate格式,在这里不写后缀名 +// 动画必须放在animates目录下;文件名不能使用中文,不能带空格或特殊字符 +"animates": ["hand", "sword", "zone", "yongchang", "thunder"] ``` !> 动画必须是animate格式,名称不能使用中文,不能带空格或特殊字符。 @@ -376,9 +337,9 @@ floorId指定的是目标楼层的唯一标识符(ID)。 !> 播放录像时,将默认忽略所有动画。 -目前天气系统只支持雨和雪两种天气。 +目前天气系统支持雨和雪和雾两种天气。 -在每层楼的剧本文件里存在一个weather选项,表示该层楼的默认天气。 +在每层楼的楼层属性中存在一个weather选项,表示该层楼的默认天气。 ``` js // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain","snow"或"fog"代表雨雪雾,第二项为1-10之间的数代表强度。 @@ -394,24 +355,18 @@ floorId指定的是目标楼层的唯一标识符(ID)。 要播放音乐和音效,你需要将对应的文件放在sounds目录下,然后在全塔属性中进行定义 ``` js -"bgms": [ // 在此存放所有的bgm,和文件名一致。 - // 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好 - 'bgm.mp3' -]; -"sounds": [ // 在此存放所有的SE,和文件名一致 - // 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好 - 'floor.mp3', 'attack.mp3', 'door.mp3', 'item.mp3', 'zone.mp3' -] +// 在此存放所有的bgm,和文件名一致。 +// 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好 +"bgms": ["bgm.mp3"] + +// 在此存放所有的SE,和文件名一致 +"sounds": ["floor.mp3", "attack.mp3", "door.mp3", "item.mp3", "zone.mp3"] ``` !> 音频名不能使用中文,不能带空格或特殊字符。 -目前BGM支持主流的音乐格式,如mp3, ogg,格式等。不支持mid格式的播放。 - 定义完毕后,我们可以调用`playBgm`/`playSound`事件来播放对应的音乐/音效,有关事件的详细介绍请参见[事件](event)。 **另外,考虑到用户的流量问题,将遵循如下规则:** @@ -443,7 +398,7 @@ HTML5魔塔一大亮点就是存在录像系统,可以很方便进行录像回 录像的回放主要有两种方式: 1. 保存成的录像文件(.h5route文件):在标题界面点录像回放,再选择文件即可。 -2. 游戏过程中时的当前录像:随时按R可以进行回放;手机端则长按任何位置3秒以上调出虚拟键盘,再按R。 +2. 游戏过程中时的当前录像:随时按R可以进行回放;手机端则可调出虚拟键盘,再按R。 录像播放过程中,可以进行如下操作: @@ -474,6 +429,9 @@ HTML5魔塔一大亮点就是存在录像系统,可以很方便进行录像回 ## 操作说明 +![](img/keyboard.png) + +   diff --git a/_docs/img/keyboard.png b/_docs/img/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b9d2412fab08efa3397e4e09b7bdcdc915f79e GIT binary patch literal 54598 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 a==ki|Rk||P`-|>BC+o7c1Ej^$FY!OF+#~-0 literal 0 HcmV?d00001 diff --git a/_docs/index.md b/_docs/index.md index cb6a896c..d2f290e2 100644 --- a/_docs/index.md +++ b/_docs/index.md @@ -1,11 +1,10 @@ # HTML5 魔塔样板说明文档 -?> 目前版本**v2.5.5**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.6**,上次更新时间:* {docsify-updated} * 众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。 但是,现在我们有了HTML5。 HTML5的画布(canvas)以及它被Android/iOS内置浏览器所支持的特性,可以让我们做出真正意义上的全平台覆盖的魔塔。 -事实上,在贴吧的试水发布也证明了,H5魔塔确实是可以成功的。两部即使是复刻的魔塔也受到了不少人的追捧,其流畅的手感和全平台支持的特性,也让很多没办法打开电脑的人爱不释手。 然而,一般而言使用非RMXP制作魔塔往往需要一定的编程技术,HTML5魔塔自然也不例外。但是,为了能让大家更加注重于“做塔”本身,而不用考虑做塔以外的各种脚本问题,我特意制作了这样一部HTML5的魔塔样板。 diff --git a/_docs/start.md b/_docs/start.md index a68ac244..004ea21f 100644 --- a/_docs/start.md +++ b/_docs/start.md @@ -1,6 +1,6 @@ # 快速上手 -?> 目前版本**v2.5.5**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.6**,上次更新时间:* {docsify-updated} * 在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔! @@ -28,6 +28,7 @@ * “地图编辑器”允许你以可视化的方式进行编辑地图。 * “便捷PS工具”能让你很方便的对自定义素材进行添加。参见[自定义素材](personalization#自定义素材)。 * “地图生成器”能让你从已有的截图(如RMXP项目)中立刻生成可被本样板识别的地图数据。 +* “怪物数据导出”能让你从RMXP中导出怪物数据而被H5魔塔使用。 * “RM动画导出器”能让你从RMXP中导出动画而被H5魔塔使用。 * “JS代码压缩工具”能对JS代码进行压缩,从而减少IO请求数和文件大小。 * “伤害和临界值计算器”是一个很便捷的小工具,能对怪物的伤害和临界值进行计算。 @@ -54,6 +55,8 @@ ### 从RMXP导入已有的地图 +!> 注:现在已经不推荐此方法,如需从RM刻塔请使用 [RM转H5刻塔器使用教程](https://www.bilibili.com/video/av43125840) 进行操作。 + 如果我们想复刻一个现有的,已经被RMXP所制作的塔,也有很便捷的方式,那就是用到我们的“地图生成器”。 首先,我们打开RMXP和对应的项目,可以看到它的地图。 @@ -176,7 +179,7 @@ 之后刷新编辑器即可。 -对于怪物和道具,我们也可以进行自动注册,只需要点击“自动注册”按钮,将对该栏下所有未注册的素材进行自动注册(自动分配ID和数字)。 +也可以进行自动注册,只需要点击“自动注册”按钮,将对该栏下所有未注册的素材进行自动注册(自动分配ID和数字)。 素材注册完毕后,即可在游戏中正常使用,也可以被地图生成器所识别(需要重开地图生成器)。 @@ -230,6 +233,18 @@ HTML5的塔都是可以进行控制台调试的。 更多API和详细参数介绍可参见[API列表](api)。 +## 编辑器的基本操作 + +- **Alt+0~9, Ctrl+0~9** 保存和读取当前选中图块 +- **W/A/S/D** 移动大地图 +- **Ctrl+Z** 撤销上次绘图 +- **Ctrl+Y** 重做上次绘图 +- **PgUp/PgDn** 切换楼层 +- **Ctrl+S** 保存事件编辑器/脚本编辑器 +- **地图上单击** 选中该点 +- **地图上双击** 选中该点图块 +- **地图上右键** 弹出菜单栏,包括选中、复制、清除等操作 +- **事件编辑器中Ctrl+C, Ctrl+X, 右键等** 执行相应操作 ## 报错处理 From 8aca0760c090536d05dbf924840e65bcd2e1b67d Mon Sep 17 00:00:00 2001 From: oc Date: Sun, 31 Mar 2019 00:22:26 +0800 Subject: [PATCH 3/5] commonEventShop --- _server/MotaAction.g4 | 48 ++++++++++++++++++++++++-------------- _server/editor_blockly.js | 1 + libs/actions.js | 49 +++++++++++---------------------------- libs/control.js | 17 +++++--------- libs/events.js | 49 +++++++++++++-------------------------- libs/ui.js | 18 +++++--------- libs/utils.js | 7 +----- project/data.js | 6 ++--- 8 files changed, 77 insertions(+), 118 deletions(-) diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 1fa52eba..bb3e0f44 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -85,13 +85,25 @@ shopcommonevent tooltip : 全局商店, 执行一个公共事件 helpUrl : https://h5mota.com/games/template/docs/#/ default : ["shop1","回收钥匙商店",false,"回收钥匙商店",""] +if (EvalString_2) { + if (EvalString_2.indexOf('"')>=0) + throw new Error('请勿在此处使用双引号!尝试使用单引号吧~'); + // 检查是不是数组 + try { + EvalString_2 = JSON.parse(EvalString_2.replace(/'/g, '"')); + if (!(EvalString_2 instanceof Array)) throw new Error(); + } + catch (e) { + throw new Error('参数列表必须是个有效的数组!'); + } +} var code = { 'id': IdString_0, 'textInList': EvalString_0, 'mustEnable': Bool_0, - 'commonEvent': EvalString_1, - 'args': EvalString_2 + 'commonEvent': EvalString_1 } +if (EvalString_2) code.args = EvalString_2; code=JSON.stringify(code,null,2)+',\n'; return code; */; @@ -322,7 +334,7 @@ action | callBook_s | callSave_s | callLoad_s - | unknow_s + | unknown_s | function_s | pass_s ; @@ -1746,17 +1758,19 @@ var code = '{"type": "callLoad"},\n'; return code; */; -unknow_s +unknown_s : '自定义事件' BGNL? RawEvalString -/* unknow_s +/* unknown_s tooltip : 通过脚本自定义的事件类型, 以及编辑器不识别的事件类型 helpUrl : https://h5mota.com/games/template/docs/#/ -default : ['{"type":"eventType1"}'] +default : ['{"type":"test", "data": "这是自定义的参数"}'] colour : this.dataColor -var tempobj={}; -eval("tempobj='"+RawEvalString_0+"'"); -var code = tempobj +',\n'; +try { + var tempobj = JSON.parse(RawEvalString_0); +} catch (e) {throw new Error("不合法的JSON格式!");} +if (!tempobj.type) throw new Error("自定义事件需要一个type:xxx"); +var code = JSON.stringify(tempobj) +',\n'; return code; */; @@ -2148,8 +2162,13 @@ ActionParser.prototype.parse = function (obj,type) { ]); } var buildcommentevent = function(obj,parser,next){ + if (obj.args instanceof Array) { + try { obj.args = JSON.stringify(obj.args).replace(/"/g, "'"); } + catch (e) {obj.args = '';} + } + else obj.args = null; return MotaActionBlocks['shopcommonevent'].xmlText([ - obj.id,parser.EvalString(obj.textInList),obj.mustEnable,parser.EvalString(obj.commonEvent),parser.EvalString(obj.args),next + obj.id,parser.EvalString(obj.textInList),obj.mustEnable,parser.EvalString(obj.commonEvent),obj.args,next ]); } var next=null; @@ -2651,13 +2670,8 @@ ActionParser.prototype.parseAction = function() { case "animateImage": // 兼容 animateImage break; default: - var rawdata = JSON.stringify(data,function(k,v){ - if(typeof(v)=='string')return v.split('\n').join('\\n'); - else return v; - },2); - rawdata=rawdata.split('\n').join('\\n'); - this.next = MotaActionBlocks['unknow_s'].xmlText([ - rawdata,this.next]); + this.next = MotaActionBlocks['unknown_s'].xmlText([ + JSON.stringify(data),this.next]); } this.parseAction(); return; diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 92ecfee2..5aca5463 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -159,6 +159,7 @@ editor_blockly = function () { ], '原生脚本':[ MotaActionBlocks['function_s'].xmlText(), + MotaActionBlocks['unknown_s'].xmlText(), ], '值块':[ MotaActionBlocks['setValue_s'].xmlText([ diff --git a/libs/actions.js b/libs/actions.js index 90a42d46..917af40f 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1198,35 +1198,21 @@ actions.prototype._keyUpShop = function (keycode) { ////// 快捷商店界面时的点击操作 ////// actions.prototype._clickQuickShop = function (x, y) { - var keys = []; - if (core.flags.quickCommonEvents) { - keys = core.getFlag("__commonEventList__", []); - } - else { - keys = Object.keys(core.status.shops).filter(function (shopId) { - return core.status.shops[shopId].visited || !core.status.shops[shopId].mustEnable - }); - } + var keys = Object.keys(core.status.shops).filter(function (shopId) { + return core.status.shops[shopId].visited || !core.status.shops[shopId].mustEnable + }); if (x >= this.CHOICES_LEFT && x <= this.CHOICES_RIGHT) { var topIndex = this.HSIZE - parseInt(keys.length / 2); if (y >= topIndex && y < topIndex + keys.length) { - if (core.flags.quickCommonEvents) { - var name = keys[y - topIndex]; - core.ui.closePanel(); - core.status.route.push("common:" + core.encodeBase64(name)); - core.insertAction(name); - } - else { - var reason = core.events.canUseQuickShop(keys[y - topIndex]); - if (!core.flags.enableDisabledShop && reason) { - core.drawText(reason); - return; - } - core.events.openShop(keys[y - topIndex], true); - if (core.status.event.id == 'shop') - core.status.event.data.fromList = true; + var reason = core.events.canUseQuickShop(keys[y - topIndex]); + if (!core.flags.enableDisabledShop && reason) { + core.drawText(reason); + return; } + core.events.openShop(keys[y - topIndex], true); + if (core.status.event.id == 'shop') + core.status.event.data.fromList = true; } // 离开 else if (y == topIndex + keys.length) @@ -1240,17 +1226,10 @@ actions.prototype._keyUpQuickShop = function (keycode) { core.ui.closePanel(); return; } - var length = 0; - if (core.flags.quickCommonEvents) { - length = core.getFlag("__commonEventList__", []).length; - } - else { - var shopList = core.status.shops, keys = Object.keys(shopList).filter(function (shopId) { - return shopList[shopId].visited || !shopList[shopId].mustEnable - }); - length = keys.length; - } - this._selectChoices(length + 1, keycode, this._clickQuickShop); + var keys = Object.keys(core.status.shops).filter(function (shopId) { + return core.status.shops[shopId].visited || !core.status.shops[shopId].mustEnable + }); + this._selectChoices(keys.length + 1, keycode, this._clickQuickShop); return; } diff --git a/libs/control.js b/libs/control.js index fce75b34..7a1de28b 100644 --- a/libs/control.js +++ b/libs/control.js @@ -33,7 +33,6 @@ control.prototype._init = function () { this.registerReplayAction("fly", this._replayAction_fly); this.registerReplayAction("shop", this._replayAction_shop); this.registerReplayAction("turn", this._replayAction_turn); - this.registerReplayAction("common", this._replayAction_common); this.registerReplayAction("getNext", this._replayAction_getNext); this.registerReplayAction("moveDirectly", this._replayAction_moveDirectly); this.registerReplayAction("key", this._replayAction_key); @@ -1412,6 +1411,12 @@ control.prototype._replayAction_shop = function (action) { if (selections.length == 0) return false; var shop=core.status.shops[shopId]; if (!shop || !shop.visited) return false; + // --- 判定commonEvent + if (shop.commonEvent) { + core.openShop(shopId, false); + setTimeout(core.replay); + return true; + } var choices = shop.choices; var topIndex = core.__HALF_SIZE__ - parseInt(choices.length / 2); core.status.event.selection = parseInt(selections.shift()); @@ -1443,16 +1448,6 @@ control.prototype._replayAction_turn = function (action) { return true; } -control.prototype._replayAction_common = function (action) { - if (action.indexOf("common:") != 0) return false; - var name = core.decodeBase64(action.substring(7)); - if (core.getFlag("__commonEventList__").indexOf(name) == -1) return false; - core.status.route.push(action); - core.insertAction(name); - setTimeout(core.replay); - return true; -} - control.prototype._replayAction_getNext = function (action) { if (action != "getNext") return false; if (!core.getNextItem()) return false; diff --git a/libs/events.js b/libs/events.js index 0c60d6aa..768cc35d 100644 --- a/libs/events.js +++ b/libs/events.js @@ -806,10 +806,7 @@ events.prototype.insertAction = function (action, x, y, callback, addToLast) { // ------ 判定commonEvent var commonEvent = this.getCommonEvent(action); - if (commonEvent instanceof Array) { - this._addCommentEventToList(action, commonEvent); - action = commonEvent; - } + if (commonEvent instanceof Array) action = commonEvent; if (!action) return; if (core.status.event.id != 'action') { @@ -830,22 +827,6 @@ events.prototype.getCommonEvent = function (name) { return this.commonEvent[name] || null; } -events.prototype._addCommentEventToList = function (name, list) { - if (list == null) list = this.getCommonEvent(name); - if (!list || !core.flags.quickCommonEvents) return; - var addToList = false; - for (var x in list) { - if (list[x].type == 'addToList') { - addToList = true; - break; - } - } - if (!addToList) return; - var obj = core.getFlag("__commonEventList__", []); - if (obj.indexOf(name) == -1) obj.push(name); - core.setFlag("__commonEventList__", obj); -} - ////// 恢复一个事件 ////// events.prototype.recoverEvents = function (data) { if (data) { @@ -1144,13 +1125,12 @@ events.prototype._action_useItem = function (data, x, y, prefix) { } events.prototype._action_openShop = function (data, x, y, prefix) { - if (core.isReplaying()) { // 正在播放录像,简单将visited置为true - core.status.shops[data.id].visited = true; - this.setEvents([]); - core.doAction(); - } - else + core.status.shops[data.id].visited = true; + this.setEvents([]); + if (!core.isReplaying()) this.openShop(data.id); + if (core.status.event.id == 'action') + core.doAction(); } events.prototype._action_disableShop = function (data, x, y, prefix) { @@ -1207,10 +1187,6 @@ events.prototype._action_insert = function (data, x, y, prefix) { core.doAction(); } -events.prototype._action_addToList = function (data, x, y, prefix) { - core.doAction(); -} - events.prototype._action_playBgm = function (data, x, y, prefix) { core.playBgm(data.name); core.doAction(); @@ -2109,9 +2085,9 @@ events.prototype.openShop = function (shopId, needVisited) { shop.times = shop.times || 0; if (shop.commonTimes) shop.times = core.getFlag('commonTimes', 0); if (needVisited && !shop.visited) { - if (!core.flags.enableDisabledShop) { - if (shop.times == 0) core.drawTip("该商店尚未开启"); - else core.drawTip("该商店已失效"); + if (!core.flags.enableDisabledShop || shop.commonEvent) { + if (shop.times == 0) core.drawTip("该项尚未开启"); + else core.drawTip("该项已失效"); return; } else { @@ -2119,6 +2095,13 @@ events.prototype.openShop = function (shopId, needVisited) { } } else shop.visited = true; + + // --- 商店 + if (shop.commonEvent) { + core.status.route.push("shop:"+shopId+":0"); + core.insertAction({"type": "insert", "name": shop.commonEvent, "args": shop.args}); + return; + } core.ui.drawShop(shopId); } diff --git a/libs/ui.js b/libs/ui.js index 7529f589..8a569922 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1118,18 +1118,12 @@ ui.prototype.drawSettings = function () { ////// 绘制快捷商店选择栏 ////// ui.prototype.drawQuickShop = function () { core.status.event.id = 'selectShop'; - var choices; - if (core.flags.quickCommonEvents) { - choices = core.clone(core.getFlag("__commonEventList__", [])); - } - else { - var shopList = core.status.shops, keys = Object.keys(shopList).filter(function (shopId) { - return shopList[shopId].visited || !shopList[shopId].mustEnable - }); - choices = keys.map(function (shopId) { - return {"text": shopList[shopId].textInList, "color": shopList[shopId].visited?null:"#999999"}; - }); - } + var shopList = core.status.shops, keys = Object.keys(shopList).filter(function (shopId) { + return shopList[shopId].visited || !shopList[shopId].mustEnable + }); + var choices = keys.map(function (shopId) { + return {"text": shopList[shopId].textInList, "color": shopList[shopId].visited?null:"#999999"}; + }); choices.push("返回游戏"); this.drawChoices(null, choices); } diff --git a/libs/utils.js b/libs/utils.js index 4dbd3e34..d3bac9d3 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -467,8 +467,6 @@ utils.prototype._encodeRoute_encodeOne = function (t) { return "P" + t.substring(6); else if (t.indexOf('input2:') == 0) return "Q" + t.substring(7) + ":"; - else if (t.indexOf('common:') == 0) - return "c" + t.substring(7) + ":"; else if (t == 'no') return 'N'; else if (t.indexOf('move:') == 0) @@ -527,7 +525,7 @@ utils.prototype._decodeRoute_number2id = function (number) { } utils.prototype._decodeRoute_decodeOne = function (decodeObj, c) { - var nxt = (c == 'I' || c == 'e' || c == 'F' || c == 'S' || c == 'Q' || c == 't' || c == 'c') ? + var nxt = (c == 'I' || c == 'e' || c == 'F' || c == 'S' || c == 'Q' || c == 't') ? this._decodeRoute_getString(decodeObj) : this._decodeRoute_getNumber(decodeObj); var mp = {"U": "up", "D": "down", "L": "left", "R": "right"}; @@ -572,9 +570,6 @@ utils.prototype._decodeRoute_decodeOne = function (decodeObj, c) { case "Q": decodeObj.ans.push("input2:" + nxt); break; - case "c": - decodeObj.ans.push("common:" + nxt); - break; case "N": decodeObj.ans.push("no"); break; diff --git a/project/data.js b/project/data.js index 5b612081..096e2dc6 100644 --- a/project/data.js +++ b/project/data.js @@ -303,10 +303,9 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = }, { "id": "keyShop1", - "textInList": "1F回收钥匙商店", + "textInList": "回收钥匙商店", "mustEnable": false, - "commonEvent": "回收钥匙商店", - "args": "" + "commonEvent": "回收钥匙商店" } ], "levelUp": [ @@ -408,7 +407,6 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "enableMoveDirectly": true, "enableDisabledShop": true, "disableShopOnDamage": false, - "quickCommonEvents": false, "checkConsole": false } } \ No newline at end of file From b3fb8cf98a71f075962431b348323522411c25ff Mon Sep 17 00:00:00 2001 From: oc Date: Sun, 31 Mar 2019 00:35:35 +0800 Subject: [PATCH 4/5] remove double click unknow_s --- _server/editor_blockly.js | 1 - 1 file changed, 1 deletion(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 5aca5463..595a55ff 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -589,7 +589,6 @@ function omitedcheckUpdateFunction(event) { 'showTextImage_s': 'EvalString_0', 'function_s': 'RawEvalString_0', 'shopsub': 'EvalString_3', - 'unknow_s': 'RawEvalString_0', } var f = b ? textStringDict[b.type] : null; if (f) { From fa5fa402407400b83a4e0c9bd3bfc94a79424caf Mon Sep 17 00:00:00 2001 From: oc Date: Sun, 31 Mar 2019 01:01:13 +0800 Subject: [PATCH 5/5] loadFloor --- libs/maps.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/maps.js b/libs/maps.js index bc874952..445fc113 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -30,12 +30,14 @@ maps.prototype.loadFloor = function (floorId, map) { map = {"map": map}; } var content = {}; + var notCopy = ["firstArrive", "eachArrive", "parallelDo", "map", "bgmap", "fgmap", + "events", "changeFloor", "afterBattle", "afterGetItem", "afterOpenDoor", "cannotMove"]; for (var name in floor) { - if (name != 'map' && name != 'bgmap' && name != 'fgmap' && floor[name] != null) + if (notCopy.indexOf(name) == -1 && floor[name] != null) content[name] = core.clone(floor[name]); } for (var name in map) { - if (name != 'map' && name != 'bgmap' && name != 'fgmap' && map[name] != null) + if (notCopy.indexOf(name) == -1 && map[name] != null) content[name] = core.clone(map[name]); } map = this.decompressMap(map.map, floorId);