/// <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); }