Bug rapporté user
« Les 2 balles du shotgun sont beaucoup trop ecartees. »
Audit ASM (newplayershoot.s + c/math25d.h)
plr1_FireProjectile:
move.w ShootT_BulCount_w(a6),d5 ; count = 2 pour shotgun
move.w d5,d6
subq #1,d6 ; d6 = 1
asl.w #7,d6 ; d6 = 128 = (count-1)*128
neg.w d6
add.w tempangpos,d6 ; angle de depart
firefive:
; tire bullet a l'angle d6
add.w #256,d6 ; +256 entre 2 bullets
AMOD_A d6
sub.w #1,d5
bgt firefive
Clé trouvée dans c/math25d.h :
#define SINTAB_SIZE 8192
extern WORD const SinCosTable_vw[SINTAB_SIZE];
Donc 1 cercle complet = 8192 unités d’angle byte-indexées. L’incrément
de 256 entre bullets = 256/8192 = 1/32 du cercle = 11.25°.
Bug dans le code Java
PlayerShootSystem.SPREAD_PER_BULLET = TWO_PI / 16f = 22.5°, soit
2x trop large. Le commentaire d’origine supposait une table de 4096
entrées ; c’est 8192.
Fix
private static final float SPREAD_PER_BULLET = FastMath.TWO_PI / 32f; // 11.25 deg
Pour shotgun count=2 : spread total entre les 2 bullets = 11.25°
(±5.625° du centre). S’applique aussi au hitscan.
Audit complet bullets vs ASM
| Aspect | Verdict |
|---|---|
| Cooldown (delay) | ✅ OK |
| Ammo check + consumption | ✅ OK |
| Bullet count | ✅ OK |
| Spread angulaire | ✅ FIXÉ (22.5° → 11.25°) |
| Speed (sin << bulletSpeed) | ✅ OK avec calibration empirique |
| Y velocity (auto-aim) | ⚠ Différent : dirY = camera.y au lieu de la formule ASM. Acceptable pour FPS 3D. |
| Hitscan accuracy | ⚠ Différent : raycast déterministe au lieu de probabilité GetRand. Acceptable. |
| Gravity / Bounce | ✅ OK via PhysicsBulletSystem |
| Lifetime | ✅ OK |