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, + une fonction
friction)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
- Tenue en main : sprite 2D
pickups_f26(= image de la mine telle
qu’elle apparait dans l’inventaire du jeu Amiga). - Lancee : tombe avec gravite, atterrit pile au sol (pas de glissement,
pas de rebond). La trajectoire reste comme avant. - Au sol : reste immobile, animation sprite continue (pickups_f26
fixe, ou cycle si AnimData en a un – a confirmer en jeu). - 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. - Joueur : peut marcher sur sa propre mine sans la declencher (le
joueur n’est pas dans la liste d’aliens). - 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 (=
ComputeBlastASM 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 + 80ou Range = velocite). Pour la mine au repos (velocite ~ 0)
c’est exact. Pour la grenade en vol c’est plus serre mais OK
visuellement.