From 8f466420f2c53eeadffbf41ee5b485f0d69cbc4f Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Tue, 18 Mar 2025 23:35:52 +0100 Subject: [PATCH] Add special mods for the base game and expansions Just for the metadata --- lib/mod.dart | 17 ++---- lib/mod_list.dart | 132 +++++++++++++++++++++++++++++++++------------- 2 files changed, 99 insertions(+), 50 deletions(-) diff --git a/lib/mod.dart b/lib/mod.dart index 50558b8..c3a7da4 100644 --- a/lib/mod.dart +++ b/lib/mod.dart @@ -282,18 +282,6 @@ class Mod { ); } - // Check if this is RimWorld base game or expansion - bool isBaseGame = id == 'ludeon.rimworld'; - bool isExpansion = !isBaseGame && id.startsWith('ludeon.rimworld.'); - - // If this is an expansion, ensure it depends on the base game - if (isExpansion && !loadAfter.contains('ludeon.rimworld')) { - loadAfter.add('ludeon.rimworld'); - logger.info( - 'Added base game dependency for expansion mod: ludeon.rimworld', - ); - } - final fileCountTime = stopwatch.elapsedMilliseconds - metadataTime - xmlTime; final totalTime = stopwatch.elapsedMilliseconds; @@ -314,8 +302,9 @@ class Mod { loadBefore: loadBefore, incompatibilities: incompatibilities, size: size, - isBaseGame: isBaseGame, - isExpansion: isExpansion, + // No mods loaded from workshop are ever base or expansion games + isBaseGame: false, + isExpansion: false, ); } diff --git a/lib/mod_list.dart b/lib/mod_list.dart index 6c73fb3..f2092d9 100644 --- a/lib/mod_list.dart +++ b/lib/mod_list.dart @@ -20,6 +20,92 @@ class LoadOrder { bool get hasErrors => errors.isNotEmpty; } +var specialMods = { + 'ludeon.rimworld': Mod( + id: 'ludeon.rimworld', + name: 'RimWorld', + path: '', + versions: [], + description: 'RimWorld base game', + dependencies: [], + loadAfter: [], + loadBefore: [], + incompatibilities: [], + isBaseGame: true, + size: 0, + isExpansion: false, + enabled: true, + ), + 'ludeon.rimworld.royalty': Mod( + id: 'ludeon.rimworld.royalty', + name: 'Royalty', + path: '', + versions: [], + description: 'RimWorld expansion - Royalty', + dependencies: ['ludeon.rimworld'], + loadAfter: [], + loadBefore: [ + 'ludeon.rimworld.anomaly', + 'ludeon.rimworld.biotech', + 'ludeon.rimworld.ideology', + ], + incompatibilities: [], + isBaseGame: false, + size: 0, + isExpansion: true, + enabled: true, + ), + 'ludeon.rimworld.ideology': Mod( + id: 'ludeon.rimworld.ideology', + name: 'Ideology', + path: '', + versions: [], + description: 'RimWorld expansion - Ideology', + dependencies: ['ludeon.rimworld'], + loadAfter: ['ludeon.rimworld.royalty'], + loadBefore: ['ludeon.rimworld.anomaly', 'ludeon.rimworld.biotech'], + incompatibilities: [], + isBaseGame: false, + size: 0, + isExpansion: true, + enabled: true, + ), + 'ludeon.rimworld.biotech': Mod( + id: 'ludeon.rimworld.biotech', + name: 'Biotech', + path: '', + versions: [], + description: 'RimWorld expansion - Biotech', + dependencies: ['ludeon.rimworld'], + loadAfter: ['ludeon.rimworld.ideology', 'ludeon.rimworld.royalty'], + loadBefore: ['ludeon.rimworld.anomaly'], + incompatibilities: [], + isBaseGame: false, + size: 0, + isExpansion: true, + enabled: true, + ), + 'ludeon.rimworld.anomaly': Mod( + id: 'ludeon.rimworld.anomaly', + name: 'Anomaly', + path: '', + versions: [], + description: 'RimWorld expansion - Anomaly', + dependencies: ['ludeon.rimworld'], + loadAfter: [ + 'ludeon.rimworld.biotech', + 'ludeon.rimworld.ideology', + 'ludeon.rimworld.royalty', + ], + loadBefore: [], + incompatibilities: [], + isBaseGame: false, + size: 0, + isExpansion: true, + enabled: true, + ), +}; + class ModList { String configPath = ''; String modsPath = ''; @@ -56,7 +142,6 @@ class ModList { } final List entities = directory.listSync(); - // TODO: Count only the latest version of each mod and not all versions final List modDirectories = entities.whereType().map((dir) => dir.path).toList(); @@ -154,42 +239,26 @@ class ModList { for (final modElement in modElements) { final modId = modElement.innerText.toLowerCase(); - // Check if this is a special Ludeon mod - final isBaseGame = modId == 'ludeon.rimworld'; - final isExpansion = - !isBaseGame && - modId.startsWith('ludeon.rimworld.') && - knownExpansionIds.contains(modId); + if (specialMods.containsKey(modId)) { + mods[modId] = specialMods[modId]!; + continue; + } final existingMod = mods[modId]; final mod = Mod( - name: - existingMod?.name ?? - (isBaseGame - ? "RimWorld" - : isExpansion - ? "RimWorld ${_expansionNameFromId(modId)}" - : modId), + name: existingMod?.name ?? modId, id: existingMod?.id ?? modId, path: existingMod?.path ?? '', versions: existingMod?.versions ?? [], - description: - existingMod?.description ?? - (isBaseGame - ? "RimWorld base game" - : isExpansion - ? "RimWorld expansion" - : ""), + description: existingMod?.description ?? '', dependencies: existingMod?.dependencies ?? [], - loadAfter: - existingMod?.loadAfter ?? - (isExpansion ? ['ludeon.rimworld'] : []), + loadAfter: existingMod?.loadAfter ?? [], loadBefore: existingMod?.loadBefore ?? [], incompatibilities: existingMod?.incompatibilities ?? [], enabled: existingMod?.enabled ?? false, size: existingMod?.size ?? 0, - isBaseGame: isBaseGame, - isExpansion: isExpansion, + isBaseGame: false, + isExpansion: false, ); if (mods.containsKey(modId)) { logger.warning('Mod $modId already exists in mods list, overwriting'); @@ -259,7 +328,7 @@ class ModList { // Convert to string with 2-space indentation final prettyXml = xmlDocument.toXmlString( - pretty: true, + pretty: true, indent: ' ', // 2 spaces newLine: '\n', ); @@ -653,12 +722,3 @@ class ModList { return loadRequired(loadOrder); } } - -String _expansionNameFromId(String id) { - final parts = id.split('.'); - if (parts.length < 3) return id; - - final expansionPart = parts[2]; - return expansionPart.substring(0, 1).toUpperCase() + - expansionPart.substring(1); -}