roguelike-game/src/map_builders/room_sorter.rs

60 lines
1.9 KiB
Rust
Raw Normal View History

use rltk::RandomNumberGenerator;
use super::{BuilderMap, MetaMapBuilder};
2021-12-16 13:48:36 -05:00
use crate::Rect;
2021-12-16 13:48:36 -05:00
pub enum RoomSort {
LeftMost,
RightMost,
TopMost,
BottomMost,
Central,
}
pub struct RoomSorter {
sort_by: RoomSort,
}
impl MetaMapBuilder for RoomSorter {
#[allow(dead_code)]
fn build_map(&mut self, rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
self.sorter(rng, build_data);
}
}
impl RoomSorter {
#[allow(dead_code)]
2021-12-16 13:48:36 -05:00
pub fn new(sort_by: RoomSort) -> Box<RoomSorter> {
Box::new(RoomSorter { sort_by })
}
fn sorter(&mut self, _rng: &mut RandomNumberGenerator, build_data: &mut BuilderMap) {
2021-12-16 13:48:36 -05:00
let rooms = build_data.rooms.as_mut().unwrap();
match self.sort_by {
RoomSort::LeftMost => rooms.sort_by(|a, b| a.x1.cmp(&b.x1)),
RoomSort::RightMost => rooms.sort_by(|a, b| b.x2.cmp(&a.x2)),
RoomSort::TopMost => rooms.sort_by(|a, b| a.y1.cmp(&b.y1)),
RoomSort::BottomMost => rooms.sort_by(|a, b| b.y2.cmp(&a.y2)),
RoomSort::Central => {
let map_center =
rltk::Point::new(build_data.map.width / 2, build_data.map.height / 2);
let center_sort = |a: &Rect, b: &Rect| {
let a_center = a.center();
let a_center_pt = rltk::Point::new(a_center.0, a_center.1);
let b_center = b.center();
let b_center_pt = rltk::Point::new(b_center.0, b_center.1);
let distance_a =
rltk::DistanceAlg::Pythagoras.distance2d(a_center_pt, map_center);
let distance_b =
rltk::DistanceAlg::Pythagoras.distance2d(b_center_pt, map_center);
distance_a.partial_cmp(&distance_b).unwrap()
};
rooms.sort_by(center_sort);
}
}
}
}