Exemple #1
0
        internal UnitStats ScaleMonster(UnitStats unitToScale, float statMulti)
        {
            //Get base
            UnitStats baseStats = LoadStats(1).Copy();
            //Get scale
            UnitStats scaling = LoadStats(2);

            baseStats.Id   = unitToScale.Id;
            baseStats.Name = unitToScale.Name;
            //Apply Scale
            baseStats.MaxHealth          = ScaleStat(baseStats.MaxHealth, scaling.MaxHealth, unitToScale.MaxHealth, statMulti);
            baseStats.MaxMana            = ScaleStat(baseStats.MaxMana, scaling.MaxMana, unitToScale.MaxMana, statMulti);
            baseStats.AttackPower        = ScaleStat(baseStats.AttackPower, scaling.AttackPower, unitToScale.AttackPower, statMulti);
            baseStats.MagicPower         = ScaleStat(baseStats.MagicPower, scaling.MagicPower, unitToScale.MagicPower, statMulti);
            baseStats.AttackDefense      = ScaleStat(baseStats.AttackDefense, scaling.AttackDefense, unitToScale.AttackDefense, statMulti);
            baseStats.MagicDefense       = ScaleStat(baseStats.MagicDefense, scaling.MagicDefense, unitToScale.MagicDefense, statMulti);
            baseStats.Accuracy           = ScaleStat(baseStats.Accuracy, scaling.Accuracy, unitToScale.Accuracy, statMulti);
            baseStats.Evasion            = ScaleStat(baseStats.Evasion, scaling.Evasion, unitToScale.Evasion, statMulti);
            baseStats.CritChance         = ScaleStat(baseStats.CritChance, scaling.CritChance, unitToScale.CritChance, statMulti);
            baseStats.CritMulti          = ScaleStat(baseStats.CritMulti, scaling.CritMulti, unitToScale.CritMulti, 1);
            baseStats.IncCritChance      = ScaleStat(baseStats.IncCritChance, scaling.IncCritChance, unitToScale.IncCritChance, 1);
            baseStats.TypeStatusChance   = ScaleStat(baseStats.TypeStatusChance, scaling.TypeStatusChance, unitToScale.TypeStatusChance, statMulti);
            baseStats.MentalStatusChance = ScaleStat(baseStats.MentalStatusChance, scaling.MentalStatusChance, unitToScale.MentalStatusChance, statMulti);
            baseStats.StatusPower        = ScaleStat(baseStats.StatusPower, scaling.StatusPower, unitToScale.StatusPower, 1);
            baseStats.IncTypeStatus      = ScaleStat(baseStats.IncTypeStatus, scaling.IncTypeStatus, unitToScale.IncTypeStatus, 1);
            baseStats.IncMentalStatus    = ScaleStat(baseStats.IncMentalStatus, scaling.IncMentalStatus, unitToScale.IncMentalStatus, 1);
            baseStats.ResistPhysical     = unitToScale.ResistPhysical;
            baseStats.ResistProjectile   = unitToScale.ResistProjectile;
            baseStats.ResistElectric     = unitToScale.ResistElectric;
            baseStats.ResistCold         = unitToScale.ResistCold;
            baseStats.ResistFire         = unitToScale.ResistFire;
            baseStats.ResistWind         = unitToScale.ResistWind;
            baseStats.ResistArcane       = unitToScale.ResistArcane;
            baseStats.ResistPsychic      = unitToScale.ResistPsychic;
            baseStats.ResistLight        = unitToScale.ResistLight;
            baseStats.ResistDark         = unitToScale.ResistDark;
            return(baseStats);
        }
Exemple #2
0
 public Player(UnitStats stats, List <SkillStats> skills) : base(stats, skills)
 {
     IsPlayer = true;
 }
Exemple #3
0
 public void SetBaseStats(UnitStats stats)
 {
     playerBase = stats.Copy();
 }
Exemple #4
0
 public Monster(UnitStats stats, List <SkillStats> skills) : base(stats, skills)
 {
     IsPlayer = false;
 }
Exemple #5
0
 public static void SetStat(UnitStats unit, string propName, float increase)
 {
     unit.GetType().GetProperty(propName).SetValue(unit, (float)unit.GetType().GetProperty(propName).GetValue(unit, null) + increase);
 }
