diff --git a/README.md b/README.md index 8f39f2c9..a727bbd9 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,8 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏! ### 2018.8.28 V2.4 * [x] 大地图的支持 +* [x] 突破了5M的存档空间大小限制 +* [x] 事件:隐藏/显示贴图 * [x] 同点多事件的颜色块绘制 * [x] 录像播放时可以按PgUp/PgDn浏览地图 * [x] 录像播放时对于瞬间移动绘制箭头 diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 917ed6e8..61bbe2a0 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -187,6 +187,8 @@ action | setValue_s | show_s | hide_s + | showFloorImg_s + | hideFloorImg_s | trigger_s | revisit_s | exit_s @@ -417,6 +419,68 @@ var code = '{"type": "hide"'+floorstr+IdString_0+''+Int_0+'},\n'; return code; */; +showFloorImg_s + : '显示贴图' 'x' EvalString? ',' 'y' EvalString? '楼层' IdString? Newline + + +/* showFloorImg_s +tooltip : showFloorImg: 显示一个贴图,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 : ["","",""] +colour : this.eventColor +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 如果写2的话,请确保图片高度是32的倍数! +楼层贴图可以被事件隐藏和显示,详见[隐藏贴图](event#hideFloorImg:隐藏贴图)的写法。 + **如果你需要让某些点不可通行(比如你建了个房子,墙壁和家具等位置不让通行),则需在`events`中指定`{"noPass": false}`,参见[自定义事件](event#自定义事件)的写法。** ``` js diff --git a/libs/actions.js b/libs/actions.js index ecf7269b..8e47e24b 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1596,9 +1596,12 @@ actions.prototype.clickSwitchs = function (x,y) { core.ui.drawSwitchs(); break; case 7: - window.open(core.firstData.name+".zip", "_blank"); + window.open(core.platform.isPC?"editor.html":"editor-mobile.html", "_blank"); break; case 8: + window.open(core.firstData.name+".zip", "_blank"); + break; + case 9: core.status.event.selection=0; core.ui.drawSettings(); break; diff --git a/libs/control.js b/libs/control.js index 84f304b4..ec9d6928 100644 --- a/libs/control.js +++ b/libs/control.js @@ -454,6 +454,8 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { return; } + if (core.timeout.turnHeroTimeout!=null) return; + // 单击瞬间移动 if (core.status.automaticRoute.clickMoveDirectly && core.status.heroStop) { if (core.control.tryMoveDirectly(destX, destY)) diff --git a/libs/core.js b/libs/core.js index fffadef6..585e3924 100644 --- a/libs/core.js +++ b/libs/core.js @@ -271,6 +271,7 @@ core.prototype.init = function (coreData, callback) { core.material.ground.src = "project/images/ground.png"; core.bigmap.tempCanvas = document.createElement('canvas').getContext('2d'); + core.getLocalForage("test"); core.loader.load(function () { console.log(core.material); diff --git a/libs/events.js b/libs/events.js index 225beb7c..1318c8d9 100644 --- a/libs/events.js +++ b/libs/events.js @@ -399,6 +399,26 @@ events.prototype.doAction = function() { } else this.doAction(); break; + case "showFloorImg": // 显示贴图 + 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.setFloorImage("show", data.loc, data.floorId, function() { + core.events.doAction(); + }) + break; + case "hideFloorImg": // 隐藏贴图 + 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.setFloorImage("hide", data.loc, data.floorId, function() { + core.events.doAction(); + }) + break; case "setBlock": // 设置某图块 { if (core.isset(data.loc)) { diff --git a/libs/maps.js b/libs/maps.js index dc134bb5..22d7a62a 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -361,7 +361,9 @@ maps.prototype.drawMap = function (mapName, callback) { } images.forEach(function (t) { var dx=parseInt(t[0]), dy=parseInt(t[1]), p=t[2]; - if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) { + if (core.isset(dx) && core.isset(dy) && + !core.hasFlag("floorimg_"+mapName+"_"+dx+"_"+dy) && + core.isset(core.material.images.images[p])) { var image = core.material.images.images[p]; if (!t[3]) { if (/.*\.gif/i.test(p) && main.mode=='play') { @@ -1079,6 +1081,27 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { }, 50); } +maps.prototype.setFloorImage = function (type, loc, floorId, callback) { + if (type!='show') type='hide'; + 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 = "floorimg_"+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); diff --git a/libs/ui.js b/libs/ui.js index ed7fb0a3..d5f269d5 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -800,6 +800,7 @@ ui.prototype.drawSwitchs = function() { "临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"), "领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"), "单击瞬移: "+(core.status.automaticRoute.clickMoveDirectly ? "[ON]" : "[OFF]"), + "查看工程", "下载离线版本", "返回主菜单" ]; @@ -1250,8 +1251,7 @@ ui.prototype.drawCursor = function () { ////// 绘制怪物手册 ////// ui.prototype.drawBook = function (index) { - - var enemys = core.enemys.getCurrentEnemys(core.floorIds[core.status.event.selection]); + var enemys = core.enemys.getCurrentEnemys(core.floorIds[(core.status.event.selection||{}).index]); var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); clearInterval(core.interval.tipAnimate); @@ -1395,7 +1395,7 @@ ui.prototype.drawBook = function (index) { ////// 绘制怪物属性的详细信息 ////// ui.prototype.drawBookDetail = function (index) { - var enemys = core.enemys.getCurrentEnemys(core.floorIds[core.status.event.selection]); + var enemys = core.enemys.getCurrentEnemys(core.floorIds[(core.status.event.selection||{}).index]); if (enemys.length==0) return; if (index<0) index=0; if (index>=enemys.length) index=enemys.length-1; @@ -1842,7 +1842,9 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, cente } images.forEach(function (t) { var dx=parseInt(t[0]), dy=parseInt(t[1]), p=t[2]; - if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) { + if (core.isset(dx) && core.isset(dy) && + !core.hasFlag("floorimg_"+floorId+"_"+dx+"_"+dy) && + core.isset(core.material.images.images[p])) { var image = core.material.images.images[p]; if (!t[3]) tempCanvas.drawImage(image, 32 * dx, 32 * dy, image.width, image.height); @@ -1880,7 +1882,9 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, cente // draw fg images.forEach(function (t) { var dx=parseInt(t[0]), dy=parseInt(t[1]), p=t[2]; - if (core.isset(dx) && core.isset(dy) && core.isset(core.material.images.images[p])) { + if (core.isset(dx) && core.isset(dy) && + !core.hasFlag("floorimg_"+floorId+"_"+dx+"_"+dy) && + core.isset(core.material.images.images[p])) { var image = core.material.images.images[p]; if (t[3]==1) tempCanvas.drawImage(image, 32*dx, 32*dy, image.width, image.height); diff --git a/project/functions.js b/project/functions.js index e3234a3c..5c0517ad 100644 --- a/project/functions.js +++ b/project/functions.js @@ -58,6 +58,10 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.waitHeroToStop(function() { core.removeGlobalAnimate(0,0,true); core.clearMap('all'); // 清空全地图 + // 请注意: + // 成绩统计时是按照hp进行上传并排名,因此光在这里改${status:hp}是无效的 + // 如需按照其他的的分数统计方式,请先将hp设置为你的得分 + // core.setStatus('hp', ...); core.drawText([ "\t[" + (reason||"恭喜通关") + "]你的分数是${status:hp}。" ], function () { diff --git a/更新说明.txt b/更新说明.txt index ac87791a..ae7c00a4 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -2,6 +2,7 @@ 大地图的支持 突破了5M的存档空间大小限制 +可以隐藏和显示楼层贴图 同点多事件的颜色块绘制 录像播放时可以按PgUp/PgDn浏览地图 录像播放时对于瞬间移动绘制箭头