diff --git a/lib/mod.dart b/lib/mod.dart index 3489ec1..feeeccd 100644 --- a/lib/mod.dart +++ b/lib/mod.dart @@ -26,8 +26,7 @@ class Mod { final List loadAfter; // ModMetaData.loadAfter final List loadBefore; // ModMetaData.loadBefore final List incompatabilities; // ModMetaData.incompatibleWith - final bool - enabled; // ConfigFile.mods.firstWhere((mod) => mod.id == id).enabled + bool enabled; final int size; // Count of files in the mod directory final bool isBaseGame; // Is this the base RimWorld game final bool isExpansion; // Is this a RimWorld expansion @@ -42,10 +41,10 @@ class Mod { required this.loadAfter, required this.loadBefore, required this.incompatabilities, - required this.enabled, required this.size, this.isBaseGame = false, this.isExpansion = false, + this.enabled = false, }); static Mod fromDirectory(String path, {bool skipFileCount = false}) { @@ -250,10 +249,41 @@ class Mod { loadAfter: loadAfter, loadBefore: loadBefore, incompatabilities: incompatabilities, - enabled: false, size: size, isBaseGame: isBaseGame, isExpansion: isExpansion, ); } + + Mod copyWith({ + String? name, + String? id, + String? path, + List? versions, + String? description, + List? hardDependencies, + List? loadAfter, + List? loadBefore, + List? incompatabilities, + int? size, + bool? isBaseGame, + bool? isExpansion, + bool? enabled, + }) { + return Mod( + name: name ?? this.name, + id: id ?? this.id, + path: path ?? this.path, + versions: versions ?? this.versions, + description: description ?? this.description, + hardDependencies: hardDependencies ?? this.hardDependencies, + loadAfter: loadAfter ?? this.loadAfter, + loadBefore: loadBefore ?? this.loadBefore, + incompatabilities: incompatabilities ?? this.incompatabilities, + size: size ?? this.size, + isBaseGame: isBaseGame ?? this.isBaseGame, + isExpansion: isExpansion ?? this.isExpansion, + enabled: enabled ?? this.enabled, + ); + } } diff --git a/lib/mod_list.dart b/lib/mod_list.dart index 9a25430..3641b5b 100644 --- a/lib/mod_list.dart +++ b/lib/mod_list.dart @@ -7,9 +7,9 @@ import 'package:xml/xml.dart'; class ModList { final String configPath; final String modsPath; + // O(1) lookup + Map activeMods = {}; Map mods = {}; - Set activeMods = {}; - Set availableMods = {}; ModList({required this.configPath, required this.modsPath}); @@ -47,7 +47,9 @@ class ModList { logger.info('Loaded mod from directory: ${mod.name} (ID: ${mod.id})'); if (mods.containsKey(mod.id)) { - logger.warning('Mod $mod.id already exists in mods list, overwriting'); + logger.warning( + 'Mod $mod.id already exists in mods list, overwriting', + ); final existingMod = mods[mod.id]!; mods[mod.id] = Mod( name: mod.name, @@ -59,32 +61,14 @@ class ModList { loadAfter: mod.loadAfter, loadBefore: mod.loadBefore, incompatabilities: mod.incompatabilities, - enabled: activeMods.contains( - mod.id, - ), // Set enabled based on config size: mod.size, + enabled: existingMod.enabled, isBaseGame: existingMod.isBaseGame, isExpansion: existingMod.isExpansion, ); logger.info('Updated existing mod: ${mod.name} (ID: ${mod.id})'); } else { - mods[mod.id] = Mod( - name: mod.name, - id: mod.id, - path: mod.path, - versions: mod.versions, - description: mod.description, - hardDependencies: mod.hardDependencies, - loadAfter: mod.loadAfter, - loadBefore: mod.loadBefore, - incompatabilities: mod.incompatabilities, - enabled: activeMods.contains( - mod.id, - ), // Set enabled based on config - size: mod.size, - isBaseGame: mod.isBaseGame, - isExpansion: mod.isExpansion, - ); + mods[mod.id] = mod; logger.info('Added new mod: ${mod.name} (ID: ${mod.id})'); } @@ -144,29 +128,33 @@ class ModList { modId.startsWith('ludeon.rimworld.') && knownExpansionIds.contains(modId); - activeMods.add(modId); + final existingMod = mods[modId]; final mod = Mod( name: - isBaseGame - ? "RimWorld" + existingMod?.name ?? + (isBaseGame + ? "Rimworld" : isExpansion - ? "RimWorld ${_expansionNameFromId(modId)}" - : modId, - id: modId, - path: '', - versions: [], + ? "Rimworld ${_expansionNameFromId(modId)}" + : modId), + id: existingMod?.id ?? modId, + path: existingMod?.path ?? '', + versions: existingMod?.versions ?? [], description: - isBaseGame + existingMod?.description ?? + (isBaseGame ? "RimWorld base game" : isExpansion ? "RimWorld expansion" - : "", - hardDependencies: [], - loadAfter: isExpansion ? ['ludeon.rimworld'] : [], - loadBefore: [], - incompatabilities: [], - enabled: true, - size: 0, + : ""), + hardDependencies: existingMod?.hardDependencies ?? [], + loadAfter: + existingMod?.loadAfter ?? + (isExpansion ? ['ludeon.rimworld'] : []), + loadBefore: existingMod?.loadBefore ?? [], + incompatabilities: existingMod?.incompatabilities ?? [], + enabled: existingMod?.enabled ?? false, + size: existingMod?.size ?? 0, isBaseGame: isBaseGame, isExpansion: isExpansion, ); @@ -174,6 +162,7 @@ class ModList { logger.warning('Mod $modId already exists in mods list, overwriting'); } mods[modId] = mod; + activeMods[modId] = true; yield mod; }