Exemple #6
0
        internal static KeyValuePair <bool, int> Status(SkillStats skill, UnitStats attacker, UnitStats defender)
        {
            bool status         = false;
            bool playerAttacker = false;
            bool playerDefender = false;

            if (attacker.Id == 0)
            {
                playerAttacker = true;
            }
            else if (defender.Id == 0)
            {
                playerDefender = true;
            }
            if (skill.StatusType == Constants.StatusTypes.Blast)
            {
                float power = attacker.MagicPower;
                power *= (float)attacker.StatusPower / 100;
                power *= (float)skill.StatusPower / 100;
                return(new KeyValuePair <bool, int>(true, (int)power));
            }
            //Check evasion
            float accuracy = skill.Accuracy * ((float)attacker.Accuracy / 100);

            //Always hit if evasion <= 0
            if (defender.Evasion > 0)
            {
                accuracy /= (float)defender.Evasion / 100;
                int evasionRoll = RandomInt(1, 100);
                if (ExperimentControl.active)
                {
                    if (playerDefender)
                    {
                        int evasionRoll2 = RandomInt(1, 100);
                        if (evasionRoll2 > evasionRoll)
                        {
                            evasionRoll = evasionRoll2;
                        }
                    }
                }
                if (accuracy < evasionRoll)
                {
                    return(new KeyValuePair <bool, int> (false, 0));
                }
            }
            //Check Status
            float statusChance   = skill.StatusChance;
            int   statusDuration = 2;

            if (statusChance > 0)
            {
                bool statusAttempt;
                if (skill.StatusType >= Constants.StatusTypes.Sleep)
                {
                    statusAttempt  = TryChance(statusChance, attacker.MentalStatusChance, defender.IncMentalStatus, playerAttacker);
                    statusDuration = 4;
                }
                else
                {
                    statusAttempt = TryChance(statusChance, attacker.TypeStatusChance, defender.IncTypeStatus, playerAttacker);
                }
                if (statusAttempt)
                {
                    status = true;
                }
            }
            return(new KeyValuePair <bool, int>(status, statusDuration));
        }
