Наследование: Abstract.ActionFeedback
Пример #1
0
        /// <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");
        }
Пример #2
0
        /// <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);
            }
        }