(Feat) Add Craft Systeme
This commit is contained in:
+59
-4
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user