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; }
public void CancelWorkOrder(int index) { var workOrder = workOrderQueue.Remove(index); resourcesManager.Refund(workOrder.cost); OnWorkOrderQueueUpdated?.Invoke(workOrderQueue.GetReadonlyList()); if (index == 0) { pendingCancel = true; } }
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()); } }