Compare commits
	
		
			4 Commits
		
	
	
		
			v1.0.0
			...
			4c6e3b5ed5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 4c6e3b5ed5 | |||
| a662dffc7c | |||
| 753859fd3e | |||
| 43a5f63759 | 
@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:flutter_html/flutter_html.dart';
 | 
			
		||||
import 'package:url_launcher/url_launcher.dart';
 | 
			
		||||
import '../format_converter.dart';
 | 
			
		||||
import 'dart:math' as math;
 | 
			
		||||
 | 
			
		||||
class HtmlTooltip extends StatefulWidget {
 | 
			
		||||
  final Widget child;
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ class FormatConverter {
 | 
			
		||||
      'td',
 | 
			
		||||
    ];
 | 
			
		||||
    for (final tag in tagTypes) {
 | 
			
		||||
      final openCount = '[${tag}'.allMatches(result).length;
 | 
			
		||||
      final openCount = '[$tag'.allMatches(result).length;
 | 
			
		||||
      final closeCount = '[/$tag]'.allMatches(result).length;
 | 
			
		||||
      if (openCount > closeCount) {
 | 
			
		||||
        result = result + '[/$tag]' * (openCount - closeCount);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								lib/mod.dart
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								lib/mod.dart
									
									
									
									
									
								
							@@ -1,6 +1,5 @@
 | 
			
		||||
import 'dart:io';
 | 
			
		||||
 | 
			
		||||
import 'package:rimworld_modman/logger.dart';
 | 
			
		||||
import 'package:xml/xml.dart';
 | 
			
		||||
 | 
			
		||||
XmlElement findCaseInsensitive(XmlElement element, String name) {
 | 
			
		||||
@@ -162,6 +161,23 @@ class Mod {
 | 
			
		||||
      //   'Dependencies element is missing in ModMetaData ($aboutFile).',
 | 
			
		||||
      // );
 | 
			
		||||
    }
 | 
			
		||||
    try {
 | 
			
		||||
      dependencies.addAll(
 | 
			
		||||
        metadata
 | 
			
		||||
            .findElements('modDependencies')
 | 
			
		||||
            .first
 | 
			
		||||
            .findElements('li')
 | 
			
		||||
            .map(
 | 
			
		||||
              (e) => e.findElements("packageId").first.innerText.toLowerCase(),
 | 
			
		||||
            )
 | 
			
		||||
            .toList(),
 | 
			
		||||
      );
 | 
			
		||||
      // logger.info('Additional dependencies found: ${dependencies.join(", ")}');
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      // logger.warning(
 | 
			
		||||
      //   'modDependencies element is missing in ModMetaData ($aboutFile). Original error: $e',
 | 
			
		||||
      // );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    List<String> loadAfter = [];
 | 
			
		||||
    try {
 | 
			
		||||
@@ -313,6 +329,10 @@ class Mod {
 | 
			
		||||
    //   'Mod $name timing: XML=${xmlTime}ms, Metadata=${metadataTime}ms, FileCount=${fileCountTime}ms, Total=${totalTime}ms',
 | 
			
		||||
    // );
 | 
			
		||||
 | 
			
		||||
    dependencies = dependencies.toSet().toList();
 | 
			
		||||
    loadAfter = loadAfter.toSet().toList();
 | 
			
		||||
    loadBefore = loadBefore.toSet().toList();
 | 
			
		||||
    incompatibilities = incompatibilities.toSet().toList();
 | 
			
		||||
    return Mod(
 | 
			
		||||
      name: name,
 | 
			
		||||
      id: id,
 | 
			
		||||
 
 | 
			
		||||
@@ -104,6 +104,21 @@ var specialMods = {
 | 
			
		||||
    isExpansion: true,
 | 
			
		||||
    enabled: true,
 | 
			
		||||
  ),
 | 
			
		||||
  'ludeon.rimworld.odyssey': Mod(
 | 
			
		||||
    id: 'ludeon.rimworld.odyssey',
 | 
			
		||||
    name: 'Odyssey',
 | 
			
		||||
    path: '',
 | 
			
		||||
    versions: [],
 | 
			
		||||
    description: 'RimWorld expansion - Odyssey',
 | 
			
		||||
    dependencies: ['ludeon.rimworld'],
 | 
			
		||||
    loadAfter: ['ludeon.rimworld.anomaly'],
 | 
			
		||||
    loadBefore: [],
 | 
			
		||||
    incompatibilities: [],
 | 
			
		||||
    isBaseGame: false,
 | 
			
		||||
    size: 0,
 | 
			
		||||
    isExpansion: true,
 | 
			
		||||
    enabled: true,
 | 
			
		||||
  ),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ModList {
 | 
			
		||||
@@ -295,7 +310,7 @@ class ModList {
 | 
			
		||||
        'ModsConfigData',
 | 
			
		||||
        nest: () {
 | 
			
		||||
          // Add version element
 | 
			
		||||
          builder.element('version', nest: '1.5.4297 rev994');
 | 
			
		||||
          builder.element('version', nest: '1.6.4518 rev71');
 | 
			
		||||
 | 
			
		||||
          // Add active mods element
 | 
			
		||||
          builder.element(
 | 
			
		||||
@@ -703,11 +718,11 @@ class ModList {
 | 
			
		||||
    loadOrder ??= LoadOrder();
 | 
			
		||||
    final toEnable = <String>[];
 | 
			
		||||
    final logger = Logger.instance;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // First, identify all base game and expansion mods
 | 
			
		||||
    final baseGameIds = <String>{};
 | 
			
		||||
    final expansionIds = <String>{};
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    for (final entry in mods.entries) {
 | 
			
		||||
      if (entry.value.isBaseGame) {
 | 
			
		||||
        baseGameIds.add(entry.key);
 | 
			
		||||
@@ -715,46 +730,53 @@ class ModList {
 | 
			
		||||
        expansionIds.add(entry.key);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    logger.info("Base game mods: ${baseGameIds.join(', ')}");
 | 
			
		||||
    logger.info("Expansion mods: ${expansionIds.join(', ')}");
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Load dependencies for all active mods
 | 
			
		||||
    for (final modid in activeMods.keys) {
 | 
			
		||||
      loadDependencies(modid, loadOrder, toEnable);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Enable all required dependencies
 | 
			
		||||
    for (final modid in toEnable) {
 | 
			
		||||
      setEnabled(modid, true);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Generate the load order
 | 
			
		||||
    final newLoadOrder = generateLoadOrder(loadOrder);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Filter out any error messages related to incompatibilities between base game and expansions
 | 
			
		||||
    if (newLoadOrder.hasErrors) {
 | 
			
		||||
      final filteredErrors = <String>[];
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      for (final error in newLoadOrder.errors) {
 | 
			
		||||
        // Check if the error is about incompatibility
 | 
			
		||||
        if (error.contains('Incompatibility detected:')) {
 | 
			
		||||
          // Extract the mod IDs from the error message
 | 
			
		||||
          final parts = error.split(' is incompatible with ');
 | 
			
		||||
          if (parts.length == 2) {
 | 
			
		||||
            final firstModId = parts[0].replaceAll('Incompatibility detected: ', '');
 | 
			
		||||
            final firstModId = parts[0].replaceAll(
 | 
			
		||||
              'Incompatibility detected: ',
 | 
			
		||||
              '',
 | 
			
		||||
            );
 | 
			
		||||
            final secondModId = parts[1];
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            // Check if either mod is a base game or expansion
 | 
			
		||||
            final isBaseGameOrExpansion = 
 | 
			
		||||
                baseGameIds.contains(firstModId) || baseGameIds.contains(secondModId) ||
 | 
			
		||||
                expansionIds.contains(firstModId) || expansionIds.contains(secondModId);
 | 
			
		||||
                
 | 
			
		||||
            final isBaseGameOrExpansion =
 | 
			
		||||
                baseGameIds.contains(firstModId) ||
 | 
			
		||||
                baseGameIds.contains(secondModId) ||
 | 
			
		||||
                expansionIds.contains(firstModId) ||
 | 
			
		||||
                expansionIds.contains(secondModId);
 | 
			
		||||
 | 
			
		||||
            // Only keep the error if it's not between base game/expansions
 | 
			
		||||
            if (!isBaseGameOrExpansion) {
 | 
			
		||||
              filteredErrors.add(error);
 | 
			
		||||
            } else {
 | 
			
		||||
              logger.info("Ignoring incompatibility between base game or expansion mods: $error");
 | 
			
		||||
              logger.info(
 | 
			
		||||
                "Ignoring incompatibility between base game or expansion mods: $error",
 | 
			
		||||
              );
 | 
			
		||||
            }
 | 
			
		||||
          } else {
 | 
			
		||||
            // If we can't parse the error, keep it
 | 
			
		||||
@@ -765,12 +787,12 @@ class ModList {
 | 
			
		||||
          filteredErrors.add(error);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      // Replace the errors with the filtered list
 | 
			
		||||
      newLoadOrder.errors.clear();
 | 
			
		||||
      newLoadOrder.errors.addAll(filteredErrors);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    return newLoadOrder;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										68
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								pubspec.lock
									
									
									
									
									
								
							@@ -5,18 +5,18 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: _fe_analyzer_shared
 | 
			
		||||
      sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57
 | 
			
		||||
      sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "80.0.0"
 | 
			
		||||
    version: "85.0.0"
 | 
			
		||||
  analyzer:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: analyzer
 | 
			
		||||
      sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e"
 | 
			
		||||
      sha256: abf63d42450c7ad6d8188887d16eeba2f1ff92ea8d8dc673213e99fb3c02b194
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "7.3.0"
 | 
			
		||||
    version: "7.5.7"
 | 
			
		||||
  args:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -29,10 +29,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: async
 | 
			
		||||
      sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
 | 
			
		||||
      sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.12.0"
 | 
			
		||||
    version: "2.13.0"
 | 
			
		||||
  boolean_selector:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -49,6 +49,14 @@ packages:
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.4.0"
 | 
			
		||||
  cli_config:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: cli_config
 | 
			
		||||
      sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.2.0"
 | 
			
		||||
  clock:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -77,10 +85,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: coverage
 | 
			
		||||
      sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43
 | 
			
		||||
      sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.11.1"
 | 
			
		||||
    version: "1.15.0"
 | 
			
		||||
  crypto:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -109,10 +117,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: fake_async
 | 
			
		||||
      sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
 | 
			
		||||
      sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.3.2"
 | 
			
		||||
    version: "1.3.3"
 | 
			
		||||
  file:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -180,10 +188,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: html
 | 
			
		||||
      sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
 | 
			
		||||
      sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.15.5"
 | 
			
		||||
    version: "0.15.6"
 | 
			
		||||
  http_multi_server:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -228,10 +236,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: leak_tracker
 | 
			
		||||
      sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
 | 
			
		||||
      sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "10.0.8"
 | 
			
		||||
    version: "10.0.9"
 | 
			
		||||
  leak_tracker_flutter_testing:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -497,26 +505,26 @@ packages:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: url_launcher
 | 
			
		||||
      sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
 | 
			
		||||
      sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.3.1"
 | 
			
		||||
    version: "6.3.2"
 | 
			
		||||
  url_launcher_android:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: url_launcher_android
 | 
			
		||||
      sha256: "1d0eae19bd7606ef60fe69ef3b312a437a16549476c42321d5dc1506c9ca3bf4"
 | 
			
		||||
      sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.3.15"
 | 
			
		||||
    version: "6.3.16"
 | 
			
		||||
  url_launcher_ios:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: url_launcher_ios
 | 
			
		||||
      sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
 | 
			
		||||
      sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.3.2"
 | 
			
		||||
    version: "6.3.3"
 | 
			
		||||
  url_launcher_linux:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -545,10 +553,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: url_launcher_web
 | 
			
		||||
      sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9"
 | 
			
		||||
      sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.4.0"
 | 
			
		||||
    version: "2.4.1"
 | 
			
		||||
  url_launcher_windows:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -569,18 +577,18 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: vm_service
 | 
			
		||||
      sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
 | 
			
		||||
      sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "14.3.1"
 | 
			
		||||
    version: "15.0.0"
 | 
			
		||||
  watcher:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: watcher
 | 
			
		||||
      sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
 | 
			
		||||
      sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.1.1"
 | 
			
		||||
    version: "1.1.2"
 | 
			
		||||
  web:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -593,18 +601,18 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: web_socket
 | 
			
		||||
      sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
 | 
			
		||||
      sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.1.6"
 | 
			
		||||
    version: "1.0.1"
 | 
			
		||||
  web_socket_channel:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: web_socket_channel
 | 
			
		||||
      sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
 | 
			
		||||
      sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "3.0.2"
 | 
			
		||||
    version: "3.0.3"
 | 
			
		||||
  webkit_inspection_protocol:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user