From 095aedf1e1ea97e4e39e11d2bc3ed50c0dffdf3a Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 13 Sep 2018 16:08:17 +0800 Subject: [PATCH] Bgmap & Fgmap events --- _server/blockly/MotaAction.g4 | 195 +++++++++++++++++++++++++++------- _server/editor_blockly.js | 3 + docs/event.md | 116 ++++++++++++++------ docs/personalization.md | 10 ++ editor-mobile.html | 1 + editor.html | 1 + libs/core.js | 5 + libs/events.js | 34 +++++- libs/maps.js | 36 ++++++- 9 files changed, 327 insertions(+), 74 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index d3d4d957..5f4dac99 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -187,12 +187,15 @@ action | setValue_s | show_s | hide_s - | showFloorImg_s - | hideFloorImg_s | trigger_s | revisit_s | exit_s | setBlock_s + | showFloorImg_s + | hideFloorImg_s + | showBgFgMap_s + | hideBgFgMap_s + | setBgFgBlock_s | setHeroIcon_s | update_s | updateEnemys_s @@ -420,6 +423,61 @@ var code = '{"type": "hide"'+floorstr+IdString_0+''+Int_0+'},\n'; return code; */; +trigger_s + : '触发事件' 'x' PosString ',' 'y' PosString Newline + + +/* trigger_s +tooltip : trigger: 立即触发另一个地点的事件 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=trigger%EF%BC%9A%E7%AB%8B%E5%8D%B3%E8%A7%A6%E5%8F%91%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%9C%B0%E7%82%B9%E7%9A%84%E4%BA%8B%E4%BB%B6 +default : ["0","0"] +colour : this.eventColor +var code = '{"type": "trigger", "loc": ['+PosString_0+','+PosString_1+']},\n'; +return code; +*/; + +revisit_s + : '重启当前事件' Newline + + +/* revisit_s +tooltip : revisit: 立即重启当前事件 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=revisit%EF%BC%9A%E7%AB%8B%E5%8D%B3%E9%87%8D%E5%90%AF%E5%BD%93%E5%89%8D%E4%BA%8B%E4%BB%B6 +colour : this.eventColor +var code = '{"type": "revisit"},\n'; +return code; +*/; + +exit_s + : '立刻结束当前事件' Newline + + +/* exit_s +tooltip : exit: 立刻结束当前事件 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=exit%EF%BC%9A%E7%AB%8B%E5%88%BB%E7%BB%93%E6%9D%9F%E5%BD%93%E5%89%8D%E4%BA%8B%E4%BB%B6 +colour : this.eventColor +var code = '{"type": "exit"},\n'; +return code; +*/; + +setBlock_s + : '转变图块为' Int 'x' PosString? ',' 'y' PosString? '楼层' IdString? Newline + + +/* setBlock_s +tooltip : setBlock:设置某个图块,忽略坐标楼层则为当前事件 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=setblock%EF%BC%9A%E8%AE%BE%E7%BD%AE%E6%9F%90%E4%B8%AA%E5%9B%BE%E5%9D%97 +colour : this.dataColor +default : [0,"","",""] +var floorstr = ''; +if (PosString_0 && PosString_1) { + floorstr = ', "loc": ['+PosString_0+','+PosString_1+']'; +} +IdString_0 = IdString_0 && (', "floorId": "'+IdString_0+'"'); +var code = '{"type": "setBlock", "number":'+Int_0+floorstr+IdString_0+'},\n'; +return code; +*/; + showFloorImg_s : '显示贴图' 'x' EvalString? ',' 'y' EvalString? '楼层' IdString? Newline @@ -482,58 +540,83 @@ var code = '{"type": "hideFloorImg"'+floorstr+IdString_0+'},\n'; return code; */; -trigger_s - : '触发事件' 'x' PosString ',' 'y' PosString Newline - +showBgFgMap_s + : '显示图层块' Bg_Fg_List 'x' EvalString? ',' 'y' EvalString? '楼层' IdString? Newline -/* trigger_s -tooltip : trigger: 立即触发另一个地点的事件 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=trigger%EF%BC%9A%E7%AB%8B%E5%8D%B3%E8%A7%A6%E5%8F%91%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%9C%B0%E7%82%B9%E7%9A%84%E4%BA%8B%E4%BB%B6 -default : ["0","0"] + +/* showBgFgMap_s +tooltip : showBgFgMap: 显示图层块,即背景图层/前景图层的某些图块,xy为左上角坐标,可用逗号分隔表示多个点 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=showFloorImg%ef%bc%9a%e6%98%be%e7%a4%ba%e8%b4%b4%e5%9b%be +default : ["bg","","",""] colour : this.eventColor -var code = '{"type": "trigger", "loc": ['+PosString_0+','+PosString_1+']},\n'; +var floorstr = ''; +if (EvalString_0 && EvalString_1) { + var pattern1 = /^flag:[0-9a-zA-Z_][0-9a-zA-Z_\-:]*$/; + if(pattern1.test(EvalString_0) || pattern1.test(EvalString_1)){ + EvalString_0=MotaActionFunctions.PosString_pre(EvalString_0); + EvalString_1=MotaActionFunctions.PosString_pre(EvalString_1); + EvalString_0=[EvalString_0,EvalString_1] + } else { + var pattern2 = /^([+-]?\d+)(,[+-]?\d+)*$/; + if(!pattern2.test(EvalString_0) || !pattern2.test(EvalString_1))throw new Error('坐标格式错误,请右键点击帮助查看格式'); + EvalString_0=EvalString_0.split(','); + EvalString_1=EvalString_1.split(','); + if(EvalString_0.length!==EvalString_1.length)throw new Error('坐标格式错误,请右键点击帮助查看格式'); + for(var ii=0;ii + diff --git a/editor.html b/editor.html index ef349dcc..446aaaaf 100644 --- a/editor.html +++ b/editor.html @@ -392,6 +392,7 @@ + diff --git a/libs/core.js b/libs/core.js index 0f010eec..98705b78 100644 --- a/libs/core.js +++ b/libs/core.js @@ -743,6 +743,11 @@ core.prototype.setBlock = function (number, x, y, floorId) { core.maps.setBlock(number, x, y, floorId); } +////// 改变图层块 ////// +core.prototype.setBgFgBlock = function (name, number, x, y, floorId) { + core.maps.setBgFgBlock(name, number, x, y, floorId); +} + ////// 添加一个全局动画 ////// core.prototype.addGlobalAnimate = function (block) { core.maps.addGlobalAnimate(block); diff --git a/libs/events.js b/libs/events.js index 0d63148c..c69f1623 100644 --- a/libs/events.js +++ b/libs/events.js @@ -399,6 +399,16 @@ events.prototype.doAction = function() { } else this.doAction(); break; + case "setBlock": // 设置某图块 + { + if (core.isset(data.loc)) { + x=core.calValue(data.loc[0]); + y=core.calValue(data.loc[1]); + } + core.setBlock(data.number, x, y, data.floorId); + this.doAction(); + break; + } case "showFloorImg": // 显示贴图 if (!core.isset(data.loc)) data.loc = [x,y]; @@ -419,13 +429,33 @@ events.prototype.doAction = function() { core.events.doAction(); }) break; - case "setBlock": // 设置某图块 + case "showBgFgMap": // 显示图层块 + if (!core.isset(data.loc)) + data.loc = [x,y]; + if ((typeof data.loc[0] == 'number' || typeof data.loc[0] == 'string') + && (typeof data.loc[1] == 'number' || typeof data.loc[1] == 'string')) + data.loc = [[core.calValue(data.loc[0]), core.calValue(data.loc[1])]]; + core.maps.setBgFgMap("show", data.name, data.loc, data.floorId, function() { + core.events.doAction(); + }) + break; + case "hideBgFgMap": // 隐藏图层块 + if (!core.isset(data.loc)) + data.loc = [x,y]; + if ((typeof data.loc[0] == 'number' || typeof data.loc[0] == 'string') + && (typeof data.loc[1] == 'number' || typeof data.loc[1] == 'string')) + data.loc = [[core.calValue(data.loc[0]), core.calValue(data.loc[1])]]; + core.maps.setBgFgMap("hide", data.name, data.loc, data.floorId, function() { + core.events.doAction(); + }) + break; + case "setBgFgBlock": // 设置图层块 { if (core.isset(data.loc)) { x=core.calValue(data.loc[0]); y=core.calValue(data.loc[1]); } - core.setBlock(data.number, x, y, data.floorId); + core.setBgFgBlock(data.name, data.number, x, y, data.floorId); this.doAction(); break; } diff --git a/libs/maps.js b/libs/maps.js index 8d572ee6..4ec056a9 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -350,7 +350,7 @@ maps.prototype.drawBgFgMap = function (floorId, canvas, name) { var blockImage = core.material.images.terrains; var getMapArray = function (name) { - var arr = core.floors[floorId][name+"map"] || []; + var arr = core.clone(core.floors[floorId][name+"map"] || []); for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { arr[y] = arr[y] || []; @@ -992,6 +992,18 @@ maps.prototype.setBlock = function (number, x, y, floorId) { } } +////// 改变图层块 ////// +maps.prototype.setBgFgBlock = function (name, number, x, y, floorId) { + floorId = floorId || core.status.floorId; + if (!core.isset(number) || !core.isset(x) || !core.isset(y)) return; + if (x<0 || x>=core.bigmap.width || y<0 || y>=core.bigmap.height) return; + if (name!='bg' && name!='fg') return; + + core.setFlag(name+"v_"+floorId+"_"+x+"_"+y, number); + if (floorId == core.status.floorId) + core.drawMap(floorId); +} + ////// 添加一个全局动画 ////// maps.prototype.addGlobalAnimate = function (b) { if (main.mode=='editor' && main.editor.disableGlobalAnimate) return; @@ -1140,6 +1152,28 @@ maps.prototype.setFloorImage = function (type, loc, floorId, callback) { } } +maps.prototype.setBgFgMap = function (type, name, loc, floorId, callback) { + if (type!='show') type='hide'; + if (name!='fg') name='bg'; + if (typeof loc[0] == 'number' && typeof loc[1] == 'number') + loc = [loc]; + floorId = floorId||core.status.floorId; + + if (loc.length==0) return; + loc.forEach(function (t) { + var x=t[0], y=t[1]; + var flag = name+"_"+floorId+"_"+x+"_"+y; + core.setFlag(flag, type=='show'?false:true); + }) + + if (floorId==core.status.floorId) { + core.drawMap(floorId, callback); + } + else { + if (core.isset(callback)) callback(); + } +} + maps.prototype.resetMap = function(floorId) { var floorId = floorId||core.status.floorId; core.status.maps[floorId] = this.loadFloor(floorId);