예제 #1
0
        private static void LoadPlayers()
        {
            lock (players)
            {
                if (players.Count > 0)
                {
                    players.Clear();
                }

                string playersCodePath = hastingsDir + "code/players";

                string[] records = Directory.GetFiles(playersCodePath, "*.record", SearchOption.AllDirectories);

                foreach (string record in records)
                {
                    HastingsPlayer player = new HastingsPlayer();

                    using (StreamReader reader = new StreamReader(record))
                    {
                        player.Name    = reader.ReadLine();
                        player.Wins    = int.Parse(reader.ReadLine());
                        player.Losses  = int.Parse(reader.ReadLine());
                        player.Draws   = int.Parse(reader.ReadLine());
                        player.Uploads = int.Parse(reader.ReadLine());

                        reader.Close();
                    }

                    if (!players.ContainsKey(player.Name))
                    {
                        players.Add(player.Name, player);
                    }
                }

                // Load player code
                playerFiles.Clear();

                string[] files = Directory.GetFiles(hastingsDir + "code/players");
                foreach (string file in files)
                {
                    playerFiles.Add(file);
                }
            }
        }
예제 #2
0
        private static HastingsPlayer FindPlayer(Assignment assignment)
        {
            HastingsPlayer player = null;

            foreach (string file in assignment.FileNames)
            {
                if (file.Contains(".h"))
                {
                    player = new HastingsPlayer(assignment.Path + file);

                    if (players.ContainsKey(player.Name))
                    {
                        player = players[player.Name];
                    }
                }
            }

            return(player);
        }
예제 #3
0
        public static string BuildHastings(Assignment assignment)
        {
            string result = string.Empty;

            lock (players)
            {
                // find player that uploaded new code
                HastingsPlayer newPlayer = FindPlayer(assignment);

                if (newPlayer.Name.ToLower() == "ultron")
                {
                    result = "<p>Ultron was defeated by Vision. You must change your class name!</p>";
                }
                else if (newPlayer != null)
                {
                    // Copy all code to tmp directory
                    List <string> sourceFiles = new List <string>();
                    List <string> includeDirs = new List <string>();

                    includeDirs.Add(assignment.Path);
                    includeDirs.Add(hastingsDir + "code/");
                    includeDirs.Add(hastingsDir + "code/players/");

                    foreach (string file in hastingsFiles)
                    {
                        if (file.Contains(".cpp"))
                        {
                            sourceFiles.Add(file);
                        }
                    }

                    foreach (string file in playerFiles)
                    {
                        if (file.Contains(".cpp"))
                        {
                            sourceFiles.Add(file);
                        }
                    }

                    foreach (string file in assignment.FileNames)
                    {
                        if (file.Contains(".cpp"))
                        {
                            sourceFiles.Add(assignment.Path + file);
                        }
                    }

                    // Compile all *.cpp in tmp directory
                    string compileResult = Compiler.CompileCpp("hastings", assignment.Path, includeDirs, sourceFiles);
                    if (compileResult == "Success!!")
                    {
                        if (players.ContainsKey(newPlayer.Name))
                        {
                            players.Remove(newPlayer.Name);
                        }

                        players.Add(newPlayer.Name, newPlayer);

                        // delete win loss record for player
                        newPlayer.Wins   = 0;
                        newPlayer.Losses = 0;
                        newPlayer.Draws  = 0;
                        newPlayer.Uploads++;

                        SavePlayers();

                        // if successful, copy code to hastings directory
                        foreach (string file in assignment.FileNames)
                        {
                            if (File.Exists(hastingsDir + "code/players/" + file))
                            {
                                File.Delete(hastingsDir + "code/players/" + file);
                            }

                            File.Copy(assignment.Path + file, hastingsDir + "code/players/" + file);
                        }

                        LoadPlayers();

                        WriteSoldierFile();
                        WritePlayerInfoFile();

                        // rebuild hastings binary
                        sourceFiles.Clear();
                        includeDirs.Clear();
                        includeDirs.Add(hastingsDir + "code/");

                        foreach (string file in hastingsFiles)
                        {
                            if (file.Contains(".cpp"))
                            {
                                sourceFiles.Add(file);
                            }
                        }

                        foreach (string file in playerFiles)
                        {
                            if (file.Contains(".cpp"))
                            {
                                sourceFiles.Add(file);
                            }
                        }

                        string compileOutput = Compiler.CompileCpp(hastingsDir + "hastings", hastingsDir, includeDirs, sourceFiles);

                        Logger.Trace("Rebuild hastings: {0}", compileOutput);
                    }
                    else
                    {
                        result = compileResult;
                    }
                }
                else
                {
                    result = "Unknown player";
                }
            }

            if (!string.IsNullOrEmpty(result))
            {
                result = "<p>" + result + "</p>";
            }

            return(result);
        }