コード例 #1
0
        public override void Destroy()
        {
            QuadGrid quad = Parent2DScene.quadGrids.First.Value;

            foreach (Basic2DObject o in quad.Enumerate(Position.get(), new Vector2(GetEngagementDistance() * 2)))
            {
                if (o.GetType().IsSubclassOf(typeof(UnitBasic)))
                {
                    UnitBasic s = (UnitBasic)o;
                    if (!s.Dead && !s.IsAlly(this) && Vector2.Distance(Position.get(), o.Position.get()) < GetEngagementDistance())
                    {
                        s.ShutDownTime = Math.Max(s.ShutDownTime, (int)(1000 * UnitLevel));
                    }
                }
            }

            Vector3 Position3 = new Vector3(Position.X(), 0, Position.Y());

            for (int i = 0; i < 30; i++)
            {
                ParticleManager.CreateParticle(Position3, Rand.V3() * GetEngagementDistance() * 2, ParticleColor, 30, 5);
            }

            for (int i = 0; i < 2; i++)
            {
                FlareSystem.AddLightingPoint(Position3, new Vector3(0.3f), new Vector3(0, 0, 1), GetEngagementDistance(), 40, 5, 10);
                ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, GetEngagementDistance() * 4, 5);
                ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, GetEngagementDistance() * 1.33f, 4);
            }

            base.Destroy();
        }
