Example #1
0
    int FillOverallStats(ExcelWorksheet ws, int row, ProjectStats stats)
    {
        foreach (CategoryStats catStat in stats.CategoriesStats)
        {
            SetSubcatHeaders(ws, row, catStat.Name);
            ws.Cells[row, 6].Value = catStat.TotalCount;
            ws.Cells[row, 7].Value = catStat.LocalTeamCount;
            ws.Cells[row, 9].Value = catStat.VisitorTeamCount;
            row++;

            foreach (SubCategoryStat subcatStat in catStat.SubcategoriesStats)
            {
                SetColoredHeaders(ws, row, subcatStat.Name, 3, 5, Color.DeepSkyBlue);
                row++;

                foreach (PercentualStat pStat in subcatStat.OptionStats)
                {
                    SetSubcatentriesHeaders(ws, row, pStat.Name);
                    ws.Cells[row, 6].Value = pStat.TotalCount;
                    ws.Cells[row, 7].Value = pStat.LocalTeamCount;
                    ws.Cells[row, 9].Value = pStat.VisitorTeamCount;
                    row++;
                }
            }
        }
        return(row);
    }
Example #2
0
 public TeamStatsSheet(ExcelWorksheet ws, ProjectStats stats, Team team)
 {
     this.ws    = ws;
     this.stats = stats;
     this.team  = team;
     playerRow  = new Dictionary <Player, int>();
 }
Example #3
0
        /*public static void Export(string name, ProjectStats projectStats, string directory)
         * {
         *  Export(name, projectStats, directory, new List<Package>(), new List<Language>());
         * }*/

        public static void Export(string name, ProjectStats projectStats, string directory, List <Package> packages, Language language, bool workstringOnly, bool workstringFallback)
        {
            Export(name, projectStats, directory, packages, new List <Language>()
            {
                language
            }, workstringOnly, workstringFallback);
        }
