Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- state("portal2")
- {
- // Portal 2 (7054)
- // SourceAutoRecord (1.7)
- // made by NeKz
- }
- startup
- {
- vars.SAR = new MemoryWatcherList();
- vars.GetTimer = (Func<Process, bool>)((proc) =>
- {
- // Speedrun::timer
- var TimerTarget = new SigScanTarget(0,
- "53 41 52 5F 54 49 4D 45 52 5F 53 54 41 52 54 00", // char start[16]
- "?? ?? ?? ??", // int session
- "?? ?? ?? ??", // int base
- "?? ?? ?? ??", // int total
- "?? ?? ?? ??", // int prevTotal
- "?? ?? ?? ??", // char* map
- "?? ?? ?? ??", // float ipt
- "?? ?? ?? ??", // Speedrun::TimerAction action
- "?? ?? ?? ??", // Speedrun::TimerState state
- "?? ?? ?? ??", // std::unique_ptr<Speedrun::TimerResult> result
- "?? ?? ?? ??", // std::unique_ptr<Speedrun::TimerResult> pb
- "53 41 52 5F 54 49 4D 45 52 5F 45 4E 44 00"); // char end[14]
- var TimerAddr = IntPtr.Zero;
- foreach (var page in proc.MemoryPages(true)) {
- var Scanner = new SignatureScanner(proc, page.BaseAddress, (int)page.RegionSize);
- TimerAddr = Scanner.Scan(TimerTarget);
- if (TimerAddr != IntPtr.Zero)
- break;
- }
- if (TimerAddr != IntPtr.Zero)
- {
- print("[ASL] timer = 0x" + TimerAddr.ToString("X"));
- vars.Total = new MemoryWatcher<int>(TimerAddr + 24);
- vars.Ipt = new MemoryWatcher<float>(TimerAddr + 36);
- vars.Action = new MemoryWatcher<int>(TimerAddr + 40);
- vars.State = new MemoryWatcher<int>(TimerAddr + 44);
- vars.SAR.Clear();
- vars.SAR.AddRange(new MemoryWatcher[]
- {
- vars.Total,
- vars.Ipt,
- vars.Action,
- vars.State
- });
- vars.SAR.UpdateAll(proc);
- print("[ASL] timer->ipt = " + vars.Ipt.Current.ToString());
- return true;
- }
- print("[ASL] Memory scan failed!");
- return false;
- });
- // Speedrun::TimerAction
- vars.TimerActions = new Dictionary<string, int>()
- {
- { "Unknown", 0 },
- { "Start", 1 },
- { "Restart", 2 },
- { "Split", 3 },
- { "End", 4 }
- };
- // Speedrun::TimerState
- vars.TimerStates = new Dictionary<string, int>()
- {
- { "NotRunning", 0 },
- { "Running", 1 },
- { "Paused", 2 }
- };
- vars.TimerAction = (Func<string, int>)((key) =>
- {
- return (vars.TimerActions as Dictionary<string, int>)
- .First(x => x.Key == key).Value;
- });
- vars.TimerState = (Func<string, int>)((key) =>
- {
- return (vars.TimerStates as Dictionary<string, int>)
- .First(x => x.Key == key).Value;
- });
- }
- init
- {
- vars.Init = false;
- }
- update
- {
- if (vars.Init)
- {
- timer.IsGameTimePaused = true;
- vars.SAR.UpdateAll(game);
- if (vars.Action.Changed) print("[ASL] timer->action = TimerAction::" + (vars.TimerActions as Dictionary<string, int>).First(x => x.Value == vars.Action.Current).Key);
- if (vars.State.Changed) print("[ASL] timer->state = TimerState::" + (vars.TimerStates as Dictionary<string, int>).First(x => x.Value == vars.State.Current).Key);
- }
- else
- {
- if (modules.FirstOrDefault(m => m.ModuleName == "sar.dll") != null)
- vars.Init = vars.GetTimer(game);
- }
- return vars.Init;
- }
- gameTime
- {
- return TimeSpan.FromSeconds(vars.Total.Current * vars.Ipt.Current);
- }
- start
- {
- return vars.Action.Changed
- && (vars.Action.Current == vars.TimerAction("Start") || vars.Action.Current == vars.TimerAction("Restart"));
- }
- split
- {
- return vars.Action.Changed
- && (vars.Action.Current == vars.TimerAction("Split") || vars.Action.Current == vars.TimerAction("End"));
- }
Add Comment
Please, Sign In to add comment