// Chroma Zero Speedrun ASL code // Created by Aurora Lucias & Streetbackguy state("Chroma_Zero-Win64-Shipping") { } startup { Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Basic"); vars.Helper.GameName = "Chroma Zero"; vars.Helper.AlertLoadless(); settings.Add("ChromaZero", true, "Chroma Zero Splits"); settings.Add("lightGateSplit", true, "Split on getting Reminder 0 from the Light Gate", "ChromaZero"); settings.Add("zerologuesSplit", true, "Split on Zerologues", "ChromaZero"); settings.Add("Zerologue 1", false, "Split on obtaining Reminder 2", "zerologuesSplit"); settings.Add("Zerologue 6", false, "Split on obtaining Reminder 3", "zerologuesSplit"); settings.Add("Zerologue 7", false, "Split on obtaining Reminder 4", "zerologuesSplit"); settings.Add("Zerologue 10", false, "Split on obtaining Reminder 5", "zerologuesSplit"); settings.Add("Zerologue 18", false, "Split on obtaining Reminder 6", "zerologuesSplit"); settings.Add("Zerologue 19", false, "Split on obtaining the Light Phase Reminder 7", "zerologuesSplit"); settings.Add("Zerologue 22", true, "Split on obtaining the clues from the Magenta Tower", "zerologuesSplit"); settings.Add("Zerologue 26", false, "Split on obtaining the Dark Phase Reminder 7", "zerologuesSplit"); settings.Add("creditsSplit", true, "Split on reaching the credits", "ChromaZero"); } init { IntPtr gWorld = vars.Helper.ScanRel(3, "48 8B 1D ???????? 48 85 DB 74 ?? 41 B0 01"); IntPtr gEngine = vars.Helper.ScanRel(3, "48 8B 0D ???????? 66 0F 5A C9 E8"); IntPtr fNames = vars.Helper.ScanRel(7, "8B D9 74 ?? 48 8D 15 ???????? EB"); vars.Helper["IGT"] = vars.Helper.Make<double>(gWorld, 0x160, 0x4D0, 0x388, 0xDC8); vars.Helper["DeleteSaveProgress"] = vars.Helper.Make<double>(gWorld, 0x160, 0x4E0, 0x490); vars.Helper["AnyPercentGoal"] = vars.Helper.Make<bool>(gWorld, 0x160, 0x5B8); vars.Helper["ObtainedReminder"] = vars.Helper.Make<int>(gWorld, 0x160, 0x540, 0x42C); vars.Helper["LightGateGoal"] = vars.Helper.Make<bool>(gWorld, 0x160, 0x590); vars.TotalTime = new TimeSpan(); vars.Splits = new HashSet<string>(); } start { return current.IGT > 0.0f && old.IGT == 0.0f; } onStart { vars.TotalTime = TimeSpan.Zero; vars.Splits.Clear(); } update { vars.Helper.Update(); vars.Helper.MapPointers(); if (current.DeleteSaveProgress > 0.0f) { vars.Log("Return to Title: " + current.DeleteSaveProgress); } if (current.ObtainedReminder != old.ObtainedReminder) { vars.Log("Current Zerologue: " + current.ObtainedReminder); } } split { if (current.LightGateGoal && !vars.Splits.Contains("Enter Dark Phase")) { return settings["lightGateSplit"] && vars.Splits.Add("Enter Dark Phase"); } if (current.AnyPercentGoal && !vars.Splits.Contains("Credits")) { return settings["creditsSplit"] && vars.Splits.Add("Credits"); } if (current.ObtainedReminder != old.ObtainedReminder && !vars.Splits.Contains("Obtained Zerologue "+current.ObtainedReminder.ToString())) { return settings["Zerologue "+current.ObtainedReminder] && vars.Splits.Add("Obtained Zerologue "+current.ObtainedReminder.ToString()); } } reset { return current.DeleteSaveProgress > 0.90f; } isLoading { return (old.IGT == current.IGT); } gameTime { if (old.IGT > current.IGT && current.IGT == 0.0f) { vars.TotalTime += TimeSpan.FromSeconds(old.IGT); } return vars.TotalTime + TimeSpan.FromSeconds(current.IGT); }