Example #4
0
        public ActionResult DeleteConfirmed(int id)
        {
            ProjectStats projectStats = db.ProjectStatuses.Find(id);

            db.ProjectStatuses.Remove(projectStats);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
Example #5
0
    public void Fill(ProjectStats stats)
    {
        int row = 1;

        row  = FillMatchDescription(ws, row, stats);
        row += 3;
        row  = FillTeamsData(ws, row, stats);
        row  = FillOverallStats(ws, row, stats);
    }
Example #6
0
 public ActionResult Edit([Bind(Include = "Id,Name")] ProjectStats projectStats)
 {
     if (ModelState.IsValid)
     {
         db.Entry(projectStats).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     return(View(projectStats));
 }
Example #7
0
 public void LoadStats(Project project)
 {
     if (stats != null)
     {
         stats.Dispose();
     }
     stats = new ProjectStats(project);
     categoriesviewer.LoadStats(stats);
     gameviewer.Project = project;
 }
Example #8
0
        private static ProjectStats GetStats(IEnumerable <Pip> pips, BuildGraph graph)
        {
            ProjectStats     stats       = default(ProjectStats);
            HashSet <string> inputFiles  = new HashSet <string>();
            HashSet <string> outputFiles = new HashSet <string>();

            foreach (Pip pip in pips)
            {
                Process process = pip as Process;

                if (process != null)
                {
                    stats.ProcessCount++;
                    foreach (int consumes in process.Consumes)
                    {
                        File f;
                        if (graph.Files.TryGetValue(consumes, out f))
                        {
                            inputFiles.Add(f.Location);
                        }
                    }

                    foreach (int produces in process.Produces)
                    {
                        File f;
                        if (graph.Files.TryGetValue(produces, out f))
                        {
                            outputFiles.Add(f.Location);
                        }
                    }

                    continue;
                }

                CopyFile copyFile = pip as CopyFile;
                if (copyFile != null)
                {
                    stats.CopyFileCount++;
                    continue;
                }

                WriteFile writeFile = pip as WriteFile;
                if (writeFile != null)
                {
                    stats.WriteFileCount++;
                    continue;
                }
            }

            stats.CppFileCount    = inputFiles.Where(f => f.EndsWith(".cpp", StringComparison.OrdinalIgnoreCase)).Count();
            stats.CsFileCount     = inputFiles.Where(f => f.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)).Count();
            stats.OutputFileCount = outputFiles.Count;

            return(stats);
        }
Example #9
0
        public ActionResult Create([Bind(Include = "Id,Name")] ProjectStats projectStats)
        {
            if (ModelState.IsValid)
            {
                db.ProjectStatuses.Add(projectStats);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            return(View(projectStats));
        }
Example #10
0
 int FillMatchDescription(ExcelWorksheet ws, int row, ProjectStats stats)
 {
     row = FillInfoData(ws, row, Catalog.GetString("Project"), stats.ProjectName);
     row = FillInfoData(ws, row, Catalog.GetString("Date"), stats.Date.ToShortDateString());
     row = FillInfoData(ws, row, Catalog.GetString("Competition"), stats.Competition);
     row = FillInfoData(ws, row, Catalog.GetString("Season"), stats.Season);
     row = FillInfoData(ws, row, Catalog.GetString("Local team"), stats.LocalTeam);
     row = FillInfoData(ws, row, Catalog.GetString("Visitor team"), stats.VisitorTeam);
     row = FillInfoData(ws, row, Catalog.GetString("Result"), stats.Results);
     return(row);
 }
Example #11
0
        public Project ParseProject(string projectJson, bool ignoreRemixes)
        {
            JObject projectObject    = JObject.Parse(projectJson);
            JObject remixObject      = (JObject)projectObject["remix"];
            JToken  remixRootToken   = remixObject["root"];
            JToken  remixParentToken = remixObject["parent"];
            bool    isRemixed        = false;
            int     remixParent      = 0;
            int     remixRoot        = 0;

            if (!string.IsNullOrEmpty(remixRootToken.ToString())) //Check if this is a remixed project
            {
                isRemixed = true;
                remixRoot = Int32.Parse(remixRoot.ToString());
                if (ignoreRemixes)
                {
                    return(null);
                }
            }
            if (!string.IsNullOrEmpty(remixParentToken.ToString()))
            {
                remixParent = Int32.Parse(remixParentToken.ToString());
                if (ignoreRemixes)
                {
                    return(null);
                }
                ;
            }
            if (projectObject["is_published"].Value <bool>() == false) //Check if the project is published (not private)
            {
                Console.WriteLine($"P: {projectObject["id"]}");
                return(null);
            }
            ProjectStats   projectStats   = Newtonsoft.Json.JsonConvert.DeserializeObject <ProjectStats>(projectObject["stats"].ToString());
            ProjectHistory projectHistory = Newtonsoft.Json.JsonConvert.DeserializeObject <ProjectHistory>(projectObject["history"].ToString());
            Project        toAdd          = new Project
            {
                Id             = Int32.Parse(projectObject["id"].ToString()),
                ProjectName    = projectObject["title"].ToString(),
                AuthorId       = 0,
                Author         = null,
                Created        = projectHistory.created,
                Modified       = projectHistory.modified,
                TotalViews     = projectStats.views,
                TotalFavorites = projectStats.favorites,
                TotalLoves     = projectStats.loves,
                Shared         = projectHistory.shared == null ? DateTime.MinValue : (DateTime)projectHistory.shared,
                IsRemix        = isRemixed,
                RemixParent    = remixParent,
                RemixRoot      = remixRoot
            };

            return(toAdd);
        }
Example #12
0
 public void LoadStats(Project project)
 {
     if (stats != null)
     {
         stats.Dispose();
     }
     stats = new ProjectStats(project);
     categoriesviewer.LoadStats(stats, project);
     gameviewer.LoadProject(project, stats);
     /* Player stats are filtered */
     playersviewer.LoadProject(project, new ProjectStats(project));
 }
Example #13
0
        // GET: ProjectStatses/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(RedirectToAction("Oops5", "Home", null));
            }
            ProjectStats projectStats = db.ProjectStatuses.Find(id);

            if (projectStats == null)
            {
                return(RedirectToAction("Oops5", "Home", null));
            }
            return(View(projectStats));
        }
Example #14
0
        public static void Export(string name, ProjectStats projectStats, string directory, List <Package> packages, List <Language> languages, bool workstringOnly, bool workstringFallback)
        {
            string path = Path.Combine(directory, name + ".txt");

            using (System.IO.StreamWriter file = new System.IO.StreamWriter(path, false, Encoding.Unicode))
            {
                foreach (var package in packages)
                {
                    projectStats.Packages.Add(package);
                }

                WriteStats(file, projectStats, languages, workstringOnly, workstringFallback);
            }
        }
