From f7763dd53852ee9895132842a0ed7a2b13f36776 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sat, 15 Mar 2025 22:20:35 +0100 Subject: [PATCH] Implement sussing active mods --- lib/main.dart | 25 ++++++---------- lib/modloader.dart | 71 +++++++++++++++++++++++++++++++++++++++++++--- pubspec.lock | 16 +++++++++++ pubspec.yaml | 1 + 4 files changed, 92 insertions(+), 21 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 748e986..4a1e0fe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:rimworld_modman/modloader.dart'; void main() { - runApp(const RimWorldModManager()); + ConfigFile(path: configPath).load(); + // runApp(const RimWorldModManager()); } class RimWorldModManager extends StatelessWidget { @@ -38,7 +40,7 @@ class ModManagerHomePage extends StatefulWidget { class _ModManagerHomePageState extends State { int _selectedIndex = 0; - + final List _pages = [ const ModListPage(), const LoadOrderPage(), @@ -48,9 +50,7 @@ class _ModManagerHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('RimWorld Mod Manager'), - ), + appBar: AppBar(title: const Text('RimWorld Mod Manager')), body: _pages[_selectedIndex], bottomNavigationBar: BottomNavigationBar( currentIndex: _selectedIndex, @@ -60,10 +60,7 @@ class _ModManagerHomePageState extends State { }); }, items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.list), - label: 'Mods', - ), + BottomNavigationBarItem(icon: Icon(Icons.list), label: 'Mods'), BottomNavigationBarItem( icon: Icon(Icons.reorder), label: 'Load Order', @@ -90,10 +87,7 @@ class ModListPage extends StatelessWidget { children: [ const Icon(Icons.extension, size: 64), const SizedBox(height: 16), - Text( - 'Mod List', - style: Theme.of(context).textTheme.headlineMedium, - ), + Text('Mod List', style: Theme.of(context).textTheme.headlineMedium), const SizedBox(height: 16), Text( 'Here you\'ll see your installed mods.', @@ -124,10 +118,7 @@ class LoadOrderPage extends StatelessWidget { children: [ const Icon(Icons.reorder, size: 64), const SizedBox(height: 16), - Text( - 'Load Order', - style: Theme.of(context).textTheme.headlineMedium, - ), + Text('Load Order', style: Theme.of(context).textTheme.headlineMedium), const SizedBox(height: 16), Text( 'Manage your mod loading order with dependency resolution.', diff --git a/lib/modloader.dart b/lib/modloader.dart index 0a41542..18b4fda 100644 --- a/lib/modloader.dart +++ b/lib/modloader.dart @@ -1,13 +1,76 @@ -const root = r'C:\Users\Administrator\Seafile\Games-Rimworld'; -const modsRoot = '$root\294100'; -const configRoot = '$root\AppData\RimWorld by Ludeon Studios\Config'; +import 'dart:io'; +import 'package:xml/xml.dart'; + +const root = r'C:/Users/Administrator/Seafile/Games-Rimworld'; +const modsRoot = '$root/294100'; +const configRoot = '$root/AppData/RimWorld by Ludeon Studios/Config'; +const configPath = '$configRoot/ModsConfig.xml'; class Mod { final String name; // ModMetaData.name + final String id; // ModMetaData.packageId final String path; // figure it out final List versions; // ModMetaData.supportedVersions final String description; // ModMetaData.description - final List hardDependencies; // ModMetaData.modDependencies - this is a li with packageId, displayName, steamWorkshopUrl and downloadUrl + final List + hardDependencies; // ModMetaData.modDependencies - this is a li with packageId, displayName, steamWorkshopUrl and downloadUrl final List softDependencies; // ModMetaData.loadAfter final List incompatabilities; // ModMetaData.incompatibleWith + final bool + enabled; // ConfigFile.mods.firstWhere((mod) => mod.id == id).enabled + + Mod({ + required this.name, + required this.id, + required this.path, + required this.versions, + required this.description, + required this.hardDependencies, + required this.softDependencies, + required this.incompatabilities, + required this.enabled, + }); +} + +class ModList { + final String path; + final List mods; + + ModList({required this.path, this.mods = const []}); + + void load() { + final file = File(path); + print('Loading configuration from: $path'); + } +} + +class ConfigFile { + final String path; + List mods; + + ConfigFile({required this.path, this.mods = const []}); + + void load() { + final file = File(path); + print('Loading configuration from: $path'); + + final xmlString = file.readAsStringSync(); + print('XML content read successfully.'); + + final xmlDocument = XmlDocument.parse(xmlString); + print('XML document parsed successfully.'); + + final modConfigData = xmlDocument.findElements("ModsConfigData").first; + print('Found ModsConfigData element.'); + + final modsElement = modConfigData.findElements("activeMods").first; + print('Found activeMods element.'); + + final mods = modsElement.findElements("li"); + print('Found ${mods.length} active mods.'); + + for (final mod in mods) { + print('Mod found: ${mod.innerText}'); + } + } } diff --git a/pubspec.lock b/pubspec.lock index d993b91..524914b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -139,6 +139,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" sky_engine: dependency: transitive description: flutter @@ -208,6 +216,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.1" + xml: + dependency: "direct main" + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" sdks: dart: ">=3.7.2 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index ba4a828..81f4a6e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,6 +34,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 + xml: ^6.5.0 dev_dependencies: flutter_test: