state("Bioshock2") { bool isSaving : 0xF42EE8; bool isLoading : 0x10B8010, 0x278; byte lvl : 0x10B8010, 0x258; byte area : 0xF39948; short posX : 0xF39966; } startup { vars.md = false; vars.lvls=new string[]{ "Main Game", "Adonis Luxury Resort", "The Atlantic Express", "Ryan Amusements", "Pauper's Drop", "Siren Alley", "Dionysus Park", "Fontaine Futuristics", "Fontaine Futuristics 1", "Outer Persephone", "Inner Persephone", "Minerva's Den DLC", "Minerva's Den", "Operations", "The Thinker",}; var i = -1; foreach(var item in vars.lvls) { i++; if(i == 0 || i == 11) settings.Add(item, true); else if(i == 8){ settings.Add(item, false, null, vars.lvls[7]); settings.SetToolTip(item, "Splits when entering the hallway with the ADAM plants"); } else if(i > 11) settings.Add(item, true, null, vars.lvls[11]); else settings.Add(item, true, null, vars.lvls[0]); } } init { vars.gameName = timer.Run.GameName.ToLower(); vars.md = (vars.gameName.Contains("minerva")||vars.gameName.Contains("md")||vars.gameName.Contains("dlc")) ? true : false; vars.prevLvl=0; vars.prevArea=0; byte[] exeBytes = new byte[0]; using (var md5 = System.Security.Cryptography.MD5.Create()) { using (var exe = File.Open(modules.First().FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { exeBytes = md5.ComputeHash(exe); } } var hash = exeBytes.Select(x => x.ToString("X2")).Aggregate((a, b) => a + b); print("Hash = "+hash); switch(hash) { case "7BE7454335543349786D1CDF7D4EB87D": version = "Steam 5.0.019"; break; case "01182B9B2FA7B9232D3862D2E6F1E05A": version = "GOG 5.0.019"; break; default: version = "Unknown"; break; } print("Version = "+version); timer.IsGameTimePaused=false; } exit{timer.IsGameTimePaused=true;} start{ vars.prevLvl=0; vars.prevArea=0; if(vars.md && current.lvl == 2) return current.area == 46 && ((current.posX < -15054 && old.posX == -15054) || (!current.isLoading && old.isLoading)); else return current.lvl == 7 && ((current.area == 35 && old.area == 40) || (!current.isLoading && old.isLoading)); } isLoading{return current.isSaving || current.isLoading;} split { if(current.isLoading && current.lvl != old.lvl){ //if(current.lvl == 0 && old.lvl != 0) vars.prevLvl=old.lvl; //print("[ASL] vars.prevLvl: "+vars.prevLvl+" | current.lvl: "+current.lvl); if(vars.md){ //if(current.area == 0 && old.area != 0) vars.prevArea=old.area; //print("[ASL] vars.prevArea: "+vars.prevArea+" | current.area: "+current.area); if(vars.prevLvl == 2 && current.lvl == 19) {vars.prevLvl=current.lvl; return settings["Minerva's Den"];} } else{ if(current.lvl == 0) return; else if(vars.prevLvl == 7 && current.lvl == 2) {vars.prevLvl=current.lvl; return settings["Adonis Luxury Resort"];} else if(vars.prevLvl == 2 && current.lvl == 16) {vars.prevLvl=current.lvl; return settings["The Atlantic Express"];} else if(vars.prevLvl == 16 && current.lvl == 39) {vars.prevLvl=current.lvl; return settings["Ryan Amusements"];} else if(vars.prevLvl == 39 && current.lvl == 36) {vars.prevLvl=current.lvl; return settings["Pauper's Drop"];} else if(vars.prevLvl == 36 && current.lvl == 25) {vars.prevLvl=current.lvl; return settings["Siren Alley"];} else if(vars.prevLvl == 25 && current.lvl == 27) {vars.prevLvl=current.lvl; return settings["Dionysus Park"];} else if(vars.prevLvl == 27 && current.lvl == 3) {vars.prevLvl=current.lvl; return settings["Fontaine Futuristics"];} else if(vars.prevLvl == 3 && current.lvl == 39) {vars.prevLvl=current.lvl; return settings["Outer Persephone"];} } } // Split on leaving FF lower airlock else if(!vars.md && current.lvl==27 && current.area == 53 && old.area == 54) return settings["Fontaine Futuristics 1"]; // Split on entering final elevator else if(!vars.md && current.lvl==39 && current.area == 63 && old.posX < 17808 && current.posX > 17807) return settings["Inner Persephone"]; // Minerva's Den splits else if(vars.md && current.lvl== 0) { if(vars.prevLvl == 19 && vars.prevArea== 4 && current.area== 2 && current.isLoading) {vars.prevLvl=current.lvl; return settings["Operations"];} else if(old.lvl== 0 && current.area== 22 && old.posX < 17675 && current.posX > 17674) return settings["The Thinker"]; } } update { if(current.isLoading) { if(current.lvl == 0 && old.lvl != 0) vars.prevLvl=old.lvl; if(current.area == 0 && old.area != 0) vars.prevArea=old.area; } //if(current.posX != old.posX) print("[ASL] posX: "+old.posX+" -> "+current.posX); //if(current.lvl != old.lvl) print("[ASL] lvl: "+old.lvl+" -> "+current.lvl); //if(current.area != old.area) print("[ASL] area: "+old.area+" -> "+current.area); }