private void KilledMonster(IGameTank gameTank, Monster monster) { var gameState = _game.GameState; if (monster.OnDeathAbility != null) { monster.OnDeathAbility.Invoke(gameState); } gameState.Foes.Remove(monster); if (!gameState.Lost) { gameTank.Killed++; if (monster is BossMonster) { gameTank.BossesKilled++; } } }
private void SpawnFoes(GameState gameState) { CheckForNewWave(); int foesToSpawnLog = _game.FoesToSpawn; while (foesToSpawnLog > 0) { if (_game.GameState.Wave % 5 == 0) { _game.FoesToSpawn = 0; AbilityType type = _game.GameState.WaveType; BossMonster m = new BossMonster(foesToSpawnLog * (int)(_game.MonsterStartHealth * Math.Pow(1.1, gameState.Wave) + 1), type); m.Location = new Location(gameState.Size.Width / 2 - m.Size.Width / 2.0, gameState.Size.Height / 2 - m.Size.Height / 2.0); foesToSpawnLog = 0; gameState.Foes.Add(m); } else { _game.FoesToSpawn--; foesToSpawnLog /= 10; AbilityType type; int rand = new Random().Next(1, 20); if (rand == 1) { type = AbilityType.Healing; } else if (rand == 2) { type = AbilityType.Splitter; } else if (rand == 3) { type = AbilityType.RangedHeat; } else if (rand == 4) { type = AbilityType.Fast; } else if (rand == 5) { type = AbilityType.Kamakaze; } else { type = _game.GameState.WaveType; } Monster m = new Monster((int)(_game.MonsterStartHealth * Math.Pow(1.1, gameState.Wave) + 1), type) { Location = new Location(gameState.Size.Width / 2 - Monster.Width / 2.0, gameState.Size.Height / 2 - Monster.Height / 2.0) }; gameState.Foes.Add(m); } } }
protected void SetOnHitAbilities() { if (AbilityType == AbilityType.Fast) { Speed = (Speed + MaxSpeed) / 2; Velocity.Total *= 1.1; } else if (AbilityType == AbilityType.Splitter) { OnHitAbility = (gameState, damageTaken) => { if (_heat <= 0 && gameState.Foes.Count < 100 && Health > 1 && Generation < 5) { var heatGain = 20; _heat += heatGain; Health /= 2; Generation++; var splitling = new Monster(Health, AbilityType.Splitter) { Location = new Location(X, Y), Velocity = new Vector(Velocity.X + _random.NextDouble() - .5, Velocity.Y + _random.NextDouble() - .5), Speed = Speed, Generation = Generation }; splitling._heat = heatGain; gameState.Foes.Add(splitling); } }; } }