From e2587674056c35f0fb4506729e36086e6d2a63b6 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Mon, 25 Sep 2023 20:38:52 +0100 Subject: [PATCH] finalised gamelog --- resources/Ac437_ATT_PC6300.ttf | Bin 0 -> 26248 bytes resources/cp437.ttf | Bin 0 -> 99888 bytes resources/cp437_8x16.ttf | Bin 0 -> 202684 bytes src/components.rs | 2 +- src/consts/mod.rs | 2 +- src/gamelog/builder.rs | 3 +- src/gamelog/logstore.rs | 119 +++++++++--------------- src/gamelog/mod.rs | 2 +- src/gui/mod.rs | 4 +- src/main.rs | 165 +++++---------------------------- 10 files changed, 73 insertions(+), 224 deletions(-) create mode 100644 resources/Ac437_ATT_PC6300.ttf create mode 100644 resources/cp437.ttf create mode 100644 resources/cp437_8x16.ttf diff --git a/resources/Ac437_ATT_PC6300.ttf b/resources/Ac437_ATT_PC6300.ttf new file mode 100644 index 0000000000000000000000000000000000000000..840a431f1855eee07d1c1f23ba1a44740762b60e GIT binary patch literal 26248 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 A8vpn)hDgy%pvv>ys1A~Nru)dM^ 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 PXMO>, + pub log: std::collections::BTreeMap>, pub event_counts: HashMap, pub events: HashMap>, } diff --git a/src/consts/mod.rs b/src/consts/mod.rs index dad4214..d21ba60 100644 --- a/src/consts/mod.rs +++ b/src/consts/mod.rs @@ -12,6 +12,6 @@ pub mod prelude { } pub const TILESIZE: f32 = 16.0; -pub const FONTSIZE: f32 = 12.0; +pub const FONTSIZE: f32 = 24.0; pub const DISPLAYWIDTH: u32 = 100; pub const DISPLAYHEIGHT: u32 = 56; diff --git a/src/gamelog/builder.rs b/src/gamelog/builder.rs index 50c9375..69e3aa4 100644 --- a/src/gamelog/builder.rs +++ b/src/gamelog/builder.rs @@ -65,6 +65,7 @@ impl Logger { /// Pushes the finished log entry. pub fn log(self) { - return append_entry(self.fragments); + let key = crate::gamelog::get_event_count(crate::consts::events::EVENT::COUNT_TURN); + return append_entry(key, self.fragments); } } diff --git a/src/gamelog/logstore.rs b/src/gamelog/logstore.rs index 0fdf261..930be62 100644 --- a/src/gamelog/logstore.rs +++ b/src/gamelog/logstore.rs @@ -1,91 +1,60 @@ use super::{ events, LogFragment, Logger }; use bracket_lib::prelude::*; use std::sync::Mutex; +use std::collections::BTreeMap; +use notan::prelude::*; +use notan::text::CreateText; +use crate::consts::{ TILESIZE, FONTSIZE }; lazy_static! { - pub static ref LOG: Mutex>> = Mutex::new(Vec::new()); + pub static ref LOG: Mutex>> = Mutex::new(BTreeMap::new()); } -#[allow(dead_code)] -pub fn append_fragment(fragment: LogFragment) { - LOG.lock().unwrap().push(vec![fragment]); +pub fn render_log(gfx: &mut Graphics, font: ¬an::draw::Font, pos: &(f32, f32), width: f32) { + let mut text = gfx.create_text(); + let log = LOG.lock().unwrap(); + let latest: Vec<_> = log.iter().rev().take(5).collect(); + let mut init = false; + let mut y = pos.1; + for (_, entries) in latest { + let mut written_on_line = false; + for frag in entries.iter() { + if !written_on_line { + text.add(&frag.text) + .font(font) + .position(pos.0, y) + .size(FONTSIZE) + .max_width(width) + .color(Color::from_rgb(frag.colour.r, frag.colour.g, frag.colour.b)) + .v_align_bottom(); + written_on_line = true; + init = true; + } else { + text.chain(&frag.text) + .color(Color::from_rgb(frag.colour.r, frag.colour.g, frag.colour.b)) + .size(FONTSIZE); + } + } + if init { + y = text.last_bounds().min_y(); + } + } + gfx.render(&text); } -pub fn append_entry(fragments: Vec) { - LOG.lock().unwrap().push(fragments); +pub fn append_entry(turn: i32, fragments: Vec) { + let mut log = LOG.lock().unwrap(); + if let Some(existing) = log.get_mut(&turn) { + existing.extend(fragments); + } else { + log.insert(turn, fragments); + } } pub fn clear_log() { LOG.lock().unwrap().clear(); } -pub fn print_log( - console: &mut Box, - pos: Point, - _descending: bool, - len: usize, - maximum_len: i32 -) { - let mut y = pos.y; - let mut x = pos.x; - // Reverse the log, take the number we want to show, and iterate through them - LOG.lock() - .unwrap() - .iter() - .rev() - .take(len) - .for_each(|log| { - let mut entry_len = -2; - // Iterate through each message fragment, and get the total length - // in lines, by adding the length of every fragment and dividing it - // by the maximum length we desire. Then shuffle our start-y by that much. - log.iter().for_each(|frag| { - entry_len += frag.text.len() as i32; - }); - let lines = entry_len / maximum_len; - y -= lines; - let mut i = 0; - log.iter().for_each(|frag| { - // Split every fragment up into single characters. - let parts = frag.text.split(""); - for part in parts { - // This is an extremely hacky solution to a problem I don't understand yet. - // -- without this, the lines *here* and the line count *above* wont match. - if part == "" || part == "\\" { - continue; - } - if i > entry_len { - break; - } - i += 1; - if x + (part.len() as i32) > pos.x + maximum_len { - if y > pos.y - (len as i32) { - console.print(x, y, "-"); - } - y += 1; - x = pos.x; - } - // Stay within bounds - if y > pos.y - (len as i32) { - console.print_color( - x, - y, - frag.colour.into(), - RGB::named(BLACK).into(), - part - ); - } - x += part.len() as i32; - } - }); - // Take away one from the y-axis, because we want to start each entry - // on a new line, and go up an additional amount depending on how many - // lines our *previous* entry took. - y -= 1 + lines; - x = pos.x; - }); -} - pub fn setup_log() { clear_log(); events::clear_events(); @@ -98,11 +67,11 @@ pub fn setup_log() { .log(); } -pub fn clone_log() -> Vec> { +pub fn clone_log() -> BTreeMap> { return LOG.lock().unwrap().clone(); } -pub fn restore_log(log: &mut Vec>) { +pub fn restore_log(log: &mut BTreeMap>) { LOG.lock().unwrap().clear(); LOG.lock().unwrap().append(log); } diff --git a/src/gamelog/mod.rs b/src/gamelog/mod.rs index 0ab110c..5ae498d 100644 --- a/src/gamelog/mod.rs +++ b/src/gamelog/mod.rs @@ -2,7 +2,7 @@ mod builder; pub use builder::*; mod logstore; use logstore::*; -pub use logstore::{ LOG, clear_log, clone_log, print_log, restore_log, setup_log }; +pub use logstore::{ LOG, clear_log, clone_log, render_log, restore_log, setup_log }; mod events; pub use events::*; diff --git a/src/gui/mod.rs b/src/gui/mod.rs index cb773d7..9253a3d 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -660,13 +660,13 @@ pub fn draw_ui(ecs: &World, ctx: &mut BTerm) { } // Render the message log at [1, 7], ascending, with 7 lines and a max width of 68. - gamelog::print_log( + /*gamelog::print_log( &mut BACKEND_INTERNAL.lock().consoles[TEXT_LAYER].console, Point::new(1 * TEXT_FONT_MOD, 7), false, 7, (VIEWPORT_W - 1) * TEXT_FONT_MOD - ); + );*/ // Render id let map = ecs.fetch::(); diff --git a/src/main.rs b/src/main.rs index ff896d5..2b9bbde 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,7 +33,7 @@ fn setup(gfx: &mut Graphics) -> State { .unwrap(); let data = include_bytes!("../resources/td.json"); let atlas = create_textures_from_atlas(data, &texture).unwrap(); - let font = gfx.create_font(include_bytes!("../resources/PressStart2P-Regular.ttf")).unwrap(); + let font = gfx.create_font(include_bytes!("../resources/Ac437_ATT_PC6300.ttf")).unwrap(); let mut gs = State { ecs: World::new(), base_texture: texture, @@ -253,26 +253,32 @@ fn draw_camera( } // TODO: Use sprites here, not text drawing. Put bitmap font into atlas. let renderable = renderables.get(entry.1.e).unwrap(); - draw.text(&font, &format!("{}", renderable.glyph as u8 as char)) + draw.text( + &font, + &format!("{}", bracket_lib::terminal::to_char(renderable.glyph as u8)) + ) .position( ((entry.0.x as f32) + 0.5) * TILESIZE, ((entry.0.y as f32) + 0.5) * TILESIZE ) .color(Color::from_rgb(renderable.fg.r, renderable.fg.g, renderable.fg.b)) - .size(FONTSIZE + 2.0) + .size(FONTSIZE) .h_align_center() .v_align_middle(); // Draw entity } DrawType::VisibleAndRemember => { let renderable = renderables.get(entry.1.e).unwrap(); - draw.text(&font, &format!("{}", renderable.glyph as u8 as char)) + draw.text( + &font, + &format!("{}", bracket_lib::terminal::to_char(renderable.glyph as u8)) + ) .position( ((entry.0.x as f32) + 0.5) * TILESIZE, ((entry.0.y as f32) + 0.5) * TILESIZE ) .color(Color::from_rgb(renderable.fg.r, renderable.fg.g, renderable.fg.b)) - .size(FONTSIZE + 2.0) + .size(FONTSIZE) .h_align_center() .v_align_middle(); // TODO: Update map memory. @@ -434,13 +440,14 @@ fn draw_bg(_ecs: &World, draw: &mut Draw, atlas: &HashMap) { fn draw(app: &mut App, gfx: &mut Graphics, gs: &mut State) { let mut draw = gfx.create_draw(); draw.clear(Color::BLACK); + let mut log = false; match *gs.ecs.fetch::() { | RunState::MainMenu { .. } | RunState::CharacterCreation { .. } | RunState::PreRun { .. } => {} RunState::MapGeneration => { draw_bg(&gs.ecs, &mut draw, &gs.atlas); - if config::CONFIG.logging.show_mapgen { + if config::CONFIG.logging.show_mapgen && gs.mapgen_history.len() > 0 { render_map_in_view( &gs.mapgen_history[gs.mapgen_index], &gs.ecs, @@ -454,7 +461,7 @@ fn draw(app: &mut App, gfx: &mut Graphics, gs: &mut State) { draw_bg(&gs.ecs, &mut draw, &gs.atlas); draw_camera(&gs.ecs, &mut draw, &gs.atlas, &gs.font); gui::draw_ui2(&gs.ecs, &mut draw, &gs.atlas, &gs.font); - //print_log(&mut draw, &gs.font, Point::new(1, 7), false, 7, VIEWPORT_W + 22); + log = true; } } match *gs.ecs.fetch::() { @@ -474,7 +481,14 @@ fn draw(app: &mut App, gfx: &mut Graphics, gs: &mut State) { _ => {} } gfx.render(&draw); - write(gfx, &gs.font, &(TILESIZE, TILESIZE * 8.0), true); + if log { + gamelog::render_log( + gfx, + &gs.font, + &(TILESIZE, TILESIZE * 8.0 + 4.0), + (VIEWPORT_W as f32) * TILESIZE + ); + } } fn idx_to_px(idx: usize, map: &Map) -> (f32, f32) { @@ -487,138 +501,3 @@ fn idx_to_px(idx: usize, map: &Map) -> (f32, f32) { fn update(ctx: &mut App, state: &mut State) { state.update(ctx); } - -pub fn print_log( - draw: &mut notan::draw::Draw, - font: ¬an::draw::Font, - pos: Point, - _descending: bool, - len: usize, - maximum_len: i32 -) { - let mut y = pos.y; - let mut x = pos.x; - let mut x_px = (x as f32) * TILESIZE; - // Reverse the log, take the number we want to show, and iterate through them - gamelog::LOG - .lock() - .unwrap() - .iter() - .rev() - .take(len) - .for_each(|log| { - let mut entry_len = -2; - // Iterate through each message fragment, and get the total length - // in lines, by adding the length of every fragment and dividing it - // by the maximum length we desire. Then shuffle our start-y by that much. - log.iter().for_each(|frag| { - entry_len += frag.text.len() as i32; - }); - let lines = entry_len / maximum_len; - y -= lines; - let mut i = 0; - log.iter().for_each(|frag| { - // Split every fragment up into single characters. - let parts = frag.text.split(""); - for part in parts { - // This is an extremely hacky solution to a problem I don't understand yet. - // -- without this, the lines *here* and the line count *above* wont match. - if part == "" || part == "\\" { - continue; - } - if i > entry_len { - break; - } - i += 1; - if x + (part.len() as i32) > pos.x + maximum_len { - if y > pos.y - (len as i32) { - draw.text(&font, "-") - .position(x_px, (y as f32) * TILESIZE) - .size(FONTSIZE); - } - y += 1; - x = pos.x; - x_px = (x as f32) * TILESIZE; - } - // Stay within bounds - if y > pos.y - (len as i32) { - draw.text(&font, part) - .position(x_px, (y as f32) * TILESIZE) - .size(FONTSIZE) - .color(Color::from_rgb(frag.colour.r, frag.colour.g, frag.colour.b)); - } - x += part.len() as i32; - x_px = draw.last_text_bounds().max_x(); - } - }); - // Take away one from the y-axis, because we want to start each entry - // on a new line, and go up an additional amount depending on how many - // lines our *previous* entry took. - y -= 1 + lines; - x = pos.x; - x_px = (x as f32) * TILESIZE; - }); -} - -use std::collections::BTreeMap; -fn write(gfx: &mut Graphics, font: ¬an::draw::Font, pos: &(f32, f32), desc: bool) { - use notan::text::CreateText; - let mut text = gfx.create_text(); - let log = get_log(); - let latest: Vec<_> = log.iter().rev().take(4).rev().collect(); - let mut initial = true; - for (_, entries) in latest { - let mut wrote = false; - for (message, colour) in entries.iter() { - if initial { - if desc { - text.add(&message) - .font(font) - .position(pos.0, pos.1) - .size(FONTSIZE) - .max_width((VIEWPORT_W as f32) * TILESIZE) - .color(*colour) - .v_align_bottom(); - } else { - text.add(&message) - .font(font) - .position(pos.0, pos.1) - .size(FONTSIZE) - .max_width((VIEWPORT_W as f32) * TILESIZE) - .color(*colour); - } - initial = false; - } else { - text.chain(&message).color(*colour).size(FONTSIZE); - } - wrote = true; - } - if wrote { - text.chain("\n"); - } - } - gfx.render(&text); -} - -fn get_log() -> BTreeMap> { - let mut log: BTreeMap> = BTreeMap::new(); - log.entry(4).or_insert_with(Vec::new).push(("This is a".to_string(), Color::WHITE)); - log.entry(4).or_insert_with(Vec::new).push((" test".to_string(), Color::RED)); - log.entry(5).or_insert_with(Vec::new).push(("This is the fifth".to_string(), Color::WHITE)); - log.entry(5).or_insert_with(Vec::new).push((" test".to_string(), Color::BLUE)); - log.entry(6).or_insert_with(Vec::new).push(("This is the sixth".to_string(), Color::WHITE)); - log.entry(6).or_insert_with(Vec::new).push((" test".to_string(), Color::BLUE)); - log.entry(7).or_insert_with(Vec::new).push(("This is the seventh".to_string(), Color::WHITE)); - log.entry(7).or_insert_with(Vec::new).push((" test".to_string(), Color::BLUE)); - log.entry(8).or_insert_with(Vec::new).push(("This is the eighth".to_string(), Color::WHITE)); - log.entry(8) - .or_insert_with(Vec::new) - .push(( - " test with a very long message, so that I can test the line wrapping.".to_string(), - Color::BLUE, - )); - log.entry(9).or_insert_with(Vec::new).push(("This is the ninth".to_string(), Color::WHITE)); - log.entry(9).or_insert_with(Vec::new).push((" test".to_string(), Color::BLUE)); - - log -}