feat(session-4): module Pa touché et scène arcade Ranmasé en Phaser 4

Pa touché est une consultation, pas un mode de jeu : cinq plantes triées
par gravité, dépliables, sans chrono, sans score, sans épreuve. Le module
affiche lui-même qu'il n'a pas encore été relu par une personne compétente
et dit que cette relecture est la contribution la plus utile au projet.

Ranmasé : import dynamique, game.destroy(true) au démontage, communication
par événements — la scène ne touche aucun état Svelte et n'émet que sur
changement, jamais par frame. Miroir DOM sémantique, canvas aria-hidden,
jouable au clavier. Écran de chargement designé.

Game design guidé par la pédagogie : laisser passer une plante dangereuse
ne coûte rien (c'est le bon geste), ramasser le mauvais fruit coûte 2
points et pas une vie (il n'y a pas d'erreur à cueillir), une plante
dangereuse sur cinq.

Budgets mesurés et consignés dans l'ADR 0002
- shell hors Phaser : 78 Ko gzip (budget 170)
- Phaser seul : 348 Ko gzip, sous le seuil de réexamen de 450
- absent du chemin critique de l'accueil, vérifié sur le HTML prérendu
- build total 1,4 Mo

Une prescription de l'ADR 0002 était fausse : l'option `resolution`
n'existe pas dans Phaser 4 (pixelRatio y est en lecture seule). Le
plafonnement passe par un tampon de rendu fixe 480×640 étiré en CSS —
plafond dur plutôt que relatif. L'ADR est corrigé, pas contourné.

Reste non mesuré : les 30 fps sur Mali-G52, qui demandent un appareil réel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
OKI
2026-07-27 12:07:48 -04:00
co-authored by Claude Opus 5
parent 0683992384
commit 3c660c776b
8 changed files with 790 additions and 7 deletions
+22 -5
View File
@@ -48,12 +48,29 @@ au budget JS, borné par quatre conditions :
### Mesures — à compléter en session 4
| Mesure | Cible | Relevé |
| Mesure | Cible | Relevé (2026-07-27) |
|---|---|---|
| Shell JS initial (gzip) | ≤ 170 Ko | _à mesurer_ |
| Bundle Phaser seul (gzip) | information | _à mesurer_ |
| fps scène Ranmasé sur Mali-G52 | ≥ 30 stables | _à mesurer_ |
| Poids total de l'accueil | ≤ 2 Mo | _à mesurer_ |
| Shell JS initial, Phaser exclu (gzip) | ≤ 170 Ko | **78 Ko** |
| Bundle Phaser seul (gzip) | information | **348 Ko** — sous le seuil de réexamen de 450 Ko |
| Phaser dans le chemin critique de l'accueil | absent | **absent**, vérifié sur le HTML prérendu ✅ |
| Poids total du build | ≤ 2 Mo | **1,4 Mo** |
| fps scène Ranmasé sur Mali-G52 | ≥ 30 stables | **non mesuré** — demande un appareil réel |
Le total JS du site atteint 426 Ko gzip, mais 348 Ko ne sont téléchargés qu'à l'entrée dans
`/je/ranmase/`. Un visiteur de l'encyclopédie ne les voit jamais.
### Correction apportée à cet ADR par la mise en œuvre
Cet ADR prescrivait un « DPR plafonné à 1,5 » via l'option `resolution`. **Cette option
n'existe pas dans Phaser 4** : `pixelRatio` y est une information matérielle en lecture
seule, et `resolution` avait déjà été neutralisée en Phaser 3.
L'objectif est atteint autrement, et mieux : le tampon de rendu est fixé à **480 × 640**,
étiré en CSS par le mode `FIT`. Le GPU dessine donc toujours 480 × 640 pixels, quel que
soit le DPR de l'appareil — c'est-à-dire un plafond dur, là où `resolution` n'aurait donné
qu'un plafond relatif.
`powerPreference: 'low-power'` existe bien, sous la clé `render`.
## Condition de réexamen
+52
View File
@@ -0,0 +1,52 @@
# Session 4 — Ranmasé (Phaser 4) et Pa touché
**Date :** 2026-07-27
## Porte de sortie
| Critère | Cible | Mesuré |
|---|---|---|
| Phaser dans le bundle initial | absent | **absent** du HTML prérendu de l'accueil ✅ |
| Shell JS initial, Phaser exclu | ≤ 170 Ko gzip | **78 Ko** ✅ |
| Bundle Phaser mesuré et consigné | fait | **348 Ko gzip**, inscrit dans l'ADR 0002 ✅ |
| Miroir DOM de la scène | navigable | liste textuelle de ce qui tombe, canvas `aria-hidden` ✅ |
| Écran de chargement designé | présent | flag chip + « Chargement du jaden… » ✅ |
| Module Pa touché | aucun chrono, aucun score, aucune épreuve | ✅ |
| `npm run check` | 0/0 | **266 fichiers, 0/0** ✅ |
| fps sur Mali-G52 | ≥ 30 stables | **non mesuré** — demande un appareil réel |
## Pa touché — une consultation, pas un mode de jeu
Cinq plantes, triées du plus grave au moins grave, chacune dépliable. Aucun chrono, aucun
score, aucun classement, rien à débloquer. Le brief est catégorique et il a raison :
transformer ces fiches en quiz d'adresse ferait d'une consigne de survie un jeu de
rapidité.
Le module affiche lui-même qu'il **n'a pas encore été relu** par une personne compétente,
et dit qu'une telle relecture est la contribution la plus utile que le projet puisse
recevoir. C'est dans le produit, pas seulement dans un fichier de développeur.
## Ranmasé — l'îlot Phaser
Import dynamique depuis la route, `game.destroy(true)` au démontage, communication par
**événements** — la scène ne lit ni n'écrit aucun état Svelte, et n'émet que lorsqu'une
valeur change, jamais soixante fois par seconde.
Trois choix de game design qui viennent de la pédagogie, pas du gameplay :
- **Laisser passer une plante dangereuse ne coûte rien.** C'est le bon geste : le jeu ne
peut pas récompenser le fait d'attraper ce qu'on doit éviter.
- **Ramasser le mauvais fruit coûte 2 points, pas une vie.** Il n'y a pas d'erreur à
cueillir un fruit comestible ; il y a juste une consigne à mieux lire.
- **Une plante dangereuse sur cinq.** Présente, jamais dominante.
Aucun asset externe : les objets sont des primitives graphiques dans la palette de la
charte. Embarquer des textures avant que le pipeline n'ait produit quoi que ce soit de
validé aurait été mettre la charrue avant les bœufs.
### Une prescription de l'ADR 0002 qui était fausse
L'ADR demandait un « DPR plafonné à 1,5 » via l'option `resolution`. **Elle n'existe pas
dans Phaser 4.** Corrigé et documenté : le tampon de rendu est fixé à 480 × 640 et étiré
en CSS par le mode `FIT`, ce qui donne un plafond dur là où `resolution` n'aurait donné
qu'un plafond relatif. L'ADR a été mis à jour plutôt que contourné.