Inheritance: EffectMinMax
Exemple #1
0
    public virtual void ApplyDamage(float damage, DamageElement damageElement = DamageElement.Physical)
    {
        if (damage > 0)
        {
            GameManager.instance.objectPoolManager.Spawn(ObjectPoolType.DamagePopup, damagePopupSpawnTransform, transform.localScale, damage);
        }

        if (AttributesController.health > 0)
        {
            AttributesController.health -= damage;
            EnemyGetDamaged?.Invoke(this);

            ///Blood Effect Spawn.
            GameManager.instance.objectPoolManager.Spawn(ObjectPoolType.BloodSprayEffect, bloodEffectSpawnTransform, transform.localScale);
        }

        if (AttributesController.health <= 0)
        {
            Die();
        }
        else
        {
            AnimationController.SetAnimationParameter(EnemyAnimatorParameter.Hit);
        }
    }
Exemple #2
0
 public Damage(float amount, DamageType type, DamageElement element, Vector3 origin)
 {
     this.amount  = amount;
     this.type    = type;
     this.element = element;
     this.origin  = origin;
 }
Exemple #3
0
        public void AppendDamageLog(Player source, Player target, int magnitude, DamageElement element)
        {
            if (!Logs.ContainsKey(target))
            {
                return;
            }
            Trace.Assert(target != null);
            List <FlowDocument> docs = new List <FlowDocument>()
            {
                Logs[target], GlobalLog
            };

            if (source != null)
            {
                docs.Add(Logs[source]);
            }
            foreach (var doc in docs)
            {
                Paragraph para = LogFormatter.RichTranslateDamage(source, target, magnitude, element);
                if (para != null)
                {
                    doc.Blocks.Add(para);
                }
            }
        }
 public DamageInfo(DamageType type, DamageElement element, float dmg, Pawn source, bool passed = false)
 {
     Type    = type;
     Element = element;
     Damage  = dmg;
     Source  = source;
     Passed  = passed;
 }
 public DamageInfo(DamageType type, DamageElement element, float dmg, Pawn source, bool passed = false)
 {
     Type = type;
     Element = element;
     Damage = dmg;
     Source = source;
     Passed = passed;
 }
        private void DisplayDamage(DamageElement element, float amount)
        {
            GameObject lostHP = Instantiate(lostHPPrefab, lostHpPoint);

            Destroy(lostHP, DISPLAY_DURATION);
            Text txt = lostHP.GetComponent <Text>();

            // amount
            txt.text = Mathf.Round(amount).ToString();

            // Color
            txt.material = DamageManager.dm.ElementMaterial(element);
        }
Exemple #7
0
 public void AppendDamageLog(Player source, Player target, int magnitude, DamageElement element)
 {
     Trace.Assert(target != null);
     List<FlowDocument> docs = new List<FlowDocument>() { Logs[target], GlobalLog };
     if (source != null) docs.Add(Logs[source]);
     foreach (var doc in docs)
     {
         Paragraph para = LogFormatter.RichTranslateDamage(source, target, magnitude, element);
         if (para != null)
         {
             doc.Blocks.Add(para);
         }
     }
 }
Exemple #8
0
        public CombatEventArgs(string sourceName, string targetName, AttackType attackType, DamageElement damageElemenet, bool isFailedAttack, bool isCriticalHit, bool isOverpower, bool isKillingBlow, int damageAmount)
        {
            SourceName = sourceName;
            TargetName = targetName;

            AttackType     = attackType;
            DamageElemenet = damageElemenet;

            IsFailedAttack = isFailedAttack;
            IsCriticalHit  = isCriticalHit;
            IsOverpower    = isOverpower;
            IsKillingBlow  = isKillingBlow;

            DamageAmount = damageAmount;
        }
		public CombatEventArgs(string sourceName, string targetName, AttackType attackType, DamageElement damageElemenet, bool isFailedAttack, bool isCriticalHit, bool isOverpower, bool isKillingBlow, int damageAmount)
		{
			SourceName = sourceName;
			TargetName = targetName;

			AttackType = attackType;
			DamageElemenet = damageElemenet;

			IsFailedAttack = isFailedAttack;
			IsCriticalHit = isCriticalHit;
			IsOverpower = isOverpower;
			IsKillingBlow = isKillingBlow;

			DamageAmount = damageAmount;
		}
Exemple #10
0
        public static string Translate(DamageElement element)
        {
            switch (element)
            {
            case DamageElement.None:
                return(string.Empty);

            case DamageElement.Fire:
                return("火属性");

            case DamageElement.Lightning:
                return("雷属性");
            }
            Trace.Assert(false);
            return(string.Empty);
        }
