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(); }
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; } } } } } }
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(); } }
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; } } }
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(); }
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); }
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(); }
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); }
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); }
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); }
public static void Add(UnitBasic u) { self.UnitChildren.AddLast(u); }
public void SetShipParent(UnitBasic ShipParent) { this.ParentUnit = ShipParent; }
public virtual void EffectUnit(UnitBasic s, GameTime gameTime) { s.SetFieldState(fieldState, ShipEffectTime); }
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); }
public void SetParent(UnitBasic Parent) { this.Parent = Parent; }
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); }
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); }
public static void SpawnUnit(UnitBasic b) { b.SetPosition(GetSpawnPosition()); b.AddReward(); }
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); } } }
public static void Remove(UnitBasic u) { self.UnitChildren.Remove(u); }
public void SetAttackTarget(UnitBasic AttackTarget) { this.AttackTarget = AttackTarget; }
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; } } }
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); }
public override void EffectUnit(UnitBasic s, GameTime gameTime) { base.EffectUnit(s, gameTime); }
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); }