53 lines
1.4 KiB
Rust
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);
|
|
}
|
|
}
|