public void MoveMonster(Direction direction, Monster monster) { Cell currentCell = Cells[monster.Y, monster.X]; Cell newCell = NewCell(direction, monster); if (newCell != null) { var newPlayer = newCell.GetPlayer(this); var newPotion = newCell.GetPotion(this); var newMonster = newCell.GetMonster(this); List<StateChange> changes = new List<StateChange>(); if (newPlayer != null) { newPlayer.Health -= monster.Damage; if (newPlayer.Health <= 0) { monster.Gold += newPlayer.Gold; newPlayer.Gold = 0; SpawnCharacters(newPlayer); monster.X = newCell.X; monster.Y = newCell.Y; changes.Add(StateChange.Update(monster)); } changes.Add(StateChange.Update(newPlayer)); } else if (newPotion != null) { monster.Health += newPotion.Health; potions.Remove(newPotion); monster.X = newCell.X; monster.Y = newCell.Y; changes.Add(StateChange.Update(monster)); changes.Add(StateChange.Remove(newPotion)); } else if (newCell.IsWalkable(this)) { monster.Gold += newCell.Gold; newCell.Gold = 0; monster.X = newCell.X; monster.Y = newCell.Y; changes.Add(StateChange.Update(monster)); changes.Add(StateChange.Update(newCell)); } if (changes.Count > 0) { OnChanged(changes.ToArray()); } } }
public void MonsterSpawner(object arg) { double lastSpawn = 0.0; while (true) { if (TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds - lastSpawn > SPAWN_TIME_MONSTER_MS && monsters.Count < MAX_MONSTERS) { var monster = new Monster(Monster.IdCounter++, random.Next(20, 40), random.Next(5, 12), random.Next(0, 1000)); SpawnCharacters(monster); lock (monsters) { monsters.Add(monster); } lastSpawn = TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds; OnChanged(StateChange.Add(monster)); } } }