79 lines
5.5 KiB
Markdown
79 lines
5.5 KiB
Markdown
|
|
Fiche REL-ALPHA-V1 — Niveau N3 — Modèle prévu opus | utilisé claude-opus-5-5 (session REL) — Agent session REL — Skills lp-lot, lp-paths
|
||
|
|
# REL-ALPHA-V-SPEC : version de jeu terminée par une lettre (`2026.10.2.1a`) dans `LPModGuard` (2026-10-14)
|
||
|
|
|
||
|
|
**Décision de l'utilisateur** (option B, transmise par Big Boss le 2026-10-14, mot pour mot : « Lettre acceptée ») : `ProjectVersion=2026.10.2.1a`, et `LPModGuard` accepte une version qui se termine par une lettre. Le format `MODULE_GAME_VERSION` du contrat des mods change ici par sa décision.
|
||
|
|
|
||
|
|
Règle (Big Boss) :
|
||
|
|
- Le dernier composant peut finir par une ou plusieurs lettres ASCII `a`-`z`, sans casse, sans espace.
|
||
|
|
- Ce suffixe est ignoré à la comparaison.
|
||
|
|
- Toute autre forme reste illisible, avec le comportement actuel.
|
||
|
|
- Aucune trace nouvelle en Shipping.
|
||
|
|
|
||
|
|
Le code ne s'y oppose pas (ci-dessous).
|
||
|
|
|
||
|
|
## 1. Constat (lecture du code, établi)
|
||
|
|
- `Source/LifePlay/LPModGuard.cpp:52-74` : `ParseVersion` découpe la chaîne sur `.` et refuse toute composante vide, de plus de 9 caractères, ou qui contient un caractère autre qu'un chiffre.
|
||
|
|
- Il n'a que trois appels :
|
||
|
|
- l. 273, version du jeu : `GGameVersion` lu dans `GeneralProjectSettings.ProjectVersion`, l. 240 ;
|
||
|
|
- l. 274 : `MinGameVersion` = `2026.10.2.0`, l. 31 ;
|
||
|
|
- l. 367 : `MODULE_GAME_VERSION` de chaque mod.
|
||
|
|
- `CompareVersions` (l. 77-90) compare des entiers : le changer n'est pas nécessaire.
|
||
|
|
- Aucun autre analyseur de version :
|
||
|
|
- `LPVersionSubsystem.cpp:15` et `LPModInfoSubsystem.cpp:124` affichent la chaîne ;
|
||
|
|
- aucun Blueprint ne lit `ProjectVersion` (`grep -a` sur `Content/**/*.uasset` : 0 ; seul `GI.uasset` contient `version_text`, l'affichage).
|
||
|
|
- **Outils PowerShell** (jeu et addon 5.8, `grep -i "[version]|ProjectVersion|GAME_VERSION"`) :
|
||
|
|
- `BuildMod.ps1:181-183` lit `ProjectVersion=(.+)` comme une chaîne (`Trim`), sans `[version]` ni regex de chiffres. `:279` l'écrit telle quelle dans `MODULE_GAME_VERSION`. Rien à changer.
|
||
|
|
- Aucun `[version]` dans `Tools/*.ps1` du jeu ni dans `Tools/*.ps1` de l'addon 5.8.
|
||
|
|
- **`.uplugin` des mods** : `NewMod.ps1:43` écrit `Version = 1` (entier propre au mod) et `VersionName = $ModVersion`, la version **du mod** (`MODULE_VERSION`, `BuildMod.ps1:202, 284`). Aucun champ numérique ne dépend de la version du jeu.
|
||
|
|
|
||
|
|
## 2. Changement (un seul fichier, une fonction)
|
||
|
|
Fichier : `Source/LifePlay/LPModGuard.cpp`, fonction `ParseVersion` (l. 52-74), plus le commentaire de `LPModGuard.h:19` si son texte devient faux. L'IMPL vérifie : la règle « suffixe ignoré » s'y ajoute en une demi-ligne.
|
||
|
|
- Pour la **dernière** composante seulement, retirer les lettres ASCII de fin (`'a'..'z'`, `'A'..'Z'`, tests explicites, pas `FChar::IsAlpha`, qui accepte des lettres non ASCII), puis appliquer **les contrôles existants, inchangés**, à ce qui reste : non vide, 9 caractères au plus, chiffres seulement.
|
||
|
|
- Commentaire de la fonction : mentionner le lot REL-ALPHA, la décision de l'utilisateur et l'exemple `"2026.10.2.1a" -> {2026, 10, 2, 1}`.
|
||
|
|
- Rien d'autre : ni `CompareVersions`, ni journal nouveau, ni changement des messages.
|
||
|
|
|
||
|
|
Comportement attendu (tableau de la VAL) :
|
||
|
|
|
||
|
|
| Entrée | Résultat | Composantes |
|
||
|
|
|---|---|---|
|
||
|
|
| `2026.10.2.0` | lisible | 2026, 10, 2, 0 |
|
||
|
|
| `2026.10.2.1` | lisible | 2026, 10, 2, 1 |
|
||
|
|
| `2026.10.2.1a` | lisible | 2026, 10, 2, 1 |
|
||
|
|
| `2026.10.2.1A` | lisible | 2026, 10, 2, 1 |
|
||
|
|
| `2026.10.2.1rc` | lisible | 2026, 10, 2, 1 |
|
||
|
|
| `2026.10.2.1-a` | illisible (`-` reste) | — |
|
||
|
|
| `2026.10.2.a` | illisible (composante vide après retrait) | — |
|
||
|
|
| `2026.10a.2.1` | illisible (lettre hors de la dernière composante) | — |
|
||
|
|
| `2026.10.2.1 a` | illisible (l'espace reste) | — |
|
||
|
|
| chaîne vide | illisible (le moteur 5.8 rend 1 composante vide, refusée par `IsEmpty`) | — |
|
||
|
|
|
||
|
|
Conséquences :
|
||
|
|
- Le jeu `2026.10.2.1a` vaut `2026.10.2.1`.
|
||
|
|
- Un mod `2026.10.2.0` passe le contrôle min (= `MinGameVersion`) et le contrôle max (≤ jeu).
|
||
|
|
- Un mod construit pour l'alpha (`2026.10.2.1a`, `BuildMod`) passe sur l'alpha, et serait refusé par le contrôle max d'un jeu `2026.10.2.0`, ce qui est attendu.
|
||
|
|
|
||
|
|
## 3. Fiches
|
||
|
|
- **V2 IMPL** (lp-impl) :
|
||
|
|
- instantané `Tools\Snapshot.ps1 -Lot REL-ALPHA -Path Source\LifePlay\LPModGuard.cpp, Source\LifePlay\LPModGuard.h`, fait par la session REL avant l'envoi ;
|
||
|
|
- Edit de `ParseVersion` ;
|
||
|
|
- sans compiler ;
|
||
|
|
- LF et ASCII gardés ;
|
||
|
|
- livrable `REL-ALPHA-V2-IMPL.md` (diff, MD5 avant et après).
|
||
|
|
- **V3 VAL** (lp-validator distinct, statique) :
|
||
|
|
- le diff limité à `ParseVersion` (et au commentaire `.h` s'il est touché) ;
|
||
|
|
- le tableau du § 2, cas par cas, tracé dans le code (`fichier:ligne`) ;
|
||
|
|
- aucun `UE_LOG` ni message nouveau ;
|
||
|
|
- `FChar::IsAlpha` absent ;
|
||
|
|
- LF, ASCII ;
|
||
|
|
- compilabilité estimée.
|
||
|
|
|
||
|
|
Livrable : `REL-ALPHA-V3-VAL.md`.
|
||
|
|
- Puis **T1** (`ProjectVersion=2026.10.2.1a`) et **T1v**, puis la demande d'UE-GO pour T2 : le Shipping de livraison compile ce C++. Pas de build Development d'essai.
|
||
|
|
|
||
|
|
## 4. Essai (dans l'essai Shipping de l'utilisateur, T4)
|
||
|
|
- **Ligne d'essai :** l'alpha `2026.10.2.1a` est lancée avec un mod d'assets (`Mods\<id>`) construit en 5.8 (`MODULE_GAME_VERSION` = `2026.10.2.0`, ou `2026.10.2.1a` s'il est reconstruit). Attendus :
|
||
|
|
- le mod est chargé : il apparaît dans le gestionnaire de mods, et ses assets ou ses scènes sont visibles en jeu ;
|
||
|
|
- aucune fenêtre de refus des mods ;
|
||
|
|
- les cases « Mods: … (restart) » de Settings > Misc restent cochées.
|
||
|
|
- Sans journal en Shipping, la preuve est visuelle (fenêtre absente, mod présent) et se fait avec l'utilisateur.
|