From 9856fd5f41fc3e86893d956249f032f8f0853602 Mon Sep 17 00:00:00 2001 From: Franco Colmenarez Date: Mon, 9 Mar 2026 20:30:16 -0500 Subject: [PATCH] field loader --- game_core/src/field/field.rs | 2 +- game_core/src/field/loader/loader.rs | 5 ++ game_core/src/field/loader/mod.rs | 2 + .../src/field/loader/plain_text_loader.rs | 55 +++++++++++++++++++ game_core/src/field/mod.rs | 3 +- game_data/fields/basic | 20 +++++++ game_data/fields/maze1 | 20 +++++++ game_data/fields/open | 20 +++++++ 8 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 game_core/src/field/loader/loader.rs create mode 100644 game_core/src/field/loader/mod.rs create mode 100644 game_core/src/field/loader/plain_text_loader.rs create mode 100644 game_data/fields/basic create mode 100644 game_data/fields/maze1 create mode 100644 game_data/fields/open diff --git a/game_core/src/field/field.rs b/game_core/src/field/field.rs index 0692138..f976500 100644 --- a/game_core/src/field/field.rs +++ b/game_core/src/field/field.rs @@ -1,4 +1,4 @@ -#[derive(Clone, Copy, PartialEq)] +#[derive(Clone, Copy, PartialEq, Debug)] pub enum Tile { Empty, Wall, diff --git a/game_core/src/field/loader/loader.rs b/game_core/src/field/loader/loader.rs new file mode 100644 index 0000000..bb0a98e --- /dev/null +++ b/game_core/src/field/loader/loader.rs @@ -0,0 +1,5 @@ +use crate::field::field::Field; + +pub trait FieldLoader { + fn load(field_id: String) -> Field; +} diff --git a/game_core/src/field/loader/mod.rs b/game_core/src/field/loader/mod.rs new file mode 100644 index 0000000..d7feb94 --- /dev/null +++ b/game_core/src/field/loader/mod.rs @@ -0,0 +1,2 @@ +pub mod loader; +pub mod plain_text_loader; \ No newline at end of file diff --git a/game_core/src/field/loader/plain_text_loader.rs b/game_core/src/field/loader/plain_text_loader.rs new file mode 100644 index 0000000..045ad9b --- /dev/null +++ b/game_core/src/field/loader/plain_text_loader.rs @@ -0,0 +1,55 @@ +use crate::field::field::{Field, Tile}; +use crate::field::loader::loader::FieldLoader; +use std::fs; + +pub struct PlainTextFieldLoader; + +impl FieldLoader for PlainTextFieldLoader { + fn load(field_id: String) -> Field { + let content = fs::read_to_string(&field_id) + .expect("Could not read field file"); + + let lines: Vec<&str> = content.lines().collect(); + let height = lines.len(); + let width = lines.iter().map(|l| l.len()).max().unwrap_or(0); + + let mut tiles = vec![Tile::Empty; width * height]; + + for (y, line) in lines.iter().enumerate() { + for (x, ch) in line.chars().enumerate() { + let tile = match ch { + 'x' => Tile::Wall, + _ => Tile::Empty, + }; + tiles[y * width + x] = tile; + } + } + + Field { width, height, tiles } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + + #[test] + fn test_load_from_file() { + let test_file = "test_level_tmp.txt"; + let level_data = "xxxx\nx x\nxxxx"; + + fs::write(test_file, level_data).expect("Could not write test file"); + + let field = PlainTextFieldLoader::load(test_file.to_string()); + + let _ = fs::remove_file(test_file); + + assert_eq!(field.width, 4); + assert_eq!(field.height, 3); + + assert_eq!(field.tiles[0], Tile::Wall); + assert_eq!(field.tiles[5], Tile::Empty); + } +} diff --git a/game_core/src/field/mod.rs b/game_core/src/field/mod.rs index 921dcee..d1fa923 100644 --- a/game_core/src/field/mod.rs +++ b/game_core/src/field/mod.rs @@ -1 +1,2 @@ -pub mod field; \ No newline at end of file +pub mod field; +pub mod loader; \ No newline at end of file diff --git a/game_data/fields/basic b/game_data/fields/basic new file mode 100644 index 0000000..18d00a4 --- /dev/null +++ b/game_data/fields/basic @@ -0,0 +1,20 @@ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +x x +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ No newline at end of file diff --git a/game_data/fields/maze1 b/game_data/fields/maze1 new file mode 100644 index 0000000..83876fc --- /dev/null +++ b/game_data/fields/maze1 @@ -0,0 +1,20 @@ +xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxx +x x +x x +x xx x +x xx x +x xx x +x xx x + xx + xxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxx + xx +x xx x +x xx x +x xx x +x xx x +x x +x x +x x +x x +xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxx \ No newline at end of file diff --git a/game_data/fields/open b/game_data/fields/open new file mode 100644 index 0000000..10eb931 --- /dev/null +++ b/game_data/fields/open @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file