BG2 HDVisual Project Dossier de recherche · sprites
Sprites jouables · étude complète

Guerrière HD 0x6110

Comment donner aux sprites palettisés de BG2EE le modelé d'un upscale HD sans casser les couleurs choisies par le joueur. Deux recherches indépendantes, deux revues croisées, une relecture finale : tout le processus, les preuves, les chiffres et la recette retenue.

  • 2 + 2 + 1études, revues croisées, relecture
  • 774 BAMstock inventorié · 870 ITM
  • 628 BAMpremier périmètre monde
  • 12variantes de palettisation testées
  • −18 % / −23 %écart palettes nouvelles, Q8 vs actuel
  • 0installation · fichier du jeu modifié
Moteur vérifié au binaire Code runtime relu Mesures hors jeu reproduites Méthode fractionnaire jamais vue en jeu Guide définitif : GUIDE_DEFINITIF_SPRITES_HD_BG2EE.md
01 · Processus

Sept étapes, deux regards

Claude Code et Codex ont d'abord cherché chacun de leur côté, sans se lire. Chaque étude a ensuite été relue par l'autre, avec de nouvelles expériences et des corrections. Cette page remplace la présentation Claude du 29 septembre et suit l'ordre réel du travail.

  1. 0129/09 · 19:46
    Claude Code

    Étude indépendante

    Rampes des 256 gammes (E1), usage des indices sur 65 composants (E2), expérience E3 : 4 couches, repos et marche, 5 palettes, 10 méthodes de palettisation.

    Propose la sous-nuance fractionnaire ajustée sur plusieurs palettes, avec mélange aux frontières (Q8), et un repli sans DLL (Q6).
  2. 0229/09 · 20:08
    Claude Code

    Erratum E3b

    Le cycle de repos échantillonné ne contenait que 4 poses distinctes sur 12 images : le scintillement était dilué. Nouveau corpus : 20 changements de pose, 120 occurrences.

    Classement des méthodes inchangé ; chiffres temporels revus ; deux conclusions retirées (Bayer « pire partout », scintillement « −50 % »).
  3. 0329/09 · 19:52–20:10
    Codex

    Étude indépendante

    Désassemblage de BaldurReal.exe, inventaire KEY/BIFF complet, quatre upscales réellement calculés sur 60 frames, sensibilité à la palette d'inférence, tramage, interpolation mono-palette.

    Le moteur lit MPALETTE, pas RANGES12 ; 774 BAM, 870 ITM, 628 BAM utiles ; refaire l'inférence sous une autre palette change 20 à 44 % des indices.
  4. 0429/09 · 20:26
    Claude Code

    Revue croisée + E5

    Lecture complète du dossier Codex, puis rejeu des méthodes Claude sur le corpus et les palettes de Codex, avec sa propre fonction de quantification.

    Sur palettes non utilisées pour le réglage : Q8 −23 % face au pipeline actuel, −20 % face à l'interpolation Codex. Six corrections acceptées.
  5. 0529/09 · 20:30
    Codex

    Comparaison critique

    Reproduction de E3b à l'identique (écart 0), audit des frontières, arrondi réel à 3 bits, lecture ciblée du runtime.

    Trouve une erreur de signe dans l'alignement temporel ; 3 bits ≈ sans perte ; 13,3 % des frontières touchent plus de 2 canaux ; Q6 possible sans changer le rendu.
  6. 0629/09 · 21:16
    Codex

    Synthèse « guide ultime »

    Fusion des deux dossiers, déduplication de 5 102 fichiers, échelle de preuve, plan de production en phases.

    Ordre Q6 → Q3m → Q8 ; x2 livré, x4 après preuve ; aucun tramage.
  7. 0730/09
    Claude Code

    Relecture finale

    Revérification au binaire, au code runtime et aux fichiers de données de chaque affirmation qui pèse sur une décision.

    9 nouvelles corrections (Catmull-Rom existe, palettes « inédites » partiellement vues, Q3m porte 77 % du gain…) ; format V6 spécifié au bit ; guide définitif.
02 · L'essentiel

Ce qui est établi, mesuré ou ouvert

