Skip to content

Commit 412e04b

Browse files
authored
Cards - Take migration info into consideration; Add "Used plugins/zipmods" (#235)
- Added support for zipmod GUID migration to dependency check to handle cards using zipmods with migrated GUIDs - Introduced UsedPlugins and UsedZipmods properties to show all dependencies, not just missing ones - Improved card load performance by pre-computing GUID HashSets instead of repeatedly iterating through collections
1 parent 43f29e0 commit 412e04b

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

src/KKManager.Core/Data/Cards/Card.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,16 @@ public abstract class Card : IFileInfoBase
2727
[DisplayName("Extended Data Size")]
2828
public FileSize ExtendedSize { get; }
2929

30-
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
30+
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
31+
public string[] UsedZipmods { get; set; }
32+
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
33+
public string[] UsedPlugins { get; set; }
34+
35+
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
3136
public string[] MissingZipmods { get; set; }
32-
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
37+
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
3338
public string[] MissingPlugins { get; set; }
34-
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
39+
[ReadOnly(true), TypeConverter(typeof(ReadOnlyStringCollectionConverterWithPreview))]
3540
public string[] MissingPluginsMaybe { get; set; }
3641

3742
public virtual Image GetCardImage()

src/KKManager.Core/Data/Cards/CardLoader.cs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
using KKManager.Data.Cards.RG;
2121
using KKManager.Data.Cards.SVS;
2222
using KKManager.Data.Plugins;
23-
using KKManager.Data.Sardines;
2423
using KKManager.Data.Zipmods;
2524
using KKManager.Util;
25+
using Sideloader.AutoResolver;
2626

2727
namespace KKManager.Data.Cards
2828
{
@@ -78,9 +78,20 @@ void ReadCardsFromDir()
7878
try
7979
{
8080
var allPlugins = PluginLoader.Plugins.ToEnumerable().ToList();
81+
var existingPluginGuids = allPlugins.Select(p => p.Guid).ToHashSet();
82+
8183
var allZipmods = SideloaderModLoader.Zipmods.ToEnumerable().ToList();
84+
var existingZipmodGuids = allZipmods.Select(z => z.Guid).ToHashSet();
85+
// Also consider migrated GUIDs as existing (but only if zipmod with the target GUID is actually present).
86+
// No easy way to check StripAll so just assume the required zipmod is present
87+
var migratedGuids = allZipmods.SelectMany(x => x.Manifest.MigrationList)
88+
.Where(x => !string.IsNullOrEmpty(x.GUIDOld) && (x.MigrationType == MigrationType.StripAll || existingZipmodGuids.Contains(x.GUIDNew)))
89+
.Select(x => x.GUIDOld);
90+
foreach (var migratedGuid in migratedGuids)
91+
existingZipmodGuids.Add(migratedGuid);
92+
8293
foreach (var card in s.ToEnumerable())
83-
CheckIfRequiredModsExist(card, allPlugins, allZipmods);
94+
CheckIfRequiredModsExist(card, allPlugins, allZipmods, existingPluginGuids, existingZipmodGuids);
8495
}
8596
catch (TargetInvocationException ex)
8697
{
@@ -99,30 +110,35 @@ void ReadCardsFromDir()
99110
return s;
100111
}
101112

102-
private static void CheckIfRequiredModsExist(Card card, List<PluginInfo> allPlugins, List<SideloaderModInfo> allZipmods)
113+
private static void CheckIfRequiredModsExist(Card card, List<PluginInfo> allPlugins, List<SideloaderModInfo> allZipmods, HashSet<string> existingPluginGuids, HashSet<string> existingZipmodGuids)
103114
{
104115
if (card.Extended == null) return;
105116

106117
var cardExtDatas = card.Extended.Where(x => x.Value != null).ToList();
107118

108-
var extGroups = cardExtDatas.ToLookup(x => x.Value.RequiredPluginGUIDs.Count > 0);
119+
var cardExtDatasPlugins = cardExtDatas.ToLookup(x => x.Value.RequiredPluginGUIDs.Count > 0);
120+
var definiteRequirements = cardExtDatasPlugins[true].SelectMany(x => x.Value.RequiredPluginGUIDs).Distinct().OrderBy(x => x).ToArray();
121+
card.UsedPlugins = definiteRequirements;
109122

110-
var missingPlugs = extGroups[true].SelectMany(x => x.Value.RequiredPluginGUIDs).Where(x => allPlugins.All(p => x != p.Guid)).Distinct().ToArray();
123+
var missingPlugs = definiteRequirements.Where(x => !existingPluginGuids.Contains(x)).ToArray();
111124
if (missingPlugs.Length > 0)
112125
{
113126
card.MissingPlugins = missingPlugs;
114127
//Console.WriteLine(card.Location.Name + " requires plugins that are missing: " + string.Join("; ", missingPlugs));
115128
}
116129

117130
var allExtCandidates = allPlugins.SelectMany(z => z.ExtDataGuidCandidates ?? Enumerable.Empty<string>()).ToHashSet();
118-
var missingPlugsMaybe = extGroups[false].Where(x => !allExtCandidates.Contains(x.Key)).Select(x => x.Key).Distinct().ToArray();
131+
var possibleRequirements = cardExtDatasPlugins[false];
132+
var missingPlugsMaybe = possibleRequirements.Where(x => !allExtCandidates.Contains(x.Key)).Select(x => x.Key).Distinct().ToArray();
119133
if (missingPlugsMaybe.Length > 0)
120134
{
121135
card.MissingPluginsMaybe = missingPlugsMaybe;
122136
}
123137

124-
var zipmodGuids = cardExtDatas.SelectMany(x => x.Value.RequiredZipmodGUIDs);
125-
var missingZipmods = zipmodGuids.Where(x => allZipmods.All(p => x != p.Guid)).Distinct().ToArray();
138+
var cardZipmodGuids = cardExtDatas.SelectMany(x => x.Value.RequiredZipmodGUIDs).Distinct().OrderBy(x => x).ToArray();
139+
card.UsedZipmods = cardZipmodGuids;
140+
141+
var missingZipmods = cardZipmodGuids.Where(x => !existingZipmodGuids.Contains(x)).ToArray();
126142
if (missingZipmods.Length > 0)
127143
{
128144
card.MissingZipmods = missingZipmods;

0 commit comments

Comments
 (0)