Пример #1
0
    private IEnumerator Work()
    {
        Working = true;

        while (workOrderQueue.Count > 0)
        {
            var workOrder = workOrderQueue.Peek();

            if (workOrder is RecruitmentWorkOrder)
            {
                var recruitmentCompleted = false;
                while (!recruitmentCompleted)
                {
                    if (populationManager.TryRecruit(workOrder as RecruitmentWorkOrder))
                    {
                        OnWorkOrderStarted?.Invoke();
                        yield return(WaitFor(workOrder.duration));

                        if (!pendingCancel)
                        {
                            Recruit(workOrder as RecruitmentWorkOrder);
                        }
                        else
                        {
                            populationManager.Cancel(workOrder as RecruitmentWorkOrder);
                        }

                        recruitmentCompleted = true;
                    }
                    else
                    {
                        recruitmentProcessStuck = true;
                        while (recruitmentProcessStuck)
                        {
                            yield return(null);
                        }
                    }
                }
            }
            else
            {
                OnWorkOrderStarted?.Invoke();
                yield return(WaitFor(workOrder.duration));
            }

            if (!pendingCancel)
            {
                workOrderQueue.Dequeue();
                OnWorkOrderQueueUpdated?.Invoke(workOrderQueue.GetReadonlyList());
            }
            else
            {
                pendingCancel = false;
            }
        }

        Working = false;
    }
Пример #2
0
    public void CancelWorkOrder(int index)
    {
        var workOrder = workOrderQueue.Remove(index);

        resourcesManager.Refund(workOrder.cost);
        OnWorkOrderQueueUpdated?.Invoke(workOrderQueue.GetReadonlyList());

        if (index == 0)
        {
            pendingCancel = true;
        }
    }
Пример #3
0
    public void BeginWorkOrder(WorkOrder workOrder)
    {
        if (!resourcesManager.TryPay(workOrder.cost))
        {
            ErrorManager.Instance.ShowError("Insufficient resources!");
            return;
        }

        workOrderQueue.Enqueue(workOrder);
        OnWorkOrderQueueUpdated?.Invoke(workOrderQueue.GetReadonlyList());

        if (!Working)
        {
            StartCoroutine(Work());
        }
    }