Chaque affirmation porte son niveau de preuve. Une mesure hors jeu n'est jamais une validation en jeu.

Confirmé

La limite des 12 nuances ne vient pas du BAM (256 indices) mais du moteur : chaque gamme est une ligne de 12 couleurs de MPALETTE.BMP, et les indices 88 à 255 sont des moyennes entières des nuances 2 à 9 de deux gammes. Tout est recalculé à chaque image : le corps n'a aucune couleur fixe libre.

Confirmé

Le DLL du projet capture déjà la palette réalisée de chaque couche (corps, arme, main gauche, casque) et reconstruit la texture HD sur le processeur. C'est là qu'il faut agir : stocker une position continue dans la gamme et laisser le DLL mélanger deux nuances voisines.

Mesuré

Q3m (fraction 3 bits ajustée sur plusieurs palettes) réduit l'écart au modèle de 14 % sur les palettes de validation ; Q8 (Q3m + frontières) de 18 %. Q3m porte à lui seul 77 % du gain. Sur le corpus Codex, Q8 fait −23 %.

Mesuré

Scintillement du corps (alignement corrigé) : 14,1 % → 5,7 % avec Q3m, 4,8 % avec Q8. La diffusion d'erreur double le scintillement ; le tramage n'est pas retenu.

Ouvert

Les palettes dites « jamais vues » partagent 1 à 6 canaux sur 7 avec l'entraînement. Seule la palette D est quasi indépendante ; les gains y tiennent (−15,5 % et −25 %), mais il faut 10 palettes entièrement nouvelles pour conclure.

Ouvert

x2 ou x4 : l'essai en jeu du 26/09 trouve le x4 légèrement meilleur, même en plus proche voisin, pour +58 % de registre. La plage de zoom réelle et le filtre de réduction décideront.

Retenu

Registre V6 = V5 + masque de dépendances palette + plan de fraction 3 bits (+ plan frontière optionnel). Sans plans optionnels, il redonne exactement V5 : xBR et ReboutCX passent par le même chemin.

03 · Le moteur

Comment BG2EE colore la guerrière

Vérifié sur BaldurReal.exe 2.7.3.0 (SHA-256 b51093a4…) : la chaîne MPALETTE y figure une fois, RANGES12 jamais. Les deux fichiers sont identiques octet pour octet, ce qui explique que les essais hors jeu restent justes.

  1. 1CRE : 7 couleurs — métal, mineure, majeure, peau, cuir, armure, cheveux. Le joueur choisit cheveux, peau, majeure et mineure ; le reste vient de la classe et des objets.
  2. 2Objets : opcode 7, param2 = 0xPR — P : 0 corps, 1 arme, 2 bouclier / main gauche, 3 casque ; R : gamme 0 à 6. Ex. PLAT01 : armure 27, cuir 23, métal 30.
  3. 3SetRange (RVA 0x4221C0) copie une ligne de MPALETTE vers les indices 4+12r … 15+12r.
  4. 4Realize applique teinte, lumière, gris de pause, pétrification, lueurs aux 84 nuances.
  5. 5Puis les 21 paires (RVA 0x421F7B) : P[88+8k+j] = (A[j+2] + B[j+2]) >> 1, octet par octet — ni lumière linéaire, ni OKLab.
  6. 60 transparent (forcé à 0 par le DLL), 1 ombre à alpha partiel, 2–3 noirs réservés (2 = marqueur des frames 1×1).
  7. 7Le DLL IEE capture P[256] par cellule au retour de Realize, reconstruit chaque couche en x2/x4, compose dans l'ordre natif (tout pixel non nul écrase), puis le jeu dessine une texture.

Explorateur de palette réelle

Données lues dans MPALETTE.BMP. Choisis une ligne pour chaque gamme : les 256 couleurs sont recalculées avec la formule du moteur. Survole ou touche une case.

Survole une case.
7 gammes × 12 nuances · indices 4 à 87
Les 256 indices
21 paires × 8 · indices 88 à 255
Couleurs fixes

Aucune sur le corps

Pour l'équipement seulement : les lignes 74 blanc, 75 noir, 76–78 rouge, vert, bleu sont constantes (revérifié). Un canal réellement inutilisé peut y être fixé par l'ITM. Option intrusive, hors premier prototype.

