diff --git a/README.md b/README.md index d34f24c..21bbe53 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -**These scripts are no longer maintained. If something needs to be updated, fork the repo or copy the script somewhere else, host it yourself, and point livesplit to the new version.** +# Dishonored 2 ASL Load remover and auto splitter -# asl +LiveSplit ASL scripts for load removal and autosplitting for Dishonored 2. -LiveSplit ASL scripts for load removal and autosplitting for various PC games. +Feel free to fork, update and modify https://github.com/LiveSplit/LiveSplit.AutoSplitters/edit/master/LiveSplit.AutoSplitters.xml to point to your fork if needed. ## Usage @@ -23,35 +23,7 @@ If the plguin doesn't appear in LiveSplit automatically then you must download t - Make sure .NET 4.5 is installed: https://www.microsoft.com/en-ca/download/details.aspx?id=30653 - If all else fails, reboot. -## Supported Games - -- Cornerstone: The Song of Tyrim (by Dalet) -- Deus Ex: Mankind Divided -- Dishonored 2 (by Some1Lse and me) -- Doom (2016) (by a lot of people) -- Dragon Age 2 -- Judge Dredd: Dredd vs. Death -- Lego Batman: The Videogame -- Mass Effect -- Rot Gut -- The Elder Scrolls: Anthology -- The Elder Scrolls III: Morrowind (by Sychotix, Fatalis, and me) -- Shadow Warrior 2 (by Tsiggie, marysiamzawka, and me) -- Wolfenstein: The New Order -- Wolfenstein: The Old Blood -- Yakuza 0 (by ToxicTT and me) -- Yakuza Kiwami (by ToxicTT and me) - -## No longer supported - -These scripts have been replaced by work from other people and are no longer supported. - -- Bioshock Trilogy (by MrWalrus, Glurmo, Dread, and me) -- Dragon Age: Origins (by Letterswords) -- Fallout Anthology -- Fallout 3 -- Fallout: New Vegas -- Penumbra: Black Plague -- Resident Evil 4 (by LetsGetPitted) -- The Elder Scrolls IV: Oblivion (by TheFuncanon and me) -- Titanfall 2 +## Gamepass vs Windows Store +- if you are running the Windows store version of Dishonored 2, make sure to uncheck the "Gamepass support" checkmark in the options. + +by DrTChops, Some1Lse, HuthTV and Elvyndir diff --git a/bio4.asl b/bio4.asl deleted file mode 100644 index fb472b8..0000000 --- a/bio4.asl +++ /dev/null @@ -1,36 +0,0 @@ -state("bio4") -{ - int isEndOfChapter : 0x864311; - uint igt : 0x85BE84; - uint finalIGT : 0xE7A9BC; -} - -start -{ - return current.igt > old.igt; -} - -reset -{ - return current.igt == 0; -} - -isLoading -{ - return false; -} - -gameTime -{ - if (current.igt != old.igt || current.igt == current.finalIGT) { - return TimeSpan.FromSeconds(current.igt); - } -} - -split -{ - return ( - (current.isEndOfChapter - old.isEndOfChapter == 1) || - (current.igt == current.finalIGT && old.finalIGT != current.finalIGT) - ); -} diff --git a/bioshock_trilogy.asl b/bioshock_trilogy.asl deleted file mode 100644 index c8d0a98..0000000 --- a/bioshock_trilogy.asl +++ /dev/null @@ -1,42 +0,0 @@ -state("bioshock") -{ - int isLoading : 0x8D666C; -} - -state("Bioshock2") -{ - bool isSaving : 0xF42EE8; - bool isLoading : 0x10B8010, 0x278; -} - -state("BioshockInfinite") -{ - int pauseGame : 0x13D2A58, 0x534, 0x780, 0x730, 0x2f4; - int pauseGame2 : 0x13D33C4, 0x35c, 0x704, 0x7c0, 0x2f4; - int pauseGame3 : 0x141E1A0, 0x378, 0x640, 0x780, 0x230, 0x2f4; - int loadingScreen : 0x137CF94, 0x3BC, 0x19C; - int playerControl : 0x1423D18, 0x2c; -} - -isLoading -{ - if (timer.CurrentSplit.Name.ToLower().Contains("setup")) { - return true; - } else if (game.ProcessName.ToLower() == "bioshock") { - return current.isLoading != 0; - } else if (game.ProcessName.ToLower() == "bioshock2") { - return current.isSaving || current.isLoading; - } else { - return current.loadingScreen != 0 || ( - current.pauseGame == 0 && - current.pauseGame2 == 0 && - current.pauseGame3 == 0 && - current.playerControl == 0 - ); - } -} - -exit -{ - timer.IsGameTimePaused = true; -} diff --git a/blackplague.asl b/blackplague.asl deleted file mode 100644 index 9817e0d..0000000 --- a/blackplague.asl +++ /dev/null @@ -1,45 +0,0 @@ -state("Penumbra") -{ - float gameTime: 0x2DCAF0, 0x188, 0x4C, 0x1C; -} - -startup -{ - vars.prevPhase = null; - vars.loadedTime = 0; -} - -update -{ - if (current.gameTime == 0 && old.gameTime > 0) { - // reload previous save - vars.loadedTime += old.gameTime; - } - - if (timer.CurrentPhase == TimerPhase.Running && vars.prevPhase == TimerPhase.NotRunning) { - // on reset, reset this var - vars.loadedTime = 0; - } - - vars.prevPhase = timer.CurrentPhase; -} - -start -{ - // autostart if only a current time is higher than 0 - // can't be done using old.GamerTimer == 0, since it's already 0 in menu - return old.gameTime == 0 && current.gameTime > 0; -} - -isLoading -{ - return true; -} - -gameTime -{ - return TimeSpan.FromSeconds(current.gameTime + vars.loadedTime); -} - -// based on SuicideMachine's SH2 timer -// made not terrible by chops diff --git a/cornerstone.asl b/cornerstone.asl deleted file mode 100644 index c892d81..0000000 --- a/cornerstone.asl +++ /dev/null @@ -1,140 +0,0 @@ -/* - v0.1 -*/ - -state("Cornerstone") -{ - int isLoadingLevel : 0xA33124, 0x74; // Unity's Application.isloadinglevel -} - -startup -{ - vars.FreeMemory = (Action)(p => - { - p.FreeMemory((IntPtr)vars.isFmodInitPtr); - p.FreeMemory((IntPtr)vars.injectedFuncPtr); - p.FreeMemory((IntPtr)vars.oInitFmodPtr); - }); - - vars.CopyMemory = (Action)((p, src, dest, nbr) => - { - var bytes = p.ReadBytes(src, nbr); - p.WriteBytes(dest, bytes); - }); - - vars.CheckInitFmodPtr = (Func)((p, ptr) => - { - if (ptr == IntPtr.Zero) - return false; - - byte[] bytes; - if (!p.ReadBytes(ptr, 3, out bytes)) - return false; - - var expectedBytes = new byte[] { 0x55, 0x8B, 0xEC }; - if (!bytes.SequenceEqual(expectedBytes)) - return false; - - return true; - }); -} - -init -{ - // find the FMOD_Listener:Initialize function - var initFmodDeepPtr = new DeepPointer("mono.dll", 0x1F58F4, 0x4DC, 0x154); - uint ptr; - if (!initFmodDeepPtr.Deref(game, out ptr)) - throw new Exception("Couldn't read the pointer path for FMOD_Listener:Initialize"); - - // check the pointer because it can be wrong while starting the game - vars.initFmodPtr = ptr + 0x2F0; - print("FMOD_Listener:Initialize : " + vars.initFmodPtr.ToString("X")); - if (!vars.CheckInitFmodPtr(game, (IntPtr)vars.initFmodPtr)) - throw new Exception("Invalid FMOD_Listener:Initialize pointer"); - - vars.isFmodInitPtr = game.AllocateMemory(sizeof(int)); // our injected bool - var isFmodInitPtrBytes = BitConverter.GetBytes((uint)vars.isFmodInitPtr); - - - // injected function body - var initFmodDetourBytes = new List() { - 0x55, // push ebp - 0x8B, 0xEC, // mov ebp, esp - 0xFF, 0x75, 0x08, // push ebp+8 - 0xC7, 0x05 // mov dword ptr [isFmodInitPtr], 01 - }; - initFmodDetourBytes.AddRange(isFmodInitPtrBytes); - initFmodDetourBytes.AddRange(new byte[] { 1, 0, 0, 0 }); - - var callOffset = initFmodDetourBytes.Count; - initFmodDetourBytes.AddRange(new byte[] { - 255, 255, 255, 255, 255, // call oInitFmodPtr (placeholder) - 0xC7, 0x05 // mov dword ptr [isFmodInitPtr], 00 - }); - initFmodDetourBytes.AddRange(isFmodInitPtrBytes); - initFmodDetourBytes.AddRange(new byte[] { - 0, 0, 0, 0, - 0xC9, // leave - 0xC3 // ret - }); - - vars.injectedFuncPtr = game.AllocateMemory(initFmodDetourBytes.Count); - - - game.Suspend(); // it'd crash if it executed code we're in the middle of changing - try - { - // install hook - vars.oInitFmodPtr = game.WriteDetour((IntPtr)vars.initFmodPtr, 5, (IntPtr)vars.injectedFuncPtr); - - // write the body of the injected function - game.WriteBytes((IntPtr)vars.injectedFuncPtr, initFmodDetourBytes.ToArray()); - - // replace the call placeholder - game.WriteCallInstruction((IntPtr)vars.injectedFuncPtr + callOffset, (IntPtr)vars.oInitFmodPtr); - } - catch - { - vars.FreeMemory(game); - throw; - } - finally - { - game.Resume(); - } - - print("isFmodInitPtr: " + vars.isFmodInitPtr.ToString("X")); -} - -shutdown -{ - if (game == null) - return; - - game.Suspend(); - try - { - // restore function prologue - vars.CopyMemory(game, (IntPtr)vars.oInitFmodPtr, (IntPtr)vars.initFmodPtr, 5); - } - catch - { - throw; - } - finally - { - game.Resume(); - vars.FreeMemory(game); - } -} - -update -{ - vars.isFmodInit = game.ReadValue((IntPtr)vars.isFmodInitPtr); -} - -isLoading -{ - return current.isLoadingLevel != 0 || vars.isFmodInit; -} diff --git a/daorigins.asl b/daorigins.asl deleted file mode 100644 index a55dffc..0000000 --- a/daorigins.asl +++ /dev/null @@ -1,29 +0,0 @@ -state("DAOrigins") -{ - bool isLoading : 0x007E0A4C, 0x0, 0x5E4, 0xA8, 0x7E0, 0x42C; - bool isLoadingScreen : 0x007DD6D4, 0x27C, 0x274, 0x8, 0x4, 0x40C; -} - -init -{ - vars.preFirstLoad = true; - vars.isLoading = true; -} - -exit -{ - timer.IsGameTimePaused = true; -} - -update -{ - vars.isLoading = current.isLoading || current.isLoadingScreen; - if (vars.preFirstLoad && vars.isLoading) { - vars.preFirstLoad = false; - } -} - -isLoading -{ - return vars.preFirstLoad || vars.isLoading; -} diff --git a/dishonored2.asl b/dishonored2.asl index 225ae7b..6b471d7 100644 --- a/dishonored2.asl +++ b/dishonored2.asl @@ -62,6 +62,20 @@ state("Dishonored2_x64ShippingRetail", "1.9ms") uint canInteract : 0x4A10448, 0x6D0, 0x10, 0xa0, 0x13b0, 0; } +state("Dishonored2_x64ShippingRetail", "1.9gp") +{ + // 1.77.9.0 + // 113065984 + bool isLoading : 0x4A685A8; + float x : 0x045F7C40, 0x8, 0x8, 0x10, 0x268, 0xE0, 0x3C; + float y : 0x045F7C40, 0x8, 0x8, 0x250, 0x268, 0xE0, 0x40; + float z : 0x045F7C40, 0x8, 0x8, 0x250, 0x268, 0xE0, 0x44; + string128 levelName : 0x5841040; + float screenFade : 0x61c7b50, 0, 8, 0x7DC; + uint interaction : 0x4A10448, 0x6D0, 0x10, 0xa0, 0x88, 0x80, 4; + uint canInteract : 0x4A10448, 0x6D0, 0x10, 0xa0, 0x13b0, 0; +} + startup { // "campaign/bunker/bunker_p_lowchaos" is used before killing/darting stilton regardless of chaos @@ -87,6 +101,8 @@ startup { } settings.Add("autosplit_end",true,"Split on run end"); + settings.Add("gamepass_support",true,"Game pass support"); + settings.SetToolTip("gamepass_support", "When unchecked support \"Windows Store\" version instead"); vars.autoSplitIndex = -1; } @@ -94,18 +110,21 @@ startup { init { switch (modules.First().ModuleMemorySize) { - case 113065984: version = "1.9ms"; break; // Windows Store + case 113065984: + if(settings["gamepass_support"]) + { version = "1.9gp"; break; } // Gamepass version + else + { version = "1.9ms"; break; } // Windows Store case 70369280: version = "1.9"; break; case 163115008: version = "1.4"; break; case 166068224: version = "1.3"; break; + case 70189056: version = "1.9"; break; + default: version = ""; break; } // print(modules.First().FileVersionInfo.FileVersion); // print(modules.First().ModuleMemorySize.ToString()); - - - if (vars.autoSplitIndex == -1) { for (vars.autoSplitIndex = 0;vars.autoSplitIndex < vars.autoSplits.Length;++vars.autoSplitIndex) { if (settings["autosplit_"+vars.autoSplitIndex.ToString()]) { @@ -185,7 +204,10 @@ split // 0x9C673C93 is the id (possibly a hash) for "Revive your father", 0xA2674605 is for "Revive your daughter". bool isFinalInteraction = (current.interaction == 0x9C673C93 || current.interaction == 0xA2674605); - if(isFadingOut && canInteract && isFinalInteraction) { + if( isFadingOut && + // canInteract && (Removing canInteract because new skip doesn't allow this var to be set in time) + isFinalInteraction + ) { ++vars.autoSplitIndex; return true; } diff --git a/doom2016.asl b/doom2016.asl deleted file mode 100644 index 545fb2f..0000000 --- a/doom2016.asl +++ /dev/null @@ -1,553 +0,0 @@ -// People who collectively worked on this: -// DrTChops -// Glurmo -// TheFuncannon -// loitho -// sychotixx -// Instagibz -// blairmadison11 -// heny -// Meta -// SabuilneHorizon -// probably more - -//===NOTES AND CHANGELOG===// - -//SabulineHorizon @08\12\21: Added Auto-Reset, added split for Spider Mastermind Skip, fixed timer start delays, fixed optional intro split bug, fixed random intro timer starts, fixed UN start split -//Meta @03\08\21: Added popup that detects real time & asks if you want game time comparison. Added livesplit cycle fix that otherwise starts timer @ 0.00 - 0.06 -//heny @21\08\20: Added setting to optionally split at the end of the intro section -//heny @21\08\20: Updated the splitter for the latest 6,1,1,321 version to support OpenGL + added setting to optionally split between Lazarus Labs 1 & 2 -//Glurmo @23\01\19: Removed steam api ("tier0_s64.dll") dependency to prevent steam client updates breaking autosplitter + Add NG+ support -//Glurmo @21\01\19: Fixed map name pointer for steam update (4.89.17.15) + added skipping of rune loadscreens for 100% -//Instagibz @04\04\18: Updated the splitter for latest 6,1,1,321 version, VULKAN only -//Loitho @13\10\17: Fixed mapname variable. Invalid pointer caused by a steam update of the tier0_s64.dll | Works for Steam >= 4.17.60.88 -//Loitho @09\09\17: Fixed the splitter for auto split on last boss hit 6,1,1,818 - Vulkan only -//blairmadison11 @02\09\17: Partially updated the splitter for the latest 6,1,1,818, VULKAN only -//Instagibz & blairmadison11 @22\07\17: Updated the splitter for the latest 6,1,1,513 version, VULKAN only for now. Note: Versioning changed back from 6,1,1,1219 to 6,1,1,513 -//Instagibz @29\01\17: Updated the splitter for latest steam-api change -//Instagibz @20\12\16: Updated the splitter for latest 6,1,1,1219 version, VULKAN only for now -//Instagibz @08\12\16: Updated the splitter for latest 6,1,1,1201 version, VULKAN only for now -//Instagibz @14\11\16: Updated the splitter for latest 6,1,1,1109 version -//Instagibz @19\10\16: Updated the splitter for latest 6,1,1,1012 version -//Instagibz @30\09\16: Added auto-end to 6,1,1,706 also changed auto-start, was broken for me a few times -//TheFuncannon @30\09\16: Updated the OGL version 6,1,1,706 to auto-start -//Instagibz @30\09\16: Updated the vulkan and OGL version 6,1,1,920 to auto-start, auto-split and auto-end the run. Requires 13 splits -//===NOTES AND CHANGELOG===// - -state("DOOMx64", "6, 1, 1, 527") { - bool isLoading: 0x308C930; - bool canStart: 0x2839D44; - bool start: 0x337CA9C; - bool mainMenu: 0xAD03804; - string20 mapName: 0x318AFE8; - float bossHealth: 0x03084EF8, 0x30, 0x4E8, 0x2D8, 0x1B4; - bool finalHit: 0x308CB7C; -} - -state("DOOMx64", "6, 1, 1, 706") { - // Timer restart when you exit a loading screen - // (You have to press space) - // So basically here you can chill during loading - bool isLoading: 0x31D3B10; - - // Timer restart when "real" loading is finished - // (even if you don't press space, the time WILL start) - // Here you need to spam the spacebar during loading screen - // bool isLoading: 0xB99B1E4; - - bool canStart: 0x297CF3A; - bool start: 0x34C5304; - bool finalHit: 0x31D3F74; - float bossHealth: 0x31CC008, 0x30, 0x4E8, 0x2D8, 0x1B4; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64", "6, 1, 1, 808") { - bool isLoading: 0x31D13C0; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64vk", "6, 1, 1, 808") { - bool isLoading: 0x4CE5AB0; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64", "6, 1, 1, 920") { - float bossHealth: 0x322EEB8, 0x30, 0x4E8, 0x2E0, 0x1B4; - bool canStart: 0x29B41DA; - bool start: 0x3562DB0; - bool isLoading: 0x3236CD0; - bool finalHit: 0x3237134; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64vk", "6, 1, 1, 920") { - float bossHealth: 0x0492AF48, 0x30, 0x4E8, 0x2E0, 0x1B4; - bool start: 0x4C620D4; - bool canStart: 0x2947314; - bool finalHit: 0x49332E4; - bool isLoading: 0x4932E80; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64", "6, 1, 1, 1012") { - float bossHealth: 0x0330D838, 0x30, 0x4E8, 0x2E0, 0x1B8; - bool start: 0x362E9BC; - bool canStart: 0x2A4D304; - bool finalHit: 0x3315AF4; - bool isLoading: 0x3315690; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64vk", "6, 1, 1, 1012") { - float bossHealth: 0x04A0A918, 0x30, 0x4E8, 0x2E0, 0x1B8; - bool start: 0x4D2ED84; - bool canStart: 0x2A2F804; - bool finalHit: 0x4A12CE4; - bool isLoading: 0x4E47580; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64", "6, 1, 1, 1109") { - float bossHealth: 0x0330D838, 0x30, 0x4E8, 0x2E0, 0x1B8; - bool start: 0x362E9BC; - bool canStart: 0x2A4D304; - bool finalHit: 0x3315AF4; - bool isLoading: 0x3315690; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64vk", "6, 1, 1, 1109") { - float bossHealth: 0x04A0A918, 0x30, 0x4E8, 0x2E0, 0x1B8; - bool start: 0x4D2ED84; - bool canStart: 0x2A2F804; - bool finalHit: 0x4A12CE4; - bool isLoading: 0x4E47580; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64", "6, 1, 1, 1201") { - float bossHealth: 0x0330D838, 0x30, 0x4E8, 0x2E0, 0x1B8; //NOT UPDATED YET - bool start: 0x362E9BC; //NOT UPDATED YET - bool canStart: 0x2A4D304; //NOT UPDATED YET - bool finalHit: 0x3315AF4; //NOT UPDATED YET - bool isLoading: 0x3315690; //NOT UPDATED YET - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; //NOT UPDATED YET -} - -state("DOOMx64vk", "6, 1, 1, 1201") { - float bossHealth: 0x04C08DC0, 0x30, 0x4E8, 0x2E0, 0x1B4; - bool start: 0x5684168; - bool canStart: 0x2C14A44; - bool finalHit: 0x535F274; - bool isLoading: 0x535EE10; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64", "6, 1, 1, 1219") { - float bossHealth: 0x04C08DC0, 0x30, 0x4E8, 0x2E0, 0x1B4; //NOT UPDATED YET - bool start: 0x5684168; //NOT UPDATED YET - bool canStart: 0x2C14A44; //NOT UPDATED YET - bool finalHit: 0x535F274; //NOT UPDATED YET - bool isLoading: 0x535EE10; //NOT UPDATED YET - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; //NOT UPDATED YET -} - -state("DOOMx64vk", "6, 1, 1, 1219") { - float bossHealth: 0x04C08DC0, 0x30, 0x4E8, 0x2E0, 0x1B4; - bool start: 0x5684168; - bool canStart: 0x2C14A44; - bool finalHit: 0x535F274; - bool isLoading: 0x535EE10; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -state("DOOMx64", "6, 1, 1, 531") { - float bossHealth: 0x04C08DC0, 0x30, 0x4E8, 0x2E0, 0x1B4; //NOT UPDATED YET - bool start: 0x57BDEE0; //NOT UPDATED YET - bool canStart: 0x54DC3D8; //NOT UPDATED YET - bool finalHit: 0x535F274; //NOT UPDATED YET - bool isLoading: 0x56844C9; //NOT UPDATED YET - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; //NOT UPDATED YET -} - -state("DOOMx64vk", "6, 1, 1, 531") { - float bossHealth: 0x4C6F9D0, 0x30, 0x4E8, 0x2F0, 0x1B4; - bool start: 0x57BDEE0; - bool canStart: 0x54DC3D8; - bool finalHit: 0x53C5DD4; - bool isLoading: 0x56844C9; - string35 mapName: "tier0_s64.dll", 0x4E170, 0x17; -} - -// 2017-08-24 Patch -state("DOOMx64vk", "6, 1, 1, 818") { - float bossHealth: 0x2B0F3C0, 0x2CD80, 0x2B78; // Fixed - bool start: 0x5686EE0; // confirmed working - bool canStart: 0x53A53D8; // confirmed working - bool finalHit: 0x528EDB4; // confirmed working - bool isLoading: 0x554D4C9; // confirmed working - - string35 mapName: "tier0_s64.dll", 0x58180, 0x17; - string60 mapFile: 0x556B325; -} - -// 2018-03-29 Patch (Latest, OpenGL) -state("DOOMx64", "6, 1, 1, 321") { - float bossHealth: 0x036F9E08, 0x30, 0x4D0, 0x420, 0x2F8, 0x20, 0x2F0, 0x1B4; - float playerX: 0x41C16C8; - float playerY: 0x41C16CC; - float playerZ: 0x41C16C0; - bool start: 0x427EA00; - bool canStart: 0x2E4A378; - bool finalHit: 0x3E59794; - bool isLoading: 0x41434D9; - bool menuOpen: 0x3E57624; //need to verify - byte menuSelection: 0x04280338, 0x4D0, 0x10, 0x1B8, 0x1A4; //0-Resume, 1-Settings , 2-Load Checckpoint , 3-Restart Mission , 4-Exit to Main Menu , 5-Exit to Desktop - byte deathReset: 0x427ECBA; //44 when death menu appears, and 36 when resetting - byte difficulty: 0x490F380; //0-I'm Too Young To Die, 1-Hurt Me Plenty, 2-Ultra-Violence, 3-Nightmare 4 = Ultra-Nightmare - int checkpointCounter: 0x40FE988; - int finalCutscene: 0x4C3ED68; - - string35 mapName: "tier0_s64.dll", 0x58180, 0x17; - string60 mapFile: 0x415FE15; -} - -// 2018-03-29 Patch (Latest, Vulkan) -state("DOOMx64vk", "6, 1, 1, 321") { - float bossHealth: 0x307EF08, 0x2CD80, 0x2B78; - float playerX: 0x58C27F8; - float playerY: 0x58C27FC; - float playerZ: 0x58C27F0; - bool start: 0x597FCD0; - bool canStart: 0x56BF5D8; - bool finalHit: 0x5557504; - bool isLoading: 0x5845A29; - bool menuOpen: 0x5555364; - byte menuSelection: 0x5981608, 0x4D0, 0x10, 0x1B8, 0x1A4; //0-Resume, 1-Settings , 2-Load Checckpoint , 3-Restart Mission , 4-Exit to Main Menu , 5-Exit to Desktop - byte deathReset: 0x597FF8A; //44 when death menu appears, and 36 when resetting - byte difficulty: 0x6011070; //0-I'm Too Young To Die, 1-Hurt Me Plenty, 2-Ultra-Violence, 3-Nightmare 4 = Ultra-Nightmare - int checkpointCounter: 0x57FC388; - int finalCutscene: 0x6338518; - - string35 mapName: "tier0_s64.dll", 0x58180, 0x17; - string60 mapFile: 0x5862785; -} - -startup { - vars.TimerStart = (EventHandler) ((s, e) => timer.IsGameTimePaused = true); - - timer.OnStart += vars.TimerStart; -//^ Ensures the timer starts at 0.00, thanks Gelly for this - vars.readOffset = (Func)((proc, ptr, offsetSize, remainingBytes) => { - byte[] offsetBytes; - if (ptr == IntPtr.Zero || !proc.ReadBytes(ptr, offsetSize, out offsetBytes)) { - return IntPtr.Zero; - } - - int offset; - switch (offsetSize) { - case 1: - offset = offsetBytes[0]; - break; - case 2: - offset = BitConverter.ToInt16(offsetBytes, 0); - break; - case 4: - offset = BitConverter.ToInt32(offsetBytes, 0); - break; - default: - throw new Exception("Unsupported offset size"); - } - - return ptr + offsetSize + remainingBytes + offset; - - if (timer.CurrentTimingMethod == TimingMethod.RealTime) // Pops up if real time comparison is detected, asking if you want to switch to Game Time. Thanks Micrologist for this. - { - var timingMessage = MessageBox.Show ( - "This game uses Time without Loads (Game Time) as the main timing method.\n"+ - "LiveSplit is currently set to show Real Time (RTA).\n"+ - "Would you like to set the timing method to Game Time? This will make verification easier", - "LiveSplit | DOOM 2016", - MessageBoxButtons.YesNo,MessageBoxIcon.Question - ); - - if (timingMessage == DialogResult.Yes) - { - timer.CurrentTimingMethod = TimingMethod.GameTime; - } - } - }); - - settings.Add("optionalSplits", false, "Optional Splits (Game Version 6, 1, 1, 321)"); - settings.Add("splitForIntro", false, "Intro", "optionalSplits"); - settings.Add("splitForLazarusLabs1", false, "Lazarus Labs 1", "optionalSplits"); - settings.Add("noCheckpointResets", false, "No checkpoint reset"); - settings.SetToolTip("optionalSplits", "Optionally split for special situations/in special locations (currently only working on game version 6, 1, 1, 321)"); - settings.SetToolTip("splitForIntro", "Split when smashing the elevator button panel in the intro section"); - settings.SetToolTip("splitForLazarusLabs1", "Split at the end of the first part of Lazarus Labs"); - settings.SetToolTip("noCheckpointResets", "Do not reset the timer when reloading checkpoint at the start of Intro"); - - vars.visitedMapFiles = new List(); - vars.introMapFile = "game/sp/intro/intro"; // UAC - vars.mapFileSplits = new List() { - "game/sp/resource_ops/resource_ops", // Resource Operations - "game/sp/resource_ops_foundry/resource_ops_foundry", // Foundry - "game/sp/surface1/surface1", // Argent Facility - "game/sp/argent_tower/argent_tower", // Argent Energy Tower - "game/sp/blood_keep/blood_keep", // Kadingir Sanctum - "game/sp/surface2/surface2", // Argent Facility (Destroyed) - "game/sp/bfg_division/bfg_division", // Advanced Research Complex - "game/sp/lazarus/lazarus", // Lazarus Labs (1) - "game/sp/blood_keep_b/blood_keep_b", // Titan's Realm - "game/sp/blood_keep_c/blood_keep_c", // The Necropolis - "game/sp/polar_core/polar_core", // VEGA Central Processing - "game/sp/titan/titan", // Argent D'Nur - }; -} - -init { - vars.hasSplitForIntro = false; - vars.resetType = 0; - vars.checkpointCounterStart = 0; - vars.pauseStart = false; - vars.endCutsceneTriggered = false; - - var firstModule = modules.First(); - version = firstModule.FileVersionInfo.FileVersion; - print(version); -} - -update { - if (version == "6, 1, 1, 321") { // Latest patch - - if (vars.pauseStart){ - vars.pauseStart = current.menuOpen; - } - } -} - -exit { - timer.IsGameTimePaused = true; -} - -start { - vars.hasSplitForIntro = false; - vars.visitedMapFiles = new List(); - vars.pauseStart = false; - vars.resetType = 0; - vars.checkpointCounterStart = 0; - vars.endCutsceneTriggered = false; - - if (settings["splitForLazarusLabs1"]) { - vars.mapFileSplits.Add("game/sp/lazarus_2/lazarus_2"); - } else { - vars.mapFileSplits.Remove("game/sp/lazarus_2/lazarus_2"); - } - - if (version == "6, 1, 1, 527") { - return ( - !old.start && - current.start && - !current.isLoading && - current.canStart && - current.mapName.StartsWith("intro") - ); - } else if (version == "6, 1, 1, 706" || version == "6, 1, 1, 920" || version == "6, 1, 1, 1012" || version == "6, 1, 1, 1109" || version == "6, 1, 1, 1201" || version == "6, 1, 1, 1219" || version == "6, 1, 1, 531") { - // Start the timer only if it's not running - // Mapname contains The UAC, we're not loading anything, We used to be in the intro and we're not anymore - return ( - !current.isLoading && - !old.start && - current.start && - current.canStart && - current.mapName.Contains("The UAC") - ); - } else if (version == "6, 1, 1, 818") { - return ( - !current.isLoading && - !old.start && - current.start && - current.canStart && - current.mapFile == vars.introMapFile - ); - } else if (version == "6, 1, 1, 321") { // Latest patch - - //If we're starting UN instead of another difficulty - if (old.isLoading && !current.isLoading && (current.difficulty == 4)){ - Thread.Sleep(3560); - return ( - ((current.playerX - (-10200.00)) < 0.1) && - ((current.playerY - (-2624.00)) < 0.1) && - ((current.playerZ - (9540.00)) < 6) - ); - } - if ( - //reload checkpoint or failed restart mission - current.mapFile == vars.introMapFile && - ((old.isLoading && - !current.isLoading && - ((current.playerX - (-18101.34)) < 0.5) && - ((current.playerY - (-2782.34)) < 0.5) && - ((current.playerZ - (3076.90)) < 0.5)) - | //new game or restart mission - (!current.isLoading && - !old.start && - current.start && - ((current.playerX - (-18029.99)) < 0.5) && - ((current.playerY - (-2736.30)) < 0.5) && - ((current.playerZ - (3073.49)) < 0.5) - )) - ){ - vars.checkpointCounterStart = current.checkpointCounter; - vars.pauseStart = true; //pause timer on start if menu is open during loading (usually caused by alt+tabbing during load) - return true; - } - } -} - -reset { - if (version == "6, 1, 1, 321") { // Latest patch - if (current.difficulty == 4){ - //UN difficulty - return ( - (old.deathReset == 44) && - (current.deathReset == 36) - ); - } else { - //Other difficulty - if (current.menuSelection == 2){ vars.resetType = 2;} - else if (current.menuSelection == 3){ vars.resetType = 3;} - return ( - current.mapFile == "game/sp/intro/intro" && - !old.isLoading && - current.isLoading && - (((current.menuSelection == 2 | - ((old.deathReset == 44) && - (current.deathReset == 36))) && - !settings["noCheckpointResets"] && - (current.checkpointCounter == vars.checkpointCounterStart) - )| - (current.menuSelection == 3 - )) - ); - } - } -} - -split { - if (version == "6, 1, 1, 527") { - return ( - !String.IsNullOrEmpty(current.mapName) && - old.mapName != current.mapName && - !old.mainMenu - ) || ( - !current.finalHit && - current.bossHealth == 1); - } else if (version == "6, 1, 1, 808") { - return ( - !String.IsNullOrEmpty(current.mapName) && - !String.IsNullOrEmpty(old.mapName) && - old.mapName != current.mapName && - !old.mapName.Contains("menu") && - !old.mapName.Contains("playing") && - !old.mapName.Contains("a boss") && - !current.mapName.Contains("menu") && - !current.mapName.Contains("playing") && - !current.mapName.Contains("a boss") - ); - } else if (version == "6, 1, 1, 706" || version == "6, 1, 1, 920" || version == "6, 1, 1, 1012" || version == "6, 1, 1, 1109" || version == "6, 1, 1, 1201" || version == "6, 1, 1, 1219" || version == "6, 1, 1, 531") { - return ( - !String.IsNullOrEmpty(current.mapName) && - !String.IsNullOrEmpty(old.mapName) && - old.mapName != current.mapName && - !old.mapName.Contains("menu") && - !old.mapName.Contains("playing") && - !old.mapName.Contains("a boss") && - !current.mapName.Contains("menu") && - !current.mapName.Contains("playing") && - !current.mapName.Contains("a boss") && - !current.mapName.Contains("The UAC") && // Start timer, but don't split for UAC - !current.mapName.Contains("Rune Trial") && // Ignore rune loadscreens for 100% - current.isLoading // Ignore mapName change for death in UN - ) || ( - !current.finalHit && - current.bossHealth == 1 - ); - } else if (version == "6, 1, 1, 818") { - // Previous patch (2017-08-24) - bool finalSplit = !current.finalHit && current.bossHealth == 1; - bool levelSplit = !String.IsNullOrEmpty(current.mapFile) && - !String.IsNullOrEmpty(old.mapFile) && - old.mapFile != current.mapFile && - current.isLoading && - !old.mapFile.Contains("challenges/") && - vars.mapFileSplits.Contains(current.mapFile); - - if (finalSplit) { - return true; - } else if (levelSplit && !vars.visitedMapFiles.Contains(current.mapFile)) { - // Track to prevent splitting twice in 100% - vars.visitedMapFiles.Add(current.mapFile); - return true; - } - return false; - } else if (version == "6, 1, 1, 321") { - // Latest patch (2018-03-29) - bool finalSplit = !current.finalHit && current.bossHealth == 1; - bool levelSplit = !String.IsNullOrEmpty(current.mapFile) && - !String.IsNullOrEmpty(old.mapFile) && - old.mapFile != current.mapFile && - current.isLoading && - !old.mapFile.Contains("challenges/") && - vars.mapFileSplits.Contains(current.mapFile); - if (finalSplit) { - return true; - } else if (levelSplit && !vars.visitedMapFiles.Contains(current.mapFile)) { - // Track to prevent splitting twice in 100% - vars.visitedMapFiles.Add(current.mapFile); - return true; - } else if (current.mapFile == "game/sp/intro/intro") { - if (!vars.hasSplitForIntro && settings["splitForIntro"]) { // Optional intro split when smashing the panel - bool inUAC = current.mapFile.Equals("game/sp/intro/intro"); - bool correctIntroSplitXPos = Math.Abs(current.playerX - (-10152.54)) < 0.1; - bool correctIntroSplitYPos = Math.Abs(current.playerY - (-2685.575)) < 0.1; - bool correctIntroSplitZPos = Math.Abs(current.playerZ - 3148.311) < 0.1; - bool correctIntroSplitPos = correctIntroSplitXPos && correctIntroSplitYPos && correctIntroSplitZPos; - - if (inUAC && correctIntroSplitPos) { - vars.hasSplitForIntro = true; - return true; - } - } - } else if (current.mapFile == "game/sp/titan/titan") { - //Spider Mastermind Skip - if ( - //need to look in the game scripts to get a more precise trigger location - (current.playerX > -80) && - (current.playerX < 215) && - (current.playerY > -80) && - (current.playerY < 215) && - (current.playerZ > -10080) && - (current.playerZ < -9800) - ){ - vars.endCutsceneTriggered = true; - } - if ( - (current.finalCutscene == 5) && - (old.finalCutscene != 5) && - vars.endCutsceneTriggered - ){ - return true; - } - } else if (current.isLoading && vars.endCutsceneTriggered) {vars.endCutsceneTriggered = false;} - - return false; - } -} - -isLoading { return (current.isLoading | vars.pauseStart); } - -shutdown{ - timer.OnStart -= vars.TimerStart; -} diff --git a/dragonage2.asl b/dragonage2.asl deleted file mode 100644 index cc30dd9..0000000 --- a/dragonage2.asl +++ /dev/null @@ -1,9 +0,0 @@ -state("DragonAge2") -{ - bool isLoading : 0x95869C, 0x1D0; -} - -isLoading -{ - return current.isLoading; -} diff --git a/dredd.asl b/dredd.asl deleted file mode 100644 index b4cdf33..0000000 --- a/dredd.asl +++ /dev/null @@ -1,18 +0,0 @@ -state("Dredd") -{ - int chapterNumber : 0x21410C; - bool isLoading : 0x240A5C, 0xC; -} - -split -{ - return ( - current.chapterNumber != 12 && - current.chapterNumber > old.chapterNumber - ); -} - -isLoading -{ - return current.isLoading; -} diff --git a/dxmd.asl b/dxmd.asl deleted file mode 100644 index ed74ae2..0000000 --- a/dxmd.asl +++ /dev/null @@ -1,79 +0,0 @@ -state("DXMD") { } - -startup -{ - // ptr: address of the offset (not the start of the instruction!) - // offsetSize: the number of bytes of the offset - // remainingBytes: the number of bytes until the end of the instruction (not including the offset bytes) - vars.ReadOffset = (Func)((proc, ptr, offsetSize, remainingBytes) => - { - byte[] offsetBytes; - if (ptr == IntPtr.Zero || !proc.ReadBytes(ptr, offsetSize, out offsetBytes)) - return IntPtr.Zero; - - int offset; - switch (offsetSize) - { - case 1: - offset = offsetBytes[0]; - break; - case 2: - offset = BitConverter.ToInt16(offsetBytes, 0); - break; - case 4: - offset = BitConverter.ToInt32(offsetBytes, 0); - break; - default: - throw new Exception("Unsupported offset size"); - } - return ptr + offsetSize + remainingBytes + offset; - }); - - vars.loadingStructTarget = new SigScanTarget(18, - "55", // push rbp - "56", // push rsi - "57", // push rdi - "48 8D 6C 24 80", // lea rbp,[rsp--80] - "48 81 EC 80 01 00 00", // sub rsp,00000180 - "48 8B 05 ?? ?? ?? ??", // mov rax,[DXMD.NvOptimusEnablement+B5EF00] - "48 89 CE", // mov rsi,rcx - "48 8D 0D ?? ?? ?? ??", // lea rcx,[DXMD.NvOptimusEnablement+B5EF00] - "FF 50 68", // call qword ptr [rax+68] - "48 8B 46 08", // mov rax,[rsi+08] - "48 8D 0D ?? ?? ?? ??", // lea rcx,[DXMD.NvOptimusEnablement+B4CFB0] - "48 8B 50 08" // mov rdx,[rax+08] - ); -} - -init -{ - var module = modules.First(); - var scanner = new SignatureScanner(game, module.BaseAddress, module.ModuleMemorySize); - var isLoadingStructPtr = scanner.Scan(vars.loadingStructTarget); - var isLoadingStructAddr = vars.ReadOffset(game, isLoadingStructPtr, 4, 0); - var isLoadingAddr = isLoadingStructAddr + 0x6580; // lets just hope this never changes - - print("[NoLoads] isLoadingStructPtr: " + isLoadingStructPtr.ToString("X")); - print("[NoLoads] isLoadingAddr: " + isLoadingAddr.ToString("X")); - - vars.isLoading = new MemoryWatcher(isLoadingAddr); -} - -exit -{ - timer.IsGameTimePaused = true; -} - -update -{ - vars.isLoading.Update(game); - - if (vars.isLoading.Current != vars.isLoading.Old) { - print("[NoLoads] isLoading changed from " + vars.isLoading.Old + " to " + vars.isLoading.Current); - } -} - -isLoading -{ - return vars.isLoading.Current; -} diff --git a/fallout12.asl b/fallout12.asl deleted file mode 100644 index c0d9682..0000000 --- a/fallout12.asl +++ /dev/null @@ -1,19 +0,0 @@ -state("falloutw") -{ - // Fallout 1 (no vars) -} - -state("FALLOUT2") -{ - // Fallout 2 (no vars) -} - -exit -{ - timer.IsGameTimePaused = true; -} - -isLoading -{ - return false; -} diff --git a/fallout3.asl b/fallout3.asl deleted file mode 100644 index 8dd008c..0000000 --- a/fallout3.asl +++ /dev/null @@ -1,15 +0,0 @@ -state("Fallout3") -{ - bool isLoading : 0xC76CE8; - bool introDone : 0xC771D0; -} - -exit -{ - timer.IsGameTimePaused = true; -} - -isLoading -{ - return current.isLoading || !current.introDone; -} diff --git a/fallout_anthology.asl b/fallout_anthology.asl deleted file mode 100644 index 025ae3d..0000000 --- a/fallout_anthology.asl +++ /dev/null @@ -1,165 +0,0 @@ -state("falloutw") -{ - // Fallout 1 (no vars) -} - -state("FALLOUT2") -{ - // Fallout 2 (no vars) -} - -state("BOS") -{ - // lmao good joke -} - -state("Fallout3") -{ - // Fallout 3 - bool isLoading : 0xC76CE8; -} - -state("FalloutNV") -{ - // Fallout: New Vegas - bool isLoading : 0xDDA4EC; -} - -state("Fallout4") -{ - // Fallout 4 -} - -startup -{ - vars.watchers = new MemoryWatcherList(); - - vars.ReadOffset = (Func)((proc, ptr) => { - int offset; - if (ptr == IntPtr.Zero || !proc.ReadValue(ptr, out offset)) { - return IntPtr.Zero; - } - return ptr + 5 + offset; - }); - - vars.loadScreenTarget = new SigScanTarget(0, - "80 3D ?? ?? ?? ?? 00", // cmp byte ptr [Fallout4.exe+6CC83C8],00 ; Cell Transition - "48 89 5C 24 70", // mov [rsp+70],rbx - "48 89 74 24 50", // mov [rsp+50],rsi - "48 89 7C 24 48", // mov [rsp+48],rdi - "0F 85 ?? ?? ?? ??", // jne Fallout4.Scaleform::GFx::System::Init+1420BF - "48 8B 05 ?? ?? ?? ??", // mov rax,[Fallout4.exe+700FAF0] - "48 85 C0", // test rax,rax - "74 ??", // je Fallout4.Scaleform::GFx::System::Init+141FE1 - "80 B8 ?? ?? ?? ?? 00", // cmp byte ptr [rax+000000C5],00 - "0F 85 ?? ?? ?? ??", // jne Fallout4.Scaleform::GFx::System::Init+1420F2 - "80 B8 ?? ?? ?? ?? 00", // cmp byte ptr [rax+000000C6],00 - "0F 85 ?? ?? ?? ??", // jne Fallout4.Scaleform::GFx::System::Init+1420F2 - "48 89 6C 24 78", // mov [rsp+78],rbp - "C6 05 ?? ?? ?? ?? 01" // mov byte ptr [Fallout4.exe+6FB1524],01 ; Loading Screen - ); - - vars.quickloadingTarget = new SigScanTarget(2, - "C6 05 ?? ?? ?? ?? 01", // mov byte ptr [Fallout4.exe+44BB958],01 ; Quickloading - "48 8D 0D ?? ?? ?? ??", // lea rcx,[Fallout4.exe+6FCDA38] - "E8 ?? ?? ?? ??", // call Fallout4.exe+1F83490 - "41 89 1F", // mov [r15],ebx - "48 83 C4 58", // add rsp,58 - "41 5F", // pop r15 - "5B", // pop rbx - "C3" // ret - ); - - vars.waitingTarget = new SigScanTarget(44, - "F0 FF 05 ?? ?? ?? ??", // lock inc [Fallout4.exe+70432C4] - "8B 15 ?? ?? ?? ??", // mov edx,[Fallout4.exe+704370C] - "8B 44 24 78", // mov eax,[rsp+78] - "F3 0F 10 44 24 70", // movss xmm0,[rsp+70] - "48 8B 0D ?? ?? ?? ??", // mov rcx,[Fallout4.exe+7043718] - "3B D0", // cmp edx,eax - "F3 0F 11 3D ?? ?? ?? ??", // movss [Fallout4.exe+7043294],xmm7 - "F3 0F 11 05 ?? ?? ?? ??", // movss [Fallout4.exe+7043298],xmm0 ; isWaiting-2 - "0F 43 D6" // cmovae edx,esi - ); -} - -init -{ - if (game.ProcessName == "Fallout4") { - var module = modules.First(); - var scanner = new SignatureScanner(game, module.BaseAddress, module.ModuleMemorySize); - - var isQuickloadingAddr = vars.ReadOffset(game, scanner.Scan(vars.quickloadingTarget)); - var isWaitingAddr = vars.ReadOffset(game, scanner.Scan(vars.waitingTarget)) + 2; - - var loadScreenTargetAddr = scanner.Scan(vars.loadScreenTarget); - var isCellTransitionAddr = IntPtr.Zero; - var isLoadingScreenAddr = IntPtr.Zero; - if (loadScreenTargetAddr != IntPtr.Zero) { - isCellTransitionAddr = vars.ReadOffset(game, loadScreenTargetAddr + 2); - isLoadingScreenAddr = vars.ReadOffset(game, loadScreenTargetAddr + 73); - } - - print( - "[NoLoads] isLoadingScreen: " + isLoadingScreenAddr.ToString("X") + "\n" + - "[NoLoads] isQuickloading: " + isQuickloadingAddr.ToString("X") + "\n" + - "[NoLoads] isCellTransition: " + isCellTransitionAddr.ToString("X") + "\n" + - "[NoLoads] isWaiting: " + isWaitingAddr.ToString("X") - ); - - var addresses = new IntPtr[] { - isQuickloadingAddr, - isWaitingAddr, - isCellTransitionAddr, - isLoadingScreenAddr - }; - if (addresses.Any(o => (ulong)o <= 100)) { - throw new Exception("Failed to find all addresses."); - } - - vars.isLoadingScreen = new MemoryWatcher(isLoadingScreenAddr); - vars.isQuickloading = new MemoryWatcher(isQuickloadingAddr); - vars.isCellTransition = new MemoryWatcher(isCellTransitionAddr); - vars.isWaiting = new MemoryWatcher(isWaitingAddr); - - vars.watchers.Clear(); - vars.watchers.AddRange(new MemoryWatcher[] { - vars.isLoadingScreen, - vars.isQuickloading, - vars.isCellTransition, - vars.isWaiting - }); - - timer.IsGameTimePaused = false; - } -} - -exit -{ - timer.IsGameTimePaused = true; -} - -update -{ - if (game.ProcessName == "Fallout4") { - vars.watchers.UpdateAll(game); - } -} - -isLoading -{ - if (timer.CurrentSplit.Name.ToLower().Contains("setup")) { - return true; - } else if (game.ProcessName == "Fallout3" || game.ProcessName == "FalloutNV") { - return current.isLoading; - } else if (game.ProcessName == "Fallout4") { - return ( - vars.isLoadingScreen.Current || - vars.isQuickloading.Current || - vars.isCellTransition.Current || - vars.isWaiting.Current == 68 - ); - } else { - return false; - } -} diff --git a/legobatman.asl b/legobatman.asl deleted file mode 100644 index 77e49c1..0000000 --- a/legobatman.asl +++ /dev/null @@ -1,14 +0,0 @@ -state("legobatman") -{ - bool isLoading : 0x5C9998; -} - -exit -{ - timer.IsGameTimePaused = true; -} - -isLoading -{ - return current.isLoading; -} diff --git a/masseffect.asl b/masseffect.asl deleted file mode 100644 index ea9dfbd..0000000 --- a/masseffect.asl +++ /dev/null @@ -1,9 +0,0 @@ -state("MassEffect") -{ - bool isLoading : 0x1263BDC; -} - -isLoading -{ - return current.isLoading; -} diff --git a/morrowind.asl b/morrowind.asl deleted file mode 100644 index d4e90a0..0000000 --- a/morrowind.asl +++ /dev/null @@ -1,347 +0,0 @@ -state("Morrowind", "v1.0") -{ - string50 cell : 0x3AEA88, 0xB540, 0x10, 0; - string50 region : 0x3AEA88, 0xB540, 0x8C, 0x30; - // float playerX : 0x3AEA88, 0, 0xAC40, 0x38; - // float playerY : 0x3AEA88, 0, 0xAC40, 0x3C; - // float playerZ : 0x3AEA88, 0, 0xAC40, 0x40; - bool playerControlsDisabled : 0x3AEA84, 0x5C, 0x24, 0, 0x5A0; - bool loadingScreenVisible : 0x3BBCE0; - bool extraLoadingCheck : 0x3B0704; - float fadeInTime : 0x3AEA84, 0x348, 0x4; - // Not 100% certain what this address correlates to but the behavior is as follows - // 255 when loading or walking around (no menus). 0 When dialog/menu are open... UNLESS mousing over a dialog border, then 1. - byte dialogIcon : 0x3AEA84, 0x50, 0x14; - float gameTime : 0x3AE9B0; -} - -state("Morrowind", "goty") -{ - string50 cell : 0x3C67E0, 0xB540, 0x10, 0; - string50 region : 0x3C67E0, 0xB540, 0x90, 0x30; - // float playerX : 0x3AEA88, 0, 0xAC40, 0x38; - // float playerY : 0x3AEA88, 0, 0xAC40, 0x3C; - // float playerZ : 0x3AEA88, 0, 0xAC40, 0x40; - bool playerControlsDisabled : 0x003C67DC, 0x5C, 0x24, 0x0, 0x5B0; - bool loadingScreenVisible : 0x3D4294; - bool extraLoadingCheck : 0x3C85B8; - float fadeInTime : 0x3C67DC, 0x354, 0x4; - // Not 100% certain what this address correlates to but the behavior is as follows - // 255 when loading or walking around (no menus). 0 When dialog/menu are open... UNLESS mousing over a dialog border, then 1. - byte dialogIcon : 0x3C67DC, 0x50, 0x14; - float gameTime : 0x3C6708; -} - -init -{ - print("[Morrowind NoLoads] Module size: " + modules.First().ModuleMemorySize); - if (modules.First().ModuleMemorySize == 4431872) - { - version = "goty"; - } - else if (modules.First().ModuleMemorySize == 3981312) - { - version = "v1.0"; - } -} - -startup -{ - vars.prevPhase = null; - vars.isLoading = false; - vars.wasLoading = false; - vars.loadingChecks = 0; - vars.doStart = false; - vars.doSplit = false; - vars.doReset = false; - vars.balmoraHasSplit = false; - vars.potionShopVisited = false; - - settings.Add("any", false, "Any%"); - settings.Add("any_guard", false, "Leave Ship", "any"); - settings.Add("any_redguard", false, "Pick Redguard", "any"); - settings.Add("any_steal", false, "Steal Platter", "any"); - settings.Add("any_ring", false, "Give Ring", "any"); - settings.Add("any_trade", false, "Trade", "any"); - settings.Add("any_rip", false, "Catch ", "any"); - settings.Add("any_walk", false, "Walk", "any"); - settings.Add("any_witch", false, "Buy Potions", "any"); - settings.Add("any_fly", false, "Fly", "any"); - settings.Add("any_dagger", false, "Get Keening", "any"); - settings.Add("any_fast", false, "Go Fast", "any"); - settings.Add("any_hammer", false, "Get Sunder", "any"); - settings.Add("any_noclip", false, "Noclip", "any"); - settings.Add("any_end", false, "End", "any"); - - settings.Add("amq", true, "All Main Quests"); - settings.Add("amq_seyda_neen", true, "Seyda Neen", "amq"); - settings.Add("amq_red_mountain", true, "Red Mountain", "amq"); - settings.Add("amq_astral_burial", true, "Astral Burial", "amq"); - settings.Add("amq_potion_shop", true, "Potion Shop", "amq"); - settings.Add("amq_balmora", true, "Balmora", "amq"); - settings.Add("amq_vivec", true, "Vivec", "amq"); - settings.Add("amq_ald_ruhn", true, "Ald-ruhn", "amq"); - settings.Add("amq_sul_matuul", true, "Sul-Matuul", "amq"); - settings.Add("amq_path_of_the_incarnate", true, "Path of the Incarnate", "amq"); - settings.Add("amq_ahemmusa", true, "Ahemmusa", "amq"); - settings.Add("amq_redoran_councillors", true, "Redoran Councillors", "amq"); - settings.Add("amq_sixth_house_base", true, "Sixth House Base", "amq"); - settings.Add("amq_erabenimsun", true, "Erabenimsun", "amq"); - settings.Add("amq_corpus_cure", true, "Corpus Cure", "amq"); - settings.Add("amq_zainab", true, "Zainab", "amq"); - settings.Add("amq_lost_prophecies", true, "Lost Prophecies", "amq"); - settings.Add("amq_redoran", true, "Redoran", "amq"); - settings.Add("amq_hlaalu", true, "Hlaalu", "amq"); - settings.Add("amq_hortator_and_nerevarine", true, "Hortator and Nerevarine", "amq"); - settings.Add("amq_dagoth_ur", true, "Dagoth Ur", "amq"); -} - -exit -{ - timer.IsGameTimePaused = true; -} - -update -{ - current.cell = current.cell != null && current.cell.Length > 0 && current.region != null && current.region.Length > 0 - ? String.Join(" - ", current.cell, current.region) - : (current.cell != null && current.cell.Length > 0 ? current.cell : current.region); - - if (timer.CurrentPhase == TimerPhase.Running && vars.prevPhase == TimerPhase.NotRunning) { - // reset split trackers on start - vars.balmoraHasSplit = false; - vars.potionShopVisited = false; - } - - vars.prevPhase = timer.CurrentPhase; - // Always trust the original loading screen visible - // Extra loading check added as loadingScreenVisible doesn't handle all cases - // Extra loading check has a few edge cases (something to do with dialog immediately after journal entry). Check if we still fading in/out - vars.isLoading = current.loadingScreenVisible || (current.extraLoadingCheck && current.dialogIcon > 1 && current.fadeInTime > 0.0); - vars.wasLoading = old.loadingScreenVisible || (old.extraLoadingCheck && old.dialogIcon > 1 && old.fadeInTime > 0.0); - - if (vars.isLoading) - { - if (!vars.wasLoading) - { - print("[Morrowind NoLoads] Started Loading. " + DateTime.Now + "("+ DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond + ") Variables: current.loadingScreenVisible " +current.loadingScreenVisible+ " current.extraLoadingCheck " +current.extraLoadingCheck+ " current.dialogIcon " +current.dialogIcon + " last gametime " + old.gameTime + " current gameTime " + current.gameTime); - } - - vars.loadingChecks++; - } - else - { - if (vars.wasLoading) - { - print("[Morrowind NoLoads] Finished Loading after " + vars.loadingChecks + " checks. " + DateTime.Now + "("+ DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond + ") Variables: current.loadingScreenVisible " +current.loadingScreenVisible+ " current.extraLoadingCheck " +current.extraLoadingCheck+ " current.dialogIcon " +current.dialogIcon + " last gametime " + old.gameTime + " current gameTime " + current.gameTime); - - vars.loadingChecks = 0; - } - } - - vars.doStart = false; - vars.doSplit = false; - vars.doReset = false; - - if (current.playerControlsDisabled != old.playerControlsDisabled) { - if (current.playerControlsDisabled) { - print("[Morrowind NoLoads] player controls disabled"); - - if (current.cell == "Dagoth Ur, Facility Cavern" && (settings["any_end"] || settings["amq_dagoth_ur"])) { - // split 20 Dagoth Ur - vars.doSplit = true; - } - } else { - print("[Morrowind NoLoads] player controls enabled"); - - if (!current.loadingScreenVisible && current.cell == "Imperial Prison Ship") { - // start - vars.doStart = true; - } - } - } - - if (current.cell != old.cell) { - print(String.Format("[Morrowind NoLoads] cell changed from '{0}' to '{1}'", old.cell, current.cell)); - - // Any% - if (settings["any"]) { - if (settings["any_guard"] && old.cell == "Imperial Prison Ship") { - vars.doSplit = true; - } else if (settings["any_redguard"] && current.cell == "Seyda Neen, Census and Excise Office") { - vars.doSplit = true; - } else if (settings["any_steal"] && old.cell == "Seyda Neen, Census and Excise Office") { - vars.doSplit = true; - } else if (settings["any_ring"] && current.cell == "Seyda Neen, Arrille's Tradehouse") { - vars.doSplit = true; - } else if (settings["any_trade"] && old.cell == "Seyda Neen, Arrille's Tradehouse") { - vars.doSplit = true; - } else if (settings["any_rip"] && old.cell == "Bitter Coast Region" && current.cell == "Balmora - West Gash Region") { - vars.doSplit = true; - } else if (settings["any_walk"] && current.cell == "Balmora, Nalcarya of White Haven: Fine Alchemist") { - vars.doSplit = true; - } else if (settings["any_witch"] && old.cell == "Balmora, Nalcarya of White Haven: Fine Alchemist") { - vars.doSplit = true; - } else if (settings["any_fly"] && old.cell == "Odrosal - Red Mountain Region" && current.cell == "Odrosal, Dwemer Training Academy") { - vars.doSplit = true; - } else if (settings["any_dagger"] && old.cell == "Odrosal, Dwemer Training Academy" && current.cell != "Odrosal, Tower") { - vars.doSplit = true; - } else if (settings["any_fast"] && current.cell == "Vemynal, Outer Fortress") { - vars.doSplit = true; - } else if (settings["any_hammer"] && old.cell == "Vemynal, Hall of Torque") { - vars.doSplit = true; - } else if (settings["any_noclip"] && current.cell == "Akulakhan's Chamber") { - vars.doSplit = true; - } - } - - if (settings["amq"]) { - if (settings["amq_seyda_neen"] && old.cell == "Bitter Coast Region" && current.cell == "Balmora - West Gash Region") { - // split 01 Seyda Neen - vars.doSplit = true; - } else if (settings["amq_red_mountain"] && old.cell == "Vemynal, Outer Fortress" && current.cell != "Vemynal, Hall of Torque") { - // split 02 Red Mountain - vars.doSplit = true; - } else if (settings["amq_astral_burial"] && old.cell == "Urshilaku, Juno Burial") { - // split 03 Astral Burial - vars.doSplit = true; - } else if (settings["amq_potion_shop"] && old.cell == "Balmora, Nalcarya of White Haven: Fine Alchemist" && vars.potionShopVisited) { - // split 04 Potion Shop - vars.doSplit = true; - } else if (settings["amq_balmora"] && old.cell == "Balmora - West Gash Region" && current.cell == "Vivec - Ascadian Isles Region" && !vars.balmoraHasSplit) { - // split 05 Balmora - vars.doSplit = true; - // split make sure this doesn't double split - vars.balmoraHasSplit = true; - } else if (settings["amq_vivec"] && old.cell == "Vivec, Library of Vivec") { - // split 06 Vivec - vars.doSplit = true; - } else if (settings["amq_ald_ruhn"] && old.cell == "Ald-ruhn - Ashlands Region" && current.cell == "Khuul - West Gash Region") { - // split 07 Ald-ruhn - vars.doSplit = true; - } else if (settings["amq_sul_matuul"] && old.cell == "Urshilaku Camp, Wise Woman's Yurt") { - // split 08 Sul-Matuul - vars.doSplit = true; - } else if (settings["amq_path_of_the_incarnate"] && old.cell == "Cavern of the Incarnate") { - // split 09 Path of the Incarnate - vars.doSplit = true; - } else if (settings["amq_ahemmusa"] && old.cell == "Urshilaku Camp, Ashkhan's Yurt" && current.cell == "Ald-ruhn - Ashlands Region") { - // split 10 Ahemmusa - vars.doSplit = true; - } else if (settings["amq_redoran_councillors"] && old.cell == "Ald-ruhn - Ashlands Region" && current.cell == "Balmora - West Gash Region") { - // split 11 Redoran Councillors - vars.doSplit = true; - } else if (settings["amq_sixth_house_base"] && old.cell == "Vivec - Ascadian Isles Region" && current.cell == "Molag Mar - Molag Amur Region") { - // split 12 Sixth House Base - vars.doSplit = true; - } else if (settings["amq_erabenimsun"] && old.cell == "Erabenimsun Camp, Han-Ammu's Yurt") { - // split 13 Erabenimsun - vars.doSplit = true; - } else if (settings["amq_corpus_cure"] && old.cell == "Tower of Tel Fyr, Hall of Fyr" && current.cell == "Wolverine Hall - Azura's Coast Region") { - // split 14 Corpus Cure - vars.doSplit = true; - } else if (settings["amq_zainab"] && old.cell == "Zainab Camp, Ashkhan's Yurt" && current.cell == "Vivec - Ascadian Isles Region") { - // split 15 Zainab - vars.doSplit = true; - } else if (settings["amq_lost_prophecies"] && old.cell == "Holamayan Monastery" && current.cell == "Vivec - Ascadian Isles Region") { - // split 16 Lost Prophecies - vars.doSplit = true; - } else if (settings["amq_redoran"] && old.cell == "Ald-ruhn, Sarethi Manor" && current.cell == "Vivec - Ascadian Isles Region") { - // split 17 Redoran - vars.doSplit = true; - } else if (settings["amq_hlaalu"] && old.cell == "Vivec, Curio Manor" && current.cell == "Vivec, Temple - Ascadian Isles Region") { - // split 18 Hlaalu - vars.doSplit = true; - } else if (settings["amq_hortator_and_nerevarine"] && old.cell == "Vivec, Palace of Vivec" && current.cell == "Vivec - Ascadian Isles Region") { - // split 19 Hortator and Nerevarine - vars.doSplit = true; - } - } - - if (old.cell == "Balmora, Nalcarya of White Haven: Fine Alchemist") { - // enable potion shop split - vars.potionShopVisited = true; - } - } - - if (current.loadingScreenVisible != old.loadingScreenVisible) { - if (current.loadingScreenVisible) { - print("[Morrowind NoLoads] Loading screen started"); - } else { - print("[Morrowind NoLoads] Loading screen ended"); - - if (current.cell == "Imperial Prison Ship") { - // load finish in prison ship means reset - vars.doReset = true; - } - } - } - - // if (old.playerX != current.playerX || old.playerY != current.playerY || old.playerZ != current.playerZ) - // print(String.Format("[Morrowind NoLoads] x,y,z changed from {0},{1},{2} to {3},{4},{5}", old.playerX, old.playerY, old.playerZ, current.playerX, current.playerY, current.playerZ)); -} - -start -{ - return vars.doStart; -} - -split -{ - return vars.doSplit; -} - -reset -{ - return vars.doReset; -} - -isLoading -{ - return vars.isLoading; -} - -// Any% -// 01 from 'Imperial Prison Ship' to 'Ashlands Region' -// or 'Ashlands Region' to 'Seyda Neen - Bitter Coast Region' -// 02 from 'Seyda Neen - Bitter Coast Region' to 'Seyda Neen, Census and Excise Office' -// 03 from 'Seyda Neen, Census and Excise Office' to 'Ashlands Region' -// or 'Ashlands Region' to 'Seyda Neen - Bitter Coast Region' -// 04 from 'Seyda Neen - Bitter Coast Region' to 'Seyda Neen, Arrille's Tradehouse' -// 05 from 'Seyda Neen, Arrille's Tradehouse' to 'West Gash Region' -// 06 from 'Bitter Coast Region' to 'Balmora - West Gash Region' -// 07 from 'Balmora - West Gash Region' to 'Balmora, Nalcarya of White Haven: Fine Alchemist' -// 08 from 'Balmora, Nalcarya of White Haven: Fine Alchemist' to 'Balmora - West Gash Region' -// 09 from 'Odrosal - Red Mountain Region' to 'Odrosal, Dwemer Training Academy' -// 10 from 'Odrosal, Dwemer Training Academy' to 'Ashlands Region' -// or 'Ashlands Region' to 'Odrosal - Red Mountain Region' -// 11 from 'Vemynal - Red Mountain Region' to 'Vemynal, Outer Fortress' -// 12 from 'Vemynal, Hall of Torque' to 'Dagoth Ur - Red Mountain Region' -// 13 from 'Dagoth Ur, Facility Cavern' to 'Akulakhan's Chamber' -// 14 last split - -// AMQ -// 01 from 'Bitter Coast Region' to 'Balmora - West Gash Region' -// 02 from 'Vemynal, Outer Fortress' to 'Ashlands Region' -// or 'Ashlands Region' to 'Vemynal - Red Mountain Region' -// 03 from 'Urshilaku, Juno Burial' to 'Balmora, Nalcarya of White Haven: Fine Alchemist' -// 04 from 'Balmora, Milie Hastien: Fine Clothier' to 'West Gash Region' -// or 'West Gash Region' to 'Balmora - West Gash Region' -// 05 from 'Balmora - West Gash Region' to 'Vivec - Ascadian Isles Region' -// 06 from 'Vivec, Library of Vivec' to 'Balmora, Caius Cosades' House' -// 07 from 'Ald-ruhn - Ashlands Region' to 'Khuul - West Gash Region' -// 08 from 'Urshilaku Camp, Wise Woman's Yurt' to 'West Gash Region' -// or 'West Gash Region' to 'Urshilaku Camp - Ashlands Region' -// 09 from 'Cavern of the Incarnate' to 'Ashlands Region' -// 10 from 'Urshilaku Camp, Ashkhan's Yurt' to 'Ald-ruhn - Ashlands Region' -// 11 from 'Ald-ruhn - Ashlands Region' to 'Balmora - West Gash Region' -// 12 from 'Vivec - Ascadian Isles Region' to 'Molag Mar - Molag Amur Region' -// 13 from 'Erabenimsun Camp, Han-Ammu's Yurt' to 'Ashlands Region' -// or 'Ashlands Region' to 'Erabenimsun Camp - Molag Amur Region' -// 14 from 'Tower of Tel Fyr, Hall of Fyr' to 'Wolverine Hall - Azura's Coast Region' -// 15 from 'Zainab Camp, Ashkhan's Yurt' to 'Vivec - Ascadian Isles Region' -// 16 from 'Holamayan Monastery' to 'Vivec - Ascadian Isles Region' -// 17 from 'Ald-ruhn, Sarethi Manor' to 'Vivec - Ascadian Isles Region' -// 18 from 'Vivec, Curio Manor' to 'Vivec, Temple - Ascadian Isles Region' -// 19 from 'Vivec, Palace of Vivec' to 'Vivec - Ascadian Isles Region' -// 20 last split diff --git a/newvegas.asl b/newvegas.asl deleted file mode 100644 index 276ce7f..0000000 --- a/newvegas.asl +++ /dev/null @@ -1,25 +0,0 @@ -state("FalloutNV") -{ - bool loading : 0xDDA4EC; - bool introDone : 0xDDA590; -} - -update -{ - vars.isLoading = false; - if ((current.loading) || (!current.introDone)) { - vars.isLoading = true; - } -} - -exit -{ - timer.IsGameTimePaused = true; -} - -isLoading -{ - return vars.isLoading; -} - - diff --git a/oblivion.asl b/oblivion.asl deleted file mode 100644 index db31037..0000000 --- a/oblivion.asl +++ /dev/null @@ -1,124 +0,0 @@ -state("Oblivion") -{ - // TES 4: Oblivion, unknown version -} - -state("Oblivion", "1.0") -{ - // TES 4: Oblivion, original version - // version 1.0.228 - // size 7704576 - bool isLoadingScreen : 0x74F594; - bool notTalking : 0x6D25A0; - bool gamePaused : 0x7480BC; - bool midSpeech : 0x6E4C08; - bool isWaiting : 0x6BE410; - // uint spiesScroll : 0x6EA094; - // uint spiesScroll2 : 0x6DB898; -} - -state("Oblivion", "1.2") -{ - // TES 4: Oblivion, steam version - // version 1.2.0416 - // size 8409088 - - // Puri's vars - bool isLoadingScreen : 0x3CD4B0, 0x8, 0xEC; - byte isWaiting : 0x172DCC, 0x10; - // byte startingPrompt : 0x73BD60, 0x48, 0xC8, 0xB8, 0xDC; - - // TFC's vars - // bool isLoadingScreen : 0x742D54; - // bool notTalking : 0x72D91C; - // bool notPaused : 0x73341C; - // bool isWaiting : 0x712DE0; -} - -init -{ - version = modules.First().FileVersionInfo.FileVersion; - if (version == "1.0.228") { - version = "1.0"; - } else if (version == "1.2.0416") { - version = "1.2"; - } else { - version = ""; - } - - vars.prevPhase = timer.CurrentPhase; - vars.isLoading = false; - vars.dontLoad = false; - vars.mapTravel = false; - vars.guardWarp = false; - vars.guardWarp2 = false; -} - -exit -{ - timer.IsGameTimePaused = true; -} - -update -{ - if (version == "") { - // unsupported version - return; - } - - if (timer.CurrentPhase == TimerPhase.Running && vars.prevPhase == TimerPhase.NotRunning) { - vars.dontLoad = false; - vars.mapTravel = false; - vars.guardWarp = false; - vars.guardWarp2 = false; - } - - if (version == "1.0") { - vars.isLoading = (current.isLoadingScreen && current.notTalking && !vars.dontLoad) || current.isWaiting; - - // load pointer breaks when you start a conversation - if (current.midSpeech) { - vars.dontLoad = true; - vars.mapTravel = false; - vars.guardWarp2 = false; - } - if (current.isLoadingScreen && current.gamePaused && vars.dontLoad) { - vars.mapTravel = true; - vars.guardWarp = true; - } - if ((!current.isLoadingScreen && !current.gamePaused) || (current.gamePaused && !current.isLoadingScreen && vars.mapTravel)) { - vars.dontLoad = false; - vars.guardWarp = false; - } - if (vars.guardWarp && !current.gamePaused) { - vars.guardWarp2 = true; - } - if (vars.guardWarp2 && current.isLoadingScreen && current.gamePaused) { - vars.dontLoad = false; - } - } else { - vars.isLoading = current.isLoadingScreen || current.isWaiting != 0; - - // for TFC's vars - // if (current.isLoadingScreen && !current.notTalking) { - // vars.dontLoad = true; - // vars.mapTravel = false; - // } - // if (current.isLoadingScreen && !current.notPaused && vars.dontLoad && current.notTalking) { - // vars.mapTravel = true; - // } - // if (vars.mapTravel && !current.notPaused && !current.isLoadingScreen || (current.notTalking && !current.isLoadingScreen)) { - // vars.dontLoad = false; - // } - // if (!current.isLoadingScreen && current.notPaused) { - // vars.dontLoad = false; - // } - } - - vars.prevPhase = timer.CurrentPhase; -} - -isLoading -{ - return vars.isLoading; -} diff --git a/rotgut.asl b/rotgut.asl deleted file mode 100644 index 79061c9..0000000 --- a/rotgut.asl +++ /dev/null @@ -1,9 +0,0 @@ -state("Main") -{ - int level : "Adobe AIR.dll", 0x135BDF8, 0, 0x510, 0x190, 0x8, 0x25c; -} - -split -{ - return current.level > old.level; -} diff --git a/shadowwarrior2.asl b/shadowwarrior2.asl deleted file mode 100644 index 9c5ea1b..0000000 --- a/shadowwarrior2.asl +++ /dev/null @@ -1,83 +0,0 @@ -state("ShadowWarrior2") -{ - // 1.1.1.0 - 2016-10-15 - // unknown pointer -} - -state("ShadowWarrior2", "1.1.2.0") -{ - // 1.1.2.0 - 2016-10-15 - bool isGameplay : 0x1811908; -} - -state("ShadowWarrior2", "1.1.3.0") -{ - // 1.1.3.0 - 2016-10-22 - bool isGameplay : 0x18189E8; -} - -state("ShadowWarrior2", "1.1.4.0") -{ - // 1.1.4.0 - 2016-10-26 - bool isGameplay : 0x18202D8; -} - -state("ShadowWarrior2", "1.1.4.1") -{ - // 1.1.4.1 - 2016-10-27 - bool isGameplay : 0x181F2D8; -} - -state("ShadowWarrior2", "1.1.5.0") -{ - // 1.1.5.0 - 2016-11-09 - bool isGameplay : 0x18273B8; -} - -state("ShadowWarrior2", "1.1.5.1") -{ - // 1.1.5.1 - 2016-12-08 - bool isGameplay : 0x182BC58; -} - -state("ShadowWarrior2", "1.1.7.0") -{ - // 1.1.7.0 - 2016-12-21 - bool isGameplay : 0x18ABC58; -} - -state("ShadowWarrior2", "1.1.10.0") -{ - // 1.1.10.0 - 2017-03-15 - bool isGameplay : 0x18AFC98; -} - -state("ShadowWarrior2", "1.1.11.0") -{ - // 1.1.11.0 - 2017-08-22 - bool isGameplay : 0x18AFC98; -} - -state("ShadowWarrior2", "1.1.14.0") -{ - // 1.1.14.0 - 2018-02-17 - // Edit by Mr. Mary - it seems to remove loads where the others do, but there might be a better address to hook onto. - // Tested on GOG release - bool isGameplay : 0x18AE808; -} - -init -{ - version = modules.First().FileVersionInfo.FileVersion; - // print(version); -} - -exit -{ - timer.IsGameTimePaused = true; -} - -isLoading -{ - return !current.isGameplay; -} diff --git a/template.asl b/template.asl deleted file mode 100644 index 145aa45..0000000 --- a/template.asl +++ /dev/null @@ -1,64 +0,0 @@ -state("game") -{ - // define your pointer paths here - - bool isLoading : 0xDEADBEEF; -} - -startup -{ - // run when the script first loads, add settings here -} - -shutdown -{ - // run when the script is stopped -} - -init -{ - // run when the game is found, do any needed initialization here - - // resume game time on process start - timer.IsGameTimePaused = false; -} - -exit -{ - // run when the game process is lost - - // pause game time on crash / exit - timer.IsGameTimePaused = true; -} - -update -{ - // runs on every cycle, do any generic logic here -} - -start -{ - // return true when you want to start the splits -} - -reset -{ - // return true when you want to reset the splits -} - -split -{ - // return true when you want to trigger a split -} - -isLoading -{ - // return true when you want to pause the game time - - return current.isLoading; -} - -gameTime -{ - // return a TimeSpan if you want to manually specify the game time -} diff --git a/tes_anthology.asl b/tes_anthology.asl deleted file mode 100644 index 1931ca2..0000000 --- a/tes_anthology.asl +++ /dev/null @@ -1,159 +0,0 @@ -state("Arena") -{ - // TES 1: Arena (no vars) -} - -state("DOSBox") -{ - // TES 2: Daggerfall (no vars) -} - -state("Morrowind") -{ - // TES 3: Morrowind, unknown version -} - -state("Morrowind", "1.0") -{ - // TES 3: Morrowind, original version - // size 3981312 - bool loadingScreenVisible : 0x3BBCE0; - bool extraLoadingCheck : 0x3B0704; - float fadeInTime : 0x3AEA84, 0x348, 0x4; - // Not 100% certain what this address correlates to but the behavior is as follows - // 255 when loading or walking around (no menus). 0 When dialog/menu are open... UNLESS mousing over a dialog border, then 1. - byte dialogIcon : 0x3AEA84, 0x50, 0x14; -} - -state("Morrowind", "goty") -{ - // TES 3: Morrowind, goty version - // size 4431872 - bool loadingScreenVisible : 0x3D4294; - bool extraLoadingCheck : 0x3C85B8; - float fadeInTime : 0x3C67DC, 0x354, 0x4; - // Not 100% certain what this address correlates to but the behavior is as follows - // 255 when loading or walking around (no menus). 0 When dialog/menu are open... UNLESS mousing over a dialog border, then 1. - byte dialogIcon : 0x3C67DC, 0x50, 0x14; -} - -state("Oblivion") -{ - // TES 4: Oblivion, unknown version -} - -state("Oblivion", "1.0") -{ - // TES 4: Oblivion, original version - // version 1.0.228 - // size 7704576 - bool isLoadingScreen : 0x074F594; - bool notTalking : 0x06D25A0; - bool gamePaused : 0x07480BC; - bool midSpeech : 0x06E4C08; - bool isWaiting : 0x6BE410; -} - -state("Oblivion", "1.2") -{ - // TES 4: Oblivion, steam version - // version 1.2.0416 - // size 8409088 - bool isLoadingScreen : 0x3CD4B0, 0x8, 0xEC; - byte isWaiting : 0x172DCC, 0x10; -} - -state("TESV") -{ - // TES 5: Skyrim - bool isLoading : 0x17337CC; - bool isLoadingScreen : 0xEE3561; -} - -init -{ - vars.prevPhase = timer.CurrentPhase; - vars.isLoading = false; - version = ""; - - if (game.ProcessName == "Morrowind") { - if (modules.First().ModuleMemorySize == 4431872) { - version = "goty"; - } else if (modules.First().ModuleMemorySize == 3981312) { - version = "1.0"; - } - } else if (game.ProcessName == "Oblivion") { - if (modules.First().FileVersionInfo.FileVersion == "1.0.228") { - version = "1.0"; - } else if (modules.First().FileVersionInfo.FileVersion == "1.2.0416") { - version = "1.2"; - } - - vars.dontLoad = false; - vars.mapTravel = false; - vars.guardWarp = false; - vars.guardWarp2 = false; - } -} - -exit -{ - timer.IsGameTimePaused = true; -} - -update -{ - if (timer.CurrentSplit.Name.ToLower().Contains("setup")) { - vars.isLoading = true; - - } else if (game.ProcessName == "Morrowind") { - vars.isLoading = current.loadingScreenVisible || (current.extraLoadingCheck && current.dialogIcon > 1 && current.fadeInTime > 0.0); - - } else if (game.ProcessName == "Oblivion" && version != "") { - if (timer.CurrentPhase == TimerPhase.Running && vars.prevPhase == TimerPhase.NotRunning) { - vars.dontLoad = false; - vars.mapTravel = false; - vars.guardWarp = false; - vars.guardWarp2 = false; - } - - if (version == "1.0") { - vars.isLoading = (current.isLoadingScreen && current.notTalking && !vars.dontLoad) || current.isWaiting; - - // load pointer breaks when you start a conversation - if (current.midSpeech) { - vars.dontLoad = true; - vars.mapTravel = false; - vars.guardWarp2 = false; - } - if (current.isLoadingScreen && current.gamePaused && vars.dontLoad) { - vars.mapTravel = true; - vars.guardWarp = true; - } - if ((!current.isLoadingScreen && !current.gamePaused) || (current.gamePaused && !current.isLoadingScreen && vars.mapTravel)) { - vars.dontLoad = false; - vars.guardWarp = false; - } - if (vars.guardWarp && !current.gamePaused) { - vars.guardWarp2 = true; - } - if (vars.guardWarp2 && current.isLoadingScreen && current.gamePaused) { - vars.dontLoad = false; - } - } else { - vars.isLoading = current.isLoadingScreen || current.isWaiting != 0; - } - } else if (game.ProcessName == "TESV") { - vars.isLoading = current.isLoading || current.isLoadingScreen; - - } else { - vars.isLoading = false; - } - - vars.prevPhase = timer.CurrentPhase; -} - -isLoading -{ - return vars.isLoading; -} diff --git a/titanfall2.asl b/titanfall2.asl deleted file mode 100644 index 676f1a4..0000000 --- a/titanfall2.asl +++ /dev/null @@ -1,94 +0,0 @@ -state("Titanfall2") { } - -startup -{ - // ptr: address of the offset (not the start of the instruction!) - // offsetSize: the number of bytes of the offset - // remainingBytes: the number of bytes until the end of the instruction (not including the offset bytes) - vars.ReadOffset = (Func)((proc, ptr, offsetSize, remainingBytes) => - { - byte[] offsetBytes; - if (ptr == IntPtr.Zero || !proc.ReadBytes(ptr, offsetSize, out offsetBytes)) - return IntPtr.Zero; - - int offset; - switch (offsetSize) - { - case 1: - offset = offsetBytes[0]; - break; - case 2: - offset = BitConverter.ToInt16(offsetBytes, 0); - break; - case 4: - offset = BitConverter.ToInt32(offsetBytes, 0); - break; - default: - throw new Exception("Unsupported offset size"); - } - return ptr + offsetSize + remainingBytes + offset; - }); - - vars.gameplayTarget = new SigScanTarget(3, - "48 8D 0D ?? ?? ?? ??", // lea rcx,[engine.dll+129E7B34] - "83 E2 1F", // and edx,1F - "B8 01 00 00 00", // mov eax,00000001 - "4D 69 C0 ?? ?? ?? ??", // imul r8,r8,0002D790 - "4C 03 C1", // add r8,rcx - "0F B6 CA", // movzx ecx,dl - "D3 E0", // shl eax,cl - "45 84 C9" // test r9l,r9l - ); - - // 2.0.0.7 - // engine.F+1612D - 48 8D 0D 906F8112 - lea rcx,[engine.dll+129E7B34] - // engine.F+16134 - 83 E2 1F - and edx,1F - // engine.F+16137 - B8 01000000 - mov eax,00000001 - // engine.F+1613C - 4D 69 C0 90D70200 - imul r8,r8,0002D790 - // engine.F+16143 - 4C 03 C1 - add r8,rcx - // engine.F+16146 - 0FB6 CA - movzx ecx,dl - // engine.F+16149 - D3 E0 - shl eax,cl - // engine.F+1614B - 45 84 C9 - test r9l,r9l - - // 2.0.1.1 - // engine.F+1612D - 48 8D 0D 08F38512 - lea rcx,[engine.dll+12A3073C] - // engine.F+16134 - 83 E2 1F - and edx,1F - // engine.F+16137 - B8 01000000 - mov eax,00000001 - // engine.F+1613C - 4D 69 C0 98D70200 - imul r8,r8,0002D798 - // engine.F+16143 - 4C 03 C1 - add r8,rcx - // engine.F+16146 - 0FB6 CA - movzx ecx,dl - // engine.F+16149 - D3 E0 - shl eax,cl - // engine.F+1614B - 45 84 C9 - test r9l,r9l -} - -init -{ - var module = modules.FirstOrDefault(m => m.ModuleName.ToLower() == "engine.dll"); - var scanner = new SignatureScanner(game, module.BaseAddress, module.ModuleMemorySize); - var isGameplayPtr = scanner.Scan(vars.gameplayTarget); - var isGameplayAddr = vars.ReadOffset(game, isGameplayPtr, 4, 0); - - // print("[NoLoads] isGameplayPtr: " + isGameplayPtr.ToString("X")); - // print("[NoLoads] isGameplayAddr: " + isGameplayAddr.ToString("X")); - - vars.isGameplay = new MemoryWatcher(isGameplayAddr); -} - -exit -{ - timer.IsGameTimePaused = true; -} - -update -{ - vars.isGameplay.Update(game); - - // if (vars.isGameplay.Current != vars.isGameplay.Old) { - // print("[NoLoads] isGameplay changed from " + vars.isGameplay.Old + " to " + vars.isGameplay.Current); - // } -} - -isLoading -{ - return !vars.isGameplay.Current; -} diff --git a/wolf_new_order.asl b/wolf_new_order.asl deleted file mode 100644 index eb5e17f..0000000 --- a/wolf_new_order.asl +++ /dev/null @@ -1,14 +0,0 @@ -state("WolfNewOrder_x64") -{ - int isLoading : 0x1679A88; -} - -exit -{ - timer.IsGameTimePaused = true; -} - -isLoading -{ - return current.isLoading > 0; -} diff --git a/wolf_old_blood.asl b/wolf_old_blood.asl deleted file mode 100644 index a9d2260..0000000 --- a/wolf_old_blood.asl +++ /dev/null @@ -1,14 +0,0 @@ -state("WolfOldBlood_x64") -{ - int isLoading : 0x187ED7C; -} - -exit -{ - timer.IsGameTimePaused = true; -} - -isLoading -{ - return current.isLoading > 0; -} diff --git a/yakuza0.asl b/yakuza0.asl deleted file mode 100644 index 0bb5a9d..0000000 --- a/yakuza0.asl +++ /dev/null @@ -1,358 +0,0 @@ -// Yakuza 0 (PC, Steam) autosplitter & load remover -// Autosplitter by ToxicTT (Discord: ToxicTT#4487) -// Thank you rythin_sr for the advice, Drake_Shadow and JustSayKuro for initial testing. -// Description: https://pastebin.com/uTDJEGCk -// Load remover by DrTChops - -state("Yakuza0") -{ - int loadState : 0x132C520, 0xA38, 0x38, 0x4A0, 0x4A0, 0x4A0, 0x1EDC; - string15 gameState : 0x01305FC8, 0x50, 0x6E2; - string40 location : 0x01163F28, 0x150, 0x18, 0x50; -} - -startup -{ - vars.isLoading = false; - vars.doSplit = false; - vars.chapter = 1; - vars.postEmptyLocation = ""; - vars.prevPhase = timer.CurrentPhase; - - settings.Add("Chapters", true, "Split on the end of each chapter"); - settings.Add("Main", false, "Optional splits (check tooltips)"); - - settings.Add("ch1", false, "Chapter 1", "Main"); - settings.Add("ch1A", false, "Visited Dojima Family HQ", "ch1"); - settings.SetToolTip("ch1A", "Splits when you are back in Kamurocho and about to fight Bruno."); - settings.Add("ch1B", false, "Arrived at Dojima Family HQ to fight", "ch1"); - settings.SetToolTip("ch1B", "Splits on the first cutscene of the HQ."); - - settings.Add("ch2", false, "Chapter 2", "Main"); - settings.Add("ch2A", false, "Visited Kiryu's Apartment", "ch2"); - settings.SetToolTip("ch2A", "Splits when you are back in Kamurocho, Hotel District."); - settings.Add("ch2B", false, "Arrived in Public Park 3 to homeless men", "ch2"); - settings.SetToolTip("ch2B", "Splits right as you step into that little park area."); - - settings.Add("ch3", false, "Chapter 3", "Main"); - settings.Add("ch3A", false, "Out of Cabaret Grand", "ch3"); - settings.SetToolTip("ch3A", "Splits after you first leave your cabaret."); - settings.Add("ch3B", false, "Out of Club Odyssey", "ch3"); - settings.SetToolTip("ch3B", "Splits when you leave Odyssey club and about to talk on the payphone."); - - settings.Add("ch4", false, "Chapter 4", "Main"); - settings.Add("ch4A", false, "Out of Maharaja", "ch4"); - settings.SetToolTip("ch4A", "Splits when you leave Maharaja and about to fight outside."); - settings.Add("ch4B", false, "Out of Hogushi Kaikan Massage", "ch4"); - settings.SetToolTip("ch4B", "Splits when you leave the clinic and start looking for Makoto."); - - settings.Add("ch5", false, "Chapter 5", "Main"); - settings.Add("ch5A", false, "Out of Serena", "ch5"); - settings.SetToolTip("ch5A", "Splits once you exit out of Serena bar, before the fight"); - - settings.Add("ch6", false, "Chapter 6", "Main"); - settings.Add("ch6A", false, "Out of Komurocho to Kiryu's Apartment", "ch6"); - settings.SetToolTip("ch6A", "Splits when you arrive in the area near Kiryu's Apartment."); - settings.Add("ch6B", false, "Into the Sewer", "ch6"); - settings.SetToolTip("ch6B", "Splits when you step into the sewers."); - - settings.Add("ch7", false, "Chapter 7", "Main"); - settings.Add("ch7A", false, "Bought takoyaki", "ch7"); - settings.SetToolTip("ch7A", "Splits after you bought takoyaki and heading back to Makoto."); - settings.Add("ch7B", false, "Went through the hidden door in clinic", "ch7"); - settings.SetToolTip("ch7B", "Splits when you stepped through the hidden door in Hogushi Kaikan Massage and appeared in the back alley."); - - settings.Add("ch8", false, "Chapter 8", "Main"); - settings.Add("ch8A", false, "Out of Cabaret Grand", "ch8"); - settings.SetToolTip("ch8A", "Splits when you exit out of cabaret after Nishitani fight."); - settings.Add("ch8B", false, "Reached the 2nd stealth section", "ch8"); - settings.SetToolTip("ch8B", "Splits when you get to Shofukucho street, the 2nd stealth section."); - - settings.Add("ch9", false, "Chapter 9", "Main"); - settings.Add("ch9A", false, "Out of Serena", "ch9"); - settings.SetToolTip("ch9A", "Splits when you done fighting in Serena and exit through the backdoor."); - - settings.Add("ch10", false, "Chapter 10", "Main"); - settings.Add("ch10A", false, "Arrived at Tojo Clan HQ", "ch10"); - settings.SetToolTip("ch10A", "Splits when you arrive at Tojo Clan HQ."); - settings.Add("ch10B", false, "Out of Tojo Clan HQ (Pier cutscene)", "ch10"); - settings.SetToolTip("ch10B", "Splits once you escape from Tojo Clan HQ, on pier cutscene."); - - settings.Add("ch11", false, "Chapter 11", "Main"); - settings.Add("ch11A", false, "Out of colosseum", "ch11"); - settings.SetToolTip("ch11A", "Splits once you are back at the bridge after The Bed of Styx."); - - // no splits for ch 12 - // short chapter, all in the same location - - settings.Add("ch13", false, "Chapter 13", "Main"); - settings.Add("ch13A", false, "Got to Benten Inn", "ch13"); - settings.SetToolTip("ch13A", "Splits when Oda and Kiryu reach Benten Inn, right before the chase begins."); - settings.Add("ch13B", false, "Got to Building Under Construction", "ch13"); - settings.SetToolTip("ch13B", "Splits once you get to the construction site."); - - settings.Add("ch14", false, "Chapter 14", "Main"); - settings.Add("ch14A", false, "Got to Crescendo Building", "ch14"); - settings.SetToolTip("ch14A", "Splits once you get to the door of Crescendo Building."); - - settings.Add("ch15", false, "Chapter 15", "Main"); - settings.Add("ch15A", false, "Got to rooftop with Kashiwagi", "ch15"); - settings.SetToolTip("ch15A", "Splits once get to the rooftop of Kazama HQ."); - settings.Add("ch15B", false, "Back on the streets after Kashiwagi fight", "ch15"); - settings.SetToolTip("ch15B", "Splits after the Kashiwagi fight, on Nakamichi Alley."); - settings.Add("ch15C", false, "Out of Serena", "ch15"); - settings.SetToolTip("ch15C", "Splits after Nishiki fight, on Tenkaichi St."); - - settings.Add("ch16", false, "Chapter 16", "Main"); - settings.Add("ch16A", false, "Reached Children's Park with Makoto", "ch16"); - settings.SetToolTip("ch16A", "Splits when cutscene in Children's Park starts."); - settings.Add("ch16B", false, "Reached Sebastian Building", "ch16"); - settings.SetToolTip("ch16B", "Splits once you reach Sebastian Building."); - - settings.Add("ch17", false, "Chapter 17", "Main"); - settings.Add("ch17A", false, "Out of Kamurocho", "ch17"); - settings.SetToolTip("ch17A", "Splits when you get to the office with Majima after leaving Kamurocho."); - settings.Add("ch17B", false, "Finished fighting through the Consortium Ship", "ch17"); - settings.SetToolTip("ch17B", "Splits once you done going through the ship and switched to Majima."); - settings.Add("ch17C", false, "Reached the top floor of Dojima HQ", "ch17"); - settings.SetToolTip("ch17C", "Splits once you enter the cutscene with Awano."); - settings.Add("ch17D", false, "Finished with Dojima HQ fights", "ch17"); - settings.SetToolTip("ch17D", "Splits once you done fighting at Dojima HQ and transitioned to the Consortium Ship."); -} - -update -{ - vars.isLoading = current.loadState == 1; - vars.doSplit = false; - - // reset chapter on both manual start or auto start (if it ever gets added) - if (timer.CurrentPhase == TimerPhase.Running && vars.prevPhase == TimerPhase.NotRunning) - { - vars.chapter = 1; - } - vars.prevPhase = timer.CurrentPhase; - - if (current.location == "" && old.location != "") - { - vars.postEmptyLocation = old.location; - } - - if (current.gameState == "pjcm_result.sbb" && old.gameState != "pjcm_result.sbb") - { - vars.chapter++; - vars.doSplit = settings["Chapters"]; - } - else if (vars.chapter == 1) - { - if (current.location == "Nakamichi St. Entrance" && vars.postEmptyLocation == "Dojima Family HQ") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch1A"]; - } - else if (current.location == "Dojima Family HQ" && vars.postEmptyLocation == "Tenkaichi St. Entrance") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch1B"]; - } - } - else if (vars.chapter == 2) - { - if (current.location == "Hotel District" && vars.postEmptyLocation == "Near Kiryu's Apartment") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch2A"]; - } - else if (current.location == "Public Park 3" && old.location == "Tenkaichi Alley" && vars.postEmptyLocation != "Public Park 3") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch2B"]; - } - } - else if (vars.chapter == 3) - { - if (current.location == "Sotenbori St. West" && vars.postEmptyLocation == "Cabaret Grand") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch3A"]; - } - else if (current.location == "Shofukucho South" && vars.postEmptyLocation == "Odyssey") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch3B"]; - } - } - else if (vars.chapter == 4) - { - if (current.location == "Shofukucho East" && vars.postEmptyLocation == "Maharaja Sotenbori") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch4A"]; - } - else if (current.location == "Shofukucho South" && vars.postEmptyLocation == "Hogushi Kaikan Massage") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch4B"]; - } - } - else if (vars.chapter == 5) - { - if (current.location == "Serena Backlot" && vars.postEmptyLocation == "Serena") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch5A"]; - } - } - else if (vars.chapter == 6) - { - if (current.location == "Near Kiryu's Apartment" && vars.postEmptyLocation == "Hotel District") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch6A"]; - } - else if (current.location == "Sewer" && vars.postEmptyLocation == "Asia") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch6B"]; - } - } - else if (vars.chapter == 7) - { - if (current.location != "Magutako" && old.location == "Magutako" && vars.postEmptyLocation != "Magutako") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch7A"]; - } - else if (current.location == "Hoganji Yokocho" && vars.postEmptyLocation == "Hogushi Kaikan Massage") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch7B"]; - } - } - else if (vars.chapter == 8) - { - if (current.location == "Sotenbori St. West" && vars.postEmptyLocation == "Cabaret Grand") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch8A"]; - } - else if (current.location == "Shofukucho" && vars.postEmptyLocation == "Odyssey's Warehouse") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch8B"]; - } - } - else if (vars.chapter == 9) - { - if (current.location == "Serena Backlot" && vars.postEmptyLocation == "Serena") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch9A"]; - } - } - else if (vars.chapter == 10) - { - if (current.location == "Tojo Clan Headquarters" && vars.postEmptyLocation == "West Park") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch10A"]; - } - else if (current.location == "Pier" && vars.postEmptyLocation == "Tojo Clan Headquarters") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch10B"]; - } - } - else if (vars.chapter == 11) - { - if (current.location == "Bishamon Bridge" && vars.postEmptyLocation == "The Bed of Styx") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch11A"]; - } - } - else if (vars.chapter == 13) - { - if (current.location == "Benten Inn" && vars.postEmptyLocation == "CAL Videos") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch13A"]; - } - else if (current.location == "Building Under Construction" && vars.postEmptyLocation == "Benten Inn") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch13B"]; - } - } - else if (vars.chapter == 14) - { - if (current.location == "Crescendo Building" && vars.postEmptyLocation == "West Park") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch14A"]; - } - } - else if (vars.chapter == 15) - { - if (current.location == "Certain Rooftop" && vars.postEmptyLocation == "Tenkaichi St.") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch15A"]; - } - else if (current.location == "Nakamichi Alley" && vars.postEmptyLocation == "Certain Rooftop") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch15B"]; - } - else if (current.location == "Tenkaichi St." && vars.postEmptyLocation == "Serena") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch15C"]; - } - } - else if (vars.chapter == 16) - { - if (current.location == "Children's Park" && old.location == "Theater Square" && vars.postEmptyLocation == "The Empty Lot") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch16A"]; - } - else if (current.location == "Sebastian Building" && vars.postEmptyLocation == "Park Blvd.") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch16B"]; - } - } - else if (vars.chapter == 17) - { - if (current.location == "Sagawa's Secret Office" && vars.postEmptyLocation == "Tenkaichi St. Entrance") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch17A"]; - } - else if (current.location == "Dojima Family HQ" && vars.postEmptyLocation == "Nikkyo Consortium Ship") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch17B"]; - } - else if (current.location == "Dojima Family HQ Top Floor" && vars.postEmptyLocation == "Dojima Family HQ") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch17C"]; - } - else if (current.location == "Nikkyo Consortium Ship" && vars.postEmptyLocation == "Dojima Family HQ Top Floor") - { - vars.postEmptyLocation = current.location; - vars.doSplit = settings["ch17D"]; - } - } -} - -split -{ - return vars.doSplit; -} - -isLoading -{ - return vars.isLoading; -} diff --git a/yakuza_kiwami.asl b/yakuza_kiwami.asl deleted file mode 100644 index 33ad477..0000000 --- a/yakuza_kiwami.asl +++ /dev/null @@ -1,64 +0,0 @@ -// Yakuza Kiwami (PC, Steam) autosplitter & load remover -// Autosplitter by ToxicTT (Discord: ToxicTT#4487) -// Load remover by DrTChops - -state("YakuzaKiwami") -{ - int loadState : 0x19D5050, 0x1E8, 0x4A0, 0x4A0, 0x310, 0x1EDC; - string25 gameState0 : 0x128DD50, 0xC8, 0x490, 0x72; - string25 gameState1 : 0x128DD50, 0xC8, 0x490, 0xBA; - string25 gameState2 : 0x128DD50, 0xC8, 0x490, 0x102; - string25 gameState3 : 0x128DD50, 0xC8, 0x490, 0x14A; - string25 gameState4 : 0x128DD50, 0xC8, 0x490, 0x192; - string25 gameState5 : 0x128DD50, 0xC8, 0x490, 0x1DA; -} - -startup -{ - vars.isLoading = false; - vars.doSplit = false; - vars.doStart = false; - vars.prevChapterDisplay = false; -} - -update -{ - vars.isLoading = current.loadState == 1; - vars.doSplit = false; - vars.doStart = false; - - bool chapterDisplay = false; - - if (current.gameState0 == "pjcm_syotitle.sbb" || - current.gameState1 == "pjcm_syotitle.sbb" || - current.gameState2 == "pjcm_syotitle.sbb" || - current.gameState3 == "pjcm_syotitle.sbb" || - current.gameState4 == "pjcm_syotitle.sbb" || - current.gameState5 == "pjcm_syotitle.sbb") - { - chapterDisplay = true; - } - - if (chapterDisplay && !vars.prevChapterDisplay) - { - vars.doSplit = true; - vars.doStart = true; - } - - vars.prevChapterDisplay = chapterDisplay; -} - -start -{ - return vars.doStart; -} - -split -{ - return vars.doSplit; -} - -isLoading -{ - return vars.isLoading; -}