Esempio n. 1
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);
        }
Esempio n. 2
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