Corrige : une animation déjà posée dans la logique ignorait le changement de personnage
Bug réel identifié grâce à la vidéo fournie + inspection directe de la
base de jeu de test : quand un nœud de flow "Jouer une animation"
(ou un clip de Timeline "sprite") était configuré pour un personnage,
ses frames étaient résolues et FIGÉES dans data_value/custom_keyframes
au moment de la configuration — changer ensuite le personnage Forge de
l'élément (galerie des propriétés) n'avait donc aucun effet sur les
animations déjà posées, qui continuaient à jouer indéfiniment les
frames de l'ANCIEN personnage.
Le nœud/clip ne stocke désormais que le NOM de l'animation
({"animation": "walk", "fps": 8, "loop": true}) — ses frames sont
résolues à l'EXÉCUTION, à partir du personnage ACTUELLEMENT assigné à
l'élément cible :
- screens/payload/full_game_payload.py expose un nouveau
gameData.personnage_animations (élément → animations), reconstruit à
chaque chargement de la page de jeu depuis _personnage_data — donc
toujours à jour, y compris après un changement de personnage.
- static/js/play/actions.js (resolveSpriteFrames) et
static/js/play/screens.js (applyAnimationClip) résolvent le nom
d'animation en frames à ce moment précis, plutôt que d'utiliser des
frames figées — repli sur l'ancien format {frames,...} pour les
nœuds/clips déjà créés avant ce correctif.
- Éditeur (flow-editor.js/animation-timeline.js) : simplifié en
conséquence — plus besoin de deviner rétroactivement quelle animation
correspond à une liste de frames stockées (l'ancien hack de
comparaison), le nom est maintenant stocké directement.
Nouveau test de régression (test_swapping_forge_character_updates_
already_configured_flow_action) qui reproduit exactement le scénario
filmé : configure l'action pour "male-adventurer", change le personnage
en "zombie", vérifie que gameData.personnage_animations reflète bien
zombie sans avoir à retoucher le nœud de flow.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
5ead091c75
commit
70c2b8df05
@@ -121,7 +121,7 @@ function nodeLabel(node) {
|
||||
base += ' → ' + (ELEMENTS_LABELS[node.target_element_id] || '?');
|
||||
try {
|
||||
var spriteData = JSON.parse(node.data_value || '{}');
|
||||
base += ' (' + (spriteData.frames ? spriteData.frames.length : 0) + ' images, ' + (spriteData.fps || '?') + ' i/s' + (spriteData.loop ? ', boucle' : '') + ')';
|
||||
base += ' « ' + (spriteData.animation || '?') + ' » (' + (spriteData.fps || '?') + ' i/s' + (spriteData.loop ? ', boucle' : '') + ')';
|
||||
} catch (e) { /* data_value invalide : pas de détail affiché */ }
|
||||
}
|
||||
return base;
|
||||
@@ -745,17 +745,18 @@ function submitNodeForm() {
|
||||
// colonne dédiée.
|
||||
payload.data_value = document.getElementById('nf-action-sound-url').value;
|
||||
} else if (actionType === 'jouer_animation_sprite') {
|
||||
// Phase 8 — l'animation choisie (miniature cliquée, voir
|
||||
// onSpriteTargetElementChange()) est résolue en liste de frames ICI,
|
||||
// à l'enregistrement : le nœud stocké reste exactement {frames, fps,
|
||||
// loop} (Phase 7, moteur d'exécution inchangé — voir runSpriteAnimation()
|
||||
// dans static/js/play/actions.js), seule l'UI d'édition a changé.
|
||||
// Phase 8 — stocke le NOM de l'animation choisie (miniature cliquée,
|
||||
// voir onSpriteTargetElementChange()), PAS ses frames : résolues à
|
||||
// l'exécution depuis le personnage ACTUELLEMENT assigné à la cible
|
||||
// (voir resolveSpriteFrames() dans static/js/play/actions.js) —
|
||||
// sinon changer le personnage Forge de l'élément dans l'éditeur
|
||||
// n'avait aucun effet sur les animations déjà posées dans la
|
||||
// logique, qui continuaient à jouer les frames de l'ancien
|
||||
// personnage indéfiniment (bug signalé par l'utilisateur).
|
||||
var elementId = document.getElementById('nf-action-sprite-target-element').value;
|
||||
var animName = document.getElementById('nf-action-sprite-animation-name').value;
|
||||
var animations = elementId ? (ELEMENT_ANIMATIONS_MAP[elementId] || {}) : {};
|
||||
payload.target_element_id = parseInt(elementId, 10);
|
||||
payload.data_value = JSON.stringify({
|
||||
frames: animations[animName] || [],
|
||||
animation: document.getElementById('nf-action-sprite-animation-name').value,
|
||||
fps: parseInt(document.getElementById('nf-action-sprite-fps').value, 10) || 8,
|
||||
loop: document.getElementById('nf-action-sprite-loop').checked,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user