Exemple #11
0
    public static string ItemPrefix(this DamageElement e)
    {
        switch (e)
        {
        case DamageElement.Air: return("Lofty ");

        case DamageElement.Earth: return("Rock-Hewn ");

        case DamageElement.Fire: return("Ignited ");

        case DamageElement.Physical: return("");

        case DamageElement.Spirit: return("Haunted ");

        case DamageElement.Water: return("Soaked ");
        }
        return("");
    }
Exemple #12
0
 /// <summary>
 /// For deserialization from a binary table.
 /// </summary>
 public EO3Skill(BinaryReader reader, int skillId, Table nameTable) : base(reader, skillId, nameTable)
 {
     Game            = SkillModes.EO3;
     MaxLevel        = reader.ReadByte();
     Type            = reader.ReadByte();
     UseRequirements = new EO3UseRequirements(reader.ReadUInt16());
     TargetStatus    = new TargetStatus(reader.ReadUInt16());
     TargetType      = reader.ReadByte();
     TargetTeam      = reader.ReadByte();
     UsableLocation  = new UsableLocation(reader.ReadByte());
     ModifierStatus  = reader.ReadByte();
     ModifierType    = reader.ReadByte();
     reader.ReadByte(); // Unknown.
     ModifierElement    = new Element(reader.ReadUInt16());
     DamageElement      = new DamageElement(reader.ReadUInt16());
     InflictionStatus   = reader.ReadUInt16();
     AssociatedDisables = new Disables(reader.ReadUInt16());
     SkillFlags         = new EO3SkillFlags(reader.ReadInt32());
     DataSections       = new DataSections(reader, Game);
 }
 public static string GetNameOfColorByElement(DamageElement ele)
 {
     if (ele == DamageElement.Fire)
     {
         return("red");
     }
     if (ele == DamageElement.Ice)
     {
         return("blue");
     }
     if (ele == DamageElement.Poison)
     {
         return("green");
     }
     if (ele == DamageElement.Electric)
     {
         return("yellow");
     }
     return("white");
 }
 public static Color GetColorByElement(DamageElement ele)
 {
     if (ele == DamageElement.Fire)
     {
         return(Color.red);
     }
     if (ele == DamageElement.Ice)
     {
         return(Color.blue);
     }
     if (ele == DamageElement.Poison)
     {
         return(Color.green);
     }
     if (ele == DamageElement.Electric)
     {
         return(Color.yellow);
     }
     return(Color.white);
 }
        public Material ElementMaterial(DamageElement element)
        {
            switch (element)
            {
            case DamageElement.Energy:
                return(EnergyMaterial);

            case DamageElement.Fire:
                return(FireMaterial);

            case DamageElement.Ice:
                return(IceMaterial);

            case DamageElement.Light:
                return(LightMaterial);

            case DamageElement.Pure:
                return(PureMaterial);

            default:
                return(PhysicalMaterial);
            }
        }
Exemple #16
0
    float ElementResistance(DamageElement dType)
    {
        switch (dType)
        {
        case DamageElement.Earth:
            return(earthF.DamageMultiplier());

        case DamageElement.Air:
            return(airF.DamageMultiplier());

        case DamageElement.Fire:
            return(fireF.DamageMultiplier());

        case DamageElement.Water:
            return(waterF.DamageMultiplier());

        case DamageElement.Physical:
            Player player = GetComponent <Player>();
            if (physicalF == Foible.Immune || player == null)
            {
                return(physicalF.DamageMultiplier());
            }
            else if (player.inventory.GetSpellInSlot(0).GetShieldActive() || player.inventory.GetSpellInSlot(1).GetShieldActive())
            {
                return(Foible.Resistant.DamageMultiplier());
            }
            else
            {
                return(physicalF.DamageMultiplier());
            }

        case DamageElement.Spirit:
            return(spiritF.DamageMultiplier());
        }

        return(1.0f);
    }
Exemple #17
0
    public void ApplyDamage(float damage, DamageElement damageElement = DamageElement.Physical)
    {
        var TotalDamage = damage - AttributesController.armor;

        GameManager.instance.objectPoolManager.Spawn(ObjectPoolType.DamagePopup, damagePopupSpawnTransform, transform.localScale, TotalDamage);

        if (AttributesController.health > 0)
        {
            AttributesController.health -= TotalDamage;
            PlayerGetDamaged?.Invoke(this); /// Used For PlayerUI.

            ///Blood Effect Spawn.
            GameManager.instance.objectPoolManager.Spawn(ObjectPoolType.BloodSprayEffect, bloodEffectSpawnTransform, transform.localScale);
        }

        if (AttributesController.health <= 0)
        {
            Die();
        }
        else
        {
            AnimationController.SetAnimationParameter(PlayerAnimatorParameter.Hit);  //AnimationController.SetHit();
        }
    }
