Add special mods for the base game and expansions

Just for the metadata
This commit is contained in:
2025-03-18 23:35:52 +01:00
parent 160488849f
commit 8f466420f2
2 changed files with 99 additions and 50 deletions

View File

@@ -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 = final fileCountTime =
stopwatch.elapsedMilliseconds - metadataTime - xmlTime; stopwatch.elapsedMilliseconds - metadataTime - xmlTime;
final totalTime = stopwatch.elapsedMilliseconds; final totalTime = stopwatch.elapsedMilliseconds;
@@ -314,8 +302,9 @@ class Mod {
loadBefore: loadBefore, loadBefore: loadBefore,
incompatibilities: incompatibilities, incompatibilities: incompatibilities,
size: size, size: size,
isBaseGame: isBaseGame, // No mods loaded from workshop are ever base or expansion games
isExpansion: isExpansion, isBaseGame: false,
isExpansion: false,
); );
} }

View File

@@ -20,6 +20,92 @@ class LoadOrder {
bool get hasErrors => errors.isNotEmpty; 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 { class ModList {
String configPath = ''; String configPath = '';
String modsPath = ''; String modsPath = '';
@@ -56,7 +142,6 @@ class ModList {
} }
final List<FileSystemEntity> entities = directory.listSync(); final List<FileSystemEntity> entities = directory.listSync();
// TODO: Count only the latest version of each mod and not all versions
final List<String> modDirectories = final List<String> modDirectories =
entities.whereType<Directory>().map((dir) => dir.path).toList(); entities.whereType<Directory>().map((dir) => dir.path).toList();
@@ -154,42 +239,26 @@ class ModList {
for (final modElement in modElements) { for (final modElement in modElements) {
final modId = modElement.innerText.toLowerCase(); final modId = modElement.innerText.toLowerCase();
// Check if this is a special Ludeon mod if (specialMods.containsKey(modId)) {
final isBaseGame = modId == 'ludeon.rimworld'; mods[modId] = specialMods[modId]!;
final isExpansion = continue;
!isBaseGame && }
modId.startsWith('ludeon.rimworld.') &&
knownExpansionIds.contains(modId);
final existingMod = mods[modId]; final existingMod = mods[modId];
final mod = Mod( final mod = Mod(
name: name: existingMod?.name ?? modId,
existingMod?.name ??
(isBaseGame
? "RimWorld"
: isExpansion
? "RimWorld ${_expansionNameFromId(modId)}"
: modId),
id: existingMod?.id ?? modId, id: existingMod?.id ?? modId,
path: existingMod?.path ?? '', path: existingMod?.path ?? '',
versions: existingMod?.versions ?? [], versions: existingMod?.versions ?? [],
description: description: existingMod?.description ?? '',
existingMod?.description ??
(isBaseGame
? "RimWorld base game"
: isExpansion
? "RimWorld expansion"
: ""),
dependencies: existingMod?.dependencies ?? [], dependencies: existingMod?.dependencies ?? [],
loadAfter: loadAfter: existingMod?.loadAfter ?? [],
existingMod?.loadAfter ??
(isExpansion ? ['ludeon.rimworld'] : []),
loadBefore: existingMod?.loadBefore ?? [], loadBefore: existingMod?.loadBefore ?? [],
incompatibilities: existingMod?.incompatibilities ?? [], incompatibilities: existingMod?.incompatibilities ?? [],
enabled: existingMod?.enabled ?? false, enabled: existingMod?.enabled ?? false,
size: existingMod?.size ?? 0, size: existingMod?.size ?? 0,
isBaseGame: isBaseGame, isBaseGame: false,
isExpansion: isExpansion, isExpansion: false,
); );
if (mods.containsKey(modId)) { if (mods.containsKey(modId)) {
logger.warning('Mod $modId already exists in mods list, overwriting'); logger.warning('Mod $modId already exists in mods list, overwriting');
@@ -653,12 +722,3 @@ class ModList {
return loadRequired(loadOrder); 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);
}