示例#1
0
        // 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();
            }
        }