state("Game") { uint igt : "Game.exe", 0x455ED0; byte menu1 : "Game.exe", 0x42FE64; byte menu2 : "Game.exe", 0x42FE20, 0x4; byte start1 : "Game.exe", 0x14EA48, 0x30C; byte start2 : "Game.exe", 0x458A8, 0x16; } init { // refreshRate = 30; vars.ind = new byte[2] {136, 140}; switch(modules.First().ModuleMemorySize) { case 4952064: //Origins vars.ind[0] = 136; vars.ind[1] = 140; break; case 4942318: //The First Decade (w/Patch) vars.ind[0] = 67; vars.ind[1] = 67; break; default: break; } } startup { vars.prevPhase = null; vars.totalIGT = 0; vars.storedIGT = 0; vars.reloadedTime = 0; vars.splitter = false; vars.menu1help = false; vars.menu2help = false; } update { if (vars.prevPhase == TimerPhase.NotRunning && timer.CurrentPhase == TimerPhase.Running) {//New game vars.totalIGT = 0; vars.storedIGT = 0; vars.reloadedTime = 0; } if (current.igt == 0 && old.igt > 0 && current.menu1 != 3) {//Beat mission vars.storedIGT += vars.reloadedTime + old.igt; vars.reloadedTime = 0; } if (old.igt > current.igt && current.igt > 0 && current.menu1 != 3)//reloaded vars.reloadedTime += old.igt - current.igt; vars.totalIGT = vars.storedIGT + vars.reloadedTime + current.igt; vars.prevPhase = timer.CurrentPhase; vars.splitter = false; //For splitting, since these values aren't perfectly in sync if (current.menu1 == 1 && old.menu1 == 0) vars.menu1help = true; if (current.menu2 == 3 && old.menu1 == 1) vars.menu2help = true; if (vars.menu1help && vars.menu2help) { vars.splitter = true; vars.menu1help = false; vars.menu2help = false; } if (current.menu1 == 1 && current.menu2 == 1) //Unset if died vars.splitter = false; } start { return (current.menu1 == 3 && (current.menu2 == 5 || current.menu2 == 6) && old.start1 == vars.ind[0] && current.start1 == vars.ind[1] && old.start2 == 0 && current.start2 == 118); } reset { if (timer.CurrentTime.RealTime.Value.TotalMilliseconds > 400) { return (current.menu1 == 9 && current.menu2 == 1 && old.menu2 == 3 && current.start1 == vars.ind[1] && current.start2 == 118); } else { return (current.menu2 == 3 || current.menu2 == 4); } } split { return vars.splitter; } isLoading { return true; } gameTime { if (current.menu1 != 3) { return TimeSpan.FromMilliseconds(vars.totalIGT); } else { return TimeSpan.Zero; } }