예제 #1
0
    //Heals are bit different but similar enough, most notable is that you can't heal enemies and you can never heal more than once at a time
    DamageRelated Heal(RPGClass.CombatStats Healer, RPGClass.CombatStats Other)
    {
        int Hit = 100, Crit = 0, HealAmount = Healer.Attack, HealCount;

        if (Other.UnitReference.tag != Healer.UnitReference.tag)
        {
            HealCount = 0;
        }
        else
        {
            HealCount = 1;
        }

        return(new DamageRelated(Healer.UnitReference, Healer.Health, HealAmount, Hit, Crit, HealCount));
    }
예제 #2
0
    //figure out attacker parameters relative to the defender.
    DamageRelated ProbableDamage(RPGClass.CombatStats Attacker, RPGClass.CombatStats Defender, Terrain AttackerTerrain, Terrain DefenderTerrain)
    {
        //Don't attack with a staff, it's for healing not hurting! (This only basic staves)
        if (Attacker.EquipedWeapon.WeaponCategory == Weapons.WeaponType.Staff && Attacker.EquipedWeapon.Effect == Weapons.WeaponEffect.Basic)
        {
            return(Heal(Attacker, Defender));
        }

        int Hit    = Attacker.HitChance - Defender.Dodge - DefenderTerrain.DodgeBonus; //Hit chance = hit - dodge - dodge bonus
        int Crit   = Attacker.CritChance - Defender.CriticalDodge;                     //Crit chance = crit - crit dodge
        int Damage = Attacker.Attack;                                                  //Damage = strength/magic + might

        //Reduce damage by defenders defense/resistance according to attacker damage type
        if (Attacker.DamageType == Weapons.Damage.Physical)
        {
            Damage -= (Defender.Defense + DefenderTerrain.DefenseBonus);
        }
        else
        {
            Damage -= (Defender.Resistance + DefenderTerrain.DefenseBonus);
        }

        //Determine the number of attacks a unit has, by default 1
        int AttackCount = 1;

        //If the attacker is signifigantly faster than the defender
        if (Attacker.AttackSpeed > Defender.AttackSpeed + 5)
        {
            AttackCount = 2;
        }

        //If the attacker has a special weapon
        if (Attacker.EquipedWeapon.Effect == Weapons.WeaponEffect.DoubleStrike)
        {
            AttackCount *= 2;
        }

        //Get Distance
        int distance = Mathf.Abs(AttackerTerrain.x - DefenderTerrain.x) + Mathf.Abs(AttackerTerrain.y - DefenderTerrain.y);

        //Check Range
        if (distance > Attacker.EquipedWeapon.maxRange || distance < Attacker.EquipedWeapon.minRange)
        {
            AttackCount = 0;
        }

        //Calculate weapon triangle effect, then apply them
        int[] Modifiers = WeaponTriangleEffect(Attacker.EquipedWeapon, Defender.EquipedWeapon);
        Damage += Modifiers[0];
        Hit    += Modifiers[1];

        //Finally, clamp final values so that they make sense to the player
        if (Damage < 0)
        {
            Damage = 0;
        }
        if (Crit < 0)
        {
            Crit = 0;
        }
        else if (Crit > 100)
        {
            Crit = 100;
        }
        if (Hit < 0)
        {
            Hit = 0;
        }
        else if (Hit > 100)
        {
            Hit = 100;
        }

        return(new DamageRelated(Attacker.UnitReference, Attacker.UnitReference.Stats[(int)RPGClass.Stat.HitPoints].dynamicValue, Damage, Hit, Crit, AttackCount, Modifiers[2]));
    }