Пример #1
0
        public Comparison(AllegObject shooter, float kb, float accuracy, float launchSpeed, AllegObject killed)
        {
            _accuracy    = accuracy;
            _object1     = shooter;
            _object2     = killed;
            _kb          = kb;
            _launchSpeed = launchSpeed;

            HullAC          = killed.GetHullAC();
            HullHitpoints   = killed.CalculateHullHitpoints();
            HullRecharge    = killed.CalculateHullRepairRate();
            ShieldAC        = killed.GetShieldAC();
            ShieldHitpoints = killed.CalculateShieldHitpoints();
            ShieldRecharge  = killed.CalculateShieldRepairRate();

            AmmoClip = (_object1 is Probe) ? ((Probe)_object1).IGCProbe.AmmoCapacity : (short)((Ship)_object1).IGCShip.AmmoCapacity;
            Battery  = (_object1 is Ship) ? ((Ship)_object1).CalculateEnergy() : 0F;

            DamageIndices = shooter.Core.Constants.DamageIndexes;
            Mods          = shooter.Team.CalculateFactors();

            if (shooter is Ship)
            {
                Ship ship = (Ship)shooter;
                shipCargo = new IGCCorePart[5];
                for (int i = 0; i < ship.Cargo.Length; i++)
                {
                    shipCargo[i] = ship.Cargo[i];
                }
                firingMissile = ship.Missile;
            }
            Calculate();
        }
Пример #2
0
        public float CalculateMissileDamage(IGCCoreMissile missile)
        {
            float MissileDamage = missile.Damage * Mods.MissileDamage;

            MissileDamage *= missile.LaunchCount;
            MissileDamage += (MissileDamage * (_kb / 100));
            _damageDealt  += MissileDamage;
            int MissileDM = missile.DamageIndex;

            float DamageTaken = 0F;

            if (ShieldHitpoints > 0 && ShieldAC != -1)
            {
                DamageTaken = (MissileDamage * (DamageIndices[MissileDM].Damages[ShieldAC]));
                if (DamageTaken <= ShieldHitpoints)
                {
                    return(DamageTaken);                        // The damage taken didn't down the shields. Return it.
                }
                ShieldHitpoints = 0F;
                // Damage took shields down. Set the DamageDealt to the extra damage dealt after shields were downed.
                MissileDamage = (-1 * (ShieldHitpoints - DamageTaken)) / DamageIndices[MissileDM].Damages[ShieldAC];
            }

            if (HullHitpoints > 0 && HullAC != -1)
            {
                DamageTaken = (MissileDamage * (DamageIndices[MissileDM].Damages[HullAC]));
            }

            return(DamageTaken);
        }
Пример #3
0
        public Comparison(AllegObject shooter, float kb, float accuracy, float launchSpeed)
        {
            _object1     = shooter;
            _kb          = kb;
            _accuracy    = accuracy;
            _launchSpeed = launchSpeed;

            AmmoClip = (_object1 is Probe) ? ((Probe)_object1).IGCProbe.AmmoCapacity : (short)((Ship)_object1).IGCShip.AmmoCapacity;
            Battery  = (_object1 is Ship) ? ((Ship)_object1).CalculateEnergy() : 0F;

            Mods = shooter.Team.CalculateFactors();

            if (shooter is Ship)
            {
                Ship ship = (Ship)shooter;
                shipCargo = new IGCCorePart[5];
                for (int i = 0; i < ship.Cargo.Length; i++)
                {
                    shipCargo[i] = ship.Cargo[i];
                }
                firingMissile = ship.Missile;
            }
            Calculate();
        }
