diff --git a/libs/core.js b/libs/core.js index dfb070cd..785ae062 100644 --- a/libs/core.js +++ b/libs/core.js @@ -220,7 +220,9 @@ core.prototype.init = function (dom, statusBar, canvas, images, pngs, bgms, soun return; } } - catch (e) {} + catch (e) { + console.log(e); + } alert("不是有效的JSON文件!"); if (core.isset(core.platform.errorCallback)) @@ -701,6 +703,14 @@ core.prototype.keyDown = function(keyCode) { core.events.keyDownSyncSave(keyCode); return; } + if (core.status.event.id=='syncSelect') { + core.events.keyDownSyncSelect(keyCode); + return; + } + if (core.status.event.id=='localSaveSelect') { + core.events.keyDownLocalSaveSelect(keyCode); + return; + } return; } if(!core.status.played) { @@ -816,6 +826,14 @@ core.prototype.keyUp = function(keyCode) { core.events.keyUpSyncSave(keyCode); return; } + if (core.status.event.id=='syncSelect') { + core.events.keyUpSyncSelect(keyCode); + return; + } + if (core.status.event.id=='localSaveSelect') { + core.events.keyUpLocalSaveSelect(keyCode); + return; + } return; } @@ -1152,6 +1170,16 @@ core.prototype.onclick = function (x, y, stepPostfix) { return; } + if (core.status.event.id == 'syncSelect') { + core.events.clickSyncSelect(x,y); + return; + } + + if (core.status.event.id == 'localSaveSelect') { + core.events.clickLocalSaveSelect(x,y); + return; + } + } ////// 滑动鼠标滚轮时的操作 ////// @@ -1283,8 +1311,6 @@ core.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { } } moveStep=moveStep.concat(stepPostfix); - //core.status.automaticRoutingTemp.destX = destX; - //core.status.automaticRoutingTemp.destY = destY; core.status.automaticRoute.destX=destX; core.status.automaticRoute.destY=destY; core.canvas.ui.save(); @@ -3918,6 +3944,151 @@ core.prototype.doSL = function (id, type) { } } +////// 同步存档到服务器 ////// +core.prototype.syncSave = function (type) { + var saves=null; + // data + if (type=='all') { + saves=[]; + for (var i=1;i<=150;i++) { + var data = core.getLocalStorage("save"+i, null); + if (core.isset(data)) { + saves.push(data); + } + } + } + else { + for (var i=150;i>=1;i--) { + saves=core.getLocalStorage("save"+i, null); + if (core.isset(saves)) { + break; + } + } + } + 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); + + // send + var xhr = new XMLHttpRequest(); + xhr.open("POST", "/games/sync.php"); + xhr.onload = function(e) { + if (xhr.status==200) { + // console.log("同步成功。"); + var response = JSON.parse(xhr.response); + if (response.code<0) { + core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:"+response.msg); + } + else { + core.drawText("同步成功!\n\n您的存档编号: "+response.code+"\n您的存档密码: "+response.msg+"\n\n请牢记以上两个信息(如截图等),在从服务器\n同步存档时使用。") + } + } + else { + core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:HTTP "+xhr.status); + } + }; + xhr.ontimeout = function() { + core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:Timeout"); + } + xhr.onerror = function() { + core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:XHR Error"); + } + xhr.send(formData); +} + +////// 从服务器加载存档 ////// +core.prototype.syncLoad = function () { + var id = prompt("请输入存档编号:"); + if (id==null || id=="") { + core.ui.drawSyncSave(); return; + } + var password = prompt("请输入存档密码:"); + if (password==null || password=="") { + core.ui.drawSyncSave(); return; + } + core.ui.drawWaiting("正在同步,请稍后..."); + + var formData = new FormData(); + formData.append('type', 'load'); + formData.append('name', core.firstData.name); + formData.append('id', id); + formData.append('password', password); + + // send + var xhr = new XMLHttpRequest(); + xhr.open("POST", "/games/sync.php"); + xhr.onload = function(e) { + if (xhr.status==200) { + // console.log("同步成功。"); + var response = JSON.parse(xhr.response); + switch (response.code) { + case 0: + // 成功 + var data=JSON.parse(response.msg); + // console.log(data); + + if (data instanceof Array) { + core.status.event.selection=1; + core.ui.drawConfirmBox("所有本地存档都将被覆盖,确认?", function () { + for (var i=1;i<=150;i++) { + if (i<=data.length) { + core.setLocalStorage("save"+i, data[i-1]); + } + else { + core.removeLocalStorage("save"+i); + } + } + core.drawText("同步成功!\n你的本地所有存档均已被覆盖。"); + }, function () { + core.status.event.selection=0; + core.ui.drawSyncSave(); + }) + } + else { + // 只覆盖单存档 + var index=150; + for (var i=150;i>=1;i--) { + if (core.getLocalStorage("save"+i, null)==null) + index=i; + else break; + } + core.setLocalStorage("save"+index, data); + core.drawText("同步成功!\n单存档已覆盖至存档"+index); + } + break; + case -1: + core.drawText("出错啦!\n存档编号"+id+"不存在!"); + break; + case -2: + core.drawText("出错啦!\n存档密码错误!"); + break; + default: + core.drawText("出错啦!\n无法从服务器同步存档。\n错误原因:"+response.msg); + break; + } + } + else { + core.drawText("出错啦!\n无法从服务器同步存档。\n错误原因:HTTP "+xhr.status); + } + }; + xhr.ontimeout = function() { + core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:Timeout"); + } + xhr.onerror = function() { + core.drawText("出错啦!\n无法同步存档到服务器。\n错误原因:XHR Error"); + } + xhr.send(formData); +} +/* + ////// 存档同步操作 ////// core.prototype.syncSave = function(type) { if (type=='save') { @@ -4039,6 +4210,7 @@ core.prototype.syncSave = function(type) { } } +*/ ////// 存档到本地 ////// core.prototype.saveData = function(dataId) { diff --git a/libs/events.js b/libs/events.js index 5748ed0c..bf56bb2b 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1686,12 +1686,14 @@ events.prototype.clickSyncSave = function (x,y) { switch (selection) { case 0: // core.syncSave("save"); + core.status.event.selection=0; core.ui.drawSyncSelect(); break; case 1: - core.syncSave("load"); + core.syncLoad(); break; case 2: + /* var saves = []; for (var i=1;i<=150;i++) { var data = core.getLocalStorage("save"+i, null); @@ -1705,6 +1707,9 @@ events.prototype.clickSyncSave = function (x,y) { "data": saves } core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5save", JSON.stringify(content)); + */ + core.status.event.selection=0; + core.ui.drawLocalSaveSelect(); break; case 3: core.readFile(function (obj) { @@ -1721,15 +1726,33 @@ events.prototype.clickSyncSave = function (x,y) { return; } var data=obj.data; - for (var i=1;i<=150;i++) { - if (i<=data.length) { - core.setLocalStorage("save"+i, data[i-1]); - } - else { - core.removeLocalStorage("save"+i); - } + + if (data instanceof Array) { + core.ui.drawConfirmBox("所有本地存档都将被覆盖,确认?", function () { + for (var i=1;i<=150;i++) { + if (i<=data.length) { + core.setLocalStorage("save"+i, data[i-1]); + } + else { + core.removeLocalStorage("save"+i); + } + } + core.drawText("读取成功!\n你的本地所有存档均已被覆盖。"); + }, function () { + core.status.event.selection=0; + core.ui.drawSyncSave(); + }) + } + else { + var index=150; + for (var i=150;i>=1;i--) { + if (core.getLocalStorage("save"+i, null)==null) + index=i; + else break; + } + core.setLocalStorage("save"+index, data); + core.drawText("同步成功!\n单存档已覆盖至存档"+index); } - core.drawText("读取成功!\n你的本地所有存档均已被覆盖。"); }, function () { }); @@ -1747,8 +1770,8 @@ events.prototype.clickSyncSave = function (x,y) { localStorage.clear(); core.drawText("\t[操作成功]你的所有存档已被清空。"); }, function() { - core.status.event.selection=2; - core.ui.drawSyncSave(false); + core.status.event.selection=5; + core.ui.drawSyncSave(); }) break; case 6: @@ -1787,7 +1810,7 @@ events.prototype.keyUpSyncSave = function (keycode) { } } -////// 同步存档选择界面时的点击操作 +////// 同步存档选择界面时的点击操作 ////// events.prototype.clickSyncSelect = function (x, y) { if (x<5 || x>7) return; var choices = core.status.event.ui.choices; @@ -1797,12 +1820,114 @@ events.prototype.clickSyncSelect = function (x, y) { var selection = y - topIndex; switch (selection) { case 0: + core.syncSave('all'); + break; + case 1: + core.syncSave(); + break; + case 2: + core.status.event.selection=0; + core.ui.drawSyncSave(); break; - - } } +} +////// 同步存档选择界面时,按下某个键的操作 ////// +events.prototype.keyDownSyncSelect = function (keycode) { + if (keycode==38) { + core.status.event.selection--; + core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); + } + if (keycode==40) { + core.status.event.selection++; + core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); + } +} + +////// 同步存档选择界面时,放开某个键的操作 ////// +events.prototype.keyUpSyncSelect = function (keycode) { + if (keycode==27 || keycode==88) { + core.status.event.selection=0; + core.ui.drawSettings(); + return; + } + var choices = core.status.event.ui.choices; + if (keycode==13 || keycode==32 || keycode==67) { + var topIndex = 6 - parseInt((choices.length - 1) / 2); + this.clickSyncSelect(6, topIndex+core.status.event.selection); + } +} + +////// 存档下载界面时的点击操作 ////// +events.prototype.clickLocalSaveSelect = function (x,y) { + if (x<5 || x>7) return; + var choices = core.status.event.ui.choices; + + var topIndex = 6 - parseInt((choices.length - 1) / 2); + + var saves=null; + + if (y>=topIndex && y=1;i--) { + saves=core.getLocalStorage("save"+i, null); + if (core.isset(saves)) { + break; + } + } + break; + case 2: + break; + } + } + 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.status.event.selection=2; + core.ui.drawSyncSave(); +} + +////// 存档下载界面时,按下某个键的操作 ////// +events.prototype.keyDownLocalSaveSelect = function (keycode) { + if (keycode==38) { + core.status.event.selection--; + core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); + } + if (keycode==40) { + core.status.event.selection++; + core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); + } +} + +////// 存档下载界面时,放开某个键的操作 ////// +events.prototype.keyUpLocalSaveSelect = function (keycode) { + if (keycode==27 || keycode==88) { + core.status.event.selection=0; + core.ui.drawSettings(); + return; + } + var choices = core.status.event.ui.choices; + if (keycode==13 || keycode==32 || keycode==67) { + var topIndex = 6 - parseInt((choices.length - 1) / 2); + this.clickLocalSaveSelect(6, topIndex+core.status.event.selection); + } } ////// “虚拟键盘”界面时的点击操作 ////// diff --git a/libs/ui.js b/libs/ui.js index 05d0cda1..8ae58e02 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -696,6 +696,13 @@ ui.prototype.drawSyncSelect = function () { ]); } +////// 绘制单存档界面 ////// +ui.prototype.drawLocalSaveSelect = function () { + core.status.event.id = 'localSaveSelect'; + this.drawChoices(null, [ + "下载所有存档", "只下载最新单存档", "返回上级菜单" + ]); +} ////// 绘制分页 ////// ui.prototype.drawPagination = function (page, totalPage) {