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); }
} // 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