Пример #4
0
        private void Calculate()
        {
            if (_object1 is Station)
            {
                _timeToKill = float.PositiveInfinity;
                return;
            }

            float Interval = _object1.Core.Constants.DownedShield;

            if (_object1 is Ship)
            {
                Ship ship = (Ship)_object1;
                if (ship.FireMissile && firingMissile != null)
                {
                    MissilePack = ship.IGCShip.MissileCapacity / firingMissile.CargoPayload;
                }
            }

            float WeaponDamage = 0F;

            bool DownedShield = false;
            bool TakingDamage = false;

            while (true)
            {
                _timeToKill += Interval;
                if (_timeToKill > 3600F)
                {
                    _timeToKill = float.NaN;
                    break;
                }

                TakingDamage = false;

                if (_object1 is Probe)
                {
                    Probe             probe      = (Probe)_object1;
                    IGCCoreProjectile Projectile = (IGCCoreProjectile)probe.Core.Projectiles.GetModule((ushort)probe.IGCProbe.Projectile);
                    if (Projectile == null)
                    {
                        _timeToKill = float.PositiveInfinity;
                        break;
                    }
                    float ProjRange = Projectile.Speed * Projectile.Lifespan * Mods.PWRange;
                    if (ProjRange > _range)
                    {
                        _range = ProjRange;
                    }

                    WeaponDamage  = CalculateWeaponDamage(Projectile, probe.IGCProbe.ShotInterval);
                    WeaponDamage *= Interval * probe.IGCProbe.Accuracy;
                    if (WeaponDamage == 0)
                    {
                        TakingDamage = true;
                        _timeToKill  = float.PositiveInfinity;
                        break;
                    }
                    _ammoUsed += Interval / probe.IGCProbe.ShotInterval;
                    if (_ammoUsed > probe.IGCProbe.AmmoCapacity)
                    {
                        break;
                    }

                    if (ApplyDamage(WeaponDamage) == false)
                    {
                        continue;
                    }
                    else
                    {
                        break;                          // Target Destroyed!
                    }
                }

                if (_object1 is Ship)
                {
                    Ship ship = (Ship)_object1;
                    IGCCorePartWeapon Weapon;
                    if (ship.FireWeapons == true)
                    {
                        Weapon = ship.Weapons[0];
                        if ((ship.WeaponToFire == -1 || ship.WeaponToFire == 0) && Weapon != null)
                        {
                            // If we're not reloading, not rearming, and not recharging energy (if we need them)
                            if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                                (Weapon.EnergyConsumption > 0 && Battery > 0))
                            {
                                WeaponDamage = FireGun(Weapon, Interval);
                                if (WeaponDamage != 0)
                                {
                                    TakingDamage = true;
                                    if (ApplyDamage(WeaponDamage) == true)
                                    {
                                        break;                                          // Target Destroyed!
                                    }
                                }
                            }
                        }

                        Weapon = ship.Weapons[1];
                        if ((ship.WeaponToFire == -1 || ship.WeaponToFire == 1) && Weapon != null)
                        {
                            if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                                (Weapon.EnergyConsumption > 0 && Battery > 0))
                            {
                                WeaponDamage = FireGun(Weapon, Interval);
                                if (WeaponDamage != 0)
                                {
                                    TakingDamage = true;
                                    if (ApplyDamage(WeaponDamage) == true)
                                    {
                                        break;                                          // Target Destroyed!
                                    }
                                }
                            }
                        }

                        Weapon = ship.Weapons[2];
                        if ((ship.WeaponToFire == -1 || ship.WeaponToFire == 2) && Weapon != null)
                        {
                            if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                                (Weapon.EnergyConsumption > 0 && Battery > 0))
                            {
                                WeaponDamage = FireGun(Weapon, Interval);
                                if (WeaponDamage != 0)
                                {
                                    TakingDamage = true;
                                    if (ApplyDamage(WeaponDamage) == true)
                                    {
                                        break;                                          // Target Destroyed!
                                    }
                                }
                            }
                        }

                        Weapon = ship.Weapons[3];
                        if ((ship.WeaponToFire == -1 || ship.WeaponToFire == 3) && Weapon != null)
                        {
                            if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                                (Weapon.EnergyConsumption > 0 && Battery > 0))
                            {
                                WeaponDamage = FireGun(Weapon, Interval);
                                if (WeaponDamage != 0)
                                {
                                    TakingDamage = true;
                                    if (ApplyDamage(WeaponDamage) == true)
                                    {
                                        break;                                          // Target Destroyed!
                                    }
                                }
                            }
                        }
                    }

                    Weapon = ship.Turrets[0];
                    if (ship.FireTurrets[0] == true)
                    {
                        if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                            (Weapon.EnergyConsumption > 0 && Battery > 0))
                        {
                            WeaponDamage = FireGun(Weapon, Interval);
                            if (WeaponDamage != 0)
                            {
                                TakingDamage = true;
                                if (ApplyDamage(WeaponDamage) == true)
                                {
                                    break;                                      // Target Destroyed!
                                }
                            }
                        }
                    }

                    Weapon = ship.Turrets[1];
                    if (ship.FireTurrets[1] == true)
                    {
                        if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                            (Weapon.EnergyConsumption > 0 && Battery > 0))
                        {
                            WeaponDamage = FireGun(Weapon, Interval);
                            if (WeaponDamage != 0)
                            {
                                TakingDamage = true;
                                if (ApplyDamage(WeaponDamage) == true)
                                {
                                    break;                                      // Target Destroyed!
                                }
                            }
                        }
                    }

                    Weapon = ship.Turrets[2];
                    if (ship.FireTurrets[2] == true)
                    {
                        if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                            (Weapon.EnergyConsumption > 0 && Battery > 0))
                        {
                            WeaponDamage = FireGun(Weapon, Interval);
                            if (WeaponDamage != 0)
                            {
                                TakingDamage = true;
                                if (ApplyDamage(WeaponDamage) == true)
                                {
                                    break;                                      // Target Destroyed!
                                }
                            }
                        }
                    }

                    Weapon = ship.Turrets[3];
                    if (ship.FireTurrets[3] == true)
                    {
                        if (((ReloadAmmoTime == 0 && ArmGunsTime == 0) && Weapon.AmmoConsumption > 0) ||
                            (Weapon.EnergyConsumption > 0 && Battery > 0))
                        {
                            WeaponDamage = FireGun(Weapon, Interval);
                            if (WeaponDamage != 0)
                            {
                                TakingDamage = true;
                                if (ApplyDamage(WeaponDamage) == true)
                                {
                                    break;                                      // Target Destroyed!
                                }
                            }
                        }
                    }

                    if (ship.FireMissile == true)
                    {
                        if (firingMissile != null)
                        {
                            if (firingMissile.SpecialEffect == MissileSpecialEffect.NerveGas)
                            {
                                _timeToKill = float.PositiveInfinity;
                                break;
                            }
                            if (ReloadMissileTime == 0 && ArmMissileTime == 0 && firingMissile.SpecialEffect != MissileSpecialEffect.Resonator)
                            {                                   // Not reloading or rearming missiles, fire it!
                                float MissileDamage = CalculateMissileDamage(firingMissile);

                                float WorkingRange = firingMissile.LifeSpan * firingMissile.Acceleration;
                                WorkingRange = WorkingRange / 2F;
                                WorkingRange = WorkingRange + firingMissile.LaunchVelocity + _launchSpeed;
                                WorkingRange = WorkingRange * firingMissile.LifeSpan;

                                if (WorkingRange > _range)
                                {
                                    _range = WorkingRange;
                                }

                                if (MissileDamage > 0)
                                {
                                    _missilesUsed += firingMissile.LaunchCount;
                                    MissilePack   -= firingMissile.LaunchCount;

                                    ArmMissileTime = firingMissile.ReloadTime;
                                    if (MissilePack == 0)
                                    {
                                        ReloadMissileTime = (1F / _object1.Core.Constants.MountRate);
                                    }

                                    TakingDamage = true;
                                    if (ApplyDamage(MissileDamage) == true)
                                    {
                                        break;                                          // Target Destroyed!
                                    }
                                }
                            }
                        }
                    }

                    // See if the target's shields started recharging
                    if (TakingDamage == true)
                    {
                        DownedShield = false;
                    }
                    else
                    {
                        // We're not damaging, and not reloading... so stop!
                        if (ReloadAmmoTime == 0 && ArmGunsTime == 0 &&
                            ArmTurret1Time == 0 && ArmTurret2Time == 0 &&
                            ArmTurret3Time == 0 && ArmTurret4Time == 0 &&
                            ReloadMissileTime == 0 && ArmMissileTime == 0)
                        {
                            _timeToKill = float.PositiveInfinity;
                            break;
                        }

                        if (DownedShield == false)
                        {
                            DownedShield = true;
                        }
                        else
                        {
                            if (ShieldHitpoints <= _object2.CalculateShieldHitpoints())
                            {
                                ShieldHitpoints += Interval * ShieldRecharge;
                            }
                        }
                    }

                    // All damage that could be done has been applied.
                    // reload, rearm, and recharge if needed
                    if (ReloadAmmoTime > 0)
                    {
                        ReloadAmmoTime = (float)Math.Round(ReloadAmmoTime - Interval, 1);
                        if (ReloadAmmoTime == 0)
                        {
                            if (HullHitpoints >= _object2.CalculateHullHitpoints() ||
                                (ShieldHitpoints >= _object2.CalculateShieldHitpoints() && _object2.CalculateShieldHitpoints() != 0))
                            {                                   // We just finished reloading, and it's full again. Stop now.
                                _timeToKill = float.PositiveInfinity;
                                break;
                            }
                            for (int i = 0; i < shipCargo.Length; i++)
                            {
                                if (shipCargo[i] != null)
                                {
                                    if (shipCargo[i] is IGCCorePartPack)
                                    {
                                        IGCCorePartPack Pack = (IGCCorePartPack)shipCargo[i];
                                        if (Pack.PackType == PackType.Ammo)
                                        {
                                            AmmoClip     = ship.IGCShip.AmmoCapacity;
                                            shipCargo[i] = null;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (ArmGunsTime > 0)
                    {
                        ArmGunsTime = (float)Math.Round(ArmGunsTime - Interval, 1);
                    }

                    if (Battery <= 0 && ship.CalculateEnergy() > 0)
                    {
                        if (_object2 != null)
                        {
                            if (HullHitpoints >= _object2.CalculateHullHitpoints())
                            {
                                _timeToKill = float.PositiveInfinity;
                                break;
                            }
                        }
                    }

                    if (Battery < ship.CalculateEnergy())
                    {
                        Battery += Interval * ship.CalculateEnergyRecharge();
                    }

                    if (ReloadMissileTime > 0)
                    {
                        ReloadMissileTime = (float)Math.Round(ReloadMissileTime - Interval, 1);
                        if (ReloadMissileTime == 0)
                        {
                            if (HullHitpoints >= _object2.CalculateHullHitpoints())
                            {                                   // We just finished reloading
                                if (ShieldHitpoints >= _object2.CalculateShieldHitpoints())
                                {                               //Shields have recharged during the reloading time - we'll never kill this. Stop now.
                                    _timeToKill = float.PositiveInfinity;
                                    break;
                                }
                            }
                            firingMissile = null;
                            for (int i = 0; i < shipCargo.Length; i++)
                            {
                                if (shipCargo[i] != null)
                                {
                                    if (shipCargo[i] is IGCCoreMissile)
                                    {
                                        IGCCoreMissile Missile = (IGCCoreMissile)shipCargo[i];
                                        if (ship.CanMountPart(Missile, ShipSlots.Missile))
                                        {
                                            firingMissile = Missile;
                                            MissilePack   = ship.IGCShip.MissileCapacity / Missile.CargoPayload;
                                            shipCargo[i]  = null;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        if (ArmMissileTime > 0)
                        {
                            ArmMissileTime = (float)Math.Round(ArmMissileTime - Interval, 1);
                        }
                    }
                }
                if (_object2 == null && _timeToKill >= 1F)                      // Stops calculating after 1 second for single-object Damage calcs
                {
                    _timeToKill = float.PositiveInfinity;
                    break;
                }
            }
        }
Пример #5
0
        private void ReadFromFile(string fileName)
        {
//			try
//			{
            FileStream CoreFS = File.OpenRead(fileName);
            DataReader Reader = new DataReader(CoreFS);

            int Size;
            int CoreSize;

            short Tag;

            _coreHeader = Reader.ReadUInt();
            CoreSize    = Reader.ReadInt();

            while (CoreFS.Position < (CoreSize + 8))
            {
                Tag  = Reader.ReadShort();
                Size = Reader.ReadInt();

                long Pos = CoreFS.Position;
                switch ((AGCObjectType)Tag)
                {
                case AGCObjectType.AGC_Constants:                                       // 21
                    _coreConstants = new IGCCoreConstants(Reader);
                    break;

                case AGCObjectType.AGC_StationType:                                     // 31;
                    _stationTypes.Add(new IGCCoreStationType(Reader));
                    break;

                case AGCObjectType.AGC_Civilization:                                    // 27
                    _civs.Add(new IGCCoreCiv(Reader));
                    break;

                case AGCObjectType.AGC_Development:                                     // 32
                    _devs.Add(new IGCCoreDevel(Reader));
                    break;

                case AGCObjectType.AGC_BucketStart:                                     //29
                    _ships.Add(new IGCCoreShip(Reader));
                    break;

                case AGCObjectType.AGC_PartType:                                        //30
                    IGCCorePart Part = null;
                    if (Size == 24)
                    {                                           // It's a spec part. Look up the real part and add it instead
                        IGCCorePartSpec Spec   = new IGCCorePartSpec(Reader);
                        ushort          PartID = Spec.UID;
                        ushort          RealID = (ushort)Spec.Group;

                        IGCCorePart Obj = null;
                        switch (Spec.Slot)
                        {
                        case "invchaff":
                            Obj = (IGCCorePart)_chaffs.GetObject(RealID);
                            IGCCoreCounter Counter = (IGCCoreCounter)Obj;
                            Counter.OverridingUID = Spec.OverridingUID;
                            break;

                        case "invsmissile":
                            Obj = (IGCCorePart)_missiles.GetObject(RealID);
                            IGCCoreMissile Missile = (IGCCoreMissile)Obj;
                            Missile.OverridingUID = Spec.OverridingUID;
                            Missile.LaunchCount   = (short)Spec.PartType;
                            Missile.QtyPerPack    = (short)Spec.Amount;
                            break;

                        case "invsmine":
                            Obj = (IGCCorePart)_mines.GetObject(RealID);
                            if (Obj == null)
                            {
                                Obj = (IGCCorePart)_probes.GetObject(RealID);
                                IGCCoreProbe Probe = (IGCCoreProbe)Obj;
                                Probe.OverridingUID = Spec.OverridingUID;
                            }
                            else
                            {
                                IGCCoreMine Mine = (IGCCoreMine)Obj;
                                Mine.OverridingUID = Spec.OverridingUID;
                            }
                            break;
                        }
                        if (Obj != null)
                        {
                            Obj.SpecUID = PartID;
                            _parts.Add(Obj);
                        }

                        break;
                    }

                    Reader.Seek(376);
                    short Type = Reader.ReadShort();
                    Reader.Seek(-378);
                    // 1 = weapon, 2 = shield, 5 = cloak, 7 = after, 6 = default
                    switch (Type)
                    {
                    case 1:
                        Part = new IGCCorePartWeapon(Reader);
                        break;

                    case 2:
                        //Part = new IGCCorePartShield(Reader);
                        break;

                    case 4:
                        Part = new IGCCorePartShield(Reader);
                        break;

                    case 5:
                        Part = new IGCCorePartCloak(Reader);
                        break;

                    case 7:
                        Part = new IGCCorePartAfterburner(Reader);
                        break;

                    case 6:
                        Part = new IGCCorePartPack(Reader);
                        break;

                    default:
                        break;
                    }
                    if (Part != null)
                    {
                        _parts.Add(Part);
                    }

                    break;

                case AGCObjectType.AGC_ChaffType:                                 // 26
                    _chaffs.Add(new IGCCoreCounter(Reader));
                    break;

                case AGCObjectType.AGC_MissileType:                                 // 23
                    _missiles.Add(new IGCCoreMissile(Reader));
                    break;

                case AGCObjectType.AGC_MineType:                                 // 24
                    _mines.Add(new IGCCoreMine(Reader));
                    break;

                case AGCObjectType.AGC_DroneType:
                    _drones.Add(new IGCCoreDrone(Reader));
                    break;

                case AGCObjectType.AGC_ProbeType:
                    _probes.Add(new IGCCoreProbe(Reader));
                    break;

                case AGCObjectType.AGC_ProjectileType:                                  //22
                    _projectiles.Add(new IGCCoreProjectile(Reader));
                    break;

                case AGCObjectType.AGC_TreasureSet:
                    _treasureSets.Add(new IGCCoreTreasureSet(Reader));
                    break;

                default:
                    break;
                }
                if (CoreFS.Position != Pos + Size)
                {
                    throw new Exception("Error occured while reading core file");
                }
            }
            CoreFS.Close();
            Reader = null;

//			}
//			catch (Exception e)
//			{
//				return;
//			}
            return;
        }
Пример #6
0
        public void AssignDefaultCargo()
        {
            // Add the default parts
            foreach (short id in _ship.DefaultLoadout)
            {
                if (id == -1)
                {
                    continue;
                }

                IGCCorePart Part = GetOverriddenPart((ushort)id);
                // If the part doesn't exist, skip it
                if (Part == null)
                {
                    continue;
                }

                if (Part is IGCCoreCounter && _chaff == null)
                {
                    if (CanMountPart(Part, ShipSlots.Chaff))
                    {
                        _chaff = (IGCCoreCounter)Part;
                    }
                }

                if (Part is IGCCoreMine && _pack == null)
                {
                    if (CanMountPart(Part, ShipSlots.Pack))
                    {
                        _pack = Part;
                    }
                }

                if (Part is IGCCoreMissile && _missile == null)
                {
                    if (CanMountPart(Part, ShipSlots.Missile))
                    {
                        _missile = (IGCCoreMissile)Part;
                    }
                }

                if (Part is IGCCoreProbe && _pack == null)
                {
                    if (CanMountPart(Part, ShipSlots.Pack))
                    {
                        _pack = Part;
                    }
                }

                if (Part is IGCCorePartAfterburner && _booster == null)
                {
                    if (CanMountPart(Part, ShipSlots.Booster))
                    {
                        _booster = (IGCCorePartAfterburner)Part;
                    }
                }

                if (Part is IGCCorePartCloak && _cloak == null)
                {
                    if (CanMountPart(Part, ShipSlots.Cloak))
                    {
                        _cloak = (IGCCorePartCloak)Part;
                    }
                }

                if (Part is IGCCorePartShield && _shield == null)
                {
                    if (CanMountPart(Part, ShipSlots.Shield))
                    {
                        _shield = (IGCCorePartShield)Part;
                    }
                }

                if (Part is IGCCorePartWeapon)
                {
                    int WeaponIndex = 0;
                    int TurretIndex = 0;
                    for (int i = 0; i < _ship.WeaponMounts.Length; i++)
                    {
                        IGCCoreShipMP Mount = _ship.WeaponMounts[i];
                        if (Mount.PartType == 1)
                        {                               // it's a weapon
                            if (CanMountPart(Part, (ShipSlots)(WeaponIndex)))
                            {
                                if (_weapons[WeaponIndex] == null)
                                {
                                    _weapons[WeaponIndex] = (IGCCorePartWeapon)Part;
                                }
                            }

                            WeaponIndex++;
                        }
                        else
                        {                               // It's a turret!
                            if (CanMountPart(Part, (ShipSlots)(TurretIndex + 4)))
                            {
                                if (_turrets[TurretIndex] == null)
                                {
                                    _turrets[TurretIndex] = (IGCCorePartWeapon)Part;
                                }
                            }

                            TurretIndex++;
                        }
                    }
                }
            }

            // Add default cargo

            bool AmmoRequired = (_ship.WeaponMounts.Length > 0);
            bool FuelRequired = CanUseSlot(ShipSlots.Booster);

            int SlotIndex = 0;

            // Add Slot 1: Missile, Pack, Fuel, Ammo, empty
            if (CanUseSlot(ShipSlots.Missile) && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = _missile;
            }
            if (CanUseSlot(ShipSlots.Pack) == true && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = _pack;
            }
            if (FuelRequired && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = FuelPack;
            }
            if (AmmoRequired == true && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = AmmoPack;
            }

            SlotIndex++;

            // Add Slot 2: (Pack), (Missile), Ammo, Fuel, empty
            if (_cargo[0] != _pack && CanUseSlot(ShipSlots.Pack) && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = _pack;
            }
            if (_cargo[0] != _missile && CanUseSlot(ShipSlots.Missile) && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = _missile;
            }
            if (AmmoRequired == true && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = AmmoPack;
            }
            if (FuelRequired && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = FuelPack;
            }

            SlotIndex++;

            // Add Slot 3: Fuel, ammo, empty
            if (FuelRequired && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = FuelPack;
            }
            if (AmmoRequired == true && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = AmmoPack;
            }

            SlotIndex++;

            // Add Slot 4: ammo, fuel, empty
            if (AmmoRequired && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = AmmoPack;
            }
            if (FuelRequired && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = FuelPack;
            }

            SlotIndex++;

            // Add Slot 5: fuel, ammo, empty
            if (FuelRequired && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = FuelPack;
            }
            if (AmmoRequired == true && _cargo[SlotIndex] == null)
            {
                _cargo[SlotIndex] = AmmoPack;
            }
        }