Probleme
Apres le fix session 114 (chemins HQN), worm et robotright avaient maintenant
les bonnes couleurs mais un decoupage des frames incorrect :
- {@code worm_f0.png} affichait un fragment du sprite (jambes/torse seulement)
- 19 frames produites au lieu d’une trentaine attendue
- Frames de ~500 bytes au lieu de ~1.2 KB comme guard (sprite complet)
- Aspect general : chaque frame = un bout decale d’un personnage humanoide
Cause racine : utilisation des frame descs d’alien2
Dans la boucle {@code extraAlienSprites}, l’appel etait :
int saved = conv.convertObject(0, wadData, ptrData, ...)
Le parametre {@code 0} = {@code objIdx} dans le LNK. Mais worm/robotright ne
sont PAS references dans {@code GLFT_ObjGfxNames_l}, donc on lisait les
frame descs (LX, LY, LW, LH) de l’objet 0 = alien2.
Resultat : on decoupait le sprite worm avec les coordonnees prevues pour
alien2 — d’ou les fragments incoherents.
Les autres sprites HQN (guard, priest, insect, triclaw, ashnarg) marchent
car ils sont dans le LNK et ont leurs propres frame descs. Worm et
robotright sont speciaux : leurs WAD existent dans {@code media/hqn} mais
le LNK ne les reference pas.
Fix
Nouvelle methode {@code WadConverter.convertObjectStandalone(…)} qui :
-
Lit le header du fichier PTR (8 derniers bytes) :
word[-4] = $FFFF (marqueur)
word[-3] = NOFF (nombre de frames)
word[-2] = WOFF (largeur d'une frame en colonnes)
word[-1] = HOFF (hauteur d'une frame en lignes) -
Construit pour chaque frame {@code f} un {@code FrameDesc} synthetique :
lx = f * WOFF, ly = 0, lw = WOFF, lh = HOFF -
Delegue a {@code renderFrameHqn} ou {@code renderFrame} selon le format.
La boucle {@code extraAlienSprites} appelle desormais cette methode au lieu
de {@code convertObject(0, …)}, ne touchant pas au LNK.
Validation attendue
Apres re-export par {@code ./gradlew convertWads} :
- Log :
PTR header: NOFF=N WOFF=W HOFF=Hpour worm et robotright - {@code assets/Textures/objects/worm/worm_f0.png} : un sprite complet de
worm (ou plutot d’alien-warrior d’apres l’image, le nom est trompeur) - Nombre de frames = NOFF lu dans le header (probablement >= 20)
- Tailles de frames coherentes (~1-2 KB chacune comme guard/insect)
Limitations residuelles
Les 5 vues de rotation (top/bot/lft/rgt/cmp) restent dans des fichiers
separees ({@code worm.top}, {@code worm.bot}, etc.) qui ne sont pas
traites par {@code WadConverter}. Le fichier {@code worm.wad} traite ici
contient probablement la vue principale (face avant). Les autres vues
requiereront un parser dedie si on veut le rendu 3D fidele.