From d5bdb1f49a081f11eef7d1418ed3cdaebb9b807e Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 31 May 2020 13:08:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=AD=98=E8=AF=BB=E6=A1=A3?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/MotaActionParser.js | 4 +- _server/editor_game.js | 2 +- libs/maps.js | 81 ++++++++++++++----------------------- libs/ui.js | 2 +- project/functions.js | 3 +- project/plugins.js | 4 +- 6 files changed, 38 insertions(+), 58 deletions(-) diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index 9d012679..ffa74fa7 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -1329,7 +1329,7 @@ MotaActionFunctions.replaceToName = function (str) { str = str.replace(new RegExp("item:(" + list.join("|") + ")\\b", "g"), function (a, b) { return map[b] ? ("物品:" + map[b]) : b; }).replace(/item:/g, "物品:"); - str = str.replace(/flag:/g, "变量:").replace(/switch:/g, "独立开关:").replace(/global:/g, "全局存储:").replace(/temp:/g, "临时变量:"); + str = str.replace(/flag:/g, "变量:").replace(/switch:/g, "独立开关:").replace(/global:/g, "全局存储:"); MotaActionFunctions.pattern.replaceEnemyValueList.forEach(function (v) { @@ -1367,7 +1367,7 @@ MotaActionFunctions.replaceFromName = function (str) { str = str.replace(new RegExp("物品[::](" + list.join("|") + ")(?:$|(?=[^\\w\\u4e00-\\u9fa5]))", "g"), function (a, b) { return map[b] ? ("item:" + map[b]) : b; }).replace(/物品[::]/g, "item:"); - str = str.replace(/临时变量[::]/g, "temp d:").replace(/变量[::]/g, "flag:").replace(/独立开关[::]/g, "switch:").replace(/全局存储[::]/g, "global:"); + str = str.replace(/变量[::]/g, "flag:").replace(/独立开关[::]/g, "switch:").replace(/全局存储[::]/g, "global:"); map = {}; list = []; MotaActionFunctions.pattern.replaceEnemyList.forEach(function (v) { diff --git a/_server/editor_game.js b/_server/editor_game.js index a62f54a4..c267511b 100644 --- a/_server/editor_game.js +++ b/_server/editor_game.js @@ -135,7 +135,7 @@ editor_game_wrapper = function (editor, main, core) { // 获取当前地图 editor_game.prototype.fetchMapFromCore = function () { - var mapArray = core.getMapArray(core.status.floorId, true); + var mapArray = core.getMapArray(core.status.floorId); editor.map = mapArray.map(function (v) { return v.map(function (v) { var x = parseInt(v), y = editor.indexs[x]; diff --git a/libs/maps.js b/libs/maps.js index e3541890..5b8ea85c 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -61,7 +61,7 @@ maps.prototype.loadFloor = function (floorId, map) { } /// 根据需求解析出blocks -maps.prototype.extractBlocks = function (map) { +maps.prototype.extractBlocks = function (map, flags) { map = map || core.status.floorId; if (typeof map == 'string') map = (core.status.maps||{})[map]; if (!map) return; @@ -71,16 +71,16 @@ maps.prototype.extractBlocks = function (map) { return; } var floorId = map.floorId; - map.blocks = this._mapIntoBlocks(this.decompressMap(map.map, floorId), core.floors[floorId], floorId); + map.blocks = this._mapIntoBlocks(this.decompressMap(map.map, floorId), core.floors[floorId], floorId, flags); } -maps.prototype._mapIntoBlocks = function (map, floor, floorId) { +maps.prototype._mapIntoBlocks = function (map, floor, floorId, flags) { var blocks = []; var mw = core.floors[floorId].width; var mh = core.floors[floorId].height; for (var i = 0; i < mh; i++) { for (var j = 0; j < mw; j++) { - var block = this.initBlock(j, i, (map[i] || [])[j], true, floor); + var block = this.initBlock(j, i, (map[i] || [])[j], true, floor, flags); if (block.id != 0 || block.event.trigger) blocks.push(block); } @@ -129,12 +129,12 @@ maps.prototype.getIdOfThis = function (id) { } ////// 数字和ID的对应关系 ////// -maps.prototype.initBlock = function (x, y, id, addInfo, eventFloor) { +maps.prototype.initBlock = function (x, y, id, addInfo, eventFloor, flags) { var disable = null; - id = "" + (id || 0); - if (id.endsWith(":f")) disable = true; - if (id.endsWith(":t")) disable = false; - id = parseInt(id); + if (eventFloor != null) { + if (flags == null) flags = (core.status.hero || {}).flags || {}; + disable = flags[[eventFloor.floorId, x, y, 'md'].join('@')]; + } var block = {'x': x, 'y': y, 'id': id}; if (disable != null) block.disable = disable; @@ -221,30 +221,9 @@ maps.prototype._initMaps = function () { return maps; } -maps.prototype._initFloorMap = function (floorId) { - var map = core.clone(core.floors[floorId].map); - - var mw = core.floors[floorId].width; - var mh = core.floors[floorId].height; - - for (var x = 0; x < mh; x++) { - if (map[x] == null) map[x] = []; - for (var y = 0; y < mw; y++) { - if (map[x][y] == null) map[x][y] = 0; - // check "disable" - var event = core.floors[floorId].events[y + "," + x]; - if (event && event.enable === false && main.mode == 'play') { - map[x][y] += ":f"; - } - } - } - - return map; -} - ////// 压缩地图 maps.prototype.compressMap = function (mapArr, floorId) { - var floorMap = this._initFloorMap(floorId); + var floorMap = core.floors[floorId].map; if (core.utils.same(mapArr, floorMap)) return null; var mw = core.floors[floorId].width; @@ -268,14 +247,14 @@ maps.prototype.compressMap = function (mapArr, floorId) { ////// 解压缩地图 maps.prototype.decompressMap = function (mapArr, floorId) { - var floorMap = this._initFloorMap(floorId); - if (!mapArr) return floorMap; + var floorMap = core.floors[floorId].map; + if (!mapArr) return core.clone(floorMap); var mw = core.floors[floorId].width; var mh = core.floors[floorId].height; for (var x = 0; x < mh; x++) { if (mapArr[x] === 0) { - mapArr[x] = floorMap[x]; + mapArr[x] = core.clone(floorMap[x]); } else { for (var y = 0; y < mw; y++) { @@ -307,7 +286,7 @@ maps.prototype.saveMap = function (floorId) { var map = maps[floorId]; var thisFloor = this._compressFloorData(map, core.floors[floorId]); if (map.blocks) { - var mapArr = this.compressMap(this._getMapArrayFromBlocks(map.blocks, map.width, map.height, true), floorId); + var mapArr = this.compressMap(this._getMapArrayFromBlocks(map.blocks, map.width, map.height), floorId); if (mapArr != null) thisFloor.map = mapArr; } return thisFloor; @@ -359,29 +338,21 @@ maps.prototype.resizeMap = function (floorId) { } ////// 将当前地图重新变成二维数组形式 ////// -maps.prototype.getMapArray = function (floorId, showDisable) { +maps.prototype.getMapArray = function (floorId) { floorId = floorId || core.status.floorId; var map = core.status.maps[floorId]; if (!map.blocks) return map.map; - return this._getMapArrayFromBlocks(map.blocks, map.width, map.height, showDisable); + return this._getMapArrayFromBlocks(map.blocks, map.width, map.height); } -maps.prototype._getMapArrayFromBlocks = function (blockArray, width, height, showDisable) { +maps.prototype._getMapArrayFromBlocks = function (blockArray, width, height) { var blocks = []; var allzero = []; for (var y = 0; y < width; y++) allzero.push(0); for (var x = 0; x < height; x++) blocks.push(core.clone(allzero)); blockArray.forEach(function (block) { - var x = block.x, y = block.y; - if (block.disable) { - if (showDisable) blocks[y][x] = block.id + ":f"; - } - else { - blocks[y][x] = block.id; - if (showDisable && block.disable === false) - blocks[y][x] = block.id + ":t"; - } + blocks[block.y][block.x] = block.id; }); return blocks; } @@ -414,8 +385,8 @@ maps.prototype._getBgFgMapArray = function (name, floorId, noCache) { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { arr[y] = arr[y] || []; - var flag = "__" + name + "Map__" + floorId + "_" + x + "_" + y; - var vFlag = "__" + name + "Value__" + floorId + "_" + x + "_" + y; + var flag = [floorId, x, y, name+'_disable'].join('@'); + var vFlag = [floorId, x, y, name+'_value'].join('@'); if (core.hasFlag(flag)) arr[y][x] = 0; else arr[y][x] = core.getFlag(vFlag, arr[y][x] || 0); if (main.mode == 'editor') arr[y][x] = arr[y][x].idnum || arr[y][x] || 0; @@ -1437,6 +1408,7 @@ maps.prototype.showBlock = function (x, y, floorId) { // 本身是禁用事件,启用之 if (block.disable) { block.disable = false; + core.setFlag([floorId, x, y, 'md'].join('@'), false); // 在本层,添加动画 if (floorId == core.status.floorId) { if (block.event.cls == 'autotile') { @@ -1471,6 +1443,7 @@ maps.prototype.hideBlockByIndex = function (index, floorId) { core.extractBlocks(floorId); var blocks = core.status.maps[floorId].blocks, block = blocks[index]; block.disable = true; + core.setFlag([floorId, block.x, block.y, 'md'].join('@'), true); } ////// 一次性隐藏多个block ////// @@ -1519,6 +1492,7 @@ maps.prototype.removeBlockByIndex = function (index, floorId) { core.extractBlocks(floorId); var blocks = core.status.maps[floorId].blocks, block = blocks[index]; blocks.splice(index, 1); + core.setFlag([floorId, block.x, block.y, 'md'].join('@'), true); } ////// 一次性删除多个block ////// @@ -1552,7 +1526,7 @@ maps.prototype._triggerBgFgMap = function (type, name, loc, floorId, callback) { if (loc.length == 0) return; loc.forEach(function (t) { var x = t[0], y = t[1]; - var flag = "__" + name + "Map__" + floorId + "_" + x + "_" + y; + var flag = [floorId, x, y, name+"_disable"].join('@'); if (type == 'hide') core.setFlag(flag, true); else core.removeFlag(flag); }) @@ -1620,6 +1594,7 @@ maps.prototype.setBlock = function (number, x, y, floorId) { var originEvent = originBlock == null ? null : originBlock.block.event; if (originBlock == null) { core.status.maps[floorId].blocks.push(block); + core.setFlag([floorId, x, y, 'md'].join('@'), false); } else { originBlock.block.id = number; @@ -1792,7 +1767,7 @@ maps.prototype.setBgFgBlock = function (name, number, x, y, floorId) { else number = core.getNumberById(number); } - var vFlag = "__" + name + "Value__" + floorId + "_" + x + "_" + y; + var vFlag = [floorId, x, y, name + "_value"].join('@'); core.setFlag(vFlag, number); core.status[name + "maps"][floorId] = null; @@ -1811,6 +1786,10 @@ maps.prototype.resetMap = function (floorId) { var needRefresh = false; floorId.forEach(function (t) { core.status.maps[t] = core.maps.loadFloor(t); + // 重置本层的全部独立事件 + Object.keys(core.status.hero.flags).forEach(function (one) { + if (one.startsWith(floorId + '@')) delete core.status.hero.flags[one]; + }) if (t == core.status.floorId) needRefresh = true; }); if (needRefresh) this.drawMap(); diff --git a/libs/ui.js b/libs/ui.js index f2d67825..ab653296 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2712,7 +2712,7 @@ ui.prototype._drawSLPanel_drawRecord = function(title, data, x, y, size, cho, hi core.strokeRect('ui', x-size/2, y+15, size, size, cho?strokeColor:'#FFFFFF', cho?6:2); if (data && data.floorId) { var map = core.maps.loadMap(data.maps, data.floorId); - core.extractBlocks(map); + core.extractBlocks(map, data.hero.flags); core.drawThumbnail(data.floorId, map.blocks, { heroLoc: data.hero.loc, heroIcon: data.hero.image, flags: data.hero.flags }, { diff --git a/project/functions.js b/project/functions.js index da60d2fd..d143ce97 100644 --- a/project/functions.js +++ b/project/functions.js @@ -120,6 +120,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.status.maps[floorId].blocks.forEach(function (block) { if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { block.disable = false; + core.setFlag([floorId, block.x, block.y, 'md'].join('@'), false); } }); core.control.gatherFollowers(); @@ -947,7 +948,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 读档操作;从存储中读取了内容后的行为 // 重置游戏和路线 - core.resetGame(data.hero, data.hard, data.floorId, core.maps.loadMap(data.maps), data.values); + core.resetGame(data.hero, data.hard, data.floorId, core.maps.loadMap(data.maps, null, data.hero.flags), data.values); core.status.route = core.decodeRoute(data.route); // 文字属性,全局属性 core.status.textAttribute = core.getFlag('textAttribute', core.status.textAttribute); diff --git a/project/plugins.js b/project/plugins.js index ccb8b675..e18ab765 100644 --- a/project/plugins.js +++ b/project/plugins.js @@ -541,7 +541,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = loc.forEach(function (t) { var x = t[0], y = t[1]; - var flag = "__" + name + "Map__" + floorId + "_" + x + "_" + y; + var flag = [floorId, x, y, name+'_disable'].join('@'); if (type == 'hide') core.setFlag(flag, true); else core.removeFlag(flag); }); @@ -564,7 +564,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = else number = core.getNumberById(number); } - var vFlag = "__" + name + "Value__" + floorId + "_" + x + "_" + y; + var vFlag = [floorId, x, y, name + "_value"].join('@'); core.setFlag(vFlag, number); core.status[name + "maps"][floorId] = null;