public void StartFriendSay(int choice)
    {
        minutesLeft     -= 2;
        minutesText.text = "Minutes Left: " + minutesLeft.ToString();

        string message = PlayerSheet.GetName(tmpID) + ": ";
        int    sendID;
        int    recID;

        switch (choice)
        {
        case 0:
            int toPrimary     = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.T2P));
            int fromPrimary   = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.TFP));
            int toSecondary   = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.T2S));
            int fromSecondary = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.TFS));

            bool noticeToPrimary     = (((toPrimary - toSecondary > 0)) && (toPrimary - fromSecondary > 0));
            bool noticeFromPrimary   = (((fromPrimary - toSecondary > 0)) && (fromPrimary - fromSecondary > 0));
            bool noticeToSecondary   = ((toSecondary - toPrimary > 0) && ((toSecondary - fromPrimary > 0)));
            bool noticeFromSecondary = ((fromSecondary - toPrimary > 0) && ((fromSecondary - fromPrimary > 0)));

            string[] typename = { "Preps", "Jocks", "Artists", "Nerds" };

            if (noticeToPrimary || noticeFromPrimary)
            {
                message += "I've noticed a lot of " + typename[PlayerSheet.GetTypeOne(tmpID) - 1] + " whispering amongst themselves.";
            }
            else if (noticeToPrimary || noticeFromPrimary)
            {
                message += "I've noticed a lot of " + typename[PlayerSheet.GetTypeTwo(tmpID) - 1] + " whispering amongst themselves.";
            }
            else if (PlayerSheet.GetTypeOne(tmpID) == PlayerSheet.GetTypeTwo(tmpID) && toPrimary > 3)
            {
                message += "I've noticed a lot of " + typename[PlayerSheet.GetTypeOne(tmpID) - 2] + " whispering amongst themselves.";
            }
            else
            {
                message += "I haven't noticed anything in particular.";
            }

            StartCoroutine(FriendSay(message, 0));
            break;

        case 1:
            sendID = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.SFID1));
            recID  = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.S2ID1));

            if (sendID != 0 && recID != 0)
            {
                message += "I noticed " + PlayerSheet.GetName(sendID) + " whispering to " + PlayerSheet.GetName(recID) + " very suspiciously.";
            }
            else
            {
                message += "Nah, I haven't seen anything strange. Why?";
            }

            int another = (PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.SFID2)) != 0) && (PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.S2ID2)) != 0) ? 1 : 0;
            StartCoroutine(FriendSay(message, another));
            break;

        case 2:
            message += PlayerSheet.GetRevealer(tmpID) + " told me.";
            StartCoroutine(FriendSay(message, 0));
            break;

        case 3:
            if (PlayerSheet.GetIndex(tmpID) == distributorID)
            {
                won      = true;
                message += "Aww you caught me. I'm so sorry, I just think it's so hilarious that you suck eggs! :(";
            }
            else
            {
                message += "How dare you accuse me! You're not a very good friend.";
            }
            StartCoroutine(FriendSay(message, 2));
            break;

        case 4:
            sendID   = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.SFID2));
            recID    = PlayerSheet.GetSpreadStat(tmpID, Stat2Int(StatType.S2ID2));
            message += "I also noticed " + PlayerSheet.GetName(sendID) + " whispering to " + PlayerSheet.GetName(recID) + " very suspiciously.";
            break;
        }
    }
    IEnumerator GameHandler()
    {
        int i = 0;

        while (true)
        {
            // Respawn NPC s
            PlayerSheet.Shuffle();
            SpawnChars();

            // Reset spread and minutes
            spread = 0;
            for (int j = 0; j < 80; j++)
            {
                if (PlayerSheet.GetParameter(j, (int)ParameterType.Infected) == true)
                {
                    spread++;
                }
            }
            spreadText.text  = "Spread: " + spread.ToString() + "/64";
            minutesLeft      = 16;
            minutesText.text = "Minutes Left: " + minutesLeft.ToString();

            // wait for end of turn
            while (!Input.GetKeyDown(KeyCode.N))
            {
                if (spread == 1)
                {
                    i    = 0;
                    days = 0;
                    break;
                }
                yield return(null);
            }

            //Reset for next turn
            DestroyChars();

            // stop if the whole school knows
            if (spread >= 64 || won)
            {
                break;
            }

            // Infector Spreads rumor

            // spread rumor
            for (int j = 0; j < 80; j++)
            {
                // if in position to spread
                int pair = PlayerSheet.CheckPair(j);
                if (pair >= 0 && (PlayerSheet.GetParameter(j, (int)ParameterType.Infected)) == true)
                {
                    int num_spread = PlayerSheet.GetSpreadToday(i);
                    int r          = Random.Range(1, 100);

                    // if rumor can be spread
                    bool isThinking = ((PlayerSheet.GetIndex(j) == 66 || PlayerSheet.GetIndex(j) == 67 || PlayerSheet.GetIndex(j) == 68 || PlayerSheet.GetIndex(j) == 70 || PlayerSheet.GetIndex(j) == 71 ||
                                        PlayerSheet.GetIndex(j) == 76 || PlayerSheet.GetIndex(j) == 78 || PlayerSheet.GetIndex(j) == 79 || PlayerSheet.GetIndex(j) == distributorID) || PlayerSheet.GetIndex(j) < 64);

                    if (((difficulty == 0 && num_spread == 0 && r <= 40) || (difficulty == 1) && r <= 80) && PlayerSheet.GetParameter(pair, (int)ParameterType.Infected) == false && isThinking)
                    {
                        // spread rumor
                        PlayerSheet.SetSpreadToday(j, num_spread + 1);
                        PlayerSheet.SetParameter(pair, (int)ParameterType.Infected, true);

                        if (PlayerSheet.GetIndex(pair) >= 64)
                        {
                            PlayerSheet.SetRevealer(pair, j);
                        }

                        // find room
                        int room = (int)Mathf.Floor(j / 16);
                        Debug.Log(PlayerSheet.GetName(j) + " spread to " + PlayerSheet.GetName(pair) + " in room " + room.ToString());

                        for (int k = 16 * room; k < 16 * (room + 1); k++)
                        {
                            bool sharespreader1_1  = (PlayerSheet.GetTypeOne(k) == PlayerSheet.GetTypeOne(j));
                            bool sharespreader1_2  = (PlayerSheet.GetTypeOne(k) == PlayerSheet.GetTypeTwo(j));
                            bool sharespreader2_1  = (PlayerSheet.GetTypeTwo(k) == PlayerSheet.GetTypeOne(j));
                            bool sharespreader2_2  = (PlayerSheet.GetTypeTwo(k) == PlayerSheet.GetTypeTwo(j));
                            bool sharesinfected1_1 = (PlayerSheet.GetTypeOne(k) == PlayerSheet.GetTypeOne(pair));
                            bool sharesinfected1_2 = (PlayerSheet.GetTypeOne(k) == PlayerSheet.GetTypeTwo(pair));
                            bool sharesinfected2_1 = (PlayerSheet.GetTypeTwo(k) == PlayerSheet.GetTypeOne(pair));
                            bool sharesinfected2_2 = (PlayerSheet.GetTypeTwo(k) == PlayerSheet.GetTypeTwo(pair));

                            // if it is a friend
                            if (PlayerSheet.GetIndex(k) > 64 && k != j && k != pair)
                            {
                                // if they share clique with spreader
                                if (sharespreader1_1 || sharespreader1_2 || sharespreader2_1 || sharespreader2_2)
                                {
                                    int observeChance = 20;
                                    int trendChance   = 20;
                                    int friend        = (PlayerSheet.GetIndex(k) - 64);

                                    // if intuitive
                                    if (friend == 0 || friend == 1 || friend == 3 || friend == 4 || friend == 5 || friend == 6 || friend == 7 || friend == 13)
                                    {
                                        trendChance = 40;
                                    }

                                    // if observant
                                    else
                                    {
                                        observeChance = 40;
                                    }

                                    int rObserve = Random.Range(1, 100);
                                    int rTrend   = Random.Range(1, 100);

                                    // if observed, enter into stats
                                    if (rObserve < observeChance)
                                    {
                                        int mod = (PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.HistInd) % 2) == 0) ? 0 : 2;
                                        PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.S2ID1) + mod, pair);
                                        PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.SFID1) + mod, j);

                                        Debug.Log(PlayerSheet.GetName(k) + " observed " + PlayerSheet.GetName(j) + " to: " + PlayerSheet.GetName(pair));
                                        Debug.Log(rObserve);
                                    }

                                    // if trend noticed
                                    if (rTrend < trendChance)
                                    {
                                        if (sharespreader1_1)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.T2P), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.T2P)) + 1);
                                        }
                                        if (sharespreader1_2)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.T2P), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.T2P)) + 1);
                                        }
                                        if (sharespreader2_1)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.T2S), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.T2S)) + 1);
                                        }
                                        if (sharespreader2_2)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.T2S), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.T2S)) + 1);
                                        }
                                        if (sharesinfected1_1)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.TFP), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.TFP)) + 1);
                                        }
                                        if (sharesinfected1_2)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.TFP), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.TFP)) + 1);
                                        }
                                        if (sharesinfected2_1)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.TFS), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.TFS)) + 1);
                                        }
                                        if (sharesinfected2_2)
                                        {
                                            PlayerSheet.SetSpreadStat(k, Stat2Int(StatType.TFS), PlayerSheet.GetSpreadStat(k, Stat2Int(StatType.TFS)) + 1);
                                        }

                                        Debug.Log(PlayerSheet.GetName(k) + " noticed a Trend!");
                                        Debug.Log(rTrend);
                                    }
                                }
                            }

                            // add statistics
                            //PlayerSheet.SetSpreadToday(j, (int) SpreadType.ID1, pair);
                        }
                    }
                }
            }
            // new day
            if ((i % 3) == 0)
            {
                for (int j = 0; j < 80; j++)
                {
                    PlayerSheet.SetSpreadToday(j, 0);
                }
                days++;
                daysText.text = "Days: " + days.ToString();
            }
            i++;

            yield return(new WaitForEndOfFrame());
        }

        // Deconstruct game
        DestroyChars();
        miniMap.SetActive(false);
        HUD.SetActive(false);

        // start result manager
        StartCoroutine(EndGame());
    }