public void Solve() { mission.EnlistTroops(); mission.troopsNeeded = mission.factory.GetNearbyEnemyThreats(); if (mission.troopsNeeded <= 0) { mission.successRating = MissionSuccessRating.Impossible; return; } List <Troop> finalEnlisted = new List <Troop>(); foreach (var troop in mission.acceptedMission) { mission.troopsNeeded -= troop.count; finalEnlisted.Add(troop); if (mission.troopsNeeded <= 0) { troop.count = troop.count + mission.troopsNeeded; mission.successRating = MissionSuccessRating.Possible; mission.finalEnlistedTroops = finalEnlisted; return; } } }
public void Solve() { mission.EnlistTroops(mission.type == MissionType.FinalReinforce); var troopsNeeded = mission.acceptedMission.Sum(t => t.count); //send all mission.successRating = MissionSuccessRating.Guaranteed; mission.finalEnlistedTroops = mission.acceptedMission.ToList(); mission.missionEndTime = Game.gameTime;//mission.finalEnlistedTroops.Last().endTime; }
public void Solve() { mission.EnlistTroops(mission.type == MissionType.Reinforce); int troopsNeeded = 0; if (mission.type == MissionType.IncSupport) { troopsNeeded += 10; //need 10 to increase production } if (mission.type == MissionType.Reinforce) { troopsNeeded = mission.acceptedMission.Sum(t => t.count); //send all mission.successRating = MissionSuccessRating.Guaranteed; mission.finalEnlistedTroops = mission.acceptedMission.ToList(); mission.missionEndTime = Game.gameTime;//mission.finalEnlistedTroops.Last().endTime; return; } List <Troop> finalEnlisted = new List <Troop>(); int enlistedCount = 0; foreach (var mockTestTroop in mission.acceptedMission) { enlistedCount += mockTestTroop.count; finalEnlisted.Add(mockTestTroop); if (enlistedCount >= troopsNeeded) { mockTestTroop.count -= (enlistedCount - troopsNeeded); mission.successRating = MissionSuccessRating.Guaranteed; mission.finalEnlistedTroops = finalEnlisted; mission.missionEndTime = mockTestTroop.endTime; return; } } }
public void Solve() { mission.EnlistTroops(); int troopsNeeded = 10 - mission.factory.armyAvailable; List <Troop> finalEnlisted = new List <Troop>(); int enlistedCount = 0; foreach (var mockTestTroop in mission.acceptedMission) { var turns = mockTestTroop.turns; var production = turns * mission.factory.production; mission.missionEndTime = mockTestTroop.endTime; if (production >= troopsNeeded) { mission.successRating = MissionSuccessRating.Guaranteed; mission.finalEnlistedTroops = finalEnlisted; return; //nothing to do here } enlistedCount += mockTestTroop.count; finalEnlisted.Add(mockTestTroop); if (enlistedCount + production >= troopsNeeded) { mockTestTroop.count -= Math.Max(0, (enlistedCount - (troopsNeeded + production))); mission.successRating = MissionSuccessRating.Guaranteed; mission.finalEnlistedTroops = finalEnlisted; return; } } }
public void Solve() { mission.EnlistTroops(); if (mission.acceptedMission.Count == 0) { mission.successRating = MissionSuccessRating.Impossible; return; } SortedSet <Troop> mockTroops = new SortedSet <Troop>(mission.factory.incoming); List <Troop> finalEnlisted = new List <Troop>(); Factory factory = mission.factory; foreach (var mockTestTroop in mission.acceptedMission) { mockTroops.Add(mockTestTroop); finalEnlisted.Add(mockTestTroop); mission.troopsUsed += mockTestTroop.count; mission.missionEndTime = mockTestTroop.endTime; FactoryState lastState = new FactoryState(factory, Game.gameTime); bool allyLock = factory.isAlly; int armyAvailable = allyLock ? factory.count : 0; var ordered = mockTroops.ToList(); //iterate through the mock states for (int i = 0; i < ordered.Count; i++) { Troop troop = ordered[i]; FactoryState newState = new FactoryState(lastState, troop); //if two troops arrives at the same time if (i + 1 < ordered.Count && troop.endTime == ordered[i + 1].endTime) { lastState = newState; continue; } if (allyLock && newState.isEnemy) { allyLock = false; break; } if (allyLock == false && newState.isAlly) { allyLock = true; armyAvailable = newState.count; } if (factory.isAlly && troop == mockTestTroop) { armyAvailable = newState.count; } armyAvailable = Math.Min(armyAvailable, newState.count); lastState = newState; } if (allyLock)//mission is possible { int finalStateCount = mockTestTroop.count - armyAvailable + 1; if (finalStateCount <= 0) { return; //we didn't need to send anything } if (mission.type == MissionType.Capture)//mission.factory.team == Team.Enemy) { if (MissionReward.GetCaptureProbability(mission, 1, mission.missionEndTime - Game.gameTime)) { mockTestTroop.count = mockTestTroop.count - armyAvailable + 1; //don't oversend finalStateCount = 1; lastState.count = 1; } else { if (!MissionReward.GetCaptureProbability(mission, finalStateCount, mission.missionEndTime - Game.gameTime)) { mission.successRating = MissionSuccessRating.Unlikely; continue; } } } else { mockTestTroop.count = mockTestTroop.count - armyAvailable + 1; //don't oversend } mission.troopsUsed += -armyAvailable + 1; mission.finalState = lastState; mission.successRating = mission.prereqs.Count > 0 ? MissionSuccessRating.HasPrereq : MissionSuccessRating.Possible; mission.finalEnlistedTroops = finalEnlisted; return; //job's done } else { mission.successRating = MissionSuccessRating.NotEnoughTroops; } } }