private void LaunchBoardModelOnFiringSolutionUpdated() { _firingSolution = _launchBoardModel.FiringSolution; OnPropertyChanged(Properties.DataAvailable); OnPropertyChanged(Properties.TableRow); OnPropertyChanged(Properties.TableColumn); }
private void BuildInertialSegments(ShellstarInfo shellstarInfo, float driftDistance, FiringSolution firingSolution, bool isMissile) { float currentDistance = 0; bool roundUp = false; // CG shells can be fired at range 0. For this case we add a single segment. if ((int)driftDistance == 0 && firingSolution.AimAdjustment != AimAdjustment.NoShot && !isMissile) { shellstarInfo.ImpulseTrack.Add(new ImpulseTrackElement { Range = 0, IsBurning = false }); return; } // Ex 1: Drift distance = 20; RoC = 4; currentDistance = 20 is satisfies condition, 24 doesn't. // Ex 2: Drift distance = 17; RoC = 4; currentDistance = 20 is satisfies condition, 24 doesn't. while (driftDistance - currentDistance > - firingSolution.RoC) { var impulseData = new ImpulseTrackElement { Range = (int)Math.Min(currentDistance, driftDistance), IsBurning = false }; shellstarInfo.ImpulseTrack.Add(impulseData); currentDistance += roundUp ? (float)Math.Ceiling(firingSolution.RoC) : (float)Math.Floor(firingSolution.RoC); roundUp = !roundUp; } }
public FiringSolution CalculateSolution(int courseOffset, int crossingVector, int mvMultiplier, int acceleration) { var firingSolution = new FiringSolution { CrossingVector = crossingVector, MuzzleVelocity = mvMultiplier * acceleration }; var shotGeometryData = _shotGeometryTable.GetShotGeometry(crossingVector, firingSolution.MuzzleVelocity, courseOffset); firingSolution.AimAdjustment = shotGeometryData.AimAdjustment; firingSolution.ShotGeometryColumn = shotGeometryData.TableColumn; firingSolution.ShotGeometryRow = shotGeometryData.TableRow; firingSolution.CrossingVectorAdjustment = shotGeometryData.CvAdjustment; firingSolution.MuzzleVelocityAdjustment = shotGeometryData.MvAdjustment; firingSolution.ModifiedCrossingVector = (int)Math.Ceiling(firingSolution.CrossingVector * shotGeometryData.CvAdjustment); firingSolution.ModifiedMuzzleVelocity = (int)Math.Ceiling(firingSolution.MuzzleVelocity * shotGeometryData.MvAdjustment); firingSolution.RoCTurn = firingSolution.ModifiedCrossingVector + firingSolution.ModifiedMuzzleVelocity; firingSolution.RoC = CalculateRoc(firingSolution.RoCTurn); return firingSolution; }
public ShellstarInfo BuildShellstarInfo(int targetDistance, TurnData startingImpulse, FiringSolution firingSolution, MissileAccelerationData missileAcceleration) { if (firingSolution == null) { throw new ArgumentNullException("firingSolution", "Firing solution is needed to calculate shellstar data."); } int dmg50, dmg100, dmg200; _projectileDamageTable.GetDamages(firingSolution.RoC, out dmg50, out dmg100, out dmg200); var result = new ShellstarInfo { RoC = firingSolution.RoC, Dmg50 = dmg50, Dmg100 = dmg100, Dmg200 = dmg200, }; float inertialFlightDistance = (missileAcceleration != null) ? // Burnout range rounded down. (float)Math.Floor(targetDistance - missileAcceleration.BurnDistance) : targetDistance; BuildInertialSegments(result, inertialFlightDistance, firingSolution, missileAcceleration != null); if (missileAcceleration != null) { BuildAccelerationSegments(result, targetDistance, missileAcceleration); } result.ImpulseTrack.Reverse(); AssignImpulseInformation(result, startingImpulse); return result; }
private void LaunchBoardModelOnFiringSolutionUpdated() { _firingSolution = _launchBoardModel.FiringSolution; OnPropertyChanged(Properties.CanViewShellstar); OnPropertyChanged(Properties.IsDataAvailable); OnPropertyChanged(Properties.CrossingVector); OnPropertyChanged(Properties.MuzzleVelocity); OnPropertyChanged(Properties.NoShotComment); OnPropertyChanged(Properties.CvAdjustment); OnPropertyChanged(Properties.MvAdjustment); OnPropertyChanged(Properties.ModifiedCv); OnPropertyChanged(Properties.ModifiedMv); OnPropertyChanged(Properties.RoCTurn); OnPropertyChanged(Properties.NoShot); OnPropertyChanged(Properties.RoC); }
private IShellstarModel BuildShellstar(FiringSolution firingSolution, MissileAccelerationData accelerationData) { if (firingSolution == null || firingSolution.AimAdjustment == AimAdjustment.NoShot || (accelerationData != null && accelerationData.ValidLaunch == false)) { return null; } var shellstar = _shellstarBuilder.BuildShellstarInfo(TargetDistance.Magnitude, LaunchingSegment, firingSolution, accelerationData); var result = new ShellstarModel(shellstar, LaunchingSegment) { Tag = GetDefaultTag() }; return result; }
private void UpdateFiringSolution(FiringSolution firingSolution, MissileAccelerationData missileAccelerationData, IShellstarModel shellstar) { FiringSolution = firingSolution; AccelerationData = missileAccelerationData; Shellstar = shellstar; LaunchWindows = GetAvailableLaunchWindows(); OnFiringSolutionUpdated(); }