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)); } } } }
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; }
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); }
// 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; }
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); } }
public DamageEffect(DamageEffectData data, List <Validator> validators, IEffectRepository effectRepository) : base(data, validators) { this.Data = data; this.EffectRepository = effectRepository; }
public RandomElementDamageEffect(DamageEffectData data, List <Validator> validators, IEffectRepository effectRepository) : base(data, validators, effectRepository) { }
public WeaponDamageEffect(DamageEffectData data, List <Validator> validators, IEffectRepository effectRepository) : base(data, validators, effectRepository) { }
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; } }
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); }