player object
This commit is contained in:
@@ -2,7 +2,7 @@ use crate::editor::EditorState;
|
||||
use crate::menu::{MenuItem, MenuKey};
|
||||
use crate::mode::PendingMode;
|
||||
use kiln_core::{Archetype, Builtin};
|
||||
use kiln_core::game::KeyType;
|
||||
use kiln_core::keys::KeyType;
|
||||
use kiln_core::glyph::Glyph;
|
||||
|
||||
/// One level in the editor's sidebar menu tree.
|
||||
|
||||
@@ -342,7 +342,7 @@ fn draw_play(frame: &mut Frame, game: &GameState, ui: &mut Ui) {
|
||||
.spacing(Spacing::Overlap(1))
|
||||
.areas(frame.area());
|
||||
frame.render_widget(
|
||||
StatusSidebarWidget::new(game.player_health, game.player_gems, game.player_keys),
|
||||
StatusSidebarWidget(game.player),
|
||||
sidebar_area,
|
||||
);
|
||||
rest
|
||||
|
||||
+7
-22
@@ -7,7 +7,6 @@
|
||||
|
||||
use std::collections::VecDeque;
|
||||
use crate::utils::rgba8_to_color;
|
||||
use kiln_core::game::Keyring;
|
||||
use kiln_core::{Archetype, Builtin};
|
||||
use kiln_core::cp437::tile_to_char;
|
||||
use ratatui::buffer::Buffer;
|
||||
@@ -16,9 +15,8 @@ use ratatui::style::{Color, Style};
|
||||
use ratatui::symbols::merge::MergeStrategy;
|
||||
use ratatui::text::{Line, Span};
|
||||
use ratatui::widgets::{Block, Paragraph, Widget};
|
||||
use kiln_core::player::Player;
|
||||
|
||||
/// How many hearts the health row always shows (the player's max health).
|
||||
const MAX_HEARTS: u32 = 5;
|
||||
/// A filled heart: bright red.
|
||||
const HEART_FULL: Color = Color::Rgb(255, 0, 0);
|
||||
/// A depleted heart: dark red.
|
||||
@@ -29,28 +27,15 @@ const HEART_EMPTY: Color = Color::Rgb(90, 0, 0);
|
||||
/// Shows a `Health:` label above a row of [`MAX_HEARTS`] heart glyphs, a
|
||||
/// `Gems: ♦ N` line, and a `Keys:` row of 8 `♀` glyphs colored when held
|
||||
/// and dark gray when absent.
|
||||
pub struct StatusSidebarWidget {
|
||||
/// The player's current health, clamped to [`MAX_HEARTS`] when drawn.
|
||||
health: u32,
|
||||
/// The number of gems collected, shown as a count.
|
||||
gems: u32,
|
||||
/// The player's key inventory.
|
||||
keys: Keyring,
|
||||
}
|
||||
|
||||
impl StatusSidebarWidget {
|
||||
/// Builds a sidebar widget for the given player stats.
|
||||
pub fn new(health: u32, gems: u32, keys: Keyring) -> Self {
|
||||
Self { health, gems, keys }
|
||||
}
|
||||
}
|
||||
pub struct StatusSidebarWidget(pub Player);
|
||||
|
||||
impl Widget for StatusSidebarWidget {
|
||||
fn render(self, area: Rect, buf: &mut Buffer) {
|
||||
let player = self.0;
|
||||
// One bright-red span per filled heart, dark-red for the rest, so a
|
||||
// partly-depleted bar reads at a glance.
|
||||
let filled = self.health.min(MAX_HEARTS);
|
||||
let hearts: Vec<Span> = (0..MAX_HEARTS)
|
||||
let filled = player.health;
|
||||
let hearts: Vec<Span> = (0..player.max_health)
|
||||
.map(|i| {
|
||||
let color = if i < filled { HEART_FULL } else { HEART_EMPTY };
|
||||
Span::styled("♥", Style::default().fg(color))
|
||||
@@ -64,7 +49,7 @@ impl Widget for StatusSidebarWidget {
|
||||
let gem_style = Style::default().fg(rgba8_to_color(gem_glyph.fg));
|
||||
|
||||
// Build the key row: 8 ♀ glyphs, colored when held, near-black when absent.
|
||||
let mut key_spans: VecDeque<_> = self
|
||||
let mut key_spans: VecDeque<_> = player
|
||||
.keys
|
||||
.colors()
|
||||
.iter()
|
||||
@@ -86,7 +71,7 @@ impl Widget for StatusSidebarWidget {
|
||||
Line::from(vec![
|
||||
Span::raw("Gems: "),
|
||||
Span::styled(gem_char, gem_style),
|
||||
Span::raw(format!("{} ", self.gems)),
|
||||
Span::raw(format!("{} ", player.gems)),
|
||||
]),
|
||||
Line::from(""),
|
||||
Line::from_iter(key_spans.into_iter()),
|
||||
|
||||
Reference in New Issue
Block a user