Exemple #18
0
 public static string Translate(DamageElement element)
 {
     switch (element)
     {
         case DamageElement.None:
             return string.Empty;
         case DamageElement.Fire:
             return "火属性";
         case DamageElement.Lightning:
             return "雷属性";
     }
     Trace.Assert(false);
     return string.Empty;
 }
Exemple #19
0
        /// <summary>
        /// 造成伤害
        /// </summary>
        /// <param name="source">伤害来源</param>
        /// <param name="dest">伤害目标</param>
        /// <param name="magnitude">伤害点数</param>
        /// <param name="elemental">伤害属性</param>
        /// <param name="cards">造成伤害的牌</param>
        public void DoDamage(Player source, Player dest, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
        {
            var damageArgs = new DamageEventArgs() { Source = source, Targets = new List<Player>(), Magnitude = magnitude, Element = elemental };
            HealthChangedEventArgs healthChangedArgs;
            int ironShackledDamage = 0;
            DamageElement ironShackledDamageElement = DamageElement.None;
            damageArgs.ReadonlyCard = readonlyCard;
            if (card is CompositeCard)
            {
                if ((card as CompositeCard).Subcards != null)
                {
                    damageArgs.Cards = new List<Card>((card as CompositeCard).Subcards);
                }
            }
            else if (card is Card)
            {
                damageArgs.Cards = new List<Card>() { card as Card };
            }
            else
            {
                damageArgs.Cards = new List<Card>();
            }
            damageArgs.Targets.Add(dest);
            damageArgs.Card = card;

            try
            {
                Game.CurrentGame.Emit(GameEvent.DamageSourceConfirmed, damageArgs);
                Game.CurrentGame.Emit(GameEvent.DamageElementConfirmed, damageArgs);
                Game.CurrentGame.Emit(GameEvent.BeforeDamageComputing, damageArgs);
                Game.CurrentGame.Emit(GameEvent.DamageComputingStarted, damageArgs);
                Game.CurrentGame.Emit(GameEvent.DamageCaused, damageArgs);
                Game.CurrentGame.Emit(GameEvent.DamageInflicted, damageArgs);
                if (damageArgs.Magnitude == 0)
                {
                    Trace.TraceInformation("Damage is 0, aborting");
                    return;
                }
                if (damageArgs.Targets[0].IsIronShackled && damageArgs.Element != DamageElement.None)
                {
                    ironShackledDamage = damageArgs.Magnitude;
                    Trace.TraceInformation("IronShackled damage {0}", ironShackledDamage);
                    ironShackledDamageElement = damageArgs.Element;
                    damageArgs.Targets[0].IsIronShackled = false;
                }
                healthChangedArgs = new HealthChangedEventArgs(damageArgs);
                Game.CurrentGame.Emit(GameEvent.BeforeHealthChanged, healthChangedArgs);
                damageArgs.Magnitude = -healthChangedArgs.Delta;
            }
            catch (TriggerResultException e)
            {
                if (e.Status == TriggerResult.End)
                {
                    Trace.TraceInformation("Damage Aborted");
                    return;
                }
                Trace.Assert(false);
                return;
            }

            Trace.Assert(damageArgs.Targets.Count == 1);
            damageArgs.Targets[0].Health -= damageArgs.Magnitude;
            Trace.TraceInformation("Player {0} Lose {1} hp, @ {2} hp", damageArgs.Targets[0].Id, damageArgs.Magnitude, damageArgs.Targets[0].Health);
            NotificationProxy.NotifyDamage(source, damageArgs.Targets[0], damageArgs.Magnitude, damageArgs.Element);

            try
            {
                Game.CurrentGame.Emit(GameEvent.AfterHealthChanged, healthChangedArgs);
            }
            catch (TriggerResultException)
            {
            }
            Game.CurrentGame.Emit(GameEvent.AfterDamageCaused, damageArgs);
            Game.CurrentGame.Emit(GameEvent.AfterDamageInflicted, damageArgs);
            Game.CurrentGame.Emit(GameEvent.DamageComputingFinished, damageArgs);
            if (ironShackledDamage != 0)
            {
                List<Player> toProcess = new List<Player>(Game.CurrentGame.AlivePlayers);
                Game.CurrentGame.SortByOrderOfComputation(damageArgs.Targets[0], toProcess);
                foreach (Player p in toProcess)
                {
                    if (p.IsIronShackled)
                    {
                        DoDamage(damageArgs.Source, p, ironShackledDamage, ironShackledDamageElement, card, readonlyCard);
                    }
                }
            }
        }
Exemple #20
0
 public CrowdControl(CrowdControlType ccType, DamageType damageType, DamageElement element)
 {
     this.ccType     = ccType;
     this.damageType = damageType;
     this.element    = element;
 }
Exemple #21
0
        public static Paragraph RichTranslateDamage(Player source, Player target, int magnitude, DamageElement element)
        {
            Paragraph para = new Paragraph();
            para.Inlines.Add(new Run(Translate(target)));
            string sourceStr = Translate(source);
            if (sourceStr != string.Empty)
            {
                sourceStr += "造成的";
            }
            string damageStr = string.Format("受到{0}{1}点{2}伤害,体力为{3}", sourceStr, magnitude, Translate(element), target.Health);

            para.Inlines.Add(new Run(damageStr) { Foreground = RedBrush });
            return para;
        }
Exemple #22
0
 public void Infuse(DamageElement element)
 {
     dElement = element;
     //damageModifier *= 0.75f;
 }
Exemple #23
0
    public void SetRandomAvailableElement()
    {
        int variation = Random.Range(1, 9);

        switch (variation)
        {
        case 2:
        {
            weapon_element  = DamageElement.photon;
            weapon_piercing = 1;
            weapon_bounces  = 0;
            break;
        }

        case 3:
        {
            weapon_element  = DamageElement.nuclear;
            weapon_piercing = 0;
            weapon_bounces  = 0;
            break;
        }

        case 4:
        {
            weapon_element  = DamageElement.cryo;
            weapon_piercing = 0;
            weapon_bounces  = 1;
            break;
        }

        case 5:
        {
            weapon_element  = DamageElement.electric;
            weapon_piercing = 0;
            weapon_bounces  = 0;
            break;
        }

        case 6:
        {
            weapon_element  = DamageElement.plasma;
            weapon_piercing = 0;
            weapon_bounces  = 0;
            break;
        }

        case 7:
        {
            weapon_element  = DamageElement.gamma;
            weapon_piercing = 0;
            weapon_bounces  = 0;
            break;
        }

        case 8:
        {
            weapon_element  = DamageElement.graviton;
            weapon_piercing = 0;
            weapon_bounces  = 0;
            break;
        }

        default:
        {
            weapon_element  = DamageElement.pulse;
            weapon_piercing = 0;
            weapon_bounces  = 0;
            break;
        }
        }
    }
Exemple #24
0
        /// <summary>
        /// 造成伤害
        /// </summary>
        /// <param name="source">伤害来源</param>
        /// <param name="dest">伤害目标</param>
        /// <param name="originalTarget">最初的伤害目标</param>
        /// <param name="magnitude">伤害点数</param>
        /// <param name="elemental">伤害属性</param>
        /// <param name="cards">造成伤害的牌</param>
        public void DoDamage(Player source, Player dest, Player originalTarget, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
        {
            if (dest.IsDead) return;
            var damageArgs = new DamageEventArgs() { Source = source, OriginalTarget = originalTarget, Targets = new List<Player>(), Magnitude = magnitude, Element = elemental };
            HealthChangedEventArgs healthChangedArgs;
            int ironShackledDamage = 0;
            DamageElement ironShackledDamageElement = DamageElement.None;
            if (readonlyCard == null)
            {
                readonlyCard = new ReadOnlyCard(new Card() { Place = new DeckPlace(null, null) });
            }
            damageArgs.ReadonlyCard = readonlyCard;
            if (card is CompositeCard)
            {
                if ((card as CompositeCard).Subcards != null)
                {
                    damageArgs.Cards = new List<Card>((card as CompositeCard).Subcards);
                }
            }
            else if (card is Card)
            {
                damageArgs.Cards = new List<Card>() { card as Card };
            }
            else
            {
                damageArgs.Cards = new List<Card>();
            }
            damageArgs.Targets.Add(dest);
            damageArgs.Card = card;

            try
            {
                //伤害来源与基数、属性的确定发生在伤害结算前,连环,以及转移的伤害不会重新确定来源与基数,所以不会多次触发【裸衣】,以及【酒】
                while (damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] == 0)
                {
                    Emit(GameEvent.DamageSourceConfirmed, damageArgs);
                    Emit(GameEvent.DamageElementConfirmed, damageArgs);
                    damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] = 1;
                    break;
                }
                Emit(GameEvent.BeforeDamageComputing, damageArgs);
                Emit(GameEvent.DamageComputingStarted, damageArgs);
                Emit(GameEvent.DamageCaused, damageArgs);
                Emit(GameEvent.DamageInflicted, damageArgs);
                if (damageArgs.Magnitude == 0)
                {
                    Trace.TraceInformation("Damage is 0, aborting");
                    return;
                }
                if (damageArgs.Targets[0].IsIronShackled && damageArgs.Element != DamageElement.None)
                {
                    ironShackledDamage = damageArgs.Magnitude;
                    Trace.TraceInformation("IronShackled damage {0}", ironShackledDamage);
                    ironShackledDamageElement = damageArgs.Element;
                    damageArgs.Targets[0].IsIronShackled = false;
                    // if this is TieSuo damage already, prevent itself from spreading...
                    if (readonlyCard[IsIronShackleDamage] == 1) ironShackledDamage = 0;
                }
                healthChangedArgs = new HealthChangedEventArgs(damageArgs);
                Emit(GameEvent.BeforeHealthChanged, healthChangedArgs);
                damageArgs.Magnitude = -healthChangedArgs.Delta;
            }
            catch (TriggerResultException e)
            {
                if (e.Status == TriggerResult.End)
                {
                    //伤害结算完毕事件应该总是被触发
                    //受到伤害的角色如果存活能发动的技能/会执行的技能效果:【酒诗②】、执行【天香】摸牌的效果。
                    Emit(GameEvent.DamageComputingFinished, damageArgs);
                    Trace.TraceInformation("Damage Aborted");
                    return;
                }
                Trace.Assert(false);
                return;
            }

            Trace.Assert(damageArgs.Targets.Count == 1);
            damageArgs.Targets[0].Health -= damageArgs.Magnitude;
            Trace.TraceInformation("Player {0} Lose {1} hp, @ {2} hp", damageArgs.Targets[0].Id, damageArgs.Magnitude, damageArgs.Targets[0].Health);
            NotificationProxy.NotifyDamage(source, damageArgs.Targets[0], damageArgs.Magnitude, damageArgs.Element);

            try
            {
                Emit(GameEvent.AfterHealthChanged, healthChangedArgs);
            }
            catch (TriggerResultException)
            {
            }
            Emit(GameEvent.AfterDamageCaused, damageArgs);
            Emit(GameEvent.AfterDamageInflicted, damageArgs);
            Emit(GameEvent.DamageComputingFinished, damageArgs);
            if (ironShackledDamage != 0)
            {
                List<Player> toProcess = new List<Player>(AlivePlayers);
                SortByOrderOfComputation(CurrentPlayer, toProcess);
                foreach (Player p in toProcess)
                {
                    if (p.IsIronShackled)
                    {
                        GameDelays.Delay(GameDelayTypes.TieSuoDamage);
                        readonlyCard[IsIronShackleDamage] = 1;
                        DoDamage(damageArgs.Source, p, originalTarget, ironShackledDamage, ironShackledDamageElement, card, readonlyCard);
                    }
                }
            }
        }
