diff --git a/Cargo.lock b/Cargo.lock index 817d22f..856b572 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2277,6 +2277,7 @@ version = "0.1.0" dependencies = [ "bracket-lib 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)", "criterion", + "lazy_static", "rltk", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 33a049c..995b367 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ specs = { version = "0.16.1", features = ["serde"] } specs-derive = "0.4.1" serde = { version = "1.0.93", features = ["derive"]} serde_json = "1.0.39" +lazy_static = "1.4.0" [dev-dependencies] criterion = { version = "^0.5" } diff --git a/src/gamelog.rs b/src/gamelog.rs deleted file mode 100644 index dbe28c0..0000000 --- a/src/gamelog.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub struct GameLog { - pub entries: Vec, -} diff --git a/src/gamelog/builder.rs b/src/gamelog/builder.rs new file mode 100644 index 0000000..0a7e481 --- /dev/null +++ b/src/gamelog/builder.rs @@ -0,0 +1,27 @@ +use super::{append_entry, LogFragment}; +use rltk::prelude::*; + +pub struct Logger { + current_colour: RGB, + fragments: Vec, +} + +impl Logger { + pub fn new() -> Self { + Logger { current_colour: RGB::named(rltk::WHITE), fragments: Vec::new() } + } + + pub fn colour(mut self, colour: (u8, u8, u8)) -> Self { + self.current_colour = RGB::named(colour); + return self; + } + + pub fn append(mut self, text: T) -> Self { + self.fragments.push(LogFragment { colour: self.current_colour, text: text.to_string() }); + return self; + } + + pub fn log(self) { + append_entry(self.fragments) + } +} diff --git a/src/gamelog/logstore.rs b/src/gamelog/logstore.rs new file mode 100644 index 0000000..02afbf0 --- /dev/null +++ b/src/gamelog/logstore.rs @@ -0,0 +1,33 @@ +use super::LogFragment; +use rltk::prelude::*; +use std::sync::Mutex; + +lazy_static! { + static ref LOG: Mutex>> = Mutex::new(Vec::new()); +} + +pub fn append_fragment(fragment: LogFragment) { + LOG.lock().unwrap().push(vec![fragment]); +} + +pub fn append_entry(fragments: Vec) { + LOG.lock().unwrap().push(fragments); +} + +pub fn clear_log() { + LOG.lock().unwrap().clear(); +} + +pub fn log_display() -> TextBuilder { + let mut buf = TextBuilder::empty(); + + LOG.lock().unwrap().iter().rev().take(12).for_each(|log| { + log.iter().for_each(|frag| { + buf.fg(frag.colour); + buf.line_wrap(&frag.text); + }); + buf.ln(); + }); + + return buf; +} diff --git a/src/gamelog/mod.rs b/src/gamelog/mod.rs new file mode 100644 index 0000000..def0086 --- /dev/null +++ b/src/gamelog/mod.rs @@ -0,0 +1,16 @@ +use rltk::prelude::*; + +mod builder; +pub use builder::*; +mod logstore; +use logstore::*; +pub use logstore::{clear_log, log_display}; + +pub struct GameLog { + pub entries: Vec, +} + +pub struct LogFragment { + pub colour: RGB, + pub text: String, +} diff --git a/src/gui.rs b/src/gui.rs index 84d9989..2325247 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -1,8 +1,8 @@ use super::{ - gamelog::GameLog, rex_assets::RexAssets, CombatStats, InBackpack, Map, Name, Player, Point, Position, RunState, - State, Viewshed, + gamelog, rex_assets::RexAssets, CombatStats, InBackpack, Map, Name, Player, Point, Position, RunState, State, + Viewshed, }; -use rltk::{Rltk, VirtualKeyCode, RGB}; +use rltk::{Rltk, TextBlock, VirtualKeyCode, RGB}; use specs::prelude::*; pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { @@ -18,14 +18,9 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { } // Render message log - let log = ecs.fetch::(); - let mut y = 44; - for s in log.entries.iter().rev() { - if y < 49 { - ctx.print(2, y, s); - } - y += 1; - } + let mut block = TextBlock::new(1, 44, 78, 5); + let _ = block.print(&gamelog::log_display()); + block.render(&mut rltk::BACKEND_INTERNAL.lock().consoles[0].console); // Render depth let map = ecs.fetch::(); diff --git a/src/main.rs b/src/main.rs index 8148dcb..90aefef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,6 +32,8 @@ mod particle_system; use particle_system::{ParticleBuilder, DEFAULT_PARTICLE_LIFETIME, LONG_PARTICLE_LIFETIME}; mod random_table; mod rex_assets; +#[macro_use] +extern crate lazy_static; // Embedded resources for use in wasm build rltk::embedded_resource!(TERMINAL8X8, "../resources/terminal8x8.jpg"); @@ -375,7 +377,7 @@ fn main() -> rltk::BError { .with_resource_path("resources/") .with_font("terminal8x8.jpg", 8, 8) .with_simple_console(DISPLAYWIDTH, DISPLAYHEIGHT, "terminal8x8.jpg") - .with_simple_console_no_bg(DISPLAYWIDTH, DISPLAYHEIGHT, "terminal8x8.jpg") + //.with_simple_console_no_bg(DISPLAYWIDTH, DISPLAYHEIGHT, "terminal8x8.jpg") .build()?; context.with_post_scanlines(false); //context.screen_burn_color(RGB::named((150, 255, 255))); @@ -432,6 +434,14 @@ fn main() -> rltk::BError { gs.ecs.insert(gamelog::GameLog { entries: vec!["".to_string()], }); + gamelog::clear_log(); + gamelog::Logger::new() + .append("Welcome!") + .colour(rltk::CYAN) + .append("(") + .append("pretend i wrote a paragraph explaining why you're here") + .append(")") + .log(); gs.ecs.insert(RunState::MainMenu { menu_selection: gui::MainMenuSelection::NewGame }); gs.ecs.insert(particle_system::ParticleBuilder::new()); gs.ecs.insert(rex_assets::RexAssets::new());