//Fonction appelée à chaque tic, définis l'état du serveur et permet de vérifier périodiquement l'état des clients pour prendre des décisions en conséquence public override void UpdatePersonnage(int delta) { switch (etat) { case "idle": CheckPlatsClients(); break; case "apportePain": break; case "apportePlat": if (hasPlats == false) { if (GetPosition() != comptoir.GetPointAccesRestaurant()) { MoveTo(comptoir.GetPointAccesRestaurant()); } else { Console.WriteLine("Serveur " + id + " a prit plats pour table " + targetTable.GetNumTable()); foreach (Client client in targetTable.GetClients()) { inventaire.Add(comptoir.stockPlats.TakeContent(comptoir.stockPlats.FindContent(new Predicate <object>(o => ((Plat)o).nomPlat == client.GetPlatAttente())))); } hasPlats = true; } } else { if (GetPosition() != targetTable.GetPosition()) { MoveTo(targetTable.GetPosition()); } else { foreach (Client client in targetTable.GetClients()) { Plat plat = (Plat)inventaire.Find(o => ((Plat)o).nomPlat == client.GetPlatAttente()); inventaire.Remove(plat); client.RecevoirPlat(plat); } targetTable.serveurReservee = false; targetTable = null; hasPlats = false; etat = "idle"; } } break; case "debarasseRepas": break; } }
//Le client reçois le plat, change son état en "mange" public void RecevoirPlat(Plat plat) { Console.WriteLine("Client " + id + " a reçus " + plat.nomPlat); this.plat = plat; Random rnd = new Random(); attenteCountDown = rnd.Next(5, 10) * attente; etat = "mange"; }
//Le client a finis le plat private void FinisPlat() { plat = null; Console.WriteLine("Client " + id + " a finis " + repasEtape); if (GetRepasEtape() == "Dessert") { etat = "part"; } else { if (GetRepasEtape() == "Entree") { repasEtape = "Plat"; } else { repasEtape = "Dessert"; } etat = "attendsRepas"; } }