mirror of
https://github.com/deunix-educ/aventuriers-des-mots.git
synced 2026-10-13 02:11:58 +02:00
Add settings screen and adult space with progress report and save export/restore (0.4.0)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
class_name AppSettings
|
||||
extends RefCounted
|
||||
## Preferences de l'appareil (volume, taille du texte, animations). Code pur :
|
||||
## valeurs par defaut, nettoyage d'un fichier lu sur disque (jamais de valeur
|
||||
## hors limites) et conversions. Les reglages sont communs a tous les profils :
|
||||
## ils ne font pas partie de la sauvegarde d'un enfant.
|
||||
|
||||
const FORMAT_VERSION := 1
|
||||
|
||||
## Facteurs de taille du texte proposes (index = choix dans l'ecran de reglages).
|
||||
const TEXT_SCALES: Array[float] = [1.0, 1.15, 1.3]
|
||||
|
||||
## Types de theme jamais agrandis : les grands titres sont deja grands, et
|
||||
## les agrandir ferait deborder les barres d'en-tete de la fenetre.
|
||||
const UNSCALED_THEME_TYPES: Array[String] = ["HeaderTitle", "CardTitle", "Window"]
|
||||
const VOLUME_STEPS := 5
|
||||
|
||||
|
||||
static func defaults() -> Dictionary:
|
||||
return {
|
||||
"format_version": FORMAT_VERSION,
|
||||
"volume": 0.8,
|
||||
"text_scale_index": 0,
|
||||
"animations_enabled": true,
|
||||
}
|
||||
|
||||
|
||||
## Complete et borne les valeurs d'un dictionnaire quelconque (fichier absent,
|
||||
## tronque ou modifie a la main) : le resultat est toujours utilisable.
|
||||
static func sanitize(raw: Variant) -> Dictionary:
|
||||
var result := defaults()
|
||||
if typeof(raw) != TYPE_DICTIONARY:
|
||||
return result
|
||||
var source: Dictionary = raw
|
||||
var volume: Variant = source.get("volume")
|
||||
if typeof(volume) == TYPE_FLOAT or typeof(volume) == TYPE_INT:
|
||||
result["volume"] = clampf(float(volume), 0.0, 1.0)
|
||||
var index: Variant = source.get("text_scale_index")
|
||||
if typeof(index) == TYPE_FLOAT or typeof(index) == TYPE_INT:
|
||||
result["text_scale_index"] = clampi(int(index), 0, TEXT_SCALES.size() - 1)
|
||||
var animations: Variant = source.get("animations_enabled")
|
||||
if typeof(animations) == TYPE_BOOL:
|
||||
result["animations_enabled"] = animations
|
||||
return result
|
||||
|
||||
|
||||
static func text_scale(settings: Dictionary) -> float:
|
||||
return TEXT_SCALES[clampi(int(settings["text_scale_index"]), 0, TEXT_SCALES.size() - 1)]
|
||||
|
||||
|
||||
## Volume de 0 a 1 vers des decibels ; le silence complet est un vrai silence.
|
||||
static func volume_db(volume: float) -> float:
|
||||
if volume <= 0.0:
|
||||
return -80.0
|
||||
return linear_to_db(clampf(volume, 0.0, 1.0))
|
||||
Reference in New Issue
Block a user