void Awake()
    {
        thisLoggingID = loggingID++;

        //transform.Find("Background").GetComponent<MeshRenderer>().material.color = new Color(1, 0.1f, 0.1f);

        ButtonTL.GetComponent <MeshRenderer>().material.color = new Color(0, 0, 0);
        ButtonTR.GetComponent <MeshRenderer>().material.color = new Color(0, 0, 0);
        ButtonBL.GetComponent <MeshRenderer>().material.color = new Color(0, 0, 0);
        ButtonBR.GetComponent <MeshRenderer>().material.color = new Color(0, 0, 0);

        GetComponent <KMBombModule>().OnActivate += Init;
    }
    void Init()
    {
        ButtonTL.OnInteract += delegate() { ButtonTL.AddInteractionPunch(); return(false); };
        ButtonTR.OnInteract += delegate() { ButtonTR.AddInteractionPunch(); return(false); };
        ButtonBL.OnInteract += delegate() { ButtonBL.AddInteractionPunch(); return(false); };
        ButtonBR.OnInteract += delegate() { ButtonBR.AddInteractionPunch(); return(false); };

        List <KMSelectable> buttons = new List <KMSelectable>()
        {
            ButtonTL, ButtonTR, ButtonBL, ButtonBR
        };
        int i      = 0;
        int TLtype = -1;

        while (buttons.Count > 0)
        {
            int pos = Random.Range(0, buttons.Count);
            if (pos == 0 && TLtype == -1)
            {
                Debug.Log("[Simon States #" + thisLoggingID + "] Dominant: " + COL_LIST[i]);
                TLtype = i;
            }
            KMSelectable b = buttons[pos];
            if (i == 0)
            {
                ButtonRed = b;
                b.GetComponent <MeshRenderer>().material.color = DARKRED;
                b.OnInteract += HandleRed;
            }
            else if (i == 1)
            {
                ButtonYellow = b;
                b.GetComponent <MeshRenderer>().material.color = DARKYELLOW;
                b.OnInteract += HandleYellow;
            }
            else if (i == 2)
            {
                ButtonGreen = b;
                b.GetComponent <MeshRenderer>().material.color = DARKGREEN;
                b.OnInteract += HandleGreen;
            }
            else
            {
                ButtonBlue = b;
                b.GetComponent <MeshRenderer>().material.color = DARKBLUE;
                b.OnInteract += HandleBlue;
            }
            i++;
            buttons.RemoveAt(pos);
        }

        int len = 4;

        PuzzleDisplay = new bool[len][];
        for (int a = 0; a < len; a++)
        {
            PuzzleDisplay[a] = new bool[4];
            int num = Random.Range(1, 5);
            if (num > 2)
            {
                num = Random.Range(2, 5);
            }
            List <int> posList = new List <int>()
            {
                0, 1, 2, 3
            };
            while (num > 0)
            {
                num--;
                int pos = Random.Range(0, posList.Count);
                PuzzleDisplay[a][posList[pos]] = true;
                posList.RemoveAt(pos);
            }
            string col = "";
            if (PuzzleDisplay[a][0])
            {
                col += COL_LIST[0];
            }
            else
            {
                col += "-";
            }
            if (PuzzleDisplay[a][1])
            {
                col += COL_LIST[1];
            }
            else
            {
                col += "-";
            }
            if (PuzzleDisplay[a][2])
            {
                col += COL_LIST[2];
            }
            else
            {
                col += "-";
            }
            if (PuzzleDisplay[a][3])
            {
                col += COL_LIST[3];
            }
            else
            {
                col += "-";
            }
            Debug.Log("[Simon States #" + thisLoggingID + "] Stage " + (a + 1) + " colours: " + col);
        }

        Answer = new int[len];

        bool R = false, Y = false, B = false, G = false;

        for (int a = 0; a < len; a++)
        {
            int numFlashed = 0;
            for (int z = 0; z < 4; z++)
            {
                if (PuzzleDisplay[a][z])
                {
                    numFlashed++;
                }
            }
            int numUniquePressed = 0;
            if (R)
            {
                numUniquePressed++;
            }
            if (Y)
            {
                numUniquePressed++;
            }
            if (G)
            {
                numUniquePressed++;
            }
            if (B)
            {
                numUniquePressed++;
            }
            if (a == 0)
            {
                if (numFlashed == 1)
                {
                    if (PuzzleDisplay[0][0])
                    {
                        Answer[0] = 0;
                    }
                    else if (PuzzleDisplay[0][1])
                    {
                        Answer[0] = 1;
                    }
                    else if (PuzzleDisplay[0][2])
                    {
                        Answer[0] = 2;
                    }
                    else
                    {
                        Answer[0] = 3;
                    }
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 1: One flashed, press it (" + Answer[0] + ":" + COL_LIST[Answer[0]] + ")");
                }
                else if (numFlashed == 2)
                {
                    if (PuzzleDisplay[0][3])
                    {
                        for (int z = 0; z < 4; z++)
                        {
                            if (PuzzleDisplay[0][PRIORITY[TLtype][z]])
                            {
                                Answer[0] = PRIORITY[TLtype][z];
                                break;
                            }
                        }
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 1: Two flashed with blue, press highest (" + Answer[0] + ":" + COL_LIST[Answer[0]] + ")");
                    }
                    else
                    {
                        Answer[0] = 3;
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 1: Two flashed without blue, press blue (3:B)");
                    }
                }
                else if (numFlashed == 3)
                {
                    if (PuzzleDisplay[0][0])
                    {
                        for (int z = 3; z >= 0; z--)
                        {
                            if (PuzzleDisplay[0][PRIORITY[TLtype][z]])
                            {
                                Answer[0] = PRIORITY[TLtype][z];
                                break;
                            }
                        }
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 1: Three flashed including red, press lowest (" + Answer[0] + ":" + COL_LIST[Answer[0]] + ")");
                    }
                    else
                    {
                        Answer[0] = 0;
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 1: Three flashed excluding red, press red (0:R)");
                    }
                }
                else
                {
                    Answer[0] = PRIORITY[TLtype][1];
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 1: Four flashed, press second highest (" + Answer[0] + ":" + COL_LIST[Answer[0]] + ")");
                }
            }
            else if (a == 1)
            {
                if (numFlashed == 2)
                {
                    if (PuzzleDisplay[1][0] && PuzzleDisplay[1][3])
                    {
                        for (int z = 0; z < 4; z++)
                        {
                            if (!PuzzleDisplay[1][PRIORITY[TLtype][z]])
                            {
                                Answer[1] = PRIORITY[TLtype][z];
                                break;
                            }
                        }
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 2: Red and blue flashed, press highest out of yellow and green (" + Answer[1] + ":" + COL_LIST[Answer[1]] + ")");
                    }
                    else
                    {
                        for (int z = 3; z >= 0; z--)
                        {
                            if (!PuzzleDisplay[1][PRIORITY[TLtype][z]])
                            {
                                Answer[1] = PRIORITY[TLtype][z];
                                break;
                            }
                        }
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 2: Two flashed including yellow or green, press lowest that didn't flash (" + Answer[1] + ":" + COL_LIST[Answer[1]] + ")");
                    }
                }
                else if (numFlashed == 1)
                {
                    if (!PuzzleDisplay[1][3])
                    {
                        Answer[1] = 3;
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 2: One flashed but not blue, press blue (3:B)");
                    }
                    else
                    {
                        Answer[1] = 1;
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 2: Blue flashed, press yellow (1:Y)");
                    }
                }
                else if (numFlashed == 4)
                {
                    Answer[1] = Answer[0];
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 2: Four flashed, press stage 1 (" + Answer[1] + ":" + COL_LIST[Answer[1]] + ")");
                }
                else
                {
                    if (!PuzzleDisplay[1][0])
                    {
                        Answer[1] = 0;
                    }
                    else if (!PuzzleDisplay[1][1])
                    {
                        Answer[1] = 1;
                    }
                    else if (!PuzzleDisplay[1][2])
                    {
                        Answer[1] = 2;
                    }
                    else
                    {
                        Answer[1] = 3;
                    }
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 2: Three flashed, press whatever didn't flash (" + Answer[1] + ":" + COL_LIST[Answer[1]] + ")");
                }
            }
            else if (a == 2)
            {
                if (numFlashed == 3)
                {
                    if ((PuzzleDisplay[2][0] && R) || (PuzzleDisplay[2][1] && Y) ||
                        (PuzzleDisplay[2][2] && G) || (PuzzleDisplay[2][3] && B))
                    {
                        for (int z = 0; z < 4; z++)
                        {
                            int trueVal = PRIORITY[TLtype][z];
                            if (PuzzleDisplay[2][trueVal])
                            {
                                if (trueVal == 0 && !R)
                                {
                                    Answer[2] = 0;
                                    break;
                                }
                                else if (trueVal == 1 && !Y)
                                {
                                    Answer[2] = 1;
                                    break;
                                }
                                else if (trueVal == 2 && !G)
                                {
                                    Answer[2] = 2;
                                    break;
                                }
                                else if (trueVal == 3 && !B)
                                {
                                    Answer[2] = 3;
                                    break;
                                }
                            }
                        }
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 3: Three flashed and one was pressed, press highest unpressed that flashed (" + Answer[2] + ":" + COL_LIST[Answer[2]] + ")");
                    }
                    else
                    {
                        for (int z = 0; z < 4; z++)
                        {
                            if (PuzzleDisplay[2][PRIORITY[TLtype][z]])
                            {
                                Answer[2] = PRIORITY[TLtype][z];
                                break;
                            }
                        }
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 3: Three flashed and weren't pressed, press highest that flashes (" + Answer[2] + ":" + COL_LIST[Answer[2]] + ")");
                    }
                }
                else if (numFlashed == 2)
                {
                    if ((PuzzleDisplay[2][0] && !R) || (PuzzleDisplay[2][1] && !Y) ||
                        (PuzzleDisplay[2][2] && !G) || (PuzzleDisplay[2][3] && !B))
                    {
                        Answer[2] = Answer[0];
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 3: Two flashed and at least one unpressed, press stage 1 (" + Answer[2] + ":" + COL_LIST[Answer[2]] + ")");
                    }
                    else
                    {
                        for (int z = 3; z >= 0; z--)
                        {
                            if (!PuzzleDisplay[2][PRIORITY[TLtype][z]])
                            {
                                Answer[2] = PRIORITY[TLtype][z];
                                break;
                            }
                        }
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 3: Two flashed and both pressed, press lowest no-flash (" + Answer[2] + ":" + COL_LIST[Answer[2]] + ")");
                    }
                }
                else if (numFlashed == 1)
                {
                    if (PuzzleDisplay[2][0])
                    {
                        Answer[2] = 0;
                    }
                    else if (PuzzleDisplay[2][1])
                    {
                        Answer[2] = 1;
                    }
                    else if (PuzzleDisplay[2][2])
                    {
                        Answer[2] = 2;
                    }
                    else
                    {
                        Answer[2] = 3;
                    }
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 3: One flashed, press it (" + Answer[2] + ":" + COL_LIST[Answer[2]] + ")");
                }
                else
                {
                    Answer[2] = PRIORITY[TLtype][2];
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 3: Four flashed, press second lowest (" + Answer[2] + ":" + COL_LIST[Answer[2]] + ")");
                }
            }
            else if (a == 3)
            {
                if (numUniquePressed == 3)
                {
                    if (!R)
                    {
                        Answer[3] = 0;
                    }
                    else if (!Y)
                    {
                        Answer[3] = 1;
                    }
                    else if (!G)
                    {
                        Answer[3] = 2;
                    }
                    else
                    {
                        Answer[3] = 3;
                    }
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 4: Three unique pressed, press other (" + Answer[3] + ":" + COL_LIST[Answer[3]] + ")");
                }
                else if (numFlashed == 3)
                {
                    int unpressed = 4;
                    if (!R && PuzzleDisplay[3][0])
                    {
                        unpressed = 0;
                    }
                    if (!Y && PuzzleDisplay[3][1])
                    {
                        if (unpressed == 4)
                        {
                            unpressed = 1;
                        }
                        else
                        {
                            unpressed = -1;
                        }
                    }
                    if (unpressed != -1 && !G && PuzzleDisplay[3][2])
                    {
                        if (unpressed == 4)
                        {
                            unpressed = 2;
                        }
                        else
                        {
                            unpressed = -1;
                        }
                    }
                    if (unpressed != -1 && !B && PuzzleDisplay[3][3])
                    {
                        if (unpressed == 4)
                        {
                            unpressed = 3;
                        }
                        else
                        {
                            unpressed = -1;
                        }
                    }
                    if (unpressed >= 0 && unpressed < 4)
                    {
                        Answer[3] = unpressed;
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 4: Three flashed and exactly one unpressed, press it (" + Answer[3] + ":" + COL_LIST[Answer[3]] + ")");
                    }
                    else
                    {
                        Answer[3] = PRIORITY[TLtype][3];
                        Debug.Log("[Simon States #" + thisLoggingID + "] Stage 4: Three flashed and not exactly one unpressed, press lowest (" + Answer[3] + ":" + COL_LIST[Answer[3]] + ")");
                    }
                }
                else if (numFlashed == 4)
                {
                    Answer[3] = PRIORITY[TLtype][3];
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 4: Four flashed, press lowest (" + Answer[3] + ":" + COL_LIST[Answer[3]] + ")");
                }
                else if (numFlashed == 1)
                {
                    if (PuzzleDisplay[3][0])
                    {
                        Answer[3] = 0;
                    }
                    else if (PuzzleDisplay[3][1])
                    {
                        Answer[3] = 1;
                    }
                    else if (PuzzleDisplay[3][2])
                    {
                        Answer[3] = 2;
                    }
                    else
                    {
                        Answer[3] = 3;
                    }
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 4: One flashed, press it (" + Answer[3] + ":" + COL_LIST[Answer[3]] + ")");
                }
                else
                {
                    Answer[3] = 2;
                    Debug.Log("[Simon States #" + thisLoggingID + "] Stage 4: Two flashed, press green (2:G)");
                }
            }
            if (Answer[a] == 0)
            {
                R = true;
            }
            if (Answer[a] == 1)
            {
                Y = true;
            }
            if (Answer[a] == 2)
            {
                G = true;
            }
            if (Answer[a] == 3)
            {
                B = true;
            }
        }
    }