Skip to main content

cuqueclicker_lib/ui/
stats.rs

1use ratatui::{prelude::*, widgets::*};
2
3use crate::format;
4use crate::game::achievement;
5use crate::game::state::{GameState, TICK_HZ};
6use crate::i18n::t;
7
8pub fn draw(frame: &mut Frame, area: Rect, state: &GameState) {
9    let lang = t();
10    let session_secs = state.session_ticks / TICK_HZ as u64;
11    let total_secs = state.total_play_ticks / TICK_HZ as u64;
12    let unlocked = state.achievements_earned.len();
13    let total = achievement::count();
14
15    let rows = [
16        (lang.stat_session_time, format::duration(session_secs)),
17        (lang.stat_total_time, format::duration(total_secs)),
18        (
19            lang.stat_total_clicks,
20            format::big(state.total_clicks as f64),
21        ),
22        (
23            lang.stat_lifetime_cuques,
24            format::big(state.lifetime_cuques),
25        ),
26        (lang.stat_best_fps, format::rate(state.best_fps)),
27        (
28            lang.stat_fingerers_owned,
29            format::big(state.fingerers_owned_total() as f64),
30        ),
31        (
32            lang.stat_golden_caught,
33            format::big(state.golden_caught as f64),
34        ),
35        (lang.stat_achievements, format!("{} / {}", unlocked, total)),
36    ];
37
38    let label_w = rows
39        .iter()
40        .map(|(label, _)| label.chars().count())
41        .max()
42        .unwrap_or(0);
43
44    let lines: Vec<Line> = rows
45        .iter()
46        .map(|(label, value)| {
47            Line::from(vec![
48                Span::styled(
49                    format!("{:<width$}  ", label, width = label_w),
50                    Style::default().fg(Color::DarkGray),
51                ),
52                Span::styled(
53                    value.clone(),
54                    Style::default()
55                        .fg(Color::Rgb(240, 220, 180))
56                        .add_modifier(Modifier::BOLD),
57                ),
58            ])
59        })
60        .collect();
61
62    let p = Paragraph::new(lines).block(Block::bordered().title(lang.stats_title));
63    frame.render_widget(p, area);
64}