From aa6691430868f5c6146d1d3e103e0f3dfe49f37f Mon Sep 17 00:00:00 2001 From: fux4 Date: Thu, 23 Aug 2018 19:28:34 +0800 Subject: [PATCH 01/29] bigmap!!! --- index.html | 20 ++++++----- libs/actions.js | 4 ++- libs/control.js | 81 +++++++++++++++++++++++++++++++------------ libs/core.js | 5 +++ libs/events.js | 3 ++ libs/maps.js | 53 +++++++++++++++++++++------- libs/ui.js | 4 ++- main.js | 1 + project/data.js | 4 +-- project/floors/MT0.js | 41 +++++++++++++++------- styles.css | 6 ++++ 11 files changed, 161 insertions(+), 61 deletions(-) diff --git a/index.html b/index.html index 0f69d24f..95aff62d 100644 --- a/index.html +++ b/index.html @@ -106,15 +106,17 @@
- - - - - - - - - 此浏览器不支持HTML5 +
+ + + + + + + + + 此浏览器不支持HTML5 +
diff --git a/libs/actions.js b/libs/actions.js index 4c0e2d67..4141b107 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -553,7 +553,9 @@ actions.prototype.onclick = function (x, y, stepPostfix) { // 寻路 if (!core.status.lockControl) { - core.setAutomaticRoute(x, y, stepPostfix); + var dx = ~~(core.maps.currentOffsetPos.x/32); + var dy = ~~(core.maps.currentOffsetPos.y/32); + core.setAutomaticRoute(x+dx, y+dy, stepPostfix); return; } diff --git a/libs/control.js b/libs/control.js index 8352da57..12fa6d7f 100644 --- a/libs/control.js +++ b/libs/control.js @@ -542,6 +542,9 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { ////// 自动寻路算法,找寻最优路径 ////// control.prototype.automaticRoute = function (destX, destY) { + var fw = core.floors[core.status.floorId].tileWidth; + var fh = core.floors[core.status.floorId].tileHeight + var tsize = fw * fw; var startX = core.getHeroLoc('x'); var startY = core.getHeroLoc('y'); var scan = { @@ -556,17 +559,17 @@ control.prototype.automaticRoute = function (destX, destY) { var ans = [] if (destX == startX && destY == startY) return false; - queue.push(13 * startX + startY); + queue.push(fw * startX + startY); queue.push(-1); - route[13 * startX + startY] = ''; + route[fw * startX + startY] = ''; while (queue.length != 1) { var f = queue.shift(); if (f===-1) {nowDeep+=1;queue.push(-1);continue;} - var deep = ~~(f/169); + var deep = ~~(f/tsize); if (deep!==nowDeep) {queue.push(f);continue;} - f=f%169; - var nowX = parseInt(f / 13), nowY = f % 13; + f=f%tsize; + var nowX = parseInt(f / fw), nowY = f % fw; var nowIsArrow = false, nowId, nowBlock = core.getBlock(nowX,nowY); for (var direction in scan) { if (!core.canMoveHero(nowX, nowY, direction)) @@ -575,9 +578,9 @@ control.prototype.automaticRoute = function (destX, destY) { var nx = nowX + scan[direction].x; var ny = nowY + scan[direction].y; - if (nx<0 || nx>12 || ny<0 || ny>12) continue; + if (nx<0 || nx>=fw || ny<0 || ny>=fh) continue; - var nid = 13 * nx + ny; + var nid = fw * nx + ny; if (core.isset(route[nid])) continue; @@ -606,18 +609,18 @@ control.prototype.automaticRoute = function (destX, destY) { continue; route[nid] = direction; - queue.push(169*(nowDeep+deepAdd)+nid); + queue.push(tsize*(nowDeep+deepAdd)+nid); } - if (core.isset(route[13 * destX + destY])) break; + if (core.isset(route[fw * destX + destY])) break; } - if (!core.isset(route[13 * destX + destY])) { + if (!core.isset(route[fw * destX + destY])) { return false; } var nowX = destX, nowY = destY; while (nowX != startX || nowY != startY) { - var dir = route[13 * nowX + nowY]; + var dir = route[fw * nowX + nowY]; ans.push({'direction': dir, 'x': nowX, 'y': nowY}); nowX -= scan[dir].x; nowY -= scan[dir].y; @@ -979,8 +982,23 @@ control.prototype.stopHero = function () { core.status.heroStop = true; } +////// 设置画布偏移 +control.prototype.setGameCanvasTranslate = function(canvas,x,y){ + var c=core.dom.gameCanvas[canvas]; + c.style.transform='translate('+x+'px,'+y+'px)'; + c.style.webkitTransform='translate('+x+'px,'+y+'px)'; + c.style.OTransform='translate('+x+'px,'+y+'px)'; + c.style.MozTransform='translate('+x+'px,'+y+'px)'; +}; + +////// 更新视野范围 +control.prototype.updateViewport = function() { + core.maps.activeCanvas.forEach(function(cn){ core.control.setGameCanvasTranslate(cn,-core.maps.currentOffsetPos.x,-core.maps.currentOffsetPos.y);}); +} + ////// 绘制勇士 ////// control.prototype.drawHero = function (direction, x, y, status, offset) { + var scan = { 'up': {'x': 0, 'y': -1}, 'left': {'x': -1, 'y': 0}, @@ -993,9 +1011,16 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { status = status || 'stop'; direction = direction || core.getHeroLoc('direction'); offset = offset || 0; - var dx=offset==0?0:scan[direction].x, dy=offset==0?0:scan[direction].y; + var way = scan[direction]; + var offsetX = way.x*offset; + var offsetY = way.y*offset; + var dx=offsetX==0?0:offsetX/Math.abs(offsetX), dy=offsetY==0?0:offsetY/Math.abs(offsetY); + core.maps.currentOffsetPos.x = ((x - 6) * 32 + offsetX).clamp(0,416); + core.maps.currentOffsetPos.y = ((y - 6) * 32 + offsetY).clamp(0,416); + core.clearAutomaticRouteNode(x+dx, y+dy); - core.canvas.hero.clearRect(32 * x - 32, 32 * y - 32, 96, 96); + + core.canvas.hero.clearRect(x * 32 - core.maps.currentOffsetPos.x - 32, y * 32 - core.maps.currentOffsetPos.y - 32, 96, 96); var heroIconArr = core.material.icons.hero; var drawObjs = []; @@ -1004,8 +1029,8 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { "img": core.material.images.hero, "height": core.material.icons.hero.height, "heroIcon": heroIconArr[direction], - "posx": 32 * x + scan[direction].x*offset, - "posy": 32 * y + scan[direction].y*offset, + "posx": x * 32 - core.maps.currentOffsetPos.x + offsetX, + "posy": y * 32 - core.maps.currentOffsetPos.y + offsetY, "status": status, "index": 0, }); @@ -1020,8 +1045,8 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { "img": core.material.images.images[t.img], "height": core.material.images.images[t.img].height/4, "heroIcon": heroIconArr[t.direction], - "posx": 32*t.x + (t.stop?0:scan[t.direction].x*offset), - "posy": 32*t.y + (t.stop?0:scan[t.direction].y*offset), + "posx": 32*t.x - core.maps.currentOffsetPos.x + (t.stop?0:scan[t.direction].x*offset), + "posy": 32*t.y - core.maps.currentOffsetPos.y + (t.stop?0:scan[t.direction].y*offset), "status": t.stop?"stop":status, "index": index++ }); @@ -1031,13 +1056,15 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { drawObjs.sort(function (a, b) { return a.posy==b.posy?b.index-a.index:a.posy-b.posy; - }) + }); drawObjs.forEach(function (block) { core.canvas.hero.drawImage(block.img, block.heroIcon[block.status]*32, block.heroIcon.loc * block.height, 32, block.height, block.posx, block.posy+32-block.height, 32, block.height); - }) + }); + + core.control.updateViewport(); } ////// 设置勇士的位置 ////// @@ -2790,10 +2817,10 @@ control.prototype.resize = function(clientWidth, clientHeight) { { className: 'gameCanvas', rules:{ - width: canvasWidth + unit, - height: canvasWidth + unit, + // width: canvasWidth + unit, + // height: canvasWidth + unit, top: canvasTop + unit, - right: 0, + left: 0, border: '3px '+borderColor+' solid', } }, @@ -2824,6 +2851,16 @@ control.prototype.resize = function(clientWidth, clientHeight) { right: SPACE + unit, } }, + { + id: 'gameDraw', + rules: { + width: (canvasWidth - SPACE*2) + unit, + height:(canvasWidth - SPACE*2) + unit, + top: canvasTop + unit, + right: SPACE + unit, + border: '3px #fff solid' + } + }, { id: 'floorMsgGroup', rules:{ diff --git a/libs/core.js b/libs/core.js index 305109f3..779ba8a7 100644 --- a/libs/core.js +++ b/libs/core.js @@ -2,6 +2,11 @@ * 初始化 start */ +// 额外功能 +Number.prototype.clamp = function(min, max) { + return Math.min(Math.max(this, min), max); +}; + function core() { this.material = { 'animates': {}, diff --git a/libs/events.js b/libs/events.js index 877e83b9..cda595ce 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1185,6 +1185,9 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback } }) } + // 重置画布尺寸 + core.maps.resizeCanvas(floorId); + // 画地图 core.drawMap(floorId, function () { if (core.isset(heroLoc.direction)) core.setHeroLoc('direction', heroLoc.direction); diff --git a/libs/maps.js b/libs/maps.js index dd943c40..e004af85 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -18,8 +18,10 @@ maps.prototype.loadFloor = function (floorId, map) { if (!core.isset(map)) map=floor.map; var mapIntoBlocks = function(map,maps,floor){ var blocks = []; - for (var i = 0; i < 13; i++) { - for (var j = 0; j < 13; j++) { + var mw = core.floors[floorId].tileWidth; + var mh = core.floors[floorId].tileHeight; + for (var i = 0; i < mh; i++) { + for (var j = 0; j < mw; j++) { var block = maps.initBlock(j, i, map[i][j]); maps.addInfo(block); maps.addEvent(block,j,i,floor.events[j+","+i]) @@ -158,11 +160,13 @@ maps.prototype.save = function(maps, floorId) { } var thisFloor = maps[floorId]; + var mw = core.floors[floorId].tileWidth; + var mh = core.floors[floorId].tileHeight; var blocks = []; - for (var x=0;x<13;x++) { + for (var x=0;x12 || y<0 || y>12 || this.noPassExists(x,y); + var floor = core.floors[core.status.floorId]; + return x<0 || x>=floor.tileWidth || y<0 || y>=floor.tileHeight || this.noPassExists(x,y); } ////// 某个点是否存在NPC ////// @@ -1019,7 +1046,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { var cx = centerX+t.x, cy=centerY+t.y; if (!t.mirror && !t.angle) { - core.canvas.animate.drawImage(image, cx-realWidth/2, cy-realHeight/2, realWidth, realHeight); + core.canvas.animate.drawImage(image, cx-realWidth/2 - core.maps.currentOffsetPos.x, cy-realHeight/2 - core.maps.currentOffsetPos.y, realWidth, realHeight); } else { core.saveCanvas('animate'); @@ -1028,7 +1055,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { core.canvas.animate.rotate(-t.angle*Math.PI/180); if (t.mirror) core.canvas.animate.scale(-1,1); - core.canvas.animate.drawImage(image, -realWidth/2, -realHeight/2, realWidth, realHeight); + core.canvas.animate.drawImage(image, -realWidth/2 - core.maps.currentOffsetPos.x, -realHeight/2 - core.maps.currentOffsetPos.y, realWidth, realHeight); core.loadCanvas('animate'); } }) diff --git a/libs/ui.js b/libs/ui.js index d2bc5293..45e4a2c8 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1715,6 +1715,8 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, heroL var blockIcon = core.material.icons.terrains[groundId]; var blockImage = core.material.images.terrains; var persize = size/13; + var mw = core.floors[floorId].tileWidth; + var mh = core.floors[floorId].tileHeight; 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); @@ -1743,7 +1745,7 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, heroL } }) - var mapArray = core.maps.getMapArray(blocks); + var mapArray = core.maps.getMapArray(blocks,mw,mh); for (var b in blocks) { var block = blocks[b]; if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable)) { diff --git a/main.js b/main.js index 154f2f20..1a2a649f 100644 --- a/main.js +++ b/main.js @@ -43,6 +43,7 @@ function main() { 'gif': document.getElementById('gif'), 'gif2': document.getElementById('gif2'), 'curtain': document.getElementById('curtain'), + 'gameDraw': document.getElementById('gameDraw'), 'startButtons': document.getElementById('startButtons'), 'playGame': document.getElementById('playGame'), 'loadGame': document.getElementById('loadGame'), diff --git a/project/data.js b/project/data.js index f01f9468..eba61dc1 100644 --- a/project/data.js +++ b/project/data.js @@ -2,7 +2,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = { "main" : { "floorIds" : [ - "sample0", "sample1", "sample2", "MT0" + "MT0" ], "images" : [ "bg.jpg" @@ -28,7 +28,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "title": "魔塔样板", "name": "template", "version": "Ver 2.3.3", - "floorId": "sample0", + "floorId": "MT0", "hero": { "name": "阳光", 'lv': 1, diff --git a/project/floors/MT0.js b/project/floors/MT0.js index bb215c0f..7e83fff7 100644 --- a/project/floors/MT0.js +++ b/project/floors/MT0.js @@ -10,20 +10,35 @@ main.floors.MT0= "images": [], "item_ratio": 1, "map": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], + [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], + [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], +"tileWidth":26, +"tileHeight":26, "firstArrive": [], "events": {}, "changeFloor": {}, diff --git a/styles.css b/styles.css index 2cf08287..218bfe8d 100644 --- a/styles.css +++ b/styles.css @@ -253,6 +253,12 @@ span#poison, span#weak, span#curse { background: #000000; } +#gameDraw { + position: absolute; + background: #000000; + overflow: hidden; +} + #bg { z-index: 10; } From 4dcfcbd7020e34b9b9673b573fcde7925ab26fbf Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 24 Aug 2018 20:36:14 +0800 Subject: [PATCH 02/29] Update BigMap: Reformat & Fix & Add damage display --- _server/editor.js | 86 ------------------------ docs/personalization.md | 2 +- libs/actions.js | 12 ++-- libs/control.js | 143 +++++++++++++++++++--------------------- libs/core.js | 11 ++++ libs/events.js | 22 +++---- libs/maps.js | 95 +++++++++++++------------- libs/ui.js | 46 ++++++------- libs/utils.js | 5 ++ project/enemys.js | 2 +- project/floors/MT0.js | 6 +- project/functions.js | 2 +- project/items.js | 2 +- styles.css | 3 +- 14 files changed, 176 insertions(+), 261 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index b76134b0..536e0df5 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -252,92 +252,6 @@ editor.prototype.updateMap = function () { } //ctx.drawImage(editor.material.images[tileInfo.images], 0, tileInfo.y*32, 32, 32, x*32, y*32, 32, 32); } - /* - // autotile的相关处理 - var indexArrs = [ //16种组合的图块索引数组; // 将autotile分割成48块16*16的小块; 数组索引即对应各个小块 - // +----+----+----+----+----+----+ - [10, 9, 4, 3 ], //0 bin:0000 | 1 | 2 | 3 | 4 | 5 | 6 | - [10, 9, 4, 13], //1 bin:0001 +----+----+----+----+----+----+ - [10, 9, 18, 3 ], //2 bin:0010 | 7 | 8 | 9 | 10 | 11 | 12 | - [10, 9, 16, 15], //3 bin:0011 +----+----+----+----+----+----+ - [10, 43, 4, 3 ], //4 bin:0100 | 13 | 14 | 15 | 16 | 17 | 18 | - [10, 31, 4, 25], //5 bin:0101 +----+----+----+----+----+----+ - [10, 7, 2, 3 ], //6 bin:0110 | 19 | 20 | 21 | 22 | 23 | 24 | - [10, 31, 16, 5 ], //7 bin:0111 +----+----+----+----+----+----+ - [48, 9, 4, 3 ], //8 bin:1000 | 25 | 26 | 27 | 28 | 29 | 30 | - [ 8, 9, 4, 1 ], //9 bin:1001 +----+----+----+----+----+----+ - [36, 9, 30, 3 ], //10 bin:1010 | 31 | 32 | 33 | 34 | 35 | 36 | - [36, 9, 6, 15], //11 bin:1011 +----+----+----+----+----+----+ - [46, 45, 4, 3 ], //12 bin:1100 | 37 | 38 | 39 | 40 | 41 | 42 | - [46, 11, 4, 25], //13 bin:1101 +----+----+----+----+----+----+ - [12, 45, 30, 3 ], //14 bin:1110 | 43 | 44 | 45 | 46 | 47 | 48 | - [34, 33, 28, 27] //15 bin:1111 +----+----+----+----+----+----+ - ]; - var drawBlockByIndex = function(ctx, dx, dy, autotileImg, index){ //index为autotile的图块索引1-48 - var sx = 16*((index-1)%6), sy = 16*(~~((index-1)/6)); - ctx.drawImage(autotileImg, sx, sy, 16, 16, dx, dy, 16, 16); - } - var isAutotile = function(info){ - if(typeof(info)=='object' && hasOwnProp(info, 'images') && info.images=='autotile') return true; - return false; - } - var getAutotileAroundId = function(currId, x, y){ //与autotile当前idnum一致返回1,否则返回0 - if(x>=0 && y >=0 && x<13 && y<13 && isAutotile(editor.map[y][x]) && editor.map[y][x].idnum == currId) - return 1; - else if(x<0 || y<0 || x>12 || y>12) return 1; //边界外视为通用autotile,这样好看些 - else - return 0; - } - var checkAround = function(x, y){ // 得到周围四个32*32块(周围每块都包含当前块的1/4,不清楚的话画下图你就明白)的数组索引 - var currId = editor.map[y][x].idnum; - var pointBlock = []; - for(var i=0; i<4; i++){ - var bsum = 0; - var offsetx = i%2, offsety = ~~(i/2); - for(var j=0; j<4; j++){ - var mx = j%2, my = ~~(j/2); - var b = getAutotileAroundId(currId, x+offsetx+mx-1, y+offsety+my-1); - bsum += b*(Math.pow(2, 3-j)); - } - pointBlock.push(bsum); - } - return pointBlock; - } - var addIndexToAutotileInfo = function(x, y){ - var indexArr = []; - var pointBlocks = checkAround(x, y); - for(var i=0; i<4; i++){ - var arr = indexArrs[pointBlocks[i]] - indexArr.push(arr[3-i]); - } - editor.map[y][x].blockIndex = indexArr; - } - var drawAutotile = function(ctx, x, y, info){ // 绘制一个autotile - ctx.clearRect(x*32, y*32, 32, 32); - //修正四个边角的固定搭配 - if(info.blockIndex[0] == 13){ - if(info.blockIndex[1] == 16) info.blockIndex[1] = 14; - if(info.blockIndex[2] == 31) info.blockIndex[2] = 19; - } - if(info.blockIndex[1] == 18){ - if(info.blockIndex[0] == 15) info.blockIndex[0] = 17; - if(info.blockIndex[3] == 36) info.blockIndex[3] = 24; - } - if(info.blockIndex[2] == 43){ - if(info.blockIndex[0] == 25) info.blockIndex[0] = 37; - if(info.blockIndex[3] == 46) info.blockIndex[3] = 44; - } - if(info.blockIndex[3] == 48){ - if(info.blockIndex[1] == 30) info.blockIndex[1] = 42; - if(info.blockIndex[2] == 45) info.blockIndex[2] = 47; - } - for(var i=0; i<4; i++){ - var index = info.blockIndex[i]; - var dx = x*32 + 16*(i%2), dy = y*32 + 16*(~~(i/2)); - drawBlockByIndex(ctx, dx, dy, editor.material.images[info.images][info.id], index); - } - } - */ // 绘制地图 start var eventCtx = document.getElementById('event').getContext("2d"); for (var y = 0; y < 13; y++) diff --git a/docs/personalization.md b/docs/personalization.md index caa80a16..47a807b6 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -299,7 +299,7 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her // 检查领域、夹击、阻击事件 control.prototype.checkBlock = function () { var x=core.getHeroLoc('x'), y=core.getHeroLoc('y'); - var damage = core.status.checkBlock.damage[13*x+y]; + var damage = core.status.checkBlock.damage[x+core.bigmap.width*y]; if (damage>0) { if (core.hasFlag("shield5")) damage = 0; // 如果存在神圣盾,则将伤害变成0 core.status.hero.hp -= damage; diff --git a/libs/actions.js b/libs/actions.js index 4141b107..d7303b2e 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -429,7 +429,7 @@ actions.prototype.ondown = function (x ,y) { } core.status.downTime = new Date(); - core.clearMap('ui', 0, 0, 416,416); + core.clearMap('ui'); var pos={'x':x,'y':y} core.status.stepPostfix=[]; core.status.stepPostfix.push(pos); @@ -553,9 +553,7 @@ actions.prototype.onclick = function (x, y, stepPostfix) { // 寻路 if (!core.status.lockControl) { - var dx = ~~(core.maps.currentOffsetPos.x/32); - var dy = ~~(core.maps.currentOffsetPos.y/32); - core.setAutomaticRoute(x+dx, y+dy, stepPostfix); + core.setAutomaticRoute(x+parseInt(core.bigmap.offsetX/32), y+parseInt(core.bigmap.offsetY/32), stepPostfix); return; } @@ -925,7 +923,7 @@ actions.prototype.keyUpBook = function (keycode) { ////// 怪物手册属性显示界面时的点击操作 ////// actions.prototype.clickBookDetail = function () { - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.status.event.id = 'book'; } @@ -987,7 +985,7 @@ actions.prototype.clickViewMaps = function (x,y) { core.ui.drawMaps(nextId); } else { - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.setOpacity('data', 1); core.ui.closePanel(); } @@ -1007,7 +1005,7 @@ actions.prototype.keyDownViewMaps = function (keycode) { ////// 查看地图界面时,放开某个键的操作 ////// actions.prototype.keyUpViewMaps = function (keycode) { if (keycode==27 || keycode==13 || keycode==32 || keycode==67) { - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.setOpacity('data', 1); core.ui.closePanel(); } diff --git a/libs/control.js b/libs/control.js index 12fa6d7f..c65ac8c1 100644 --- a/libs/control.js +++ b/libs/control.js @@ -104,7 +104,7 @@ control.prototype.setRequestAnimationFrame = function () { if (core.isPlaying() && timestamp-core.animateFrame.weather.time>30) { if (core.animateFrame.weather.type == 'rain' && core.animateFrame.weather.level > 0) { - core.clearMap('weather', 0, 0, 416, 416); + core.clearMap('weather'); core.canvas.weather.strokeStyle = 'rgba(174,194,224,0.8)'; core.canvas.weather.lineWidth = 1; @@ -130,7 +130,7 @@ control.prototype.setRequestAnimationFrame = function () { } else if (core.animateFrame.weather.type == 'snow' && core.animateFrame.weather.level > 0) { - core.clearMap('weather', 0, 0, 416, 416); + core.clearMap('weather'); core.canvas.weather.fillStyle = "rgba(255, 255, 255, 0.8)"; core.canvas.weather.beginPath(); @@ -378,7 +378,7 @@ control.prototype.clearContinueAutomaticRoute = function () { control.prototype.moveDirectly = function (destX, destY) { var ignoreSteps = core.canMoveDirectly(destX, destY); if (ignoreSteps>=0) { - core.clearMap('hero', 0, 0, 416, 416); + core.clearMap('hero'); var lastDirection = core.status.route[core.status.route.length-1]; if (['left', 'right', 'up', 'down'].indexOf(lastDirection)>=0) core.setHeroLoc('direction', lastDirection); @@ -398,7 +398,7 @@ control.prototype.tryMoveDirectly = function (destX, destY) { if (Math.abs(core.getHeroLoc('x')-destX)+Math.abs(core.getHeroLoc('y')-destY)<=1) return false; var testMove = function (dx, dy, dir) { - if (dx<0 || dx>12 || dy<0 || dy>12) return false; + if (dx<0 || dx>=core.bigmap.width|| dy<0 || dy>core.bigmap.height) return false; if (core.control.moveDirectly(dx, dy)) { if (core.isset(dir)) core.moveHero(dir, function() {}); return true; @@ -542,9 +542,9 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { ////// 自动寻路算法,找寻最优路径 ////// control.prototype.automaticRoute = function (destX, destY) { - var fw = core.floors[core.status.floorId].tileWidth; - var fh = core.floors[core.status.floorId].tileHeight - var tsize = fw * fw; + var fw = core.bigmap.width; + var fh = core.bigmap.height; + var total = fw * fh; var startX = core.getHeroLoc('x'); var startY = core.getHeroLoc('y'); var scan = { @@ -559,17 +559,17 @@ control.prototype.automaticRoute = function (destX, destY) { var ans = [] if (destX == startX && destY == startY) return false; - queue.push(fw * startX + startY); + queue.push(startX + fw * startY); queue.push(-1); - route[fw * startX + startY] = ''; + route[startX + fw * startY] = ''; while (queue.length != 1) { var f = queue.shift(); if (f===-1) {nowDeep+=1;queue.push(-1);continue;} - var deep = ~~(f/tsize); + var deep = parseInt(f/total); if (deep!==nowDeep) {queue.push(f);continue;} - f=f%tsize; - var nowX = parseInt(f / fw), nowY = f % fw; + f=f%total; + var nowX = parseInt(f % fw), nowY = parseInt(f / fw); var nowIsArrow = false, nowId, nowBlock = core.getBlock(nowX,nowY); for (var direction in scan) { if (!core.canMoveHero(nowX, nowY, direction)) @@ -580,7 +580,7 @@ control.prototype.automaticRoute = function (destX, destY) { if (nx<0 || nx>=fw || ny<0 || ny>=fh) continue; - var nid = fw * nx + ny; + var nid = nx + fw * ny; if (core.isset(route[nid])) continue; @@ -609,18 +609,18 @@ control.prototype.automaticRoute = function (destX, destY) { continue; route[nid] = direction; - queue.push(tsize*(nowDeep+deepAdd)+nid); + queue.push(total*(nowDeep+deepAdd)+nid); } - if (core.isset(route[fw * destX + destY])) break; + if (core.isset(route[destX + fw * destY])) break; } - if (!core.isset(route[fw * destX + destY])) { + if (!core.isset(route[destX + fw * destY])) { return false; } var nowX = destX, nowY = destY; while (nowX != startX || nowY != startY) { - var dir = route[fw * nowX + nowY]; + var dir = route[nowX + fw * nowY]; ans.push({'direction': dir, 'x': nowX, 'y': nowY}); nowX -= scan[dir].x; nowY -= scan[dir].y; @@ -672,7 +672,7 @@ control.prototype.setHeroMoveInterval = function (direction, x, y, callback) { core.setHeroLoc('y', y+scan[direction].y, true); core.control.updateFollowers(); core.moveOneStep(); - core.clearMap('hero', 0, 0, 416, 416); + core.clearMap('hero'); core.drawHero(direction); clearInterval(core.interval.heroMoveInterval); core.status.heroMoving = 0; @@ -786,7 +786,7 @@ control.prototype.moveHero = function (direction, callback) { }; direction = core.getHeroLoc('direction'); var nx = core.getHeroLoc('x') + scan[direction].x, ny=core.getHeroLoc('y') + scan[direction].y; - if (nx<0 || nx>12 || ny<0 || ny>12) return; + if (nx<0 || nx>=core.bigmap.width || ny<0 || ny>=core.bigmap.height) return; core.status.heroMoving=-1; core.eventMoveHero([direction], 100, function () { @@ -817,7 +817,7 @@ control.prototype.eventMoveHero = function(steps, time, callback) { time = time || 100; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1.0); // 要运行的轨迹:将steps展开 @@ -884,7 +884,7 @@ control.prototype.jumpHero = function (ex, ey, time, callback) { if (!core.isset(ey)) ey=sy; time = time || 500; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1.0); core.status.replay.animate=true; @@ -991,9 +991,11 @@ control.prototype.setGameCanvasTranslate = function(canvas,x,y){ c.style.MozTransform='translate('+x+'px,'+y+'px)'; }; -////// 更新视野范围 +////// 更新视野范围 ////// control.prototype.updateViewport = function() { - core.maps.activeCanvas.forEach(function(cn){ core.control.setGameCanvasTranslate(cn,-core.maps.currentOffsetPos.x,-core.maps.currentOffsetPos.y);}); + core.bigmap.canvas.forEach(function(cn){ + core.control.setGameCanvasTranslate(cn,-core.bigmap.offsetX,-core.bigmap.offsetY); + }); } ////// 绘制勇士 ////// @@ -1015,12 +1017,13 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { var offsetX = way.x*offset; var offsetY = way.y*offset; var dx=offsetX==0?0:offsetX/Math.abs(offsetX), dy=offsetY==0?0:offsetY/Math.abs(offsetY); - core.maps.currentOffsetPos.x = ((x - 6) * 32 + offsetX).clamp(0,416); - core.maps.currentOffsetPos.y = ((y - 6) * 32 + offsetY).clamp(0,416); + + core.bigmap.offsetX = core.clamp((x - 6) * 32 + offsetX, 0, 32*core.bigmap.width-416); + core.bigmap.offsetY = core.clamp((y - 6) * 32 + offsetY, 0, 32*core.bigmap.height-416); core.clearAutomaticRouteNode(x+dx, y+dy); - core.canvas.hero.clearRect(x * 32 - core.maps.currentOffsetPos.x - 32, y * 32 - core.maps.currentOffsetPos.y - 32, 96, 96); + core.canvas.hero.clearRect(x * 32 - core.bigmap.offsetX - 32, y * 32 - core.bigmap.offsetY - 32, 96, 96); var heroIconArr = core.material.icons.hero; var drawObjs = []; @@ -1029,8 +1032,8 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { "img": core.material.images.hero, "height": core.material.icons.hero.height, "heroIcon": heroIconArr[direction], - "posx": x * 32 - core.maps.currentOffsetPos.x + offsetX, - "posy": y * 32 - core.maps.currentOffsetPos.y + offsetY, + "posx": x * 32 - core.bigmap.offsetX + offsetX, + "posy": y * 32 - core.bigmap.offsetY + offsetY, "status": status, "index": 0, }); @@ -1045,8 +1048,8 @@ control.prototype.drawHero = function (direction, x, y, status, offset) { "img": core.material.images.images[t.img], "height": core.material.images.images[t.img].height/4, "heroIcon": heroIconArr[t.direction], - "posx": 32*t.x - core.maps.currentOffsetPos.x + (t.stop?0:scan[t.direction].x*offset), - "posy": 32*t.y - core.maps.currentOffsetPos.y + (t.stop?0:scan[t.direction].y*offset), + "posx": 32*t.x - core.bigmap.offsetX + (t.stop?0:scan[t.direction].x*offset), + "posy": 32*t.y - core.bigmap.offsetY + (t.stop?0:scan[t.direction].y*offset), "status": t.stop?"stop":status, "index": index++ }); @@ -1172,27 +1175,27 @@ control.prototype.updateCheckBlock = function() { if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.event.cls.indexOf('enemy')==0) { var id = block.event.id, enemy = core.material.enemys[id]; if (core.isset(enemy)) { - core.status.checkBlock.map[13*block.x+block.y]=id; + core.status.checkBlock.map[block.x+core.bigmap.width*block.y]=id; } } // 血网 if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.event.id=='lavaNet' && block.event.trigger=='passNet' && !core.hasItem("shoes")) { - core.status.checkBlock.map[13*block.x+block.y]="lavaNet"; + core.status.checkBlock.map[block.x+core.bigmap.width*block.y]="lavaNet"; } } // Step2: 更新领域、阻击伤害 core.status.checkBlock.damage = []; // 记录(x,y)点的伤害 - for (var x=0;x<13*13;x++) core.status.checkBlock.damage[x]=0; + for (var x=0;x12 || ny<0 || ny>12) continue; + if (nx<0 || nx>=core.bigmap.width || ny<0 || ny>=core.bigmap.height) continue; if (!zoneSquare && Math.abs(dx)+Math.abs(dy)>range) continue; - core.status.checkBlock.damage[13*nx+ny]+=enemy.value; + core.status.checkBlock.damage[nx+ny*core.bigmap.width]+=enemy.value; } } } @@ -1218,8 +1221,8 @@ control.prototype.updateCheckBlock = function() { for (var dy=-1;dy<=1;dy++) { if (dx==0 && dy==0) continue; var nx=x+dx, ny=y+dy; - if (nx<0 || nx>12 || ny<0 || ny>12 || Math.abs(dx)+Math.abs(dy)>1) continue; - core.status.checkBlock.damage[13*nx+ny]+=enemy.value; + if (nx<0 || nx>=core.bigmap.width || ny<0 || ny>=core.bigmap.height || Math.abs(dx)+Math.abs(dy)>1) continue; + core.status.checkBlock.damage[nx+ny*core.bigmap.width]+=enemy.value; } } } @@ -1230,12 +1233,12 @@ control.prototype.updateCheckBlock = function() { // Step3: 更新夹击点坐标,并将夹击伤害加入到damage中 core.status.checkBlock.betweenAttack = []; // 记录(x,y)点是否有夹击 - for (var x=0;x<13;x++) { - for (var y=0;y<13;y++) { + for (var x=0;x0 && x<12) { - var id1=core.status.checkBlock.map[13*(x-1)+y], - id2=core.status.checkBlock.map[13*(x+1)+y]; + if (x>0 && x0 && y<12) { - var id1=core.status.checkBlock.map[13*x+y-1], - id2=core.status.checkBlock.map[13*x+y+1]; + if (y>0 && y1) - core.status.checkBlock.damage[13*x+y] += Math.floor((leftHp+(core.flags.betweenAttackCeil?0:1))/2); + core.status.checkBlock.damage[x+core.bigmap.width*y] += Math.floor((leftHp+(core.flags.betweenAttackCeil?0:1))/2); } } } @@ -1267,7 +1270,7 @@ control.prototype.updateCheckBlock = function() { ////// 检查并执行领域、夹击、阻击事件 ////// control.prototype.checkBlock = function () { var x=core.getHeroLoc('x'), y=core.getHeroLoc('y'); - var damage = core.status.checkBlock.damage[13*x+y]; + var damage = core.status.checkBlock.damage[x+core.bigmap.width*y]; if (damage>0) { core.status.hero.hp -= damage; @@ -1281,8 +1284,8 @@ control.prototype.checkBlock = function () { } for (var direction in scan) { var nx = x+scan[direction].x, ny=y+scan[direction].y; - if (nx<0 || nx>12 || ny<0 || ny>12) continue; - var id=core.status.checkBlock.map[13*nx+ny]; + if (nx<0 || nx>=core.bigmap.width || ny<0 || ny>=core.bigmap.height) continue; + var id=core.status.checkBlock.map[nx+core.bigmap.width*ny]; if (core.isset(id)) { var enemy = core.material.enemys[id]; if (core.isset(enemy) && core.enemys.hasSpecial(enemy.special, 18)) { @@ -1291,10 +1294,10 @@ control.prototype.checkBlock = function () { } } - if (core.status.checkBlock.betweenAttack[13*x+y] && damage>0) { + if (core.status.checkBlock.betweenAttack[x+core.bigmap.width*y] && damage>0) { core.drawTip('受到夹击,生命变成一半'); } - else if (core.status.checkBlock.map[13*x+y]=='lavaNet') { + else if (core.status.checkBlock.map[x+core.bigmap.width*y]=='lavaNet') { core.drawTip('受到血网伤害'+damage+'点'); } // 阻击 @@ -1321,7 +1324,7 @@ control.prototype.checkBlock = function () { var x=t.x, y=t.y, direction = t.direction; var nx = x+scan[direction].x, ny=y+scan[direction].y; - return nx>=0 && nx<=12 && ny>=0 && ny<=12 && core.getBlock(nx, ny, core.status.floorId, false)==null; + return nx>=0 && nx=0 && ny0) @@ -1461,7 +1464,7 @@ control.prototype.setWeather = function (type, level) { // 非雨雪 if (type!='rain' && type!='snow') { - core.clearMap('weather', 0, 0, 416, 416) + core.clearMap('weather') core.animateFrame.weather.type = null; core.animateFrame.weather.level = 0; core.animateFrame.weather.nodes = []; @@ -1480,7 +1483,7 @@ control.prototype.setWeather = function (type, level) { if (level<1) level=1; if (level>10) level=10; level *= 20; - core.clearMap('weather', 0, 0, 416, 416) + core.clearMap('weather') core.animateFrame.weather.type = type; core.animateFrame.weather.level = level; @@ -1563,7 +1566,7 @@ control.prototype.updateFg = function () { if (!core.isset(core.status.thisMap) || !core.isset(core.status.thisMap.blocks)) return; // 更新显伤 var mapBlocks = core.status.thisMap.blocks; - core.clearMap('fg', 0, 0, 416, 416); + core.clearMap('fg'); // 没有怪物手册 if (!core.hasItem('book')) return; core.setFont('fg', "bold 11px Arial"); @@ -1637,9 +1640,9 @@ control.prototype.updateFg = function () { // 如果是领域&夹击 if (core.flags.displayExtraDamage) { core.canvas.fg.textAlign = 'center'; - for (var x=0;x<13;x++) { - for (var y=0;y<13;y++) { - var damage = core.status.checkBlock.damage[13*x+y]; + for (var x=0;x0) { damage = core.formatBigNumber(damage); core.setFillStyle('fg', '#000000'); @@ -2814,16 +2817,6 @@ control.prototype.resize = function(clientWidth, clientHeight) { left: (clientWidth-gameGroupWidth)/2 + unit, } }, - { - className: 'gameCanvas', - rules:{ - // width: canvasWidth + unit, - // height: canvasWidth + unit, - top: canvasTop + unit, - left: 0, - border: '3px '+borderColor+' solid', - } - }, { id: 'gif', rules: { @@ -2857,7 +2850,7 @@ control.prototype.resize = function(clientWidth, clientHeight) { width: (canvasWidth - SPACE*2) + unit, height:(canvasWidth - SPACE*2) + unit, top: canvasTop + unit, - right: SPACE + unit, + right: 0, border: '3px #fff solid' } }, diff --git a/libs/core.js b/libs/core.js index 779ba8a7..6f569e0b 100644 --- a/libs/core.js +++ b/libs/core.js @@ -76,6 +76,13 @@ function core() { styles: [], scale: 1.0, } + this.bigmap = { + canvas: ["bg", "event", "event2", "fg"], + offsetX: 0, // in pixel + offsetY: 0, + width: 13, // map width and height + height: 13 + } this.initStatus = { 'played': false, 'gameOver': false, @@ -1146,6 +1153,10 @@ core.prototype.subarray = function (a, b) { return core.utils.subarray(a, b); } +core.prototype.clamp = function (x, a, b) { + return core.utils.clamp(x, a, b); +} + ////// Base64加密 ////// core.prototype.encodeBase64 = function (str) { return core.utils.encodeBase64(str); diff --git a/libs/events.js b/libs/events.js index cda595ce..215a6a51 100644 --- a/libs/events.js +++ b/libs/events.js @@ -131,9 +131,9 @@ events.prototype.lose = function (reason) { events.prototype.gameOver = function (ending, fromReplay, norank) { // 清空图片和天气 - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); core.dom.gif2.innerHTML = ""; - core.clearMap('weather', 0, 0, 416, 416) + core.clearMap('weather') core.animateFrame.weather.type = null; core.animateFrame.weather.level = 0; core.animateFrame.weather.nodes = []; @@ -281,7 +281,7 @@ events.prototype.doAction = function() { core.status.boxAnimateObjs = []; clearInterval(core.status.event.interval); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1.0); // 事件处理完毕 @@ -513,7 +513,7 @@ events.prototype.doAction = function() { break; } case "changePos": // 直接更换勇士位置,不切换楼层 - core.clearMap('hero', 0, 0, 416, 416); + core.clearMap('hero'); if (core.isset(data.loc)) { core.setHeroLoc('x', core.calValue(data.loc[0])); core.setHeroLoc('y', core.calValue(data.loc[1])); @@ -527,7 +527,7 @@ events.prototype.doAction = function() { core.canvas.animate.drawImage(core.material.images.images[data.name], core.calValue(data.loc[0]), core.calValue(data.loc[1])); } - else core.clearMap('animate', 0, 0, 416, 416); + else core.clearMap('animate'); this.doAction(); break; case "animateImage": // 淡入淡出图片 @@ -1186,14 +1186,14 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback }) } // 重置画布尺寸 - core.maps.resizeCanvas(floorId); + core.maps.resizeMap(floorId); // 画地图 core.drawMap(floorId, function () { if (core.isset(heroLoc.direction)) core.setHeroLoc('direction', heroLoc.direction); core.setHeroLoc('x', heroLoc.x); core.setHeroLoc('y', heroLoc.y); - core.clearMap('hero', 0, 0, 416, 416); + core.clearMap('hero'); core.drawHero(); var changed = function () { @@ -1247,7 +1247,7 @@ events.prototype.animateImage = function (type, image, loc, time, callback) { core.setOpacity('data', opacityVal); if (opacityVal >=1 || opacityVal<=0) { clearInterval(animate); - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.setOpacity('data', 1); core.status.replay.animate=false; if (core.isset(callback)) callback(); @@ -1267,7 +1267,7 @@ events.prototype.moveImage = function (image, from, to, time, callback) { toX = core.calValue(to[0]), toY = core.calValue(to[1]); var step = 0; var drawImage = function () { - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); var nowX = parseInt(fromX + (toX-fromX)*step/64); var nowY = parseInt(fromY + (toY-fromY)*step/64); core.canvas.data.drawImage(image, nowX, nowY); @@ -1279,7 +1279,7 @@ events.prototype.moveImage = function (image, from, to, time, callback) { drawImage(); if (step>=64) { clearInterval(animate); - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.status.replay.animate=false; if (core.isset(callback)) callback(); } @@ -1610,7 +1610,7 @@ events.prototype.pushBox = function (data) { var direction = core.getHeroLoc('direction'), nx=data.x+scan[direction].x, ny=data.y+scan[direction].y; - if (nx<0||nx>12||ny<0||ny>12) return; + if (nx<0||nx>=core.bigmap.width||ny<0||ny>=core.bigmap.height) return; var block = core.getBlock(nx, ny, null, false); if (block!=null && !(core.isset(block.block.event) && block.block.event.id=='flower')) diff --git a/libs/maps.js b/libs/maps.js index e004af85..3f0f83bd 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -18,11 +18,11 @@ maps.prototype.loadFloor = function (floorId, map) { if (!core.isset(map)) map=floor.map; var mapIntoBlocks = function(map,maps,floor){ var blocks = []; - var mw = core.floors[floorId].tileWidth; - var mh = core.floors[floorId].tileHeight; + var mw = core.floors[floorId].width || 13; + var mh = core.floors[floorId].height || 13; for (var i = 0; i < mh; i++) { for (var j = 0; j < mw; j++) { - var block = maps.initBlock(j, i, map[i][j]); + var block = maps.initBlock(j, i, (map[i]||[])[j]||0); maps.addInfo(block); maps.addEvent(block,j,i,floor.events[j+","+i]) maps.addChangeFloor(block,j,i,floor.changeFloor[j+","+i]); @@ -160,8 +160,8 @@ maps.prototype.save = function(maps, floorId) { } var thisFloor = maps[floorId]; - var mw = core.floors[floorId].tileWidth; - var mh = core.floors[floorId].tileHeight; + var mw = core.floors[floorId].width || 13; + var mh = core.floors[floorId].height || 13; var blocks = []; for (var x=0;x0) + ||core.status.checkBlock.damage[fromX+core.bigmap.width*fromY]>0) return -1; // BFS var visited=[], queue=[]; - visited[13*fromX+fromY]=0; - queue.push(13*fromX+fromY); + visited[fromX+core.bigmap.width*fromY]=0; + queue.push(fromX+core.bigmap.width*fromY); var directions = [[-1,0],[1,0],[0,1],[0,-1]]; while (queue.length>0) { - var now=queue.shift(), nowX=parseInt(now/13), nowY=now%13; + var now=queue.shift(), nowX=parseInt(now%core.bigmap.width), nowY=parseInt(now/core.bigmap.width); for (var dir in directions) { var nx=nowX+directions[dir][0], ny=nowY+directions[dir][1]; - if (nx<0||nx>=13||ny<0||ny>=13||visited[13*nx+ny]||core.getBlock(nx,ny)!=null||core.status.checkBlock.damage[13*nx+ny]>0) continue; - visited[13*nx+ny]=visited[13*nowX+nowY]+1; - if (nx==destX&&ny==destY) return visited[13*nx+ny]; - queue.push(13*nx+ny); + if (nx<0||nx>=core.bigmap.width||ny<0||ny>=core.bigmap.height||visited[nx+core.bigmap.width*ny]||core.getBlock(nx,ny)!=null||core.status.checkBlock.damage[nx+core.bigmap.width*ny]>0) continue; + visited[nx+core.bigmap.width*ny]=visited[nowX+core.bigmap.width*nowY]+1; + if (nx==destX&&ny==destY) return visited[nx+core.bigmap.width*ny]; + queue.push(nx+core.bigmap.width*ny); } } return -1; @@ -337,17 +335,13 @@ maps.prototype.drawBlock = function (block, animate, dx, dy) { maps.prototype.drawMap = function (mapName, callback) { core.clearMap('all'); core.removeGlobalAnimate(null, null, true); - var mw = core.floors[mapName].tileWidth; - var mh = core.floors[mapName].tileHeight; var drawBg = function(){ var groundId = core.floors[mapName].defaultGround || "ground"; var blockIcon = core.material.icons.terrains[groundId]; var blockImage = core.material.images.terrains; - var dx = core.getHeroLoc('x'); - var dy = core.getHeroLoc('y'); - for (var x = 0; x < mw; x++) { - for (var y = 0; y < mh; y++) { + for (var x = 0; x < core.bigmap.width; x++) { + for (var y = 0; y < core.bigmap.height; y++) { core.canvas.bg.drawImage(blockImage, 0, blockIcon * 32, 32, 32, x * 32, y * 32, 32, 32); } } @@ -395,7 +389,7 @@ maps.prototype.drawMap = function (mapName, callback) { } if (main.mode=='editor'){ main.editor.drawMapBg = function(){ - core.clearMap('bg', 0, 0, 416, 416); + core.clearMap('bg'); drawBg(); } } else { @@ -408,7 +402,7 @@ maps.prototype.drawMap = function (mapName, callback) { var mapData = core.status.maps[core.status.floorId]; var mapBlocks = mapData.blocks; - var mapArray = core.maps.getMapArray(mapBlocks,mw,mh); + var mapArray = core.maps.getMapArray(mapBlocks,core.bigmap.width,core.bigmap.height); for (var b = 0; b < mapBlocks.length; b++) { // 事件启用 var block = mapBlocks[b]; @@ -429,9 +423,9 @@ maps.prototype.drawMap = function (mapName, callback) { if (main.mode=='editor'){ main.editor.updateMap = function(){ core.removeGlobalAnimate(null, null, true); - core.clearMap('bg', 0, 0, 416, 416); - core.clearMap('event', 0, 0, 416, 416); - core.clearMap('event2', 0, 0, 416, 416); + core.clearMap('bg'); + core.clearMap('event'); + core.clearMap('event2'); drawBg(); drawEvent(); core.setGlobalAnimate(core.values.animateSpeed); @@ -473,7 +467,7 @@ maps.prototype.drawAutotile = function(ctx, mapArr, block, size, left, top){ 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>12 || y>12) return 1; + if(x<0 || y<0 || x>=core.bigmap.width || y>=core.bigmap.height) return 1; else return mapArr[y][x]==currId ? 1:0; } var checkAround = function(x, y){ // 得到周围四个32*32块(周围每块都包含当前块的1/4,不清楚的话画下图你就明白)的数组索引 @@ -537,8 +531,7 @@ maps.prototype.noPassExists = function (x, y, floorId) { ////// 某个点是否在区域内且不可通行 ////// maps.prototype.noPass = function (x, y) { - var floor = core.floors[core.status.floorId]; - return x<0 || x>=floor.tileWidth || y<0 || y>=floor.tileHeight || this.noPassExists(x,y); + return x<0 || x>=core.bigmap.width || y<0 || y>=core.bigmap.height || this.noPassExists(x,y); } ////// 某个点是否存在NPC ////// @@ -601,7 +594,7 @@ maps.prototype.getBlockId = function (x, y, floorId, needEnable) { maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { time = time || 500; - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); var block = core.getBlock(x,y); if (block==null) {// 不存在 @@ -615,7 +608,7 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { // 需要删除该块 core.removeBlock(x,y); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1.0); block=block.block; @@ -675,7 +668,7 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { core.canvas.animate.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, nowX, nowY-height+32, 32, height); if (opacityVal<=0) { clearInterval(animate); - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); core.setOpacity('animate', 1); // 不消失 if (keep) { @@ -706,7 +699,7 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { ////// 显示跳跃某块的动画,达到{"type":"jump"}的效果 ////// maps.prototype.jumpBlock = function(sx,sy,ex,ey,time,keep,callback) { time = time || 500; - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); var block = core.getBlock(sx,sy); if (block==null) { if (core.isset(callback)) callback(); @@ -718,7 +711,7 @@ maps.prototype.jumpBlock = function(sx,sy,ex,ey,time,keep,callback) { // 需要删除该块 core.removeBlock(sx,sy); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1.0); block=block.block; @@ -781,7 +774,7 @@ maps.prototype.jumpBlock = function(sx,sy,ex,ey,time,keep,callback) { core.canvas.animate.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, drawX(), drawY()-height+32, 32, height); if (opacityVal<=0) { clearInterval(animate); - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); core.setOpacity('animate', 1); if (keep) { core.setBlock(id, ex, ey); @@ -799,7 +792,7 @@ 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', 0, 0, 416, 416); + core.clearMap('animate'); if (typeof loc[0] == 'number' && typeof loc[1] == 'number') loc = [loc]; @@ -840,7 +833,7 @@ maps.prototype.animateBlock = function (loc,type,time,callback) { core.setOpacity('animate', opacityVal); if (opacityVal >=1 || opacityVal<=0) { clearInterval(animate); - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); core.setOpacity('animate', 1); core.status.replay.animate=false; if (core.isset(callback)) callback(); @@ -927,7 +920,7 @@ maps.prototype.removeBlockByIds = function (floorId, ids) { maps.prototype.setBlock = function (number, x, y, floorId) { floorId = floorId || core.status.floorId; if (!core.isset(number) || !core.isset(x) || !core.isset(y)) return; - if (x<0 || x>12 || y<0 || y>12) return; + if (x<0 || x>=core.bigmap.width || y<0 || y>=core.bigmap.height) return; var originBlock=core.getBlock(x,y,floorId,false); var block = core.maps.initBlock(x,y,number); @@ -1021,7 +1014,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { // 清空animate层 clearInterval(core.interval.animateInterval); - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); // 开始绘制 var animate = core.material.animates[name]; @@ -1033,7 +1026,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { core.playSound(animate.se); var draw = function (index) { - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); var frame = animate.frames[index]; frame.forEach(function (t) { @@ -1046,7 +1039,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { var cx = centerX+t.x, cy=centerY+t.y; if (!t.mirror && !t.angle) { - core.canvas.animate.drawImage(image, cx-realWidth/2 - core.maps.currentOffsetPos.x, cy-realHeight/2 - core.maps.currentOffsetPos.y, realWidth, realHeight); + core.canvas.animate.drawImage(image, cx-realWidth/2 - core.bigmap.offsetX, cy-realHeight/2 - core.bigmap.offsetY, realWidth, realHeight); } else { core.saveCanvas('animate'); @@ -1055,7 +1048,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { core.canvas.animate.rotate(-t.angle*Math.PI/180); if (t.mirror) core.canvas.animate.scale(-1,1); - core.canvas.animate.drawImage(image, -realWidth/2 - core.maps.currentOffsetPos.x, -realHeight/2 - core.maps.currentOffsetPos.y, realWidth, realHeight); + core.canvas.animate.drawImage(image, -realWidth/2 - core.bigmap.offsetX, -realHeight/2 - core.bigmap.offsetY, realWidth, realHeight); core.loadCanvas('animate'); } }) @@ -1066,7 +1059,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { core.interval.animateInterval = setInterval(function (t) { if (index == animate.frames.length) { clearInterval(core.interval.animateInterval); - core.clearMap('animate', 0, 0, 416, 416); + core.clearMap('animate'); core.setAlpha('animate', 1); if (core.isset(callback)) callback(); return; diff --git a/libs/ui.js b/libs/ui.js index 45e4a2c8..0a4fd41d 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -18,12 +18,12 @@ ui.prototype.init = function () { ui.prototype.clearMap = function (map, x, y, width, height) { if (map == 'all') { for (var m in core.canvas) { - core.canvas[m].clearRect(0, 0, 416, 416); + core.canvas[m].clearRect(0, 0, core.bigmap.width*32, core.bigmap.height*32); } core.dom.gif.innerHTML = ""; } else { - core.canvas[map].clearRect(x||0, y||0, width||416, height||416); + core.canvas[map].clearRect(x||0, y||0, width||core.bigmap.width*32, height||core.bigmap.height*32); } } @@ -149,7 +149,7 @@ ui.prototype.setFillStyle = function (map, style) { ui.prototype.closePanel = function () { core.status.boxAnimateObjs = []; clearInterval(core.status.event.interval); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1.0); core.unLockControl(); core.status.event.data = null; @@ -380,7 +380,7 @@ ui.prototype.drawTextBox = function(content) { var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); core.status.boxAnimateObjs = []; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); // var contents = content.split('\n'); // var contents = core.splitLines('ui', content, ); @@ -541,7 +541,7 @@ ui.prototype.drawChoices = function(content, choices) { var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1); core.setFillStyle('ui', background); @@ -728,7 +728,7 @@ ui.prototype.drawConfirmBox = function (text, yesCallback, noCallback) { if (core.status.event.selection<0) core.status.event.selection=0; var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1); core.setFillStyle('ui', background); core.setFont('ui', "bold 19px Verdana"); @@ -872,7 +872,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); var left=10, right=416-2*left; @@ -891,7 +891,7 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { core.fillRect('ui', left, top, right, bottom, '#000000'); core.setAlpha('ui', 1); core.strokeRect('ui', left - 1, top - 1, right + 1, bottom + 1, '#FFFFFF', 2); - core.clearMap('data',0,0,416,416); + core.clearMap('data'); clearInterval(core.interval.tipAnimate); core.setAlpha('data', 1); @@ -1099,9 +1099,9 @@ ui.prototype.drawBattleAnimate = function(monsterId, callback) { // 战斗结束 clearInterval(battleInterval); core.status.boxAnimateObjs = []; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1.0); - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); if (core.status.event.id=='battle') { core.unLockControl(); core.status.event.id=null; @@ -1121,7 +1121,7 @@ ui.prototype.drawWaiting = function(text) { core.status.event.id = 'waiting'; var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1); core.setFillStyle('ui', background); @@ -1219,7 +1219,7 @@ ui.prototype.drawCursor = function () { core.status.event.id = 'cursor'; core.lockControl(); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1); var width = 4; @@ -1235,10 +1235,10 @@ ui.prototype.drawBook = function (index) { var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); clearInterval(core.interval.tipAnimate); - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.setOpacity('data', 1); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1); core.setFillStyle('ui', background); core.fillRect('ui', 0, 0, 416, 416); @@ -1400,7 +1400,7 @@ ui.prototype.drawBookDetail = function (index) { core.status.event.id = 'book-detail'; clearInterval(core.interval.tipAnimate); - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.setOpacity('data', 1); var left=10, right=416-2*left; @@ -1453,7 +1453,7 @@ ui.prototype.drawFly = function(page) { var floorId = core.status.hero.flyRange[page]; var title = core.status.maps[floorId].title; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 0.85); core.fillRect('ui', 0, 0, 416, 416, '#000000'); core.setAlpha('ui', 1); @@ -1490,11 +1490,11 @@ ui.prototype.drawMaps = function (index) { clearTimeout(core.interval.tipAnimate); - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 1); this.drawThumbnail(floorId, 'ui', core.status.maps[floorId].blocks, 0, 0, 416); - core.clearMap('data', 0, 0, 416, 416); + core.clearMap('data'); core.setOpacity('data', 0.2); core.canvas.data.textAlign = 'left'; core.setFont('data', '16px Arial'); @@ -1538,7 +1538,7 @@ ui.prototype.drawToolbox = function(index) { core.status.event.data=selectId; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 0.85); core.fillRect('ui', 0, 0, 416, 416, '#000000'); core.setAlpha('ui', 1); @@ -1660,7 +1660,7 @@ ui.prototype.drawSLPanel = function(index) { core.status.event.data=index; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); core.setAlpha('ui', 0.85); core.fillRect('ui', 0, 0, 416, 416, '#000000'); core.setAlpha('ui', 1); @@ -1715,8 +1715,8 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, heroL var blockIcon = core.material.icons.terrains[groundId]; var blockImage = core.material.images.terrains; var persize = size/13; - var mw = core.floors[floorId].tileWidth; - var mh = core.floors[floorId].tileHeight; + 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); @@ -1792,7 +1792,7 @@ ui.prototype.drawKeyBoard = function () { core.lockControl(); core.status.event.id = 'keyBoard'; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); var left = 16, top = 48, right = 416 - 2 * left, bottom = 416 - 2 * top; var background = core.canvas.ui.createPattern(core.material.ground, "repeat"); diff --git a/libs/utils.js b/libs/utils.js index 13a9f677..2f2a981b 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -352,6 +352,11 @@ utils.prototype.subarray = function (a, b) { return na; } +utils.prototype.clamp = function (x, a, b) { + var min=Math.min(a, b), max=Math.max(a, b); + return Math.min(Math.max(x, min), max); +} + ////// Base64加密 ////// utils.prototype.encodeBase64 = function (str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { diff --git a/project/enemys.js b/project/enemys.js index bf6d890b..dc389a6d 100644 --- a/project/enemys.js +++ b/project/enemys.js @@ -1,7 +1,7 @@ enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = { 'greenSlime': {'name': '绿头怪', 'hp': 100, 'atk': 120, 'def': 0, 'money': 1, 'experience': 1, 'point': 0, 'special': [1,5,7,8]}, - 'redSlime': {'name': '红头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'point': 0, 'special': 0}, + 'redSlime': {'name': '红头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'point': 0, 'special': [16,18], 'value': 10}, 'blackSlime': {'name': '青头怪', 'hp': 0, 'atk': 0, 'def': 0, 'money': 0, 'experience': 0, 'point': 0, 'special': 0}, 'slimelord': {'name': '怪王', 'hp': 100, 'atk': 120, 'def': 0, 'money': 10, 'experience': 0, 'point': 0, 'special': [1,9]}, 'bat': {'name': '小蝙蝠', 'hp': 100, 'atk': 120, 'def': 0, 'money': 2, 'experience': 0, 'point': 0, 'special': 1}, diff --git a/project/floors/MT0.js b/project/floors/MT0.js index 7e83fff7..020496b8 100644 --- a/project/floors/MT0.js +++ b/project/floors/MT0.js @@ -18,7 +18,7 @@ main.floors.MT0= [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0], - [ 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], + [ 0, 0, 0, 0, 1, 1, 45, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], @@ -37,8 +37,8 @@ main.floors.MT0= [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ], -"tileWidth":26, -"tileHeight":26, +"width":26, +"height":26, "firstArrive": [], "events": {}, "changeFloor": {}, diff --git a/project/functions.js b/project/functions.js index 9bd9eda5..0ed6ad5e 100644 --- a/project/functions.js +++ b/project/functions.js @@ -453,7 +453,7 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.lockControl(); core.status.event.id = 'about'; - core.clearMap('ui', 0, 0, 416, 416); + core.clearMap('ui'); var left = 48, top = 36, right = 416 - 2 * left, bottom = 416 - 2 * top; core.setAlpha('ui', 0.85); diff --git a/project/items.js b/project/items.js index 1d877352..b6848936 100644 --- a/project/items.js +++ b/project/items.js @@ -290,7 +290,7 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "bigKey": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n core.drawTip(core.material.items[itemId].name + '使用成功');\n});", "bomb": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.events.afterUseBomb();\n});", "hammer": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.events.afterUseBomb();\n});", - "centerFly": "core.clearMap('hero', 0, 0, 416, 416);\ncore.setHeroLoc('x', core.status.event.data.x);\ncore.setHeroLoc('y', core.status.event.data.y);\ncore.drawHero();\ncore.drawTip(core.material.items[itemId].name + '使用成功');", + "centerFly": "core.clearMap('hero');\ncore.setHeroLoc('x', core.status.event.data.x);\ncore.setHeroLoc('y', core.status.event.data.y);\ncore.drawHero();\ncore.drawTip(core.material.items[itemId].name + '使用成功');", "upFly": "var loc = {'direction': core.status.hero.loc.direction, 'x': core.status.event.data.x, 'y': core.status.event.data.y};\ncore.changeFloor(core.status.event.data.id, null, loc, null, function (){\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.replay();\n});", "downFly": "var loc = {'direction': core.status.hero.loc.direction, 'x': core.status.event.data.x, 'y': core.status.event.data.y};\ncore.changeFloor(core.status.event.data.id, null, loc, null, function (){\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.replay();\n});", "poisonWine": "core.setFlag('poison', false);", diff --git a/styles.css b/styles.css index 218bfe8d..d85e7d5f 100644 --- a/styles.css +++ b/styles.css @@ -170,7 +170,7 @@ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; background: url(project/images/ground.png) repeat; - z-index: 150; + z-index: 135; display: none; } #statusBar .status{ @@ -257,6 +257,7 @@ span#poison, span#weak, span#curse { position: absolute; background: #000000; overflow: hidden; + z-index: 135; } #bg { From 7551dd3c7277c6ec7c5e4cd75c51a8981e709473 Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 24 Aug 2018 22:45:35 +0800 Subject: [PATCH 03/29] Automatic Route --- _server/editor.js | 4 +-- docs/personalization.md | 1 + index.html | 1 + libs/actions.js | 6 ++-- libs/control.js | 72 ++++++++++++++++++++--------------------- libs/core.js | 4 +-- styles.css | 4 +++ 7 files changed, 49 insertions(+), 43 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index 536e0df5..f5c7d0e1 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -159,8 +159,8 @@ editor.prototype.drawInitData = function (icons) { } editor.prototype.mapInit = function () { var ec = document.getElementById('event').getContext('2d'); - ec.clearRect(0, 0, 416, 416); - document.getElementById('event2').getContext('2d').clearRect(0, 0, 416, 416); + ec.clearRect(0, 0, core.bigmap.width*32, core.bigmap.height*32); + document.getElementById('event2').getContext('2d').clearRect(0, 0, core.bigmap.width*32, core.bigmap.height*32); editor.map = []; for (var y = 0; y < 13; y++) { editor.map[y] = []; diff --git a/docs/personalization.md b/docs/personalization.md index 47a807b6..0c2a6075 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -18,6 +18,7 @@ HTML5魔塔是使用画布(canvas)来绘制,存在若干个图层,它们 - animate:动画层;主要用来绘制动画,图块的淡入/淡出效果,图块的移动。showImage事件绘制的图片也是在这一层。 - weather:天气层;主要用来绘制天气(雨/雪) - curtain:色调层;用来控制当前楼层的画面色调 +- route:路线层;主要用来绘制勇士的行走路线图 - ui:UI层;用来绘制一切UI窗口,如剧情文本、怪物手册、楼传器、系统菜单等等 - data:数据层;用来绘制一些顶层的或更新比较快的数据,如左上角的提示,战斗界面中数据的变化等等。 diff --git a/index.html b/index.html index 95aff62d..b2a606db 100644 --- a/index.html +++ b/index.html @@ -114,6 +114,7 @@ + 此浏览器不支持HTML5 diff --git a/libs/actions.js b/libs/actions.js index d7303b2e..80e802f0 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -429,7 +429,7 @@ actions.prototype.ondown = function (x ,y) { } core.status.downTime = new Date(); - core.clearMap('ui'); + core.clearMap('route'); var pos={'x':x,'y':y} core.status.stepPostfix=[]; core.status.stepPostfix.push(pos); @@ -482,8 +482,8 @@ actions.prototype.onup = function () { var posy=core.status.stepPostfix[0].y; core.status.stepPostfix=[]; if (!core.status.lockControl) { - core.canvas.ui.clearRect(0, 0, 416,416); - core.canvas.ui.restore(); + core.clearMap('route'); + core.canvas.route.restore(); } // 长按 diff --git a/libs/control.js b/libs/control.js index c65ac8c1..4fa4cfe2 100644 --- a/libs/control.js +++ b/libs/control.js @@ -286,7 +286,7 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps, value // 保存的Index core.status.saveIndex = core.getLocalStorage('saveIndex2', 1); - core.status.automaticRoute.clickMoveDirectly = core.getLocalStorage('clickMoveDirectly', true); + core.status.automaticRoute.clickMoveDirectly = core.getLocalStorage('clickMoveDirectly', false); if (core.isset(values)) core.values = core.clone(values); @@ -334,7 +334,7 @@ control.prototype.restart = function() { ////// 清除自动寻路路线 ////// control.prototype.clearAutomaticRouteNode = function (x, y) { if (core.status.event.id==null) - core.canvas.ui.clearRect(x * 32 + 5, y * 32 + 5, 27, 27); + core.canvas.route.clearRect(x * 32 + 5, y * 32 + 5, 27, 27); } ////// 停止自动寻路操作 ////// @@ -352,7 +352,7 @@ control.prototype.stopAutomaticRoute = function () { core.status.automaticRoute.lastDirection = null; core.stopHero(); if (core.status.automaticRoute.moveStepBeforeStop.length==0) - core.canvas.ui.clearRect(0, 0, 416, 416); + core.clearMap('route'); } ////// 继续剩下的自动寻路操作 ////// @@ -370,7 +370,7 @@ control.prototype.continueAutomaticRoute = function () { ////// 清空剩下的自动寻路列表 ////// control.prototype.clearContinueAutomaticRoute = function () { - core.canvas.ui.clearRect(0, 0, 416, 416); + core.clearMap('route'); core.status.automaticRoute.moveStepBeforeStop=[]; } @@ -458,18 +458,18 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { if (destX == core.status.hero.loc.x && destY == core.status.hero.loc.y){ moveStep=[]; } else { - core.canvas.ui.clearRect(0, 0, 416, 416); + core.clearMap('route'); return; } } moveStep=moveStep.concat(stepPostfix); core.status.automaticRoute.destX=destX; core.status.automaticRoute.destY=destY; - core.canvas.ui.save(); - core.canvas.ui.clearRect(0, 0, 416, 416); - core.canvas.ui.fillStyle = '#bfbfbf'; - core.canvas.ui.strokeStyle = '#bfbfbf'; - core.canvas.ui.lineWidth = 8; + core.canvas.route.save(); + core.clearMap('route'); + core.canvas.route.fillStyle = '#bfbfbf'; + core.canvas.route.strokeStyle = '#bfbfbf'; + core.canvas.route.lineWidth = 8; for (var m = 0; m < moveStep.length; m++) { if (tempStep == null) { step++; @@ -487,53 +487,53 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { if (m == moveStep.length - 1) { // core.status.automaticRoutingTemp.moveStep.push({'direction': tempStep, 'step': step}); core.status.automaticRoute.autoStepRoutes.push({'direction': tempStep, 'step': step}); - core.canvas.ui.fillRect(moveStep[m].x * 32 + 10, moveStep[m].y * 32 + 10, 12, 12); + core.canvas.route.fillRect(moveStep[m].x * 32 + 10, moveStep[m].y * 32 + 10, 12, 12); } else { - core.canvas.ui.beginPath(); + core.canvas.route.beginPath(); if (core.isset(moveStep[m + 1]) && tempStep != moveStep[m + 1].direction) { if (tempStep == 'up' && moveStep[m + 1].direction == 'left' || tempStep == 'right' && moveStep[m + 1].direction == 'down') { - core.canvas.ui.moveTo(moveStep[m].x * 32 + 5, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 27); + core.canvas.route.moveTo(moveStep[m].x * 32 + 5, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 27); } else if (tempStep == 'up' && moveStep[m + 1].direction == 'right' || tempStep == 'left' && moveStep[m + 1].direction == 'down') { - core.canvas.ui.moveTo(moveStep[m].x * 32 + 27, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 27); + core.canvas.route.moveTo(moveStep[m].x * 32 + 27, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 27); } else if (tempStep == 'left' && moveStep[m + 1].direction == 'up' || tempStep == 'down' && moveStep[m + 1].direction == 'right') { - core.canvas.ui.moveTo(moveStep[m].x * 32 + 27, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 5); + core.canvas.route.moveTo(moveStep[m].x * 32 + 27, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 5); } else if (tempStep == 'right' && moveStep[m + 1].direction == 'up' || tempStep == 'down' && moveStep[m + 1].direction == 'left') { - core.canvas.ui.moveTo(moveStep[m].x * 32 + 5, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 5); + core.canvas.route.moveTo(moveStep[m].x * 32 + 5, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 5); } - core.canvas.ui.stroke(); + core.canvas.route.stroke(); continue; } switch (tempStep) { case 'up': case 'down': - core.canvas.ui.beginPath(); - core.canvas.ui.moveTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 5); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 27); - core.canvas.ui.stroke(); + core.canvas.route.beginPath(); + core.canvas.route.moveTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 5); + core.canvas.route.lineTo(moveStep[m].x * 32 + 16, moveStep[m].y * 32 + 27); + core.canvas.route.stroke(); break; case 'left': case 'right': - core.canvas.ui.beginPath(); - core.canvas.ui.moveTo(moveStep[m].x * 32 + 5, moveStep[m].y * 32 + 16); - core.canvas.ui.lineTo(moveStep[m].x * 32 + 27, moveStep[m].y * 32 + 16); - core.canvas.ui.stroke(); + core.canvas.route.beginPath(); + core.canvas.route.moveTo(moveStep[m].x * 32 + 5, moveStep[m].y * 32 + 16); + core.canvas.route.lineTo(moveStep[m].x * 32 + 27, moveStep[m].y * 32 + 16); + core.canvas.route.stroke(); break; } } } - core.canvas.ui.restore(); + core.canvas.route.restore(); // 立刻移动 core.setAutoHeroMove(); @@ -632,7 +632,7 @@ control.prototype.automaticRoute = function (destX, destY) { ////// 显示离散的寻路点 ////// control.prototype.fillPosWithPoint = function (pos) { - core.fillRect('ui', pos.x*32+12,pos.y*32+12,8,8, '#bfbfbf'); + core.fillRect('route', pos.x*32+12,pos.y*32+12,8,8, '#bfbfbf'); } ////// 设置勇士的自动行走路线 ////// @@ -759,7 +759,7 @@ control.prototype.turnHero = function() { else if (core.status.hero.loc.direction == 'down') core.status.hero.loc.direction = 'left'; else if (core.status.hero.loc.direction == 'left') core.status.hero.loc.direction = 'up'; core.drawHero(); - core.canvas.ui.clearRect(0, 0, 416, 416); + core.clearMap('route'); core.status.route.push("turn"); } diff --git a/libs/core.js b/libs/core.js index 6f569e0b..93f24225 100644 --- a/libs/core.js +++ b/libs/core.js @@ -77,7 +77,7 @@ function core() { scale: 1.0, } this.bigmap = { - canvas: ["bg", "event", "event2", "fg"], + canvas: ["bg", "event", "event2", "fg", "route"], offsetX: 0, // in pixel offsetY: 0, width: 13, // map width and height @@ -116,7 +116,7 @@ function core() { 'cursorX': null, 'cursorY': null, "moveDirectly": false, - 'clickMoveDirectly': true, + 'clickMoveDirectly': false, }, // 按下键的时间:为了判定双击 diff --git a/styles.css b/styles.css index d85e7d5f..0983974a 100644 --- a/styles.css +++ b/styles.css @@ -288,6 +288,10 @@ span#poison, span#weak, span#curse { z-index: 80; } +#route { + z-index: 105; +} + #ui { z-index: 110; } From 656cd92c203890f5c7d414d3b717ba46e20a9795 Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 24 Aug 2018 23:19:03 +0800 Subject: [PATCH 04/29] Fix scale --- libs/actions.js | 2 +- libs/control.js | 11 ++++++++++- libs/maps.js | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index 80e802f0..2ae074d3 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -476,7 +476,7 @@ actions.prototype.onup = function () { for(var ii=1;ii Date: Fri, 24 Aug 2018 23:36:54 +0800 Subject: [PATCH 05/29] Fix resize bug --- libs/control.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libs/control.js b/libs/control.js index 05292367..7501f365 100644 --- a/libs/control.js +++ b/libs/control.js @@ -3032,4 +3032,12 @@ control.prototype.domRenderer = function(){ } } + // resize map + if (core.isPlaying() && core.isset(core.status) && core.isset(core.bigmap)) { + core.bigmap.canvas.forEach(function(cn){ + core.canvas[cn].canvas.style.width = core.bigmap.width*32*core.domStyle.scale + "px"; + core.canvas[cn].canvas.style.height = core.bigmap.height*32*core.domStyle.scale + "px"; + }); + } + } \ No newline at end of file From 7032cb7c83cedc6eb3cb4c0a8207bf25dbfca140 Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Sun, 26 Aug 2018 00:33:02 +0800 Subject: [PATCH 06/29] bigmap-editor --- _server/editor.js | 4 +-- _server/vm.js | 9 ++++++- editor.html | 62 ++++++++++++++++++++++++++++++++++++----------- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index f5c7d0e1..d515dec6 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -308,7 +308,7 @@ editor.prototype.listen = function () { function fillPos(pos) { uc.fillStyle = '#' + ~~(Math.random() * 8) + ~~(Math.random() * 8) + ~~(Math.random() * 8); - uc.fillRect(pos.x * 32 + 12, pos.y * 32 + 12, 8, 8); + uc.fillRect(pos.x * 32 + 12 - core.bigmap.offsetX, pos.y * 32 + 12 - core.bigmap.offsetY, 8, 8); }//在格子内画一个随机色块 function eToLoc(e) { @@ -325,7 +325,7 @@ editor.prototype.listen = function () { }//返回可用的组件内坐标 function locToPos(loc) { - editor.pos = {'x': ~~(loc.x / loc.size), 'y': ~~(loc.y / loc.size)} + editor.pos = {'x': ~~(loc.x / loc.size)+core.bigmap.offsetX/32, 'y': ~~(loc.y / loc.size)+core.bigmap.offsetY/32} return editor.pos; } diff --git a/_server/vm.js b/_server/vm.js index 312507fa..a95e1cfa 100644 --- a/_server/vm.js +++ b/_server/vm.js @@ -24,7 +24,14 @@ document.body.onmousedown = function (e) { } }); - if (clickpath.indexOf('edit') === -1 && clickpath.indexOf('tip') === -1 && clickpath.indexOf('brushMod') === -1 && clickpath.indexOf('brushMod2') === -1) { + var unselect=true; + for(var ii=0,thisId;thisId=['edit','tip','brushMod','brushMod2','viewportButtons'][ii];ii++){ + if (clickpath.indexOf(thisId) !== -1){ + unselect=false; + break; + } + } + if (unselect) { if (clickpath.indexOf('eui') === -1) { if (selectBox.isSelected) { editor_mode.onmode(''); diff --git a/editor.html b/editor.html index 22b17d73..86a9a5f5 100644 --- a/editor.html +++ b/editor.html @@ -5,6 +5,11 @@ + --> @@ -433,6 +448,24 @@ if (location.protocol.indexOf("http")!=0) { --> - diff --git a/editor.html b/editor.html index 86a9a5f5..c52708fb 100644 --- a/editor.html +++ b/editor.html @@ -5,11 +5,6 @@ - --> - @@ -448,24 +424,6 @@ if (location.protocol.indexOf("http")!=0) { + diff --git a/libs/control.js b/libs/control.js index 7501f365..4ac0de4f 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; } 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 From 635e43d1db5c5ebdac9bd7be7eb1c186d3f8a6b9 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 27 Aug 2018 00:31:56 +0800 Subject: [PATCH 13/29] Use disable instead of enable --- docs/api.md | 15 ++++++++++---- libs/control.js | 8 ++++---- libs/core.js | 13 ++++++++---- libs/enemys.js | 2 +- libs/events.js | 10 ++++----- libs/maps.js | 53 +++++++++++++++++++++++++++--------------------- libs/ui.js | 4 ++-- project/data.js | 2 +- project/items.js | 14 ++++++------- 9 files changed, 70 insertions(+), 51 deletions(-) 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/libs/control.js b/libs/control.js index 4ac0de4f..1cc0347e 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1164,14 +1164,14 @@ control.prototype.updateCheckBlock = function() { core.status.checkBlock.map = []; // 记录怪物地图 for (var n=0;n=0 && nx=0 && ny=0 && nx=0 && ny0) @@ -1568,7 +1568,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 c18777a7..8bca255a 100644 --- a/libs/core.js +++ b/libs/core.js @@ -666,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 718f3ec3..699c854e 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1026,7 +1026,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 +1102,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 +1179,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; } }) } @@ -1617,7 +1617,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 3368d423..be066c67 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -43,21 +43,21 @@ maps.prototype.loadFloor = function (floorId, map) { ////// 数字和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; @@ -404,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); } @@ -567,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;n=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/ui.js b/libs/ui.js index 958d4c0b..73af00ee 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1803,7 +1803,7 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, cente var mapArray = core.maps.getMapArray(blocks,mw,mh); for (var b in blocks) { var block = blocks[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(tempCanvas, mapArray, block, 32, 0, 0); } @@ -1925,7 +1925,7 @@ ui.prototype.drawStatistics = function () { if (floor.cannotViewMap && floorId!=core.status.floorId) return; blocks.forEach(function (block) { - if (!core.isset(block.event) || (core.isset(block.enable) && !block.enable)) + if (!core.isset(block.event) || block.disable) return; var event = block.event; if (event.cls.indexOf("enemy")==0) { diff --git a/project/data.js b/project/data.js index eba61dc1..82bad9b6 100644 --- a/project/data.js +++ b/project/data.js @@ -2,7 +2,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = { "main" : { "floorIds" : [ - "MT0" + "MT0", "sample0", "sample1", "sample2" ], "images" : [ "bg.jpg" diff --git a/project/items.js b/project/items.js index a0236f61..8b9cbd9f 100644 --- a/project/items.js +++ b/project/items.js @@ -315,16 +315,16 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "canUseItemEffect": { "book": "true", "fly": "core.status.hero.flyRange.indexOf(core.status.floorId)>=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", + "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 \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) && !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 && \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) && !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 (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", + "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) && !block.disable \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) && !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')", From d1be1ea49c43e9734c0c8d6f61eb3aa579c3e693 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 27 Aug 2018 00:38:51 +0800 Subject: [PATCH 14/29] Item effects of bigmap --- project/items.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/project/items.js b/project/items.js index 8b9cbd9f..39f7089e 100644 --- a/project/items.js +++ b/project/items.js @@ -315,15 +315,15 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "canUseItemEffect": { "book": "true", "fly": "core.status.hero.flyRange.indexOf(core.status.floorId)>=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) && !block.disable \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", + "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 && \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", + "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 (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) && !block.disable \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", + "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')", From 08ade77c2296ebbce8319bb7817f4659bef018fa Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 27 Aug 2018 00:51:38 +0800 Subject: [PATCH 15/29] Item effects of bigmap --- project/items.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/items.js b/project/items.js index 39f7089e..05fc0df0 100644 --- a/project/items.js +++ b/project/items.js @@ -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 Date: Mon, 27 Aug 2018 01:01:24 +0800 Subject: [PATCH 16/29] Add arrow keys --- _server/editor.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/_server/editor.js b/_server/editor.js index 08795309..c94747e7 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -591,6 +591,18 @@ editor.prototype.listen = function () { editor.changeFloor(toId); } } + 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); + } } var dataSelection = document.getElementById('dataSelection'); From fb540a6976c665e2057094494dbe26da663ad722 Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 27 Aug 2018 01:36:00 +0800 Subject: [PATCH 17/29] Create bigmap --- _server/editor.js | 30 ++++++++++++++++++------------ _server/editor_file.js | 16 +++++++++++++--- _server/editor_mode.js | 6 ++++++ editor.html | 6 +++++- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index c94747e7..0df9b22c 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -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) { @@ -591,18 +609,6 @@ editor.prototype.listen = function () { editor.changeFloor(toId); } } - 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); - } } var dataSelection = document.getElementById('dataSelection'); 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/editor.html b/editor.html index c52708fb..32610082 100644 --- a/editor.html +++ b/editor.html @@ -23,7 +23,11 @@
- + + + + + 保留楼层属性
From 5e5c653b81f2c7637f6c44037822e98ab783ba4e Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 27 Aug 2018 01:39:54 +0800 Subject: [PATCH 18/29] Create bigmap --- editor-mobile.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 @@
- + + + + + - 保留楼层属性 + 保留属性
From 373e6a281eee70151184230cfe951042f71ffcab Mon Sep 17 00:00:00 2001 From: oc Date: Mon, 27 Aug 2018 01:59:56 +0800 Subject: [PATCH 19/29] Fix mapIntoBlocks bug --- _server/editor.js | 6 +++--- libs/maps.js | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index 0df9b22c..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(); diff --git a/libs/maps.js b/libs/maps.js index be066c67..82aa04bb 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,12 +32,12 @@ 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; } From 4c94243e98a8cf3748a52619e2c057e0ad936eee Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 27 Aug 2018 13:55:21 +0800 Subject: [PATCH 20/29] Finish Bigmap --- libs/control.js | 11 +- libs/events.js | 23 +- libs/maps.js | 56 ++--- project/data.js | 4 +- project/floors/MT0.js | 79 +++---- project/floors/sample2.js | 458 ++++---------------------------------- 6 files changed, 134 insertions(+), 497 deletions(-) diff --git a/libs/control.js b/libs/control.js index 1cc0347e..4a3f2468 100644 --- a/libs/control.js +++ b/libs/control.js @@ -912,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); @@ -1034,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], diff --git a/libs/events.js b/libs/events.js index 699c854e..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() { @@ -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; diff --git a/libs/maps.js b/libs/maps.js index 82aa04bb..d496a9c7 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -464,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,不清楚的话画下图你就明白)的数组索引 @@ -599,7 +599,7 @@ maps.prototype.getBlockCls = function (x, y, floorId, showDisable) { maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { time = time || 500; - core.clearMap('animate'); + core.clearMap('route'); var block = core.getBlock(x,y); if (block==null) {// 不存在 @@ -622,8 +622,8 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { var height = block.event.height || 32; var opacityVal = 1; - core.setOpacity('animate', opacityVal); - core.canvas.animate.drawImage(blockImage, 0, blockIcon * height, 32, height, block.x * 32, block.y * 32 +32 - height, 32, height); + core.setOpacity('route', opacityVal); + core.canvas.route.drawImage(blockImage, 0, blockIcon * height, 32, height, block.x * 32, block.y * 32 +32 - height, 32, height); // 要运行的轨迹:将steps展开 var moveSteps=[]; @@ -668,13 +668,13 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { if (moveSteps.length==0) { if (keep) opacityVal=0; else opacityVal -= 0.06; - core.setOpacity('animate', opacityVal); - core.clearMap('animate', nowX, nowY-height+32, 32, height); - core.canvas.animate.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, nowX, nowY-height+32, 32, height); + core.setOpacity('route', opacityVal); + core.clearMap('route', nowX, nowY-height+32, 32, height); + core.canvas.route.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, nowX, nowY-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, nowX/32, nowY/32); @@ -689,9 +689,9 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { step++; nowX+=scan[moveSteps[0]].x*2; nowY+=scan[moveSteps[0]].y*2; - core.clearMap('animate', nowX-32, nowY-32, 96, 96); + core.clearMap('route', nowX-32, nowY-32, 96, 96); // 绘制 - core.canvas.animate.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, nowX, nowY-height+32, 32, height); + core.canvas.route.drawImage(blockImage, animateCurrent * 32, blockIcon * height, 32, height, nowX, nowY-height+32, 32, height); if (step==16) { // 该移动完毕,继续 step=0; @@ -704,7 +704,7 @@ maps.prototype.moveBlock = function(x,y,steps,time,keep,callback) { ////// 显示跳跃某块的动画,达到{"type":"jump"}的效果 ////// maps.prototype.jumpBlock = function(sx,sy,ex,ey,time,keep,callback) { time = time || 500; - core.clearMap('animate'); + core.clearMap('route'); var block = core.getBlock(sx,sy); if (block==null) { if (core.isset(callback)) callback(); @@ -725,8 +725,8 @@ maps.prototype.jumpBlock = function(sx,sy,ex,ey,time,keep,callback) { var height = block.event.height || 32; var opacityVal = 1; - core.setOpacity('animate', opacityVal); - core.canvas.animate.drawImage(blockImage, 0, blockIcon * height, 32, height, block.x * 32, block.y * 32 +32 - height, 32, height); + core.setOpacity('route', opacityVal); + core.canvas.route.drawImage(blockImage, 0, blockIcon * height, 32, height, block.x * 32, block.y * 32 +32 - height, 32, height); core.playSound('jump.mp3'); @@ -767,20 +767,20 @@ maps.prototype.jumpBlock = function(sx,sy,ex,ey,time,keep,callback) { } if (jump_count>0) { - 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); @@ -797,7 +797,7 @@ 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]; @@ -822,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(); } diff --git a/project/data.js b/project/data.js index 82bad9b6..f01f9468 100644 --- a/project/data.js +++ b/project/data.js @@ -2,7 +2,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = { "main" : { "floorIds" : [ - "MT0", "sample0", "sample1", "sample2" + "sample0", "sample1", "sample2", "MT0" ], "images" : [ "bg.jpg" @@ -28,7 +28,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "title": "魔塔样板", "name": "template", "version": "Ver 2.3.3", - "floorId": "MT0", + "floorId": "sample0", "hero": { "name": "阳光", 'lv': 1, diff --git a/project/floors/MT0.js b/project/floors/MT0.js index 020496b8..0b5151b5 100644 --- a/project/floors/MT0.js +++ b/project/floors/MT0.js @@ -1,50 +1,35 @@ main.floors.MT0= { -"floorId": "MT0", -"title": "主塔 0 层", -"name": "0", -"canFlyTo": true, -"canUseQuickShop": true, -"cannotViewMap": false, -"defaultGround": "ground", -"images": [], -"item_ratio": 1, -"map": [ - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0], - [ 0, 0, 0, 0, 1, 1, 45, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], - [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0], - [ 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], - [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -], -"width":26, -"height":26, -"firstArrive": [], -"events": {}, -"changeFloor": {}, -"afterBattle": {}, -"afterGetItem": {}, -"afterOpenDoor": {}, -"cannotMove": {}, -"upFloor": null, + "floorId": "MT0", + "title": "主塔 0 层", + "name": "0", + "canFlyTo": true, + "canUseQuickShop": true, + "cannotViewMap": false, + "defaultGround": "ground", + "images": [], + "item_ratio": 1, + "map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ], + "firstArrive": [], + "events": {}, + "changeFloor": {}, + "afterBattle": {}, + "afterGetItem": {}, + "afterOpenDoor": {}, + "cannotMove": {}, + "upFloor": null, } \ No newline at end of file diff --git a/project/floors/sample2.js b/project/floors/sample2.js index 5db5310c..04dd70aa 100644 --- a/project/floors/sample2.js +++ b/project/floors/sample2.js @@ -1,410 +1,50 @@ -main.floors.sample2 = +main.floors.sample2= { - "floorId": "sample2", // 这里需要改楼层名,请和文件名及下面的floorId保持完全一致 - // 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头 - // 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等 - // 楼层唯一标识符,需要和名字完全一致 - "title": "主塔 40 层", // 楼层中文名 - "name": "40", // 显示在状态栏中的层数 - "canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) - "canUseQuickShop": true, // 该层是否允许使用快捷商店 - "defaultGround": "snowGround", // 默认地面的图块ID(terrains中) - "images": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。 - "color": [255,0,0,0.3], // 该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。 - "weather": ["rain",10], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪,第二项为1-10之间的数代表强度。 - "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。 - "item_ratio": 1, // 该层的宝石/血瓶倍率 - "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 - [ 5, 5, 5, 5, 5, 5, 87, 5, 5, 5, 5, 5, 5], - [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], - [ 5, 4, 4, 4, 4, 1, 85, 1, 4, 4, 4, 4, 5], - [ 5, 4, 4, 4,247, 1,247, 1,247, 4, 4, 4, 5], - [ 5, 4, 4, 4, 1,247,247,247, 1, 4, 4, 4, 5], - [ 5, 4, 4, 4, 1,247, 30,247, 1, 4, 4, 4, 5], - [ 5, 4, 4, 4,247, 1,124, 1,247, 4, 4, 4, 5], - [ 5, 4, 4, 4, 4, 1,123, 1, 4, 4, 4, 4, 5], - [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], - [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], - [ 5, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 5], - [ 5, 4, 4, 4, 4, 4, 85, 4, 4, 4, 4, 4, 5], - [ 5, 5, 5, 5, 5, 5, 88, 5, 5, 5, 5, 5, 5] - ], - "firstArrive": [ // 第一次到该楼层触发的事件 - "\t[实战!]本楼将尝试复刻《宿命的旋律》40F剧情。" - ], - "events": { // 该楼的所有可能事件列表 - - "6,11": {"enable": false}, // 下楼梯口的机关门,初始处于关闭状态 - "6,10": [ // 进入陷阱后关门 - {"type": "playSound", "name": "door.mp3"}, - {"type": "show", "loc": [6,11]}, // 显示机关门 - {"type": "hide"}, // 隐藏该事件 - {"type": "trigger", "loc": [6,7]}, // 直接引发"6,7"处的事件,即下面的杰克 - // 请再次注意"trigger"会立刻结束当前事件,因此"type":"hide"需要在trigger前调用 - ], - "6,7": [ // 杰克事件 - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]杰克,你究竟是什么人?", - {"type": "playSound", "name": "item.mp3"}, - "\t[杰克,thief]……", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]我们……是朋友对吧?\n是朋友就应该相互信任对吧?", - {"type": "playSound", "name": "item.mp3"}, - "\t[杰克,thief]……事到如今也没有什么好隐瞒的了。", - {"type": "playSound", "name": "item.mp3"}, - "\t[杰克,thief]没错,我就是这一切的背后主谋。", - {"type": "move", "steps": [ // 移动到黑暗大法师的位置;使用move会自动调用hide进行隐藏,无需再手动调用 - {"direction": "up", "value": 3} - ], "time": 1000}, - {"type": "show", "loc": [6,4], "time": 1000}, // 显示黑暗大法师 - {"type": "sleep", "time": 500}, // 等待500毫秒 - // 下面是黑暗大法师的事件 - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]我的真名为——黑暗大法师,第四区域的头目。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]呵呵,不知道为什么,我竟然对事情走到现在这一步毫不感觉意外。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]以杰克的名义利用了你这么久,真是抱歉啊。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]真正的杰克现在在哪里?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]盗贼杰克这个人类从未存在过,他只是我用来接近你的一副皮囊而已。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……这样啊,呵呵。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]为什么你看上去丝毫不生气?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]多亏了鬼帝,我现在的脾气好得连我自己都害怕。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]说起来我还得好好感谢你呢,如果没有杰克……你的帮助,我早就死在第一区域了。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]不论你的目的如何,你的所作所为都是对我有利的。不是吗?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]能够如此淡定的面对背叛,看来跟五年前相比,你确实成长了很多啊。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]五年前?……黑暗大法师,在这之前,我们好像素未谋面吧?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]五年前那场屠城你应该这一生都不会忘记吧。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]很不巧,那场屠城的主谋,也是我。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]这么说,击中我双亲的那道紫色闪电,也就是你释放的吧……", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]你的双亲?这种事情我怎么可能会记得?\n你难道在踩死蚂蚁的时候还会一只只记下他们的样子吗?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]老 子 要 你 的 命", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]你应该对我心怀感激才对,如果不是那时的我看出了你隐藏的稀有勇者体质,你绝对不可能活到今天。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]在暗中动手脚让你通过勇者选拔的人也是我,我一直一直在暗中引导你走到今天这一步。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]是我救赎了一无是处的你。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]为什么只有我一个人活了下来!!!!", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]为什么偏偏是我!!!!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]我刚才不是说过了吗?因为我看出了你有稀有勇者体质啊。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]你刚刚跟鬼帝交过手,应该已经很清楚这稀有勇者体质意味着什么了吧?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……就因为我有这种体质,就不得不背负如此残酷的宿命吗?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]愚蠢!这意味着只要我对你加以引导跟培养,你就能成为这世间实力最强的存在!", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……所以,你究竟想利用我干什么?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]我利用你干的事情,你不是已经完成了吗?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……你说什么?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]不知不觉间,你已经在我的指引下跟鬼帝正面交手并且杀掉了他啊。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]就连我跟鬼帝的对决……也是被你安排好了的?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]你们两个一个是人类勇者,一个是魔物勇者,迟早会有交手的一天。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]我只不过是操纵了一系列的连锁事件让这一天提早了数十年到来而已。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……你这样做对谁有好处?他可是你们魔物世界的救世主啊。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]一个惧怕征战,爱好和平的懦夫,也配叫救世主?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]获得了力量,却只会被动挨打而不主动向人类世界出击,龟缩在第二区域惶惶度日,他根本就不配拥有稀有勇者体质。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]为了不让这种人霸占着积累多年的庞大灵魂能量无作为,我设计让你杀掉了他。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]你没有辜负我的期待,成功战胜了那个废物,现在你体内累积的灵魂能量……也就是魔力,已经达到了能跟魔王匹敌的地步。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……是吗?现在的我能与魔王匹敌?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]不止如此,你现在的力量之强就算是统治世界也是绰绰有余!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]怎么样?要不要加入我的麾下,跟随我去征战人类世界?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]能与魔王匹敌的话,也就是说。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]我 现 在 对 付 你 这 种 杂 碎 也 绰 绰 有 余 吧 ?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]……什么?!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]等一下!别冲动!你先等我把这利害关系理一理——", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]你给老子闭嘴。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]老子什么都不想听。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]老子现在想做的事情只有一件——", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]剁掉你的头,把它放回我双亲的墓前。", - {"type": "update"} // 本事件剧情结束,更新地图显伤 - ], - "6,4": { // 黑暗大法师战斗事件 - "enable": false, // 初始时是禁用状态 - // 打败后将触发afterBattle事件 - }, - "5,4": {"enable":false}, // 大法师的分身们,初始时禁用状态 - "7,4": {"enable":false}, // 大法师的分身们,初始时禁用状态 - "5,5": {"enable":false}, // 大法师的分身们,初始时禁用状态 - "7,5": {"enable":false}, // 大法师的分身们,初始时禁用状态 - "6,3": { // 大法师本尊 - "trigger": "action", // 注意:这里要写 trigger:action ,来覆盖掉系统默认的battle事件。 - "enable":false, - "data": [ - "\t[blackMagician]听不进去人话的蠢货,就要用疼痛来管教!", - {"type": "changePos", "direction": "up"}, - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]出来吧!禁忌——紫电凶杀阵!", - {"type": "show", "loc": [[4,3],[4,6],[8,6],[8,3]], "time": 500}, // 依次显示四个角的法师 - {"type": "sleep", "time": 500}, - "\t[blackMagician]感受绝望吧!冥顽不化的蠢货!", - /* - {"type": "hide", "loc": [4,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [4,3], "time": 150}, - {"type": "hide", "loc": [4,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [4,6], "time": 150}, - {"type": "hide", "loc": [8,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [8,6], "time": 150}, - {"type": "hide", "loc": [8,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [8,3], "time": 150}, - */ - {"type": "animate", "name": "yongchang", "loc": [4,3]}, - {"type": "animate", "name": "yongchang", "loc": [4,6]}, - {"type": "animate", "name": "yongchang", "loc": [8,6]}, - {"type": "animate", "name": "yongchang", "loc": [8,3]}, - {"type": "sleep", "time": 200}, - {"type": "playSound", "name": "attack.mp3"}, // 播放攻击音效 - {"type": "animate", "name": "thunder", "loc": "hero"}, - {"type": "sleep", "time": 200}, - "\t[hero]唔……!!(吐血)", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]我的魔力可是充足的很啊!我会一直折磨到你屈服于我为止!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]人类!好好感受吧!当初你们施加于我的痛苦!如今我要百倍奉还!", - {"type": "show", "loc": [6,6], "time": 1000}, // 显示妖精 - {"type": "sleep", "time": 700}, - {"type": "trigger", "loc": [6,6]} // 立刻触发妖精事件 - ] - }, - "4,3": { // 四个角的大法师, - "trigger": "action", - "displayDamage": false, - "enable":false - }, - "8,3": { // 四个角的大法师, - "trigger": "action", - "displayDamage": false, - "enable":false - }, - "4,6": { // 四个角的大法师, - "trigger": "action", - "displayDamage": false, - "enable":false - }, - "8,6": { // 四个角的大法师, - "trigger": "action", - "displayDamage": false, - "enable":false - }, - - "6,6": { // 妖精 - "enable":false, // 初始时禁用状态 - "data": [ // 妖精事件 - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]…妖精…小姐……是你吗?", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]不要绝望,也不要悲伤。", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]你从来都不是独自一人在前进。", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]咱一直,一直都在注视着你。", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]耍小聪明的你、笨笨的你呆呆的你、胆小的你、勇敢的你帅气的你……全部全部都是你。", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]所以放心吧,无论发生什么,咱都会陪伴在你身边的。", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]因为你要是离开我的话,立刻就会死掉吧?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]…妖精…小姐……其实一直以来,我都非常感激你……", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]笨蛋!都这种时候了就不要作出像是临终遗言的发言了啊!!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]喂!那边穿衣品味差到极点的黑暗大法师,别左顾右盼说的就是你!你应该知道咱的身份吧?\n还不速速退下!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]可恶…多管闲事的妖精族…明明只要再让他承受一点疼痛来瓦解他的意志力,我的计划就成功了!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]哼哼哼~抱歉哦,这个笨蛋的意志力可不像你想象的那么薄弱哦!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]不甘心!我不甘心!妖精公主又如何!\n只要是阻挡我的,不管是谁我都要铲除!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]终于露出狐狸尾巴了,其实咱早就看出你有谋反的念头。你的计划就是拉拢这家伙入伙然后推翻魔王对魔塔的统治对吧?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]呵呵呵……那个昏庸的魔王,掌握着那么庞大的魔物军队却只知道固守魔塔,而不主动侵略人类世界扩张领土!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]我实在是看不过眼,所以我才决定把这个具备稀有勇者体质的家伙培养成新一任魔王!\n来让这个世界的势力重新洗牌!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]你觉得一个满脑子想着回家种田的废柴勇者会成为改变世界的魔王?你晃晃脑袋试试,是不是能听到大海的声音?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]恼人至极的妖精族!呵呵呵……我干脆一不做二不休,连你也一块收拾了吧!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]别小瞧咱!咱好歹也是妖精族里实力数一数二的存在!", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]只会耍嘴皮子的恼人苍蝇!我倒要看看一块焦炭会不会说话!\n——招雷弹!!", - /* - {"type": "hide", "loc": [4,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [4,3], "time": 150}, - {"type": "hide", "loc": [4,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [4,6], "time": 150}, - {"type": "hide", "loc": [8,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [8,6], "time": 150}, - {"type": "hide", "loc": [8,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 - {"type": "show", "loc": [8,3], "time": 150}, - */ - {"type": "animate", "name": "yongchang", "loc": [4,3]}, - {"type": "animate", "name": "yongchang", "loc": [4,6]}, - {"type": "animate", "name": "yongchang", "loc": [8,6]}, - {"type": "animate", "name": "yongchang", "loc": [8,3]}, - {"type": "playSound", "name": "attack.mp3"}, // 播放攻击音效 - /* - {"type": "hide", "loc": [6,6], "time": 150}, // 妖精也闪一下表示收到了伤害 - {"type": "show", "loc": [6,6], "time": 150}, // 妖精也闪一下表示收到了伤害 - */ - {"type": "animate", "name": "thunder", "loc": [6,6]}, - {"type": "sleep", "time": 500}, // 等待500毫秒 - "\t[小妖精,fairy]切,这点伤痛跟他刚才经历的身心地狱相比根本就不算什么。", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]哼!翅膀都被烧焦了还要嘴硬?你难不成真以为我不会对你动真格?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……你这混蛋!给我离她远点!!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]!…你现在受了很严重的致命伤,乱动什么?\n乖。别怕,这里有咱顶着!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]对了,咱再问你一遍,你是很珍惜自己性命的对吧?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]!…等等…妖精小姐,你不会是……?", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]喂,黑暗大法师,你作为魔塔里最博学多识的蠢货,应该对咱妖精族的特殊能力再清楚不过吧?", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]什么?!难不成你是想!!不可能……\n就为了一个渺小的人类,不可理喻!!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]哼哼哼!你害怕的表情可真美味!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]不过比起这个,咱更期待你吃到“妖精自灭冲击”之后的死状哦!~", - {"type": "playSound", "name": "item.mp3"}, - "\t[blackMagician]不!!不应该是这样的!我完美的计划竟然会被一只小小的妖精破坏!", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]不要!……千万不要!……为了我这种人……唔!", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]笨蛋,动都动不了了就不要强撑着站起来了啊。", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]真是的,都到最后一刻了,你这家伙好歹也让咱省点心吧。", - {"type": "playSound", "name": "item.mp3"}, - "\t[小妖精,fairy]那么,再见了……我的勇者大人。", - {"type": "move", "time": 700, "steps": [ // 向上移动三个,撞上黑暗大大法师;本事件的hide会自动被调用 - {"direction": "up", "value": 3} - ]}, - {"type": "playSound", "name": "attack.mp3"}, // 播放攻击音效 - {"type": "sleep", "time": 200}, - "\t[blackMagician]不可能!!!!!", - {"type": "hide", "loc": [6,3]}, // 法师消失 - {"type": "hide", "loc": [4,3]}, // 四个分身消失 - {"type": "hide", "loc": [4,6]}, - {"type": "hide", "loc": [8,6]}, - {"type": "hide", "loc": [8,3]}, - {"type": "changeFloor", "floorId": "sample2", "loc": [6,6], "direction": "up", "time": 1000}, // 更换勇士地点,合计1秒 - {"type": "show", "loc": [6,5]}, // 显示黄宝石 - {"type": "sleep", "time": 200}, // 等待200毫秒 - {"type": "playSound", "name": "item.mp3"}, - {"type": "sleep", "time": 200}, // 等待200毫秒 - "\t[hero]…妖精…小姐……", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……妖精小姐!", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]是梦吗?……不对,为什么我在流泪?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]这颗漂亮的宝石是……?", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]我全都想起来了……妖精小姐为了我……\n牺牲了自己的性命。", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]在这颗宝石上,我能感受到你的温度……\n熟悉而又令人安心,这就是你最后留给我的东西吗……", - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]好温暖……", - {"type": "setValue", "name": "item:yellowJewel", "value": "1"}, // 获得1个黄宝石 - {"type": "hide", "loc": [6,5]}, // 隐藏黄宝石 - {"type": "playSound", "name": "item.mp3"}, - "\t[hero]……", - {"type": "openDoor", "loc": [6,2]}, // 开门 - {"type": "openDoor", "loc": [6,11]} - ] - }, - "6,5": { // 黄宝石 - "enable": false - } - - }, - "changeFloor": { // 楼层转换事件;该事件不能和上面的events有冲突(同位置点),否则会被覆盖 - "6,0": {"floorId": "sample2", "stair": "upFloor"}, - "6,12": {"floorId": "sample1", "stair": "upFloor"} - }, - "afterBattle": { // 战斗后可能触发的事件列表 - "6,4": [ // 和黑暗大法师战斗结束 - "\t[blackMagician]天真!你以为这样就能战胜我吗?", - {"type": "show", "loc": [7,5], "time": 500}, - {"type": "update"}, // 更新地图显伤 - ], - "7,5": [ // 和分身1的战斗 - "\t[blackMagician]你打败的不过是我众多分身中的其中一个而已。", - {"type": "show", "loc": [5,4], "time": 500}, - {"type": "update"}, // 更新地图显伤 - ], - "5,4": [ // 和分身2的战斗 - "\t[blackMagician]你的身体已经伤痕累累了,可我还留有着九成多的魔力。", - {"type": "show", "loc": [5,5], "time": 500}, - {"type": "update"}, // 更新地图显伤 - ], - "5,5": [ // 和分身3的战斗 - "\t[blackMagician]顽固的家伙!放弃抵抗吧!", - {"type": "show", "loc": [7,4], "time": 500}, - {"type": "update"}, // 更新地图显伤 - ], - "7,4": [ // 和分身4的战斗 - "\t[blackMagician]哈哈哈哈!我的灵魂远比你想象的强大!\n我即是永恒!", - {"type": "show", "loc": [6,3], "time": 500}, - {"type": "trigger", "loc": [6,3]} // 显示大法师本尊 - ], - }, - "afterGetItem": { // 获得道具后可能触发的事件列表 - - }, - "afterOpenDoor": { // 开完门后可能触发的事件列表 - - }, - "cannotMove": { // 每个图块不可通行的方向 - // 可以在这里定义每个点不能前往哪个方向,例如悬崖边不能跳下去 - // "x,y": ["up", "left"], // (x,y)点不能往上和左走 - - }, -} - +"floorId": "sample2", +"title": "样板 2 层", +"name": "2", +"canFlyTo": true, +"canUseQuickShop": true, +"cannotViewMap": false, +"defaultGround": "ground", +"images": [], +"item_ratio": 1, +"map": [ + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 1, 1, 45, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], + [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,202,202, 0], + [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +], +"width":26, +"height":26, +"firstArrive": [], +"events": {"3,2":["123"],"12,12":["234"]}, +"changeFloor": {"6,10": {"floorId": "sample1", "stair": "upFloor"}}, +"afterBattle": {}, +"afterGetItem": {}, +"afterOpenDoor": {}, +"cannotMove": {}, +"upFloor": null, +} \ No newline at end of file From b7bd06bd849feab239900d2fd7622787ac48c112 Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Mon, 27 Aug 2018 14:35:47 +0800 Subject: [PATCH 21/29] fix gameCanvas.style in editor-mobile --- libs/maps.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/maps.js b/libs/maps.js index d496a9c7..2e3a9c4f 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -192,6 +192,10 @@ maps.prototype.resizeMap = function(floorId) { core.canvas[cn].canvas.setAttribute("height",cheight); core.canvas[cn].canvas.style.width = cwidth*core.domStyle.scale + "px"; core.canvas[cn].canvas.style.height = cheight*core.domStyle.scale + "px"; + if(main.mode==='editor' && editor.isMobile){ + core.canvas[cn].canvas.style.width = core.bigmap.width*32/416*96 + "vw"; + core.canvas[cn].canvas.style.height = core.bigmap.height*32/416*96 + "vw"; + } }); } From 6f912dfcb2b9b1269354d5ca923fc4a69cd178ee Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Mon, 27 Aug 2018 14:46:08 +0800 Subject: [PATCH 22/29] fix gameCanvas.style in editor-mobile --- libs/control.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libs/control.js b/libs/control.js index 4a3f2468..b98fd7a1 100644 --- a/libs/control.js +++ b/libs/control.js @@ -986,6 +986,12 @@ control.prototype.setGameCanvasTranslate = function(canvas,x,y){ c.style.webkitTransform='translate('+x+'px,'+y+'px)'; c.style.OTransform='translate('+x+'px,'+y+'px)'; c.style.MozTransform='translate('+x+'px,'+y+'px)'; + if(main.mode==='editor' && editor.isMobile){ + c.style.transform='translate('+(x/416*96)+'vw,'+(y/416*96)+'vw)'; + c.style.webkitTransform='translate('+(x/416*96)+'vw,'+(y/416*96)+'vw)'; + c.style.OTransform='translate('+(x/416*96)+'vw,'+(y/416*96)+'vw)'; + c.style.MozTransform='translate('+(x/416*96)+'vw,'+(y/416*96)+'vw)'; + } }; ////// 更新视野范围 ////// From 5e99393cab4d1b25bb710516419f7ea6d56559ce Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Mon, 27 Aug 2018 14:54:48 +0800 Subject: [PATCH 23/29] drawEventBlock : mutli --- _server/editor.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index 4e5c516d..cbb4f6d1 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -202,23 +202,23 @@ editor.prototype.drawEventBlock = function () { fg.clearRect(0, 0, 416, 416); for (var i=0;i<13;i++) { for (var j=0;j<13;j++) { - var color=null; + var color=[]; var loc=(i+core.bigmap.offsetX/32)+","+(j+core.bigmap.offsetY/32); if (core.isset(editor.currentFloorData.events[loc])) - color = '#FF0000'; - else if (core.isset(editor.currentFloorData.changeFloor[loc])) - color = '#00FF00'; - else if (core.isset(editor.currentFloorData.afterBattle[loc])) - color = '#FFFF00'; - else if (core.isset(editor.currentFloorData.afterGetItem[loc])) - color = '#00FFFF'; - else if (core.isset(editor.currentFloorData.afterOpenDoor[loc])) - color = '#FF00FF'; - else if (core.isset(editor.currentFloorData.cannotMove[loc])) - color = '#0000FF'; - if (color!=null) { - fg.fillStyle = color; - fg.fillRect(32*i, 32*j+32-8, 8, 8); + color.push('#FF0000'); + if (core.isset(editor.currentFloorData.changeFloor[loc])) + color.push('#00FF00'); + if (core.isset(editor.currentFloorData.afterBattle[loc])) + color.push('#FFFF00'); + if (core.isset(editor.currentFloorData.afterGetItem[loc])) + color.push('#00FFFF'); + if (core.isset(editor.currentFloorData.afterOpenDoor[loc])) + color.push('#FF00FF'); + if (core.isset(editor.currentFloorData.cannotMove[loc])) + color.push('#0000FF'); + for(var kk=0,cc;cc=color[kk];kk++){ + fg.fillStyle = cc; + fg.fillRect(32*i+8*kk, 32*j+32-8, 8, 8); } } } From e2ce1163ba1db6d00af9636633ef8cb3bff32184 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 27 Aug 2018 16:09:32 +0800 Subject: [PATCH 24/29] Add sample3 --- project/data.js | 2 +- project/floors/sample2.js | 4 +- project/floors/sample3.js | 409 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 project/floors/sample3.js diff --git a/project/data.js b/project/data.js index f01f9468..c6ba374e 100644 --- a/project/data.js +++ b/project/data.js @@ -2,7 +2,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = { "main" : { "floorIds" : [ - "sample0", "sample1", "sample2", "MT0" + "sample0", "sample1", "sample2", "sample3", "MT0" ], "images" : [ "bg.jpg" diff --git a/project/floors/sample2.js b/project/floors/sample2.js index 04dd70aa..1298edef 100644 --- a/project/floors/sample2.js +++ b/project/floors/sample2.js @@ -22,7 +22,7 @@ main.floors.sample2= [ 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [ 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0], - [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], @@ -41,7 +41,7 @@ main.floors.sample2= "height":26, "firstArrive": [], "events": {"3,2":["123"],"12,12":["234"]}, -"changeFloor": {"6,10": {"floorId": "sample1", "stair": "upFloor"}}, +"changeFloor": {"6,10": {"floorId": "sample1", "stair": "upFloor"}, "7,12": {"floorId": "sample3", "stair": "downFloor"}}, "afterBattle": {}, "afterGetItem": {}, "afterOpenDoor": {}, diff --git a/project/floors/sample3.js b/project/floors/sample3.js new file mode 100644 index 00000000..159932da --- /dev/null +++ b/project/floors/sample3.js @@ -0,0 +1,409 @@ +main.floors.sample3 = +{ + "floorId": "sample3", // 这里需要改楼层名,请和文件名及下面的floorId保持完全一致 + // 楼层唯一标识符仅能由字母、数字、下划线组成,且不能由数字开头 + // 推荐用法:第20层就用MT20,第38层就用MT38,地下6层就用MT_6(用下划线代替负号),隐藏3层用MT3h(h表示隐藏),等等 + // 楼层唯一标识符,需要和名字完全一致 + "title": "主塔 40 层", // 楼层中文名 + "name": "40", // 显示在状态栏中的层数 + "canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) + "canUseQuickShop": true, // 该层是否允许使用快捷商店 + "defaultGround": "snowGround", // 默认地面的图块ID(terrains中) + "images": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。 + "color": [255,0,0,0.3], // 该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。 + "weather": ["rain",10], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪,第二项为1-10之间的数代表强度。 + "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。 + "item_ratio": 1, // 该层的宝石/血瓶倍率 + "map": [ // 地图数据,需要是13x13,建议使用地图生成器来生成 + [ 5, 5, 5, 5, 5, 5, 87, 5, 5, 5, 5, 5, 5], + [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], + [ 5, 4, 4, 4, 4, 1, 85, 1, 4, 4, 4, 4, 5], + [ 5, 4, 4, 4,247, 1,247, 1,247, 4, 4, 4, 5], + [ 5, 4, 4, 4, 1,247,247,247, 1, 4, 4, 4, 5], + [ 5, 4, 4, 4, 1,247, 30,247, 1, 4, 4, 4, 5], + [ 5, 4, 4, 4,247, 1,124, 1,247, 4, 4, 4, 5], + [ 5, 4, 4, 4, 4, 1,123, 1, 4, 4, 4, 4, 5], + [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], + [ 5, 4, 4, 4, 4, 1, 0, 1, 4, 4, 4, 4, 5], + [ 5, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 5], + [ 5, 4, 4, 4, 4, 4, 85, 4, 4, 4, 4, 4, 5], + [ 5, 5, 5, 5, 5, 5, 88, 5, 5, 5, 5, 5, 5] + ], + "firstArrive": [ // 第一次到该楼层触发的事件 + "\t[实战!]本楼将尝试复刻《宿命的旋律》40F剧情。" + ], + "events": { // 该楼的所有可能事件列表 + + "6,11": {"enable": false}, // 下楼梯口的机关门,初始处于关闭状态 + "6,10": [ // 进入陷阱后关门 + {"type": "playSound", "name": "door.mp3"}, + {"type": "show", "loc": [6,11]}, // 显示机关门 + {"type": "hide"}, // 隐藏该事件 + {"type": "trigger", "loc": [6,7]}, // 直接引发"6,7"处的事件,即下面的杰克 + // 请再次注意"trigger"会立刻结束当前事件,因此"type":"hide"需要在trigger前调用 + ], + "6,7": [ // 杰克事件 + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]杰克,你究竟是什么人?", + {"type": "playSound", "name": "item.mp3"}, + "\t[杰克,thief]……", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]我们……是朋友对吧?\n是朋友就应该相互信任对吧?", + {"type": "playSound", "name": "item.mp3"}, + "\t[杰克,thief]……事到如今也没有什么好隐瞒的了。", + {"type": "playSound", "name": "item.mp3"}, + "\t[杰克,thief]没错,我就是这一切的背后主谋。", + {"type": "move", "steps": [ // 移动到黑暗大法师的位置;使用move会自动调用hide进行隐藏,无需再手动调用 + {"direction": "up", "value": 3} + ], "time": 1000}, + {"type": "show", "loc": [6,4], "time": 1000}, // 显示黑暗大法师 + {"type": "sleep", "time": 500}, // 等待500毫秒 + // 下面是黑暗大法师的事件 + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]我的真名为——黑暗大法师,第四区域的头目。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]呵呵,不知道为什么,我竟然对事情走到现在这一步毫不感觉意外。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]以杰克的名义利用了你这么久,真是抱歉啊。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]真正的杰克现在在哪里?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]盗贼杰克这个人类从未存在过,他只是我用来接近你的一副皮囊而已。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……这样啊,呵呵。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]为什么你看上去丝毫不生气?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]多亏了鬼帝,我现在的脾气好得连我自己都害怕。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]说起来我还得好好感谢你呢,如果没有杰克……你的帮助,我早就死在第一区域了。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]不论你的目的如何,你的所作所为都是对我有利的。不是吗?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]能够如此淡定的面对背叛,看来跟五年前相比,你确实成长了很多啊。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]五年前?……黑暗大法师,在这之前,我们好像素未谋面吧?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]五年前那场屠城你应该这一生都不会忘记吧。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]很不巧,那场屠城的主谋,也是我。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]这么说,击中我双亲的那道紫色闪电,也就是你释放的吧……", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]你的双亲?这种事情我怎么可能会记得?\n你难道在踩死蚂蚁的时候还会一只只记下他们的样子吗?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]老 子 要 你 的 命", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]你应该对我心怀感激才对,如果不是那时的我看出了你隐藏的稀有勇者体质,你绝对不可能活到今天。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]在暗中动手脚让你通过勇者选拔的人也是我,我一直一直在暗中引导你走到今天这一步。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]是我救赎了一无是处的你。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]为什么只有我一个人活了下来!!!!", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]为什么偏偏是我!!!!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]我刚才不是说过了吗?因为我看出了你有稀有勇者体质啊。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]你刚刚跟鬼帝交过手,应该已经很清楚这稀有勇者体质意味着什么了吧?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……就因为我有这种体质,就不得不背负如此残酷的宿命吗?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]愚蠢!这意味着只要我对你加以引导跟培养,你就能成为这世间实力最强的存在!", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……所以,你究竟想利用我干什么?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]我利用你干的事情,你不是已经完成了吗?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……你说什么?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]不知不觉间,你已经在我的指引下跟鬼帝正面交手并且杀掉了他啊。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]就连我跟鬼帝的对决……也是被你安排好了的?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]你们两个一个是人类勇者,一个是魔物勇者,迟早会有交手的一天。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]我只不过是操纵了一系列的连锁事件让这一天提早了数十年到来而已。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……你这样做对谁有好处?他可是你们魔物世界的救世主啊。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]一个惧怕征战,爱好和平的懦夫,也配叫救世主?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]获得了力量,却只会被动挨打而不主动向人类世界出击,龟缩在第二区域惶惶度日,他根本就不配拥有稀有勇者体质。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]为了不让这种人霸占着积累多年的庞大灵魂能量无作为,我设计让你杀掉了他。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]你没有辜负我的期待,成功战胜了那个废物,现在你体内累积的灵魂能量……也就是魔力,已经达到了能跟魔王匹敌的地步。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……是吗?现在的我能与魔王匹敌?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]不止如此,你现在的力量之强就算是统治世界也是绰绰有余!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]怎么样?要不要加入我的麾下,跟随我去征战人类世界?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]能与魔王匹敌的话,也就是说。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]我 现 在 对 付 你 这 种 杂 碎 也 绰 绰 有 余 吧 ?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]……什么?!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]等一下!别冲动!你先等我把这利害关系理一理——", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]你给老子闭嘴。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]老子什么都不想听。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]老子现在想做的事情只有一件——", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]剁掉你的头,把它放回我双亲的墓前。", + {"type": "update"} // 本事件剧情结束,更新地图显伤 + ], + "6,4": { // 黑暗大法师战斗事件 + "enable": false, // 初始时是禁用状态 + // 打败后将触发afterBattle事件 + }, + "5,4": {"enable":false}, // 大法师的分身们,初始时禁用状态 + "7,4": {"enable":false}, // 大法师的分身们,初始时禁用状态 + "5,5": {"enable":false}, // 大法师的分身们,初始时禁用状态 + "7,5": {"enable":false}, // 大法师的分身们,初始时禁用状态 + "6,3": { // 大法师本尊 + "trigger": "action", // 注意:这里要写 trigger:action ,来覆盖掉系统默认的battle事件。 + "enable":false, + "data": [ + "\t[blackMagician]听不进去人话的蠢货,就要用疼痛来管教!", + {"type": "changePos", "direction": "up"}, + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]出来吧!禁忌——紫电凶杀阵!", + {"type": "show", "loc": [[4,3],[4,6],[8,6],[8,3]], "time": 500}, // 依次显示四个角的法师 + {"type": "sleep", "time": 500}, + "\t[blackMagician]感受绝望吧!冥顽不化的蠢货!", + /* + {"type": "hide", "loc": [4,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [4,3], "time": 150}, + {"type": "hide", "loc": [4,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [4,6], "time": 150}, + {"type": "hide", "loc": [8,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [8,6], "time": 150}, + {"type": "hide", "loc": [8,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [8,3], "time": 150}, + */ + {"type": "animate", "name": "yongchang", "loc": [4,3]}, + {"type": "animate", "name": "yongchang", "loc": [4,6]}, + {"type": "animate", "name": "yongchang", "loc": [8,6]}, + {"type": "animate", "name": "yongchang", "loc": [8,3]}, + {"type": "sleep", "time": 200}, + {"type": "playSound", "name": "attack.mp3"}, // 播放攻击音效 + {"type": "animate", "name": "thunder", "loc": "hero"}, + {"type": "sleep", "time": 200}, + "\t[hero]唔……!!(吐血)", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]我的魔力可是充足的很啊!我会一直折磨到你屈服于我为止!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]人类!好好感受吧!当初你们施加于我的痛苦!如今我要百倍奉还!", + {"type": "show", "loc": [6,6], "time": 1000}, // 显示妖精 + {"type": "sleep", "time": 700}, + {"type": "trigger", "loc": [6,6]} // 立刻触发妖精事件 + ] + }, + "4,3": { // 四个角的大法师, + "trigger": "action", + "displayDamage": false, + "enable":false + }, + "8,3": { // 四个角的大法师, + "trigger": "action", + "displayDamage": false, + "enable":false + }, + "4,6": { // 四个角的大法师, + "trigger": "action", + "displayDamage": false, + "enable":false + }, + "8,6": { // 四个角的大法师, + "trigger": "action", + "displayDamage": false, + "enable":false + }, + + "6,6": { // 妖精 + "enable":false, // 初始时禁用状态 + "data": [ // 妖精事件 + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]…妖精…小姐……是你吗?", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]不要绝望,也不要悲伤。", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]你从来都不是独自一人在前进。", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]咱一直,一直都在注视着你。", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]耍小聪明的你、笨笨的你呆呆的你、胆小的你、勇敢的你帅气的你……全部全部都是你。", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]所以放心吧,无论发生什么,咱都会陪伴在你身边的。", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]因为你要是离开我的话,立刻就会死掉吧?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]…妖精…小姐……其实一直以来,我都非常感激你……", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]笨蛋!都这种时候了就不要作出像是临终遗言的发言了啊!!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]喂!那边穿衣品味差到极点的黑暗大法师,别左顾右盼说的就是你!你应该知道咱的身份吧?\n还不速速退下!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]可恶…多管闲事的妖精族…明明只要再让他承受一点疼痛来瓦解他的意志力,我的计划就成功了!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]哼哼哼~抱歉哦,这个笨蛋的意志力可不像你想象的那么薄弱哦!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]不甘心!我不甘心!妖精公主又如何!\n只要是阻挡我的,不管是谁我都要铲除!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]终于露出狐狸尾巴了,其实咱早就看出你有谋反的念头。你的计划就是拉拢这家伙入伙然后推翻魔王对魔塔的统治对吧?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]呵呵呵……那个昏庸的魔王,掌握着那么庞大的魔物军队却只知道固守魔塔,而不主动侵略人类世界扩张领土!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]我实在是看不过眼,所以我才决定把这个具备稀有勇者体质的家伙培养成新一任魔王!\n来让这个世界的势力重新洗牌!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]你觉得一个满脑子想着回家种田的废柴勇者会成为改变世界的魔王?你晃晃脑袋试试,是不是能听到大海的声音?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]恼人至极的妖精族!呵呵呵……我干脆一不做二不休,连你也一块收拾了吧!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]别小瞧咱!咱好歹也是妖精族里实力数一数二的存在!", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]只会耍嘴皮子的恼人苍蝇!我倒要看看一块焦炭会不会说话!\n——招雷弹!!", + /* + {"type": "hide", "loc": [4,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [4,3], "time": 150}, + {"type": "hide", "loc": [4,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [4,6], "time": 150}, + {"type": "hide", "loc": [8,6], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [8,6], "time": 150}, + {"type": "hide", "loc": [8,3], "time": 150}, // 由于没有动画效果,暂时使用“闪一下”表示 + {"type": "show", "loc": [8,3], "time": 150}, + */ + {"type": "animate", "name": "yongchang", "loc": [4,3]}, + {"type": "animate", "name": "yongchang", "loc": [4,6]}, + {"type": "animate", "name": "yongchang", "loc": [8,6]}, + {"type": "animate", "name": "yongchang", "loc": [8,3]}, + {"type": "playSound", "name": "attack.mp3"}, // 播放攻击音效 + /* + {"type": "hide", "loc": [6,6], "time": 150}, // 妖精也闪一下表示收到了伤害 + {"type": "show", "loc": [6,6], "time": 150}, // 妖精也闪一下表示收到了伤害 + */ + {"type": "animate", "name": "thunder", "loc": [6,6]}, + {"type": "sleep", "time": 500}, // 等待500毫秒 + "\t[小妖精,fairy]切,这点伤痛跟他刚才经历的身心地狱相比根本就不算什么。", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]哼!翅膀都被烧焦了还要嘴硬?你难不成真以为我不会对你动真格?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……你这混蛋!给我离她远点!!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]!…你现在受了很严重的致命伤,乱动什么?\n乖。别怕,这里有咱顶着!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]对了,咱再问你一遍,你是很珍惜自己性命的对吧?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]!…等等…妖精小姐,你不会是……?", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]喂,黑暗大法师,你作为魔塔里最博学多识的蠢货,应该对咱妖精族的特殊能力再清楚不过吧?", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]什么?!难不成你是想!!不可能……\n就为了一个渺小的人类,不可理喻!!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]哼哼哼!你害怕的表情可真美味!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]不过比起这个,咱更期待你吃到“妖精自灭冲击”之后的死状哦!~", + {"type": "playSound", "name": "item.mp3"}, + "\t[blackMagician]不!!不应该是这样的!我完美的计划竟然会被一只小小的妖精破坏!", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]不要!……千万不要!……为了我这种人……唔!", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]笨蛋,动都动不了了就不要强撑着站起来了啊。", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]真是的,都到最后一刻了,你这家伙好歹也让咱省点心吧。", + {"type": "playSound", "name": "item.mp3"}, + "\t[小妖精,fairy]那么,再见了……我的勇者大人。", + {"type": "move", "time": 700, "steps": [ // 向上移动三个,撞上黑暗大大法师;本事件的hide会自动被调用 + {"direction": "up", "value": 3} + ]}, + {"type": "playSound", "name": "attack.mp3"}, // 播放攻击音效 + {"type": "sleep", "time": 200}, + "\t[blackMagician]不可能!!!!!", + {"type": "hide", "loc": [6,3]}, // 法师消失 + {"type": "hide", "loc": [4,3]}, // 四个分身消失 + {"type": "hide", "loc": [4,6]}, + {"type": "hide", "loc": [8,6]}, + {"type": "hide", "loc": [8,3]}, + {"type": "changeFloor", "floorId": "sample2", "loc": [6,6], "direction": "up", "time": 1000}, // 更换勇士地点,合计1秒 + {"type": "show", "loc": [6,5]}, // 显示黄宝石 + {"type": "sleep", "time": 200}, // 等待200毫秒 + {"type": "playSound", "name": "item.mp3"}, + {"type": "sleep", "time": 200}, // 等待200毫秒 + "\t[hero]…妖精…小姐……", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……妖精小姐!", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]是梦吗?……不对,为什么我在流泪?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]这颗漂亮的宝石是……?", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]我全都想起来了……妖精小姐为了我……\n牺牲了自己的性命。", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]在这颗宝石上,我能感受到你的温度……\n熟悉而又令人安心,这就是你最后留给我的东西吗……", + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]好温暖……", + {"type": "setValue", "name": "item:yellowJewel", "value": "1"}, // 获得1个黄宝石 + {"type": "hide", "loc": [6,5]}, // 隐藏黄宝石 + {"type": "playSound", "name": "item.mp3"}, + "\t[hero]……", + {"type": "openDoor", "loc": [6,2]}, // 开门 + {"type": "openDoor", "loc": [6,11]} + ] + }, + "6,5": { // 黄宝石 + "enable": false + } + + }, + "changeFloor": { // 楼层转换事件;该事件不能和上面的events有冲突(同位置点),否则会被覆盖 + "6,0": {"floorId": "sample3", "stair": "upFloor"}, + "6,12": {"floorId": "sample2", "stair": "upFloor"} + }, + "afterBattle": { // 战斗后可能触发的事件列表 + "6,4": [ // 和黑暗大法师战斗结束 + "\t[blackMagician]天真!你以为这样就能战胜我吗?", + {"type": "show", "loc": [7,5], "time": 500}, + {"type": "update"}, // 更新地图显伤 + ], + "7,5": [ // 和分身1的战斗 + "\t[blackMagician]你打败的不过是我众多分身中的其中一个而已。", + {"type": "show", "loc": [5,4], "time": 500}, + {"type": "update"}, // 更新地图显伤 + ], + "5,4": [ // 和分身2的战斗 + "\t[blackMagician]你的身体已经伤痕累累了,可我还留有着九成多的魔力。", + {"type": "show", "loc": [5,5], "time": 500}, + {"type": "update"}, // 更新地图显伤 + ], + "5,5": [ // 和分身3的战斗 + "\t[blackMagician]顽固的家伙!放弃抵抗吧!", + {"type": "show", "loc": [7,4], "time": 500}, + {"type": "update"}, // 更新地图显伤 + ], + "7,4": [ // 和分身4的战斗 + "\t[blackMagician]哈哈哈哈!我的灵魂远比你想象的强大!\n我即是永恒!", + {"type": "show", "loc": [6,3], "time": 500}, + {"type": "trigger", "loc": [6,3]} // 显示大法师本尊 + ], + }, + "afterGetItem": { // 获得道具后可能触发的事件列表 + + }, + "afterOpenDoor": { // 开完门后可能触发的事件列表 + + }, + "cannotMove": { // 每个图块不可通行的方向 + // 可以在这里定义每个点不能前往哪个方向,例如悬崖边不能跳下去 + // "x,y": ["up", "left"], // (x,y)点不能往上和左走 + + }, +} From 1a2b797859469fef4906ca54855945e85d0e2398 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 27 Aug 2018 16:11:53 +0800 Subject: [PATCH 25/29] Add sample3 --- project/floors/sample3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/floors/sample3.js b/project/floors/sample3.js index 159932da..57acd0d2 100644 --- a/project/floors/sample3.js +++ b/project/floors/sample3.js @@ -333,7 +333,7 @@ main.floors.sample3 = {"type": "hide", "loc": [4,6]}, {"type": "hide", "loc": [8,6]}, {"type": "hide", "loc": [8,3]}, - {"type": "changeFloor", "floorId": "sample2", "loc": [6,6], "direction": "up", "time": 1000}, // 更换勇士地点,合计1秒 + {"type": "changeFloor", "floorId": "sample3", "loc": [6,6], "direction": "up", "time": 1000}, // 更换勇士地点,合计1秒 {"type": "show", "loc": [6,5]}, // 显示黄宝石 {"type": "sleep", "time": 200}, // 等待200毫秒 {"type": "playSound", "name": "item.mp3"}, From 6471f61e359c1faaac44c6964cd72f203e7b6aa8 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 27 Aug 2018 17:21:05 +0800 Subject: [PATCH 26/29] Show PZF on status bar --- _server/data.comment.js | 6 +++++ editor-mobile.html | 7 +++++- editor.html | 7 +++++- index.html | 5 +++++ libs/actions.js | 50 +++++++++++++++++++++++++++++++---------- libs/control.js | 11 +++++++++ libs/ui.js | 6 +++-- main.js | 4 ++++ project/data.js | 1 + styles.css | 2 +- 更新说明.txt | 4 ++++ 11 files changed, 86 insertions(+), 17 deletions(-) diff --git a/_server/data.comment.js b/_server/data.comment.js index 760450e8..acfae9fc 100644 --- a/_server/data.comment.js +++ b/_server/data.comment.js @@ -426,6 +426,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_bool": "bool", "_data": "是否在状态栏显示三色钥匙数量" }, + "enablePZF": { + "_leaf": true, + "_type": "checkbox", + "_bool": "bool", + "_data": "是否在状态栏显示破炸飞数量" + }, "enableDebuff": { "_leaf": true, "_type": "checkbox", diff --git a/editor-mobile.html b/editor-mobile.html index 73bc757a..fc364e5e 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -372,11 +372,16 @@

-
+
+
+ + + +
diff --git a/editor.html b/editor.html index 32610082..fddc72c2 100644 --- a/editor.html +++ b/editor.html @@ -357,11 +357,16 @@

-
+
+
+ + + +
diff --git a/index.html b/index.html index 52b69439..32b05a58 100644 --- a/index.html +++ b/index.html @@ -87,6 +87,11 @@
+
+ + + +
diff --git a/libs/actions.js b/libs/actions.js index a667031c..2d9d4660 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -13,7 +13,8 @@ actions.prototype.init = function () { ////// 按下某个键时 ////// actions.prototype.onkeyDown = function (e) { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) return; + if (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.isset(core.status.holdingKeys))core.status.holdingKeys=[]; var isArrow={37:true,38:true,39:true,40:true}[e.keyCode] if(isArrow && !core.status.lockControl){ @@ -32,7 +33,8 @@ actions.prototype.onkeyDown = function (e) { ////// 放开某个键时 ////// actions.prototype.onkeyUp = function(e) { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) { + if (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') { if (e.keyCode==27) // ESCAPE core.stopReplay(); else if (e.keyCode==90) // Z @@ -47,6 +49,8 @@ actions.prototype.onkeyUp = function(e) { core.saveReplay(); else if (e.keyCode==67) core.bookReplay(); + else if (e.keyCode==33||e.keyCode==34) + core.viewMapReplay(); return; } @@ -77,7 +81,8 @@ actions.prototype.pressKey = function (keyCode) { ////// 根据按下键的code来执行一系列操作 ////// actions.prototype.keyDown = function(keyCode) { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) return; + if (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) { // Ctrl跳过对话 if (keyCode==17) { @@ -171,8 +176,8 @@ actions.prototype.keyDown = function(keyCode) { ////// 根据放开键的code来执行一系列操作 ////// actions.prototype.keyUp = function(keyCode, fromReplay) { - if (!fromReplay&&core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) - return; + if (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 = []; @@ -393,7 +398,8 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { ////// 点击(触摸)事件按下时 ////// actions.prototype.ondown = function (x ,y) { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) return; + if (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.played || core.status.lockControl) { this.onclick(x, y, []); if (core.timeout.onDownTimeout==null) { @@ -421,7 +427,8 @@ actions.prototype.ondown = function (x ,y) { ////// 当在触摸屏上滑动时 ////// actions.prototype.onmove = function (x ,y) { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) return; + if (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.holdingPath==0){return;} //core.status.mouseOutCheck =1; var pos={'x':x,'y':y}; @@ -445,7 +452,8 @@ actions.prototype.onmove = function (x ,y) { ////// 当点击(触摸)事件放开时 ////// actions.prototype.onup = function () { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) return; + if (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; clearTimeout(core.timeout.onDownTimeout); core.timeout.onDownTimeout = null; @@ -508,7 +516,8 @@ actions.prototype.getClickLoc = function (x, y) { ////// 具体点击屏幕上(x,y)点时,执行的操作 ////// actions.prototype.onclick = function (x, y, stepPostfix) { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) return; + if (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; // console.log("Click: (" + x + "," + y + ")"); stepPostfix=stepPostfix||[]; @@ -650,7 +659,8 @@ actions.prototype.onclick = function (x, y, stepPostfix) { ////// 滑动鼠标滚轮时的操作 ////// actions.prototype.onmousewheel = function (direct) { - if (core.isset(core.status.replay)&&core.status.replay.replaying&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0) return; + if (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; // 向下滚动是 -1 ,向上是 1 // 楼层飞行器 @@ -1379,8 +1389,17 @@ actions.prototype.clickSL = function(x,y) { } // 删除 if (x>=0 && x<=2 && y==12) { - core.status.event.selection=!core.status.event.selection; - core.ui.drawSLPanel(index); + + if (core.status.event.id=='save') { + core.status.event.selection=!core.status.event.selection; + core.ui.drawSLPanel(index); + } + else { + var index = parseInt(prompt("请输入读档编号"))||0; + if (index>0) { + core.doSL(index, core.status.event.id); + } + } return; } @@ -1485,6 +1504,13 @@ actions.prototype.keyUpSL = function (keycode) { } return; } + if (keycode==69 && core.status.event.id == 'load') { // E + var index = parseInt(prompt("请输入读档编号"))||0; + if (index>0) { + core.doSL(index, core.status.event.id); + } + return; + } if (keycode==46) { if (offset==0) { core.drawTip("无法删除自动存档!"); diff --git a/libs/control.js b/libs/control.js index b98fd7a1..0fdffd9e 100644 --- a/libs/control.js +++ b/libs/control.js @@ -2600,6 +2600,11 @@ control.prototype.updateStatusBar = function () { core.statusBar.weak.innerHTML = core.hasFlag('weak')?"衰":""; core.statusBar.curse.innerHTML = core.hasFlag('curse')?"咒":""; } + if (core.flags.enablePZF) { + core.statusBar.pickaxe.innerHTML = "破"+core.itemCount('pickaxe'); + core.statusBar.bomb.innerHTML = "炸"+core.itemCount('bomb'); + core.statusBar.fly.innerHTML = "飞"+core.itemCount('centerFly'); + } core.statusBar.hard.innerHTML = core.status.hard; @@ -2983,6 +2988,12 @@ control.prototype.resize = function(clientWidth, clientHeight) { display: !core.isset(core.flags.enableKeys)||core.flags.enableKeys?'block':'none' } }, + { + id: 'pzfCol', + rules: { + display: core.flags.enablePZF?'block':'none' + } + }, { 'id': 'debuffCol', rules: { diff --git a/libs/ui.js b/libs/ui.js index 73af00ee..1d80b92c 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1755,8 +1755,10 @@ ui.prototype.drawSLPanel = function(index) { if (core.status.event.selection) core.setFillStyle('ui', '#FF6A6A'); - core.fillText('ui', '删除模式', 48, 403); - + if (core.status.event.id=='save') + core.fillText('ui', '删除模式', 48, 403); + else + core.fillText('ui', '输入编号', 48, 403); } ////// 绘制一个缩略图 ////// diff --git a/main.js b/main.js index 1a2a649f..dcb07fb5 100644 --- a/main.js +++ b/main.js @@ -59,6 +59,7 @@ function main() { 'expCol': document.getElementById('expCol'), 'upCol': document.getElementById('upCol'), 'keyCol': document.getElementById('keyCol'), + 'pzfCol': document.getElementById('pzfCol'), 'debuffCol': document.getElementById('debuffCol'), 'hard': document.getElementById('hard'), }; @@ -134,6 +135,9 @@ function main() { 'poison': document.getElementById('poison'), 'weak':document.getElementById('weak'), 'curse': document.getElementById('curse'), + 'pickaxe': document.getElementById('pickaxe'), + 'bomb': document.getElementById('bomb'), + 'fly': document.getElementById('fly'), 'hard': document.getElementById("hard") } this.floors = {} diff --git a/project/data.js b/project/data.js index c6ba374e..188651f5 100644 --- a/project/data.js +++ b/project/data.js @@ -142,6 +142,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "enableExperience": false, "enableLevelUp": false, "enableKeys": true, + "enablePZF": true, "enableDebuff": false, "flyNearStair": true, "pickaxeFourDirections": false, diff --git a/styles.css b/styles.css index 0983974a..05637e6c 100644 --- a/styles.css +++ b/styles.css @@ -222,7 +222,7 @@ p#hard { margin: 0 6px 6px 0; } -span#poison, span#weak, span#curse { +span#poison, span#weak, span#curse, span#pickaxe, span#bomb, span#fly { font-style: normal; font-size: 1em; } diff --git a/更新说明.txt b/更新说明.txt index 5e78abec..5fa96440 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -2,6 +2,10 @@ 大地图的支持 修复超大数值领域导致自动寻路卡死的问题 +同点多事件的颜色块绘制 +录像播放时可以按PgUp/PgDn浏览地图 +可以在读档时E键直接指定编号 +破炸飞可以在状态栏显示个数 部分细节优化 ----------------------------------------------------------------------- From 6c515ffb7d14f4a8f6f6bb5904f7fd3b3dbeda2e Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 27 Aug 2018 17:43:34 +0800 Subject: [PATCH 27/29] View map while replaying --- editor-mobile.html | 4 ++-- editor.html | 4 ++-- index.html | 4 ++-- libs/actions.js | 6 +++++- libs/control.js | 48 +++++++++++++++++++++++++++++++++++----------- libs/core.js | 6 ++++++ project/data.js | 2 +- 7 files changed, 55 insertions(+), 19 deletions(-) diff --git a/editor-mobile.html b/editor-mobile.html index fc364e5e..70d5f8b0 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -378,8 +378,8 @@
- - + +
diff --git a/editor.html b/editor.html index fddc72c2..30ce7708 100644 --- a/editor.html +++ b/editor.html @@ -363,8 +363,8 @@
- - + +
diff --git a/index.html b/index.html index 32b05a58..7b07028a 100644 --- a/index.html +++ b/index.html @@ -88,8 +88,8 @@
- - + +
diff --git a/libs/actions.js b/libs/actions.js index 2d9d4660..20419c23 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1048,7 +1048,11 @@ actions.prototype.keyUpViewMaps = function (keycode) { core.ui.closePanel(); } if (keycode==88) { - core.openBook(false); + if (core.isset(core.status.replay)&&core.status.replay.replaying) { + core.bookReplay(); + } else { + core.openBook(false); + } } return; } diff --git a/libs/control.js b/libs/control.js index 0fdffd9e..19fa9a56 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1720,14 +1720,14 @@ control.prototype.startReplay = function (list) { ////// 更改播放状态 ////// control.prototype.triggerReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (core.status.replay.pausing) this.resumeReplay(); else this.pauseReplay(); } ////// 暂停播放 ////// control.prototype.pauseReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (!core.status.replay.replaying) return; core.status.replay.pausing = true; core.updateStatusBar(); @@ -1736,7 +1736,7 @@ control.prototype.pauseReplay = function () { ////// 恢复播放 ////// control.prototype.resumeReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (!core.status.replay.replaying) return; core.status.replay.pausing = false; core.updateStatusBar(); @@ -1746,7 +1746,7 @@ control.prototype.resumeReplay = function () { ////// 加速播放 ////// control.prototype.speedUpReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (!core.status.replay.replaying) return; var toAdd = core.status.replay.speed>=3?3:core.status.replay.speed>=2?2:1; core.status.replay.speed = parseInt(10*core.status.replay.speed + toAdd)/10; @@ -1756,7 +1756,7 @@ control.prototype.speedUpReplay = function () { ////// 减速播放 ////// control.prototype.speedDownReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (!core.status.replay.replaying) return; var toAdd = core.status.replay.speed>3?3:core.status.replay.speed>2?2:1; core.status.replay.speed = parseInt(10*core.status.replay.speed - toAdd)/10; @@ -1766,7 +1766,7 @@ control.prototype.speedDownReplay = function () { ////// 停止播放 ////// control.prototype.stopReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (!core.status.replay.replaying) return; core.status.replay.toReplay = []; core.status.replay.totalList = []; @@ -1781,7 +1781,7 @@ control.prototype.stopReplay = function () { ////// 回退 ////// control.prototype.rewindReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (!core.status.replay.replaying) return; if (!core.status.replay.pausing) { core.drawTip("请先暂停录像"); @@ -1816,7 +1816,7 @@ control.prototype.rewindReplay = function () { ////// 回放时存档 ////// control.prototype.saveReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; if (!core.status.replay.replaying) return; if (!core.status.replay.pausing) { core.drawTip("请先暂停录像"); @@ -1837,7 +1837,33 @@ control.prototype.saveReplay = function () { ////// 回放时查看怪物手册 ////// control.prototype.bookReplay = function () { - if (core.status.event.id=='save' || core.status.event.id=='book') return; + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0) return; + if (!core.status.replay.replaying) return; + if (!core.status.replay.pausing) { + core.drawTip("请先暂停录像"); + return; + } + + // 从“浏览地图”页面打开 + if (core.status.event.id=='viewMaps') { + core.status.event.selection = core.status.event.data; + core.status.event.id=null; + } + + if (core.status.replay.animate || core.isset(core.status.event.id)) { + core.drawTip("请等待当前事件的处理结束"); + return; + } + + core.lockControl(); + core.status.event.id='book'; + core.useItem('book'); +} + +////// 回放录像时浏览地图 ////// +control.prototype.viewMapReplay = function () { + if (core.status.event.id=='save' || (core.status.event.id||"").indexOf('book')==0 || core.status.event.id=='viewMaps') return; + if (!core.status.replay.replaying) return; if (!core.status.replay.pausing) { core.drawTip("请先暂停录像"); @@ -1849,8 +1875,8 @@ control.prototype.bookReplay = function () { } core.lockControl(); - core.status.event.id='book'; - core.useItem('book'); + core.status.event.id='viewMaps'; + core.ui.drawMaps(); } ////// 回放 ////// diff --git a/libs/core.js b/libs/core.js index 8bca255a..0d8298c5 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1002,10 +1002,16 @@ core.prototype.saveReplay = function () { core.control.saveReplay(); } +////// 回放时查看怪物手册 ////// core.prototype.bookReplay = function () { core.control.bookReplay(); } +////// 回放录像时浏览地图 ////// +core.prototype.viewMapReplay = function () { + core.control.viewMapReplay(); +} + ////// 回放 ////// core.prototype.replay = function () { core.control.replay(); diff --git a/project/data.js b/project/data.js index 188651f5..e8af415f 100644 --- a/project/data.js +++ b/project/data.js @@ -142,7 +142,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "enableExperience": false, "enableLevelUp": false, "enableKeys": true, - "enablePZF": true, + "enablePZF": false, "enableDebuff": false, "flyNearStair": true, "pickaxeFourDirections": false, From 2005f5059fa117f29f902fcaad8d44d7b688ee96 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 27 Aug 2018 17:52:18 +0800 Subject: [PATCH 28/29] setValue name --- _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 3a19e2ac..d4839b8e 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -342,7 +342,7 @@ return code; */; setValue_s - : '变量设置' ':' '名称' idString_e '值' expression Newline + : '数值操作' ':' '名称' idString_e '值' expression Newline /* setValue_s From 615002dfc3f73d749810bba971f216c03921615a Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 27 Aug 2018 18:04:32 +0800 Subject: [PATCH 29/29] Update functions.js --- project/functions.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/project/functions.js b/project/functions.js index 0ed6ad5e..044b688f 100644 --- a/project/functions.js +++ b/project/functions.js @@ -149,7 +149,6 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 删除该块 if (core.isset(x) && core.isset(y)) { core.removeBlock(x, y); - core.canvas.event.clearRect(32 * x, 32 * y, 32, 32); } // 毒衰咒的处理 @@ -209,6 +208,15 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.unshift(todo, core.events.addPoint(core.material.enemys[enemyId])); } + // 在这里增加其他的自定义事件需求 + /* + if (enemyId=='xxx') { + core.unshift(todo, [ + {"type": "...", ...}, + ]); + } + */ + // 如果事件不为空,将其插入 if (todo.length>0) { core.events.insertAction(todo,x,y); @@ -322,7 +330,7 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = [8, "反击", "战斗时,怪物每回合附加角色攻击的"+Math.floor(100*core.values.counterAttack||0)+"%作为伤害,无视角色防御"], [9, "净化", "战斗前,怪物附加勇士魔防的"+core.values.purify+"倍作为伤害"], [10, "模仿", "怪物的攻防和勇士攻防相等"], - [11, "吸血", function (enemy) {return "吸血:战斗前,怪物首先吸取角色的"+Math.floor(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":"");}], + [11, "吸血", function (enemy) {return "战斗前,怪物首先吸取角色的"+Math.floor(100*enemy.value||0)+"%生命作为伤害"+(enemy.add?",并把伤害数值加到自身生命上":"");}], [12, "中毒", "战斗后,勇士陷入中毒状态,每一步损失生命"+core.values.poisonDamage+"点"], [13, "衰弱", "战斗后,勇士陷入衰弱状态,攻防暂时下降"+(core.values.weakValue>=1?core.values.weakValue+"点":parseInt(core.values.weakValue*100)+"%")], [14, "诅咒", "战斗后,勇士陷入诅咒状态,战斗无法获得金币和经验"],