예제 #1
0
        public async Task DmgHealthHandeling(int dmgWhere, double dmg, int dmgType, AccountSettings myAccount,
                                             AccountSettings enemyAccount)
        {
            //TODO implemnt
            // >on hit dmg

            /*
             * 0 = Regular
             * 1 = To health
             * 2 = only to stamina
             */
            // type 0 = physic, 1 = magic

            var onHitDmg = _magicReduction.ResistHandling(myAccount.MagicalPenetration, enemyAccount.MagicalResistance, myAccount.OnHitDamage);

            if (myAccount.PrecentBonusDmg > 0)
            {
                dmg = dmg * (1 + myAccount.PrecentBonusDmg);
            }

            if (dmg > 0)
            {
                if (myAccount.IsCrit)
                {
                    dmg = _crit.CritHandling(myAccount.Agility_Stats,
                                             dmg, myAccount); // check crit
                }
            }
            dmg = _dodge.DodgeHandling(myAccount.Agility_Stats, dmg,
                                       myAccount, enemyAccount); // check block


            if (dmg > 0)
            {
                dmg = CheckForBlock(dmgType, dmg, myAccount); // check for block, if dmg <= 0 than dont waste block
            }
            // 0 - artmor
            // 1 - magic
            // 2 - mix (50/50)
            if (dmg > 0) // armor resist handling
            {
                switch (dmgType)
                {
                case 0:
                    dmg = _armorReduction.ArmorHandling(myAccount.PhysicalPenetration, enemyAccount.PhysicalResistance, dmg);
                    break;

                case 1:
                    dmg = _magicReduction.ResistHandling(myAccount.MagicalPenetration, enemyAccount.MagicalResistance, dmg);
                    break;

                case 3:
                    var part1 = _armorReduction.ArmorHandling(myAccount.PhysicalPenetration, enemyAccount.PhysicalResistance, dmg / 2);
                    var part2 = _magicReduction.ResistHandling(myAccount.MagicalPenetration, enemyAccount.MagicalResistance, dmg / 2);
                    dmg = part1 + part2;
                    break;

                case 2:
                    //true dmg - no armor reduction.
                    break;

                default:
                    throw new ApplicationException("Damage Type is not in the range (0 - armor, 1 - magic, 2 - 50/50)");
                    //TODO implement mix dmg
                }
            }

            if (dmg > 0)
            {
                myAccount.Health += dmg * myAccount.LifeStealPrec; //lifesteal
            }
            if (myAccount.Health > myAccount.MaxHealth)
            {
                myAccount.Health = myAccount.MaxHealth;                                         // hp cant be more than MAX hp
            }
            var status = 0;
            var userId = myAccount.Id;

            if (dmg > 0)
            {
                dmg += onHitDmg;
            }

            switch (dmgWhere)
            {
            case 0 when enemyAccount.Stamina > 0:

                if (dmgType == 0)
                {
                    dmg = dmg - enemyAccount.PhysShield;

                    if (dmg < 0)
                    {
                        dmg = 0;
                    }
                }

                enemyAccount.Stamina -= Math.Ceiling(dmg);
                _accounts.SaveAccounts(userId);

                if (enemyAccount.Stamina < 0)
                {
                    enemyAccount.Health += enemyAccount.Stamina;
                    enemyAccount.Stamina = 0;
                    _accounts.SaveAccounts(userId);
                }

                break;

            case 0:

                if (dmgType == 0)
                {
                    dmg = dmg - myAccount.PhysShield;

                    if (dmg < 0)
                    {
                        dmg = 0;
                    }
                }

                if (enemyAccount.Stamina <= 0)
                {
                    enemyAccount.Health -= Math.Ceiling(dmg);
                    _accounts.SaveAccounts(userId);
                }

                break;

            case 1:
                enemyAccount.Health -= Math.Ceiling(dmg);
                _accounts.SaveAccounts(userId);
                break;

            case 2:
                enemyAccount.Stamina -= Math.Ceiling(dmg);
                if (enemyAccount.Stamina < 0)
                {
                    enemyAccount.Stamina = 0;
                }
                _accounts.SaveAccounts(userId);
                break;
            }

            if (enemyAccount.Health <= 0)
            {
                enemyAccount.Health = 0;
                status = 1;
            }

            _accounts.SaveAccounts(myAccount.Id);
            _accounts.SaveAccounts(enemyAccount.Id);

            await _updateFightPage.UpdateIfWinOrContinue(status, myAccount.Id, myAccount.MessageIdInList);
        }