Ce que la capture couvre

Effets de palette : oui

Choix du joueur, objets, RANDCOLR résolu, effets de palette et mélanges recalculés. Pas couverts : teinte post-palette, invisibilité, flou, sélection, occlusion. À tester séparément.

Faux oracles

Near Infinity, GemRB

Near Infinity échantillonne les mélanges sur les nuances 0,1,3,4,6,7,9,10 ; GemRB copie des sous-gammes. Excellents pour l'inventaire et les cycles, jamais comme étalon de pixels.

04 · Le vrai goulot

Pourquoi 12 nuances ne suffisent pas en HD

Pas médian entre deux nuances voisines : 0,055 en OKLab, deux à cinq seuils de perception. Les pas sont très irréguliers : dans le métal 30, trois fois plus grands dans les clairs. Invisible en x1, ces marches deviennent des bandes quand ReboutCX produit un dégradé continu.

Gammes vanilla et redistribution à écarts égaux
Codex : gammes vanilla et redistribution à longueur d'arc égale. Le coefficient de variation passe de 0,15–0,47 à 0,013–0,027, mais 2 437 positions sur 3 072 changent (79,3 %, revérifié). Un diagnostic, pas une recette : la fraction comble déjà les grands pas sans toucher aux couleurs vanilla.

Ce que montre la démonstration. « 12 nuances » est le pipeline actuel. « Sous-nuances 1/8 » est le format V6 retenu : 89 positions par gamme, sans nouvelle couleur à choisir pour le joueur. Le Bayer imite le dégradé avec une trame.

Lignes à part. Non monotones : 197, 198, 199, 204, 212, 213, 221, 253, 255. RGB répétés : 74–78, 222, 225. Ce sont des cas à interpréter, pas des erreurs à corriger en masse.

Décision. Ne jamais réécrire MPALETTE : le changement serait global, pour tous les personnages, objets et mods.

05 · Inventaire

Ce qu'il faut réellement produire

Deux comptages répondaient à deux questions : l'index du dépôt (656 BAM monde) et le stock vanilla complet de Codex (774 BAM). Ils se réconcilient exactement, revérifiés sur le CSV.

Corps

92 BAM

CHFB1 sans armure, CHFB2 cuir, CHFB3 mailles, CHFF4 plates (le préfixe change au niveau 4). 23 suffixes chacun.

Armes

166 + 72

Main droite et main gauche (WQN…OA7/OA8/OA9/OG1). Overlays non scindés : leur G1 regroupe les états.

Boucliers

60 BAM

Familles C0–C7, D1–D4. D0 (5 BAM) n'a aucun objet.

Casques

238 BAM

H0–H5, J0–JC. H6 = attaques de créature (59 ITM), ZW = ailes interdites aux humains.

774 stock vanilla = 656 index du dépôt
              + 85 paperdolls (4 corps CHFF*INV, 81 WPN*INV/OIN)
              + 33 stock monde (D0 : 5, H3/H4 : 28)

656 index  = 628 utiles + 14 ZW + 14 H6

628 utiles = 92 corps + 166 armes + 72 main gauche
            + 60 boucliers + 238 casques

frames : 178 360 (index) · 185 335 (stock) · 153 422 > 1 px
SuffixeCyclesAction
G11 · G10–8 · 9–17marche · garde 1 main
G12 · G1318–26 · 27–35repos · garde 2 mains
G14 · G15 · G1636–62touché · mort · au sol
G17 · G18 · G1963–98repos · repos · sommeil/relevé
A1–A90–8attaques 1 main, 2 mains, deux armes, lancer
SA · SS · SX0–8arc · fronde · arbalète
CA0–714 variantes de sort
Directions

9 + 7 miroirs

S à N stockées, sept orientations est obtenues par miroir. Pas « 9 + 5 ».

Placeholders

Frames 1×1, indice 2

CHFB1G11 : 846 entrées, 90 frames réelles. Garder frame, lookup, centre, cycle ; ne sauter que l'inférence.

Partages

Router, pas remplacer

