From f3e6afc1799f5979e1460ef33f9137f97632ea6d Mon Sep 17 00:00:00 2001 From: Glaeder Date: Sun, 7 Jul 2024 00:01:46 +0200 Subject: [PATCH 01/16] Added room and grid creation --- src/activities/house/grid.rs | 4 ++ src/activities/house/mod.rs | 12 +++- src/activities/house/room.rs | 110 +++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 src/activities/house/room.rs diff --git a/src/activities/house/grid.rs b/src/activities/house/grid.rs index 114eace..06d08cf 100644 --- a/src/activities/house/grid.rs +++ b/src/activities/house/grid.rs @@ -13,6 +13,10 @@ impl Default for Grid { } impl Grid { + pub fn new(nodes: Vec, connections: Vec<(usize, usize)>) -> Self { + Grid { nodes, connections } + } + fn load() -> Self { let mut grid = Self { nodes: vec![ diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index 643e666..32a0856 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -1,23 +1,29 @@ mod grid; mod player; +mod room; use grid::Grid; use player::Player; +use room::Room; #[derive(Debug, Default)] pub struct HouseState { - grid: Grid, + room: Room, + //grid: Grid, player: Player } pub fn draw(state: &crate::State, _engine: &comfy::EngineContext) { + //Draw House + state.house.room.draw(); + //Draw Grid - state.house.grid.draw(); + //state.house.grid.draw(); //Draw Player state.house.player.draw(); } pub fn update(state: &mut crate::State, _engine: &mut comfy::EngineContext) { - state.house.player.update(&state.house.grid); + state.house.player.update(&state.house.room.grid); } diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs new file mode 100644 index 0000000..fd9dbb2 --- /dev/null +++ b/src/activities/house/room.rs @@ -0,0 +1,110 @@ +use comfy::*; + +use super::grid::Grid; + +#[derive(Debug)] +enum RoomType { + Kitchen, + Bath, + Toilett, + LivingRoom, + SleepingRoom +} + +#[derive(Debug)] +pub struct Room { + room_type: RoomType, + size: (u8, u8), //(width, height) + pub grid: Grid +} + +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 Default for Room { + fn default() -> Self { + Room::load() //Just for testing purposes + } +} + +impl Room { + pub fn load() -> Self { + let room_type = RoomType::random(); + let size = Self::random_size(&room_type); + + + + Room { room_type, size, grid: Self::create_grid(size.0, size.1)} + } + + fn random_size(room_type: &RoomType) -> (u8, u8) { + match room_type { + 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(1, 3) as u8, 3) + } + } + } + + fn create_grid(width: u8, height: u8) -> Grid{ + let left_border = width as f32 / 2.0; + let lower_border = height as f32 / 2.0; + let scale = 4.0; + + //Lower Cable + let lower_cable_y = height as f32 / 6.0; + let mut current_x = -0.5; + + let mut nodes = Vec::new(); + while current_x < width as f32 { + nodes.push(vec2((current_x - left_border) * scale, (lower_cable_y - lower_border) * scale)); + current_x += random_i32(1, (width / 2) as i32) as f32; + } + current_x = width as f32 + 0.5; + nodes.push(vec2((current_x - left_border) * scale, (lower_cable_y - lower_border) * scale)); + + let mut connections = Vec::new(); + for i in 1..nodes.len() { + connections.push((i-1, i)); + } + + //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); + let node_indices: HashSet = (0..lamp_amount).map(|_| random_i32(1, nodes.len() as i32 - 1) as usize).collect(); + + let last_lower_node_index = nodes.len(); + for (i, index) in node_indices.iter().enumerate() { + nodes.push(vec2(nodes.get(*index).unwrap().x,(upper_cable_y - lower_border) * scale)); + connections.push((*index, last_lower_node_index + i)); + } + + Grid::new(nodes, connections) + } + + pub fn draw(&self) { + let scale = 4.0; + let (width, height) = self.size; + let (width, height) = (width as f32 * scale, height as f32 * scale); + + draw_rect_outline(vec2(0.0, 0.0), vec2(width, height), 0.3, RED, 0); + + self.grid.draw(); + } +} -- 2.45.2 From 0a7e741207c934b83ffc44cd81a8277f8d507472 Mon Sep 17 00:00:00 2001 From: Glaeder Date: Sun, 7 Jul 2024 00:48:37 +0200 Subject: [PATCH 02/16] WIP room movement --- src/activities/house/grid.rs | 5 +++- src/activities/house/mod.rs | 18 ++++++++++++- src/activities/house/player.rs | 49 ++++++++++++++++++++++++++-------- src/activities/house/room.rs | 11 ++++---- src/activities/mod.rs | 4 +-- 5 files changed, 67 insertions(+), 20 deletions(-) diff --git a/src/activities/house/grid.rs b/src/activities/house/grid.rs index 17bac26..55839f0 100644 --- a/src/activities/house/grid.rs +++ b/src/activities/house/grid.rs @@ -14,7 +14,10 @@ impl Default for Grid { impl Grid { pub fn new(nodes: Vec, connections: Vec<(usize, usize)>) -> Self { - Grid { nodes, connections } + let mut grid = Grid { nodes, connections }; + grid.sanitize(); + + grid } fn load() -> Self { diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index 76daac1..f695945 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -6,13 +6,21 @@ use grid::Grid; use player::Player; use room::Room; -#[derive(Debug, Default)] +#[derive(Debug)] pub struct HouseState { room: Room, //grid: Grid, player: Player } +impl Default for HouseState { + fn default() -> Self { + let room = Room::default(); + let player = Player::new(&room); + Self { room, player} + } +} + pub fn draw(state: &crate::State, _engine: &comfy::EngineContext<'_>) { //Draw House state.house.room.draw(); @@ -26,4 +34,12 @@ pub fn draw(state: &crate::State, _engine: &comfy::EngineContext<'_>) { pub fn update(state: &mut crate::State, _engine: &mut comfy::EngineContext<'_>) { state.house.player.update(&state.house.room.grid); + + if state.house.player.is_moving_to_right_room(&state.house.room) { + state.house.room = Room::default(); + state.house.player.reset_on_room(&state.house.room, true); + } else if state.house.player.is_moving_to_left_room(&state.house.room) { + state.house.room = Room::default(); + state.house.player.reset_on_room(&state.house.room, false); + } } diff --git a/src/activities/house/player.rs b/src/activities/house/player.rs index e7bc726..7ba89fb 100644 --- a/src/activities/house/player.rs +++ b/src/activities/house/player.rs @@ -1,4 +1,4 @@ -use super::Grid; +use super::{room::Room, Grid}; use comfy::{delta, draw_circle, is_key_down, vec2, KeyCode, Vec2, RED}; use std::collections::HashSet; @@ -10,20 +10,21 @@ pub struct Player { next_connections: Vec } -impl Default for Player { - fn default() -> Self { - Self { - position: Default::default(), - speed: 10.0, - connection: 0, - next_connections: vec![1, 2, 3] - } - } -} impl Player { + pub fn new(room: &Room) -> Self { + let scale = 4.0; + Player { + position: vec2(((0.25) - room.size.0 as f32 / 2.0) * scale, room.grid.nodes.get(0).unwrap().y), + speed: 10.0, + connection: 0, + next_connections: vec![1], + } + } + pub fn draw(&self) { draw_circle(self.position, 0.5, RED, 0); } + pub fn update(&mut self, grid: &Grid) { let allowed_movement = get_allowed_movement(self, grid); @@ -33,6 +34,32 @@ impl Player { snap_to_closest_node(self, grid); } } + + pub fn is_moving_to_right_room(&self, room: &Room) -> bool { + let scale = 4.0; + + self.position.x > (room.size.0 as f32 / 2.0) * scale + } + + pub fn is_moving_to_left_room(&self, room: &Room) -> bool { + let scale = 4.0; + + self.position.x < -(room.size.0 as f32 / 2.0) * scale + } + + pub fn reset_on_room(&mut self, room: &Room, place_left: bool) { + let scale = 4.0; + let offset = 0.1; + let x = if place_left { + (offset - room.size.0 as f32 / 2.0) * scale + } else { + (room.size.0 as f32 / 2.0 - offset) * scale + }; + + self.position = vec2(x, room.grid.nodes.get(0).unwrap().y); + self.connection = 0; + self.next_connections = vec![1]; + } } fn move_player(player: &mut Player, allowed_movement: (bool, bool, bool, bool)) { diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index fd9dbb2..60e3cde 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -14,7 +14,7 @@ enum RoomType { #[derive(Debug)] pub struct Room { room_type: RoomType, - size: (u8, u8), //(width, height) + pub size: (u8, u8), //(width, height) pub grid: Grid } @@ -42,8 +42,6 @@ impl Room { let room_type = RoomType::random(); let size = Self::random_size(&room_type); - - Room { room_type, size, grid: Self::create_grid(size.0, size.1)} } @@ -56,12 +54,13 @@ impl Room { (random_i32(4, 6) as u8, 3) } RoomType::Toilett => { - (random_i32(1, 3) as u8, 3) + (random_i32(2, 3) as u8, 3) } } } fn create_grid(width: u8, height: u8) -> Grid{ + error!("START GRID CREATION!"); let left_border = width as f32 / 2.0; let lower_border = height as f32 / 2.0; let scale = 4.0; @@ -71,9 +70,11 @@ impl Room { let mut current_x = -0.5; let mut nodes = Vec::new(); + let max_offset = ((width / 2) as i32).max(1); + while current_x < width as f32 { nodes.push(vec2((current_x - left_border) * scale, (lower_cable_y - lower_border) * scale)); - current_x += random_i32(1, (width / 2) as i32) as f32; + current_x += random_i32(1, max_offset) as f32; } current_x = width as f32 + 0.5; nodes.push(vec2((current_x - left_border) * scale, (lower_cable_y - lower_border) * scale)); diff --git a/src/activities/mod.rs b/src/activities/mod.rs index b3ad872..dfa2b9e 100644 --- a/src/activities/mod.rs +++ b/src/activities/mod.rs @@ -3,8 +3,8 @@ pub mod overworld; #[derive(Debug, Default)] pub enum Activity { - #[allow(dead_code)] - House, #[default] + House, + #[allow(dead_code)] Overworld } -- 2.45.2 From a83653352ab31f0dbe722710c37e4019130d8b78 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 00:46:05 +0200 Subject: [PATCH 03/16] Add Furniture struct --- assets/furniture/.gitkeep | 0 src/activities/house/furniture.rs | 90 +++++++++++++++++++++++++++++++ src/activities/house/mod.rs | 1 + 3 files changed, 91 insertions(+) create mode 100644 assets/furniture/.gitkeep create mode 100644 src/activities/house/furniture.rs diff --git a/assets/furniture/.gitkeep b/assets/furniture/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/activities/house/furniture.rs b/src/activities/house/furniture.rs new file mode 100644 index 0000000..139c178 --- /dev/null +++ b/src/activities/house/furniture.rs @@ -0,0 +1,90 @@ +use comfy::{error, texture_id, EngineContext, HashSet, Lazy, Mutex, TextureHandle}; +use std::{fs, io, sync::Arc}; + +static ASSETS_LOADED: Lazy>>> = + Lazy::new(|| Arc::new(Mutex::new(HashSet::new()))); + +struct FurnitureAsset { + folder: String, + name: String +} + +struct FurnitureTextureHandles { + human: Option, + magnet: Option, + elec: Option +} + +impl FurnitureAsset { + fn asset_path(&self) -> String { + format!("{}/{}.png", self.folder, self.name) + } + + fn asset_path_magnet(&self) -> String { + format!("{}/magnet/{}.png", self.folder, self.name) + } + + fn asset_path_elec(&self) -> String { + format!("{}/elec/{}.png", self.folder, self.name) + } + + fn load_asset_path( + &self, + path: String, + ctx: &mut EngineContext<'_> + ) -> Option { + let mut loaded = ASSETS_LOADED.lock(); + if loaded.contains(&path) { + return None; + } + let bytes = match fs::read(format!( + "{}/assets/furniture/{path}", + env!("CARGO_MANIFEST_DIR") + )) { + Ok(bytes) => bytes, + Err(err) if err.kind() == io::ErrorKind::NotFound => return None, + Err(err) => { + error!("Failed to load asset {path:?}: {err}"); + return None; + } + }; + ctx.load_texture_from_bytes(&path, &bytes); + let handle = texture_id(&path); + loaded.insert(path); + Some(handle) + } + + /// Attempt to load the assets. Silently ignore missing assets. + fn load_assets(&self, ctx: &mut EngineContext<'_>) -> FurnitureTextureHandles { + FurnitureTextureHandles { + human: self.load_asset_path(self.asset_path(), ctx), + magnet: self.load_asset_path(self.asset_path_magnet(), ctx), + elec: self.load_asset_path(self.asset_path_elec(), ctx) + } + } +} + +pub struct Furniture { + asset: FurnitureAsset, + handles: FurnitureTextureHandles, + on: Box bool> +} + +impl Furniture { + pub fn new, N: Into>( + folder: F, + name: N, + ctx: &mut EngineContext<'_> + ) -> Self { + let asset = FurnitureAsset { + folder: folder.into(), + name: name.into() + }; + let handles = asset.load_assets(ctx); + Self { + asset, + handles, + on: Box::new(|| false) + } + } +} diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index f695945..96e19cf 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -1,3 +1,4 @@ +mod furniture; mod grid; mod player; mod room; -- 2.45.2 From aa4ad84403af742ae3fc7766e0efdb41da5b4ca7 Mon Sep 17 00:00:00 2001 From: Fredi Date: Sun, 7 Jul 2024 01:52:43 +0200 Subject: [PATCH 04/16] kitchen_textures --- assets/furniture/blender.png | Bin 0 -> 6533 bytes assets/furniture/cupboard.png | Bin 0 -> 345828 bytes assets/furniture/dishwasher.png | Bin 0 -> 6045 bytes assets/furniture/drawer.png | Bin 0 -> 345826 bytes assets/furniture/drawer_cupboard.png | Bin 0 -> 6465 bytes assets/furniture/dryer.png | Bin 0 -> 13166 bytes assets/furniture/elec/blender.png | Bin 0 -> 4705 bytes assets/furniture/elec/dishwasher.png | Bin 0 -> 5404 bytes assets/furniture/elec/dryer.png | Bin 0 -> 7593 bytes assets/furniture/elec/fridge.png | Bin 0 -> 5627 bytes assets/furniture/elec/kettle.png | Bin 0 -> 4769 bytes assets/furniture/elec/minifridge.png | Bin 0 -> 5272 bytes assets/furniture/elec/oven.png | Bin 0 -> 5141 bytes assets/furniture/elec/stove.png | Bin 0 -> 4538 bytes assets/furniture/elec/toaster.png | Bin 0 -> 128714 bytes assets/furniture/elec/washing_machine.png | Bin 0 -> 6968 bytes assets/furniture/fridge.png | Bin 0 -> 13871 bytes assets/furniture/hanging_cupboard.png | Bin 0 -> 304832 bytes assets/furniture/kettle.png | Bin 0 -> 7737 bytes assets/furniture/metal/blender.png | Bin 0 -> 4752 bytes assets/furniture/metal/cupboard.png | Bin 0 -> 5375 bytes assets/furniture/metal/dishwasher.png | Bin 0 -> 5462 bytes assets/furniture/metal/drawer.png | Bin 0 -> 345826 bytes assets/furniture/metal/drawer_cupboard.png | Bin 0 -> 5922 bytes assets/furniture/metal/dryer.png | Bin 0 -> 10726 bytes assets/furniture/metal/fridge.png | Bin 0 -> 10852 bytes assets/furniture/metal/hanging_cupboard.png | Bin 0 -> 304832 bytes assets/furniture/metal/kettle.png | Bin 0 -> 4754 bytes assets/furniture/metal/minifridge.png | Bin 0 -> 7163 bytes assets/furniture/metal/oven.png | Bin 0 -> 5425 bytes assets/furniture/metal/sink.png | Bin 0 -> 5520 bytes assets/furniture/metal/stove.png | Bin 0 -> 4546 bytes assets/furniture/metal/toaster.png | Bin 0 -> 128715 bytes assets/furniture/metal/washing_machine.png | Bin 0 -> 8796 bytes assets/furniture/minifridge.png | Bin 0 -> 5430 bytes assets/furniture/oven.png | Bin 0 -> 9790 bytes assets/furniture/sideboard_1.png | Bin 0 -> 4861 bytes assets/furniture/sideboard_2.png | Bin 0 -> 4974 bytes assets/furniture/sideboard_3.png | Bin 0 -> 304832 bytes assets/furniture/sideboard_3.png.png | Bin 0 -> 5002 bytes assets/furniture/sink.png | Bin 0 -> 5813 bytes assets/furniture/stove.png | Bin 0 -> 4508 bytes assets/furniture/toaster.png | Bin 0 -> 128716 bytes assets/furniture/washing_machine.png | Bin 0 -> 16449 bytes 44 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/furniture/blender.png create mode 100644 assets/furniture/cupboard.png create mode 100644 assets/furniture/dishwasher.png create mode 100644 assets/furniture/drawer.png create mode 100644 assets/furniture/drawer_cupboard.png create mode 100644 assets/furniture/dryer.png create mode 100644 assets/furniture/elec/blender.png create mode 100644 assets/furniture/elec/dishwasher.png create mode 100644 assets/furniture/elec/dryer.png create mode 100644 assets/furniture/elec/fridge.png create mode 100644 assets/furniture/elec/kettle.png create mode 100644 assets/furniture/elec/minifridge.png create mode 100644 assets/furniture/elec/oven.png create mode 100644 assets/furniture/elec/stove.png create mode 100644 assets/furniture/elec/toaster.png create mode 100644 assets/furniture/elec/washing_machine.png create mode 100644 assets/furniture/fridge.png create mode 100644 assets/furniture/hanging_cupboard.png create mode 100644 assets/furniture/kettle.png create mode 100644 assets/furniture/metal/blender.png create mode 100644 assets/furniture/metal/cupboard.png create mode 100644 assets/furniture/metal/dishwasher.png create mode 100644 assets/furniture/metal/drawer.png create mode 100644 assets/furniture/metal/drawer_cupboard.png create mode 100644 assets/furniture/metal/dryer.png create mode 100644 assets/furniture/metal/fridge.png create mode 100644 assets/furniture/metal/hanging_cupboard.png create mode 100644 assets/furniture/metal/kettle.png create mode 100644 assets/furniture/metal/minifridge.png create mode 100644 assets/furniture/metal/oven.png create mode 100644 assets/furniture/metal/sink.png create mode 100644 assets/furniture/metal/stove.png create mode 100644 assets/furniture/metal/toaster.png create mode 100644 assets/furniture/metal/washing_machine.png create mode 100644 assets/furniture/minifridge.png create mode 100644 assets/furniture/oven.png create mode 100644 assets/furniture/sideboard_1.png create mode 100644 assets/furniture/sideboard_2.png create mode 100644 assets/furniture/sideboard_3.png create mode 100644 assets/furniture/sideboard_3.png.png create mode 100644 assets/furniture/sink.png create mode 100644 assets/furniture/stove.png create mode 100644 assets/furniture/toaster.png create mode 100644 assets/furniture/washing_machine.png diff --git a/assets/furniture/blender.png b/assets/furniture/blender.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe9e9cdce159284f9e97bede01d7575bd69217a GIT binary patch literal 6533 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 literal 0 HcmV?d00001 diff --git a/assets/furniture/cupboard.png b/assets/furniture/cupboard.png new file mode 100644 index 0000000000000000000000000000000000000000..f35cf2b25c24083498e716da738049b3eb94e03e GIT binary patch literal 345828 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 ZJ!gKWZRVV>i9H+UEU5p%`Cq^G{{dg^k2U}R literal 0 HcmV?d00001 diff --git a/assets/furniture/dishwasher.png b/assets/furniture/dishwasher.png new file mode 100644 index 0000000000000000000000000000000000000000..e804519b1454b43f1340d572e352e871bd127150 GIT binary patch literal 6045 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 B>B|5B literal 0 HcmV?d00001 diff --git a/assets/furniture/drawer.png b/assets/furniture/drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..fa924d2099c80d45d535a678d2f36e4d15abdffc GIT binary patch literal 345826 zcmeI*4RloHoyYMTLBOD`5%2}eGDg$2)JZ0jkc6BhG!m4o1|wo)*jk+=6By0=3rW;9 z5ns?{SL7VZx)nifRj_s!Yq8Q*RHPMG$5N>5aj9AkcAH&bX%%p*MfN@e19xsFaV9f2 z_vQKCV@~G2JkNce&;Rl}^KvsjP&xO?vr;FgDvEMe`JA$Oijwj*_2;s2W7I8a51v_} z{(AMc`8RaT^L4pe+M4SF4SrWgPmAB>?+(-}O80*@R+gUgx@+7^pZtAE>0Or=y>ZFn zr)Ktlvh1$9n%$4KmVUcx^k<(RzUK|4e$02Dndr{A;D+kws?*>6^;h0`;HyW1=T@)T z*Y|Yaxo@U#a%E($Is9VF1$l3+dSpezMbAF}*#5NNzcsFSd;g-3Za+V8e%j9;di}9K z|7_m1>p#tUwm5k9O`iMxO`k8ksqwbYYYv`W^YqnkK0N28l*!BP`hLc{?|o&#TUGa# zzy9`^kDKTI_3uWto>hJ4n=ijmtxoLDz^qx7<+Emm=c3MF_1~>1o^$!N=ij&X_8Hb;w=B_&ZoQd~OS~tC;_v5iIRc)#Y1kPM=_kDM+diK6m|Fz)41$Vpp z$3C&?@%8I6KKkXgr4Q`?+jm~SeeLyUY4y&EryEnR{?Vd0(tR0g=1lvb>ZOkD zSKWW@^UZhmN7`(1@*98F zcG{YSFaBim7k6Cn^_j0dzjOO(S8jj)^z;7Xtcu-tztz~^J8j(y3%*y>xB72h`}~6c zJ7;^>_#3~u@wfl;>FSbKcYOWr4_|%lqBEaV}G|3u~JjGktZgTbuv7+vd)%z3tZ88FlG1OHzxv3)K!9{T)76cVk0SdtrBR zdZ^z*^|9ETmF@~1(s65X`VAG8u361(epha0Zl=dQyF0Mhn_iOYDr&2%FPv9)#fdJ| zwc_+e9UU!&Sy^3OU71}unaynrv$AK*n33i2W_i7C^$2%+Pg94l+uhWDvFPG>A7%db z+O|MTN1(aMCHnN$GCp?UE%RHwp3J{?7pe}go5gk)$MD^%Fgs;H8y5xTeNq~ zUaWRNjT)%s^I_BVB0tnH$%_GJ5(&bEfobn0re{0;s__0V?p ztl1H#yt2Ha@?;A^urScr5^AMlM;zG^s6T}jF*dO$G#%|g)aEDqjW{|y_t3%WQ56-1 zWzDsnVtD0c#p&Ywg>}uffx5!b!|a-ZY=3^X$DLi9ljqKzo>$;5$n)j7r{~la)Ya5@ zJ=ryWO;_bj?H#_RTEFN@?L0G}_T%&APOr&i8t9Jo(;yk2kkKg*bK4xBYGH>Xj(^%=TpF9N#0#Qm9Twh4qQ+ zRP7+tLY+(DtTw-|qq%KNnl3 zRxa1=_hjc3czpisy8PV8-rJk&JGy*r{?di2qiUsIo*^sOrJ+K7Bl763MSf8Q70m6) zSN}T!Hr;aqEbGLCvqWZuXIzvuz@#X2fF@+rcE`7=;iYC_*2yqDVJ2e7z~w|O3_OF{ zH7AM77cRKs5{T^Adt8~YinynC#OZMv4Q{s2pA|p;24NY*9agG zDL~*vda#B70tN~YI0oX({T3I@|vKentFj-n?1q>+4ghs;ZQpo*qIdsumlC057k&4x$RIUAtDv$;lZs zY@#(1!6e#|X=%!oDN~dQ6DBC*$Bz%~K62!UvVZ@6W$)g-%E5yNBbtalCQh8F_UR8l0TP>(xc^4Gi1%-zy`<6} z6Ya5RBid>gec#%BJeEs<@R6(DgU(jm?5ADCo5jOj^lkNh54T_1*%xogU&YmXAI#3Qd7kjz7KB+e}o=xt?xU$o!{~a z5IFMHoEalvngD@g8ojkntp8-{@ZrP59-z26P`l{+*6!o6Tml4+T=gDww&JhBwabA6 z2ehkkJr;K&YZrar+I>8hOMt+UtKNgoR($n@b`gKNFx*AoR^Rt<`#sTaY0a}YCFfp% z1P4O%!~_VR#QYr7T72h?b`gIwCH{;d-bJ+0|GkyI?|A#cjvYG|`Z;vyP-vUjr+;Q6IuU*G z>}CL`)EoHP3aQIKaPs1NZNw)|`tQmS@5|`ln;F>p)E3d6@5njj!K32>Jj3Bi7$DHu z*{Q5txpKhEs{sc_*&tp%*+skXL*e?j_judamtXZ=r^iDAUZyD*zZ^(oR979;0)u{*`@tTR( zP0p&T8MEOvmKo}t69GvD2pmZZ&$JORLx8|BL!EOXAgKU>BWdB8HUee{5IAP2b4~;# z70?IH!!@6^I{ID!N$bqC5wM(qK71@UKn8>W0?rX2aGX<1W`cm_1qd9=mxuu(;2Z%0 z$2qlRCJ0zwfWWbQi5MUP&JiGRoKs6?f`H`(qz#;HCEqFKUI5EqpA68!0@8+$gKNsv z5U{KOfn(XyFfat1CqUphucpih0m}*yIF>C914F=h0tAlpYRZfdu&e-qW7*O$Fa(?@ zK;Ss9rjavxZP`EmGxq{Sny_XG0m8=;Wnd5p$RR-B$WdoziGU>p2pmh4fk7Z3hX8>i zN1d4^0+tXUa4b;<27!Pa0tAj6b!L_bSVDlnu|yddMB)NX_f$X0y#R?jj$jYLK5s7x zG=kuq3IW*#2prk30OpUt2nrB5BZ$qZ5RhGfz>)n5VEzbS2Ns7SfIwmb1Wsapv_=4d zI0OisIIuVr0R$2gAaD}%qcs8u#34Z7#DT@32q2J{0D+U3AFUBUAP#{T1LqHy?D~## z?gfa$heHuSz#xGb!^fbr(=7rBNF_kvNL6koi-5TT1dh4>oE-tF1PC0d%FSdEFjs)U zG1s57BOsLkfg@G9nJfb43J^Gv{ws2q%-~*tNE6l&FhqdxF@%*)5kMfC0D%)tg>48R zV2A*LV+bpqB7i_N0RktQ3fmAszz_if#}HOJMF4?l0t8Mp6}BOOfFS||jv=hp@3iFo z-@VPf0M@UQqemF*^Y)TJjxI5iL%>=B1dg@p!DtY0v;cwQ=<+f-1gs@M;8?33j0OQm z3lKPtE-#Zqz*+(Xj41W5QtSE*yrs{sjsg;7Hb2JLjVB;5)t4jPa=A>MF4@g z1PGkCxHuRA1QHP-a1zm@EdmI{B`{il^z!A)^_y5n009JsCD7X18qtntI1wDIAb^08 z0tAkcy0+?j!hdhOhkF5RRWh3omhiE80U165b`l_P>{Knrih#`p2ppRikl`a>CjkP- zPSs+p2-sYJz_ED&89oAb5+HEwR4vAefXxL69Ge%A;m0lT-n$#yxECO9w&XV;e3EZU zj|d9z#swy&LA*s zMgW223-DdX$v34(1S}!&@`tn2tb8v3&vqVM8FaP1db)jz#tHi zLxAr+mZQ$h5&=^L_}*hv*f}Wz2nYdQQgIz1fWU|e5I7@7&4~~|z>vUs)O{EKj{vSM z1P~ZnAlT>aH6($CJ}r9@KtNW30Uuk*3c_eJv}`HPgE^73ISeHaUDbzSi5$ul9Q7&XxKz+B!Wq_5p7uzh$cYbL{pJ` z+p=ZLl!k@|<>=9)aZ89cqOItI1p&PPFRAn*lCO(rC*tLieo0G9Q>ILrqD+`DK^Z@O zd}#NPBS)0|`}Zq*_wH2=9y}P)MD#In;zY&g^F?fDMQ#BCXPEVG$~)@~D}OJ*FsF60 znRx%Exw-k|diX(RW~MTA>eTS+$=@P`#E;mwXU`sG$BrE*_lXChucD$N-rtE(k$Z)g zS8~@sV)o+AV*N|1f`WpmVH43%T@j%pj@2%rFVQCp0$~9HCoCcPZ}IF#|H+hiW+OfZ zk985piZ?(MGh@F8aQ;`*hR&i!=8?~QBb?+`_}H`v0MTKj$HK~bhhHJ!L`eQ0|&ILaXl7y zC2JRb-`agVmP>%Zk*nT=&Q^T&gmw{s#xUGP-&WuEaQmg5{RIdd``0ijGZ5c%qg}+` zOo=~Th<6cf^nY)q?>pW;Io>$}1delRnb1tcmuiXcxzR4-@1)}Sv`HMR|Jy3jCtuj5 zRh9cOfg^YQBW5qYRBP0zQ4!m=ZQB;pGad2FMjWeML|>v$76ifq1Ws6j-=SwBD^{!+ zAR(T$Y~8vw6g=Y7t7FHGg?k4FDK%~10c?fJf(p@ihz$Fm(d>ptYHJ3Bj-l`B^c zc&RmHqZ2#DODfS;^udCFUVy;Si?ALN5YJA6!Qg;5m51UHZx)L-JhK@}N$!2Tq>{V- zL(X2j7qe!~n$VlT{I6t&q+(}`0t8NsP%-&P%G~IMNFO2*e;j z;KYE$AqY4~pzqQfZ??p}0ECZ&t}3R2faL{(ecoPD$MR)jfCxB8fWUE1Etv@dmKPv! zEMFo9h=6kh2ps3sl9?c2c>w~)@+D$`2slT8z;RA3nF#`x7Z{_F~VN3`( zRDi&7XknQa0#+0taI9Dr#)N=F1qd967M5utU_}7}$BI>9Ob9qsfWUERVU3?iORx81Q0MpAlT>aC3Os; zrBehDh$cYbL{niK0tgr)K;Rg{N~Z`Q5KVx)rBU81RD*`495I80mfYT!&lK_Du zQ?;2Z0wxO(I3^c>(<3000D&V@wV5jdCJUGwI4`W*d4&o00+?*h=@CFc6)-n^C;oE-tF1PC0d%FSdEFjs)UG1s57BOsLkfg@G9nJfb43J^FW z;vcB~^Dnp;U__`niERW3AKR3Qfg)gk0RqSVHDm?|*hYZBu}!HMC<68uAaLwoLuP=0 zZ3GA$+mwodB4B?30>}O}WCjS>Mu5PvO{r`#(5p86cpdiw*rHVC50daPzXpr|0eJ+1 zecoPDN1l2!Qv^&GAaG1C0Ruol9svSJo?0_g1WXqoa7-@&13*9?0Rl&!S~F7wOcx+< zOfLZgu$jO|e|YdU?gdCf(FmU;AkqZ_2*f5p;Kb&{Q3xQA1OWmk35axo00OZI5IC_p zaTEdwBtd|{Ndh8WAb>z@0t8NMP8@{*0!a`caFT#X7YH~}pzE`FryF@M0O8}rtA;rt zU{L`A$D)N{SO_>#fWUELRhbh478M|HELs?bg@6+U2plI?l{q0`Q2_$SqJ?2t2slxI zz;R+#nG*sQ6|iLBxSx6N9V71ruxKq976MWUSTcO1ssNKkKq3JGN1|dgRRqiyAaKmC z0Ov&pHm|sn*f0$Tg90#0wxL&I40sNInST>Rqh2a zvjUvkM1j$hCr^$zeNIkJ#5yYoAb`Md1%km~WYb`ux0k0pktVDmfPjGl1df5Ybd3N4 zkpcuxqz7vVAYh;Xfny*pT_b=%qyT{v>A@NT2pA|p;24NY*Q&s>Nq0QSy#QPaQ3ME| zC@5?~00CnJ2pnTv=@kJ4q6iQ;QBc@~00PDc5IDxT(klW8L=hlxqM)z|0R)T@AaIOv zrB?(Hh$2AXL_uK_0`UusD;t-=y#VpJ5kB!~aV!D|BqTuKB*aH!1Q3WvfWV1Ii(?T$ zARz$)Cm}u>BY;3W0t8MxS{#c20tpEaI0^C57y$(05g>5l(c)MH5U4*`y*(-S0uVl2 zOb8$_Vgdxth*5JQ1P~x_xCRhFV8jFnoDrkuLJbLI8n51?&_)gHD1S2q0h&fs|V=``%7c#~#IEln6LN zfWUD?8JPqE_7EU&>`^C1iGU*n2pmV0kx3w64*>$l9(7`r2slE3z_C^t|LI#F9#E8t z>&weZ=UZ!Jj0S-u3#fO!L@vQ#FmeNH2q1t!k_33RlO#yGK>&d-7a(xH+=wF(Kp;s1 k1WuA5=>`D=zFZ*X!puvS|FQB?ab)@Ixn=)y`OQoIA89w``=I&$Ff)u2%2;EOgrv^QoMALyW`-G5igx>2eNfpV z?N+jgSgFJ$sk~*eWU3`puBfae6@~VFX2|mHzSnO1zWZP2nsc3Vp67S}p8Nhi_kEu^ z+kL#385>y|ArJ^-mWP`k0x<~*&V`2hV8ndabT+tLj`a^z_(4jPR3_mIgfL1GBZX10 zO29`TR81nERVJ0F>4Tj!94FgOx)k}4+aNAzuiJAvA~y(4Abhi@AbwHLQ_F8{U1XXD z&+VJYf<_mztt^(BaHD=1+6Xh&DwZ1P|T!?Vpwf8B~94vwC&llO-0_$4zbG zw=G+y_d|)V+-9ytvXx>mU?IEf#k6Yc9-mc^UjB_ia?F!VPVB0sd$&h>Bh3$LEbkWD zN)57SMw(#~Z=B>|TR+f$Ch<17WExc)wAJN-X*>vSgTU3*hvn+}HXaZ~`i8x9k14)0 z-0Qp=^$3Bpd@gg0iizwQg^ly|<}BG}#5yfKAlx&%(kp@OSwUTUui@NB)SFGgw~Z3+ zPUeW9%y1jxvy{aNv)1&P_LmP1^laQ?I_>-;g;%0r|1T=rleWnVt_&umVqf=~`$c8Z zEOxpJRvl4#+%GfU5!5~SW?}i>XvLlxYlCr3pY6H1=~|MX?^CSVPx72e4YTq5dC3d* zSZ~SKyjmeWbM=RBW*4O1FG3k0K5M=dJgtk~tQRwR7S*d7LH7-FmAV%M&F@N5?l6vP zxcThpPn+kUe=J%&eQFXh#%P~ma@CTGIo?~OR==*T`SjS=OE)_)jN~V|M{f>oTQqPu zFJ-o=X5Nb}-}U_*)wb+nsd3wiTf+=lOAq&{Q$?oc`KeDYH5#aL*rEYMti!#boNR%k zv~cQ_-R_!zb;$;MNV8RrQ{z8;E&etxGhoQ<4R3_u`)6%a}#5{l&v6%(!F zWq^C_Fb<8m)%2gtRQDiI`i^sUD1kpsavk}Tk#^W>m+?I|~fF~w8T%nLM za5$w>iB*!Y5?L6IK&R7jcp{ES!~g_F9wSyjDvVfeqoo+(aD(MsnLw%#NW>^DC&ZCN zDVS(9m`AFZ1CmjP{?J1159$-=2g@Z< zGA`^M4T}{v<0*LDF?(s0OsETo$Hl=ySOlPQuqt7~lFL|ZpD_!q1YrV^RA&Xmo`6&c z_`iuY!8h%UE}Zd>0P`{43Fx=6>%aiTW;5I*+$gPkEH@@vyFP;_;R<*R-7OV{c{DnO zgCP)!1PmF^Ct>JZt^jl{IF?6uS7!HR{#q-EiG6_!}NAZPB0J0Jij`vDS#RF7)K13zKcp8R|r&BRxA_?3% zKqL&A2XRPr3IU=Kh&n1Bm$6hL6G31*1tKU6#!1Ctx(Th|3>P036HUb8e;e@;LJB@G zV4}SQ;waT`6aE4byj%fk)g(9&@gzKr>_DZFC`7`D&pN&USSAOVsO2Q!u_T(#T)Qm{ z5DX9&(&i~3(2avw7_KrHQb=U}5{ZzB)>5FfmSfXwP)={QU6* z2GM~*q1xk#4E#8}geTy~{25wXJSeA;E%y+}!TK?}p^=JO4o8kWjXVkkx>7=+bVb2{ zxFaFRp=g+=^Am85OmV{@aTpA`$7s5~9T)sTDsW(;1CM|wV~9iw*gppmNq!}3l{TZ}-+*rRK)lA!2|G{H4-TuK90QLJt-bvs0a=n-9ofLQ{ z@cZm~FV{OM@J`_O+4X;u%jmZ+Mpz8~=qbVXAo@7wGw>~`&-r|r8zK@Bfe4Dw*PH+& zA4old@qR}p&aRrH>vB8}ePkH$-OSD5hx~DeR;*9hp})BT6_GQS!v3~m zALG)Bnm8ytHJL53$f&A;=s*8xTb@qhomf*_Tg&fVgvDYf-<1r!86LdT8=wB+-D8F( zDB7mGVC|=`HbfZ>q?DGHK2$Iw<#LO&XU`IlCN^kvYW0{AnKU|mdt&00dDAMO z;h%smB6xKQKMxU-m_=W(TKmAVPRRaJJcZ z;ml*22>ND2lUxBc%{SYh!#I3lu=K_wvfX}9avFQyhpX(~l>Lx>t1G)#NVOUq94ss? zwQ6o|Ha906^t#{MOL)@L!*#N*8y<{RTgS!4MaITHK8~hcZiu6Hc6Mg>F8R*v)p}>j zg`y%0M@PrKb)7b>)4cGb2p&i#m6#t7ylylXglFa?y$+q=fFFLLg4|+95Q0C37fL_^k zK6^%_IM14Xw7Gj}vMmstLruFPr0&eh%JN9IJ>MdZfGx};V`2nRt}5o#Qw%0EsXlyP z?7Ui)lXpv6%;)ORek}5&bf74r*mC8{mD$}IJ3t?@dbN9Ta1`1c8L;Nj^TFYPm)*_R z+ZLo&*Z1`22@5jOH_vC?h$y~awfoaIUegmQtG>(%&TEYWp z&j0|%E@oP|c3;5dl4H`OQFFr{vcC2dX1|@(GZ?l06A~>>=fQu%H+|9F752LBPD_h> z){X6HX=&%w>ZE(pS?1;-=S)mZkNMkOxps|(L?X}0P_(YCC+fr9N?Sr-zpAWsb#ijL z{NhDaW7muMsnx!@nk@#x?A9zzgnMD&dJ47rbaVIonLFzvibGt?(lz9?n(zJX2#3Af zhFcyfEcbhUcBtk=uHhN~_|TsLL!*kCmNYy(e7mJ3sk^&-+cwq4jl1f@XY}{?6RdZ4 zzS*D--K|!uX-sAm#YM__#7yh!>uXef=d*3S^AXFo*4ACX>R+9Gdu>_M^%G0#z|lT1 zaGUu_L8j+AvSqfYvA({(;r7DooqdrC#lEIcily;N3%z;j^Fd`UA@gT|wvy+x44b+W z6z)!k>^U#3<^tWJ;9f;ZNy$OS*0#1aarswzu(ifQ zl~gQ|bnfbZ`SNDQI;FC|rew3RX>E185$?>HGdDB39)$JX>d+tZoN8EG6*xqRARau) zyaoJElTWd-POq%2ENQQ*sw(cZOj;_@(RpSz-01~sG|4d=m677Lm5FkhjHq<7-VNG_ zvM$Az^|&PGif)yP3YUG=4@wFv);`T&^UYV4(BqgKS;;R!c4q0PgY#w{^x}(8-s;Lb z-M~t=ja9ea37ngZOcll*!v&)!{?9Y>OY_SpL6lmJ?MKwd!mR@+3 zpPQTeeL!wL+OYPq{o#$}N6zmZIv^`S4sUF`4pNts7sn{yIJ^TmQFnRM-Sr`=98Hes z!`pt7w9Wr_RrD8%?(Y=m1lsl)+kqKv1yE7{^_qzAN=x*u!D>U z7=0~fZy4@865pY}g>_E$*=P3Nvu9@i<~NBoGSp#a;$cD{ z5X`#AHBAtRZG7-A#XtuwY>B%J;L;XoX60jo^A{w0c@T&syr9onGF}iLKqMd#0dL%l zPVS)yGHlN5RSVy4teSY%r&Q_vVl7>YE)w64$NOrzY=n#~^E6xQmbqR{Phov?*OR{T z-E;qLUH|2$d!$A`wMI8}hD*s<#m4EV$>c`uCq3dC+|zQ7GdqwF#MP#ORCY*KjJM%p ztWBmAY&oK2Nt6n7X2i@z$ezeIUL(1y-g z;%GWwp1t7Kv=8lfginQaSP@x&6jm2Z)X*@})zJ83L9mS6;7i!!G{$?idiDEh<*m4k zS{<0~Ar1Cc_KVXBsmCzs-X&iqC392s!wpU}qwU9E)Nr6*zOi}D6h5}y!3}rSd|m6yQSS<8#mVGLy~vzeDuLbKZ2M(8z6F1Bt@caBRoUq+ajBZZyAO?PK$W*ivRJ6 zI_8VkpErI;HD2=bN#1L3Bl|`)`DNJS1QX*08P;dsH@3atmLrIzNF?(|Rt&70lkc}z zWpdxin5Y({M~J>{vDx_v`xyRz5tyyJpu^VNan+X5~9^Z_>v+}03*O5>Y1t`k+rl{;vXv<58Bq|hfT za0jUD2;K9|y&&jn{>jPw)F7)HN0)h4S8=GF_2q7>tM{f?J$^gTC=g@qb$cICSQCL@ zIY|V|vNF(DcJy$Q!8v(2;AH~b$Y62^gzAw1GS2Y~-bc^@?@V-86P~Ya6c!{psR>&u z8ps)tHSjLP#$Q3k!^>G#9*f1w${}TuNNMOH?S0nW2Nxji?tOqN;+G6fytktlk?ceCa2KS? z#5s8Q`ltyD!*jtu=I2H>F!)ovyZ7%}0DZ^?;K;J_GIFwRZnA%W!`ny84}|UESrfdshp(3-Uds>f?sMSpBAgume4p&=Mf$lMCr4R43GW77y_?swQ zcW)n@yCa?|3WUoLK@Q##gTbJbFw%|=a!6?u)&V1pb3|jM33#L;7LAdUQ^FGdCgL|Q zB3LDk^!Hg&MLB^e0s)6sz{_Ezv2s|nGzzHzcS<+~X_OPrK>@2MkHg3#e~NN)RMz(J za>K!P65Vjlcv-T$^UnuVg)1L3(p3{i%EzZ@^y<%!qDyQy&~v zoAOFXIR!ZkN)9QnsEEQU{?*9>@8u1aNR=rsC!>J*`GmSH%CHzvERJfYAmC>^tVLPF z3y<^h@G|r8AgKvcrzA*y^Uucy;7(3BADkx62MEs$k7Go?u>`%@w>VH(N6qtOu+$g>a8x8< z70^fm-pS#g(!D(hKK?i_{4rE zC=c_y!esybOGKj_ot&^(1!*OM12_zd;2@2WCt#%=FlYyqf*i_0PT`m3{HehI-zEOC z3FJSQs47bhi+^mYs_g%@?Y}zwEsla}ezie-hHx+YXT1MiXE5J?=il$<_U{}*Q1Cy4 z{7d@%kGlS&u761b|5E4wSl55l^)G4QU+VlH>-t|)7t>!EBi{jqr`mQ|ar~BtoRLWS zDlc1>;w`D0E|#8S_QXY9PQ1ruFTIP+&a^PbAvxNsS<#mZwQN3YB=g4AqxWb=)z>zT zzO_LG^_>aba7@^0oF4Wcy@%T+5WLLBAmpSRu=V|`C|(TBDCBg%V4PLm1ry22!y**< zjLabP#F;uHCzf zOH1jPnVIFX^xuE@(ENSl>o&yFOmB2!5$0^Y%&IT0Y>*FXi8rI(s*5+{OyOg*%10y42Ok$$;@#74t zs;US?L_~y(hlfsZu-c6qH=Yd+O03t{`p-|K{&u)IUoD80n;Uy*bn?x;GbvyCGM{=K z5qM8SbLT}bXAjTQ$Sc84)rD0Lc1KmX4}DbZeX>%@s~Btt(^y+uE2ypAi0#c*Rm*;e z(HnUAGU~U(>zV}gv17+NdwSZRq#qLV&3p3XM6QazAwhL+Zf@=E=nwQEwY(iW_Z@#y zSXh`Evi^gABST_%Y4qOKp&(-EMxX)??Yh};>(;H5FVCK_o}!Ud(enkpWDUMw2|TyZ zOrMJ8MOZ!b5&MgvVTsa-mWe8$TW&*_B^&C`CU_X2I z?6XbX2LVGe+1e3xb*fGT!jmXVEiJ8!Zfofw4SnBg`-0U%?25i&se3%=ns)kj$Mn;j zE9-A^lswwU#sqiK(X<40m{gASr$~wdMqkQ&T9_eT)SI#zEUIg@h&_=Rw}=t zhDJn5ZgR4mB@87@YuFVK=TO5gGRZ+^#&*#_0iikM1&xxKs zS*IjKyQ&twq!SZ+WNoshMPHEGmZh9qEfl||!%#RLkN>f`p7LdEY%G3QukL<;hk8sN zZ(?I(W699S$l*VR+P;xbVcfYhHMj7_?b{u8KfYveKeP-EuAd#D9g5cAD~o35;1HFt zG&g_xy1w;H+}DGVuOE)LwzcUd%KP~F6;)Mvy_q+)ww8!ZDt_+5%E{RwW)O3LJ25AR zHzhSy)OV&QFUX;3`MQ1eAbD;Gt9#1JtI7eX!n(a@yqlj$B#O(*W-NO(Z2bs&H#KF@ zwbBT8*2|4|@1hRl$pS2%M=91dWFaIHDI)I)+Xkkek3HD)p|4D|l8g{Ma6scyB{^)= zaW*lbOW3ge$KZU=GT2M(Dbi-weWCy5^C~Cd6;3dFI~Qjb}l!zwzhs<>o2<$_ZA!Ubq=3x7bKs1Bv3`gZ?@^a+gl@3 z(}<`jx=j6p%gf8EiOve4KhCXfY#fl1+GT8P91|C3+FII>bmRvY!bRDSgbr18bP$V* zkXK2u3mD%qutRNYZ8E9y>=NPJ_mx*QexG?BJ$iIahJ&4pD~8kV92-PHLT`IMv(8f| zJl;4rGK_7DK?udC&cGb~*Qpa$Zblm#@}{A-mRC(p?fs`u5rZV{(9k1v^z`y5ROH6j zdB=bNt^)@S+_AY8u>77)TSq5!%VX*tt+TVU%RQT#nwqAkPnqG^=?LGkb8LKko2;xX zM9!vHuQ-4F_`$%ykgORjg5q=NSYBN%x_WiT!Bj>!H#czQx<*h$T4q-?(W)-jt8={v%yN@K`?eJM_EPX`QTve z$B!R7d{3V~{p^EJOiavCCnpgf<^2Nu%+ca`4Go9;U%o7=s9$go}QLCMd|3EhtU?6mLigp zcGuO{kApo!bZ;6S-tX@2PWJV^U{QXdx>_MOHzKO|6Ha@=YXhVun_3(k3 zvr7lvN9xwi4o*%?glom^6H-;>gYyKAy<=puob9PoWy}5;EVlXaV@8`>7WeD5BIw6t_h&{r94ZS5aEF0Vmlre%i5%KC6^7dfmd9d^{!)rr&buw+TN zk2WOmD!J<`#}<^8i4_$U!BI)|*U0GT-VdYmA3t7fi{tDnlD~iVZo&2Ij0p(|E-o%j z@OLGn%B5Sb}XaWyyR2oDdx6S(3Ehu*Yc@i?o#C*#J)fpT$a z>GalM{v_%~b#xq%kzpAb8M(1F7rGpdR8a7oA5nwYQt;>zkFT$9z>6oA#>Q+tx!8#Q zelr*;O7Am@56KN~VPs+wUR71ac!U!ytF={A%C2Fk!qO9V^ip>AMd-b}vNHbi*2!zv zu7y2zN(p}HdatOYgjQ5k^ti5WGav^xF0SLo&&dq!)-Qf6b_f{T*eH+BQ2jhDE%Mqm z@#r%L?Ck8EoSYyE(*P!`@tmZCa8Pqa`p_W_Yin*3Q`5?j?}0M6`p66mLC;nuCLFAV zk1%w-l#q~k_Gx8dVZpw5Tg=6a>Sktp@4F8(MKp)ObUibM_4M>$tc%^<`ryR45!Dm< zQIiD_Aam7%R%2DdG}P6TFJGpsKi%6NxSgM$zq7krlR!8KheL(!!|>HrzrmTFD@S%i zT!nqEQX^s#+dLY-M}avMHZ=T*)lR*1>AZQlMP+6F_WIMi>rW?rdUbp9#Z^7zm7}t zVZN$F7q8#qgcb^g5>!(1?@0;+1YTOTJ^jj+BXhkk`uZ-Vrc%cH_!i)0s@(yksyVlg zZ1uL;+MGFZDI=pJU5Y0$P+VM`%b&*1-d^y&$7teAeo$fps)KSf!!CqdUS3{YN-Ax| z@5|B>4w;pllhf5+G=B7X?SHakMR{W9JWig44-+=kmC+UA_x_pCpoqe@88RVN!MUfPrpC&m5q6$5 zSapH9OR;A4;+HQi z4Z$0r&!==%rl846kI}={HreHtx4i zasv^Wqvw_qZvOcEV04;R{+N#sY9wUC&HB62=(z|u#L%qFGaoSL*6z%b%-r2&G8!1$ zWwPROXr2-jSOgAtw-=6&U7r|?Ips*FBo@#z-Nej`?u?oM483~;X_s707Nrw zil>=jp0X(KiK%z*7TkpT)C~<2NiL$UiBU8igJWWI2S*_#Sw^YwO5uYCoOnDw7Ho=^78X$>Bd2*1>xB;9*~!S* ze8aqajV{?555c(VbmBDwp2R2I{QQ@n4wqcLYW&^FkoBG=946!AI3AW+7t6{4*S6Q` z5>fernH1K2j+QrXT9i{}5Bo7tBp?wFioUt|?K)Cd$gn zPDH!b*_g;~#iD~bIXTatKR-q><{cOqNb%Cw-*qlH_&T{r94>6^>#zG4}}-X1B=ZCqSL?R53wL+*WXQ=Wr; zee7^7mKMbpS=R-~tE#C9WJvFeBk{uuj`HyG3e8Q6&`J)TRlRf>-YNksH4!N<_mE#Er?HQnlSV^Odztbnsqyj)zwIrPmgT(dUrL-C0p z64?FG_IHO*tPKhMraJ|z^7izm#@x$6!B`mLy_ zFq1RpfJ;iQ`6MwXsu&R%7$|}d4Gq1Kacz%rZP9%q#z=ctZY6+qmgby~g-C zVhGjN=n`SggqSxR_Y5fKkzPi}7+f_O%y^Q|2)n_2o5scpN>o>`9T9R>@2|M##*?_6 zi-#vAjZ@0%=+qu_VOPt3G_%gOp~g@<6F-0dGOt)kwtI(MsWSk=K@_i~q$K(044CYl zoM-0Z)pCUJxh&BDl7R_-6U7f=K7K-KCVsu&sET?;`A7})|)(cbxafadlBCn5wX%-jF2dS}_3)z;eC61u&`T)T2kr zlG)-szx&?7g9o)uDsJ7n3QqTjgE}}m3K_P`3v!+hr*V&EZ>Kt`kspcAbMvIBsRo{1 zOW4)4tZ&eK7hiOzG(RV&n1rRJrRkvNrI_dXjWS(oqOPe?G#d5cTuh;r~*fWYimd9l4>FQS2 z9{qsI-E#i?=3dolLn2XPbUX4;+U3hn0+osm5;1<7_VxuNnHfmpx%Tg$dV7?R_WZdq zpu=qwLk0knnLF~W8$;?#Na!4Z{M}07-QsO+Z7J#37w;aYoDZg(dD7jT)}N>1&oVqb zeC|+Z{IlWV1TY2NkC5(tMtAOG))72(NY9Tj)t#kqPN6ei(6y_pYbWq5EQ9-4h#26T zDeVcoqQ2?r>1!X#uB`bb6Q=+XtK;!kOWY^h6Ec-N_?bH{LDB^T^5yFS>H@wrQxl`I`+0D!AyG6!TiWR#wY%JZ>*NC#y~|RC;~1oD{qi1lb#)Qn3l}Z`gL3XnXBu3n zSwa7W$jGs)8K=G0?t2!ghC#mbILZP76rPeS;ko?Yc+luXKNoYy`PhVnbmm*}+6OeO zSoKAhBe@=Xz{q|%x~Wl1yEG2T-_nOH4P1uOE|fX}=&iH2H#&3mf`$Z7PtCjO=_el> zHs(}%W?1zJBh$6>4LND0E*M$_D`ew97VDlmbLP-b3@OC!wYGq}d;k84j{xf6aSy;s z`xfT&6R}@TK5!rJzivw6L&}sH=B41D=^GgMzGn_W<(Bc;#MUOu+SW9^#?nr<)v!?v zHFb2n#kDABmHp<17^!&r)UjjRdQY;&tBIK#83|rrT3l>~X%1pge5$@&aR6~mEw%mmQLCemeyyk6gM^sI2?TdFcVO>^S9S`iK$X84TGfi<_LOh zomVohA8zoTu`r)FgB*0_c^6FPC5?QC7gc}~`BVdv*&pATXPk(j-~A*I4W2b#s1GU0 zmnVmAcj|XIRE|~m9-d6W&U$~?fV;du9t1=qUH4M6m&blWyC)O>;_$#M z)z(&e&lpm3%Dw%*A2$}pDOJ_RP4jxAwh55YRAh9ksj8A8tBavOtfHaAFnj z9lkd;gTD^@PrCcQzITT6>md2~jy4ht9KVgTv*utXhrhi)pv@AgEW8rD{9FfF4Uw|> z$M+2)8gRuNSL^83kFTB&?$6B3OuqGK#0$z^U@2_)zIxKSq~SQoCIc=~6*ki}zewV82#=z<*V;#=;=jL|{rIsZ^v9Aw zNm*nct9*c4g0|NtA zf3eX=zB^ByI>oSaX9T31yd=60b93#_i*-DwySWD|aARN1WIXCu_QBEp+N!Vfq4&&d zN;6+cf%PLF3E(&qfp~e`3)Bhlzp=BkB%p3QGZkqlWkCC6Eyy1{Fb(8yrqV?X$=9c< z>R-RMg1l)vFduwhkDPz*(i+9g>vU|0F<)ZjPC!c#>2?&h*ahP^`ZhKxspGn7nUh#I zWPVIcOytjR6oGQG2eePRBSHTD&DZvkkM7Hy*379n>67>EAE$_tfTH+b?euuh>}aC^ zP;<_``RNzbpjOs#>3|Ly%5abvc(&1|j@J24JxLeiNyy0HM7s}lu9l29;Vi3CQc|c1 z5YW3_A;7yOZf>62%gK2_RCGsRJ+Mvuq#AiRwp#4v3U1zeV8NkYK%-sk+0uKpwAA7Ix0UXa zqZA=lKZ%*?X<;?B{XoTuA3DVQ)f-Bb@WJ75$MyAFzf5)QpT>Xu^oasN*T~p-Tk2!f zxHDufcl9xBGw2TIX;b93{K+gr4gvoi%24`t81yu8Vf`#?1V z4+)eIm4^l_0vSp1n>$?ob3?~Yo!aku=FIcguh+`1>}FzW0d5o2GCn=6z4(mWY3Awe zt)Z<=2elpY#;O}t7v|(@PH>3}q-_rlX!i1V0BR^j#lp%; zHXs~^L{`aX#p5JMEiCP=v0q41KH*T>TZAj^ID(F!Io zFD`E9KJXeKW+S7bghfPXo12?~)y_+A+=4g58|1 zmWo9nw#!g|3*b^g_V@1qbO~D(0iGyB1cr9+qq`NaJ_*d1xc$BEAoce7%@Y0`AnY|Y zX@w6QDD3;NCP&0*y1n;Nh7YI)fd~u=0#$8KeH;nJR?vp3=hT@}1|}wTm=qMxWA5CM zgIvy=F(*pHzD)0PNJvOZfgM!hAb!J|j@j7>bQ2W5ZEVP6FfoONLJ)lgC=?18H}`qS z)qxq5gK7za?Bx{>H3tBDwzjro)6-GwOEZqm;X8mu4g>!^ckbNSr%yW}LxT+AXz}v} z;Fw~Hi=ZIM#nrk0A#L}YqfiiK{Z$8|2>tr?L6pY-YMZ8~%SiCoQ@lCnSzGww#|r~FFUU~s=^D6xAfzO2P=kFlYVLH^`K~Vcsr%3&6#Q$sC&obBl xA@6@`b5hO{voJF=yJOBEH2b&l#pAYUE*xMiYOs3n0Df44(A6^3tWdWP|1Z!B(-8mw literal 0 HcmV?d00001 diff --git a/assets/furniture/elec/blender.png b/assets/furniture/elec/blender.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f3a9067180efebb16e43c8c195a3099396028e GIT binary patch literal 4705 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 literal 0 HcmV?d00001 diff --git a/assets/furniture/elec/dryer.png b/assets/furniture/elec/dryer.png new file mode 100644 index 0000000000000000000000000000000000000000..30c97a79716ab99371d4f6e4d8616ef359b3f570 GIT binary patch literal 7593 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 P#y7>n-u&w3ol*Y+EYBt# literal 0 HcmV?d00001 diff --git a/assets/furniture/elec/fridge.png b/assets/furniture/elec/fridge.png new file mode 100644 index 0000000000000000000000000000000000000000..8878c75d764de8ca433db1c3e013ef784bd43829 GIT binary patch literal 5627 zcmeHKYfuzd7H$PWQD7r(1a);7AU=|w>FIelj3NxeWEn(21kp%OcMr5M4`v!>fc3@V zBPc6@m>2~$iH`&|s7NXp5Resh)lv~eWfe4~8w=kL@P+Q}8RSt()vi_XA6-4web4#M zcklVmxwoc2jf@C&bs6UZL6EB|Oc@11Lnc7bP~&hXU`d#Ebpd!ZWW~fWQMiR;G#RvX zD#c+kjTDEn(pm_zUe-k>jIQSlf7vxgG4z1)f$ZkFudZ%8#&>E|p_jbUhAkZ1*x6lm zK4p2i?^mT?#JYHGSN)<_o;cUFQPuhDYQMO{H>3Tom+aq>=wG$XZ{oyf*85{`H|#7b z;LX`sw(^6+$KQb-|&aM6AxcAv=c$&JSa%JYXA2!V!H>A1MUwJp_dr5Wr z0pE>MvLGbz3e-@TtKXh=aIN;z)4x zWCZdkUh-iu1#CG%JtLMLpsgk7(4&5OVD;?+krpJgxwV-n}{FZ&f-SbicuYR-M$ zpU#>~hctR2+R24e3nu3N(EMz!@yCV(8@={@dA*$D4EePlnLn~a-s+e+)Ke0E5|YnJ z3O0u9i=WbwZ^?7bZoKgDo3kstxu?nlM-9tIGhIF(UU)31&O0L4IR16w=}F(No3$bU zb20BBzPa#n&5WlddyBl>n@>{wshPAU-cTLKMQD^4Ab5e6L(Ck+~kXVn=&&p}YY466|* zQYeO_p^|95f_v}h8ZL(>72J7ZHKH~KQ^|B#mWhhaiijbyQV2Q8oiW`dz={C^9mU`r zt1eY<#;gjijTZy&teMZ{*dR=bf*Yrf^=2QI!p@IR@-d zeiUUkq?-sTB!kj3KK&_3qBq`{Zc4SKLlS%{mC^yI8O$meFlDGp9oZYfN{~eBjJ7Bs z_5dV9Yx~3+ur}6XOQ-)rKzJ|j0Q8&OZD4>>t1+d4NN1O)QYyIY{1|B!#-lRAn zC2@^VE*9W20cxWn32c_Zq{BfuX&s(K@s0W>w8`*hJxs!4zXKq$;@Vk~nN+uUiea6Nxjp5@#qtil8D4k%Bu05nw_gCX#%Jpcv8* zZy;%H=Kn&on}-u%FL@Yk2J>gyO!gfWO{LjK_F*b*+e#dcZBt-4VNbz~XHfQH0WQ0X zNXGR^6gWM4+Vzc{{+(9PP^gp?AR-t=#h`vti58ZLaT%;3#9Fyff@&#JV^g7*-E7b@ z7TiS5OaeLrtw4L)wBk&$6>920v?ZBhs{jOp5h=K15Cjtg@nk)M@!x%l0<91QX^LT) zL<=?yCDp*VMvKFw3?~pmE|3bO_Wt<8QndGkbYO}BeD+v;Q`7+dZ^~{5^gBm^G+B(Gz05>msd}_y~`;$oWV)nO5Z`b2IYDy1>Oog*jET7>N0Os0zS=6x1%JTO%kFLp` z(^Nca5nml-%nA5gzA4Eg=6b|`_P1U^N7S8Yn!n4uSlyi1vckW3Pj~mrbsZ;9w(Ti> zS$K=NPf=98uj6Flqh|pRsA=Dw8oPV`-dHIJdg!+xE_&rB$B|KLZ{unQj%;~5G~BKC z0p&QbBijRb*pcmF1LX9<|6d#kj*-aL9_3c-T)Z!(?!*FYb9G#__+mvnd6y6!+Gn@^ zJE3NohRx*0*!Qn_Pp)q{Ics;dVIlP@U0AjF#}@bSAmhWd!?S-Y(~XAqYp*WOTet1= zMLV6`yN-R}Evr0GS)M(y?aIW{=NXOe#xu$TyzB1X-m-a>&)oKi)wLzAb6@XDE3aO9 zzo|o4bL>GpTH-dLA}@{kc<1@L>HPqJDy4t;G_yX-Zz2|c$+Q0BCOwW>lQls^O| G=KL4a*fxj& literal 0 HcmV?d00001 diff --git a/assets/furniture/elec/kettle.png b/assets/furniture/elec/kettle.png new file mode 100644 index 0000000000000000000000000000000000000000..29b9e3c9ab8a80eff6197a967573363c959564ec GIT binary patch literal 4769 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 literal 0 HcmV?d00001 diff --git a/assets/furniture/elec/oven.png b/assets/furniture/elec/oven.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e501b6bded22c5fc28d0e39b5375d6673d4c40 GIT binary patch literal 5141 zcmeHKdsGu=79XlSiXtd>1*$Sew7NRUJn|e96iI;81QD?kal20D0i)#6WFP^LsOZ`H zmWu0Zsr6CqijV60>}uD7id&V|Di4dr0(Cug)oLjPSCQ_Q1QAYqy2o?sKYPfT6$ zg@rsj3$t#XgCKXEC8aFn4BWq+&?Q3G{fGhjzgC5i1)+Df`l{lCq0vJtwlAD`|3TEY zn79o)KDss3Z%^u;#aYrLk<-^lS`MqGwB>J$hnWN}T>ALj&hLgKp9wfNdzIj%KJGVT zd~xim_7TH}4gBYK3Dv7N8Ir7*?`B{#ky^<<&5iBH%7bR_ZsVK3no`!%>aQF9?-Hd5 z-z)os);9#Cj&Fiz1x!6W*>L0KfM#2AV0oyp$h2^i@Z}7U+yXv6K1ClN|1=+vMahD9 zR7riN4c2{bsOpQQN2HuJ2Oq_agAY}W={sWbvS9rY`-beI$TNmQpeVH8-){?sCH$Z7x?}dmtQ&joap6Ys zqwfc%=6s+GU#a6W-g6~2oeEiDy7#za{ONacg`&Z8W=ZNs71b>Ibam>q2jZ~H&QiZC zktp}ty0JyWmmaA8&kXyqiob1&Jh-vxFdPVtx?Vo3-yPNUzIiW2$PE`E)wIlbyY8TA z%$?P)6(RGl)HLt7ym*A@(&0({{a538!Rv$8ou6DbB6+F()t}~6M(ghI*M3~O{f94ezE1q)WXRVuYM+pf`up?)b=j`!mJg%Ls{-AnM$1De zU(wiJx`&@&KjhzMt*-iwdFuj;h)DMY|Am7dS+~vKwKe0Lt;O@xODDBNwYE~yejo3( zw6-3-)oPnM@^thvljFnR@ggk*4and@W2GAnByF>ZDaK}I#cqoobQ}b!C%WwvJ&zS& zGn>gOuG@^843LI~9u&`7t6{CpG&FA8x*kD-gU^p^Wo6rdXo;0E? zL9mk&iOb~@y9lw(ktxAcDwPDqB{+@%3&fdc6(~1ib&m8v_%O7rlXmcSfwx&<4<=={ z

&)2GJSUkjY!@UN1m)4@-gP zo{`lfHjl=ePWM27dlzmG>!-PUje(WXNNR0#jwd|5RwMH4Pck-|XGrg@oMjoMN@hkd z9LEqT$`Oc)rWJ^sr5H-4!Z9UFbc51codRX0Sq~Hd7xMszlCeq!D^nm+Ld79c8Ok7L zLct&kR>~4Mg`+fP?glZ{!Go@(vb#s+fnop@$5C>EMU{vORml-4PJlZFMIcg!G7~Bp zMkz7e3&qf6g3V!}Ksk8}mB~u%)=aO$LpT|iqSuIUG5SoBl1&L5aL|Yhyfw%DOp(T0 z*y#f0VG~o}D1j=JQbHzEsg&3=qc>QG6Lg{n6GO#>(yQ^5g#^g}Vku9b0syZZDR{Khx#5=+Md0vrkqNcNN`JQ}_*}Qj@VAwkpBt`pDa8kJ}CxG)Pv!hCw1Sz%6%2+-5geC+`YGfbqLfie#7xUL6(PqtmhrVh7rN8N2`!|`D3_%s(N<&dn2FO!(5+-@^DRKlY$5=UrfB^vmgUc|4 zqG$ra2o6;e46C3iU*UeU6n#BG^h{AL@f?d!i>j9Vtn5C6Zs#bV#wP>kGdS)gUFUr# zXCU4e`RQ!87r6xt_iplB{Pxn-OV@KT@La~d-PKFib20E-#=YJ3o6!~g?2VDNf4XEA?Brn^OOhD5w-1GH=wvH@zF3>Y$S zNYIwk#lKM^Vi`CatKt?eM>lR5EH1 zd!T5*tfCW;mDa{&g^hOj9aATmHjLIi3Y)JfxF67QzC(RD!w>|vfuIM8T;HG0AK$yT zcK5*(t*+dH&4mqBbzd~J-mI^C^!7cq?PkTH%jTd)vZA@EvE%O5TYp(QTBJPch>bdz ze6n7;yrre$8~*s1_P2x9T!YD#%(-+kKv}`Xkzy9OqO>?8a zeOy^t`&mWB#`@~&S1wNZeL-w&?2mssbLR7mjKIR_BR5{<$I9Q2diQuG7jK{Yerf52 znZ?Z77}K%Kr%e<5CfT7fzp#=AwM%3dUr%b;eyE|!U{k6G4@+HuSO@+3?*EV4Q|mLM W)m!|lFWl(xq^H*oDX8?#Y!Wu7p3{?K z`7e9+O5cY-V@EU=jx6H+RC?dT}pkoDcZD+p8EH$Igagf z7Jqztv$5&9?Kk_c{G>U3!dn;R;-89} z{tn zXI1AqZ|POt#AA`2Nyjq@;h_yV&G)a_)&1{<(*Ac|dm(er^PjzrrXUZVI=p1UCHmCZ zx-nBs#qT0?slQNi?5UV}X-l$&TSwJto=e^Er-F_dC2OQ< zw<_Pu`t>vOR$CcOq>XFo`Kl?ef7>e?Gt;{t`q!FYT|ZItNztJLX`d|o;A zwWGDWcX!s|u9VnLcc34sH-Gxo&fkf-(yQa{TJPvyw0uKKvpzGHJMQs&Zv#MEqX{!` zq!}~N1c&)Z!iMW{-)Ix#B+iic2wz?$@cuwXPnLp(|kM`l)! z8F<#Gr;Q|QAt@D#=a_k+aDavF6a%au;8M`9PAG&kb3HDbmeR#nRV|)sRu*7@O3=Cn0?=pg9^hSoX%pxd;NbnEw zqEPq0yp_#^TH`HuiV?Veoob5js0Cm}{3-reEvj1yMb%Bguw1-^2wMwyHBX2YpW>?6 zpdY}~V?eHhcJW)J-~*JICkX>aQHmbSCIPb;SqtXli~_AUQ3Bw7!_gxlL5{LvFxL-x zgj_*+s$8Kn)kftE_l{Npr3;WS3<^vkj9`qAyg|b7J6|HLHws1zFkyfIaKi{ttgI2R zn8idHfmvXoM7iNff7cS@nxF?XF;JovSB}NOrdsj;YJ1!v;T(n3#BK0=hQ~cVblwke zrkt#I@HHT}JGcUb9$jQa{EpH!O4o=O7?Ja+x<=_55d$M~9#z->jV{gY8zTt9KYCGk zAJk2ZmBPDZvhR^1JF)_K45@f5x%)TJGG204L=a@cWaX2DY}q;m8dGGK+mUi1CHec= zlNh$HVzl~poX3S&PwcPjH?kz1VR?4d~e*A|P=@&2V7}NT`d38+J zPHxNHc51EDWA)k(U;LjX!JMoxHw#>)E}tr!Bkq=QAI97M^?Q(Yu4M zw9Z<#G}Ae5RY%gHGsq!-%8v8XJA2=5f9X=*t=DdLxK3wH|2((o=LhpHJp93Co!oiq UNY2y)Fl7XBIZEui3Mw1_1HcGXvj6}9 literal 0 HcmV?d00001 diff --git a/assets/furniture/elec/toaster.png b/assets/furniture/elec/toaster.png new file mode 100644 index 0000000000000000000000000000000000000000..67fd14fe7e2bb6b07f32699cdccc59bee4c0a8f8 GIT binary patch literal 128714 zcmeI*3v5%@8NhLe6#@aoV}lmDY!_2d3pjqnP8=_W=0)OyLkKAWCRA?h>%=8~VBZi! z3KT*a-MSUD4NWbB@z`KvOi;*plokS7JI3f3kD(4qr_mug%79gaP6fJSCnP~bLKL^e z*568E``mNB`<>r8=PH(NPF^f4E$*E*I8CF`^mddKmW$_e;`=+@yNRD&_75u*Py6Op zOi|0_dMOwRc)YcWq|ON{k`nQHG@8g?ePyTmePu}Z>l?oNBdO1TLsvqc;pywI|E*bh z=do`Ml{Q^Sd+FrIDLZ=PryP8G+{j^r);reuUl?9IMms#`?+Yg`I?&W-TB9^`t8#Vo zTU~QM{iNUJ+LnIamoA@zh1K9+_XnU+UHZ(?ppK9jl({8YhvDuAAS3s0}XFp zJNw+FlwB*2IXC#y#&4>5TPqJ+RWjmCVIVZB|ZJIu0J{2b9TS=7HRv$QQgm^UY|SG@}w_-u8kE833G!5R{qqK7Bz|0$0 z%WJ#2$NX<5arH*awbO=WBy+J~wFinC5NAj&vzLvaRdGCwn_jH6HSvUoc|h zZ>Rk@_xY7iHGewjlm18QdrlwObo!syR*v3xbod|N-`6~(*M>FKO}{(y)5E)NoSO8f zOQ|2c7CQd(ogb%**%tANSvAEu-sTGUGGuq4O38@$f?~R9G`V9ULD@A^QKc%S+UvJ# zFTK83D|y{^ZKcI&a0UyM8gI$mkTPj*X@zU+iB1mgOcWe=^5Q|e^ zu7m@1A(v7#Tk)$yJBDz(+S&)}Lbb8(xLtasR`H3dVR2UDZKo`DILq2vLh-i^-IiPQNUS>@6A{hZ;@(#KR^MZlMJ=b(Rv2*AMbmQ>+O^U1+uQ+{*KLcv z%v4;SEZLl`Gr0{$omnwf>2fSNCY>eA?J>ElOztdCR)=sf2zkYId9j&z!r}jxHW4w`IsnykT+vIkBRa6*Wnj)$*?8 zZLK%9lq4y(C~UH;r3+zsw&ITEDPpx8a@ENGYDHWxn!cka>=^3+<9*+&w6SwD5U!z1v zL4fJRtY`fzE;6EBOPRQMiEE+0?PAz!Ci49vAFX5Y zMV>;EILSTv!Ufko3EWd=Pffx>b!U zF4WA@Jgb@dY_}7?5G6f=B~!y1P0z1Jzf&}?tb9Zirm7BSQR?~BZV#t+|8K*ijT()l zaTMlNL{c=17dFfnHFzL^00IagfB*srAb5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z0D*P^d!HQ>xEG+^gI5S3fB*srAbI+RAeMgdLFzHJ22(U1d zXDsOn0tg_0zylOm<2W&neE}Ze0B~vq5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009KzEWo}1aRwzE0tg_000IagfB*srAbU_MQ77_X2c=kst>I5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009KzBVg~dV*>XA#K)2-2q1s}0tg_000IagfB*sr zAb4m`7;*%4^+$*mjD0& literal 0 HcmV?d00001 diff --git a/assets/furniture/elec/washing_machine.png b/assets/furniture/elec/washing_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..24c3b5aaf229f0fd9a1fc501facec6400b12acda GIT binary patch literal 6968 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 X;@r-ohHCA}N>rAWy=Cr7&+z{N;vCmU literal 0 HcmV?d00001 diff --git a/assets/furniture/fridge.png b/assets/furniture/fridge.png new file mode 100644 index 0000000000000000000000000000000000000000..889dd293c685e0409f51485ffa11359504e181d3 GIT binary patch literal 13871 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/furniture/kettle.png b/assets/furniture/kettle.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc8cb8555377c9ecdd49a29543f9e540d64cf7f GIT binary patch literal 7737 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 B*nI#1 literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/blender.png b/assets/furniture/metal/blender.png new file mode 100644 index 0000000000000000000000000000000000000000..84cde507e72a63b656de3d83ae717d7b1263f73e GIT binary patch literal 4752 zcmeHLdsGuw8Xqk32%;daO6}1xSgYHeWHOW23ev&jAfCc$3+kXMe5VES>U@8e2#{NfM<4MrJ(qz%#_P#QC`^P zc3LVnW{8Wvg9S-5h>yN8%rjr0+F`*L-*P=-iNk@MCeC7OlVkr+>zF7O0w5 zSKNs`Q>MyaePSSH#w?0&U3e^PU375C7V+zYjczXg@XFl2XP+NfzQt(mjlDgHwC_KT z|$AEp^N`9ar$0H|@(0Be&*VAH4somKRF++8Jx}r5#V!Ui{5ptFtn1 zN}}342ZGMWqL!!X7T39gE^7-PwH!htrxf&}K?Fy^=IQiuKj7ry>2W!vGdvkkg zc>*c&9HQU2_(Ro_{yp#PjGfm0)ZNN`J)aeSvFt>1sWfw#GMSHtATYIN;6MRlRIc&sme^5*FSj@LKT?=9%syK_VCfu(mI z@9m}J5q~~t@9k~+s@J(Pu4P_Tp8N1jPOOEXsRbP9tXxAnNjvQligB7*iO=o=EeAmf zOMEVhE@FAu%vw2zMtq~WMGSL{M*NJzfErvWY$2Cc=4MxwWtix)BAQ^tOAq-E~P(VNF;W2>? zD$Qa&&SE#s>PlD#A2$|)p-22(#crEF9fp>&Hr5VIJz!PYxFwhA4aN}!9Z%Abg>YgUaJuc>ywO=<`~jHRI)6i zCKP5whG8;9j#_YpplKDNWGRMH5SUEO;$xun4i8T`XjXs%;1UktumFQnGb%(arx`>} zFgT)Cpg3a2DHf#&Ij&SF$3U!fbD%3J+t{cCCRDBc1bG~#s5QS2L4 zm^eGTil+oNWhxBCQ8hteI3bte@=>E4*6jhEC}7G^39j~QgtCwz89*#0^eF)F%Rw$= zikqc)r`zOo+B9MzBv|kqQ5(Q^Vkn-{QalSlQA|#vDsY=n8Hp=NT=q1Ik?0tEC&O7v z|ChC}dEkUV$%rb{&>;KhX+i7E>`YRE}Vn0@P2Xw18Hi)QFi@SO{E+Sy;wA9^K=#@LtNzCRqWG zfGg0Rey-p}{z5GtZ|yB)g(?8T5L5+j6N-`wK%RPtFzKUDQBAOB%3@I?ICz2$qo5JO ztd@Z(M##-Ht5VQ`79An*|4lK_6WI6^6QshiI9${O>5s}DFc@==0%`&>a6W_MUOIB# z4{-+KeU#TwyFJP!V0dDYhvIjFt_ivxih+kRp6IR#x*m#whcce%uAhxA(dZi^>i|FW zyx@KCFJbkYz`JCKdBrjsXq<*f^8-w!0=uCzQ41VzLMpCIU!S7!rZD6co@LjMyQ zGHU_swzdLM&}zLl$>i&}-XU8~XF|{YH>7cK;+fo;@5-xgm1e}GMW5T7gUE_Y(XIWzT^i+_IVmYOEGaBGYR42| z5V%LC&)!eIlD#2j^ZgY`+t*Yb%;^i+|80I$*DQ199_8op(S7apaO%LlE9bh}G7oOU tJ~njUxY?X@?f9kq#>>K=OgB&dI;i9MCu(+esAdV&=ye&|cazsv{1>*zkC*@e literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/cupboard.png b/assets/furniture/metal/cupboard.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8f88f1dd82fe712ba59f7b8eda637f07730f47 GIT binary patch literal 5375 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 U&woeDI46!OHaTWTRA%x20O>zZZU6uP literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/dishwasher.png b/assets/furniture/metal/dishwasher.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbde95d9fc0cd5687347eea2eaf08fca478144f GIT binary patch literal 5462 zcmeHLdsI}_8XtUsjuJjF1g>!$HD%?@oX5YA~O6C&DY{+V} zFszY=IH#3{Xa~y(1dcY7ZplOYp^>*c0%r_r@Y$EqX=pZAwM%7e%=VOh$ndqrRWC$! zT?*OIkZ&(-eqyE2d~)md;`C0x_Zt09Fd3y6Z_eC4w|Q7mRY72#3zFIfr z+t*iY9a$(}Uaj1)ee1y--I7Ib7nk~6N#LNnXE{-iz}A$KcYegLN>E)Mt5)kYYIR>h zpp1&V)vCC`^8;hPi9a?3Ngl6j&(varMPAJp`yh3mn5T( z*thvK2gA(NlJMe3R(yE;=0fWy2R~XHTvhgC4df@7a$?`&5x=TV3~>$`kH>!{P|Z(M zTVtwHru|x!y~;ngx#h~HBl#0WU)RhWIkX6M3f~-7^5yKk6BAZgL+_?Gg>8Nwe%E5-FW*0S8%}bslTn*c(pb2^ql(L{-+mycZaZ@>M~r4*t_NUwVh%6j`=yZ zX-zi-If^qq+umnqSgVH)ek11iqGct1#aOUo#?TkW+%j*--SWFn^YH8m}1-cFe{1{2p(F(0%av@;|YVsBq1q_o|ZUFRvD}iXR>Ow_u$R;UKRi!QU__3A`)0?GD-VK*twW20Ma|5KaH>_ zfek86r0teWn}LqWqRrf-{t%SmUc5EaX7rRp8Kkt4HUU>V$chX|IY*<_-HYHUNMlV_ zPZS_~fG5W?e~>j`Zv2R+ocM@lZA(aT~fuamVti@&`!E&-DGL4p6&1s$io^WE8P7^6YCElzai_S=L3#5Uf%$nW%+ygOEQ~R=2@ulf!^8aG`|XfFfptEcM=Q}azLK4moVvHUm~Sq6mk`% z5bJ3rDVC8W%9n_WaV19LN;#@mDCGku{oj`8)dV)M#0V*WEcPvGg!EsQ-Rscr90k;P zZQy(c$G!C4dEd(!f3p6CSFhau!VCcVL6ZC8_W@lG=(;Zk?#uasx*pJVUku!r^8

