private void OnCollisionEnter2D(Collision2D collision)
    {
        if (effectableLayers.value == (effectableLayers | 1 << collision.gameObject.layer))
        {
            Health health = collision.gameObject.GetComponent <Health>();
            collidedObjects.Add(collision.gameObject, health);

            if (fireAcidSpreadTimeToNextTick <= 0)
            {
                DamageEffectData newDamage = new DamageEffectData();
                if (onFire || inAcid)
                {
                    newDamage.Clear();
                    if (onFire)
                    {
                        newDamage.fire = originalEffects.fire;
                    }
                    if (inAcid)
                    {
                        newDamage.acid = originalEffects.acid;
                    }
                    collidedWith.Add(new ApplyEffectsTo(health, newDamage, gameObject));
                }
            }
        }
    }
Exemplo n.º 2
0
 public void CheckEffectScores(DamageEffectData current)
 {
     fire   = (fire.GetScore() > current.fire.GetScore()) ? fire : current.fire;
     freeze = (freeze.GetScore() > current.freeze.GetScore()) ? freeze : current.freeze;
     shock  = (shock.GetScore() > current.shock.GetScore()) ? shock : current.shock;
     acid   = (acid.GetScore() > current.acid.GetScore()) ? acid : current.acid;
 }
Exemplo n.º 3
0
 public Weapon(string weaponName, string weaponType, int price, float weight, Hands hands, int attackValue, int attackModifier, DamageEffectData damageEffectData, params string[] allowableClasses)
     : base(weaponName, weaponType, price, weight, allowableClasses)
 {
     NumberHands    = hands;
     AttackValue    = attackValue;
     AttackModifier = attackModifier;
     DamageEffect   = damageEffectData;
 }
        public void FillTalents()
        {
            TalentData data = new TalentData
            {
                Name = "Bash",
                TalentPrerequisites   = new string[0],
                LevelRequirement      = 1,
                TalentType            = TalentType.Activated,
                ActivationCost        = 5,
                AllowedClasses        = new string[] { "Warrior" },
                AttributeRequirements = new Dictionary <string, int>()
                {
                    { "Strength", 10 }
                }
            };

            DamageEffectData effect = new DamageEffectData
            {
                AttackType   = AttackType.Health,
                DamageType   = DamageType.Crushing,
                DieType      = DieType.D8,
                Modifier     = 2,
                Name         = "Bash",
                NumberOfDice = 2
            };

            data.Effects = new string[] { effect.ToString() };

            talentData.Add("Bash", data);

            data = new TalentData()
            {
                Name = "Below The Belt",
                TalentPrerequisites   = new string[0],
                LevelRequirement      = 1,
                TalentType            = TalentType.Activated,
                ActivationCost        = 5,
                AllowedClasses        = new string[] { "Rogue" },
                AttributeRequirements = new Dictionary <string, int>()
                {
                    { "Dexterity", 10 }
                }
            };

            effect = new DamageEffectData()
            {
                AttackType   = AttackType.Health,
                DamageType   = DamageType.Piercing,
                DieType      = DieType.D4,
                Modifier     = 2,
                Name         = "Below The Belt",
                NumberOfDice = 3
            };

            data.Effects = new string[] { effect.ToString() };

            talentData.Add("Below The Belt", data);
        }
        public void FillSpellData()
        {
            SpellData data = new SpellData()
            {
                Name = "Spark Jolt",
                SpellPrerequisites    = new string[0],
                SpellType             = SpellType.Activated,
                LevelRequirement      = 1,
                ActivationCost        = 8,
                AllowedClasses        = new string[] { "Wizard" },
                AttributeRequirements = new Dictionary <string, int>()
                {
                    { "Magic", 10 }
                }
            };

            DamageEffectData effect = new DamageEffectData
            {
                Name         = "Spark Jolt",
                AttackType   = AttackType.Health,
                DamageType   = DamageType.Air,
                DieType      = DieType.D6,
                NumberOfDice = 3,
                Modifier     = 2
            };

            data.Effects = new string[] { effect.ToString() };
            spellData.Add("Spark Jolt", data);

            data = new SpellData()
            {
                Name = "Mend",
                SpellPrerequisites    = new string[0],
                SpellType             = SpellType.Activated,
                LevelRequirement      = 1,
                ActivationCost        = 6,
                AllowedClasses        = new string[] { "Priest" },
                AttributeRequirements = new Dictionary <string, int>()
                {
                    { "Magic", 10 }
                }
            };

            HealEffectData healEffect = new HealEffectData()
            {
                Name         = "Mend",
                HealType     = HealType.Health,
                DieType      = DieType.D8,
                NumberOfDice = 2,
                Modifier     = 2
            };

            data.Effects = new string[] { healEffect.ToString() };
            spellData.Add("Mend", data);
        }
