diff --git a/.gitignore b/.gitignore index 61e071b..eecda3a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ server/ TODO.md -test.map \ No newline at end of file +*.map \ No newline at end of file diff --git a/src/cli.rs b/src/cli.rs index bebc31f..5cb44a9 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -19,8 +19,11 @@ struct Cli { /// The seed used when generating a map. By default a random one. #[arg(short, long)] seed: Option, + /// The mapres directory. + #[arg(short, long, default_value = "mapres")] + mapres: PathBuf, /// The output map file. - #[arg(short, long)] + #[arg(short, long, default_value = "generated.map")] output: PathBuf, #[command(subcommand)] command: Commands, @@ -37,8 +40,8 @@ enum Commands { impl Commands { pub fn print(&self) { let name = match self { - Self::Fly => "Maze", - Self::Maze => "Fly", + Self::Fly => "Fly", + Self::Maze => "Maze", }; println!("Selected map generator: {}", name.purple().bold()); } @@ -66,7 +69,11 @@ pub fn run_cli() -> Result<()> { cli.command.print(); match cli.command { - Commands::Maze => MazeGenerator::save_file(&mut rng, cli.width, cli.height, &cli.output), - Commands::Fly => FlyGenerator::save_file(&mut rng, cli.width, cli.height, &cli.output), + Commands::Maze => { + MazeGenerator::save_file(&mut rng, &cli.mapres, cli.width, cli.height, &cli.output) + } + Commands::Fly => { + FlyGenerator::save_file(&mut rng, &cli.mapres, cli.width, cli.height, &cli.output) + } } } diff --git a/src/generators/fly.rs b/src/generators/fly.rs index 7e39117..b11f938 100644 --- a/src/generators/fly.rs +++ b/src/generators/fly.rs @@ -6,8 +6,13 @@ use rand::Rng; pub struct FlyGenerator; impl MapGenerator for FlyGenerator { - fn generate(rng: &mut R, width: usize, height: usize) -> Result { - let mut map = create_initial_map()?; + fn generate( + rng: &mut R, + mapres: &Path, + width: usize, + height: usize, + ) -> Result { + let mut map = create_initial_map(mapres)?; let mut tiles = Array2::from_shape_simple_fn((height, width), || { GameTile::new(TILE_EMPTY, TileFlags::empty()) @@ -50,7 +55,7 @@ impl MapGenerator for FlyGenerator { direction_steps = rng.gen_range(1..=10); direction = rng.gen_range(-1..=1); } - + let width_change: i64 = rng.gen_range(-1..=1); center += direction; fly_width += width_change; diff --git a/src/generators/maze.rs b/src/generators/maze.rs index 9450d36..9afcfdc 100644 --- a/src/generators/maze.rs +++ b/src/generators/maze.rs @@ -6,7 +6,12 @@ use ndarray::Array2; pub struct MazeGenerator; impl MapGenerator for MazeGenerator { - fn generate(rng: &mut R, width: usize, height: usize) -> Result { + fn generate( + rng: &mut R, + mapres: &Path, + width: usize, + height: usize, + ) -> Result { // Must be odd. let width = { if width % 2 == 0 { @@ -23,17 +28,16 @@ impl MapGenerator for MazeGenerator { } }; - let mut map = create_initial_map()?; + let mut map = create_initial_map(mapres)?; let maze = Maze::new(width, height).unwrap().generate(rng); - let hookable_tiles = - Array2::from_shape_fn((height, width), |(y, x)| { - let mut t = 0; - if maze[x][y] == 1 { - t = 9; - } - Tile::new(t, TileFlags::empty()) - }); + let hookable_tiles = Array2::from_shape_fn((height, width), |(y, x)| { + let mut t = 0; + if maze[x][y] == 1 { + t = 9; + } + Tile::new(t, TileFlags::empty()) + }); let mut tiles = Array2::from_shape_fn((width, height), |(y, x)| { GameTile::new(maze[x][y], TileFlags::empty()) diff --git a/src/generators/mod.rs b/src/generators/mod.rs index fd64097..330d14f 100644 --- a/src/generators/mod.rs +++ b/src/generators/mod.rs @@ -19,43 +19,53 @@ pub const TILE_FINISH: u8 = 34; pub const TILE_SPAWN: u8 = 192; pub trait MapGenerator { - fn generate(rng: &mut R, width: usize, height: usize) -> Result; + fn generate( + rng: &mut R, + mapres: &Path, + width: usize, + height: usize, + ) -> Result; fn save_file( rng: &mut R, + mapres: &Path, width: usize, height: usize, path: &Path, ) -> Result<()> { - let mut map = Self::generate(rng, width, height)?; + let mut map = Self::generate(rng, mapres, width, height)?; map.save_file(path)?; Ok(()) } } -pub fn create_initial_map() -> Result { +pub fn create_initial_map(mapres: &Path) -> Result { let mut map = TwMap::empty(Version::DDNet06); map.info.author = "github.com/edg-l/ddnet-map-gen".to_string(); map.info.credits = "github.com/edg-l/ddnet-map-gen".to_string(); + //map.info.version = map.images.push(Image::External(ExternalImage { name: "generic_unhookable".to_string(), size: Point::new_same(1024), })); map.images.push(Image::Embedded(EmbeddedImage::from_file( - "mapres/basic_freeze.png", + mapres.join("basic_freeze.png"), )?)); Ok(map) } - // Creates the sky quad from the editor. pub fn quads_sky() -> Group { let mut quads_group = Group::default(); let mut quads_layer = QuadsLayer::default(); quads_group.parallax.x = 0; quads_group.parallax.y = 0; - - let mut quad = Quad::new(Default::default(), Point::new(I17F15::from_num(50), I17F15::from_num(30))).unwrap(); + + let mut quad = Quad::new( + Default::default(), + Point::new(I17F15::from_num(50), I17F15::from_num(30)), + ) + .unwrap(); quad.colors = [ Color { r: 94,