Aln85(r1z2i*z>I0KO z5^z;Xa$~Cqy0j)RxUvz7xfNbA=QJ_z##-&|lUdJoIaht1NPX1F{KD=0;rjkzi#C6{ z{;SDBk5*&1G>2UkPe!3%L^U?XHB@HInXs`nBj~v3=3?RNZdvEMjc*FipQ}XlN8QZe!Xo!__xZzgAcW(g zqe9F53;lcBq9$KYAG8g=z|OY^`2cULf3deU)cAk|GmT4Q^WCX6KGn|OnwUrKX4Z+% z#zMH(jMq$GKfLK;d2qg4_E~FuL#6ytU@ubTHD0T9Wkhu4epmEHWXBTYx~!hZHt!aV zt~ll2M835eDQt>W_Pq7&rhhD46R?i`uY)3%YLG znuM3bvAC&sxRN(D#N9om^3#@I+815l)p3qmgSrls$G=_TAGJTW>SoTVrH_6Fue^KB zRWVhy^NY0So}sD9`u*61(%Dy|`^2F;p;?V>d_Sndb^4~YwrpPPMEsa;ih9A;3wa`3 zuNI%8QiZ!}u|d@vf9K`VmIKzPsbbHao&@Qk^13gr2f9v&?dbY>@KYT}ony)`T+V8G z=I-;gW%HHu^zGK^c~5uIfrnjg<=>n|p$)+166dUBKe_IU0OO6hR84g&gwL=kjX3Bh z=bCWIW?ovJ2t2eyW86`Thc1m>38V!&_)}eJ-L~?dS{U{2Z(KlAvy4@(%iV6EvA%Xx zXoGLre6M7m{-pKm_HkD(Tb?`c@^2PiZgkVpJj7E9HoCm+@sNDC?&vvnr6T6w%ZGySOH5%3kMW*(-GHK?vVdf9BKI9O~I literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/drawer.png b/assets/furniture/metal/drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..06c33cb8fd9fff65254a499b4426550d429b29f1 GIT binary patch literal 345826 zcmeI*4|G)3oxt%MAp{a!{;WhHT8CKD8Z*gc@{bG&5ECG22?UJGAJ^SZW+pJ0emQg^77{1-@Es7Uw-G_;pOF<6$|EF9X};r2yt~;X~|+CVy>54+UQa8$b|2X zEtg;Rt*cz>TkLGMG&I&%duu!v-`WO`#na-g7NVuAwxVd_0n6y;KK|CsqL@h!yC%*! zbmRa2@rAa3_>V1)42ft;^Q$KeP5vvSZ)y78h5P6&LsRMfPC(-#k!Qdh4R=Hb1=nAHQ9? zvGLxOPv4W{Dc+R5C3fO9_fFcG<7@pW?ztsMzP-}(B7F?+WkDu1jte*WVtUrKgPd#E(^=#uAronO6o z(e2Ighh95TU_Eu}3uW7zi!vWy{r1DhvyR+w!xv+}e=uRqgdgWvez_=Z^wGFKt(%)O z+YvYS{g&i02OsU+J>~f^3zjTP%sTgfi)%)?XZ`TU?Mv^fDs;757K)eyzZ`r2J2|-{ z>*I5qrv3A$3x4iA`^@g=zU=$j{iB=G#?L8wv}DWmb2hqvUeR#xgsH##^{k3B^KO3R zft&vRyT49bJOA*{Zv3CP=bv1?_#M~ovbUToTkn4BzNx4G`&Q3OtDnE`&OMD+J+$KK zUrhP*>yuMv?SJx6=T-AMpNzfs^{dO@yyxZG6RoK`pIZK4LEHAP?C+lZhl!od33uMI z`*$bLZlAgDV9LL}y>I{2v5!5nV)qM2f6%e_+?%((`eEF=zi2%ClcztvL0)YwUU^k5 zEuZgj)z_vw-St(T^p@HNdASKuFsr4(>AK6~vs8Ijc{;n8UDxQjZQX)O*Sfo0`R?RdGvfqGvh466X&K7H3(@k24o){&bCRd}k!RM{7vuH7$RrRZV zg~`eCeM@iqY8%SS`@+{XomY?^87VudKYHuZBjj!du(m zuO+ejmGpV5FJSd+oA!>sJAn<6)%)W1E8W|7e_>gwyxdVz?^>-judJjnSv$YOUGMU` z9sb?i++5FeyRFKa?ap>uv#00TtcE6 zE92znUqHG!?tLb