Exemplo n.º 6
0
 // Start is called before the first frame update
 void Start()
 {
     // healthData = new HealthData();
     healthData.isDamageable = true;
     healthData.isDead       = false;
     tookDamage        = false;
     persistantDamages = new DamageEffectData();
     blackListObjects  = new List <GameObject>();
     blackListReset    = 2;
     persistantDamages.Clear();
     nextTick = tickRate;
 }
Exemplo n.º 7
0
    public void ApplyEffectDirectly(DamageEffectData damage, GameObject obj)
    {
        if (!blackListObjects.Contains(obj))
        {
            damage.ApplyResistances(healthData.resistancesData.TotalResistance());
            damage.RollForEffectChance();
            damage.SetInitalScores();

            freezeChanged = persistantDamages.freeze.GetScore() > 0;
            persistantDamages.CheckEffectScores(damage);
            originalPersistantDamages.CheckEffectScores(damage);
            if (damage.fire.GetScore() > 0 || damage.acid.GetScore() > 0)
            {
                blackListObjects.Add(obj);
            }
        }
    }
        private void BtnAdd_Click(object sender, EventArgs e)
        {
            DamageEffectData effect = new DamageEffectData
            {
                AttackType = (AttackType)Enum.Parse(
                    typeof(AttackType),
                    cboAttackType.Text),
                DamageType = (DamageType)Enum.Parse(
                    typeof(DamageType),
                    cboDamageType.SelectedItem.ToString()),
                NumberOfDice = (int)nudDice.Value,
                Modifier     = int.Parse(mtbModifier.Text),
                DieType      = (DieType)Enum.Parse(
                    typeof(DieType),
                    cboDieType.Text)
            };

            damageEffects.Add(effect);
            lbDamageEffects.Items.Add(effect);
        }
        private void BtnOK_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(tbName.Text))
            {
                MessageBox.Show("You must enter the name for the effect.");
                return;
            }

            if (rbDamage.Checked)
            {
                DamageEffectData data = new DamageEffectData();

                data.Name         = tbName.Text;
                data.TargetType   = (TargetType)Enum.Parse(typeof(TargetType), cboTarget.SelectedItem.ToString());
                data.DamageType   = (DamageType)Enum.Parse(typeof(DamageType), cboDamage.SelectedItem.ToString());
                data.DieType      = (DieType)Enum.Parse(typeof(DieType), cboDieType.SelectedIndex.ToString());
                data.NumberOfDice = (int)sbNumOfDice.Value;
                data.Modifier     = (int)sbModifier.Value;

                BaseEffectData = data;
            }
            else
            {
                HealEffectData data = new HealEffectData();

                data.Name         = tbName.Text;
                data.TargetType   = (TargetType)Enum.Parse(typeof(TargetType), cboTarget.SelectedItem.ToString());
                data.DieType      = (DieType)Enum.Parse(typeof(DieType), cboDieType.SelectedIndex.ToString());
                data.NumberOfDice = (int)sbNumOfDice.Value;
                data.Modifier     = (int)sbModifier.Value;

                BaseEffectData = data;
            }

            Close();
        }
 public ApplyEffectsTo(Health healthdata_, DamageEffectData newEffects_, GameObject obj_)
 {
     healthdata = healthdata_;
     newEffects = newEffects_;
     obj        = obj_;
 }
    void ApplyActiveEffects()
    {
        DamageEffectData data = myHealth.GetPersistantEffects();

        originalEffects = myHealth.GetOriginalPersistantEffects();

        //fireTerminated =
        ManageEffect(data.fire, "fire");
        freezeTerminated = ManageEffect(data.freeze, "freeze");
        shockTerminated  = ManageEffect(data.shock, "shock");
        acidTerminated   = ManageEffect(data.acid, "acid");

        if (stringToEffect.ContainsKey("fire"))
        {
            //if something else hits while on fire, chance to spread the fire based on intensity
            onFire = true;
            graphics.AddEffectAtLocation(transform.position, "fire");
        }
        else
        {
            onFire = false;
        }
        if (stringToEffect.ContainsKey("freeze"))
        {
            //slow player based on Intensity

            if (myHealth.freezeChanged)
            {
                AddFreeze(myHealth.freezeAddIntensity);
                myHealth.freezeChanged = false;
            }
            if (progressTillFrozenSolid < data.freeze.intensity)
            {
                progressTillFrozenSolid = data.freeze.intensity;
            }

            freezeSlow = (progressTillFrozenSolid > data.freeze.intensity) ? progressTillFrozenSolid : data.freeze.intensity;

            if (frozenSolid)
            {
                freezeSlow = 1;
            }

            updateNetSlow = true;
            graphics.AddEffectAtLocation(transform.position, "freeze");
        }
        else
        {
            // frozen = false;
            if (freezeTerminated)
            {
                freezeSlow              = 0;
                updateNetSlow           = true;
                progressTillFrozenSolid = 0;
            }
        }
        if (stringToEffect.ContainsKey("shock"))
        {
            //slow player periodically based on intensity (period is effected by intensity too)

            shockedTickRate = .5f * (1 - (data.shock.intensity * .9f));

            if (shockSlowCurrentDuration <= 0 && shockedTimeTillNextTick <= 0)
            {
                shockSlowCurrentDuration = shockSlowDuration;
            }

            if (shockedTimeTillNextTick <= 0 && shockSlowCurrentDuration > 0)
            {
                shockSlowCurrentDuration -= Time.deltaTime;

                if (shockSlowCurrentDuration <= 0)
                {
                    shockedTimeTillNextTick = shockedTickRate;
                    shockedSlow             = 0;
                    updateNetSlow           = true;
                    graphics.AddEffectAtLocation(transform.position, "shock");
                }
            }
            else if (shockedTimeTillNextTick > 0)
            {
                shockedTimeTillNextTick -= Time.deltaTime;
                if (shockedTimeTillNextTick <= 0)
                {
                    shockSlowCurrentDuration = shockSlowDuration;
                    shockedSlow   = data.shock.intensity * .9f;
                    updateNetSlow = true;
                }
            }
            // Debug.Log(shockedTimeTillNextTick);
        }
        else
        {
            if (shockTerminated)
            {
                // shocked = false;
                shockedSlow     = 0;
                shockedTickRate = 0;
                updateNetSlow   = true;
            }
        }
        if (stringToEffect.ContainsKey("acid"))
        {
            //slow player and chance to spread based on intensity
            inAcid        = true;
            acidSlow      = data.acid.intensity / 2;
            updateNetSlow = true;
            graphics.AddEffectAtLocation(transform.position, "acid");
        }
        else
        {
            inAcid = false;

            if (acidTerminated)
            {
                acidSlow      = 0;
                updateNetSlow = true;
            }
        }

        if (updateNetSlow)
        {
            float slow = (acidSlow > freezeSlow) ? acidSlow : freezeSlow;
            //playerMove.speed = originalSpeed * Mathf.Clamp01(1 - (slow + shockedSlow));
            updateNetSlow = false;
        }

        bool ManageEffect(ElementalDamageEffect effect, string effectName)
        {
            bool effectTerminated = false;

            if (lastActiveEffects.ContainsKey(effectName))
            {
                if (!effect.Compare(lastActiveEffects[effectName]))
                {
                    if (effect.GetScore() > 0)
                    {
                        ActiveEffect newEffect = new ActiveEffect(effectName, effect.intensity);

                        stringToEffect.Add(effectName, newEffect);
                    }
                    else
                    {
                        lastActiveEffects.Remove(effectName);
                        stringToEffect.Remove(effectName);
                        effectTerminated = true;
                    }
                }
            }
            else
            {
                if (effect.GetScore() > 0)
                {
                    ActiveEffect newEffect = new ActiveEffect(effectName, effect.intensity);
                    lastActiveEffects.Add(effectName, effect);
                    stringToEffect.Add(effectName, newEffect);
                }
            }
            return(effectTerminated);
        }
    }
