/// <summary> /// returns amount spent on guardians /// </summary> private FInt Helper_SeedGuardians(ArcenSimContext Context, Planet ThisPlanet, ArcenPoint centerPoint, GameEntity entityToGuard, List <GameEntityTypeData> guardianTypes, FInt budget, FInt minDistanceFactor, FInt maxDistanceFactor, EntityBehaviorType behavior, Boolean isMobilePatrol, int MaxCountToSeed) { int minDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * minDistanceFactor).IntValue; int maxDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * maxDistanceFactor).IntValue; FInt result = FInt.Zero; while (budget > FInt.Zero) { GameEntityTypeData guardianData = guardianTypes[Context.QualityRandom.Next(0, guardianTypes.Count)]; budget -= guardianData.BalanceStats.StrengthPerSquad; ArcenPoint point = ThisPlanet.Combat.GetSafePlacementPoint(Context, guardianData, centerPoint, minDistance, maxDistance); if (point == ArcenPoint.ZeroZeroPoint) { continue; } result += guardianData.BalanceStats.StrengthPerSquad; GameEntity newEntity = GameEntity.CreateNew(entityToGuard.Side, guardianData, point, Context); newEntity.EntitySpecificOrders.Behavior = behavior; newEntity.GuardedObject = entityToGuard; switch (behavior) { case EntityBehaviorType.Guard_Guardian_Anchored: break; case EntityBehaviorType.Guard_Guardian_Patrolling: newEntity.GuardingOffsets.Add(newEntity.WorldLocation - newEntity.GuardedObject.WorldLocation); if (isMobilePatrol) { AngleDegrees initialAngle = centerPoint.GetAngleToDegrees(newEntity.WorldLocation); int initialDistance = centerPoint.GetDistanceTo(newEntity.WorldLocation, false); int step = (AngleDegrees.MaxValue / 6).IntValue; for (int i = step; i < AngleDegrees.MaxValue; i += step) { AngleDegrees angleToThisPoint = initialAngle.Add(AngleDegrees.Create((FInt)i)); ArcenPoint thisPoint = centerPoint.GetPointAtAngleAndDistance(angleToThisPoint, initialDistance); newEntity.GuardingOffsets.Add(thisPoint - newEntity.GuardedObject.WorldLocation); } } break; } if (MaxCountToSeed > 0) { MaxCountToSeed--; if (MaxCountToSeed == 0) { break; } } } return(result); }
public ArcenPoint GetPointForWormhole(ArcenSimContext Context, Planet ThisPlanet, Planet PlanetThatWormholeWillGoTo) { int wormholeRadius = Context.QualityRandom.Next(this.MinimumWormholeDistance, this.MaximumWormholeDistance); AngleDegrees angleToNeighbor = ThisPlanet.GalaxyLocation.GetAngleToDegrees(PlanetThatWormholeWillGoTo.GalaxyLocation); ArcenPoint wormholePoint = Engine_AIW2.Instance.CombatCenter.GetPointAtAngleAndDistance(angleToNeighbor, wormholeRadius); return(wormholePoint); }
public void ToXml(XmlWriter writer) { writer.WriteStartElement("slope"); writer.WriteStartElement("float"); writer.WriteAttributeString("name", "angleDegrees"); writer.WriteAttributeString("value", AngleDegrees.ToString()); writer.WriteEndElement(); writer.WriteStartElement("int"); writer.WriteAttributeString("name", "textureIndex"); writer.WriteAttributeString("value", TextureIndex.ToString()); writer.WriteEndElement(); writer.WriteEndElement(); }
private void Helper_SeedDireGuardians(ArcenSimContext Context, Planet ThisPlanet, ArcenPoint centerPoint, GameEntity controller, List <GameEntityTypeData> guardianTypes, int Count, FInt minDistanceFactor, FInt maxDistanceFactor, EntityBehaviorType behavior, Boolean isMobilePatrol) { int minDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * minDistanceFactor).IntValue; int maxDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * maxDistanceFactor).IntValue; while (Count > 0) { Count--; GameEntityTypeData guardianData = guardianTypes[Context.QualityRandom.Next(0, guardianTypes.Count)]; ArcenPoint point = ThisPlanet.Combat.GetSafePlacementPoint(Context, guardianData, centerPoint, minDistance, maxDistance); if (point == ArcenPoint.ZeroZeroPoint) { continue; } GameEntity newEntity = GameEntity.CreateNew(controller.Side, guardianData, point, Context); newEntity.EntitySpecificOrders.Behavior = behavior; newEntity.GuardedObject = controller; switch (behavior) { case EntityBehaviorType.Guard_Guardian_Anchored: break; case EntityBehaviorType.Guard_Guardian_Patrolling: newEntity.GuardingOffsets.Add(newEntity.WorldLocation - newEntity.GuardedObject.WorldLocation); if (isMobilePatrol) { AngleDegrees initialAngle = newEntity.GuardedObject.WorldLocation.GetAngleToDegrees(newEntity.WorldLocation); int initialDistance = newEntity.GuardedObject.WorldLocation.GetDistanceTo(newEntity.WorldLocation, false); int step = (AngleDegrees.MaxValue / 6).IntValue; for (int i = step; i < AngleDegrees.MaxValue; i += step) { AngleDegrees angleToThisPoint = initialAngle.Add(AngleDegrees.Create((FInt)i)); ArcenPoint thisPoint = newEntity.GuardedObject.WorldLocation.GetPointAtAngleAndDistance(angleToThisPoint, initialDistance); newEntity.GuardingOffsets.Add(thisPoint - newEntity.GuardedObject.WorldLocation); } } break; } } }
private static int SpendBudgetOnItemsInList(ArcenSimContext Context, CombatSide Side, ArcenPoint CenterLocation, int MinimumDistanceFromCenter, List <GameEntityTypeData> listToBuyFrom, int budget) { if (listToBuyFrom.Count <= 0) { return(0); } if (budget <= 0) { return(0); } int remainingBudget = budget; int budgetPerType = remainingBudget / listToBuyFrom.Count; ArcenPoint formationCenterPoint = CenterLocation; listToBuyFrom.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right) { int leftValue = 0; if (Left.SystemEntries.Count > 0) { SystemEntry systemEntry = Left.SystemEntries[0]; if (systemEntry.SubEntries.Count > 0) { leftValue = systemEntry.SubEntries[0].BalanceStats.Range; } } int rightValue = 0; if (Right.SystemEntries.Count > 0) { SystemEntry systemEntry = Right.SystemEntries[0]; if (systemEntry.SubEntries.Count > 0) { rightValue = systemEntry.SubEntries[0].BalanceStats.Range; } } return(rightValue.CompareTo(leftValue)); }); int innerRingDistance = MinimumDistanceFromCenter; int outerRingDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * FInt.FromParts(0, 100)).IntValue; int distanceBetweenRings = (outerRingDistance - innerRingDistance) / listToBuyFrom.Count; for (int i = 0; i < listToBuyFrom.Count; i++) { GameEntityTypeData entityType = listToBuyFrom[i]; int numberToPlace = budgetPerType / entityType.BalanceStats.SquadPowerConsumption; numberToPlace = Math.Min(Side.GetRemainingCap(entityType), numberToPlace); if (numberToPlace <= 0) { continue; } int ringDistance = innerRingDistance + (distanceBetweenRings * i); AngleDegrees startingAngle = AngleDegrees.Create((FInt)Context.QualityRandom.Next(0, AngleDegrees.MaxValue.IntValue)); AngleDegrees angleChangePerItem = AngleDegrees.MaxAngle / numberToPlace; for (int j = 0; j < numberToPlace; j++) { if (Side.GetCanBuildAnother(entityType) != ArcenRejectionReason.Unknown) { break; } AngleDegrees angle = startingAngle + (angleChangePerItem * j); ArcenPoint point = formationCenterPoint.GetPointAtAngleAndDistance(angle, ringDistance); point = Side.Combat.GetSafePlacementPoint(Context, entityType, point, 0, distanceBetweenRings / 2); if (point == ArcenPoint.ZeroZeroPoint) { continue; } GameEntity newEntity = GameEntity.CreateNew(Side, entityType, point, Context); newEntity.SelfBuildingMetalRemaining = (FInt)entityType.BalanceStats.SquadMetalCost; remainingBudget -= entityType.BalanceStats.SquadPowerConsumption; } } // fill in the corners of the budget listToBuyFrom.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right) { return(Right.BalanceStats.SquadPowerConsumption.CompareTo(Left.BalanceStats.SquadPowerConsumption)); }); bool checkAgain = true; while (remainingBudget > 0 && checkAgain) { checkAgain = false; for (int i = 0; i < listToBuyFrom.Count; i++) { GameEntityTypeData entityType = listToBuyFrom[i]; if (remainingBudget < entityType.BalanceStats.SquadPowerConsumption) { continue; } if (Side.GetCanBuildAnother(entityType) != ArcenRejectionReason.Unknown) { continue; } ArcenPoint point = Side.Combat.GetSafePlacementPoint(Context, entityType, formationCenterPoint, innerRingDistance, outerRingDistance); if (point == ArcenPoint.ZeroZeroPoint) { continue; } GameEntity newEntity = GameEntity.CreateNew(Side, entityType, point, Context); newEntity.SelfBuildingMetalRemaining = (FInt)entityType.BalanceStats.SquadMetalCost; remainingBudget -= entityType.BalanceStats.SquadPowerConsumption; checkAgain = true; } } return(budget - remainingBudget); }
static void Main(string[] args) { var tleUrl = new Uri("https://celestrak.com/NORAD/elements/visual.txt"); var provider = new RemoteTleProvider(true, tleUrl); var tles = provider.GetTles(); var satellites = tles.Select(pair => new Satellite(pair.Value)).ToList(); var minAngle = new AngleDegrees(10); var gs = new GroundStation(new GeodeticCoordinate(new AngleDegrees(30.229777), new AngleDegrees(-81.617525), 0)); var state = TrackingState.ListingComPorts; Satellite tracking = null; SerialPort comPort = null; while (true) { switch (state) { case TrackingState.ListingComPorts: comPort = SelectComPort(); if (comPort != null) { if (comPort.IsOpen) { comPort.Close(); } comPort.Open(); } state = TrackingState.ListingVisible; break; case TrackingState.ListingVisible: tracking = SelectVisibleSatellite(satellites, gs, minAngle); state = TrackingState.Tracking; break; case TrackingState.Tracking: if (PressedKey(ConsoleKey.V)) { state = TrackingState.ListingVisible; } if (PressedKey(ConsoleKey.Q)) { state = TrackingState.Quitting; } Console.Clear(); var observation = gs.Observe(tracking, DateTime.UtcNow); Console.WriteLine(tracking.Name); Console.WriteLine($"{observation.Elevation.Degrees:F2};{observation.Azimuth.Degrees:F2}"); comPort?.Write($"{observation.Elevation.Degrees:F2};{observation.Azimuth.Degrees:F2}"); Thread.Sleep(250); break; } if (state == TrackingState.Quitting) { break; } } comPort?.Close(); }
private static Satellite SelectVisibleSatellite(List <Satellite> satellites, GroundStation gs, AngleDegrees minAngle) { var visible = new List <Satellite>(); visible.Clear(); Console.Clear(); foreach (var satellite in satellites) { var satPos = satellite.Predict(); if (gs.IsVisible(satPos, minAngle)) { visible.Add(satellite); } } for (var i = 0; i < visible.Count; i++) { var sat = visible[i]; Console.WriteLine($"[{i}] {sat.Name}"); } string input; int selectedSatellite; do { Console.Write("> "); input = Console.ReadLine(); } while (!int.TryParse(input, out selectedSatellite)); return(visible[selectedSatellite]); }
public void Execute(ArcenSimContext Context, GameEntity BuildingEntity) { List <GameEntityTypeData> turretTypes = new List <GameEntityTypeData>(); for (int menuIndex = 0; menuIndex < BuildingEntity.TypeData.BuildMenus.Count; menuIndex++) { BuildMenu menu = BuildingEntity.TypeData.BuildMenus[menuIndex]; for (int i = 0; i < menu.List.Count; i++) { GameEntityTypeData entityData = menu.List[i]; if (entityData.Balance_FuelCost.FuelMultiplier > 0) { continue; } if (entityData.Balance_PowerCost.PowerMultiplier <= 0) { continue; } if (!entityData.CapIsPerPlanet) { continue; } if (!EntityRollupType.Combatants.Matches(entityData)) //&& !EntityRollupType.ProjectsShield.Matches( entityData ) { continue; } if (BuildingEntity.Side.GetCanBuildAnother(entityData) != ArcenRejectionReason.Unknown) { continue; } turretTypes.Add(entityData); } } if (turretTypes.Count <= 0) { return; } int powerBudget = BuildingEntity.Side.NetPower; int budgetPerType = powerBudget / turretTypes.Count; ArcenPoint formationCenterPoint = BuildingEntity.WorldLocation; turretTypes.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right) { int leftValue = 0; if (Left.SystemEntries.Count > 0) { SystemEntry systemEntry = Left.SystemEntries[0]; if (systemEntry.SubEntries.Count > 0) { leftValue = systemEntry.SubEntries[0].BalanceStats.Range; } } int rightValue = 0; if (Right.SystemEntries.Count > 0) { SystemEntry systemEntry = Right.SystemEntries[0]; if (systemEntry.SubEntries.Count > 0) { rightValue = systemEntry.SubEntries[0].BalanceStats.Range; } } return(rightValue.CompareTo(leftValue)); }); int innerRingDistance = BuildingEntity.TypeData.Radius * 2; int outerRingDistance = (ExternalConstants.Instance.Balance_AverageGravWellRadius * FInt.FromParts(0, 100)).IntValue; int distanceBetweenRings = (outerRingDistance - innerRingDistance) / turretTypes.Count; for (int i = 0; i < turretTypes.Count; i++) { GameEntityTypeData turretType = turretTypes[i]; int numberToPlace = budgetPerType / turretType.BalanceStats.SquadPowerConsumption; numberToPlace = Math.Min(BuildingEntity.Side.GetRemainingCap(turretType), numberToPlace); if (numberToPlace <= 0) { continue; } int ringDistance = innerRingDistance + (distanceBetweenRings * i); AngleDegrees startingAngle = AngleDegrees.Create((FInt)Context.QualityRandom.Next(0, AngleDegrees.MaxValue.IntValue)); AngleDegrees angleChangePerItem = AngleDegrees.MaxAngle / numberToPlace; for (int j = 0; j < numberToPlace; j++) { if (BuildingEntity.Side.GetCanBuildAnother(turretType) != ArcenRejectionReason.Unknown) { break; } AngleDegrees angle = startingAngle + (angleChangePerItem * j); ArcenPoint point = formationCenterPoint.GetPointAtAngleAndDistance(angle, ringDistance); point = BuildingEntity.Combat.GetSafePlacementPoint(Context, turretType, point, 0, distanceBetweenRings / 2); if (point == ArcenPoint.ZeroZeroPoint) { continue; } GameEntity newEntity = GameEntity.CreateNew(BuildingEntity.Side, turretType, point, Context); newEntity.SelfBuildingMetalRemaining = (FInt)turretType.BalanceStats.SquadMetalCost; powerBudget -= turretType.BalanceStats.SquadPowerConsumption; } } // fill in the corners of the budget turretTypes.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right) { return(Right.BalanceStats.SquadPowerConsumption.CompareTo(Left.BalanceStats.SquadPowerConsumption)); }); bool checkAgain = true; while (powerBudget > 0 && checkAgain) { checkAgain = false; for (int i = 0; i < turretTypes.Count; i++) { GameEntityTypeData turretType = turretTypes[i]; if (powerBudget < turretType.BalanceStats.SquadPowerConsumption) { continue; } if (BuildingEntity.Side.GetCanBuildAnother(turretType) != ArcenRejectionReason.Unknown) { continue; } ArcenPoint point = BuildingEntity.Combat.GetSafePlacementPoint(Context, turretType, formationCenterPoint, innerRingDistance, outerRingDistance); if (point == ArcenPoint.ZeroZeroPoint) { continue; } GameEntity newEntity = GameEntity.CreateNew(BuildingEntity.Side, turretType, point, Context); newEntity.SelfBuildingMetalRemaining = (FInt)turretType.BalanceStats.SquadMetalCost; powerBudget -= turretType.BalanceStats.SquadPowerConsumption; checkAgain = true; } } }