From 52a04029b759bf0db3a24c80b1d53195e3625440 Mon Sep 17 00:00:00 2001 From: oc Date: Sun, 9 Dec 2018 22:10:02 +0800 Subject: [PATCH 01/34] 2.5.3 --- docs/V2.0.md | 2 +- docs/api.md | 2 +- docs/element.md | 2 +- docs/event.md | 2 +- docs/index.md | 2 +- docs/personalization.md | 2 +- docs/start.md | 2 +- main.js | 2 +- project/data.js | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/V2.0.md b/docs/V2.0.md index 908ca193..9c44dfa1 100644 --- a/docs/V2.0.md +++ b/docs/V2.0.md @@ -1,6 +1,6 @@ # V2.0版本介绍 -?> 目前版本**v2.5.2**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5.3**,上次更新时间:* {docsify-updated} * 目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。 diff --git a/docs/api.md b/docs/api.md index c1f9bc74..559f810a 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,6 +1,6 @@ # 附录: API列表 -?> 目前版本**v2.5.2**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5.3**,上次更新时间:* {docsify-updated} * **这里只列出所有可能会被造塔者用到的常用API,更多的有关内容请在代码内进行查询。** diff --git a/docs/element.md b/docs/element.md index 7ef586d3..807cacf4 100644 --- a/docs/element.md +++ b/docs/element.md @@ -1,6 +1,6 @@ # 元件说明 -?> 目前版本**v2.5.2**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5.3**,上次更新时间:* {docsify-updated} * 在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。 diff --git a/docs/event.md b/docs/event.md index 328c1900..f691e69a 100644 --- a/docs/event.md +++ b/docs/event.md @@ -1,6 +1,6 @@ # 事件 -?> 目前版本**v2.5.2**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5.3**,上次更新时间:* {docsify-updated} * 本章内将对样板所支持的事件进行介绍。 diff --git a/docs/index.md b/docs/index.md index f46c24e5..1689ac40 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # HTML5 魔塔样板说明文档 -?> 目前版本**v2.5.2**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5.3**,上次更新时间:* {docsify-updated} * 众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。 diff --git a/docs/personalization.md b/docs/personalization.md index 153ee029..330ea050 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -1,6 +1,6 @@ # 个性化 -?> 目前版本**v2.5.2**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5.3**,上次更新时间:* {docsify-updated} * 有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。 diff --git a/docs/start.md b/docs/start.md index 27a6b3c8..1b4bcd71 100644 --- a/docs/start.md +++ b/docs/start.md @@ -1,6 +1,6 @@ # 快速上手 -?> 目前版本**v2.5.2**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5.3**,上次更新时间:* {docsify-updated} * 在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔! diff --git a/main.js b/main.js index 0ea10df4..107ac52b 100644 --- a/main.js +++ b/main.js @@ -2,7 +2,7 @@ function main() { //------------------------ 用户修改内容 ------------------------// - this.version = "2.5.2"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 + this.version = "2.5.3"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 this.useCompress = false; // 是否使用压缩文件 // 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。 diff --git a/project/data.js b/project/data.js index 9498941c..592286c9 100644 --- a/project/data.js +++ b/project/data.js @@ -70,7 +70,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "firstData": { "title": "魔塔样板", "name": "template", - "version": "Ver 2.5.2", + "version": "Ver 2.5.3", "floorId": "sample0", "hero": { "name": "阳光", From f891cb1f3b4e4b442c7d2279697bd553d73c6546 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 10 Dec 2018 01:50:24 +0800 Subject: [PATCH 02/34] keyUp in replay --- libs/actions.js | 6 +++--- libs/control.js | 2 +- libs/core.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index 55212e0b..e4421355 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -192,12 +192,12 @@ actions.prototype.keyDown = function(keyCode) { } ////// 根据放开键的code来执行一系列操作 ////// -actions.prototype.keyUp = function(keyCode, altKey) { - if (core.isset(core.status.replay)&&core.status.replay.replaying +actions.prototype.keyUp = function(keyCode, altKey, fromReplay) { + if (!fromReplay && core.isset(core.status.replay)&&core.status.replay.replaying &&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0&&core.status.event.id!='viewMaps') return; if (core.status.lockControl) { - core.status.holdingKeys = []; + core.status.holdingKeys = [];g // 全键盘操作部分 if (core.status.event.id == 'text' && (keyCode==13 || keyCode==32 || keyCode==67)) { core.drawText(); diff --git a/libs/control.js b/libs/control.js index f3ae58b9..f29c0361 100644 --- a/libs/control.js +++ b/libs/control.js @@ -2130,7 +2130,7 @@ control.prototype.replay = function () { } } else if (action.indexOf('key:')==0) { - core.actions.keyUp(parseInt(action.substring(4)), true); + core.actions.keyUp(parseInt(action.substring(4)), false, true); core.replay(); return; } diff --git a/libs/core.js b/libs/core.js index 901b664c..b77b0288 100644 --- a/libs/core.js +++ b/libs/core.js @@ -428,8 +428,8 @@ core.prototype.keyDown = function(keyCode) { } ////// 根据放开键的code来执行一系列操作 ////// -core.prototype.keyUp = function(keyCode, altKey) { - return core.actions.keyUp(keyCode, altKey); +core.prototype.keyUp = function(keyCode, altKey, fromReplay) { + return core.actions.keyUp(keyCode, altKey, fromReplay); } ////// 点击(触摸)事件按下时 ////// From 96500c5dabc40f5831bfce11d0c708a528f4b099 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 10 Dec 2018 01:51:51 +0800 Subject: [PATCH 03/34] keyUp in replay --- libs/actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/actions.js b/libs/actions.js index e4421355..e51b297d 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -197,7 +197,7 @@ actions.prototype.keyUp = function(keyCode, altKey, fromReplay) { &&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0&&core.status.event.id!='viewMaps') return; if (core.status.lockControl) { - core.status.holdingKeys = [];g + core.status.holdingKeys = []; // 全键盘操作部分 if (core.status.event.id == 'text' && (keyCode==13 || keyCode==32 || keyCode==67)) { core.drawText(); From 3eecce4812b42d01e5c10077b47131e6c3a57af5 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 10 Dec 2018 10:20:43 +0800 Subject: [PATCH 04/34] Update docs --- docs/personalization.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/personalization.md b/docs/personalization.md index 330ea050..98cfa110 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -8,17 +8,17 @@ HTML5魔塔是使用画布(canvas)来绘制,存在若干个图层,它们之间有一个覆盖关系,后面的图层将覆盖前面的图层。 -所有图层从低往高依次如下: +所有图层从低往高依次如下:(加[B]的代表该层是大地图) -- bg:背景层;绘制背景图层素材bgmap,和背景贴图 -- event:事件层;所有事件(道具、墙壁、NPC、怪物等)都绘制在这一层进行处理 +- bg[B]:背景层;绘制背景图层素材bgmap,和背景贴图 +- event[B]:事件层;所有事件(道具、墙壁、NPC、怪物等)都绘制在这一层进行处理 - hero:勇士层;主要用来绘制勇士 -- event2:事件2层;本层主要用来绘制48x32的图片素材的上半部分(避免和勇士错位) -- fg:前景层;绘制前景图层素材fgmap,和前景贴图 -- damage:显伤层;主要用来绘制怪物显伤和领域显伤 -- animate:动画层;主要用来绘制动画。showImage事件绘制的图片也是在这一层。 -- weather:天气层;主要用来绘制天气(雨/雪) -- route:路线层;主要用来绘制勇士的行走路线图,也用来绘制图块的淡入/淡出效果,图块的移动等。 +- event2[B]:事件2层;本层主要用来绘制48x32的图片素材的上半部分(避免和勇士错位) +- fg[B]:前景层;绘制前景图层素材fgmap,和前景贴图 +- damage[B]:显伤层;主要用来绘制怪物显伤和领域显伤 +- animate:动画层;主要用来绘制动画。 +- weather:天气层;主要用来绘制天气(雨/雪/雾) +- route[B]:路线层;主要用来绘制勇士的行走路线图,也用来绘制图块的淡入/淡出效果,图块的移动等。 - curtain:色调层;用来控制当前楼层的画面色调 - image:图片层;主要用来绘制显示图片;该层之所以在curtain层上是为了可以在全黑时贴大头像图 - ui:UI层;用来绘制一切UI窗口,如剧情文本、怪物手册、楼传器、系统菜单等等 From fbacf6fe96aa0e28fc847c39c699a9eac8124bc9 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 10 Dec 2018 10:28:47 +0800 Subject: [PATCH 05/34] Update docs --- docs/personalization.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/personalization.md b/docs/personalization.md index 98cfa110..a3816fc6 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -10,15 +10,15 @@ HTML5魔塔是使用画布(canvas)来绘制,存在若干个图层,它们 所有图层从低往高依次如下:(加[B]的代表该层是大地图) -- bg[B]:背景层;绘制背景图层素材bgmap,和背景贴图 -- event[B]:事件层;所有事件(道具、墙壁、NPC、怪物等)都绘制在这一层进行处理 +- bg**[B]**:背景层;绘制背景图层素材bgmap,和背景贴图 +- event**[B]**:事件层;所有事件(道具、墙壁、NPC、怪物等)都绘制在这一层进行处理 - hero:勇士层;主要用来绘制勇士 -- event2[B]:事件2层;本层主要用来绘制48x32的图片素材的上半部分(避免和勇士错位) -- fg[B]:前景层;绘制前景图层素材fgmap,和前景贴图 -- damage[B]:显伤层;主要用来绘制怪物显伤和领域显伤 +- event2**[B]**:事件2层;本层主要用来绘制48x32的图片素材的上半部分(避免和勇士错位) +- fg**[B]**:前景层;绘制前景图层素材fgmap,和前景贴图 +- damage**[B]**:显伤层;主要用来绘制怪物显伤和领域显伤 - animate:动画层;主要用来绘制动画。 - weather:天气层;主要用来绘制天气(雨/雪/雾) -- route[B]:路线层;主要用来绘制勇士的行走路线图,也用来绘制图块的淡入/淡出效果,图块的移动等。 +- route**[B]**:路线层;主要用来绘制勇士的行走路线图,也用来绘制图块的淡入/淡出效果,图块的移动等。 - curtain:色调层;用来控制当前楼层的画面色调 - image:图片层;主要用来绘制显示图片;该层之所以在curtain层上是为了可以在全黑时贴大头像图 - ui:UI层;用来绘制一切UI窗口,如剧情文本、怪物手册、楼传器、系统菜单等等 @@ -351,10 +351,11 @@ function (enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId) { ``` js // 写在获得道具后事件 [ - {"type": "setValue", "name": "no_zone", "value": "true"}, // 免疫领域 - {"type": "setValue", "name": "no_snipe", "value": "true"}, // 免疫阻击 - {"type": "setValue", "name": "no_laser", "value": "true"}, // 免疫激光 - {"type": "setValue", "name": "no_betweenAttack", "value": "true"}, // 免疫夹击 + // 设置不同的flag可以分别无视对应的阻激夹域效果 + {"type": "setValue", "name": "flag:no_zone", "value": "true"}, // 免疫领域 + {"type": "setValue", "name": "flag:no_snipe", "value": "true"}, // 免疫阻击 + {"type": "setValue", "name": "flag:no_laser", "value": "true"}, // 免疫激光 + {"type": "setValue", "name": "flag:no_betweenAttack", "value": "true"}, // 免疫夹击 ] ``` 4. 如果有更高的需求,例如想让吸血效果变成一半,则还是在上面这些地方进行对应的修改即可。 @@ -620,7 +621,7 @@ this.statusBar = { }, 'icons': { // ...其他略 - 'speed': 24, // 图标的定义,这里对应的是icons.png中的索引 + 'speed': 37, // 图标的定义,这里对应的是icons.png中的索引 }, // ...其他略 'speed': document.getElementById('speed'), // 显示内容(数据)的定义 From 553db5d1dae8bbee3843e3bd5b9542c80ad5c069 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 10 Dec 2018 23:49:42 +0800 Subject: [PATCH 06/34] checkLvUp --- libs/events.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/events.js b/libs/events.js index e8166ec8..6f37b4d3 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1827,8 +1827,9 @@ events.prototype.checkLvUp = function () { if (core.status.hero.experience>=need) { // 升级 core.status.hero.lv++; - core.insertAction(core.firstData.levelUp[core.status.hero.lv-1].action); - this.checkLvUp(); + core.insertAction(core.firstData.levelUp[core.status.hero.lv-1].action, null, null, function() { + core.events.checkLvUp(); + }); } } From a6260d9edd3ae21695d826a7ef970d4818666fb4 Mon Sep 17 00:00:00 2001 From: oc Date: Tue, 11 Dec 2018 01:44:01 +0800 Subject: [PATCH 07/34] clear exp in levelUp --- _server/blockly/MotaAction.g4 | 9 +++++---- libs/events.js | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 09bde8b4..5f44aef1 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -50,15 +50,16 @@ return code; */; levelCase - : '需求' expression '称号' EvalString? BGNL? Newline action+ + : '需求' expression '称号' EvalString? '是否扣除经验' Bool BGNL? Newline action+ /* levelCase tooltip : 升级设定 helpUrl : https://h5mota.com/games/template/docs/#/event?id=%e7%bb%8f%e9%aa%8c%e5%8d%87%e7%ba%a7%ef%bc%88%e8%bf%9b%e9%98%b6%2f%e5%a2%83%e7%95%8c%e5%a1%94%ef%bc%89 -default : [0,"",null] +default : [0,"",false,null] colour : this.subColor -var code = '{"need": "'+expression_0+'", "title": "'+EvalString_0+'", "action": [\n'+action_0+']},\n'; +Bool_0 = Bool_0?', "clear": true':''; +var code = '{"need": "'+expression_0+'", "title": "'+EvalString_0+'"'+Bool_0+', "action": [\n'+action_0+']},\n'; return code; */; @@ -1832,7 +1833,7 @@ ActionParser.prototype.parse = function (obj,type) { var text_choices = null; for(var ii=obj.length-1,choice;choice=obj[ii];ii--) { text_choices=MotaActionBlocks['levelCase'].xmlText([ - MotaActionBlocks['evalString_e'].xmlText([choice.need]),choice.title,this.parseList(choice.action),text_choices]); + MotaActionBlocks['evalString_e'].xmlText([choice.need]),choice.title,choice.clear||false,this.parseList(choice.action),text_choices]); } return MotaActionBlocks['level_m'].xmlText([text_choices]); diff --git a/libs/events.js b/libs/events.js index 6f37b4d3..97fb8201 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1822,14 +1822,15 @@ events.prototype.checkLvUp = function () { if (!core.flags.enableLevelUp || !core.isset(core.firstData.levelUp) || core.status.hero.lv>=core.firstData.levelUp.length) return; // 计算下一个所需要的数值 - var need=core.calValue((core.firstData.levelUp[core.status.hero.lv]||{}).need); + var next = (core.firstData.levelUp[core.status.hero.lv]||{}); + var need = core.calValue(next.need); if (!core.isset(need)) return; if (core.status.hero.experience>=need) { // 升级 core.status.hero.lv++; - core.insertAction(core.firstData.levelUp[core.status.hero.lv-1].action, null, null, function() { - core.events.checkLvUp(); - }); + if (next.clear) core.status.hero.experience -= need; + core.insertAction(next.action); + this.checkLvUp(); } } From f297fc58f7fe42e75ac0e20d0c418576f09793da Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 11 Dec 2018 16:09:45 +0800 Subject: [PATCH 08/34] Fix vertical border color --- libs/control.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/control.js b/libs/control.js index f29c0361..3be65956 100644 --- a/libs/control.js +++ b/libs/control.js @@ -2896,11 +2896,11 @@ control.prototype.updateGlobalAttribute = function (name) { var border = '3px ' + attribute[name] + ' solid'; core.dom.statusBar.style.borderTop = border; core.dom.statusBar.style.borderLeft = border; - core.dom.statusBar.style.borderRight = core.domStyle.isVertical?'':border; + core.dom.statusBar.style.borderRight = core.domStyle.isVertical?border:''; core.dom.gameDraw.style.border = border; core.dom.toolBar.style.borderBottom = border; core.dom.toolBar.style.borderLeft = border; - core.dom.toolBar.style.borderRight = core.domStyle.isVertical?'':border; + core.dom.toolBar.style.borderRight = core.domStyle.isVertical?border:''; break; } case 'statusBarColor': From 0fc267be14cfade5ed0ff5cf78839e3cdfa4a166 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 11 Dec 2018 16:17:08 +0800 Subject: [PATCH 09/34] Update icons.png --- project/images/icons.png | Bin 25694 -> 25438 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/project/images/icons.png b/project/images/icons.png index c5a383c617a6b21df8fb0b916fc229b5579c1da3..ec1e2d4587c5bcea53f3151908601b303ec80e66 100644 GIT binary patch literal 25438 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 literal 25694 zcmaI7byOTdvo{PZEWuqCUEJN>VS_FbB)Cg(cXwSR5FCOh1W9mr4X(j8xVr>ip8I_F zocq^z=IrU|?dh7DlHXKMRmVV86);dqP~qUzo|4Szhblw?=Cw})X_>X`h$ToXqD7Z@4PQapXD8*ML z`=!_oyubqpSB`%Kbrp$emPX@ch({2kmswtCpjmGv`v0n zQ$#b}aE))X5L0Gy+&5e^ID?0eio_ig^erri z;ozidjvVnIczKRh)YOJNtKt)$Jq~F_#aL6Ijn)ht&n-7TMotgS%Sx{??sk%;JPGG6 z_blfI2u@B%1}^bX#5 zAV3_smUXFVw5F{ReMHc2#`=GKyp9(aJ^rzrV(E#Y_ zUE(DV1NWZ^2?@1RZtKlu0e+&QnNVhm=2^HYTELF~+F4Lfc!hCS-+^(D_j3-qA^7A5z6xOZU1=of&8mfByP4#tVbN(ayC7tqcFz4$KabhdldoD=Z8*0t%8Bn>SwaWfvm4JV0wB&r{?Bk3RSh%H} zVGF%`Z>gaHn!6CRlW|~*68>y!qZk9`M%?K3;OljQ&$&Sm?8MqYU~td`&BeGZMlNY! zdN9vS{-vfMSP?}YiJ&Q1@uW@T0HMkC>Pue?H9$oV-}AX-kCZ2xF{Up;^+yU-ElHM) z`l=#$PN6?du<m5HopX$m37Iy;lI4hGDC;>E!xQKkRrBgisTI zsEa=EzmEYh>~-?F!(m5U<_*3dR+D+|W1w=j;emLaAwXS`K?tBG@^H%wyye>eGPlPG z;*G19?@&VdSF1#$U~;$If%-sXjUY)z;~?>69iCd^6C!?Z|N5@OSQZM32kdva0@kJ| zibazb-~;`5Al=A-=pO&FEg z6-!2L-V|DDZ&mz1_fa3z)TjMhV8E5V_KM;5s=!uAsWRQrjs?Yu-xGi<*k`^(z2uhM zq&vR6Dj4a`*8GV^QJ_4He2C6PHm~3R&%eX%Q3QKclN9L01^iDp!u>~C#<*vS5wi>#y?C;Va&sNYg8=;YJE7YyWyTgRr0Iqr zgmtVyE5h9^A&fjcn;KrJj^JaQzt^6wYcW!bc(+i(dflF&0#;uX&l_sSW)VC^>9P$b zT?`=wWVm|U<+ea$`&Zlv%SpJjEiQ|IonJv}Hm?qUJ0=Q5=g1Xl2*Izi?4i>T{hTN( znTy;CC>b}B1VbqI7+|j?S<<2A#BB&DnlWtSK2!C}@8xsz;uuTePPadPZj{1v?#KIE z+8qnNunVpJCBU02*)Qwn_K5PT=v{fbxO}0(Uw=i3bzG91`f&lp7ln^?RFhThaoAy7 z=@7y+uTkLqk7s+J@^F4V!ke)4HNRtUFh`IRfbI~+t`lSFb^If?)i;d1dDGjQ*In|` z7pYEu8%Mih{~eh!6m-5Ofr>OB-CZ&P4$#5U<@?dALH!?e`M)mRTb^)c$llRO7%S5m z(Q{Pf9F7(4Ja|`RY@-~4N(S6p#6b3N^+Qbe zMf_5a7K5AGp;OJ{zW`w7gH~*7vtFv+O5AvNInxk?ev#d3g>kmzD@r({K6BE*-tRog z|G8a?3t!2BI#--^W0yW`r8Dd}p}43tCPuzt#i!(d;bH!oLUJ-$9l^Jzc)}MFkcv8| z9$%MGS5|pXDY;nu9-6(w-SYM>PWk_DUTGLd#yd2Pj3~mYyGROtPCq~Ui7GR)FvV5qj*1d;?XV1f z$PWSsTv_=$3w^_(IjJS-UY2~R|AZ~(^7Yt+nub;qNYMF@o;3Bm7wdQByF4R_zM`_o zmOeR+3EG#-IQv`(H^XhXlzFHeb-BncZkDvL7GLq@5{rbRU>xUZltVHrDDKV$IhBm*CoLQCh=G_15VM_9kGwx}vf=)cO-Xz-hTV zGV;A^10_a|2DQpKYKY6+0*_Q$7%q!J_WYVpMz}FGro7hN66u=j<*1sEo+=BaSNuLW z{Tw~aU6?&4(F$cZd{X`3|nZf)Svl{tG7|D&<$500|etPIUC23o=dZwrpH>E=}pjxt`n0f}!Jn!@0` zc|n^MJY|0&zQ_NMTlw~!t&^NGF09gy9Qu!kyIRV$Vsx~OcdmA`4h#6tEJmtvnwoD^ zwRKG+rn*{%qpxohxu5@Z;ci^b6>)XdgD6_yt46^DL5#pA_OK5t%;Pe4SOyv0%#K_a z1T3oX$!FSt1>(`%IAkmNHH<9{M~P~G^U~)r85>~xYSc2Ke9M^n~4?j33*J)o1zt%9o0oOTta8N zWQZ7GM&fsssXfA;~x)MChl z>UPqJ^rVyhiY_=S;RcnE)VBbhj1Qf763vQqQoO8B5%1%cYb_xkSVg&~rLV+=o)o*W z9xrYy@=GTW>In_9S=KobZ&UJz=6Gp(u_tuxM5ee&$n6l7@zX|@ z@nB3_EK$48Chpq)4l{5Kz~A<98!e=#si&{RP={oDtq`10msGx}l@syVQ z_~Fp5vQWLyP7+kVSy6s82EYY;G*oU`j1;%cA1Uc6)AmP_U81)+BMli0A5LZHjHX9_ z(Wj!t-%U`Hf~f1h=@@-*wnB5AMBKkgDu_p(8Mx4H*_go3WjkH$qIX>yH15Vwm=K=2I}(I&`GC5`V#0=m(*7rJ$6K3{#1MlRCgP!Ck{Fw87F`5QCqJ z1e-JlV`pd!@+EGxAG@TvPmrAft2VjAgey|KWV!7lz^uLFiyb!J)v6tKYOD(%9ntoE z)dMV6vC+rlq}Q%%8WbbwQFBnSfX4WvjchW$}R5mn|JiQQh0M_VW_4GX>TYa>9nT z!GBLmEo<$q_q&tOWlxB|SY!R{QL}BA*RU0j)o<^VGrNsAjt)q|zgkD=n1 zoTD=M*wsFUbxk-9rWaWYa&aWdc!YNz>f`U!tjT0uPQs_NlgRo7ZAFSyApQN}(>q%o zIW@Wrj@cH{%fVluqRbUs$x9y7{MWWM@Bv$OY#NmdItt5XVgV%oxuA(nr7CHOzPQsvg22RP(ussP3^t@-MLf-BvJx&c5#}{eI4Fm zk!Q~E7Byo?4vt|OYBn2tL<7#7P-^&P;SG08wRP2x3c5>^>QVO_XJt5;B7bSa@rWUG zml_KUWb)hH9^Eq2EYI_rxkzrflqurzI6T@C!?Fr=J@7`uGM!P;WoZU8QPfus1k=S> z0U?88U><7hLWTm1dyGM|t)c=3`5 zCEjZtqu|ne$}EAI5@)`etR8RjYKkqn7~`jt3DIQ2()18N7v%x-6H<|Rs8SB+Oh21g zTBJB-M<}|qtl7@a6yUwTIpoy)Vj0Xw?{X0-a~I$;tEmPhPntn0!idJ0?GY~h$jor5 zYgk^rQ1p|2XSzX&eV)R(TgCh*ssOsJpYjt+cQJn z9I)sZ(q;NaLf!`&*Jby-y}OR0=7P93?i&5yw_V2r(sDn-TMlMO7M}U@Uf8A_l|Npe zWzSONdE!()!)a^L4DE3$X)=7nBy{dVyTJ#f2^3D%!F!a2Ho<`?ikYY zj3Ty1=e7pbpBdB19|;r#f+D4>Gi|oQXzyGSp3Y1EhV?o93G^0w-8h4Kx`K#aNR#|= z(kLDPNfiB9FX$!W5|RfUdeGw=q&{{Zk%z@fhO#UC(lGLewuOKztlx4|{RWHL0kaB$ zgEaZbC4mP1uM5x?FJPLlN6we*BR-=i#7o2{GGrYvs`mDl<0P+K# z=RYq-akRHPwU>)D#5hIE9Oq9gqV4!^cJ3Qf|*xQ}>oRJZ5CE792EoUYx{P7s2 z(-`(koj7S}kCajDoFFzRL?LO*i1E}EK-VfSIXq4Uttk=U+2m_?kjPsC&x+mn#2ulw zQow3mI4uM*LeTf9V7uJJNh3hHi)btpuhjEE(Zhh5iy;Q{g`}vh+%T$%1F@mCb9Rd# zL1;hcJ1{f98;4CcvuTLZgTy(rpC1crt{brs2OlWkk;Zfe(b_+s&~($CI!n{aMp|<0D1)?z;Tiob9BXOpDUcp5EQ&caFZ0TZBozdUOAidAN2WRC=&` zHa__SX1U0U&xu~%E|_&gj|~Er_(e)LY>RC0%YR{*X&^`mEE;63i+Mc~5*^%jDM;v7 z!=;Gnp@D^6v|-5toI)q?Ltf_YK1yYKFIzi@Z%>_4B$5H?PX85H_+c@wEn&nOu7}u1 zS$A3cvXMY^uW8fl<)q3Q3%&m-K`jV8d|sK7zMVH5#$ zUUsr_Ao-Hi({>bhVN2N>Lk5UYqGIcbYWWh2;F&eE1Q+iMLOGhC%mQy}^(}oT3D%jNz7s zsYA;Pr*0X_)VqvH47-Bw%W_o0W?aoj0{Pmv?*cRy;yn5aWuml6z^))4C?H_Z06#fh zozxIm*ME}-q<8GH$w*n6ESv3uQOPi4V3%ywP3-bY5k$tejz4P^Ez8+aih+`2y-wyo ztOavz(NZ%gM?xU@MDHVIUGxB21!p;*H1W&SDqv(4$PoYYnr;)Gap2$IxxFLJb(;$8 z1SK>CNad<4^QGQ9w5+k8h)txPpRw!ZN@m6Fn2RQyI%~h<&z9zR^8wsd(^-uWj00~< zjA(fG`}*qCdajw$ZBywNs_T z(TfjY7QFwHo~EV6$h%F-vQeo&MoXT{-R>J`akt|;H*`6^0mqIZP?0G%)rTwUOOh&A zzg8?>`NqszzBUPrhL0W(pN3D`p`^WQ{9&m3^Ol)D_2&>H0lx#XiYcr;w5Boh>> z&<04TVtcIOluYAszTsg^dUNX=pvuHUK~q~>8v8ub%Y+A>GGOas?IZ&tSsH3v!krJ= zv*IHxBjh8aqcoqHcm0j7&x5xf2J3M#XbGtA|4y_t(}XNv$A8wLjNzew!i`8m){v=~0a4gBAU98crtF=ddMs zIMGN2p$b+%udm!cGfG4D3!!=KuT_dAB*VRIX!uUhDrS&&nisPIXiY`az(Pxcaa06H zzl!-x!OBOoH+X!#Pu|cSClymeJ1vykla=BGysG>KslUJf&zI_K1BztbSLO_Dz{F91 ze0)5vrJgXO5+1K!dgvZefBmQjH_rCxg=XQ0MAnJ$wzf8DGLENacLK#Ux{Ndwp6_04 zWeZx`p7FBAH|BsarF|fy*9z`@(O+L_76 z#sKNUIFx%7t$Hu%8v}p1`@uAwat8Owf;&M$tJTQQ*)YX^jt}q67&i9X5l4`#bw1Ax z?Qyke7+>6s9ki14WYU?Q?%{& zd?+tgZjwdMHq=3J*D?}MRd4A~*WXxoNXCxRy)Nl^EE)>5Tt?dtoY0i_NAG9y)LUe^ zeRB@@Bwr#-#jJIm3u+ctEGN=J)p-3U;05LcfBYSF;3VhEAu`4XKA0IJzrW$&qsjM& zs6RKMp)=LjJ{;Q``4PWgjK!JM|90Mu<*O)Aky&qx}(*lzxj$SE<@Y)|JA>*(Dd^)=R<H`iZ3`$Web$ z{5#w6{ie_&Pc==`>m|4SzfDW$e=i@L^VdP5gaL4QaT4$oLB7;}70pe^-Y+*?$B*qS z_Wx?}?4RJx_u5cf_dLTL)(-wq)PrV#b}b{tUme`l6`#SP^o@Jft#_*CO;;mZ84d>SL6w9ASCV{CSjRU3cpxQSgo zfg5$)_MVK(CG}8~h{v6f{-z7n!P2DDSstl|I`M-TzT7`JxhV;0b@U5{(UePSH1#6R zOXQ(89y(F`yHWD+aLv`AQM6oCB&?3m&~rT~_5&X@yIRxGWg?W{kMUCNY6-F{9+!a-gqVU(rxwGJE~D};IZiS9(GO5=tF^*sv4^aba*fsf1pC#{=JqCzTmsl}fL*Gr@?sQC!0YW#&H@B5_5ngBWEWI&PF| zyd*x1CnUrCmVqkqyo~Ss+CYIRdFpAST7KSI>)K>*ntlB$zMW(OH5O7qy#<#KDR)4&zoriUF=Va9GZ`6G>5RsqEQpG8DbEi!AXAFn8 zJeqd>G3Br7fWX5GM_Ax3-cZ{T-p?>!sgXGf=QV5gK81d1X>U&1HE}>A;MsKjRLptN zja*bvjO3@|HA4SI9!%644lii|SAy>!Mw8nHpbcd+fw6|j!sry<)>=F=t!Nee`)Idv zMk(8!DDh?WxSjECZ{{t@89AG}3f}ICT2!GdT29*hIT*FE+kh_Z2$V69u+Uslg0TMF;}7H|Ymtc~Rm2IAkuT7A6mZ zT#7pq%eFm++RClwOBSeppIJJ4?e{8^i8;f0s%0S#<^`gx95sfLzXsqYzAWN|-nE5d zfe-mXvcHo9tMEoM{dYb<7MF3%R`a8>N%I9yIOS~^7u|6W4eLMsC2jph-se{zMcawF zUq_P{n^C*T0+SLo?&n-5GC7Jhs_{z_SzH$B$~Rm?u3mUSTkar5TWFJrtoy|w_4gt1 z(A!=~h*9V8B5|>o96Vkm)@L7t`m7^RmI1oi)`Q8Qy`_%kv0IO9AuF$Bd1bdYTS#pN zu(B8q?$T{f*7*m=eAMx5@@~gn?lxx6UQcAd#a45M@pRJ3J_y;vD%B=21!8?aS;e5S zi4fkc7&4bge&qfShm8i!IEgQUo6|q7))iVCg7+O9z>aDn5Ycn|+rF7a%ZUxTBCEq% zYw*&ZtzfM+^YO|7Iw_$i62meU^I#tn*%unydCRfIWRPNSF@BU2TuDm?FW6u*tz;axV1o3Uh;)f*!~UTHe1F(P0&9GBsw;p)e0BnZJ1a$Hbd92&$ z;}U@|F7DWSg&Ok+s@7*!TpquvA8#UgP-Fhn-V0es@(7z(^;z+I9DL1OFRwbsJe+Ek z+AR`tfT}^M{+T{!=+6?Y`L=x677t>596dUs3|xHH8jYk8slycyIQkpQtTVncuC51lJ6XhTb~H0T zfFJKcC4r1zxx*llMj}FfKp8cmm)uCx76%YBlp`nJs31R&2Roy_dX9+%}ylTo~X z{+)@Pq(C5GhY!`We|>@R28kC72}@5;NQ9YPT0mY-MIc5saQKU87c*tsnl3?vqykpx zpWfhrh~;R;ngL?fX$K({Z&P@LQB@o)g8gRbht$-f{38&!)xiPhCPQ7}K7#9e))tZt z8AK+mB5Z&1@?iOyC_bB;u#iyv>}DIB9R@n7z>g#r4vSr8Gf`M-@5%X(&DqOh;zI!0 zbXXu)Rszy8m0VOIZ|hMO=AONmWtecFXfb9VQEcZ+=*qGE5DRN~WxHR9S&ZJjx4dPu zo*t~jnJP{tTM%cxQhHA4bR~rMm@T%S%QL#J$({fg8U3EUPLrVop_P-MRS+%Wr>iS? zYzzY*aJ~x|oiQ-f195r$^M!8sl(e`Xhg7bt*zMZ--Ik9|>3$0Xj7pId_gl_&Sw9NE z)a`5H$AKz|N0c82?NE`6PA*Kz~p_J!fq6< zE9%A7?kjbCz6lF|UoJ|=M}X@*J9xd{{Z@}Muw>8*tQCyZC4E+I@z-0W7Xsm?vzop! z$*Zpa?r1GwK8!*Pm8R7zsvL&~yg5PuHL0Oy0-0T0#y;=h4cL$o#h9Av<{_dUXMR}^ ziW*9iu!`@#s_LRCY3W180+UQMF0x~;Q|gLyJ8vS$7BWp!t4tH7AY-&-^4eh2suLCU zDj%;YACLS_vw&ni@z9!k;c61H2mik2tsJ%R7evtNj(uA8@1lJ>{$of z?bt*UTLLn)StF0S8#l!}Xn;rt5tGK9aQ*x0Fbi`4sG|cG+>VRmNl6_xF0=A&9c&5- zg2)cAWdf34%BT?BG*08gkb5C#v(Bo>IsGNysz7S_exHv!ou0v$~)XLm?< zCw|?lW2B7%8^`H%U#_@~^n@fyisiD3$ADj>LqieDzHXTfp|-;NHCBZo>CBjR*P~kq zKl|_{TzIi&`_Up+**}n?Uj8h^-bQo5Wc)oGYEoTabErth+VSDt>k4z1ni&<@+6jW* z9iX7R2@w)D`avNuutPIYippXI3&Clj{(QLv|Nfr__crBFGf|4^R*VJl838(xz&|7( zJweT_DZHzn+#98PB)T3Tyl2yQCi&a^eIyC zLOS315fakxz2{qZ>UhyKxB!1#)8Bcd&hQvJ7R3k+>Ue7131Z((cl#OdMcze({k-5I z4QxvRh!_e;`wkHltQ2?eexnf)S!NFWg%r-rxLT<#nb@+`)rAF2vC@%Jn|rV3RIA1}KfWot=7y zvgo{n%X-)TR$XftN-4$>viI0YC3KHV8vZ}5vayXZ0aBSlReP&E;!L;l;D|eVjl+69 zfn8~AgBv}M##C(LSt_IPHh;&ZbQU*Hf!|j|H}Ze@5fjk_9Pfp0%_9v-{`wzEAQnv* z=@`Klas;xyE};y$#knleD8nEej&A*N?^mo21Y5!8;w`Q0Z_!aK%jw;fy{4S^y7cJc zS>uBHHb6lq1GJch2{U^jEd#?5SMX;@j@`Bt4iVtJFvKJFUKgUMA<4Za5Y2>A>pbrP zieL4@0+OpnbVq3t+b$2g@bw|*4Lr$Z1p)-~Md&vD9dWn6ZeIVTGx;Te52TRZlo^f( zB$F;I%NTSqK@?RB{URL!D6#m1vPf&tcsdeDpOH|rElT`#2U@^Cjlz6mRCD88MVK=GXRoK_#ZX0gs4%9&F0R@MbSiGkJOWXf9_h&+(6wAK{*V8?vkTB8Je}NobCj zm-P6u2>5C21hzVi@zZz}^$)or)l)wk?B==jYo)b8!`}wa(h`!H0^-93#qCJy(t`0dD(&1r5f>;^YW5}?IH7}L=$ z8W!O|Dhp*L^IovCn4Mt;66+*UZvm%pEEv3E)B(5 zf6HhAvy8ulfFGyf-V(69Q+6~w*qT8q%>xxfltDvm69ZU7lG;yWtPoykT_2@Z#BSDa zwun$CHB#$fOiT{*^wt*=NcFF!&oS12a_sWNddj|_@7ykb%7( zgW$#thMn7PB@Z~%t*$ZB$k6-;=`|ZsFm5{WkU~Nw|00?Vc-!Tv$KBLYlPYK{Ic5YA9mIxZgLE-6L;nd<1x-`wOu@x`obFmxDf5bjVxKCkaYU;ahoI4$`;)f}xb@A;&}lJb;QMp)_${z{57CHL(Y(7Bi%s zq?^A4I34;`s-)6nnHpUfsT95EOZ^_We_OsJBz(J(%5{#(NFND+TxgqNnzC*AF8c%! z(@7RNM8M!(LBE5p)rx+_K%NIC;q;`|5Ht#D+g-Rf@)!b5=0s~J5pdI!JEZfxKyk8T zFW~!#0epp7@Ut-0{)*6|$GC)t?dOIRc+?SJc&BV!fIAN}2kYDfwNIqIXrU>XsG2uD z8+}%ZNrd3C<~1Z%$cB#C^}Gb!N%&>3cZxm^3T!$HsP-vs2kx7>rIIDl%SCKN=*sdXwXXqc2EIx&r zBkDg$ukY!1g*)zHoFn4R}|ceaD`$Tnk4$iaY@gU=22lI%2-lO#G|8L-j8bkuJ60y;ZY zRti|I<-JiEoQ_v@wAHJ2yqGxLZ(-Vt7&F&gJ_n7bKpz_IOGRhA&H6J3szzp1LSxky zCbaJPSTyhXI9Ps7CVB~xcJevy#C+_;B0844f^BK5*W$_t)cPbqkSWMT~RL{&IF}tL?dsFFh1o#$rW5m?Ca$a?) zAp(f>L(h%( zjLYlt?c%`;epkoAzWo*jTN*Ul6%LX$>DP!Ju&;t-yXI)Tu<0{^X38|L9tK4QLVU$tV0}zQv z{_N3WWa7+uL!J(s0*kZMY(z_wRWNrKa}9Jk_;Lih{GIV|c`UdJ?gOp$tSeLwFC&CG zlE;$?j?0m$-0`l$D!6XM--Qeo5^(YyvDMX*`5P`zKnOt47_>$1C@QV$PxmRfin%@{ z-8QtR+7U!B4VQ8PA4Hlr?!6)|2$_d7954RdQmtY;1{@FQn*k*)8#&F}7tq$cS=ym6 z((d5WmHPmVg-%?Snv_Zy%n*t0k0_m_{BOBv;VV4Z{9KHwz4I&43x(*8bDAA`!@ufq zC2}C_(~ur+ATO}+nwwT#2vDL|$XfC3D;aYdT|6`Br)xabPVq`;IA9K=yo%R?;Spp(quo^rd zTX#2HdtbxEJBm`S)5q+x1v?2TcVMmHif-OSL@K*h>)%+F|95SG19f6KqCjVs(Eewo z^;d%M>vOK4fV7q*K@oubJ8@lM%F9}q3vkYjXX(yj?lJiAV|&Jhr-7=}HEmxw9gsCZ zM4Qa}XXU*l=~za3?01ioFYxGAs%-X>Md0G)etYiUa+gVE^YCMOpt+L$9Gi1F zpGP?Yw&*(sba|vaeb*m2^VH`t)452mJ+1jOKt2g)Pf`yskUxdnn`j7|dAGwUuqfzG zT7cqw+*xANTQH`-aJy>t_}Eoi{Y>JJ+cda&7Q^znYTK(f-KF&n&-QZ}JKCp%udGG7 zY@7PJHh$EY!dNOPH$HZhu3L#jVZ}ecbR{xTRNH5_?VUEf_cJ-_Ta^St7C}k)tt9+g zQz_t>R21$yke}r*43geFDw-9z%A-!C`P*gx!NOO<-g)E(l{^0hhggNjhG7axpuymo zw3M>oCjj{_}=&!ygkF9oAjp6*sQi*LL{EPPjz z@Pekmlldzf@YV#Kn!a=Hgokf+l-@YauEDw+hI2sn0rq-Wzy{f@HYUH~Ih&u6H#K85 zOCTn`xV22fC96g(1uMM;eT(9&GY*4$-q$u=E<@V72~uC-gYYx9x`ZXHBtH~x(ZTIn z?$)>$h#{Uf4=c?Iw%o{;gphyn`!&Ws1-E$Tu2GHU9kjdZzelvzZ(+jX3G!6?0b0Ch z7N{K5{Kju$+;mB^P})-kGQyjJ)Ap_Ht9J+3U`&Fi_&3Cs zv2Lryh9Fy>`PG)dDtk1_D(XhjFmYDDd#!1=#x}f zDq5kV=Ue{Q+$8>(rTtO)tepr7Si$(h}`Z-7%o3F-)VD0 zp9E;y#>^e93R*Si9=lEto{T)R|7x>)iL43i!F+w?rmyWJ%*A*l8~0_h6S*Fn$xMOI zgcMOURSdBEm@U#k_bT2E{{GZFj7<1tqXx_GzMuX<-3IsaJnJ7MrBC{haifgJ=N6Fn zxmFyqbRa)OQ%ps7&49j5h|9OL7r%CLdD?^>^LO&(6BcEdZu@-k`R9UfWe&cn@t0Pf zYWAv4t(N+DdCK5T54s8?m}5XQuWS83tS2yGw&!B#Q!aA<`M#Y#OyM;YJP?P1n$pA$ zkX>2`JI1_Ze0brk6u(_1^aRjeqJ4 zu|Uw?rpUB2Jqw*M#(Lgg-r2Erm;DA6?`v}wYeAOEnjY5jaH0rQQ@p@&B1xNWB}!`M za6CrVmyEEdxGD61bf2RTOR%ZA3SKy57&qH5(UZQ(4S}#AT3@1`a7) z`YCKjev!Z{y$ycH&hgQvG0_8jaFPP{x|W$7^-3W5NK?H8A)(IXzi{J}5|`taN)%ht z$Me9#p3(kfH8#MZb3s`xwqIX+Xi6n2txWfM-nxbR{>8h2!rB5RFvH`nFRmY_d%cyh6`6qQ>1EYGl<5Gd6HuOd`^#5ftcQ&aIsKt=4ASy zAlm1xwXw}hkK|zXz)hin!aRfXsfR`gnSbpY&4J>7|7iUjMU3?w{{I{yL17^ZPm-Z1 z`^l_u64h~i|Gu|S44132@OM=zaQ{c*s4Oo|GIZ~ZGthd(EYdRDkVDT2)IJH;Y#Q1} z3-Dc4;DdkX?tBsdl&Cc1Fwv|DU6)v%9M(09>fRZSTJ-&HIx48}+|b?WBqJ z&I1i|XjWS7V{10$e(oRQii4Vqj!Mt-+J=O++>xRf5y2L4@hL)Cz`uIRjFb*YQ-&I zcU_<5czVS87kwWMdv{XITHDvv%8t|CT9pLJNZ^@+%e7X9Rp&yBZ3^O)?w@bjadus~ zWQ#Bsy=8K%#&KBoMMvo>cS>tIc)^xOw7esdjUJn0YaS>fj2Y!57S-d0B6mz zo+rny5=QJXLcBw8c@y34!$WkO8GIxK!Ho+m%;}%(QRZzn#0I~366=0loz!@~%SXUD zYYFe1onv}VG{AMUse$jIX-6-4lf=V^g?=1MR}{I9J>2r$=)Jb4D7Y zYQJ|U@%kLoS4s9ro1gH~3kf(A?MGx3jM=)bJcobDZf{#vai)H{{3QloyT{oEyS+5n z#nd|vo;frvppL3($MGz{^%nVqlcoJ>{U(IWSUFOV#8Nir>hR3{-inC+N9&d4py39N z8^z~ez2n6a#yP*^ERvu1(9H3OJe+k{{c9;XxGB#+WVCR(E$=a~9m2`>_h2S!4SZ)w zZrgYu3M2A>sw?k*#Z>J7ig_i4O|d;!Dr5Sj_({DjC8)!j#}gI?574*1T*koRUm<{%%GcFY5Fq>0Axgme%f+NE9O%m9$@S2Vuxu1AC0BZx zXs{-HKsp~jnfDym!T6X(han{)DT1R4jUu$0(6-Ts$i4G7lOn~67g9K;rU_pX= zfZz^;6GCtc?gV$Y;I6^l-3jgz2yVkp-rN1RXV0Fq`>*@n?w(s!x4!DGd+VEqcR5e+ zHKTg#><=o_f5@(1j6KUU{R7DW@Uo?1Aaa=G>7RVo1IxvACXU6Eyq1HFhkVhM z>y`LddX2}gBG?Qt*8bkG>f~*EeKR3tOY4N}m$>su(7sd{W^@p7NOZJ) zh;)mZw9P4TC&x7Th@E;gwstt6YUFXl+x^;|(Ynvq7|-SYDLFaW>HgoTs8gzZ3f6oS zB8?^F{H4TC`aOEwr!7);>_*Je1*_V`*UDZ{sPTS$e1PRWVQjsnuW#eQCqBlEm}r{$ z8bl<7*{&MAoE$2ql*MIUN~D3l^MHT=-EyrNpwM459Cz9t5+wxs7FHbl4o#pNZO>xl zQ=!?zKU{oT?+e2#%BKH2DLdF_85cbNy19ROCnq5$e2N~FFmQd00E*LXc;zHkFT<*X zTD>(JR%z(HjukNtDE!f)-+O<#&pgs>GuMpE+^_;0myh2lYNoI2D}e7^(MHb2_~I_E zxVj=Jo2NgIpaSiV&n%YFjhM3XwS+1WQnU6SLPWV6z_0NLOsu&@x$D3Y*kEECUoABy zLS{woVFVRTrDSSF?m=Id3>PKk40My;P-8n`vLU5D<2Nera21qO&`tV6|1&yTahZCB zWM;*k8jTptX&y?|0CnAkxt#F-bmk()w)6rs!1+5hbM{iI@ald^Tvf-z&Uk$?)!~G2 zers;ZwZxl%Iz=cFGk33ql8loVg86T5O4O#}ddAallEJSxp0uu&>M4 zPWb||iqu-lR^m){lZ@H6{<8sEnz)S3d|<;KS!lRgS+R}@C}cNC6)K+Jz^5|1I}^Jn z&+sYL*!QFHa(ozWvkhK;0_gkyG6ys0ka1Fy{4+)~q3z$vRH_B7G@&{iCl0vzq5tH^j#ejMJlUs%P{pKm~>wIPevm}z^@jR+FEi32b_OUFkvw$nt zi1BH4GUZe!k5Z$oW9%%vjkAJ(eM{k8@N?I_?R&d?v$FS&jpDY{_(F|O>SHLJEB4pE z-`u!Hy1=v^&GsL$Y?^+kzPsrTGRaw{ckuTIn9}Q-3H9VEM&>iL++Vy;*S{GcBR5fDsI@{@VcM&+#*zJ;wA5kA@ z$-|h)?Fq+;B|da}Po)W80gq-rJj4PUBQ213=+y0*o=CA4VLWb!PL#jL$D;%1Mw2KG z^uSiaIQcjA7H~A$sg}Y)>qBn-BZEB`^3IQQ;O*R9l-D^UZjum3Vq9UWX0@gOJDV2o zUuQ?SQ?X8=kvSu%s3+)(3Klnw?&g5P7{!6iVNf|%ynQ?3al?Ah zR}XQcHNUDO+d26y_)WMGB-RepSb_dVJ%2Gb?k=eo`R0&$6qjuYJI;{??gtEi^_Xex zyHyScnAS{(LI#W#%f4YD4cL3_#HEQ2+)Ep+ohfG%#f=>FKj0DI?EXj|WArc_i(1jw zmEt8WI%P;wFhs0)xh@ug*P#Yi-VzK#c#@)Kgt}mjxUJ0*c4ZG!f1=jZm9!o+*lg0@ zWsMRFC|>$PL>{_+VzhR7-|vdRYo!-o9J{@DW6DK!Aua@qK3@^$vs12XZ)z_Yz|?dY z6_5RBpL~4aBn0-C8T(ZiU5sI#F>`je**Wo!`-sY^%Jop!1gg(h$X za6HgFGQXtg#HPLNQo5WKz>d!BBjhY4m_rseHD#3)ZibcBtdY^szQTOsEnxaP%e^Yi z$8-E=_0f!2{>}}}>TIs1)QNelX@KI$Pb=Yj7fhwLiJ9bJU;{Wy|GwTnSv@3lh_H(6 zNZnnc|8F6CoM-;;dUOvs0BXMA2> z;;OgdCDKY&KC;fz5*VivmfpS{XA%#XF%`|{RBsB)nouM2`Y9gBuZ2H&r1VPJQJHU? zcphbgg|^4vb;nuKY1sq_q`x&im;C z3M@W*wKj5w9tQPSJ;Ej^xx%ivi1$~{WETu_7fleZwCa0S6l9Q*TpZbV{R%-qkIsp` zy?Fa>pzGVZmSe0d6U-DtBUFSXo17scEfq5-+9-EG6z{S^jOMF+maVV$ z<(LHrF`LncaX?ggi*kehWa5fBNijMb^gA;F`9hSdJBP*Aw(#<3?By+r_G=nX5vcrE z)|sLtsb5CSi_*d#gf16 z`wX(S#F(X3>}*}-#<4&?DOSGsI5MX>Sa{+kD?(wY>wEM(p8yF3_(dfH^!hfBUar!I znmBl0%9$_2roZpu`E56es_4%B>G5gbrXubX1MAq~Jna*-kzL8D075BVgz#LjLJYwu8&BG9rfxtWWSHab06K(Vq%7$li|AUYO{5 z&Qz`Zq*43PzDEV|C*Oxpq3*u{sucRBg#LSYZ6tiH3?u4}mGRTOhZs;L_aRhH!!+gi zT6Gmqxih0eV!Khs6Ke1oFT@HTRDyj+dY^JfDF^69)7Fdrl7OD9xp=+YmTO~s@j*@1 z{O_CZ8&PcRrtt3=8)hP{G6o>cg+^#WhTF%lDC3Ntm8zaChg+(ILV)5Gwr8#QJQi=$ zpIdU|#yAHB{d5Iw6Yi*O{oy;Y=bJdIg+a(7v}Coz&(@9^(*EuI`07zE^! z?kYXaVzHmf_hYH7)DXIm$digiUUyTd-!2NR0`w&*QDEtKrz3nlo>$oAs1MrDEY@VR zg-%p#z%FSQJ2vD9FNXxHOplbcc&%S^+b?dAN0;KY{VrC?ds_P7(Rs$NmfSSxHK-{l zY!G5%%o<()?r5QMz0~cJzRxF;1cCgr&?*Es*u^6+U*>y@1^aAM$Fe#4GPkY3ZV8W4 ze0l%n$@TFSbZZ9CuJ=1%?D@^>`X{_|=Mi(C_8S|Wg3Ge0jpr4Dxn2UpXl|=JSD_$i z8HYB?7%@ca@o2_2A+3W5)59lAMPU^-5<6L@|I7KcS-2*?WRLsxs)2V)q|?j-Pt8`E zPclOJ(ZWQ(@~@5}OB@Gw+k?f5dc_O9FGXEkRJkwKbS?-qXW1`Fc;97S6T4^-_)55cqv? zC+=7(lUZLDG=4o>pX{NipXJtk^ul?&KN3?a@|n0j>lcc5s)QDFUJ)7j%x$IGj#RW}kqM1kDKqN% z>}FweKFW2Pr&A9tC+75YDrg#vZUw2%d$mQ?n8ne%zbKHHh?T-qHJ21d;;k-9_dbu$ zHhgaL6bDZ}JP(($7gk(*ow!PMr@?T<}J$NPo6=u@IuMVup7nppjiiA?8xXOtKTwy}Q{+d3>ykzY` z$2YYb2U&4O5=A$=|#r;8PMEUm<_B7KEU%!xXv`=6A=$h<7;8QO|9+(_zWZhO*m z)62pvlZ@Stc;#b0T}}zURF%^A^wHn%?J+$5{tfVIrX(F=emh=5J`Tl1n6+|l%C4;v zsaHQALfiCz6(Hw3%0|HYQ~q&fH)u;td|1awWvGDHcZY(M|r?SPV$?+p88&jFbo{f0u5`;C;5QBe3wLA zrH?HB$-Oo}WQp+9NxBMi4vF4EF?G+vPtAey2f}}iL!u_O9_iBv2hDc;^h);! zk*Q5)?%OfwSs6;(rL!aLvGy0AT;9ntf)%@sQ{3p|HALPg`S+5Pg#-^If&CxLr=df+ zxHX~zXvwBqTJ5q;`NTtXrIcYW7TVP4H+afEz|OOc8tBj{$JDv35qa3ii*D|r0Z2W! z$uL?mwlFpOv}wnG*frKjMiQ+#9semz*v&01SDwi(GxW&wO-7FFN4CWKw42~?cXYuY z!-t8>D@C*lE54S-6Q`*P$_oQ@yPDxN7rnDv_D#7c(&6r}9^c9yK0n3%Dq!48o-_w; z$q;W*e@(IUr57?)F#TYos$cK4wiSTv<|zM^d(#t;+MhaE=WUKhRN&gOjGC0_v#O?`Ctqw>uV8 zXBzcsFT+_0-^y}45N4^&M;1Y_LK!6~`it;E+(|=2OveTXb=}<`n=cb%aGX%?MbWCU zOrStUD(S#@Q85(tAh1$tO3C2e3EI6tUihB85gtS>pRxOh+eHGRBE_b+r>^b3YU zJ!vy_X^!Qu)Z1r-=O3aLA2UA|ll_KlBJ zh|ab1q3&M}ok|}1)aX=3_L#RcfGR)PCX)H@v7-NmKz$bIR!w?Ko_v1Y8FLO3w?v^_ zbHhlK)HO8w)-x;8fDyr9M5_#E@rnqUtg00naL_kK5zk%6x0CjNL+bb=3BAcDB4I5| z`Nbp+7E2d_@{fBC+fk4+J^}Shj}#SUVTJ?qtG;ggOB}H#qIv^8{1RBXzzYMn@Be(L zj*8XM9U-na+VyJlKwx+d6BT>Q5sAIn)LHknWCwTAP25C;0h>Y$l{THQ+8Hw z^Yc6Oh1^WjM@^IYn&(oEBYSOwa2B{|DJ_c6eF?rz3v-VuDmLr1x}k#M637@wIwuK> zW;QQQs}o1hO*m3W|Lj=xoctSpRtmo?J^K0$YyWo#VZ~>q0lg4|!5g;z5^!Sp1zm&< z$q1Y!5q*EV|L00S@$Ie)Fg@G=oUVkhsq6o+FS5VAUwpfr^z#;1mJs6~8DHM-m&}3G z3$B3~3?Fn095KF(VnuiQ3zGJZ)IUk=IK}^@IR(G_G_X}P#7Fc};P5IgU0(U+Y$>$& z@aS2Bpuy)=U+8}nPn90_?b85L`#+f_w%9kDkOE9zUE5y8Z@Fz28|OR3gJge#|NB4( zA;*pu+gzgc3jWMh1-?|2?#+DMwq6HP#g^Wc)Ej#}&O6!;N>W)s7cXOS5@FQ$A)~VL zEb*7dYb6E>vKukG(h2Z`Vptwmxn+`o#~#~`}EC!3iwdnmU5rG^W$bVpT%l?o40p2 z=MACwf4CZpILK!l&No$9QmW{FDJ%BAQPmk1Yj*wI!#>7RzZTD81#^;7Fi92J-8sBA z$(0*UQ)|el9Rza*Gh)Q2jSPP9+Nq~v<)jm{P?~hZX?>P!bmsfUOHdKCOVk^F>$J(- zs7@rtKYbWOgv+hfn{6O8z3FaB?%B*ZPpOYN5}4)E+k>+ImW9LZ2Y!;qcUFQ!OE7ZM zpZ)G^JZ!*)t|it}-FtFCWd!#iij|dauJf2IvOGj|B`B3rfnKpT@rKr<%#RN3ExU`J z`ffWF{l~bmWbUs}O=4@&v;jM_u4Kp*B$d*Z)U$+j8E=nR>kBQBoz(uErGK5()l8&h zUbil?#0UA92450q&6(n=0K{BG`tBiwHAM*1&g%&0kO1I-YUf3h;E!6zSrq zEse0YIR7;-uUH7Ws$Ts;AG9o$u*AnCyvg}M<;77Q5Sr5vi<-AU*WNQj0yr#9DWMNq z1e8iu%AFILj0^bPISEWN7IZ4(I;TYHl6?D`Yoh9r+3z`7266G~F2gR}w!>-+m+ATP zSzNpq){rBaRUV}tp-bZ9c-3;(oW;_*5XM_e3Lw|h^jXDj72^p$(e1xmG9dI=6!tvX z)VPN(2mhC?@UQuv$xij0QjRYdCkO-Z!#JaaMae{{Fr(I%{U&A&M_!#l#^xO+Big@Z zvF~G>8mBf-C(mX$sS?AI{BV9W!Y{p>W7TMJj2GnVw}-D@lrrsz9U&LUb=8amP43wz ztx|E*kSC&@Sv=A*b-zU(bl~o^D{@MJOnV}i{(S)gUW=eEbFU+0BAEbkc*Y=|fSl^2 zocKLr!=xNW+}Mv_fK{P`>2SIeh&?N)YU8in65)Gwr9PBZjze?q>pOu#W)}a5Eur+x zh2j1Kqq)ZFv1YOvFC%JI_>vyPejq^lK~&szC)yN#pv<%tE1VcknUp9*7GK&=vjE5d z3$s(eN>koG;dtG#6)k6LhZicQcH9F`Hrq18T}=VxON_4h-_K+9gXXUhmxAzVtp=ko zgf~n{w9|{>1uq*(%P->(ov9?jl(aNhHFB>gJIV;p%xSAMztSwA%j;0^VS9v&1R<#x zt7ofgoWJ)?UR5_CpNKG^h!IB33hh9iiK?^!6{6)KxiNM|weFj)49C_*x^wX3cx8m< z6YLtB1P?ncvv#V9q05HOTINOP+s>9Q?FoW&%EU29zDHZd%K_8n(C3P0q^EfvcAdLp z=jMjz*MvrUF{~YRTJ=F=Iuw-CB(bhn+~|=WVjN$*d|3x-!kp+8?WNZjY8Qu1E4uo;IG0>zE5nm_ z*M1_ECw_~o+zjv7V(HeB5A>-PJ_RLeQ?SRvwR`;F>m4H}mx(p3u^nsueH@n}8Quy= zt+zbNzfW85EIUSiu!Q~JnBylUMN=I4$UNGsVOh#|a$WkWJI2?Ob=Qa&z!ZJigCVUJ z;i_X8>JpED<6&!H%MmXK(p43;G4R~eN$8rI)6bR@h&8`PQjaB&v_2nWxZn%zqmI^ePAQ6rrO?6ylUkW(Gbo=W}#I>Joj)kE}JDq`oJHjrWthxU@`e3?lo6y)3%=hEP z5oLP!t#mUX8MmF6Z@ZwAAPb;fq_yC4MlNL>QAp1>=~Dqc)9;hXBQd=gh(numN5zjA zjqFmbiUdn$mZK7N&u7~7;#yuk(OwDR!&Z)}C}SAQr_Qko68-Xh+tGZTzeZ75QBN=x zrr98C@{twXW(W$8Fa(yN6U>hOPjZrzH!dfroD2(6Xk!Kx$$m-c9CDmEpBK>nsb7qh z#Z7=g6Hed)6j1Usgtrn}&gYiI?b&-H*H(ZI^6rZ^VzIiV-HB>K2P^UEsYk6AA4F~c z&p0JdetH#e+M7o>)pm`@=p)dGR}*%*RN4}2FZFL4${1*6Q>cb!gUy=x$hf_|MAHax z&YY|u>2=;e^>JlZcG!602*p}tjmr?Hc@Cu;JJP>>$1x+qg>C<}yU9ROdmYm-#a86} z8}~0~GUc;BazY9e!RqOuv-$1~y_85DKHK{lAYrqxC^IFBJ9a@5PW7rha!`gp#d$*d zxS-KYM%?-3y=}r<0tU;W{y~ael6Lr|)Iq-OI#3gT#866egj&bkT^`(&A<8hC8|31F^A zF)4ki)I~!U5Pii7?;7N(qx|0nf$6JjM0ZGD7I3<;`0zMGb^1@<%*31B<)MErk+cF{ zL@s7^4b)4t1%H^CN9%?79i+cq#Bq}Sel@3W(ypVpEL91LVebNSiZ=Wv{L!FtjC^In zf1zOcTuyUhGW!{=^8Qk7_FI9 z)X|M-RW>}RmFOZtj$3lKfc>~G+(yTZ7_R+wkPPE!khP2v@j714pZIY4@%~`Tx+x`0 zxMmo<_Yst__Fhlcl}SL;CPOAcZsqEY1b@$wx_KG$>&`Tqx3{SOGSnZRg?bwfC} z6OTltnMY40@ncd7Ja*h|mRaw90~{PCw@WLAm^a37!@=%;@`t?PmyZ93GGf%|DEc+AezAG1^u54hXb{^EU^3Xd)PzjB)< zdJpHGqDNX6lhUoa{C}ezMw_LcW1jbygC;G(llJrROmp2=F0}1LQ}$Yfjh~Ho;3&zj zjD0nuTK)LavZsB2xs6-hHMe|N7<-KDH-s%8AZq===_{kFw(N*?Hhfe26$u`7A;o&O ziZm{+Uw=T(`cLD3h^726z&gJ!l&d1mT!2EH3?JZst)$SkH7Z?s$jz*JFPrWu;VR7T zS}=QejYwUN8jc*LKh{@y^~SDffVfr_`f!VuxG^iY@at}0#L_4XcIF#vV8{VC%qK+! zUAp=Tkk$g))%X8rzkxl&g&6!wWH5064E0tl9(%l#kdNL6zz+K1<8mkBKmovBFTwrC z9ry+F{fIYeQ`r6@MK3ksrM~F0l#h>SR0UO0GT*NkBcofZ8Bq^9QD Ws&$Lm2>(wI1Q|(1i3)K;|Nj9$A)18% From 93dceaa7b8cee68825a4c945ff79618de05fd54c Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 11 Dec 2018 16:47:21 +0800 Subject: [PATCH 10/34] resetMap & fix autotileObjs in load --- docs/api.md | 6 +++++- libs/maps.js | 19 +++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/docs/api.md b/docs/api.md index 559f810a..7ea7b61c 100644 --- a/docs/api.md +++ b/docs/api.md @@ -135,11 +135,15 @@ core.changeFloor('MT5', null, {'x': 3, 'y': 6}, 0) 无动画切换到MT5层的(3 core.resetMap() -重置当前楼层地图。 +重置当前楼层地图和楼层属性。 当我们修改某一层地图后,进游戏读档,会发现修改的内容并没有被更新上去。 这是因为,H5的存档是会存下来每一个楼层的地图的,读档会从档里面获得地图信息。 此时,如果我们在某一层地图执行 core.resetMap() ,则可以立刻从剧本中读取并重置当前楼层地图。 已经被修改过的内容也会相应出现。 +此函数参数有三种形式: + - 不加任何参数,表示重置当前层:core.resetMap() + - 加上一个floorId,表示重置某一层:core.resetMap("MT1") + - 使用一个数组,表示重置若干层:core.resetMap(["MT1", "MT2", "MT3"]) R diff --git a/libs/maps.js b/libs/maps.js index 2c9c5f83..4d8ac72d 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -476,7 +476,7 @@ maps.prototype.drawBgFgMap = function (floorId, canvas, name, animate) { } } } - core.status.autotileAnimateObjs[name+"map"] = core.clone(arr); + if (animate) core.status.autotileAnimateObjs[name+"map"] = core.clone(arr); } ////// 绘制某张地图 ////// @@ -1449,13 +1449,12 @@ maps.prototype.setBgFgMap = function (type, name, loc, floorId, callback) { maps.prototype.resetMap = function(floorId) { floorId = floorId || core.status.floorId; if (!core.isset(floorId)) return; - core.status.maps[floorId] = this.loadFloor(floorId); - if (floorId==core.status.floorId) { - this.drawMap(floorId, function () { - core.drawTip("地图重置成功"); - }) - } - else { - core.drawTip(floorId+"地图重置成功"); - } + if (typeof floorId == 'string') floorId = [floorId]; + var needRefresh = false; + floorId.forEach(function (t) { + core.status.maps[t] = core.maps.loadFloor(t); + if (t == core.status.floorId) needRefresh = true; + }); + if (needRefresh) this.drawMap(core.status.floorId); + core.drawTip("地图重置成功"); } \ No newline at end of file From 25cdc2324dab20d05557eb8940320f9e2587e466 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 11 Dec 2018 17:21:23 +0800 Subject: [PATCH 11/34] blockly Int_0 --- _server/blockly/MotaAction.g4 | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 5f44aef1..edd7d58e 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -524,7 +524,7 @@ if (EvalString_0 && EvalString_1) { floorstr = ', "loc": ['+EvalString_0.join(',')+']'; } IdString_0 = IdString_0 && (', "floorId": "'+IdString_0+'"'); -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; Bool_0 = Bool_0 ?', "async": true':''; var code = '{"type": "show"'+floorstr+IdString_0+''+Int_0+Bool_0+'},\n'; return code; @@ -557,7 +557,7 @@ if (EvalString_0 && EvalString_1) { floorstr = ', "loc": ['+EvalString_0.join(',')+']'; } IdString_0 = IdString_0 && (', "floorId": "'+IdString_0+'"'); -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; Bool_0 = Bool_0 ?', "async": true':''; var code = '{"type": "hide"'+floorstr+IdString_0+''+Int_0+Bool_0+'},\n'; return code; @@ -1131,10 +1131,10 @@ var limit = function(v,min,max) { return v; } Number_0 = limit(Number_0,0,255); -Number_1 = limit(Number_1,0,255); +Number_1 = limit(Number_1,0,255);A Number_2 = limit(Number_2,0,255); Number_3 = limit(Number_3,0,1); -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; var async = Bool_0?', "async": true':''; var code = '{"type": "setFg", "color": ['+Number_0+','+Number_1+','+Number_2+','+Number_3+']'+Int_0 +async+'},\n'; return code; @@ -1149,7 +1149,7 @@ tooltip : setFg: 恢复画面色调,动画时间可不填 helpUrl : https://h5mota.com/games/template/docs/#/event?id=setfg%EF%BC%9A%E6%9B%B4%E6%94%B9%E7%94%BB%E9%9D%A2%E8%89%B2%E8%B0%83 default : [500,false] colour : this.soundColor -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; var async = Bool_0?', "async": true':''; var code = '{"type": "setFg"'+Int_0 +async+'},\n'; return code; @@ -1183,7 +1183,7 @@ var floorstr = ''; if (PosString_0 && PosString_1) { floorstr = ', "loc": ['+PosString_0+','+PosString_1+']'; } -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; Bool_0 = Bool_0?', "keep": true':''; Bool_1 = Bool_1?', "async": true':''; var code = '{"type": "move"'+floorstr+Int_0+Bool_0+Bool_1+', "steps": '+JSON.stringify(StepString_0)+'},\n'; @@ -1199,7 +1199,7 @@ tooltip : moveHero:移动勇士,用这种方式移动勇士的过程中将无 helpUrl : https://h5mota.com/games/template/docs/#/event?id=movehero%EF%BC%9A%E7%A7%BB%E5%8A%A8%E5%8B%87%E5%A3%AB default : [500,false,"上右3下2左上左2"] colour : this.dataColor -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; Bool_0 = Bool_0?', "async": true':''; var code = '{"type": "moveHero"'+Int_0+Bool_0+', "steps": '+JSON.stringify(StepString_0)+'},\n'; return code; @@ -1221,7 +1221,7 @@ if (PosString_0 && PosString_1) { if (PosString_2 && PosString_3) { floorstr += ', "to": ['+PosString_2+','+PosString_3+']'; } -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; Bool_0 = Bool_0?', "keep": true':''; Bool_1 = Bool_1?', "async": true':''; var code = '{"type": "jump"'+floorstr+''+Int_0+Bool_0+Bool_1+'},\n'; @@ -1241,7 +1241,7 @@ var floorstr = ''; if (PosString_0 && PosString_1) { floorstr = ', "loc": ['+PosString_0+','+PosString_1+']'; } -Int_0 = Int_0 ?(', "time": '+Int_0):''; +Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; Bool_0 = Bool_0?', "async": true':''; var code = '{"type": "jumpHero"'+floorstr+Int_0+Bool_0+'},\n'; return code; @@ -1306,7 +1306,7 @@ tooltip : setVolume: 设置音量 helpUrl : https://h5mota.com/games/template/docs/#/event?id=setvolume%EF%BC%9A%E8%AE%BE%E7%BD%AE%E9%9F%B3%E9%87%8F default : [90, 500, false] colour : this.soundColor -Int_1 = Int_1?(', "time": '+Int_1):"" +Int_1 = Int_1!==''?(', "time": '+Int_1):"" var async = Bool_0?', "async": true':''; var code = '{"type": "setVolume", "value": '+Int_0+Int_1+async+'},\n'; return code; @@ -1917,9 +1917,8 @@ ActionParser.prototype.parseAction = function() { this.EvalString(data.text),this.next]); break; case "autoText": // 自动剧情文本 - data.time=this.isset(data.time)?data.time:MotaActionBlocks['autoText_s'].fieldDefault[3]; this.next = MotaActionBlocks['autoText_s'].xmlText([ - '','','',data.time||0,this.EvalString(data.text),this.next]); + '','','',data.time,this.EvalString(data.text),this.next]); break; case "scrollText": this.next = MotaActionBlocks['scrollText_s'].xmlText([ From 2a855900555b217f7dae937a7155ded7ad6b7a59 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 11 Dec 2018 17:22:22 +0800 Subject: [PATCH 12/34] blockly Int_0 --- _server/blockly/MotaAction.g4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index edd7d58e..5b681deb 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -1131,7 +1131,7 @@ var limit = function(v,min,max) { return v; } Number_0 = limit(Number_0,0,255); -Number_1 = limit(Number_1,0,255);A +Number_1 = limit(Number_1,0,255); Number_2 = limit(Number_2,0,255); Number_3 = limit(Number_3,0,1); Int_0 = Int_0!=='' ?(', "time": '+Int_0):''; From 64a0f0a6aaec62d24906b4e76cdbaad8e6160164 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 11 Dec 2018 18:52:51 +0800 Subject: [PATCH 13/34] Fix item & core.status.event.data --- libs/items.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/items.js b/libs/items.js index fcba3daa..f8a7bfc1 100644 --- a/libs/items.js +++ b/libs/items.js @@ -91,6 +91,7 @@ items.prototype.useItem = function (itemId, callback) { delete core.status.hero.items[itemCls][itemId]; core.updateStatusBar(); + core.status.event.data = null; if (core.isset(callback)) callback(); } @@ -100,16 +101,18 @@ items.prototype.canUseItem = function (itemId) { // 没有道具 if (!core.hasItem(itemId)) return false; + var able = false; if (itemId in this.canUseItemEffect) { try { - return eval(this.canUseItemEffect[itemId]); + able = eval(this.canUseItemEffect[itemId]); } catch (e) { console.log(e); } } + if (!able) core.status.event.data = null; - return false; + return able; } ////// 获得某个物品的个数 ////// From 0d587ac712b2d6d152ca810222b92a2bae8e89e2 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 11 Dec 2018 19:44:00 +0800 Subject: [PATCH 14/34] reset status bar on restart --- libs/control.js | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/control.js b/libs/control.js index 3be65956..64db5a3d 100644 --- a/libs/control.js +++ b/libs/control.js @@ -397,6 +397,7 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps, value else core.values = core.clone(core.data.values); core.events.initGame(); + this.updateGlobalAttribute(Object.keys(core.status.globalAttribute)); core.status.played = true; } From b646c1cb3e080014bbb68665d9d0437aa2118fd4 Mon Sep 17 00:00:00 2001 From: oc Date: Tue, 11 Dec 2018 23:28:00 +0800 Subject: [PATCH 15/34] firstArrive before eachArrive --- _server/comment.js | 2 +- libs/events.js | 2 +- project/functions.js | 11 +++++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/_server/comment.js b/_server/comment.js index 9577712f..c38b6cd9 100644 --- a/_server/comment.js +++ b/_server/comment.js @@ -334,7 +334,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_leaf": true, "_type": "event", "_event": "eachArrive", - "_data": "每次到该楼层触发的事件,可以双击进入事件编辑器;该事件会比firstArrive先执行。" + "_data": "每次到该楼层触发的事件,可以双击进入事件编辑器;该事件会在firstArrive执行后再执行。" }, "parallelDo": { "_leaf": true, diff --git a/libs/events.js b/libs/events.js index 97fb8201..7588fbaa 100644 --- a/libs/events.js +++ b/libs/events.js @@ -117,7 +117,7 @@ events.prototype.startGame = function (hard, seed, route, callback) { core.changeFloor(core.firstData.floorId, null, nowLoc, null, function() { if (core.isset(callback)) callback(); - }, true); + }); setTimeout(function () { // Upload diff --git a/project/functions.js b/project/functions.js index d2ffbc3e..21852685 100644 --- a/project/functions.js +++ b/project/functions.js @@ -87,16 +87,19 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = "afterChangeFloor": function (floorId, fromLoad) { // 转换楼层结束的事件 // floorId是切换到的楼层;fromLoad若为true则代表是从读档行为造成的楼层切换 + + // 每次抵达楼层时执行的事件 + if (!fromLoad) { + core.insertAction(core.floors[floorId].eachArrive); + } + + // 首次抵达楼层时执行的事件(后插入,先执行) var visited = core.getFlag("__visited__", []); if (visited.indexOf(floorId)===-1) { core.insertAction(core.floors[floorId].firstArrive); visited.push(floorId); core.setFlag("__visited__", visited); } - // 每次抵达楼层时执行的事件 - if (!fromLoad) { - core.insertAction(core.floors[floorId].eachArrive); - } }, "addPoint": function (enemy) { // 加点事件 From 7671a925862473a527e23a64d2425dda78ad98d1 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 12 Dec 2018 12:41:57 +0800 Subject: [PATCH 16/34] formatBigNumber --- docs/api.md | 2 +- libs/control.js | 8 ++++---- libs/core.js | 4 ++-- libs/ui.js | 8 ++++---- libs/utils.js | 18 +++++++++++++----- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/api.md b/docs/api.md index 7ea7b61c..bba4bba2 100644 --- a/docs/api.md +++ b/docs/api.md @@ -504,7 +504,7 @@ core.utils.decodeBase64(str) Base64解密字符串 -core.utils.formatBigNumber(x) +core.utils.formatBigNumber(x, onMap) 大数据的格式化 diff --git a/libs/control.js b/libs/control.js index 64db5a3d..399f0adf 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1374,7 +1374,7 @@ control.prototype.snipe = function (snipes) { else if (damage < core.status.hero.hp) color = '#FF7F00'; else color = '#FF0000'; - damage = core.formatBigNumber(damage); + damage = core.formatBigNumber(damage, true); if (core.enemys.hasSpecial(core.material.enemys[block.event.id], 19)) damage += "+"; if (core.enemys.hasSpecial(core.material.enemys[block.event.id], 21)) @@ -1623,7 +1623,7 @@ control.prototype.updateDamage = function (floorId, canvas) { else if (damage < hero_hp * 2 / 3) color = '#FFFF00'; else if (damage < hero_hp) color = '#FF7F00'; else color = '#FF0000'; - damage = core.formatBigNumber(damage); + damage = core.formatBigNumber(damage, true); if (core.enemys.hasSpecial(core.material.enemys[id], 19)) damage += "+"; if (core.enemys.hasSpecial(core.material.enemys[id], 21)) @@ -1646,7 +1646,7 @@ control.prototype.updateDamage = function (floorId, canvas) { if (core.flags.displayCritical) { var critical = core.enemys.nextCriticals(id); if (critical.length>0) critical=critical[0]; - critical = core.formatBigNumber(critical[0]); + critical = core.formatBigNumber(critical[0], true); if (critical == '???') critical = '?'; canvas.fillStyle = '#000000'; canvas.fillText(critical, 32 * x + 2, 32 * (y + 1) - 2 - 10); @@ -1678,7 +1678,7 @@ control.prototype.updateDamage = function (floorId, canvas) { for (var y=0;y0) { - damage = core.formatBigNumber(damage); + damage = core.formatBigNumber(damage, true); canvas.fillStyle = '#000000'; canvas.fillText(damage, 32 * x + 17, 32 * (y + 1) - 13); canvas.fillText(damage, 32 * x + 15, 32 * (y + 1) - 15); diff --git a/libs/core.js b/libs/core.js index b77b0288..b25d05ba 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1037,8 +1037,8 @@ core.prototype.formatDate2 = function (date) { } ////// 格式化大数 ////// -core.prototype.formatBigNumber = function (x) { - return core.utils.formatBigNumber(x); +core.prototype.formatBigNumber = function (x, onMap) { + return core.utils.formatBigNumber(x, onMap); } ////// 两位数显示 ////// diff --git a/libs/ui.js b/libs/ui.js index a620dfb6..0f60f6db 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2225,8 +2225,8 @@ ui.prototype.drawSLPanel = function(index, refresh) { core.strokeRect('ui', (2*i+1)*u-size/2, 45, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); if (core.isset(data) && core.isset(data.floorId)) { core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 45, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); - var v = core.formatBigNumber(data.hero.hp)+"/"+core.formatBigNumber(data.hero.atk)+"/"+core.formatBigNumber(data.hero.def); - var v2 = "/"+core.formatBigNumber(data.hero.mdef); + var v = core.formatBigNumber(data.hero.hp,true)+"/"+core.formatBigNumber(data.hero.atk,true)+"/"+core.formatBigNumber(data.hero.def,true); + var v2 = "/"+core.formatBigNumber(data.hero.mdef,true); if (v.length+v2.length<=21) v+=v2; core.fillText('ui', v, (2*i+1)*u, 60+size, '#FFD700', '10px '+globalFont); core.fillText('ui', core.formatDate(new Date(data.time)), (2*i+1)*u, 73+size, data.hero.flags.consoleOpened?'#FF6A6A':'#FFFFFF'); @@ -2241,8 +2241,8 @@ ui.prototype.drawSLPanel = function(index, refresh) { core.strokeRect('ui', (2*i-5)*u-size/2, 233, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); if (core.isset(data) && core.isset(data.floorId)) { core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 233, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); - var v = core.formatBigNumber(data.hero.hp)+"/"+core.formatBigNumber(data.hero.atk)+"/"+core.formatBigNumber(data.hero.def); - var v2 = "/"+core.formatBigNumber(data.hero.mdef); + var v = core.formatBigNumber(data.hero.hp,true)+"/"+core.formatBigNumber(data.hero.atk,true)+"/"+core.formatBigNumber(data.hero.def,true); + var v2 = "/"+core.formatBigNumber(data.hero.mdef,true); if (v.length+v2.length<=21) v+=v2; core.fillText('ui', v, (2*i-5)*u, 248+size, '#FFD700', '10px '+globalFont); core.fillText('ui', core.formatDate(new Date(data.time)), (2*i-5)*u, 261+size, data.hero.flags.consoleOpened?'#FF6A6A':'#FFFFFF', '10px '+globalFont); diff --git a/libs/utils.js b/libs/utils.js index b5dcdd2e..e7ba2f23 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -297,14 +297,14 @@ utils.prototype.setTwoDigits = function (x) { return parseInt(x)<10?"0"+x:x; } -utils.prototype.formatBigNumber = function (x) { +utils.prototype.formatBigNumber = function (x, onMap) { x = Math.floor(parseFloat(x)); if (!core.isset(x)) return '???'; var c = x<0?"-":""; x = Math.abs(x); - if (x<=999999) return c + x; + if (x<=99999 || (!onMap && x<=999999)) return c + x; var all = [ {"val": 1e20, "c": "g"}, @@ -316,9 +316,17 @@ utils.prototype.formatBigNumber = function (x) { for (var i=0;i=10*one.val) { - var v = x/one.val; - return c + v.toFixed(Math.max(0, Math.floor(4-Math.log10(v+1)))) + one.c; + if (onMap) { + if (x>=one.val) { + var v = x/one.val; + return c + v.toFixed(Math.max(0, Math.floor(3-Math.log10(v+1)))) + one.c; + } + } + else { + if (x>=10*one.val) { + var v = x/one.val; + return c + v.toFixed(Math.max(0, Math.floor(4-Math.log10(v+1)))) + one.c; + } } } From ccb89e422fcb70da9eac8dd9d486a26d10b5eb5a Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 12 Dec 2018 16:19:42 +0800 Subject: [PATCH 17/34] setInterval time & load statusBar --- libs/control.js | 19 +++++++++---------- libs/events.js | 20 ++++++++++---------- libs/maps.js | 9 +++++---- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/libs/control.js b/libs/control.js index 399f0adf..dc23bb33 100644 --- a/libs/control.js +++ b/libs/control.js @@ -354,9 +354,6 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps, value // 清除游戏数据 core.clearStatus(); - // 显示状态栏 - core.control.triggerStatusBar("show"); - // 初始化status core.status = core.clone(core.initStatus); // 初始化maps @@ -398,6 +395,7 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps, value core.events.initGame(); this.updateGlobalAttribute(Object.keys(core.status.globalAttribute)); + this.triggerStatusBar(core.getFlag('hideStatusBar', false)?'hide':'show'); core.status.played = true; } @@ -1556,15 +1554,15 @@ control.prototype.setFg = function(color, time, callback) { return; } - var step=0; - // core.status.replay.animate=true; + var per_time = 10, step=0, steps = parseInt(time / per_time); + var changeAnimate = setInterval(function() { step++; - var nowA = fromColor[3]+(color[3]-fromColor[3])*step/25; - var nowR = parseInt(fromColor[0]+(color[0]-fromColor[0])*step/25); - var nowG = parseInt(fromColor[1]+(color[1]-fromColor[1])*step/25); - var nowB = parseInt(fromColor[2]+(color[2]-fromColor[2])*step/25); + var nowA = fromColor[3]+(color[3]-fromColor[3])*step/steps; + var nowR = parseInt(fromColor[0]+(color[0]-fromColor[0])*step/steps); + var nowG = parseInt(fromColor[1]+(color[1]-fromColor[1])*step/steps); + var nowB = parseInt(fromColor[2]+(color[2]-fromColor[2])*step/steps); core.clearMap('curtain'); core.fillRect('curtain', 0, 0, 416, 416, core.arrayToRGBA([nowR,nowG,nowB,nowA])); @@ -1575,7 +1573,7 @@ control.prototype.setFg = function(color, time, callback) { // core.status.replay.animate=false; if (core.isset(callback)) callback(); } - }, time/25/core.status.replay.speed); + }, per_time); core.animateFrame.asyncId[changeAnimate] = true; } @@ -2832,6 +2830,7 @@ control.prototype.triggerStatusBar = function (name) { var statusItems = core.dom.status; var toolItems = core.dom.tools; core.domStyle.showStatusBar = name == 'show'; + core.setFlag('hideStatusBar', core.domStyle.showStatusBar?null:true); if (!core.domStyle.showStatusBar) { for (var i = 0; i < statusItems.length; ++i) statusItems[i].style.opacity = 0; diff --git a/libs/events.js b/libs/events.js index 7588fbaa..f17e8529 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1575,10 +1575,11 @@ events.prototype.animateImage = function (type, image, loc, time, keep, callback core.canvas.data.drawImage(image, x, y); core.setAlpha('data', 1); - // core.status.replay.animate=true; + var per_time = 10, steps = parseInt(time / per_time), delta = 1 / steps; + var animate = setInterval(function () { - if (type=='show') alpha += 0.1; - else alpha -= 0.1; + if (type=='show') alpha += delta; + else alpha -= delta; core.clearMap('data', x, y, image.width, image.height); if (alpha >=1 || alpha<=0) { delete core.animateFrame.asyncId[animate]; @@ -1593,7 +1594,7 @@ events.prototype.animateImage = function (type, image, loc, time, keep, callback core.canvas.data.drawImage(image, x, y); core.setAlpha('data', 1); } - }, time / 10); + }, per_time); core.animateFrame.asyncId[animate] = true; } @@ -1653,21 +1654,20 @@ events.prototype.setVolume = function (value, time, callback) { if (core.isset(callback)) callback(); return; } - // core.status.replay.animate=true; + var currVolume = core.musicStatus.volume; - var step = 0; + var per_time = 10, step = 0, steps = parseInt(time / per_time); var fade = setInterval(function () { step++; - var nowVolume = currVolume+(value-currVolume)*step/32; + var nowVolume = currVolume+(value-currVolume)*step/steps; set(nowVolume); - if (step>=32) { + if (step>=steps) { delete core.animateFrame.asyncId[fade]; clearInterval(fade); - // core.status.replay.animate=false; if (core.isset(callback)) callback(); } - }, time / 32); + }, per_time); core.animateFrame.asyncId[fade] = true; } diff --git a/libs/maps.js b/libs/maps.js index 4d8ac72d..12865f76 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -1091,9 +1091,10 @@ maps.prototype.animateBlock = function (loc,type,time,callback) { core.setAlpha('route', alpha); draw(); - var animate = window.setInterval(function () { - if (type=='show') alpha += 0.1; - else alpha -= 0.1; + var per_time = 10, steps = parseInt(time / per_time), delta = 1 / steps; + var animate = setInterval(function () { + if (type=='show') alpha += delta; + else alpha -= delta; clear(); if (alpha >=1 || alpha<=0) { delete core.animateFrame.asyncId[animate]; @@ -1115,7 +1116,7 @@ maps.prototype.animateBlock = function (loc,type,time,callback) { core.setAlpha('route', alpha); draw(); } - }, time / 10 / core.status.replay.speed); + }, per_time); core.animateFrame.asyncId[animate] = true; } From e5a7c9e10c3f2ecdd91906a38dbdcb7c4ae822e6 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 12 Dec 2018 16:37:16 +0800 Subject: [PATCH 18/34] setInterval time & load statusBar --- libs/control.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/control.js b/libs/control.js index dc23bb33..beaeb8cc 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1566,7 +1566,7 @@ control.prototype.setFg = function(color, time, callback) { core.clearMap('curtain'); core.fillRect('curtain', 0, 0, 416, 416, core.arrayToRGBA([nowR,nowG,nowB,nowA])); - if (step>=25) { + if (step>=steps) { delete core.animateFrame.asyncId[changeAnimate]; clearInterval(changeAnimate); core.status.curtainColor = color; From 3d2e0c06bb500f7eccff8619e3120d5aa3ec19e4 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 12 Dec 2018 23:07:38 +0800 Subject: [PATCH 19/34] Fix Ctrl+Z --- _server/editor.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index f83e68b4..c9622e6f 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -235,6 +235,7 @@ editor.prototype.changeFloor = function (floorId, callback) { }); editor.currentFloorData[name]=mapArray; } + editor.preMapData = null; core.changeFloor(floorId, null, {"x": 0, "y": 0, "direction": "up"}, null, function () { core.bigmap.offsetX=0; core.bigmap.offsetY=0; @@ -728,7 +729,7 @@ editor.prototype.listen = function () { holdingPath = 0; e.stopPropagation(); if (stepPostfix && stepPostfix.length) { - 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'){ var x0=stepPostfix[0].x; var y0=stepPostfix[0].y; @@ -822,7 +823,7 @@ editor.prototype.listen = function () { } } - var preMapData = {}; + editor.preMapData = null; var currDrawData = { pos: [], info: {} @@ -836,18 +837,18 @@ editor.prototype.listen = function () { if (e.altKey && [48, 49, 50, 51, 52, 53, 54, 55, 56, 57].indexOf(e.keyCode) !== -1) e.preventDefault(); //Ctrl+z 撤销上一步undo - if (e.keyCode == 90 && e.ctrlKey && preMapData && currDrawData.pos.length && selectBox.isSelected) { - editor.map = JSON.parse(JSON.stringify(preMapData.map)); - editor.fgmap = JSON.parse(JSON.stringify(preMapData.fgmap)); - editor.bgmap = JSON.parse(JSON.stringify(preMapData.bgmap)); + if (e.keyCode == 90 && e.ctrlKey && editor.preMapData && currDrawData.pos.length && selectBox.isSelected) { + editor.map = JSON.parse(JSON.stringify(editor.preMapData.map)); + editor.fgmap = JSON.parse(JSON.stringify(editor.preMapData.fgmap)); + editor.bgmap = JSON.parse(JSON.stringify(editor.preMapData.bgmap)); editor.updateMap(); reDo = JSON.parse(JSON.stringify(currDrawData)); currDrawData = {pos: [], info: {}}; - preMapData = null; + editor.preMapData = null; } //Ctrl+y 重做一步redo if (e.keyCode == 89 && e.ctrlKey && reDo && reDo.pos.length && selectBox.isSelected) { - 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})); for (var j = 0; j < reDo.pos.length; j++) editor.map[reDo.pos[j].y][reDo.pos[j].x] = JSON.parse(JSON.stringify(reDo.info)); @@ -1027,7 +1028,7 @@ editor.prototype.listen = function () { copyLoc.onmousedown = function(e){ editor.hideMidMenu(); e.stopPropagation(); - preMapData = null; + editor.preMapData = null; reDo = null; editor_mode.onmode(''); var now = editor.pos; @@ -1060,7 +1061,7 @@ editor.prototype.listen = function () { moveLoc.onmousedown = function(e){ editor.hideMidMenu(); e.stopPropagation(); - preMapData = null; + editor.preMapData = null; reDo = null; var thisevent = editor.map[editor.pos.y][editor.pos.x]; if(thisevent==0){ @@ -1106,7 +1107,7 @@ editor.prototype.listen = function () { clearLoc.onmousedown = function(e){ editor.hideMidMenu(); e.stopPropagation(); - preMapData = null; + editor.preMapData = null; reDo = null; editor.info = 0; editor_mode.onmode(''); From edb3f031361e008b42cca3c5ab00ca998dfab6bd Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 12 Dec 2018 23:21:28 +0800 Subject: [PATCH 20/34] draw confirm box with winskin --- libs/ui.js | 50 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/libs/ui.js b/libs/ui.js index 0f60f6db..b3ea38ed 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -927,9 +927,17 @@ ui.prototype.drawConfirmBox = function (text, yesCallback, noCallback) { if (!core.isset(core.status.event.selection) || core.status.event.selection>1) core.status.event.selection=1; if (core.status.event.selection<0) core.status.event.selection=0; - core.clearMap('ui'); - core.setAlpha('ui', 1); - core.setFillStyle('ui', core.material.groundPattern); + var background = core.status.textAttribute.background; + var isWindowSkin = false; + if (typeof background == 'string') { + background = core.material.images.images[background]; + if (core.isset(background) && background.width==192 && background.height==128) isWindowSkin = true; + else background = core.initStatus.textAttribute.background; + } + if (!isWindowSkin) background = core.arrayToRGBA(background); + var borderColor = core.status.globalAttribute.borderColor; + var textColor = core.arrayToRGBA(core.status.textAttribute.text); + var globalFont = core.status.globalAttribute.font; core.setFont('ui', "bold 19px "+globalFont); @@ -942,29 +950,35 @@ ui.prototype.drawConfirmBox = function (text, yesCallback, noCallback) { var left = Math.min(208 - 40 - parseInt(max_length / 2), 100); var top = 140 - (lines-1)*30; - var right = 416 - 2 * left, bottom = 416 - 140 - top; + var right = 416 - left, bottom = 416 - 140, width = right - left, height = bottom - top; - var borderColor = core.status.globalAttribute.borderColor; + core.clearMap('ui'); + if (isWindowSkin) { + core.setAlpha('ui', 0.85); + this.drawWindowSkin(background,'ui',left,top,width,height); + } + else { + core.fillRect('ui', left, top, width, height, background); + core.strokeRect('ui', left - 1, top - 1, width + 1, height + 1, borderColor, 2); + } + core.setAlpha('ui', 1); - if (core.isPlaying()) - core.fillRect('ui', left, top, right, bottom, core.material.groundPattern); - if (core.isPlaying()) - core.strokeRect('ui', left - 1, top - 1, right + 1, bottom + 1, borderColor, 2); core.canvas.ui.textAlign = "center"; for (var i in contents) { - core.fillText('ui', contents[i], 208, top + 50 + i*30, "#FFFFFF"); + core.fillText('ui', contents[i], 208, top + 50 + i*30, textColor); } - core.fillText('ui', "确定", 208 - 38, top + bottom - 35, "#FFFFFF", "bold 17px "+globalFont); - core.fillText('ui', "取消", 208 + 38, top + bottom - 35); + core.fillText('ui', "确定", 208 - 38, bottom - 35, null, "bold 17px "+globalFont); + core.fillText('ui', "取消", 208 + 38, bottom - 35); var len=core.canvas.ui.measureText("确定").width; - if (core.status.event.selection==0) { - core.strokeRect('ui', 208-38-parseInt(len/2)-5, top+bottom-35-20, len+10, 28, "#FFD700", 2); - } - if (core.status.event.selection==1) { - core.strokeRect('ui', 208+38-parseInt(len/2)-5, top+bottom-35-20, len+10, 28, "#FFD700", 2); - } + + var strokeLeft = 208 + (76*core.status.event.selection-38) - parseInt(len/2) - 5; + + if (isWindowSkin) + this.drawWindowSelector(background, 'ui', strokeLeft, bottom-35-20, len+10, 28); + else + core.strokeRect('ui', strokeLeft, bottom-35-20, len+10, 28, "#FFD700", 2); } From 21abbf933f4fb5c6faa7e4cfafb3cf243bd30e24 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 12 Dec 2018 23:27:07 +0800 Subject: [PATCH 21/34] Move view project & download to gameInfo --- libs/actions.js | 32 ++++++++++++++++---------------- libs/ui.js | 4 +--- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index e51b297d..fe5a6750 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1821,19 +1821,6 @@ actions.prototype.clickSwitchs = function (x,y) { core.ui.drawSwitchs(); break; case 8: - if (core.platform.isPC) - window.open("editor.html", "_blank"); - else if (confirm("即将离开本塔,跳转至本塔工程页面,确认?")) { - window.location.href = "editor-mobile.html"; - } - break; - case 9: - if (core.platform.isPC) - window.open(core.firstData.name+".zip"); - else - window.location.href = core.firstData.name+".zip"; - break; - case 10: core.status.event.selection=0; core.ui.drawSettings(); break; @@ -2414,6 +2401,13 @@ actions.prototype.clickGameInfo = function (x, y) { core.ui.drawStatistics(); break; case 1: + if (core.platform.isPC) + window.open("editor.html", "_blank"); + else if (confirm("即将离开本塔,跳转至本塔工程页面,确认?")) { + window.location.href = "editor-mobile.html"; + } + break; + case 2: if (core.platform.isPC) { window.open("/score.php?name="+core.firstData.name+"&num=10", "_blank"); } @@ -2423,13 +2417,19 @@ actions.prototype.clickGameInfo = function (x, y) { } } break; - case 2: + case 3: core.ui.drawHelp(); break; - case 3: + case 4: core.ui.drawAbout(); break; - case 4: + case 5: + if (core.platform.isPC) + window.open(core.firstData.name+".zip"); + else + window.location.href = core.firstData.name+".zip"; + break; + case 6: core.status.event.selection=5; core.ui.drawSettings(); break; diff --git a/libs/ui.js b/libs/ui.js index b3ea38ed..ec7c1dec 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -995,8 +995,6 @@ ui.prototype.drawSwitchs = function() { "领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"), "新版存档: "+(core.platform.useLocalForage ? "[ON]":"[OFF]"), "单击瞬移: "+(core.getFlag('clickMove', true) ? "[ON]":"[OFF]"), - "查看工程", - "下载离线版本", "返回主菜单" ]; this.drawChoices(null, choices); @@ -1401,7 +1399,7 @@ ui.prototype.drawReplay = function () { ui.prototype.drawGameInfo = function () { core.status.event.id = 'gameInfo'; this.drawChoices(null, [ - "数据统计", "查看评论", "操作帮助", "关于本塔", "返回上级菜单" + "数据统计", "查看工程", "查看评论", "操作帮助", "关于本塔","下载离线版本", "返回主菜单" ]); } From 682873673b6170e02b69cf686bd64bcc74543943 Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Wed, 12 Dec 2018 18:27:34 -0500 Subject: [PATCH 22/34] lastusedblocks --- _server/editor_blockly.js | 50 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 864fb7fd..4d4af6a0 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -4,12 +4,13 @@ editor_blockly = function () { initscript = String.raw` (function(){ - var getCategory = function(name){ + var getCategory = function(name,custom){ for(var node of document.getElementById('toolbox').children) { if(node.getAttribute('name')==name) return node; } var node = document.createElement('category'); node.setAttribute('name',name); + if(custom)node.setAttribute('custom',custom); document.getElementById('toolbox').appendChild(node); return node; } @@ -243,15 +244,19 @@ editor_blockly = function () { } ] },'event'), - ], + '最近使用':[ + '', + ] } var toolboxgap = '' //xml_text = MotaActionFunctions.actionParser.parse(obj,type||'event') //MotaActionBlocks['idString_e'].xmlText() for (var name in toolboxObj){ - getCategory(name).innerHTML = toolboxObj[name].join(toolboxgap); + var custom = null; + if(name=='最近使用')custom='searchBlockCategory'; + getCategory(name,custom).innerHTML = toolboxObj[name].join(toolboxgap); } var blocklyArea = document.getElementById('blocklyArea'); @@ -269,6 +274,24 @@ var workspace = Blockly.inject(blocklyDiv,{ }, trashcan: false, }); + +editor_blockly.searchBlockCategoryCallback = function(workspace) { + //var colourList = ['#4286f4', '#ef0447']; + var xmlList = []; + if (Blockly.Blocks['colour_picker']) { + for (var i = 0; i < editor_blockly.lastUsedType.length; i++) { + var blockText = '' + + MotaActionBlocks[editor_blockly.lastUsedType[i]].xmlText() + + ''; + var block = Blockly.Xml.textToDom(blockText).firstChild; + xmlList.push(block); + } + } + return xmlList; +}; + +workspace.registerToolboxCategoryCallback( + 'searchBlockCategory', editor_blockly.searchBlockCategoryCallback); var onresize = function(e) { blocklyDiv.style.width = blocklyArea.offsetWidth + 'px'; @@ -291,6 +314,12 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ var doubleClickCheck=[[0,'abc']]; function omitedcheckUpdateFunction(event) { + console.log(event) + console.log(event.type) + + if(event.type==='ui'||event.type==='move'){ + editor_blockly.addIntoLastUsedType(event.blockId); + } if(event.type==='ui'){ var newClick = [new Date().getTime(),event.blockId]; var lastClick = doubleClickCheck.shift(); @@ -511,6 +540,21 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ } } + editor_blockly.lastUsedType=['comment_s']//初始空着比较难看 + editor_blockly.lastUsedTypeNum=15 + + editor_blockly.addIntoLastUsedType=function(blockId){ + var b = editor_blockly.workspace.getBlockById(blockId); + if(!b)return; + var blockType = b.type; + if(!blockType || ['pass_s','emptyshop'].indexOf(blockType)!==-1)return; + if(editor_blockly.lastUsedType.indexOf(blockType)!==-1){ + editor_blockly.lastUsedType.splice(editor_blockly.lastUsedType.indexOf(blockType),1) + } + editor_blockly.lastUsedType.unshift(blockType) + editor_blockly.lastUsedType=editor_blockly.lastUsedType.slice(0,editor_blockly.lastUsedTypeNum) + } + return editor_blockly; } //editor_blockly=editor_blockly(); \ No newline at end of file From 556dd15dc2bf36c6461ac3b5187a829c1122eb50 Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Wed, 12 Dec 2018 18:31:59 -0500 Subject: [PATCH 23/34] delete console.log(...) --- _server/editor_blockly.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 4d4af6a0..c8ff17ff 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -276,7 +276,6 @@ var workspace = Blockly.inject(blocklyDiv,{ }); editor_blockly.searchBlockCategoryCallback = function(workspace) { - //var colourList = ['#4286f4', '#ef0447']; var xmlList = []; if (Blockly.Blocks['colour_picker']) { for (var i = 0; i < editor_blockly.lastUsedType.length; i++) { @@ -314,9 +313,6 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ var doubleClickCheck=[[0,'abc']]; function omitedcheckUpdateFunction(event) { - console.log(event) - console.log(event.type) - if(event.type==='ui'||event.type==='move'){ editor_blockly.addIntoLastUsedType(event.blockId); } From 560c6136f7de463c183c6ee5ddd027316f4c5385 Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Wed, 12 Dec 2018 18:33:57 -0500 Subject: [PATCH 24/34] fix --- _server/editor_blockly.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index c8ff17ff..dd449a91 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -277,14 +277,12 @@ var workspace = Blockly.inject(blocklyDiv,{ editor_blockly.searchBlockCategoryCallback = function(workspace) { var xmlList = []; - if (Blockly.Blocks['colour_picker']) { - for (var i = 0; i < editor_blockly.lastUsedType.length; i++) { - var blockText = '' + - MotaActionBlocks[editor_blockly.lastUsedType[i]].xmlText() + - ''; - var block = Blockly.Xml.textToDom(blockText).firstChild; - xmlList.push(block); - } + for (var i = 0; i < editor_blockly.lastUsedType.length; i++) { + var blockText = '' + + MotaActionBlocks[editor_blockly.lastUsedType[i]].xmlText() + + ''; + var block = Blockly.Xml.textToDom(blockText).firstChild; + xmlList.push(block); } return xmlList; }; From 5669197fbceeb5e885bbf75eddd3f7222a4df7b5 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 13 Dec 2018 15:10:55 +0800 Subject: [PATCH 25/34] Last Used Items --- _server/editor_blockly.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index dd449a91..12959257 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -282,6 +282,7 @@ editor_blockly.searchBlockCategoryCallback = function(workspace) { MotaActionBlocks[editor_blockly.lastUsedType[i]].xmlText() + ''; var block = Blockly.Xml.textToDom(blockText).firstChild; + block.setAttribute("gap", 5); xmlList.push(block); } return xmlList; @@ -311,7 +312,7 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ var doubleClickCheck=[[0,'abc']]; function omitedcheckUpdateFunction(event) { - if(event.type==='ui'||event.type==='move'){ + if(event.type==='move'){ editor_blockly.addIntoLastUsedType(event.blockId); } if(event.type==='ui'){ @@ -535,18 +536,18 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ } editor_blockly.lastUsedType=['comment_s']//初始空着比较难看 - editor_blockly.lastUsedTypeNum=15 + editor_blockly.lastUsedTypeNum=15; - editor_blockly.addIntoLastUsedType=function(blockId){ + editor_blockly.addIntoLastUsedType=function(blockId) { var b = editor_blockly.workspace.getBlockById(blockId); if(!b)return; var blockType = b.type; - if(!blockType || ['pass_s','emptyshop'].indexOf(blockType)!==-1)return; - if(editor_blockly.lastUsedType.indexOf(blockType)!==-1){ - editor_blockly.lastUsedType.splice(editor_blockly.lastUsedType.indexOf(blockType),1) - } - editor_blockly.lastUsedType.unshift(blockType) - editor_blockly.lastUsedType=editor_blockly.lastUsedType.slice(0,editor_blockly.lastUsedTypeNum) + if(!blockType || blockType.indexOf("_s")!==blockType.length-2 || blockType==='pass_s')return; + console.log(b); + editor_blockly.lastUsedType = editor_blockly.lastUsedType.filter(function (v) {return v!==blockType;}); + if (editor_blockly.lastUsedType.length >= editor_blockly.lastUsedTypeNum) + editor_blockly.lastUsedType.pop(); + editor_blockly.lastUsedType.unshift(blockType); } return editor_blockly; From ecdea0785675f0ab60b51cba05aeaf0e75905cfc Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 13 Dec 2018 15:26:01 +0800 Subject: [PATCH 26/34] Frequently & Last Used Blocks --- _server/editor_blockly.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 12959257..a966619f 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -245,7 +245,7 @@ editor_blockly = function () { ] },'event'), ], - '最近使用':[ + '最近使用事件':[ '', ] } @@ -255,7 +255,7 @@ editor_blockly = function () { for (var name in toolboxObj){ var custom = null; - if(name=='最近使用')custom='searchBlockCategory'; + if(name=='最近使用事件')custom='searchBlockCategory'; getCategory(name,custom).innerHTML = toolboxObj[name].join(toolboxgap); } @@ -535,7 +535,22 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ } } - editor_blockly.lastUsedType=['comment_s']//初始空着比较难看 + editor_blockly.lastUsedType=[ + 'text_0_s', + 'comment_s', + 'show_s', + 'hide_s', + 'setValue_s', + 'if_s', + 'battle_s', + 'openDoor_s', + 'choices_s', + 'setText_s', + 'exit_s', + 'revisit_s', + 'sleep_s', + 'setBlock_s' + ]; // 最常用的15个图块 editor_blockly.lastUsedTypeNum=15; editor_blockly.addIntoLastUsedType=function(blockId) { From e4d985c8b6963621d6f0cbd669297950aa350be8 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 13 Dec 2018 17:22:56 +0800 Subject: [PATCH 27/34] Fix paint bugs --- libs/utils.js | 12 +++++++----- project/functions.js | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libs/utils.js b/libs/utils.js index e7ba2f23..45313e71 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -813,6 +813,12 @@ utils.prototype.encodeCanvas = function (ctx) { ////// 解析arr数组,并绘制到tempCanvas上 ////// utils.prototype.decodeCanvas = function (arr, width, height) { + // 清空tempCanvas + var tempCanvas = core.bigmap.tempCanvas; + tempCanvas.canvas.width=width; + tempCanvas.canvas.height=height; + tempCanvas.clearRect(0, 0, width, height); + if (!core.isset(arr)) return null; // to byte array var curr = 0, list = []; @@ -820,11 +826,6 @@ utils.prototype.decodeCanvas = function (arr, width, height) { for (var i=0;i threshold diff --git a/project/functions.js b/project/functions.js index 21852685..0d47e471 100644 --- a/project/functions.js +++ b/project/functions.js @@ -1040,8 +1040,8 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = ctx.drawImage(core.statusBar.icons[name], leftOffset, topOffset, 25, 25); // 文字内容 var text = (core.statusBar[name]||{}).innerText || " "; - // 斜体判定:如果不是纯数字,斜体会非常难看,需要取消 - if (!/^\d*$/.test(text)) ctx.font = 'bold 18px Verdana'; + // 斜体判定:如果不是纯数字和字母,斜体会非常难看,需要取消 + if (!/^[-+_.a-zA-Z0-9]*$/.test(text)) ctx.font = 'bold 18px Verdana'; // 绘制文字 ctx.fillText(text, leftOffset + 36, topOffset + 20); ctx.font = 'italic bold 18px Verdana'; From efacefbc587ee507ba8618e0f4d0f4d7579628e5 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 13 Dec 2018 18:32:05 +0800 Subject: [PATCH 28/34] Fix showImage with flag --- libs/events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/events.js b/libs/events.js index f17e8529..9998e01f 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1548,7 +1548,7 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback ////// 绘制图片 ////// events.prototype.showImage = function (name, x, y) { if (core.isset(name) && core.isset(x) && core.isset(y) && core.isset(core.material.images.images[name])) { - core.canvas.image.drawImage(core.material.images.images[name], x, y); + core.canvas.image.drawImage(core.material.images.images[name], core.calValue(x), core.calValue(y)); } else core.clearMap('image'); } From 71f03ffbfe687af03210f74c6ddaa76f3d9e9d47 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 13 Dec 2018 20:41:20 +0800 Subject: [PATCH 29/34] Search --- _server/css/editor.css | 18 +++++++++++ _server/editor_blockly.js | 63 ++++++++++++++++++++++++++++++++++++--- editor.html | 4 +++ 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/_server/css/editor.css b/_server/css/editor.css index 928a0964..c5837379 100644 --- a/_server/css/editor.css +++ b/_server/css/editor.css @@ -392,3 +392,21 @@ table.row td { [v-cloak] { display: none !important; } + +#blockSearch { + width: 100px; + background-color: #E9EBF2; + border-radius: 10px; + outline: none; + padding-left: 20px; + height: 14px; +} + +.searchLogo { + width: 15px; + height: 15px; + position: absolute; + left: 6px; + top: 7px; + background-image:url('data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGJhc2VQcm9maWxlPSJmdWxsIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpldj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwtZXZlbnRzIj4KPGc%2BCgk8cG9seWdvbiBmaWxsPSIjNjY2IiBwb2ludHM9IjkuMjA3LDYuMTI2IDcuNzkzLDcuNTQxIDExLjc5MywxMS41NDEgMTMuMjA3LDEwLjEyNiIgLz4KCTxwYXRoIGZpbGw9IiM2NjYiIGQ9Ik01LjkxNywyYzEuNjA4LDAsMi45MTcsMS4zMDgsMi45MTcsMi45MTdTNy41MjUsNy44MzMsNS45MTcsNy44MzNTMyw2LjUyNSwzLDQuOTE3UzQuMzA4LDIsNS45MTcsMgoJCSBNNS45MTcsMEMzLjIwMSwwLDEsMi4yMDEsMSw0LjkxN3MyLjIwMSw0LjkxNyw0LjkxNyw0LjkxN3M0LjkxNy0yLjIwMSw0LjkxNy00LjkxN0MxMC44MzMsMi4yMDEsOC42MzIsMCw1LjkxNywwTDUuOTE3LDB6IiAvPgo8L2c%2BCjwvc3ZnPgo%3D'); +} \ No newline at end of file diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index a966619f..1d12d9ad 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -277,9 +277,10 @@ var workspace = Blockly.inject(blocklyDiv,{ editor_blockly.searchBlockCategoryCallback = function(workspace) { var xmlList = []; - for (var i = 0; i < editor_blockly.lastUsedType.length; i++) { + var labels = editor_blockly.searchBlock(); + for (var i = 0; i < labels.length; i++) { var blockText = '' + - MotaActionBlocks[editor_blockly.lastUsedType[i]].xmlText() + + MotaActionBlocks[labels[i]].xmlText() + ''; var block = Blockly.Xml.textToDom(blockText).firstChild; block.setAttribute("gap", 5); @@ -310,8 +311,8 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ workspace.setScale(workspace.scale); } - var doubleClickCheck=[[0,'abc']]; - function omitedcheckUpdateFunction(event) { +var doubleClickCheck=[[0,'abc']]; +function omitedcheckUpdateFunction(event) { if(event.type==='move'){ editor_blockly.addIntoLastUsedType(event.blockId); } @@ -565,6 +566,60 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ editor_blockly.lastUsedType.unshift(blockType); } + // Index from 1 - 9 + editor_blockly.openToolbox = function(index) { + var element = document.getElementById(':'+index); + if (element == null || element.getAttribute("aria-selected")=="true") return; + element.click(); + } + editor_blockly.reopenToolbox = function(index) { + var element = document.getElementById(':'+index); + if (element == null) return; + if (element.getAttribute("aria-selected")=="true") element.click(); + element.click(); + } + + editor_blockly.closeToolbox = function() { + for (var i=1; i<=10; i++) { + var element = document.getElementById(':'+i); + if (element && element.getAttribute("aria-selected")=="true") { + element.click(); + return; + } + } + } + + var searchInput = document.getElementById("blockSearch"); + searchInput.onfocus = function () { + editor_blockly.reopenToolbox(9); + } + + searchInput.oninput = function () { + editor_blockly.reopenToolbox(9); + } + + editor_blockly.searchBlock = function (value) { + if (value == null) value = searchInput.value; + value = value.toLowerCase(); + if (value == '') return editor_blockly.lastUsedType; + var results = []; + for (var name in MotaActionBlocks) { + if (typeof name !== 'string' || name.indexOf("_s") !== name.length-2) continue; + var block = MotaActionBlocks[name]; + if(block && block.json) { + if ((block.json.type||"").toLowerCase().indexOf(value)>=0 + || (block.json.message0||"").toLowerCase().indexOf(value)>=0 + || (block.json.tooltip||"").toLowerCase().indexOf(value)>=0) { + results.push(name); + if (results.length>=editor_blockly.lastUsedTypeNum) + break; + } + } + } + + return results.length == 0 ? editor_blockly.lastUsedType : results; + } + return editor_blockly; } //editor_blockly=editor_blockly(); \ No newline at end of file diff --git a/editor.html b/editor.html index 54cdb46e..ce6bf5c2 100644 --- a/editor.html +++ b/editor.html @@ -178,6 +178,10 @@ +
+ + +
From 8d31055c5255657505935d201a7afed55168001f Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 13 Dec 2018 22:43:28 +0800 Subject: [PATCH 30/34] Search Blockly --- _server/css/editor.css | 4 ++-- _server/editor_blockly.js | 27 +++++++++++++++++---------- editor-mobile.html | 5 +++++ editor.html | 2 +- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/_server/css/editor.css b/_server/css/editor.css index c5837379..ebd4b009 100644 --- a/_server/css/editor.css +++ b/_server/css/editor.css @@ -393,7 +393,7 @@ table.row td { display: none !important; } -#blockSearch { +#searchBlock { width: 100px; background-color: #E9EBF2; border-radius: 10px; @@ -407,6 +407,6 @@ table.row td { height: 15px; position: absolute; left: 6px; - top: 7px; + top: 6px; background-image:url('data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGJhc2VQcm9maWxlPSJmdWxsIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpldj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwtZXZlbnRzIj4KPGc%2BCgk8cG9seWdvbiBmaWxsPSIjNjY2IiBwb2ludHM9IjkuMjA3LDYuMTI2IDcuNzkzLDcuNTQxIDExLjc5MywxMS41NDEgMTMuMjA3LDEwLjEyNiIgLz4KCTxwYXRoIGZpbGw9IiM2NjYiIGQ9Ik01LjkxNywyYzEuNjA4LDAsMi45MTcsMS4zMDgsMi45MTcsMi45MTdTNy41MjUsNy44MzMsNS45MTcsNy44MzNTMyw2LjUyNSwzLDQuOTE3UzQuMzA4LDIsNS45MTcsMgoJCSBNNS45MTcsMEMzLjIwMSwwLDEsMi4yMDEsMSw0LjkxN3MyLjIwMSw0LjkxNyw0LjkxNyw0LjkxN3M0LjkxNy0yLjIwMSw0LjkxNy00LjkxN0MxMC44MzMsMi4yMDEsOC42MzIsMCw1LjkxNywwTDUuOTE3LDB6IiAvPgo8L2c%2BCjwvc3ZnPgo%3D'); } \ No newline at end of file diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 1d12d9ad..928c4803 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -313,7 +313,7 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ var doubleClickCheck=[[0,'abc']]; function omitedcheckUpdateFunction(event) { - if(event.type==='move'){ + if(event.type==='create'){ editor_blockly.addIntoLastUsedType(event.blockId); } if(event.type==='ui'){ @@ -559,27 +559,32 @@ function omitedcheckUpdateFunction(event) { if(!b)return; var blockType = b.type; if(!blockType || blockType.indexOf("_s")!==blockType.length-2 || blockType==='pass_s')return; - console.log(b); editor_blockly.lastUsedType = editor_blockly.lastUsedType.filter(function (v) {return v!==blockType;}); if (editor_blockly.lastUsedType.length >= editor_blockly.lastUsedTypeNum) editor_blockly.lastUsedType.pop(); editor_blockly.lastUsedType.unshift(blockType); + + document.getElementById("searchBlock").value=''; } // Index from 1 - 9 editor_blockly.openToolbox = function(index) { - var element = document.getElementById(':'+index); - if (element == null || element.getAttribute("aria-selected")=="true") return; - element.click(); + // var element = document.getElementById(':'+index); + // if (element == null || element.getAttribute("aria-selected")=="true") return; + // element.click(); + editor_blockly.workspace.toolbox_.tree_.setSelectedItem(editor_blockly.workspace.toolbox_.tree_.children_[index-1]); } editor_blockly.reopenToolbox = function(index) { - var element = document.getElementById(':'+index); - if (element == null) return; - if (element.getAttribute("aria-selected")=="true") element.click(); - element.click(); + // var element = document.getElementById(':'+index); + // if (element == null) return; + // if (element.getAttribute("aria-selected")=="true") element.click(); + // element.click(); + editor_blockly.workspace.toolbox_.tree_.setSelectedItem(editor_blockly.workspace.toolbox_.tree_.children_[index-1]); + editor_blockly.workspace.getFlyout_().show(editor_blockly.workspace.toolbox_.tree_.children_[index-1].blocks); } editor_blockly.closeToolbox = function() { + /* for (var i=1; i<=10; i++) { var element = document.getElementById(':'+i); if (element && element.getAttribute("aria-selected")=="true") { @@ -587,9 +592,11 @@ function omitedcheckUpdateFunction(event) { return; } } + */ + editor_blockly.workspace.toolbox_.clearSelection(); } - var searchInput = document.getElementById("blockSearch"); + var searchInput = document.getElementById("searchBlock"); searchInput.onfocus = function () { editor_blockly.reopenToolbox(9); } diff --git a/editor-mobile.html b/editor-mobile.html index c3396905..fedd1cb1 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -179,6 +179,11 @@ + +
+ + +
diff --git a/editor.html b/editor.html index ce6bf5c2..df51ae2e 100644 --- a/editor.html +++ b/editor.html @@ -180,7 +180,7 @@
- +
From 7be7d3706fa8ecbf7d3b8815d32ae7da0fed7cef Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 13 Dec 2018 23:01:41 +0800 Subject: [PATCH 31/34] Loop Critical for Big Number --- libs/enemys.js | 4 +++- libs/ui.js | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libs/enemys.js b/libs/enemys.js index a3097af3..bc1563b5 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -179,7 +179,9 @@ enemys.prototype.nextCriticals = function (enemy, number, x, y, floorId) { } else { // 暴力for循环法 pre = info.damage; - for (var atk=hero_atk+1;atk<=mon_hp+mon_def;atk++) { + var per_add = Math.ceil(hero_atk / 5000); + if (per_add<0) per_add = 1; + for (var atk=hero_atk+per_add;atk<=mon_hp+mon_def;atk+=per_add) { var nextInfo = this.getDamageInfo(enemy, core.status.hero.hp, atk, core.status.hero.def, core.status.hero.mdef, x, y, floorId); if (nextInfo==null) break; if (pre>nextInfo.damage) { diff --git a/libs/ui.js b/libs/ui.js index ec7c1dec..15f0bd0e 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1645,7 +1645,7 @@ ui.prototype.drawBookDetail = function (index) { u.push(t); } }); - hints.push(JSON.stringify(u.map(function (v) {return v[0]+":"+v[1];}))); + hints.push(JSON.stringify(u.map(function (v) {return core.formatBigNumber(v[0])+":"+core.formatBigNumber(v[1]);}))); } } @@ -1679,7 +1679,7 @@ ui.prototype.drawBookDetail = function (index) { hints.push(""); var criticals = core.enemys.nextCriticals(enemyId, 10).map(function (v) { - return v[0]+":"+v[1]; + return core.formatBigNumber(v[0])+":"+core.formatBigNumber(v[1]); }); while (criticals[0]=='0:0') criticals.shift(); hints.push("临界表:"+JSON.stringify(criticals)) From e8559f3e2d07a54a2575c2b9caeef8b2cbde9dd0 Mon Sep 17 00:00:00 2001 From: oc Date: Thu, 13 Dec 2018 23:50:01 +0800 Subject: [PATCH 32/34] noGlobalAnimate --- _server/blockly/MotaAction.g4 | 11 ++++++----- _server/comment.js | 2 +- _server/editor.js | 9 ++++++++- libs/maps.js | 6 +++++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 5b681deb..37dca134 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -5,22 +5,23 @@ grammar MotaAction; //事件 事件编辑器入口之一 event_m - : '事件' BGNL? Newline '覆盖触发器' Bool '启用' Bool '通行状态' B_0_List '显伤' Bool BGNL? Newline action+ BEND + : '事件' BGNL? Newline '覆盖触发器' Bool '启用' Bool '通行状态' B_0_List '动画' Bool '显伤' Bool BGNL? Newline action+ BEND /* event_m tooltip : 编辑魔塔的事件 helpUrl : https://h5mota.com/games/template/docs/#/event -default : [false,null,null,null] +default : [false,null,null,null,null] B_0_List_0=eval(B_0_List_0); var code = { 'trigger': Bool_0?'action':null, 'enable': Bool_1, 'noPass': B_0_List_0, - 'displayDamage': Bool_2, + 'animate': Bool_2, + 'displayDamage': Bool_3, 'data': 'data_asdfefw' } -if (!Bool_0 && Bool_1 && (B_0_List_0===null) && Bool_2) code = 'data_asdfefw'; +if (!Bool_0 && Bool_1 && (B_0_List_0===null) && Bool_2 && Bool_3) code = 'data_asdfefw'; code=JSON.stringify(code,null,2).split('"data_asdfefw"').join('[\n'+action_0+']\n'); return code; */; @@ -1803,7 +1804,7 @@ ActionParser.prototype.parse = function (obj,type) { if(typeof(obj)===typeof('')) obj={'data':[obj]}; if(obj instanceof Array) obj={'data':obj}; return MotaActionBlocks['event_m'].xmlText([ - obj.trigger==='action',obj.enable,obj.noPass,obj.displayDamage,this.parseList(obj.data) + obj.trigger==='action',obj.enable,obj.noPass,obj.animate,obj.displayDamage,this.parseList(obj.data) ]); case 'changeFloor': diff --git a/_server/comment.js b/_server/comment.js index c38b6cd9..41aa00ef 100644 --- a/_server/comment.js +++ b/_server/comment.js @@ -261,7 +261,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_leaf": true, "_type": "textarea", "_range": "thiseval==null||(thiseval instanceof Array)", - "_data": "该图块的不可入方向\n可以在这里定义不能从哪个方向访问该图块,可以达到悬崖之类的效果\n例如 [\"down\", \"right\"] 代表不能从下或右访问此图块\n此值对背景层、事件层、前景层上的图块均有效" + "_data": "该图块的不可入方向\n可以在这里定义不能朝哪个方向进入该图块,可以达到悬崖之类的效果\n例如 [\"down\"] 代表不能从该图块的上方点朝向下进入此图块\n此值对背景层、事件层、前景层上的图块均有效" }, "faceIds": { "_leaf": true, diff --git a/_server/editor.js b/_server/editor.js index c9622e6f..f90a9b6f 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -295,11 +295,18 @@ editor.prototype.drawPosSelection = function () { } editor.prototype.updateMap = function () { + var evs = {}; + if (editor.currentFloorData && editor.currentFloorData.events) { + for (var loc in editor.currentFloorData.events) { + if (editor.currentFloorData.events[loc].animate == false) + evs[loc] = {"animate": false}; + } + } var blocks = main.editor.mapIntoBlocks(editor.map.map(function (v) { return v.map(function (v) { return v.idnum || v || 0 }) - }), {'events': {}, 'changeFloor': {}}, editor.currentFloorId); + }), {'events': evs, 'changeFloor': {}}, editor.currentFloorId); core.status.thisMap.blocks = blocks; main.editor.updateMap(); diff --git a/libs/maps.js b/libs/maps.js index 12865f76..1eff4460 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -146,9 +146,13 @@ maps.prototype.addEvent = function (block, x, y, event) { if (!core.isset(block.disable) && core.isset(event.enable)) { block.disable=!event.enable; } + // 覆盖animate + if (event.animate === false) { + block.event.animate = 1; + } // 覆盖所有属性 for (var key in event) { - if (key!="enable" && core.isset(event[key])) { + if (key!="enable" && key!="animate" && core.isset(event[key])) { block.event[key]=core.clone(event[key]); } } From f20d2e3c69acb08bfabeaa4aa518e8fac19b42bf Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 14 Dec 2018 00:23:13 +0800 Subject: [PATCH 33/34] Fix battle check --- project/functions.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/project/functions.js b/project/functions.js index 0d47e471..a9fd87ac 100644 --- a/project/functions.js +++ b/project/functions.js @@ -526,9 +526,6 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = init_damage += vampire_damage; } - // 检查是否破防;否则直接返回不可战斗 - if (hero_atk <= mon_def) return null; - // 每回合怪物对勇士造成的战斗伤害 var per_damage = mon_atk - hero_def; // 魔攻:战斗伤害就是怪物攻击力 @@ -558,6 +555,10 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 勇士每回合对怪物造成的伤害 var hero_per_damage = hero_atk - mon_def; + + // 如果没有破防,则不可战斗 + if (hero_per_damage <= 0) return null; + // 勇士的攻击回合数;为怪物生命除以每回合伤害向上取整 var turn = Math.ceil(mon_hp / hero_per_damage); // 最终伤害:初始伤害 + 怪物对勇士造成的伤害 + 反击伤害 From 861a44ae20b098489d6ef6881d16543c20d7b61e Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 14 Dec 2018 00:26:29 +0800 Subject: [PATCH 34/34] Fix battle check --- project/functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/functions.js b/project/functions.js index a9fd87ac..9e06e527 100644 --- a/project/functions.js +++ b/project/functions.js @@ -554,7 +554,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = init_damage += Math.floor(core.values.purify * hero_mdef); // 勇士每回合对怪物造成的伤害 - var hero_per_damage = hero_atk - mon_def; + var hero_per_damage = Math.max(hero_atk - mon_def, 0); // 如果没有破防,则不可战斗 if (hero_per_damage <= 0) return null;