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 detimer2 == FIRE_FRAME)attackMelee: portee =collisionRadius() + 32(au lieu de 80 fixe)FIRE_FRAMEmarquee@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.