Beispiel #1
0
        public static void FireBeamWeapons(StarSystem starSys, Entity beamWeapon)
        {
            WeaponStateDB stateInfo = beamWeapon.GetDataBlob <WeaponStateDB>();
            FireControlInstanceAbilityDB fireControl = stateInfo.FireControl.GetDataBlob <FireControlInstanceAbilityDB>();

            // only fire if the beam weapon is finished with its cooldown
            if (stateInfo.CoolDown <= TimeSpan.FromSeconds(0) && stateInfo.FireControl != null && fireControl.IsEngaging)
            {
                //TODO chance to hit
                //int damageAmount = 10;//TODO damageAmount calc
                int damageAmount = beamWeapon.GetDataBlob <BeamWeaponAtbDB>().BaseDamage; // TODO: Better damage calculation

                double range = fireControl.Target.GetDataBlob <PositionDB>().GetDistanceTo(beamWeapon.GetDataBlob <ComponentInstanceInfoDB>().ParentEntity.GetDataBlob <PositionDB>());

                // only fire if target is in range
                if (range <= Math.Min(beamWeapon.GetDataBlob <BeamWeaponAtbDB>().MaxRange, stateInfo.FireControl.GetDataBlob <BeamFireControlAtbDB>().Range))
                {
                    DamageProcessor.OnTakingDamage(stateInfo.FireControl, damageAmount);
                    stateInfo.CoolDown = TimeSpan.FromSeconds(beamWeapon.GetDataBlob <BeamWeaponAtbDB>().PowerRechargeRate);
                    starSys.SystemManager.ManagerSubpulses.AddEntityInterupt(starSys.SystemManager.ManagerSubpulses.SystemLocalDateTime + stateInfo.CoolDown, PulseActionEnum.SomeOtherProcessor, beamWeapon);
                }
            }
        }
Beispiel #2
0
        public static void RecalcBeamWeapons(Entity ship)
        {
            var instancesDB = ship.GetDataBlob <ComponentInstancesDB>();
            List <KeyValuePair <Entity, PrIwObsList <Entity> > > beamWeaponEntities = instancesDB.SpecificInstances.GetInternalDictionary().Where(item => item.Key.HasDataBlob <BeamWeaponAtbDB>()).ToList();
            List <Entity> fireControlEntities = new List <Entity>();

            BeamWeaponsDB bwDB;

            int numFireControls  = 0;
            int numBeamWeapons   = 0;
            int totalDamage      = 0;
            int maxDamage        = 0;
            int maxRange         = 0;
            int maxTrackingSpeed = 0;

            foreach (KeyValuePair <Entity, PrIwObsList <Entity> > beamWeaponTemplate in beamWeaponEntities)
            {
                foreach (Entity beamWeapon in beamWeaponTemplate.Value)
                {
                    WeaponStateDB        state = beamWeapon.GetDataBlob <WeaponStateDB>();
                    BeamWeaponAtbDB      bwAtb = beamWeapon.GetDataBlob <BeamWeaponAtbDB>();
                    BeamFireControlAtbDB fcAtb = state.FireControl.GetDataBlob <BeamFireControlAtbDB>();

                    if (!fireControlEntities.Contains(state.FireControl))
                    {
                        ;                                                   //This semi-colon is probably bad
                    }
                    fireControlEntities.Add(state.FireControl);

                    numBeamWeapons++;
                    totalDamage += bwAtb.BaseDamage; // How is damage at any range calculated?
                    if (bwAtb.BaseDamage > maxDamage)
                    {
                        maxDamage = bwAtb.BaseDamage;
                    }
                    if (bwAtb.MaxRange > maxRange)
                    {
                        if (fcAtb.Range > bwAtb.MaxRange)
                        {
                            maxRange = bwAtb.MaxRange;
                        }
                        else if (fcAtb.Range > maxRange)
                        {
                            maxRange = fcAtb.Range;
                        }
                    }

                    if (fcAtb.TrackingSpeed > maxTrackingSpeed)
                    {
                        maxTrackingSpeed = fcAtb.TrackingSpeed;
                    }
                }
            }
            numFireControls = fireControlEntities.Count;

            bwDB = ship.GetDataBlob <BeamWeaponsDB>();

            bwDB.NumFireControls  = numFireControls;
            bwDB.NumBeamWeapons   = numBeamWeapons;
            bwDB.TotalDamage      = totalDamage;
            bwDB.MaxDamage        = maxDamage;
            bwDB.MaxRange         = maxRange;
            bwDB.MaxTrackingSpeed = maxTrackingSpeed;
        }
Beispiel #3
0
 public WeaponStateDB(WeaponStateDB db)
 {
     CoolDown    = db.CoolDown;
     FireControl = db.FireControl;
 }