Exemple #25
0
        /// <summary>
        /// 造成伤害
        /// </summary>
        /// <param name="source">伤害来源</param>
        /// <param name="dest">伤害目标</param>
        /// <param name="originalTarget">最初的伤害目标</param>
        /// <param name="magnitude">伤害点数</param>
        /// <param name="elemental">伤害属性</param>
        /// <param name="cards">造成伤害的牌</param>
        public void DoDamage(Player source, Player dest, Player originalTarget, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
        {
            if (dest.IsDead)
            {
                return;
            }
            var damageArgs = new DamageEventArgs()
            {
                Source = source, OriginalTarget = originalTarget, Targets = new List <Player>(), Magnitude = magnitude, Element = elemental
            };
            HealthChangedEventArgs healthChangedArgs;
            int           ironShackledDamage        = 0;
            DamageElement ironShackledDamageElement = DamageElement.None;

            if (readonlyCard == null)
            {
                readonlyCard = new ReadOnlyCard(new Card()
                {
                    Place = new DeckPlace(null, null)
                });
            }
            damageArgs.ReadonlyCard = readonlyCard;
            if (card is CompositeCard)
            {
                if ((card as CompositeCard).Subcards != null)
                {
                    damageArgs.Cards = new List <Card>((card as CompositeCard).Subcards);
                }
            }
            else if (card is Card)
            {
                damageArgs.Cards = new List <Card>()
                {
                    card as Card
                };
            }
            else
            {
                damageArgs.Cards = new List <Card>();
            }
            damageArgs.Targets.Add(dest);
            damageArgs.Card = card;

            try
            {
                //伤害来源与基数、属性的确定发生在伤害结算前,连环,以及转移的伤害不会重新确定来源与基数,所以不会多次触发【裸衣】,以及【酒】
                while (damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] == 0)
                {
                    Emit(GameEvent.DamageSourceConfirmed, damageArgs);
                    Emit(GameEvent.DamageElementConfirmed, damageArgs);
                    damageArgs.ReadonlyCard[SourceAndElementIsConfirmed] = 1;
                    break;
                }
                Emit(GameEvent.BeforeDamageComputing, damageArgs);
                Emit(GameEvent.DamageComputingStarted, damageArgs);
                Emit(GameEvent.DamageCaused, damageArgs);
                Emit(GameEvent.DamageInflicted, damageArgs);
                if (damageArgs.Magnitude == 0)
                {
                    Trace.TraceInformation("Damage is 0, aborting");
                    return;
                }
                if (damageArgs.Targets[0].IsIronShackled && damageArgs.Element != DamageElement.None)
                {
                    ironShackledDamage = damageArgs.Magnitude;
                    Trace.TraceInformation("IronShackled damage {0}", ironShackledDamage);
                    ironShackledDamageElement            = damageArgs.Element;
                    damageArgs.Targets[0].IsIronShackled = false;
                    // if this is TieSuo damage already, prevent itself from spreading...
                    if (readonlyCard[IsIronShackleDamage] == 1)
                    {
                        ironShackledDamage = 0;
                    }
                }
                healthChangedArgs = new HealthChangedEventArgs(damageArgs);
                Emit(GameEvent.BeforeHealthChanged, healthChangedArgs);
                damageArgs.Magnitude = -healthChangedArgs.Delta;
            }
            catch (TriggerResultException e)
            {
                if (e.Status == TriggerResult.End)
                {
                    //伤害结算完毕事件应该总是被触发
                    //受到伤害的角色如果存活能发动的技能/会执行的技能效果:【酒诗②】、执行【天香】摸牌的效果。
                    Emit(GameEvent.DamageComputingFinished, damageArgs);
                    Trace.TraceInformation("Damage Aborted");
                    return;
                }
                Trace.Assert(false);
                return;
            }

            Trace.Assert(damageArgs.Targets.Count == 1);
            damageArgs.Targets[0].Health -= damageArgs.Magnitude;
            Trace.TraceInformation("Player {0} Lose {1} hp, @ {2} hp", damageArgs.Targets[0].Id, damageArgs.Magnitude, damageArgs.Targets[0].Health);
            NotificationProxy.NotifyDamage(damageArgs.Source, damageArgs.Targets[0], damageArgs.Magnitude, damageArgs.Element);
            GameDelays.Delay(GameDelays.Damage);

            try
            {
                Emit(GameEvent.AfterHealthChanged, healthChangedArgs);
            }
            catch (TriggerResultException)
            {
            }
            Emit(GameEvent.AfterDamageCaused, damageArgs);
            Emit(GameEvent.AfterDamageInflicted, damageArgs);
            Emit(GameEvent.DamageComputingFinished, damageArgs);
            if (ironShackledDamage != 0)
            {
                List <Player> toProcess = new List <Player>(AlivePlayers);
                SortByOrderOfComputation(CurrentPlayer, toProcess);
                foreach (Player p in toProcess)
                {
                    if (p.IsIronShackled)
                    {
                        readonlyCard[IsIronShackleDamage] = 1;
                        DoDamage(damageArgs.Source, p, originalTarget, ironShackledDamage, ironShackledDamageElement, card, readonlyCard);
                    }
                }
            }
        }
