70 lines
10 KiB
Markdown
70 lines
10 KiB
Markdown
|
|
# TSC1-DIAG-01 : la commande de scène par touche « hash » existe-t-elle encore ?
|
||
|
|
|
||
|
|
Fiche TSC1-DIAG-01 — Niveau N1 — Session « Lower · TSC1 » — Classe VAL : L (lecture seule).
|
||
|
|
Date : 2026-10-15. Copie UE : BUILD-GO accordé ; éditeur à lancer sur ordre direct de l'utilisateur. Aucune écriture MCP, aucune sauvegarde.
|
||
|
|
|
||
|
|
## 1. Question
|
||
|
|
Un joueur demande : « in the old game by Vinfamy you could press hash button and bring up a command where you could input a command from any of the modules to play that scene you want, can you do that here ». L'utilisateur demande de vérifier si c'est toujours vrai.
|
||
|
|
|
||
|
|
## 2. Constats statiques (établi, sans éditeur)
|
||
|
|
|
||
|
|
- **Action `TestScenes`** : deux liaisons dans `Config/DefaultInput.ini` : `Key=Tilde` (l. 121) et `Key=Insert` (l. 122). Pas de touche « # » ni « hash » nommée.
|
||
|
|
- **Console moteur** : `ConsoleKeys=Tilde` (l. 168-169) et `ConsoleKeys=²` (l. 170). Tilde ouvre donc aussi la console d'Unreal sur la copie.
|
||
|
|
- **Menu des raccourcis** : `Source/LifePlay/LPKeyboardSubsystem.cpp` l. 100 : `TestScenes` est listé sous le libellé « Test Scenes » ; l. 193-195 : rangé dans la catégorie « Scene ». C'est donc une **action de raccourci remappable**, pas une commande saisie.
|
||
|
|
- **Commandes C++ enregistrées** (`LPDebugSubsystem.cpp`, l. 605-634 : `memreport`-like, `CollisionDump`, `Bookmark`, `HitchSummary`, `PersonsDump`) : aucune ne lance une scène de module par son nom.
|
||
|
|
- **Addon `LPSandbox`** : aucune occurrence de `TestScene` ni de `SceneTest` dans `Plugins`.
|
||
|
|
- **Références binaires** : `TestScenes` dans `Content/BPs/PC.uasset` ; « TestScene » dans `GI.uasset`, `UI/Action.uasset`, `UI/MainMenu.uasset`, `UI/TopRight.uasset` (repérage de Big Boss). Le contenu des Blueprints n'est pas lu ici : il l'est par MCP.
|
||
|
|
|
||
|
|
## 3. Résultats de la lecture MCP (2026-10-15, éditeur ouvert, lecture seule, aucune PIE)
|
||
|
|
|
||
|
|
Appels : `ProgrammaticToolset.execute_tool_script` (garde v6) autour de `AssetTools.load_asset`, `BlueprintTools.find_nodes` et `BlueprintTools.get_node_infos` (paquets ≤ 20). Chaque nœud est cité par son `refPath`. Statut : établi (lu à la source) sauf mention « estimé » ou « incertain ».
|
||
|
|
|
||
|
|
### 3.1 Événement d'entrée `TestScenes` dans `PC` (établi)
|
||
|
|
- `find_nodes` titre « TestScenes » dans `/Game/BPs/PC.PC:EventGraph` → `K2Node_InputAction_9` ; `get_node_infos` : type `Entrée|ActionEvents|InputActionTestScenes`.
|
||
|
|
- Le fil d'exécution part de la broche **Released** (touche relâchée), pas de Pressed (non connectée) : `InputAction_9` → `IfThenElse_60` (condition : `VariableGet_168` = `GI.BuilderOn`) ; la branche *then* (BuilderOn vrai) n'est pas connectée ; la branche *else* → `IfThenElse_36` (condition : `CallFunction_118` = `Widget|IsVisible` sur le widget `TopRight`, `VariableGet_36`) → *then* → `CallFunction_119` `Widget|SetVisibility(Visible)` puis `CallFunction_120` `Widget|SetKeyboardFocus`, tous deux sur `VariableGet_37` = variable **`TestSceneText`** du widget `TopRight`, de type **Text Box**.
|
||
|
|
- Donc : la touche affiche une **zone de saisie de texte** (`TestSceneText`, dans `/Game/UI/TopRight`) et lui donne le focus clavier. Ce n'est pas la console moteur. Elle n'agit que si le HUD `TopRight` est visible et que le mode Builder est inactif (`BuilderOn` faux).
|
||
|
|
- Le second appui ne la referme pas par ce chemin : la fermeture est dans la validation du texte (§ 3.2). `PC` lit aussi `TestSceneText` en `VariableGet_122` et `VariableGet_229`, pour des tests `IsVisible` (`CallFunction_39`, `CallFunction_191`), usage non détaillé (incertain).
|
||
|
|
|
||
|
|
### 3.2 Lecture de la commande saisie (établi)
|
||
|
|
- `/Game/UI/TopRight.TopRight:EventGraph.K2Node_ComponentBoundEvent_245` : `OnTextCommitted(TestSceneText)`. Il passe par `SwitchEnum_4` (ETextCommit) : seule la sortie **OnEnter** est câblée (Entrée valide ; Tab/perte de focus ne lancent rien). Ordre : `CallFunction_1179` `SetVisibility(Collapsed)` sur la zone (`VariableGet_517`), puis `IfThenElse_12`.
|
||
|
|
- Le texte passe en chaîne (`CallFunction_1177`, ToString). `IfThenElse_12` : condition `CallFunction_47` = **la chaîne contient un espace**.
|
||
|
|
- **Sans espace** (*else*) → `CallFunction_1178` = `GI.TestScene(SceneID = texte)` (`VariableGet_516` = `GetGI`).
|
||
|
|
- **Avec espace** (*then*) → `CallFunction_48` coupe au premier espace ; la partie gauche va dans `SwitchString_0` qui n'a que deux cas : **`wait`** (→ `VariableSet_129`, partie droite convertie en nombre par `CallFunction_284`) et **`waituntil`** (→ `IfThenElse_64`, partie droite coupée par « / » via `CallFunction_1257`). Ce sont des sous-commandes de test, leur effet précis n'est pas lu (incertain).
|
||
|
|
- `GI.TestScene` : `/Game/BPs/GI.GI:TestScene` (`K2Node_FunctionEntry_0`) est un simple relais vers `ExecuteUbergraphGI` ; le corps est l'événement personnalisé `/Game/BPs/GI.GI:EventGraph.K2Node_CustomEvent_162` « TestScene » (entrées `SceneID`, `Contains`). Il vide `PersonsAlreadyGot` et `RelativesAlreadyGot`, mélange le tableau `Scenes` (`VariableGet_14125` = `GetScenes`, tableau de structures Scene), puis boucle (`MacroInstance_4184`, ForEachLoopWithBreak) : `BreakStruct_229` (BreakScene) extrait le `FilePath` ; `CallFunction_1159`/`CallFunction_1158` en retirent le dossier (split « / » depuis la fin) et l'extension (split « .lpscene » depuis la fin) ; `CallFunction_8877` compare **sans casse** le nom obtenu à `SceneID` (si `Contains` est actif, ce sont `CallFunction_1160`/`CallFunction_191` : sous-chaîne / préfixe). En cas d'égalité, `CallFunction_75313` et `CallFunction_563` (`CheckConditionsWho` sur les conditions PNJ de la scène) précèdent `CallFunction_12136` = **`PlayScene(FilePath)`**.
|
||
|
|
- **Format attendu : le nom du fichier de la scène, sans dossier ni extension `.lpscene`**, sur n'importe quel module chargé dans `Scenes` (nom unique : la première correspondance du tableau mélangé est jouée, donc un nom présent dans deux modules est ambigu — estimé). Une scène dont les conditions PNJ ne conviennent pas n'est pas lancée (estimé, d'après `CheckConditionsWho`).
|
||
|
|
- **Exemples réels** : `/Game/UI/MainMenu.MainMenu:EventGraph.K2Node_CallFunction_58` appelle `TestScene(SceneID = "tf_start")` et `K2Node_CallFunction_37` appelle `TestScene(SceneID = "tut_start")`. Fichiers correspondants dans `Content\Modules\vin_Base` : `TF\tf_start.lpscene` et `Scenes\tutorials\tut_start.lpscene` (1271 fichiers `.lpscene` dans `Content\Modules`). Saisir `tf_start` ou `tut_start` est donc le format du jeu lui-même.
|
||
|
|
- `/Game/UI/TopRight` : `find_nodes` « TestScene » → `ComponentBoundEvent_245`, `CallFunction_1178`, `VariableGet_517`.
|
||
|
|
|
||
|
|
### 3.3 Conditions (établi pour ce qui est lu ; l'absence est limitée aux graphes `EventGraph` cherchés)
|
||
|
|
- Seule condition lue dans `PC` : `GI.BuilderOn` faux, plus `TopRight` visible (§ 3.1).
|
||
|
|
- `find_nodes` avec les titres « Shipping », « Debug », « Packaged », « Editor » dans les `EventGraph` de `/Game/BPs/PC`, `/Game/UI/TopRight`, `/Game/UI/MainMenu` et `/Game/BPs/GI` : **aucun nœud**. Aucune garde de build Shipping ou de mode debug n'est visible dans ces graphes : la commande est donc disponible en build empaquetée (estimé : les fonctions annexes de `PC` et `GI`, hors `EventGraph`, ne sont pas cherchées ; incertain). L'essai de l'utilisateur sur la build empaquetée tranche.
|
||
|
|
- Où `BuilderOn` est positionné : non établi (aucun nœud « BuilderOn » dans l'`EventGraph` de `GI`).
|
||
|
|
- `MainMenu` ne conditionne pas la saisie : il appelle seulement `TestScene` pour deux boutons (`tf_start`, `tut_start`).
|
||
|
|
|
||
|
|
### 3.4 Conflit Tilde (établi en statique, § 2)
|
||
|
|
`TestScenes` est liée à `Tilde` (DefaultInput.ini l. 121) et la console moteur à `Tilde` (l. 168-169) et `²` (l. 170). Les deux réagissent à la même touche. Ce que fait l'éditeur de jeu quand les deux coïncident (console prioritaire ou non) n'est pas lu par MCP : incertain, à voir en jeu.
|
||
|
|
|
||
|
|
### 3.5 Touche réelle selon le clavier (estimé : correspondance de disposition, non lue dans le jeu)
|
||
|
|
- **Insert** : `Key=Insert`, identique sur tous les claviers (établi, l. 122).
|
||
|
|
- `Tilde` est la touche virtuelle OEM_3 de Windows. Sur disposition US, c'est « ` ~ » ; sur AZERTY français, la même touche virtuelle est celle de « ù » ; sur britannique, celle de « ' @ ». La touche « ² » (AZERTY) n'est pas `Tilde`, elle ne lance que la console. La touche « # » britannique n'est liée à rien dans l'action (aucune liaison « # »).
|
||
|
|
- Conclusion de ce point : seule Insert est sûre ; Tilde dépend de la disposition. À confirmer par essai.
|
||
|
|
|
||
|
|
## 4. Réponse (oui / non / partiel)
|
||
|
|
|
||
|
|
**Partiel.** Oui pour la fonction : une touche (Insert, ou Tilde selon le clavier) ouvre une zone de saisie dont la validation par Entrée lance la scène de n'importe quel module chargé, par son nom de fichier sans extension (ex. `tf_start`, `tut_start`). Non pour la touche « hash » : aucune liaison « # », et Tilde se partage avec la console moteur. Preuves : `/Game/BPs/PC.PC:EventGraph.K2Node_InputAction_9` → `IfThenElse_60` / `IfThenElse_36` → `CallFunction_119` et `CallFunction_120` sur `TestSceneText` ; `/Game/UI/TopRight.TopRight:EventGraph.K2Node_ComponentBoundEvent_245` → `CallFunction_1178` ; `/Game/BPs/GI.GI:EventGraph.K2Node_CustomEvent_162` → `CallFunction_12136` (`PlayScene`) ; exemples `MainMenu` `CallFunction_58` (`tf_start`) et `CallFunction_37` (`tut_start`). Non établi : comportement exact en build empaquetée (aucune garde Shipping vue), arbitrage Tilde / console, effet de `wait` et `waituntil`.
|
||
|
|
|
||
|
|
## 5. Projet de réponse au joueur (en anglais, 5 lines, sans promesse)
|
||
|
|
|
||
|
|
Thanks for the question. A scene command box still exists: press Insert (it is the default key; the "Scene" section of the controls menu lets you change it).
|
||
|
|
Type the scene's file name without folder or ".lpscene" (for example tf_start or tut_start) and press Enter.
|
||
|
|
It looks through the scenes of the loaded modules, and a scene whose character conditions are not met will not start.
|
||
|
|
There is no "#" binding, and Tilde shares its key with the engine console, so its behaviour depends on your keyboard layout.
|
||
|
|
We have read this from the game data only and have not run it in a build yet.
|
||
|
|
|
||
|
|
## 6. Fin
|
||
|
|
|
||
|
|
Vérification finale : essai de l'utilisateur, décrit pas à pas (build empaquetée : Insert, saisir `tf_start`, Entrée).
|
||
|
|
|
||
|
|
## Fichiers à commiter
|
||
|
|
- `Docs/Migration/etat/REL/TSC1/TSC1-DIAG-01.md` (M).
|