重构存读档结构

This commit is contained in:
ckcz123 2020-05-31 13:08:11 +08:00
parent b687bf062e
commit d5bdb1f49a
6 changed files with 38 additions and 58 deletions

View File

@ -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) {

View File

@ -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];

View File

@ -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();

View File

@ -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
}, {

View File

@ -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);

View File

@ -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;