feat(ui): captura F9, tema a data/ui.yaml i retocs estètics

Captura de pantalla amb F9: volca el canvas ARGB a
screenshots/scr_<timestamp>.png via stb_image_write.

Tot el tema d'UI (colors, timings, fonts, flag hud.bg_enabled)
passa a data/ui.yaml via UiConfig; els valors de Defaults::UI
queden com a fallbacks si el fitxer falta o li manca alguna clau.

Retocs estètics: paleta "uzebox" per a la UI, strings del HUD
(P1/P2/V/T/PIRAMIDE/SALA) traduïts a locale, i fons del marcador
opcional amb backdrop continu de franja per evitar el trencament
visual durant el shake o l'animació d'entrada dels panells.
This commit is contained in:
JailDesigner committed 2026-04-24 10:58:02 +02:00
1 parent 82b229222f
commit dc8a7723e3
26 files changed
+2593 -210

No files matched your search

+103
View File
@@ -0,0 +1,103 @@
#pragma once
#include <SDL3/SDL.h>
#include <string>
// Configuració del tema UI (índexs de paleta, timings, fonts i flags)
// carregada des de data/ui.yaml. Cada camp s'inicialitza amb el valor
// de Defaults::UI com a fallback: si el fitxer falta o li manca una
// clau, el joc s'executa amb el tema compilat.
//
// Patró idèntic a Locale i KeyConfig: Meyers singleton + load(path).
// No hi ha hot-reload — els canvis al YAML requereixen reiniciar.
class UiConfig {
public:
struct Font {
std::string name;
std::string gif;
std::string fnt;
int kerning;
};
static auto get() -> UiConfig&;
UiConfig(const UiConfig&) = delete;
UiConfig(UiConfig&&) = delete;
auto operator=(const UiConfig&) -> UiConfig& = delete;
auto operator=(UiConfig&&) -> UiConfig& = delete;
void load(const std::string& file_path);
// Colors — índexs sobre la paleta "ui" (Resource::Cache).
[[nodiscard]] auto renderInfoText() const -> Uint8 { return render_info_text_; }
[[nodiscard]] auto renderInfoShadow() const -> Uint8 { return render_info_shadow_; }
[[nodiscard]] auto canvasBg() const -> Uint8 { return canvas_bg_; }
[[nodiscard]] auto notificationText() const -> Uint8 { return notification_text_; }
[[nodiscard]] auto notificationBg() const -> Uint8 { return notification_bg_; }
[[nodiscard]] auto exitText() const -> Uint8 { return exit_text_; }
[[nodiscard]] auto exitBg() const -> Uint8 { return exit_bg_; }
[[nodiscard]] auto menuBg() const -> Uint8 { return menu_bg_; }
[[nodiscard]] auto menuBorder() const -> Uint8 { return menu_border_; }
[[nodiscard]] auto menuTitle() const -> Uint8 { return menu_title_; }
[[nodiscard]] auto menuLabel() const -> Uint8 { return menu_label_; }
[[nodiscard]] auto menuValue() const -> Uint8 { return menu_value_; }
[[nodiscard]] auto menuCursor() const -> Uint8 { return menu_cursor_; }
[[nodiscard]] auto menuDisabled() const -> Uint8 { return menu_disabled_; }
[[nodiscard]] auto hudBg() const -> Uint8 { return hud_bg_; }
[[nodiscard]] auto hudLabel() const -> Uint8 { return hud_label_; }
[[nodiscard]] auto hudValue() const -> Uint8 { return hud_value_; }
[[nodiscard]] auto hudFlash() const -> Uint8 { return hud_flash_; }
// Timings (ms).
[[nodiscard]] auto notificationMs() const -> int { return notification_ms_; }
[[nodiscard]] auto exitMs() const -> int { return exit_ms_; }
[[nodiscard]] auto hudEntryMs() const -> int { return hud_entry_ms_; }
[[nodiscard]] auto hudFlashMs() const -> int { return hud_flash_ms_; }
[[nodiscard]] auto hudShakeMs() const -> int { return hud_shake_ms_; }
// Fonts de UI.
[[nodiscard]] auto hudFont() const -> const Font& { return hud_font_; }
[[nodiscard]] auto placeholderFont() const -> const Font& { return placeholder_font_; }
[[nodiscard]] auto menuTitleFont() const -> const Font& { return menu_title_font_; }
[[nodiscard]] auto menuItemsFont() const -> const Font& { return menu_items_font_; }
// Flags visuals.
[[nodiscard]] auto hudBgEnabled() const -> bool { return hud_bg_enabled_; }
private:
UiConfig();
~UiConfig() = default;
Uint8 render_info_text_;
Uint8 render_info_shadow_;
Uint8 canvas_bg_;
Uint8 notification_text_;
Uint8 notification_bg_;
Uint8 exit_text_;
Uint8 exit_bg_;
Uint8 menu_bg_;
Uint8 menu_border_;
Uint8 menu_title_;
Uint8 menu_label_;
Uint8 menu_value_;
Uint8 menu_cursor_;
Uint8 menu_disabled_;
Uint8 hud_bg_;
Uint8 hud_label_;
Uint8 hud_value_;
Uint8 hud_flash_;
int notification_ms_;
int exit_ms_;
int hud_entry_ms_;
int hud_flash_ms_;
int hud_shake_ms_;
Font hud_font_;
Font placeholder_font_;
Font menu_title_font_;
Font menu_items_font_;
bool hud_bg_enabled_{false};
};