/// <summary>
            /// Set the activity that this shipyard complex will undertake.
            /// </summary>
            /// <param name="NewActivity">New Activity to perform.</param>
            /// <param name="RetoolTarget">Retool target if any</param>
            /// <param name="CapLimit">Capacity Expansion Limit if any.</param>
            public void SetShipyardActivity(Faction CurrentFaction, Constants.ShipyardInfo.ShipyardActivity NewActivity, ShipClassTN RetoolTarget = null, int CapLimit = -1)
            {
                decimal[] mCost = new decimal[(int)Constants.Minerals.MinerialNames.MinerialCount];
                float DaysInYear = (float)Constants.TimeInSeconds.RealYear / (float)Constants.TimeInSeconds.Day;

                /// <summary>
                /// These are declared here since each switch case is considered to be on the same level of scope and just putting them in the first case doesn't seem quite right.
                /// </summary>
                float YearsOfProduction = 0.0f;
                int TimeToBuild = 0;
                DateTime EstTime;
                TimeSpan TS;

                /// <summary>
                /// If an order for adding a set amount of tons is canceled while in progress, credit the tons that were built to the shipyard.
                /// </summary>
                if(CurrentActivity.Progress != 0.0m && CurrentActivity.Activity != Constants.ShipyardInfo.ShipyardActivity.NoActivity)
                {
                    int TonsToAdd = 0;
                    switch (CurrentActivity.Activity)
                    {
                        case Constants.ShipyardInfo.ShipyardActivity.Add500Tons:
                            TonsToAdd = (int)Math.Round((float)CurrentActivity.Progress * 500.0f);
                            break;
                        case Constants.ShipyardInfo.ShipyardActivity.Add1000Tons:
                            TonsToAdd = (int)Math.Round((float)CurrentActivity.Progress * 1000.0f);
                            break;
                        case Constants.ShipyardInfo.ShipyardActivity.Add2000Tons:
                            TonsToAdd = (int)Math.Round((float)CurrentActivity.Progress * 2000.0f);
                            break;
                        case Constants.ShipyardInfo.ShipyardActivity.Add5000Tons:
                            TonsToAdd = (int)Math.Round((float)CurrentActivity.Progress * 5000.0f);
                            break;
                        case Constants.ShipyardInfo.ShipyardActivity.Add10000Tons:
                            TonsToAdd = (int)Math.Round((float)CurrentActivity.Progress * 10000.0f);
                            break;
                    }

                    if (TonsToAdd != 0)
                    {
                        AddTonnage(CurrentFaction, Tonnage);
                    }
                }

                switch (NewActivity)
                {
                    case Constants.ShipyardInfo.ShipyardActivity.AddSlipway:
                        decimal TotalSlipwayCost = 0.0m;
                        for (int MineralIterator = 0; MineralIterator < Constants.Minerals.NO_OF_MINERIALS; MineralIterator++)
                        {
                            if (Constants.ShipyardInfo.MineralCostOfExpansion[MineralIterator] != 0)
                            {
                                int Adjustment = 1;
                                if (ShipyardType == Constants.ShipyardInfo.SYType.Naval)
                                    Adjustment = 10;

                                /// <summary>
                                /// Formula for tonnage expansion. This also appears in the constants file for now.
                                /// </summary>
                                decimal value = Constants.ShipyardInfo.MineralCostOfExpansion[MineralIterator] * (Tonnage / Constants.ShipyardInfo.TonnageDenominator) * Slipways * Adjustment;
                                mCost[MineralIterator] = value;
                                TotalSlipwayCost = TotalSlipwayCost + value;
                            }
                        }

                        YearsOfProduction = (float)TotalSlipwayCost / CalcAnnualSYProduction();
                        EstTime = GameState.Instance.GameDateTime;
                        if (YearsOfProduction < Constants.Colony.TimerYearMax)
                        {
                            TimeToBuild = (int)Math.Floor(YearsOfProduction * DaysInYear);
                            TS = new TimeSpan(TimeToBuild, 0, 0, 0);
                            EstTime = EstTime.Add(TS);
                        }

                        CurrentActivity = new ShipyardActivity(NewActivity, TotalSlipwayCost, mCost, EstTime);
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.Add500Tons:
                        SetExpansion(NewActivity, 500, mCost, DaysInYear);
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.Add1000Tons:
                        SetExpansion(NewActivity, 1000, mCost, DaysInYear);
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.Add2000Tons:
                        SetExpansion(NewActivity, 2000, mCost, DaysInYear);
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.Add5000Tons:
                        SetExpansion(NewActivity, 5000, mCost, DaysInYear);
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.Add10000Tons:
                        SetExpansion(NewActivity, 10000, mCost, DaysInYear);
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.Retool:
                        /// <summary>
                        /// One free retool. Hypothetically this shipyard was built with this shipclass in mind.
                        /// </summary>
                        if (AssignedClass == null && RetoolTarget != null)
                        {
                            AssignedClass = RetoolTarget;
                            if (AssignedClass.IsLocked == false)
                                AssignedClass.IsLocked = true;
                        }
                        /// <summary>
                        /// Lengthy retool process as the shipyard converts to build the new vessel.
                        /// </summary>
                        else if(AssignedClass != null && RetoolTarget != null)
                        {
                            /// <summary>
                            /// Caclulate the cost of this retool:
                            /// </summary>
                            decimal CostToRetool = 0.5m * RetoolTarget.BuildPointCost + ((0.25m * RetoolTarget.BuildPointCost) * Slipways);
                            mCost[(int)Constants.Minerals.MinerialNames.Duranium] = CostToRetool / 2.0m;
                            mCost[(int)Constants.Minerals.MinerialNames.Neutronium] = CostToRetool / 2.0m;

                            /// <summary>
                            /// How long will this retool take?
                            /// </summary>
                            YearsOfProduction = (float)CostToRetool / CalcAnnualSYProduction();
                            EstTime = GameState.Instance.GameDateTime;
                            if (YearsOfProduction < Constants.Colony.TimerYearMax)
                            {
                                TimeToBuild = (int)Math.Floor(YearsOfProduction * DaysInYear);
                                TS = new TimeSpan(TimeToBuild, 0, 0, 0);
                                EstTime = EstTime.Add(TS);
                            }
                            CurrentActivity = new ShipyardActivity(NewActivity, CostToRetool, mCost, EstTime, RetoolTarget);

                            if (RetoolTarget.IsLocked == false)
                                RetoolTarget.IsLocked = true;
                        }
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.CapExpansion:
                        CurrentActivity = new ShipyardActivity(NewActivity);
                        break;
                    case Constants.ShipyardInfo.ShipyardActivity.CapExpansionUntilX:
                        if (CapLimit > Tonnage)
                        {
                            SetExpansion(NewActivity, (CapLimit - Tonnage), mCost, DaysInYear);
                            CurrentActivity.CapExpansionLimit = CapLimit;
                        }
                        break;
                }
            }
            /// <summary>
            /// Helper function for repetitive code.
            /// </summary>
            /// <param name="NewActivity">Activity to set</param>
            /// <param name="tons">How many tons should the yard be expanded by?</param>
            /// <param name="mCost">Mineral cost variable that this function will fill out.</param>
            /// <param name="DaysInYear">this should probably be a constant somewhere.</param>
            private void SetExpansion(Constants.ShipyardInfo.ShipyardActivity NewActivity, int tons, decimal [] mCost, float DaysInYear)
            {
                decimal TotalCost = 0.0m;
                for (int MineralIterator = 0; MineralIterator < (int)Constants.Minerals.MinerialNames.MinerialCount; MineralIterator++)
                {

                    if (Constants.ShipyardInfo.MineralCostOfExpansion[MineralIterator] != 0)
                    {
                        int Adjustment = 1;
                        if (ShipyardType == Constants.ShipyardInfo.SYType.Naval)
                        {
                            Adjustment = Constants.ShipyardInfo.NavalToCommercialRatio;
                        }

                        /// <summary>
                        /// Formula for tonnage expansion. This also appears in the constants file for now.
                        /// </summary>
                        decimal value = Constants.ShipyardInfo.MineralCostOfExpansion[MineralIterator] * (tons / Constants.ShipyardInfo.TonnageDenominator) * Slipways * Adjustment;
                        mCost[MineralIterator] = value;
                        TotalCost = TotalCost + value;
                    }
                    else
                        mCost[MineralIterator] = 0.0m;
                }

                float YearsOfProduction = (float)TotalCost / CalcAnnualSYProduction();
                DateTime EstTime = GameState.Instance.GameDateTime;
                if (YearsOfProduction < Constants.Colony.TimerYearMax)
                {
                    int TimeToBuild = (int)Math.Floor(YearsOfProduction * DaysInYear);
                    EstTime = GameState.Instance.GameDateTime;
                    TimeSpan TS = new TimeSpan(TimeToBuild, 0, 0, 0);
                    EstTime = EstTime.Add(TS);
                }

                CurrentActivity = new ShipyardActivity(NewActivity, TotalCost, mCost, EstTime);
            }
            /// <summary>
            /// Constructor for shipyard information
            /// </summary>
            /// <param name="Type"></param>
            public ShipyardInformation(Faction CurrentFaction, Constants.ShipyardInfo.SYType Type, int Number)
            {
                switch (Type)
                {
                    case Constants.ShipyardInfo.SYType.Commercial:
                        Name = "Commercial Yard #" + Number.ToString();
                        Tonnage = Constants.ShipyardInfo.BaseShipyardTonnage * Constants.ShipyardInfo.NavalToCommercialRatio;
                        break;
                    case Constants.ShipyardInfo.SYType.Naval:
                        Name = "Naval Yard #" + Number.ToString();
                        Tonnage = Constants.ShipyardInfo.BaseShipyardTonnage;
                        break;
                    default:
                        Name = "Unknown Shipyard Type #" + Number.ToString();
                        break;
                }
                
                ShipyardType = Type;
                AssignedClass = null;

                BuildingShips = new BindingList<ShipyardTask>();
                CurrentActivity = new ShipyardActivity();

                Tonnage = Constants.ShipyardInfo.BaseShipyardTonnage;
                Slipways = 1;
                AssignedClass = null;

                UpdateModRate(CurrentFaction);
            }