private void LaunchBoardModelOnFiringSolutionUpdated() { _accelerationData = _launchBoardModel.AccelerationData; OnPropertyChanged(Properties.DataAvailable); OnPropertyChanged(Properties.TableRow); OnPropertyChanged(Properties.TableColumn); OnPropertyChanged(Properties.BurnDuration); }
private void BuildAccelerationSegments(ShellstarInfo shellstarInfo, int targetDistance, MissileAccelerationData accelData) { for (int i = 0; i < accelData.BurnDuration; i++) { int range = i < accelData.BurnDuration - 1 ? (int)(Math.Floor(accelData.ImpulseData[i + 1].Range)) : targetDistance; var impulseData = new ImpulseTrackElement { Range = range, IsBurning = true }; shellstarInfo.ImpulseTrack.Add(impulseData); } }
public MissileAccelerationData CalculateMissileAcceleration(int targetRange, int burnDuration, int acceleration, AimAdjustment aimAdjustment, float roc) { int tableColumn; float totalPositionAdjustment = _missilePositionAdjustmentTable.GetTotalMissileAdjustment(burnDuration, acceleration, aimAdjustment, out tableColumn); var result = new MissileAccelerationData { TotalAcceleration = roc * burnDuration, TotalPositionAdjustment = totalPositionAdjustment, TableColumn = tableColumn, TargetRange = targetRange, BurnDuration = burnDuration, ValidLaunch = true }; result.BurnDistance = result.TotalAcceleration - result.TotalPositionAdjustment; float nextRange = targetRange - result.BurnDistance; if (nextRange <= 0) { result.ValidLaunch = false; return result; } // Filling acceleration data per impulse. for (int i = 0; i < burnDuration; i++) { var currentImpulse = new MissileAccelerationImpulse { PositionAdjustment = _missilePositionAdjustmentTable.GetSegmentMissileAdjustment(i + 1, acceleration, aimAdjustment), Range = nextRange }; result.ImpulseData.Add(currentImpulse); nextRange = nextRange + roc - currentImpulse.PositionAdjustment; } if (Math.Abs(nextRange - targetRange) > 0.3f) { throw new ArithmeticException(string.Format("After computing missile acceleration info, couldn't reach target range at launch ({0}). Final range = {1}", targetRange, nextRange)); } return result; }
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 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(); }
private void LaunchBoardModelOnFiringSolutionUpdated() { _accelerationData = _launchBoardModel.AccelerationData; OnPropertyChanged(Properties.IsDataAvailable); OnPropertyChanged(Properties.IsLaunchInvalid); OnPropertyChanged(Properties.RoC); OnPropertyChanged(Properties.BurnDuration); OnPropertyChanged(Properties.TotalAcceleration); OnPropertyChanged(Properties.MpatTotal); OnPropertyChanged(Properties.BurnDistance); OnPropertyChanged(Properties.TargetRange); ResetAccelerationTrack(); }