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
-
frameIndex == 255: marker fin d’animation. Apparait sur Assault Lazer
frame 2. L’ASM (cf.hires.s::drawlecturetst.b) interprete ca comme un
loop a la frame 0. Le renderer skippe la frame. -
scale == 254(= 0xFE = -2 signed) : marker « default scale ». Apparait
sur Rocket / Grenade / Mine impacts (les 3 explosions principales). On
utilise une taille standardDEFAULT_SCALE_JME(0.5 pour bullets vol,
0.7 pour impacts). -
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.