Use localForage to exceed 5M space limit

This commit is contained in:
ckcz123 2018-08-29 16:38:20 +08:00
parent 2258fc90d0
commit 740b3bffc9
8 changed files with 276 additions and 114 deletions

View File

@ -127,6 +127,7 @@
<script src='libs/thirdparty/mid.min.js'></script>
<script src='libs/thirdparty/lz-string.min.js'></script>
<script src='libs/thirdparty/priority-queue.min.js'></script>
<script src='libs/thirdparty/localforage.min.js'></script>
<script id='mainScript' src='main.js'></script>
<script>main.init();main.listen();</script>
</body>

View File

@ -1427,8 +1427,12 @@ actions.prototype.clickSL = function(x,y) {
core.drawTip("无法删除自动存档!");
}
else {
core.removeLocalStorage("save"+id);
core.ui.drawSLPanel(index);
// core.removeLocalStorage("save"+id);
core.removeLocalForage("save"+id, function() {
core.ui.drawSLPanel(index, true);
}, function() {
core.drawTip("无法删除存档!");
})
}
}
else {
@ -1523,8 +1527,13 @@ actions.prototype.keyUpSL = function (keycode) {
core.drawTip("无法删除自动存档!");
}
else {
core.removeLocalStorage("save"+(5*page+offset));
core.ui.drawSLPanel(index);
// core.removeLocalStorage("save"+(5*page+offset));
// core.ui.drawSLPanel(index);
core.removeLocalForage("save"+(5*page+offset), function() {
core.ui.drawSLPanel(index, true);
}, function() {
core.drawTip("无法删除存档!");
})
}
}
}
@ -1799,10 +1808,12 @@ actions.prototype.clickSyncSave = function (x,y) {
core.ui.drawConfirmBox("所有本地存档都将被覆盖,确认?", function () {
for (var i=1;i<=5*(main.savePages||30);i++) {
if (i<=data.length) {
core.setLocalStorage("save"+i, data[i-1]);
// core.setLocalStorage("save"+i, data[i-1]);
core.setLocalForage("save"+i, data[i-1]);
}
else {
core.removeLocalStorage("save"+i);
// core.removeLocalStorage("save"+i);
core.removeLocalForage("save"+i);
}
}
core.drawText("读取成功!\n你的本地所有存档均已被覆盖。");
@ -1812,8 +1823,10 @@ actions.prototype.clickSyncSave = function (x,y) {
})
}
else {
core.setLocalStorage("save"+core.status.saveIndex, data);
core.drawText("同步成功!\n单存档已覆盖至存档"+core.status.saveIndex);
// core.setLocalStorage("save"+core.status.saveIndex, data);
core.setLocalForage("save"+core.status.saveIndex, data, function() {
core.drawText("同步成功!\n单存档已覆盖至存档"+core.status.saveIndex);
})
}
}, function () {
@ -1931,6 +1944,7 @@ actions.prototype.clickLocalSaveSelect = function (x,y) {
if (y>=topIndex && y<topIndex+choices.length) {
var selection = y - topIndex;
/*
switch (selection) {
case 0:
saves=[];
@ -1947,15 +1961,21 @@ actions.prototype.clickLocalSaveSelect = function (x,y) {
case 2:
break;
}
}
if (core.isset(saves)) {
var content = {
"name": core.firstData.name,
"version": core.firstData.version,
"data": saves
*/
if (selection<2) {
core.control.getSaves(selection==0?null:core.status.saveIndex, function(saves) {
if (core.isset(saves)) {
var content = {
"name": core.firstData.name,
"version": core.firstData.version,
"data": saves
}
core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5save", JSON.stringify(content));
}
})
}
core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5save", JSON.stringify(content));
}
core.status.event.selection=2;
core.ui.drawSyncSave();
}
@ -1997,15 +2017,18 @@ actions.prototype.clickStorageRemove = function (x, y) {
var selection = y - topIndex;
switch (selection) {
case 0:
localStorage.clear();
core.drawText("\t[操作成功]你的所有存档已被清空。");
localforage.clear(function () {
core.drawText("\t[操作成功]你的所有存档已被清空。");
});
break;
case 1:
for (var i=1;i<=5*(main.savePages||30);i++) {
core.removeLocalStorage("save"+i);
// core.removeLocalStorage("save"+i);
core.removeLocalForage("save"+i);
}
core.drawText("\t[操作成功]当前塔的存档已被清空。");
core.removeLocalStorage("autoSave");
core.removeLocalForage("autoSave", function() {
core.drawText("\t[操作成功]当前塔的存档已被清空。");
});
break;
case 2:
core.status.event.selection=5;

View File

@ -2180,7 +2180,7 @@ control.prototype.autosave = function (removeLast) {
var x=null;
if (removeLast)
x=core.status.route.pop();
core.setLocalStorage("autoSave", core.saveData())
core.setLocalForage("autoSave", core.saveData())
if (removeLast && core.isset(x))
core.status.route.push(x);
}
@ -2192,6 +2192,18 @@ control.prototype.doSL = function (id, type) {
core.drawTip('不能覆盖自动存档!');
return;
}
core.setLocalForage("save"+id, core.saveData(), function() {
core.ui.closePanel();
core.drawTip('存档成功!');
if (id!="autoSave") {
core.status.saveIndex=id;
core.setLocalStorage('saveIndex2', core.status.saveIndex);
}
}, function(err) {
console.info(err);
core.drawTip("存档失败,请将控制台的报错信息反馈给管理员。");
})
/*
if (core.setLocalStorage("save"+id, core.saveData())) {
core.ui.closePanel();
core.drawTip('存档成功!');
@ -2203,105 +2215,105 @@ control.prototype.doSL = function (id, type) {
else {
core.drawTip('存储空间不足,请覆盖已有的存档或在菜单栏中进行清理');
}
*/
return;
}
else if (type=='load') {
var data = core.getLocalStorage(id=='autoSave'?id:"save"+id, null);
if (!core.isset(data)) {
// var data = core.getLocalStorage(id=='autoSave'?id:"save"+id, null);
core.getLocalForage(id=='autoSave'?id:"save"+id, function(data) {
if (!core.isset(data)) {
core.drawTip("无效的存档");
return;
}
if (data.version != core.firstData.version) {
// core.drawTip("存档版本不匹配");
if (confirm("存档版本不匹配!\n你想回放此存档的录像吗\n可以随时停止录像播放以继续游戏。")) {
core.dom.startPanel.style.display = 'none';
var seed = data.hero.flags.seed;
core.resetStatus(core.firstData.hero, data.hard, core.firstData.floorId, null, core.initStatus.maps);
core.events.setInitData(data.hard);
core.setFlag('seed', seed);
core.setFlag('rand', seed);
core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() {
core.startReplay(core.decodeRoute(data.route));
}, true);
}
return;
}
core.ui.closePanel();
core.loadData(data, function() {
core.drawTip("读档成功");
if (id!="autoSave") {
core.status.saveIndex=id;
core.setLocalStorage('saveIndex2', core.status.saveIndex);
}
});
}, function(err) {
core.drawTip("无效的存档");
return;
}
if (data.version != core.firstData.version) {
// core.drawTip("存档版本不匹配");
if (confirm("存档版本不匹配!\n你想回放此存档的录像吗\n可以随时停止录像播放以继续游戏。")) {
core.dom.startPanel.style.display = 'none';
var seed = data.hero.flags.seed;
core.resetStatus(core.firstData.hero, data.hard, core.firstData.floorId, null, core.initStatus.maps);
core.events.setInitData(data.hard);
core.setFlag('seed', seed);
core.setFlag('rand', seed);
core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() {
core.startReplay(core.decodeRoute(data.route));
}, true);
}
return;
}
core.ui.closePanel();
core.loadData(data, function() {
core.drawTip("读档成功");
if (id!="autoSave") {
core.status.saveIndex=id;
core.setLocalStorage('saveIndex2', core.status.saveIndex);
}
});
})
return;
}
else if (type == 'replayLoad') {
var data = core.getLocalStorage(id=='autoSave'?id:"save"+id, null);
if (!core.isset(data)) {
// var data = core.getLocalStorage(id=='autoSave'?id:"save"+id, null);
core.getLocalForage(id=='autoSave'?id:"save"+id, function(data) {
if (!core.isset(data)) {
core.drawTip("无效的存档");
return;
}
if (data.version != core.firstData.version) {
core.drawTip("存档版本不匹配");
return;
}
if (data.hard != core.status.hard) {
core.drawTip("游戏难度不匹配!");
return;
}
var route = core.subarray(core.status.route, core.decodeRoute(data.route));
if (!core.isset(route) || data.hero.flags.seed!=core.getFlag('seed')) {
core.drawTip("无法从此存档回放录像");
return;
}
core.loadData(data, function () {
core.startReplay(route);
core.drawTip("回退到存档节点");
});
}, function(err) {
console.info(err);
core.drawTip("无效的存档");
return;
}
if (data.version != core.firstData.version) {
core.drawTip("存档版本不匹配");
return;
}
if (data.hard != core.status.hard) {
core.drawTip("游戏难度不匹配!");
return;
}
var route = core.subarray(core.status.route, core.decodeRoute(data.route));
if (!core.isset(route) || data.hero.flags.seed!=core.getFlag('seed')) {
core.drawTip("无法从此存档回放录像");
return;
}
core.loadData(data, function () {
core.startReplay(route);
core.drawTip("回退到存档节点");
});
})
}
}
////// 同步存档到服务器 //////
control.prototype.syncSave = function (type) {
var saves=null;
// data
if (type=='all') {
saves=[];
for (var i=1;i<=5*(main.savePages||30);i++) {
var data = core.getLocalStorage("save"+i, null);
if (core.isset(data)) {
saves.push(data);
}
}
}
else {
saves=core.getLocalStorage("save"+core.status.saveIndex, null);
}
if (!core.isset(saves)) {
core.drawText("没有要同步的存档");
return;
}
core.ui.drawWaiting("正在同步,请稍后...");
var formData = new FormData();
formData.append('type', 'save');
formData.append('name', core.firstData.name);
var save_text = JSON.stringify(saves);
formData.append('data', save_text);
core.http("POST", "/games/sync.php", formData, function (data) {
var response = JSON.parse(data);
if (response.code<0) {
core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因"+response.msg);
core.control.getSaves(type=='all'?null:core.status.saveIndex, function (saves) {
if (!core.isset(saves)) {
core.drawText("没有要同步的存档");
return;
}
else {
core.drawText((type=='all'?"所有存档":"存档"+core.status.saveIndex)+"同步成功!\n\n您的存档编号 "
+response.code+"\n您的存档密码 "+response.msg
+"\n\n请牢记以上两个信息如截图等在从服务器\n同步存档时使用。")
}
}, function (e) {
core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因"+e);
var formData = new FormData();
formData.append('type', 'save');
formData.append('name', core.firstData.name);
var save_text = JSON.stringify(saves);
formData.append('data', save_text);
core.http("POST", "/games/sync.php", formData, function (data) {
var response = JSON.parse(data);
if (response.code<0) {
core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因"+response.msg);
}
else {
core.drawText((type=='all'?"所有存档":"存档"+core.status.saveIndex)+"同步成功!\n\n您的存档编号 "
+response.code+"\n您的存档密码 "+response.msg
+"\n\n请牢记以上两个信息如截图等在从服务器\n同步存档时使用。")
}
}, function (e) {
core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因"+e);
})
})
}
@ -2338,10 +2350,12 @@ control.prototype.syncLoad = function () {
core.ui.drawConfirmBox("所有本地存档都将被覆盖,确认?", function () {
for (var i=1;i<=5*(main.savePages||30);i++) {
if (i<=data.length) {
core.setLocalStorage("save"+i, data[i-1]);
// core.setLocalStorage("save"+i, data[i-1]);
core.setLocalForage("save"+i, data[i-1]);
}
else {
core.removeLocalStorage("save"+i);
// core.removeLocalStorage("save"+i);
core.removeLocalForage("save"+i);
}
}
core.drawText("同步成功!\n你的本地所有存档均已被覆盖。");
@ -2352,8 +2366,10 @@ control.prototype.syncLoad = function () {
}
else {
// 只覆盖单存档
core.setLocalStorage("save"+core.status.saveIndex, data);
core.drawText("同步成功!\n单存档已覆盖至存档"+core.status.saveIndex);
// core.setLocalStorage("save"+core.status.saveIndex, data);
core.setLocalForage("save"+core.status.saveIndex, data, function() {
core.drawText("同步成功!\n单存档已覆盖至存档"+core.status.saveIndex);
});
}
break;
case -1:
@ -2424,6 +2440,34 @@ control.prototype.loadData = function (data, callback) {
}, true);
}
control.prototype.getSaves = function (index, callback) {
if (core.isset(index)) {
core.getLocalForage("save"+index, function(data) {
if (core.isset(callback)) callback(data);
}, function(err) {
if (core.isset(callback))
callback(null);
})
return;
}
var number = 5*(main.savePages||30);
var saves = [];
var load = function (index, callback) {
if (index > number) {
if (core.isset(callback)) callback(saves);
return;
}
core.getLocalForage("save"+index, function (data) {
saves.push(data);
load(index+1, callback);
}, function(err) {
// saves.push(null);
load(index+1, callback);
})
}
load(1, callback);
}
////// 设置勇士属性 //////
control.prototype.setStatus = function (statusName, statusVal) {
if (statusName == 'exp') statusName = 'experience';

View File

@ -897,6 +897,18 @@ core.prototype.removeLocalStorage = function (key) {
core.utils.removeLocalStorage(key);
}
core.prototype.setLocalForage = function (key, value, successCallback, errorCallback) {
core.utils.setLocalForage(key, value, successCallback, errorCallback);
}
core.prototype.getLocalForage = function (key, successCallback, errorCallback) {
core.utils.getLocalForage(key, successCallback, errorCallback);
}
core.prototype.removeLocalForage = function (key, successCallback, errorCallback) {
core.utils.removeLocalForage(key, successCallback, errorCallback);
}
////// 深拷贝一个对象 //////
core.prototype.clone = function (data) {
return core.utils.clone(data);

7
libs/thirdparty/localforage.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1721,7 +1721,7 @@ ui.prototype.drawToolbox = function(index) {
}
////// 绘制存档/读档界面 //////
ui.prototype.drawSLPanel = function(index) {
ui.prototype.drawSLPanel = function(index, refresh) {
if (!core.isset(index)) index=1;
if (index<0) index=0;
@ -1731,7 +1731,14 @@ ui.prototype.drawSLPanel = function(index) {
if (offset>5) offset=5;
index=10*page+offset;
var last_page = -1;
if (core.isset(core.status.event.data)) {
last_page = parseInt(core.status.event.data/10);
}
core.status.event.data=index;
if (!core.isset(core.status.event.ui))
core.status.event.ui = [];
core.clearMap('ui');
core.setAlpha('ui', 0.85);
@ -1745,14 +1752,15 @@ ui.prototype.drawSLPanel = function(index) {
if (core.status.event.selection) strokeColor = '#FF6A6A';
var name=core.status.event.id=='save'?"存档":core.status.event.id=='load'?"读档":core.status.event.id=='replayLoad'?"回放":"";
for (var i=0;i<6;i++) {
var draw = function (data, i) {
core.status.event.ui[i] = data;
var id=5*page+i;
var data=core.getLocalStorage(i==0?"autoSave":"save"+id, null);
if (i<3) {
core.fillText('ui', i==0?"自动存档":name+id, (2*i+1)*u, 35, '#FFFFFF', "bold 17px Verdana");
core.strokeRect('ui', (2*i+1)*u-size/2, 50, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2);
if (core.isset(data) && core.isset(data.floorId)) {
this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 50, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png");
core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 50, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png");
core.fillText('ui', core.formatDate(new Date(data.time)), (2*i+1)*u, 65+size, '#FFFFFF', '10px Verdana');
}
else {
@ -1764,7 +1772,7 @@ ui.prototype.drawSLPanel = function(index) {
core.fillText('ui', name+id, (2*i-5)*u, 230, '#FFFFFF', "bold 17px Verdana");
core.strokeRect('ui', (2*i-5)*u-size/2, 245, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2);
if (core.isset(data) && core.isset(data.floorId)) {
this.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 245, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png");
core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 245, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png");
core.fillText('ui', core.formatDate(new Date(data.time)), (2*i-5)*u, 260+size, '#FFFFFF', '10px Verdana');
}
else {
@ -1772,7 +1780,28 @@ ui.prototype.drawSLPanel = function(index) {
core.fillText('ui', '空', (2*i-5)*u, 245+70, '#FFFFFF', 'bold 30px Verdana');
}
}
};
var drawSave = function (i) {
core.getLocalForage(i==0?"autoSave":"save"+(5*page+i), function(data) {
draw(data, i);
}, function(err) {
draw(null, i);
})
}
if (page == last_page && !refresh) {
for (var i=0;i<6;i++) {
draw(core.status.event.ui[i]||null, i);
}
}
else {
for (var i=0;i<6;i++) {
drawSave(i);
}
}
this.drawPagination(page+1, max_page);
if (core.status.event.selection)

View File

@ -124,6 +124,51 @@ utils.prototype.removeLocalStorage = function (key) {
localStorage.removeItem(core.firstData.name+"_"+key);
}
utils.prototype.setLocalForage = function (key, value, successCallback, errorCallback) {
// Save to localforage
var compressed = LZString.compress(JSON.stringify(value));
localforage.setItem(core.firstData.name+"_"+key, compressed, function (err) {
if (core.isset(err)) {
if (core.isset(errorCallback)) errorCallback(err);
}
else if (core.isset(successCallback)) successCallback();
});
}
utils.prototype.getLocalForage = function (key, successCallback, errorCallback) {
localforage.getItem(core.firstData.name+"_"+key, function (err, value) {
if (core.isset(err)) {
if (core.isset(errorCallback)) errorCallback(err);
}
else {
if (core.isset(value)) {
var output = LZString.decompress(value);
if (core.isset(output) && output.length>0) {
try {
if (core.isset(successCallback))
successCallback(JSON.parse(output));
return;
}
catch (ee) {console.log(ee);}
}
if (core.isset(successCallback))
successCallback(JSON.parse(value));
return;
}
if (core.isset(errorCallback)) errorCallback("Value is null");
}
})
}
utils.prototype.removeLocalForage = function (key, successCallback, errorCallback) {
localforage.removeItem(core.firstData.name+"_"+key, function (err) {
if (core.isset(err)) {
if (core.isset(errorCallback)) errorCallback(err);
}
else if (core.isset(successCallback)) successCallback();
})
}
////// 深拷贝一个对象 //////
utils.prototype.clone = function (data) {
if (!core.isset(data)) return data;

View File

@ -1,6 +1,7 @@
HTML5魔塔样板V2.4
大地图的支持
突破了5M的存档空间大小限制
同点多事件的颜色块绘制
录像播放时可以按PgUp/PgDn浏览地图
录像播放时对于瞬间移动绘制箭头