예제 #2
0
        public double AttackDamageActiveSkills(ulong skillId, AccountSettings myAccount, AccountSettings enemyAccount,
                                               bool check)
        {
            double dmg = 0;

            switch (skillId)
            {
            //1096 (ад ветка) - 100% от АД

            //Done Checked
            case 1096:
                dmg = myAccount.AttackPower_Stats;
                break;
            //Атака(100% - Сила) + (5% от вражеских HP +5% за каждые 20 Силы). (Активируется только по HP)",

            //Done Checked
            case 1001:
                var minus = myAccount.Strength;
                if (minus > 100)
                {
                    minus = 100;
                }

                dmg = ((100 - minus) / 100 * myAccount.AttackPower_Stats) +
                      enemyAccount.Health * (myAccount.Strength / 20 * 5 / 100 + 0.05);

                if (!check)
                {
                    myAccount.SkillCooldowns.Add(new AccountSettings.CooldownClass(skillId, 6));
                }
                break;

            // (ад ветка) Острый топор - снижает вражеский армор на 2 уровня на 2 хода, 4 хода КД  || 1003

            // Done Checked
            case 1003:

                if (!check)
                {
                    enemyAccount.InstantDeBuff.Add(new AccountSettings.InstantBuffClass(skillId, 2, false));
                    myAccount.SkillCooldowns.Add(new AccountSettings.CooldownClass(skillId, 4));
                }

                break;

            // (ад ветка) Грязный прием - пропускает один ход, и через еще ход бьет 228% от ад. 1005
            // -Пропускает ход1, может ходить на ход2, и тратит ход3 на удар

            //Done
            case 1005:

                dmg = 2.28 * myAccount.AttackPower_Stats;

                if (!check)
                {
                    enemyAccount.InstantDeBuff.Add(new AccountSettings.InstantBuffClass(skillId, 1, false));
                    dmg = 0;
                }

                break;

            // (ад ветка - ульта) Палач - добивает врага с 25% хп и ниже. (контрит перерождения) 1007

            //DONE
            case 1007:
                dmg = 0.25 >= enemyAccount.Health / enemyAccount.MaxHealth ? 99999999.00 : 1;
                if (!check)
                {
                    myAccount.SkillCooldowns.Add(new AccountSettings.CooldownClass(skillId, 10));
                }
                //TODO: I can use this with LAmar        private readonly Scope _upd;   _upd.GetInstance<UpdateFightPage>().UpdateIfWinOrContinue(1, myAccount.Id, myAccount.MessageIdInList);


                break;

            // (ад ветка) Кулак богатыря - дамажит 20% от ад за каждые 10 силы. (кд 5 ходов) 1009

            //DONE
            case 1009:
                dmg = myAccount.AttackPower_Stats * 0.2 * (myAccount.Strength / 10);
                if (!check)
                {
                    myAccount.SkillCooldowns.Add(new AccountSettings.CooldownClass(skillId, 5));
                }
                break;

            //(ад ветка) All in - пропускает ход, увеличивает физический урон на один ход через 4 хода. на 10% за каждый пропущенный ход (макс 40%)

            //Done
            case 1011:
                myAccount.InstantBuff.Add(new AccountSettings.InstantBuffClass(skillId, 4, false));
                break;
//1013 (ад ветка) Спартанское копье - активно кричит "Слабым здесь не место", кидая на следующий ход копье, нанося 100% от ад + 15% от вражеских потерянных хп.

            //DONE
            case 1013:
                myAccount.InstantBuff.Add(new AccountSettings.InstantBuffClass(skillId, 1, false));
                break;

            // (ад ветка-ульта) Замах ненависти - пропускает ход, следующих ходом наносит сокрушительный удар на 300% от ад и игнорирует 1 уровень физ защиты. 1015
            //    Дамаг считается за крит и не может быть увеличен крит уроном.
            //TODO this
            case 1015:
                dmg = myAccount.AttackPower_Stats * 3;
                if (!check)
                {
                    enemyAccount.DamageOnTimer.Add(new AccountSettings.DmgWithTimer(dmg, 0, 1));
                    dmg = 0;
                }

                // -Здесь должна быть +1 армор пенетры на удар. так же этот удар не критует, но считается критом для игры (есть там пара скиллов на этой механнике)
                break;

            //1017 (ад ветка) Внезапный выпад - дамажит 120% от ад (нельзя увернуться) (кд 7 ходов)

            //DONE
            case 1017:
                dmg = myAccount.AttackPower_Stats * 1.2;

                if (!check)
                {
                    myAccount.SkillCooldowns.Add(new AccountSettings.CooldownClass(skillId, 7));
                }
                // -Нельзя увернутся от этого удара
                break;

            // 1019(ад ветка) Решительность - повышает ад на 50 % на следующий ход.

            //DONE
            case 1019:
                if (!check)
                {
                    myAccount.InstantBuff.Add(new AccountSettings.InstantBuffClass(skillId, 2, false));
                }

                break;


            //1021 (ад ветка) Кромсатель - наносит 3 удара 30%+50%+70% от ад.  пропуская следующих ход, но получая онхит на 5 ходов (20% уровня + вражеский уровень армора * 10% от уровня)

            //TODO in CheckForBuffs()
            case 1021:
                myAccount.InstantBuff.Add(new AccountSettings.InstantBuffClass(skillId, 1, false));
                break;


            //1023 (ад ветка - ульта) Кровавая месть - дает 50% физ лайвстила на 5 ходов

            //DONE
            case 1023:
                if (!check)
                {
                    enemyAccount.InstantDeBuff.Add(new AccountSettings.InstantBuffClass(skillId, 5, false));
                }

                break;
            }


            if (check)
            {
                if (myAccount.PrecentBonusDmg > 0)
                {
                    dmg = dmg * (1 + myAccount.PrecentBonusDmg);
                }
            }
            if (check)
            {
                dmg = _armorReduction.ArmorHandling(myAccount.PhysicalPenetration, enemyAccount.PhysicalResistance,
                                                    dmg);
            }


            _accounts.SaveAccounts(myAccount.Id);
            _accounts.SaveAccounts(enemyAccount.Id);


            return(dmg);

            //if(check) this is only to show the dmg for display
        }