Example #15
0
    public void AddMoneySpent(string owner, int amount)
    {
        ProjectStats dataOld = new ProjectStats();
        ProjectStats dataNew = new ProjectStats();

        foreach (ProjectStats playerdata in PlayerProjects)
        {
            if (playerdata.Player == owner)
            {
                dataNew = new ProjectStats(playerdata.Player, playerdata.Proposed, playerdata.Approved, playerdata.Denied, playerdata.Successful, playerdata.Failed, playerdata.MoneySpent + amount);
                dataOld = playerdata;
            }
        }
        PlayerProjects.Remove(dataOld);
        PlayerProjects.Add(dataNew);
    }
Example #16
0
        public void LoadStats(ProjectStats pstats)
        {
            TreeIter iter;

            store.Clear();
            foreach (CategoryStats cstats in pstats.CategoriesStats)
            {
                store.AppendValues(cstats, cstats.Name);
            }
            store.GetIterFirst(out iter);
            treeview.Selection.SelectIter(iter);
            categoryviewer1.HomeName = pstats.LocalTeam;
            categoryviewer1.AwayName = pstats.VisitorTeam;
            categoryviewer1.LoadBackgrounds(pstats.Field, pstats.HalfField, pstats.Goal);
            categoryviewer1.LoadStats(store.GetValue(iter, 0) as CategoryStats);
        }
Example #17
0
    int FillTeamsData(ExcelWorksheet ws, int row, ProjectStats stats)
    {
        ExcelRange cols = ws.Cells[row, 6, row, 10];

        cols.Style.Fill.PatternType = ExcelFillStyle.Solid;
        cols.Style.Fill.BackgroundColor.SetColor(Color.Red);
        cols.Dispose();

        ws.Cells[row, 6].Value          = Catalog.GetString("Total");
        ws.Cells[row, 7].Value          = stats.LocalTeam;
        ws.Cells[row, 9].Value          = stats.VisitorTeam;
        ws.Cells[row, 7, row, 8].Merge  = true;
        ws.Cells[row, 9, row, 10].Merge = true;
        row++;
        return(row);
    }
Example #18
0
        public void TestStats()
        {
            var userStats = new UserStats();

            Console.WriteLine(userStats.ToJson());
            var anonUserStats = new WithAnonymousDecorator(userStats);

            Console.WriteLine(anonUserStats.ToJson());


            var projectStats = new ProjectStats();

            Console.WriteLine(projectStats.ToJson());
            var projectStatsAnon = new WithAnonymousDecorator(projectStats);

            Console.WriteLine(projectStatsAnon.ToJson());
            Assert.Pass();
        }
Example #19
0
    public void Export()
    {
        FileInfo newFile = new FileInfo(filename);

        if (newFile.Exists)
        {
            newFile.Delete();              // ensures we create a new workbook
            newFile = new FileInfo(filename);
        }

        using (package = new ExcelPackage(newFile)) {
            TimelineSheet       timeline;
            TeamStatsSheet      teamStats;
            GameUnitsStatsSheet gu;
            ProjectStats        stats = new ProjectStats(project);

            ws = CreateSheet(package, Catalog.GetString("Project statistics"));
            var statsSheet = new ProjectStatsSheet(ws, project);
            statsSheet.Fill(stats);

            ws = CreateSheet(package, project.LocalTeamTemplate.TeamName +
                             "(" + Catalog.GetString("Local Team") + ")");
            teamStats = new TeamStatsSheet(ws, stats, Team.LOCAL);
            teamStats.Fill();

            ws = CreateSheet(package, project.VisitorTeamTemplate.TeamName +
                             "(" + Catalog.GetString("Visitor Team") + ")");
            teamStats = new TeamStatsSheet(ws, stats, Team.VISITOR);
            teamStats.Fill();

            ws       = CreateSheet(package, Catalog.GetString("Timeline"));
            timeline = new TimelineSheet(ws, project);
            timeline.Fill();

            ws = CreateSheet(package, Catalog.GetString("Game units"));
            gu = new GameUnitsStatsSheet(ws, stats);
            gu.Fill();

            package.Save();
        }
    }
