Skip to content

Instantly share code, notes, and snippets.

@poacher2k
Last active June 9, 2022 10:21
Show Gist options
  • Save poacher2k/4655b01681705d67b277de8046397cce to your computer and use it in GitHub Desktop.
Save poacher2k/4655b01681705d67b277de8046397cce to your computer and use it in GitHub Desktop.
Autosplitter for "The Operative: No One Lives Forever"
//hipp0cat & poacher2k's version for lithfix
//original autosplitter made by poacher2k & TheTedder
state("lithtech")
{
byte ingame: "CShellReal.dll", 0x131934;
byte mission : "CShellReal.dll", 0x1306F0, 0x49374;
byte scene : "CShellReal.dll", 0x1306F0, 0x063f0;
}
startup
{
refreshRate = 60;
settings.Add("load_remove", true, "Enable load removal");
settings.Add("mission0", true, "Mission 1: The Assignment");
settings.Add("mission0scene0", false, "Scene 1", "mission0");
settings.SetToolTip("mission0scene0", @"Just a cutscene");
settings.Add("mission0scene1", true, "Scene 2", "mission0");
settings.Add("mission1", true, "Mission 2: Misfortune in Morocco");
settings.Add("mission1scene0", true, "Scene 1", "mission1");
settings.Add("mission1scene1", true, "Scene 2", "mission1");
settings.Add("mission1scene2", true, "Scene 3", "mission1");
settings.Add("mission2", true, "Mission 3: Requiem for a Spy");
settings.Add("mission3", true, "Mission 4: Berlin by Night");
settings.Add("mission3scene0", true, "Scene 1", "mission3");
settings.Add("mission3scene1", true, "Scene 2", "mission3");
settings.Add("mission4", true, "Mission 5: Unexpected Turbulence");
settings.Add("mission4scene0", true, "Scene 1", "mission4");
settings.Add("mission5", true, "Mission 6: Care to Explain?");
settings.Add("mission6", true, "Mission 7: Rendezvous in Hamburg");
settings.Add("mission6scene0", true, "Scene 1", "mission6");
settings.Add("mission7", true, "Mission 8: Visit to Santa's Workshop");
settings.Add("mission8", true, "Mission 9: A Tenuous Lead");
settings.Add("mission8scene0", true, "Scene 1", "mission8");
settings.Add("mission8scene1", true, "Scene 2", "mission8");
settings.Add("mission8scene2", true, "Scene 3", "mission8");
settings.Add("mission8scene3", true, "Scene 4", "mission8");
settings.Add("mission9", true, "Mission 10: H.A.R.M.'s Promise");
settings.Add("mission10", true, "Mission 11: The Dive");
settings.Add("mission10scene0", true, "Scene 1", "mission10");
settings.Add("mission10scene1", true, "Scene 2", "mission10");
settings.Add("mission11", true, "Mission 12: If Our Demands Are Not Met");
settings.Add("mission12", true, "Mission 13: A Man of Influence");
settings.Add("mission12scene0", true, "Scene 1", "mission12");
settings.Add("mission12scene1", true, "Scene 2", "mission12");
settings.Add("mission13", true, "Mission 14: Further Investigation Required");
settings.Add("mission14", true, "Mission 15: Safecracker");
settings.Add("mission14scene0", true, "Scene 1", "mission14");
settings.Add("mission14scene1", true, "Scene 2", "mission14");
settings.Add("mission14scene2", true, "Scene 3", "mission14");
settings.Add("mission14scene3", true, "Scene 4", "mission14");
settings.Add("mission14scene4", true, "Scene 5", "mission14");
settings.Add("mission15", true, "Mission 16: An Ounce of Hope, a Pound of Despair");
settings.Add("mission16", true, "Mission 17: Rescue Attempt");
settings.Add("mission16scene0", true, "Scene 1", "mission16");
settings.Add("mission16scene1", true, "Scene 2", "mission16");
settings.Add("mission17", true, "Mission 18: A Stern Warning");
settings.Add("mission18", true, "Mission 19: Trouble in the Tropics");
settings.Add("mission18scene0", true, "Scene 1", "mission18");
settings.Add("mission18scene1", true, "Scene 2", "mission18");
settings.Add("mission18scene2", true, "Scene 3", "mission18");
settings.Add("mission19", true, "Mission 20: Low Earth Orbit");
settings.Add("mission19scene0", true, "Scene 1", "mission19");
settings.Add("mission20", true, "Mission 21: Good Luck and God Speed");
settings.Add("mission21", true, "Mission 22: Alpine Intrigue");
settings.Add("mission21scene0", true, "Scene 1", "mission21");
settings.Add("mission21scene1", true, "Scene 2", "mission21");
settings.Add("mission21scene2", true, "Scene 3", "mission21");
settings.Add("mission22", true, "Mission 23: The Indomitable Cate Archer");
settings.Add("mission22scene0", true, "Scene 1", "mission22");
settings.Add("mission22scene1", true, "Scene 2", "mission22");
settings.Add("mission22scene2", true, "Scene 3", "mission22");
settings.Add("mission23", true, "Mission 24: A Very Large Explosion");
settings.Add("mission23scene0", true, "Scene 1", "mission23");
settings.Add("mission24", true, "Mission 25: Such Is the Nature of Revenge");
settings.Add("mission24scene0", true, "Scene 1", "mission24");
settings.Add("mission25", false, "Bonus Mission: Rest and Relaxation");
settings.SetToolTip("mission25", @"Not run in any%");
settings.Add("mission25scene0", true, "Scene 1", "mission25");
settings.Add("mission25scene1", true, "Scene 2", "mission25");
settings.Add("mission25scene2", true, "Scene 3", "mission25");
Action<string> DebugOutput = (text) => {
print("[The Operative: No One Lives Forever Autosplitter] "+text);
};
vars.DebugOutput = DebugOutput;
List<string> hasSplitList = new List<string>();
vars.hasSplitList = hasSplitList;
}
init
{
}
exit
{
timer.IsGameTimePaused = true;
}
update
{
}
start
{
bool gameStart = gameStart = current.mission == 0 && current.scene == 0;
if (gameStart)
{
vars.DebugOutput("Timer started");
vars.hasSplitList = new List<string>();
return true;
}
}
reset
{
bool runReset = old.mission != 0 && current.mission == 0;
bool isFirstSceneOfGame = current.mission == 0 && current.scene == 0;
bool firstMissionReset = isFirstSceneOfGame && old.scene != 0;
if (runReset || firstMissionReset)
{
vars.DebugOutput("Timer reset");
return true;
}
}
split
{
bool gameStart = current.mission == 0 && current.scene == 0;
if (gameStart)
{
return;
}
if (current.scene == old.scene + 1)
{
// Check setting for previous mission value, because the split would
// be for the end of the previous scene
string settingsKey = "mission" + old.mission + "scene" + old.scene;
bool hasAlreadySplit = vars.hasSplitList.Contains(settingsKey);
if (settings[settingsKey] && !hasAlreadySplit)
{
vars.hasSplitList.Add(settingsKey);
vars.DebugOutput("Split Start of Scene " + current.scene);
return true;
}
}
bool isNextMission = current.mission == old.mission + 1;
if (isNextMission)
{
// Check setting for previous mission value, because the split would
// be for the end of the previous mission
string settingsKey = "mission" + old.mission;
bool hasAlreadySplit = vars.hasSplitList.Contains(settingsKey);
if (settings[settingsKey] && !hasAlreadySplit)
{
vars.hasSplitList.Add(settingsKey);
vars.DebugOutput("Split Start of Mission " + current.mission);
return true;
}
}
}
isLoading
{
return settings["load_remove"] && current.ingame == 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment