diff --git a/lib/main.dart b/lib/main.dart index 4a1e0fe..e1d5dd2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:rimworld_modman/modloader.dart'; void main() { + ModList(path: modsRoot).load(); ConfigFile(path: configPath).load(); // runApp(const RimWorldModManager()); } diff --git a/lib/modloader.dart b/lib/modloader.dart index 18b4fda..71afa24 100644 --- a/lib/modloader.dart +++ b/lib/modloader.dart @@ -30,17 +30,94 @@ class Mod { required this.incompatabilities, required this.enabled, }); + + static Mod fromDirectory(String path) { + final directory = Directory(path); + final aboutFile = File('$path/About/About.xml'); + final aboutXml = XmlDocument.parse(aboutFile.readAsStringSync()); + final metadata = aboutXml.findElements('ModMetaData').first; + final name = metadata.findElements('name').first.innerText; + final id = metadata.findElements('packageId').first.innerText.toLowerCase(); + final versions = + metadata + .findElements('supportedVersions') + .first + .findElements('li') + .map((e) => e.innerText) + .toList(); + final description = metadata.findElements('description').first.innerText; + final hardDependencies = + metadata + .findElements('modDependenciesByVersion') + .last + .findElements('li') + .map((e) => e.findElements('packageId').first.innerText.toLowerCase()) + .toList(); + final softDependencies = + metadata + .findElements('loadAfter') + .first + .findElements('li') + .map((e) => e.innerText.toLowerCase()) + .toList(); + final incompatabilities = + metadata + .findElements('incompatibleWith') + .first + .findElements('li') + .map((e) => e.innerText.toLowerCase()) + .toList(); + + return Mod( + name: name, + id: id, + path: path, + versions: versions, + description: description, + hardDependencies: hardDependencies, + softDependencies: softDependencies, + incompatabilities: incompatabilities, + enabled: false, + ); + } } class ModList { final String path; - final List mods; + List mods = []; - ModList({required this.path, this.mods = const []}); + ModList({required this.path}); void load() { - final file = File(path); + final directory = Directory(path); print('Loading configuration from: $path'); + + if (directory.existsSync()) { + final List entities = directory.listSync(); + final List modDirectories = + entities.whereType().map((dir) => dir.path).toList(); + + print('Found ${modDirectories.length} mod directories:'); + for (final modDir in modDirectories) { + try { + final mod = Mod.fromDirectory(modDir); + mods.add(mod); + print( + 'Loaded mod: ${mod.name} (ID: ${mod.id}) from directory: $modDir. ' + 'Description: ${mod.description}, ' + 'Hard Dependencies: ${mod.hardDependencies.join(', ')}, ' + 'Soft Dependencies: ${mod.softDependencies.join(', ')}, ' + 'Incompatibilities: ${mod.incompatabilities.join(', ')}', + ); + print('Current total mods loaded: ${mods.length}'); + } catch (e) { + print('Error loading mod from directory: $modDir'); + print('Error: $e'); + } + } + } else { + print('Mods root directory does not exist: $modsRoot'); + } } }