diff --git a/libs/actions.js b/libs/actions.js index 0f8598c8..085318d5 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1690,6 +1690,7 @@ actions.prototype.clickSyncSave = function (x,y) { core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5route", JSON.stringify({ 'name': core.firstData.name, 'hard': core.status.hard, + 'seed': core.getFlag('seed'), 'route': core.encodeRoute(core.status.route) })); break; @@ -1922,8 +1923,11 @@ actions.prototype.clickReplay = function (x, y) { { core.ui.closePanel(); var hard=core.status.hard, route=core.clone(core.status.route); + var seed = core.getFlag('seed'); core.resetStatus(core.firstData.hero, hard, core.firstData.floorId, null, core.initStatus.maps); core.events.setInitData(hard); + core.setFlag('seed', seed); + core.setFlag('rand', seed); core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { core.startReplay(route); }, true); diff --git a/libs/control.js b/libs/control.js index a0707716..832681e7 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1845,8 +1845,11 @@ control.prototype.doSL = function (id, type) { // core.drawTip("存档版本不匹配"); if (confirm("存档版本不匹配!\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); @@ -1878,7 +1881,7 @@ control.prototype.doSL = function (id, type) { return; } var route = core.subarray(core.status.route, core.decodeRoute(data.route)); - if (!core.isset(route)) { + if (!core.isset(route) || data.hero.flags.seed!=core.getFlag('seed')) { core.drawTip("无法从此存档回放录像"); return; } diff --git a/libs/core.js b/libs/core.js index 01c18446..79aef3b0 100644 --- a/libs/core.js +++ b/libs/core.js @@ -1085,6 +1085,16 @@ core.prototype.subarray = function (a, b) { return core.utils.subarray(a, b); } +////// 生成随机数(seed方法) ////// +core.prototype.rand = function (num) { + return core.utils.rand(num); +} + +////// 生成随机数(录像方法) ////// +core.prototype.rand2 = function (num) { + return core.utils.rand2(num); +} + ////// 读取一个本地文件内容 ////// core.prototype.readFile = function (success, error, readType) { core.utils.readFile(success, error, readType); diff --git a/libs/events.js b/libs/events.js index c30ab341..cc6882c8 100644 --- a/libs/events.js +++ b/libs/events.js @@ -88,16 +88,19 @@ events.prototype.startGame = function (hard) { core.flags.battleAnimate = true; core.setLocalStorage('battleAnimate', true); core.startGame(hard); + core.utils.__init_seed(); core.events.setInitData(hard); }, function () { core.flags.battleAnimate = false; core.setLocalStorage('battleAnimate', false); core.startGame(hard); + core.utils.__init_seed(); core.events.setInitData(hard); }); } else { core.startGame(hard); + core.utils.__init_seed(); core.events.setInitData(hard); } }); @@ -141,6 +144,7 @@ events.prototype.gameOver = function (ending, fromReplay) { 'name': core.firstData.name, 'version': core.firstData.version, 'hard': core.status.hard, + 'seed': core.getFlag('seed'), 'route': core.encodeRoute(core.status.route) } core.download(core.firstData.name+"_"+core.formatDate2(new Date())+".h5route", JSON.stringify(obj)); @@ -181,6 +185,7 @@ events.prototype.gameOver = function (ending, fromReplay) { formData.append('money', core.status.hero.money); formData.append('experience', core.status.hero.experience); formData.append('steps', core.status.hero.steps); + formData.append('seed', core.getFlag('seed')); formData.append('route', core.encodeRoute(core.status.route)); core.http("POST", "/games/upload.php", formData); diff --git a/libs/utils.js b/libs/utils.js index 05cca350..52712f0c 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -241,8 +241,10 @@ utils.prototype.encodeRoute = function (route) { ans+='N'; else if (t.indexOf('move:')==0) ans+="M"+t.substring(5); - else if (t=='key:') + else if (t.indexOf('key:')==0) ans+='K'+t.substring(4); + else if (t.indexOf('random:')==0) + ans+='X'+t.substring(7); } }); if (cnt>0) { @@ -295,6 +297,7 @@ utils.prototype.decodeRoute = function (route) { case "N": ans.push("no"); break; case "M": ++index; ans.push("move:"+nxt+":"+getNumber()); break; case "K": ans.push("key:"+nxt); break; + case "X": ans.push("random:"+nxt); break; } } return ans; @@ -319,6 +322,54 @@ utils.prototype.subarray = function (a, b) { return na; } +utils.prototype.__init_seed = function () { + var rand = new Date().getTime()%34834795 + 3534; + rand = this.__next_rand(rand); + rand = this.__next_rand(rand); + rand = this.__next_rand(rand); + core.setFlag('seed', rand); + core.setFlag('rand', rand); +} + +utils.prototype.__next_rand = function (_rand) { + _rand=(_rand%127773)*16807-~~(_rand/127773)*2836; + _rand+=_rand<0?2147483647:0; + return _rand; +} + +utils.prototype.rand = function (num) { + var rand = core.getFlag('rand'); + rand = this.__next_rand(rand); + core.setFlag('rand', rand); + var ans = rand/2147483647; + if (core.isset(num) && num>0) + return Math.floor(ans*num); + return ans; +} + +////// 生成随机数(录像方法) ////// +utils.prototype.rand2 = function (num) { + num = num||2147483648; + + var value; + if (core.status.replay.replaying) { + var action = core.status.replay.toReplay.shift(); + if (action.indexOf("input:")==0 ) { + value=parseInt(action.substring(6)); + } + else { + core.stopReplay(); + core.drawTip("录像文件出错"); + return; + } + } + else { + value = Math.floor(Math.random()*num); + } + core.status.route.push("random:"+value); + return value; +} + ////// 读取一个本地文件内容 ////// utils.prototype.readFile = function (success, error, readType) { diff --git a/main.js b/main.js index 8ea26334..3fe630bc 100644 --- a/main.js +++ b/main.js @@ -487,6 +487,8 @@ main.dom.replayGame.onclick = function () { core.dom.startPanel.style.display = 'none'; core.resetStatus(core.firstData.hero, obj.hard, core.firstData.floorId, null, core.initStatus.maps); core.events.setInitData(obj.hard); + core.setFlag('seed', obj.seed); + core.setFlag('rand', obj.seed); core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { core.startReplay(core.decodeRoute(obj.route)); }, true); diff --git a/更新说明.txt b/更新说明.txt index d7a7caa9..cc5a5c91 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -7,7 +7,7 @@ 等待用户点击事件 √ 图片移动事件 事件:设置BGM音量 √ -提供core.random函数提供随机数 +提供core.rand()和core.rand2()两个随机数函数 √ 作弊处理 状态栏绘制 六倍速播放 √