From a980a9b46d1df7377c1fe409d8600e29d642ac2e Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:43:43 -0500 Subject: [PATCH 01/10] Bug fix Fixed a bug where recruiting but not saving a survivor then resetting will cause missed splits due to currently invalid addresses values not being removed. --- DRLoadless.asl | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index a35dae0..7aed9c0 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -261,7 +261,7 @@ startup settings.Add("psychoKent3", false, "Kent Third Encounter", "psycho"); settings.Add("survivor", false, "SurvivorSkip", "splits"); - settings.Add("GroupSaved", false, "Split on group saved", "survivor"); + settings.Add("GroupSaved", false, "Split on Group Saved", "survivor"); settings.Add("survivorEscape", false, "Ending B", "survivor"); settings.Add("MRSplits", false, "Mutinies & Requests", "splits"); @@ -570,6 +570,14 @@ start vars.DeadSurvivors.Clear(); } + if (settings["GroupSaved"]) + { + foreach (var watcher in vars.NPCStates) + { + watcher.Current = 0; + } + } + int PhotoPtr; if (version == "ENG") { @@ -798,7 +806,7 @@ split } // Survivors - if (settings["survivor"]) + if (settings["GroupSaved"]) { bool EmptyParty = true; vars.NPCStates.UpdateAll(game); @@ -812,7 +820,7 @@ split foreach (var watcher in vars.NPCStates) { - if (settings["GroupSaved"] && watcher.Changed && watcher.Current == 4 && watcher.Old != 11 && EmptyParty) + if (watcher.Changed && watcher.Current == 4 && watcher.Old != 11 && EmptyParty) { int i = int.Parse(watcher.Name); int NPCPtr; @@ -829,6 +837,7 @@ split } } } + // Mutinies & Requests if (settings["MRSplits"]) { From 7bb4e043bb7ddb2f428435382c7dedb8b9bc8e5e Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Wed, 22 Oct 2025 01:02:22 -0500 Subject: [PATCH 02/10] Yet another bug fix Fixed an extremely rare double split bug where it'll double split due to Livesplit somehow checking 50+ pointers faster than DR1 can update a handful of survivors statuses. --- DRLoadless.asl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index 7aed9c0..1047833 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -809,7 +809,10 @@ split if (settings["GroupSaved"]) { bool EmptyParty = true; - vars.NPCStates.UpdateAll(game); + if (!current.IsLoading) + { + vars.NPCStates.UpdateAll(game); + } foreach (var watcher in vars.NPCStates) { if (watcher.Current == 2) From 3f49ae89c48dcc626e1685380017f7684ab3a8a2 Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Wed, 22 Oct 2025 02:37:04 -0500 Subject: [PATCH 03/10] Code cleanup Moved Carlito 3 autosplit from Case 7 to the psycho list as that's probably a more fitting location and slightly changed survivor logic to reduce processing overhead. --- DRLoadless.asl | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index 1047833..f4c1cb9 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -157,7 +157,6 @@ startup { settings.Add("case7Bomb" + i.ToString(), false, "Bomb #" + i.ToString(), "case7"); } - settings.Add("Carlito3", false, "Carlito 3", "case7"); settings.Add("case7.2", false, "Case 7-2", "case7"); settings.Add("case7Transitions", false, "Room Transitions", "case7"); settings.Add("case7SR->RT", false, "Security Room->Rooftop", "case7Transitions"); @@ -259,6 +258,7 @@ startup settings.Add("psychoSean", false, "Sean", "psycho"); settings.Add("psychoPaul", false, "Paul", "psycho"); settings.Add("psychoKent3", false, "Kent Third Encounter", "psycho"); + settings.Add("Carlito3", false, "Carlito 3", "psycho"); settings.Add("survivor", false, "SurvivorSkip", "splits"); settings.Add("GroupSaved", false, "Split on Group Saved", "survivor"); @@ -806,13 +806,10 @@ split } // Survivors - if (settings["GroupSaved"]) + if (settings["GroupSaved"] && !current.IsLoading) { bool EmptyParty = true; - if (!current.IsLoading) - { - vars.NPCStates.UpdateAll(game); - } + vars.NPCStates.UpdateAll(game); foreach (var watcher in vars.NPCStates) { if (watcher.Current == 2) From cbc805920be9a3673d5fdec8e361d39d46d2a346 Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Wed, 22 Oct 2025 21:46:12 -0500 Subject: [PATCH 04/10] More code cleanup --- DRLoadless.asl | 71 +++++++++++++++----------------------------------- 1 file changed, 21 insertions(+), 50 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index f4c1cb9..210fe92 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -298,8 +298,8 @@ startup settings.Add("wgSurvivors", false, "Survivors death", "willametteGenocider"); // Otis Transceiver Calls - settings.Add("Otis", false, "Otis Transmissions", "splits"); - settings.Add("Otis1", false, "Split on every Otis Transmission picked up", "Otis"); + settings.Add("Transmission", false, "Otis Transmissions", "splits"); + settings.Add("Otis", false, "Split on every Otis Transmission picked up", "Transmission"); #endregion } @@ -310,19 +310,26 @@ string MD5Hash; using (var md5 = System.Security.Cryptography.MD5.Create()) using (var s = File.Open(modules.First().FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) MD5Hash = md5.ComputeHash(s).Select(x => x.ToString("X2")).Aggregate((a, b) => a + b); + print("Hash is: " + MD5Hash); switch (MD5Hash) { case "0017200B07F7721FBA8624A028D24F60": version = "JPN"; + vars.NPCPtr = 0x1946678; + vars.PhotoPtr = 0x1CF3170; break; - default: + case "015AEC72A70696A7F8F0AE57FFEE727F": version = "ENG"; + vars.NPCPtr = 0x1946660; + vars.PhotoPtr = 0x1CF3128; break; } + print("Version is: " + version); + vars.ResetCounter = 0; // Pending splits (for PP collector mostly) vars.PendingSplits = 0; @@ -488,20 +495,10 @@ string MD5Hash; // Add Watchers for NPC Statues vars.NPCStates = new MemoryWatcherList(); - - int NPCPtr; - if (version == "ENG") - { - NPCPtr = 0x1946660; - } - else - { - NPCPtr = 0x1946678; - } for (int i = 0; i < 51; ++i) { - var statePtr = new DeepPointer("DeadRising.exe", NPCPtr, 0x58, 0x8 * i, 0x44); + var statePtr = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x44); var watcher = new MemoryWatcher(statePtr) { Name = i.ToString() }; vars.NPCStates.Add(watcher); @@ -525,7 +522,7 @@ string MD5Hash; for (int i = 0; i < 51; ++i) { - var healthPtr = new DeepPointer("DeadRising.exe", NPCPtr, 0x58, 0x8 * i, 0x18); + var healthPtr = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x18); var watcher = new MemoryWatcher(healthPtr) { Name = i.ToString() }; vars.NPCHealth.Add(watcher); @@ -574,20 +571,10 @@ start { foreach (var watcher in vars.NPCStates) { - watcher.Current = 0; + watcher.Reset(); } } - int PhotoPtr; - if (version == "ENG") - { - PhotoPtr = 0x1CF3128; - } - else - { - PhotoPtr = 0x1CF3170; - } - // Load the PP Stickers watchers if (settings["ppStickers"] && !vars.PPStickersLoaded) { @@ -596,7 +583,7 @@ start for (int i = 0; i < 100; ++i) { - var ppStickerPtr = new DeepPointer("DeadRising.exe", PhotoPtr, 0x40, 0x6E8 + (0x4 * i)); + var ppStickerPtr = new DeepPointer("DeadRising.exe", vars.PhotoPtr, 0x40, 0x6E8 + (0x4 * i)); var watcher = new MemoryWatcher(ppStickerPtr) { Name = i.ToString() }; vars.PPStickersCount += ppStickerPtr.Deref(game); @@ -740,16 +727,7 @@ split if (game != null) { - int NPCPtr; - if (version == "ENG") - { - NPCPtr = 0x1946660; - } - else - { - NPCPtr = 0x1946678; - } - string npcName = new DeepPointer("DeadRising.exe", NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); + string npcName = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); if (!string.IsNullOrEmpty(npcName) && !string.IsNullOrEmpty(npcName.Trim()) && npcName.Trim()[0] == 'u') { @@ -809,7 +787,9 @@ split if (settings["GroupSaved"] && !current.IsLoading) { bool EmptyParty = true; + vars.NPCStates.UpdateAll(game); + foreach (var watcher in vars.NPCStates) { if (watcher.Current == 2) @@ -823,16 +803,7 @@ split if (watcher.Changed && watcher.Current == 4 && watcher.Old != 11 && EmptyParty) { int i = int.Parse(watcher.Name); - int NPCPtr; - if (version == "ENG") - { - NPCPtr = 0x1946660; - } - else - { - NPCPtr = 0x1946678; - } - string npcName = new DeepPointer("DeadRising.exe", NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); + string npcName = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); return vars.Survivors.Contains(npcName); } } @@ -923,15 +894,15 @@ split } // Otis Transmissions - if (settings["Otis1"]) + if (settings["Otis"]) { vars.Transmissions.UpdateAll(game); + foreach (var watcher in vars.Transmissions) { if (watcher.Changed && watcher.Current > watcher.Old && !current.IsLoading) { - vars.Splits.Add("Otis1"); - return settings["Otis1"]; + return settings["Otis"]; } } } From 14e3eabd479c24134d602ff151711fa8aeb5bc22 Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Thu, 23 Oct 2025 00:47:55 -0500 Subject: [PATCH 05/10] Optimization changes. Added a new autosplit for Ending F and actually looked into the code for how memory watchers work and implemented the proper solution for the invalid pointers. Along with a couple changes to reduce memory usage and CPU utilization. I swear I'm done for a long time. --- DRLoadless.asl | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index 210fe92..d22b999 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -296,6 +296,7 @@ startup settings.Add("willametteGenocider", false, "Willamette Genocider", "splits"); settings.Add("wgSurvivors", false, "Survivors death", "willametteGenocider"); + settings.Add("EndingF", false, "Ending F", "willametteGenocider"); // Otis Transceiver Calls settings.Add("Transmission", false, "Otis Transmissions", "splits"); @@ -350,6 +351,7 @@ string MD5Hash; {26, "case4IsabelaStart"}, {31, "case5Zombie"}, {38, "Carlito3"}, + {40, "EndingF"}, {53, "endingA"}, {70, "psychoKent3"}, {71, "psychoCliff"}, @@ -500,11 +502,12 @@ string MD5Hash; { var statePtr = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x44); var watcher = new MemoryWatcher(statePtr) { Name = i.ToString() }; + watcher.FailAction = MemoryWatcher.ReadFailAction.SetZeroOrNull; vars.NPCStates.Add(watcher); } - // Add Watchers for Transmissions, Will work for Japanese + // Add Watchers for Transmissions vars.Transmissions = new MemoryWatcherList(); for (int i = 0; i < 11; ++i) @@ -567,14 +570,6 @@ start vars.DeadSurvivors.Clear(); } - if (settings["GroupSaved"]) - { - foreach (var watcher in vars.NPCStates) - { - watcher.Reset(); - } - } - // Load the PP Stickers watchers if (settings["ppStickers"] && !vars.PPStickersLoaded) { @@ -894,13 +889,13 @@ split } // Otis Transmissions - if (settings["Otis"]) + if (settings["Otis"] && !current.IsLoading) { vars.Transmissions.UpdateAll(game); foreach (var watcher in vars.Transmissions) { - if (watcher.Changed && watcher.Current > watcher.Old && !current.IsLoading) + if (watcher.Changed && watcher.Current > watcher.Old) { return settings["Otis"]; } From cc4da263262fb6c0ec4278f531b2ca18748b61ef Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:38:34 -0600 Subject: [PATCH 06/10] Add files via upload --- DRLoadless.asl | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index d22b999..73c2eb4 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -89,10 +89,10 @@ startup // Case 2 settings.Add("case2", false, "Case 2 Splits", "72Hour"); settings.Add("case2.1", false, "Case 2-1", "case2"); - settings.Add("case2Steven", false, "Steven", "case2"); - settings.Add("case2FirstAid", false, "First Aid", "case2"); settings.Add("case2.2", false, "Case 2-2", "case2"); settings.Add("case2.3", false, "Case 2-3", "case2"); + settings.Add("case2Steven", false, "Steven", "case2"); + settings.Add("case2FirstAid", false, "First Aid", "case2"); settings.Add("case2Transitions", false, "Room Transitions", "case2"); settings.Add("case2SR->RT", false, "Security Room->Rooftop", "case2Transitions"); // first time settings.Add("case2RT->WH", false, "Rooftop->Warehouse", "case2Transitions"); // first time @@ -272,8 +272,6 @@ startup settings.Add("PPresent", false, "Paul's Present", "MRSplits"); settings.Add("CRequest", false, "Cheryl's Request", "MRSplits"); - - // Max Level settings.Add("maxLevel", false, "Max Level", "splits"); for (int level = 5; level <= 50; level += 5) @@ -302,6 +300,7 @@ startup settings.Add("Transmission", false, "Otis Transmissions", "splits"); settings.Add("Otis", false, "Split on every Otis Transmission picked up", "Transmission"); + settings.Add("100Bool", false, "100% Overtime Toggle", "splits"); #endregion } @@ -314,6 +313,9 @@ string MD5Hash; print("Hash is: " + MD5Hash); + vars.NPCPtr = 0x1946660; + vars.PhotoPtr = 0x1CF3128; + switch (MD5Hash) { case "0017200B07F7721FBA8624A028D24F60": @@ -324,14 +326,15 @@ string MD5Hash; case "015AEC72A70696A7F8F0AE57FFEE727F": version = "ENG"; - vars.NPCPtr = 0x1946660; - vars.PhotoPtr = 0x1CF3128; + break; + + default: + version = "Unknown"; break; } print("Version is: " + version); - vars.ResetCounter = 0; // Pending splits (for PP collector mostly) vars.PendingSplits = 0; @@ -341,6 +344,14 @@ string MD5Hash; // Keep track of hit splits vars.Splits = new HashSet(); + vars.Overtime2 = new List + { + "otQueens", + "otSupplyHideout", + "otTunnel", + "otTank", + }; + // For splitting when hitting a cutscene vars.Cutscenes = new Dictionary { @@ -619,7 +630,7 @@ split // Splitting when hitting cutscenes if (current.CutsceneId != old.CutsceneId) { - if (vars.Cutscenes.ContainsKey(current.CutsceneId) && !vars.Splits.Contains(vars.Cutscenes[current.CutsceneId])) + if (vars.Cutscenes.ContainsKey(current.CutsceneId) && (vars.Overtime2.Contains(vars.Cutscenes[current.CutsceneId]) && settings["100Bool"] || !vars.Splits.Contains(vars.Cutscenes[current.CutsceneId]))) { vars.Splits.Add(vars.Cutscenes[current.CutsceneId]); return settings[vars.Cutscenes[current.CutsceneId]]; @@ -691,10 +702,6 @@ split { return settings["otBrock"]; } - if (current.CutsceneId == 134 && old.CutsceneId != 134) - { - vars.ResetCounter += 1; - } } // Willamette Genocider Case 1-4 From 3991be73e34417eda15ebe3eca3f2fa4aa3ea791 Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Thu, 1 Jan 2026 22:28:51 -0600 Subject: [PATCH 07/10] Update DRLoadless.asl --- DRLoadless.asl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index 73c2eb4..5fcc3da 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -797,6 +797,7 @@ split if (watcher.Current == 2) { EmptyParty = false; + break; } } @@ -908,4 +909,5 @@ split } } } -} \ No newline at end of file + +} From 939be8d61029161576a4a1b0d649f582ab022818 Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Thu, 1 Jan 2026 22:35:44 -0600 Subject: [PATCH 08/10] Update DRLoadless.asl --- DRLoadless.asl | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index 5fcc3da..ad0b65c 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -788,22 +788,19 @@ split // Survivors if (settings["GroupSaved"] && !current.IsLoading) { - bool EmptyParty = true; - vars.NPCStates.UpdateAll(game); foreach (var watcher in vars.NPCStates) { if (watcher.Current == 2) { - EmptyParty = false; - break; + return false; } } foreach (var watcher in vars.NPCStates) { - if (watcher.Changed && watcher.Current == 4 && watcher.Old != 11 && EmptyParty) + if (watcher.Changed && watcher.Current == 4 && watcher.Old != 11) { int i = int.Parse(watcher.Name); string npcName = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); @@ -911,3 +908,4 @@ split } } + From 078be90e3ad33cfccf3b13d35d12cb79089a76ea Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Thu, 1 Jan 2026 22:39:43 -0600 Subject: [PATCH 09/10] Update DRLoadless.asl --- DRLoadless.asl | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index ad0b65c..9ed9004 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -785,30 +785,6 @@ split } } - // Survivors - if (settings["GroupSaved"] && !current.IsLoading) - { - vars.NPCStates.UpdateAll(game); - - foreach (var watcher in vars.NPCStates) - { - if (watcher.Current == 2) - { - return false; - } - } - - foreach (var watcher in vars.NPCStates) - { - if (watcher.Changed && watcher.Current == 4 && watcher.Old != 11) - { - int i = int.Parse(watcher.Name); - string npcName = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); - return vars.Survivors.Contains(npcName); - } - } - } - // Mutinies & Requests if (settings["MRSplits"]) { @@ -907,5 +883,29 @@ split } } + // Survivors (Keep this the bottom most check because of the return false) + if (settings["GroupSaved"] && !current.IsLoading) + { + vars.NPCStates.UpdateAll(game); + + foreach (var watcher in vars.NPCStates) + { + if (watcher.Current == 2) + { + return false; + } + } + + foreach (var watcher in vars.NPCStates) + { + if (watcher.Changed && watcher.Current == 4 && watcher.Old != 11) + { + int i = int.Parse(watcher.Name); + string npcName = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); + return vars.Survivors.Contains(npcName); + } + } + } } + From 98656fb4785fbc84e87980f6d1d85717e4769f08 Mon Sep 17 00:00:00 2001 From: Pokisal <93021798+Pokisal@users.noreply.github.com> Date: Thu, 1 Jan 2026 22:57:37 -0600 Subject: [PATCH 10/10] Update DRLoadless.asl --- DRLoadless.asl | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/DRLoadless.asl b/DRLoadless.asl index 9ed9004..857db2f 100644 --- a/DRLoadless.asl +++ b/DRLoadless.asl @@ -886,6 +886,8 @@ split // Survivors (Keep this the bottom most check because of the return false) if (settings["GroupSaved"] && !current.IsLoading) { + bool SplitPending = false; + vars.NPCStates.UpdateAll(game); foreach (var watcher in vars.NPCStates) @@ -894,18 +896,14 @@ split { return false; } - } - - foreach (var watcher in vars.NPCStates) - { if (watcher.Changed && watcher.Current == 4 && watcher.Old != 11) { - int i = int.Parse(watcher.Name); - string npcName = new DeepPointer("DeadRising.exe", vars.NPCPtr, 0x58, 0x8 * i, 0x8, 0x8).DerefString(game, 6); - return vars.Survivors.Contains(npcName); + SplitPending = true; } } + return SplitPending; } } +