CHFB1–3 sert 6 animations, WQN* 13. Le DLL route déjà par ID d'animation → memberships → composant.

06 · Quatre upscales réels

xBR et ReboutCX, en x2 et en x4

Codex a calculé les quatre variantes sur 60 vraies frames. xBR choisit la géométrie sur les couleurs « clown » et transporte les indices ; ReboutCX traite un aperçu recoloré et récupère l'alpha et les classes du guide xBR de même échelle. Affichage à 8 pixels écran par pixel source.

Élément
Vue
Planche de comparaison Codex
xBR x2

Témoin exact

Couleurs source exactes, contours améliorés, marches restantes. Aucune nuance nouvelle. Voie acceptée en QA pour les personnages jouables (avec Catmull-Rom).

xBR x4 direct

Témoin fin

Vrai xbr4x, pas deux passes x2. Courbes plus fines, mêmes couleurs : peu d'intérêt seul.

ReboutCX x2

Réseau x4 + BOX

Pas de modèle x2 : réduction BOX en flottant avant arrondi. Surfaces plus régulières, petits reflets parfois lissés.

ReboutCX x4

Master de recherche

RRDBNet 64nf/23nb, 16,7 M paramètres, RGB sans alpha ni mémoire temporelle. Provenance et licence inconnues.

Cycle d'attaque, vanilla et quatre upscales
Cycle d'attaque complet CHFB1A1, 100 ms par image (cadence comparative). Les couches d'équipement ont été évaluées séparément.

La découverte qui oriente tout. Refaire l'inférence ReboutCX sous une autre palette, au lieu de recolorer le résultat, change 31,99 % / 44,39 % des indices du corps, 20,26 % / 36,28 % de l'armure lourde, 30,91 % / 37,04 % du casque. Le réseau n'ombre pas pareil selon les couleurs qu'il reçoit.

Conserver les classes garde la recoloration, mais pas un bon modelé sous toutes les couleurs. D'où l'ajustement multi-palettes.

Candidats limités à la frame source. Autoriser toute la classe ne gagne que 5,9 % (x2) et 6,2 % (x4) d'erreur. Le goulot est la discrétisation à 12 niveaux, pas le choix des candidats.

07 · Méthodes testées

Ramener le modèle vers une palette vivante

Toutes partent de la même sortie ReboutCX et des mêmes classes (guide xBR). Seule change la façon de revenir aux couleurs dynamiques. Verdicts après toutes les revues.

CodeMéthodeStockeRuntimeVerdict final
xBRxBR direct, provenance d'indiceindiceactuelvoie acceptée · option
Q0Pipeline actuel : nuance la plus proche parmi celles de la frame x1, palette REFindiceactuelréférence installée
Q1Idem, toute la classeindicemasque de dépendancesgain nul en validation
Q2Bayer 4×4 ancré au centre BAMindiceactuelrejeté par défaut
Q7Diffusion d'erreur dans la gammeindiceactuelrejeté
Q6Un indice choisi sur K palettes à la foisindiceV6 sans fractionétape optionnelle
Q3Fraction ajustée sur REF seule (= interpolation Codex)indice + fractionV6surapprend la palette
Q3mFraction 3 bits ajustée sur K palettesindice + fractionV6cible
Q5Q3m + classe réestimée en HDindice + fractionV6aucun gain hors réglage
Q8Q3m + mélange pondéré de deux classes aux frontières+ plan frontièreV6après ablation, contraint
08 · Comparateur E3b

Glisser, comparer

Composite corps en plates CHFF4 + casque HELM01 + bouclier ISHLD03 + épée BDSW1H06, face sud. Réglage sur REF, B, C ; D et E n'ont servi à aucun réglage (E ne diffère de REF que par l'armure).

Palette
Pose
Variante de gauche Variante de droite
  • Q0 actuel sous B, D et E : liserés clairs ou orangés autour des plaques du torse et des jambières. Les mélanges 88–255 choisis sous REF deviennent voyants sous une autre palette.
  • Q3m garde des volumes lisses ; Q8 fait disparaître presque tous les liserés. C'est la variante la plus proche de la sortie du modèle.
  • Bayer : trame régulière sur les grandes plaques. Diffusion : grain qui change d'une image à l'autre.
  • La sortie brute du modèle est recalculée pour chaque palette : une cible, jamais atteignable en jeu, où une seule version des indices sert toutes les couleurs du joueur.
