private FactoryDetail FindClosestFactory(FactoryDetail targetFactory) { var distancesFromTargetFactory = FactoryDistance[targetFactory.EntityId]; var myFactories = FactoryDetailList.Where(x => x.Owner == 1); if (!myFactories.Any()) { return(null); } var minDistance = 30; FactoryDetail closestFactory = null; //todo - improvement: I might be able to get rid of the loop if I add the destination array to each object for each factory // gets the closest factory foreach (var myFactory in myFactories) { if (distancesFromTargetFactory[myFactory.EntityId] < minDistance && targetFactory.EntityId != myFactory.EntityId) { minDistance = distancesFromTargetFactory[myFactory.EntityId]; closestFactory = myFactory; } } return(closestFactory); }
private void BuildTroopList(FactoryDetail targetFactory) { var troopToSend = BuildTroop(targetFactory); if (troopToSend != null) { TroopListToSend.Add(troopToSend); } }
private Troop BuildTroop(FactoryDetail sourceFactory, FactoryDetail targetFactory) { var troopToSend = new Troop { SourceFactory = sourceFactory.EntityId, TargetFactory = targetFactory.EntityId, NumberOfCyborg = targetFactory.NumberOfCyborgPresent + 2 }; targetFactory.NumberOfCyborgPresent -= troopToSend.NumberOfCyborg; //UpdateCyborgNumberInFactory(troopToSend); return(troopToSend); }
public Troop BuildTroop(FactoryDetail targetFactory) { var closestFactoryWithBiggerArmy = FindClosestFactoryWithBiggerArmy(targetFactory); if (closestFactoryWithBiggerArmy != null) { var troopToSend = new Troop { SourceFactory = closestFactoryWithBiggerArmy.EntityId, TargetFactory = targetFactory.EntityId, NumberOfCyborg = targetFactory.NumberOfCyborgPresent + 2 }; UpdateCyborgNumberInFactory(troopToSend); return(troopToSend); } return(null); }
public FactoryDetail FindClosestFactoryWithBiggerArmy(FactoryDetail targetFactory) { DebugMessage("Target: " + targetFactory.EntityId); var distancesFromTargetFactory = FactoryDistance[targetFactory.EntityId]; var myFactories = FactoryDetailList.Where(x => x.Owner == 1).ToList(); if (!myFactories.Any()) { return(null); } var minDistance = 30; FactoryDetail factoryDetail = null; //todo - improvement: I might be able to get rid of the loop if I add the destination array to each object for each factory // gets the closest factory foreach (var myFactory in myFactories) { if (distancesFromTargetFactory[myFactory.EntityId] < minDistance && targetFactory.NumberOfCyborgPresent < myFactory.NumberOfCyborgPresent) { if (IsFactoryUnderAttack(myFactory.EntityId)) { DebugMessage($"Factory under attack, don't send troop. factory id: {myFactory.EntityId}"); } else { minDistance = distancesFromTargetFactory[myFactory.EntityId]; factoryDetail = myFactory; DebugMessage( $"Source Factory found: {factoryDetail.EntityId} army: {factoryDetail.NumberOfCyborgPresent} prod rate: {factoryDetail.ProductionRate} distance: {minDistance}"); } } } return(factoryDetail); }
private void BuildTroopToSendAround(FactoryDetail sourceFactory) { var neutralFactories = FactoryDetailList.Where(x => x.Owner == Owner.Neutral); foreach (var nFactory in neutralFactories) { nFactory.AttackValue = (decimal)nFactory.ProductionRate / MaximumProduction + (1 - (decimal)sourceFactory.DistanceToOtherFactories[nFactory.EntityId] / MaximumDistance); } var neutralfactoriesOrderedByAttackValue = neutralFactories.OrderByDescending(x => x.AttackValue); foreach (var nFactory in neutralfactoriesOrderedByAttackValue) { if (nFactory.NumberOfCyborgPresent < sourceFactory.NumberOfCyborgPresent + 2) { DebugMessage( $"Sending troop to {nFactory.EntityId} prodrate: {nFactory.ProductionRate} distance: {FactoryDistance[sourceFactory.EntityId][nFactory.EntityId]} attack value: {nFactory.AttackValue}"); AddTroopToSendList(sourceFactory, nFactory); } } }
private void AddTroopToSendList(FactoryDetail sourceFactory, FactoryDetail targetFactory) { TroopListToSend.Add(BuildTroop(sourceFactory, targetFactory)); }