From 814d0f46f663f01ee478504af16e275c98f2753c Mon Sep 17 00:00:00 2001 From: luckyturtledev Date: Sun, 7 Jul 2024 13:18:20 +0200 Subject: [PATCH] enter house --- src/activities/house/mod.rs | 13 ++++++++----- src/activities/mod.rs | 5 +++-- src/activities/overworld/mod.rs | 19 ++++++++++++++++++- src/game.rs | 4 ++-- src/main.rs | 23 +++++++++++++++++++++-- 5 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index fbcca6d..c856690 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -11,13 +11,16 @@ pub struct HouseState { } pub fn draw(state: &crate::State, _engine: &comfy::EngineContext<'_>) { - //Draw Grid - state.house.grid.draw(); + if let Some(house) = state.house() { + //Draw Grid + house.grid.draw(); - //Draw Player - state.house.player.draw(); + //Draw Player + house.player.draw(); + } } pub fn update(state: &mut crate::State, _engine: &mut comfy::EngineContext<'_>) { - state.house.player.update(&state.house.grid); + let house = state.house_mut(); + house.player.update(&house.grid); } diff --git a/src/activities/mod.rs b/src/activities/mod.rs index b3ad872..4f3efbd 100644 --- a/src/activities/mod.rs +++ b/src/activities/mod.rs @@ -1,10 +1,11 @@ +use comfy::IVec2; + pub mod house; pub mod overworld; #[derive(Debug, Default)] pub enum Activity { - #[allow(dead_code)] - House, + House(IVec2), #[default] Overworld } diff --git a/src/activities/overworld/mod.rs b/src/activities/overworld/mod.rs index f22d84b..d2e1613 100644 --- a/src/activities/overworld/mod.rs +++ b/src/activities/overworld/mod.rs @@ -1,4 +1,11 @@ -use crate::{game::ZLayer, State}; +use crate::{ + activities::{ + house::{self, HouseState}, + 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 @@ -146,6 +153,16 @@ fn update_move_player(state: &mut State) { y: requested_pos_diff.y as _ }; state.ghost.overworld_pos_last_update = now; + + //move into house if player stepp at door + { + let current_tile = state.overworld.get_or_generate_tile(tile_pos); + if current_tile.can_enter_house() { + info!("enter house at {tile_pos}"); + state.activity = Activity::House(tile_pos); + state.house_mut(); // gen new house + } + } } pub fn update(state: &mut State, _ctx: &mut EngineContext<'_>) { diff --git a/src/game.rs b/src/game.rs index 4e75fa3..1939bfe 100644 --- a/src/game.rs +++ b/src/game.rs @@ -88,14 +88,14 @@ impl Sub for ZLayer { pub fn update(state: &mut State, engine: &mut EngineContext<'_>) { state.score += engine.delta * 10.0; match state.activity { - Activity::House => house::update(state, engine), + Activity::House(_) => house::update(state, engine), Activity::Overworld => overworld::update(state, engine) } } pub fn draw(state: &State, engine: &EngineContext<'_>) { match state.activity { - Activity::House => house::draw(state, engine), + Activity::House(_) => house::draw(state, engine), Activity::Overworld => overworld::draw(state, engine) } crate::ui::draw(state, engine); diff --git a/src/main.rs b/src/main.rs index 86d7b2b..f7b6e87 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ use self::{ }; use comfy::{ init_game_config, pollster, run_comfy_main_async, EngineContext, EngineState, - GameConfig, GameLoop + GameConfig, GameLoop, HashMap, IVec2 }; const GAME_NAME: &str = "Powercreep"; @@ -28,10 +28,29 @@ struct State { activity: Activity, ghost: Ghost, overworld: Overworld, - house: HouseState, + houses: HashMap, score: f32 } +impl State { + fn get_house_pos(&self) -> Option { + match self.activity { + Activity::House(pos) => Some(pos), + _ => None + } + } + + fn house(&self) -> Option<&HouseState> { + self.houses.get(&self.get_house_pos().unwrap()) + } + + fn house_mut(&mut self) -> &mut HouseState { + self.houses + .entry(self.get_house_pos().unwrap()) + .or_insert_with(HouseState::default) + } +} + impl GameLoop for State { fn new(_c: &mut EngineState) -> Self { Self::default()