2024-07-07 11:38:13 +02:00
|
|
|
use comfy::{
|
|
|
|
draw_rect_outline, draw_sprite, error, random_i32, vec2, EngineContext, HashSet,
|
|
|
|
Vec2, GREEN, RED, WHITE
|
|
|
|
};
|
|
|
|
|
|
|
|
use crate::game;
|
2024-07-07 00:01:46 +02:00
|
|
|
|
2024-07-07 10:04:29 +02:00
|
|
|
use super::{furniture::Furniture, grid::Grid};
|
2024-07-07 00:01:46 +02:00
|
|
|
|
2024-07-07 10:04:29 +02:00
|
|
|
pub const SCALE: f32 = 4.0;
|
|
|
|
|
|
|
|
#[derive(Debug, PartialEq)]
|
2024-07-07 00:01:46 +02:00
|
|
|
enum RoomType {
|
|
|
|
Kitchen,
|
|
|
|
Bath,
|
|
|
|
Toilett,
|
|
|
|
LivingRoom,
|
|
|
|
SleepingRoom
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct Room {
|
|
|
|
room_type: RoomType,
|
2024-07-07 00:48:37 +02:00
|
|
|
pub size: (u8, u8), //(width, height)
|
2024-07-07 10:04:29 +02:00
|
|
|
pub grid: Grid,
|
2024-07-07 11:38:13 +02:00
|
|
|
furnitures: Vec<(Vec2, Vec2, Furniture)> //(pos, size, furniture)
|
2024-07-07 00:01:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
impl RoomType {
|
|
|
|
pub fn random() -> Self {
|
|
|
|
match random_i32(0, 4) {
|
|
|
|
0 => RoomType::Kitchen,
|
|
|
|
1 => RoomType::Bath,
|
|
|
|
2 => RoomType::Toilett,
|
|
|
|
3 => RoomType::LivingRoom,
|
|
|
|
4 => RoomType::SleepingRoom,
|
|
|
|
_ => panic!("Somehow you where unlucky and got a random number out of range")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Room {
|
2024-07-07 11:38:13 +02:00
|
|
|
pub fn new(ctx: &mut EngineContext<'_>) -> Self {
|
2024-07-07 00:01:46 +02:00
|
|
|
let room_type = RoomType::random();
|
|
|
|
let size = Self::random_size(&room_type);
|
|
|
|
|
2024-07-07 11:38:13 +02:00
|
|
|
let mut furnitures = Vec::new();
|
2024-07-07 10:04:29 +02:00
|
|
|
|
|
|
|
if room_type == RoomType::Kitchen {
|
2024-07-07 11:38:13 +02:00
|
|
|
furnitures.push((
|
|
|
|
vec2(0.0, 0.0),
|
|
|
|
vec2(1.0, 2.0),
|
|
|
|
Furniture::new("kitchen", "fridge", ctx)
|
|
|
|
));
|
|
|
|
furnitures.push((
|
|
|
|
vec2(1.0, 0.0),
|
|
|
|
vec2(1.0, 1.0),
|
|
|
|
Furniture::new("kitchen", "dishwasher", ctx)
|
|
|
|
));
|
|
|
|
furnitures.push((
|
|
|
|
vec2(1.0, 1.0),
|
|
|
|
vec2(0.75, 0.75),
|
|
|
|
Furniture::new("kitchen", "blender", ctx)
|
|
|
|
));
|
2024-07-07 10:04:29 +02:00
|
|
|
}
|
|
|
|
|
2024-07-07 11:38:13 +02:00
|
|
|
Room {
|
|
|
|
room_type,
|
|
|
|
size,
|
|
|
|
grid: Self::create_grid(size.0, size.1),
|
|
|
|
furnitures
|
|
|
|
}
|
|
|
|
}
|
2024-07-07 00:01:46 +02:00
|
|
|
|
|
|
|
fn random_size(room_type: &RoomType) -> (u8, u8) {
|
|
|
|
match room_type {
|
2024-07-07 11:38:13 +02:00
|
|
|
RoomType::Kitchen | RoomType::LivingRoom => (random_i32(5, 8) as u8, 3),
|
|
|
|
RoomType::Bath | RoomType::SleepingRoom => (random_i32(4, 6) as u8, 3),
|
|
|
|
RoomType::Toilett => (random_i32(2, 3) as u8, 3)
|
2024-07-07 00:01:46 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-07-07 11:38:13 +02:00
|
|
|
fn create_grid(width: u8, height: u8) -> Grid {
|
2024-07-07 00:48:37 +02:00
|
|
|
error!("START GRID CREATION!");
|
2024-07-07 00:01:46 +02:00
|
|
|
let left_border = width as f32 / 2.0;
|
|
|
|
let lower_border = height as f32 / 2.0;
|
|
|
|
|
|
|
|
//Lower Cable
|
|
|
|
let lower_cable_y = height as f32 / 6.0;
|
|
|
|
let mut current_x = -0.5;
|
|
|
|
|
|
|
|
let mut nodes = Vec::new();
|
2024-07-07 00:48:37 +02:00
|
|
|
let max_offset = ((width / 2) as i32).max(1);
|
|
|
|
|
2024-07-07 00:01:46 +02:00
|
|
|
while current_x < width as f32 {
|
2024-07-07 11:38:13 +02:00
|
|
|
nodes.push(vec2(
|
|
|
|
(current_x - left_border) * SCALE,
|
|
|
|
(lower_cable_y - lower_border) * SCALE
|
|
|
|
));
|
2024-07-07 00:48:37 +02:00
|
|
|
current_x += random_i32(1, max_offset) as f32;
|
2024-07-07 00:01:46 +02:00
|
|
|
}
|
|
|
|
current_x = width as f32 + 0.5;
|
2024-07-07 11:38:13 +02:00
|
|
|
nodes.push(vec2(
|
|
|
|
(current_x - left_border) * SCALE,
|
|
|
|
(lower_cable_y - lower_border) * SCALE
|
|
|
|
));
|
2024-07-07 00:01:46 +02:00
|
|
|
|
|
|
|
let mut connections = Vec::new();
|
2024-07-07 11:38:13 +02:00
|
|
|
for i in 1 .. nodes.len() {
|
|
|
|
connections.push((i - 1, i));
|
2024-07-07 00:01:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//Lamps
|
|
|
|
let upper_cable_y = height as f32 - 0.25;
|
|
|
|
let max_lamps = (width as f32 / 2.5).round() as i32;
|
|
|
|
let lamp_amount = random_i32(1, max_lamps + 1);
|
2024-07-07 11:38:13 +02:00
|
|
|
let node_indices: HashSet<usize> = (0 .. lamp_amount)
|
|
|
|
.map(|_| random_i32(1, nodes.len() as i32 - 1) as usize)
|
|
|
|
.collect();
|
|
|
|
|
2024-07-07 00:01:46 +02:00
|
|
|
let last_lower_node_index = nodes.len();
|
|
|
|
for (i, index) in node_indices.iter().enumerate() {
|
2024-07-07 11:38:13 +02:00
|
|
|
nodes.push(vec2(
|
|
|
|
nodes.get(*index).unwrap().x,
|
|
|
|
(upper_cable_y - lower_border) * SCALE
|
|
|
|
));
|
2024-07-07 00:01:46 +02:00
|
|
|
connections.push((*index, last_lower_node_index + i));
|
|
|
|
}
|
|
|
|
|
|
|
|
Grid::new(nodes, connections)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn draw(&self) {
|
|
|
|
let (width, height) = self.size;
|
|
|
|
|
2024-07-07 11:38:13 +02:00
|
|
|
draw_rect_outline(
|
|
|
|
vec2(0.0, 0.0),
|
|
|
|
vec2(width as f32 * SCALE, height as f32 * SCALE),
|
|
|
|
0.3,
|
|
|
|
RED,
|
|
|
|
game::ZLayer::MapMax.into()
|
|
|
|
);
|
|
|
|
|
|
|
|
for (pos, size, furniture) in &self.furnitures {
|
|
|
|
let mut pos = *pos - vec2(width as f32 / 2.0, height as f32 / 2.0);
|
|
|
|
pos += *size * 0.5;
|
|
|
|
|
|
|
|
if let Some(texture) = furniture.get_human_texture_handle() {
|
|
|
|
draw_sprite(
|
|
|
|
texture,
|
|
|
|
pos * SCALE,
|
|
|
|
WHITE,
|
|
|
|
game::ZLayer::MapMax.into(),
|
|
|
|
*size * SCALE
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
draw_rect_outline(
|
|
|
|
pos * SCALE,
|
|
|
|
*size * SCALE,
|
|
|
|
0.3,
|
|
|
|
GREEN,
|
|
|
|
game::ZLayer::MapMax.into()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
2024-07-07 00:01:46 +02:00
|
|
|
|
|
|
|
self.grid.draw();
|
|
|
|
}
|
|
|
|
}
|