cuqueclicker_lib/ui/
stats.rs1use 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}