Exemplo n.º 12
0
 public DamageEffect(DamageEffectData data, List <Validator> validators,
                     IEffectRepository effectRepository) : base(data, validators)
 {
     this.Data             = data;
     this.EffectRepository = effectRepository;
 }
Exemplo n.º 13
0
 public RandomElementDamageEffect(DamageEffectData data, List <Validator> validators,
                                  IEffectRepository effectRepository) : base(data, validators, effectRepository)
 {
 }
Exemplo n.º 14
0
 public WeaponDamageEffect(DamageEffectData data, List <Validator> validators,
                           IEffectRepository effectRepository) : base(data, validators, effectRepository)
 {
 }
Exemplo n.º 15
0
 public WeaponData()
 {
     DamageEffectData = new DamageEffectData();
 }
    void DisplayPersistentDamages()
    {
        needToUpdate = false;
        DamageEffectData data = playerHealth.GetPersistantEffects();

        EffectSortData[] ordered = new EffectSortData[4]
        {
            new EffectSortData("fire", data.fire.initalScore, Color.red, data.fire.damagePerSecond, data.fire.damageDuration, data.fire.initalDuration),
            new EffectSortData("freeze", data.freeze.initalScore, Color.cyan, data.freeze.damagePerSecond, data.freeze.damageDuration, data.freeze.initalDuration),
            new EffectSortData("shock", data.shock.initalScore, Color.yellow, data.shock.damagePerSecond, data.shock.damageDuration, data.shock.initalDuration),
            new EffectSortData("acid", data.acid.initalScore, Color.green, data.acid.damagePerSecond, data.acid.damageDuration, data.acid.initalDuration)
        };

        ordered = ArrageByHighestScore(ordered);
        int length = ordered.Length;

        for (int i = 0; i < length; i++)
        {
            if (!lastOrder[i].Comparison(ordered[i]))
            {
                lastOrder[i] = ordered[i];
                needToUpdate = true;
            }
        }


        StoredComponents effect;

        for (int i = 0; i < length; i++)
        {
            if (ordered[i].score > 0)    //needs to be added or checked that there is no change
            {
                if (effectsFromString.ContainsKey(ordered[i].name))
                {
                    if (needToUpdate)
                    {
                        UpdateGraphicData(effectsFromString[ordered[i].name], ordered[i], i);
                    }
                    UpdateTimer(effectsFromString[ordered[i].name].effectRadialSlider, ordered[i], needToUpdate);


                    //look to see if there is an inactive one. if no, then create a new one
                }
                else
                {
                    if (needToUpdate)
                    {
                        if (deadIcons.Count > 0)
                        {
                            effect = deadIcons[0];
                            effectList.Add(effect);
                            effectsFromString.Add(ordered[i].name, effect);
                            effect.effect.SetActive(true);
                            deadIcons.Remove(effect);

                            UpdateGraphicData(effectsFromString[ordered[i].name], ordered[i], i);
                        }
                        else
                        {
                            effect                    = new StoredComponents();
                            effect.effect             = Instantiate(effectBasePrefab, gameObject.transform, false);
                            effect.effectImage        = effect.effect.GetComponent <Image>();
                            effect.effectRect         = effect.effect.GetComponent <RectTransform>();
                            effect.effectText         = effect.effect.GetComponentInChildren <Text>();
                            effect.effectRadialSlider = effect.effect.GetComponentInChildren <Slider>();
                            effectsFromString.Add(ordered[i].name, effect);
                            effectList.Add(effect);
                            UpdateGraphicData(effectsFromString[ordered[i].name], ordered[i], i);
                        }

                        Vector2 pos = effect.effectRect.rect.size / 2;

                        pos.x += (xSpacing * i);
                        effect.effectRect.localPosition = pos;
                    }
                }
            }
            else     //needs to be removed or checked that there is no change
            {
                if (needToUpdate)
                {
                    if (effectsFromString.ContainsKey(ordered[i].name))
                    {
                        effect = effectsFromString[ordered[i].name];
                        effectsFromString.Remove(ordered[i].name);
                        effect.effectImage.color = Color.clear;
                        effect.effect.SetActive(false);
                        effectList.Remove(effect);
                        deadIcons.Add(effect);
                    }
                }
            }
        }

        void UpdateGraphicData(StoredComponents effectData, EffectSortData orderedData, int i)
        {
            effectData.effectImage.color = orderedData.color;

            effectData.effectText.text = (orderedData.damagePerSecond < 10) ?
                                         (Mathf.Round(orderedData.damagePerSecond * 10) / 10).ToString() :
                                         Mathf.Round(orderedData.damagePerSecond).ToString();

            Vector2 pos = effectData.effectRect.rect.size / 2;

            pos.x += (xSpacing * i);
            effectData.effectRect.localPosition = pos;
            UpdateTimer(effectData.effectRadialSlider, orderedData, true);
        }

        void UpdateTimer(Slider radialSlider, EffectSortData effectData, bool getRealValue)
        {
            radialSlider.value = (getRealValue) ?effectData.currentDuration / effectData.initalDuration:(effectData.currentDuration - ((Health.tickRate - playerHealth.nextTick))) / effectData.initalDuration;
        }
    }