コード例 #2
0
        protected virtual void AISearch(GameTime gameTime)
        {
            AngerTime -= gameTime.ElapsedGameTime.Milliseconds;
            if (AngerTime > 0 && CurrentAttackTarget != null && CurrentAttackTarget.CanBeTargeted())
            {
                return;
            }

            CurrentAttackTarget = null;
            float BestDistance = 1000000;

            StarshipScene scene = (StarshipScene)Parent2DScene;

            if (GetTeam() != WaveManager.ActiveTeam)
            {
                foreach (Basic2DObject o in FactionManager.SortedUnits[WaveManager.ActiveTeam])
                {
                    if (o != this)
                    {
                        float d = Vector2.Distance(Position.get(), o.getPosition());
                        if (d < BestDistance && o.GetType().IsSubclassOf(typeof(UnitBasic)))
                        {
                            UnitBasic s = (UnitBasic)o;
                            if (s.GetTeam() == WaveManager.ActiveTeam && s.CanBeTargeted())
                            {
                                if (d / s.ThreatLevel < BestDistance && !PathFindingManager.CollisionLine(Position.get(), s.Position.get()))
                                {
                                    BestDistance        = d / s.ThreatLevel;
                                    CurrentAttackTarget = s;
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                foreach (Basic2DObject o in Parent2DScene.GetList(GameObjectTag._2DSolid))
                {
                    if (o != this && o.GetType().IsSubclassOf(typeof(UnitBasic)) && !o.GetType().IsSubclassOf(typeof(UnitBuilding)))
                    {
                        float d = Vector2.Distance(Position.get(), o.getPosition());

                        if (d < BestDistance)
                        {
                            UnitBasic s = (UnitBasic)o;
                            if (!IsAlly(s) && s.CanBeTargeted() &&
                                d / s.ThreatLevel < BestDistance && !PathFindingManager.CollisionLine(Position.get(), s.Position.get()))
                            {
                                BestDistance        = d / s.ThreatLevel;
                                CurrentAttackTarget = s;
                            }
                        }
                    }
                }
            }
        }
コード例 #3
0
        public virtual void Collide(BasicShipGameObject s)
        {
            if (!s.IsAlly(ParentUnit))
            {
                if (!BulletCanBounce || !s.BulletBounces(this))
                {
                    float Damage = getDamage(s, 1);
                    Damage *= ParentUnit.GetDamageMult();
                    s.Damage(Damage, PushTime * Damage, Speed * PushVelocityMult, ParentUnit, attackType);
                }
                else
                {
                    BulletHasBounced = true;

                    if (!BounceSound)
                    {
                        SoundManager.Play3DSound("ShieldBounce", new Vector3(Position.X(), Y, Position.Y()),
                                                 0.35f, 500, 1);
                        BounceSound = true;
                    }

                    if (s.GetType().IsSubclassOf(typeof(UnitBasic)))
                    {
                        UnitBasic b = (UnitBasic)s;
                        b.ShieldFlash(1);
                    }
                    Speed = Vector2.Reflect(Speed, Vector2.Normalize(s.Position.get() - PreviousPosition));
                    Position.set(PreviousPosition);
                    return;
                }
            }

            if (TargetHitCount < MaxHits)
            {
                if (TargetsHit == null)
                {
                    TargetsHit = new BasicShipGameObject[MaxHits];
                    TargetsHit[TargetHitCount++] = s;
                }
                else if (!TargetsHit.Contains(s))
                {
                    TargetsHit[TargetHitCount++] = s;
                }
                else
                {
                    return;
                }
            }
            else
            {
                Destroy();
            }
        }
コード例 #4
0
        public override void Collide(BasicShipGameObject s)
        {
            if (!s.IsAlly(ParentUnit) && s.GetType().IsSubclassOf(typeof(UnitBasic)))
            {
                AttachedUnit   = (UnitBasic)s;
                AttachedOffset = Vector2.Normalize(s.Position.get() - Position.get()) * s.Size.X() / 2;

                if (TimeAlive < MinCollideTimeAlive)
                {
                    TimeAlive = MinCollideTimeAlive;
                }
            }
        }
コード例 #5
0
        public override void Destroy()
        {
            SoundManager.PlaySound("SmallBombExplode", 1, 0, 0);
            SoundManager.DeafTone();
            PlayerShip ParentPlayer = (PlayerShip)ParentUnit;

            ParentPlayer.ShakeScreen(20);

            this.Armed = false;

            Vector3 Position3 = new Vector3(Position.X(), 0, Position.Y());

            for (int i = 0; i < 10; i++)
            {
                ParticleManager.CreateParticle(Position3, Rand.V3() * 6, ParticleColor, 20, 5);
            }

            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 4000, 5);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 400, 7);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 300, 7);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 500, 7);

            for (int i = 0; i < 10; i++)
            {
                FlamingChunkSystem.AddParticle(Position3, Rand.V3(), new Vector3(0, -0.25f, 0),
                                               Rand.V3(), Rand.V3() / 10, 20, 60, new Vector3(1, 0.5f, 0.2f), new Vector3(1, 0.1f, 0.2f), 0, 3);
            }

            ParticleManager.CreateParticle(Position3, Vector3.Zero, new Color(1, 0.75f, 0.5f), 500, 4);
            for (int i = 0; i < 30; i++)
            {
                ParticleManager.CreateParticle(Position3, Rand.V3() * 10, new Color(1, 0.75f, 0.5f), 200, 5);
            }

            QuadGrid quadGrid = Parent2DScene.quadGrids.First.Value;

            foreach (GameObject g in quadGrid.Enumerate(Position.get(), new Vector2(BulletExplosionDistance)))
            {
                if (g.GetType().IsSubclassOf(typeof(UnitBasic)))
                {
                    UnitBasic s = (UnitBasic)g;
                    if (Vector2.Distance(Position.get(), s.Position.get()) < BulletExplosionDistance / 4 && !s.IsAlly(ParentUnit) && !s.GetType().IsSubclassOf(typeof(UnitBuilding)))
                    {
                        s.SmallBomb(ParentUnit);
                    }
                }
            }

            base.Destroy();
        }
コード例 #6
0
        public override void Update(GameTime gameTime)
        {
            int Mult = 4;

            Vector3 Position3 = new Vector3(Position.X(), 0, Position.Y());

            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, 60 * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (70 + Rand.F() * 70) * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (10 + Rand.F() * 20) * Mult, 2);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (10 + Rand.F() * 20) * Mult, 0);
            FlareSystem.AddLightning(Position3, ParticleColor2, 4, 20, 4, 10);

            SearchTime += gameTime.ElapsedGameTime.Milliseconds;
            if (SearchTime > MaxSearchTime || (AttackTarget != null && !AttackTarget.CanBeTargeted()))
            {
                SearchTime  -= MaxSearchTime;
                AttackTarget = null;
                float BestDistance = SearchDistance;

                QuadGrid quad = Parent2DScene.quadGrids.First.Value;
                foreach (Basic2DObject o in quad.Enumerate(Position.get(), new Vector2(SearchDistance * 2)))
                {
                    if (o.GetType().IsSubclassOf(typeof(UnitTurret)))
                    {
                        UnitBasic s = (UnitBasic)o;

                        if (s.CanBeTargeted() && !s.IsAlly(ParentUnit))
                        {
                            float d = Vector2.Distance(Position.get(), o.Position.get());

                            if (d < BestDistance && !o.GetType().Equals(typeof(CrystalWall)))
                            {
                                BestDistance = d;
                                AttackTarget = s;
                            }
                        }
                    }
                }
            }

            if (AttackTarget != null)
            {
                Speed = Logic.ToVector2(Logic.Clerp(Logic.ToAngle(Speed), Logic.ToAngle(AttackTarget.Position.get() - Position.get()),
                                                    TurnSpeed * gameTime.ElapsedGameTime.Milliseconds * 60 / 1000f)) * SpeedL;
            }

            base.Update(gameTime);
        }
