From 57bfba8bee75de86a51ccbd9ec83e527696564a8 Mon Sep 17 00:00:00 2001 From: Tyrel Souza <923113+tyrelsouza@users.noreply.github.com> Date: Sun, 29 Aug 2021 23:13:45 -0400 Subject: [PATCH] tooltips, hud, fixes --- resources/terminal8x8.png | Bin 0 -> 43114 bytes src/components.rs | 9 +++++++++ src/main.rs | 6 ++++++ src/map_builder.rs | 6 +++--- src/spawners.rs | 28 ++++++++++++++++++++++------ src/systems/hud.rs | 26 ++++++++++++++++++++++++++ src/systems/mod.rs | 6 ++++++ src/systems/tooltips.rs | 35 +++++++++++++++++++++++++++++++++++ 8 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 resources/terminal8x8.png create mode 100644 src/systems/hud.rs create mode 100644 src/systems/tooltips.rs diff --git a/resources/terminal8x8.png b/resources/terminal8x8.png new file mode 100644 index 0000000000000000000000000000000000000000..4e405544b81adf49a95eb3e8195433ba77fe8171 GIT binary patch literal 43114 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 a;Qs-{pADMEQDff#0000().unwrap().clone(); match current_state { @@ -91,8 +95,10 @@ fn main() -> BError { .with_tile_dimensions(32, 32) .with_resource_path("resources/") .with_font("dungeonfont.png", 32, 32) + .with_font("terminal8x8.png", 8, 8) .with_simple_console(DISPLAY_WIDTH, DISPLAY_HEIGHT, "dungeonfont.png") .with_simple_console_no_bg(DISPLAY_WIDTH, DISPLAY_HEIGHT, "dungeonfont.png") + .with_simple_console_no_bg(SCREEN_WIDTH * 2, SCREEN_HEIGHT * 2, "terminal8x8.png") .build()?; main_loop(context, State::new()) } diff --git a/src/map_builder.rs b/src/map_builder.rs index 14e31f8..df1c1d4 100644 --- a/src/map_builder.rs +++ b/src/map_builder.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -const NUM_ROOMS: usize = 20; +const NUM_ROOMS: usize = 20; pub struct MapBuilder { pub map: Map, pub rooms: Vec, @@ -80,10 +80,10 @@ impl MapBuilder { if rng.range(0, 2) == 1 { self.apply_horizontal_tunnel(prev.x, new.x, prev.y); - self.apply_vertical_tunnel(prev.y, new.y, prev.x); + self.apply_vertical_tunnel(prev.y, new.y, new.x); } else { self.apply_vertical_tunnel(prev.y, new.y, prev.x); - self.apply_horizontal_tunnel(prev.x, new.x, prev.y); + self.apply_horizontal_tunnel(prev.x, new.x, new.y); } } } diff --git a/src/spawners.rs b/src/spawners.rs index 52753f6..8da6bd3 100644 --- a/src/spawners.rs +++ b/src/spawners.rs @@ -8,22 +8,38 @@ pub fn spawn_player(ecs: &mut World, pos: Point) { color: ColorPair::new(WHITE, BLACK), glyph: to_cp437('@'), }, + Health { + current: 20, + max: 20, + }, )); } pub fn spawn_monster(ecs: &mut World, rng: &mut RandomNumberGenerator, pos: Point) { + let (hp, name, glyph) = match rng.roll_dice(1, 10) { + 1..=8 => goblin(), + _ => orc(), + }; + ecs.push(( Enemy, pos, Render { color: ColorPair::new(WHITE, BLACK), - glyph: match rng.range(0, 4) { - 0 => to_cp437('E'), // Ettin - 1 => to_cp437('O'), // Ogre - 2 => to_cp437('o'), // Orc - _ => to_cp437('g'), // goblin - }, + glyph, }, MovingRandomly {}, + Health { + current: hp, + max: hp, + }, + Name(name), )); } + +fn goblin() -> (i32, String, FontCharType) { + (1, "Goblin".to_string(), to_cp437('g')) +} +fn orc() -> (i32, String, FontCharType) { + (2, "orc".to_string(), to_cp437('o')) +} diff --git a/src/systems/hud.rs b/src/systems/hud.rs new file mode 100644 index 0000000..b64fa1f --- /dev/null +++ b/src/systems/hud.rs @@ -0,0 +1,26 @@ +use crate::prelude::*; + +#[system] +#[read_component(Health)] +#[read_component(Player)] +pub fn hud(ecs: &SubWorld) { + let mut health_query = <&Health>::query().filter(component::()); + let player_health = health_query.iter(ecs).nth(0).unwrap(); + + let mut draw_batch = DrawBatch::new(); + draw_batch.target(2); + draw_batch.print_centered(1, "Explore the Dungeon. Cursor keys to move."); + draw_batch.bar_horizontal( + Point::zero(), + SCREEN_WIDTH * 2, + player_health.current, + player_health.max, + ColorPair::new(RED, BLACK), + ); + draw_batch.print_color_centered( + 0, + format!(" Health: {}/{} ", player_health.current, player_health.max,), + ColorPair::new(WHITE, RED), + ); + draw_batch.submit(10000).expect("Batch Error"); +} diff --git a/src/systems/mod.rs b/src/systems/mod.rs index e34db46..4542f1b 100644 --- a/src/systems/mod.rs +++ b/src/systems/mod.rs @@ -2,10 +2,12 @@ use crate::prelude::*; mod collisions; mod end_turn; mod entity_render; +mod hud; mod map_render; mod movement; mod player_input; mod random_move; +mod tooltips; pub fn input_build_scheduler() -> Schedule { Schedule::builder() @@ -13,6 +15,8 @@ pub fn input_build_scheduler() -> Schedule { .flush() .add_system(map_render::map_render_system()) .add_system(entity_render::entity_render_system()) + .add_system(hud::hud_system()) + .add_system(tooltips::tooltips_system()) .build() } pub fn player_build_scheduler() -> Schedule { @@ -23,6 +27,7 @@ pub fn player_build_scheduler() -> Schedule { .flush() .add_system(map_render::map_render_system()) .add_system(entity_render::entity_render_system()) + .add_system(hud::hud_system()) .add_system(end_turn::end_turn_system()) .build() } @@ -36,6 +41,7 @@ pub fn monster_build_scheduler() -> Schedule { .flush() .add_system(map_render::map_render_system()) .add_system(entity_render::entity_render_system()) + .add_system(hud::hud_system()) .add_system(end_turn::end_turn_system()) .build() } diff --git a/src/systems/tooltips.rs b/src/systems/tooltips.rs new file mode 100644 index 0000000..93d85e3 --- /dev/null +++ b/src/systems/tooltips.rs @@ -0,0 +1,35 @@ +use crate::prelude::*; + +#[system] +#[read_component(Point)] +#[read_component(Name)] +#[read_component(Health)] +pub fn tooltips( + ecs: &SubWorld, + #[resource] mouse_pos: &Point, // (1) + #[resource] camera: &Camera, // (2) +) { + let mut positions = <(Entity, &Point, &Name)>::query(); // (3) + let offset = Point::new(camera.left_x, camera.top_y); + let map_pos = *mouse_pos + offset; // (4) + let mut draw_batch = DrawBatch::new(); + draw_batch.target(2); + positions + .iter(ecs) + .filter(|(_, pos, _)| **pos == map_pos) // (5) + .for_each(|(entity, _, name)| { + let screen_pos = *mouse_pos * 4; // (6) + let display = if let Ok(health) = ecs + .entry_ref(*entity) // (7) + .unwrap() + .get_component::() + { + format!("{} : {} hp", &name.0, health.current) // (8) + } else { + // (9) + name.0.clone() + }; + draw_batch.print(screen_pos, &display); + }); + draw_batch.submit(10100).expect("Batch error"); +}