cuqueclicker 0.1.1

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

use crate::game::state::GameState;
use crate::i18n::t;

pub fn draw(frame: &mut Frame, area: Rect, state: &GameState) {
    let lang = t();
    let mut lines: Vec<Line> = Vec::new();
    let unlocked = state.achievements_earned.len();
    let total = lang.achievement_names.len();

    lines.push(Line::from(vec![
        Span::styled(
            format!("{} / {} ", unlocked, total),
            Style::default()
                .fg(Color::Yellow)
                .add_modifier(Modifier::BOLD),
        ),
        Span::styled(lang.ach_summary, Style::default().fg(Color::DarkGray)),
    ]));
    lines.push(Line::raw(""));

    for (i, name) in lang.achievement_names.iter().enumerate() {
        let unlocked = state.has_achievement_idx(i);
        let (marker, name_style) = if unlocked {
            (
                lang.ach_unlocked,
                Style::default()
                    .fg(Color::Rgb(255, 215, 0))
                    .add_modifier(Modifier::BOLD),
            )
        } else {
            (lang.ach_locked, Style::default().fg(Color::DarkGray))
        };
        lines.push(Line::from(vec![
            Span::styled(format!("{} ", marker), name_style),
            Span::styled(name.to_string(), name_style),
        ]));
        let desc = lang.achievement_descs.get(i).copied().unwrap_or("");
        let desc_style = if unlocked {
            Style::default().fg(Color::Rgb(180, 180, 180))
        } else {
            Style::default().fg(Color::DarkGray)
        };
        lines.push(Line::from(vec![
            Span::raw("    "),
            Span::styled(desc.to_string(), desc_style),
        ]));
        lines.push(Line::raw(""));
    }

    let p = Paragraph::new(lines)
        .block(Block::bordered().title(lang.achievements_title))
        .wrap(Wrap { trim: false });
    frame.render_widget(p, area);
}