state("Duck Life 9") {}

startup
{
    Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Unity");
    vars.Helper.GameName = "Duck Life 9";
    vars.Helper.LoadSceneManager = true;

    vars.tournamentWins = new bool[] {false, false, false, false, false, false, false, false, false, false};
    vars.areaNames = new Dictionary<int, string>() {
        {0, "The Flock"},
        {1, "Fishing Beach"},
        {2, "Spring Meadows"},
        {3, "Quackbeard's Cove"},
        {4, "Toadstool Towers"},
        {5, "Crystal Desert"},
        {6, "Sunflower Ravine"},
        {7, "Cloud Republic"},
        {8, "Volcano Town"},
        {9, "Volcano Interior"},
        {10, "News Room"},
    };

    settings.Add("credits", true, "Split on the final fadeout before the credits.");
    settings.Add("tournaments", false, "Split on tournament wins.");
    settings.Add("recruit", false, "Split on recruiting ducks.");
    settings.CurrentDefaultParent = "tournaments";
    for (int i = 2; i < 9; i++) {
        settings.Add(vars.areaNames[i], true);
    }
    settings.CurrentDefaultParent = "recruit";
    settings.Add("Walter", false);
}

init
{
    vars.Helper.TryLoad = (Func<dynamic, bool>)(mono =>
    {
        vars.Helper["isLoading"] = mono.Make<bool>("Wix.Transition", "transitioning");

        vars.Helper["duckList"] = mono.MakeList<IntPtr>("SaveData", "_profile", "flockDucks");
        vars.duckNameOffset = mono["Duck"]["name"];

        vars.Helper["visitedAreas"] = mono.MakeList<IntPtr>("SaveData", "_profile", "overworldAreas");
        vars.tournamentOffset = mono["OverworldArea"]["beatenTournamentChampion"];
        vars.areaObjectOffset = mono["OverworldArea"]["area"];
        vars.areaNameOffset = mono["Area"]["value__"];

        return true;
    });
}

split
{
    // Split on tournament wins.
    for (int i = 0; i < current.visitedAreas.Count; i++) {
        vars.areaIndex = vars.Helper.Read<int>(current.visitedAreas[i] + vars.areaObjectOffset + vars.areaNameOffset);
        vars.hasBeatenTournament = vars.Helper.Read<bool>(current.visitedAreas[i] + vars.tournamentOffset);

        if (vars.tournamentWins[vars.areaIndex] == false && vars.hasBeatenTournament) {
            vars.tournamentWins[vars.areaIndex] = true;
            print("Beaten " + vars.areaNames[vars.areaIndex] + " tournament!");
            return settings[vars.areaNames[vars.areaIndex]];
        }
    }

    // Split on duck recruitment.
    current.lastRecruitedDuck = vars.Helper.ReadString(current.duckList[current.duckList.Count - 1] + vars.duckNameOffset);
    if (current.lastRecruitedDuck != old.lastRecruitedDuck) {
        print("Recruited " + current.lastRecruitedDuck + "!");
        return settings[current.lastRecruitedDuck];
    }

    // Split on credits.
    return (vars.Helper.Scenes.Active.Name == "Credits" && settings["credits"]);
}

start 
{
    if (current.duckList.Count == 1 && old.duckList.Count == 0) {
        vars.tournamentWins = new bool[] {false, false, false, false, false, false, false, false, false, false};
        return true;
    }
}

isLoading
{
    return current.isLoading;
}

exit
{
    timer.IsGameTimePaused = true;
}