Implement deserializing non-random levels
This commit is contained in:
parent
2b484a4ad7
commit
f38a80b0c7
3 changed files with 114 additions and 37 deletions
|
@ -32,7 +32,7 @@ fn main() -> BError {
|
||||||
|
|
||||||
let mut world = World::new();
|
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);
|
map.spawn_entities(&mut world);
|
||||||
|
|
||||||
let resources = Resources {
|
let resources = Resources {
|
||||||
|
|
|
@ -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) {
|
pub fn spawn_entities(&mut self, world: &mut World) {
|
||||||
for (index, tile) in self
|
for (index, tile) in self
|
||||||
.tiles
|
.tiles
|
||||||
|
@ -246,3 +210,58 @@ impl Map {
|
||||||
self.tiles[index] = tile;
|
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!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue