Aller au contenu principal

Session 132duodecimus (suite 8) — Fix shotgun spread (2x trop large)

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

Laisser un commentaire

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