コード例 #7
0
        public override void Destroy()
        {
            this.Armed = false;

            Vector3 Position3 = new Vector3(Position.X(), 0, Position.Y());

            for (int i = 0; i < 10; i++)
            {
                ParticleManager.CreateParticle(Position3, Rand.V3() * 2000, ParticleColor, 20, 5);
            }

            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 4000, 5);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 400, 7);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 300, 7);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 500, 7);

            for (int i = 0; i < 2; i++)
            {
                FlamingChunkSystem.AddParticle(Position3, Rand.V3() / 1.5f, new Vector3(0, -0.25f, 0),
                                               Rand.V3(), Rand.V3() / 10, 150, 30, new Vector3(0.2f, 0.5f, 1), new Vector3(0.2f, 0.5f, 1), 0, 3);
            }

            ParticleManager.CreateParticle(Position3, Vector3.Zero, new Color(0.5f, 0.75f, 1), Size.X() * 50, 4);
            for (int i = 0; i < 30; i++)
            {
                ParticleManager.CreateParticle(Position3, Rand.V3() * 200, new Color(0.5f, 0.75f, 1), 200, 5);
            }

            QuadGrid quadGrid = Parent2DScene.quadGrids.First.Value;

            float MaxDist = 150 * Level;

            foreach (GameObject g in quadGrid.Enumerate(Position.get(), new Vector2(MaxDist * 2)))
            {
                if (g.GetType().IsSubclassOf(typeof(UnitBasic)))
                {
                    UnitBasic s = (UnitBasic)g;
                    if (Vector2.Distance(Position.get(), s.Position.get()) < MaxDist && !s.IsAlly(ParentUnit))
                    {
                        s.ShutDownTime = Math.Max(s.ShutDownTime, (int)(2000 * Level));
                    }
                }
            }

            base.Destroy();
        }
コード例 #8
0
        public override void Update(GameTime gameTime)
        {
            int Mult = 4;

            SearchTime += gameTime.ElapsedGameTime.Milliseconds;
            if (SearchTime > MaxSearchTime)
            {
                MaxSearchTime -= SearchTime;

                int EnemyCount = 0;

                QuadGrid quadGrid = Parent2DScene.quadGrids.First.Value;

                foreach (GameObject g in quadGrid.Enumerate(Position.get(), new Vector2(BulletExplosionDistance)))
                {
                    if (g.GetType().IsSubclassOf(typeof(UnitBasic)))
                    {
                        UnitBasic s = (UnitBasic)g;
                        if (Vector2.Distance(Position.get(), s.Position.get()) < BulletExplosionDistance / 8 && !s.IsAlly(ParentUnit) && !s.GetType().IsSubclassOf(typeof(UnitBuilding)) && !s.Dead)
                        {
                            EnemyCount += s.GetUnitWeight();
                        }
                    }
                }
                if (BestEnemyCount > 4 && EnemyCount < BestEnemyCount)
                {
                    Destroy();
                }
                else
                {
                    BestEnemyCount = EnemyCount;
                }
            }

            Vector3 Position3 = new Vector3(Position.X(), 0, Position.Y());

            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, 60 * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (70 + Rand.F() * 70) * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (10 + Rand.F() * 20) * Mult, 2);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (10 + Rand.F() * 20) * Mult, 0);
            FlareSystem.AddLightning(Position3, ParticleColor2, 30, 20, 4, 10);

            base.Update(gameTime);
        }
コード例 #9
0
        public override bool Trigger(PlayerShip p)
        {
            Vector3 Position3 = new Vector3(p.Position.X(), 0, p.Position.Y());

            for (int i = 0; i < 10; i++)
            {
                ParticleManager.CreateParticle(Position3, Rand.V3() * 2000, ParticleColor, 20, 5);
            }

            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 4000, 5);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 400, 7);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 300, 7);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 500, 7);

            for (int i = 0; i < 2; i++)
            {
                FlamingChunkSystem.AddParticle(Position3, Rand.V3() / 1.5f, new Vector3(0, -0.25f, 0),
                                               Rand.V3(), Rand.V3() / 10, 150, 30, new Vector3(0.2f, 0.5f, 1), new Vector3(0.2f, 0.5f, 1), 0, 3);
            }

            ParticleManager.CreateParticle(Position3, Vector3.Zero, new Color(0.5f, 0.75f, 1), p.Size.X() * 50, 4);
            for (int i = 0; i < 30; i++)
            {
                ParticleManager.CreateParticle(Position3, Rand.V3() * 200, new Color(0.5f, 0.75f, 1), 200, 5);
            }

            float MaxDist = 600;

            foreach (GameObject g in p.Parent2DScene.quadGrids.First.Value.Enumerate(p.Position.get(), new Vector2(MaxDist * 2)))
            {
                if (g.GetType().IsSubclassOf(typeof(UnitBasic)))
                {
                    UnitBasic s = (UnitBasic)g;
                    if (Vector2.Distance(p.Position.get(), s.Position.get()) < MaxDist && !p.IsAlly(s))
                    {
                        s.ShutDownTime = Math.Max(s.ShutDownTime, (int)(10000));
                    }
                }
            }

            return(true);
        }
