Aller au contenu principal

Session 132duodecimus (suite 6 patch) — Fix format AnimData/PopData

Apres execution de dumpGlfBulletAnim et analyse des donnees reelles du GLF,
correction critique du format des frames d’animation.

Probleme detecte

L’interpretation initiale (suite 6) lisait :
– byte 0 : spriteId
– byte 1 : extra (interprete comme « taille »)
– bytes 2-3 : frameIndex (BE WORD)
– byte 5 : brightness

Le dump a revele que bytes 2-3 sont en realite un WORD scale avec deux
bytes IDENTIQUES
(ex: 5140=0x1414, 7710=0x1E1E, 65278=0xFEFE) qui represente
la width/height du sprite en bytes signed identiques. C’est exactement ce que
fait l’ASM dans objdrawhires.s::draw_Bitmap :

move.b  (a0)+, d3   ; width  = byte 2
move.b  (a0)+, d4   ; height = byte 3
lsl.l   #7, d3      ; scale par 128

Donc le vrai PNG frame index est byte 1 (pas bytes 2-3).

Validation par les donnees reelles

Bullet byte0 (spriteId) byte1 (frameIdx) scale Resultat attendu
Plasma Bolt vol 2 (bigbullet) 1 20 bigbullet_f1.png
Rocket vol 9 (rockets) 0,1,2,3 30 rockets_f0..f3.png cycle
Splutch1 vol 10 (splutch) 1,2,3,4 30 splutch_f1..f4.png cycle
Grenade vol 1 (pickups) 19,20,21,22 20 pickups_f19..f22.png
Blaster Bolt 9 (rockets) 4,5,6,7 15 rockets_f4..f7.png cycle
Rocket impact 4 (explosion) 0..8 254 (default) explosion_f0..f8.png
MegaPlasma impact 2 (bigbullet) 0 60->50->40->25->10 bigbullet_f0 trail shrinking
Assault Lazer vol 2 (bigbullet) 4,3,255 15 bigbullet_f4,_f3, end-marker

Les valeurs sont parfaitement coherentes avec ce qu’on s’attend visuellement.

Cas speciaux decouverts

  1. frameIndex == 255 : marker fin d’animation. Apparait sur Assault Lazer
    frame 2. L’ASM (cf. hires.s::draw lecture tst.b) interprete ca comme un
    loop a la frame 0. Le renderer skippe la frame.

  2. scale == 254 (= 0xFE = -2 signed) : marker « default scale ». Apparait
    sur Rocket / Grenade / Mine impacts (les 3 explosions principales). On
    utilise une taille standard DEFAULT_SCALE_JME (0.5 pour bullets vol,
    0.7 pour impacts).

  3. byte 4 : toujours 0 dans toutes les frames du dump. Confirme reserve.

Modifications

combat/BulletAnimAsset.java : refonte complete du record :

// Avant (erreur)
public record AnimFrame(int spriteId, int extra, int frameIndex, int brightness) {}

// Apres (correct)
public record AnimFrame(int spriteId, int frameIndex, int scale, int brightness) {
    public boolean isEndMarker()      { return frameIndex == 255; }
    public boolean hasDefaultScale()  { return scale == 254; }
}

decode() lit maintenant byte 1 = frameIndex (PNG), byte 2 = scale.

combat/BulletSpriteRenderer.java :
sizeFor() utilise frame.scale() (pas frame.extra())
– Calibration AMIGA_SIZE_TO_JME ajustee de 0.04 a 0.025 (plus precis)
– Skip end-markers a la creation et a chaque update
DEFAULT_SCALE_JME = 0.5 quand scale=254

combat/ImpactAnimRenderer.java :
– Meme correction sizeFor
Mise a jour de la taille au fil de l’animation : setLocalScale(newSize / initialSize).
Permet a MegaPlasma de faire son trail shrinking 60->50->40->25->10 visible.
DEFAULT_SCALE_JME = 0.7 (impacts plus gros que bullets vol)
– Skip end-markers (garde la frame precedente affichee)

test/.../BulletAnimAssetTest.java : 16 tests (14 + 2 nouveaux) :
decodeRealGlfPlasmaBoltVol : verifie qu’on decode correctement un sample reel
decodeRealGlfRocketImpactDefaultScale : valide le scale=254
animFrameDetectsEndMarker : valide frameIndex=255
animFrameDetectsDefaultScale : valide scale=254

Comportement attendu en jeu maintenant

  • Plasma Bolt : sprite bigbullet_f1.png (forme energie bleu)
  • Rocket : sprite rockets_f0..f3.png cyclant (anim flame trail)
  • Splutch1 (slime) : sprite splutch_f1..f4.png cyclant (animation organique)
  • Grenade : sprite pickups_f19..f22.png (rotation grenade en vol)
  • Blaster Bolt : sprite rockets_f4..f7.png (glow violet)
  • Mine : sprite pickups_f26.png (grenade en vol stable)
  • Rocket explosion : sprite explosion_f0..f8.png en sequence (1 frame = 1/25s)
  • MegaPlasma impact : sprite bigbullet_f0.png qui shrinks en taille au fil
    des 5 frames
  • Assault Lazer : alterne bigbullet_f4 / _f3 puis stop (end-marker)

Limite preservee

Les flammes peripheriques d’explosion (8 splutchs autour du blast central
dans ComputeBlast ASM) restent non implementees. Session future.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *