/* Metal Gear Solid Delta Autosplitter Made by TheDementedSalad TheDementedSalad: @thedementedsalad on Discord. Autosplit and Load Remover Last updated: 4 Sept 2025 */ state("MGSDelta-Win64-Shipping"){} state("MGSDelta-WinGDK-Shipping"){} startup { Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Basic"); vars.Helper.Settings.CreateFromXml("Components/MGSDelta.Settings.xml", false); //This allows is to look through a bitmask in order to get split information vars.bitCheck = new Func((int val, int b) => (val & (1 << b)) != 0); vars.PendingSplits = 0; } init { IntPtr gameStats = vars.Helper.ScanRel(3, "48 8b 05 ?? ?? ?? ?? 0f b7 88 ?? ?? ?? ?? 66 89 8b"); IntPtr storyFlags = vars.Helper.ScanRel(3, "48 8b 1d ?? ?? ?? ?? 40 b6"); IntPtr transitionFlags = vars.Helper.ScanRel(3, "48 8b 0d ?? ?? ?? ?? 48 85 c9 0f 84 ?? ?? ?? ?? 8b 41 ?? 48 8d 15"); IntPtr pauseFlags = vars.Helper.ScanRel(3, "48 8d 0d ?? ?? ?? ?? 48 39 0d"); vars.Helper["VMFlags"] = vars.Helper.Make(storyFlags, 0x3); vars.Helper["SEFlags"] = vars.Helper.Make(storyFlags, 0x5); vars.Helper["transition"] = vars.Helper.Make(transitionFlags, 0x12); vars.Helper["gameState"] = vars.Helper.Make(transitionFlags, 0x13); vars.Helper["areaTransition"] = vars.Helper.Make(transitionFlags, 0x15); vars.Helper["Map"] = vars.Helper.MakeString(gameStats, 0x24); vars.Helper["IGT"] = vars.Helper.Make(gameStats, 0x4C); vars.Helper["HP"] = vars.Helper.Make(gameStats, 0x7B4); vars.Helper["Alerts"] = vars.Helper.Make(gameStats, 0x38); vars.Helper["Kills"] = vars.Helper.Make(gameStats, 0x3A); vars.Helper["seriousDamage"] = vars.Helper.Make(gameStats, 0x40); vars.Helper["totalDamage"] = vars.Helper.Make(gameStats, 0x44); vars.Helper["foodTypes"] = vars.Helper.Make(gameStats, 0x3F); vars.Helper["pauseFlag"] = vars.Helper.Make(pauseFlags, 0x55); vars.completedSplits = new HashSet(); vars.pause = pauseFlags; } onStart { vars.completedSplits.Clear(); vars.PendingSplits = 0; // This makes sure the timer always starts at 0.00 timer.IsGameTimePaused = true; } start { return current.Map == "v001a_0" && vars.bitCheck(current.gameState, 1) && !vars.bitCheck(old.gameState, 1); } update { vars.Helper.Update(); vars.Helper.MapPointers(); } split { string mapSetting = ""; string vmSetting = ""; string seSetting = ""; if(settings["Map"]){ if(current.Map != old.Map && current.Map != "title"){ mapSetting = old.Map; // Debug. Comment out before release. if (!string.IsNullOrEmpty(mapSetting)) vars.Log(mapSetting); if (settings.ContainsKey(mapSetting) && settings[mapSetting]){ return true; } } } if(current.VMFlags != old.VMFlags){ vmSetting = "VM_" + current.VMFlags; if (settings.ContainsKey(vmSetting) && settings[vmSetting]){ vars.PendingSplits++; } // Debug. Comment out before release. //if (!string.IsNullOrEmpty(vmSetting)) //vars.Log(vmSetting); } if(current.SEFlags != old.SEFlags){ seSetting = "SE_" + current.SEFlags; if (settings.ContainsKey(seSetting) && settings[seSetting]){ vars.PendingSplits++; } // Debug. Comment out before release. //if (!string.IsNullOrEmpty(seSetting)) //vars.Log(seSetting); } if(current.SEFlags == 214 && old.SEFlags != 214){ return true; } // Debug. Comment out before release. //if (!string.IsNullOrEmpty(setting)) //vars.Log(setting); if (vars.PendingSplits > 0 && (vars.completedSplits.Add(vmSetting) || vars.completedSplits.Add(seSetting))) { vars.PendingSplits--; return true; } } gameTime { //return TimeSpan.FromSeconds(current.IGT / 60.0); } isLoading { return current.areaTransition == 2 && (!vars.bitCheck(current.gameState, 1) && !vars.bitCheck(current.gameState, 2)) || vars.bitCheck(current.gameState, 4) || current.transition == 2 && (!vars.bitCheck(current.gameState, 1) && !vars.bitCheck(current.gameState, 2)) || current.pauseFlag; //return true; } reset { return current.Map == "v000a_0" && old.Map == "title"; } exit { }