예제 #1
0
    /// <summary>Mechanic to execute when hitting an object. Overrideable.</summary>
    virtual public void OnCollisionEnter(Collision collision)
    {
        ICombative combativeObject = collision.gameObject.GetComponent <ICombative>();

        if (combativeObject != null)
        {
            DamageObject(combativeObject);
        }
        Destroy(this);
    }
예제 #2
0
 public bool CombatAction(ICombative other, Move move, out string combatActionMessage)
 {
     combatActionMessage = "";
     if (move.PP == 0)
     {
         return(false);
     }
     combatActionMessage += Attack(other, move);
     move.PP--;
     return(true);
 }
예제 #3
0
 private void ApplyEffect(ICombative other, Move move)
 {
     if (move.TargetsOther &&
         isEffectSuccessful(this, move))
     {
         other.ReceiveEffect(move);
     }
     else if (!move.TargetsOther)
     {
         ReceiveEffect(move);
     }
 }
예제 #4
0
 private string CreateEffectiveMoveMessage(ICombative other, Move move)
 {
     if (other.isDoubleDamageFrom(move.Type))
     {
         return("|It's super effective!\n");
     }
     else if (other.isHalfDamageFrom(move.Type))
     {
         return("|It's not very effective...\n");
     }
     else
     {
         return("");
     }
 }
예제 #5
0
        private float GetDamageModifier(ICombative defender, Move move)
        {
            float  modifier      = 1f;
            Random rand          = new Random();
            float  random        = ((float)rand.Next(85, 100)) / 100f;
            float  STAB          = move.Type == this.PokeType.Name ? 1.5f : 1.0f;
            float  typeEffective = 1.0f;

            if (defender.isDoubleDamageFrom(move.Type))
            {
                typeEffective = 2.0f;
            }
            else if (defender.isHalfDamageTo(move.Type))
            {
                typeEffective = 0.5f;
            }

            modifier *= (random * STAB * typeEffective);

            return(modifier);
        }
예제 #6
0
        private int CalculateDamage(ICombative defender, Move move)
        {
            var   modifier = GetDamageModifier(defender, move);
            float attackerStageMultiplier = isSpecialAttack(move.Type) ? this.Stats.Skills["special-attack"].StageMultiplier
                : this.Stats.Skills["attack"].StageMultiplier;
            float defenderStageMultiplier = isSpecialAttack(move.Type) ? defender.GetStats().Skills["special-defense"].StageMultiplier
                : defender.GetStats().Skills["defense"].StageMultiplier;

            string attackSkill  = isSpecialAttack(move.Type) ? "special-attack" : "attack";
            string defenseSkill = isSpecialAttack(move.Type) ? "special-defense" : "defense";

            var A = this.Stats.Skills[attackSkill].Value * attackerStageMultiplier;
            var D = defender.GetStats().Skills[defenseSkill].Value * defenderStageMultiplier;

            var numerator   = (((2 * Stats.Level) / 5) + 2) * move.Power * (A / D) * modifier;
            var denominator = 50;

            var damage = ((numerator / denominator) + 2) * modifier;

            return((int)damage);
        }
예제 #7
0
        public string TriggerAilments(ICombative attacker)
        {
            var logMessage = "";

            if (CurrentAilments.Count == 0)
            {
                return("");
            }
            foreach (var ailment in CurrentAilments.Values)
            {
                ailment.ApplyAilment(this);
                if (CurrentAilments.ContainsKey(ailment.Name))
                {
                    logMessage += $"|{Name} was afflicted by {ailment.Name}! \n";
                }

                if (ailment.Name.Equals("leech-seed"))
                {
                    System.Console.WriteLine("BINGO");
                    var healthLeeched = ((Leech)ailment).healthLeeched(this);
                    attacker.Heal((int)healthLeeched);
                }
                else if (ailment.Name.Equals("confusion"))
                {
                    logMessage += $"|{Name} is confused!";
                    var confusionDamage = ((Confusion)ailment).GetDamage(this);
                    if (((Confusion)ailment).isTargetOther(PokeType.Name))
                    {
                        attacker.TakeDamage((int)confusionDamage);
                    }
                    else
                    {
                        logMessage += $"|{Name} hurt itself in confusion!";
                        this.TakeDamage((int)confusionDamage);
                    }
                }
            }
            return(logMessage);
        }
예제 #8
0
        private string Attack(ICombative other, Move move)
        {
            if (!other.isAttackDodged(this, move))
            {
                var damage = CalculateDamage(other, move);
                other.TakeDamage(damage);

                if (!move.StatChangeName.Equals("none"))
                {
                    ApplyEffect(other, move);
                }
                if (move.Ailment != null)
                {
                    other.ReceiveAilment(move.Ailment);
                }
                return(CreateEffectiveMoveMessage(other, move));
            }
            else
            {
                return("|It missed!\n");
            }
        }
예제 #9
0
        public float healthLeeched(ICombative receiver)
        {
            float damageDealt = receiver.GetStats().MaxHP *(0.10f);

            return(damageDealt);
        }
예제 #10
0
 public override void Kill(ICombative objectToKill)
 {
 }
예제 #11
0
 public override void IssueDamage(int damageToGive, ICombative objectToDamage)
 {
 }
예제 #12
0
 abstract public void Kill(ICombative objectToKill);
예제 #13
0
 abstract public void IssueDamage(int damageToGive, ICombative objectToDamage);
예제 #14
0
 /// <summary>Damage mechanics when having hit an ICombative target. Overridable.</summary>
 virtual public void DamageObject(ICombative target)
 {
     target.TakeDamage(projectileDamage);
 }