Skip to content

Commit e9c8130

Browse files
committed
v1.9.10
optimize reverse frame advance
1 parent c9d3f4e commit e9c8130

8 files changed

+76
-12
lines changed

Dialog/Simplified Chinese.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ TAS_HELPER_MAIN_SWITCH_THREE_STATES= 关 - 默认 - 全部
145145
TAS_HELPER_MAIN_SWITCH_TWO_STATES= 关 - 全部
146146
TAS_HELPER_MAIN_SWITCH_VISUALIZE= 快捷键可视化
147147
TAS_HELPER_MAIN_SWITCH_PREVENT= 通过快捷键启用本模组
148-
TAS_HELPER_CONFIGURE_AT_STATE_ALL= 配置其他设置时请在 全部 状态下进行.
148+
TAS_HELPER_CONFIGURE_AT_STATE_ALL= 配置其他设置时请在 [全部] 状态下进行.
149149
TAS_HELPER_PREDICT_ENABLE_HOTKEY= 开关未来视
150150
TAS_HELPER_PREDICT_FUTURE_HOTKEY= 预测一次
151151
TAS_HELPER_OOO_STEP_HOTKEY= 亚帧步进

Source/Gameplay/FrameStepBack.cs

+37-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using TAS;
1+
using Celeste.Mod.TASHelper.Module.Menu;
2+
using TAS;
23
using TAS.EverestInterop;
34
using TAS.Input;
45

@@ -31,13 +32,47 @@ public static void SetupNextFastForward(int relativeMove) {
3132
Controller.RefreshInputs(true);
3233
}
3334
if (delayedClear) {
34-
Savestates.Clear(); // clear it after RefreshInputs
35+
Savestates.Clear(); // the savestate is after us, clear it after RefreshInputs, so we will not run to the savestate breakpoint instead
3536
}
3637

3738
Controller.NextCommentFastForward = new FastForward(frame, "", 0);
3839
Manager.States &= ~StudioCommunication.States.FrameStep;
3940
Manager.NextStates &= ~StudioCommunication.States.FrameStep;
41+
ForwardTarget = frame;
42+
}
43+
}
44+
45+
internal static int ForwardTarget = 0;
46+
47+
public static bool CheckOnHotkeyHold() {
48+
return OnInterval((int)Math.Round(4 / TasSettings.SlowForwardSpeed)) && frameStepBackHoldTimer > 60;
49+
}
50+
51+
private static int frameCounter = 0;
52+
53+
private static int frameStepBackHoldTimer = 0;
4054

55+
internal static void OnHotkeyUpdate(bool check) {
56+
frameCounter++;
57+
if (check) {
58+
frameStepBackHoldTimer++;
4159
}
60+
else {
61+
frameStepBackHoldTimer = 0;
62+
if (!Manager.UltraFastForwarding) {
63+
ForwardTarget = 0;
64+
}
65+
}
66+
if (!ForwardingIsDone()) {
67+
TH_Hotkeys.FrameStepBack.Update(false, false);
68+
TH_Hotkeys.FrameStepBack.Update(false, false);
69+
}
70+
}
71+
private static bool ForwardingIsDone() {
72+
return Controller.CurrentFrameInTas >= ForwardTarget;
73+
}
74+
75+
private static bool OnInterval(int period) {
76+
return frameCounter % period == 0u;
4277
}
4378
}

Source/Gameplay/SimplifiedTrigger.cs

+32
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,22 @@ private static void HandleBerryTrigger() {
197197
GetTypes("CollabUtils2", "Celeste.Mod.CollabUtils2.Triggers.SpeedBerryCollectTrigger", "Celeste.Mod.CollabUtils2.Triggers.SilverBerryCollectTrigger").ForEach(x => goldBerryTriggers.Add(x));
198198
}
199199

200+
internal static void OnHideBerryChange(bool enable) {
201+
if (Engine.Scene is not Level level) {
202+
return;
203+
}
204+
if (enable) {
205+
foreach (Entity entity in level.Tracker.GetEntities<Trigger>()) {
206+
if (goldBerryTriggers.Contains(entity.GetType())) {
207+
UnimportantTriggers.Add(entity);
208+
}
209+
}
210+
}
211+
else {
212+
UnimportantTriggers.RemoveWhere(x => goldBerryTriggers.Contains(x.GetType()));
213+
}
214+
}
215+
200216
private static readonly HashSet<Type> goldBerryTriggers = new() { typeof(GoldBerryCollectTrigger) };
201217

202218
private static void HandleCameraTrigger() {
@@ -215,6 +231,22 @@ void AddTypes(string modName, params string[] typeNames) {
215231
}
216232
}
217233