Exemple #7
0
        internal static DamagePacket Hit(SkillStats skill, UnitStats attacker, UnitStats defender)
        {
            bool playerAttacker = false;
            bool playerDefender = false;

            if (attacker.Id == 0)
            {
                playerAttacker = true;
            }
            else if (defender.Id == 0)
            {
                playerDefender = true;
            }
            //Check evasion
            float accuracy = skill.Accuracy * ((float)attacker.Accuracy / 100);

            //Always hit if evasion <= 0
            if (defender.Evasion > 0)
            {
                accuracy /= (float)defender.Evasion / 100;
                int evasionRoll = RandomInt(1, 100);
                if (ExperimentControl.active)
                {
                    if (playerDefender)
                    {
                        int evasionRoll2 = RandomInt(1, 100);
                        if (evasionRoll2 > evasionRoll)
                        {
                            evasionRoll = evasionRoll2;
                        }
                    }
                }
                if (accuracy < evasionRoll)
                {
                    return(new DamagePacket(false));
                }
            }
            //Hit
            //Set Type
            float power          = 0;
            float defense        = 0;
            float resist         = 0;
            int   statusDuration = 2;

            switch (skill.DamageType)
            {
            case Constants.DamageTypes.Physical:
                power   = attacker.AttackPower;
                defense = defender.AttackDefense;
                resist  = defender.ResistPhysical;
                break;

            case Constants.DamageTypes.Projectile:
                power   = attacker.AttackPower;
                defense = defender.AttackDefense;
                resist  = defender.ResistProjectile;
                break;

            case Constants.DamageTypes.Almighty:
                power   = attacker.MagicPower;
                defense = defender.MagicDefense;
                break;

            case Constants.DamageTypes.Electric:
                power   = attacker.MagicPower;
                defense = defender.MagicDefense;
                resist  = defender.ResistElectric;
                break;

            case Constants.DamageTypes.Cold:
                power   = attacker.MagicPower;
                defense = defender.MagicDefense;
                resist  = defender.ResistCold;
                break;

            case Constants.DamageTypes.Fire:
                power          = attacker.MagicPower;
                defense        = defender.MagicDefense;
                resist         = defender.ResistFire;
                statusDuration = 4;
                break;

            case Constants.DamageTypes.Wind:
                power   = attacker.MagicPower;
                defense = defender.MagicDefense;
                resist  = defender.ResistWind;
                break;

            case Constants.DamageTypes.Arcane:
                power   = attacker.MagicPower;
                defense = defender.MagicDefense;
                resist  = defender.ResistArcane;
                break;

            case Constants.DamageTypes.Psychic:
                power   = attacker.MagicPower;
                defense = defender.MagicDefense;
                resist  = defender.ResistPsychic;
                break;

            case Constants.DamageTypes.Light:
                power   = attacker.MagicPower;
                defense = defender.MagicDefense;
                resist  = defender.ResistLight;
                break;

            case Constants.DamageTypes.Dark:
                power          = attacker.MagicPower;
                defense        = defender.MagicDefense;
                resist         = defender.ResistDark;
                statusDuration = 4;
                break;
            }
            //Check Weakness
            bool isWeak = false;

            if (resist <= -50)
            {
                isWeak = true;
            }
            //Check Technical
            bool isTechnical  = false;
            bool removeStatus = false;

            Constants.StatusTypes returnStatus = Constants.StatusTypes.None;
            switch (defender.Status)
            {
            case Constants.StatusTypes.None:
                break;

            case Constants.StatusTypes.Shock:
                if (skill.DamageType == Constants.DamageTypes.Physical)
                {
                    power        = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical  = true;
                    removeStatus = true;
                    returnStatus = Constants.StatusTypes.Shock;
                }
                else if (skill.DamageType == Constants.DamageTypes.Arcane)
                {
                    power        = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical  = true;
                    removeStatus = true;
                }
                break;

            case Constants.StatusTypes.Freeze:
                if (skill.DamageType == Constants.DamageTypes.Physical || skill.DamageType == Constants.DamageTypes.Projectile)
                {
                    power        = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical  = true;
                    removeStatus = true;
                }
                else if (skill.DamageType == Constants.DamageTypes.Arcane)
                {
                    power       = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical = true;
                }
                break;

            case Constants.StatusTypes.Burn:
                if (skill.DamageType == Constants.DamageTypes.Arcane)
                {
                    power       = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical = true;
                }
                break;

            case Constants.StatusTypes.Sleep:
                power       = (int)(power * Constants.TECHNICAL_MULTI);
                isTechnical = true;
                break;

            case Constants.StatusTypes.Forget:
                if (skill.DamageType == Constants.DamageTypes.Psychic)
                {
                    power       = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical = true;
                }
                break;

            case Constants.StatusTypes.Berserk:
                if (skill.DamageType == Constants.DamageTypes.Psychic)
                {
                    power       = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical = true;
                }
                break;

            case Constants.StatusTypes.Confuse:
                if (skill.DamageType == Constants.DamageTypes.Psychic)
                {
                    power       = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical = true;
                }
                break;

            case Constants.StatusTypes.Brainwash:
                if (skill.DamageType == Constants.DamageTypes.Psychic)
                {
                    power       = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical = true;
                }
                break;

            case Constants.StatusTypes.Fear:
                if (skill.DamageType == Constants.DamageTypes.Psychic)
                {
                    power       = (int)(power * Constants.TECHNICAL_MULTI);
                    isTechnical = true;
                }
                break;
            }
            //Check Crit
            bool isCrit = false;

            if (TryChance(skill.CritChance, attacker.CritChance, defender.IncCritChance, playerAttacker))
            {
                isCrit = true;
                float critMulti = attacker.CritMulti * ((float)skill.CritMulti / 100);
                power *= critMulti / 100;
            }
            //Check Status
            float statusChance = skill.StatusChance;

            statusChance *= (100 - resist) / 100;
            Constants.StatusTypes status = Constants.StatusTypes.None;
            if (!isTechnical)
            {
                if (statusChance > 0)
                {
                    if (isCrit)
                    {
                        statusChance *= Constants.CRITICAL_STATUS_MULTI;
                    }
                    bool statusAttempt;
                    if (skill.StatusType >= Constants.StatusTypes.Sleep)
                    {
                        statusAttempt = TryChance(statusChance, attacker.MentalStatusChance, defender.IncMentalStatus, playerAttacker);
                    }
                    else
                    {
                        statusAttempt = TryChance(statusChance, attacker.TypeStatusChance, defender.IncTypeStatus, playerAttacker);
                    }
                    if (statusAttempt)
                    {
                        status = skill.StatusType;
                    }
                }
            }
            //Calculate final power
            power *= (100 - resist) / 100;
            float statusPower = 0;

            if (status != Constants.StatusTypes.None)
            {
                statusPower  = power;
                statusPower *= (float)attacker.StatusPower / 100;
                statusPower *= (float)skill.StatusPower / 100;
            }
            if (defense > 0)
            {
                power /= defense / 100;
            }
            power *= (float)skill.Power / 100;
            DamagePacket packet = new DamagePacket(true, (int)power, (int)statusPower, isWeak, isTechnical, removeStatus, status, returnStatus, isCrit, statusDuration);

            return(packet);
        }