Exemple #26
0
    public void SufferDamage(float damage, DamageType dType, DamageElement dElement, Vector3 origin)
    {
        float multiplier = TypeResistance(dType);

        multiplier *= ElementResistance(dElement);

        Color damageNumberColour = Color.red;

        if (multiplier > 1.0f)
        {
            damageNumberColour = Color.magenta;
        }
        if (multiplier < 1.0f)
        {
            damageNumberColour = Color.yellow;
        }

        UI.inst.SpawnDamageNumbers(Mathf.CeilToInt(damage), damageNumberColour, transform.position + new Vector3(0.5f, 1.5f, 0f));
        if (this is Enemy)
        {
            UI.inst.SpawnHealthbar(this);
        }

        if (audioSrc != null)
        {
            audioSrc.Play();
        }



        for (int i = 0; i < 30; i++)
        {
            Particles.inst.Emit(transform.position + Vector3.up, 3f * ((transform.position - origin).normalized + Random.insideUnitSphere), 0.1f, 3.0f, bloodColour, Particles.Type.BLOOD, 1);
        }

        damage *= multiplier;

        if (damage <= 0)
        {
            return;
        }

        hitTimeCountdown = hitTimeDelay;

        if (tempHealth >= 0)
        {
            if (damage >= tempHealth)
            {
                tempHealth = 0.0f;
                damage    -= tempHealth;
            }
        }

        if (damage >= health)
        {
            health = 0.0f;
            Die();
        }
        else
        {
            health -= damage;
        }
    }
