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(); }
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); }
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(); }
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; } } }
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; }
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; } }