Exemplo n.º 17
0
    public void ApplyDamage(DamageData damageData)// need to have a apply peristant effect damage
    {
        if (!healthData.isDamageable || healthData.isDead)
        {
            return;
        }

        float[] damageTaken = new float[5] {
            0, 0, 0, 0, 0
        };
        DamageEffectData originalPersistantDamagesCopy = damageData.damageEffectData;

        float armourValue  = (healthData.currentArmour - damageData.armourPierce > 0) ? healthData.currentArmour - damageData.armourPierce : 0;
        float ignoreShield = damageData.damage * damageData.shieldPierce;

        damageData.damage -= ignoreShield;
        damageData.damageEffectData.ApplyResistances(healthData.resistancesData.TotalResistance());

        float[] damageArray = damageData.damageEffectData.ImpactDamageAsArray();
        damageArray = new float[5] {
            damageData.damage, damageArray[0], damageArray[1], damageArray[2], damageArray[3],
        };
        float[] damageModArray = damageData.damageEffectData.ShieldModAsArray();
        damageModArray = new float[] { damageData.shieldDamageMod, damageModArray[0], damageModArray[1], damageModArray[2], damageModArray[3] };


        int length = damageArray.Length;

        for (int i = 0; i < length; ++i)
        {
            if (healthData.currentShield > 0)//apply shield Damage
            {
                healthData.currentShield -= damageArray[i] * damageModArray[i];

                damageTaken[i] += damageArray[i] * damageModArray[i];
                if (damageArray[i] * damageArray[i] > 0)
                {
                    healthData.regenData.timeTillShieldRegenStart = healthData.regenData.shieldRegenDelay;
                }
                if (!tookDamage)
                {
                    tookDamage = (damageTaken[i] > 0) ? true : false;
                }
                if (healthData.currentShield <= 0)
                {
                    damageArray[i]           = healthData.currentShield / damageModArray[i];
                    damageTaken[i]          -= healthData.currentShield / damageModArray[i];
                    healthData.currentShield = 0;
                    break;
                }
                damageArray[i] = 0;
            }
        }
        damageModArray = damageData.damageEffectData.HealthModAsArray();
        damageModArray = new float[] { damageData.healthDamageMod, damageModArray[0], damageModArray[1], damageModArray[2], damageModArray[3] };

        damageArray[0] *= (1 - armourValue);
        for (int i = 0; i < length; ++i)
        {
            if (healthData.currentHealth > 0)// apply health Damage
            {
                healthData.currentHealth -= damageArray[i] * damageModArray[i];
                damageTaken[i]           += damageArray[i] * damageModArray[i];
                if (damageArray[i] * damageArray[i] > 0)
                {
                    healthData.regenData.timeTillShieldRegenStart = healthData.regenData.shieldRegenDelay;
                    healthData.regenData.timeTillHealthRegenStart = healthData.regenData.healthRegenDelay;
                }
                if (!tookDamage)
                {
                    tookDamage = (damageTaken[i] > 0) ? true : false;
                }
                if (healthData.currentHealth <= 0)
                {
                    damageArray[i]           = healthData.currentHealth / damageModArray[i];
                    damageTaken[i]          -= healthData.currentHealth / damageModArray[i];
                    healthData.currentHealth = 0;
                    healthData.isDead        = true;
                    break;
                }
                damageArray[i] = 0;
            }
        }

        if (!damageData.damageEffectData.isEmpty())//apply new persistent effects, if there are any to apply
        {
            damageData.damageEffectData.RollForEffectChance();
            if (damageData.damageEffectData.fire.GetScore() == 0)
            {
                originalPersistantDamagesCopy.fire.Clear();
            }
            if (damageData.damageEffectData.freeze.GetScore() == 0)
            {
                originalPersistantDamagesCopy.freeze.Clear();
            }
            if (damageData.damageEffectData.shock.GetScore() == 0)
            {
                originalPersistantDamagesCopy.shock.Clear();
            }
            if (damageData.damageEffectData.acid.GetScore() == 0)
            {
                originalPersistantDamagesCopy.acid.Clear();
            }

            damageData.damageEffectData.SetInitalScores();
            originalPersistantDamagesCopy.SetInitalScores();
            freezeChanged      = false;
            freezeAddIntensity = 0;
            freezeChanged      = damageData.damageEffectData.freeze.GetScore() > 0;
            freezeAddIntensity = damageData.damageEffectData.freeze.intensity;
            persistantDamages.CheckEffectScores(damageData.damageEffectData);
            originalPersistantDamages.CheckEffectScores(originalPersistantDamagesCopy);
        }

        healthData.recentDamage.SetAllDamage(damageTaken);

        // Debug.Log("Health: " + healthData.currentHealth + ". Shield: " + healthData.currentShield);
    }