celesteloader 0.5.2

Code for working with Maps, Assets, and Mods for the game Celeste
Documentation
use anyhow::Result;
use celesteloader::CelesteInstallation;

fn main() -> Result<()> {
    let celeste = CelesteInstallation::detect()?;

    let entity_name = "floatySpaceBlock";

    let mut sj = celeste.read_mod("SpringCollab2020")?;
    let dialog = sj.get_dialog("English")?;

    let mut results = Vec::new();

    let maps = sj.list_map_files();
    for map_path in maps {
        let map = match sj.read_map(&map_path) {
            Ok(map) => map,
            Err(e) => {
                eprintln!("decoding {map_path} {e}");
                continue;
            }
        };

        let set = map_path
            .trim_start_matches("Maps/")
            .trim_end_matches(".bin");
        let name = dialog.get(set).unwrap();

        let lobby = set.split('/').nth(1).unwrap().rsplit_once('-').unwrap().1;
        let mapbin = set.rsplit_once('/').unwrap().1;

        let n = map
            .rooms
            .iter()
            .flat_map(|room| {
                room.entities
                    .iter()
                    .filter(|entity| entity.name == entity_name)
            })
            .count();

        if n > 0 {
            results.push((n, name.to_owned(), lobby.to_owned(), mapbin.to_owned()));
        }
    }

    results.sort_by_key(|x| std::cmp::Reverse(x.0));

    for (n, map, lobby, set) in results {
        println!("{n}: ({lobby}) {map} - {set}");
    }

    Ok(())
}