diff --git a/_docs/api.md b/_docs/api.md
index 58ee76f4..b003bf23 100644
--- a/_docs/api.md
+++ b/_docs/api.md
@@ -546,12 +546,13 @@ saveAndStopAutomaticRoute: fn()
saveData: fn()
存档到本地
-screenFlash: fn(color: [number], time: number, times?: number, callback?: fn())
+screenFlash: fn(color: [number], time: number, times?: number, moveMode?: string, callback?: fn())
画面闪烁
例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填
time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去
times: 闪烁的总次数,不填或填0都视为1
+moveMode: 渐变方式
callback: 闪烁全部完毕后的回调函数,可选
setAutoHeroMove: fn(steps: [?])
@@ -578,11 +579,12 @@ setBuff: fn(name: string, value: number)
name: 属性的英文名,请注意只能用于数值类属性哦,否则随后的乘法会得到NaN
value: 新的百分比修正倍率,不填(效果上)视为1
-setCurtain: fn(color?: [number], time?: number, callback?: fn())
+setCurtain: fn(color?: [number], time?: number, moveMode?: string, callback?: fn())
更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数
例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]
time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
+moveMode: 渐变方式
callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction
setDisplayScale: fn(delta: number)
@@ -938,7 +940,7 @@ confirmRestart: fn()
doAction: fn()
执行下一个事件指令,常作为回调
-例如:core.setCurtain([0,0,0,1], undefined, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果
+例如:core.setCurtain([0,0,0,1], undefined, null, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果
doEvent: fn(data?: ?, x?: number, y?: number, prefix?: string)
执行一个自定义事件
diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js
index c48a8388..848e3c26 100644
--- a/_server/CodeMirror/defs.js
+++ b/_server/CodeMirror/defs.js
@@ -2145,12 +2145,12 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
"!type": "fn()"
},
"screenFlash": {
- "!doc": "画面闪烁
例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填
time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去
times: 闪烁的总次数,不填或填0都视为1
callback: 闪烁全部完毕后的回调函数,可选",
- "!type": "fn(color: [number], time: number, times?: number, callback?: fn())"
+ "!doc": "画面闪烁
例如:core.screenFlash([255, 0, 0, 1], 3); // 红屏一闪而过
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若填负数则会被视为0)的颜色数组,必填
time: 单次闪烁时长,实际闪烁效果为先花其三分之一的时间渐变到目标色调,再花剩余三分之二的时间渐变回去
times: 闪烁的总次数,不填或填0都视为1
moveMode: 渐变方式
callback: 闪烁全部完毕后的回调函数,可选",
+ "!type": "fn(color: [number], time: number, times?: number, moveMode?: string, callback?: fn())"
},
"setCurtain": {
- "!doc": "更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数
例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]
time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction",
- "!type": "fn(color?: [number], time?: number, callback?: fn())"
+ "!doc": "更改画面色调,不计入存档。如需长期生效请使用core.events._action_setCurtain()函数
例如:core.setCurtain(); // 恢复画面色调,用时四分之三秒
color: 一行三列(第四列视为1)或一行四列(第四列若大于1则会被视为1,第四列若为负数则会被视为0)的颜色数组,不填视为[0, 0, 0, 0]
time: 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
moveMode: 渐变方式
callback: 更改完毕后的回调函数,可选。事件流中常取core.doAction",
+ "!type": "fn(color?: [number], time?: number, moveMode?: string, callback?: fn())"
},
"updateDamage": {
"!doc": "重算并绘制地图显伤
例如:core.updateDamage(); // 更新当前地图的显伤,绘制在显伤层(废话)
floorId: 地图id,不填视为当前地图。预览地图时填写
ctx: 绘制到的画布,如果填写了就会画在该画布而不是显伤层",
@@ -3817,7 +3817,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
"!type": "fn(id?: string, x?: number, y?: number, isGentleClick?: bool)"
},
"doAction": {
- "!doc": "执行下一个事件指令,常作为回调
例如:core.setCurtain([0,0,0,1], undefined, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果",
+ "!doc": "执行下一个事件指令,常作为回调
例如:core.setCurtain([0,0,0,1], null, null, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果",
"!type": "fn()"
},
"openBook": {
diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4
index 8ec17bb5..30afdf0b 100644
--- a/_server/MotaAction.g4
+++ b/_server/MotaAction.g4
@@ -2218,49 +2218,52 @@ return code;
*/;
setCurtain_0_s
- : '更改画面色调' ColorString Colour '动画时间' IntString '持续到下一个本事件' Bool '不等待执行完毕' Bool Newline
+ : '更改画面色调' ColorString Colour '动画时间' IntString? BGNL? Newline '渐变方式' MoveMode_List '持续到下一个本事件' Bool '不等待执行完毕' Bool Newline
/* setCurtain_0_s
tooltip : setCurtain: 更改画面色调,动画时间可不填
helpUrl : /_docs/#/instruction
-default : ["255,255,255,1",'rgba(255,255,255,1)',500,true,false]
+default : ["255,255,255,1",'rgba(255,255,255,1)',500,'',true,false]
colour : this.soundColor
previewBlock : true
IntString_0 = IntString_0 ?(', "time": '+IntString_0):'';
+MoveMode_List_0 = (MoveMode_List_0!=='') ? (', "moveMode": "'+MoveMode_List_0+'"'):'';
Bool_0 = Bool_0 ? ', "keep": true' : '';
var async = Bool_1?', "async": true':'';
-var code = '{"type": "setCurtain", "color": ['+ColorString_0+']'+IntString_0 +Bool_0+async+'},\n';
+var code = '{"type": "setCurtain", "color": ['+ColorString_0+']'+IntString_0+MoveMode_List_0+Bool_0+async+'},\n';
return code;
*/;
setCurtain_1_s
- : '恢复画面色调' '动画时间' IntString? '不等待执行完毕' Bool Newline
+ : '恢复画面色调' '动画时间' IntString? '渐变方式' MoveMode_List '不等待执行完毕' Bool Newline
/* setCurtain_1_s
tooltip : setCurtain: 恢复画面色调,动画时间可不填
helpUrl : /_docs/#/instruction
-default : [500,false]
+default : [500,'',false]
colour : this.soundColor
IntString_0 = IntString_0 ?(', "time": '+IntString_0):'';
+MoveMode_List_0 = (MoveMode_List_0!=='') ? (', "moveMode": "'+MoveMode_List_0+'"'):'';
var async = Bool_0?', "async": true':'';
-var code = '{"type": "setCurtain"'+IntString_0 +async+'},\n';
+var code = '{"type": "setCurtain"'+IntString_0+MoveMode_List_0 +async+'},\n';
return code;
*/;
screenFlash_s
- : '画面闪烁' ColorString Colour '单次时间' Int '执行次数' IntString? '不等待执行完毕' Bool Newline
+ : '画面闪烁' ColorString Colour '单次时间' Int '执行次数' IntString? '渐变方式' MoveMode_List '不等待执行完毕' Bool Newline
/* screenFlash_s
tooltip : screenFlash: 画面闪烁,动画时间可不填
helpUrl : /_docs/#/instruction
-default : ["255,255,255,1",'rgba(255,255,255,1)',500,1,false]
+default : ["255,255,255,1",'rgba(255,255,255,1)',500,1,'',false]
colour : this.soundColor
if (ColorString_0 == '') throw new Error('颜色格式错误,形如:0~255,0~255,0~255,0~1');
IntString_0 = IntString_0 ? (', "times": '+IntString_0):'';
+MoveMode_List_0 = (MoveMode_List_0!=='') ? (', "moveMode": "'+MoveMode_List_0+'"'):'';
var async = Bool_0?', "async": true':'';
-var code = '{"type": "screenFlash", "color": ['+ColorString_0+'], "time": '+Int_0 +IntString_0+async+'},\n';
+var code = '{"type": "screenFlash", "color": ['+ColorString_0+'], "time": '+Int_0 +IntString_0+MoveMode_List_0+async+'},\n';
return code;
*/;
diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js
index e86b7131..8b63b287 100644
--- a/_server/MotaActionParser.js
+++ b/_server/MotaActionParser.js
@@ -605,16 +605,16 @@ ActionParser.prototype.parseAction = function() {
if(this.isset(data.color)){
data.color = this.Colour(data.color);
this.next = MotaActionBlocks['setCurtain_0_s'].xmlText([
- data.color,'rgba('+data.color+')',data.time,data.keep||false,data.async||false,this.next]);
+ data.color,'rgba('+data.color+')',data.time,data.moveMode,data.keep||false,data.async||false,this.next]);
} else {
this.next = MotaActionBlocks['setCurtain_1_s'].xmlText([
- data.time,data.async||false,this.next]);
+ data.time,data.moveMode,data.async||false,this.next]);
}
break;
case "screenFlash": // 画面闪烁
data.color = this.Colour(data.color);
this.next = MotaActionBlocks['screenFlash_s'].xmlText([
- data.color,'rgba('+data.color+')',data.time||500,data.times,data.async||false,this.next]);
+ data.color,'rgba('+data.color+')',data.time||500,data.times,data.moveMode,data.async||false,this.next]);
break;
case "setWeather": // 更改天气
this.next = MotaActionBlocks['setWeather_s'].xmlText([
diff --git a/libs/control.js b/libs/control.js
index e8bd6979..e9491e9c 100644
--- a/libs/control.js
+++ b/libs/control.js
@@ -2679,7 +2679,7 @@ control.prototype._weather_sun = function (level) {
}
////// 更改画面色调 //////
-control.prototype.setCurtain = function(color, time, callback) {
+control.prototype.setCurtain = function(color, time, moveMode, callback) {
if (time == null) time=750;
if (time<=0) time=0;
if (!core.status.curtainColor)
@@ -2697,24 +2697,25 @@ control.prototype.setCurtain = function(color, time, callback) {
return;
}
- this._setCurtain_animate(core.status.curtainColor, color, time, callback);
+ this._setCurtain_animate(core.status.curtainColor, color, time, moveMode, callback);
}
-control.prototype._setCurtain_animate = function (nowColor, color, time, callback) {
+control.prototype._setCurtain_animate = function (nowColor, color, time, moveMode, callback) {
time /= Math.max(core.status.replay.speed, 1)
- var per_time = 10, step = parseInt(time / per_time);
- if (step <= 0) step = 1;
+ var per_time = 10, step = 0, steps = parseInt(time / per_time);
+ if (steps <= 0) steps = 1;
+ var moveFunc = core.applyEasing(moveMode);
var animate = setInterval(function() {
- nowColor = [
- (nowColor[0]*(step-1)+color[0])/step,
- (nowColor[1]*(step-1)+color[1])/step,
- (nowColor[2]*(step-1)+color[2])/step,
- (nowColor[3]*(step-1)+color[3])/step,
- ];
+ step++;
+ var curr = [
+ nowColor[0] + (color[0] - nowColor[0]) * moveFunc(step / steps),
+ nowColor[1] + (color[1] - nowColor[1]) * moveFunc(step / steps),
+ nowColor[2] + (color[2] - nowColor[2]) * moveFunc(step / steps),
+ nowColor[3] + (color[3] - nowColor[3]) * moveFunc(step / steps),
+ ]
core.clearMap('curtain');
- core.fillRect('curtain', 0, 0, core.__PIXELS__, core.__PIXELS__, core.arrayToRGBA(nowColor));
- step--;
- if (step <= 0) {
+ core.fillRect('curtain', 0, 0, core.__PIXELS__, core.__PIXELS__, core.arrayToRGBA(curr));
+ if (step == steps) {
delete core.animateFrame.asyncId[animate];
clearInterval(animate);
core.status.curtainColor = color;
@@ -2726,14 +2727,14 @@ control.prototype._setCurtain_animate = function (nowColor, color, time, callbac
}
////// 画面闪烁 //////
-control.prototype.screenFlash = function (color, time, times, callback) {
+control.prototype.screenFlash = function (color, time, times, moveMode, callback) {
times = times || 1;
time = time / 3;
var nowColor = core.clone(core.status.curtainColor);
- core.setCurtain(color, time, function() {
- core.setCurtain(nowColor, time * 2, function() {
+ core.setCurtain(color, time, moveMode, function() {
+ core.setCurtain(nowColor, time * 2, moveMode, function() {
if (times > 1)
- core.screenFlash(color, time * 3, times - 1, callback);
+ core.screenFlash(color, time * 3, times - 1, moveMode, callback);
else {
if (callback) callback();
}
diff --git a/libs/events.js b/libs/events.js
index cca91444..2f978f6b 100644
--- a/libs/events.js
+++ b/libs/events.js
@@ -1662,12 +1662,12 @@ events.prototype._precompile_rotateImage = function (data) {
events.prototype._action_setCurtain = function (data, x, y, prefix) {
if (data.async) {
- core.setCurtain(data.color, data.time);
+ core.setCurtain(data.color, data.time, data.moveMode);
if (data.color == null || data.keep) core.setFlag('__color__', data.color || null);
core.doAction();
}
else {
- core.setCurtain(data.color, data.time, function () {
+ core.setCurtain(data.color, data.time, data.moveMode, function () {
if (data.color == null || data.keep) core.setFlag('__color__', data.color || null);
core.doAction();
});
@@ -1675,7 +1675,7 @@ events.prototype._action_setCurtain = function (data, x, y, prefix) {
}
events.prototype._action_screenFlash = function (data, x, y, prefix) {
- this.__action_doAsyncFunc(data.async, core.screenFlash, data.color, data.time, data.times);
+ this.__action_doAsyncFunc(data.async, core.screenFlash, data.color, data.time, data.times, data.moveMode);
}
events.prototype._action_setWeather = function (data, x, y, prefix) {
diff --git a/runtime.d.ts b/runtime.d.ts
index 7d3cf68c..3da4eea2 100644
--- a/runtime.d.ts
+++ b/runtime.d.ts
@@ -572,7 +572,7 @@ declare class control {
* @param time 渐变时间,单位为毫秒。不填视为750ms,负数视为0(无渐变,立即更改)
* @param callback 更改完毕后的回调函数,可选。事件流中常取core.doAction
*/
- setCurtain(color?: [number, number, number, number?], time?: number, callback?: () => void): void
+ setCurtain(color?: [number, number, number, number?], time?: number, moveMode?: string, callback?: () => void): void
/**
* 画面闪烁
@@ -582,7 +582,7 @@ declare class control {
* @param times 闪烁的总次数,不填或填0都视为1
* @param callback 闪烁全部完毕后的回调函数,可选
*/
- screenFlash(color: [number, number, number, number], time: number, times?: number, callback?: () => void): void
+ screenFlash(color: [number, number, number, number], time: number, times?: number, moveMode?: string, callback?: () => void): void
/**
* 播放背景音乐,中途开播但不计入存档且只会持续到下次场景切换。如需长期生效请将背景音乐的文件名赋值给flags.__bgm__
@@ -900,7 +900,7 @@ declare class events {
/**
* 执行下一个事件指令,常作为回调
- * @example core.setCurtain([0,0,0,1], undefined, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果
+ * @example core.setCurtain([0,0,0,1], undefined, null, core.doAction); // 事件中的原生脚本,配合勾选“不自动执行下一个事件”来达到此改变色调只持续到下次场景切换的效果
* @param keepUI true表示不清除UI画布和选择光标
*/
doAction(keepUI?: true): void