Palette
Pose
Planche des variantes
Ligne 1 : xBR x2, xBR x4, ReboutCX x2 actuel, ReboutCX x4 actuel, Bayer x4. Ligne 2 : Q6 x4, Q8 x2, Q3 x4, Q8 x4, sortie brute du modèle. L'ordre des couches de l'aperçu est approximatif.
Détail du torse
09 · Validation croisée E5

Les méthodes Claude sur le terrain de Codex

Cycle d'attaque complet (14 images) de CHFB1A1, WQNS0A1, WQNC0A1, WQNJ6A1. Validation sur D et les profils Codex « contrast » et « pale ». L'interpolation Codex est exécutée avec sa propre fonction, importée en lecture seule.

Palette
Corps CHFB1A1 image 6, six variantes

Q3 et l'interpolation Codex sont la même idée : une fraction réglée sous une seule palette. Mêmes chiffres (47,2 et 47,0), excellents sous leur palette, faibles ailleurs.

Q8 : −23 % face au pipeline actuel, −20 % face à Codex ; sur D seule, 58,1 → 43,6.

sRGB ou lumière linéaire pour interpoler : 37,8 contre 38,1. Aucune différence utile : le runtime interpolera en octets sRGB, plus simple et exact au bit.

Limite : E5 ne contient pas Q3m, donc aucune ablation des frontières sur ce corpus.

Interpolation Codex réglée sur une palette, rendue sous trois palettes
Figure Codex : interpolation réglée sous une seule palette, rendue sous trois. Sous « contrast » et « pale », des liserés gris et verts restent aux frontières des gammes : c'est ce que corrige l'ajustement multi-palettes.
10 · Stabilité temporelle

En mouvement, et une erreur de signe

Codex a trouvé que l'alignement des images comparait des positions différentes dès que l'ancre bougeait : ox = (centre_b − centre_a) × échelle au lieu de (centre_a − centre_b). Test synthétique : 5 comparaisons fausses sur 5 avant, 0 sur 6 après. Les chiffres ci-dessous sont recalculés.

Cycle de repos, quatre méthodes
Repos, 20 changements de pose, palette B, x4. De gauche à droite : Q0 actuel, Bayer, diffusion d'erreur, Q8.

Part des pixels immobiles (cible Δ < 0,01) dont la sortie change de plus de 0,02. Toujours publier l'agrégation : sur les 4 couches non pondérées, Q8 fait 13,6 → 10,0 % ; pondéré par pixels, 13,2 → 4,9 %.

Pourquoi ça grouille

Décision nuance par nuance

Quand le modèle hésite entre deux nuances, une variation infime bascule des pixels entiers. Avec la fraction, la même hésitation ne coûte qu'un huitième de nuance.

Tramage

Bayer : non par défaut

Erreur pixel +6 à +10 %, trame visible. Après flou σ 0,5 il fait mieux qu'aucun tramage (0,0125 contre 0,0139), mais l'interpolation fait mieux encore (0,0114). Bruit renouvelé : interdit.

Limites

Pas de suivi de surface

Pixels alignés par ancre, ombre incluse, boucles et durées ignorées. L'attaque E5 a trop peu de pixels immobiles pour conclure. Il faut un flot restreint aux classes.

Cycle réel, stratégies de tramage
Codex, cycle réel de 14 images : changements d'indice 7,61 % Bayer fixe, 8,23 % sans tramage, 32,65 % bruit renouvelé.
Même image répétée, bruit variable
Codex, même image répétée 14 fois : phase Bayer fixe, 0 changement ; bruit renouvelé, 30,06 % des pixels bougent.
11 · Affichage

x2 ou x4 à l'écran

Le jeu garde la géométrie d'origine et affiche la texture à la taille du zoom. Le runtime n'a aujourd'hui ni mipmap ni filtre de réduction : MIN et MAG partagent le même mode (Nearest, Linear ou CatmullRom), GL_TEXTURE_MAX_LEVEL = 0.

