//Constructor
 public GameController(MainController mainController)
 {
     MainController = mainController;
     AIController = new AIController(this);
     ResetGame();
 }
        //Functions
        public static void Read(string domain, MainController mainController)
        {
            string[] lines = System.IO.File.ReadAllLines(domain);
            string[,] characters = new string[lines[0].Length, lines.Length];

            int numLines = lines.Length;
            int numChars = 0;

            for (int i = 0; i < numLines; i++) //making a 2 dimensional array of characters
            {
                Debug.WriteLine("");
                string[] line = lines[i].ToCharArray().Select( c => c.ToString()).ToArray(); //string array van losse characters
                if (numChars == 0)
                    numChars = line.Length;
                for (int j = 0; j < numChars; j++)
                {
                    characters[j, i] = line[j];
                    Debug.Write(line[j]);
                }
            }

            Debug.WriteLine("");

            Model.Field[,] fields = new Model.Field[(numLines + 1) / 2, (numChars / 4) - 1];

            mainController.MakeGrid((numLines + 1) / 2, (numChars / 4) - 1);

            for (int i = 0; i < numLines; i++)
            {
                if (i % 2 == 0) //only parse even lines, uneven lines are all connector lines.
                {
                    int returnTo = 0;
                    int.TryParse(characters[0, i], out returnTo);

                    bool barricadeAllowed = false;
                    if (characters[1, i] == "B")
                    {
                        barricadeAllowed = true;
                    }

                    for (int j = 1; j < numChars / 4; j++)
                    {
                        Model.Field exitN = null;
                        Model.Field exitW = null;

                        if (i != 0)
                        {
                            if (characters[(j * 4) + 1, i - 1] == "|")
                            {
                                Debug.WriteLine("ExitN found");
                                if (characters[(j * 4) + 1, i - 2] == "|") //Removing the need for linking fields. Only works for vertical long links!
                                {
                                    Debug.WriteLine("EXITN 1 extra up!");
                                    exitN = fields[j - 1, (i / 2) - 2];
                                }
                                else
                                {
                                    exitN = fields[j - 1, (i / 2) - 1];
                                }
                                mainController.DrawField("LinkUp", j - 1, (i / 2));
                            }
                        }

                        if (j > 1)
                        {
                            if (characters[(j * 4) - 1, i] == "-")
                            {
                                Debug.WriteLine("ExitW found");
                                exitW = fields[j - 2, (i/2)];
                                mainController.DrawField("LinkLeft", j - 1, (i / 2));
                            }
                        }

                        switch (characters[(j * 4), i]) //vakjes aanmaken.
                        {
                            case "<":
                                if (characters[(j * 4) + 1, i] == " ") //goal
                                {
                                    Model.GoalField goalField = new Model.GoalField(exitN, null, null, exitW, j - 1, (i / 2));
                                    fields[j - 1, (i / 2)] = goalField;
                                    mainController.DrawField("GoalField", j - 1, (i / 2));
                                    goalField.finishGame += mainController.FinishGame;
                                    break;
                                }
                                int numForest;
                                if (int.TryParse(characters[(j * 4) + 1, i], out numForest)) //forest
                                {
                                    fields[j - 1, (i / 2)] = new Model.Forest(exitN, null, null, exitW, numForest, j - 1, (i / 2));
                                    mainController.DrawField("Forest", j - 1, (i / 2));
                                    mainController.RegisterForest((Model.Forest)fields[j - 1, (i / 2)]);
                                    break;
                                }
                                //else startfield
                                fields[j - 1, (i / 2)] = new Model.StartField(exitN, null, null, exitW, characters[(j * 4) + 1, i], j - 1, (i / 2));
                                mainController.RegisterStartField((Model.StartField)fields[j - 1, (i / 2)]);
                                mainController.DrawField("StartField", j - 1, (i / 2));
                                break;
                            case "(":
                                fields[j - 1, (i / 2)] = new Model.Field(exitN, null, null, exitW, barricadeAllowed, returnTo, j - 1, (i / 2));
                                mainController.DrawField("Field", j - 1, (i / 2));
                                break;
                            case "[":
                                fields[j - 1, (i / 2)] = new Model.BarricadeField(exitN, null, null, exitW, barricadeAllowed, returnTo, j - 1, (i / 2));
                                mainController.DrawField("BarricadeField", j - 1, (i / 2));
                                break;
                            case "{":
                                fields[j - 1, (i / 2)] = new Model.SafeField(exitN, null, null, exitW, barricadeAllowed, returnTo, j - 1, (i / 2));
                                mainController.DrawField("SafeField", j - 1, (i / 2));
                                break;
                            case " ":
                                if (characters[(j * 4) + 1, i] == "|")
                                {
                                    mainController.DrawField("LinkField", j - 1, (i / 2));
                                }
                                break;
                        }

                        if (fields[j - 1, (i / 2)] != null)
                        {
                            fields[j - 1, (i / 2)].broadcastMove += mainController.BroadcastMove;
                        }

                        switch (characters[(j * 4) + 1, i])
                        {
                            case "*":
                                mainController.MakeBarricade(fields[j - 1, (i / 2)]);
                                break;
                            case "R":
                            case "Y":
                            case "G":
                            case "B":
                                mainController.MakePawn(characters[(j * 4) + 1, i], fields[j - 1, (i / 2)]);
                                break;
                        }
                    }
                }
            }

            mainController.DrawAllMovables();
        }