diff --git a/_server/editor_game.js b/_server/editor_game.js index 4690f17c..ad659416 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.maps.saveMap(core.status.floorId); + var mapArray = core.getMapArray(core.status.floorId, true); editor.map = mapArray.map(function (v) { return v.map(function (v) { var x = parseInt(v), y = editor.indexs[x]; diff --git a/_server/editor_table.js b/_server/editor_table.js index 6d44a3c4..59389e76 100644 --- a/_server/editor_table.js +++ b/_server/editor_table.js @@ -8,14 +8,14 @@ editor_table_wrapper = function (editor) { // HTML模板 editor_table.prototype.select = function (value, values) { - var content = editor.table.option(value) + - values.map(function (v) { - return editor.table.option(v) + if (values.indexOf(value) < 0) values = [value].concat(values); + var content = values.map(function (v) { + return editor.table.option(v, v == value) }).join('') return /* html */`\n` } - editor_table.prototype.option = function (value) { - return /* html */`\n` + editor_table.prototype.option = function (value, selected) { + return /* html */`\n` } editor_table.prototype.text = function (value) { return /* html */`\n` diff --git a/libs/control.js b/libs/control.js index 34150505..3de2103f 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1100,6 +1100,7 @@ control.prototype.updateDamage = function (floorId, ctx) { control.prototype._updateDamage_damage = function (floorId, ctx) { core.setTextAlign(ctx, 'left'); + core.extractBlocks(floorId); core.status.maps[floorId].blocks.forEach(function (block) { var x = block.x, y = block.y; if (!block.disable && block.event.cls.indexOf('enemy') == 0 && block.event.displayDamage !== false) { diff --git a/libs/enemys.js b/libs/enemys.js index b4478955..b530e738 100644 --- a/libs/enemys.js +++ b/libs/enemys.js @@ -299,6 +299,7 @@ enemys.prototype._getDamage = function (enemy, hero, x, y, floorId) { enemys.prototype.getCurrentEnemys = function (floorId) { floorId = floorId || core.status.floorId; var enemys = [], used = {}; + core.extractBlocks(floorId); var mapBlocks = core.status.maps[floorId].blocks; for (var b = 0; b < mapBlocks.length; b++) { if (!mapBlocks[b].disable && mapBlocks[b].event.cls.indexOf('enemy') == 0) { @@ -364,6 +365,7 @@ enemys.prototype.hasEnemyLeft = function (enemyId, floorId) { else if (enemyId) enemyMap[enemyId] = true; else enemyMap = null; for (var i = 0; i < floorId.length; i++) { + core.extractBlocks(floorId[i]); var mapBlocks = core.status.maps[floorId[i]].blocks; for (var b = 0; b < mapBlocks.length; b++) { if (!mapBlocks[b].disable && mapBlocks[b].event.cls.indexOf('enemy') === 0) { diff --git a/libs/events.js b/libs/events.js index ece3294c..44b2054f 100644 --- a/libs/events.js +++ b/libs/events.js @@ -687,6 +687,7 @@ events.prototype._changeFloor_getHeroLoc = function (floorId, stair, heroLoc) { heroLoc.y = core.status.maps[floorId][stair][1]; } else { + core.extractBlocks(floorId); var blocks = core.status.maps[floorId].blocks; for (var i in blocks) { if (!blocks[i].disable && blocks[i].event.id === stair) { diff --git a/libs/icons.js b/libs/icons.js index de28a897..375cf9e8 100644 --- a/libs/icons.js +++ b/libs/icons.js @@ -36,16 +36,13 @@ icons.prototype.getAllIconIds = function () { return this.allIconIds; } -icons.prototype._getAnimateFrames = function (cls, useOriginValue) { +icons.prototype._getAnimateFrames = function (cls) { if (cls == 'enemys' || cls == 'npcs') { return 2; } - if (cls == 'animates' || cls == 'enemy48') { + if (cls == 'animates' || cls == 'enemy48' || cls == 'npc48') { return 4; } - if (cls == 'npc48') { - return useOriginValue ? 4 : 1; - } return 1; } diff --git a/libs/maps.js b/libs/maps.js index 367f0e25..ede1ce9c 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -53,16 +53,27 @@ maps.prototype.loadFloor = function (floorId, map) { if (notCopy.indexOf(name) == -1 && map[name] != null) content[name] = core.clone(map[name]); } - if (map.deleted) { - content['blocks'] = []; - return content; + content.map = map.map; + if (main.mode == 'editor') { + this.extractBlocks(content); } - map = this.decompressMap(map.map, floorId); - // 事件处理 - content['blocks'] = this._mapIntoBlocks(map, floor, floorId); return content; } +/// 根据需求解析出blocks +maps.prototype.extractBlocks = function (map) { + map = map || core.status.floorId; + if (typeof map == 'string') map = (core.status.maps||{})[map]; + if (!map) return; + if (map.blocks) return; + if (map.deleted) { + map.blocks = []; + return; + } + var floorId = map.floorId; + map.blocks = this._mapIntoBlocks(this.decompressMap(map.map, floorId), core.floors[floorId], floorId); +} + maps.prototype._mapIntoBlocks = function (map, floor, floorId) { var blocks = []; var mw = core.floors[floorId].width; @@ -160,7 +171,7 @@ maps.prototype._addInfo = function (block) { block.event.trigger = 'getItem'; } if (block.event.animate == null) { - block.event.animate = core.icons._getAnimateFrames(block.event.cls, false); + block.event.animate = core.icons._getAnimateFrames(block.event.cls); } block.event.height = 32; if (block.event.cls == 'enemy48' || block.event.cls == 'npc48') @@ -289,17 +300,16 @@ maps.prototype.saveMap = function (floorId) { return map; } // 砍层状态:直接返回 - if (main.mode == 'play' && (flags.__removed__ || []).indexOf(floorId) >= 0) { + if ((flags.__removed__ || []).indexOf(floorId) >= 0) { return { deleted: true, canFlyTo: false, cannotViewMap: true }; } - var map = maps[floorId], floor = core.floors[floorId]; - var blocks = this._getMapArrayFromBlocks(map.blocks, floor.width, floor.height, true); - if (main.mode == 'editor') return blocks; - - var thisFloor = this._compressFloorData(map, floor); - var mapArr = this.compressMap(blocks, floorId); - if (mapArr != null) thisFloor.map = mapArr; + var map = maps[floorId]; + var thisFloor = this._compressFloorData(map, core.floors[floorId]); + if (map.blocks) { + var mapArr = this.compressMap(map.blocks, map.width, map.height, floorId); + if (mapArr != null) thisFloor.map = mapArr; + } return thisFloor; } @@ -351,18 +361,12 @@ maps.prototype.resizeMap = function (floorId) { ////// 将当前地图重新变成二维数组形式 ////// maps.prototype.getMapArray = function (floorId, showDisable) { floorId = floorId || core.status.floorId; - return this._getMapArrayFromBlocks(core.status.maps[floorId].blocks, - core.floors[floorId].width, core.floors[floorId].height, showDisable); + var map = core.status.maps[floorId]; + if (!map.blocks) return map.map; + return this._getMapArrayFromBlocks(map.blocks, map.width, map.height, showDisable); } maps.prototype._getMapArrayFromBlocks = function (blockArray, width, height, showDisable) { - if (typeof blockArray == 'string') { - var floorId = blockArray; - blockArray = core.status.maps[floorId].blocks; - width = core.floors[floorId].width; - height = core.floors[floorId].height; - } - var blocks = []; var allzero = []; for (var y = 0; y < width; y++) allzero.push(0); @@ -386,6 +390,7 @@ maps.prototype._getMapArrayFromBlocks = function (blockArray, width, height, sho maps.prototype.getMapBlocksObj = function (floorId, showDisable) { floorId = floorId || core.status.floorId; var obj = {}; + core.extractBlocks(floorId); core.status.maps[floorId].blocks.forEach(function (block) { if (!block.disable || showDisable) obj[block.x + "," + block.y] = block; @@ -775,6 +780,7 @@ maps.prototype.drawMap = function (floorId, callback) { core.clearMap('all'); this.generateGroundPattern(floorId); core.status.floorId = floorId; + core.extractBlocks(floorId); core.status.thisMap = core.status.maps[floorId]; this._drawMap_drawAll(); @@ -841,6 +847,7 @@ maps.prototype._drawBg_drawBackground = function (floorId, ctx) { ////// 绘制事件层 ////// maps.prototype.drawEvents = function (floorId, blocks, ctx) { floorId = floorId || core.status.floorId; + core.extractBlocks(floorId); if (!blocks) blocks = core.status.maps[floorId].blocks; var arr = this._getMapArrayFromBlocks(blocks, core.floors[floorId].width, core.floors[floorId].height); var onMap = ctx == null; @@ -1193,6 +1200,7 @@ maps.prototype.drawThumbnail = function (floorId, blocks, options, toDraw) { } maps.prototype._drawThumbnail_drawTempCanvas = function (floorId, blocks, options) { + core.extractBlocks(floorId); blocks = blocks || core.status.maps[floorId].blocks; options = options || {} @@ -1329,6 +1337,7 @@ maps.prototype.enemyExists = function (x, y, id, floorId) { maps.prototype.getBlock = function (x, y, floorId, showDisable) { floorId = floorId || core.status.floorId; if (!floorId) return null; + core.extractBlocks(floorId); var blocks = core.status.maps[floorId].blocks; for (var n = 0; n < blocks.length; n++) { if (blocks[n].x == x && blocks[n].y == y) { @@ -1406,6 +1415,7 @@ maps.prototype.searchBlock = function (id, floorId, showDisable) { }); return result; } + core.extractBlocks(floorId); for (var i = 0; i < core.status.maps[floorId].blocks.length; ++i) { var block = core.status.maps[floorId].blocks[i]; if ((showDisable || !block.disable) && (core.matchWildcard(id, block.event.id) || core.matchRegex(id, block.event.id))) { @@ -1461,7 +1471,7 @@ maps.prototype.hideBlock = function (x, y, floorId) { maps.prototype.hideBlockByIndex = function (index, floorId) { floorId = floorId || core.status.floorId; if (!floorId) return; - + core.extractBlocks(floorId); var blocks = core.status.maps[floorId].blocks, block = blocks[index]; block.disable = true; } @@ -1501,7 +1511,7 @@ maps.prototype.removeBlock = function (x, y, floorId) { maps.prototype.removeBlockByIndex = function (index, floorId) { floorId = floorId || core.status.floorId; if (!floorId) return; - + core.extractBlocks(floorId); var blocks = core.status.maps[floorId].blocks, block = blocks[index]; blocks.splice(index, 1); } @@ -1754,6 +1764,7 @@ maps.prototype.replaceBlock = function (fromNumber, toNumber, floorId) { return; } var toBlock = this.getBlockByNumber(toNumber, true); + core.extractBlocks(floorId); core.status.maps[floorId].blocks.forEach(function (block) { if (block.id == fromNumber) { block.id = toNumber; @@ -1903,7 +1914,7 @@ maps.prototype.moveBlock = function (x, y, steps, time, keep, callback) { } maps.prototype._moveBlock_doMove = function (blockInfo, canvases, moveInfo, callback) { - var animateTotal = core.icons._getAnimateFrames(blockInfo.cls, true), animateTime = 0; + var animateTotal = core.icons._getAnimateFrames(blockInfo.cls), animateTime = 0; var animate = window.setInterval(function () { if (blockInfo.cls != 'tileset') { animateTime += moveInfo.per_time; diff --git a/libs/ui.js b/libs/ui.js index e8a1168e..c7182d51 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2643,7 +2643,9 @@ ui.prototype._drawSLPanel_drawRecord = function(title, data, x, y, size, cho, hi core.fillText('ui', title, x, y, highLight?'#FFD700':'#FFFFFF', this._buildFont(17, true)); core.strokeRect('ui', x-size/2, y+15, size, size, cho?strokeColor:'#FFFFFF', cho?6:2); if (data && data.floorId) { - core.drawThumbnail(data.floorId, core.maps.loadMap(data.maps, data.floorId).blocks, { + var map = core.maps.loadMap(data.maps, data.floorId); + core.extractBlocks(map); + core.drawThumbnail(data.floorId, map.blocks, { heroLoc: data.hero.loc, heroIcon: data.hero.image, flags: data.hero.flags }, { ctx: 'ui', x: x-size/2, y: y+15, size: size, centerX: data.hero.loc.x, centerY: data.hero.loc.y @@ -2813,6 +2815,7 @@ ui.prototype._drawStatistics_add = function (floorId, obj, x1, x2, value) { } ui.prototype._drawStatistics_floorId = function (floorId, obj) { + core.extractBlocks(floorId); var floor = core.status.maps[floorId], blocks = floor.blocks; // 隐藏层不给看 if (floor.cannotViewMap && floorId!=core.status.floorId) return; diff --git a/libs/utils.js b/libs/utils.js index b3d49bb9..cc8ac172 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -1128,51 +1128,6 @@ utils.prototype.same = function (a, b) { return false; } -utils.prototype._export = function (floorIds) { - if (!floorIds) floorIds = [core.status.floorId]; - else if (floorIds == 'all') floorIds = core.clone(core.floorIds); - else if (typeof floorIds == 'string') floorIds = [floorIds]; - - var monsterMap = {}; - - // map - var content = floorIds.length + "\n" + core.__SIZE__ + " " + core.__SIZE__ + "\n\n"; - floorIds.forEach(function (floorId) { - var arr = core.maps._getMapArrayFromBlocks(core.status.maps[floorId].blocks, core.__SIZE__, core.__SIZE__); - content += arr.map(function (x) { - // check monster - x.forEach(function (t) { - var block = core.maps.getBlockByNumber(t); - if (block.event.cls.indexOf("enemy") == 0) { - monsterMap[t] = block.event.id; - } - }) - return x.join("\t"); - }).join("\n") + "\n\n"; - }) - - // values - content += ["redGem", "blueGem", "greenGem", "redPotion", "bluePotion", - "yellowPotion", "greenPotion", "sword1", "shield1"].map(function (x) { - return core.values[x] || 0; - }).join(" ") + "\n\n"; - - // monster - content += Object.keys(monsterMap).length + "\n"; - for (var t in monsterMap) { - var id = monsterMap[t], monster = core.material.enemys[id]; - content += t + " " + monster.hp + " " + monster.atk + " " + - monster.def + " " + monster.money + " " + monster.special + "\n"; - } - content += "\n0 0 0 0 0 0\n\n"; - content += core.status.hero.hp + " " + core.status.hero.atk + " " - + core.status.hero.def + " " + core.status.hero.mdef + " " + core.status.hero.money + " " - + core.itemCount('yellowKey') + " " + core.itemCount("blueKey") + " " + core.itemCount("redKey") + " 0 " - + core.status.hero.loc.x + " " + core.status.hero.loc.y + "\n"; - - console.log(content); -} - utils.prototype.unzip = function (blobOrUrl, success, error, convertToText, onprogress) { var _error = function (msg) { main.log(msg); diff --git a/project/functions.js b/project/functions.js index 7defe6ba..8cd0e3be 100644 --- a/project/functions.js +++ b/project/functions.js @@ -115,6 +115,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.status.hero.loc = heroLoc; // 检查重生怪并重置 if (!fromLoad) { + core.extractBlocks(floorId); core.status.maps[floorId].blocks.forEach(function (block) { if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) { block.disable = false; @@ -520,6 +521,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = var cache = core.status.checkBlock.cache[index]; if (!cache) { // 没有该点的缓存,则遍历每个图块 + core.extractBlocks(floorId); core.status.maps[floorId].blocks.forEach(function (block) { if (!block.disable) { // 获得该图块的ID diff --git a/project/materials/enemys.png b/project/materials/enemys.png index 47bcbbc5..10979fa3 100644 Binary files a/project/materials/enemys.png and b/project/materials/enemys.png differ diff --git a/project/materials/icons.png b/project/materials/icons.png index a24d21eb..7ce946ec 100644 Binary files a/project/materials/icons.png and b/project/materials/icons.png differ diff --git a/v2.x-final更新.txt b/v2.x-final更新.txt index 4883e99d..5f0b5cc9 100644 --- a/v2.x-final更新.txt +++ b/v2.x-final更新.txt @@ -28,7 +28,7 @@ (已完成!) 清除最近使用图块 (已完成!) cannotIn / cannotOut使用选项框 (已完成!) noPass->canPass改成选择框 -初始化&读档优化:不一次读取全部楼层并创建 +(已完成!) 初始化&读档优化:不一次读取全部楼层并创建 (已完成!) 绿钥匙进状态栏 (已完成!) 图块ID不可全数字 (已完成!) 怪物详细信息富文本化 @@ -48,7 +48,7 @@ (已完成!) 道具效果优化,删除部分道具相关的开关 (已完成!) 素材列表选择 (已完成!) 油漆桶,动态更改地图大小 -地图拉框选择复制剪切删除 +(已完成!) 地图拉框选择复制剪切删除 (已完成!) 额外素材区拖动选择一个区域 (已完成!) 素材替换 (已完成!) 大屏幕下放大游戏界面 @@ -66,7 +66,7 @@ (已完成!) 更多的图块blockly化 (已完成!) 勇士帧动画 (不处理;现在静止状态可以有帧动画了,所以不考虑行走过程动画) 行走动画 -合并main中一些设置内容 +(已完成!) 合并main中一些设置内容 (已完成!) \t[this], 勇士朝下,flag:arg清理,瞬移扣血 -------------