Personnages : toutes les animations, tous les personnages ; retrait de l'import de sprites personnalisés
Build and deploy / test-python (push) Successful in 1m50s
Build and deploy / test-js (push) Successful in 6s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

À la demande de l'utilisateur (validation de la refonte visuelle du
widget Personnage), deux ajustements :

- Bibliothèque de sprites Forge étendue aux 6 personnages du pack Kenney
  "Toon Characters" (aventurier/aventurière, personnage homme/femme,
  robot, zombie), avec TOUTES leurs poses (45 par personnage) plutôt que
  3 — regroupées en 31 animations nommées par personnage (poses
  numérotées type walk0..walk7 fusionnées en un seul cycle "walk", les
  autres restant des poses figées à une image). ~1,2 Mo au total,
  toujours un sous-ensemble curé du pack source (assets/characters/, non
  versionné) — HD/Parts/Tilesheet/Vector toujours exclus.
- Import de sprites personnalisés retiré pour le moment : plus de tuile
  "➕ Sprite personnalisé" dans la galerie d'ajout, plus de section
  d'import dans les propriétés d'un personnage — seuls les personnages
  Forge restent proposés. La résolution serveur de _personnage_data
  garde son support générique de la source "custom" (aucune migration
  requise si cette possibilité revient plus tard), mais plus aucune UI
  ne permet de la créer.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-31 07:38:22 +02:00
co-authored by Claude Sonnet 5
parent 9e076f8cf9
commit 5ead091c75
256 changed files with 97 additions and 151 deletions
+10 -37
View File
@@ -53,11 +53,6 @@
<img src="/static/characters/{{ char_slug }}/idle.png" alt="{{ character.label }}" class="personnageThumb">
</button>
{% endfor %}
{% if mode == 'add' %}
<button type="button" class="iconGalleryTile" title="Sprite personnalisé" onclick="addPersonnageElement('__custom__')">
<span style="font-size:28px;">➕</span>
</button>
{% endif %}
</div>
{% endmacro %}
@@ -159,16 +154,15 @@
<!-- Phase 8 — galerie de personnages Forge (widget "personnage" dédié,
voir screens/widgets/registry.py) : cliquer une tuile pose un
personnage DÉJÀ configuré (Kenney CC0), animé immédiatement dans
le canevas (voir personnage-preview.js) — pas un élément générique
à configurer ensuite dans la logique. "➕ Sprite personnalisé" pose
un personnage vide dont les animations s'importent dans ses
propriétés (panneau droit). -->
personnage DÉJÀ configuré (Kenney CC0, toutes ses animations),
animé immédiatement dans le canevas (voir personnage-preview.js) —
pas un élément générique à configurer ensuite dans la logique.
L'import de sprites personnalisés est retiré pour le moment. -->
<details class="propGroup">
<summary>🎭 Personnages</summary>
<div class="propGroupBody">
{{ render_personnage_gallery('add', 'personnageGalleryAdd') }}
<p class="help">Personnage prêt à l'emploi (Kenney, licence libre CC0) ou "➕" pour un sprite personnalisé — importe ensuite tes propres images d'animation dans ses propriétés.</p>
<p class="help">Personnage Kenney prêt à l'emploi (licence libre CC0), avec toutes ses animations.</p>
</div>
</details>
@@ -899,36 +893,15 @@
{% if el.widget == 'personnage' %}
<!-- Phase 8 — panneau sur-mesure (custom_panel, voir registry.py) :
pas de controls génériques, juste la source (Forge/personnalisée)
et son contenu. Sauvegarde en AJAX (personnage-panel.js), jamais
via #propsForm (générique, utilisé par tous les autres widgets). -->
pas de controls génériques, juste le personnage Forge affiché.
Sauvegarde en AJAX (personnage-panel.js), jamais via #propsForm
(générique, utilisé par tous les autres widgets). L'import de
sprites personnalisés est retiré pour le moment. -->
<details class="propGroup" open>
<summary>🎭 Personnage</summary>
<div class="propGroupBody" id="personnagePanelBody" data-element-id="{{ el.id }}" data-source="{{ personnage_data.source }}">
{% if personnage_data.source == 'custom' %}
<p class="help">Sprite personnalisé — importe les images de chaque animation ("idle" recommandée, affichée par défaut).</p>
<div id="personnageAnimationsList">
{% for anim_name, frames in (personnage_data.animations or {}).items() %}
<div class="personnageAnimRow box" data-anim-name="{{ anim_name }}" style="margin-bottom:8px; padding:8px;">
<div class="fieldRow" style="align-items:center; gap:6px;">
<input type="text" class="input is-small personnageAnimName" value="{{ anim_name }}" placeholder="ex. idle, marche, saut" style="flex:1;">
<button type="button" class="button is-small is-danger" onclick="removePersonnageAnimation(this)">🗑</button>
</div>
<div class="personnageAnimFrames" style="display:flex; flex-wrap:wrap; gap:4px; margin-top:6px;">
{% for url in frames %}
<img src="{{ url }}" alt="" class="personnageFrameThumb" style="width:32px; height:32px; object-fit:contain; background:var(--panel2); border-radius:4px;">
{% endfor %}
</div>
<input type="file" class="personnageFrameUpload input is-small" accept="image/*" multiple style="margin-top:6px;">
<span class="uploadStatus" style="font-size:12px; color:var(--text-dim);"></span>
</div>
{% endfor %}
</div>
<button type="button" class="button is-small is-fullwidth" onclick="addPersonnageAnimation()">+ Ajouter une animation</button>
{% else %}
<div class="propGroupBody" id="personnagePanelBody" data-element-id="{{ el.id }}">
<p class="help">Personnage Forge — clique un autre pour en changer.</p>
{{ render_personnage_gallery('swap', 'personnageGallerySwap', personnage_data.forge_character) }}
{% endif %}
</div>
</details>
{% endif %}