Exemple #27
0
 public void DoDamage(Player source, Player dest, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
 {
     DoDamage(source, dest, dest, magnitude, elemental, card, readonlyCard);
 }
Exemple #28
0
        void Current_ChatBoxMessage(object sender, ChatTextInterceptEventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(e.Text))
                {
                    return;
                }

                if (Util.IsChat(e.Text))
                {
                    return;
                }

                string sourceName = String.Empty;
                string targetName = String.Empty;

                AttackType    attackType     = AttackType.Unknown;
                DamageElement damageElemenet = DamageElement.Unknown;

                bool isFailedAttack = false;
                bool isCriticalHit  = e.Text.Contains("Critical hit!");
                bool isOverpower    = e.Text.Contains("Overpower!");
                bool isSneakAttack  = e.Text.Contains("Sneak Attack!");
                bool isRecklessness = e.Text.Contains("Recklessness!");
                bool isKillingBlow  = false;

                int damageAmount = 0;

                // You evaded Remoran Corsair!
                // Ruschk S****t evaded your attack.
                // You resist the spell cast by Remoran Corsair
                // Sentient Crystal Shard resists your spell
                if (CombatMessages.IsFailedAttack(e.Text))
                {
                    isFailedAttack = true;

                    string parsedName = string.Empty;

                    foreach (Regex regex in CombatMessages.FailedAttacks)
                    {
                        Match match = regex.Match(e.Text);

                        if (match.Success)
                        {
                            parsedName = match.Groups["targetname"].Value;
                            break;
                        }
                    }

                    if (e.Text.StartsWith("You evaded "))
                    {
                        sourceName = parsedName;
                        targetName = CoreManager.Current.CharacterFilter.Name;
                        attackType = AttackType.MeleeMissle;
                    }
                    else if (e.Text.Contains(" evaded your attack"))
                    {
                        sourceName = CoreManager.Current.CharacterFilter.Name;
                        targetName = parsedName;
                        attackType = AttackType.MeleeMissle;
                    }
                    else if (e.Text.StartsWith("You resist the spell cast by "))
                    {
                        sourceName = parsedName;
                        targetName = CoreManager.Current.CharacterFilter.Name;
                        attackType = AttackType.Magic;
                    }
                    else if (e.Text.Contains(" resists your spell"))
                    {
                        sourceName = CoreManager.Current.CharacterFilter.Name;
                        targetName = parsedName;
                        attackType = AttackType.Magic;
                    }
                }
                // You flatten Noble Remains's body with the force of your assault!
                // Your killing blow nearly turns Shivering Crystalline Wisp inside-out!
                // The thunder of crushing Pyre Minion is followed by the deafening silence of death!
                // Old Bones is shattered by your assault!
                else if (CombatMessages.IsKilledByMeMessage(e.Text))
                {
                    isKillingBlow = true;

                    sourceName = CoreManager.Current.CharacterFilter.Name;

                    foreach (Regex regex in CombatMessages.TargetKilledByMe)
                    {
                        Match match = regex.Match(e.Text);

                        if (match.Success)
                        {
                            targetName = match.Groups["targetname"].Value;

                            break;
                        }
                    }
                }
                else
                {
                    foreach (Regex regex in CombatMessages.MeleeMissileReceivedAttacks)
                    {
                        Match match = regex.Match(e.Text);

                        if (match.Success)
                        {
                            sourceName     = match.Groups["targetname"].Value;
                            targetName     = CoreManager.Current.CharacterFilter.Name;
                            attackType     = AttackType.MeleeMissle;
                            damageElemenet = GetElementFromText(e.Text);
                            int.TryParse(match.Groups["points"].Value, out damageAmount);
                            goto Found;
                        }
                    }

                    foreach (Regex regex in CombatMessages.MeleeMissileGivenAttacks)
                    {
                        Match match = regex.Match(e.Text);

                        if (match.Success)
                        {
                            sourceName     = CoreManager.Current.CharacterFilter.Name;
                            targetName     = match.Groups["targetname"].Value;
                            attackType     = AttackType.MeleeMissle;
                            damageElemenet = GetElementFromText(e.Text);
                            int.TryParse(match.Groups["points"].Value, out damageAmount);
                            goto Found;
                        }
                    }

                    foreach (Regex regex in CombatMessages.MagicReceivedAttacks)
                    {
                        Match match = regex.Match(e.Text);

                        if (match.Success)
                        {
                            sourceName     = match.Groups["targetname"].Value;
                            targetName     = CoreManager.Current.CharacterFilter.Name;
                            attackType     = AttackType.Magic;
                            damageElemenet = GetElementFromText(e.Text);
                            int.TryParse(match.Groups["points"].Value, out damageAmount);
                            goto Found;
                        }
                    }

                    foreach (Regex regex in CombatMessages.MagicGivenAttacks)
                    {
                        Match match = regex.Match(e.Text);

                        if (match.Success)
                        {
                            sourceName     = CoreManager.Current.CharacterFilter.Name;
                            targetName     = match.Groups["targetname"].Value;
                            attackType     = AttackType.Magic;
                            damageElemenet = GetElementFromText(e.Text);
                            int.TryParse(match.Groups["points"].Value, out damageAmount);
                            goto Found;
                        }
                    }

                    foreach (Regex regex in CombatMessages.MagicCastAttacks)
                    {
                        Match match = regex.Match(e.Text);

                        if (match.Success)
                        {
                            sourceName     = CoreManager.Current.CharacterFilter.Name;
                            targetName     = match.Groups["targetname"].Value;
                            attackType     = AttackType.Magic;
                            damageElemenet = DamageElement.None;
                            goto Found;
                        }
                    }

                    Found :;
                }

                if (sourceName == String.Empty && targetName == String.Empty)
                {
                    return;
                }

                if (!isKillingBlow && attackType == AttackType.Unknown)
                {
                    Debug.WriteToChat("Unable to parse attack type from: " + e.Text);
                }

                if (!isKillingBlow && !isFailedAttack && damageElemenet == DamageElement.Unknown)
                {
                    Debug.WriteToChat("Unable to parse damage element from: " + e.Text);
                }

                CombatEventArgs combatEventArgs = new CombatEventArgs(sourceName, targetName, attackType, damageElemenet, isFailedAttack, isCriticalHit, isOverpower, isSneakAttack, isRecklessness, isKillingBlow, damageAmount);

                if (CombatEvent != null)
                {
                    CombatEvent(combatEventArgs);
                }
            }
            catch (Exception ex) { Debug.LogException(ex, e.Text); }
        }
