コード例 #1
0
ファイル: Workshop.cs プロジェクト: tihawk/ProjectPorcupine
        public override void FixedFrequencyUpdate(float deltaTime)
        {
            // if there is enough input, do the processing and store item to output
            // - remove items from input
            // - add param to reflect factory can provide output (has output inside)
            //   - as output will be produced after time, it is possible that output spot can be ocupied meanwhile
            // - process for specified time
            // - if output slot is free, provide output (if not, keep output 'inside' factory)
            if (ParentFurniture.IsBeingDestroyed)
            {
                return;
            }

            string curSetupChainName = CurrentProductionChainName.ToString();

            if (!string.IsNullOrEmpty(curSetupChainName))
            {
                ProductionChain prodChain = GetProductionChainByName(curSetupChainName);

                // if there is no processing in progress
                if (IsProcessing.ToInt() == 0)
                {
                    // check input slots for input inventory
                    List <KeyValuePair <Tile, int> > flaggedForTaking = CheckForInventoryAtInput(prodChain);

                    // if all the input requirements are ok, you can start processing:
                    if (flaggedForTaking.Count == prodChain.Input.Count)
                    {
                        // consume input inventory
                        ConsumeInventories(flaggedForTaking);

                        IsProcessing.SetValue(1); // check if it can be bool

                        // reset processing timer and set max time for processing for this prod. chain
                        CurrentProcessingTime.SetValue(0f);
                        MaxProcessingTime.SetValue(prodChain.ProcessingTime);
                    }
                }
                else
                {
                    // processing is in progress
                    CurrentProcessingTime.ChangeFloatValue(deltaTime);

                    if (CurrentProcessingTime.ToFloat() >=
                        MaxProcessingTime.ToFloat())
                    {
                        List <TileObjectTypeAmount> outPlacement = CheckForInventoryAtOutput(prodChain);

                        // if output placement was found for all products, place them
                        if (outPlacement.Count == prodChain.Output.Count)
                        {
                            PlaceInventories(outPlacement);
                            //// processing done, can fetch input for another processing
                            IsProcessing.SetValue(0);
                        }
                    }
                }
            }
        }
コード例 #2
0
ファイル: Workshop.cs プロジェクト: tihawk/ProjectPorcupine
        private void HaulingJobForInputs(ProductionChain prodChain)
        {
            bool isProcessing = IsProcessing.ToInt() > 0;

            //// for all inputs in production chain
            foreach (Item reqInputItem in prodChain.Input)
            {
                if (isProcessing && !reqInputItem.HasHopper)
                {
                    continue;
                }
                //// if there is no hauling job for input object type, create one
                Job    furnJob;
                string requiredType       = reqInputItem.ObjectType;
                bool   existingHaulingJob = ParentFurniture.Jobs.HasJobWithPredicate(x => x.RequestedItems.ContainsKey(requiredType), out furnJob);
                if (!existingHaulingJob)
                {
                    Tile inTile = World.Current.GetTileAt(
                        ParentFurniture.Tile.X + reqInputItem.SlotPosX,
                        ParentFurniture.Tile.Y + reqInputItem.SlotPosY,
                        ParentFurniture.Tile.Z);

                    // create job for desired input resource
                    string desiredInv    = reqInputItem.ObjectType;
                    int    desiredAmount = reqInputItem.Amount;

                    if (reqInputItem.HasHopper)
                    {
                        desiredAmount = PrototypeManager.Inventory.Get(desiredInv).maxStackSize;
                    }

                    if (inTile.Inventory != null && inTile.Inventory.Type == reqInputItem.ObjectType &&
                        inTile.Inventory.StackSize <= desiredAmount)
                    {
                        desiredAmount = desiredAmount - inTile.Inventory.StackSize;
                    }

                    if (desiredAmount > 0)
                    {
                        Job job = new Job(
                            inTile,
                            null,           // beware: passed jobObjectType is expected Furniture only !!
                            null,
                            0.4f,
                            new RequestedItem[] { new RequestedItem(desiredInv, desiredAmount, desiredAmount) },
                            Job.JobPriority.Medium,
                            false,
                            false,
                            false);

                        job.JobDescription = string.Format("Hauling '{0}' to '{1}'", desiredInv, ParentFurniture.Name);
                        job.OnJobWorked   += PlaceInventoryToWorkshopInput;
                        ParentFurniture.Jobs.Add(job);
                    }
                }
            }
        }
コード例 #3
0
 /// <summary>
 /// Makes sure sending messages to targets is running.
 /// </summary>
 protected void EnsureProcessing()
 {
     ForceProcessing = true;
     if (IsProcessing.TrySet())
     {
         Task.Factory.StartNew(Process, CancellationToken.None,
                               TaskCreationOptions.PreferFairness, options.TaskScheduler);
     }
 }
コード例 #4
0
ファイル: Workshop.cs プロジェクト: tihawk/ProjectPorcupine
        protected override void Initialize()
        {
            if (ParamsDefinitions == null)
            {
                // don't need definition for all furniture, just use defaults
                ParamsDefinitions = new WorkShopParameterDefinitions();
            }

            // check if context menu is needed
            if (PossibleProductions.Count > 1)
            {
                componentRequirements = Requirements.Production;

                WorkshopMenuActions = new List <ComponentContextMenu>();

                CurrentProductionChainName.SetValue(null);
                foreach (ProductionChain chain in PossibleProductions)
                {
                    string prodChainName = chain.Name;
                    WorkshopMenuActions.Add(new ComponentContextMenu()
                    {
                        Name     = prodChainName,
                        Function = ChangeCurrentProductionChain
                    });
                }
            }
            else
            {
                if (PossibleProductions.Count == 1)
                {
                    CurrentProductionChainName.SetValue(PossibleProductions[0].Name);
                }
                else
                {
                    Debug.ULogWarningChannel(ComponentLogChannel, "Furniture {0} is marked as factory, but has no production chain", ParentFurniture.Name);
                }
            }

            // add dynamic params here
            CurrentProcessingTime.SetValue(0);
            MaxProcessingTime.SetValue(0);
            IsProcessing.SetValue(0);

            ParentFurniture.Removed += WorkshopRemoved;
        }