Lecture corrigée. Chaque image montre à gauche le plus proche voisin, à droite une réduction d'aire. L'écart entre les deux ne désavantage le x4 qu'au zoom entier 2, où le x2 est exact par construction. À 1,0, 1,3 et 3,0, le x4 crénelle moins que le x2. L'affirmation « x4 utile seulement dès zoom 3 » est retirée.

En jeu, le 26/09 : x4 ReboutCX sur tout 0x6110, en plus proche voisin, jugé « légèrement meilleur que x2 », 59,1–60 FPS, p95 16,8–17,3 ms, puis restauré en x2.

Essai x4 du 26/09x2x4
Indices non compressés947,6 Mo3 790,4 Mo
Registre compressé195,9 Mo309,6 Mo
Rapport—×1,58
Appréciationréférencelégèrement meilleur
x2 livré par défaut ; x4 reste l'option qualité, décidée après deux mesures : la plage de zoom réelle à 2560×1440, et un x4 avec réduction d'aire ou mipmaps régénérés à chaque recomposition.Catmull-Rom est implémenté et accepté pour xBR, mais c'est un filtre local : il ne remplace pas une vraie réduction au zoom arrière.
12 · Mesures E3b

Les chiffres

4 couches, repos sud (20 poses) et marche sud (10), 5 palettes. Écart = ΔE OKLab moyen ×1000 par rapport à la sortie du modèle sous la même palette. Plus court = mieux. Fidélité à une cible générée, pas beauté perçue.

Pipeline actuelRetenuÉtapeRejetéAutres
Décomposition. Sur la validation x4, Q0 50,4 → Q3m 43,3 → Q8 41,1. La fraction multi-palettes apporte 77 % du gain, la frontière environ 5 %. Sur D seule : 68 %. D'où l'ordre : Q3m d'abord, Q8 seulement si son gain propre se voit.Q6 améliore la validation (−8,6 %) mais dégrade la palette de production REF de +22,6 %.

Taille : échantillon zlib ; méthodes fractionnaires en « classe + position 3 bits, delta horizontal ». Le plan frontière de Q8, le masque et les métadonnées ne sont pas comptés ; zlib n'est pas le codec XPRESS du DLL. Palettes : D partage 1 canal sur 7 avec le réglage, E en partage 6.

13 · Corrections

Ce que chaque relecture a corrigé

Les études d'origine restent intactes. Les erreurs sont listées ici avec leur preuve ; aucune n'inverse l'architecture, plusieurs changent l'ordre ou la portée des décisions.

AffirmationSourceCorrectionTrouvée par
Catmull-Rom « non implémenté »synthèse CodexMode CatmullRom présent (shader 4×4 prémultiplié) ; QA xBR des personnages jouables acceptée avec ce filtre le 11/09relecture finale
Palettes de validation « jamais vues »toutesE : 6/7 canaux communs avec l'entraînement, CX-B 5/7, CX-C 4/7, D 1/7relecture finale
Gain Q8 attribué aux frontièresprésentations77 % du gain vient de Q3m ; frontière ≈ 5 %relecture finale
« x4 crénelle plus que x2 au zoom habituel »Claudevrai seulement au zoom 2 exact ; en jeu, x4 jugé légèrement meilleurrelecture finale
« ReboutCX accepté en jeu sur 0x6100 »revue Claude2 compositions acceptées + 1 non-infériorité, préférence non tranchée ; xBR reste la voie acceptée à l'échellerelecture finale
Fraction « q/7 »synthèse Codexf/8 vers la nuance suivante, 89 positions, comme mesurérelecture finale
« La 2e arme garde la sémantique arme »synthèse Codexnon démontré ; sans effet sur l'encodage (palette capturée par cellule) ; test en jeurelecture finale
« Étendre la clé de cache à la palette »Claudedéjà le cas (reboutcx_cache_p12.py:33-39)relecture finale
E5 temporelrevue Claudemême erreur de signe que E3b (e5_cross.py:237)relecture finale
Le moteur lit RANGES12ClaudeMPALETTE ; fichiers identiquesCodex
Paperdolls WPM ; H6 et ZW à produireClaudeWPN ; H6 = attaques, ZW interdit aux humainsCodex
Alignement temporelClaude E3bsigne inversé ; corps Q0 → Q8 : 14,07 → 4,82 %Codex
Q8 « 3 bits » ; taille ×2–×2,3Claudemesuré en 4 bits (3 bits ≈ sans perte) ; taille = celle de Q3m sans frontièreCodex
« Plancher 0,04 infranchissable »Clauderésiduel de ces méthodes, pas une borneCodex
Classes complètes : DLL obligatoire / aucun changementCodex / Clauderendu inchangé, mais le sens des dépendances change : masque explicite V6croisé
Repos échantillonné (4 poses / 12)Claude E3E3b : 20 changements de poseClaude
14 · Recette retenue

