Skip to content

Commit 5da8594

Browse files
committed
Feature: Make SpeedrunTimer become transparent when TAS pauses.
Adjust: Divide "More Options" into three pages Feature: Allow PageUp/PageDown in subMenu
1 parent b79fa36 commit 5da8594

11 files changed

Lines changed: 793 additions & 560 deletions

Dialog/English.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ TAS_HELPER_PREDICTOR_POINT_SIZE= Dot Size
210210

211211
# ============================================= Other =====================================================
212212
TAS_HELPER_MORE_OPTIONS= More Options
213+
TAS_HELPER_MORE_OPTIONS_FINISHED= Finished
214+
TAS_HELPER_MORE_OPTIONS_PAGE1= Page 1
215+
TAS_HELPER_MORE_OPTIONS_PAGE2= Page 2
216+
TAS_HELPER_MORE_OPTIONS_PAGE3= Page 3
213217
TAS_HELPER_SPAWN_POINT= Show Spawn Point
214218
TAS_HELPER_CURRENT_SPAWN_POINT_OPACITY= Current Spawn Point Opacity
215219
TAS_HELPER_OTHER_SPAWN_POINT_OPACITY= Other Spawn Point Opacity
@@ -252,3 +256,4 @@ TAS_HELPER_SUBSCRIBE_WHATS_NEW_DESCRIPTION= "Whats's New" will sh
252256
TAS_HELPER_MOVEMENT_OVERSHOOT_ASSISTANT= Movement Overshoot Assistant
253257
TAS_HELPER_MOA_ABOVE_PLAYER= Show above Player
254258
TAS_HELPER_MOA_DESCRIPTION= Show how far player would go if there were no walls.
259+
TAS_HELPER_SPEEDRUNTIMER_OPACITY_WHEN_TAS_PAUSES= SpeedrunTimer Opacity when TAS Pauses

Dialog/Simplified Chinese.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,10 @@ TAS_HELPER_PREDICTOR_POINT_SIZE= 点的大小
198198

