(Feat) Add Craft Systeme

This commit is contained in:
2026-07-30 23:08:33 +02:00
parent 9b5ad7c8a4
commit 3f3ae1f5fa
57 changed files with 2276 additions and 127 deletions
+59 -4
View File
@@ -118,6 +118,8 @@ qu'une compilation propre l'est vraiment.
| Inventaire | `InventoryComponent`, `InventoryWidget`, `InventorySlotWidget`, `HotbarWidget`, `InventoryDragDropOperation` |
| Survie | `SurvivalStatsComponent`, `SurvivalStatsWidget` |
| Menu principal | `MainMenuGameMode`, `MainMenuPlayerController`, `MainMenuWidget`, `MenuCameraSpot` |
| Fabrication | `CraftingRecipeDataAsset`, `CraftingRecipeBook`, `CraftingComponent`, `CraftingWidget`, `CraftingRecipeSlotWidget`, `CraftingIngredientRowWidget` |
| Écran à onglets (inventaire / craft) | `InventoryScreenWidget` |
| Menu de pause | `PauseMenuWidget` + la partie pause de `FpsPlayerController` |
| Réglages | `SurvivalUserSettings`, `SettingsMenuWidget`, `SettingsTabWidget`, `SettingsGameplayWidget`, `SettingRowWidget` |
| Fondus, boîtes de dialogue | `ScreenFadeComponent`, `ConfirmDialogWidget` |
@@ -154,9 +156,55 @@ qu'une compilation propre l'est vraiment.
`SetDialogZOrder()` : **le contrôleur reste seul maître de son empilement**, un widget
réutilisable n'a pas à connaître la pile de son hôte. Une ligne = un index dans une liste de paliers, y compris les nombres :
d'où un seul `WBP_SettingRow` pour tout le menu.
- **Craft instantané**, jamais de barre de progression : c'est le choix de Valheim, Raft et
Aloft. La fabrication qui prend du temps sera celle des postes qui travaillent **sans le
joueur** (fourneau, séchoir) — un autre système, avec sa file d'attente, ses acteurs posés
dans le monde et leur mesh qui change d'état. Ce ne sont donc **pas** des `ECraftingStation`.
- **Une seule fenêtre de craft**, dont le contenu dépend d'où l'on se trouve. La recette déclare
son `RequiredStation` ; `UCraftingComponent` tient la liste des postes **accessibles à
l'instant t** (`{Hands}` seul, `{Hands, Workbench}` devant un établi). Par-dessus vient un
filtre d'affichage **purement visuel** : les deux notions restent séparées, sinon un bouton
d'interface finirait par rendre un craft impossible.
- **`Craft()` consomme avant d'ajouter.** Refuser parce que l'inventaire est plein serait faux :
consommer trois branches libère justement la case du résultat. Ce qui ne rentre malgré tout
pas part par `OnCraftOverflow` et le **pawn** le pose au sol — le composant ne sait pas
engendrer un acteur, et un établi déposerait son surplus sur sa propre table.
- Le résultat passe par `AddItem()`, donc **exactement comme un ramassage** : piles entamées
d'abord, puis barre rapide, puis grille.
- **La barre rapide se masque sur l'onglet Fabrication.** `UInventoryScreenWidget` se contente
de diffuser `OnTabChanged` ; c'est le contrôleur qui décide, via une unique
`UpdateHotbarVisibility()`. Un seul point de décision, sinon fermer l'écran depuis l'onglet
craft laisse la barre cachée pour le reste de la partie.
### Pièges UMG rencontrés sur l'écran de craft
- Un **Canvas Panel a une taille désirée de zéro** : imbriqué dans un conteneur en `Auto`, il
disparaît. C'est ce qui arrive à `WBP_Inventory` devenu page d'un WidgetSwitcher.
- Dans un Vertical/Horizontal Box, un enfant en **`Size = Fill` ne compte pas** dans la taille
désirée du parent. Tous les enfants en Fill → le parent mesure zéro, et la Border qui
l'entoure se réduit à son padding.
- Un **Size Box impose une taille désirée, pas une taille allouée** : un parent qui l'aligne en
`Fill` l'étire quand même. Il faut `Auto` + `Center`.
- Une **Border ne peint rien avec `Draw As = Image` sans texture**. Pour un aplat de couleur,
c'est **`Rounded Box`** (contour creux : Tint en alpha 0 + Outline Width).
- **« Wrap With… » sur l'unique enfant d'une Border le fait sortir de la Border.** Vérifier
l'indentation juste après, et re-glisser dans la hiérarchie.
- Pour un cadre de taille fixe, le Size Box va **autour** de la Border. Dedans, c'est le contenu
qui commande. Le plus externe gagne toujours.
- `Scale Box` + `Stretch = Scale To Fit` est le seul « keep aspect ratio » d'UMG ; un Size Box
avec `Min/Max Aspect Ratio` à 1.0 suffit pour des icônes carrées.
- Le texte placeholder d'un Text Block (« Text Block ») fausse la mise en page dans la Designer.
Y mettre une valeur représentative — le code l'écrase de toute façon à l'exécution.
## Conventions
- **Le code est en anglais, les commentaires en français.** Tout ce qui est du code s'écrit
en anglais sans exception : noms de classes, de membres et de fonctions, valeurs d'enum,
chaînes `Category = "..."`, `UMETA(DisplayName = ...)`, textes source des `FText` et
`LOCTEXT`. Un `ECraftingStation::Hands`, pas `AlaMain`. Le français est réservé aux
commentaires — un lecteur extérieur doit pouvoir lire le code sans traduire.
*(Les fichiers antérieurs à cette règle ont encore des `Category` et des `FText` en
français ; les mettre à jour au fur et à mesure qu'on les touche.)*
- Commentaires **en français**. Ils expliquent le *pourquoi* et les pièges, jamais le *quoi*.
- Nommage éditeur : `BP_` acteurs, `WBP_` widgets, `DA_` data assets, `IA_` input actions,
`IMC_` mapping contexts, `GM_` game mode.
@@ -167,9 +215,16 @@ qu'une compilation propre l'est vraiment.
## État actuel et suite
Boucle complète : récolter → ranger → consommer → survivre → mourir → réapparaître.
Autour : menu principal, menu de pause, et un écran de réglages dont **seul l'onglet
« Jeu & Contrôles » est rempli**.
Boucle complète : récolter → **fabriquer** ranger → consommer → survivre → mourir →
réapparaître. Autour : menu principal, menu de pause, et un écran de réglages dont **seul
l'onglet « Jeu & Contrôles » est rempli**.
Le craft est en place de bout en bout : `DA_RecipeBook`, onglets Inventaire / Fabrication,
grille de recettes filtrée par poste accessible, panneau de détail avec compteurs colorés.
Restent à faire quand le besoin viendra : l'**acteur établi** qui appellera
`AddAvailableStation(Workbench)`, les **boutons de filtre** par poste (`SetStationFilter` existe
déjà et `ECraftingStation::Count` sert de sentinelle « tout »), et les vraies recettes — celles
en place sont deux `DA_Craft_Test_*` bâties sur `DA_Branch` et `DA_Rocher`.
Suite immédiate sur les réglages, dans l'ordre : onglet **Affichage** (le moteur fait tout,
prévoir la confirmation à rebours de 10 s sur la résolution), onglet **Graphismes** (les dix
@@ -181,5 +236,5 @@ Prochaine étape gameplay recommandée : **spawner de ressources avec repousse**
(`AResourceSpawner`, liste pondérée de DataAssets, rayon, densité, délai). Sans lui la carte se
vide en dix minutes.
Ensuite, par ordre de valeur : craft, objet visible en main, coffres, sauvegarde,
Ensuite, par ordre de valeur : objet visible en main, établi, coffres, sauvegarde,
cycle jour/nuit.