/// <summary> /// Returns a particular logged action. /// </summary> /// <returns></returns> private static ActionFeedback LogAction(Actor attacker, Actor defender, AttackLocation loc, DamageType type, LogMessageStatus status, int diceroll) { //Later we'll expand this and put in some randomisation and stuff ActionFeedback log = null; if (status == LogMessageStatus.BOUNCE) { //Bounces off the armour if (!attacker.IsPlayerCharacter) { if (type == DamageType.CRUSH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "The hit bounces off your armour"); } else if (type == DamageType.SLASH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "The hit scratches the armour, but doesn't cut through"); } else if (type == DamageType.STAB) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "The hit fails to punch through your armour"); } else if (type == DamageType.THRUST) { log = log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "The hit fails to punch through your armour"); } else if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "The missile fails to punch through your armour"); } } else { if (type == DamageType.CRUSH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "The hit bounces off your target's armour"); } else if (type == DamageType.SLASH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "The hit scratches the armour, but doesn't cut through"); } else if (type == DamageType.STAB) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "The hit fails to punch through your target's armour"); } else if (type == DamageType.THRUST) { log = log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "The hit fails to punch through your target's armour"); } else if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "The missile fails to punch through your target's armour"); } } return log; } if (status == LogMessageStatus.DESTROY) { if (!attacker.IsPlayerCharacter) { if (type == DamageType.CRUSH) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " smashes into pulp under the force of the blow"); } else if (type == DamageType.SLASH) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " flies off in an arc"); } else if (type == DamageType.STAB) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " dangles off by its skin"); } else if (type == DamageType.THRUST) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " dangles off by its skin"); } else if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your perforated " + loc.ToString().ToLower().Replace("_", " ") + " hangs limply off your side"); } } else { if (type == DamageType.CRUSH) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " smashes into pulp under the force of the blow"); } else if (type == DamageType.SLASH) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " flies off in an arc"); } else if (type == DamageType.STAB) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " dangles off by its skin"); } else if (type == DamageType.THRUST) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " dangles off by its skin"); } else if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "Your opponent's perforated " + loc.ToString().ToLower().Replace("_", " ") + " hangs limply off their side"); } } return log; } if (status == LogMessageStatus.DISABLE) { if (!attacker.IsPlayerCharacter) { if (type == DamageType.CRUSH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " cracks loudly as the bones smash under the blow"); } else if (type == DamageType.SLASH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " is cut open with the attack"); } else if (type == DamageType.STAB) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " bleeds heavily as the attack goes through"); } else if (type == DamageType.THRUST) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " bleeds heavily as the attack goes through"); } else if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkRed, "Your " + loc.ToString().ToLower().Replace("_", " ") + " bleeds heavily as the missile pierces through"); } } else { if (type == DamageType.CRUSH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " cracks loudly as the bones smash under the blow"); } else if (type == DamageType.SLASH) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " is cut open with the attack"); } else if (type == DamageType.STAB) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " bleeds heavily as the attack goes through"); } else if (type == DamageType.THRUST) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " bleeds heavily as the attack goes through"); } else if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkGreen, "Your opponent's " + loc.ToString().ToLower().Replace("_", " ") + " bleeds heavily as the missile pierces through"); } } return log; } if (status == LogMessageStatus.HIT) { if (attacker.IsPlayerCharacter) { if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.BOW, Color.DarkGreen, "You loose (" + diceroll + ") at " + defender.EnemyData.EnemyName + " and hit him in the " + loc.ToString().ToLower().Replace("_", " ")); } else { log = new LogFeedback(InterfaceSpriteName.SWORD, Color.DarkGreen, "You swing (" + diceroll + ") at " + defender.EnemyData.EnemyName + " and hit him in the " + loc.ToString().ToLower().Replace("_", " ")); } } else { if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.SWORD, Color.DarkRed, attacker.EnemyData.EnemyName + " looses (" + diceroll + ") a projectile at you and hits you in the " + loc.ToString().ToLower().Replace("_", " ")); } else { log = new LogFeedback(InterfaceSpriteName.SWORD, Color.DarkRed, attacker.EnemyData.EnemyName + " swings (" + diceroll + ") at you and hits you in the " + loc.ToString().ToLower().Replace("_", " ")); } } return log; } if (status == LogMessageStatus.KILL) { if (attacker.IsPlayerCharacter) { log = new LogFeedback(InterfaceSpriteName.HEAD, Color.DarkGreen, "You strike your opponent down"); } else { //log = new CurrentLogFeedback(InterfaceSpriteName.HEAD, Color.DarkRed, "You die"); log = new CreateEventFeedback("Death"); } return log; } if (status == LogMessageStatus.MISS) { //We have a miss if (attacker.IsPlayerCharacter) { if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.SWORD, Color.DarkRed, "You loose (" + diceroll + ") your projectile at " + defender.EnemyData.EnemyName + "'s " + loc.ToString().ToLower().Replace("_", " ") + " but miss"); } else { log = new LogFeedback(InterfaceSpriteName.SWORD, Color.DarkRed, "You swing (" + diceroll + ") at " + defender.EnemyData.EnemyName + "'s " + loc.ToString().ToLower().Replace("_", " ") + " but miss"); } } else { //Player is the defender if (type == DamageType.PIERCE) { log = new LogFeedback(InterfaceSpriteName.SWORD, Color.DarkGreen, "The " + attacker.EnemyData.EnemyName + " looses (" + diceroll + ") their projectile at your " + loc.ToString().ToLower().Replace("_", " ") + ", but misses"); } else { log = new LogFeedback(InterfaceSpriteName.SWORD, Color.DarkGreen, "The " + attacker.EnemyData.EnemyName + " swings (" + diceroll + ") at your " + loc.ToString().ToLower().Replace("_", " ") + ", but misses"); } } return log; } if (status == LogMessageStatus.NO_WOUND) { //No damage! if (attacker.IsPlayerCharacter) { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkRed, "You however fail to wound your opponent"); } else { log = new LogFeedback(InterfaceSpriteName.BLOOD, Color.DarkGreen, "It fails to properly wound you, however"); } return log; } if (status == LogMessageStatus.BLEED) { if (defender.IsPlayerCharacter) { if (defender.Anatomy.BloodLoss == 1) { //Wound opened log = new LogFeedback(InterfaceSpriteName.BLEEDING, Color.DarkRed, "The attack opens a wound"); } else { //Wound worsended log = new LogFeedback(InterfaceSpriteName.BLEEDING, Color.DarkRed, "The attack worsens your wound"); } } return log; } if (status == LogMessageStatus.DEFENDED) { log = new LogFeedback(InterfaceSpriteName.DEFENSE, Color.DarkBlue, "You dodge the blow at the last moment"); return log; } throw new NotImplementedException("No idea what to do here"); }
/// <summary> /// Get a blessing for this particular actor, and apply it. /// </summary> /// <param name="actor"></param> public static void GetAndApplyBlessing(Actor actor, out LogFeedback logFeedback) { //Determine how much skill they have int effectiveSkill = actor.Attributes.GetSkill(SkillName.RITUALIST) + actor.Attributes.Char - 5; effectiveSkill = effectiveSkill > 1 ? effectiveSkill : 1; //at least 1 //Get a random number from 0 to effectiveskill * 2 int randomNumber = GameState.Random.Next(0, effectiveSkill * 2); //Grab this number and pick the Blessing with the right enum. if we're too big then go for the biggest value BlessingType[] blessings = (BlessingType[])Enum.GetValues(typeof(BlessingType)); if (randomNumber >= blessings.Length) { randomNumber = blessings.Length; } //And your blessing is.... BlessingType blessing = blessings[randomNumber]; //Now let's see what type of blessing it is InventoryItemManager iim = new InventoryItemManager(); Effect effect = new Effect(); logFeedback = null; switch (blessing) { case BlessingType.AGIL_1: //Apply +1 agility for 4 times the effective skill effect.EffectAmount = 1; effect.Name = EffectName.AGIL; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.AGIL_2: effect.EffectAmount = 2; effect.Name = EffectName.AGIL; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.ARMOUR: { //Spawn a piece of armour worth 50 * effective skill var inventoryItem = iim.GetBestCanAfford("ARMOUR", 50 * effectiveSkill); if (inventoryItem != null) { inventoryItem.InInventory = true; actor.Inventory.Inventory.Add(inventoryItem.Category, inventoryItem); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "Your have been given a gift..."); } else { logFeedback = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkRed, "Your prayers have not been answered"); } } break; case BlessingType.BRAWN_1: effect.EffectAmount = 1; effect.Name = EffectName.BRAWN; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.BRAWN_2: effect.EffectAmount = 2; effect.Name = EffectName.BRAWN; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.CHAR_1: effect.EffectAmount = 1; effect.Name = EffectName.CHAR; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.CHAR_2: effect.EffectAmount = 2; effect.Name = EffectName.CHAR; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.DEFENCE: //TODO LATER break; case BlessingType.EXPERIENCE: //Increase the skill in Rituals by a 10 times (fixed) for (int i = 0; i < 10; i++) { actor.Attributes.IncreaseSkill(SkillName.RITUALIST); } logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "Nothing happens, but you feel smarter for having tried"); break; case BlessingType.EXPLORE: //Explore the entire map for (int x = 0; x < GameState.LocalMap.localGameMap.GetLength(0); x++) { for (int y = 0; y < GameState.LocalMap.localGameMap.GetLength(1); y++) { if (GameState.LocalMap.localGameMap[x, y, 0] != null) { GameState.LocalMap.localGameMap[x, y, 0].WasVisited = true; } } } logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You have been granted knowledge on the structure of this level"); break; case BlessingType.FEEDING: //A slap-up meal actor.FeedingLevel = FeedingLevel.STUFFED; logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel very full..."); break; case BlessingType.HEALING: //Heal the user for as many rounds as effective skill HealthCheckManager.HealCharacter(actor, effectiveSkill); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel your wounds knit together"); break; case BlessingType.INTEL_1: effect.EffectAmount = 1; effect.Name = EffectName.INTEL; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.INTEL_2: effect.EffectAmount = 2; effect.Name = EffectName.INTEL; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.KILL: //Go through the map and slaughter a total amount of enemies equal to effective skill for (int i = 0; i < effectiveSkill; i++) { var deadActor = GameState.LocalMap.Actors.Where(a => a.IsAggressive && a.IsActive && a.IsAlive && !a.IsPlayerCharacter).FirstOrDefault(); if (deadActor != null) { CombatManager.KillCharacter(deadActor); } } logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "A sprit of death travels through the location and slaughters a number of your enemies"); break; case BlessingType.LOOT: { //Spawn a piece of loot worth 50 * effective skill var inventoryItem = iim.GetBestCanAfford("LOOT", 50 * effectiveSkill); if (inventoryItem != null) { inventoryItem.InInventory = true; actor.Inventory.Inventory.Add(inventoryItem.Category, inventoryItem); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "Your have been given a gift..."); } else { logFeedback = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkRed, "Your prayers have not been answered"); } } break; case BlessingType.PERC_1: effect.EffectAmount = 1; effect.Name = EffectName.PERC; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.PERC_2: effect.EffectAmount = 2; effect.Name = EffectName.PERC; effect.MinutesLeft = 4 * effectiveSkill; effect.EffectDisappeared = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkBlue, "The effect of the blessing disappears"); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "You feel different. Good different"); break; case BlessingType.WEAPON: { //Spawn a piece of loot worth 50 * effective skill var inventoryItem = iim.GetBestCanAfford("WEAPON", 50 * effectiveSkill); if (inventoryItem != null) { inventoryItem.InInventory = true; actor.Inventory.Inventory.Add(inventoryItem.Category, inventoryItem); logFeedback = new LogFeedback(InterfaceSpriteName.SUN, Color.ForestGreen, "Your have been given a gift..."); } else { logFeedback = new LogFeedback(InterfaceSpriteName.MOON, Color.DarkRed, "Your prayers have not been answered"); } } break; } if (effect != null) { //Apply it EffectsManager.PerformEffect(actor, effect); } }