Skip to content

Commit

Permalink
Use sl2 mod folders in ModData
Browse files Browse the repository at this point in the history
  • Loading branch information
Lauriethefish committed Oct 25, 2023
1 parent bbe72dd commit 47b668c
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 44 deletions.
36 changes: 15 additions & 21 deletions QuestPatcher.Core/InfoDumper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,33 +193,27 @@ await writer.WriteLineAsync(

try
{
List<string> earlyModFiles = await _debugBridge.ListDirectoryFiles(_modManager.EarlyModsPath);
List<string> lateModFiles = await _debugBridge.ListDirectoryFiles(_modManager.LateModsPath);
List<string> libFiles = await _debugBridge.ListDirectoryFiles(_modManager.LibsPath);

await writer.WriteLineAsync($"Early mod files (contents of {_modManager.EarlyModsPath}):");
foreach (string str in earlyModFiles)
{
await writer.WriteLineAsync(Path.GetFileName(str));
}

await writer.WriteLineAsync($"Late mod files (contents of {_modManager.LateModsPath}):");
foreach (string str in lateModFiles)
{
await writer.WriteLineAsync(Path.GetFileName(str));
}

await writer.WriteLineAsync($"Library files (contents of {_modManager.LibsPath}):");
foreach (string str in libFiles)
{
await writer.WriteLineAsync(Path.GetFileName(str));
}
await WriteDirectoryDump(_modManager.ModsPath, "QuestLoader mod files", writer);
await WriteDirectoryDump(_modManager.LibsPath, "QuestLoader library files", writer);
await WriteDirectoryDump(_modManager.Sl2EarlyModsPath, "Scotland2 early mod files", writer);
await WriteDirectoryDump(_modManager.Sl2LateModsPath, "Scotland2 late mod files", writer);
await WriteDirectoryDump(_modManager.Sl2LibsPath, "Scotland2 library files", writer);
}
catch (Exception ex)
{
await writer.WriteLineAsync($"Failed to load mods/libs from quest");
Log.Warning($"Failed to load mods/libs from quest: {ex}");
}
}

private async Task WriteDirectoryDump(string path, string name, StreamWriter writer)
{
await writer.WriteLineAsync($"{name} (contents of {path}):");
var files = await _debugBridge.ListDirectoryFiles(path, true);
foreach(string fileName in files)
{
await writer.WriteLineAsync(fileName);
}
}
}
}
27 changes: 23 additions & 4 deletions QuestPatcher.Core/Modding/ModManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,30 @@ public class ModManager
public List<IMod> AllMods => _modConfig?.Mods ?? EmptyModList;
private static readonly List<IMod> EmptyModList = new();

public string LateModsPath => $"/sdcard/Android/data/{_config.AppId}/files/mods/";
/// <summary>
/// Path where QuestLoader mod files reside
/// </summary>
public string ModsPath => $"/sdcard/Android/data/{_config.AppId}/files/mods/";

/// <summary>
/// Path where QuestLoader library files reside
/// </summary>
public string LibsPath => $"/sdcard/Android/data/{_config.AppId}/files/libs/";

public string EarlyModsPath => $"/sdcard/Android/data/{_config.AppId}/files/early_mods/";
/// <summary>
/// Path where Scotland2 late mods reside
/// </summary>
public string Sl2LateModsPath => $"/sdcard/ModData/{_config.AppId}/Modloader/mods/";

public string LibsPath => $"/sdcard/Android/data/{_config.AppId}/files/libs/";
/// <summary>
/// Path where Scotland2 early mods reside.
/// </summary>
public string Sl2EarlyModsPath => $"/sdcard/ModData/{_config.AppId}/Modloader/early_mods/";

/// <summary>
/// Path where Scotland2 library files reside.
/// </summary>
public string Sl2LibsPath => $"/sdcard/ModData/{_config.AppId}/Modloader/libs/";

private string ConfigPath => $"/sdcard/QuestPatcher/{_config.AppId}/modsStatus.json";
public string ModsExtractPath => $"/sdcard/QuestPatcher/{_config.AppId}/installedMods/";
Expand Down Expand Up @@ -114,7 +133,7 @@ public void Reset()

