state("NSMB-MarioVsLuigi") {}

startup {
    Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity");

    settings.Add("start", true, "Start on spawning");
    settings.Add("split", true, "Split upon:");
    settings.Add("split_req", true, "Collecting all stars", "split");
    settings.Add("split_10c", false, "10 coins", "split");
    settings.Add("split_25c", false, "25 coins", "split");
    settings.Add("split_50c", false, "50 coins", "split");
    settings.Add("split_99c", false, "99 coins", "split");
    settings.Add("reset", false, "Reset on leaving match without reaching star requirement");

    /*
    var noticeMsg = MessageBox.Show(
        "Splitting is only supported for singleplayer.",
        "LiveSplit | New Super Mario Bros. Versus",
        MessageBoxButtons.OK, MessageBoxIcon.Information
    );*/
}

init {
    vars.Helper.TryLoad = (Func<dynamic, bool>)(mono => {
        vars.Helper["gameover"] = mono.Make<bool>("GameManager", "_instance", "gameover");
        vars.Helper["spawned"] = mono.Make<bool>("UIUpdater", "Instance", "player", "spawned");
        //vars.Helper["stars"] = mono.Make<int>("UIUpdater", "Instance", "stars");
        vars.Helper["coins"] = mono.Make<int>("UIUpdater", "Instance", "coins");
        vars.Helper["starRequirement"] = mono.Make<int>("GameManager", "_instance", "starRequirement");

        vars.Helper["sbEntries"] = mono.MakeList<IntPtr>("ScoreboardUpdater", "instance", "entries");

        return true;
    });

    current.stars = 0;
    vars.doubleSplit = new Stopwatch();
}

update {
    current.stars = ((List<IntPtr>)current.sbEntries).Select(address => {
        return vars.Helper.Read<int>(address + 0x40);
    }).ToList().Max();

    if(vars.doubleSplit.ElapsedMilliseconds > 1000) vars.doubleSplit.Reset();

    //if(old.activeScene != current.activeScene) print("Active: " + old.activeScene + "->" + current.activeScene);
    //if(old.loadingScene != current.loadingScene) print("Loading: " + old.loadingScene + "->" + current.loadingScene);
    if(old.gameover != current.gameover) print("gameover: " + old.gameover + "->" + current.gameover);
    if(old.spawned != current.spawned) print("spawned: " + old.spawned + "->" + current.spawned);
    if(old.stars != current.stars) print("stars: " + old.stars + "->" + current.stars);
    if(old.coins != current.coins) print("coins: " + old.coins + "->" + current.coins);
    if(old.starRequirement != current.starRequirement) print("starRequirement: " + old.starRequirement + "->" + current.starRequirement);
}

start {
    return settings["start"] && !old.spawned && current.spawned;
}

split {
    return (settings["split_req"] && !vars.doubleSplit.IsRunning && current.stars == current.starRequirement && old.stars != current.stars) ||
            (settings["split_10c"] && old.coins == 9 && current.coins == 10) ||
            (settings["split_25c"] && old.coins == 24 && current.coins == 25) ||
            (settings["split_50c"] && old.coins == 49 && current.coins == 50) ||
            (settings["split_99c"] && old.coins == 98 && current.coins == 99);
}

onSplit {
    vars.doubleSplit.Start();
}

reset {
    return settings["reset"] && !old.gameover && current.gameover && current.stars != current.starRequirement;
}