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::(), mmap.len()); unsafe { transmute::<*const u8, &M>(mmap.ptr()) } } fn main() { let args: Vec = 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::, s if s.ends_with(".CON") => mmap_to_rows::, s if s.ends_with(".ULT") => mmap_to_rows::, s if s.ends_with("WORLD.MAP") => mmap_to_rows::, _ => 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) where T: Iterator> + 'a, U: Iterator + '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); } }