Outlast.asl 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. /*
  2. -------------------------------------------Outlast/ Outlast Whistleblower ASL -------------------------------------------
  3. Major credits to Gelly, AlexisDR and the main mods for stress testing
  4. Original codes (isloading, xcord, ycord, zcord, incontrol) all found by MattMatt
  5. Splitter and logical changes made by Kuno Demetries
  6. IL timing, auto reset, start/end timing adjustments and 32bit implementation by Anti
  7. Additional checkpoint settings by Anti and Alexis
  8. aiden#0450 on discord
  9. */
  10. state("OLGame", "Patch2, 64bit") {
  11. bool isLoading: 0x01FFBCC8, 0x118; // Generic Loading string
  12. float xcoord: 0x02020F38, 0x278, 0x40, 0x454, 0x80;
  13. float zcoord: 0x02020F38, 0x278, 0x40, 0x454, 0x84;
  14. float ycoord: 0x02020F38, 0x278, 0x40, 0x454, 0x88;
  15. int yaw: 0x02020F38, 0x248, 0x114, 0xC8, 0x464, 0x1E8, 0x40, 0x90;
  16. string100 map: 0x02006F00, 0x6F4, 0x40, 0xAB4, 0x80, 0x0; // Current Checkpoint
  17. bool inControl: 0x02020F38, 0x248, 0x60, 0x30, 0x278, 0x54; // In control == 1
  18. bool ingame: "OLGame.exe", 0x0203BB4C; // Main menu = 0
  19. }
  20. state("OLGame", "Patch2, 32bit") {
  21. bool isLoading: "OLGame.exe", 0x017E5B30, 0xD8;
  22. float xcoord: "OLGame.exe", 0x017E7764, 0x1D4, 0x38C, 0x78, 0x4, 0x50;
  23. float zcoord: "OLGame.exe", 0x017E7764, 0x1D4, 0x38C, 0x78, 0x4, 0x54;
  24. float ycoord: "OLGame.exe", 0x017E7764, 0x1D4, 0x38C, 0x78, 0x4, 0x58;
  25. int yaw: "OLGame.exe", 0x017E7764, 0x124, 0x4, 0x1DC, 0xB04;
  26. string100 map: "OLGame.exe", 0x0178C598, 0x7D4, 0x58, 0x0;
  27. bool inControl: "OLGame.exe", 0x017E7764, 0x1D4, 0x38C, 0x1F4, 0x68, 0x60;
  28. bool ingame: "OLGame.exe", 0x017F5D04;
  29. }
  30. init {
  31. vars.doneMaps = new List < string > (); // Test to see if we split for a setting already
  32. vars.starter = false; // Used for the starting check just so everything can just stay in Update
  33. vars.endsplit = false; // Used to do the final split
  34. vars.OnceFinalSplit = false; // After the game finishes the end split returns true so Kuno added this to make it split once
  35. vars.mapcomparison = current.map; // For whatever reason map returns Null and livesplit likes to linger on it so this is the easiest fix without changing addresses for something minor
  36. vars.Checker1 = false;
  37. vars.Checker2 = false;
  38. vars.Running = false;
  39. vars.cz = 0;
  40. vars.cx = 0;
  41. vars.rot = 0;
  42. vars.currentIL = "";
  43. // Checking the games memory size to determine version
  44. switch (modules.First().ModuleMemorySize) {
  45. case 35831808:
  46. version = "Patch2, 64bit";
  47. break;
  48. case 27406336:
  49. version = "Patch2, 32bit";
  50. break;
  51. }
  52. vars.ILStartingListZ = new List < string > {
  53. "Sewer_start", //z
  54. "Male_Start", //z
  55. "Courtyard_Start", //z
  56. "Female_Start", // z
  57. "Revisit_Soldier1", //z
  58. "PrisonRevisit_Start", // z
  59. "Courtyard2_Start", // Z
  60. };
  61. vars.ILStartingListX = new List < string > {
  62. "Prison_Start", // x
  63. "Lab_Start", // x
  64. "Courtyard1_Start", // x
  65. "Building2_Start", // x
  66. "MaleRevisit_Start", // Xcoord
  67. };
  68. }
  69. startup {
  70. vars.Stopwatch = new Stopwatch();
  71. vars.Stopwatch2 = new Stopwatch();
  72. vars.DelayTime = 0.005;
  73. vars.DelayTime2 = 0.005;
  74. vars.black = false;
  75. settings.Add("OL", true, "Outlast"); // Grouping all the Outlast splits together
  76. settings.Add("adminblock", true, "Admin Block", "OL"); // Each Chapter is related to one of these
  77. settings.Add("prisonblock", true, "Prison Block", "OL");
  78. settings.Add("sewers", true, "Sewers", "OL");
  79. settings.Add("maleward", true, "Male Ward", "OL");
  80. settings.Add("courtyard", true, "Courtyard", "OL");
  81. settings.Add("femaleward", true, "Female Ward", "OL");
  82. settings.Add("return", true, "Return to the Admin Block", "OL");
  83. settings.Add("lab", true, "Underground Lab", "OL");
  84. settings.Add("WB", true, "Whistleblower");
  85. settings.Add("hospital", true, "Hospital", "WB");
  86. settings.Add("rec", true, "Recreation Area", "WB");
  87. settings.Add("prision", true, "Prison", "WB");
  88. settings.Add("drying", true, "Drying Ground", "WB");
  89. settings.Add("vocation", true, "Vocational Block", "WB");
  90. settings.Add("exit", true, "Exit", "WB");
  91. settings.Add("il", false, "Start timing for ILs (Do not turn on for full game runs!)");
  92. //zeko's Code, booleans added by anti
  93. var tB = (Func < string, string, string, bool, Tuple < string, string, string, bool >> )((elmt1, elmt2, elmt3, elmt4) => {
  94. return Tuple.Create(elmt1, elmt2, elmt3, elmt4);
  95. });
  96. var sB = new List < Tuple < string,
  97. string, string, bool >> {
  98. tB("adminblock", "Admin_Garden", "Entering garden", false),
  99. tB("adminblock", "Admin_Explosion", "Entering asylum window", false),
  100. tB("adminblock", "Admin_Mezzanine", "Drop down from vent", false),
  101. tB("adminblock", "Admin_MainHall", "After first cutscene", true),
  102. tB("adminblock", "Admin_WheelChair", "Picked up keycard", false),
  103. tB("adminblock", "Admin_SecurityRoom", "Power shuts off", true),
  104. tB("adminblock", "Admin_Basement", "Entering basement", false),
  105. tB("adminblock", "Admin_Electricity", "Power back on", false),
  106. tB("adminblock", "Admin_PostBasement", "Leaving basement", false),
  107. tB("prisonblock", "Prison_Start", "Prison start", true),
  108. tB("prisonblock", "Prison_IsolationCells01_Mid", "Leaving cell", false),
  109. tB("prisonblock", "Prison_ToPrisonFloor", "After first decontamination", false),
  110. tB("prisonblock", "Prison_PrisonFloor_3rdFloor", "Down the drain", false),
  111. tB("prisonblock", "Prison_PrisonFloor_SecurityRoom1", "Pressed first button", false),
  112. tB("prisonblock", "Prison_PrisonFloor02_IsolationCells01", "After variant chase", false),
  113. tB("prisonblock", "Prison_Showers_2ndFloor", "Entering showers 2nd floor", false),
  114. tB("prisonblock", "Prison_PrisonFloor02_PostShowers", "Leaving showers 2nd floor", false),
  115. tB("prisonblock", "Prison_PrisonFloor02_SecurityRoom2", "Pressed second button", false),
  116. tB("prisonblock", "Prison_IsolationCells02_Soldier", "After Fire", true),
  117. tB("prisonblock", "Prison_IsolationCells02_PostSoldier", "Escaped Chris", false),
  118. tB("prisonblock", "Prison_OldCells_PreStruggle", "Before variant jumps onto you", false),
  119. tB("prisonblock", "Prison_OldCells_PreStruggle2", "Before variant grabs you through bars", false),
  120. tB("prisonblock", "Prison_Showers_Exit", "Before leaving through showers", false),
  121. tB("sewers", "Sewer_start", "Entering Sewers", true),
  122. tB("sewers", "Sewer_FlushWater", "Before Flushing Water", true),
  123. tB("sewers", "Sewer_WaterFlushed", "Turning 2nd valve", true),
  124. tB("sewers", "Sewer_Ladder", "After climbing 2nd ladder", false),
  125. tB("sewers", "Sewer_ToCitern", "After climbing down 3rd ladder", false),
  126. tB("sewers", "Sewer_Citern1", "After crawling through pipe", false),
  127. tB("sewers", "Sewer_Citern2", "Before waterhops", true),
  128. tB("sewers", "Sewer_PostCitern", "After escaping Chris", false),
  129. tB("sewers", "Sewer_ToMaleWard", "After variant attack", false),
  130. tB("maleward", "Male_Start", "Entering Male Ward", true),
  131. tB("maleward", "Male_Chase", "Chase start", false),
  132. tB("maleward", "Male_ChasePause", "Jumping the gap", false),
  133. tB("maleward", "Male_Torture", "Trager torture cutscene start", true),
  134. tB("maleward", "Male_TortureDone", "Trager torture cutscene end (lol)", false),
  135. tB("maleward", "Male_surgeon", "Drop down from first vent after cutscene", false),
  136. tB("maleward", "Male_GetTheKey", "Drop down from second vent after cutscene", false),
  137. tB("maleward", "Male_GetTheKey2", "Found the key", false),
  138. tB("maleward", "Male_Elevator", "Unlocked elevator", false),
  139. tB("maleward", "Male_ElevatorDone", "Trager death", true),
  140. tB("maleward", "Male_Priest", "Father Martin reunion", false),
  141. tB("maleward", "Male_Cafeteria", "Entering cafeteria", false),
  142. tB("maleward", "Male_SprinklerOff", "Sprinklers off", false),
  143. tB("maleward", "Male_SprinklerOn", "Sprinklers turned on", true),
  144. tB("courtyard", "Courtyard_Start", "Entering Courtyard", true),
  145. tB("courtyard", "Courtyard_Corridor", "Unlocked corridor", false),
  146. tB("courtyard", "Courtyard_Chapel", "Upper Courtyard", true),
  147. tB("courtyard", "Courtyard_Soldier1", "Before first Chris encounter", false),
  148. tB("courtyard", "Courtyard_Soldier2", "Before second Chris encounter (Do not use in Glitchless)", false),
  149. tB("courtyard", "Courtyard_FemaleWard", "Escaped Chris", false),
  150. tB("femaleward", "Female_Start", "Entering Female Ward", true),
  151. tB("femaleward", "Female_Mainchute", "Passing Laundry chute", false),
  152. tB("femaleward", "Female_2ndFloor", "Reaching 2nd floor", true),
  153. tB("femaleward", "Female_2ndfloorChute", "Before fuses", false),
  154. tB("femaleward", "Female_ChuteActivated", "After fuses", true),
  155. tB("femaleward", "Female_Keypickedup", "Picked up key", false),
  156. tB("femaleward", "Female_3rdFloor", "Reaching 3rd floor", false),
  157. tB("femaleward", "Female_3rdFloorHole", "Before falling through floor", false),
  158. tB("femaleward", "Female_3rdFloorPostHole", "Encountering the twins", false),
  159. tB("femaleward", "Female_Tobigjump", "Before losing camera", false),
  160. tB("femaleward", "Female_LostCam", "Lost camera", true),
  161. tB("femaleward", "Female_FoundCam", "Pick up Camera", true),
  162. tB("femaleward", "Female_Chasedone", "End of variant chase", false),
  163. tB("femaleward", "Female_Exit", "Return to 3rd floor", false),
  164. tB("femaleward", "Female_Jump", "Before big jump", false),
  165. tB("return", "Revisit_Soldier1", "Entering Return to Admin", true),
  166. tB("return", "Revisit_Mezzanine", "Dropping down from first vent", false),
  167. tB("return", "Revisit_ToRH", "Before ladder", false),
  168. tB("return", "Revisit_RH", "Entering theater", true),
  169. tB("return", "Revisit_FoundKey", "Picked up key", false),
  170. tB("return", "Revisit_To3rdfloor", "Leaving theater", false),
  171. tB("return", "Revisit_3rdFloor", "Reaching 3rd floor", true),
  172. tB("return", "Revisit_RoomCrack", "After slipping through crack in the wall", false),
  173. tB("return", "Revisit_ToChapel", "Before entering chapel", false),
  174. tB("return", "Revisit_PriestDead", "After Father Martin death", true),
  175. tB("return", "Revisit_Soldier3", "Before second Chris encounter", false),
  176. tB("return", "Revisit_ToLab", "After escaping Chris", false),
  177. tB("lab", "Lab_Start", "Entering lab", true),
  178. tB("lab", "Lab_PremierAirlock", "Lab front desk", false),
  179. tB("lab", "Lab_SwarmIntro", "Bush skip checkpoint", true),
  180. tB("lab", "Lab_SwarmIntro2", "Turnaround", false),
  181. tB("lab", "Lab_Soldierdead", "After Chris dies", true),
  182. tB("lab", "Lab_SpeachDone", "After Wernicke cutscene", false),
  183. tB("lab", "Lab_SwarmCafeteria", "Before decontamination", false),
  184. tB("lab", "Lab_EBlock", "After decontamination", false),
  185. tB("lab", "Lab_ToBilly", "Big room", false),
  186. tB("lab", "Lab_BigRoom", "Valve room", false),
  187. tB("lab", "Lab_BigRoomDone", "After valve turn", true),
  188. tB("lab", "Lab_BigTower", "Enter tall room", false),
  189. tB("lab", "Lab_BigTowerMid", "After wires", true),
  190. tB("lab", "Lab_BigTowerDone", "After Wallrider cutscene", false),
  191. tB("hospital", "Hospital_1stFloor_ChaseStart", "First chase", false),
  192. tB("hospital", "Hospital_1stFloor_ChaseEnd", "After first chase", false),
  193. tB("hospital", "Hospital_1stFloor_dropairvent", "Drop from vent", false),
  194. tB("hospital", "Hospital_1stFloor_SAS", "After alarm", false),
  195. tB("hospital", "Hospital_1stFloor_Lobby", "Before Frank", true),
  196. tB("hospital", "Hospital_1stFloor_NeedHandCuff", "Open door after Frank", false),
  197. tB("hospital", "Hospital_1stFloor_GotKey", "Got handcuff key", false),
  198. tB("hospital", "Hospital_1stFloor_Chase", "Leave room with key", false),
  199. tB("hospital", "Hospital_1stFloor_Crema", "Unlocking handcuffs", true),
  200. tB("hospital", "Hospital_1stFloor_Bake", "Inside oven", false),
  201. tB("hospital", "Hospital_1stFloor_Crema2", "Outside oven", false),
  202. tB("hospital", "Hospital_2ndFloor_Crema", "Reached 2nd floor", false),
  203. tB("hospital", "Hospital_2ndFloor_Canibalrun", "Run from Frank", false),
  204. tB("hospital", "Hospital_2ndFloor_Canibalgone", "Escaped Frank", false),
  205. tB("hospital", "Hospital_2ndFloor_ExitIsLocked", "Find main valve", false),
  206. tB("hospital", "Hospital_2ndFloor_RoomsCorridor", "After door jumpscare", false),
  207. tB("hospital", "Hospital_2ndFloor_ToLab", "Run to laboratory", false),
  208. tB("hospital", "Hospital_2ndFloor_Start_Lab_2nd", "Enter laboratory", false),
  209. tB("hospital", "Hospital_2ndFloor_GazOff", "Turning Valve", true),
  210. tB("hospital", "Hospital_2ndFloor_Labdone", "Exit laboratory", false),
  211. tB("hospital", "Hospital_2ndFloor_Exit", "Exit Hospital", false),
  212. tB("rec", "Courtyard1_Start", "Start of Recreational Area", true),
  213. tB("rec", "Courtyard1_RecreationArea", "Turnaround", false),
  214. tB("rec", "Courtyard1_DupontIntro", "Top of 1st ladder", true),
  215. tB("rec", "Courtyard1_Basketball", "In basketball area", false),
  216. tB("rec", "Courtyard1_SecurityTower", "Top of 2nd ladder", true),
  217. tB("prision", "PrisonRevisit_Start", "Start of Prison", true),
  218. tB("prision", "PrisonRevisit_Radio", "After Jeremy cutscene", false),
  219. tB("prision", "PrisonRevisit_Priest", "To Father Martin", false),
  220. tB("prision", "PrisonRevisit_ToChase", "Down the drain", false),
  221. tB("prision", "PrisonRevisit_Chase", "Chris chase", true),
  222. tB("drying", "Courtyard2_Start", "Start of Drying Ground", true),
  223. tB("drying", "Courtyard2_FrontBuilding2", "Run to lever", false),
  224. tB("drying", "Courtyard2_ElecrticityOff", "1st interact with lever", false),
  225. tB("drying", "Courtyard2_ElectricityOff_2", "2nd interact with lever", true),
  226. tB("drying", "Courtyard2_ToWaterTower", "Long Hallway", false),
  227. tB("drying", "Courtyard2_WaterTower", "Inside water tower", false),
  228. tB("drying", "Courtyard2_TopWaterTower", "Top water tower", false),
  229. tB("vocation", "Building2_Start", "Start of Vocational Block", true),
  230. tB("vocation", "Building2_Attic_Mid", "Before push object", false),
  231. tB("vocation", "Building2_Attic_Denis", "Variant chase", false),
  232. tB("vocation", "Building2_Floor3_1", "Leaving attic", false),
  233. tB("vocation", "Building2_Floor3_2", "Meeting Eddie", true),
  234. tB("vocation", "Building2_Floor3_3", "Escape Eddie", false),
  235. tB("vocation", "Building2_Floor3_4", "Before 2nd push", false),
  236. tB("vocation", "Building2_Elevator", "After elevator cutscene", false),
  237. tB("vocation", "Building2_Post_Elevator", "After leaving elevator", false),
  238. tB("vocation", "Building2_Torture", "Before Eddie torture cutscene", true),
  239. tB("vocation", "Building2_TortureDone", "After Eddie torture cutscene (lol)", false),
  240. tB("vocation", "Building2_Garden", "After jumping out window", true),
  241. tB("vocation", "Building2_Floor1_1", "Find the key", false),
  242. tB("vocation", "Building2_Floor1_2", "Entering gym", false),
  243. tB("vocation", "Building2_Floor1_3", "Leaving gym", false),
  244. tB("vocation", "Building2_Floor1_4", "Found the key", false),
  245. tB("vocation", "Building2_Floor1_5", "Drop from vent", false),
  246. tB("vocation", "Building2_Floor1_5b", "Eddie punches you", true),
  247. tB("vocation", "Building2_Floor1_6", "Eddie death cutscene", false),
  248. tB("exit", "MaleRevisit_Start", "Start of Exit", true),
  249. tB("exit", "AdminBlock_Start", "Long hallway", true),
  250. };
  251. foreach(var s in sB) {
  252. settings.Add(s.Item2, s.Item4, s.Item3, s.Item1);
  253. }
  254. if (timer.CurrentTimingMethod == TimingMethod.RealTime) // stolen from dude simulator 3, basically asks the runner to set their livesplit to game time
  255. {
  256. var timingMessage = MessageBox.Show(
  257. "This game uses Time without Loads (Game Time) as the main timing method.\n" +
  258. "LiveSplit is currently set to show Real Time (RTA).\n" +
  259. "Would you like to set the timing method to Game Time? This will make verification easier",
  260. "LiveSplit | Outlast / WB",
  261. MessageBoxButtons.YesNo, MessageBoxIcon.Question
  262. );
  263. if (timingMessage == DialogResult.Yes) {
  264. timer.CurrentTimingMethod = TimingMethod.GameTime;
  265. }
  266. }
  267. }
  268. update {
  269. vars.mapcomparison = current.map;
  270. if ((current.ingame)) {
  271. // for outlast to be able to not have it endlessly start if you're resetting from the start of the game
  272. if ((current.isLoading) && (current.map == "Admin_Gates") && (!vars.Running)) {
  273. vars.cx = current.xcoord;
  274. vars.cz = current.zcoord;
  275. vars.rot = current.yaw;
  276. vars.Checker1 = true;
  277. }
  278. // for WB
  279. if ((current.map == "Hospital_Free") && (current.isLoading) && (!vars.Running)) {
  280. vars.cx = current.xcoord;
  281. vars.cz = current.zcoord;
  282. vars.rot = current.yaw;
  283. vars.Checker1 = true;
  284. }
  285. // For outlast to end split
  286. if (Math.Abs(-4098.51 - current.ycoord) < 0.01 && (!current.inControl) && (!vars.OnceFinalSplit) && (current.map == "Lab_BigTowerDone")) {
  287. vars.endsplit = true;
  288. }
  289. // For whistleblower to end split
  290. if ((Math.Abs(-550.00 - current.ycoord) < 0.01) && (!current.inControl) && (!vars.OnceFinalSplit) && (current.map == "AdminBlock_Start")) {
  291. vars.endsplit = true;
  292. }
  293. // outlast starter, ik it doesn't work if you start from new game
  294. if ((vars.Checker1) && (current.xcoord != vars.cx || current.zcoord != vars.cz || current.yaw != vars.rot) && (current.map == "Admin_Gates")) {
  295. vars.starter = true;
  296. }
  297. // For whistleblower starter
  298. if ((vars.Checker1) && (current.xcoord != vars.cx || current.zcoord != vars.cz || current.yaw != vars.rot) && (current.map == "Hospital_Free")) {
  299. vars.starter = true;
  300. }
  301. if ((settings[("il")]) && (!vars.Running)) {
  302. if ((current.isLoading) && (vars.ILStartingListZ.Contains(current.map))) {
  303. vars.cz = current.zcoord;
  304. vars.rot = current.yaw;
  305. vars.Checker1 = true;
  306. vars.currentIL = current.map;
  307. }
  308. if ((vars.Checker1) && (current.zcoord != vars.cz || current.yaw != vars.rot) && (current.map == vars.currentIL)) {
  309. vars.starter = true;
  310. }
  311. if ((current.isLoading) && (vars.ILStartingListX.Contains(current.map))) {
  312. vars.cx = current.xcoord;
  313. vars.rot = current.yaw;
  314. vars.Checker2 = true;
  315. vars.currentIL = current.map;
  316. }
  317. if ((vars.Checker2)) {
  318. if ((current.xcoord != vars.cx || current.yaw != vars.rot) && (current.map == vars.currentIL)) {
  319. vars.starter = true;
  320. } else if (current.map == ("Prison_Start") && (!current.isLoading)) {
  321. vars.starter = true;
  322. }
  323. }
  324. }
  325. } else {
  326. if((old.isLoading) && (!current.isLoading)) {
  327. vars.Stopwatch2.Start();
  328. vars.DelayTime2 = 1.50;
  329. vars.black = true;
  330. }
  331. vars.Checker1 = false;
  332. vars.Checker2 = false;
  333. vars.currentIL = "";
  334. }
  335. if ((vars.Stopwatch2.Elapsed.TotalSeconds >= vars.DelayTime2) || (current.isLoading)) {
  336. vars.Stopwatch2.Reset();
  337. vars.black = false;
  338. }
  339. }
  340. start {
  341. return (vars.starter);
  342. }
  343. onStart {
  344. vars.Checker1 = false;
  345. vars.Checker2 = false;
  346. vars.black = false;
  347. vars.starter = false; // Generic starting split
  348. vars.endsplit = false; // generic end split
  349. vars.OnceFinalSplit = false; // So it doesn't split more than once for the end split
  350. vars.doneMaps.Clear(); // Needed because checkpoints bad in game
  351. vars.doneMaps.Add(current.map.ToString()); // Adding for the starting map because it's also bad
  352. vars.Running = true;
  353. vars.cz = 0;
  354. vars.cx = 0;
  355. vars.currentIL = "";
  356. }
  357. split {
  358. if ((settings[(vars.mapcomparison)]) && (!vars.doneMaps.Contains(vars.mapcomparison))) {
  359. vars.doneMaps.Add(vars.mapcomparison);
  360. return true;
  361. }
  362. if ((vars.endsplit) && (!vars.OnceFinalSplit)) {
  363. vars.OnceFinalSplit = true;
  364. vars.Stopwatch.Start();
  365. if (current.map == "AdminBlock_Start") {
  366. vars.DelayTime = 0.10;
  367. } else {
  368. vars.DelayTime = 0.07;
  369. }
  370. }
  371. if (vars.Stopwatch.Elapsed.TotalSeconds >= vars.DelayTime) {
  372. vars.Stopwatch.Reset();
  373. return true;
  374. }
  375. }
  376. reset {
  377. if ((current.isLoading) && (current.map == "Admin_Gates" || current.map == "Hospital_Free")) {
  378. vars.doneMaps.Clear(); // Needed because checkpoints bad in game
  379. vars.OnceFinalSplit = false; // So it doesn't split more than once for the end split
  380. vars.Running = false;
  381. return true;
  382. }
  383. if (settings[("il")]) {
  384. if ((current.isLoading) && (vars.ILStartingListZ.Contains(current.map) || (vars.ILStartingListX.Contains(current.map)))) {
  385. vars.doneMaps.Clear(); // Needed because checkpoints bad in game
  386. vars.OnceFinalSplit = false; // So it doesn't split more than once for the end split
  387. vars.Running = false;
  388. return true;
  389. }
  390. }
  391. }
  392. onReset {
  393. vars.doneMaps.Clear(); // Needed because checkpoints bad in game
  394. vars.OnceFinalSplit = false; // So it doesn't split more than once for the end split
  395. vars.Running = false;
  396. vars.currentIL = "";
  397. }
  398. isLoading {
  399. return (current.isLoading || vars.black);
  400. }