Un sprite HD qui reste une palette

Le master contient la géométrie, la classe de chaque pixel et une position continue dans sa gamme ; le moteur fournit les couleurs. Le joueur garde ses choix, les effets de palette suivent sans code spécifique.

// registre V6 = V5 + ajouts optionnels
plan I    u8      indice de base (identique V5)
plan F    0..7    fraction vers succ(I)   // absent ⇒ V5 exact
dep_mask  256 bits entrées de P lues  // fail-closed
plan B    option  (pixel, I2, F2, W 1..7) aux frontières

// décodage bit-exact, Python = C++
succ(i)      = i+1 dans la gamme ou la paire, sinon i
lerp8(a,b,f) = (a·(8−f) + b·f + 4) >> 3
pixel        = lerp8(P[I], P[succ(I)], F)
frontière    = (C(I,F)·W + C(I2,F2)·(8−W) + 4) >> 3
LUT          = 2 048 entrées par palette de couche
Encodeur

Recherche exhaustive

Pour chaque pixel, les 89 positions de sa gamme sont décodées sous les K palettes et comparées en OKLab. On garde ce que le runtime affichera vraiment.

Palettes

K = 3 à 6

REF + défaut guerrière (30 91 93 12 23 93 2) + palettes « carré latin ». Validation : 10 palettes sans aucun canal commun.

x2

Réencoder

BOX des cibles x4 en flottant, puis encodage à x2 avec le guide xBR2. Jamais de réduction des plans déjà quantifiés.

Frontières

Sous contraintes

Meilleure classe voisine (pas la première), ≤ 2 canaux, poids primaire ≥ 1/8, acceptée seulement si le gain est net sur toutes les palettes.

ParamètreValeurPreuve
Ressource paletteMPALETTE.BMP, jamais modifiéeconfirmé
ModeléReboutCX x4, K inférences par frame (0x6110 : ≈ 282 000 pour K = 3)mesuré
Sémantiqueguide xBR même échelle + provenance d'indiceconfirmé
EncodageQ3m, fraction 3 bitsmesuré
FrontièresQ8 contraint, après ablationà prouver
Interpolation runtimeoctets sRGB, arrondi définimesuré
Tramageaucunmesuré
Échellex2 livré ; x4 option après étude de réductionà mesurer
ReconstructionCPU dans creature_sprite_x2.cppcandidat
Alpha douxreporté, expérience séparéecandidat
15 · Plan

Du banc d'essai à la guerrière complète

Des dépendances techniques, pas un rituel. Chaque phase produit de nouvelles versions ; rien d'historique n'est réécrit ; aucune validation n'est déduite d'une installation.

PhaseTravailOn passe quand
P0Oracles : lecteur BAM complet, réalisation MPALETTE, banc d'évaluation corrigé (signe, masques séparés, agrégations)réalisation exacte ; E3b reproduit
P1Inférence K palettes ; encodeur Q6 / Q3m ; 10 palettes disjointes ; K = 3/4/6Q3m bat Q0 sur chaque palette nouvelle
P2DLL : lecteur V6, masque, plan F, LUT ; golden tests Python / C++V6 sans plans = V5 au bit près
P3En jeu : CHFF4 + un casque, un bouclier, une épée, Q0 contre Q3mvalidation explicite de l'utilisateur
P4Zoom réel ; x2 / x4 ; réduction d'aire ou mipmapsdécision datée
P5Ablation Q3m ↔ Q8 contraintgain propre visible et mesuré
P60x6110 complet : 628 BAM, CHFF4 → CHFB1–3 → armes fréquentes → boucliers → casquesaucune frame manquante ; coûts mesurés
P7Paperdolls CHFF*INV, WPN*INV/OINmesures d'interface propres
P8Les 78 animations Character supportées ; les monstres à palette fixe n'ont pas ce problèmepreuves par famille
Mise en place QA

