Aller au contenu principal

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.py
  • game/dishes.py
  • game/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.) ;
  • 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 :

  1. GameState lui assigne une commande Ă  partir de la liste de plats disponibles.
  2. Le plat est stocké sur le client (par ex. client.dish).
  3. 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é) :

  1. Le joueur prépare le plat dans son restaurant (voir les systèmes d’inventaire, d’équipements et de mini‑jeux).
  2. Quand il est prêt, il se place à portée du client.
  3. 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)).
  4. À 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 ;
    • 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.

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​

  1. GameState.spawn_client() crée un nouveau client (zone de départ, cible, timers).
  2. Le client marche vers la file de son restaurant.
  3. Une commande lui est générée via dishes.py.
  4. Le joueur prépare et tente de servir le plat (mini‑jeu + vérification de stock).
  5. 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.