public async Task CreateModDirectories()
{
var modDirectories = new List<string> { LateModsPath, LibsPath, EarlyModsPath, ModsExtractPath };
var modDirectories = new List<string> { ModsPath, LibsPath, Sl2LibsPath, Sl2EarlyModsPath, Sl2LateModsPath, ModsExtractPath };

await _debugBridge.CreateDirectories(modDirectories);
await _debugBridge.Chmod(modDirectories, "777");
Expand Down
21 changes: 14 additions & 7 deletions QuestPatcher.Core/Modding/QModProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -245,29 +245,36 @@ public override void Write(Utf8JsonWriter writer, IMod value, JsonSerializerOpti

public override async Task LoadMods()
{
List<string> earlyModFiles = await _debugBridge.ListDirectoryFiles(_modManager.EarlyModsPath, true);
List<string> lateModFiles = await _debugBridge.ListDirectoryFiles(_modManager.LateModsPath, true);
List<string> modFiles = await _debugBridge.ListDirectoryFiles(_modManager.ModsPath, true);
List<string> libFiles = await _debugBridge.ListDirectoryFiles(_modManager.LibsPath, true);
List<string> sl2EarlyModFiles = await _debugBridge.ListDirectoryFiles(_modManager.Sl2EarlyModsPath, true);
List<string> sl2LateModFiles = await _debugBridge.ListDirectoryFiles(_modManager.Sl2LateModsPath, true);
List<string> sl2LibFiles = await _debugBridge.ListDirectoryFiles(_modManager.Sl2LibsPath, true);

foreach (QPMod mod in ModsById.Values)
{
SetModStatus(mod, earlyModFiles, lateModFiles, libFiles);
SetModStatus(mod, modFiles, libFiles, sl2EarlyModFiles, sl2LateModFiles, sl2LibFiles);
}
}

private void SetModStatus(QPMod mod, List<string> earlyModFiles, List<string> lateModFiles, List<string> libFiles)
private void SetModStatus(QPMod mod, List<string> modFiles, List<string> libFiles, List<string> sl2EarlyModFiles, List<string> sl2LateModFiles, List<string> sl2LibFiles)
{
bool hasAllMods;
bool hasAllLibs;
if (mod.ModLoader == Modloader.Scotland2)
{
// Check for both early and late mods if using SL2
hasAllMods = mod.Manifest.ModFileNames.TrueForAll(earlyModFiles.Contains) && mod.Manifest.LateModFileNames.TrueForAll(lateModFiles.Contains);
hasAllMods = mod.Manifest.ModFileNames.TrueForAll(sl2EarlyModFiles.Contains)
&& mod.Manifest.LateModFileNames.TrueForAll(sl2LateModFiles.Contains);

// Use the SL2 libs folder
hasAllLibs = mod.Manifest.LibraryFileNames.TrueForAll(sl2LibFiles.Contains);
}
else
{
hasAllMods = mod.Manifest.ModFileNames.TrueForAll(lateModFiles.Contains);
hasAllMods = mod.Manifest.ModFileNames.TrueForAll(modFiles.Contains);
hasAllLibs = mod.Manifest.LibraryFileNames.TrueForAll(libFiles.Contains);
}
bool hasAllLibs = mod.Manifest.LibraryFileNames.TrueForAll(libFiles.Contains);

// TODO: Should we also check that file copies are present?
// TODO: This would be more expensive as we would have to check the files in more directories
Expand Down
26 changes: 14 additions & 12 deletions QuestPatcher.Core/Modding/QPMod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,30 +107,31 @@ private async Task Install(List<string> installedInBranch)

List<KeyValuePair<string, string>> copyPaths = new();

bool sl2 = ModLoader == Modloader.Scotland2;

string libsPath = sl2 ? _modManager.Sl2LibsPath : _modManager.LibsPath;
List<string> directoriesToCreate = new();
foreach (string libraryPath in Manifest.LibraryFileNames)
{
Log.Information($"Starting library file copy {libraryPath} . . .");
copyPaths.Add(new(Path.Combine(extractPath, libraryPath), Path.Combine(_modManager.LibsPath, Path.GetFileName(libraryPath))));
copyPaths.Add(new(Path.Combine(extractPath, libraryPath), Path.Combine(libsPath, Path.GetFileName(libraryPath))));
}

bool sl2 = ModLoader == Modloader.Scotland2;

// When using sl2, (early) mod files are copied to early_mods
// To support legacy mods, when QuestLoader is present in the APK, early mods will be written to the directory that now contains late mods.
string earlyModsPath = sl2 ? _modManager.EarlyModsPath : _modManager.LateModsPath;
string modFilesPath = sl2 ? _modManager.Sl2EarlyModsPath : _modManager.ModsPath;
foreach (string modPath in Manifest.ModFileNames)
{
Log.Information($"Starting (early) mod file copy {modPath} . . .");
copyPaths.Add(new(Path.Combine(extractPath, modPath), Path.Combine(earlyModsPath, Path.GetFileName(modPath))));
copyPaths.Add(new(Path.Combine(extractPath, modPath), Path.Combine(modFilesPath, Path.GetFileName(modPath))));
}

if (sl2)
{
foreach (string lateModPath in Manifest.LateModFileNames)
{
Log.Information($"Starting late mod file copy {lateModPath} . . .");
copyPaths.Add(new(Path.Combine(extractPath, lateModPath), Path.Combine(_modManager.LateModsPath, Path.GetFileName(lateModPath))));
copyPaths.Add(new(Path.Combine(extractPath, lateModPath), Path.Combine(_modManager.Sl2LateModsPath, Path.GetFileName(lateModPath))));
}
}

Expand All @@ -152,7 +153,7 @@ private async Task Install(List<string> installedInBranch)

await _debugBridge.CopyFiles(copyPaths);

var chmodPaths = copyPaths.AsEnumerable().Select(path => path.Key).ToList();
var chmodPaths = copyPaths.AsEnumerable().Select(path => path.Value).ToList();
await _debugBridge.Chmod(chmodPaths, "+r");

IsInstalled = true;
Expand All @@ -174,23 +175,24 @@ public async Task Uninstall()
bool sl2 = ModLoader == Modloader.Scotland2;

// When using questloader, early mods get put in the late mods directory (legacy)
string earlyModsPath = sl2 ? _modManager.EarlyModsPath : _modManager.LateModsPath;
string modFilesPath = sl2 ? _modManager.Sl2EarlyModsPath : _modManager.ModsPath;
foreach (string modFilePath in Manifest.ModFileNames)
{
Log.Information($"Removing (early) mod file {modFilePath}");
filesToRemove.Add(Path.Combine(earlyModsPath, Path.GetFileName(modFilePath)));
filesToRemove.Add(Path.Combine(modFilesPath, Path.GetFileName(modFilePath)));
}

/// Remove late mods - SL2 only
// Remove late mods - SL2 only
if (sl2)
{
foreach (string lateModFilePath in Manifest.LateModFileNames)
{
Log.Information($"Removing late mod file {lateModFilePath}");
filesToRemove.Add(Path.Combine(_modManager.LateModsPath, Path.GetFileName(lateModFilePath)));
filesToRemove.Add(Path.Combine(_modManager.Sl2LateModsPath, Path.GetFileName(lateModFilePath)));
}
}

string libsPath = sl2 ? _modManager.Sl2LibsPath : _modManager.LibsPath;
foreach (string libraryPath in Manifest.LibraryFileNames)
{
// Only remove libraries if they aren't used by another mod
Expand All @@ -208,7 +210,7 @@ public async Task Uninstall()
if (!isUsedElsewhere)
{
Log.Information("Removing library file " + libraryPath);
filesToRemove.Add(Path.Combine(_modManager.LibsPath, Path.GetFileName(libraryPath)));
filesToRemove.Add(Path.Combine(libsPath, Path.GetFileName(libraryPath)));
}
}

Expand Down

0 comments on commit 47b668c

Please sign in to comment.