cuqueclicker 0.3.0

A TUI idle clicker where you finger an ASCII ass instead of clicking a cookie.
use ratatui::{prelude::*, widgets::*};

use crate::format;
use crate::game::achievement;
use crate::game::state::{GameState, TICK_HZ};
use crate::i18n::t;

pub fn draw(frame: &mut Frame, area: Rect, state: &GameState) {
    let lang = t();
    let session_secs = state.session_ticks / TICK_HZ as u64;
    let total_secs = state.total_play_ticks / TICK_HZ as u64;
    let unlocked = state.achievements_earned.len();
    let total = achievement::count();

    let rows = [
        (lang.stat_session_time, format::duration(session_secs)),
        (lang.stat_total_time, format::duration(total_secs)),
        (
            lang.stat_total_clicks,
            format::big(state.total_clicks as f64),
        ),
        (
            lang.stat_lifetime_cuques,
            format::big(state.lifetime_cuques),
        ),
        (lang.stat_best_fps, format::rate(state.best_fps)),
        (
            lang.stat_fingerers_owned,
            format::big(state.fingerers_owned_total() as f64),
        ),
        (
            lang.stat_golden_caught,
            format::big(state.golden_caught as f64),
        ),
        (lang.stat_achievements, format!("{} / {}", unlocked, total)),
    ];

    let label_w = rows
        .iter()
        .map(|(label, _)| label.chars().count())
        .max()
        .unwrap_or(0);

    let lines: Vec<Line> = rows
        .iter()
        .map(|(label, value)| {
            Line::from(vec![
                Span::styled(
                    format!("{:<width$}  ", label, width = label_w),
                    Style::default().fg(Color::DarkGray),
                ),
                Span::styled(
                    value.clone(),
                    Style::default()
                        .fg(Color::Rgb(240, 220, 180))
                        .add_modifier(Modifier::BOLD),
                ),
            ])
        })
        .collect();

    let p = Paragraph::new(lines).block(Block::bordered().title(lang.stats_title));
    frame.render_widget(p, area);
}