/ src / combat / view / bar.rs
bar.rs
 1  use ratatui::{
 2      layout::{Constraint, Direction, Layout},
 3      widgets::{LineGauge, Paragraph, Widget},
 4  };
 5  use specs::{Join, World, WorldExt};
 6  
 7  use crate::combat::CombatStats;
 8  
 9  pub struct CombatBarView<'a> {
10      pub world: &'a World,
11  }
12  
13  impl<'a> CombatBarView<'a> {
14      pub const MIN_LEN: u16 = 27;
15  }
16  
17  impl<'a> Widget for CombatBarView<'a> {
18      fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer)
19      where
20          Self: Sized,
21      {
22          let stats_storage = self.world.read_storage::<CombatStats>();
23          let player_storage = self.world.read_storage::<CombatStats>();
24  
25          let (_, stats) = (&player_storage, &stats_storage)
26              .join()
27              .next()
28              .expect("should be a player");
29  
30          let combat_layout = Layout::default()
31              .direction(Direction::Horizontal)
32              .constraints(vec![
33                  Constraint::Length(5),
34                  Constraint::Length(10),
35                  Constraint::Length(1),
36                  Constraint::Fill(1),
37                  Constraint::Length(10),
38              ])
39              .split(area);
40  
41          Paragraph::new("hp: [").render(combat_layout[0], buf);
42  
43          LineGauge::default()
44              .ratio(stats.hp_ratio())
45              .render(combat_layout[1], buf);
46  
47          Paragraph::new("]").render(combat_layout[2], buf);
48  
49          Paragraph::new(format!("{:3> }a, {:3> }d", stats.power, stats.defense))
50              .render(combat_layout[4], buf);
51      }
52  }