199199
# ============================================= Other =====================================================
200200
TAS_HELPER_MORE_OPTIONS= 更多选项
201+
TAS_HELPER_MORE_OPTIONS_FINISHED= 完成
202+
TAS_HELPER_MORE_OPTIONS_PAGE1= 第 1 页
203+
TAS_HELPER_MORE_OPTIONS_PAGE2= 第 2 页
204+
TAS_HELPER_MORE_OPTIONS_PAGE3= 第 3 页
201205
TAS_HELPER_SPAWN_POINT= 显示出生点
202206
TAS_HELPER_CURRENT_SPAWN_POINT_OPACITY= 当前出生点不透明度
203207
TAS_HELPER_OTHER_SPAWN_POINT_OPACITY= 其他出生点不透明度
@@ -237,4 +241,5 @@ TAS_HELPER_SUBSCRIBE_WHATS_NEW= 订阅 What's New!
237241
TAS_HELPER_SUBSCRIBE_WHATS_NEW_DESCRIPTION= 每次更新时, "Whats's New" 会告诉你新增加的特性, 阅后消失.
238242
TAS_HELPER_MOVEMENT_OVERSHOOT_ASSISTANT= 移动过量助手
239243
TAS_HELPER_MOA_ABOVE_PLAYER= 显示在玩家上方
240-
TAS_HELPER_MOA_DESCRIPTION= 这展示了如果没有墙面阻碍运动, 玩家的位置将会在何处.
244+
TAS_HELPER_MOA_DESCRIPTION= 这展示了如果没有墙面阻碍运动, 玩家的位置将会在何处.
245+
TAS_HELPER_SPEEDRUNTIMER_OPACITY_WHEN_TAS_PAUSES= TAS 暂停时, 速通计时器的不透明度
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using Microsoft.Xna.Framework;
2+
using Mono.Cecil.Cil;
3+
using Monocle;
4+
using MonoMod.Cil;
5+
using MonoMod.RuntimeDetour;
6+
7+
namespace Celeste.Mod.TASHelper.Gameplay;
8+
internal static class BetterSpeedrunTimerDisplay {
9+
10+
[Load]
11+
12+
private static void Load() {
13+
using (new DetourContext { Before = new List<string> { "*" }, ID = "TAS Helper BetterSpeedrunTimerDisplay" }) {
14+
IL.Celeste.SpeedrunTimerDisplay.Render += ILSpeedrunTimerDisplayRender;
15+
}
16+
}
17+
18+
private static void Unload() {
19+
IL.Celeste.SpeedrunTimerDisplay.Render -= ILSpeedrunTimerDisplayRender;
20+
}
21+
22+
private static void ILSpeedrunTimerDisplayRender(ILContext il) {
23+
ILCursor cursor = new ILCursor(il);
24+
25+
if (!cursor.TryGotoNext(MoveType.After, ins => ins.OpCode == OpCodes.Ret) || cursor.Next is null) {
26+
return;
27+
}
28+
VariableDefinition alpha = new VariableDefinition(il.Import(typeof(float)));
29+
il.Body.Variables.Add(alpha);
30+
31+
cursor.MoveAfterLabels();
32+
cursor.Emit(OpCodes.Ldarg_0);
33+
cursor.Emit(OpCodes.Ldloc, alpha);
34+
cursor.EmitDelegate(UpdateAlpha);
35+
cursor.Emit(OpCodes.Stloc, alpha);
36+
37+
Instruction head = cursor.Next;
38+
39+
while (cursor.TryGotoNext(MoveType.After, ins => ins.MatchCall(typeof(Color), "get_Black"))) {
40+
ColorMulWithAlpha();
41+
}
42+
43+
cursor.Goto(head);
44+
while (cursor.TryGotoNext(MoveType.Before,
45+
ins => ins.MatchCallvirt(
46+
typeof(MTexture).GetMethod("Draw", new Type[] { typeof(Vector2) })))
47+
) {
48+
cursor.Remove();
49+
cursor.Emit(OpCodes.Call, typeof(Vector2).GetMethod("get_Zero"));
50+
cursor.Emit(OpCodes.Call, typeof(Color).GetMethod("get_White"));
51+
cursor.Emit(OpCodes.Callvirt, typeof(MTexture).GetMethod("Draw", new Type[] { typeof(Vector2), typeof(Vector2), typeof(Color) }));
52+
cursor.Index++;
53+
}
54+
55+
cursor.Goto(head);
56+
while (cursor.TryGotoNext(MoveType.After, ins => ins.MatchCall(typeof(Color), "get_White"))) {
57+
ColorMulWithAlpha();
58+
}
59+
60+
cursor.Goto(head);
61+
while (cursor.TryGotoNext(MoveType.Before, ins => ins.MatchCall(typeof(SpeedrunTimerDisplay), nameof(SpeedrunTimerDisplay.DrawTime)))) {
62+
FloatMulWithAlpha();
63+
cursor.Index++;
64+
}
65+
66+
void FloatMulWithAlpha() {
67+
cursor.Emit(OpCodes.Ldloc, alpha);
68+
cursor.Emit(OpCodes.Mul);
69+
}
70+
71+
void ColorMulWithAlpha() {
72+
cursor.Emit(OpCodes.Ldloc, alpha);
73+
cursor.Emit(OpCodes.Call, typeof(Color).GetMethod(nameof(Color.Multiply)));
74+
}
75+
}
76+
77+
private static float UpdateAlpha(SpeedrunTimerDisplay display, float alpha) {
78+
if (Settings.Instance.SpeedrunClock == SpeedrunType.Off || !FrameStep) {
79+
return 1f;
80+
}
81+
return TasHelperSettings.SpeedrunTimerDisplayOpacityToFloat;
82+
}
83+
84+
}

0 commit comments

Comments
 (0)