Commandes

C:MoveToArea("AR0700") puis C:CreateItem("PLAT01"), HELM01, ISHLD03, BDSW1H06, SW2H01, BOW01… Jeu et InfinityLoader fermés pour installer.

À voir en jeu

Recoloration et couches

Un canal à la fois ; deux guerrières aux couleurs opposées ; arme en main gauche recolorée par 0x1R puis 0x2R ; 9 directions + 7 miroirs.

Effets

Identiques au natif

Lueur pulsée de BDSW1H06, pause grise, invisibilité, pétrification, nuit, sélection, occlusion, 59–60 FPS.

16 · Position finale

Mon avis

Claude Code, après les deux revues croisées et la relecture finale.

Sûr

  • Le goulot est la discrétisation à 12 niveaux, pas le choix des candidats.
  • Le point d'action est le compositeur IEE existant : il a déjà la palette réelle de chaque couche.
  • Toute solution reste exprimée en indices de gamme, jamais en RGB figé.
  • Une recette apprise sous une seule palette ne généralise pas.

Incertain

  • La tenue sur des palettes vraiment nouvelles : une seule l'est aujourd'hui.
  • Le gain propre des frontières, faible sur E3b.
  • Le coût réel du format sous XPRESS.
  • La plage de zoom et la valeur du x4.
  • Aucune mesure ne dit la beauté : tout se juge en jeu.

Déconseillé

  • Modifier MPALETTE ou égaliser les rampes.
  • Passer en BAM V2 ou en RGBA figé.
  • Adopter Q8 sans ablation, ou un tramage par défaut.
  • Lancer les 628 BAM avec une recette non validée en jeu.
17 · Dossier

Contenu et sources

Tout est dans sprite/Etudes_Sprite_codex_claude/. Les données sont intègres ; plusieurs scripts dépendent de chemins absolus (Bureau, Python chaiNNer) et se rejouent dans une nouvelle version d'étude.

GUIDE_DEFINITIF_SPRITES_HD_BG2EE.md guide de développement, fait autorité PRESENTATION_ETUDE_SPRITES_HD_0x6110.html cette page GUIDE_ULTIME_SPRITES_HD_BG2EE.md / .html synthèse Codex (historique) ClaudeCode_Guide_HD_0x6110_Femme_Humaine_Guerriere/ GUIDE_ClaudeCode_HD_0x6110_palettes_dynamiques.md guide Claude v1 PRESENTATION_ClaudeCode_0x6110.html présentation v1 + erratum (remplacée) REVUE_CROISEE_Codex_ClaudeCode_0x6110.html revue croisée + E5 donnees/ donnees_v2/ donnees_v3/ mesures E1–E3, E3b, E5 figures/ figures_v2/ figures_v3/ outils/ tuiles, planches, scripts CODEX_BG2EE_Femme_Humaine_Guerriere_2026-09-29/ GUIDE_CODEX_BG2EE_FEMME_GUERRIERE.md guide Codex engine_research.md engine_disassembly_codex.txt preuves moteur inventory_research.md assets_inventory*.csv 774 BAM, 870 ITM upscale/ palette/ 4 upscales, 60 NPZ, tramage, gradients codex_palette_study_20260929/COMPARAISON_CODEX_CLAUDE_0x6110.md codex_palette_study_20260929/comparaison_claude_20260929/ signe temporel, 3 bits Identités BaldurReal.exe 2.7.3.0 b51093a49140b2b8…94217a14d57 MPALETTE = RANGES12 7a9a654d5cbc4cee…82000d5f829d66dd ReboutCX (poids) c36a14ddb51ae094…56d5b94bdedab05