示例#1
0
        /// <summary>
        /// Sends attack message with added target for computation, then delivers results
        /// as messages to the player.
        /// </summary>
        /// <param name="target">The target of the attack (in this case, the hero)</param>
        public void Attack(ICombatant target)
        {
            var attackPacket = AttackDeliveryPacket;

            attackPacket.Target = target;
            var attackResult = CombatManager.DeliverAttack(attackPacket);

            if (attackResult.Critical)
            {
                DungeonGameEngine.ProcessMessageQueue(false,
                                                      "The " + EntityName + " got a lucky shot inflicting extra damage.");
            }
            else if (attackResult.Fumble)
            {
                DungeonGameEngine.ProcessMessageQueue(false,
                                                      "You are slightly amused to see the " + EntityName + " strike at your shadow.");
            }
            else if (attackResult.Hit)
            {
                DungeonGameEngine.ProcessMessageQueue(false,
                                                      "The " + EntityName + " hit you.");
            }
            else
            {
                DungeonGameEngine.ProcessMessageQueue(false,
                                                      "The " + EntityName + " missed you.");
            }
        }
示例#2
0
        internal static void Die(Monster deadMonster, ICombatant attacker)
        {
            // To prevent accidentally forgetting to place the call to EarnXP in each monster subclass
            // it was placed in this method with a requirement to pass the attacker.
            if (monsters.Remove(deadMonster))
            {
                CombatManager.AppendDeathMessage("You have killed the " + deadMonster.EntityName + ".");
                deadMonster.DropLoot();

                // Because loot is visible if the tile is revealed, this will explain why you can see it when the hero is blind.
                if (InventoryEffectManager.HeroBlind)
                {
                    DungeonGameEngine.ProcessMessageQueue(false, "You hear the " + deadMonster.EntityName + " drop something.");
                }
            }
            else
            {
                throw new ArgumentOutOfRangeException("Dead monster was not in the monsters list.");
            }
            attacker.EarnXP(deadMonster._XP);
        }
示例#3
0
        }                   // ICombatant

        public void TakeDamage(CombatManager.DamageResult results)
        {
            // If you're hit
            if (results.AttackResult.Critical || results.AttackResult.Hit)
            {
                int  hitsTaken     = 0;
                int  poisonDamage  = 0;
                bool energyDrained = false;
                // Sort out the damage types
                foreach (var damagePair in results.DamageDealt)
                {
                    switch (damagePair.Key)
                    {
                    case CombatManager.DamageType.Slashing:
                    case CombatManager.DamageType.Bludgeoning:
                    case CombatManager.DamageType.Piercing:
                        hitsTaken += damagePair.Value;
                        break;

                    case CombatManager.DamageType.Rust:
                        // TODO: Implement damage to armor in Inventory class
                        break;

                    case CombatManager.DamageType.Poison:
                        poisonDamage += damagePair.Value;
                        // TODO: Research actual poison damage handling, but for now just set Poisoned
                        // For now, TakePoisonDmg randomly causes HP damage while poisoned and healing is stopped.
                        InventoryEffectManager.HeroPoisoned = true;
                        break;

                    case CombatManager.DamageType.Energy:
                        energy       -= damagePair.Value;
                        energyDrained = true;
                        break;

                    default:
                        break;
                    }
                }

                // If you died from regular damage
                if (!TakeHit(hitsTaken))
                {
                    deathMessage = "The " + results.Attacker.EntityName + " has killed you.";
                    DungeonGameEngine.ThisGame.GameOver("killed by a " + results.Attacker.EntityName);
                }

                // If your energy was drained...
                if (energyDrained)
                {
                    // And you survived the drainage...
                    if (SurvivesEnergyChange())
                    {
                        DungeonGameEngine.ProcessMessageQueue(false,
                                                              "You feel a sudden loss of energy.");
                    }
                    else
                    { // or if you die from the drainage
                        CombatManager.AppendDeathMessage(
                            "You had all your remaining energy sucked right out of you.");
                        DungeonGameEngine.ThisGame.GameOver("drained to death");
                    }
                }
            }
        }      // ICombatant
示例#4
0
        public void Attack(ICombatant target)
        {
            // Construct attack message
            CombatManager.AttackDelivery attackMessage = new CombatManager.AttackDelivery();

            var currentWeapon = Inventory.CurrentWeapon;

            if (currentWeapon != null)
            {
                attackMessage.CombatType = currentWeapon.CombatType;
                attackMessage.DamageDice = currentWeapon.DamageDice;
            }
            else
            {
                // http://www.dandwiki.com/wiki/SRD:Unarmed_Strike
                attackMessage.CombatType = CombatManager.CombatType.Melee;
                attackMessage.DamageDice = new KeyValuePair <CombatManager.DamageType, CombatManager.DieType>[]
                {
                    new KeyValuePair <CombatManager.DamageType, CombatManager.DieType>
                        (CombatManager.DamageType.Bludgeoning, CombatManager.DieType.D3)
                };
            }
            attackMessage.CombatType      = CombatManager.CombatType.Melee;
            attackMessage.Attacker        = this;
            attackMessage.Target          = target;
            attackMessage.ToHitModifier   = 0;
            attackMessage.DamageModifiers = new Dictionary <CombatManager.DamageType, int>(0); // Set Capacity to 1


            // Send the attack
            CombatManager.AttackResult attackResult = CombatManager.DeliverAttack(attackMessage);


            // Process the attack results
            if (attackResult.Critical)
            {
                DungeonGameEngine.ProcessMessageQueue(false,
                                                      "You struck a Critical blow to the " + target.EntityName + ".");
            }
            else if (attackResult.Fumble)
            {
                // Not all fumbles have to cause trouble
                if (Utility.Rand.Next(4) == 0)
                {
                    // But this one did, so what happened
                    var fumbleAction = Utility.Rand.Next(100);
                    if (fumbleAction < 70)
                    {
                        // Either you hit yourself
                        DungeonGameEngine.ProcessMessageQueue(false,
                                                              "You swing wildly and miss, hitting yourself in the head in the process.");
                        if (Utility.Rand.Next(2) == 0)
                        {
                            InventoryEffectManager.HeroConfused = true;
                        }
                        else
                        {
                            InventoryEffectManager.KnockHeroUnconcious();
                        }
                    }
                    else
                    {
                        // Or you broke your weapon
                        if (currentWeapon != null)
                        {
                            DungeonGameEngine.ProcessMessageQueue(false, currentWeapon.Break());
                        }
                    }
                }
            }
            else if (attackResult.Hit)
            {
                DungeonGameEngine.ProcessMessageQueue(false,
                                                      "You hit the " + target.EntityName + ".");
            }
            else
            {
                DungeonGameEngine.ProcessMessageQueue(false,
                                                      "You missed the " + target.EntityName + ".");
            }
        }                           // ICombatant