Skip to main content

modde_games/bg3/
scanner.rs

1//! Mod scanner for Baldur's Gate 3.
2
3use anyhow::Result;
4
5use crate::scanner_patterns::SingleFileModRule;
6use crate::traits::{DiscoveredMod, ModScanner, ScanContext};
7
8/// [`ModScanner`] that discovers installed BG3 `.pak` mods.
9pub struct Bg3Scanner;
10
11pub static BG3_SCANNER: Bg3Scanner = Bg3Scanner;
12
13impl ModScanner for Bg3Scanner {
14    fn scan_directories(&self) -> &[&str] {
15        &["Mods"]
16    }
17
18    fn scan_filesystem(&self, ctx: &ScanContext<'_>) -> Result<Vec<DiscoveredMod>> {
19        let data_root = super::data_root_from_install(ctx.install_dir);
20        let scan_root = if data_root.join("Mods").is_dir() {
21            data_root
22        } else {
23            ctx.install_dir.to_path_buf()
24        };
25        let mut out = Vec::new();
26        SingleFileModRule {
27            rel_dir: "Mods",
28            extension: "pak",
29            ignored_prefixes: &[],
30            mod_id_prefix: "pak",
31            source_location: "Mods",
32            confidence: 0.95,
33        }
34        .scan(&scan_root, &mut out)?;
35        Ok(out)
36    }
37
38    fn mod_id_footprint(&self, mod_id: &str) -> Option<modde_core::scanner::ModFootprint> {
39        let stem = mod_id.strip_prefix("pak/")?.to_lowercase();
40        Some(modde_core::scanner::ModFootprint::File(format!(
41            "mods/{stem}.pak"
42        )))
43    }
44}