state("InfiltrateAndExtract-Win64-Shipping") { // Module-relative offsets int a : 0x68D4788; int b : 0x68D4738; } startup { vars.currentLevel = 0; // 0 = not started; 2..10 = next split target; 11 = post-L10 vars.levelIndicator1 = 0; // expected 'a' for the target level vars.levelIndicator2 = 0; // expected 'b' for the target level vars.postL10AwaitChange = false; } onReset { vars.currentLevel = 0; vars.levelIndicator1 = 0; vars.levelIndicator2 = 0; vars.postL10AwaitChange = false; } start { // Start when Level 1 pair appears; first split will be Level 2 if (timer.CurrentPhase == TimerPhase.NotRunning) { if (current.a == 561 && current.b == 3211) // Level 1 start { vars.currentLevel = 2; // target Level 2 for the first split vars.levelIndicator1 = 560; // L2 'a' vars.levelIndicator2 = 3209; // L2 'b' vars.postL10AwaitChange = false; return true; } } return false; } split { // After L10 split, do a final split only when BOTH values differ from L10 pair if (vars.postL10AwaitChange) { if (current.a != 561 && current.b != 3219) // both changed away from L10 { vars.postL10AwaitChange = false; return true; } } int cur = (int)vars.currentLevel; switch (cur) { case 2: vars.levelIndicator1 = 560; vars.levelIndicator2 = 3209; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 3; return true; } break; case 3: vars.levelIndicator1 = 563; vars.levelIndicator2 = 3221; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 4; return true; } break; case 4: vars.levelIndicator1 = 560; vars.levelIndicator2 = 3211; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 5; return true; } break; case 5: vars.levelIndicator1 = 563; vars.levelIndicator2 = 3222; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 6; return true; } break; case 6: vars.levelIndicator1 = 562; vars.levelIndicator2 = 3216; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 7; return true; } break; case 7: vars.levelIndicator1 = 561; vars.levelIndicator2 = 3215; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 8; return true; } break; case 8: // NOTE: same as Main Menu pair; no auto-reset included vars.levelIndicator1 = 562; vars.levelIndicator2 = 3218; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 9; return true; } break; case 9: vars.levelIndicator1 = 560; vars.levelIndicator2 = 3213; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 10; return true; } break; case 10: vars.levelIndicator1 = 561; vars.levelIndicator2 = 3219; if (current.a == vars.levelIndicator1 && current.b == vars.levelIndicator2) { vars.currentLevel = 11; // post-L10 vars.postL10AwaitChange = true; // wait until BOTH change, then final split return true; // split for entering Level 10 (Level 9 complete) } break; default: break; } return false; } isLoading { return false; }