Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions ShinRyuModManager-CE/Extensions/EnumerableExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace ShinRyuModManager.Extensions;

public static class EnumerableExtensions {
public static bool IsNullOrEmpty<TSource>(this IEnumerable<TSource> collection) {
return collection == null || !collection.Any();
}
}
4 changes: 2 additions & 2 deletions ShinRyuModManager-CE/GameModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public static void DoY0DCLegacyModsUpgrade(MLO mlo) {
parlessDir.Create();

foreach (var modName in mlo.Mods) {
var modDir = Path.Combine(GamePath.ModsPath, modName);
var modDir = GamePath.GetModDirectory(modName);

if (!Directory.Exists(modDir))
continue;
Expand Down Expand Up @@ -173,7 +173,7 @@ public static void DoYK2RemasterLegacyDBUpgrade(MLO mlo) {
parlessDir.Create();

foreach (var modName in mlo.Mods) {
var modDir = Path.Combine(GamePath.ModsPath, modName);
var modDir = GamePath.GetModDirectory(modName);

if (!Directory.Exists(modDir))
continue;
Expand Down
26 changes: 14 additions & 12 deletions ShinRyuModManager-CE/LibMeta.cs
Original file line number Diff line number Diff line change
@@ -1,35 +1,38 @@
using JetBrains.Annotations;
using ShinRyuModManager.Helpers;
using Utils;

namespace ShinRyuModManager;

[UsedImplicitly]
public class LibMeta {
public Guid GUID { get; set; }
public Guid GUID { get; private set; }
public string Name { get; set; }
public string Version { get; set; }
public string Author { get; set; }
public string Description { get; set; }
public bool CanBeDisabled { get; set; }
public bool IsDisabled { get; set; }

/// <summary>
/// A semicolon (;) separated list of game executable names.
/// </summary>
public string TargetGames { get; set; }

public string Source { get; set; }
public string Download { get; set; }
public string MainBinary { get; set; }

private static string Url { get => $"https://raw.githubusercontent.com/{Settings.LIBRARIES_INFO_REPO_OWNER}/{Settings.LIBRARIES_INFO_REPO}/main/{Settings.LIBRARIES_INFO_REPO_FILE_PATH}"; }
private const string URL = $"https://raw.githubusercontent.com/{Constants.LIBRARIES_INFO_REPO_OWNER}/{Constants.LIBRARIES_INFO_REPO}/main/{Constants.LIBRARIES_INFO_REPO_FILE_PATH}";

public static LibMeta ReadLibMeta(string yamlString) {
return YamlHelpers.DeserializeYaml<LibMeta>(yamlString);
}

public static List<LibMeta> Fetch() {
var yamlString = Utils.Client.GetStringAsync(Url).GetAwaiter().GetResult();
var yamlString = Utils.Client.GetStringAsync(URL).GetAwaiter().GetResult();

var localManifestCopyPath = Program.GetLocalLibraryCopyPath();
var localManifestCopyPath = GamePath.LocalLibrariesPath;

if (!File.Exists(localManifestCopyPath) && !Utils.IsFileLocked(localManifestCopyPath)) {
File.WriteAllText(localManifestCopyPath!, yamlString);
Expand All @@ -39,9 +42,9 @@ public static List<LibMeta> Fetch() {
}

public static async Task<List<LibMeta>> FetchAsync() {
var yamlString = await Utils.Client.GetStringAsync(Url);
var yamlString = await Utils.Client.GetStringAsync(URL);

var localManifestCopyPath = Program.GetLocalLibraryCopyPath();
var localManifestCopyPath = GamePath.LocalLibrariesPath;

if (!File.Exists(localManifestCopyPath) && !Utils.IsFileLocked(localManifestCopyPath)) {
await File.WriteAllTextAsync(localManifestCopyPath!, yamlString);
Expand All @@ -53,13 +56,12 @@ public static async Task<List<LibMeta>> FetchAsync() {
public static List<LibMeta> ReadLibMetaManifest(string yamlString) {
var returnList = new List<LibMeta>();
var yamlObject = YamlHelpers.DeserializeYaml<Dictionary<string, LibMeta>>(yamlString);

foreach (var key in yamlObject.Keys)
{

foreach (var key in yamlObject.Keys) {
var meta = yamlObject[key];
meta.GUID = new Guid(key);

meta.GUID = Guid.Parse(key);

returnList.Add(meta);
}

Expand Down
3 changes: 2 additions & 1 deletion ShinRyuModManager-CE/ModLoadOrder/CpkPatcher.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
using CpkTools.Endian;
using CpkTools.Model;
using Serilog;
using ShinRyuModManager.Extensions;
using Utils;

namespace ShinRyuModManager.ModLoadOrder;

// Intended only for OE bgm/se.cpk
internal static class CpkPatcher {
public static async Task RepackDictionary(Dictionary<string, List<string>> cpkDict) {
if (cpkDict == null || cpkDict.Count <= 0) {
if (cpkDict.IsNullOrEmpty()) {
return;
}

Expand Down
4 changes: 2 additions & 2 deletions ShinRyuModManager-CE/ModLoadOrder/Generator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ public static async Task<MLO> GenerateModeLoadOrder(List<string> mods, bool loos
}

var modsObjects = new Mod[mods.Count];

var cpkDictionary = new Dictionary<string, List<int>>();

Log.Information("Reading mods...\n");
Expand All @@ -43,7 +42,8 @@ public static async Task<MLO> GenerateModeLoadOrder(List<string> mods, bool loos
// Use a reverse loop to be able to remove items from the list when necessary
for (var i = mods.Count - 1; i >= 0; i--) {
var mod = new Mod(mods[i]);
var modPath = Path.Combine(GamePath.ModsPath, mods[i]);
var modPath = GamePath.GetModDirectory(mods[i]);

mod.AddFiles(modPath, "");

mod.PrintInfo();
Expand Down
32 changes: 16 additions & 16 deletions ShinRyuModManager-CE/ModLoadOrder/MLO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,23 @@ public void WriteMLO(string path) {
writer.Write(FILESIZE);

writer.Write(0x40); // Mods start (size of header)
writer.WriteOfType(typeof(uint), Mods.Count);
writer.WriteOfType((uint)Mods.Count);

writer.Write(0); // Files start (to be written later)
writer.WriteOfType(typeof(uint), Files.Count);
writer.WriteOfType((uint)Files.Count);

writer.Write(0); // Parless folders start (to be written later)
writer.WriteOfType(typeof(uint), ParlessFolders.Count);
writer.WriteOfType((uint)ParlessFolders.Count);

writer.Write(0); // Cpk folders start (to be written later)
writer.WriteOfType(typeof(uint), CpkFolders.Count);
writer.WriteOfType((uint)CpkFolders.Count);

writer.WriteTimes(0, 0x10); // Padding

// 0x0: Length
// 0x2: String
foreach (var mod in Mods) {
writer.WriteOfType(typeof(ushort), mod.Length + 1);
writer.WriteOfType((ushort)mod.Length + 1);
writer.Write(mod);
}

Expand All @@ -74,8 +74,8 @@ public void WriteMLO(string path) {
// 0x2: Length
// 0x4: String
foreach (var file in Files) {
writer.WriteOfType(typeof(ushort), file.Index);
writer.WriteOfType(typeof(ushort), file.Name.Length + 1);
writer.WriteOfType((ushort)file.Index);
writer.WriteOfType((ushort)file.Name.Length + 1);
writer.Write(file.Name);
}

Expand All @@ -85,8 +85,8 @@ public void WriteMLO(string path) {
// 0x2: Length
// 0x4: String
foreach (var folder in ParlessFolders) {
writer.WriteOfType(typeof(ushort), folder.Index);
writer.WriteOfType(typeof(ushort), folder.Name.Length + 1);
writer.WriteOfType((ushort)folder.Index);
writer.WriteOfType((ushort)folder.Name.Length + 1);
writer.Write(folder.Name);
}

Expand All @@ -97,29 +97,29 @@ public void WriteMLO(string path) {
// 0x4: String
// 0x?: Mod Indices
foreach (var folder in CpkFolders) {
writer.WriteOfType(typeof(ushort), folder.Indices.Count);
writer.WriteOfType(typeof(ushort), folder.Name.Length + 1);
writer.WriteOfType((ushort)folder.Indices.Count);
writer.WriteOfType((ushort)folder.Name.Length + 1);
writer.Write(folder.Name);

foreach (var index in folder.Indices) {
writer.WriteOfType(typeof(ushort), index);
writer.WriteOfType(index);
}
}

// Write file size
writer.Stream.Seek(0xC);
writer.WriteOfType(typeof(uint), writer.Stream.Length);
writer.WriteOfType((uint)writer.Stream.Length);

// Write file start position
writer.Stream.Seek(0x18);
writer.WriteOfType(typeof(uint), fileStartPos);
writer.WriteOfType((uint)fileStartPos);

// Write parless folders start position
writer.Stream.Seek(0x20);
writer.WriteOfType(typeof(uint), parlessStartPos);
writer.WriteOfType((uint)parlessStartPos);

// Write cpk folders start position
writer.Stream.Seek(0x28);
writer.WriteOfType(typeof(uint), cpkFolderStartPos);
writer.WriteOfType((uint)cpkFolderStartPos);
}
}
3 changes: 1 addition & 2 deletions ShinRyuModManager-CE/ModLoadOrder/Mods/Mod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,7 @@ public void AddFiles(string path, string check) {
if (path.Contains("talk_")) {
if (char.IsDigit(basename[0]) || check == "cmn") {
needsRepack = true;
}
else {
} else {
var tCmn = Path.Combine(path, "cmn");
var t000 = Path.Combine(path, "000");

Expand Down
15 changes: 7 additions & 8 deletions ShinRyuModManager-CE/ParRepacker.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using ParLibrary.Converter;
using Serilog;
using ShinRyuModManager.Extensions;
using Utils;
using Yarhl.FileSystem;
using Yarhl.IO;
Expand Down Expand Up @@ -43,7 +44,7 @@ public static void RemoveOldRepackedPars() {
public static async Task RepackDictionary(Dictionary<string, List<string>> parDictionary) {
var parTasks = new List<Task>();

if (parDictionary.Count == 0) {
if (parDictionary.IsNullOrEmpty()) {
Log.Information("No pars to repack.");

return;
Expand Down Expand Up @@ -167,7 +168,7 @@ private static void RepackPar(string parPath, List<string> mods) {
writerParams.IncludeDots = par.Children[0].Name == ".";
writerParams.ResetFileDates = true;

containerNode.MoveChildrenTo(writerParams.IncludeDots ? par.Children[0] : par, true);
containerNode!.MoveChildrenTo(writerParams.IncludeDots ? par.Children[0] : par, true);
par.SortChildren((x, y) => string.CompareOrdinal(x.Name.ToLowerInvariant(), y.Name.ToLowerInvariant()));

writerParams.IncludeDots = false;
Expand Down Expand Up @@ -205,13 +206,13 @@ private static List<string> GetModFiles(string path) {
List<string> files = [];

// Add files in current directory
foreach (var p in Directory.GetFiles(path).Where(f => !f.EndsWith(Constants.VORTEX_MANAGED_FILE)).Select(GamePath.GetDataPathFrom)) {
foreach (var p in Directory.EnumerateFiles(path).Where(f => !f.EndsWith(Constants.VORTEX_MANAGED_FILE)).Select(GamePath.GetDataPathFrom)) {
files.Add(p);
Log.Verbose("Adding file: {File}", p);
}

// Get files for all subdirectories
foreach (var folder in Directory.GetDirectories(path)) {
foreach (var folder in Directory.EnumerateDirectories(path)) {
files.AddRange(GetModFiles(folder));
}

Expand All @@ -230,15 +231,13 @@ private static Node ReadDirectory(string dirPath, string nodeName = "") {

container.Tags["DirectoryInfo"] = directoryInfo;

var files = directoryInfo.GetFiles();
foreach (var file in files) {
foreach (var file in directoryInfo.EnumerateFiles()) {
var fileNode = NodeFactory.FromFile(file.FullName);

container.Add(fileNode);
}

var directories = directoryInfo.GetDirectories();
foreach (var directory in directories) {
foreach (var directory in directoryInfo.EnumerateDirectories()) {
var directoryNode = ReadDirectory(directory.FullName);

container.Add(directoryNode);
Expand Down
Loading
Loading