Aller au contenu principal

Session 132duodecimus (suite 9) — Etape D : Mine fidele a l’ASM

Demande user

« Je veux comme l’ASM, on tient le sprite, on lance la mine (elle s’active que pour les aliens) »

3 fixes implementes en parallele

Fix 1 : Sprite mine en main (billboard 2D)

Dans l’ASM original, la mine en main n’est PAS un modele 3D vectobj : c’est
un sprite 2D dessine en HUD (frame 26 du WAD pickups). Notre code chargeait
plink.j3o (le bullet generique) ce qui etait visuellement incorrect.

Modifications :
WeaponDisplayConfig : ajout du champ billboardTexturePath (String, null
par defaut). Si non-null, l’arme est rendue comme billboard sprite.
WeaponDisplayConfig.Builder.billboardSprite(path) : helper fluent.
WeaponType.DROP_MINE : utilise
billboardSprite("Textures/objects/pickups/pickups_f26.png").
WeaponViewAppState.loadWeapon() : verifie cfg.isBillboard() avant le
chargement vectobj. Si billboard, cree un Quad centre + material Unshaded
alpha au lieu de charger le .j3o. Pas de BillboardControl : le weaponRoot
suit deja la rotation camera donc le sprite est de fait toujours face
joueur.

Fix 2 : Pas de glissement au sol (per-bullet physics)

Dans PhysicsBulletSystem les constantes BULLET_RESTITUTION = 0.6 et
BULLET_FRICTION = 0.3 etaient globales. La grenade pouvait rebondir
(restitution 0.6 OK), mais la mine glissait au sol au lieu de rester
immobile.

Modifications :
– Remplace les constantes globales par un record PhysicsParams(restitution,
friction)
+ une fonction physicsParamsFor(bulletType).
– Mine (15) : (0.0, 1.0) -> tombe pile au sol, ne glisse pas, ne rebondit
pas (= ASM BulT_BounceVert/Horiz = 0).
– Grenade (8), Splutch1 (3), default : (0.6, 0.3) -> rebondit puis
ralentit (= comportement actuel preserve).

Fix 3 : Trigger sur proximite d’alien (pas joueur)

L’ASM ItsABullet (newanims.s) execute .checkloop chaque frame pour TOUTES
les bullets en vol/au sol : si un alien est dans le rayon Range + 80
unites Amiga (= ~1.25 JME au repos), la bullet inflige des degats directs et
explose. Notre code Java ne faisait rien de tel : la mine n’explosait qu’au
timeout 30 sec.

Le filtrage « explose seulement pour aliens » est encode dans EntT_EnemyFlags_l
: pour player1 c’est %100011 = bits ALIEN+OBJECT+PLAYER2 (donc pas le
joueur lui-meme).

Modifications :
AlienHitDetector.findClosestAlienInRadius(jx, jy, jz, radius) : nouvelle
methode. Iter aliens vivants, retourne le plus proche dans le rayon XZ.
Filtrage = isAlive() qui exclut deja les morts. Le joueur n’est pas dans
la liste d’aliens donc pas de risque d’auto-trigger.
PhysicsBulletSystem.setAlienHitDetector(hitDetector) : nouveau setter.
PhysicsBulletSystem.update() : pour chaque bullet explosive
(def.isExplosive()), check proximite alien (rayon
ALIEN_TRIGGER_RADIUS_JME = 1.25). Si alien trouve : degat direct (=
applyDamage(alien, hitDamage)) + explosion (= killPhysicsBullet).
GameAppState.setupPhysics() : wiring physicsBulletSystem.setAlienHitDetector(hitDetector).

Comportement final de la mine

  1. Tenue en main : sprite 2D pickups_f26 (= image de la mine telle
    qu’elle apparait dans l’inventaire du jeu Amiga).
  2. Lancee : tombe avec gravite, atterrit pile au sol (pas de glissement,
    pas de rebond). La trajectoire reste comme avant.
  3. Au sol : reste immobile, animation sprite continue (pickups_f26
    fixe, ou cycle si AnimData en a un – a confirmer en jeu).
  4. Trigger : si un alien entre dans le rayon de 1.25 JME (~80cm), la
    mine explose : degats directs sur l’alien (= BulletDef.hitDamage()),
    explosion visuelle (ImpactEffectSystem), free du slot.
  5. Joueur : peut marcher sur sa propre mine sans la declencher (le
    joueur n’est pas dans la liste d’aliens).
  6. Auto-destruction : si pas d’alien proche pendant 30 sec, explose au
    timeout (= lifetime < 0 = infini ASM, capped a 30s en JME).

Limitations vs ASM (a porter plus tard)

  • Pas d’AOE damage (= ComputeBlast ASM qui spawn 9 flammes d’explosion
  • endommage les aliens dans un rayon plus large). Pour l’instant seul
    l’alien declencheur prend des degats.
  • Pas de check upper/lower zone (mais notre monde JME est mono-niveau
    pour les bullets explosives).
  • Le rayon de declenchement est fixe a 1.25 JME au lieu d’etre dynamique
    (Range + 80 ou Range = velocite). Pour la mine au repos (velocite ~ 0)
    c’est exact. Pour la grenade en vol c’est plus serre mais OK
    visuellement.

Laisser un commentaire

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