Example #20
0
    public void AddProjectAction(string owner, string action)
    {
        ProjectStats dataOld = new ProjectStats();
        ProjectStats dataNew = new ProjectStats();

        foreach (ProjectStats playerdata in PlayerProjects)
        {
            if (playerdata.Player == owner)
            {
                switch (action)
                {
                case "Propose":
                    dataNew = new ProjectStats(playerdata.Player, playerdata.Proposed + 1, playerdata.Approved, playerdata.Denied, playerdata.Successful, playerdata.Failed, playerdata.MoneySpent);
                    break;

                case "Approve":
                    dataNew = new ProjectStats(playerdata.Player, playerdata.Proposed, playerdata.Approved + 1, playerdata.Denied, playerdata.Successful, playerdata.Failed, playerdata.MoneySpent);
                    break;

                case "Deny":
                    dataNew = new ProjectStats(playerdata.Player, playerdata.Proposed, playerdata.Approved, playerdata.Denied + 1, playerdata.Successful, playerdata.Failed, playerdata.MoneySpent);
                    break;

                case "Successful":
                    dataNew = new ProjectStats(playerdata.Player, playerdata.Proposed, playerdata.Approved, playerdata.Denied, playerdata.Successful + 1, playerdata.Failed, playerdata.MoneySpent);
                    break;

                case "Failed":
                    dataNew = new ProjectStats(playerdata.Player, playerdata.Proposed, playerdata.Approved, playerdata.Denied, playerdata.Successful, playerdata.Failed + 1, playerdata.MoneySpent);
                    break;
                }
                dataOld = playerdata;
            }
        }
        PlayerProjects.Remove(dataOld);
        PlayerProjects.Add(dataNew);
    }
Example #21
0
 public GameUnitsStatsSheet(ExcelWorksheet ws, ProjectStats stats)
 {
     this.stats = stats;
     this.ws    = ws;
 }