U8Hi^K#s|ZkOHeZ;jjKm|Ndi>y*Rkt#z*OWHi*R z@V}vfJBljG3X|>WwhKopYMj1mS)nj_zPE05%Y`>8y|td(d`?X>GtX|zvgO(H@-ppN z^3)d!{e`EoNnVLs%uHK))^z_n+ORleXC$msyG~^Q|8dzDM{%Ra>8o$7tgo*rOxBuY z(Q5X+T`qr|+)kgf#Od?Mpf-E9!q2MH9H$U zMJuGEw33&n-^%i3|3KZ`zjX6Tk2VSt%qlO93t)NY!7|QwI77=By*)0-xWuHuUmzgK z$a+1;Wb%@^FrzOSo;TCdP8eV3$0CepkfAw=k}q6vDG4YQ=IVk=NkFMES69fm;x8s`&sH(5dD-m~#RbttyQUAU}9vRb6x~xfvgg@7|7_n{pb@E`G zudIAd+=;kR*T&`V{7KSYAuOV-q^PnbMs&2)1`ukXEjcJI9a5rj3`sm2$`q!TY%Wnx(_H!ay*x@o_mapCw5xxe9b z9!bb(*FvcJWBlY3Dk+o2nUX0yGI?y331>t=LJ3SRJ^TF=j&|&v+`R9liFT8b(cK{k zj2uE4ikM7bT8daFySypLZjX@lwoQ9mOnP&w*c@aGsu@&(gk#Ww4YpghBssGQKG_7G zc9ZR-IMtcROeYYMxwwD#%qU#wUv_DC- z{IZ4B3hbE6-N$NT1};s)G4SB3c1_N5Hpn_lr;1?j_a3S;w%s4H& zI^{#Pb26VXHu^kufT`6Lcj5FNNbJnNujGW;PhvDjz za11x3!|zZ^m)LwfQ=F2Kw#rR)d8I9*yh&4eAlL9m!gvv`GG3SHQ78nGUKQ=~Go4hq z?U36gPqX-(V_MnNB%X5|iXjlmH>AE|=z9S=+U%|JZUHBdR1bhO!9S!3yHjA<+a(IvndE4s#m)*xVL z0o7>^w;>z)a-eevgjYa0;iyiD!rOeJBY=RO1XS|}GaNmQE^S31$^?{WII0z*tiLn| z0R*m~fNK8Wf2pqEU~%g33bfApvu^GM2(NKqbe30v8tfy0Kv)HoXFIAD!rFR*BY=Re z1XS|}%PU3+gC&&`FNG06AW%Sc zNflU^eFPBDqrjf0X7A!&06mTzZAJhA1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKww~j!f|^RaxcKZHXKC&0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I{hW0^AFr$5ErrQ7+KYW^ax1Cel0v5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#{*vcN0nx^j3ffRRU-z9E1B0tg_000IagfB*srAb5@GkZ^i6O#GFEW8%RN?7B=iX@TE|ct0`3@d&3=0TPZ*2QJjjmP@K|CI#)2 z99{?r5)K!EU*K~y!VCG|d(g=D0xhzzj!c0~W64%7n8^ z#t!xuIWO0&BbO_{`{ocJ;h1BbFWbwCZqfCO5IbbS<(Dn2R$#|m?l@KxGjM4Vj)4bP zwQF*gvq9EbBDYZeZq+#%ON+@10lxqVhYO)kV8&_D)hQpUB@b-tJ2<=@uT3|Q3fB*srAbM3?$IeW^Xl6 zcjyWN2q1s}0tg_000IagfB*srAbzYY;%-N(v~?a8xT?$8EUB)fKIcZjWCF@F z9MuXY^Q5~7ATWr4YW`qJH3(+t-g@UhlQ(iNK5I`Ve0?IQS)d~^o2`54Tfv6Wy%^xhOqJBte zAOg`Vz>+F@$HojTi$D6&Ozs6R!$=R%N9Ea$YJ~yL$sq&~FsXoY{^)44x3b1E>D5BF z5eS6>60tgHwpqy}2r$hstlw$}WU`_$m{J{*zoYx7x zMj#{t$}=3*3L$AFK@iZdz+W$YbO!eV3^0DGxrG0*8UT?)2p}*t0oCQz(4tZb0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILK)}2LAARYIcXBU)dB>lgBY*$`2q1s}0tg_0 z00IagfB*srAbz^+5I_I{1Q0*~0R#|0009ILKmY** z5I_I{Wr2?mPuM5KH9svYDXLViOa%lGKmY**5I_I{1Q0*~0R#|0009ILKp>O?zQ26- Wmd7{EKc>Yjo3o(gpKkry#{UQYRUD=O literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/drawer_cupboard.png b/assets/furniture/metal/drawer_cupboard.png new file mode 100644 index 0000000000000000000000000000000000000000..18f28bcb345cc3cf62488bb53e34fdb59832a41d GIT binary patch literal 5922 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 J{%P|v{{`;0iwOV# literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/dryer.png b/assets/furniture/metal/dryer.png new file mode 100644 index 0000000000000000000000000000000000000000..6614123126e7d907b1da866a3c097be593c84154 GIT binary patch literal 10726 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 jz7xeJRZU+1qx7a|E(nO$Y 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 literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/oven.png b/assets/furniture/metal/oven.png new file mode 100644 index 0000000000000000000000000000000000000000..446c16622314d3e319cdedc6ea060d7508c70cc1 GIT binary patch literal 5425 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 literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/sink.png b/assets/furniture/metal/sink.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1356e2f79b2cf1e61d5d5dbc0a952587225758 GIT binary patch literal 5520 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 E0ugfmBme*a literal 0 HcmV?d00001 diff --git a/assets/furniture/metal/stove.png b/assets/furniture/metal/stove.png new file mode 100644 index 0000000000000000000000000000000000000000..318c288a005d887bc0e1921637d8e21234a77837 GIT binary patch literal 4546 zcmeHKdsGzH86S~Xmf#Z&m@4C|@-WWfyE( zp<0PbMQoe4N7KC26E!}f*c`1jh>7Kxq{ad*(#B{!ZEc!EG!Zpu(>uF7PjXHVr}aPf z%+B8V?(h5E@B4k`3@QdP zrS{1eEFYe`eS7Bh^qU_|tZ{4Fo~~=1)EalPe#%pStey_iZjNix<$c07E!(k=oYK`r z*B0o_>o&qw6&vnk)MVxxwr(y@+r_j@daOG(>E3VljlG(nmrGVQoff-Lg3pP$xlVg- zZht-~i(Sv{VDiTpe7V*H&my?48R&@evfZL;=GUS8Yrjq2Qu0~vzZaa@Q7Jd1l&&T(&u-}0&{|)( z{BzBOi-G-PE~QbzoW^+#Gd3P-zqe94@$Q?yNIUYvwPSb!HoNQW>ZDJZuGp%WRAa#f zj9FfmE7^{e%>A@Jv?Y1{rH)&#T&$U?e(%`gN8{@0D%DRD8_(x7&s@4udi?9s_tRh9 zwxlMDRRs=muXNn6TXc8#8#~j+x6iq~@#QZ%gIDt2K9ziB<)0p~{=ar}pJz4iY5($Y z`q{RG@P3EqE>>;2dVl}xVy1L7ZtQkj`>Kk@ga%z&I5X~tlfLr4w0_TvYd(2#=lbIP zi@%)K(*yKLrw@2~dYb;$<6D+-CcUo2e|V~>wqn@0H6m)PVn+eX`8*oH`&>{H_DHDX zFf40PSOQ!HlyMg<6TKF7_o*{#T;wh4?-?AFL&}BaVt%zBuBcvG#8p>t46k0aP?Z&C z5rGHF01tcI-T)i6s3W{A8Y^Z}jYlAIg+*QLaN@Z>Kg9JKy@n!eVX=}{FI3@KeqLY; ztxNhS(33@7F3S>2lA%yY6VhpX{xVX_Fbql2Bux_tK?JJ2G6)miK!!pQ<*>p4=NBbe z^m%cG6S#aq*`ijXdAvV9kK}L+(0c=YDj+?`Fpx;Ch9W&4a;Qf@wpAjMzJR{fBT$6) zCs_yszM!9jwo2%gGlo*|+w5oR4l6iKAbHGE9piJ~g5icb6 zFr+LBgJKPfO__y%i7-OI0|P^A%}_Ul%I*!wz{^2}3Xy9>#Nz@+BM%uJVRo5xgkH-S z2(uRG2@^#_MsMH^l-WFlVwqn=T?yPnqf)4NL?sBosDqT5U?|2&=xH4qnE)c?flJ32 zw7{&TBUC)cF7f$20F_hpfHFu*-m=JqA~>7vv|H4)h8nau-9Q$QgGF5+dV}G?i6YSh zSI9t7Q){9r9c5-{lUb`bYMDXMD(DZOPEoSWz_bHxCmzVa3S@{#DO%4`CUg~1T2^OZY2$o~W~m`~A1?}3{|&8d z9y}{r@_aFX)~||~qC08@To-+cKDx!oR>JYfreFaVO(6g(As>koaYd)Na^Nk4==A7o z*M7VBZLI)l6R)N81Wg-I{Y*xIFdKlGaB&8K(HUt0@~+|R0iPg;fFEX;Asvxcs68WE z;d3K}nl~IBDu+rHkYEI5LRS$*u?8fbxlb_i;isrG>5LpO2?W#$N{iAa!mQ_MLeD^; z2SD%ALNGk&|24&EPnd?Mm_;hbVt-My$ZwQA3K(*ZB59&FbUvfwo*X#u`!rKd)`$4% zYqy8E0-_#WWJLOo$~7w2h!hwRc(l7l(Py1Ulh0Bqwhw#vT)B93L(7x%axP3gp7sQB;I-cid-Ep{amJjJd2e1n zyXous2j?&!G;jJin;MgSWb62j!yi0onZCR8(cSl&4#&=Kwj?chdy0K+#!pN_Ys{-v z`Ts0^@0Mm!W83i?*Gm%{+18l$)LB7iU_xEm)Y?vr?YRrcIt|kiR383! zcwEjs=R4>8&bfDG=K8U`a9m!G!~uyKjiyIIe$GVk{hauGp-a5@+Ueks9P#ZyWzm%I zM5#g>2>RWgGDRDn6Hv5D#N*azA}76t(|aA#cDZrBk9|?btC4}n|MZjEjfV~KKU(gn z7?U~qMBfV=u6KLlYfCz9@AF~Gd3oiqm)7=OJJ7pgjlAO9l@C9Beq?FaMO)ur{pVc+ z`d_(lX6Rqun7Z?OOV?*@wM-cDk863=8CL_=i~1!qx|q@z4z9T|eQ5FLbN_wthR69P_gOK!X849dX9qe{S1t(IG~XY+cxrLk zZ%(|Y(ZtR7WM>x^WM?-_MoeMdyjAx6(Gwn9wxQ}5KgeGctS;TXI7P``YF*vASD)&> zTT;Rc{+_V6cu%p%(|y|FW%E~WUAFq%w69NFti6!%>Yhz+Y#DO)w-d6KUz&dOP}O_a z&&<6Xw`bjP$7XNh*f&cL>!cy;^M}HQ$69k6^Y0Ha3Mqg*=J7_tgFZ}y;=V0 zhQC_=IB3u}JFhv`ZFbMsQ?zeS7~Z8e;YQ_{luTQ~m`f2|*JH2M>>RMK>$u{n{VZSp zb7EP%JZj_XFHf22w7Xu`j@QH;db|6|GbyPL`4dw^Lw zbF*H{Sv@d!k-V)iP~CIz>4T#RujLKhv?}SvA08Y&XY5Bm|HjpXeLKo0o^kCg_(UpQ zFzb^QgRlH;v~sw7-->5<1v{-T*}Z+h&AE?1IqJZU<29Y~YIbz)f1-!u)Z!!F3k!yA zd1u;78PBi#&Ver;|5vY?if+$7z4P?N>+44DKlbDYpYA^}xclZ!B|G1*edWVFU!I!u z`^yPuw+BD^>F&=5iR~8gh;22+G1lhtdy^&E?^Kc_-hkL|8coKiNI-JURKi-PQsVL1 zb(ep&Pp9?Bc3p9b!{`WPE2W!NXO;#e&<=(N!);hA>b6i1;p+aFZ4)?{n4QJ)*}%r@&rCTcT+vfDN>XH0zv@snLw z8V(0+217+fMRJ8D*&i%1n9|eJ4MwxUY}Sh!`p_I-Sc>R<`p;!Z?#YfN<7{` zw3WcVt!CKcZp6B6Z0eclbYcf0n%|0hTkVFqM=Oh34u>tr?6RqLZL}KAQcS11W)#eI2NNx zak*2?dSi;!rMISAta=gBsW%!Gmz*xiX3Ge3Oo;J8kJyz`S?s9PP_hVRHkzFlW9kUK zD>YSwl0`hpG9p!^gID zUDaqwVVM+miw1VxSdXtf(pa^~<5ebwB~{auW;R-kX=Y2B)nrPwrZrZYtOP@1C#o?` z#$?Ng=oxicY+^D3R#Nw=2oNn7bFpOy6)Efw7Ww^UcAYu^t=jU|X@|I+WGO7=NMS_; zHJYt9W19FVGMdx_Q|i-3v&|S&-!FUIbN*j#_2SWH)Gc|wCnWlx6D_K{q9!S`>VB&G zvCI>_l(gFDMPZX%byEmQvlTfyP7$l_l&e(ol_=uwQNLXq$~|AP6`UrwWK!Ic-YuEa z#a56M{fKnq2(hoyQY5F!|*>Q8PN(cHyP2cu1ws##J$jP>th^% zDagqxio|J_EUcO@YVbk;0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_Kd z_9}4Ym;J>56R3L@puNt4aU*~L0tg_000IagfB*srAb!lfc=qO<9QaK(Ssud5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009Kr zy8zDuwD%Qc{0Ja`00IagfB*srAbp#EX`X1{cC zn*V4ziRNk)^|Rqv{T_SVaE`LJ?XsrF(qRpG0ovIb*2cALFN+=9c3(>tR?UB?CBqxp zlE$<}poIdpEo|SGo44q~%xuduV{9E>U}FcKAs1!`UR5zvMfgP|aR00Q@3faE~235#NnNodrV@TrZubmW9UEy`>_E}(mV z=cI?G1;_=|giU4>tj~2aSX13Cx=@tP55I_I{1Q0*~0R#|00D)E$ zxH_-vD)Iuf8b2K)fB*srAb0TKemCcB9}CLs_Bfm-oa(4zDPBm`>3 zm7{A734xl}1er~gQ;fj<5ZHJ>I%%aoTJ(;Y*-C?^TLch5009Krn!v{sv^U8M(AHLk z@gRTz0tg_000IagfB*srAbtkP9d_|4-~Oxq!$8)QVSUi!vLK3#b)Wj;_fC)YKlx zZ0ZE%2;2vOjm_=j$dRKb+fiPC7QK6BHW!I@2q1s}0tg_000IagfB*srAb& zgs6fj1Okz;u_ih~AgeZj-)+KhP$HEgZV&!Ej&gQqJCef@05imw9z;X1BLNzM7D4xg zKq6iTJ8YMJgb=P?NHp2b(J-k~4ZCbQICU4^sG5a+cm4W)Xxz8O>PLYvHIeHw&-Dfp zPHAQ+Bv_sZ^G;;uc;Wnp_N~?x+~G^bZNFj44Lt}b;L1MuTsklI$?K|5)@Sm2)3-0A zIKvF*o`k1y@8QpD6RQHMQp#o`R#&Wr1BB{bX#-xOw<^&Z*xdtZ-Q}kaMxT?4Ww&^6%9=yKv{uE?&CMNb%*}t~17^XENhMfAcgt8b+qJ^9 z-Q^q}`-oOx?PbbaHDH@|B#7GF1kMDVl7D1(*xvR5&b#mB?RB{J*Lyld5Ay|lg30;* zD%i<1v%_+~O|71-S(qD(J+)fw&Jf$~2t8vsLbX`+^p+-`+q7LDae)?h*S$=z>KG$l>gsK?uA3%mIrs4~A2jf z&d^>f-d%}amp>K_m_1{Zaia(MZJ)1geAp@!QD`4L2Z_?}`&w8)Hw4NBp(iccTmw%F zozjtyFcdr}JIImz@^vUTF4NVP=M`D|W9acxI-eewMVgw38bug@0Kqgi84(d2#9$dj7$aA34Z!iT7>z`% zn6Lwlk?!^m2=fpo4WX;0tA#;XM9{;qNE1#g^h0YC2m~|+i^gJ6paqH*$zYQsPz;vJGQ@WbB8^31(g8L-gn?MbB>RMfvW<~Q zP>=W#Uoc>A{}Z0U`jZ8a4|D_>Kx=DZ(80mzUp-iCi!c!6&w&1;2g?~;pJ+!KDVPACvJOg@O7_tq=xLMj+SnB+D#gGugc(c*%SjI=`_a$NriA`Q+Q(GU4(ZS$#^l`d4yq+H6FC$kP zlLdC-GNv|0O9#KASuTqKm<&iPdAUzPfE78Ii-9?lMrMaFokK!`jFHPBA(lOVs_nt$ zL?yGyL^7KOf?}|`1{i(ta>i&IU~vZ8dRsAA1I#b>Aym3= zt>8n$>Ql8bx+pAG53HX)&KHH(BjdqV(DNne;IO_ls?XoiSs}jca59s&-4Emu+q@P879{_m%VrBQUr6r2u6;*X*lq5oIezZ?9rkAl>Emx22; zxZR_F?)QIk2FCl}{QTK&|IH~7h<_*fNBsUv*S~cABL@DF@xR^mFJ1qLfq!KDZ+HDa zqf7L!Cq^0rJm`gk&x2(c(+u!g67I9piU`>c34nM6z}qf^5)r`Kg9U+ztzG`Ef}G>Z zfkGj+jlG4?pb%VEVa>Yev8Uksk1aOD?amReM|z@@+-R|N6SGr|A--#lo#-ZeZ?8hh zqItJF%s$+@BaRT$*m+g%1#wMUK$89I3f0=U+vUdteO@8Y$tB|+`{W7=I*N(Dxa?VV zw%AOnyHso&KX|)Yru?y?jXHW-iCFy9!i8rG8AhE?cg5f$`=d<;7Py2Omf2}lo9~zA zExz>4>>X+q#8D&@nwm|VYuX(qwM2UPt?R(og9ojtim86hw$MU+i zLa)SW_G!6o(jOIo*73IFh5<*4PAPsXmEfKZ#~XVIPO>+7z)3cS8*Jby92I$dXP2W5 z78nLpp>>j0Sb!Q2%EIucIVy%5p7P2crHXG@F;z;T@;myh;VC~Y!NGS+%CgJ#WlJas z(ES5Wy-lepeol9(dagwc1K9TT1?3GXwKm)j*5YuSK1vRFK-KlLLq){7rwdK$YIilb zbH-$w@2u-NaP2lH4c4P@d)66du6~#7)k#2}7Y4B9t7Ecw2auFKGBPC_@v`#+h9cEO zekd|parAw9jWN_p#O-#n0A~{{;CQ#WxAoRzJ3Qe{UoMWQPs(tTVKW!K{Dr7|4Jpl7 zOSRN;*eK%q?Sx#1#;S{($Bj~zLZ=AtLV9?+rCgfwljgAmGK66Mb@a0ndpf;x=9!*2{KG)Y?9@*CbVH)h)pYlv(C@#=9pk3iEbO zDTLhpDq-m!8HTTV87go=9 zr0_4fk0}^PyOa1P=9|{BOl`b7Uwp#Trxox8Fa5+-j#pdeoXkB{Saotu)kM8}nCFwZ z{^z<^m7kaJ0^E=n21NNiA1^c-8Xe2@k~HK#{ur*ej;OqO{M3aVoBLzac`EUx6CRCl z(!;NO%{x*N9P1Jx#^wGu*8G`XujlHnRi1@JIn3z?y!AOXMX7`eUg@ea?1v+}Hvok3 zB8hxm0H(Lpv#xD_K^XQGZX* zd{$@n-lpQvEyKX;$7S0a#mj1Ss`Da?<->R*8A>EYxmY!)L(`>kO*dla7VLTq>&2eJ zNn7Q$Pbqv2OxFsUN?7`E$Jni`Cm#dc&rF5NiC6d84jNW#Pgd@|8=a#sq=3&HEd0jK z8`V;HcD*s z)eA8(%p4ADmEOG};p%?ds~Od%Z+y8>6E%O`7bWN4sHfE zE(<3$C66_+y*YJ9UUwXx*f{al(|Gb;MMEgxZqU}x`$FB}L~2jmuE7~!eUcph{Uqb< zMJP>KNb@xIT)=3^*R3v1cGX-dSlEKB{D9VjZk5U~+DRo6$?l^a#5L-n%kg3^o2&R{ za7P{|?PN)-v-jc9YtmU}P7>eZIcfWy40osWW;hO&WJev&K5yt0!l&N7n+0W;zj5*L z@-KXHu=Yf4C)>$NQ-rJP@Wxkm-9599-Lgv_#+;O;H^+6t@SS#lRGC$&yQvWg_Igzf zlIoNILkH4(8BQY37#f8OA3YP}YIP}q;$l+zL57)L{EFxITywvsf8q1#Fuc6>4Py>( zJF+b}7XCSCv>UZFjNyE{#;*SsLpaL46d>U+^3++x#oj6TelVY^0-W)9WqX^(+aY(+&r{+ZG;fOzjXKRgonQE2|?;tGLUuO|G-W)8u6n@-0xn_p9Kn7 zzs+|i6C0NDl_bLOLw2tMV;rg-+aY_!hB3g)FI{)L6kHp+FMQxV9qv3BE0_WM=KlFs z$H)=Z!KJFMd(K(U$K2LoxtA!$9-8^J0!wuMrLDkd86(3noT>+4tMc!ZnB{)C=5#xs zIhx+&^=;P&Zp9-Tt3=5O)q-?Ifnhzs`iawGK#5!a-V#n)w&Z~FCzmbZtH*aj)%(_G z>^|zLN%P)WF}Tg8c^#g{SB*B*>)zvHDXvaAS*$??4D~tgGmEM4;Cws1(OEsm32IIg&!#=B zFs-8C=3IP0PMw=&bI9TsJ6B~jr}~z#!gyNo&B2z32bXSp7CsKe$84kITSPR+Wzh63g=q z$o%^6$Wz+D(fn=8Cl||jRx9?5rzZ4@yHXSRnS0oBI06HwXe-+GGaqwk+bW&mDd5Q@ zKCOyJ@R5JU(*_bN^5^S+y7`?cf9dn2uV3H(Xg^vYdui%otSg-6Vqe84H- zFZDm1i2dY3?{%bo?r6;JYGUGeullz3j)&tNb+hl67}Y-m zz3mvTR!k&k}LI|BwBfdA40FtA^T!FB#nOM>c-vOrYB);tFIU;TP%L*THRu zW|XO?=C*e%&jqyeZ1OytTFPdy%CJ~EYOA0!_f-lUs@~((qzSd!QZD-2+BC+E8vbBS zg`X1US(NMHk_CEniUOYc_U!}{Jm^$z_$@9oE4VF;k8ue0+RBkkOOu7XM*_aFq<6<8 zw+Xg;blK+QzcOqA|H8-AB16rNPM5$6R4C}XDksAgE?%3_onEy*QoTrpOxYd0ZaR`6 z$$HhNd*zctjj1^hmUW0 zvbNZE5N}_Rz)2%JndZgr^y^=B&0|V4H`2*qVBobq0~&wXHB4uGGv>h^H<4-^CkY?^ zd*1uCx{P~VH6A1IH?=aVPv(K{aPw@m!ojx3re*3p%D&rdnMfmC`PS&ksP1+3<-#?P zZ=xDgmx_@7IR*U~fa(A63OAz2@WvrG-6a4>gT(U||c@_+-Y zaqkx+wjz*5kZpik>oH|OM0^9JbSZ&S^YN*8rE7qSPVMyjv(NZvKJI*HLN!069=xbj zVwAn%k7p(6N=^D##<1SXEp=@UTk$)b?4R3t^64o;3~! zEIy-1P$$d9L%a5hLI+MK&mV$D!?7X}U2QFuXLWrLLVMxW{$FE~=TKcxyJ?@R?*u3x z6ShuHAPu2ctdA`nL#<-W@R?kFhO$WlN_i8bU{BBL-hqr+xK1Yb-fMGN-S9#0ef#CX z<4I!+v{(Z3hfefpU3aeeLs_@6saEnz0(|7%I<)G* zl)yyJMg<(4B(k?E6Sb;T40sLIo_fbV^r>`1pP)~rvl{z}@~wlI(}5gRgcVl){*j1= zL#c24DDi0!Xc!B@8-ys1z_9u_xSX+fI@$cw0ju35A6nX+*F>J>naB0xmzElm2NpvD zWBR*;3A1@H<)QH8-efEwJv{EuP%C>4)o)`p7b(9}+1%}zZ#J#9PZFcald4oLP_zsHr8I7cZ5is8fcb`A^ls_sqq@&lcC5+q zJXBY0=6QX>{Saf>xb!O-sUlpgihZDUNrP2miAkC?F7AO*7Ys(c<`B#&< zSv%!Z14X*+y=|HV{M0yp3Dr)KViK-LIC;pz1^EnOt@Q09^>35lO|M|t>eusp?#pr{ zHmL1b43-fV-{i3Ky|RG0qXK^6xRHgo3TN?y7~xaMAH3ZU^|t+Of+>AB-f8pZL&h rzcg%jyZ1!(&vyp@{|1*F=S^)wdngO(#>(J(6o`!liCDVB`|$q&&-qEk literal 0 HcmV?d00001 diff --git a/assets/furniture/minifridge.png b/assets/furniture/minifridge.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a73ddb07dd4439cb16d0d4a15e8468215b77aa GIT binary patch literal 5430 zcmeHKdsGuw9v*}c8U$>m7A)!*@l=XQW+t!6mXT0fpcxUV`;3B}m?3=Y$q@lV#}*6pI~-+}lE@#EiwxuI6xkP#?|NNv zs&U#GK~Ym5qm^7Ya~O7ad3;gCjFzx}?Y-Z2Yfed6@b2qu@<+@cZn~qZqf2A{a=&PW z_}-mY)ABap{TJz&tThEmm%a^InAv>)(a62a^4XH`>}it5;U%Z$9$cI@>9)AvF;|t} z@kqq{R%uMh;Q5;yew*U>djGbSku@tWZHM{L@UuTm3%;Q`8{p{^p-4UqsV3zlICM3c zBW^4%SQs+v_^G><$L0+c{vo8M5}Xar4xKz*S9E zo_bIm*Y?Gx<&j|xZ~Z#|&n&f`CHU&b=|s#U$zYS;UwQ(Ww5qE zh02Q$sx~sC99wz*OLYxXb4&Rp(n$9x-iNQzfi4l>`&E#Xk(E?cQG?|Gs?YMRd(9;NK zvaExUND2xH#065Z-I*gnRVtMP!6X!z zieacohM1)y6-6mU3Ys*LautT+w6qJA-sWOS8%1+efLzP~9wn}jl2VEkkw#iBlBsA^ zWRwCjOl2gEh)S-Mp|UO%6P*mGO48DGR~(fIP?^o7LP{gJNQI~rA{izHPfAiMl9@=O zR3%4A9L2m;CW;tmcUno1PR2^+&=Q9&$2-9pPK-&_YlN5>=^RP5kgOR5XoSg(EzjLK zkJ$)o$AK0i z!AX;>-I;E;TQov$OE4GNF>L_H$wacGmSkx_ieNGVQG#zef)Y|0fl6Z$j6k~J?Iy}IxrbkbvT zfRDf{P@Z0|;1S+L#dJp(%%r(20K-Ix5`5DUgpdRC@OHx_FJGb(k*R<b8l3{y%`lid82f&Z&SUrormOH@m^Yw<}^)so+(-3RD$j{<9aW8i)U*S)0U zzHj%8yIEi2r@h=>;tGJecaa|X+iO>^T|IK3N8sM->b0v!4)h4zTV4M*y9AwYjI<5> z(JKJ&gXxFLBfz_4pm9Q?7Wx2sAIf|`uwgwIdBu^G>4Ko({@l+GDqqdP_^jTb246{m^IPbm3zv36z+=yg~1s z_84J&P5F9Hih!u@s7@>Uli9vc`vei&Vf!`yXL3GdI2wh>olc1?bCeE!#!tt7+(*0 zH3jh7)jn6WUk46Y@JzVRod1No_DQsUz=0Do>)_nk&4rexoi`r^r<{;|Ot#_wyg%pk zR=?QQVV;V(X7d`A;&xHp!EGZKR-Sn{Zc%0N$ir&1X5F;64`V4CCd&-{FXQ{w^{X!M z*D(V<6^lZGj;?u!5c;)^4DBeR7j^bUaWCNPQ{~$|Q_szS@2CWFXJ=Jlt-zOv?{{2r ztHmkrir?7Y=VqlfD>kaOOwhyJ{JwCz<)-!X>WMq7xl^H7uBZd}ZPUK@zxJwmZSl`v R+yplSq}QcrH;>IO`ZqilRVV-e literal 0 HcmV?d00001 diff --git a/assets/furniture/oven.png b/assets/furniture/oven.png new file mode 100644 index 0000000000000000000000000000000000000000..189570ce1c97c120a62e1643d2885a1af63e735d GIT binary patch literal 9790 zcmeHLcT|(hwhz6Dc#bFv2od$z2qdA0Dn+D)F1>`1K$H?f=p7YMM3AOZ)dM0$iUQhVH8@ytqa{S%> znqTS<^7l{q2m8mqM;1X(2=FYuAaaUgYu{Wb+}B=mfBNtUhMn!hIAho}CIzE7F2DE6 zXuqmbs(E?tGMR0jj^;6XuH{qF*rk>pjtE-5BiLAqC&=no2r<*{$Fq({o_@0)ct>Du{udpWH1YkRN(7T+w+llrS#KE4 ztZ(s`-*zQOuv;1ncAto7_kSOzqy1T6Uz2kNRr6su{$%9o2%f9iZL9jk!naTF9?rcp zln-Tqoam`EW|@-cq4l6XB&uEuk4nQtur0v(&59wl6unm8}f!85;IqA)aD`8yV>YNn#!yO}J9q#mkWl5kiOECF%Tr zU30kam6~KSoD}6{m?8Itb9osf%u@^_(!!p!R zM`0c91u)i*RyYB7dm^wn2t-QOoru9+#*v{`I2(e4G~ZlFIUkf@EzM^jq5;<+D&TAh z7d%NgT~D+g*7Gt}!kSN3hFQuT1r*rh$QY=*y`6(I%3YdoM=uJrDcyp6&>a!-WobS` z4K1jGBMAo;77!MI!<5_!u1G!^W~da&8jsRZJpWAvc#`I`C6kFLK|wb+Hvu;x0Y{RJ zAVNYyLJ*D=L?U580_N=DK*qSk9Gs6)RP5?d#5rS01R|N>=m4eY#8^4Hkfr(fz&P}e z{n-;WG`_2MaQ=n@z(dd-Lli^^zywf085< z@PC5!)7~f}JIDEPBVhV>y+29+arPZyAf=&!Qgp<+P`0O{D9uM%A7$-`C0L_&nxZ(I zwYY?c6%2tyB4EOBybw$Rixq>3;xN`25eXzh94GXHDisH3GR6Umqo@MP1qeWo7*1Fi zZY3-XLkd}m!-R#bg<%pn2{9N>R74yJ9l3W1gwMhGTsjjzbeN0L1TTqnUEV}lbUI@s(CPyk1r z(^8S2}PM3_KpotJe!iC^sV&ZTFTo@sY_*3X2 zj^qq1k)jg;7Z4KP8KGPY3LFLii=o&lP_WYv&Vo`P;V@)JlAfcZoirb1OHj(p@536v zovblrj3S1N14`jYVH8{peD&Z66hah*kT?rRqToNsJ6aR)9{-y(#d)AoyH|dJ;0)IH z*y-B!C|#V>?$hq09bw0npwJzsKw+@EM{vft;;eV}33TlaVQn!EHaHMHzM1PE{e*vE z3RXCzm^DBThD3^h`x6tz!^A}};xH?$2wp-+6p6=KTm7uv*%426!;o<2Yyge`D`1{G zSV2$iT-52GrQK|Clv@CR!Qf)xs|SapL;!f=-vAT*?;lar3NL}ciQ!>FLc%*HDg?t= zVev4y2vS%Sj}XIINr?Qs>Hq5ycWeR)|M`egf|RiM$E8XM{?oPZ3j7d90W`aPAU=a| zFZey)f5VItS^tZlZ|3%2Tmh*5dy&6{@859!4cA{n;4caPZC!uE^_LL%OTvF!*Z&(_ z%zsvlI0r!V+(12OtD0;AYDs!4HDyJJ6XX)a=n{R~BhbS{ykO)Efw1hS{HP#t35P%@ z16f5wiD8_9o?{>T_-d6g1ag2yMe&@Td-qJQg}R5qg{^C3dbF?qa0;FsGHb=J&!3mNLR7^y{;)cU@?|WF7BMB}%YoSETkq zM8%X*nM&RW35-yxNlt&s;bSjlLw^;67l-$24!x16kPvFDTU_)=a&B1cyma}p%~D{v z?3N*9ACuq4FfVHl6FZZ?;ZY)FpE!h(8v-Rl43iW2LJ~$t@rjad=#Ff&mfw}bPemNy zKYLcq@#TEbUS653=4Ksc>jL_QPoGk}Ws=v{*2vpiKCEnPQ|oi(caEPpdGf4~kS>>~ zUDIfN{D^Bw0luD7?d2@C`qo6eaQpIO?%i zR~XjTrgGZ)`m(#ax+2Pj5QqoYuQRP~`u4tXQV@;TkaU}Ejdv_dPe|adq}QI`$Tw?f zGJ3x>tR#B&oh(6CLSn1|+Pi=FU=UAfK;~1v_uwHF*sqy=zD(~TB zpCS_x7Z;a>^-VRI_B$57>3x0X`UVEo!u5@bk~aKWC1w*76RN7J4}-ETTUuH;j~vm5 z?t^=`=j};o(~{+HNu8XV>#*2b;LuQ4r`@cZAlD4f+t$XyY8o0YUb>WVoZ#(kdgaQM z$(b2_H@D|OK|y=`##YvsCeo58SIW0b7Zw+>3o_YeCHPKr_0A20^Tn<x<#G5Rx-$SgBjpvs^_*MO9O?W4JneY$Ge3_iT#V(!eVkpS6j! zbJr%wDE*5UA5~UX(j7_5%v96R&^SjI9~t?OP39}~HUN%$Q7HzH`-V{h~GnM@{77MBScoKH{^oIuu!PZ_X`Qq05 z>+vn%K~G2L*H-V1p-@5o_0%(UUyc5l7v5$rJDtaKTr|9J4lH-zzyUQGS0$xuZ>y`@ z+S~DmPAz(t#ugp_%C~s8%I|q!!ph3F@k?w&dDz=|_j2Rd&{LVEzOSEMTU_d}U|3S= z_nIpWIkH{4(ihb-k+72Bum472^FqkTk;s{unIIn=4u=uhKXzFrHYVoqa>4WGmr0~Z zMDlwE3Vp1p96?$4mQu1taW3?Dce#`h})n~R=HZ^**g+(%^ zXLw$5#&i@L-^gmH@v=4iE?vXs`U-20Nuk~K?xMPC(PXaNIQMj31WUr;Ag0O{d|DfD zGKH%j{o7uvZH9E==EuUDWLGv^r)}Z9J>Cvi=WutD&uv=1m4)2MJbgYYDvGsdcz9S_ z^3H1Ks58yQ{enx!@BvZx?h!h9xVdlsv<6pIS1#tt;NjcAg6(^YMb3-?qhm#hvFEK5 zU*FxkR5b}psE-%pDl91}`Q24uF|U4%KI^yLBhR>UIkfO_a_Sfu7`$$5X=}sX-LAst zzn^hk3=2wq1GZ{3kY$vA9(bMb^yN#J;+*BjiFFMP8R_Zoa~;PT5@X|wctSeXerc&4 zax7bYgz>Vqy^!p;qPSnhRNV86fYW$zD04(ssvtpdwW$4 z4YP#=-mtK+pdy(RUYm^PL#E=*;m*@#;)1nSJXbf4zTWn{EyFV>wmkH}_w~lx^5^}& zCIWYAb8}Ktl{f@U88cVKB_%UiI0PQ2roPGTA0feNpB`eFRSTE8KHh(R&HZKnNM83; z_0x|8Q!}$C(b4QxWrc;JK3_g4hjN~pnw)G_=JjEZ{&@QI>5S~`Lh@qK%!lESE&G)4 z>UA@j%pza@9(nfJ+-`;eb z46d{&z!(|y-TWkP(HMU{&wPC9dHLoO0gJLad3WPYmci1+2FbOa{;l(yhUsS=M?ZZU z*YsO!xnW-O@)#KIESnPx}dMXt?-JLRpU-lJ>dAAW!QF@vOOye{GQgX%pVR zlAmRErXF$cS>u>4u;1DK@|?lJ!Q|1Y3uyF3JpPfWUFUsZBDFKFCZmtazJ=-5I(<&j zWbcLRS;($6)ePQP&MG7OxcGRN*^d%tC9d`Gh?_Ad|1l?s+#JjjO-)VpmY_lm^FpW@ zAOSQG+P#zpNG?A%cGC^$*=ZwHa5JwW?ZM}8&>-La)2S8mr2%?mX^NC zZ0VGrpC6Z$v_-gfqr`2Fv-0u%`*IG?O?sX?8jwg&MX0OiR;JdLriwile>+N(^$=d{ zvtH=XU-l%FL-11dts~v}HkwTt_kkn7dUdYg*|S_@s(lQDEg(HDFS{N%crYU+MG+*b zJeGvB2HB5`iah%IoluE2jg1{|!?+53H$8FI*0wX<1t60|&YZ|RP90))XA*>2&cla4 zR0XrS%=Jkxt*iu_7U-@ytqx>o3&h06X1shURU9z9vhFg`d_uvZksGO`q|{w#Z_>%c zD2Lz@b`|F)iF4Pyd)E{TGub13*W|fFdVao;^;cmrv8f)%@-~n}Ioj%ti34OZ`7zM> zNxc4%M*K6kIdcyw9vLOe1MfhRa&;|KRa0y0?R}DIkTcnkC>hjWm)@q|)#)Ah(ZT&nwi_e@nbI=_5KH<`6WG_Aot(KsfcqqAR_zqN5IaR#p!Ig<;}? zHq3P8D;E?LsH&^)xikR|$}d3N@GYO5oRkl$pUNpm6KI;i9}kiYx<0L}bMT1Y5inye z=G52K#lEnkhk#hEt)UTCx3XedOg{Z-u3Se??~Bc%VEi19?@F(mzM2k$Odb7b@9^l{zZmamZ-oMR5Ub>`hklx(VqOY%CFus3#n0LDgsDE>kF$)?XC+Fki zGdVRC)j!t}K*MlwX$444PD~&^rv3g#y+U7GJ8yj5uDH0Ek<0Sh`ebI#!A;A;szEJ~ zE-T~a9a|o0V0zDe?C!2fqsyWmY{lhtWNO5V!phVN+~)dn%~Muip~I_xZ*A3+k**k` zB-q|wX&W>1$E98?^wMr3jx5y^a*s&{-)VbCVo*q9%Y|l1RQ=u|^s%7*myEx!D(d_;wSYl2v zJ!sFMf+$(`W-3X;_Cjte4p7MHK5^rB!q%-i%L7Q23OdzP?f?gr&8q z>3&AWnIkCj1rXq98{`wDy)K&P+__H`yH5%@8dyJ7O(Z$$q~>I6x^CR%1G2$YN5L1E z;#JzWCBO9dX2?PBr>CC=1d-tBi5ef{_5K_HJO`a1er|wY*seXxh+-qLPc=t}r)6=u5 z5uJ#_-J8`9JU|~3&Lhnk-8a?#L|0Xnx&OH3FFHCp&m4M-?;i~Yg@v&d)T4`L?Dh5i z=T=&pGN@wvx^ENItC@Qg6KU3 zCG}>CTyC#385{bINKa26Xe^eVp6;#Y&xq_u2N1LF+4I_BKv+bCPK0VgmFo7K@x7^- zqS-e}1J4QzISY^MW$51vWv+9nHC-9vBYMm52GH;;4BVYEH>JJRKX=E&3=6qY6F0cn zR{DZ5AuliQe*7jxaSRc%Ite89M%hr!8?4w~+%-(dk2V8L^+%ieZbiE(5e)s58~=Th z+%fxa#Tm$!yUToU>@M@y*8BIlIQQbf@#7ILaxdFTagxr)#&MYSu6!Hs{r;!m9WdwK z(9jB}BGaH5IcS9#O$fDfFR}xm!~ML+zB4H~&}zJq#RxzBfb| ziIg9Qs4>RhzI_{99Xd%W{e|DN2Y>^lX(q?6o=>d~=WQvat{guv?Ykj9jxTRX)6Beo z-@oE^N?aW05m{d;+wJl3Q%{aq{_=#=SxhzZ7O!kJ7*TtPF41S6238xHqML?(FBKsr zA(5Vva$JIYFZcp3lJq8UXw&K1cVDYtON zaz8yMr{fw62R}m2ZdD*g{$rZ1j?Tk?04fm?k@SKBeZYf!%Pl}|Rwo3!m=OTX?EMG{ z(EH36FAPCBRO`twpTWpo`uUI|$b~23Lm;tDsd0&ksd_shT!qm^nis+z;C02EQ(QAy zCN*7b#j1wC`~vRnZQ!@}iv?OAU~lFkHWmnuhvrl*&e%ks2Q zl?>phR~Xm?y!TX(kkX5byK^1!`18p=%ZFh{AhHE^GV9Yq^>uZJmO;r?3+fezrp~D) z`X_fkOOX$?P_eIIMITf?0to=ba*W2qGQVwKAPtzM(I_Gjp!#B}mY{PGx0fm#qyCK&S|y4qtGW@;>8#u|HqiAjh25gCVaTuj}Hn6v%ai z#r#gq)Y2JANfW@PntMy!aK3wn0C^;#5&=JKF0}87PE4#nNoPCKVBGqBe6>$b^t4Ed-pDcN5=ax1@zlMkpEW;uXX7jJt)WnaB zjC7azlz=SJ3fNfDqZjU7q4c>=*>{-w@o66QPPI+Ejm?x>`FbL_-n6NXoGI{*Dyy3* zOP=y}$#uFZN!sgRo6n7!?jeCYYUNu?IW7YgR6dLKVhgL@fQ=pX_CLUbq@$xFmGn}U zij0anMl$tEF}DQu1mGO{rlwiI>$kRieE^O0{5%j46dX)p2H-UoxXFFz{gvcTAQ0N1 zRz>Y*ilM|O zg@v(QxsayHZ}g?2d%CEoDCh_%B%+!9L&m44Q?AkY3mo{fF8haa>_164|4fT^d;T%A m-L@8+qpYa+!+wmn*bbh97izg`rhzx55EUh~Vz#_x;Qs&|*l7;{ literal 0 HcmV?d00001 diff --git a/assets/furniture/sideboard_1.png b/assets/furniture/sideboard_1.png new file mode 100644 index 0000000000000000000000000000000000000000..68767cb175c51df4b2e8d89bc9b9c0875803c373 GIT binary patch literal 4861 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 Y^Q#2M2f7}TRDc3S>!<0;C#5a^7Zd3E00000 literal 0 HcmV?d00001 diff --git a/assets/furniture/sink.png b/assets/furniture/sink.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c5edf4adcdae073c472dd3d39c469c6ad53d0e GIT binary patch literal 5813 zcmeHKdsLFy7Dr9-Vm_L*(ZnRINloM_0!eCuud9ZrC1vFYd?+RG1*oVs8+Gh$sWp|U)l^#P)zFzH8!NMim1W%nTIss8)?KZ8=f7AVhjaGX`*-&KoxS(s z`<53LV2+uLL7`CQL4h1T3T1!=^I}sIFdm{>e-D1@QzN6*d?*=*C>0WE0*q6qATSQr zNF^wgrcK5Rw>XP49eQCsE5k6#YprZirTv4KX&70XggC(wHy8J;@1DbAqrzzy`LvtG zPPiyn539Uy=(6u9hnQQc)cH9lQYK72ckFgd^J2}p8m)CgY$G>tk@KM!9Gjara|%|S z+vQ|<+tGn6z#sRist}ehD0e!@?%a`7Pl_oUaC!2qG&b#Z25w?v7#7;pGFiKP8e-%k z>9-a~GwgtB^8CpZ33@VLx zqCDB)lVQ8$spX3^uV40kU0`W;;=Vd0Q~JXL&9sBl*1P=jI-|&auzvzSaSvnS8m@HV zw&cL>Q|8|Z9=?9-c4l3Yy1+Vi0kLg*LF?*repzy8gPmo|jOST9 zp59Kp6Ht57{7%%(A(pbEPxRQUuC(RZVaNI#XwCjm*-KQaXV;tk`=qmw3S*;uZp*x7 z>(K>NJIyTPRbLFsx2KhEUHIG94QbK)eV$Do7=UPIH3wt^1J!>FDCRnyam*Dc4^NWf zIVhCHLMceA=+F?BNFj5F#0nwou8|=i-%uzoZw&&8mceSA5RQ||+4#PbXYe?wn2n$B z5lRY0{NQ+LV5$<1NDYe=r7jaO#dz=87%vSA0LWl9gwx0pB5*a*Bno~u2Ir*|OIUo4{|E$FvGMV0HNqkilarI(ld0|s zWgL;rWHN~)3Xwt~01bjFMXrW41i8vd2QiGnfmI@<6j4hRa-0qm5-JkaY&;(9mC_0;HAz12#THDo@mW z+=!IQ;0QIOW0UMjAyG*T3XSH$AW>+;2kG(V!Acd#L>(rXJ=cAzhvV z0KFWncyo=6gzrJGY{k|-?F zD1C)kDoOco+PdPwc@1BApi~9UPtl8pD=GqBKD-)UCP?+Agv05Jf(40&Lr_6UuvqUW zz#85X#Y6Hq7<7-3bbT+E{zWPXVTz}iOrjAe6c2EJo^%O;;Q=uSLXn4rNu^UHuvj=2 zU8RtylOZMS8wYpl+ zQJ4~jh(H(8JV3#~WC9b^5J3V_$qcbB<7xD<_FdyF-VLAAtmkizq)1W{Rc$YL0{xg7sT8>(Z5-c@oDFc#!Ab|oE3S~A? z_ccImF17_iv^pr1i|#?2d}%w5T_m8RP{vt79N$Py+rtjB!XCCoKfYHTf%o-wxP)@x z3GAosp2oM`6nNolL;vU}#;kKmCbNwkUK?MG4*bSqeBKQ)-ob5mV96;|CBK2cy`P*F zT)r%({a)3gJAFqPdp68%ef8#w>Pk)DB1~>>YRy)gQ$u26M1>hD-N>!P=HzPMdGqJ1 zYTk8s*N1VmkIPC*N?P9jBv`nxvAX&C^@tsr5w1R3lp*@#V8sAS{SZCvQTQCrsTA*G z>D*4WHx?h#c`iXw%r`JZ*SgqTKT=)&L+?;PKtK}S73*Kbzw{iVGu$f&#yg}6EB3IA)W*eDeBbn#BaY*i_=g3zp zvw_SKC~dFb@h_XOcbYBBi+r_KzkOdvZnI6#oMN#f$7p-KZ+2$w)JfGjPnWKjC`|LJ z#vA5*>u+~PW^(*e?$xsfk&K?M?e*!Td`x=grfyU0>JiMYedc?S*k^m_S!Bjugx3Lp zEYXpS)wOle*l`v+iYBHqv!+-`*6gY`;B{$r%BCyr$62H@%6U@}08$qy;&oYFKk@X= z-d^AAv$vwcf~7q_Zt(?+%$ZRm;ouO`By_r;hW^81;4JXi73-tjUT@dBE2TXZ3Fd}S zOfJNWbf}C{Lmu!GglE=%Hpr!>HQz4TZk)x|HlLm@lq>SHD6R5hPV%@UhtNr~IM1eMI-6=E1 z!WHZ93a&`{%uj@GoWLkW4i5!zI4fTMelw>1`15Wqhx6dhF~Oxh^!TM_SpUZj-m8`j z_21lf{D`V%x6Q3M`xkip&Zl(&%%iHAc>Gq!zFE%37UKur=FN4&cT-*@mA7x|s$@WJ zAjY!aqprXYFPG#N;!|Hw5xH%foi^!ds^Pt3y}sI}px(B$2@{sT{^P=N_gP2Fhi2cr z-M#DbSKE%IA=hjO}R*XR>QKU6@)p@SN z%NYfJ*KPk0OkZo?xfdzsAD`pVw(3$a9RK)Pe#Sh9eMr{Y_T;u4S8S7UYO*USlHvC2 z_7mK#bF(oy(+4ft2k*0bmfkoxlayZ(-euMJYDIt0R&sfMCMF=e%6i-3cdjkRUOe*E z7E+MGxuNG59dV5EG|Va0RF6C#WYpxQeqe&5 zu`!s2Tqe|N!c7DmKb#q^HMP?FHvv}3RGMC=o-qSYD7aJOa-t`gh zcY$ggk3&F1&=00qFdG>_)tiFk93K9<3Fte4bA7+xmgvu(peDzMJTWQLpLJ+?w`2MUMbkl>TZr@$MzC2x+{&Y#tn_~Xp`5mb2 zoMvL4zi8H_6@pX0#wWxH25P%d+4Je`Pv2st;Yk-eJ3HqW6&2knD?Gh6_llG77szm3 s+^q(|MmYaK%b#aEIyz>odA#qfF?Y9FrI>cD9<*pw5I2ldJ|{Ng-)`)mt^fc4 literal 0 HcmV?d00001 diff --git a/assets/furniture/stove.png b/assets/furniture/stove.png new file mode 100644 index 0000000000000000000000000000000000000000..f7244600a3b34e4fe0134f71af361dfe901db508 GIT binary patch literal 4508 zcmeHLd2kcw6<-L(M#fMuP@Ds=WhcNSt37q>MgoH*kQ&Pf<4_;d)~nr5@?x!aqg`9F znY7q-JA{_THf<@H)Hz9863&!PCLtjhNQY@UC9Z8^m=*$QLkbBgheLssek=K$WTxY3 z`Olh_^zA!--+RCJzBgJu5iDJqW4hafAV`ki=P5&wN%z8aR@PMb`QVY_e)x5ysk}lj z;}fVFSHe;hpn9VUP>__u2$DQ02difvMzd~xKF8Ja`mdAsUO8W)96y)H^*wM*j~vMm zGrDekao}*ByL9%8%+5Fae7>!nnNO@Z{Jy+tU$qvFe7s<0WOX>}0KaQ3?mYW#)ih&Y zd{%dV?w?)n9lds~;KO|W!lEq?S$e*e)j#`K#t%2otvk_hA76FuzIBoO9Qni&Z|7S~ zOj$hL{L$QL?el_l$f@=X%evpaTu}W$rb+JFn``;-bmxrLe7dT#^eB0ifeAh?x!pm( z+dY&I%;M?C+gaaTtLJ$CRMInrte77>5;Em}cpes(cg z^h#03;-fcPwpwodb5>dXuN=8Q@=DduBz$KNfKYh=)&g2rkwTNeV3m<-dtdQ_toO*8Jnp_(@(QHe!u)sL20Xc&+VE& z=D+ac70pi0q`e|M-*;={((Aw6xg~FA@4{=X&t2)SKfUtpH*!utdg2Q%{+CO_XU;?0 zd#~=!@9N1+?g+@&ktX{Gw|4wSdRX0?ao3aH-nDfdnQe4l^5Kl{&At(PcK!Cw>T{i2 z)>rH(zIyk-0MBH<`LaAPu>bD^%BsSH`5PISuvuPF}JG?kVMO?3h*nwKsy zIg=a&kb%ylNjVzRxTMRR!sX!F5aVVvWun))%oTwk>Q>?aWh{(^z`RMRfif>Kq0YD% z=E^)P1|i^`%UrALDu?5VM8cAwElNCslPt^P1cg%+1}!kHF{blLET$D25NQk#(1f_8 z>XH&e4NN|y)ax#@8S2rY_+&K@7>18&gDgNk@FcI|q=mp`86WMT>D~qiG8oWTdT8bF zeBxz5Q|jXa@HT*$UN{;;6o&oP`gk;zjws+D3S?-i!ClEQTdwp6g2NsL1rbSBQ(lnl zF_yX%9wBQ?Y=$P4&gej(`!Mbp>!I9J#?UGd;5>>@Z-nRfxXi}>oTvzr$fcGx07M6C z4Phijkr+dSX^a&FJ7xpC$Xi*8bO3r3ls~5Fd`tia6a=?O5Xb5e?2KRs7{dx8#?Ul@ z@ghVNc)-|bD`2hUXoyvD33eqP9UYYcB|@lhn77e@a9}LK+AxNq;mXd_7$fo_8shK{ zl1fD*3fu}MF7vRQlFUZ{uEruMg+VyCEa-QcDGM{qN5-C=n98r`@GFYSY z2AiavB51_h{TBrLQer7_CF!DJw@ywRr+ASH*naPBzZbtPV| zC{dT$2njVjht&aioJ3ydJ-iMeC_ynCVTV^aL2|T}BZ&tIiX%qZE20!`{BPFA;X$40 zlKUhL?%$XarBBov@L2jTeH)chM+rq!hl1mUbP5{Z0K`4HNjkrkL&ta%_rD+!%{PMRnp|Dtp>s)EtG>q-AhE!*P!f&-+2nV7zzoHP~)< zatjol*koM%PS7<$*SHuMm+?e*P0%$i2F7JP(Ov&Hx=bTaj35So=q2FuAojL937;jW zh8|hzK^{ZaA(iW<_Pzuq(^Oxjh9KFw#(NU-)YJ2!FjMyjyqV`Sr+&RKyZxz`pMfID z?^#w}``1tU_s;Dqp6)rsu9?=_GiiS?cjpH8Kd33e$se6xHSM1BJ6~)r{PeXNU&rkx z;i!D3xo%t0wu|hZ-e||g_w;vme_C`*e`Hoszjmfa?YOwF414RuxuR{d>&y@6Qf|S* eZP(}BMt;K2c=B(}n~eWn5Wlz7vuk-x%YOiPcs=C+ literal 0 HcmV?d00001 diff --git a/assets/furniture/toaster.png b/assets/furniture/toaster.png new file mode 100644 index 0000000000000000000000000000000000000000..e263173eac08dda2484241f76114cbae1e4245ed GIT binary patch literal 128716 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 Date: Sun, 7 Jul 2024 09:21:18 +0200 Subject: [PATCH 05/16] remove .gitkeep --- assets/furniture/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/furniture/.gitkeep diff --git a/assets/furniture/.gitkeep b/assets/furniture/.gitkeep deleted file mode 100644 index e69de29..0000000 -- 2.45.2 From 1cdb6156f8dcea4a3ef626016789d490d4b7b681 Mon Sep 17 00:00:00 2001 From: Glaeder Date: Sun, 7 Jul 2024 10:04:29 +0200 Subject: [PATCH 06/16] Added setup to house and WIP Furniture tiles --- src/activities/house/furniture.rs | 10 ++++++- src/activities/house/mod.rs | 45 ++++++++++++++++++------------- src/activities/house/player.rs | 20 +++++++------- src/activities/house/room.rs | 42 ++++++++++++++++++----------- src/game.rs | 9 +++++-- src/main.rs | 14 +++++----- 6 files changed, 84 insertions(+), 56 deletions(-) diff --git a/src/activities/house/furniture.rs b/src/activities/house/furniture.rs index 139c178..8682efb 100644 --- a/src/activities/house/furniture.rs +++ b/src/activities/house/furniture.rs @@ -1,14 +1,16 @@ use comfy::{error, texture_id, EngineContext, HashSet, Lazy, Mutex, TextureHandle}; -use std::{fs, io, sync::Arc}; +use std::{fmt::Debug, fs, io, sync::Arc}; static ASSETS_LOADED: Lazy>>> = Lazy::new(|| Arc::new(Mutex::new(HashSet::new()))); +#[derive(Debug)] struct FurnitureAsset { folder: String, name: String } +#[derive(Debug)] struct FurnitureTextureHandles { human: Option, magnet: Option, @@ -70,6 +72,12 @@ pub struct Furniture { on: Box bool> } +impl Debug for Furniture { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Furniture").field("asset", &self.asset).field("handles", &self.handles).finish_non_exhaustive() + } +} + impl Furniture { pub fn new, N: Into>( folder: F, diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index 96e19cf..399a737 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -3,6 +3,7 @@ mod grid; mod player; mod room; +use comfy::EngineContext; use grid::Grid; use player::Player; use room::Room; @@ -14,33 +15,39 @@ pub struct HouseState { player: Player } -impl Default for HouseState { - fn default() -> Self { - let room = Room::default(); +pub fn setup(state: &mut crate::State, ctx: &mut EngineContext<'_>) { + let house = { + let room = Room::new(ctx); let player = Player::new(&room); - Self { room, player} - } + HouseState { room, player} + }; + + state.house = Some(house); } -pub fn draw(state: &crate::State, _engine: &comfy::EngineContext<'_>) { +pub fn draw(state: &crate::State, ctx: &comfy::EngineContext<'_>) { + if let Some(house) = &state.house { //Draw House - state.house.room.draw(); + house.room.draw(); //Draw Grid //state.house.grid.draw(); //Draw Player - state.house.player.draw(); -} - -pub fn update(state: &mut crate::State, _engine: &mut comfy::EngineContext<'_>) { - state.house.player.update(&state.house.room.grid); - - if state.house.player.is_moving_to_right_room(&state.house.room) { - state.house.room = Room::default(); - state.house.player.reset_on_room(&state.house.room, true); - } else if state.house.player.is_moving_to_left_room(&state.house.room) { - state.house.room = Room::default(); - state.house.player.reset_on_room(&state.house.room, false); + house.player.draw(); + } +} + +pub fn update(state: &mut crate::State, ctx: &mut comfy::EngineContext<'_>) { + if let Some(house) = &mut state.house { + house.player.update(&house.room.grid); + + if house.player.is_moving_to_right_room(&house.room) { + house.room = Room::new(ctx); + house.player.reset_on_room(&house.room, true); + } else if house.player.is_moving_to_left_room(&house.room) { + house.room = Room::new(ctx); + house.player.reset_on_room(&house.room, false); + } } } diff --git a/src/activities/house/player.rs b/src/activities/house/player.rs index 7ba89fb..900a943 100644 --- a/src/activities/house/player.rs +++ b/src/activities/house/player.rs @@ -1,4 +1,4 @@ -use super::{room::Room, Grid}; +use super::{room::Room, Grid, room::SCALE}; use comfy::{delta, draw_circle, is_key_down, vec2, KeyCode, Vec2, RED}; use std::collections::HashSet; @@ -12,9 +12,9 @@ pub struct Player { impl Player { pub fn new(room: &Room) -> Self { - let scale = 4.0; + Player { - position: vec2(((0.25) - room.size.0 as f32 / 2.0) * scale, room.grid.nodes.get(0).unwrap().y), + position: vec2(((0.25) - room.size.0 as f32 / 2.0) * SCALE, room.grid.nodes.get(0).unwrap().y), speed: 10.0, connection: 0, next_connections: vec![1], @@ -36,24 +36,24 @@ impl Player { } pub fn is_moving_to_right_room(&self, room: &Room) -> bool { - let scale = 4.0; + - self.position.x > (room.size.0 as f32 / 2.0) * scale + self.position.x > (room.size.0 as f32 / 2.0) * SCALE } pub fn is_moving_to_left_room(&self, room: &Room) -> bool { - let scale = 4.0; + - self.position.x < -(room.size.0 as f32 / 2.0) * scale + self.position.x < -(room.size.0 as f32 / 2.0) * SCALE } pub fn reset_on_room(&mut self, room: &Room, place_left: bool) { - let scale = 4.0; + let offset = 0.1; let x = if place_left { - (offset - room.size.0 as f32 / 2.0) * scale + (offset - room.size.0 as f32 / 2.0) * SCALE } else { - (room.size.0 as f32 / 2.0 - offset) * scale + (room.size.0 as f32 / 2.0 - offset) * SCALE }; self.position = vec2(x, room.grid.nodes.get(0).unwrap().y); diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 60e3cde..03bb9a1 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -1,8 +1,10 @@ use comfy::*; -use super::grid::Grid; +use super::{furniture::Furniture, grid::Grid}; -#[derive(Debug)] +pub const SCALE: f32 = 4.0; + +#[derive(Debug, PartialEq)] enum RoomType { Kitchen, Bath, @@ -15,7 +17,14 @@ enum RoomType { pub struct Room { room_type: RoomType, pub size: (u8, u8), //(width, height) - pub grid: Grid + pub grid: Grid, + tiles: Vec +} + +#[derive(Debug)] +enum Tile { + Single(Furniture), + Double(Furniture, Furniture) } impl RoomType { @@ -31,18 +40,19 @@ impl RoomType { } } -impl Default for Room { - fn default() -> Self { - Room::load() //Just for testing purposes - } -} impl Room { - pub fn load() -> Self { + pub fn new(ctx: &mut EngineContext<'_>) -> Self { let room_type = RoomType::random(); let size = Self::random_size(&room_type); - Room { room_type, size, grid: Self::create_grid(size.0, size.1)} + let mut tiles = Vec::new(); + + if room_type == RoomType::Kitchen { + tiles.push(Tile::Single(Furniture::new("kitchen", "fridge", ctx))); + } + + Room { room_type, size, grid: Self::create_grid(size.0, size.1), tiles} } fn random_size(room_type: &RoomType) -> (u8, u8) { @@ -63,7 +73,7 @@ impl Room { error!("START GRID CREATION!"); let left_border = width as f32 / 2.0; let lower_border = height as f32 / 2.0; - let scale = 4.0; + //Lower Cable let lower_cable_y = height as f32 / 6.0; @@ -73,11 +83,11 @@ impl Room { let max_offset = ((width / 2) as i32).max(1); while current_x < width as f32 { - nodes.push(vec2((current_x - left_border) * scale, (lower_cable_y - lower_border) * scale)); + nodes.push(vec2((current_x - left_border) * SCALE, (lower_cable_y - lower_border) * SCALE)); current_x += random_i32(1, max_offset) as f32; } current_x = width as f32 + 0.5; - nodes.push(vec2((current_x - left_border) * scale, (lower_cable_y - lower_border) * scale)); + nodes.push(vec2((current_x - left_border) * SCALE, (lower_cable_y - lower_border) * SCALE)); let mut connections = Vec::new(); for i in 1..nodes.len() { @@ -92,7 +102,7 @@ impl Room { let last_lower_node_index = nodes.len(); for (i, index) in node_indices.iter().enumerate() { - nodes.push(vec2(nodes.get(*index).unwrap().x,(upper_cable_y - lower_border) * scale)); + nodes.push(vec2(nodes.get(*index).unwrap().x,(upper_cable_y - lower_border) * SCALE)); connections.push((*index, last_lower_node_index + i)); } @@ -100,9 +110,9 @@ impl Room { } pub fn draw(&self) { - let scale = 4.0; + let (width, height) = self.size; - let (width, height) = (width as f32 * scale, height as f32 * scale); + let (width, height) = (width as f32 * SCALE, height as f32 * SCALE); draw_rect_outline(vec2(0.0, 0.0), vec2(width, height), 0.3, RED, 0); diff --git a/src/game.rs b/src/game.rs index 2a2abf2..4d25538 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,6 +1,5 @@ use crate::{ - activities::{house, overworld, Activity}, - State + activities::{house, overworld, Activity}, assets::Assets, State }; use comfy::EngineContext; use std::ops::Sub; @@ -43,6 +42,12 @@ impl Sub for ZLayer { } } +pub fn setup(state: &mut State, ctx: &mut EngineContext<'_>) { + Assets::load(ctx); + + house::setup(state, ctx); +} + pub fn update(state: &mut State, engine: &mut EngineContext<'_>) { match state.activity { Activity::House => house::update(state, engine), diff --git a/src/main.rs b/src/main.rs index 0f0fe28..ead1564 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,7 +28,7 @@ struct State { activity: Activity, ghost: Ghost, overworld: Overworld, - house: HouseState + house: Option } impl GameLoop for State { @@ -36,14 +36,14 @@ impl GameLoop for State { Self::default() } - fn update(&mut self, engine: &mut EngineContext<'_>) { + fn update(&mut self, ctx: &mut EngineContext<'_>) { if !self.setup_called { - setup(engine); + game::setup(self, ctx); self.setup_called = true; } - game::update(self, engine); - game::draw(self, engine); + game::update(self, ctx); + game::draw(self, ctx); } } @@ -51,9 +51,7 @@ fn config(config: GameConfig) -> GameConfig { config } -fn setup(ctx: &mut EngineContext<'_>) { - Assets::load(ctx); -} + async fn run() { init_game_config(GAME_NAME.to_string(), env!("CARGO_PKG_VERSION"), config); -- 2.45.2 From 8f67dad44c290f2799c9b7a0197ecd9a191cf989 Mon Sep 17 00:00:00 2001 From: Glaeder Date: Sun, 7 Jul 2024 11:38:13 +0200 Subject: [PATCH 07/16] Added furniture drawing to room-creation. Run clippy and fmt --- src/activities/house/furniture.rs | 17 +++- src/activities/house/grid.rs | 10 +-- src/activities/house/mod.rs | 16 ++-- src/activities/house/player.rs | 64 +++++++-------- src/activities/house/room.rs | 124 +++++++++++++++++++++--------- src/game.rs | 4 +- src/main.rs | 3 - 7 files changed, 150 insertions(+), 88 deletions(-) diff --git a/src/activities/house/furniture.rs b/src/activities/house/furniture.rs index 8682efb..a776c6b 100644 --- a/src/activities/house/furniture.rs +++ b/src/activities/house/furniture.rs @@ -74,7 +74,10 @@ pub struct Furniture { impl Debug for Furniture { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Furniture").field("asset", &self.asset).field("handles", &self.handles).finish_non_exhaustive() + f.debug_struct("Furniture") + .field("asset", &self.asset) + .field("handles", &self.handles) + .finish_non_exhaustive() } } @@ -95,4 +98,16 @@ impl Furniture { on: Box::new(|| false) } } + + pub fn get_human_texture_handle(&self) -> Option { + self.handles.human + } + + pub fn get_elec_texture_handle(&self) -> Option { + self.handles.elec + } + + pub fn get_magnet_texture_handle(&self) -> Option { + self.handles.magnet + } } diff --git a/src/activities/house/grid.rs b/src/activities/house/grid.rs index 55839f0..9cf5752 100644 --- a/src/activities/house/grid.rs +++ b/src/activities/house/grid.rs @@ -13,12 +13,12 @@ impl Default for Grid { } impl Grid { - pub fn new(nodes: Vec, connections: Vec<(usize, usize)>) -> Self { - let mut grid = Grid { nodes, connections }; - grid.sanitize(); + pub fn new(nodes: Vec, connections: Vec<(usize, usize)>) -> Self { + let mut grid = Grid { nodes, connections }; + grid.sanitize(); - grid - } + grid + } fn load() -> Self { let mut grid = Self { diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index 399a737..b6f34ed 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -19,22 +19,22 @@ pub fn setup(state: &mut crate::State, ctx: &mut EngineContext<'_>) { let house = { let room = Room::new(ctx); let player = Player::new(&room); - HouseState { room, player} + HouseState { room, player } }; state.house = Some(house); } -pub fn draw(state: &crate::State, ctx: &comfy::EngineContext<'_>) { +pub fn draw(state: &crate::State, _ctx: &comfy::EngineContext<'_>) { if let Some(house) = &state.house { - //Draw House - house.room.draw(); + //Draw House + house.room.draw(); - //Draw Grid - //state.house.grid.draw(); + //Draw Grid + //state.house.grid.draw(); - //Draw Player - house.player.draw(); + //Draw Player + house.player.draw(); } } diff --git a/src/activities/house/player.rs b/src/activities/house/player.rs index 900a943..23389fb 100644 --- a/src/activities/house/player.rs +++ b/src/activities/house/player.rs @@ -1,4 +1,7 @@ -use super::{room::Room, Grid, room::SCALE}; +use super::{ + room::{Room, SCALE}, + Grid +}; use comfy::{delta, draw_circle, is_key_down, vec2, KeyCode, Vec2, RED}; use std::collections::HashSet; @@ -11,15 +14,17 @@ pub struct Player { } impl Player { - pub fn new(room: &Room) -> Self { - - Player { - position: vec2(((0.25) - room.size.0 as f32 / 2.0) * SCALE, room.grid.nodes.get(0).unwrap().y), - speed: 10.0, - connection: 0, - next_connections: vec![1], - } - } + pub fn new(room: &Room) -> Self { + Player { + position: vec2( + ((0.25) - room.size.0 as f32 / 2.0) * SCALE, + room.grid.nodes.first().unwrap().y + ), + speed: 10.0, + connection: 0, + next_connections: vec![1] + } + } pub fn draw(&self) { draw_circle(self.position, 0.5, RED, 0); @@ -35,31 +40,26 @@ impl Player { } } - pub fn is_moving_to_right_room(&self, room: &Room) -> bool { - + pub fn is_moving_to_right_room(&self, room: &Room) -> bool { + self.position.x > (room.size.0 as f32 / 2.0) * SCALE + } - self.position.x > (room.size.0 as f32 / 2.0) * SCALE - } + pub fn is_moving_to_left_room(&self, room: &Room) -> bool { + self.position.x < -(room.size.0 as f32 / 2.0) * SCALE + } - pub fn is_moving_to_left_room(&self, room: &Room) -> bool { - + pub fn reset_on_room(&mut self, room: &Room, place_left: bool) { + let offset = 0.1; + let x = if place_left { + (offset - room.size.0 as f32 / 2.0) * SCALE + } else { + (room.size.0 as f32 / 2.0 - offset) * SCALE + }; - self.position.x < -(room.size.0 as f32 / 2.0) * SCALE - } - - pub fn reset_on_room(&mut self, room: &Room, place_left: bool) { - - let offset = 0.1; - let x = if place_left { - (offset - room.size.0 as f32 / 2.0) * SCALE - } else { - (room.size.0 as f32 / 2.0 - offset) * SCALE - }; - - self.position = vec2(x, room.grid.nodes.get(0).unwrap().y); - self.connection = 0; - self.next_connections = vec![1]; - } + self.position = vec2(x, room.grid.nodes.first().unwrap().y); + self.connection = 0; + self.next_connections = vec![1]; + } } fn move_player(player: &mut Player, allowed_movement: (bool, bool, bool, bool)) { diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 03bb9a1..494ecfa 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -1,4 +1,9 @@ -use comfy::*; +use comfy::{ + draw_rect_outline, draw_sprite, error, random_i32, vec2, EngineContext, HashSet, + Vec2, GREEN, RED, WHITE +}; + +use crate::game; use super::{furniture::Furniture, grid::Grid}; @@ -18,13 +23,7 @@ pub struct Room { room_type: RoomType, pub size: (u8, u8), //(width, height) pub grid: Grid, - tiles: Vec -} - -#[derive(Debug)] -enum Tile { - Single(Furniture), - Double(Furniture, Furniture) + furnitures: Vec<(Vec2, Vec2, Furniture)> //(pos, size, furniture) } impl RoomType { @@ -40,40 +39,51 @@ impl RoomType { } } - impl Room { - pub fn new(ctx: &mut EngineContext<'_>) -> Self { + pub fn new(ctx: &mut EngineContext<'_>) -> Self { let room_type = RoomType::random(); let size = Self::random_size(&room_type); - let mut tiles = Vec::new(); + let mut furnitures = Vec::new(); if room_type == RoomType::Kitchen { - tiles.push(Tile::Single(Furniture::new("kitchen", "fridge", ctx))); + 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) + )); } - Room { room_type, size, grid: Self::create_grid(size.0, size.1), tiles} - } - - fn random_size(room_type: &RoomType) -> (u8, u8) { - match room_type { - 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) - } + Room { + room_type, + size, + grid: Self::create_grid(size.0, size.1), + furnitures } } - fn create_grid(width: u8, height: u8) -> Grid{ + fn random_size(room_type: &RoomType) -> (u8, u8) { + match room_type { + 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) + } + } + + fn create_grid(width: u8, height: u8) -> Grid { error!("START GRID CREATION!"); 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; @@ -83,26 +93,37 @@ impl Room { let max_offset = ((width / 2) as i32).max(1); while current_x < width as f32 { - nodes.push(vec2((current_x - left_border) * SCALE, (lower_cable_y - lower_border) * SCALE)); + nodes.push(vec2( + (current_x - left_border) * SCALE, + (lower_cable_y - lower_border) * SCALE + )); current_x += random_i32(1, max_offset) as f32; } current_x = width as f32 + 0.5; - nodes.push(vec2((current_x - left_border) * SCALE, (lower_cable_y - lower_border) * SCALE)); + nodes.push(vec2( + (current_x - left_border) * SCALE, + (lower_cable_y - lower_border) * SCALE + )); let mut connections = Vec::new(); - for i in 1..nodes.len() { - connections.push((i-1, i)); + for i in 1 .. nodes.len() { + connections.push((i - 1, i)); } //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); - let node_indices: HashSet = (0..lamp_amount).map(|_| random_i32(1, nodes.len() as i32 - 1) as usize).collect(); - + let node_indices: HashSet = (0 .. lamp_amount) + .map(|_| random_i32(1, nodes.len() as i32 - 1) as usize) + .collect(); + let last_lower_node_index = nodes.len(); for (i, index) in node_indices.iter().enumerate() { - nodes.push(vec2(nodes.get(*index).unwrap().x,(upper_cable_y - lower_border) * SCALE)); + nodes.push(vec2( + nodes.get(*index).unwrap().x, + (upper_cable_y - lower_border) * SCALE + )); connections.push((*index, last_lower_node_index + i)); } @@ -110,11 +131,38 @@ impl Room { } pub fn draw(&self) { - let (width, height) = self.size; - let (width, height) = (width as f32 * SCALE, height as f32 * SCALE); - draw_rect_outline(vec2(0.0, 0.0), vec2(width, height), 0.3, RED, 0); + 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() + ); + } + } self.grid.draw(); } diff --git a/src/game.rs b/src/game.rs index 4d25538..1a638c1 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,5 +1,7 @@ use crate::{ - activities::{house, overworld, Activity}, assets::Assets, State + activities::{house, overworld, Activity}, + assets::Assets, + State }; use comfy::EngineContext; use std::ops::Sub; diff --git a/src/main.rs b/src/main.rs index ead1564..0ecf53c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,6 @@ mod ui; use self::{ activities::{house::HouseState, overworld::worldgen::Overworld, Activity}, - assets::Assets, game::Ghost }; use comfy::{ @@ -51,8 +50,6 @@ fn config(config: GameConfig) -> GameConfig { config } - - async fn run() { init_game_config(GAME_NAME.to_string(), env!("CARGO_PKG_VERSION"), config); let mut engine = EngineState::new(); -- 2.45.2 From c5ac0b39b203d05690379b4d8fd44c503147d551 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 11:40:02 +0200 Subject: [PATCH 08/16] fix texture loading --- src/activities/house/furniture.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activities/house/furniture.rs b/src/activities/house/furniture.rs index a776c6b..f66811e 100644 --- a/src/activities/house/furniture.rs +++ b/src/activities/house/furniture.rs @@ -37,7 +37,7 @@ impl FurnitureAsset { ) -> Option { let mut loaded = ASSETS_LOADED.lock(); if loaded.contains(&path) { - return None; + return Some(texture_id(&path)); } let bytes = match fs::read(format!( "{}/assets/furniture/{path}", -- 2.45.2 From a614cd0644dc0fb172b084c66f56ac57eb363f7d Mon Sep 17 00:00:00 2001 From: Glaeder Date: Sun, 7 Jul 2024 11:50:35 +0200 Subject: [PATCH 09/16] Random furnitur skeleton --- src/activities/house/room.rs | 55 +++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 494ecfa..391db07 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -18,12 +18,14 @@ enum RoomType { SleepingRoom } +type Tile = (Vec2, Vec2, Furniture); //(pos, size, furniture) + #[derive(Debug)] pub struct Room { room_type: RoomType, pub size: (u8, u8), //(width, height) pub grid: Grid, - furnitures: Vec<(Vec2, Vec2, Furniture)> //(pos, size, furniture) + furnitures: Vec } impl RoomType { @@ -44,25 +46,7 @@ impl Room { let room_type = RoomType::random(); let size = Self::random_size(&room_type); - let mut furnitures = Vec::new(); - - if room_type == RoomType::Kitchen { - 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) - )); - } + let furnitures = Self::random_room_furniture(&room_type, size, ctx); Room { room_type, @@ -73,6 +57,9 @@ impl Room { } fn random_size(room_type: &RoomType) -> (u8, u8) { + //Kitchen + Living Room 5-8 + //Bath + sleepingroom 4-6 + //Toilet 2-3 match room_type { RoomType::Kitchen | RoomType::LivingRoom => (random_i32(5, 8) as u8, 3), RoomType::Bath | RoomType::SleepingRoom => (random_i32(4, 6) as u8, 3), @@ -80,6 +67,34 @@ impl Room { } } + fn random_room_furniture(room_type: &RoomType, size: (u8, u8), ctx: &mut EngineContext<'_>) -> Vec { + let mut furnitures = Vec::new(); + let width = size.0; + + match room_type { + RoomType::Kitchen => { + 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) + )); + } + _ => {} + } + + furnitures + } + fn create_grid(width: u8, height: u8) -> Grid { error!("START GRID CREATION!"); let left_border = width as f32 / 2.0; -- 2.45.2 From d63c487b9d3632e6c41dee4d527e8c8095ea0e9c Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 12:33:22 +0200 Subject: [PATCH 10/16] start distributing kitchen furniture --- Cargo.lock | 1 + Cargo.toml | 1 + src/activities/house/room.rs | 127 +++++++++++++++++++++++++++++------ 3 files changed, 109 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e71edcb..c22856b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2129,6 +2129,7 @@ version = "0.1.0" dependencies = [ "comfy", "heck", + "indexmap", "log", "resvg", ] diff --git a/Cargo.toml b/Cargo.toml index 3dfe2bc..49f8e70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ opt-level = 3 [dependencies] comfy = { version = "0.4.0", features = ["wayland"] } +indexmap = "2" log = "0.4.22" [build-dependencies] diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 391db07..358d061 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -1,11 +1,10 @@ -use comfy::{ - draw_rect_outline, draw_sprite, error, random_i32, vec2, EngineContext, HashSet, - Vec2, GREEN, RED, WHITE -}; - -use crate::game; - use super::{furniture::Furniture, grid::Grid}; +use crate::game; +use comfy::{ + draw_rect, draw_rect_outline, draw_sprite, error, random_i32, vec2, EngineContext, + HashSet, RandomRange as _, Vec2, GREEN, PURPLE, RED, WHITE +}; +use indexmap::IndexSet; pub const SCALE: f32 = 4.0; @@ -25,7 +24,7 @@ pub struct Room { room_type: RoomType, pub size: (u8, u8), //(width, height) pub grid: Grid, - furnitures: Vec + furnitures: Vec } impl RoomType { @@ -46,7 +45,7 @@ impl Room { let room_type = RoomType::random(); let size = Self::random_size(&room_type); - let furnitures = Self::random_room_furniture(&room_type, size, ctx); + let furnitures = Self::random_room_furniture(&room_type, size, ctx); Room { room_type, @@ -67,28 +66,110 @@ impl Room { } } - fn random_room_furniture(room_type: &RoomType, size: (u8, u8), ctx: &mut EngineContext<'_>) -> Vec { + fn random_room_furniture( + room_type: &RoomType, + (width, _height): (u8, u8), + ctx: &mut EngineContext<'_> + ) -> Vec { let mut furnitures = Vec::new(); - let width = size.0; + let mut empty_spots: IndexSet = (0 .. width).collect(); + let mut assets_used: HashSet<&'static str> = HashSet::new(); + + fn random_empty_spot(empty_spots: &mut IndexSet) -> Option { + if empty_spots.is_empty() { + return None; + } + let random_idx = usize::gen_range(0, empty_spots.len()); + empty_spots.swap_remove_index(random_idx) + } + + const SIDEBOARD_HEIGHT: f32 = 0.1; + const STOVE_HEIGHT: f32 = 0.025; + const SINK_HEIGHT: f32 = 0.5; + + #[allow(clippy::single_match, unreachable_patterns)] // we'll add more stuff later match room_type { - RoomType::Kitchen => { + _ => { + // in a kitchen, we always add a fridge + let fridge_pos = u8::gen_range(0, 2) * (width - 1); + empty_spots.swap_remove(&fridge_pos); furnitures.push(( - vec2(0.0, 0.0), + vec2(fridge_pos as f32, 0.0), vec2(1.0, 2.0), Furniture::new("kitchen", "fridge", ctx) )); + + // and we always add an oven + let Some(oven_pos) = random_empty_spot(&mut empty_spots) else { + error!("How can I not fit an oven in a kitchen?!?"); + return furnitures; + }; furnitures.push(( - vec2(1.0, 0.0), + vec2(oven_pos as f32, 0.0), vec2(1.0, 1.0), - Furniture::new("kitchen", "dishwasher", ctx) + Furniture::new("kitchen", "oven", ctx) + )); + + // there's always sideboard above the oven with a stove + furnitures.push(( + vec2(oven_pos as f32, 1.0), + vec2(1.0, SIDEBOARD_HEIGHT), + Furniture::new("kitchen", "sideboard_1", ctx) )); furnitures.push(( - vec2(1.0, 1.0), - vec2(0.75, 0.75), - Furniture::new("kitchen", "blender", ctx) + vec2(oven_pos as f32, 1.0 + SIDEBOARD_HEIGHT), + vec2(1.0, STOVE_HEIGHT), + Furniture::new("kitchen", "stove", ctx) )); - } + + // and we always add a drawer that houses a sink + let Some(sink_pos) = random_empty_spot(&mut empty_spots) else { + error!("How can I not fit a sink in a kitchen?!?"); + return furnitures; + }; + furnitures.push(( + vec2(sink_pos as f32, 0.0), + vec2(1.0, 1.0), + Furniture::new("kitchen", "drawer_cupboard", ctx) + )); + + // there's always sideboard above that drawer with a sink **behind** it + furnitures.push(( + vec2(sink_pos as f32, 1.0), + vec2(1.0, SINK_HEIGHT), + Furniture::new("kitchen", "sink", ctx) + )); + furnitures.push(( + vec2(sink_pos as f32, 1.0), + vec2(1.0, SIDEBOARD_HEIGHT), + Furniture::new("kitchen", "sideboard_1", ctx) + )); + + // let's add half of the remaining positions as drawers + for _ in 0 .. empty_spots.len() / 2 { + let asset = match u8::gen_range(0, 2) { + 0 => "drawer", + 1 => "drawer_cupboard", + _ => unreachable!() + }; + let Some(spot) = random_empty_spot(&mut empty_spots) else { + error!("WTF I shouldn't've used more than half of the available spots"); + return furnitures; + }; + furnitures.push(( + vec2(spot as f32, 0.0), + vec2(1.0, 1.0), + Furniture::new("kitchen", asset, ctx) + )); + furnitures.push(( + vec2(spot as f32, 1.0), + vec2(1.0, SIDEBOARD_HEIGHT), + Furniture::new("kitchen", "sideboard_1", ctx) + )); + } + }, + _ => {} } @@ -148,12 +229,18 @@ impl Room { pub fn draw(&self) { let (width, height) = self.size; + draw_rect( + vec2(0.0, 0.0), + vec2(width as f32 * SCALE, height as f32 * SCALE), + PURPLE, + game::ZLayer::MapMax as i32 - 2 + ); draw_rect_outline( vec2(0.0, 0.0), vec2(width as f32 * SCALE, height as f32 * SCALE), 0.3, RED, - game::ZLayer::MapMax.into() + game::ZLayer::MapMax as i32 - 1 ); for (pos, size, furniture) in &self.furnitures { -- 2.45.2 From 2498152b21c327f58e3b031d402bd730eddd24af Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 12:43:33 +0200 Subject: [PATCH 11/16] z index --- src/activities/house/room.rs | 123 ++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 54 deletions(-) diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 358d061..07db950 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -17,7 +17,13 @@ enum RoomType { SleepingRoom } -type Tile = (Vec2, Vec2, Furniture); //(pos, size, furniture) +#[derive(Debug)] +struct Tile { + pos: Vec2, + size: Vec2, + f: Furniture, + z: i32 +} #[derive(Debug)] pub struct Room { @@ -94,57 +100,64 @@ impl Room { // in a kitchen, we always add a fridge let fridge_pos = u8::gen_range(0, 2) * (width - 1); empty_spots.swap_remove(&fridge_pos); - furnitures.push(( - vec2(fridge_pos as f32, 0.0), - vec2(1.0, 2.0), - Furniture::new("kitchen", "fridge", ctx) - )); + furnitures.push(Tile { + pos: vec2(fridge_pos as f32, 0.0), + size: vec2(1.0, 2.0), + f: Furniture::new("kitchen", "fridge", ctx), + z: 0 + }); // and we always add an oven let Some(oven_pos) = random_empty_spot(&mut empty_spots) else { error!("How can I not fit an oven in a kitchen?!?"); return furnitures; }; - furnitures.push(( - vec2(oven_pos as f32, 0.0), - vec2(1.0, 1.0), - Furniture::new("kitchen", "oven", ctx) - )); + furnitures.push(Tile { + pos: vec2(oven_pos as f32, 0.0), + size: vec2(1.0, 1.0), + f: Furniture::new("kitchen", "oven", ctx), + z: 0 + }); // there's always sideboard above the oven with a stove - furnitures.push(( - vec2(oven_pos as f32, 1.0), - vec2(1.0, SIDEBOARD_HEIGHT), - Furniture::new("kitchen", "sideboard_1", ctx) - )); - furnitures.push(( - vec2(oven_pos as f32, 1.0 + SIDEBOARD_HEIGHT), - vec2(1.0, STOVE_HEIGHT), - Furniture::new("kitchen", "stove", ctx) - )); + furnitures.push(Tile { + pos: vec2(oven_pos as f32, 1.0), + size: vec2(1.0, SIDEBOARD_HEIGHT), + f: Furniture::new("kitchen", "sideboard_1", ctx), + z: 1 + }); + furnitures.push(Tile { + pos: vec2(oven_pos as f32, 1.0 + SIDEBOARD_HEIGHT), + size: vec2(1.0, STOVE_HEIGHT), + f: Furniture::new("kitchen", "stove", ctx), + z: 0 + }); // and we always add a drawer that houses a sink let Some(sink_pos) = random_empty_spot(&mut empty_spots) else { error!("How can I not fit a sink in a kitchen?!?"); return furnitures; }; - furnitures.push(( - vec2(sink_pos as f32, 0.0), - vec2(1.0, 1.0), - Furniture::new("kitchen", "drawer_cupboard", ctx) - )); + furnitures.push(Tile { + pos: vec2(sink_pos as f32, 0.0), + size: vec2(1.0, 1.0), + f: Furniture::new("kitchen", "drawer_cupboard", ctx), + z: 0 + }); // there's always sideboard above that drawer with a sink **behind** it - furnitures.push(( - vec2(sink_pos as f32, 1.0), - vec2(1.0, SINK_HEIGHT), - Furniture::new("kitchen", "sink", ctx) - )); - furnitures.push(( - vec2(sink_pos as f32, 1.0), - vec2(1.0, SIDEBOARD_HEIGHT), - Furniture::new("kitchen", "sideboard_1", ctx) - )); + furnitures.push(Tile { + pos: vec2(sink_pos as f32, 1.0), + size: vec2(1.0, SINK_HEIGHT), + f: Furniture::new("kitchen", "sink", ctx), + z: 0 + }); + furnitures.push(Tile { + pos: vec2(sink_pos as f32, 1.0), + size: vec2(1.0, SIDEBOARD_HEIGHT), + f: Furniture::new("kitchen", "sideboard_1", ctx), + z: 1 + }); // let's add half of the remaining positions as drawers for _ in 0 .. empty_spots.len() / 2 { @@ -157,16 +170,18 @@ impl Room { error!("WTF I shouldn't've used more than half of the available spots"); return furnitures; }; - furnitures.push(( - vec2(spot as f32, 0.0), - vec2(1.0, 1.0), - Furniture::new("kitchen", asset, ctx) - )); - furnitures.push(( - vec2(spot as f32, 1.0), - vec2(1.0, SIDEBOARD_HEIGHT), - Furniture::new("kitchen", "sideboard_1", ctx) - )); + furnitures.push(Tile { + pos: vec2(spot as f32, 0.0), + size: vec2(1.0, 1.0), + f: Furniture::new("kitchen", asset, ctx), + z: 0 + }); + furnitures.push(Tile { + pos: vec2(spot as f32, 1.0), + size: vec2(1.0, SIDEBOARD_HEIGHT), + f: Furniture::new("kitchen", "sideboard_1", ctx), + z: 1 + }); } }, @@ -243,25 +258,25 @@ impl Room { game::ZLayer::MapMax as i32 - 1 ); - 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; + for tile in &self.furnitures { + let mut pos = tile.pos - vec2(width as f32 / 2.0, height as f32 / 2.0); + pos += tile.size * 0.5; - if let Some(texture) = furniture.get_human_texture_handle() { + if let Some(texture) = tile.f.get_human_texture_handle() { draw_sprite( texture, pos * SCALE, WHITE, - game::ZLayer::MapMax.into(), - *size * SCALE + game::ZLayer::MapMax as i32 + tile.z, + tile.size * SCALE ); } else { draw_rect_outline( pos * SCALE, - *size * SCALE, + tile.size * SCALE, 0.3, GREEN, - game::ZLayer::MapMax.into() + game::ZLayer::MapMax as i32 + tile.z ); } } -- 2.45.2 From 2874f832dbe476322e4465d0cc0c046b0d54e4c7 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 13:35:48 +0200 Subject: [PATCH 12/16] kitchen counter appliances --- src/activities/house/room.rs | 82 +++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 07db950..f8dd113 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -82,13 +82,20 @@ impl Room { let mut empty_spots: IndexSet = (0 .. width).collect(); let mut assets_used: HashSet<&'static str> = HashSet::new(); - fn random_empty_spot(empty_spots: &mut IndexSet) -> Option { + fn random_empty_spot(empty_spots: &mut IndexSet) -> Option { if empty_spots.is_empty() { return None; } let random_idx = usize::gen_range(0, empty_spots.len()); empty_spots.swap_remove_index(random_idx) } + fn random_appliance(empty_spots: &mut Vec) -> Option { + if empty_spots.is_empty() { + return None; + } + let random_idx = usize::gen_range(0, empty_spots.len()); + Some(empty_spots.swap_remove(random_idx)) + } const SIDEBOARD_HEIGHT: f32 = 0.1; const STOVE_HEIGHT: f32 = 0.025; @@ -159,12 +166,21 @@ impl Room { z: 1 }); - // let's add half of the remaining positions as drawers + // the current list of empty spots is the same list we can use to place + // on-the-counter appliances later + let mut empty_spots_clone = empty_spots.clone(); + + // build a list of the remaining kitchen appliances. we only want them + // included once, most kitchens don't contain two washing machines etc + let mut remaining_appliances: IndexSet<&'static str> = + ["dishwasher", "dryer", "minifridge", "washing_machine"] + .into_iter() + .collect(); + + // let's add at most half of the remaining positions as big appliances for _ in 0 .. empty_spots.len() / 2 { - let asset = match u8::gen_range(0, 2) { - 0 => "drawer", - 1 => "drawer_cupboard", - _ => unreachable!() + let Some(asset) = random_empty_spot(&mut remaining_appliances) else { + break; }; let Some(spot) = random_empty_spot(&mut empty_spots) else { error!("WTF I shouldn't've used more than half of the available spots"); @@ -183,6 +199,60 @@ impl Room { z: 1 }); } + + // and fill the remainder with drawers + while !empty_spots.is_empty() { + let asset = match u8::gen_range(0, 2) { + 0 => "drawer", + 1 => "drawer_cupboard", + _ => unreachable!() + }; + let Some(spot) = random_empty_spot(&mut empty_spots) else { + error!("WTF I should still have spots available"); + return furnitures; + }; + furnitures.push(Tile { + pos: vec2(spot as f32, 0.0), + size: vec2(1.0, 1.0), + f: Furniture::new("kitchen", asset, ctx), + z: 0 + }); + furnitures.push(Tile { + pos: vec2(spot as f32, 1.0), + size: vec2(1.0, SIDEBOARD_HEIGHT), + f: Furniture::new("kitchen", "sideboard_1", ctx), + z: 1 + }); + } + + // build a list of on-the-counter kitchen appliances. we only want them + // included once, most kitchens don't contain two toasters etc + let mut remaining_appliances: Vec<(&'static str, f32, f32)> = [ + ("blender", 0.3, 0.45), + ("kettle", 0.3, 0.4), + ("toaster", 0.5, 0.25) + ] + .into_iter() + .collect(); + + // and then we fill like half the counter with appliances + for _ in 0 .. empty_spots_clone.len() / 2 { + let Some((asset, asset_w, asset_h)) = + random_appliance(&mut remaining_appliances) + else { + break; + }; + let Some(spot) = random_empty_spot(&mut empty_spots_clone) else { + error!("WTF I shouldn't've used more than half of the available spots"); + return furnitures; + }; + furnitures.push(Tile { + pos: vec2(spot as f32 + 0.5, 1.0 + SIDEBOARD_HEIGHT), + size: vec2(asset_w, asset_h), + f: Furniture::new("kitchen", asset, ctx), + z: 0 + }); + } }, _ => {} -- 2.45.2 From bf6af37be1274e962d70ecc3423e16173df8b2c2 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 13:40:07 +0200 Subject: [PATCH 13/16] remove stuff not meant for main --- src/activities/house/room.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index f8dd113..87cb84b 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -101,9 +101,9 @@ impl Room { const STOVE_HEIGHT: f32 = 0.025; const SINK_HEIGHT: f32 = 0.5; - #[allow(clippy::single_match, unreachable_patterns)] // we'll add more stuff later + #[allow(clippy::single_match)] // we'll add more stuff later match room_type { - _ => { + RoomType::Kitchen => { // in a kitchen, we always add a fridge let fridge_pos = u8::gen_range(0, 2) * (width - 1); empty_spots.swap_remove(&fridge_pos); -- 2.45.2 From c13b96d88bb1bfc97a5aa3f87069d48ac9599508 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 13:43:02 +0200 Subject: [PATCH 14/16] fmt --- src/activities/house/mod.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index e3ffdc0..a26db43 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -42,11 +42,11 @@ pub fn update(state: &mut crate::State, ctx: &mut comfy::EngineContext<'_>) { let house = state.house_mut(); house.player.update(&house.grid); - if house.player.is_moving_to_right_room(&house.room) { - house.room = Room::new(ctx); - house.player.reset_on_room(&house.room, true); - } else if house.player.is_moving_to_left_room(&house.room) { - house.room = Room::new(ctx); - house.player.reset_on_room(&house.room, false); - } + if house.player.is_moving_to_right_room(&house.room) { + house.room = Room::new(ctx); + house.player.reset_on_room(&house.room, true); + } else if house.player.is_moving_to_left_room(&house.room) { + house.room = Room::new(ctx); + house.player.reset_on_room(&house.room, false); + } } -- 2.45.2 From a4a96c809daa92d3561ad93d8b34a15246841e41 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 13:52:51 +0200 Subject: [PATCH 15/16] fix merge --- src/activities/house/mod.rs | 49 +++++++++++++++++---------------- src/activities/mod.rs | 2 -- src/activities/overworld/mod.rs | 8 +++--- src/game.rs | 2 -- src/main.rs | 6 ++-- 5 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index a26db43..555d631 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -3,10 +3,10 @@ mod grid; mod player; mod room; -use comfy::EngineContext; -use grid::Grid; -use player::Player; -use room::Room; +use self::{grid::Grid, player::Player, room::Room}; +use super::Activity; +use crate::State; +use comfy::{error, EngineContext}; #[derive(Debug)] pub struct HouseState { @@ -15,32 +15,33 @@ pub struct HouseState { player: Player } -pub fn setup(state: &mut crate::State, ctx: &mut EngineContext<'_>) { - if let Some(house) = state.house() { +impl HouseState { + pub fn generate_new_house(ctx: &mut EngineContext<'_>) -> Self { let room = Room::new(ctx); let player = Player::new(&room); HouseState { room, player } - }; - - state.house = Some(house); -} - -pub fn draw(state: &crate::State, _ctx: &comfy::EngineContext<'_>) { - if let Some(house) = &state.house { - //Draw House - house.room.draw(); - - //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(); - house.player.update(&house.grid); +pub fn draw(state: &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.room.draw(); + + //Draw Grid + //state.house.grid.draw(); + + //Draw Player + house.player.draw(); +} + +pub fn update(state: &mut State, ctx: &mut comfy::EngineContext<'_>) { + let house = state.house_mut(ctx); + house.player.update(&house.room.grid); if house.player.is_moving_to_right_room(&house.room) { house.room = Room::new(ctx); diff --git a/src/activities/mod.rs b/src/activities/mod.rs index e0afdc4..4f3efbd 100644 --- a/src/activities/mod.rs +++ b/src/activities/mod.rs @@ -7,7 +7,5 @@ pub mod overworld; pub enum Activity { House(IVec2), #[default] - House, - #[allow(dead_code)] Overworld } diff --git a/src/activities/overworld/mod.rs b/src/activities/overworld/mod.rs index d2e1613..d2dd96a 100644 --- a/src/activities/overworld/mod.rs +++ b/src/activities/overworld/mod.rs @@ -32,7 +32,7 @@ pub fn draw(state: &crate::State, _engine: &comfy::EngineContext<'_>) { draw_circle(state.ghost.overworld_pos, 0.5, RED, ZLayer::Ghost.into()); } -fn update_move_player(state: &mut State) { +fn update_move_player(state: &mut State, ctx: &mut EngineContext<'_>) { let now = Instant::now(); // Are there any pending position updates? If so, we ignore all user input and execute @@ -160,18 +160,18 @@ fn update_move_player(state: &mut State) { if current_tile.can_enter_house() { info!("enter house at {tile_pos}"); state.activity = Activity::House(tile_pos); - state.house_mut(); // gen new house + state.house_mut(ctx); // gen new house } } } -pub fn update(state: &mut State, _ctx: &mut EngineContext<'_>) { +pub fn update(state: &mut State, ctx: &mut EngineContext<'_>) { let mut camera = main_camera_mut(); camera.center = Vec2::ZERO; camera.zoom = 30.0; // move player - update_move_player(state); + update_move_player(state, ctx); // generate more chunks if needed { diff --git a/src/game.rs b/src/game.rs index e84c08b..3a3a920 100644 --- a/src/game.rs +++ b/src/game.rs @@ -88,8 +88,6 @@ impl Sub for ZLayer { pub fn setup(state: &mut State, ctx: &mut EngineContext<'_>) { Assets::load(ctx); - - house::setup(state, ctx); } pub fn update(state: &mut State, engine: &mut EngineContext<'_>) { diff --git a/src/main.rs b/src/main.rs index d05f0e5..a84ee9b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,13 +40,13 @@ impl State { } fn house(&self) -> Option<&HouseState> { - self.houses.get(&self.get_house_pos().unwrap()) + self.houses.get(&self.get_house_pos()?) } - fn house_mut(&mut self) -> &mut HouseState { + fn house_mut(&mut self, ctx: &mut EngineContext<'_>) -> &mut HouseState { self.houses .entry(self.get_house_pos().unwrap()) - .or_insert_with(HouseState::default) + .or_insert_with(|| HouseState::generate_new_house(ctx)) } } -- 2.45.2 From fd4f67336b98478c9200c84e9ee11b59ff3956f0 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 13:54:31 +0200 Subject: [PATCH 16/16] fix some lints --- src/activities/house/mod.rs | 1 - src/activities/house/room.rs | 5 ++--- src/activities/overworld/mod.rs | 9 +-------- src/game.rs | 2 +- 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index 555d631..7d43dc3 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -4,7 +4,6 @@ mod player; mod room; use self::{grid::Grid, player::Player, room::Room}; -use super::Activity; use crate::State; use comfy::{error, EngineContext}; diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 87cb84b..e3cecb8 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -27,7 +27,7 @@ struct Tile { #[derive(Debug)] pub struct Room { - room_type: RoomType, + _room_type: RoomType, pub size: (u8, u8), //(width, height) pub grid: Grid, furnitures: Vec @@ -54,7 +54,7 @@ impl Room { let furnitures = Self::random_room_furniture(&room_type, size, ctx); Room { - room_type, + _room_type: room_type, size, grid: Self::create_grid(size.0, size.1), furnitures @@ -80,7 +80,6 @@ impl Room { let mut furnitures = Vec::new(); let mut empty_spots: IndexSet = (0 .. width).collect(); - let mut assets_used: HashSet<&'static str> = HashSet::new(); fn random_empty_spot(empty_spots: &mut IndexSet) -> Option { if empty_spots.is_empty() { diff --git a/src/activities/overworld/mod.rs b/src/activities/overworld/mod.rs index d2dd96a..90ea09f 100644 --- a/src/activities/overworld/mod.rs +++ b/src/activities/overworld/mod.rs @@ -1,11 +1,4 @@ -use crate::{ - activities::{ - house::{self, HouseState}, - Activity - }, - game::ZLayer, - State -}; +use crate::{activities::Activity, game::ZLayer, State}; use comfy::{ draw_circle, draw_rect_outline, draw_sprite, error, info, is_key_down, main_camera_mut, EngineContext, IVec2, KeyCode, Vec2, RED, WHITE diff --git a/src/game.rs b/src/game.rs index 3a3a920..b39886c 100644 --- a/src/game.rs +++ b/src/game.rs @@ -86,7 +86,7 @@ impl Sub for ZLayer { } } -pub fn setup(state: &mut State, ctx: &mut EngineContext<'_>) { +pub fn setup(_state: &mut State, ctx: &mut EngineContext<'_>) { Assets::load(ctx); } -- 2.45.2