diff --git a/_server/editor.js b/_server/editor.js index 08795309..4e5c516d 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -18,9 +18,9 @@ editor.prototype.init = function (callback) { return editor.ids[[editor.indexs[parseInt(v)][0]]] }) }); - editor.updateMap(); editor.currentFloorId = core.status.floorId; editor.currentFloorData = core.floors[core.status.floorId]; + editor.updateMap(); editor.buildMark(); editor.drawEventBlock(); if (Boolean(callback)) callback(); @@ -229,7 +229,7 @@ editor.prototype.updateMap = function () { return v.map(function (v) { return v.idnum || v || 0 }) - }), {'events': {}, 'changeFloor': {}}); + }), {'events': {}, 'changeFloor': {}}, editor.currentFloorId); core.status.thisMap.blocks = blocks; main.editor.updateMap(); @@ -340,9 +340,9 @@ editor.prototype.changeFloor = function (floorId, callback) { return editor.ids[[editor.indexs[parseInt(v)][0]]] }) }); - editor.updateMap(); editor.currentFloorId = core.status.floorId; editor.currentFloorData = core.floors[core.status.floorId]; + editor.updateMap(); editor_mode.floor(); editor.drawEventBlock(); if (core.isset(callback)) callback(); @@ -511,6 +511,24 @@ editor.prototype.listen = function () { } } + /* + document.getElementById('mid').onkeydown = function (e) { + console.log(e); + if (e.keyCode==37) { + editor.moveViewport(-1, 0); + } + if (e.keyCode==38) { + editor.moveViewport(0, -1); + } + if (e.keyCode==39) { + editor.moveViewport(1, 0); + } + if (e.keyCode==40) { + editor.moveViewport(0, 1); + } + } + */ + document.getElementById('mid').onmousewheel = function (e) { e.preventDefault(); var wheel = function (direct) { diff --git a/_server/editor_file.js b/_server/editor_file.js index 46b2fe6b..4f534d2a 100644 --- a/_server/editor_file.js +++ b/_server/editor_file.js @@ -83,12 +83,21 @@ editor_file = function (editor, callback) { } */ var filename = 'project/floors/' + editor.currentFloorId + '.js'; var datastr = ['main.floors.', editor.currentFloorId, '=\n{']; - if (editor.currentFloorData.map == 'new') + if (editor.currentFloorData.map == 'new') { + /* editor.currentFloorData.map = editor.map.map(function (v) { return v.map(function () { return 0 }) }); + */ + var width = parseInt(document.getElementById('newMapWidth').value); + var height = parseInt(document.getElementById('newMapHeight').value); + var row = []; + for (var i=0;i1000) { + printe("新建地图的宽高都不得小于13,且宽高之积不能超过1000"); + return; + } editor_mode.onmode(''); editor.file.saveNewFile(newFileName.value, function (err) { diff --git a/docs/api.md b/docs/api.md index 50319569..f28da96b 100644 --- a/docs/api.md +++ b/docs/api.md @@ -184,22 +184,29 @@ core.enemyExists(x, y, id, floorId) x和y为坐标;id为怪物ID,可为null表示任意怪物;floorId为楼层ID,可忽略表示当前楼层。 -core.getBlock(x, y, floorId, needEnable) +core.getBlock(x, y, floorId, showDisable) 获得某个点的当前图块信息。 x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。 -needEnable表示该点是否启用时才返回,其值不设置则默认为true。 +showDisable如果为true,则对于禁用的点和事件也会进行返回。 如果该点不存在图块,则返回null。 否则,返回值如下: {"index": xxx, "block": xxx} 其中index为该点在该楼层blocks数组中的索引,block为该图块实际内容。 -core.getBlockId(x, y, floorId, needEnable) +core.getBlockId(x, y, floorId, showDisable) 获得某个点的图块ID。 x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。 -needEnable表示是否需要该点处于启用状态才返回,其值不设置则默认为true。 +showDisable如果为true,则对于禁用的点和事件也会进行返回。 如果该点不存在图块,则返回null,否则返回该点的图块ID。 +core.getBlockCls(x, y, floorId, showDisable) +获得某个点的图块cls。 +x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。 +showDisable如果为true,则对于禁用的点和事件也会进行返回。 +如果该点不存在图块,则返回null,否则返回该点的图块cls。 + + core.showBlock(x, y, floorId) 将某个点从禁用变成启用状态。 diff --git a/editor-mobile.html b/editor-mobile.html index e7092229..73bc757a 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -24,9 +24,13 @@
- + + + + + - 保留楼层属性 + 保留属性
diff --git a/editor.html b/editor.html index c52708fb..32610082 100644 --- a/editor.html +++ b/editor.html @@ -23,7 +23,11 @@
- + + + + + 保留楼层属性
diff --git a/index.html b/index.html index b2a606db..52b69439 100644 --- a/index.html +++ b/index.html @@ -121,6 +121,7 @@ + diff --git a/libs/actions.js b/libs/actions.js index 2ae074d3..a667031c 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -165,34 +165,8 @@ actions.prototype.keyDown = function(keyCode) { case 40: core.moveHero('down'); break; - case 13: case 32: case 67: case 51: // 快捷键3:飞 - // 因为加入了两次的检测机制,从keydown转移到keyup,同时保证位置信息正确,但以下情况会触发作图的bug: - // 在鼠标的路线移动中使用飞,绿块会滞后一格,显示的位置不对,同时也不会倍以下的代码清除 - if (core.status.heroStop && core.hasItem('centerFly')) { - if (core.status.usingCenterFly) { - if (core.canUseItem('centerFly')) { - core.useItem('centerFly'); - core.clearMap('ui', core.getHeroLoc('x')*32,core.getHeroLoc('y')*32,32,32); - } - else { - core.drawTip('当前不能使用中心对称飞行器'); - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - } - core.status.usingCenterFly = false; - } else if (keyCode==51) { - core.status.usingCenterFly = true; - core.setAlpha('ui', 0.5); - core.fillRect('ui',(12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32,core.canUseItem('centerFly')?'#00FF00':'#FF0000'); - core.setAlpha('ui', 1); - core.drawTip("请确认当前中心对称飞行器的位置"); - } - } break; } - if (core.status.usingCenterFly && keyCode!=51) { - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - core.status.usingCenterFly= false; - } } ////// 根据放开键的code来执行一系列操作 ////// @@ -283,6 +257,10 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { this.keyUpReplay(keyCode); return; } + if (core.status.event.id=='centerFly') { + this.keyUpCenterFly(keyCode); + return; + } return; } @@ -351,7 +329,7 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { case 33: case 34: // PAGEUP/PAGEDOWN if (core.status.heroStop) { if (core.flags.enableViewMaps) { - core.ui.drawMaps(core.floorIds.indexOf(core.status.floorId)); + core.ui.drawMaps(); } else { core.drawTip("本塔不允许浏览地图!"); @@ -366,7 +344,7 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { break; case 40: // DOWN break; - case 49: // 快捷键1:破 + case 49: // 快捷键1: 破 if (core.status.heroStop && core.hasItem('pickaxe')) { if (core.canUseItem('pickaxe')) { core.useItem('pickaxe'); @@ -376,7 +354,7 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { } } break; - case 50: // 快捷键2:炸 + case 50: // 快捷键2: 炸 if (core.status.heroStop) { if (core.hasItem('bomb')) { if (core.canUseItem('bomb')) { @@ -397,6 +375,11 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { } } break; + case 51: // 快捷键3: 飞 + if (core.status.heroStop && core.hasItem('centerFly')) { + core.events.useItem('centerFly'); + } + break; } @@ -533,30 +516,18 @@ actions.prototype.onclick = function (x, y, stepPostfix) { // 非游戏屏幕内 if (x<0 || y<0 || x>12 || y>12) return; - // 中心对称飞行器 - if (core.status.usingCenterFly) { - if (x!=12-core.getHeroLoc('x') || y!=12-core.getHeroLoc('y')) { - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - } else { - if (core.canUseItem('centerFly')) { - core.useItem('centerFly'); - core.clearMap('ui', core.getHeroLoc('x')*32,core.getHeroLoc('y')*32,32,32); - return; - } - else { - core.drawTip('当前不能使用中心对称飞行器'); - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - } - } - core.status.usingCenterFly= false; - } - // 寻路 if (!core.status.lockControl) { core.setAutomaticRoute(x+parseInt(core.bigmap.offsetX/32), y+parseInt(core.bigmap.offsetY/32), stepPostfix); return; } + // 中心对称飞行器 + if (core.status.event.id == 'centerFly') { + this.clickCenterFly(x, y); + return; + } + // 怪物手册 if (core.status.event.id == 'book') { this.clickBook(x,y); @@ -705,8 +676,8 @@ actions.prototype.onmousewheel = function (direct) { // 浏览地图 if (core.status.lockControl && core.status.event.id == 'viewMaps') { - if (direct==1) this.clickViewMaps(6,2); - if (direct==-1) this.clickViewMaps(6,10); + if (direct==1) this.clickViewMaps(6,3); + if (direct==-1) this.clickViewMaps(6,9); return; } } @@ -747,6 +718,32 @@ actions.prototype.keyDownCtrl = function () { } } +////// +actions.prototype.clickCenterFly = function(x, y) { + if (x==core.status.event.data.x && y==core.status.event.data.y) { + if (core.canUseItem('centerFly')) { + core.useItem('centerFly'); + } + else { + core.drawTip('当前不能使用中心对称飞行器'); + } + } + core.ui.closePanel(); +} + +actions.prototype.keyUpCenterFly = function (keycode) { + if (keycode==51 || keycode==13 || keycode==32 || keycode==67) { + if (core.canUseItem('centerFly')) { + core.useItem('centerFly'); + } + else { + core.drawTip('当前不能使用中心对称飞行器'); + } + } + core.ui.closePanel(); +} + + ////// 点击确认框时 ////// actions.prototype.clickConfirmBox = function (x,y) { if ((x == 4 || x == 5) && y == 7 && core.isset(core.status.event.data.yes)) @@ -968,23 +965,48 @@ actions.prototype.keyUpFly = function (keycode) { ////// 查看地图界面时的点击操作 ////// actions.prototype.clickViewMaps = function (x,y) { + if (!core.isset(core.status.event.data)) { + core.ui.drawMaps(core.floorIds.indexOf(core.status.floorId)); + return; + } + var now = core.floorIds.indexOf(core.status.floorId); - var nextId = core.status.event.data; - if(y<=4) { - nextId++; - while (nextId=2 && x<=10 && y<=1 && mh>13) { + core.ui.drawMaps(index, cx, cy-1); + return; } - else if (y>=8) { - nextId--; - while (nextId>=0 && nextId!=now && core.floors[core.floorIds[nextId]].cannotViewMap) - nextId--; - if (nextId>=0) - core.ui.drawMaps(nextId); + if (x>=2 && x<=10 && y>=11 && mh>13) { + core.ui.drawMaps(index, cx, cy+1); + return; } - else { + if (x<=1 && y>=2 && y<=10) { + core.ui.drawMaps(index, cx-1, cy); + return; + } + if (x>=11 && y>=2 && y<=10) { + core.ui.drawMaps(index, cx+1, cy); + return; + } + + if(x>=2 && x<=10 && y<=4) { + index++; + while (index=2 && x<=10 && y>=8) { + index--; + while (index>=0 && index!=now && core.floors[core.floorIds[index]].cannotViewMap) + index--; + if (index>=0) + core.ui.drawMaps(index); + } + else if (x>=2 && x<=10 && y>=5 && y<=7) { core.clearMap('data'); core.setOpacity('data', 1); core.ui.closePanel(); @@ -993,17 +1015,23 @@ actions.prototype.clickViewMaps = function (x,y) { ////// 查看地图界面时,按下某个键的操作 ////// actions.prototype.keyDownViewMaps = function (keycode) { - if (keycode==37 || keycode==38 || keycode==33) { - this.clickViewMaps(6,2); - } - else if (keycode==39 || keycode==40 || keycode==34) { - this.clickViewMaps(6,10); - } + if (!core.isset(core.status.event.data)) return; + if (keycode==38||keycode==33) this.clickViewMaps(6, 3); + if (keycode==40||keycode==34) this.clickViewMaps(6, 9); + if (keycode==87) this.clickViewMaps(6,0); + if (keycode==65) this.clickViewMaps(0,6); + if (keycode==83) this.clickViewMaps(6,12); + if (keycode==68) this.clickViewMaps(12,6); return; } ////// 查看地图界面时,放开某个键的操作 ////// actions.prototype.keyUpViewMaps = function (keycode) { + if (!core.isset(core.status.event.data)) { + core.ui.drawMaps(core.floorIds.indexOf(core.status.floorId)); + return; + } + if (keycode==27 || keycode==13 || keycode==32 || keycode==67) { core.clearMap('data'); core.setOpacity('data', 1); @@ -1585,9 +1613,12 @@ actions.prototype.clickSettings = function (x,y) { core.drawTip("本塔不允许浏览地图!"); } else { + /* core.drawText("\t[系统提示]即将进入浏览地图模式。\n\n点击地图上半部分,或按[↑]键可查看前一张地图\n点击地图下半部分,或按[↓]键可查看后一张地图\n点击地图中间,或按[ESC]键可离开浏览地图模式\n此模式下可以打开怪物手册以查看某层楼的怪物属性", function () { core.ui.drawMaps(core.floorIds.indexOf(core.status.floorId)); }) + */ + core.ui.drawMaps(); } break; case 3: @@ -2011,6 +2042,19 @@ actions.prototype.clickReplay = function (x, y) { break; } case 2: + if (core.hasFlag('debug')) { + core.drawText("\t[系统提示]调试模式下无法下载录像"); + break; + } + core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5route", JSON.stringify({ + 'name': core.firstData.name, + 'hard': core.status.hard, + 'seed': core.getFlag('seed'), + 'route': core.encodeRoute(core.status.route) + })); + break; + break; + case 3: core.ui.closePanel(); break; } diff --git a/libs/control.js b/libs/control.js index 7501f365..4a3f2468 100644 --- a/libs/control.js +++ b/libs/control.js @@ -542,9 +542,7 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { ////// 自动寻路算法,找寻最优路径 ////// control.prototype.automaticRoute = function (destX, destY) { - var fw = core.bigmap.width; - var fh = core.bigmap.height; - var total = fw * fh; + var fw = core.bigmap.width, fh = core.bigmap.height; var startX = core.getHeroLoc('x'); var startY = core.getHeroLoc('y'); var scan = { @@ -553,31 +551,26 @@ control.prototype.automaticRoute = function (destX, destY) { 'down': {'x': 0, 'y': 1}, 'right': {'x': 1, 'y': 0} }; - var queue = []; - var nowDeep = 0; - var route = []; - var ans = [] - if (destX == startX && destY == startY) return false; - queue.push(startX + fw * startY); - queue.push(-1); - route[startX + fw * startY] = ''; - while (queue.length != 1) { - var f = queue.shift(); - if (f===-1) {nowDeep+=1;queue.push(-1);continue;} - var deep = parseInt(f/total); - if (deep!==nowDeep) {queue.push(f);continue;} - f=f%total; - var nowX = parseInt(f % fw), nowY = parseInt(f / fw); - var nowIsArrow = false, nowId, nowBlock = core.getBlock(nowX,nowY); + var route = []; + var queue = new PriorityQueue({comparator: function (a,b) { + return a.depth - b.depth; + }}); + var ans = []; + + route[startX + fw * startY] = ''; + queue.queue({depth: 0, x: startX, y: startY}); + while (queue.length!=0) { + var curr = queue.dequeue(); + var deep = curr.depth, nowX = curr.x, nowY = curr.y; + for (var direction in scan) { if (!core.canMoveHero(nowX, nowY, direction)) continue; var nx = nowX + scan[direction].x; var ny = nowY + scan[direction].y; - if (nx<0 || nx>=fw || ny<0 || ny>=fh) continue; var nid = nx + fw * ny; @@ -585,21 +578,19 @@ control.prototype.automaticRoute = function (destX, destY) { if (core.isset(route[nid])) continue; var deepAdd=1; - var nextId, nextBlock = core.getBlock(nx,ny); if (nextBlock!=null){ nextId = nextBlock.block.event.id; // 绕过亮灯(因为只有一次通行机会很宝贵) if(nextId == "light") deepAdd=100; // 绕过路障 - if (nextId.substring(nextId.length-3)=="Net") deepAdd=core.values.lavaDamage; + // if (nextId.substring(nextId.length-3)=="Net") deepAdd=core.values.lavaDamage*10; // 绕过血瓶 - if (!core.flags.potionWhileRouting && nextId.substring(nextId.length-6)=="Potion") deepAdd=20; + if (!core.flags.potionWhileRouting && nextId.substring(nextId.length-6)=="Potion") deepAdd+=20; // 绕过传送点 - if (nextBlock.block.event.trigger == 'changeFloor') deepAdd = 10; + if (nextBlock.block.event.trigger == 'changeFloor') deepAdd+=10; } - if (core.status.checkBlock.damage[nid]>0) - deepAdd = core.status.checkBlock.damage[nid]; + deepAdd+=core.status.checkBlock.damage[nid]*10; if (nx == destX && ny == destY) { route[nid] = direction; @@ -609,11 +600,10 @@ control.prototype.automaticRoute = function (destX, destY) { continue; route[nid] = direction; - queue.push(total*(nowDeep+deepAdd)+nid); + queue.queue({depth: deep+deepAdd, x: nx, y: ny}); } if (core.isset(route[destX + fw * destY])) break; } - if (!core.isset(route[destX + fw * destY])) { return false; } @@ -922,9 +912,14 @@ control.prototype.jumpHero = function (ex, ey, time, callback) { var animate=window.setInterval(function() { if (jump_count>0) { - core.clearMap('hero', drawX(), drawY()-height+32, 32, height); + core.clearMap('hero', drawX()-core.bigmap.offsetX, drawY()-height+32-core.bigmap.offsetY, 32, height); updateJump(); - core.canvas.hero.drawImage(core.material.images.hero, heroIcon[status] * 32, heroIcon.loc * height, 32, height, drawX(), drawY() + 32-height, 32, height); + var nowx = drawX(), nowy = drawY(); + core.bigmap.offsetX = core.clamp(nowx - 32*6, 0, 32*core.bigmap.width-416); + core.bigmap.offsetY = core.clamp(nowy - 32*6, 0, 32*core.bigmap.height-416); + core.control.updateViewport(); + core.canvas.hero.drawImage(core.material.images.hero, heroIcon[status] * 32, heroIcon.loc * height, 32, height, + nowx - core.bigmap.offsetX, nowy + 32-height - core.bigmap.offsetY, 32, height); } else { clearInterval(animate); @@ -1044,7 +1039,7 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { if (core.isset(core.status.hero.followers)) { var index=1; core.status.hero.followers.forEach(function (t) { - core.canvas.hero.clearRect(32*t.x-32, 32*t.y-32, 96, 96); + core.canvas.hero.clearRect(32*t.x-core.bigmap.offsetX-32, 32*t.y-core.bigmap.offsetY-32, 96, 96); if (core.isset(core.material.images.images[t.img])) { drawObjs.push({ "img": core.material.images.images[t.img], @@ -1174,14 +1169,14 @@ control.prototype.updateCheckBlock = function() { core.status.checkBlock.map = []; // 记录怪物地图 for (var n=0;n=0 && nx=0 && ny=0 && nx=0 && ny0) @@ -1578,7 +1573,7 @@ control.prototype.updateFg = function () { for (var b = 0; b < mapBlocks.length; b++) { var x = mapBlocks[b].x, y = mapBlocks[b].y; if (core.isset(mapBlocks[b].event) && mapBlocks[b].event.cls.indexOf('enemy')==0 - && !(core.isset(mapBlocks[b].enable) && !mapBlocks[b].enable)) { + && !mapBlocks[b].disable) { // 非系统默认的战斗事件(被覆盖) if (mapBlocks[b].event.trigger != 'battle') { diff --git a/libs/core.js b/libs/core.js index 93f24225..8bca255a 100644 --- a/libs/core.js +++ b/libs/core.js @@ -2,11 +2,6 @@ * 初始化 start */ -// 额外功能 -Number.prototype.clamp = function(min, max) { - return Math.min(Math.max(this, min), max); -}; - function core() { this.material = { 'animates': {}, @@ -81,7 +76,8 @@ function core() { offsetX: 0, // in pixel offsetY: 0, width: 13, // map width and height - height: 13 + height: 13, + tempCanvas: null, // A temp canvas for drawing } this.initStatus = { 'played': false, @@ -155,7 +151,6 @@ function core() { "time": 0, }, 'curtainColor': null, - 'usingCenterFly':false, 'openingDoor': null, 'isSkiing': false, @@ -275,6 +270,8 @@ core.prototype.init = function (coreData, callback) { core.material.ground = new Image(); core.material.ground.src = "project/images/ground.png"; + core.bigmap.tempCanvas = document.createElement('canvas').getContext('2d'); + core.loader.load(function () { console.log(core.material); // 设置勇士高度 @@ -669,13 +666,18 @@ core.prototype.enemyExists = function (x, y, id,floorId) { } ////// 获得某个点的block ////// -core.prototype.getBlock = function (x, y, floorId, needEnable) { - return core.maps.getBlock(x,y,floorId,needEnable); +core.prototype.getBlock = function (x, y, floorId, showDisable) { + return core.maps.getBlock(x,y,floorId,showDisable); } ////// 获得某个点的blockId ////// -core.prototype.getBlockId = function (x, y, floorId, needEnable) { - return core.maps.getBlockId(x, y, floorId, needEnable); +core.prototype.getBlockId = function (x, y, floorId, showDisable) { + return core.maps.getBlockId(x, y, floorId, showDisable); +} + +////// 获得某个点的blockCls ////// +core.prototype.getBlockCls = function (x, y, floorId, showDisable) { + return core.maps.getBlockCls(x, y, floorId, showDisable); } ////// 显示移动某块的动画,达到{“type”:”move”}的效果 ////// diff --git a/libs/enemys.js b/libs/enemys.js index 058389a4..d7e0d5d0 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -228,7 +228,7 @@ enemys.prototype.getCurrentEnemys = function (floorId) { var used = {}; var mapBlocks = core.status.maps[floorId].blocks; for (var b = 0; b < mapBlocks.length; b++) { - if (core.isset(mapBlocks[b].event) && !(core.isset(mapBlocks[b].enable) && !mapBlocks[b].enable) + if (core.isset(mapBlocks[b].event) && !mapBlocks[b].disable && mapBlocks[b].event.cls.indexOf('enemy')==0) { var enemyId = mapBlocks[b].event.id; if (core.isset(used[enemyId])) continue; diff --git a/libs/events.js b/libs/events.js index 215a6a51..7b26bf36 100644 --- a/libs/events.js +++ b/libs/events.js @@ -587,8 +587,12 @@ events.prototype.doAction = function() { break; case "openDoor": // 开一个门,包括暗墙 { + if (core.isset(data.loc)) { + x = core.calValue(data.loc[0]); + y = core.calValue(data.loc[1]); + } var floorId=data.floorId || core.status.floorId; - var block=core.getBlock(core.calValue(data.loc[0]), core.calValue(data.loc[1]), floorId); + var block=core.getBlock(x, y, floorId); if (block!=null) { if (floorId==core.status.floorId) core.openDoor(block.block.event.id, block.block.x, block.block.y, false, function() { @@ -1026,7 +1030,7 @@ events.prototype.trigger = function (x, y) { var mapBlocks = core.status.thisMap.blocks; var noPass; for (var b = 0; b < mapBlocks.length; b++) { - if (mapBlocks[b].x == x && mapBlocks[b].y == y && !(core.isset(mapBlocks[b].enable) && !mapBlocks[b].enable)) { // 启用事件 + if (mapBlocks[b].x == x && mapBlocks[b].y == y && !mapBlocks[b].disable) { // 启用事件 noPass = mapBlocks[b].event && mapBlocks[b].event.noPass; if (noPass) { core.clearAutomaticRouteNode(x, y); @@ -1102,7 +1106,7 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback else { var blocks = core.status.maps[floorId].blocks; for (var i in blocks) { - if (core.isset(blocks[i].event) && !(core.isset(blocks[i].enable) && !blocks[i].enable) && blocks[i].event.id === stair) { + if (core.isset(blocks[i].event) && !blocks[i].disable && blocks[i].event.id === stair) { heroLoc.x = blocks[i].x; heroLoc.y = blocks[i].y; break; @@ -1179,9 +1183,9 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback // 检查重生 if (!core.isset(fromLoad)) { core.status.maps[floorId].blocks.forEach(function(block) { - if (core.isset(block.enable) && !block.enable && core.isset(block.event) && block.event.cls.indexOf('enemy')==0 + if (block.disable && core.isset(block.event) && block.event.cls.indexOf('enemy')==0 && core.enemys.hasSpecial(core.material.enemys[block.event.id].special, 23)) { - block.enable = true; + block.disable = false; } }) } @@ -1328,13 +1332,16 @@ events.prototype.vibrate = function(time, callback) { core.status.replay.animate=true; - var setGameCanvasTranslate=function(x,y){ + var addGameCanvasTranslate=function(x,y){ for(var ii=0,canvas;canvas=core.dom.gameCanvas[ii];ii++){ - if(['data','ui'].indexOf(canvas.getAttribute('id'))!==-1)continue; - canvas.style.transform='translate('+x+'px,'+y+'px)'; - canvas.style.webkitTransform='translate('+x+'px,'+y+'px)'; - canvas.style.OTransform='translate('+x+'px,'+y+'px)'; - canvas.style.MozTransform='translate('+x+'px,'+y+'px)'; + var id = canvas.getAttribute('id'); + if (id=='ui' || id=='data') continue; + var offsetX = x, offsetY = y; + if (core.bigmap.canvas.indexOf(id)>=0) { + offsetX-=core.bigmap.offsetX; + offsetY-=core.bigmap.offsetY; + } + core.control.setGameCanvasTranslate(id, offsetX, offsetY); } } @@ -1368,7 +1375,7 @@ events.prototype.vibrate = function(time, callback) { var animate=setInterval(function(){ update(); - setGameCanvasTranslate(shake,0); + addGameCanvasTranslate(shake, 0); if(shake_duration===0) { clearInterval(animate); core.status.replay.animate=false; @@ -1490,10 +1497,15 @@ events.prototype.useItem = function(itemId) { return; } if (itemId=='centerFly') { - core.status.usingCenterFly= true; + core.lockControl(); + core.status.event.id = 'centerFly'; var fillstyle = 'rgba(255,0,0,0.5)'; if (core.canUseItem('centerFly')) fillstyle = 'rgba(0,255,0,0.5)'; - core.fillRect('ui',(12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32,fillstyle); + var toX = core.bigmap.width-1 - core.getHeroLoc('x'), toY = core.bigmap.height-1-core.getHeroLoc('y'); + core.ui.drawThumbnail(core.status.floorId, 'ui', core.status.thisMap.blocks, 0, 0, 416, toX, toY, core.status.hero.loc, core.getFlag('heroIcon', "hero.png")); + var offsetX = core.clamp(toX-6, 0, core.bigmap.width-13), offsetY = core.clamp(toY-6, 0, core.bigmap.height-13); + core.fillRect('ui',(toX-offsetX)*32,(toY-offsetY)*32,32,32,fillstyle); + core.status.event.data = {"x": toX, "y": toY, "poxX": toX-offsetX, "posY": toY-offsetY}; core.drawTip("请确认当前中心对称飞行器的位置"); return; } @@ -1612,7 +1624,7 @@ events.prototype.pushBox = function (data) { if (nx<0||nx>=core.bigmap.width||ny<0||ny>=core.bigmap.height) return; - var block = core.getBlock(nx, ny, null, false); + var block = core.getBlock(nx, ny, null, true); if (block!=null && !(core.isset(block.block.event) && block.block.event.id=='flower')) return; diff --git a/libs/maps.js b/libs/maps.js index f1423463..d496a9c7 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -16,7 +16,7 @@ maps.prototype.loadFloor = function (floorId, map) { content['title'] = floor.title; content['canFlyTo'] = floor.canFlyTo; if (!core.isset(map)) map=floor.map; - var mapIntoBlocks = function(map,maps,floor){ + var mapIntoBlocks = function(map,maps,floor,floorId){ var blocks = []; var mw = core.floors[floorId].width || 13; var mh = core.floors[floorId].height || 13; @@ -32,32 +32,32 @@ maps.prototype.loadFloor = function (floorId, map) { return blocks; } if (main.mode=='editor'){ - main.editor.mapIntoBlocks = function(map,floor){ - return mapIntoBlocks(map,core.maps,floor); + main.editor.mapIntoBlocks = function(map,floor,floorId){ + return mapIntoBlocks(map,core.maps,floor,floorId); } } // 事件处理 - content['blocks'] = mapIntoBlocks(map,this,floor); + content['blocks'] = mapIntoBlocks(map,this,floor,floorId); return content; } ////// 数字和ID的对应关系 ////// maps.prototype.initBlock = function (x, y, id) { - var enable=null; + var disable=null; id = ""+id; if (id.length>2) { if (id.indexOf(":f")==id.length-2) { id = id.substring(0, id.length - 2); - enable = false; + disable = false; } else if (id.indexOf(":t")==id.length-2) { id = id.substring(0, id.length - 2); - enable = true; + disable = true; } } id=parseInt(id); var tmp = {'x': x, 'y': y, 'id': id}; - if (enable!=null) tmp.enable = enable; + if (disable!=null) tmp.disable = disable; if (id in this.blocksInfo) tmp.event = JSON.parse(JSON.stringify(this.blocksInfo[id])); @@ -113,8 +113,8 @@ maps.prototype.addEvent = function (block, x, y, event) { block.event.noPass = event.noPass; // 覆盖enable - if (!core.isset(block.enable) && core.isset(event.enable)) { - block.enable=event.enable; + if (!core.isset(block.disable) && core.isset(event.enable)) { + block.disable=!event.enable; } // 覆盖trigger if (!core.isset(block.event.trigger)) { @@ -126,7 +126,7 @@ maps.prototype.addEvent = function (block, x, y, event) { } // 覆盖其他属性 for (var key in event) { - if (key!="enable" && key!="trigger" && key!="noPass" && core.isset(event[key])) { + if (key!="disable" && key!="trigger" && key!="noPass" && core.isset(event[key])) { block.event[key]=core.clone(event[key]); } } @@ -171,8 +171,8 @@ maps.prototype.save = function(maps, floorId) { } } thisFloor.blocks.forEach(function (block) { - if (core.isset(block.enable)) { - if (block.enable) blocks[block.y][block.x] = block.id+":t"; + if (core.isset(block.disable)) { + if (!block.disable) blocks[block.y][block.x] = block.id+":t"; else blocks[block.y][block.x] = block.id+":f"; } else blocks[block.y][block.x] = block.id; @@ -218,7 +218,7 @@ maps.prototype.getMapArray = function (blockArray,width,height){ } } blockArray.forEach(function (block) { - if (!(core.isset(block.enable) && !block.enable)) + if (!block.disable) blocks[block.y][block.x] = block.id; }); return blocks; @@ -354,10 +354,8 @@ maps.prototype.drawMap = function (mapName, callback) { } } images.forEach(function (t) { - var size=416, ratio=1; 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])) { - dx*=32; dy*=32; var image = core.material.images.images[p]; if (!t[3]) { if (/.*\.gif/i.test(p) && main.mode=='play') { @@ -365,23 +363,23 @@ maps.prototype.drawMap = function (mapName, callback) { var gif = new Image(); gif.src = core.material.images.images[p].src; gif.style.position = 'absolute'; - gif.style.left = (dx*core.domStyle.scale)+"px"; - gif.style.top = (dy*core.domStyle.scale)+"px"; + gif.style.left = (32*dx*core.domStyle.scale)+"px"; + gif.style.top = (32*dy*core.domStyle.scale)+"px"; gif.style.width = core.material.images.images[p].width*core.domStyle.scale+"px"; gif.style.height = core.material.images.images[p].height*core.domStyle.scale+"px"; core.dom.gif.appendChild(gif); } else { - core.canvas.bg.drawImage(image, dx * ratio, dy * ratio, Math.min(size - dx * ratio, ratio * image.width), Math.min(size - dy * ratio, ratio * image.height)); + core.canvas.bg.drawImage(image, 32*dx, 32*dy, image.width, image.height); } } else if (t[3]==1) - core.canvas.event2.drawImage(image, dx*ratio, dy*ratio, Math.min(size-dx*ratio, ratio*image.width), Math.min(size-dy*ratio, ratio*image.height)); + core.canvas.event2.drawImage(image, 32*dx, 32*dy, image.width, image.height); else if (t[3]==2) { core.canvas.event2.drawImage(image, 0, 0, image.width, image.height-32, - dx * ratio, dy * ratio, ratio * image.width, ratio * (image.height-32)); + 32*dx, 32*dy, image.width, image.height-32); core.canvas.bg.drawImage(image, 0, image.height-32, image.width, 32, - dx * ratio, (dy + image.height - 32) * ratio, ratio*image.width, 32*ratio); + 32*dx, 32*dy + image.height - 32, image.width, 32); } } }) @@ -406,7 +404,7 @@ maps.prototype.drawMap = function (mapName, callback) { for (var b = 0; b < mapBlocks.length; b++) { // 事件启用 var block = mapBlocks[b]; - if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable)) { + if (core.isset(block.event) && !block.disable) { if (block.event.cls == 'autotile') { core.drawAutotile(core.canvas.event, mapArray, block, 32, 0, 0); } @@ -466,8 +464,8 @@ maps.prototype.drawAutotile = function(ctx, mapArr, block, size, left, top){ var sx = 16*((index-1)%6), sy = 16*(~~((index-1)/6)); ctx.drawImage(autotileImg, sx, sy, 16, 16, dx, dy, size/2, size/2); } - var getAutotileAroundId = function(currId, x, y){ - if(x<0 || y<0 || x>=core.bigmap.width || y>=core.bigmap.height) return 1; + var getAutotileAroundId = function(currId, x, y) { + if(x<0 || y<0 || x>=mapArr[0].length || y>=mapArr.length) return 1; else return mapArr[y][x]==currId ? 1:0; } var checkAround = function(x, y){ // 得到周围四个32*32块(周围每块都包含当前块的1/4,不清楚的话画下图你就明白)的数组索引 @@ -569,13 +567,12 @@ maps.prototype.enemyExists = function (x, y, id,floorId) { } ////// 获得某个点的block ////// -maps.prototype.getBlock = function (x, y, floorId, needEnable) { +maps.prototype.getBlock = function (x, y, floorId, showDisable) { if (!core.isset(floorId)) floorId=core.status.floorId; - if (!core.isset(needEnable)) needEnable=true; var blocks = core.status.maps[floorId].blocks; for (var n=0;n0) { - core.clearMap('animate', drawX(), drawY()-height+32, 32, height); + core.clearMap('route', drawX(), drawY()-height+32, 32, height); updateJump(); - core.canvas.animate.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, drawX(), drawY()-height+32, 32, height); + core.canvas.route.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, drawX(), drawY()-height+32, 32, height); } else { if (keep) opacityVal=0; else opacityVal -= 0.06; - core.setOpacity('animate', opacityVal); - core.clearMap('animate', drawX(), drawY()-height+32, 32, height); - core.canvas.animate.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, drawX(), drawY()-height+32, 32, height); + core.setOpacity('route', opacityVal); + core.clearMap('route', drawX(), drawY()-height+32, 32, height); + core.canvas.route.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, drawX(), drawY()-height+32, 32, height); if (opacityVal<=0) { clearInterval(animate); - core.clearMap('animate'); - core.setOpacity('animate', 1); + core.clearMap('route'); + core.setOpacity('route', 1); if (keep) { core.setBlock(id, ex, ey); core.showBlock(ex, ey); @@ -792,14 +797,14 @@ maps.prototype.jumpBlock = function(sx,sy,ex,ey,time,keep,callback) { maps.prototype.animateBlock = function (loc,type,time,callback) { if (type!='hide') type='show'; - core.clearMap('animate'); + core.clearMap('route'); if (typeof loc[0] == 'number' && typeof loc[1] == 'number') loc = [loc]; var list = []; loc.forEach(function (t) { - var block = core.getBlock(t[0],t[1],core.status.floorId,false); + var block = core.getBlock(t[0],t[1],null,true); if (block==null) return; block=block.block; list.push({ @@ -817,24 +822,24 @@ maps.prototype.animateBlock = function (loc,type,time,callback) { core.status.replay.animate=true; var draw = function () { list.forEach(function (t) { - core.canvas.animate.drawImage(t.blockImage, 0, t.blockIcon*t.height, 32, t.height, t.x*32, t.y*32+32-t.height, 32, t.height); + core.canvas.route.drawImage(t.blockImage, 0, t.blockIcon*t.height, 32, t.height, t.x*32, t.y*32+32-t.height, 32, t.height); }) } var opacityVal = 0; if (type=='hide') opacityVal=1; - core.setOpacity('animate', opacityVal); + core.setOpacity('route', opacityVal); draw(); var animate = window.setInterval(function () { if (type=='show') opacityVal += 0.1; else opacityVal -= 0.1; - core.setOpacity('animate', opacityVal); + core.setOpacity('route', opacityVal); if (opacityVal >=1 || opacityVal<=0) { clearInterval(animate); - core.clearMap('animate'); - core.setOpacity('animate', 1); + core.clearMap('route'); + core.setOpacity('route', 1); core.status.replay.animate=false; if (core.isset(callback)) callback(); } @@ -844,12 +849,12 @@ maps.prototype.animateBlock = function (loc,type,time,callback) { ////// 将某个块从禁用变成启用状态 ////// maps.prototype.showBlock = function(x, y, floodId) { floodId = floodId || core.status.floorId; - var block = core.getBlock(x,y,floodId,false); + var block = core.getBlock(x,y,floodId,true); if (block==null) return; // 不存在 block=block.block; // 本身是禁用事件,启用之 - if (core.isset(block.enable) && !block.enable) { - block.enable = true; + if (block.disable) { + block.disable = false; // 在本层,添加动画 if (floodId == core.status.floorId && core.isset(block.event)) { core.drawBlock(block); @@ -864,7 +869,7 @@ maps.prototype.showBlock = function(x, y, floodId) { maps.prototype.removeBlock = function (x, y, floorId) { floorId = floorId || core.status.floorId; - var block = core.getBlock(x,y,floorId,false); + var block = core.getBlock(x,y,floorId,true); if (block==null) return; // 不存在 var index=block.index; @@ -906,7 +911,7 @@ maps.prototype.removeBlockById = function (index, floorId) { blocks.splice(index,1); return; } - block.enable = false; + block.disable = true; } ////// 一次性删除多个block ////// @@ -922,7 +927,7 @@ maps.prototype.setBlock = function (number, x, y, 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; - var originBlock=core.getBlock(x,y,floorId,false); + var originBlock=core.getBlock(x,y,floorId,true); var block = core.maps.initBlock(x,y,number); core.maps.addInfo(block); core.maps.addEvent(block,x,y,core.floors[floorId].events[x+","+y]); diff --git a/libs/thirdparty/priority-queue.min.js b/libs/thirdparty/priority-queue.min.js new file mode 100644 index 00000000..f161936f --- /dev/null +++ b/libs/thirdparty/priority-queue.min.js @@ -0,0 +1 @@ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.PriorityQueue=t()}}(function(){return function t(e,i,r){function o(n,s){if(!i[n]){if(!e[n]){var h="function"==typeof require&&require;if(!s&&h)return h(n,!0);if(a)return a(n,!0);var u=new Error("Cannot find module '"+n+"'");throw u.code="MODULE_NOT_FOUND",u}var p=i[n]={exports:{}};e[n][0].call(p.exports,function(t){var i=e[n][1][t];return o(i?i:t)},p,p.exports,t,e,i,r)}return i[n].exports}for(var a="function"==typeof require&&require,n=0;no;)a=o+r>>>1,i(t[a],e)>=0?o=a+1:r=a;return o},e.exports=r=function(){function t(t){var e;this.options=t,this.comparator=this.options.comparator,this.data=(null!=(e=this.options.initialValues)?e.slice(0):void 0)||[],this.data.sort(this.comparator).reverse()}return t.prototype.queue=function(t){var e;e=o(this.data,t,this.comparator),this.data.splice(e,0,t)},t.prototype.dequeue=function(){return this.data.pop()},t.prototype.peek=function(){return this.data[this.data.length-1]},t.prototype.clear=function(){this.data.length=0},t}()},{}],4:[function(t,e,i){var r;e.exports=r=function(){function t(t){var e,i,r,o,a,n,s,h,u;for(this.comparator=(null!=t?t.comparator:void 0)||function(t,e){return t-e},this.pageSize=(null!=t?t.pageSize:void 0)||512,this.length=0,h=0;1<=0?n>r:r>n;i=n>=0?++r:--r)e.push(null);if(this._memory=[],this._mask=this.pageSize-1,t.initialValues)for(s=t.initialValues,o=0,a=s.length;a>o;o++)u=s[o],this.queue(u)}return t.prototype.queue=function(t){this.length+=1,this._write(this.length,t),this._bubbleUp(this.length,t)},t.prototype.dequeue=function(){var t,e;return t=this._read(1),e=this._read(this.length),this.length-=1,this.length>0&&(this._write(1,e),this._bubbleDown(1,e)),t},t.prototype.peek=function(){return this._read(1)},t.prototype.clear=function(){this.length=0,this._memory.length=0},t.prototype._write=function(t,e){var i;for(i=t>>this._shift;i>=this._memory.length;)this._memory.push(this._emptyMemoryPageTemplate.slice(0));return this._memory[i][t&this._mask]=e},t.prototype._read=function(t){return this._memory[t>>this._shift][t&this._mask]},t.prototype._bubbleUp=function(t,e){var i,r,o,a;for(i=this.comparator;t>1&&(r=t&this._mask,t3?o=t&~this._mask|r>>1:2>r?(o=t-this.pageSize>>this._shift,o+=o&~(this._mask>>1),o|=this.pageSize>>1):o=t-2,a=this._read(o),!(i(a,e)<0));)this._write(o,e),this._write(t,a),t=o},t.prototype._bubbleDown=function(t,e){var i,r,o,a,n;for(n=this.comparator;tthis._mask&&!(t&this._mask-1)?i=r=t+2:t&this.pageSize>>1?(i=(t&~this._mask)>>1,i|=t&this._mask>>1,i=i+1<0)for(t=e=1,i=this.data.length;i>=1?i>e:e>i;t=i>=1?++e:--e)this._bubbleUp(t)},t.prototype.queue=function(t){this.data.push(t),this._bubbleUp(this.data.length-1)},t.prototype.dequeue=function(){var t,e;return e=this.data[0],t=this.data.pop(),this.data.length>0&&(this.data[0]=t,this._bubbleDown(0)),e},t.prototype.peek=function(){return this.data[0]},t.prototype.clear=function(){this.length=0,this.data.length=0},t.prototype._bubbleUp=function(t){for(var e,i;t>0&&(e=t-1>>>1,this.comparator(this.data[t],this.data[e])<0);)i=this.data[e],this.data[e]=this.data[t],this.data[t]=i,t=e},t.prototype._bubbleDown=function(t){var e,i,r,o,a;for(e=this.data.length-1;;){if(i=(t<<1)+1,o=i+1,r=t,e>=i&&this.comparator(this.data[i],this.data[r])<0&&(r=i),e>=o&&this.comparator(this.data[o],this.data[r])<0&&(r=o),r===t)break;a=this.data[r],this.data[r]=this.data[t],this.data[t]=a,t=r}},t}()},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/libs/ui.js b/libs/ui.js index 0a4fd41d..73af00ee 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1178,7 +1178,7 @@ ui.prototype.drawReplay = function () { core.lockControl(); core.status.event.id = 'replay'; this.drawChoices(null, [ - "从头回放录像", "从存档开始回放", "返回游戏" + "从头回放录像", "从存档开始回放", "下载当前录像", "返回游戏" ]); } @@ -1476,30 +1476,81 @@ ui.prototype.drawFly = function(page) { } ////// 绘制浏览地图界面 ////// -ui.prototype.drawMaps = function (index) { - if (!core.isset(index)) index=core.floorIds.indexOf(core.status.floorId); +ui.prototype.drawMaps = function (index, x, y) { + core.lockControl(); + core.status.event.id = 'viewMaps'; + + if (!core.isset(index)) { + core.status.event.data = null; + core.clearMap('ui'); + core.setAlpha('ui', 1); + + core.clearMap('animate'); + core.setOpacity('animate', 0.4); + core.fillRect('animate', 0, 0, 416, 416, '#000000'); + + core.strokeRect('ui', 66, 2, 284, 60, "#FFD700", 4); + core.strokeRect('ui', 2, 66, 60, 284); + core.strokeRect('ui', 66, 416-62, 284, 60); + core.strokeRect('ui', 416-62, 66, 60, 284); + core.strokeRect('ui', 66, 66, 284, 92); + core.strokeRect('ui', 66, 32*8+2, 284, 92); + core.canvas.ui.textAlign = 'center'; + core.fillText('ui', "上移地图 [W]", 208, 38, '#FFD700', '20px Arial'); + core.fillText('ui', "下移地图 [S]", 208, 390); + + var top = 150; + core.fillText('ui', "左", 32, top); + core.fillText('ui', "移", 32, top+32); + core.fillText('ui', "地", 32, top+32*2); + core.fillText('ui', "图", 32, top+32*3); + core.fillText('ui', "[A]", 32, top+32*4); + core.fillText('ui', "右", 384, top); + core.fillText('ui', "移", 384, top+32); + core.fillText('ui', "地", 384, top+32*2); + core.fillText('ui', "图", 384, top+32*3); + core.fillText('ui', "[D]", 384, top+32*4); + + core.fillText('ui', "前张地图 [▲ / PGUP]", 208, 64+54); + core.fillText('ui', "后张地图 [▼ / PGDN]", 208, 32*8+54); + + core.fillText('ui', "退出 [ESC / ENTER]", 208, 208+8); + core.fillText('ui', "[X] 可查看怪物手册", 285, 208+40, null, '13px Arial'); + return; + } + + core.clearMap('animate'); + core.setOpacity('animate', 1); + + if (core.isset(index.index)) { + x=index.x; + y=index.y; + index=index.index; + } if (index<0) index=0; if (index>=core.floorIds.length) index=core.floorIds.length-1; + var floorId = core.floorIds[index], mw = core.floors[floorId].width||13, mh = core.floors[floorId].height||13; + if (!core.isset(x)) x = parseInt(mw/2); + if (!core.isset(y)) y = parseInt(mh/2); + if (x<6) x=6; + if (x>mw-7) x=mw-7; + if (y<6) y=6; + if (y>mh-7) y=mh-7; - core.lockControl(); - core.status.event.id = 'viewMaps'; - core.status.event.data = index; - - var floorId = core.floorIds[index]; + core.status.event.data = {"index": index, "x": x, "y": y}; clearTimeout(core.interval.tipAnimate); - core.clearMap('ui'); core.setAlpha('ui', 1); - this.drawThumbnail(floorId, 'ui', core.status.maps[floorId].blocks, 0, 0, 416); + this.drawThumbnail(floorId, 'ui', core.status.maps[floorId].blocks, 0, 0, 416, x, y); core.clearMap('data'); core.setOpacity('data', 0.2); core.canvas.data.textAlign = 'left'; core.setFont('data', '16px Arial'); - var text = core.floors[floorId].title; + var text = core.floors[floorId].title + " ["+(x-6)+","+(y-6)+"]"; var textX = 16, textY = 18, width = textX + core.canvas.data.measureText(text).width + 16, height = 42; core.fillRect('data', 5, 5, width, height, '#000'); core.setOpacity('data', 0.5); @@ -1679,7 +1730,7 @@ ui.prototype.drawSLPanel = function(index) { core.fillText('ui', i==0?"自动存档":name+id, (2*i+1)*u, 35, '#FFFFFF', "bold 17px Verdana"); core.strokeRect('ui', (2*i+1)*u-size/2, 50, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); if (core.isset(data) && core.isset(data.floorId)) { - this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 50, size, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); + this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 50, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); core.fillText('ui', core.formatDate(new Date(data.time)), (2*i+1)*u, 65+size, '#FFFFFF', '10px Verdana'); } else { @@ -1691,7 +1742,7 @@ ui.prototype.drawSLPanel = function(index) { core.fillText('ui', name+id, (2*i-5)*u, 230, '#FFFFFF', "bold 17px Verdana"); core.strokeRect('ui', (2*i-5)*u-size/2, 245, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); if (core.isset(data) && core.isset(data.floorId)) { - this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 245, size, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); + this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 245, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); core.fillText('ui', core.formatDate(new Date(data.time)), (2*i-5)*u, 260+size, '#FFFFFF', '10px Verdana'); } else { @@ -1709,20 +1760,27 @@ ui.prototype.drawSLPanel = function(index) { } ////// 绘制一个缩略图 ////// -ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, heroLoc, heroIcon) { - core.clearMap(canvas, x, y, size, size); +ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, centerX, centerY, heroLoc, heroIcon) { + + var mw = core.floors[floorId].width || 13; + var mh = core.floors[floorId].height || 13; + // 绘制到tempCanvas上面 + var tempCanvas = core.bigmap.tempCanvas; + var tempWidth = mw*32, tempHeight = mh*32; + tempCanvas.canvas.width = tempWidth; + tempCanvas.canvas.height = tempHeight; + tempCanvas.clearRect(0, 0, tempWidth, tempHeight); + var groundId = core.floors[floorId].defaultGround || "ground"; var blockIcon = core.material.icons.terrains[groundId]; var blockImage = core.material.images.terrains; - var persize = size/13; - var mw = core.floors[floorId].width || 13; - var mh = core.floors[floorId].height || 13; - for (var i=0;i<13;i++) { - for (var j=0;j<13;j++) { - core.canvas[canvas].drawImage(blockImage, 0, blockIcon * 32, 32, 32, x + i * persize, y + j * persize, persize, persize); + // background + for (var i=0;i=0", - "pickaxe": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) \n\t\t&& Math.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1\n\t\t&& (block.event.id == 'yellowWall' || block.event.id=='whiteWall' || block.event.id=='blueWall')) // 能破哪些墙\n\t{\n\t\t// 四个方向\n\t\tif (core.flags.pickaxeFourDirections || (block.x == core.nextX() && block.y == core.nextY()))\n\t\t\tids.push(i);\n\t\telse id2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", - "icePickaxe": "var able=false;\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.x==core.nextX() && block.y==core.nextY() && block.event.id=='ice') {\n\t\tcore.status.event.data = [i];\n\t\table=true;\n\t}\n}\nable", - "bomb": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.event.cls.indexOf('enemy')==0 && \n\t\tMath.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\tif (core.isset(enemy) && enemy.notBomb) continue;\n\t\tif (core.flags.bombFourDirections || (block.x==core.nextX() && block.y==core.nextY()))\n\t\t\tids.push(i);\n\t\telse\n\t\t\tid2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", - "hammer": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.event.cls.indexOf('enemy')==0 && \n\t\tMath.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\tif (core.isset(enemy) && enemy.notBomb) continue;\n\t\tif (block.x==core.nextX() && block.y==core.nextY())\n\t\t\tids.push(i);\n\t\telse\n\t\t\tid2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", - "earthquake": "var able=false;\nvar ids = [];\nfor (var i in core.status.thisMap.blocks) {\n var block = core.status.thisMap.blocks[i];\n if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && (block.event.id == 'yellowWall' || block.event.id == 'blueWall' || block.event.id == 'whiteWall')) // 能炸的墙壁\n ids.push(i);\n}\nif (ids.length>0) {\n core.status.event.data = ids;\n able=true;\n}\nable", - "centerFly": "var able=false;\nvar toX = 12 - core.getHeroLoc('x'), toY = 12-core.getHeroLoc('y');\nvar block = core.getBlock(toX, toY);\nif (block==null) {\n core.status.event.data = {'x': toX, 'y': toY};\n able = true;\n}\nable", - "upFly": "var able=false;\nvar floorId = core.status.floorId, index = core.floorIds.indexOf(floorId);\nif (index0) {\n\tvar toId = core.floorIds[index-1], toX = core.getHeroLoc('x'), toY = core.getHeroLoc('y');\n\tif (core.getBlock(toX, toY, toId)==null) {\n\t\tcore.status.event.data = {'id': toId, 'x': toX, 'y': toY};\n\t\table=true;\n\t}\n}\nable", - "snow": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) \n\t\t&& block.event.id == 'lava' && Math.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tif (core.flags.snowFourDirections || (block.x == core.nextX() && block.y == core.nextY()))\n\t\t\tids.push(i);\n\t\telse id2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", - "bigKey": "var able=false;\nvar ids = [];\nfor (var i in core.status.thisMap.blocks) {\n var block = core.status.thisMap.blocks[i];\n if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.event.id == 'yellowDoor') {\n ids.push(i);\n }\n}\nif (ids.length>0) {\n core.status.event.data = ids;\n able=true;\n}\nable", + "pickaxe": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !block.disable && Math.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1\n\t\t&& (block.event.id == 'yellowWall' || block.event.id=='whiteWall' || block.event.id=='blueWall')) // 能破哪些墙\n\t{\n\t\t// 四个方向\n\t\tif (core.flags.pickaxeFourDirections || (block.x == core.nextX() && block.y == core.nextY()))\n\t\t\tids.push(i);\n\t\telse id2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", + "icePickaxe": "var able=false;\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !block.disable && block.x==core.nextX() && block.y==core.nextY() && block.event.id=='ice') {\n\t\tcore.status.event.data = [i];\n\t\table=true;\n\t}\n}\nable", + "bomb": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !block.disable && block.event.cls.indexOf('enemy')==0 && Math.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\tif (core.isset(enemy) && enemy.notBomb) continue;\n\t\tif (core.flags.bombFourDirections || (block.x==core.nextX() && block.y==core.nextY()))\n\t\t\tids.push(i);\n\t\telse\n\t\t\tid2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", + "hammer": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !block.disable && block.event.cls.indexOf('enemy')==0 && \n\t\tMath.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\tif (core.isset(enemy) && enemy.notBomb) continue;\n\t\tif (block.x==core.nextX() && block.y==core.nextY())\n\t\t\tids.push(i);\n\t\telse\n\t\t\tid2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", + "earthquake": "var able=false;\nvar ids = [];\nfor (var i in core.status.thisMap.blocks) {\n var block = core.status.thisMap.blocks[i];\n if (core.isset(block.event) && !block.disable && (block.event.id == 'yellowWall' || block.event.id == 'blueWall' || block.event.id == 'whiteWall')) // 能炸的墙壁\n ids.push(i);\n}\nif (ids.length>0) {\n core.status.event.data = ids;\n able=true;\n}\nable", + "centerFly": "var toX = (core.bigmap.width||13)-1-core.getHeroLoc('x'), toY = (core.bigmap.height||13)-1-core.getHeroLoc('y');\ncore.getBlockId(toX, toY) == null", + "upFly": "var able=false;\nvar floorId = core.status.floorId, index = core.floorIds.indexOf(floorId);\nif (index=0 && toX=0 && toY0) {\n\tvar toId = core.floorIds[index-1], toX = core.getHeroLoc('x'), toY = core.getHeroLoc('y');\n\tvar mw = core.floors[toId].width||13, mh = core.floors[toId].height||13;\n\tif (toX>=0 && toX=0 && toY0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", + "bigKey": "var able=false;\nvar ids = [];\nfor (var i in core.status.thisMap.blocks) {\n var block = core.status.thisMap.blocks[i];\n if (core.isset(block.event) && !block.disable && block.event.id == 'yellowDoor') {\n ids.push(i);\n }\n}\nif (ids.length>0) {\n core.status.event.data = ids;\n able=true;\n}\nable", "poisonWine": "core.hasFlag('poison')", "weakWine": "core.hasFlag('weak')", "curseWine": "core.hasFlag('curse')", @@ -343,6 +343,6 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "shiled5": "true", "shield5": "true", "lifeWand": "true", - "jumpShoes": "var nx=core.nextX(2),ny=core.nextY(2);nx>=0&&nx<=12&&ny>=0&&ny<=12&&core.getBlock(nx,ny)==null" + "jumpShoes": "var nx=core.nextX(2),ny=core.nextY(2);nx>=0&&nx=0&&ny