Example #22
0
        public List <Project> GetProjectsByUsername(string userName, bool ignoreRemixes = false)
        {
            string         apiEndpoint       = "https://api.scratch.mit.edu/users/" + userName + "/projects?limit=40&offset={0}";
            bool           endOfDataReached  = false;
            int            offset            = 0;
            List <Project> allProjectsOfUser = new List <Project>();

            try
            {
                while (!endOfDataReached)
                {
                    string specifiedApiEndpoint = string.Format(apiEndpoint, offset);
                    string returnedProjects     = JSONGetter.GetAsJSONString(specifiedApiEndpoint);
                    if (string.IsNullOrEmpty(returnedProjects))
                    {
                        break;
                    }
                    JArray parsedProjects = JArray.Parse(returnedProjects);
                    if (parsedProjects.Count == 0)
                    {
                        endOfDataReached = true;
                    }
                    foreach (var project in parsedProjects)
                    {
                        JObject projectObject    = JObject.Parse(project.ToString());
                        JObject remixObject      = (JObject)projectObject["remix"];
                        JToken  remixRootToken   = remixObject["root"];
                        JToken  remixParentToken = remixObject["parent"];
                        bool    isRemixed        = false;
                        int     remixParent      = 0;
                        int     remixRoot        = 0;
                        if (!string.IsNullOrEmpty(remixRootToken.ToString())) //Check if this is a remixed project
                        {
                            isRemixed = true;
                            remixRoot = Int32.Parse(remixRoot.ToString());
                            if (ignoreRemixes)
                            {
                                continue;
                            }
                        }
                        if (!string.IsNullOrEmpty(remixParentToken.ToString()))
                        {
                            remixParent = Int32.Parse(remixParentToken.ToString());
                            if (ignoreRemixes)
                            {
                                continue;
                            }
                        }
                        if (projectObject["is_published"].Value <bool>() == false) //Check if the project is published (not private)
                        {
                            Console.WriteLine($"P: {projectObject["id"]}");
                            continue;
                        }
                        ProjectStats   projectStats   = Newtonsoft.Json.JsonConvert.DeserializeObject <ProjectStats>(projectObject["stats"].ToString());
                        ProjectHistory projectHistory = Newtonsoft.Json.JsonConvert.DeserializeObject <ProjectHistory>(projectObject["history"].ToString());
                        Project        toAdd          = new Project
                        {
                            Id             = Int32.Parse(projectObject["id"].ToString()),
                            ProjectName    = projectObject["title"].ToString(),
                            AuthorId       = 0,
                            Author         = null,
                            Created        = projectHistory.created,
                            Modified       = projectHistory.modified,
                            TotalViews     = projectStats.views,
                            TotalFavorites = projectStats.favorites,
                            TotalLoves     = projectStats.loves,
                            Shared         = projectHistory.shared == null ? (DateTime)projectHistory.shared : DateTime.MinValue,
                            IsRemix        = isRemixed,
                            RemixParent    = remixParent,
                            RemixRoot      = remixRoot
                        };
                        allProjectsOfUser.Add(toAdd);
                    }

                    offset += 40;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return(allProjectsOfUser);
            }
            return(allProjectsOfUser);
        }
Example #23
0
        public static void CompareWrapperAndConvPhoneBuilds()
        {
            // TODO:= Set these paths if you intend on using this
            var wrapperTask = ReadGraph(@"D:\mimic\graphs\\DBuild.M.x86fre.json");
            var convTask    = ReadGraph(@"D:\mimic\graphs\PhonePartialNativeSpecX86fre.json");

            BuildGraph wrapperGraph = wrapperTask.Result;
            BuildGraph convGraph    = convTask.Result;

            Dictionary <string, Tuple <List <Pip>, List <Pip> > > pipsBySpec = new Dictionary <string, Tuple <List <Pip>, List <Pip> > >();
            HashSet <string> convertedPaths = new HashSet <string>();

            foreach (var pip in wrapperGraph.Pips.Values)
            {
                string relativeSpec = PrepareCollection(pip, pipsBySpec);
                if (relativeSpec == null)
                {
                    continue;
                }

                pipsBySpec[relativeSpec].Item1.Add(pip);
            }

            foreach (var pip in convGraph.Pips.Values)
            {
                string relativeSpec = PrepareCollection(pip, pipsBySpec);

                if (pip.Spec.EndsWith(ConvertedSpecName, StringComparison.OrdinalIgnoreCase))
                {
                    convertedPaths.Add(relativeSpec);
                }

                if (relativeSpec == null)
                {
                    continue;
                }

                pipsBySpec[relativeSpec].Item2.Add(pip);
            }

            Console.WriteLine("WrapperProcesses,WrapperCopyFile,WrapperWriteFile,WrapperOutputCount,WasConverted,ConvProcesses,ConvCopyFile,ConvWriteFile,CppCount,CsCount,ConvPrediction,SpecDir");
            foreach (var item in pipsBySpec)
            {
                ProjectStats wrapperStats = GetStats(item.Value.Item1, wrapperGraph);
                ProjectStats convStats    = GetStats(item.Value.Item2, convGraph);

                int convPrediction = 0;
                if (wrapperStats.CppFileCount > 0)
                {
                    convPrediction = wrapperStats.CppFileCount + 2;
                }
                else
                {
                    convPrediction = wrapperStats.ProcessCount;
                }

                bool wasConverted = convertedPaths.Contains(item.Key);

                Console.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11}", wrapperStats.ProcessCount, wrapperStats.CopyFileCount, wrapperStats.WriteFileCount, wrapperStats.OutputFileCount,
                                  wasConverted,
                                  convStats.ProcessCount, convStats.CopyFileCount, convStats.WriteFileCount,
                                  wrapperStats.CppFileCount, wrapperStats.CsFileCount,
                                  convPrediction,
                                  item.Key);
            }
        }
Example #24
0
        public static ProjectStats GatherStats(List <Dialogue> dialogues, Language language, DateTime dateFrom, bool workstringOnly, bool workstringFallback)
        {
            var projectStats = new ProjectStats();

            projectStats.RefDialogues = dialogues;

            foreach (Dialogue dialogue in dialogues)
            {
                foreach (DialogueNode dialogueNode in dialogue.ListNodes)   //No need for GetOrderedNodes here
                {
                    if (dialogueNode is DialogueNodeSentence)
                    {
                        var nodeSentence = (dialogueNode as DialogueNodeSentence);
                        if (nodeSentence.LastEditDate < dateFrom)
                        {
                            continue;
                        }

                        string text = nodeSentence.Sentence;
                        if (!workstringOnly)
                        {
                            TranslationEntry entry = dialogue.Translations.GetNodeEntry(dialogueNode, language);
                            if (entry == null)
                            {
                                if (!workstringFallback)
                                {
                                    continue;
                                }
                            }
                            else
                            {
                                text = entry.Text;
                            }
                        }

                        projectStats.AddSentence(dialogue, nodeSentence.SpeakerID, text);
                    }
                    else if (dialogueNode is DialogueNodeReply)
                    {
                        var nodeReply = (dialogueNode as DialogueNodeReply);
                        if (nodeReply.LastEditDate < dateFrom)
                        {
                            continue;
                        }

                        string text = nodeReply.Reply;
                        if (!workstringOnly)
                        {
                            TranslationEntry entry = dialogue.Translations.GetNodeEntry(dialogueNode, language);
                            if (entry == null)
                            {
                                if (!workstringFallback)
                                {
                                    continue;
                                }
                            }
                            else
                            {
                                text = entry.Text;
                            }
                        }

                        projectStats.AddReply(dialogue, text);
                    }
                }
            }

            return(projectStats);
        }