234+
internal static void OnHideCameraChange(bool enable) {
235+
if (Engine.Scene is not Level level) {
236+
return;
237+
}
238+
if (enable) {
239+
foreach (Entity entity in level.Tracker.GetEntities<Trigger>()) {
240+
if (cameraTriggers.Contains(entity.GetType())) {
241+
UnimportantTriggers.Add(entity);
242+
}
243+
}
244+
}
245+
else {
246+
UnimportantTriggers.RemoveWhere(x => cameraTriggers.Contains(x.GetType()));
247+
}
248+
}
249+
218250
private static readonly HashSet<Type> cameraTriggers = new() { typeof(CameraOffsetTrigger), typeof(CameraTargetTrigger), typeof(CameraAdvanceTargetTrigger), typeof(SmoothCameraOffsetTrigger) };
219251

220252
private static void HandleExtendedVariantTrigger() {

Source/Module/Menu/Hotkeys.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,10 @@ public static void Update(bool updateKey, bool updateButton) {
9595
foreach (Hotkey hotkey in Hotkeys) {
9696
hotkey.Update(updateKey, updateButton);
9797
}
98-
frameCounter++;
98+
Gameplay.FrameStepBack.OnHotkeyUpdate(FrameStepBack.Check);
9999
}
100100

101-
private static int frameCounter = 0;
102101

103-
public static bool OnInterval(int period) {
104-
return frameCounter % period == 0u;
105-
}
106102

107103
internal static Hotkey BindingToHotkey(ButtonBinding binding, bool held = false) {
108104
return new(binding.Keys, binding.Buttons, true, held);

Source/Module/Menu/TASHelperMenu.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ private static EaseInSubMenu CreateSimplifiedGraphicSubMenu(TextMenu menu) {
112112
subMenu.Add(new HLine(Color.Gray));
113113
TextMenu.Item simplifiedTrigger;
114114
subMenu.Add(simplifiedTrigger = new TextMenuExt.EnumerableSlider<SimplifiedGraphicsMode>("Simplified Triggers".ToDialogText(), CreateSimplifiedGraphicsModeOptions(), TasHelperSettings.EnableSimplifiedTriggersMode).Change(value => TasHelperSettings.EnableSimplifiedTriggersMode = value));
115-
subMenu.Add(new TextMenu.OnOff("Hide Camera Trigger".ToDialogText(), TasHelperSettings.HideCameraTriggers).Change(value => TasHelperSettings.HideCameraTriggers = value));
116-
subMenu.Add(new TextMenu.OnOff("Hide Gold Berry".ToDialogText(), TasHelperSettings.HideGoldBerryCollectTrigger).Change(value => TasHelperSettings.HideGoldBerryCollectTrigger = value));
115+
subMenu.Add(new TextMenu.OnOff("Hide Camera Trigger".ToDialogText(), TasHelperSettings.HideCameraTriggers).Change(value => { TasHelperSettings.HideCameraTriggers = value; SimplifiedTrigger.OnHideCameraChange(value); }));
116+
subMenu.Add(new TextMenu.OnOff("Hide Gold Berry".ToDialogText(), TasHelperSettings.HideGoldBerryCollectTrigger).Change(value => { TasHelperSettings.HideGoldBerryCollectTrigger = value; SimplifiedTrigger.OnHideBerryChange(value); }));
117117
subMenu.Add(new HLine(Color.Gray));
118118
});
119119
}

Source/Module/TASHelperSettings.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,7 @@ public bool SettingsHotkeysPressed() {
925925
Gameplay.ConsoleEnhancement.SetOpenConsole();
926926
// it's completely ok that this feature is not enabled and people press this key, so there's no warning
927927
}
928-
else if (!OoO_Core.Applied && (TH_Hotkeys.FrameStepBack.Released || TH_Hotkeys.FrameStepBack.Check && TH_Hotkeys.OnInterval((int)Math.Round(4 / TasSettings.SlowForwardSpeed)))) { // we use release so there's no save/load issue
928+
else if (!OoO_Core.Applied && (TH_Hotkeys.FrameStepBack.Released || TH_Hotkeys.FrameStepBack.Check && Gameplay.FrameStepBack.CheckOnHotkeyHold())) { // we use release so there's no save/load issue
929929
FrameStepBack.StepBackOneFrame();
930930
}
931931

Source/Module/WhatsNew.cs

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public static void CreateUpdateLog() {
6464
AddLog("1.9.7", "Some daily maintenance.");
6565
AddLog("1.9.8", "ModInterop: Export predictor's SL action.");
6666
AddLog("1.9.9", "New Hotkey: Reverse Frame Advance. This makes tas re-run but up to the previous frame. (Feature Request from Vamp)");
67+
AddLog("1.9.10", "Optimize Reverse Frame Advance.");
6768
UpdateLogs.Sort((x, y) => new Version(y.Item1).CompareTo(new Version(x.Item1)));
6869
}
6970

everest.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
- Name: TASHelper
2-
Version: 1.9.9
2+
Version: 1.9.10
33
DLL: bin/Release/net4.5.2/TASHelper.dll
44
Dependencies:
55
- Name: Everest

0 commit comments

Comments
 (0)