From 5fdbb0426f7bcf32bd9ddc147cf55af473d92239 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 7 Jul 2024 16:58:56 +0200 Subject: [PATCH] display a second battery when inside a house --- src/activities/house/mod.rs | 12 +++++-- src/activities/house/room.rs | 22 +++++++------ src/ui.rs | 61 ++++++++++++++++++++++++------------ 3 files changed, 63 insertions(+), 32 deletions(-) diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index 72fe2cc..1634b97 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -18,7 +18,12 @@ pub struct HouseState { rooms: Vec, //grid: Grid, player: Player, - human_layer: bool //Human, magnetic, electric + human_layer: bool, //Human, magnetic, electric + + /// The energy level remaining in the house. Should decrease by itself, and much + /// faster when inhabited by the ghost. + pub charge: f32, + pub max_charge: f32 } impl HouseState { @@ -36,7 +41,10 @@ impl HouseState { room_count, rooms, player, - human_layer: false + human_layer: false, + // TODO this should be lower depending on the time elapsed + charge: 1000.0, + max_charge: 1000.0 } } } diff --git a/src/activities/house/room.rs b/src/activities/house/room.rs index 16d19f7..f25ae5d 100644 --- a/src/activities/house/room.rs +++ b/src/activities/house/room.rs @@ -1,7 +1,8 @@ use super::{furniture::Furniture, grid::Grid}; use crate::game; use comfy::{ - draw_rect, draw_rect_outline, draw_sprite, error, random_i32, vec2, EngineContext, HashSet, Index, RandomRange as _, Vec2, GREEN, PURPLE, RED, WHITE + draw_rect, draw_rect_outline, draw_sprite, error, random_i32, vec2, EngineContext, + HashSet, Index, RandomRange as _, Vec2, GREEN, PURPLE, RED, WHITE }; use indexmap::IndexSet; @@ -88,14 +89,17 @@ impl Room { empty_spots.swap_remove_index(random_idx) } - fn random_empty_spot_size(empty_spots: &mut IndexSet, size: u8) -> Option { + fn random_empty_spot_size( + empty_spots: &mut IndexSet, + size: u8 + ) -> Option { let mut empty_spots_size = IndexSet::::new(); for &index in empty_spots.iter() { let mut is_valid = true; - for offset in 0..size{ - if !empty_spots.contains(&(index + offset)){ + for offset in 0 .. size { + if !empty_spots.contains(&(index + offset)) { is_valid = false; break; } @@ -109,7 +113,7 @@ impl Room { return None; } let random_idx = usize::gen_range(0, empty_spots_size.len()); - for offset in (0..size).rev() { + for offset in (0 .. size).rev() { empty_spots.swap_remove_index(random_idx + offset as usize); } Some(random_idx as u8) @@ -293,10 +297,9 @@ impl Room { pos: vec2(pos as f32, 0.0), size: vec2(3.0, 1.0), f: Furniture::new("bedroom", "couch", ctx), - z:0 + z: 0 }); } - } if let Some(pos) = random_empty_spot(&mut empty_spots) { @@ -304,7 +307,7 @@ impl Room { pos: vec2(pos as f32, 0.0), size: vec2(1.0, 2.0), f: Furniture::new("bedroom", "bookshelf", ctx), - z:0 + z: 0 }); } @@ -313,10 +316,9 @@ impl Room { pos: vec2(pos as f32, 0.0), size: vec2(0.5, 0.9), f: Furniture::new("bedroom", "mini_ac", ctx), - z:0 + z: 0 }); } - }, _ => {} diff --git a/src/ui.rs b/src/ui.rs index 1f31ada..4a22853 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,41 +1,61 @@ use crate::{game::ZLayer, State}; use comfy::{ draw_rect, draw_rect_outline, egui, screen_height, screen_to_world, screen_width, - EngineContext, Vec2, BLACK, BLUE, RED, WHITE + vec2, Color, EngineContext, Vec2, BLACK, BLUE, PURPLE, RED, WHITE }; use egui::widget_text::RichText; -pub fn draw_batterie(state: &State, _engine: &EngineContext<'_>) { - // seperate fill state into smaller section for better readability - let section_count = 5; - let mut start_positon = screen_to_world(Vec2::new(screen_width(), screen_height())); +// seperate fill state into smaller section for better readability +const BATTERY_SECTION_COUNT: u8 = 5; +const BATTERY_SECTION_WIDTH: f32 = 1.0; +const BATTERY_SECTION_HEIGHT: f32 = 0.5; + +fn draw_battery(mut start_position: Vec2, charge: f32, max_charge: f32, color: Color) { // section size in world codinates - let section_size = Vec2::new(0.5, 0.25); - start_positon.x -= 0.5 * section_size.x + 0.5 * section_size.y; - start_positon.y += 0.5 * section_size.y + 0.5 * section_size.y; + let section_size = vec2(BATTERY_SECTION_WIDTH, BATTERY_SECTION_HEIGHT); + start_position.x -= 0.5 * section_size.x + 0.5 * section_size.y; + start_position.y += 0.5 * section_size.y + 0.5 * section_size.y; // draw fill level { - let ghost = &state.ghost; - let percent = ghost.charge / ghost.max_charge; + let percent = charge / max_charge; let mut size = section_size; - size.y = section_size.y * section_count as f32; - let mut position = start_positon; + size.y = section_size.y * BATTERY_SECTION_COUNT as f32; + let mut position = start_position; position.y += 0.5 * -section_size.y + 0.5 * size.y; draw_rect(position, size, BLACK, ZLayer::UI.into()); size.y *= percent; - let mut position = start_positon; + let mut position = start_position; position.y += 0.5 * -section_size.y + 0.5 * size.y; draw_rect(position, size, BLUE, ZLayer::UI + 1); } // draw sections - for i in 0 .. section_count { - let mut position = start_positon; + for i in 0 .. BATTERY_SECTION_COUNT { + let mut position = start_position; position.y += i as f32 * section_size.y; - draw_rect_outline(position, section_size, 0.1, RED, ZLayer::UI + 2); + draw_rect_outline(position, section_size, 0.1, color, ZLayer::UI + 2); } } -pub fn draw_highscore(state: &State, _engine: &EngineContext<'_>) { +pub fn draw_ghost_battery(state: &State) { + let start_position = screen_to_world(Vec2::new(screen_width(), screen_height())); + draw_battery( + start_position, + state.ghost.charge, + state.ghost.max_charge, + RED + ); +} + +pub fn draw_house_battery(state: &State) { + let Some(house) = state.house() else { + return; + }; + let mut start_position = screen_to_world(Vec2::new(screen_width(), screen_height())); + start_position.x -= 2.0 * BATTERY_SECTION_WIDTH; + draw_battery(start_position, house.charge, house.max_charge, PURPLE) +} + +pub fn draw_highscore(state: &State) { egui::Area::new("score") .anchor(egui::Align2::RIGHT_TOP, egui::vec2(0.0, 0.0)) .show(egui(), |ui| { @@ -49,7 +69,8 @@ pub fn draw_highscore(state: &State, _engine: &EngineContext<'_>) { }); } -pub fn draw(state: &State, engine: &EngineContext<'_>) { - draw_batterie(state, engine); - draw_highscore(state, engine); +pub fn draw(state: &State, _ctx: &EngineContext<'_>) { + draw_ghost_battery(state); + draw_house_battery(state); + draw_highscore(state); }