// attempt to attack the current monster public void Attack() { if (CurrentMonster == null) { return; } int damage = RandomGenerator.Next(Player.MinDamage, Player.MaxDamage); damage -= CurrentMonster.Defence; if (damage < 0) { damage = 0; } _monsterHitPoints -= damage; RaiseMessage("You hit the " + CurrentMonster.Name + " for " + damage + " points."); if (_monsterHitPoints <= 0) { // Monster is dead RaiseMessage(""); RaiseMessage("You defeated the " + CurrentMonster.Name); // Give player experience points for killing the monster Player.AddCombatExperience(CurrentMonster.RewardXP); RaiseMessage("You receive " + CurrentMonster.RewardXP + " experience points"); // Give player gold for killing the monster var gold = RandomGenerator.Next(CurrentMonster.MinGold, CurrentMonster.MaxGold); if (gold > 0) { Player.Gold += gold; RaiseMessage("You receive " + gold + " gold"); } // Get random loot from the monster foreach (var lootItem in CurrentMonster.LootTable) { if (RandomGenerator.NextDouble() <= lootItem.DropChance) { int quantity = RandomGenerator.Next(lootItem.MinQuantity, lootItem.MaxQuantity); Player.AddItemToInventory(lootItem.Data, quantity); RaiseMessage("You loot " + quantity + " " + lootItem.Data.Name); } } CurrentMonster.OnKill?.Invoke(this, Player); CurrentMonster = null; RaiseMessage(""); } else { // Monster is still alive DoMonsterMove(); } }