重构存读档结构
This commit is contained in:
parent
b687bf062e
commit
d5bdb1f49a
@ -1329,7 +1329,7 @@ MotaActionFunctions.replaceToName = function (str) {
|
|||||||
str = str.replace(new RegExp("item:(" + list.join("|") + ")\\b", "g"), function (a, b) {
|
str = str.replace(new RegExp("item:(" + list.join("|") + ")\\b", "g"), function (a, b) {
|
||||||
return map[b] ? ("物品:" + map[b]) : b;
|
return map[b] ? ("物品:" + map[b]) : b;
|
||||||
}).replace(/item:/g, "物品:");
|
}).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) {
|
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) {
|
str = str.replace(new RegExp("物品[::](" + list.join("|") + ")(?:$|(?=[^\\w\\u4e00-\\u9fa5]))", "g"), function (a, b) {
|
||||||
return map[b] ? ("item:" + map[b]) : b;
|
return map[b] ? ("item:" + map[b]) : b;
|
||||||
}).replace(/物品[::]/g, "item:");
|
}).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 = [];
|
map = {}; list = [];
|
||||||
MotaActionFunctions.pattern.replaceEnemyList.forEach(function (v) {
|
MotaActionFunctions.pattern.replaceEnemyList.forEach(function (v) {
|
||||||
|
|||||||
@ -135,7 +135,7 @@ editor_game_wrapper = function (editor, main, core) {
|
|||||||
|
|
||||||
// 获取当前地图
|
// 获取当前地图
|
||||||
editor_game.prototype.fetchMapFromCore = function () {
|
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) {
|
editor.map = mapArray.map(function (v) {
|
||||||
return v.map(function (v) {
|
return v.map(function (v) {
|
||||||
var x = parseInt(v), y = editor.indexs[x];
|
var x = parseInt(v), y = editor.indexs[x];
|
||||||
|
|||||||
81
libs/maps.js
81
libs/maps.js
@ -61,7 +61,7 @@ maps.prototype.loadFloor = function (floorId, map) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 根据需求解析出blocks
|
/// 根据需求解析出blocks
|
||||||
maps.prototype.extractBlocks = function (map) {
|
maps.prototype.extractBlocks = function (map, flags) {
|
||||||
map = map || core.status.floorId;
|
map = map || core.status.floorId;
|
||||||
if (typeof map == 'string') map = (core.status.maps||{})[map];
|
if (typeof map == 'string') map = (core.status.maps||{})[map];
|
||||||
if (!map) return;
|
if (!map) return;
|
||||||
@ -71,16 +71,16 @@ maps.prototype.extractBlocks = function (map) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var floorId = map.floorId;
|
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 blocks = [];
|
||||||
var mw = core.floors[floorId].width;
|
var mw = core.floors[floorId].width;
|
||||||
var mh = core.floors[floorId].height;
|
var mh = core.floors[floorId].height;
|
||||||
for (var i = 0; i < mh; i++) {
|
for (var i = 0; i < mh; i++) {
|
||||||
for (var j = 0; j < mw; j++) {
|
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)
|
if (block.id != 0 || block.event.trigger)
|
||||||
blocks.push(block);
|
blocks.push(block);
|
||||||
}
|
}
|
||||||
@ -129,12 +129,12 @@ maps.prototype.getIdOfThis = function (id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
////// 数字和ID的对应关系 //////
|
////// 数字和ID的对应关系 //////
|
||||||
maps.prototype.initBlock = function (x, y, id, addInfo, eventFloor) {
|
maps.prototype.initBlock = function (x, y, id, addInfo, eventFloor, flags) {
|
||||||
var disable = null;
|
var disable = null;
|
||||||
id = "" + (id || 0);
|
if (eventFloor != null) {
|
||||||
if (id.endsWith(":f")) disable = true;
|
if (flags == null) flags = (core.status.hero || {}).flags || {};
|
||||||
if (id.endsWith(":t")) disable = false;
|
disable = flags[[eventFloor.floorId, x, y, 'md'].join('@')];
|
||||||
id = parseInt(id);
|
}
|
||||||
var block = {'x': x, 'y': y, 'id': id};
|
var block = {'x': x, 'y': y, 'id': id};
|
||||||
if (disable != null) block.disable = disable;
|
if (disable != null) block.disable = disable;
|
||||||
|
|
||||||
@ -221,30 +221,9 @@ maps.prototype._initMaps = function () {
|
|||||||
return maps;
|
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) {
|
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;
|
if (core.utils.same(mapArr, floorMap)) return null;
|
||||||
|
|
||||||
var mw = core.floors[floorId].width;
|
var mw = core.floors[floorId].width;
|
||||||
@ -268,14 +247,14 @@ maps.prototype.compressMap = function (mapArr, floorId) {
|
|||||||
|
|
||||||
////// 解压缩地图
|
////// 解压缩地图
|
||||||
maps.prototype.decompressMap = function (mapArr, floorId) {
|
maps.prototype.decompressMap = function (mapArr, floorId) {
|
||||||
var floorMap = this._initFloorMap(floorId);
|
var floorMap = core.floors[floorId].map;
|
||||||
if (!mapArr) return floorMap;
|
if (!mapArr) return core.clone(floorMap);
|
||||||
|
|
||||||
var mw = core.floors[floorId].width;
|
var mw = core.floors[floorId].width;
|
||||||
var mh = core.floors[floorId].height;
|
var mh = core.floors[floorId].height;
|
||||||
for (var x = 0; x < mh; x++) {
|
for (var x = 0; x < mh; x++) {
|
||||||
if (mapArr[x] === 0) {
|
if (mapArr[x] === 0) {
|
||||||
mapArr[x] = floorMap[x];
|
mapArr[x] = core.clone(floorMap[x]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (var y = 0; y < mw; y++) {
|
for (var y = 0; y < mw; y++) {
|
||||||
@ -307,7 +286,7 @@ maps.prototype.saveMap = function (floorId) {
|
|||||||
var map = maps[floorId];
|
var map = maps[floorId];
|
||||||
var thisFloor = this._compressFloorData(map, core.floors[floorId]);
|
var thisFloor = this._compressFloorData(map, core.floors[floorId]);
|
||||||
if (map.blocks) {
|
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;
|
if (mapArr != null) thisFloor.map = mapArr;
|
||||||
}
|
}
|
||||||
return thisFloor;
|
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;
|
floorId = floorId || core.status.floorId;
|
||||||
var map = core.status.maps[floorId];
|
var map = core.status.maps[floorId];
|
||||||
if (!map.blocks) return map.map;
|
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 blocks = [];
|
||||||
var allzero = [];
|
var allzero = [];
|
||||||
for (var y = 0; y < width; y++) allzero.push(0);
|
for (var y = 0; y < width; y++) allzero.push(0);
|
||||||
for (var x = 0; x < height; x++) blocks.push(core.clone(allzero));
|
for (var x = 0; x < height; x++) blocks.push(core.clone(allzero));
|
||||||
|
|
||||||
blockArray.forEach(function (block) {
|
blockArray.forEach(function (block) {
|
||||||
var x = block.x, y = block.y;
|
blocks[block.y][block.x] = block.id;
|
||||||
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";
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return blocks;
|
return blocks;
|
||||||
}
|
}
|
||||||
@ -414,8 +385,8 @@ maps.prototype._getBgFgMapArray = function (name, floorId, noCache) {
|
|||||||
for (var x = 0; x < width; x++) {
|
for (var x = 0; x < width; x++) {
|
||||||
for (var y = 0; y < height; y++) {
|
for (var y = 0; y < height; y++) {
|
||||||
arr[y] = arr[y] || [];
|
arr[y] = arr[y] || [];
|
||||||
var flag = "__" + name + "Map__" + floorId + "_" + x + "_" + y;
|
var flag = [floorId, x, y, name+'_disable'].join('@');
|
||||||
var vFlag = "__" + name + "Value__" + floorId + "_" + x + "_" + y;
|
var vFlag = [floorId, x, y, name+'_value'].join('@');
|
||||||
if (core.hasFlag(flag)) arr[y][x] = 0;
|
if (core.hasFlag(flag)) arr[y][x] = 0;
|
||||||
else arr[y][x] = core.getFlag(vFlag, 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;
|
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) {
|
if (block.disable) {
|
||||||
block.disable = false;
|
block.disable = false;
|
||||||
|
core.setFlag([floorId, x, y, 'md'].join('@'), false);
|
||||||
// 在本层,添加动画
|
// 在本层,添加动画
|
||||||
if (floorId == core.status.floorId) {
|
if (floorId == core.status.floorId) {
|
||||||
if (block.event.cls == 'autotile') {
|
if (block.event.cls == 'autotile') {
|
||||||
@ -1471,6 +1443,7 @@ maps.prototype.hideBlockByIndex = function (index, floorId) {
|
|||||||
core.extractBlocks(floorId);
|
core.extractBlocks(floorId);
|
||||||
var blocks = core.status.maps[floorId].blocks, block = blocks[index];
|
var blocks = core.status.maps[floorId].blocks, block = blocks[index];
|
||||||
block.disable = true;
|
block.disable = true;
|
||||||
|
core.setFlag([floorId, block.x, block.y, 'md'].join('@'), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 一次性隐藏多个block //////
|
////// 一次性隐藏多个block //////
|
||||||
@ -1519,6 +1492,7 @@ maps.prototype.removeBlockByIndex = function (index, floorId) {
|
|||||||
core.extractBlocks(floorId);
|
core.extractBlocks(floorId);
|
||||||
var blocks = core.status.maps[floorId].blocks, block = blocks[index];
|
var blocks = core.status.maps[floorId].blocks, block = blocks[index];
|
||||||
blocks.splice(index, 1);
|
blocks.splice(index, 1);
|
||||||
|
core.setFlag([floorId, block.x, block.y, 'md'].join('@'), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 一次性删除多个block //////
|
////// 一次性删除多个block //////
|
||||||
@ -1552,7 +1526,7 @@ maps.prototype._triggerBgFgMap = function (type, name, loc, floorId, callback) {
|
|||||||
if (loc.length == 0) return;
|
if (loc.length == 0) return;
|
||||||
loc.forEach(function (t) {
|
loc.forEach(function (t) {
|
||||||
var x = t[0], y = t[1];
|
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);
|
if (type == 'hide') core.setFlag(flag, true);
|
||||||
else core.removeFlag(flag);
|
else core.removeFlag(flag);
|
||||||
})
|
})
|
||||||
@ -1620,6 +1594,7 @@ maps.prototype.setBlock = function (number, x, y, floorId) {
|
|||||||
var originEvent = originBlock == null ? null : originBlock.block.event;
|
var originEvent = originBlock == null ? null : originBlock.block.event;
|
||||||
if (originBlock == null) {
|
if (originBlock == null) {
|
||||||
core.status.maps[floorId].blocks.push(block);
|
core.status.maps[floorId].blocks.push(block);
|
||||||
|
core.setFlag([floorId, x, y, 'md'].join('@'), false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
originBlock.block.id = number;
|
originBlock.block.id = number;
|
||||||
@ -1792,7 +1767,7 @@ maps.prototype.setBgFgBlock = function (name, number, x, y, floorId) {
|
|||||||
else number = core.getNumberById(number);
|
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.setFlag(vFlag, number);
|
||||||
core.status[name + "maps"][floorId] = null;
|
core.status[name + "maps"][floorId] = null;
|
||||||
|
|
||||||
@ -1811,6 +1786,10 @@ maps.prototype.resetMap = function (floorId) {
|
|||||||
var needRefresh = false;
|
var needRefresh = false;
|
||||||
floorId.forEach(function (t) {
|
floorId.forEach(function (t) {
|
||||||
core.status.maps[t] = core.maps.loadFloor(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 (t == core.status.floorId) needRefresh = true;
|
||||||
});
|
});
|
||||||
if (needRefresh) this.drawMap();
|
if (needRefresh) this.drawMap();
|
||||||
|
|||||||
@ -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);
|
core.strokeRect('ui', x-size/2, y+15, size, size, cho?strokeColor:'#FFFFFF', cho?6:2);
|
||||||
if (data && data.floorId) {
|
if (data && data.floorId) {
|
||||||
var map = core.maps.loadMap(data.maps, 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, {
|
core.drawThumbnail(data.floorId, map.blocks, {
|
||||||
heroLoc: data.hero.loc, heroIcon: data.hero.image, flags: data.hero.flags
|
heroLoc: data.hero.loc, heroIcon: data.hero.image, flags: data.hero.flags
|
||||||
}, {
|
}, {
|
||||||
|
|||||||
@ -120,6 +120,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
|||||||
core.status.maps[floorId].blocks.forEach(function (block) {
|
core.status.maps[floorId].blocks.forEach(function (block) {
|
||||||
if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) {
|
if (block.disable && core.enemys.hasSpecial(block.event.id, 23)) {
|
||||||
block.disable = false;
|
block.disable = false;
|
||||||
|
core.setFlag([floorId, block.x, block.y, 'md'].join('@'), false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
core.control.gatherFollowers();
|
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.route = core.decodeRoute(data.route);
|
||||||
// 文字属性,全局属性
|
// 文字属性,全局属性
|
||||||
core.status.textAttribute = core.getFlag('textAttribute', core.status.textAttribute);
|
core.status.textAttribute = core.getFlag('textAttribute', core.status.textAttribute);
|
||||||
|
|||||||
@ -541,7 +541,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
loc.forEach(function (t) {
|
loc.forEach(function (t) {
|
||||||
var x = t[0],
|
var x = t[0],
|
||||||
y = t[1];
|
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);
|
if (type == 'hide') core.setFlag(flag, true);
|
||||||
else core.removeFlag(flag);
|
else core.removeFlag(flag);
|
||||||
});
|
});
|
||||||
@ -564,7 +564,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
else number = core.getNumberById(number);
|
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.setFlag(vFlag, number);
|
||||||
core.status[name + "maps"][floorId] = null;
|
core.status[name + "maps"][floorId] = null;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user