Пример #1
0
    //////////////////////////////////////////
    /// 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);
        }
    }
Пример #2
0
 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;
     }
 }
Пример #3
0
        //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()));
        }
Пример #5
0
        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);
            }
        }