# La carte choisie et le cadenas des ingrédients

Décision du 12/10/2026. Avant, la carte du jour se déduisait du stock : tout
plat cuisinable était proposé. Elle se choisit désormais à l'onglet **Carte**
de la gestion du resto.

## La carte

- Places : statistique `menu_slot_count` (3 au départ, catégorie `kitchen`).
  Une amélioration l'augmente par un modificateur `flat/add`.
- `GameState.menu_recipes` : les plats choisis, dans l'ordre du choix.
  `offered_recipes()` = les plats choisis **qui se cuisinent**. Il nourrit les
  clients, le four, la brigade et la salle hors champ. Le comptoir garde sa
  propre recette.
- Une carte pleine refuse un plat (`set_menu_recipe` rend faux). Le bouton
  Ajouter reste parcourable et le dit.
- Le client ne commande que la carte (billet 120, 15/10/2026) : un plat
  choisi qui se cuisine, ou une portion qui cuit ou attend déjà — même
  retirée de la carte, une assiette prête se vend. Un plat du livre hors
  carte, même cuisinable, n'est demandé ni à table, ni en reprise, ni par
  le passant qui juge s'il entre. Retiré de la carte sans portion prête, un
  plat commandé fait changer le client de plat, ou partir. Seul le client
  spécial venu pour son plat le demande hors carte. Règle :
  `_recipe_is_available()` et `_recipe_is_listed()` de `restaurant.gd`.
- Nouvelle partie : carte vide, et l'ajout automatique pose un premier plat.
  Vieille sauvegarde sans `menu_recipes` : les plats cuisinables les plus chers
  prennent les places.
- Fin de dimension et remise à zéro : la carte se vide.

## L'ajout automatique

Il est allumé par défaut. Quand aucun plat de la carte ne se cuisine et qu'un
autre plat le peut, celui-ci s'ajoute (`auto_fill_menu()`, appelé par
`offered_recipes()` et en tête de `RecipeMenu.build_list()`). Si la carte est
pleine, il prend la place du plat épuisé le plus ancien.

- Règle `menu_auto_rule` : `price` (le plus cher), `portions` (le plus de
  portions), ou `""` (au hasard). Une égalité se tranche aussi au hasard. Une
  seule case se coche à la fois.
- Un plat **banni** (amélioration Carte blanche) n'est jamais ajouté
  automatiquement. Il reste sélectionnable à la main : bannir ne retire plus
  un plat du service, et les clients le commandent s'il est à la carte.

## L'onglet Carte

En tête : l'interrupteur AJOUT AUTO et ses deux cases. Viennent ensuite tous
les plats du livre (`RecipeMenu.menu_tab_order()`) :

1. les plats choisis, dans l'ordre du choix. Ils ont un cadre doré, leur nom
   en or et en gras, et la pastille À LA CARTE ;
2. les plats cuisinables, du plus cher au moins cher. Leur nom porte le cadre
   des boutons du four ;
3. les autres, grisés.

Chaque ligne montre les portions que le stock permet et un bouton
Ajouter/Retirer. Le compteur affiche « À la carte : n/places ».

## Le cadenas

À l'onglet Ingrédients de la gestion, un petit cadenas est dessiné devant
chaque ingrédient (`LockButton`) : fermé et doré, ou ouvert et pâle.

- Un ingrédient verrouillé (`locked_ingredients`) compte comme **absent**
  partout où l'on cuisine : carte, four, brigade, plats de combat, comptoir.
  Le calcul passe par `cookable_ingredient_amount()`, `cooking_recipe()` et
  `cookable_portions()`.
- Il ne se vend pas (`can_sell_ingredient`).
- Les quêtes et les coûts d'améliorations le voient toujours :
  `get_ingredient_amount()` ne change pas.
- Le menu joueur (onglet Ingrédients) affiche le cadenas, mais ne permet pas
  de le changer.

Contrôle : `menu_selection` (`scripts/core/menu_selection_check.gd`); ce que
le client commande, dans la vraie salle : `service_gestures`, section 4.
Données :
`tools/game-data-manager/migrate_menu_selection_20261012.php`.
