public static string validateProdTimer(string prodTimerString, out ProdTimer prodTimer)
        {
            if (prodTimerString == null || prodTimerString.Length == 0)
            {
                prodTimer = null;
                return(null);
            }
            else
            {
                string[] parameters      = prodTimerString.Split(',');
                int      currentTimer    = 0;
                int[]    countdownvalues = new int[4];
                int      i = 0;

                foreach (string aTimer in parameters)
                {
                    bool successfulParse = int.TryParse(aTimer, out currentTimer);
                    if (!successfulParse)
                    {
                        prodTimer = null;
                        return("Failure to parse prod timer");
                    }
                    else
                    {
                        countdownvalues[i] = currentTimer;
                        i++;
                    }
                }

                prodTimer = new ProdTimer(countdownvalues[0], countdownvalues[1], countdownvalues[2], countdownvalues[3]);
                return(null);
            }
        }
        private static ResultsObject createWagonData(List <Day> days, List <Player> allPlayers, bool sortBy, bool simple, bool lSort, int priorVCNumber, string flavorText, string deadlineCode, bool cleanDay, bool isRestCall, string colorCode, ProdTimer prodTimer, string fontOverride, bool areaTagsOn, string dividerOverride, bool showLLevel, bool showZeroCountWagons, List <DayviggedPlayer> dayviggedPlayers, List <ResurrectedPlayer> ressurrectedPlayers, List <Replacement> replacements)
        {
            VoteCount        vc          = null;
            History          history     = null;
            List <VoteCount> allVCs      = new List <VoteCount>();
            string           displayText = "[area=WAGONS(Sort By: " + (sortBy ? "Alphabetical" : "Chronological") + " Data Type: " + (simple ? "Simple" : "Complex") + " LSort: " + (lSort ? "On" : "Off") + ") ] Note from vote counter. These votes include any vote on or off that impacted said wagon.";

            if (days.Count == 0)
            {
                throw new System.Exception("No days found.");
            }

            int treestumpedPlayers = 0;
            int gunnerPlayers      = 0;

            foreach (Player player in allPlayers)
            {
                if (player.IsTreestumped)
                {
                    treestumpedPlayers++;
                }
                if (player.IsGunner)
                {
                    gunnerPlayers++;
                }
            }

            for (int i = 0; i < days.Count; i++)
            {
                days[i].Votes.Sort();

                System.Console.WriteLine("Players In Game: " + allPlayers.Count + " PlayersAlive()/Treestumped: " + allPlayers.numAlive() + "Threshold: " + ((int)(Math.Floor((double)(allPlayers.numAlive() - treestumpedPlayers - gunnerPlayers) / 2)) + 1));
                vc = new VoteCount(days[i].Number, allPlayers, (((int)Math.Floor((double)(allPlayers.numAlive() - treestumpedPlayers - gunnerPlayers) / 2)) + 1), days, isRestCall);



                List <DayviggedPlayer>   tempDayvigs            = new List <DayviggedPlayer>(dayviggedPlayers.DeepClone <List <DayviggedPlayer> >());
                List <ResurrectedPlayer> tempResurrectedPlayers = new List <ResurrectedPlayer>(ressurrectedPlayers.DeepClone <List <ResurrectedPlayer> >());
                foreach (Vote vote in days[i].Votes)
                {
                    foreach (DayviggedPlayer dv in dayviggedPlayers)
                    {
                        if (dv.PostNumber < vote.PostNumber)
                        {
                            tempDayvigs.Remove(dv);
                            Player playerdayvigged = Player.FindPlayerByNameUserAidReplacementsLoop(allPlayers, dv.Player.Name, replacements);
                            if (playerdayvigged.IsAlive)
                            {
                                vc.doVote(new Vote(playerdayvigged, new Player("UNVOTE: "), dv.PostNumber, vote.Timestamp, false, null), vc.MaxThreshold, lSort, sortBy);
                                playerdayvigged.IsAlive = false;
                                playerdayvigged.IsDead  = true;
                                vc.MaxThreshold         = (((int)Math.Floor((double)(allPlayers.numAlive() - treestumpedPlayers - gunnerPlayers) / 2)) + 1);
                            }
                        }
                    }

                    dayviggedPlayers = new List <DayviggedPlayer>();
                    foreach (DayviggedPlayer dvt in tempDayvigs)
                    {
                        dayviggedPlayers.Add(dvt);
                    }
                    foreach (ResurrectedPlayer rt in ressurrectedPlayers)
                    {
                        if (rt.PostNumber < vote.PostNumber)
                        {
                            tempResurrectedPlayers.Remove(rt);
                            Player playerRessurected = Player.FindPlayerByNameUserAidReplacementsLoop(allPlayers, rt.Player.Name, replacements);
                            if (playerRessurected.IsDead)
                            {
                                vc.doVote(new Vote(playerRessurected, new Player("UNVOTE: "), rt.PostNumber, vote.Timestamp, false, null), vc.MaxThreshold, lSort, sortBy);
                                playerRessurected.IsAlive = true;
                                playerRessurected.IsDead  = false;
                                vc.MaxThreshold           = (((int)Math.Floor((double)(allPlayers.numAlive() - treestumpedPlayers - gunnerPlayers) / 2)) + 1);
                            }
                        }
                    }

                    ressurrectedPlayers = new List <ResurrectedPlayer>();
                    foreach (ResurrectedPlayer rpt in tempResurrectedPlayers)
                    {
                        ressurrectedPlayers.Add(rpt);
                    }
                    vc.doVote(vote, vc.MaxThreshold, lSort, sortBy);

                    if (vc.IsHammered)
                    {
                        break;
                    }
                }

                vc.buildLatest(vc.DayNumber, priorVCNumber, flavorText, deadlineCode, (days[vc.DayNumber - 1].DeathsOvernight) != null ? days[vc.DayNumber - 1].DeathsOvernight.Count : 0, colorCode, days[i].PostNumberStart, days[i].PostNumberEnd, prodTimer, fontOverride, areaTagsOn, dividerOverride, showLLevel, showZeroCountWagons);

                days[i].performDeathsOvernight();
                foreach (Player player in allPlayers)
                {
                    foreach (Player deadPlayer in days[i].DeathsOvernight)
                    {
                        if (deadPlayer.Name.Equals(player.Name))
                        {
                            player.IsAlive = false;
                            player.IsDead  = true;
                        }
                    }
                }



                allVCs.Add(vc);
                history     = new History(vc.Wagons, lSort, isRestCall);
                displayText = displayText + history.buildDisplayString(days[i].Number, simple);
            }

            displayText = displayText + "[/area]";

            if (allVCs == null)
            {
                throw new ArgumentNullException("NO VCs generated");
            }

            if (displayText == null)
            {
                throw new ArgumentNullException("No display Text");
            }


            return(new ResultsObject(allVCs, displayText, cleanDay));
        }
        private static string validateAllUserInputs(string playerText, string replacementText, string dayPostStartList, string deadPlayerListText, string dayviggedListText, string resurrectedListText, string moderatorNamesText, string priorVCNumberText, string flavorInput, string deadLineInput, string voteOverrideText, string prodTimerString, out List <Player> players, out List <Replacement> replacements, out List <string> moderatorNames, out List <int> dayStartPostNumbers, out List <List <Player> > nightkilledPlayers, out List <DayviggedPlayer> dayViggedPlayers, out List <ResurrectedPlayer> resurrectedPlayers, out int priorVCNumber, out string flavorText, out string deadlineCode, out List <Vote> votesByOverride, out ProdTimer prodTimer)
        {
            string        errorList = null;
            List <string> allErrors = new List <string>();


            List <Player>            playersDone             = null;
            List <Replacement>       replacementsDone        = null;
            List <int>               dayStartPostNumbersDone = null;
            List <List <Player> >    nightkilledPlayersDone  = null;
            List <DayviggedPlayer>   dayViggedPlayersDone    = null;
            List <ResurrectedPlayer> resurrectedPlayersDone  = null;
            List <string>            moderatorNamesDone      = null;
            int         priorVCNumberDone   = -314;
            string      flavorTextDone      = null;
            string      deadlineCodeDone    = null;
            List <Vote> votesByOverrideDone = null;
            ProdTimer   prodTimerDone       = null;

            try
            {
                errorList = null;

                allErrors.Add(validatePlayerList(playerText, out playersDone));
                if (playersDone == null)
                {
                    allErrors.Add("No players found.");
                }
                else
                {
                    allErrors.Add(validateReplacementsList(replacementText, out replacementsDone));
                    allErrors.Add(validateDayPostNumbers(dayPostStartList, out dayStartPostNumbersDone));
                    allErrors.Add(validateDeaths(deadPlayerListText, playersDone, replacementsDone, out nightkilledPlayersDone));
                    allErrors.Add(validateDayviggedPlayers(dayviggedListText, playersDone, replacementsDone, out dayViggedPlayersDone));
                    allErrors.Add(validateResurrectedPlayers(resurrectedListText, playersDone, replacementsDone, out resurrectedPlayersDone));
                    allErrors.Add(validateModeratorNames(moderatorNamesText, out moderatorNamesDone));
                    allErrors.Add(validatePriorVCNumber(priorVCNumberText, out priorVCNumberDone));
                    allErrors.Add(validateFlavorText(flavorInput, out flavorTextDone));
                    allErrors.Add(validateDeadline(deadLineInput, out deadlineCodeDone));
                    allErrors.Add(validateVoteOverrideData(voteOverrideText, playersDone, replacementsDone, out votesByOverrideDone));
                    allErrors.Add(validateProdTimer(prodTimerString, out prodTimerDone));
                }

                string finalErrorMessage = string.Empty;
                foreach (string errorString in allErrors)
                {
                    if (errorString != null)
                    {
                        finalErrorMessage = finalErrorMessage + errorString + "\n";
                    }
                }
                if (finalErrorMessage.Equals(string.Empty))
                {
                    players             = playersDone;
                    replacements        = replacementsDone;
                    dayStartPostNumbers = dayStartPostNumbersDone;
                    nightkilledPlayers  = nightkilledPlayersDone;
                    dayViggedPlayers    = dayViggedPlayersDone;
                    resurrectedPlayers  = resurrectedPlayersDone;
                    moderatorNames      = moderatorNamesDone;
                    priorVCNumber       = priorVCNumberDone;
                    flavorText          = flavorTextDone;
                    deadlineCode        = deadlineCodeDone;
                    votesByOverride     = votesByOverrideDone;
                    prodTimer           = prodTimerDone;
                    return(null);
                }
                else
                {
                    players             = null;
                    replacements        = null;
                    dayStartPostNumbers = null;
                    nightkilledPlayers  = null;
                    dayViggedPlayers    = null;
                    resurrectedPlayers  = null;
                    moderatorNames      = null;
                    priorVCNumber       = -314;
                    flavorText          = null;
                    deadlineCode        = null;
                    votesByOverride     = null;
                    prodTimer           = null;
                    return(finalErrorMessage.Trim());
                }
            }
            catch (Exception e)
            {
                players             = null;
                replacements        = null;
                dayStartPostNumbers = null;
                nightkilledPlayers  = null;
                dayViggedPlayers    = null;
                resurrectedPlayers  = null;
                moderatorNames      = null;
                priorVCNumber       = -314;
                flavorText          = null;
                deadlineCode        = null;
                votesByOverride     = null;
                prodTimer           = null;
                return("An error occured in validating the data: " + e.Message);
            }
        }