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