private void LaunchBoardModelOnFiringSolutionUpdated()
 {
     _firingSolution = _launchBoardModel.FiringSolution;
     OnPropertyChanged(Properties.DataAvailable);
     OnPropertyChanged(Properties.TableRow);
     OnPropertyChanged(Properties.TableColumn);
 }
Example #2
0
        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;
        }
Example #4
0
        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);
 }
Example #6
0
        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;
        }
Example #7
0
 private void UpdateFiringSolution(FiringSolution firingSolution, MissileAccelerationData missileAccelerationData, IShellstarModel shellstar)
 {
     FiringSolution = firingSolution;
     AccelerationData = missileAccelerationData;
     Shellstar = shellstar;
     LaunchWindows = GetAvailableLaunchWindows();
     OnFiringSolutionUpdated();
 }