Exemple #29
0
 public void NotifyDamage(Player source, Player target, int magnitude, DamageElement element)
 {
 }
Exemple #30
0
 public void DoDamage(Player source, Player dest, int magnitude, DamageElement elemental, ICard card, ReadOnlyCard readonlyCard)
 {
     DoDamage(source, dest, dest, magnitude, elemental, card, readonlyCard);
 }
 public void NotifyDamage(Player source, Player target, int magnitude, DamageElement element)
 {
 }
Exemple #32
0
    public void AddDamageType(DamageElement element)
    {
        switch (element)
        {
        case DamageElement.Blaster:
        {
            Impact.AddImpact(direction, 5);
            takeDamage(5);
            blasterHit = false;
            break;
        }

        case DamageElement.Flak:
        {
            Impact.AddImpact(direction, 5);
            takeDamage(3);
            flakHit = false;
            break;
        }

        case DamageElement.Photon:
        {
            Impact.AddImpact(direction, 3);
            takeDamage(4);
            photonHit = false;
            break;
        }

        case DamageElement.Piercer:
        {
            Impact.AddImpact(direction, 1);
            takeDamage(1);
            piercerHit = false;
            break;
        }

        case DamageElement.Titan:
        {
            Impact.AddImpact(direction, 50);
            takeDamage(10);
            titanHit = false;
            break;
        }

        case DamageElement.Hyper:
        {
            Impact.AddImpact(direction, 30);
            takeDamage(30);
            hyperHit = false;
            break;
        }

        case DamageElement.Vortex:
        {
            Impact.AddImpact(direction, 50);
            takeDamage(80);
            vortexHit = false;
            break;
        }
        }
    }