Example #25
0
        public static void WriteStats(TextWriter writer, ProjectStats projectStats, List <Language> languages, bool workstringOnly, bool workstringFallback)
        {
            var project = ResourcesHandler.Project;

            //Populate VoiceKit Stats
            Dictionary <string, VoiceKitStats> VoiceKits = new Dictionary <string, VoiceKitStats>();

            foreach (var kvp in projectStats.Actors)
            {
                string voiceKitName = (project.GetActorFromID(kvp.Key) != null) ? project.GetActorFromID(kvp.Key).VoiceKit : null;
                if (voiceKitName != null)
                {
                    VoiceKitStats voiceKitStats = VoiceKits.GetOrAdd(voiceKitName, (key) => new VoiceKitStats());
                    voiceKitStats.Words     += kvp.Value.Words;
                    voiceKitStats.Sentences += kvp.Value.Sentences;
                }
            }

            //Append project specific stats
            if (EditorCore.ProjectStats != null)
            {
                writer.WriteLine(EditorCore.ProjectStats(projectStats));
            }

            writer.WriteLine(" * Source");
            writer.WriteLine("");
            if (workstringOnly)
            {
                writer.WriteLine("Workstring only");
            }
            else
            {
                if (languages != null)
                {
                    foreach (var language in languages)
                    {
                        writer.WriteLine(String.Format("Language : {0}", language.Name));
                    }
                }
                if (workstringFallback)
                {
                    writer.WriteLine("Using Workstring fallback");
                }
            }
            writer.WriteLine("");
            foreach (var package in projectStats.Packages)
            {
                if (package != null)
                {
                    writer.WriteLine(String.Format("Package : {0}", package.Name));
                }
            }
            writer.WriteLine("");
            writer.WriteLine("");

            writer.WriteLine(" * General");
            writer.WriteLine("");
            writer.WriteLine(String.Format("Total Sentence Words : {0}", projectStats.SentenceWords));
            writer.WriteLine(String.Format("Total Sentences : {0}", projectStats.Sentences));
            writer.WriteLine(String.Format("Avg Words per Sentence : {0:0.0}", (float)projectStats.SentenceWords / (float)projectStats.Sentences));
            writer.WriteLine("");
            writer.WriteLine(String.Format("Total Reply Words : {0}", projectStats.ReplyWords));
            writer.WriteLine(String.Format("Total Replies : {0}", projectStats.Replies));
            writer.WriteLine(String.Format("Avg Words per Reply : {0:0.0}", (float)projectStats.ReplyWords / (float)projectStats.Replies));
            writer.WriteLine("");
            writer.WriteLine("");

            writer.WriteLine(" * Actors");
            writer.WriteLine("");
            foreach (var kvp in projectStats.Actors)
            {
                float avg = (float)kvp.Value.Words / (float)kvp.Value.Sentences;
                writer.WriteLine(String.Format("{0} (\"{1}\") :  {2} words  ({3:0.0} per sentence)", kvp.Key, project.GetActorName(kvp.Key), kvp.Value.Words, avg));
            }
            writer.WriteLine("");
            writer.WriteLine("");

            writer.WriteLine(" * VoiceKits");
            writer.WriteLine("");
            foreach (var kvp in VoiceKits)
            {
                float avg = (float)kvp.Value.Words / (float)kvp.Value.Sentences;
                writer.WriteLine(String.Format("{0} (\"{1}\") :  {2} words  ({3:0.0} per sentence)", kvp.Key, project.GetVoiceActorNameFromKit(kvp.Key), kvp.Value.Words, avg));
            }
            writer.WriteLine("");
            writer.WriteLine("");

            writer.WriteLine(" * Dialogues");
            writer.WriteLine("");
            foreach (var kvp in projectStats.Dialogues)
            {
                float avg = (float)kvp.Value.SentenceWords / (float)kvp.Value.Sentences;
                writer.WriteLine(String.Format("{0} :  {1} words  ({2:0.0} per sentence)", kvp.Key, kvp.Value.SentenceWords, avg));
            }
        }