From b9050db85cc6e84947b1d1b7e6ba5fd8ed73cd98 Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Sat, 7 Jan 2023 14:42:42 +0100 Subject: [PATCH] status bar --- src/creature.rs | 2 ++ src/item.rs | 17 ++++++++++ src/ui/mod.rs | 84 +++++++++++++++++++++++++++++++++++-------------- 3 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/creature.rs b/src/creature.rs index 79c38d6..0673a82 100644 --- a/src/creature.rs +++ b/src/creature.rs @@ -27,6 +27,7 @@ pub struct Creature { pub agenda: Agenda, pub weapon: Option, pub armor: Option, + pub coins: u32, } pub struct CreatureGenerator; @@ -53,6 +54,7 @@ impl Creature { agenda: Agenda::Idle(0), weapon: None, armor: None, + coins: 0, } } diff --git a/src/item.rs b/src/item.rs index c575415..dc77922 100644 --- a/src/item.rs +++ b/src/item.rs @@ -37,6 +37,23 @@ pub struct Armor { } pub struct ItemGenerator; +impl Item { + pub fn value(&self) -> u32 { + match &self.item_type { + ItemType::Weapon(weapon) => self.weapon_value(weapon), + ItemType::Armor(armor) => self.armor_value(armor), + } + } + + fn weapon_value(&self, weapon: &Weapon) -> u32 { + weapon.damage_base + weapon.damage_dice * weapon.damage_sides + } + + fn armor_value(&self, armor: &Armor) -> u32 { + armor.armor_class * 10 + } +} + impl ItemGenerator { pub fn generate_item() -> Item { Item { diff --git a/src/ui/mod.rs b/src/ui/mod.rs index c357b6c..6dc2a51 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -58,6 +58,33 @@ pub struct App<'a> { debug_data: Option>, } +pub struct DefaultLayout { + pub status: tui::layout::Rect, + pub main: tui::layout::Rect, + pub controls: tui::layout::Rect, +} + +impl DefaultLayout { + pub fn default(rect: tui::layout::Rect) -> DefaultLayout { + let chunks = Layout::default() + .direction(tui::layout::Direction::Vertical) + .constraints( + [ + tui::layout::Constraint::Length(1), + tui::layout::Constraint::Min(3), + tui::layout::Constraint::Length(2) + ] + .as_ref(), + ).split(rect); + + DefaultLayout { + status: chunks[0], + main: chunks[1], + controls: chunks[2], + } + } +} + impl<'a> App<'a> { pub fn new(state: Game) -> App<'a> { App { @@ -266,17 +293,9 @@ impl<'a> App<'a> { self.status = AppStatus::Debug; } - fn default_layout(&self) -> Layout { - Layout::default() - .direction(tui::layout::Direction::Vertical) - .constraints( - [ - tui::layout::Constraint::Min(3), - tui::layout::Constraint::Length(2) - ] - .as_ref(), - ) - } + // fn default_layout(&self) -> Layout { + // DefaultLayout::default() + // } pub fn draw(&mut self, f: &mut Frame) { match &self.status { @@ -296,10 +315,24 @@ impl<'a> App<'a> { } + fn draw_status(&self, f: &mut Frame, rect: tui::layout::Rect) { + + let spans = tui::text::Spans::from(vec![ + tui::text::Span::raw("Date: "), + tui::text::Span::raw(format!("{}", self.game.state.time)), + ]); + + let status_text = tui::widgets::Paragraph::new(spans) + .block(tui::widgets::Block::default().borders(tui::widgets::Borders::LEFT | tui::widgets::Borders::RIGHT)) + .style(tui::style::Style::default().fg(tui::style::Color::White)); + + f.render_widget(status_text, rect); + } + pub fn draw_initial(&mut self, _f: &mut Frame) {} pub fn draw_guest_selection(&mut self, f: &mut Frame) { - let chunks = self.default_layout().split(f.size()); + let chunks = DefaultLayout::default(f.size()); let main_window = tui::widgets::List::new(self.guest_list.clone()) .block(tui::widgets::Block::default().title("Guests").borders(tui::widgets::Borders::ALL)) @@ -315,12 +348,13 @@ impl<'a> App<'a> { .add("Esc".to_owned(), "quit".to_owned()) .render(); - f.render_stateful_widget(main_window, chunks[0], &mut self.guest_list_state); - f.render_widget(controls, chunks[1]); + self.draw_status(f, chunks.status); + f.render_stateful_widget(main_window, chunks.main, &mut self.guest_list_state); + f.render_widget(controls, chunks.controls); } fn draw_talk_to_guest(&self, f: &mut Frame, guest: Option) { - let chunks = self.default_layout().split(f.size()); + let chunks = DefaultLayout::default(f.size()); let guest = self.game.state.get_creature(guest.unwrap()).unwrap(); @@ -345,7 +379,7 @@ impl<'a> App<'a> { let text = tui::text::Text::from(full_text); let scroll: u16 = ((text.lines.len() as u16) ) .checked_sub( - (chunks[0].height as u16).checked_sub(2).unwrap_or(0) // 2 lines for the border + (chunks.main.height as u16).checked_sub(2).unwrap_or(0) // 2 lines for the border ) .unwrap_or(0) .checked_sub(self.conversation_scroll) @@ -362,12 +396,13 @@ impl<'a> App<'a> { .add("Esc".to_owned(), "Back".to_owned()) .render(); - f.render_widget(main_window, chunks[0]); - f.render_widget(controls, chunks[1]); + self.draw_status(f, chunks.status); + f.render_widget(main_window, chunks.main); + f.render_widget(controls, chunks.controls); } fn draw_debug(&mut self, f: &mut Frame) { - let chunks = self.default_layout().split(f.size()); + let chunks = DefaultLayout::default(f.size()); let data = self.debug_data.as_mut().unwrap(); @@ -378,7 +413,7 @@ impl<'a> App<'a> { .style(tui::style::Style::default().fg(tui::style::Color::White)) .highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC)) .highlight_symbol(">>"); - f.render_stateful_widget(main_window, chunks[0], &mut data.list_state); + f.render_stateful_widget(main_window, chunks.main, &mut data.list_state); }, DebugView::Items => { let main_window = tui::widgets::List::new(data.item_list.clone()) @@ -386,7 +421,7 @@ impl<'a> App<'a> { .style(tui::style::Style::default().fg(tui::style::Color::White)) .highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC)) .highlight_symbol(">>"); - f.render_stateful_widget(main_window, chunks[0], &mut data.item_list_state); + f.render_stateful_widget(main_window, chunks.main, &mut data.item_list_state); }, DebugView::Map => { let mut rows = Vec::new(); @@ -414,10 +449,11 @@ impl<'a> App<'a> { .style(tui::style::Style::default().fg(tui::style::Color::White)) .scroll(data.map_scroll); - f.render_widget(main_window, chunks[0]); - // f.render_stateful_widget(main_window, chunks[0], &mut data.map_list_state); + f.render_widget(main_window, chunks.main); }, } + + self.draw_status(f, chunks.status); let mut binding = Controls::new(); let controls = binding .add("↑↓".to_owned(), "select guest".to_owned()) @@ -426,7 +462,7 @@ impl<'a> App<'a> { .add("m".to_owned(), "Map".to_owned()) .add("Esc".to_owned(), "back".to_owned()) .render(); - f.render_widget(controls, chunks[1]); + f.render_widget(controls, chunks.controls); } /**