From c10eda695abb255cd698952038221088fd87f3da Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Mon, 10 Jul 2023 13:09:01 +0100 Subject: [PATCH] logs + events refactor --- src/components.rs | 3 +++ src/gamelog/events.rs | 43 +++++++++++++++++++++++++++++++++++++++++ src/gamelog/logstore.rs | 9 +++++++++ src/gamelog/mod.rs | 6 +++++- src/gui.rs | 11 ++++++++++- src/main.rs | 4 ++++ src/saveload_system.rs | 13 +++++++++++-- 7 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 src/gamelog/events.rs diff --git a/src/components.rs b/src/components.rs index 2c57635..6f29d63 100644 --- a/src/components.rs +++ b/src/components.rs @@ -4,6 +4,7 @@ use specs::error::NoError; use specs::prelude::*; use specs::saveload::{ConvertSaveload, Marker}; use specs_derive::*; +use std::collections::HashMap; // Serialization helper code. We need to implement ConvertSaveload for each type that contains an // Entity. @@ -12,6 +13,8 @@ pub struct SerializeMe; #[derive(Component, Serialize, Deserialize, Clone)] pub struct SerializationHelper { pub map: super::map::Map, + pub log: Vec>, + pub events: HashMap, } #[derive(Component, ConvertSaveload, Clone)] diff --git a/src/gamelog/events.rs b/src/gamelog/events.rs new file mode 100644 index 0000000..f7c7b4f --- /dev/null +++ b/src/gamelog/events.rs @@ -0,0 +1,43 @@ +use std::collections::HashMap; +use std::sync::Mutex; + +lazy_static! { + static ref EVENTS: Mutex> = Mutex::new(HashMap::new()); +} + +pub fn clear_events() { + EVENTS.lock().unwrap().clear(); +} + +pub fn record_event(event: T, n: i32) { + let event_name = event.to_string(); + let mut events_lock = EVENTS.lock(); + let mut events = events_lock.as_mut().unwrap(); + if let Some(e) = events.get_mut(&event_name) { + *e += n; + } else { + events.insert(event_name, n); + } +} + +pub fn get_event_count(event: T) -> i32 { + let event_name = event.to_string(); + let events_lock = EVENTS.lock(); + let events = events_lock.unwrap(); + if let Some(e) = events.get(&event_name) { + *e + } else { + 0 + } +} + +pub fn clone_events() -> HashMap { + EVENTS.lock().unwrap().clone() +} + +pub fn load_events(events: HashMap) { + EVENTS.lock().unwrap().clear(); + events.iter().for_each(|(k, v)| { + EVENTS.lock().unwrap().insert(k.to_string(), *v); + }); +} diff --git a/src/gamelog/logstore.rs b/src/gamelog/logstore.rs index 7ff1015..9d8ec10 100644 --- a/src/gamelog/logstore.rs +++ b/src/gamelog/logstore.rs @@ -32,3 +32,12 @@ pub fn log_display() -> TextBuilder { return buf; } + +pub fn clone_log() -> Vec> { + return LOG.lock().unwrap().clone(); +} + +pub fn restore_log(log: &mut Vec>) { + LOG.lock().unwrap().clear(); + LOG.lock().unwrap().append(log); +} diff --git a/src/gamelog/mod.rs b/src/gamelog/mod.rs index 31beb4f..aad720f 100644 --- a/src/gamelog/mod.rs +++ b/src/gamelog/mod.rs @@ -4,8 +4,12 @@ mod builder; pub use builder::*; mod logstore; use logstore::*; -pub use logstore::{clear_log, log_display}; +pub use logstore::{clear_log, clone_log, log_display, restore_log}; +mod events; +pub use events::*; +use serde::{Deserialize, Serialize}; +#[derive(Serialize, Deserialize, Clone)] pub struct LogFragment { pub colour: RGB, pub text: String, diff --git a/src/gui.rs b/src/gui.rs index 2325247..4ef7066 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -25,7 +25,16 @@ pub fn draw_ui(ecs: &World, ctx: &mut Rltk) { // Render depth let map = ecs.fetch::(); let depth = format!(" D{} ", map.depth); - ctx.print_color(74, 43, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), &depth); + ctx.print_color_right(78, 43, RGB::named(rltk::YELLOW), RGB::named(rltk::BLACK), &depth); + + // Render turn + ctx.print_color_right( + 78, + 49, + RGB::named(rltk::YELLOW), + RGB::named(rltk::BLACK), + &format!(" T{} ", crate::gamelog::get_event_count("Turn")), + ); // Render mouse cursor let mouse_pos = ctx.mouse_pos(); diff --git a/src/main.rs b/src/main.rs index 1525678..491f469 100644 --- a/src/main.rs +++ b/src/main.rs @@ -214,6 +214,9 @@ impl GameState for State { } RunState::AwaitingInput => { new_runstate = player_input(self, ctx); + if new_runstate != RunState::AwaitingInput { + gamelog::record_event("Turn", 1); + } } RunState::PlayerTurn => { self.run_systems(); @@ -432,6 +435,7 @@ fn main() -> rltk::BError { gs.ecs.insert(player_entity); gamelog::clear_log(); + gamelog::clear_events(); gamelog::Logger::new() .append("Welcome!") .colour(rltk::CYAN) diff --git a/src/saveload_system.rs b/src/saveload_system.rs index ab75d70..c53e899 100644 --- a/src/saveload_system.rs +++ b/src/saveload_system.rs @@ -27,8 +27,15 @@ pub fn save_game(_ecs: &mut World) {} pub fn save_game(ecs: &mut World) { // Create helper let mapcopy = ecs.get_mut::().unwrap().clone(); - let savehelper = - ecs.create_entity().with(SerializationHelper { map: mapcopy }).marked::>().build(); + let savehelper = ecs + .create_entity() + .with(SerializationHelper { + map: mapcopy, + log: crate::gamelog::clone_log(), + events: crate::gamelog::clone_events(), + }) + .marked::>() + .build(); // Actually serialize { @@ -156,6 +163,8 @@ pub fn load_game(ecs: &mut World) { *worldmap = h.map.clone(); worldmap.tile_content = vec![Vec::new(); super::map::MAPCOUNT]; deleteme = Some(e); + crate::gamelog::restore_log(&mut h.log.clone()); + crate::gamelog::load_events(h.events.clone()); } for (e, _p, pos) in (&entities, &player, &position).join() { let mut ppos = ecs.write_resource::();