public Vector3Int GetPosition()
        {
            if (WalkingTo == StorageType.Crate)
            {
                foreach (var location in ClosestLocations)
                {
                    if (!LastCratePosition.Contains(location) &&
                        !InProgress.Contains(location) &&
                        StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) &&
                        inv.IsAlmostFull &&
                        inv.StorageTypeLookup[StorageType.Stockpile].Count > 0)
                    {
                        CurrentCratePosition = location;
                        InProgress.Add(location);
                        break;
                    }
                }

                // No new goal. go back to job pos.
                if (CurrentCratePosition == Vector3Int.invalidPos)
                {
                    return(PorterJob.OriginalPosition);
                }

                return(CurrentCratePosition);
            }
            else
            {
                return(StorageFactory.GetStockpilePosition(Job.Owner).Position);
            }
        }
Beispiel #2
0
 public void StartQuest(Quest quest)
 {
     Unstarted.Remove(quest);
     InProgress.Add(quest);
     quest.StartQuest();
     Debug.Log("Quest " + quest.QuestName + " has started");
     Debug.Log("Next task " + quest.CurrentTask());
 }
Beispiel #3
0
        public void Track(ushort step, TasksManager manager)
        {
            if (manager == null)
            {
                throw new ArgumentNullException(nameof(manager));
            }

            ToDo.Add(step, manager.ToDo.Count);
            InProgress.Add(step, manager.InProgress.Count);
            Done.Add(step, manager.Done.Count);
            Cancelled.Add(step, manager.Cancelled.Count);
        }
        public Vector3Int GetPosition()
        {
            if (WalkingTo == StorageType.Crate)
            {
                // check for full crates. ensure they get serviced first
                foreach (var location in ClosestLocations)
                {
                    if (!LastCratePosition.Contains(location) &&
                        !InProgress.Contains(location) &&
                        StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) &&
                        inv.IsAlmostFull &&
                        inv.StorageTypeLookup[StorageType.Stockpile].Count > 0)
                    {
                        CurrentCratePosition = location;
                        InProgress.Add(location);
                        break;
                    }
                }

                // No new goal. just take anything
                if (CurrentCratePosition == Vector3Int.invalidPos)
                {
                    foreach (var location in ClosestLocations)
                    {
                        if (!LastCratePosition.Contains(location) &&
                            !InProgress.Contains(location) &&
                            StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) &&
                            inv.StorageTypeLookup[StorageType.Stockpile].Count > 0)
                        {
                            CurrentCratePosition = location;
                            InProgress.Add(location);
                            break;
                        }
                    }
                }

                // everything is empty stand at job.
                if (CurrentCratePosition == Vector3Int.invalidPos)
                {
                    return(PorterJob.OriginalPosition);
                }

                return(CurrentCratePosition);
            }
            else
            {
                return(StorageFactory.GetStockpilePosition(Job.Owner).Position);
            }
        }
Beispiel #5
0
        /// <summary>
        ///     Add a task directly in AverageInProgress
        /// </summary>
        /// <param name="task"></param>
        public void AddInProgress(SymuTask task)
        {
            if (task is null)
            {
                throw new ArgumentNullException(nameof(task));
            }

            InProgress.Add(task);
            // We don't want to track message as Task
            if (task.Parent is Message)
            {
                return;
            }

            TaskResult.TotalTasksNumber++;
            TaskResult.InProgress++;
            task.SetTasksManager(this);
        }
Beispiel #6
0
 /// <summary>
 /// Распределение задач по коллекциям
 /// </summary>
 private void Distribution()
 {
     foreach (PlannerTask task in Queue)
     {
         if (task.TaskStatus == State.Waiting)
         {
             Waiting.Add(task);
         }
         if (task.TaskStatus == State.InProgress)
         {
             InProgress.Add(task);
         }
         if (task.TaskStatus == State.Perfomed)
         {
             Perfomed.Add(task);
         }
     }
 }
