Rework shit again

This commit is contained in:
2025-03-16 01:50:22 +01:00
parent 8848b0c06e
commit 197ac61774
2 changed files with 62 additions and 43 deletions

View File

@@ -26,8 +26,7 @@ class Mod {
final List<String> loadAfter; // ModMetaData.loadAfter final List<String> loadAfter; // ModMetaData.loadAfter
final List<String> loadBefore; // ModMetaData.loadBefore final List<String> loadBefore; // ModMetaData.loadBefore
final List<String> incompatabilities; // ModMetaData.incompatibleWith final List<String> incompatabilities; // ModMetaData.incompatibleWith
final bool bool enabled;
enabled; // ConfigFile.mods.firstWhere((mod) => mod.id == id).enabled
final int size; // Count of files in the mod directory final int size; // Count of files in the mod directory
final bool isBaseGame; // Is this the base RimWorld game final bool isBaseGame; // Is this the base RimWorld game
final bool isExpansion; // Is this a RimWorld expansion final bool isExpansion; // Is this a RimWorld expansion
@@ -42,10 +41,10 @@ class Mod {
required this.loadAfter, required this.loadAfter,
required this.loadBefore, required this.loadBefore,
required this.incompatabilities, required this.incompatabilities,
required this.enabled,
required this.size, required this.size,
this.isBaseGame = false, this.isBaseGame = false,
this.isExpansion = false, this.isExpansion = false,
this.enabled = false,
}); });
static Mod fromDirectory(String path, {bool skipFileCount = false}) { static Mod fromDirectory(String path, {bool skipFileCount = false}) {
@@ -250,10 +249,41 @@ class Mod {
loadAfter: loadAfter, loadAfter: loadAfter,
loadBefore: loadBefore, loadBefore: loadBefore,
incompatabilities: incompatabilities, incompatabilities: incompatabilities,
enabled: false,
size: size, size: size,
isBaseGame: isBaseGame, isBaseGame: isBaseGame,
isExpansion: isExpansion, isExpansion: isExpansion,
); );
} }
Mod copyWith({
String? name,
String? id,
String? path,
List<String>? versions,
String? description,
List<String>? hardDependencies,
List<String>? loadAfter,
List<String>? loadBefore,
List<String>? 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,
);
}
} }

View File

@@ -7,9 +7,9 @@ import 'package:xml/xml.dart';
class ModList { class ModList {
final String configPath; final String configPath;
final String modsPath; final String modsPath;
// O(1) lookup
Map<String, bool> activeMods = {};
Map<String, Mod> mods = {}; Map<String, Mod> mods = {};
Set<String> activeMods = {};
Set<String> availableMods = {};
ModList({required this.configPath, required this.modsPath}); ModList({required this.configPath, required this.modsPath});
@@ -47,7 +47,9 @@ class ModList {
logger.info('Loaded mod from directory: ${mod.name} (ID: ${mod.id})'); logger.info('Loaded mod from directory: ${mod.name} (ID: ${mod.id})');
if (mods.containsKey(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]!; final existingMod = mods[mod.id]!;
mods[mod.id] = Mod( mods[mod.id] = Mod(
name: mod.name, name: mod.name,
@@ -59,32 +61,14 @@ class ModList {
loadAfter: mod.loadAfter, loadAfter: mod.loadAfter,
loadBefore: mod.loadBefore, loadBefore: mod.loadBefore,
incompatabilities: mod.incompatabilities, incompatabilities: mod.incompatabilities,
enabled: activeMods.contains(
mod.id,
), // Set enabled based on config
size: mod.size, size: mod.size,
enabled: existingMod.enabled,
isBaseGame: existingMod.isBaseGame, isBaseGame: existingMod.isBaseGame,
isExpansion: existingMod.isExpansion, isExpansion: existingMod.isExpansion,
); );
logger.info('Updated existing mod: ${mod.name} (ID: ${mod.id})'); logger.info('Updated existing mod: ${mod.name} (ID: ${mod.id})');
} else { } else {
mods[mod.id] = Mod( 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,
);
logger.info('Added new mod: ${mod.name} (ID: ${mod.id})'); logger.info('Added new mod: ${mod.name} (ID: ${mod.id})');
} }
@@ -144,29 +128,33 @@ class ModList {
modId.startsWith('ludeon.rimworld.') && modId.startsWith('ludeon.rimworld.') &&
knownExpansionIds.contains(modId); knownExpansionIds.contains(modId);
activeMods.add(modId); final existingMod = mods[modId];
final mod = Mod( final mod = Mod(
name: name:
isBaseGame existingMod?.name ??
? "RimWorld" (isBaseGame
? "Rimworld"
: isExpansion : isExpansion
? "RimWorld ${_expansionNameFromId(modId)}" ? "Rimworld ${_expansionNameFromId(modId)}"
: modId, : modId),
id: modId, id: existingMod?.id ?? modId,
path: '', path: existingMod?.path ?? '',
versions: [], versions: existingMod?.versions ?? [],
description: description:
isBaseGame existingMod?.description ??
(isBaseGame
? "RimWorld base game" ? "RimWorld base game"
: isExpansion : isExpansion
? "RimWorld expansion" ? "RimWorld expansion"
: "", : ""),
hardDependencies: [], hardDependencies: existingMod?.hardDependencies ?? [],
loadAfter: isExpansion ? ['ludeon.rimworld'] : [], loadAfter:
loadBefore: [], existingMod?.loadAfter ??
incompatabilities: [], (isExpansion ? ['ludeon.rimworld'] : []),
enabled: true, loadBefore: existingMod?.loadBefore ?? [],
size: 0, incompatabilities: existingMod?.incompatabilities ?? [],
enabled: existingMod?.enabled ?? false,
size: existingMod?.size ?? 0,
isBaseGame: isBaseGame, isBaseGame: isBaseGame,
isExpansion: isExpansion, isExpansion: isExpansion,
); );
@@ -174,6 +162,7 @@ class ModList {
logger.warning('Mod $modId already exists in mods list, overwriting'); logger.warning('Mod $modId already exists in mods list, overwriting');
} }
mods[modId] = mod; mods[modId] = mod;
activeMods[modId] = true;
yield mod; yield mod;
} }