diff --git a/_docs/api.md b/_docs/api.md index b4723ae5..b2493a82 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -610,6 +610,9 @@ noGather: 是否聚集跟随者 setHeroMoveInterval: fn(callback?: fn()) 设置行走的效果动画 +setHeroOpacity: fn(opacity?: number, moveMode?: string, time?: number, callback?: fn()) +改变勇士的不透明度 + setMusicBtn: fn() 设置音乐图标的显隐状态 @@ -682,9 +685,6 @@ triggerDebuff: fn(action: string, type: string|[string]) action: 要获得还是移除,'get'为获得,'remove'为移除 type: 获得或移除的内容(poison/weak/curse),可以为字符串或数组 -triggerHero: fn(type?: string, time?: number, callback?: fn()) -改变勇士的显隐状态 - triggerReplay: fn() 播放或暂停录像回放 diff --git a/_docs/instruction.md b/_docs/instruction.md index 790473dd..6c48588a 100644 --- a/_docs/instruction.md +++ b/_docs/instruction.md @@ -581,8 +581,8 @@ core.insertAction({"type": "changeFloor", "floorId": "MT" + core.rand2(20)}) * V2.8.1起,支持暂时锁定视角,视角锁定期间,只有上下楼后才会将视角重置到勇士身上(但依然保持锁定)。 4. **显隐状态栏:**如题,如果隐藏状态栏期间勇士需要恢复行动,则建议不隐藏竖屏工具栏以方便手机玩家。 * 实际调用`core.showStatusBar()`和`core.hideStatusBar(showToolbox)` -5. **显隐勇士:**如题,动画时间为淡入淡出时间,异步勾选框用法如前。 - * 实际调用`core.triggerHero(type, time, callback)` +5. **设置勇士不透明度:**如题,动画时间为淡入淡出时间,异步勾选框用法如前。 + * 实际调用`core.setHeroOpacity(opacity, moveMode, time, callback)` 6. **更改画面色调:**色调可以用调色器调配,“动画时间”为渐变的总时间。 * 请注意渐变是在RGBA颜色空间中直线运动(V2.8.1支持加速度),因此效果可能不好,画面闪烁同理。 * 如需在勇士自由行动时反复执行,请使用并行脚本或自我回调。 diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js index 1a5f1c57..9ecbfc5a 100644 --- a/_server/CodeMirror/defs.js +++ b/_server/CodeMirror/defs.js @@ -2239,9 +2239,9 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!doc": "半自动寻路,用于鼠标或手指拖动
例如:core.setAutomaticRoute(0, 0, [{direction: \"right\", x: 4, y: 9}, {direction: \"right\", x: 5, y: 9}]);
destX: 鼠标或手指的起拖点横坐标
destY: 鼠标或手指的起拖点纵坐标
stepPostfix: 拖动轨迹的数组表示,每项为一步的方向和目标点。", "!type": "fn(destX: number, destY: number, stepPostfix: [{x: number, y: number, direction: string}])" }, - "triggerHero": { - "!doc": "改变勇士的显隐状态", - "!type": "fn(type?: string, time?: number, callback?: fn())" + "setHeroOpacity": { + "!doc": "改变勇士的不透明度", + "!type": "fn(opacity?: number, moveMode?: string, time?: number, callback?: fn())" }, "gatherFollowers": { "!doc": "立刻聚集所有的跟随者", diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index fb846fdd..57ff4cb0 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -847,8 +847,7 @@ action | update_s | showStatusBar_s | hideStatusBar_s - | showHero_s - | hideHero_s + | setHeroOpacity_s | sleep_s | wait_s | waitAsync_s @@ -1780,33 +1779,19 @@ var code = '{"type": "hideStatusBar"'+Bool_0+'},\n'; return code; */; -showHero_s - : '显示勇士' '动画时间' IntString? '不等待执行完毕' Bool Newline +setHeroOpacity_s + : '设置勇士不透明度' Number '渐变方式' MoveMode_List '动画时间' IntString? '不等待执行完毕' Bool Newline - -/* showHero_s -tooltip : showHero: 显示勇士 +/* setHeroOpacity_s +tooltip : setHeroOpacity: 设置勇士不透明度 helpUrl : /_docs/#/instruction -default : ['',false] +default : [1,'','',false] colour : this.soundColor +if (Number_0 < 0 || Number_0 > 1) throw new Error('不透明度需要在0~1之间'); +MoveMode_List_0 = (MoveMode_List_0!=='') ? (', "moveMode": "'+MoveMode_List_0+'"'):''; IntString_0 = IntString_0 && (', "time": ' + IntString_0); Bool_0 = Bool_0 ? (', "async": true') : ''; -var code = '{"type": "showHero"'+IntString_0+Bool_0+'},\n'; -return code; -*/; - -hideHero_s - : '隐藏勇士' '动画时间' IntString? '不等待执行完毕' Bool Newline - - -/* hideHero_s -tooltip : hideHero: 隐藏勇士 -helpUrl : /_docs/#/instruction -default : ['',false] -colour : this.soundColor -IntString_0 = IntString_0 && (', "time": ' + IntString_0); -Bool_0 = Bool_0 ? (', "async": true') : ''; -var code = '{"type": "hideHero"'+IntString_0+Bool_0+'},\n'; +var code = '{"type": "setHeroOpacity", "opacity": '+Number_0+MoveMode_List_0+IntString_0+Bool_0+'},\n'; return code; */; diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index 3f9d6193..34937f6f 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -931,13 +931,9 @@ ActionParser.prototype.parseAction = function() { this.next = MotaActionBlocks['hideStatusBar_s'].xmlText([ data.toolbox||false,this.next]); break; - case "showHero": - this.next = MotaActionBlocks['showHero_s'].xmlText([ - data.time, data.async||false, this.next]); - break; - case "hideHero": - this.next = MotaActionBlocks['hideHero_s'].xmlText([ - data.time, data.async||false, this.next]); + case "setHeroOpacity": + this.next = MotaActionBlocks['setHeroOpacity_s'].xmlText([ + data.opacity, data.moveMode, data.time, data.async||false, this.next]); break; case "sleep": // 等待多少毫秒 this.next = MotaActionBlocks['sleep_s'].xmlText([ diff --git a/_server/editor_blocklyconfig.js b/_server/editor_blocklyconfig.js index f460ac4b..c1945512 100644 --- a/_server/editor_blocklyconfig.js +++ b/_server/editor_blocklyconfig.js @@ -204,8 +204,7 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['lockViewport_s'].xmlText(), MotaActionBlocks['showStatusBar_s'].xmlText(), MotaActionBlocks['hideStatusBar_s'].xmlText(), - MotaActionBlocks['showHero_s'].xmlText(), - MotaActionBlocks['hideHero_s'].xmlText(), + MotaActionBlocks['setHeroOpacity_s'].xmlText(), MotaActionBlocks['setCurtain_0_s'].xmlText(), MotaActionBlocks['setCurtain_1_s'].xmlText(), MotaActionBlocks['screenFlash_s'].xmlText(), diff --git a/extensions/localSave.js b/extensions/localSave.js index 455b36ce..67071201 100644 --- a/extensions/localSave.js +++ b/extensions/localSave.js @@ -38,8 +38,10 @@ fs.deleteFile('_saves/' + name, callback); } - core.utils.clearLocalForage = function (name, callback) { - // Nothing to do + core.utils.clearLocalForage = function (callback) { + fs.deleteFile('_saves', function () { + fs.mkdir('_saves', callback); + }) } core.utils.iterateLocalForage = function (iter, callback) { diff --git a/libs/actions.js b/libs/actions.js index 0cfa4d37..f6cb78ea 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -2819,6 +2819,7 @@ actions.prototype._clickStorageRemove_all = function () { core.saves.autosave.data = null; core.saves.autosave.updated = false; core.saves.autosave.now = 0; + core.saves.cache = {}; core.ui.closePanel(); core.saves.saveIndex = 1; core.saves.favorite = []; diff --git a/libs/control.js b/libs/control.js index 3c6e2084..e61bc095 100644 --- a/libs/control.js +++ b/libs/control.js @@ -838,9 +838,7 @@ control.prototype.drawHero = function (status, offset, frame) { this._drawHero_updateViewport(x, y, offset); } - if (!core.hasFlag('hideHero')) { - this._drawHero_draw(direction, x, y, status, offset, frame); - } + this._drawHero_draw(direction, x, y, status, offset, frame); } control.prototype._drawHero_updateViewport = function (x, y, offset) { @@ -851,11 +849,13 @@ control.prototype._drawHero_updateViewport = function (x, y, offset) { control.prototype._drawHero_draw = function (direction, x, y, status, offset, frame) { offset = offset || {x: 0, y: 0, offset: 0, px: 0, py: 0}; + var opacity = core.setAlpha('hero', core.getFlag('__heroOpacity__', 1)) this._drawHero_getDrawObjs(direction, x, y, status, offset).forEach(function (block) { core.drawImage('hero', block.img, (block.heroIcon[block.status] + (frame || 0))%4*block.width, block.heroIcon.loc * block.height, block.width, block.height, block.posx+(32-block.width)/2, block.posy+32-block.height, block.width, block.height); }); + core.setAlpha('hero', opacity); } control.prototype._drawHero_getDrawObjs = function (direction, x, y, status, offset) { @@ -889,40 +889,28 @@ control.prototype._drawHero_getDrawObjs = function (direction, x, y, status, off }); } -control.prototype.triggerHero = function (type, time, callback) { - if (type == null) { - type = core.hasFlag('hideHero') ? 'show' : 'hide'; - } - if ((core.hasFlag('hideHero') && type != 'show') || (!core.hasFlag('hideHero') && type != 'hide')) { - if (callback) callback(); - return; - } - core.removeFlag('hideHero'); - - var cb = function () { - if (type == 'hide') core.setFlag('hideHero', true); - core.drawHero(); - if (callback) callback(); - return; - } - +control.prototype.setHeroOpacity = function (opacity, moveMode, time, callback) { time = time || 0; - if (time == 0) return cb(); - time /= Math.max(core.status.replay.speed, 1) - this._triggerHero_animate(type, 10 / time, cb); -} - -control.prototype._triggerHero_animate = function (type, delta, callback) { - var opacity = type != 'show' ? 1 : 0; - var animate = setInterval(function () { - opacity += type != 'show' ? -delta : delta; - core.setAlpha('hero', opacity); + if (time == 0) { + core.setFlag('__heroOpacity__', opacity); core.drawHero(); - core.setAlpha('hero', 1); - if (opacity >= 1 || opacity <= 0) { + if (callback) callback(); + return; + } + time /= Math.max(core.status.replay.speed, 1) + + var fromOpacity = core.getFlag('__heroOpacity__', 1); + var step = 0, steps = parseInt(time / 10); + if (steps <= 0) steps = 1; + var moveFunc = core.applyEasing(moveMode); + + var animate = setInterval(function () { + step++; + core.setFlag('__heroOpacity__', fromOpacity + (opacity - fromOpacity) * moveFunc(step / steps)); + core.drawHero(); + if (step == steps) { delete core.animateFrame.asyncId[animate]; clearInterval(animate); - core.drawHero(); if (callback) callback(); } }, 10); diff --git a/libs/events.js b/libs/events.js index 1ac07c1d..0cf4023d 100644 --- a/libs/events.js +++ b/libs/events.js @@ -2346,22 +2346,22 @@ events.prototype._action_hideStatusBar = function (data, x, y, prefix) { } events.prototype._action_showHero = function (data, x, y, prefix) { - data.time = data.time || 0; - if (data.time > 0) { - this.__action_doAsyncFunc(data.async, core.triggerHero, 'show', data.time); - } else { - core.removeFlag('hideHero'); - core.drawHero(); - core.doAction(); - } + data.opacity = 1; + return this._action_setHeroOpacity(data, x, y, prefix); } events.prototype._action_hideHero = function (data, x, y, prefix) { + data.opacity = 0; + return this._action_setHeroOpacity(data, x, y, prefix); +} + +events.prototype._action_setHeroOpacity = function (data, x, y, prefix) { data.time = data.time || 0; + if (data.opacity == null) data.opacity = 1; if (data.time > 0) { - this.__action_doAsyncFunc(data.async, core.triggerHero, 'hide', data.time); + this.__action_doAsyncFunc(data.async, core.setHeroOpacity, data.opacity, data.moveMode, data.time); } else { - core.setFlag('hideHero', true); + core.setFlag('__heroOpacity__', data.opacity); core.drawHero(); core.doAction(); } diff --git a/libs/maps.js b/libs/maps.js index 5663e92e..5b6b5798 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -968,9 +968,9 @@ maps.prototype._getBigImageInfo = function (bigImage, face, animate) { } var dx, dy; switch (face) { - case "down": case "up": dx = 16 - per_width / 2; dy = 32 - per_height; break; - case "left": dx = 0; dy = 32 - per_height; break; - case "right": dx = 32 - per_width; dy = 32 - per_height; break; + case "down": case "up": case "left": case "right": dx = 16 - per_width / 2; dy = 32 - per_height; break; + // case "left": dx = 0; dy = 32 - per_height; break; + // case "right": dx = 32 - per_width; dy = 32 - per_height; break; } return {sx: sx, sy: sy, per_width: per_width, per_height: per_height, face: face, dx: dx, dy: dy}; @@ -1033,7 +1033,7 @@ maps.prototype._drawBlockInfo_bigImage = function (blockInfo, x, y, ctx) { var dx = bigImageInfo.dx, dy = bigImageInfo.dy; switch (bigImageInfo.face) { - case "down": case "up": + case "down": case "up": case "left": case "right": core.createCanvas(header, px + dx, py + dy, per_width, -dy, 51); this._drawBlockInfo_drawWithFilter(blockInfo, header, function () { core.drawImage(header, bigImage, sx, sy, per_width, -dy, 0, 0, per_width, -dy); @@ -1043,7 +1043,7 @@ maps.prototype._drawBlockInfo_bigImage = function (blockInfo, x, y, ctx) { core.drawImage(body, bigImage, sx, sy - dy, per_width, 32, 0, 0, per_width, 32); }) break; - case "left": + /*case "left": core.createCanvas(header, px + dx, py + dy, per_width, -dy, 51); this._drawBlockInfo_drawWithFilter(blockInfo, header, function () { core.drawImage(header, bigImage, sx, sy, per_width, -dy, 0, 0, per_width, -dy); @@ -1062,7 +1062,7 @@ maps.prototype._drawBlockInfo_bigImage = function (blockInfo, x, y, ctx) { this._drawBlockInfo_drawWithFilter(blockInfo, body, function () { core.drawImage(body, bigImage, sx, sy - dy, per_width, 32, 0, 0, per_width, 32); }); - break; + break;*/ } if (core.dymCanvas[header]) { core.dymCanvas[header].canvas.setAttribute('_ox', 32 * x + dx); diff --git a/runtime.d.ts b/runtime.d.ts index d1cf7de3..57c9ee7b 100644 --- a/runtime.d.ts +++ b/runtime.d.ts @@ -638,8 +638,8 @@ declare class control { /** 瞬间移动 */ moveDirectly(destX?: any, destY?: any, ignoreSteps?: any): void - /** 改变勇士的显隐状态 */ - triggerHero(type?: 'show' | 'hide', time?: any, callback?: () => any): void + /** 改变勇士的不透明度 */ + setHeroOpacity(opacity?: number, moveMode?: string, time?: any, callback?: () => any): void /** 加减画布偏移 */ addGameCanvasTranslate(x?: number, y?: number): void