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);
        }
예제 #2
0
 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));
 }
예제 #3
0
        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);
     });
 }
예제 #5
0
 private void OnStartProduction(ManufactureProject production)
 {
     SwitchToModal(new EditProduction(production));
 }
예제 #6
0
 private void OnSelectManufactureProject(ManufactureProject project)
 {
     new EditProduction(project).DoModal(this);
 }