Files
2026-06-30 21:21:30 +08:00

127 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
[Serializable]
public class DlcManifestFile
{
public string manifestId;
public string manifestVersion = "1";
public List<DlcManifestEntry> entries = new List<DlcManifestEntry>();
}
[Serializable]
public class DlcManifestEntry
{
public bool enabled = true;
public string dlcKey;
public string version;
public string catalogPath;
public bool autoDownloadDependencies = true;
public string[] dependencyKeys;
public string[] dlcDataLabels;
public string[] songLabels;
public string[] songContentLabels;
public string[] heroSkinLabels;
public string[] heroLabels;
public string GetSafeDlcKey()
{
return string.IsNullOrWhiteSpace(dlcKey) ? string.Empty : dlcKey.Trim();
}
public string[] GetDlcDataLabels()
{
return GetResolvedLabels(dlcDataLabels, "dlc:" + GetSafeDlcKey() + ":dlcdata");
}
public string[] GetSongLabels()
{
return GetResolvedLabels(songLabels, "dlc:" + GetSafeDlcKey() + ":songs");
}
public string[] GetSongContentLabels()
{
return GetResolvedLabels(songContentLabels, "dlc:" + GetSafeDlcKey() + ":songcontent");
}
public string[] GetHeroSkinLabels()
{
return GetResolvedLabels(heroSkinLabels, "dlc:" + GetSafeDlcKey() + ":heroskins");
}
public string[] GetHeroLabels()
{
return GetResolvedLabels(heroLabels, "dlc:" + GetSafeDlcKey() + ":heroes");
}
public string[] GetDependencyKeys()
{
List<string> result = new List<string>();
AppendUnique(result, dependencyKeys);
AppendUnique(result, GetDlcDataLabels());
AppendUnique(result, GetSongLabels());
AppendUnique(result, GetSongContentLabels());
AppendUnique(result, GetHeroSkinLabels());
AppendUnique(result, GetHeroLabels());
return result.ToArray();
}
private static string[] GetResolvedLabels(string[] labels, string fallbackLabel)
{
List<string> result = new List<string>();
AppendUnique(result, labels);
if (result.Count == 0 && !string.IsNullOrWhiteSpace(fallbackLabel))
{
result.Add(fallbackLabel.Trim());
}
return result.ToArray();
}
private static void AppendUnique(List<string> target, string[] values)
{
if (target == null || values == null)
{
return;
}
for (int i = 0; i < values.Length; i++)
{
string value = values[i];
if (string.IsNullOrWhiteSpace(value))
{
continue;
}
string trimmed = value.Trim();
if (!target.Contains(trimmed))
{
target.Add(trimmed);
}
}
}
}
public sealed class DlcManifestRuntimeEntry
{
public string manifestId;
public string manifestSourcePath;
public string manifestDirectory;
public DlcManifestEntry entry;
public string resolvedCatalogPath;
public string GetRuntimePackageId()
{
string safeManifest = string.IsNullOrWhiteSpace(manifestId) ? "manifest" : manifestId.Trim();
string safeDlc = entry != null ? entry.GetSafeDlcKey() : string.Empty;
if (string.IsNullOrWhiteSpace(safeDlc))
{
safeDlc = Path.GetFileNameWithoutExtension(manifestSourcePath ?? string.Empty);
}
return safeManifest + "::" + safeDlc;
}
}