diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index c944a919..efe76432 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -727,6 +727,7 @@ action | callBook_s | callSave_s | autoSave_s + | forbidSave_s | callLoad_s | previewUI_s | clearMap_s @@ -2660,6 +2661,21 @@ return code; */; +forbidSave_s + : '是否禁止存档' Bool Newline + + +/* forbidSave_s +tooltip : forbidSave: 禁止存档 +helpUrl : /_docs/#/instruction +colour : this.soundColor +default : [false] +Bool_0 = Bool_0 ? (', "forbid": true') : ''; +var code = '{"type": "forbidSave"'+Bool_0+'},\n'; +return code; +*/; + + callLoad_s : '呼出读档页面' Newline diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index 06ea0f0d..a49c1be8 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -807,6 +807,10 @@ ActionParser.prototype.parseAction = function() { this.next = MotaActionBlocks['autoSave_s'].xmlText([ data.nohint||false, this.next]); break; + case "forbidSave": // 禁止存档 + this.next = MotaActionBlocks['forbidSave_s'].xmlText([ + data.forbid||false, this.next]); + break; case "callLoad": // 呼出读档界面 this.next = MotaActionBlocks['callLoad_s'].xmlText([ this.next]); diff --git a/_server/editor_blocklyconfig.js b/_server/editor_blocklyconfig.js index de5f78c1..c77ec8c9 100644 --- a/_server/editor_blocklyconfig.js +++ b/_server/editor_blocklyconfig.js @@ -205,6 +205,7 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['callBook_s'].xmlText(), MotaActionBlocks['callSave_s'].xmlText(), MotaActionBlocks['autoSave_s'].xmlText(), + MotaActionBlocks['forbidSave_s'].xmlText(), MotaActionBlocks['callLoad_s'].xmlText(), ], 'UI绘制':[ diff --git a/libs/control.js b/libs/control.js index 81a1c2e2..9215e377 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1276,6 +1276,9 @@ control.prototype.startReplay = function (list) { core.status.replay.totalList = core.status.route.concat(list); core.status.replay.steps = 0; core.status.replay.save = []; + core.createCanvas('replay', 0, core.__PIXELS__ - 40, core.__PIXELS__, 40, 199); + core.setOpacity('replay', 0.6); + this._replay_drawProgress(); core.updateStatusBar(); core.drawTip("开始播放"); this.replay(); @@ -1359,6 +1362,7 @@ control.prototype.stopReplay = function (force) { core.status.replay.speed=1.0; core.status.replay.steps = 0; core.status.replay.save = []; + core.deleteCanvas('replay'); core.updateStatusBar(); core.drawTip("停止播放并恢复游戏"); } @@ -1384,6 +1388,9 @@ control.prototype.rewindReplay = function () { "steps": data.replay.steps, "save": save } + core.createCanvas('replay', 0, core.__PIXELS__ - 40, core.__PIXELS__, 40, 199); + core.setOpacity('replay', 0.6); + core.control._replay_drawProgress(); core.updateStatusBar(); core.drawTip("成功回退到上一个节点"); }); @@ -1466,6 +1473,7 @@ control.prototype.replay = function (force) { if (!core.isPlaying() || !core.isReplaying() || core.status.replay.animate || core.status.event.id) return; if (core.status.replay.pausing && !force) return; + this._replay_drawProgress(); if (core.status.replay.toReplay.length==0) return this._replay_finished(); this._replay_save(); @@ -1561,6 +1569,15 @@ control.prototype._replay_error = function (action) { }); } +control.prototype._replay_drawProgress = function () { + var total = core.status.replay.totalList.length, left = total - core.status.replay.toReplay.length; + var content = '播放进度:' + left + '/' + total + '('+(left/total*100).toFixed(2)+'%)'; + var width = 26 + core.calWidth('replay', content, "16px Arial"); + core.clearMap('replay'); + core.fillRect('replay', 0, 0, width, 40, '#000000'); + core.fillText('replay', content, 16, 27, '#FFFFFF'); +} + control.prototype.__replay_getTimeout = function () { if (core.status.replay.speed == 24) return 0; return 750 / Math.max(1, core.status.replay.speed); @@ -1727,6 +1744,7 @@ control.prototype._replayAction_key = function (action) { ////// 自动存档 ////// control.prototype.autosave = function (removeLast) { + if (core.hasFlag('__forbidSave__')) return; var x=null; if (removeLast) { x=core.status.route.pop(); diff --git a/libs/events.js b/libs/events.js index a91df571..9da4dcfa 100644 --- a/libs/events.js +++ b/libs/events.js @@ -87,7 +87,6 @@ events.prototype._startGame_setHard = function () { events.prototype._startGame_afterStart = function (callback) { core.ui.closePanel(); - this._startGame_statusBar(); core.changeFloor(core.firstData.floorId, null, core.firstData.hero.loc, null, function () { // 插入一个空事件避免直接回放录像出错 core.insertAction([]); @@ -96,14 +95,6 @@ events.prototype._startGame_afterStart = function (callback) { this._startGame_upload(); } -// 开始游戏时是否显示状态栏 -events.prototype._startGame_statusBar = function () { - if (core.flags.startUsingCanvas) - core.hideStatusBar(); - else - core.showStatusBar(); -} - events.prototype._startGame_upload = function () { // Upload var formData = new FormData(); @@ -2269,6 +2260,11 @@ events.prototype._action_autoSave = function (data, x, y, prefix) { core.doAction(); } +events.prototype._action_forbidSave = function (data, x, y, prefix) { + core.setFlag('__forbidSave__', data.forbid || null); + core.doAction(); +} + events.prototype._action_callLoad = function (data, x, y, prefix) { if (this.__action_checkReplaying()) return; var e = core.clone(core.status.event.data); @@ -2523,6 +2519,10 @@ events.prototype.openKeyBoard = function (fromUserAction) { ////// 点击保存按钮时的打开操作 ////// events.prototype.save = function (fromUserAction) { if (core.isReplaying()) return; + if (core.hasFlag('__forbidSave__')) { + core.drawTip('当前禁止存档'); + return; + } if (core.status.event.id == 'save' && core.events.recoverEvents(core.status.event.interval)) return; if (!this._checkStatus('save', fromUserAction)) return; diff --git a/mota-js10月和273issue.txt b/mota-js10月和273issue.txt index 91deaa4e..853ca76e 100644 --- a/mota-js10月和273issue.txt +++ b/mota-js10月和273issue.txt @@ -37,7 +37,9 @@ (x)26. 追加了公共事件版全局商店“快捷换装”以方便手机端,该事件的对话框可以再更透明一点来方便玩家边换装边观察地图显伤。 其他issues: -0.(1008)加入一个flag来控制当前是否允许存档,因为天气色调bgm进存档的情况下会屏蔽楼层切换,不进存档的话玩家原地SL又不保留。录像播放中加一个百分比(二次录制长度/原录像长度)显示,并且允许在已播放的任意节点之间快退快进。 +(√)0.(1008)加入一个flag来控制当前是否允许存档,因为天气色调bgm进存档的情况下会屏蔽楼层切换,不进存档的话玩家原地SL又不保留。 +(√)0.1. 录像播放中加一个百分比(二次录制长度/原录像长度)显示, +(x)0.2. 并且允许在已播放的任意节点之间快退快进。 1. 希望尝试修复2.6.x的高清UI、自动元件通行性(勇士和阻击怪可在同种图块内部自由通行,但进出另一种图块则必须通过桥梁)、仿rm光照和负色调(含true-light.js)等插件并加入样板,2.7.2发布以来插件库有了一些新插件,也希望加入(该修的bug要修,比如什么==NaN)。 2. 部分rm功能:确定键触发(很多作者可能会摆一些挡路的可通行事件但又希望可以像绿点一样穿透,比如因为目标层/点有分歧而不能用绿点只能用红点的楼梯,那么就需要勇士站在此点按下轻按键7或其他什么数字键来触发该事件)、斜向移动(插件库的磁铁特效,但blockly中的步伐口诀语法需要调整,最简单的调整方法是1不许省略,这样连续两个汉字就一定表示一个斜向了,还不影响接档)三行二列的自动元件、流体(草木茂盛处)、梯子(勇士始终脸朝上)、柜台的绘制,视频播放,动画多音效(可先不修改动画编辑器和导出器,给animate/json文件约定好语法并被drawAnimate/drawHeroAnimate执行即可),音频的变调变速和声道偏移、bgs(目前只能由作者自行用插件实现)和me(播放时bgm暂时淡出),另外建议提供bgm播放进度读写、多个bgm独立调节音量的API和事件,以及一个bgm循环插件,思路是事先约定每个bgm的循环起止点,并行检查是否越过终点,越过则跳转至起点。 3. 希望cannotMove(深蓝点)的高亮方式优化,显示出具体的禁行方向(如果嫌遮挡,可以提供一个按钮切换高亮方式)而不是只显示个深蓝点。另外cannotMove目前只控制out不控制in,建议追加in