Aller au contenu principal

Session 132duodecimus (suite 14b) — Aliens : fire trigger wrap d’anim, melee proportionnelle

Bug : aliens passifs malgre mode RESPONSE

Apres s14 (radius corrige), l’utilisateur signale que les aliens passent
bien la porte et se mettent en mode RESPONSE (suivre attack), mais restent
« devant » sans jamais frapper.

Diagnostic via logs s14b

Logs runtime du Red Alien :

[AI #13 Red Alien] mode=RESPONSE pos=(2,92,3,38) distJme=5,70 whichAnim=1 
  timer1=0 timer2=3 angle=1760 sees=true respBeh=1 respSpeed=12 
  radius=40 girth=0
[AI #13 Red Alien] mode=RESPONSE pos=(...) timer2=1
[AI #13 Red Alien] mode=RESPONSE pos=(...) timer2=3
[AI #13 Red Alien] mode=RESPONSE pos=(...) timer2=1

timer2 oscille entre 1 et 3, JAMAIS 4 = FIRE_FRAME=4 n’est jamais
atteint = aucune attaque declenchee.

Cause racine : l’animation d’attaque du Red Alien fait 4 frames (0,1,2,3)
puis wrap. Notre code utilisait FIRE_FRAME = 4 codee en dur, ce qui ne
fonctionne que pour les animations de 5+ frames. Les aliens avec une anim
plus courte ne tirent jamais.

Fix 1 : trigger sur wrap au lieu de frame fixe

L’ASM original utilise ai_DoAction_b pose par les tables d’anim a une
frame specifique. Sans porter ces tables (gros travail), on adopte une
heuristique simple et robuste : declencher le tir au wrap d’animation
(= timer2 < prevTimer2). C’est equivalent en pratique a un fire par cycle.

// Avant (FAUX pour anims courtes)
boolean fireTrigger = (a.timer2 == FIRE_FRAME && prevTimer2 != FIRE_FRAME);

// Apres (independant de la longueur d'anim)
boolean wrap = a.timer2 < prevTimer2;
boolean fireTrigger = wrap;

La transition vers FOLLOWUP se base aussi sur le wrap (deja le cas), donc
fire ET transition se produisent au meme tick (= comportement coherent).

Fix 2 : portee melee proportionnelle au rayon

L’ancien attackMelee testait dist2 < 80*80 (= 1.25m JME pour tous les
aliens), ce qui ne tenait pas compte du girth. Pour un alien girth=0
(rayon 0.625m), le contact reel est a ~0.95m mais la portee melee restait
a 1.25m -> ok mais marge confortable. Pour girth=2 (rayon 2.5m), le
contact est a ~2.85m mais la portee restait a 1.25m -> hors portee.

// Avant
if (dist2 < 80 * 80) { ... }

// Apres : rayon alien + 32 units (~0.5m de marge)
int meleeRange = def.collisionRadius() + 32;
if (dist2 < meleeRange * meleeRange) { ... }

Valeurs pratiques :
– girth=0 (mince) : 40+32 = 72 units = 1.13 m JME
– girth=1 (normal) : 80+32 = 112 units = 1.75 m JME
– girth=2 (large) : 160+32 = 192 units = 3.0 m JME

Logs diagnostic IA conserves

Les logs [AI #N name] ajoutes en s14b restent en place (toggle via
-Dab3d2.dumpAi=false) pour valider que les aliens attaquent bien apres
ce fix. A retirer quand le test sera concluant.

Fichiers modifies

  • AlienAI.java :
  • doResponse : fireTrigger = wrap (au lieu de timer2 == FIRE_FRAME)
  • attackMelee : portee = collisionRadius() + 32 (au lieu de 80 fixe)
  • FIRE_FRAME marquee @Deprecated (gardee pour reference)

Tests prevus

  • Zone 10 (level A) : approcher un alien Red Alien (def 13). Verifier :
    1. Il s’approche bien apres la porte (s14)
    2. Il frappe maintenant a chaque cycle d’animation (s14b)
    3. Le joueur prend des degats au contact prolonge
  • Toutes tailles d’aliens : Mantis Boss (girth=2) doit etre dangereux
    meme a quelques metres (portee melee 3m).
  • Aucun spam de degats : 1 attack par cycle d’anim ~= raisonnable.

Laisser un commentaire

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