コード例 #10
0
        public override void Update(GameTime gameTime)
        {
            if (!Dead)
            {
                MineAddTime += gameTime.ElapsedGameTime.Milliseconds;
                if (MineAddTime > MaxMineAddTime)
                {
                    MinesToAdd++;
                    MineAddTime = 0;

                    SearchTime -= MaxSearchTime;

                    QuadGrid quad = Parent2DScene.quadGrids.First.Value;

                    foreach (Basic2DObject o in quad.Enumerate(Position.get(), new Vector2(MaxEngagementDistance * 2)))
                    {
                        if (o.GetType().IsSubclassOf(typeof(UnitBasic)))
                        {
                            UnitBasic s = (UnitBasic)o;
                            float     d = Vector2.Distance(Position.get(), o.Position.get());
                            if (!s.IsAlly(this) && s.CanBeTargeted() && d < MaxEngagementDistance + o.Size.X() / 2)
                            {
                                if (Mines.Count > 0)
                                {
                                    float BestDistance = 10000;
                                    Mine  BestMine     = null;

                                    foreach (Mine m in Mines)
                                    {
                                        float MineDist = Vector2.Distance(m.Position.get(), o.Position.get());
                                        if (MineDist < BestDistance)
                                        {
                                            BestDistance = MineDist;
                                            BestMine     = m;
                                        }
                                    }

                                    BestMine.SetAttackTarget(s);
                                    Mines.Remove(BestMine);

                                    SoundManager.Play3DSound("MineFieldTarget", new Vector3(Position.X(), Y, Position.Y()), 0.35f,
                                                             1000, 2);
                                }
                                if (d < (Size.X() + o.Size.X()))
                                {
                                    MinesToAdd = 0;
                                }

                                break;
                            }
                        }
                    }
                }

                if (Mines.Count >= MaxMines)
                {
                    MinesToAdd = 0;
                }

                while (MinesToAdd > 0)
                {
                    Mine m = new Mine(this, FactionNumber);
                    ParentLevel.AddObject(m);
                    Mines.AddLast(m);

                    Vector2 toPosition = Position.get() + Rand.V2() * Size.X() / 2;

                    m.Position.set(toPosition);
                    MinesToAdd--;
                }
            }
            base.Update(gameTime);
        }
コード例 #11
0
 public static void Add(UnitBasic u)
 {
     self.UnitChildren.AddLast(u);
 }
コード例 #12
0
 public void SetShipParent(UnitBasic ShipParent)
 {
     this.ParentUnit = ShipParent;
 }
コード例 #13
0
 public virtual void EffectUnit(UnitBasic s, GameTime gameTime)
 {
     s.SetFieldState(fieldState, ShipEffectTime);
 }
コード例 #14
0
        public override void Update(GameTime gameTime)
        {
            SoundInstance = SoundManager.PlayLoopingSound(SoundInstance, "FieldHum",
                                                          new Vector3(Position.X(), Y, Position.Y()), 0.05f, 800, 2);

            /*
             * if (Parent2DScene.WorldViewerChildren.Count != ActiveSounds.Count)
             * {
             *  SoundManager.Play3DSound("FieldCast", new Vector3(Position.X(), Y, Position.Y()), Vector3.Zero, 1, false);
             *
             *  foreach (SoundManager.ActiveSound a in ActiveSounds)
             *      a.Instance.Stop();
             *
             *  SoundManager.Play3DSound("MiningRingHum", new Vector3(Position.X(), Y, Position.Y()), Vector3.Zero, 0.25f, true);
             *  ActiveSounds.Clear();
             *
             *  for (int i = 0; i < Parent2DScene.WorldViewerChildren.Count; i++)
             *      ActiveSounds.AddLast(SoundManager.ActiveSounds[SoundManager.ActiveSoundCount - (i + 1)]);
             * }
             */

            for (int i = 0; i < CircleGlows; i++)
            {
                float   R = (float)(((float)i / CircleGlows * 2 * Math.PI) + (Level.Time % 2 / 2f * Math.PI) / 2);
                Vector3 P = new Vector3((float)Math.Cos(R) * Size.X() + Position.X(), 0, (float)Math.Sin(R) * Size.X() + Position.Y());
                ParticleManager.CreateParticle(P, Vector3.Zero, CircleColor * Alpha, 64, 0);
            }

            TimeAlive += gameTime.ElapsedGameTime.Milliseconds;
            if (TimeAlive > LifeTime)
            {
                Alpha -= gameTime.ElapsedGameTime.Milliseconds * 60 / 1000f * AlphaChangeRate;
                if (Alpha < 0)
                {
                    Destroy();
                }
            }
            else
            {
                TargetSize -= Vector2.One * 0.25f * gameTime.ElapsedGameTime.Milliseconds * 60 / 1000f;
                Size.setNoPerform(Size.get() + Vector2.One * 4 * gameTime.ElapsedGameTime.Milliseconds * 60 / 1000f);
                if (Size.X() > TargetSize.X)
                {
                    Size.setNoPerform(TargetSize);
                }

                if (Alpha < 1)
                {
                    Alpha += gameTime.ElapsedGameTime.Milliseconds * 60 / 1000f * AlphaChangeRate;
                    if (Alpha > 1)
                    {
                        Alpha = 1;
                    }
                }

                SearchTime += gameTime.ElapsedGameTime.Milliseconds;
                if (SearchTime > MaxSearchTime)
                {
                    SearchTime -= MaxSearchTime;
                    QuadGrid quad = Parent2DScene.quadGrids.First.Value;
                    foreach (Basic2DObject o in quad.Enumerate(Position.get(), Size.get()))
                    {
                        if ((o.GetType().IsSubclassOf(typeof(UnitShip)) || o.GetType().IsSubclassOf(typeof(PlayerShip))) && Vector2.Distance(o.Position.get(), Position.get()) < Size.X())
                        {
                            UnitBasic u = (UnitBasic)o;
                            if (u.GetTeam() != WaveManager.ActiveTeam)
                            {
                                EffectUnit((UnitBasic)o, gameTime);
                            }
                        }
                    }
                }
            }

            base.Update(gameTime);
        }
