private static void AdvanceManufactureProject(Base @base, ManufactureProject project) { var previousUnitsProduced = project.UnitsProduced; project.HoursCompleted += project.EngineersAllocated; var totalUnitsProduced = Math.Min(project.UnitsToProduce, project.HoursCompleted / project.ManufactureType.Metadata().HoursToProduce); var newUnitsProduced = totalUnitsProduced - previousUnitsProduced; foreach (var unit in Enumerable.Range(0, newUnitsProduced)) { project.CompleteUnit(@base); ++project.UnitsProduced; if (project.UnitsProduced == project.UnitsToProduce) break; var status = project.BeginUnitProduction(@base); if (status == ManufactureStatus.UnitStarted) continue; @base.ManufactureProjects.Remove(project); NotifyProductionStopped(@base, project, status); return; } if (project.UnitsProduced != project.UnitsToProduce) return; @base.ManufactureProjects.Remove(project); NotifyProductionCompleted(@base, project); }
public EditProduction(ManufactureProject production) { this.production = production; var selectedBase = GameState.SelectedBase; AddControl(new Border(25, 0, 320, 150, ColorScheme.LightMagenta, Backgrounds.Workshop, 1)); AddControl(new Label(35, Label.Center, production.ManufactureType.Metadata().Name, Font.Large, ColorScheme.LightMagenta)); AddControl(new Label(55, 16, "ENGINEERS AVAILABLE>", Font.Normal, ColorScheme.LightMagenta)); AddControl(new DynamicLabel(55, 113, () => selectedBase.EngineersAvailable.FormatNumber(), Font.Normal, ColorScheme.White)); AddControl(new Label(65, 16, "WORKSHOP SPACE AVAILABLE>", Font.Normal, ColorScheme.LightMagenta)); AddControl(new DynamicLabel(65, 139, () => selectedBase.WorkshopSpaceAvailable.FormatNumber(), Font.Normal, ColorScheme.White)); AddControl(new Label(75, 16, "Engineers", Font.Large, ColorScheme.LightMagenta)); AddControl(new Label(90, 16, "Allocated", Font.Large, ColorScheme.LightMagenta)); AddControl(new Label(85, 128, ">", Font.Large, ColorScheme.LightMagenta)); AddControl(new DynamicLabel(85, 135, () => production.EngineersAllocated.FormatNumber(), Font.Large, ColorScheme.White)); AddControl(new Label(75, 168, "Units to", Font.Large, ColorScheme.LightMagenta)); AddControl(new Label(90, 168, "Produce", Font.Large, ColorScheme.LightMagenta)); AddControl(new Label(85, 272, ">", Font.Large, ColorScheme.LightMagenta)); AddControl(new DynamicLabel(85, 279, () => production.UnitsToProduce.FormatNumber(), Font.Large, ColorScheme.White)); AddControl(new Label(114, 40, "INCREASE", Font.Normal, ColorScheme.LightMagenta)); AddControl(new Label(132, 40, "DECREASE", Font.Normal, ColorScheme.LightMagenta)); AddControl(new Repeater(108, 132, 13, 14, "U", ColorScheme.LightMagenta, Font.Arrow, OnIncreaseEngineers, 50)); AddControl(new Repeater(130, 132, 13, 14, "D", ColorScheme.LightMagenta, Font.Arrow, OnDecreaseEngineers, 50)); AddControl(new Label(114, 192, "INCREASE", Font.Normal, ColorScheme.LightMagenta)); AddControl(new Label(132, 192, "DECREASE", Font.Normal, ColorScheme.LightMagenta)); AddControl(new Repeater(108, 284, 13, 14, "U", ColorScheme.LightMagenta, Font.Arrow, OnIncreaseUnits, 50)); AddControl(new Repeater(130, 284, 13, 14, "D", ColorScheme.LightMagenta, Font.Arrow, OnDecreaseUnits, 50)); AddControl(new Button(150, 16, 135, 16, "STOP PRODUCTION", ColorScheme.Purple, Font.Normal, OnStopProduction)); AddControl(new Button(150, 168, 135, 16, "OK", ColorScheme.Purple, Font.Normal, EndModal)); }
public ProductionInformation(ManufactureType project, Action<ManufactureProject> action) { production = new ManufactureProject { ManufactureType = project, UnitsToProduce = 1 }; this.action = action; var metadata = project.Metadata(); AddControl(new Border(20, 0, 320, 160, ColorScheme.Blue, Backgrounds.Workshop, 1)); AddControl(new Label(30, Label.Center, metadata.Name, Font.Large, ColorScheme.Blue)); AddControl(new Label(50, 16, metadata.HoursToProduce.FormatNumber() + " Engineer hours to produce one unit", Font.Normal, ColorScheme.Blue)); AddControl(new Label(60, 16, "Cost per unit>$", Font.Normal, ColorScheme.Blue)); AddControl(new Label(60, 87, metadata.Cost.FormatNumber(), Font.Normal, ColorScheme.White)); AddControl(new Label(70, 16, "Work Space Required>", Font.Normal, ColorScheme.Blue)); AddControl(new Label(70, 112, metadata.SpaceRequired.FormatNumber(), Font.Normal, ColorScheme.White)); var specialMaterials = metadata.SpecialMaterials; if (specialMaterials.Any()) DisplaySpecialMaterials(specialMaterials); AddControl(new Button(155, 16, 135, 16, "CANCEL", ColorScheme.Blue, Font.Normal, EndModal)); if (production.CanProduce(GameState.SelectedBase) && metadata.SpaceRequired <= GameState.SelectedBase.WorkshopSpaceAvailable) AddControl(new Button(155, 168, 135, 16, "START PRODUCTION", ColorScheme.Blue, Font.Normal, OnStartProduction)); }
private static void NotifyProductionStopped(Base @base, ManufactureProject project, ManufactureStatus status) { GameState.Current.Notifications.Enqueue(() => { Screen.Geoscape.ResetGameSpeed(); new ProductionStopped(@base.Name, project.ManufactureType.Metadata().Name, status).DoModal(GameState.Current.ActiveScreen); }); }
private void OnStartProduction(ManufactureProject production) { SwitchToModal(new EditProduction(production)); }
private void OnSelectManufactureProject(ManufactureProject project) { new EditProduction(project).DoModal(this); }