Beispiel #7
0
        /// <summary>
        ///     Push the task in progress
        /// </summary>
        /// <param name="task"></param>
        public void SetInProgress(SymuTask task)
        {
            if (task is null)
            {
                throw new ArgumentNullException(nameof(task));
            }

            ToDo.Remove(task);
            InProgress.Add(task);
            OnAfterSetTaskInProgress?.Invoke(this, new TaskEventArgs(task));
            // We don't want to track message as Task
            if (task.Parent is Message)
            {
                return;
            }

            TaskResult.ToDo--;
            TaskResult.InProgress++;
        }
        /// <inheritdoc/>
        protected override TAssociate CreateCustomAssociate <TKey1, TKey2, TAssociate>()
        {
            Pair <Type> keyTypePair = new Pair <Type>(typeof(TKey1), typeof(TKey2));

            if (InProgress.ContainsKey(keyTypePair))
            {
                throw new InvalidOperationException(Strings.ExRecursiveAssociateLookupDetected);
            }
            InProgress.Add(keyTypePair, true);
            try {
                TAssociate associate = base.CreateCustomAssociate <TKey1, TKey2, TAssociate>();
                if (associate != null)
                {
                    return(associate);
                }
                IAdvancedConverterFactory <TKey1> f1 = base.GetAssociate <TKey1, IAdvancedConverterFactory <TKey1>, IAdvancedConverterFactory <TKey1> >();
                if (f1 != null)
                {
                    associate = f1.CreateForwardConverter <TKey2>() as TAssociate;
                    if (associate != null)
                    {
                        return(associate);
                    }
                }
                IAdvancedConverterFactory <TKey2> f2 = base.GetAssociate <TKey2, IAdvancedConverterFactory <TKey2>, IAdvancedConverterFactory <TKey2> >();
                if (f2 != null)
                {
                    associate = f2.CreateBackwardConverter <TKey1>() as TAssociate;
                    if (associate != null)
                    {
                        return(associate);
                    }
                }
                return(null);
            }
            finally {
                InProgress.Remove(keyTypePair);
            }
        }
        /// <summary>
        /// Creates associate instance for specified parameter and result types.
        /// </summary>
        /// <typeparam name="TKey">Type to create the associate for.</typeparam>
        /// <typeparam name="TAssociate">Type of result to create the associate for.</typeparam>
        /// <param name="foundFor">The type associate was found for.</param>
        /// <returns>Newly created instance of associate, if found;
        /// otherwise, <see langword="null"/>.</returns>
        /// <exception cref="InvalidOperationException">Recursive associate lookup.</exception>
        protected virtual TAssociate CreateAssociate <TKey, TAssociate>(out Type foundFor)
            where TAssociate : class
        {
            if (InProgress == null)
            {
                InProgress = new SetSlim <TypePair>();
            }
            var progressionMark = new TypePair(typeof(TKey), typeof(TAssociate));

            if (InProgress.Contains(progressionMark))
            {
                throw new InvalidOperationException(Strings.ExRecursiveAssociateLookupDetected);
            }
            InProgress.Add(progressionMark);
            try {
                var associate = TypeHelper.CreateAssociate <TAssociate>(
                    typeof(TKey), out foundFor, TypeSuffixes, constructorParams, highPriorityLocations);
                return(associate);
            }
            finally {
                InProgress.Remove(progressionMark);
            }
        }
        public void PerformGoal(ref NPCBase.NPCState state)
        {
            state.JobIsDone = true;

            if (WalkingTo == StorageType.Stockpile)
            {
                if (CrateFull)
                {
                    Job.NPC.Inventory.Dump(Job.Owner.Stockpile);
                    CrateFull = false;
                }

                WalkingTo = StorageType.Crate;
                var nexPos = Vector3Int.invalidPos;

                foreach (var location in ClosestLocations)
                {
                    if (!LastCratePosition.Contains(location) &&
                        !InProgress.Contains(location) &&
                        StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) &&
                        !inv.IsAlmostFull &&
                        ItemsNeeded.TryGetValue(location, out var itemsNeeded))
                    {
                        nexPos = location;
                        InProgress.Add(location);

                        var addToInv  = StorageFactory.TryTakeItems(Job.Owner, itemsNeeded.Values);
                        var leftovers = new List <StoredItem>();

                        foreach (var item in addToInv)
                        {
                            if (Job.NPC.Inventory.Full)
                            {
                                leftovers.Add(item);
                            }
                            else
                            {
                                Job.NPC.Inventory.Add(item);
                            }
                        }

                        StorageFactory.StoreItems(Job.Owner, leftovers);
                        break;
                    }
                }

                CurrentCratePosition = nexPos;

                if (nexPos == Vector3Int.invalidPos)
                {
                    LastCratePosition.Clear();
                    state.SetCooldown(5);
                }
                else
                {
                    state.SetCooldown(1);
                    state.SetIndicator(new Shared.IndicatorState(5, ItemId.GetItemId(StockpileBlock.Name).Id));
                }
            }
            else
            {
                if (StorageFactory.CrateLocations[Job.Owner].TryGetValue(CurrentCratePosition, out var crateInventory))
                {
                    WalkingTo = StorageType.Stockpile;
                    var leftovers = crateInventory.TryAdd(Job.NPC.Inventory.Inventory.Select(ii => new StoredItem(ii, int.MaxValue, StorageType.Crate)).ToArray());
                    state.SetCooldown(1);
                    state.SetIndicator(new Shared.IndicatorState(5, ColonyBuiltIn.ItemTypes.CRATE.Id));
                    if (leftovers.Count > 0)
                    {
                        Job.NPC.Inventory.Inventory.Clear();

                        foreach (var item in leftovers)
                        {
                            Job.NPC.Inventory.Add(item);
                        }

                        CrateFull = true;
                    }
                }
                else
                {
                    CrateFull = true;
                    state.SetCooldown(1);
                    state.SetIndicator(new Shared.IndicatorState(5, ColonyBuiltIn.ItemTypes.CRATE.Id, false, false));
                }
            }
        }