コード例 #15
0
 public void SetParent(UnitBasic Parent)
 {
     this.Parent = Parent;
 }
コード例 #16
0
        public override void Update(GameTime gameTime)
        {
            SoundInstance = SoundManager.PlayLoopingSound(SoundInstance, "SlowFieldHum",
                                                          new Vector3(Position.X(), Y, Position.Y()), 0.03f, MaxEngagementDistance + 200, 2);

            Size.set(new Vector2(SlowFieldCard.STurretSize - 5 + 10 * Rand.F()));

            Vector2 ProjectedPosition = Position.get() + Rand.NV2() * MaxEngagementDistance;
            Vector3 Position3         = new Vector3(ProjectedPosition.X, Y, ProjectedPosition.Y);

            ParticleManager.CreateParticle(Position3, Rand.V3() * Size.X() * 2, ParticleColor, 40, 5);
            if (!Dead)
            {
                SearchTime += gameTime.ElapsedGameTime.Milliseconds;
                if (SearchTime > MaxSearchTime)
                {
                    bool CanEmp = true;
                    SearchTime -= MaxSearchTime;

                    QuadGrid quad = Parent2DScene.quadGrids.First.Value;

                    foreach (Basic2DObject o in quad.Enumerate(Position.get(), new Vector2(MaxEngagementDistance * 2)))
                    {
                        if (o.GetType().IsSubclassOf(typeof(UnitBasic)))
                        {
                            UnitBasic s = (UnitBasic)o;
                            if (!s.Dead && !s.IsAlly(this) && Vector2.Distance(Position.get(), o.Position.get()) < MaxEngagementDistance - o.Size.X())
                            {
                                if (s.GetType().IsSubclassOf(typeof(UnitShip)))
                                {
                                    UnitShip s2 = (UnitShip)s;
                                    if (!s2.Slowed)
                                    {
                                        s2.Slowed        = true;
                                        s2.Acceleration /= 2;
                                        if (s.Weakness == AttackType.Blue)
                                        {
                                            s2.Acceleration /= 2;
                                            if (CanEmp)
                                            {
                                                CanEmp = false;
                                                s2.EMP(this, IsUpdgraded ? 1 : 0);

                                                if (s2.TestTag(UnitTag.Monster))
                                                {
                                                    SearchTime -= MaxSearchTime / 5;
                                                }
                                            }
                                        }
                                        s2.MaxEngagementDistance /= 1.5f;
                                        s2.MinEngagementDistance /= 1.5f;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            base.Update(gameTime);
        }
コード例 #17
0
        public override void Update(GameTime gameTime)
        {
            StunDistance = 500;
            if (StunnedUnit == null)
            {
                Power += gameTime.ElapsedGameTime.Milliseconds;
            }

            if (Power > MaxPower)
            {
                Power           = MaxPower;
                StunSearchTime += gameTime.ElapsedGameTime.Milliseconds;
                if (StunSearchTime > MaxStunSearchTime && (StunnedUnit == null || !StunnedUnit.CanBeTargeted()))
                {
                    StunSearchTime -= MaxStunSearchTime;

                    QuadGrid quad         = Parent2DScene.quadGrids.First.Value;
                    float    BestDistance = StunDistance;

                    foreach (Basic2DObject o in quad.Enumerate(Position.get(), new Vector2(StunDistance)))
                    {
                        if (o.GetType().Equals(typeof(PlayerShip)))
                        {
                            float d = Vector2.Distance(Position.get(), o.Position.get());
                            if (d < BestDistance)
                            {
                                PlayerShip u = (PlayerShip)o;

                                if (WaveManager.ActiveTeam == u.GetTeam() && u.CanBeTargeted())
                                {
                                    BestDistance = d;
                                    StunnedUnit  = u;
                                    Alpha        = 0;
                                }
                            }
                        }
                    }
                }
            }

            if (StunnedUnit != null)
            {
                if (Power > 0 && StunnedUnit.CanBeTargeted() && Vector2.Distance(Position.get(), StunnedUnit.Position.get()) < StunDistance)
                {
                    if (Alpha < 1)
                    {
                        Alpha += gameTime.ElapsedGameTime.Milliseconds * 60 / 1000f * AlphaChange;
                        if (Alpha > 1)
                        {
                            Alpha = 1;
                        }
                    }
                    StunnedUnit.SetSpeed(Vector2.Normalize(StunnedUnit.Position.get() - Position.get()) * 8);
                    StunnedUnit.ShutDownTime = 100;

                    Vector3 ParticlePosition = new Vector3(Position.X(), Y, Position.Y());
                    Vector3 ChangeVector     = (new Vector3(StunnedUnit.Position.X(), Y, StunnedUnit.Position.Y()) - ParticlePosition);
                    ChangeVector.Normalize();
                    ChangeVector *= 10;

                    float StaticDistance  = Vector2.Distance(new Vector2(ParticlePosition.X, ParticlePosition.Z), StunnedUnit.Position.get());
                    float DynamicDistance = StaticDistance;

                    while (DynamicDistance > 10)
                    {
                        ParticleManager.CreateParticle(ParticlePosition, Vector3.Zero, CrystalColor * Alpha, Size.X() + (StunnedUnit.Size.X() - Size.X()) * (1 - DynamicDistance / StaticDistance) * 16, 1);
                        ParticlePosition += ChangeVector;
                        DynamicDistance   = Vector2.Distance(new Vector2(ParticlePosition.X, ParticlePosition.Z), StunnedUnit.Position.get());
                    }
                }
                else
                {
                    StunnedUnit = null;
                }
            }
            base.Update(gameTime);
        }
コード例 #18
0
 public static void SpawnUnit(UnitBasic b)
 {
     b.SetPosition(GetSpawnPosition());
     b.AddReward();
 }
コード例 #19
0
        public virtual void Collide(GameTime gameTime, BasicShipGameObject Other)
        {
            if (Other == null)
            {
                return;
            }

            if (!Dead && !Other.Dead && !Other.IsAlly(this) && FreezeTime < 0 && Other.GetType().IsSubclassOf(typeof(UnitBasic)))
            {
                UnitBasic u = (UnitBasic)Other;
                if (u.FreezeTime < 0)
                {
                    Vector3 Position3 = new Vector3((Position.X() + Other.Position.X()) / 2, Y, (Position.Y() + Other.Position.Y()) / 2);
                    if (CollisionSound.Equals("") && u.CollisionSound.Equals(""))
                    {
                        SoundManager.Play3DSound("CollisionImpact", Position3, 0.5f, 300, 2);
                    }
                    else
                    {
                        SoundManager.Play3DSound(CollisionSound.Equals("") ? u.CollisionSound : CollisionSound,
                                                 Position3, 0.5f, 300, 2);
                    }


                    Damage(Other.fieldState != FieldState.SpeedBoost || Other.FieldStateTime < 1 ? Other.CollisionDamage : Other.CollisionDamage * 1.25f
                           , 5, Position.get() - Other.Position.get(), Other, AttackType.Melee);

                    Other.Damage(fieldState != FieldState.SpeedBoost || FieldStateTime < 1 ? CollisionDamage : CollisionDamage * 1.25f
                                 , 5, Other.Position.get() - Position.get(), this, AttackType.Melee);

                    if (!GetType().IsSubclassOf(typeof(UnitBuilding)))
                    {
                        FreezeTime = Math.Max(FreezeTime, Other.CollisionFreezeTime);
                        StunState  = AttackType.Melee;
                    }
                    if (!u.GetType().IsSubclassOf(typeof(UnitBuilding)))
                    {
                        u.FreezeTime = Math.Max(u.FreezeTime, CollisionFreezeTime);
                        u.StunState  = AttackType.Melee;
                    }
                }
            }

            float MoveAmount = (Size.X() + Other.getSize().X) / 2 - Vector2.Distance(Other.Position.get(), Position.get());

            if (Other.Moveable)
            {
                CollisionIteration++;
                if (CollisionIteration > 10000)
                {
                    CollisionIteration = 0;
                }

                UnitBasic u = (UnitBasic)Other;
                if (Vector2.Distance(u.Position.get(), Position.get()) > 0.1f)
                {
                    u.Push(u.Position.get() + Vector2.Normalize(Other.Position.get() - Position.get()) * MoveAmount / 2, 0);
                    Push(Position.get() + Vector2.Normalize(Position.get() - Other.Position.get()) * MoveAmount / 2, 0);
                }
                else
                {
                    u.Push(u.Position.get() + Vector2.One * MoveAmount, 0);
                    Push(Position.get() - Vector2.One * MoveAmount, 0);
                }
            }
            else
            {
                if (Vector2.Distance(Other.Position.get(), Position.get()) > 0.1f)
                {
                    Push(Position.get() + Vector2.Normalize(Position.get() - Other.Position.get()) * MoveAmount, MoveAmount);
                }
                else
                {
                    Push(Position.get() + Vector2.One * MoveAmount * 2, MoveAmount * 2);
                }
            }
        }
コード例 #20
0
 public static void Remove(UnitBasic u)
 {
     self.UnitChildren.Remove(u);
 }
コード例 #21
0
 public void SetAttackTarget(UnitBasic AttackTarget)
 {
     this.AttackTarget = AttackTarget;
 }
コード例 #22
0
        public virtual void Fire(GameTime gameTime)
        {
            if (ReloadTime <= 0)
            {
                bool   CreatedMatrix  = false;
                Matrix RotationMatrix = Matrix.Identity;
                ChargeTime += gameTime.ElapsedGameTime.Milliseconds;
                if (ChargeTime > MaxChargeTime)
                {
                    while (ROF >= MaxROF && ClipSize > 0 && BurstSize > 0 && (Ammo > 0 || Ammo == -100))
                    {
                        Vector3 P = Parent != null ?
                                    new Vector3(Parent.getParent().Position.X(), 0, Parent.getParent().Position.Y()) :
                                    new Vector3(ParentUnit.Position.X(), 0, ParentUnit.Position.Y());

                        SoundManager.Play3DSound(FireSound,
                                                 P,
                                                 FireVolume, FireDistance, FireExponent);


                        ChargeTime = 0;
                        if (!CreatedMatrix)
                        {
                            CreatedMatrix = true;
                            if (Parent != null)
                            {
                                RotationMatrix = Matrix.CreateRotationZ(-Parent.getRotation());
                            }
                            else if (ParentUnit.Guns != null)
                            {
                                RotationMatrix = Matrix.CreateRotationZ(-ParentUnit.Guns[0].getRotation());
                            }
                        }

                        ROF      -= MaxROF;
                        BurstTime = 0;
                        ClipSize--;
                        BurstSize--;
                        if (Ammo > 0)
                        {
                            Ammo--;
                        }

                        for (int i = 0; i < BulletCount; i++)
                        {
                            Bullet b = getBullet();
                            if (Parent != null)
                            {
                                if (Parent.getParent().GetType().IsSubclassOf(typeof(UnitShip)))
                                {
                                    UnitShip s = (UnitShip)Parent.getParent();
                                    if (s.IsHuge)
                                    {
                                        b.Big = true;
                                    }
                                }
                                Parent.getParent().ParentLevel.AddObject(b);
                                b.SetShipParent(Parent.getParent());

                                ParentUnit = Parent.getParent();
                                Vector3 P3 = InstanceManager.GetWeaponPosition(ParentUnit.GetIntType(), new Vector3(ParentUnit.Position.X(), ParentUnit.Y, ParentUnit.Position.Y()), ref ParentUnit.RotationMatrix, ParentUnit.WeaponIndexID++, ParentUnit.Size.X());

                                Vector2 P2 = getPositionPattern(i);
                                if (P2 != Vector2.Zero)
                                {
                                    P2 = Vector2.Transform(P2, RotationMatrix);
                                }

                                b.SetPosition(new Vector2(P3.X, P3.Z) + P2, false);
                                b.Y = P3.Y;
                                Vector2 v = BulletSpeed * Logic.ToVector2(Parent.getRotation() + Accuracy - Rand.F() * Accuracy * 2 + getDirectionPattern(i));
                                b.SetSpeed(v);
                            }
                            else
                            {
                                ParentUnit.ParentLevel.AddObject(b);
                                if (ParentUnit.GetType().IsSubclassOf(typeof(UnitShip)))
                                {
                                    UnitShip s = (UnitShip)ParentUnit;
                                    if (s.IsHuge)
                                    {
                                        b.Big = true;
                                    }
                                }
                                b.SetShipParent(ParentUnit);
                                b.SetPosition(ParentUnit.Position.get() + Vector2.Transform(getPositionPattern(i), RotationMatrix), false);
                                b.SetSpeed(BulletSpeed * Logic.ToVector2(ParentUnit.Guns[0].getRotation() + Accuracy - Rand.F() * Accuracy * 2 + getDirectionPattern(i)));
                            }

                            b.SetAttackType(attackType);
                            b.SetStartingPosition(b.getPosition());
                            b.SetDamage(Damage, PushTime, PushVelocityMult);
                            b.SetModifierFactor(ModifierFactor);
                            b.SetLifeTime(LifeTime);
                            b.SetExplosive(BulletExplosionDistance, BulletExplosionDamage);
                            b.AddTime(ROF);
                        }
                    }
                }
                else
                {
                    CreateChargeParticles(ChargeTime / (float)(MaxChargeTime));
                }
                if (ClipSize <= 0)
                {
                    ReloadTime += gameTime.ElapsedGameTime.Milliseconds;
                }
            }
        }
コード例 #23
0
        public override void Update(GameTime gameTime)
        {
            if (!BulletHasBounced)
            {
                if (CurrentAttackTarget != null && CurrentAttackTarget.CanBeTargeted())
                {
                    Speed = Vector2.Normalize(CurrentAttackTarget.Position.get() - Position.get()) * Speed.Length();
                }
                else
                {
                    if (CurrentAttackTarget == null)
                    {
                        SearchTime += gameTime.ElapsedGameTime.Milliseconds;
                    }
                    else
                    {
                        SearchTime = MaxSearchTime + 1;
                    }

                    if (SearchTime > MaxSearchTime)
                    {
                        CurrentAttackTarget = null;
                        SearchTime         -= MaxSearchTime;

                        QuadGrid quad         = Parent2DScene.quadGrids.First.Value;
                        float    BestDistance = SearchDistance;

                        foreach (Basic2DObject o in quad.Enumerate(Position.get(), new Vector2(SearchDistance)))
                        {
                            if (o.GetType().IsSubclassOf(typeof(UnitBasic)) && !o.GetType().IsSubclassOf(typeof(UnitBuilding)))
                            {
                                float d = Vector2.Distance(Position.get(), o.Position.get());
                                if (d < BestDistance)
                                {
                                    UnitBasic u = (UnitBasic)o;
                                    if (u.CanBeTargeted() && !ParentUnit.IsAlly(u))
                                    {
                                        CurrentAttackTarget = u;
                                        BestDistance        = d;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            float Mult = (TimeAlive - MinCollideTimeAlive) / (LifeTime - MinCollideTimeAlive) * 8;

            if (Mult < 1)
            {
                Mult = 1;
            }
            Mult *= 3;

            Vector3 Position3 = new Vector3(Position.X(), 0, Position.Y());

            FlareSystem.AddLightning(Position3, ParticleColor2, 10, 70, 3, 6);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, 60 * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (70 + Rand.F() * 70) * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor2, (10 + Rand.F() * 20) * Mult, 2);
            base.Update(gameTime);
        }
コード例 #24
0
 public override void EffectUnit(UnitBasic s, GameTime gameTime)
 {
     base.EffectUnit(s, gameTime);
 }
コード例 #25
0
        public override void Update(GameTime gameTime)
        {
            if (!BulletHasBounced)
            {
                if (CurrentAttackTarget != null && CurrentAttackTarget.CanBeTargeted())
                {
                    Speed = Vector2.Normalize(CurrentAttackTarget.Position.get() - Position.get()) * Speed.Length();
                }
                else
                {
                    if (CurrentAttackTarget == null)
                    {
                        SearchTime += gameTime.ElapsedGameTime.Milliseconds;
                    }
                    else
                    {
                        SearchTime = MaxSearchTime + 1;
                    }

                    if (SearchTime > MaxSearchTime)
                    {
                        CurrentAttackTarget = null;
                        SearchTime         -= MaxSearchTime;

                        QuadGrid quad         = Parent2DScene.quadGrids.First.Value;
                        float    BestDistance = SearchDistance;

                        foreach (Basic2DObject o in quad.Enumerate(Position.get(), new Vector2(SearchDistance)))
                        {
                            if (o.GetType().IsSubclassOf(typeof(UnitBasic)) && !o.GetType().IsSubclassOf(typeof(UnitBuilding)))
                            {
                                float d = Vector2.Distance(Position.get(), o.Position.get());
                                if (d < BestDistance)
                                {
                                    UnitBasic u = (UnitBasic)o;
                                    if (!u.IsAlly(ParentUnit))
                                    {
                                        CurrentAttackTarget = u;
                                        BestDistance        = d;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            float Mult = (TimeAlive * 2 / LifeTime + 1) * 0.5f;

            Vector3 Position3 = new Vector3(Position.X(), Y, Position.Y());

            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 60 * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, (70 + Rand.F() * 70) * Mult, 1);
            ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, (60 + Rand.F() * 20) * Mult, 2);

            if (!Flashed)
            {
                Mult = 1.5f;
                ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 80 * Mult, 0);
                ParticleManager.CreateParticle(Position3, Vector3.Zero, ParticleColor, 80 * Mult, 4);
                Flashed = true;
            }

            base.Update(gameTime);
        }