state("bond", "elamigos repack") //17612800 { bool load: 0x00F893D8, 0x24, 0x820; //Tracks loading bool csload: 0x102C2D0; //Remains true through any cutscene that also loads a level bool cutscene: 0x007469D8, 0xC; //Returns true when an in game cutscene is playing int trainObj: 0x00F33424, 0x0, 0x2DC, 0x34, 0xD90; ushort pObj: 0x1010FC0; byte mObj: 0x1010FB8; byte dead: 0x0102B410, 0x80, 0x14, 0x0, 0x0, 0xE10; float stamina: 0x00FAE574, 0xC, 0xC, 0xB94; string60 level: 0x00F75FA8, 0x0, 0x24; //Tracks the last loaded level ushort bik: "binkw32.dll", 0x220EC; //Tracks the last loaded .bik fmv float stamina: 0x00FAE574, 0xC, 0xC, 0xB94; } init { switch (modules.First().ModuleMemorySize) { case 17612800: version = "elamigos repack"; break; default: print("Unknown version detected, support may be limited."); return false; } } startup { vars.levels = new Dictionary<string, int>() { {"Pre_Credits_1\\artlevel", 0}, {"Pre_Credits_2_New\\artlevel", 1}, {"Pre_Credits_3\\artlevel", 2}, {"Barbados\\artlevel", 2}, {"Istanbul_0\\artlevel", 3}, {"Istanbul_Driving\\artlevel", 4}, {"Istanbul_2\\artlevel", 5}, {"Monaco\\artlevel", 6}, {"Monaco_Cut_Scene\\artlevel", 6}, {"Refinery_01\\artlevel", 7}, {"Refinery_02\\artlevel", 8}, {"Refinery_Driving\\artlevel", 9}, {"River_Battle_2\\artlevel", 10}, {"River_Battle_2_Cut_Scene\\artlevel", 10}, {"Bangkok_Aquarium\\artlevel", 11}, {"Bangkok\\artlevel", 12}, {"Bangkok_Driving\\artlevel", 13}, {"bangkok_escape\\artlevel", 14}, {"Bangkok_Escape_Silk_Cut_Scene\\artlevel", 15}, {"Mercenary_Camp\\artlevel", 16}, {"Dam_Works_1\\artlevel", 17}, {"Dam_Works_2\\artlevel", 18}, {"Monaco_Driving\\artlevel", 19}, }; vars.end = "Monaco_Driving\\artlevel"; vars.introCS = 16384; vars.menu = 2048; vars.intro = "Pre_Credits_1\\artlevel"; vars.train = "Istanbul_0\\artlevel"; vars.monaco = "Monaco\\artlevel"; vars.refinery = "Refinery_02\\artlevel"; vars.monoco2 = "Monaco_Driving\\artlevel"; settings.Add("train", false, "Split when activating train in Istanbul"); settings.Add("m_safe", false, "Split when hacking the safe in Monaco"); settings.Add("ref_split", false, "Split on Refinery \"return to control room\""); settings.Add("runnerman", false, "Enable Unlimited Sprint"); } update { //Write value of 1 to Sprints float value, enabling Unlimited Sprint if (settings["runnerman"]) { bool bSuccess; IntPtr hProcess = game.Handle; IntPtr lpPtrPath = IntPtr.Add(modules.First().BaseAddress, 0x00FAE574); byte[] lpBuffer = BitConverter.GetBytes((float)1); UIntPtr nSize = (UIntPtr)lpBuffer.Length; UIntPtr lpNumberOfBytesWritten = UIntPtr.Zero; UIntPtr nReadSize = (UIntPtr)4; byte[] lpReadBuf = new byte[4]; UIntPtr lpNumberOfBytesRead = UIntPtr.Zero; bSuccess = WinAPI.ReadProcessMemory(hProcess, lpPtrPath, lpReadBuf, nReadSize, out lpNumberOfBytesRead); lpPtrPath = (IntPtr)BitConverter.ToInt32(lpReadBuf, 0); lpPtrPath = IntPtr.Add(lpPtrPath, 0xC); bSuccess = WinAPI.ReadProcessMemory(hProcess, lpPtrPath, lpReadBuf, nReadSize, out lpNumberOfBytesRead); lpPtrPath = (IntPtr)BitConverter.ToInt32(lpReadBuf, 0); lpPtrPath = IntPtr.Add(lpPtrPath, 0xC); bSuccess = WinAPI.ReadProcessMemory(hProcess, lpPtrPath, lpReadBuf, nReadSize, out lpNumberOfBytesRead); lpPtrPath = (IntPtr)BitConverter.ToInt32(lpReadBuf, 0); lpPtrPath = IntPtr.Add(lpPtrPath, 0xB94); bSuccess = WinAPI.WriteProcessMemory(hProcess, lpPtrPath, lpBuffer, nSize, out lpNumberOfBytesWritten); bSuccess = WinAPI.ReadProcessMemory(hProcess, lpPtrPath, lpReadBuf, nReadSize, out lpNumberOfBytesRead); float stamina = BitConverter.ToSingle(lpReadBuf, 0); //print(stamina.ToString()); }} split { //Standard mission splits if (current.level != old.level && vars.levels[current.level] > vars.levels[old.level]) return true; //Optional Train split if ( settings["train"] && current.level == vars.train && current.pObj == 42491 && current.trainObj == 7274563 && current.trainObj != old.trainObj ) return true; //Optional Monaco Safe split if ( settings["m_safe"] && current.level == vars.monaco && old.mObj == 135 && current.mObj == 223 ) return true; //Optional Refinery Split if ( settings["ref_split"] && current.level == vars.refinery && current.pObj == 48109 && old.pObj != current.pObj ) return true; } isLoading { return current.load || current.csload && current.dead != 1; } //Starts timer when skipping first fmv start { return current.level == vars.intro && !current.csload && old.csload; }