Files
vrtue/src/bin/printmap.rs

53 lines
1.4 KiB
Rust

extern crate vrtue;
use vrtue::{arena, tile, town, world};
extern crate itertools;
extern crate memmap;
use std::mem::transmute;
use std::env;
use itertools::Itertools;
use memmap::{Mmap, Protection};
fn mmap_to_rows<'a, M: world::HasMap>(mmap: &memmap::Mmap) -> &'a world::HasMap
where M: Copy + 'a
{
assert_eq!(std::mem::size_of::<M>(), mmap.len());
unsafe { transmute::<*const u8, &M>(mmap.ptr()) }
}
fn main() {
let args: Vec<String> = env::args().collect();
let filename;
if args.len() > 1 {
filename = &args[1] as &str;
} else {
filename = "data/WORLD.MAP";
}
let conv = match filename {
s if s.ends_with("SHRINE.CON") => mmap_to_rows::<arena::Shrine>,
s if s.ends_with(".CON") => mmap_to_rows::<arena::Arena>,
s if s.ends_with(".ULT") => mmap_to_rows::<town::Town>,
s if s.ends_with("WORLD.MAP") => mmap_to_rows::<world::World>,
_ => panic!("unrecognized map file"),
};
let file_mmap = Mmap::open_path(filename, Protection::Read).unwrap();
let world = conv(&file_mmap);
print_rows(world.map().rows());
}
fn print_rows<'a, T: ?Sized, U: ?Sized>(rows: Box<T>)
where T: Iterator<Item = Box<U>> + 'a,
U: Iterator<Item = &'a tile::Tile> + 'a
{
for row in rows {
let s1: String = row.into_iter().map(|tile| tile.as_char()).collect();
let s: String = s1.chars().intersperse(' ').collect();
println!("{}", s);
}
}