state("Invertigo") { }

/*
 * v1.1 Additional checks to prevent adding time that should've been cleared instead
 * v1.2 Borked the times on splits, should be fixed
 */

startup
{
    vars.CoffeeBreakName = "2_coffee_break";
    vars.MenuName = "menu_v4";

    Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity");
    vars.Helper.GameName = "Invertigo";
    vars.Helper.LoadSceneManager = true;

    settings.Add("resetMenu", true, "Automatically reset when in main menu.");
    settings.Add("resetCoffeeBreak", true, "Automatically reset when restarting while in Coffee Break.");

    vars.Helper.AlertGameTime();
}

init
{
    vars.Helper.TryLoad = (Func<dynamic, bool>)(mono =>
    {
        vars.Helper["Timer"] = mono.Make<float>("ScoreManager", 1, "_instance", "_timer");
        vars.Helper["IsTimerRunning"] = mono.Make<bool>("ScoreManager", 1, "_instance", "_running");

        return true;
    });

    vars.TotalTime = 0; 
}

update
{
    current.Scene = vars.Helper.Scenes.Active.Name ?? old.Scene;
}

start
{
    return current.Scene == vars.CoffeeBreakName && !old.IsTimerRunning && current.IsTimerRunning;
}

onStart
{
    vars.TotalTime = 0;
}

split
{
    return old.Scene != current.Scene;
}

reset
{
    return settings["resetMenu"] && old.Scene != current.Scene && current.Scene == vars.MenuName
        || settings["resetCoffeeBreak"] && current.Scene == vars.CoffeeBreakName && old.Timer > current.Timer;
}

gameTime
{
    if (old.Timer > current.Timer)
    {
        vars.TotalTime += old.Timer - current.Timer;
    }

    return TimeSpan.FromSeconds(vars.TotalTime + current.Timer);
}

isLoading
{
    return true;
}