////////////////////////////////////////// /// ProcessAction() /// Processes the incoming action, doing /// whatever it's supposed to do. ////////////////////////////////////////// private void ProcessAction(QueuedAction i_action) { // get the target the action affects CharacterModel modelTarget = GetTargetModel(i_action.GetData().Target, i_action); CharacterModel modelAggressor = ModelManager.Instance.GetModel(i_action.GetOwnerID()); //Debug.Log( "Processing " + i_action.GetData().Name + " on " + modelTarget.Name ); // check to see if any effects on the aggressor contribute to increased power int nPowerBonus = modelAggressor.GetTotalModification("AllDamage"); int nDamage = i_action.GetData().Power + nPowerBonus; // check for valid bonus damage nDamage = CheckForBonuses(i_action.GetData(), nDamage, modelTarget, modelAggressor); // now do defenses -- for now, just handle one if (i_action.GetData().DamageTypes.Count > 0) { DamageTypes eDamageType = i_action.GetData().DamageTypes[0]; int nDefense = modelTarget.GetTotalModification(eDamageType.ToString() + "Defense"); if (nDamage > 0) { // something is reducing the defense nDamage = Mathf.Max(nDamage - nDefense, 0); } else { // something is augmenting the heal nDamage = nDamage + nDefense; } } // for now, we're just altering the hp of the target modelTarget.AlterHP(nDamage); // handle applied effects, if any foreach (AppliedEffectData effect in i_action.GetData().AppliedEffects) { // get the model the effect should apply to CharacterModel modelEffectTarget = GetTargetModel(effect.Target, i_action); // apply the effect! modelEffectTarget.ApplyEffect(effect); } // handle remove effects, if any foreach (RemovedEffectData removal in i_action.GetData().RemovedEffects) { // get the model the removal should apply to CharacterModel modelEffectRemoval = GetTargetModel(removal.Target, i_action); // remove the effect! modelEffectRemoval.RemoveEffect(removal); } }
public static float CalculateDamage(float damageTaken, DamageTypes type, ArmorValues values) { switch (type) { case DamageTypes.Ranged: return (1 / (0.1f * Mathf.Abs(values.BasicArmor) + 1)) * values.RangedDamageMult * damageTaken; case DamageTypes.Melee: return (1 / (0.1f * Mathf.Abs(values.BasicArmor) + 1)) * values.MeleeDamageMult * damageTaken; case DamageTypes.Magic: return (1 / (0.1f * Mathf.Abs(values.ElementalArmor) + 1)) * values.MeleeDamageMult * damageTaken; case DamageTypes.Explosion: return (1 / (0.1f * Mathf.Abs(values.BlastArmor) + 1)) * values.MeleeDamageMult * damageTaken; case DamageTypes.Pierce: return damageTaken; default: Debug.Log("Unknown Damage Type: " + type.ToString()); return damageTaken; } }
//Get all buffs for selected stat public int GetResistaneValue(DamageTypes damageType) { if (DamagResistances == null) { DamagResistances = new List <DamageResistance>(); } var resistances = from resistance in DamagResistances where resistance.DamageType == damageType select resistance; int value = 0; foreach (var i in resistances) { value += i.Value; } return(value + Effects(damageType.ToString())); }
public static void PrintDebugLogForInfo( Agent attackerAgent, Agent victimAgent, DamageTypes damageType, int speedBonus, int armorAmount, int inflictedDamage, int absorbedByArmor, sbyte collisionBone, float lostHpPercentage) { TextObject message = TextObject.Empty; CombatLogColor logColor = CombatLogColor.White; bool isMine = attackerAgent.IsMine; int num = victimAgent.IsMine ? 1 : 0; GameTexts.SetVariable("AMOUNT", inflictedDamage); GameTexts.SetVariable("DAMAGE_TYPE", damageType.ToString().ToLower()); GameTexts.SetVariable("LOST_HP_PERCENTAGE", lostHpPercentage); if (num != 0) { GameTexts.SetVariable("ATTACKER_NAME", attackerAgent.Name); message = GameTexts.FindText("combat_log_player_attacked"); logColor = CombatLogColor.Red; } else if (isMine) { GameTexts.SetVariable("VICTIM_NAME", victimAgent.Name); message = GameTexts.FindText("combat_log_player_attacker"); logColor = CombatLogColor.Green; } CombatLogManager.Print(message, logColor); MBStringBuilder mbStringBuilder = new MBStringBuilder(); mbStringBuilder.Initialize(callerMemberName: nameof(PrintDebugLogForInfo)); if (armorAmount > 0) { GameTexts.SetVariable("ABSORBED_AMOUNT", absorbedByArmor); GameTexts.SetVariable("ARMOR_AMOUNT", armorAmount); mbStringBuilder.AppendLine <string>(GameTexts.FindText("combat_log_damage_absorbed").ToString()); } if (victimAgent.IsHuman) { Agent.AgentBoneMapArray boneMappingArray = victimAgent.BoneMappingArray; for (int index = 0; index < boneMappingArray.Length; ++index) { HumanBone i = (HumanBone)index; if ((int)collisionBone == (int)boneMappingArray[i]) { GameTexts.SetVariable("BONE", i.ToString()); mbStringBuilder.AppendLine <string>(GameTexts.FindText("combat_log_hit_bone").ToString()); break; } } } if (speedBonus != 0) { GameTexts.SetVariable("SPEED_BONUS", speedBonus); mbStringBuilder.AppendLine <string>(GameTexts.FindText("combat_log_speed_bonus").ToString()); } CombatLogManager.Print(new TextObject(mbStringBuilder.ToStringAndRelease())); }
private int damageReduction(int damage) { DamageTypes dt = ((Weapon)this.comboWeapon.SelectedItem).DamageType; Armour ar = (Armour)this.comboArmour.SelectedItem; switch (dt) { case (DamageTypes.Normal): damage -= ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Floor(ar.DTNormal / 2.0) : ar.DTNormal; damage = ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Max(damage, Math.Floor(damage * ((100 - ar.DRNormal) / 100.0))) : (int)Math.Floor(damage * ((100 - ar.DRNormal) / 100.0)); return(Math.Max(0, damage)); case (DamageTypes.Laser): damage -= ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Floor(ar.DTLaser / 2.0) : ar.DTLaser; damage = ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Max(damage, Math.Floor(damage * ((100 - ar.DRLaser) / 100.0))) : (int)Math.Floor(damage * ((100 - ar.DRLaser) / 100.0)); return(Math.Max(0, damage)); case (DamageTypes.Plasma): damage -= ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Floor(ar.DTPlasma / 2.0) : ar.DTPlasma; damage = ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Max(damage, Math.Floor(damage * ((100 - ar.DRPlasma) / 100.0))) : (int)Math.Floor(damage * ((100 - ar.DRPlasma) / 100.0)); return(Math.Max(0, damage)); case (DamageTypes.Electrical): damage -= ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Floor(ar.DTElectrical / 2.0) : ar.DTElectrical; damage = ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Max(damage, Math.Floor(damage * ((100 - ar.DRElectrical) / 100.0))) : (int)Math.Floor(damage * ((100 - ar.DRElectrical) / 100.0)); return(Math.Max(0, damage)); case (DamageTypes.Fire): damage -= ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Floor(ar.DTFire / 2.0) : ar.DTFire; damage = ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Max(damage, Math.Floor(damage * ((100 - ar.DRFire) / 100.0))) : (int)Math.Floor(damage * ((100 - ar.DRFire) / 100.0)); return(Math.Max(0, damage)); case (DamageTypes.Explosion): damage -= ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Floor(ar.DTExplosive / 2.0) : ar.DTExplosive; damage = ((Weapon)this.comboWeapon.SelectedItem).Penetrating ? (int)Math.Max(damage, Math.Floor(damage * ((100 - ar.DRExplosive) / 100.0))) : (int)Math.Floor(damage * ((100 - ar.DRExplosive) / 100.0)); return(Math.Max(0, damage)); default: logger.logBoth(String.Format("Damage Reduction Failed, Incorrect DamageType: {0}", dt.ToString())); return(-1); } }