double GetMaxAngleDeviationFromAcceleration(float accel) { var DownAccel = MaxDownThrust / shipMass; var LateralAccel = MaxLateralThrust / shipMass; var MaxAngle = Math.PI * 0.5; var LateralFactor = (LateralAccel - accel) / gravStr; if (LateralFactor < 1) { MaxAngle = TrigHelpers.FastAsin(LateralFactor); } var DownFactor = (accel - MaxDownThrust) / gravStr; if (DownFactor < 1) { MaxAngle = Math.Min(MaxAngle, Math.Acos(DownFactor)); } return(MaxAngle); }
public void Update() { LifeTimeTicks++; // Startup Subroutine if (LifeTimeTicks == 1) { foreach (var engine in Drive.HoverEngines) { engine.AltitudeMin = 1; engine.PushOnly = true; } } if (LifeTimeTicks == 60) { foreach (var engine in Drive.HoverEngines) { engine.AltitudeMin = 2; } } if (LifeTimeTicks == 120) { foreach (var engine in Drive.HoverEngines) { engine.AltitudeMin = 7; } } if (LifeTimeTicks % kRunEveryXUpdates == 0) { Vector3D PlanetDir = PlanetPos - Controller.WorldMatrix.Translation; PlanetDir.Normalize(); // Orient Self Drive.Turn(Gats.Count > 0 ? Gats[0].WorldMatrix : Controller.WorldMatrix, target); // Aim Turret if (TurretRotor != null) { if (target != Vector3D.Zero && Drive.GravAngle < Math.PI * 0.1) { var TurretAngle = TrigHelpers.FastAsin(Gats[0].WorldMatrix.Forward.Dot(PlanetDir)); Vector3D TargetDir = target - Gats[0].WorldMatrix.Translation; var targetDist = TargetDir.Length(); TargetDir.Normalize(); var TargetAngle = TrigHelpers.FastAsin(TargetDir.Dot(PlanetDir)); var angleDiff = TargetAngle - TurretAngle; if (VectorHelpers.VectorAngleBetween(Gats[0].WorldMatrix.Forward, TargetDir) < 0.05 && targetDist < 800) { Fire(); } TurretRotor.TargetVelocityRPM = (float)TurretPID.Control(angleDiff); } else { TurretPID.Reset(); TurretRotor.TargetVelocityRPM = 0; } } // Check your fire fireTicks--; if (fireTicks == -1) { foreach (var gat in Gats) { TerminalPropertiesHelper.SetValue(gat, "Shoot", false); } } // Check Movement if (Destination != Vector3D.Zero) { Drive.Drive(Destination); if (Drive.Arrived) { Destination = Vector3D.Zero; Drive.Flush(); } } } }