status bar
This commit is contained in:
parent
427595edb1
commit
b9050db85c
|
@ -27,6 +27,7 @@ pub struct Creature {
|
||||||
pub agenda: Agenda,
|
pub agenda: Agenda,
|
||||||
pub weapon: Option<EntityId>,
|
pub weapon: Option<EntityId>,
|
||||||
pub armor: Option<EntityId>,
|
pub armor: Option<EntityId>,
|
||||||
|
pub coins: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct CreatureGenerator;
|
pub struct CreatureGenerator;
|
||||||
|
@ -53,6 +54,7 @@ impl Creature {
|
||||||
agenda: Agenda::Idle(0),
|
agenda: Agenda::Idle(0),
|
||||||
weapon: None,
|
weapon: None,
|
||||||
armor: None,
|
armor: None,
|
||||||
|
coins: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
17
src/item.rs
17
src/item.rs
|
@ -37,6 +37,23 @@ pub struct Armor {
|
||||||
}
|
}
|
||||||
pub struct ItemGenerator;
|
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 {
|
impl ItemGenerator {
|
||||||
pub fn generate_item() -> Item {
|
pub fn generate_item() -> Item {
|
||||||
Item {
|
Item {
|
||||||
|
|
|
@ -58,6 +58,33 @@ pub struct App<'a> {
|
||||||
debug_data: Option<DebugData<'a>>,
|
debug_data: Option<DebugData<'a>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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> {
|
impl<'a> App<'a> {
|
||||||
pub fn new(state: Game) -> App<'a> {
|
pub fn new(state: Game) -> App<'a> {
|
||||||
App {
|
App {
|
||||||
|
@ -266,17 +293,9 @@ impl<'a> App<'a> {
|
||||||
self.status = AppStatus::Debug;
|
self.status = AppStatus::Debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_layout(&self) -> Layout {
|
// fn default_layout(&self) -> Layout {
|
||||||
Layout::default()
|
// DefaultLayout::default()
|
||||||
.direction(tui::layout::Direction::Vertical)
|
// }
|
||||||
.constraints(
|
|
||||||
[
|
|
||||||
tui::layout::Constraint::Min(3),
|
|
||||||
tui::layout::Constraint::Length(2)
|
|
||||||
]
|
|
||||||
.as_ref(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn draw<B: Backend>(&mut self, f: &mut Frame<B>) {
|
pub fn draw<B: Backend>(&mut self, f: &mut Frame<B>) {
|
||||||
match &self.status {
|
match &self.status {
|
||||||
|
@ -296,10 +315,24 @@ impl<'a> App<'a> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn draw_status<B: Backend>(&self, f: &mut Frame<B>, 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<B: Backend>(&mut self, _f: &mut Frame<B>) {}
|
pub fn draw_initial<B: Backend>(&mut self, _f: &mut Frame<B>) {}
|
||||||
|
|
||||||
pub fn draw_guest_selection<B: Backend>(&mut self, f: &mut Frame<B>) {
|
pub fn draw_guest_selection<B: Backend>(&mut self, f: &mut Frame<B>) {
|
||||||
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())
|
let main_window = tui::widgets::List::new(self.guest_list.clone())
|
||||||
.block(tui::widgets::Block::default().title("Guests").borders(tui::widgets::Borders::ALL))
|
.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())
|
.add("Esc".to_owned(), "quit".to_owned())
|
||||||
.render();
|
.render();
|
||||||
|
|
||||||
f.render_stateful_widget(main_window, chunks[0], &mut self.guest_list_state);
|
self.draw_status(f, chunks.status);
|
||||||
f.render_widget(controls, chunks[1]);
|
f.render_stateful_widget(main_window, chunks.main, &mut self.guest_list_state);
|
||||||
|
f.render_widget(controls, chunks.controls);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_talk_to_guest<B: Backend>(&self, f: &mut Frame<B>, guest: Option<EntityId>) {
|
fn draw_talk_to_guest<B: Backend>(&self, f: &mut Frame<B>, guest: Option<EntityId>) {
|
||||||
let chunks = self.default_layout().split(f.size());
|
let chunks = DefaultLayout::default(f.size());
|
||||||
|
|
||||||
let guest = self.game.state.get_creature(guest.unwrap()).unwrap();
|
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 text = tui::text::Text::from(full_text);
|
||||||
let scroll: u16 = ((text.lines.len() as u16) )
|
let scroll: u16 = ((text.lines.len() as u16) )
|
||||||
.checked_sub(
|
.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)
|
.unwrap_or(0)
|
||||||
.checked_sub(self.conversation_scroll)
|
.checked_sub(self.conversation_scroll)
|
||||||
|
@ -362,12 +396,13 @@ impl<'a> App<'a> {
|
||||||
.add("Esc".to_owned(), "Back".to_owned())
|
.add("Esc".to_owned(), "Back".to_owned())
|
||||||
.render();
|
.render();
|
||||||
|
|
||||||
f.render_widget(main_window, chunks[0]);
|
self.draw_status(f, chunks.status);
|
||||||
f.render_widget(controls, chunks[1]);
|
f.render_widget(main_window, chunks.main);
|
||||||
|
f.render_widget(controls, chunks.controls);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_debug<B: Backend>(&mut self, f: &mut Frame<B>) {
|
fn draw_debug<B: Backend>(&mut self, f: &mut Frame<B>) {
|
||||||
let chunks = self.default_layout().split(f.size());
|
let chunks = DefaultLayout::default(f.size());
|
||||||
|
|
||||||
let data = self.debug_data.as_mut().unwrap();
|
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))
|
.style(tui::style::Style::default().fg(tui::style::Color::White))
|
||||||
.highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC))
|
.highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC))
|
||||||
.highlight_symbol(">>");
|
.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 => {
|
DebugView::Items => {
|
||||||
let main_window = tui::widgets::List::new(data.item_list.clone())
|
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))
|
.style(tui::style::Style::default().fg(tui::style::Color::White))
|
||||||
.highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC))
|
.highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC))
|
||||||
.highlight_symbol(">>");
|
.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 => {
|
DebugView::Map => {
|
||||||
let mut rows = Vec::new();
|
let mut rows = Vec::new();
|
||||||
|
@ -414,10 +449,11 @@ impl<'a> App<'a> {
|
||||||
.style(tui::style::Style::default().fg(tui::style::Color::White))
|
.style(tui::style::Style::default().fg(tui::style::Color::White))
|
||||||
.scroll(data.map_scroll);
|
.scroll(data.map_scroll);
|
||||||
|
|
||||||
f.render_widget(main_window, chunks[0]);
|
f.render_widget(main_window, chunks.main);
|
||||||
// f.render_stateful_widget(main_window, chunks[0], &mut data.map_list_state);
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.draw_status(f, chunks.status);
|
||||||
let mut binding = Controls::new();
|
let mut binding = Controls::new();
|
||||||
let controls = binding
|
let controls = binding
|
||||||
.add("↑↓".to_owned(), "select guest".to_owned())
|
.add("↑↓".to_owned(), "select guest".to_owned())
|
||||||
|
@ -426,7 +462,7 @@ impl<'a> App<'a> {
|
||||||
.add("m".to_owned(), "Map".to_owned())
|
.add("m".to_owned(), "Map".to_owned())
|
||||||
.add("Esc".to_owned(), "back".to_owned())
|
.add("Esc".to_owned(), "back".to_owned())
|
||||||
.render();
|
.render();
|
||||||
f.render_widget(controls, chunks[1]);
|
f.render_widget(controls, chunks.controls);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue