예제 #1
0
파일: AttackCalcs.cs 프로젝트: Pircs/Yi
        public static uint AdjustExp(int damage, YiObj attacker, YiObj target)
        {
            byte level = 120;

            if (attacker.Level < 120)
            {
                level = attacker.Level;
            }

            float exp      = Math.Min(damage, target.CurrentHp);
            var   deltaLvl = level - target.Level;

            if (target.IsGreen(attacker))
            {
                if (deltaLvl >= 3 && deltaLvl <= 5)
                {
                    exp *= 0.70f;
                }
                else if (deltaLvl > 5 && deltaLvl <= 10)
                {
                    exp *= 0.20f;
                }
                else if (deltaLvl > 10 && deltaLvl <= 20)
                {
                    exp *= 0.10f;
                }
                else if (deltaLvl > 20)
                {
                    exp *= 0.05f;
                }
            }
            else if (target.IsRed(attacker))
            {
                exp *= 1.30f;
            }
            else if (target.IsBlack(attacker))
            {
                if (deltaLvl >= -10 && deltaLvl < -5)
                {
                    exp *= 1.5f;
                }
                else if (deltaLvl >= -20 && deltaLvl < -10)
                {
                    exp *= 1.8f;
                }
                else if (deltaLvl < -20)
                {
                    exp *= 2.3f;
                }
            }

            double adjustedExp = Math.Max(1, exp);

            if (target is Player)
            {
                if (target.HasFlag(StatusEffect.RedName))
                {
                    adjustedExp = adjustedExp * 0.1;
                }
                else if (target.HasFlag(StatusEffect.BlackName))
                {
                    adjustedExp = adjustedExp * 0.2;
                }
                else
                {
                    adjustedExp = adjustedExp * 0.02;
                }

                if (attacker is Player)
                {
                    target.Experience -= (uint)Math.Max(1, adjustedExp);
                }
            }

            return((uint)Math.Max(1, adjustedExp));
        }