mod furniture; mod grid; mod player; mod room; use comfy::{random_i32, EngineContext}; use grid::Grid; use log::error; use player::Player; use room::Room; const MAX_ROOMS: i32 = 6; #[derive(Debug)] pub struct HouseState { current_room_id: usize, room_count: usize, rooms: Vec, //grid: Grid, player: Player, human_layer: bool //Human, magnetic, electric } impl HouseState { pub fn generate_new_house(ctx: &mut EngineContext<'_>) -> Self { let room_count = random_i32(2, MAX_ROOMS) as usize; let mut rooms = Vec::new(); for _ in 0 .. room_count { rooms.push(Room::new(ctx)); } let player = Player::new(rooms.first().unwrap()); HouseState { current_room_id: 0, room_count, rooms, player, human_layer: false } } } pub fn draw(state: &crate::State, _ctx: &comfy::EngineContext<'_>) { let Some(house) = state.house() else { error!("How can I render a house when I'm not in one?!?"); return; }; //Draw House house .rooms .get(house.current_room_id) .unwrap() .draw(house.human_layer, house.player.can_see_metal(0.1)); //Draw Grid //state.house.grid.draw(); //Draw Player house.player.draw(); } pub fn update(state: &mut crate::State, ctx: &mut comfy::EngineContext<'_>) { let house = state.house_mut(ctx); let current_room = house.rooms.get(house.current_room_id).unwrap(); house.player.update(¤t_room.grid); if house.player.is_moving_to_right_room(current_room) { if house.current_room_id < (house.room_count - 1) { house.current_room_id += 1; let current_room = house.rooms.get(house.current_room_id).unwrap(); house.player.reset_on_room(current_room, true); } else { house.player.reset_on_room(current_room, false); } } else if house.player.is_moving_to_left_room(current_room) { if house.current_room_id > 0 { house.current_room_id -= 1; let current_room = house.rooms.get(house.current_room_id).unwrap(); house.player.reset_on_room(current_room, false); } else { house.player.reset_on_room(current_room, true); } } }