Esempio n. 1
0
    /// <summary>
    /// Méthode pour ajouter les voitures extérieures d'une même couleur
    /// </summary>
    /// <param name="car">Préfab de la voiture extérieure</param>
    /// <param name="nbCars">Nombre de voitures à ajouter</param>
    /// <param name="numberExit">Numéro de la position de la sortie des voitures de même couleur</param>
    private IEnumerator AddExtColorCar(GameObject car, int nbCars, int numberExit, int nbTrust1, int nbTrust2, int nbTrust3, int nbTrust4, int nbTrust5, int nbGenerosity1, int nbGenerosity2, int nbGenerosity3, int nbGenerosity4, int nbGenerosity5)
    {
        // Liste des nbTrust
        List <int> nbTrust = new List <int> {
            nbTrust1, nbTrust2, nbTrust3, nbTrust4, nbTrust5
        };
        // Liste des nbGenerosity
        List <int> nbGenerosity = new List <int> {
            nbGenerosity1, nbGenerosity2, nbGenerosity3, nbGenerosity4, nbGenerosity5
        };

        for (int i = 0; i < nbCars; i++)
        {
            // La position initiale des voitures extérieures est toujours la position numéro 111
            Vector3    spawnPosition = new Vector3(nodes[111].position.x, 0, nodes[111].position.z);
            Quaternion rotation      = Quaternion.identity;
            rotation.eulerAngles = new Vector3(0, nodes[111].transform.eulerAngles.y, 0);
            GameObject       newCar = Instantiate(car, spawnPosition, rotation);
            ExtCarController extCar = newCar.GetComponent <ExtCarController>();
            extCar.Exit       = nodes[numberExit];
            extCar.Path       = path;
            extCar.CameraView = cameraView;

            // TRUST
            // alea.Next(5) car la taille des listes Trust est de 5
            // On vérifie que le nombre de la liste est différent de 0
            int trust = alea.Next(5);
            while (nbTrust[trust] == 0)
            {
                trust = alea.Next(5);
            }
            // On associe le paramètre "Trust" à la voiture
            extCar.Trust = trust + 1;
            // On dés-incrémente les nombres dans la liste
            nbTrust[trust] -= 1;

            // GENEROSITY
            // alea.Next(5) car la taille des listes Generosity est de 5
            // On vérifie que le nombre de la liste est différent de 0
            int generosity = alea.Next(5);
            while (nbGenerosity[generosity] == 0)
            {
                generosity = alea.Next(5);
            }
            // On associe le paramètre "Generosity" à la voiture
            extCar.Generosity = generosity + 1;
            // On dés-incrémente le nombre dans la liste
            nbGenerosity[generosity] -= 1;

            listExtCars.Add(extCar);

            yield return(new WaitForSeconds(wait));
        }
    }
    /// <summary>
    /// Méthode appelée lorsque la voiture détecte une autre voiture arrivant en sens inverse
    /// </summary>
    /// <param name="hitCar">Voiture détéctée</param>
    private void DetectionMeeting(GameObject hitCar)
    {
        ExtCarController extCarHit = hitCar.gameObject.GetComponent <ExtCarController>();
        IntCarController intCarHit = hitCar.gameObject.GetComponent <IntCarController>();

        // Cas où la voiture est en mode aléatoire et n'a donc pas de position objectif
        if (aleaMode)
        {
            // Cas où la voiture est une voiture intérieure
            if (hitCar.tag == "IntCar")
            {
                isBraking           = true;
                intCarHit.IsBraking = true;
                ReceivingInformation(intCarHit);
            }

            // Cas où la voiture est une voiture extérieure de même couleur
            else if (hitCar.tag == "ExtCar" && extCarHit.exit == this.exit)
            {
                isBraking           = true;
                extCarHit.IsBraking = true;
                ReceivingInformation(extCarHit);
            }
        }

        // Cas où la voiture a une position objectif
        else
        {
            // Si la voiture n'est pas confiante et demande confirmation (ou pas ^^) de l'information
            if (alea.Next(1, 5) >= trust)
            {
                // Cas où la voiture est une voiture intérieure
                if (hitCar.tag == "IntCar")
                {
                    isBraking           = true;
                    intCarHit.IsBraking = true;
                    ReceivingInformation(intCarHit);
                }

                // Cas où la voiture est une voiture extérieure de même couleur
                else if (hitCar.tag == "ExtCar" && extCarHit.exit == this.exit)
                {
                    isBraking           = true;
                    extCarHit.IsBraking = true;
                    ReceivingInformation(extCarHit);
                }
            }
        }

        // La voiture est en train d'échanger de l'information
        endExchange = false;
    }
    /// <summary>
    /// Méthode appelée lorsque la voiture reçoit de l'information d'une autre voiture (intérieure ou extérieure)
    /// </summary>
    /// <param name="car">Voiture captée pour échanger de l'information</param>
    private void ReceivingInformation(CarController car)
    {
        // Affichage de la flèche d'échange d'information
        DrawArrow(car);

        // Cas où la voiture avec qui on échange de l'information est une voiture extérieure
        if (car is ExtCarController)
        {
            ExtCarController extCar = (ExtCarController)car;

            // Si la voiture est assez généreuse pour partager de l'information (elle n'est donc pas en mode aléatoire)
            if (extCar.alea.Next(2, 6) <= extCar.Generosity && !extCar.aleaMode)
            {
                // ... alors la voiture prend la position objectif de la voiture croisée
                this.target = car.Target;

                // Échange réussi ! ^^ ==> Affichage de la checkmark
                canvasCheck.enabled = true;
                UpdateExchange(true, true, car);

                // Calcul du chemin le plus court pour atteindre sa position objectif
                FindingPath();
                aleaMode = false;
            }
            else
            {
                // Échec de l'échange ! :'( ==> Affichage de la crossmark ==> Il ne se passe rien
                canvasCross.enabled = true;
                UpdateExchange(true, false, car);
            }
        }

        // Cas où la voiture avec qui on échange de l'information est une voiture intérieure
        if (car is IntCarController)
        {
            IntCarController intCar = (IntCarController)car;

            // Cas où la voiture intérieure croisée est sincère
            if (intCar.Sincerity)
            {
                bool extCarKnowsExit = false;

                // Vérification que la voiture intérieure croisée connaît la sortie de "notre" voiture
                foreach (Position exitKnown in intCar.ExitsKnown)
                {
                    if (nodes[exitKnown.Number] == exit)
                    {
                        extCarKnowsExit = true;

                        // La voiture prend la position objectif de la voiture croisée
                        target = new Position(exitKnown.Number);

                        // Échange réussi ! ^^ ==> Affichage de la checkmark
                        canvasCheck.enabled = true;
                        UpdateExchange(false, true, car);

                        // Calcul du chemin le plus court pour atteindre sa position objectif
                        FindingPath();
                        aleaMode = false;
                    }
                }

                // Cas où la voiture intérieure croisée ne connaît pas la sortie de "notre" voiture
                if (!extCarKnowsExit)
                {
                    // Échec de l'échange ! :'( ==> Affichage de la crossmark ==> Il ne se passe rien
                    canvasCross.enabled = true;
                    UpdateExchange(false, false, car);
                }
            }

            // Cas où la voiture intérieure croisée est malhonnête
            else
            {
                bool extCarGivesExit = false;

                // Vérification que la voiture intérieure croisée connaît au moins une sortie
                if (intCar.ExitsKnown.Count != 0)
                {
                    // Cas où la voiture intérieure croisée ne connaît qu'une seule sortie
                    if (intCar.ExitsKnown.Count == 1)
                    {
                        // Vérification que la sortie connue n'est pas celle de "notre" voiture
                        if (nodes[intCar.ExitsKnown[0].Number] != exit)
                        {
                            extCarGivesExit = true;

                            // La voiture prend la position objectif de la voiture croisée
                            target = new Position(intCar.ExitsKnown[0].Number);

                            // Échange réussi ! ^^ ==> Affichage de la checkmark
                            canvasCheck.enabled = true;
                            UpdateExchange(false, true, car);

                            // Calcul du chemin le plus court pour atteindre sa position objectif
                            FindingPath();
                            aleaMode = false;
                        }
                    }

                    // Cas où la voiture intérieure croisée connaît plusieurs sorties
                    else
                    {
                        // On en prend une aléatoirement qui ne soit pas celle de "notre" voiture
                        int exitGiven = alea.Next(intCar.ExitsKnown.Count);
                        while (nodes[intCar.ExitsKnown[exitGiven].Number] == exit)
                        {
                            exitGiven = alea.Next(intCar.ExitsKnown.Count);
                        }

                        extCarGivesExit = true;

                        // La voiture prend la position objectif de la voiture croisée
                        target = new Position(intCar.ExitsKnown[exitGiven].Number);

                        // Échange réussi ! ^^ ==> Affichage de la checkmark
                        canvasCheck.enabled = true;
                        UpdateExchange(false, true, car);

                        // Calcul du chemin le plus court pour atteindre sa position objectif
                        FindingPath();
                        aleaMode = false;
                    }
                }

                // Cas où la voiture intérieure croisée ne connaît pas de sorties
                // ou ne connaît que la sortie de "notre" voiture
                if (!extCarGivesExit)
                {
                    // Échec de l'échange ! :'( ==> Affichage de la crossmark ==> Il ne se passe rien
                    canvasCross.enabled = true;
                    UpdateExchange(false, false, car);
                }
            }
        }
    }