// Playback Loop Autosplitter v1.0
// Game Engine: Unity
// Created by Jaio

state("Playback Loop") {}

startup {
    // Using just-ero's asl-help library
    Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity");
    vars.Helper.GameName = "Playback Loop";

    // Alert users that Game Time is used
    vars.Helper.AlertGameTime();

    // Custom settings
    settings.Add("ilTimer", false, "Use individual level timing");
}

init {
    vars.Helper.TryLoad = (Func<dynamic, bool>)(mono => {
        vars.Helper["timeInScene"] = mono.Make<float>("AutoSplitterData", "timeInScene");
        vars.Helper["timeInSession"] = mono.Make<float>("AutoSplitterData", "timeInSession");
        vars.Helper["levelNumber"] = mono.Make<int>("AutoSplitterData", "levelNumber");
        vars.Helper["totalLevels"] = mono.Make<int>("AutoSplitterData", "totalLevels");
        vars.Helper["gameState"] = mono.Make<int>("AutoSplitterData", "gameState");
        // gameState: Idle, Playback, RecordingPlayback, Blocked, Transitioning, MainMenu, CutScene
        vars.Helper["timerRunning"] = mono.Make<bool>("AutoSplitterData", "timerRunning");

        return true;
    });
}

start {
    if (!settings["ilTimer"]) {
        return (current.gameState == 0) && (current.levelNumber == 1); // Require Sunrise
    } else {
        return (current.gameState == 0) && (current.levelNumber != 0); // Any level
    };
}

split {
    // Splits on finishing level (does not re-call)
    return !current.timerRunning && old.timerRunning;
}

reset {
    // Use gameState instead of level number to discern between going manually to menu and being in
    // the cutscene after Tailwind.
    return current.gameState == 5 || (current.timeInSession < old.timeInSession);
}

gameTime {
    if (!settings["ilTimer"]) {
        return TimeSpan.FromSeconds(current.timeInSession);
    } else {
        return TimeSpan.FromSeconds(current.timeInScene);
    };
}

isLoading {
    return true;
}