Exemple #33
0
 public DamageElementAmountTuple(DamageElement damageElement, MinMaxFloat amount)
 {
     this.damageElement = damageElement;
     this.amount        = amount;
 }
Exemple #34
0
 public DamageElementInflictionTuple(DamageElement damageElement, float infliction)
 {
     this.damageElement = damageElement;
     this.infliction    = infliction;
 }
Exemple #35
0
 public void NotifyDamage(Player source, Player target, int magnitude, DamageElement element)
 {
     Application.Current.Dispatcher.Invoke((ThreadStart)delegate()
     {
         foreach (var profile in playersMap.Values)
         {
             if (profile.PlayerModel.Player == target)
             {
                 profile.PlayAnimation(new DamageAnimation(), 1, new Point(0, 0));
                 profile.Tremble();
             }
         }
         gameLogs.AppendDamageLog(source, target, magnitude, element);
         rtbLog.ScrollToEnd();
         Uri uri = GameSoundLocator.GetSystemSound("Damage");
         GameSoundPlayer.PlaySoundEffect(uri);
     });
 }
Exemple #36
0
        public static Paragraph RichTranslateDamage(Player source, Player target, int magnitude, DamageElement element)
        {
            Paragraph para = new Paragraph();

            para.Inlines.Add(new Run(Translate(target)));
            string sourceStr = Translate(source);

            if (sourceStr != string.Empty)
            {
                sourceStr += "造成的";
            }
            string damageStr = string.Format("受到{0}{1}点{2}伤害,体力为{3}", sourceStr, magnitude, Translate(element), target.Health);

            para.Inlines.Add(new Run(damageStr)
            {
                Foreground = RedBrush
            });
            return(para);
        }