public void ModifyHealth(DamageValue damageData) { float damageDealt = damageData.DamageDealt(this).value; if (damageDealt < 0) { PlaySound(unitClass.damageTakenSound[Player.faction]); } Health = Mathf.Clamp( Health + damageDealt, 0, unitClass.BaseHealth ); StartCoroutine(AnimateHealthChange(damageDealt, damageData)); if (Health == 0) { Kill(); } if (Player != null) { Player.NotifyHealthChange(); } }
private DamageResistance GetResistance(DamageValue damage) { List <Resistance> matchingResistances = resistances .FindAll(resistance => { if (resistance.GetType() == typeof(DamageResistance)) { DamageResistance foundResistance = resistance as DamageResistance; return(foundResistance.WillApplyTo(damage)); } return(false); }); DamageResistance chosenResistance = null; foreach (DamageResistance resistance in matchingResistances) { Dictionary <DamageResistanceEffect, int> priorities = DamageResistance.effectPriorities; if (chosenResistance == null || priorities[resistance.resistanceEffect] > priorities[chosenResistance.resistanceEffect] ) { chosenResistance = resistance; } } return(chosenResistance); }
public bool WillApplyTo(DamageValue damage) { if (anyDamage || (shouldResistTypes && damageType == damage.type) || (shouldResistTrajectories && damageTrajectory == damage.trajectory) ) { return(true); } return(false); }
public int GetAttackDamage(Unit9 target, DamageValue damageValue = DamageValue.Minimum, float additionalPhysicalDamage = 0) { var damage = 0; foreach (var raw in this.GetRawAttackDamage(target, damageValue, additionalPhysicalDamage: additionalPhysicalDamage)) { var amplify = target.GetDamageAmplification(this, raw.Key, false); var block = target.GetDamageBlock(raw.Key); damage += (int)((raw.Value - block) * amplify); } return(Math.Max(damage, 0)); }
private IEnumerator AnimateHealthChange(float damageDealt, DamageValue damageData) { animator.SetTrigger(damageData.type == DamageType.Heal ? "Heal" : "Hit"); damageText.color = damageData.Color; damageText.text = Mathf.Abs(damageDealt).ToString(); damageText.gameObject.SetActive(true); for (float current = 0; current < 1f; current += 0.1f) { damageText.rectTransform.anchoredPosition = new Vector2(damageText.rectTransform.anchoredPosition.x, current); yield return(new WaitForSeconds(.03f)); } damageText.gameObject.SetActive(false); }
public void HandleCommand(DamageValue <AbstractCharacter> value) { if (isCheat) { return; } if (isRetreat) { isRetreat = false; } var deltaDamage = _currentHealth - value.damageValue; _currentHealth = (deltaDamage > 0) ? deltaDamage : Dead(); CustomDebug.LogMessage(CurrentHealth); }
public override string ToString() { string weaponString = base.ToString() + ", "; weaponString += NumberHands.ToString() + ", "; weaponString += AttackValue.ToString() + ", "; weaponString += AttackModifier.ToString() + ", "; weaponString += DamageValue.ToString() + ", "; weaponString += DamageModifier.ToString(); foreach (string s in AllowableClasses) { weaponString += ", " + s; } return(weaponString); }
private GameObject CreateDmgFormula(Vector3Int position, DamageValue damage, Unit defenderUnit) { Vector3 worldPos = TilemapNavigator.Instance.CellToWorldPos(position); Vector2 canvasPos = WorldToCanvasPos(worldPos); GameObject formulaContainer = Instantiate(dmgFormulaPrefab); DmgFormula formula = formulaContainer.GetComponent <DmgFormula>(); formula.SetValue(damage, defenderUnit); RectTransform markerRect = formula.GetComponent <RectTransform>(); markerRect.SetParent(canvasRect); markerRect.anchoredPosition = canvasPos; return(formulaContainer); }
/// <summary> /// 被攻击 /// </summary> /// <param name="damage"></param> /// <param name="unit">攻击者</param> /// <returns></returns> public IDamage BeAttack(IDamage damage, Unit unit) { if (unitProperty.hp.CurrValue <= 0) { return(null); } int a = 0; int b = 0; int c = 0; if (!IsInvincible) { if (damage.DamageStyle == DamageStyle.PHYSICS) { a = (int)((damage.AttackDamage - this.unitProperty.defensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent)); b = (int)((damage.CriticalDamage - this.unitProperty.defensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent)); } else if (damage.DamageStyle == DamageStyle.MAGIC) { a = (int)((damage.AttackDamage - this.unitProperty.magicDefensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent)); b = (int)((damage.CriticalDamage - this.unitProperty.magicDefensive.CurrValue - this.unitProperty.ignoreDamage.ExtraValue) * (1 - this.unitProperty.ignoreDamage.ExtraPercent)); } b = Mathf.Max(0, b); c = damage.AttachDamage; this.unitProperty.hp.CurrValue -= a + b + c; } var id = new DamageValue() { DamageStyle = damage.DamageStyle, AttackDamage = a, AttachDamage = c, CriticalDamage = b, }; if (unitProperty.hp.CurrValue <= 0) { ani.Play("Death"); unitProperty.hp.CurrValue = 0; } GlobalEvent.showDamageFontEvent(id, transform.position); if (isPlayer) { GlobalEvent.hpChangeEvent(this.unitProperty.hp.CurrValue, this.unitProperty.hp.MaxValue); } return(id); }
public override string ToString() { string weapString = base.ToString() + ", "; weapString += NumberHands.ToString() + ", "; weapString += AttackValue.ToString() + ", "; weapString += AttackModifier.ToString() + ", "; weapString += DamageValue.ToString() + ", "; weapString += DamageModifier.ToString() + ", "; foreach (Type t in allowableClasses) { weapString += ", " + t.Name; } return(base.ToString()); }
public DealtDamage CheckAgainstDamage(Unit unit, DamageValue damage, bool triggerResistance = true) { DamageResistance resistance = GetResistance(damage); if (resistance != null) { if (triggerResistance) { bool shouldRemove = resistance.OnTick(unit); if (shouldRemove) { RemoveResistance(resistance); } } return(resistance.ProcessDamage(damage.DamageAfterShield(unit))); } return(new DealtDamage(damage.DamageAfterShield(unit), null)); }
public void SetValue(DamageValue damage, Unit unit) { DealtDamage damageDealt = damage.DamageDealt(unit, false); baseDamageText.gameObject.SetActive(false); extraDamageText.gameObject.SetActive(false); if ( damageDealt.resistanceEffect == DamageResistanceEffect.CancelDamage || damageDealt.resistanceEffect == DamageResistanceEffect.SetDamageToFixedAmount ) { ShowBaseDamage(damageDealt.value); } else { ShowBaseDamage(damage.baseFlatDmg); ShowExtraDamage(damage.extraFlatDamage); } }
public int CalculateAttackDamage(DamageValue damageValue) { //add in damage buffs here return(damageValue.baseValue); }
internal Damage GetRawAttackDamage( Unit9 target, DamageValue damageValue = DamageValue.Minimum, float physCritMultiplier = 1f, float additionalPhysicalDamage = 0) { var damage = new Damage(); var multipliedPhysDamage = 0f; switch (damageValue) { case DamageValue.Minimum: multipliedPhysDamage += this.BaseUnit.MinimumDamage; break; case DamageValue.Average: multipliedPhysDamage += this.BaseUnit.DamageAverage; break; case DamageValue.Maximum: multipliedPhysDamage += this.BaseUnit.MaximumDamage; break; } if (this.IsIllusion && !this.CanUseAbilities) { //todo improve illusion damage ? multipliedPhysDamage *= 0.25f; } else { multipliedPhysDamage += this.BaseUnit.BonusDamage; } if (multipliedPhysDamage <= 0) { return(damage); } foreach (var passive in this.passiveDamageAbilities) { if (!passive.IsValid) { continue; } foreach (var passiveDamage in passive.GetRawDamage(target)) { if (passive.MultipliedByCrit && passiveDamage.Key == DamageType.Physical) { multipliedPhysDamage += passiveDamage.Value; } else { damage[passiveDamage.Key] += passiveDamage.Value; } } } damage[DamageType.Physical] += (multipliedPhysDamage * physCritMultiplier) + additionalPhysicalDamage; damage[DamageType.Physical] *= DamageExtensions.GetMeleeDamageMultiplier(this, target); return(damage); }
void OnTriggerEnter2D(Collider2D collider) { ++m_DamageCount; DamageValue.AddScore(1); m_DamageRewardAtThisFrame += -0.2f; }
public override void ResultExpr(float[] param) { base.ResultExpr(param); if (param == null || param.Length < 5) { return; } Actor target = ActorManager.Singleton.Lookup(TargetID); if (null == target) { return; } Actor source = ActorManager.Singleton.Lookup(SourceID); if (null == source) { return; } //物理、魔法加成 float phyAdd = 0, magAdd = 0; //攻击力倍数的修正 float modifyValue = 0; //伤害修正 float damageModify = 1; SkillResultInfo info = GameTable.SkillResultTableAsset.Lookup(SkillResultID); if (null != info) { if (info.MinComboCount > 0) { if (source.Combo != null && source.Combo.TotalComboNumber >= info.MinComboCount) { phyAdd = info.PhyAttackAdd; magAdd = info.MagAttackAdd; } } if (source.Combo != null) { int comboNumber = source.Combo.TotalComboNumber; if (comboNumber > 44) { comboNumber = 44; } modifyValue = (int)(1.0f / 15.0f * comboNumber) * info.AttackModify; } if (info.ComboNum > 0) { damageModify = DamageModify; } if (info.IsWeakenComboTime) { target.OnWeakenComboTime(info.WeakenComboTime); } } {//结算 switch ((ENDamageType)param[0]) { #region enDamageFixed case ENDamageType.enDamageFixed: //固定伤害 { float damage = 0.0f; if (param[1] != 0) { //固定伤害 damage = param[1]; } if (param[2] != 0) { //百分比上下浮动 //目标的伤害系数 float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam); damage *= (woundParam != 0 ? woundParam : 1); damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]); } DamageValue = damage; } break; #endregion #region enPhyDamageTimes case ENDamageType.enPhyDamageTimes: //物理攻击倍数伤害 { float srcAttackValue = source.Props.GetProperty_Float(ENProperty.phyattack); if (param[1] != 0) { //物理攻击力的倍数 srcAttackValue *= (param[1] + modifyValue); } srcAttackValue += phyAdd; float damage = srcAttackValue - target.Props.GetProperty_Float(ENProperty.phydefend); float min = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enPhyAttackMinValue).FloatTypeValue; if (damage < srcAttackValue * min) { //伤害最低为物理攻击*物理攻击力的最小值 damage = srcAttackValue * min; } else { if (param[2] != 0) { //百分比上下浮动 //目标的伤害系数 float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam); damage *= (woundParam != 0 ? woundParam : 1); damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]); } } DamageValue = damage; m_attackValue = source.Props.GetProperty_Float(ENProperty.phyattack); } break; #endregion #region enMagDamageTimes case ENDamageType.enMagDamageTimes: //魔法攻击倍数伤害 { float srcAttackValue = source.Props.GetProperty_Float(ENProperty.magattack); if (param[1] != 0) { //魔法攻击力的倍数 srcAttackValue *= (param[1] + modifyValue); } srcAttackValue += magAdd; float damage = srcAttackValue - target.Props.GetProperty_Float(ENProperty.magdefend); float min = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enMagAttackMinValue).FloatTypeValue; if (damage < srcAttackValue * min) { //伤害最低为魔法攻击的10% damage = srcAttackValue * min; } else { if (param[2] != 0) { //百分比上下浮动 //目标的伤害系数 float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam); damage *= (woundParam != 0 ? woundParam : 1); damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]); } } DamageValue = damage; m_attackValue = source.Props.GetProperty_Float(ENProperty.magattack); } break; #endregion #region enDamagePercent case ENDamageType.enDamagePercent: { float percent = param[1]; if (percent > 0 && percent < 1) { float damage = target.MaxHP * percent; float random = param[2]; if (random != 0) { //百分比上下浮动 //目标的伤害系数 float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam); damage *= (woundParam != 0 ? woundParam : 1); damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]); } DamageValue = damage; } } break; #endregion #region enDamageSunder case ENDamageType.enDamageSunder: { float srcAttackValue = source.Props.GetProperty_Float(ENProperty.phyattack); srcAttackValue += phyAdd; float damage = srcAttackValue - target.Props.GetProperty_Float(ENProperty.phydefend) * param[1]; if (damage < srcAttackValue * 0.1f) { //伤害最低为物理攻击的10% damage = srcAttackValue * 0.1f; } else { if (param[2] != 0) { //百分比上下浮动 //目标的伤害系数 float woundParam = target.Props.GetProperty_Float(ENProperty.WoundParam); damage *= (woundParam != 0 ? woundParam : 1); damage *= UnityEngine.Random.Range(1 - param[2], 1 + param[2]); } } DamageValue = damage; m_attackValue = source.Props.GetProperty_Float(ENProperty.phyattack); } break; #endregion #region enDistancePhyDamageTimes case ENDamageType.enPhyDamageDistance: { SkillInfo skillInfo = GameTable.SkillTableAsset.Lookup(SkillID); if (skillInfo == null) { return; } float range = 0; float d = ActorTargetManager.GetTargetDistance(source.RealPos, target.RealPos); if (d < param[1]) { range = param[1]; } else if (d > param[2]) { range = param[2]; } else { range = d; } float attackValue = source.Props.GetProperty_Float(ENProperty.phyattack); float defend = target.Props.GetProperty_Float(ENProperty.phydefend); DamageValue = attackValue * (range / skillInfo.AttackDistance) * param[3] - defend; float min = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enPhyAttackMinValue).FloatTypeValue; if (DamageValue < attackValue * min) { DamageValue = attackValue * min; } } break; #endregion #region enDistanceMagDamageTimes case ENDamageType.enMagDamageDistance: { SkillInfo skillInfo = GameTable.SkillTableAsset.Lookup(SkillID); if (skillInfo == null) { return; } float range = 0; float d = ActorTargetManager.GetTargetDistance(source.RealPos, target.RealPos); if (d < param[1]) { range = param[1]; } else if (d > param[2]) { range = param[2]; } else { range = d; } float attackValue = source.Props.GetProperty_Float(ENProperty.magattack); float defend = target.Props.GetProperty_Float(ENProperty.magdefend); DamageValue = attackValue * (range / skillInfo.AttackDistance) * param[3] - defend; float min = GameTable.WorldParamTableAsset.Lookup((int)ENWorldParamIndex.enMagAttackMinValue).FloatTypeValue; if (DamageValue < attackValue * min) { DamageValue = attackValue * min; } } break; #endregion default: break; } DamageResultType = (ENDamageResultType)param[4]; if (DamageValue != 0) { DamageValue *= damageModify; if (UnityEngine.Random.Range(0.0f, 1f) < source.Props.GetProperty_Float(ENProperty.crit)) {//暴击 m_isCrit = true; DamageValue *= (source.Props.GetProperty_Float(ENProperty.critParam)); } } else { Debug.LogWarning("damage result is error, damage is " + DamageValue.ToString() + ", source actor id is " + source.ID.ToString()); } } }