Clients & Commandes
Cette page décrit en détail le fonctionnement des clients et de leurs commandes dans SnackAnarchy.
Elle s’appuie principalement sur les modules :
game/client.pygame/dishes.pygame/state.py
Apparition des clients
Les clients sont gérés par l’état global du jeu (GameState) et apparaissent selon plusieurs facteurs :
- la réputation des deux restaurants (tacos / kebab),
- le nombre de clients déjà présents sur la carte,
- des paramètres de timing et de probabilité définis dans
config.py.
Dans GameState.spawn_client() :
- un nouveau client est créé avec :
- une zone de départ (souvent la rue,
zone="street"), - une cible (
"tacos"ou"kebab") choisie en fonction de la réputation, - un chemin vers la porte de son restaurant,
- des timers internes (patience, temps avant fuite, etc.) ;
- une zone de départ (souvent la rue,
- certains clients peuvent être baladeurs (sans restaurant cible) et errer dans la rue.
Chaque client possède notamment :
- une position sur la carte,
- un état (en file, servi, parti, en colère, mort…),
- une commande (un ou plusieurs plats),
- des valeurs de patience et de satisfaction.
Génération des commandes
Les commandes sont décrites via les structures de game/dishes.py.
Un plat typique contient :
- un nom (ex.
Tacos XXL,Kebab), - une liste d’ingrédients,
- parfois un temps de préparation ou des étapes spéciales.
Lorsqu’un client atteint la zone de commande de son restaurant :
GameStatelui assigne une commande à partir de la liste de plats disponibles.- Le plat est stocké sur le client (par ex.
client.dish). - L’UI de commande et les bulles de pensée affichent le plat demandé.
Servir un client
Le service d’un client suit en général ce flux (simplifié) :
- Le joueur prépare le plat dans son restaurant (voir les systèmes d’inventaire, d’équipements et de mini‑jeux).
- Quand il est prêt, il se place à portée du client.
- Dans
GameState.handle_interaction():- on vérifie que le joueur est bien dans son propre restaurant (
player.current_zone == owns_restaurant) ; - si un client est à portée et ciblé, un mini‑jeu de service est lancé (
MiniGame(client.dish.name)).
- on vérifie que le joueur est bien dans son propre restaurant (
- À l’issue du mini‑jeu :
- si le mini‑jeu est réussi et que le stock est suffisant :
- les ingrédients requis sont consommés (
can_serve_dish+use_recipe), - le client passe à l’état servi,
- le joueur gagne de l’argent et de la réputation ;
- les ingrédients requis sont consommés (
- si le mini‑jeu est réussi mais stock insuffisant :
- le jeu affiche une rupture de stock,
- pas de pénalité directe de réputation mais le client peut s’énerver en attendant ;
- si le mini‑jeu est raté :
- le client reste en attente, ce qui augmente le risque qu’il perde patience.
- si le mini‑jeu est réussi et que le stock est suffisant :
Patience, colère et fuite
Chaque client possède un timer de patience décrémenté régulièrement dans GameState.update() :
- tant que la patience est positive, le client affiche une humeur neutre ou satisfaite ;
- en dessous de certains seuils, il passe en pré‑colère puis colère (changement de sprite ou d’icône) ;
- si la patience tombe à zéro :
- le client quitte la file ou le restaurant,
- l’état devient parti en colère,
- le restaurant concerné perd de la réputation.
La vitesse de décroissance de la patience peut dépendre de :
- la longueur de la file,
- certains sabotages (ex. ralentissements),
- des événements globaux.
Impact sur le score et la réputation
Les règles de scoring liées aux clients sont centralisées dans game/state.py.
Elles peuvent varier selon la version du jeu, mais suivent généralement ces principes :
- Client servi correctement et dans les temps :
- +20€ pour le joueur qui sert,
- +2% de réputation pour son restaurant.
- Client parti en colère :
- -1% de réputation pour le propriétaire du restaurant ciblé.
- Client tué dans son propre restaurant :
- -5% de réputation pour ce restaurant.
- Client tué dans le restaurant adverse :
- -1% de réputation pour le propriétaire,
- feedback visuel de sabotage pour l’attaquant.
Plus la réputation d’un restaurant est élevée, plus il attire de nouveaux clients :
spawn_client() utilise cette réputation pour biaiser la probabilité qu’un client choisisse le tacos ou le kebab.
Résumé : cycle de vie d’un client
GameState.spawn_client()crée un nouveau client (zone de départ, cible, timers).- Le client marche vers la file de son restaurant.
- Une commande lui est générée via
dishes.py. - Le joueur prépare et tente de servir le plat (mini‑jeu + vérification de stock).
- Selon le résultat :
- le client est servi → argent + réputation ;
- il attend trop → colère, puis fuite → perte de réputation ;
- il est tué → grosse pénalité de réputation.
Ce système relie directement la qualité du service (rapidité, exactitude) à la réputation et donc au flux futur de clients.