Config strictement stricte partout (ruff, mypy --strict, bandit, vulture, import-linter, eslint, stylelint), aucune regle desactivee "pour ne pas casser le build" - l'existant a ete corrige pour la satisfaire plutot que l'inverse. Hooks pre-commit locaux (language: system) bloquants. - Typage mypy --strict propage a tout le moteur (db, screens, auth, core, ai, routes, puis publish/scripts/tests/app.py/build_css.py). - Securite : fuite de handle fichier Windows corrigee dans l'export SCORM (routes/publish/export_scorm.py), CSRF/RNG non-crypto/xAPI documentes (# nosec, # NOSONAR justifies), nouveau db.json_for_script() (echappe "</script>" dans le JSON embarque en <script>, 25 sites). - Architecture : imports circulaires/F811 nettoyes, contrats import-linter respectes, code mort retire (vulture). - Accessibilite : 69 champs de formulaire sans label correctement associe corriges (for/id ou aria-label) sur 11 templates. - ESLint/Stylelint : lot mecanique JS/CSS, regles ajustees puis appliquees (aucune desactivee sans verification individuelle). - Tests : isolation du compte admin partage (nettoyage ponctuel + fixture de teardown automatique en filet de securite), suite complete verte (591 tests Python, 241 tests JS). - SonarQube Community Build self-heberge (Docker + PostgreSQL) : rapport complet analyse point par point, faux positifs documentes. - .gitattributes ajoute (LF force) : core.autocrlf=true sur cette machine faisait echouer ESLint (linebreak-style) via un bug connu de git (checkout "en place" qui ignore l'eol force sur un fichier deja present sur disque - contourne en supprimant puis recreant chaque fichier suivi). djLint (H021, styles inline) volontairement saute pour ce commit - backlog assume, deja documente, traite dans un lot separe. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
# ---------- Bibliothèque de sprites bundlée avec Forge (Phase 7/8) ----------
|
|
#
|
|
# Les 6 personnages "Toon Characters" de Kenney (CC0, voir
|
|
# static/characters/LICENSE-kenney.txt), copiés intégralement (toutes leurs
|
|
# poses) dans static/characters/<slug>/*.png depuis
|
|
# assets/characters/kenney_toon-characters/ (pack source, non versionné —
|
|
# seul ce sous-ensemble copié l'est). Un créateur qui veut ses propres
|
|
# sprites n'utilise pas ce catalogue — cette possibilité est retirée pour
|
|
# le moment (voir historique du plan), seuls ces personnages Forge sont
|
|
# disponibles.
|
|
CHARACTERS = {
|
|
"male-adventurer": "Aventurier",
|
|
"female-adventurer": "Aventurière",
|
|
"male-person": "Personnage (homme)",
|
|
"female-person": "Personnage (femme)",
|
|
"robot": "Robot",
|
|
"zombie": "Zombie",
|
|
}
|
|
|
|
# Regroupement des poses individuelles en animations nommées : les poses
|
|
# numérotées (ex. walk0..walk7) forment un cycle à plusieurs images, les
|
|
# autres sont des poses figées à une seule image. Mêmes noms de fichiers
|
|
# pour les 6 personnages (confirmé sur disque), donc une seule définition
|
|
# suffit pour tous.
|
|
_SEQUENCE_ANIMATIONS = {
|
|
"walk": 8, # cycle de marche
|
|
"run": 3, # course
|
|
"attack": 3, # attaque
|
|
"cheer": 2, # acclamation
|
|
"climb": 2, # escalade
|
|
"switch": 2, # bascule/actionner
|
|
}
|
|
_SINGLE_POSES = [
|
|
"idle",
|
|
"jump",
|
|
"fall",
|
|
"duck",
|
|
"hit",
|
|
"back",
|
|
"slide",
|
|
"interact",
|
|
"kick",
|
|
"side",
|
|
"shove",
|
|
"shoveBack",
|
|
"talk",
|
|
"attackKick",
|
|
"hang",
|
|
"hold",
|
|
"hurt",
|
|
"behindBack",
|
|
"down",
|
|
"drag",
|
|
"fallDown",
|
|
"rope",
|
|
"show",
|
|
"think",
|
|
"wide",
|
|
]
|
|
|
|
|
|
def _animations_for(slug: str) -> dict[str, list[str]]:
|
|
animations = {
|
|
name: [f"/static/characters/{slug}/{name}{i}.png" for i in range(count)]
|
|
for name, count in _SEQUENCE_ANIMATIONS.items()
|
|
}
|
|
for name in _SINGLE_POSES:
|
|
animations[name] = [f"/static/characters/{slug}/{name}.png"]
|
|
return animations
|
|
|
|
|
|
# Bibliothèque publique — visible par tous les comptes (CC0, voir
|
|
# LICENSE-kenney.txt). Distincte de screens.ADMIN_SPRITE_LIBRARY (sprites
|
|
# animaux CraftPix, réservés au rôle admin — voir
|
|
# screens/labels/animal_sprite_library.py et le plan "Bibliothèque de
|
|
# sprites animaux CraftPix").
|
|
PUBLIC_SPRITE_LIBRARY = {
|
|
slug: {"label": label, "animations": _animations_for(slug)} for slug, label in CHARACTERS.items()
|
|
}
|