Implement deserializing non-random levels

This commit is contained in:
Alex Page 2022-02-03 20:16:06 -05:00
parent 2b484a4ad7
commit f38a80b0c7
3 changed files with 114 additions and 37 deletions

View file

@ -32,7 +32,7 @@ fn main() -> BError {
let mut world = World::new();
let mut map = Map::from_level(levels::get_level(starting_level));
let mut map = Map::from(levels::get_level(starting_level));
map.spawn_entities(&mut world);
let resources = Resources {

View file

@ -44,42 +44,6 @@ impl Map {
}
}
pub fn from_level(level: Level) -> Self {
match level {
Level::Normal(_data) => todo!(),
Level::Randomized(data) => {
let mut rng = RandomNumberGenerator::new();
let mut map = Self::new();
for (tile, count) in data {
for _ in 0..count {
loop {
let point = Point {
x: rng.range(0, MAP_WIDTH as i32),
y: rng.range(0, MAP_HEIGHT as i32),
};
if map.get_tile_at(point) == TileType::Floor {
map.set_tile_at(point, tile);
break;
}
}
}
}
loop {
let point = Point {
x: rng.range(0, MAP_WIDTH as i32),
y: rng.range(0, MAP_HEIGHT as i32),
};
if map.get_tile_at(point) == TileType::Floor {
map.set_tile_at(point, TileType::Player);
break;
}
}
map
}
Level::End => todo!(),
}
}
pub fn spawn_entities(&mut self, world: &mut World) {
for (index, tile) in self
.tiles
@ -246,3 +210,58 @@ impl Map {
self.tiles[index] = tile;
}
}
impl From<Level> for Map {
fn from(level: Level) -> Self {
match level {
Level::Normal(data) => {
assert_eq!(data.len(), MAP_HEIGHT, "Level data is incorrect height!");
let mut map = Self::new();
for (y, line) in data.iter().enumerate() {
assert_eq!(line.len(), MAP_WIDTH, "Level data is incorrect width!");
for (x, c) in line.chars().enumerate() {
map.set_tile_at(
Point {
x: x as i32,
y: y as i32,
},
TileType::from(c),
);
}
}
map
}
Level::Randomized(data) => {
let mut rng = RandomNumberGenerator::new();
let mut map = Self::new();
for (tile, count) in data {
for _ in 0..count {
loop {
let point = Point {
x: rng.range(0, MAP_WIDTH as i32),
y: rng.range(0, MAP_HEIGHT as i32),
};
if map.get_tile_at(point) == TileType::Floor {
map.set_tile_at(point, tile);
break;
}
}
}
}
loop {
let point = Point {
x: rng.range(0, MAP_WIDTH as i32),
y: rng.range(0, MAP_HEIGHT as i32),
};
if map.get_tile_at(point) == TileType::Floor {
map.set_tile_at(point, TileType::Player);
break;
}
}
map
}
Level::End => todo!(),
}
}
}

View file

@ -375,3 +375,61 @@ pub fn tile_data(tile: TileType) -> TileData {
},
}
}
impl From<char> for TileType {
fn from(c: char) -> Self {
match c {
' ' => TileType::Floor,
'1' => TileType::Slow,
'2' => TileType::Medium,
'3' => TileType::Fast,
'X' => TileType::Block,
'W' => TileType::Whip,
'L' => TileType::Stairs,
'C' => TileType::Chest,
'S' => TileType::SlowTime,
'+' => TileType::Gem,
'I' => TileType::Invisible,
'T' => TileType::Teleport,
'K' => TileType::Key,
'D' => TileType::Door,
'#' => TileType::Wall,
'F' => TileType::SpeedTime,
'.' => TileType::Trap,
'R' => TileType::River,
'Q' => TileType::Power,
'/' => TileType::Forest,
'\\' => TileType::Tree,
'B' => TileType::Bomb,
'V' => TileType::Lava,
'=' => TileType::Pit,
'A' => TileType::Tome,
'U' => TileType::Tunnel,
'Z' => TileType::Freeze,
'*' => TileType::Nugget,
'E' => TileType::Quake,
';' => TileType::InvisibleBlock,
':' => TileType::InvisibleWall,
'`' => TileType::InvisibleDoor,
'-' => TileType::Stop,
'%' => TileType::Zap,
']' => TileType::Create,
'G' => TileType::Generator,
'@' => TileType::Trap2,
')' => TileType::Trap3,
'(' => TileType::Trap4,
'$' => TileType::Trap5,
'α' => TileType::Trap6,
'ß' => TileType::Trap7,
'Γ' => TileType::Trap8,
'π' => TileType::Trap9,
'Σ' => TileType::Trap10,
'σ' => TileType::Trap11,
'µ' => TileType::Trap12,
'τ' => TileType::Trap13,
'P' => TileType::Player,
'!' => TileType::Punctuation,
_ => TileType::Letter(c),
}
}
}