Skip to content

Commit d3c9017

Browse files
committed
Spore ModAPI Easy Installer: lock version/depends/dependsVersions behind installerSystemVersion 1.0.1.3
1 parent 2e17074 commit d3c9017

File tree

1 file changed

+80
-62
lines changed

1 file changed

+80
-62
lines changed

Spore ModAPI Easy Installer/XmlInstallerWindow.xaml.cs

Lines changed: 80 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ private void PrepareInstaller()
157157
if ((ModInfoVersion == new Version(1, 0, 0, 0)) ||
158158
(ModInfoVersion == new Version(1, 0, 1, 0)) ||
159159
(ModInfoVersion == new Version(1, 0, 1, 1)) ||
160-
(ModInfoVersion == new Version(1, 0, 1, 2)))
160+
(ModInfoVersion == new Version(1, 0, 1, 2)) ||
161+
(ModInfoVersion == new Version(1, 0, 1, 3)))
161162
{
162163
if (File.Exists(Path.Combine(ModConfigPath, "Branding.png")))
163164
{
@@ -185,7 +186,8 @@ private void PrepareInstaller()
185186
}
186187
else if ((ModInfoVersion == new Version(1, 0, 1, 0)) ||
187188
(ModInfoVersion == new Version(1, 0, 1, 1)) ||
188-
(ModInfoVersion == new Version(1, 0, 1, 2)))
189+
(ModInfoVersion == new Version(1, 0, 1, 2)) ||
190+
(ModInfoVersion == new Version(1, 0, 1, 3)))
189191
{
190192
_dontUseLegacyPackagePlacement = true;
191193
_installerMode = 1;
@@ -246,85 +248,101 @@ private void PrepareInstaller()
246248
else
247249
ModDescription = string.Empty;
248250

249-
if (Document.SelectSingleNode("/mod").Attributes["version"] != null)
251+
// installerSystemVersion 1.0.1.3 introduced the version, depends and dependsVersion attributes
252+
if (ModInfoVersion == new Version(1, 0, 1, 3))
250253
{
251-
if (Version.TryParse(Document.SelectSingleNode("/mod").Attributes["version"].Value, out Version parsedVersion))
252-
ModVersion = parsedVersion;
254+
if (Document.SelectSingleNode("/mod").Attributes["version"] != null)
255+
{
256+
if (Version.TryParse(Document.SelectSingleNode("/mod").Attributes["version"].Value, out Version parsedVersion))
257+
ModVersion = parsedVersion;
258+
else
259+
throw new Exception("This mod has an invalid version. Please inform the mod's developer of this.");
260+
}
253261
else
254-
throw new Exception("This mod has an invalid version. Please inform the mod's developer of this.");
255-
}
256-
else
257-
ModVersion = null;
262+
ModVersion = null;
258263

259-
if (Document.SelectSingleNode("/mod").Attributes["depends"] != null)
260-
{
261-
string dependsString = Document.SelectSingleNode("/mod").Attributes["depends"].Value;
262-
string dependsVersionString = null;
263-
if (Document.SelectSingleNode("/mod").Attributes["dependsVersions"] != null)
264-
dependsVersionString = Document.SelectSingleNode("/mod").Attributes["dependsVersions"].Value;
265-
string[] dependsUniqueNames = dependsString.Split('?');
266-
string[] dependsVersions = dependsVersionString == null ? null : dependsVersionString.Split('?');
267-
bool[] foundDepends = new bool[dependsUniqueNames.Length];
268-
// reset foundDepends
269-
for (int i = 0; i < foundDepends.Length; i++)
270-
foundDepends[i] = false;
271-
272-
ModDependencies = dependsUniqueNames.ToList();
273-
if (dependsVersions != null)
274-
{ // TODO: improve this logic...
275-
foreach (string dependsVersion in dependsVersions)
264+
if (Document.SelectSingleNode("/mod").Attributes["depends"] != null)
265+
{
266+
string dependsString = Document.SelectSingleNode("/mod").Attributes["depends"].Value;
267+
string dependsVersionString = null;
268+
if (Document.SelectSingleNode("/mod").Attributes["dependsVersions"] != null)
269+
dependsVersionString = Document.SelectSingleNode("/mod").Attributes["dependsVersions"].Value;
270+
string[] dependsUniqueNames = dependsString.Split('?');
271+
string[] dependsVersions = dependsVersionString?.Split('?');
272+
bool[] foundDepends = new bool[dependsUniqueNames.Length];
273+
foreach (var b in foundDepends)
274+
{
275+
MessageBox.Show($"b: {b.ToString()}");
276+
}
277+
ModDependencies = dependsUniqueNames.ToList();
278+
if (dependsVersions != null)
276279
{
277-
if (Version.TryParse(dependsVersion, out Version parsedDependsVersion))
280+
foreach (string dependsVersion in dependsVersions)
278281
{
279-
ModDependenciesVersions.Add(parsedDependsVersion);
282+
if (String.IsNullOrEmpty(dependsVersion))
283+
{ // 0.0.0.0 is interpreted as having no version attribute
284+
// but we need to pad the list to match the amount of items
285+
// that ModDependencies has
286+
ModDependenciesVersions.Add(new Version(0, 0, 0, 0));
287+
}
288+
else
289+
{
290+
if (Version.TryParse(dependsVersion, out Version parsedDependsVersion))
291+
{
292+
ModDependenciesVersions.Add(parsedDependsVersion);
293+
}
294+
else
295+
{
296+
throw new Exception($"This mod has an invalid deoendsVersions entry: \"{dependsVersion}\". Please inform the mod's developer of this.");
297+
}
298+
}
280299
}
281300
}
282-
}
283301

284-
foreach (ModConfiguration mod in configs)
285-
{
286-
for (int i = 0; i < dependsUniqueNames.Length; i++)
302+
foreach (ModConfiguration mod in configs)
287303
{
288-
if (mod.Unique == dependsUniqueNames[i])
304+
for (int i = 0; i < dependsUniqueNames.Length; i++)
289305
{
290-
if (mod.Version != null &&
291-
(dependsVersions != null) &&
292-
(dependsVersions.Length > i) &&
293-
(Version.TryParse(dependsVersions[i], out Version dependVersion) &&
294-
mod.Version >= dependVersion))
295-
{ // name + version match
296-
foundDepends[i] = true;
297-
break;
298-
}
299-
else if (dependsVersions == null || dependsVersions.Length <= i)
300-
{ // name only match
301-
foundDepends[i] = true;
302-
break;
306+
if (mod.Unique == dependsUniqueNames[i])
307+
{
308+
if (mod.Version != null &&
309+
(ModDependenciesVersions.Count() > i) &&
310+
(mod.Version >= ModDependenciesVersions[i]))
311+
{ // name + version match
312+
foundDepends[i] = true;
313+
break;
314+
}
315+
else if (ModDependenciesVersions.Count() <= i ||
316+
ModDependenciesVersions[i] == new Version(0, 0, 0, 0))
317+
{ // name only match
318+
foundDepends[i] = true;
319+
break;
320+
}
303321
}
304322
}
305323
}
306-
}
307324

308-
bool satisfiedDepends = true;
309-
List<string> missingDepends = new List<string>();
310-
for (int i = 0; i < foundDepends.Length; i++)
311-
{
312-
if (!foundDepends[i])
325+
bool satisfiedDepends = true;
326+
List<string> missingDepends = new List<string>();
327+
for (int i = 0; i < foundDepends.Length; i++)
313328
{
314-
satisfiedDepends = false;
315-
string missingDependsText = dependsUniqueNames[i];
316-
if (dependsVersions != null &&
317-
dependsVersions.Length > i)
329+
if (!foundDepends[i])
318330
{
319-
missingDependsText += " " + dependsVersions[i];
331+
satisfiedDepends = false;
332+
string missingDependsText = dependsUniqueNames[i];
333+
if (dependsVersions != null &&
334+
dependsVersions.Length > i)
335+
{
336+
missingDependsText += " " + dependsVersions[i];
337+
}
338+
missingDepends.Add(missingDependsText);
320339
}
321-
missingDepends.Add(missingDependsText);
322340
}
323-
}
324341

325-
if (!satisfiedDepends)
326-
{
327-
throw new Exception($"This mod has dependencies that you don't have installed: {String.Join(", ", missingDepends)}");
342+
if (!satisfiedDepends)
343+
{
344+
throw new Exception($"This mod has dependencies that you don't have installed: {String.Join(", ", missingDepends)}");
345+
}
328346
}
329347
}
330348

0 commit comments

Comments
 (0)