openstranded-map-tool 0.2.1

Convert Stranded II .s2 map files to .osmap (OpenStranded MAP) format
Documentation
use openstranded_map_tool::parse_s2;
use std::env;
use std::fs;
fn main() {
    let args: Vec<String> = env::args().collect();
    let path = args.get(1).map(|s| s.as_str()).unwrap_or(
        "/home/admen/sources/projects/openstranded/s2mod-tool/tests/stranded2/maps/adventure/map01.s2"
    );
    let data = fs::read(path).unwrap();
    let map = parse_s2(&data).unwrap();
    let step = 64.0 / map.terrain_size as f32;
    println!("terrain_size: {} step={}", map.terrain_size, step);
    println!("objects: {}", map.objects.len());
    // show object x range
    if !map.objects.is_empty() {
        let xs: Vec<f32> = map.objects.iter().map(|o| o.x).collect();
        let zs: Vec<f32> = map.objects.iter().map(|o| o.z).collect();
        println!("  x range: {:.2} .. {:.2}", xs.iter().copied().fold(f32::MAX, f32::min), xs.iter().copied().fold(f32::MIN, f32::max));
        println!("  z range: {:.2} .. {:.2}", zs.iter().copied().fold(f32::MAX, f32::min), zs.iter().copied().fold(f32::MIN, f32::max));
    }
    println!("units: {}", map.units.len());
    if !map.units.is_empty() {
        let xs: Vec<f32> = map.units.iter().map(|u| u.x).collect();
        let ys: Vec<f32> = map.units.iter().map(|u| u.y).collect();
        let zs: Vec<f32> = map.units.iter().map(|u| u.z).collect();
        println!("  x range: {:.2} .. {:.2}", xs.iter().copied().fold(f32::MAX, f32::min), xs.iter().copied().fold(f32::MIN, f32::max));
        println!("  y range: {:.2} .. {:.2}", ys.iter().copied().fold(f32::MAX, f32::min), ys.iter().copied().fold(f32::MIN, f32::max));
        println!("  z range: {:.2} .. {:.2}", zs.iter().copied().fold(f32::MAX, f32::min), zs.iter().copied().fold(f32::MIN, f32::max));
    }
    println!("items: {}", map.items.len());
    if !map.items.is_empty() {
        let xs: Vec<f32> = map.items.iter().map(|i| i.x).collect();
        let zs: Vec<f32> = map.items.iter().map(|i| i.z).collect();
        println!("  x range: {:.2} .. {:.2}", xs.iter().copied().fold(f32::MAX, f32::min), xs.iter().copied().fold(f32::MIN, f32::max));
        println!("  z range: {:.2} .. {:.2}", zs.iter().copied().fold(f32::MAX, f32::min), zs.iter().copied().fold(f32::MIN, f32::max));
    }
    println!("infos: {}", map.infos.len());
    if !map.infos.is_empty() {
        let xs: Vec<f32> = map.infos.iter().map(|i| i.x).collect();
        let zs: Vec<f32> = map.infos.iter().map(|i| i.z).collect();
        println!("  x range: {:.2} .. {:.2}", xs.iter().copied().fold(f32::MAX, f32::min), xs.iter().copied().fold(f32::MIN, f32::max));
        println!("  z range: {:.2} .. {:.2}", zs.iter().copied().fold(f32::MAX, f32::min), zs.iter().copied().fold(f32::MIN, f32::max));
    }
    println!("heights: x{}", map.heights.len());
    // Read e_save_map.bb to understand coord system
    println!("\nFirst few heights (row 0):");
    let stride = (map.terrain_size + 1) as usize;
    for x in 0..stride.min(5) {
        print!(" {:.4}", map.heights[x]);
    }
    println!();
}