/// <summary> /// Parse the province training plan and queue its training orders /// </summary> /// <param name="province">The province where to place the unit training order</param> /// <param name="plan">Province training plan to process</param> private void ProcessProvinceTrainingPlan(Province province, ProvinceTrainingPlan plan) { List <UnitTrainingPlan> unitPlans = plan.GetUnitTrainingPlans(); for (int i = 0; i < unitPlans.Count; i++) { UnitTrainingOrder order = unitPlans[i].GetUnitTrainingOrder(); UnitType unitType = order.GetUnitType(); int quantity = order.GetQuantity(); if (quantity > 0) { FileLogger.Trace("AI", "Queueing " + quantity + " " + unitType.GetName() + "s (" + unitPlans[i].GetReason() + ") in " + province.GetName()); // re-evaluate training orders every turn, don't create standing training orders province.QueueTraining(unitType, quantity, false); } } }
/// <summary> /// Revise training plans of the cheapest units based on the money left and the existing training plan, if available /// </summary> /// <param name="province">The province for which to prepare unit training plans</param> /// <param name="budget">The amount of money available for spending</param> /// <param name="existingPlan">The province's current training plan</param> private void UpgradeTrainingFodderPlan(Province province, int budget, ProvinceTrainingPlan existingPlan) { // no money => good buy! if (budget <= 0) { return; } List <UnitType> trainable = province.GetTrainableUnits(); Dictionary <UnitType, int> trainingOrder = new Dictionary <UnitType, int>(); List <UnitType> fodder = province.GetCheapestToTrainUnits(); List <UnitType> expensives = new List <UnitType>(); for (int i = 0; i < trainable.Count; i++) { if (!fodder.Contains(trainable[i])) { trainingOrder[trainable[i]] = 0; expensives.Add(trainable[i]); } } if (trainingOrder.Count > 0) { List <UnitTrainingPlan> plans = existingPlan.GetUnitTrainingPlans(); for (int i = 0; i < plans.Count; i++) { if (plans[i].GetReason() == UnitTrainingPlan.Reason.FODDER) { int manpower = plans[i].GetManpowerCost(); int fodderCost = plans[i].GetUnitTypeTrainingCost(); for (int j = 0; j < manpower; j++) { int randomIndex = UnityEngine.Random.Range(0, expensives.Count); int costIncrease = expensives[randomIndex].GetTrainingCost() - fodderCost; if (budget >= costIncrease) { trainingOrder[expensives[randomIndex]] += 1; plans[i].DecreaseQuantity(); budget -= costIncrease; } if (budget <= 0) { break; } } } if (budget <= 0) { break; } } List <UnitTrainingPlan> newPlans = new List <UnitTrainingPlan>(); foreach (KeyValuePair <UnitType, int> entry in trainingOrder) { if (entry.Value > 0) { UnitTrainingOrder order = new UnitTrainingOrder(entry.Key, entry.Value, false); newPlans.Add(new UnitTrainingPlan(order, UnitTrainingPlan.Reason.CORE)); } } if (newPlans.Count > 0) { existingPlan.AddUnitTrainingPlans(newPlans); } } return; }