state("Data") {
    string64 level: "Enhancements.dll", 0x2E9FB;
    byte one_when_loading_part_one: 0x111CC, 0x7F8;
    byte one_when_loading_part_two: 0x111CC, 0x804;
    uint status_indicator: 0x11188;
}

startup {
    Assembly.Load(File.ReadAllBytes("Components/asl-help")).CreateInstance("Basic");
    vars.Helper.GameName = "Darkest Island";
    vars.Helper.AlertLoadless();
    vars.switching_exes = false;
}

start {
    return old.status_indicator == 19769 && (current.status_indicator == 11301 || current.status_indicator == 11287);
}

split {
    // First do the basic validation checks
    if (old.level == null || !old.level.ToLower().StartsWith("level") || !old.level.ToLower().EndsWith(".zip")) {
        return false;
    }

    if (current.level == "level1.zip" && vars.switching_exes) {
        vars.switching_exes = false;
    }

    if (current.level == "level5.zip" && current.status_indicator == 19999 && !vars.switching_exes) {
        vars.switching_exes = true;
        return true;
    }

    // If level hasn't changed, don't split
    if (current.level == old.level) {
        return false;
    }

    // Extract level numbers using string operations
    string oldNum = old.level.ToLower().Replace("level", "").Replace(".zip", "");
    string newNum = current.level.ToLower().Replace("level", "").Replace(".zip", "");

    // Try to parse the numbers
    int oldLevel, newLevel;
    if (int.TryParse(oldNum, out oldLevel) && int.TryParse(newNum, out newLevel)) {
        // Only split if new level is exactly one more than old level
        return newLevel == oldLevel + 1;
    }

    return false;
}

isLoading {
    return current.one_when_loading_part_one == 1
    || current.one_when_loading_part_two == 1
    || current.level == null
    || vars.switching_exes;
}

onStart {
    timer.IsGameTimePaused = true;
}

onReset {
    vars.switching_exes = false;
}