public HoneybeeMiningTask(MyGridProgram program, HoneybeeMiningSystem miningSystem, IAutopilot autopilot, IAgentSubsystem agentSubsystem, Waypoint target, AsteroidIntel host, IIntelProvider intelProvider, IMonitorSubsystem monitorSubsystem, IDockingSubsystem dockingSubsystem, DockTaskGenerator dockTaskGenerator, UndockFirstTaskGenerator undockTaskGenerator) { Program = program; MiningSystem = miningSystem; Autopilot = autopilot; AgentSubsystem = agentSubsystem; MonitorSubsystem = monitorSubsystem; Host = host; MiningDepth = MiningSystem.MineDepth; LowestExpectedOreDist = (float)MiningDepth; DockingSubsystem = dockingSubsystem; Status = TaskStatus.Incomplete; double lDoc, det; GetSphereLineIntersects(host.Position, host.Radius, target.Position, target.Direction, out lDoc, out det); Perpendicular = GetPerpendicular(target.Direction); CoPerp = Perpendicular.Cross(target.Direction); if (det < 0) { Status = TaskStatus.Aborted; state = -1; return; } SurfaceDist = -lDoc + Math.Sqrt(det); ApproachPoint = target.Position + target.Direction * SurfaceDist * 0.3; ExitPoint = ApproachPoint; EntryPoint = target.Position + target.Direction * miningSystem.CloseDist; MiningEnd = target.Position - target.Direction * MiningDepth; SurfacePoint = target.Position; LeadTask = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.SmartEnter); MineTask = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.DoNotAvoid); LeadTask.Destination.Position = ApproachPoint; LeadTask.Destination.Direction = target.Direction * -1; LeadTask.Destination.DirectionUp = Perpendicular + CoPerp; intelProvider.ReportFleetIntelligence(LeadTask.Destination, TimeSpan.FromSeconds(1)); MineTask.Destination.Direction = target.Direction * -1; MineTask.Destination.DirectionUp = Perpendicular + CoPerp; MineTask.Destination.Position = EntryPoint; DockTaskGenerator = dockTaskGenerator; UndockTaskGenerator = undockTaskGenerator; }
public HoneybeeMiningTaskGenerator(MyGridProgram program, HoneybeeMiningSystem miningSystem, IAutopilot autopilot, IAgentSubsystem agentSubsystem, IDockingSubsystem dockingSubsystem, DockTaskGenerator dockTaskGenerator, UndockFirstTaskGenerator undockTaskGenerator, IIntelProvider intelProvder, IMonitorSubsystem monitorSubsystem) { Program = program; MiningSystem = miningSystem; Autopilot = autopilot; AgentSubsystem = agentSubsystem; DockTaskGenerator = dockTaskGenerator; UndockTaskGenerator = undockTaskGenerator; IntelProvider = intelProvder; MonitorSubsystem = monitorSubsystem; DockingSubsystem = dockingSubsystem; Task = new HoneybeeMiningTask(Program, MiningSystem, Autopilot, AgentSubsystem, new Waypoint(), new AsteroidIntel(), IntelProvider, MonitorSubsystem, DockingSubsystem, DockTaskGenerator, UndockTaskGenerator); Task.Do(new Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence>(), TimeSpan.Zero, null); }
public Program() { Context = new ExecutionContext(this); subsystemManager = new SubsystemManager(Context); Runtime.UpdateFrequency = UpdateFrequency.Update1; AutopilotSubsystem = new AutopilotSubsystem(); IntelSubsystem = new IntelSubsystem(); Context.IntelSystem = IntelSubsystem; MiningSubsystem = new HoneybeeMiningSystem(); LookingGlassNetwork = new LookingGlassNetworkSubsystem(IntelSubsystem, "LG", false, false); AgentSubsystem = new AgentSubsystem(IntelSubsystem, AgentClass.Fighter); MonitorSubsystem = new MonitorSubsystem(IntelSubsystem); var loader = new CombatLoaderSubsystem("Pascal Cargo", "Base Cargo"); var docking = new DockingSubsystem(IntelSubsystem, loader); ScannerSubsystem = new ScannerNetworkSubsystem(IntelSubsystem); LookingGlassNetwork.AddPlugin("combat", new LookingGlass_Pascal(this)); subsystemManager.AddSubsystem("indicator", new StatusIndicatorSubsystem(docking, IntelSubsystem)); subsystemManager.AddSubsystem("autopilot", AutopilotSubsystem); subsystemManager.AddSubsystem("intel", IntelSubsystem); subsystemManager.AddSubsystem("mining", MiningSubsystem); subsystemManager.AddSubsystem("scanner", ScannerSubsystem); subsystemManager.AddSubsystem("lookingglass", LookingGlassNetwork); subsystemManager.AddSubsystem("monitor", MonitorSubsystem); subsystemManager.AddSubsystem("loader", loader); subsystemManager.AddSubsystem("docking", docking); var MiningTaskGenerator = new HoneybeeMiningTaskGenerator(this, MiningSubsystem, AutopilotSubsystem, AgentSubsystem, null, null, null, IntelSubsystem, MonitorSubsystem); var HomingTaskGenerator = new SetHomeTaskGenerator(this, docking); var DockingTaskGenerator = new DockTaskGenerator(this, AutopilotSubsystem, docking); AgentSubsystem.AddTaskGenerator(MiningTaskGenerator); AgentSubsystem.AddTaskGenerator(HomingTaskGenerator); AgentSubsystem.AddTaskGenerator(DockingTaskGenerator); subsystemManager.AddSubsystem("agent", AgentSubsystem); subsystemManager.DeserializeManager(Storage); }
public Program() { Context = new ExecutionContext(this); subsystemManager = new SubsystemManager(Context); Runtime.UpdateFrequency = UpdateFrequency.Update1; // Add subsystems AutopilotSubsystem autopilotSubsystem = new AutopilotSubsystem(); IntelSubsystem intelSubsystem = new IntelSubsystem(); Context.IntelSystem = intelSubsystem; DockingSubsystem dockingSubsystem = new DockingSubsystem(intelSubsystem); HoneybeeMiningSystem miningSubsystem = new HoneybeeMiningSystem(); MonitorSubsystem monitorSubsystem = new MonitorSubsystem(intelSubsystem); subsystemManager.AddSubsystem("autopilot", autopilotSubsystem); subsystemManager.AddSubsystem("docking", dockingSubsystem); subsystemManager.AddSubsystem("intel", intelSubsystem); subsystemManager.AddSubsystem("mining", miningSubsystem); subsystemManager.AddSubsystem("monitor", monitorSubsystem); AgentSubsystem agentSubsystem = new AgentSubsystem(intelSubsystem, AgentClass.Miner); UndockFirstTaskGenerator undockingTaskGenerator = new UndockFirstTaskGenerator(this, autopilotSubsystem, dockingSubsystem); undockingTaskGenerator.AddTaskGenerator(new WaypointTaskGenerator(this, autopilotSubsystem)); DockTaskGenerator dockTaskGenerator = new DockTaskGenerator(this, autopilotSubsystem, dockingSubsystem); undockingTaskGenerator.AddTaskGenerator(dockTaskGenerator); agentSubsystem.AddTaskGenerator(undockingTaskGenerator); agentSubsystem.AddTaskGenerator(new SetHomeTaskGenerator(this, dockingSubsystem)); agentSubsystem.AddTaskGenerator(new HoneybeeMiningTaskGenerator(this, miningSubsystem, autopilotSubsystem, agentSubsystem, dockingSubsystem, dockTaskGenerator, undockingTaskGenerator, intelSubsystem, monitorSubsystem)); subsystemManager.AddSubsystem("agent", agentSubsystem); subsystemManager.AddSubsystem("indicator", new StatusIndicatorSubsystem(dockingSubsystem, intelSubsystem)); subsystemManager.DeserializeManager(Storage); }
public void Do(Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence> IntelItems, TimeSpan canonicalTime, Profiler profiler) { if (canonicalTime == TimeSpan.Zero) { return; } if (MiningSystem.Recalling > 0 || currentPosition > 120) { Recalling = true; } if (Recalling && state < 3) { state = 3; } if (state == 1) // Diving to surface of asteroid { MineTask.Do(IntelItems, canonicalTime, profiler); MineTask.Destination.MaxSpeed = Autopilot.GetMaxSpeedFromBrakingDistance(kFarSensorDist); if (MineTask.Status == TaskStatus.Complete || !MiningSystem.SensorsFarClear()) { EntryPoint = Autopilot.Reference.WorldMatrix.Translation + MineTask.Destination.Direction * (kFarSensorDist - 10); MineTask.Destination.MaxSpeed = 1f; state = 2; } } else if (state == 2) // Boring tunnel { bool sampleHome = false; double distToMiningEnd = (Autopilot.Reference.WorldMatrix.Translation - MiningEnd).Length(); if (MiningSystem.SensorsClear()) { MineTask.Destination.Position = MiningEnd; } else if (MiningSystem.SensorsBack()) { MineTask.Destination.Position = EntryPoint; } else { MineTask.Destination.Position = Vector3D.Zero; if (SampleCount <= 0) { SampleCount = kSampleFrequency; var cargoPercentage = MonitorSubsystem.GetPercentage(MonitorOptions.Cargo); if (LastSampleCargoPercentages.Count >= kMaxSampleCount) { LastSampleCargoPercentages.Enqueue(cargoPercentage); var sampleGreater = 0; var sampleLesser = 0; var comparePercentage = LastSampleCargoPercentages.Dequeue() + 0.00001; foreach (var percentage in LastSampleCargoPercentages) { if (percentage > comparePercentage) { sampleGreater++; } else { sampleLesser++; } } if (sampleGreater > sampleLesser) { if (!HitOre) { HitOre = true; var currentCoords = GetMiningPosition(currentPosition); miningMatrix[currentCoords.X + 5, currentCoords.Y + 5] = 1; } if (LowestExpectedOreDist == -1) { LowestExpectedOreDist = (float)distToMiningEnd - 5; } } else { if (HitOre || distToMiningEnd < LowestExpectedOreDist) { sampleHome = true; if (!HitOre) { var currentCoords = GetMiningPosition(currentPosition); miningMatrix[currentCoords.X + 5, currentCoords.Y + 5] = 2; } } } } else { LastSampleCargoPercentages.Enqueue(cargoPercentage); } } else { SampleCount--; } } MiningSystem.Drill(); MineTask.Do(IntelItems, canonicalTime, profiler); if (GoHomeCheck() || MiningSystem.SensorsFarClear() || distToMiningEnd < 4 || sampleHome) { if (MiningSystem.SensorsFarClear() || distToMiningEnd < 4 || sampleHome) { UpdateMiningMatrix(currentPosition); IncrementCurrentPosition(); HitOre = false; } state = 3; MineTask.Destination.MaxSpeed = 2; LastSampleCargoPercentages.Clear(); } } else if (state == 3) // Exiting tunnel { MiningSystem.StopDrill(); if (MineTask.Destination.Position != ExitPoint) { MineTask.Destination.Position = EntryPoint; } MineTask.Do(IntelItems, canonicalTime, profiler); if (MineTask.Status == TaskStatus.Complete) { if (MineTask.Destination.Position == EntryPoint) { MineTask.Destination.Position = ExitPoint; MineTask.Destination.MaxSpeed = 100; } else { state = 10; } } } else if (state == 10) // Resuming to approach point { if (GoHomeCheck() || Recalling) { state = 4; } else { LeadTask.Destination.Position = ApproachPoint; LeadTask.Do(IntelItems, canonicalTime, profiler); if (LeadTask.Status == TaskStatus.Complete) { var position = GetMiningPosition(currentPosition); LeadTask.Destination.Position = ApproachPoint + (Perpendicular * position.X * MiningSystem.OffsetDist + Perpendicular.Cross(MineTask.Destination.Direction) * position.Y * MiningSystem.OffsetDist); LeadTask.Destination.MaxSpeed = 10; ExitPoint = LeadTask.Destination.Position; state = 11; } } } else if (state == 11) // Search for the digging spot { if (GoHomeCheck() || Recalling) { state = 4; } else { LeadTask.Do(IntelItems, canonicalTime, profiler); if (LeadTask.Status == TaskStatus.Complete) { state = 1; MiningSystem.SensorsOn(); var position = GetMiningPosition(currentPosition); MineTask.Destination.Position = SurfacePoint + (Perpendicular * position.X * MiningSystem.OffsetDist + Perpendicular.Cross(MineTask.Destination.Direction) * position.Y * MiningSystem.OffsetDist) - MineTask.Destination.Direction * MiningSystem.CloseDist; MiningEnd = SurfacePoint + (Perpendicular * position.X * MiningSystem.OffsetDist + Perpendicular.Cross(MineTask.Destination.Direction) * position.Y * MiningSystem.OffsetDist) + MineTask.Destination.Direction * MiningDepth; } } } else if (state == 4) // Going home { if (DockingSubsystem == null || DockingSubsystem.HomeID == -1 || DockTaskGenerator == null || UndockTaskGenerator == null) { state = 9999; } else { if (HomeTask == null) { HomeTask = DockTaskGenerator.GenerateMoveToAndDockTask(MyTuple.Create(IntelItemType.NONE, (long)0), IntelItems, 40); } HomeTask.Do(IntelItems, canonicalTime, profiler); if (HomeTask.Status != TaskStatus.Incomplete) { HomeTask = null; homeCheck = false; state = 5; } } } else if (state == 5) // Waiting for refuel/unload { if (Recalling) { state = 9999; } if ((Program.Me.WorldMatrix.Translation - EntryPoint).LengthSquared() > MiningSystem.CancelDist * MiningSystem.CancelDist) { state = 9999; } if (LeaveHomeCheck()) { state = 6; } } else if (state == 6) // Undocking { if (DockingSubsystem != null && DockingSubsystem.Connector.Status == MyShipConnectorStatus.Connected) { if (UndockTask == null) { UndockTask = UndockTaskGenerator.GenerateUndockTask(canonicalTime); } } if (UndockTask != null) { UndockTask.Do(IntelItems, canonicalTime, profiler); if (UndockTask.Status != TaskStatus.Incomplete) { UndockTask = null; state = 10; } } else { state = 10; } } else if (state == 9999) { Status = TaskStatus.Complete; } }