Ejemplo n.º 1
0
        private void CharacterHited(Character character, int damage, int damage2, int damageMana, bool addMagicHitedExp = true)
        {
            var isInDeath = character.IsDeathInvoked;

            character.LastAttackerMagicSprite = this;

            //Hit ratio
            var         targetEvade          = character.Evade;
            var         belongCharacterEvade = BelongCharacter.Evade;
            const float maxOffset            = 100f;
            const float baseHitRatio         = 0.05f;
            const float belowRatio           = 0.5f;
            const float upRatio  = 0.45f;
            var         hitRatio = baseHitRatio;

            if (targetEvade >= belongCharacterEvade)
            {
                hitRatio += ((float)belongCharacterEvade / (float)targetEvade) * belowRatio;
            }
            else
            {
                var upOffsetRatio = ((float)belongCharacterEvade - targetEvade) / maxOffset;
                if (upOffsetRatio > 1f)
                {
                    upOffsetRatio = 1f;
                }
                hitRatio += belowRatio + upOffsetRatio * upRatio;
            }

            if (_parasitiferCharacter != null || Globals.TheRandom.Next(101) <= (int)(hitRatio * 100f))
            {
                var effect2 = damage2 - character.Defend2;
                var effect  = (damage - character.Defend);
                foreach (var magicSprite in character.MagicSpritesInEffect)
                {
                    var magic = magicSprite.BelongMagic;
                    switch (magic.MoveKind)
                    {
                    case 13:
                        if (magic.SpecialKind == 3)
                        {
                            //Target character have protecter
                            var damageReduce  = MagicManager.GetEffectAmount(magic, character);
                            var damageReduce2 = MagicManager.GetEffectAmount2(magic, character);
                            effect2 -= damageReduce2;
                            effect  -= damageReduce;
                        }
                        break;
                    }
                }

                if (effect2 > 0)
                {
                    effect += effect2;
                }

                if (effect > character.Life)
                {
                    //Effect amount should less than or equal target character current life amount.
                    effect = character.Life;
                }
                character.DecreaseLifeAddHurt(effect < MinimalDamage ? MinimalDamage : effect);
                character.DecreaseMana(damageMana);

                //Restore
                if (BelongMagic.RestoreProbability > 0 &&
                    Globals.TheRandom.Next(0, 100) < BelongMagic.RestoreProbability)
                {
                    var restoreAmount = (effect * BelongMagic.RestorePercent) / 100;
                    switch ((Magic.RestorePropertyType)BelongMagic.RestoreType)
                    {
                    case Magic.RestorePropertyType.Life:
                        BelongCharacter.AddLife(restoreAmount);
                        break;

                    case Magic.RestorePropertyType.Mana:
                        BelongCharacter.AddMana(restoreAmount);
                        break;

                    case Magic.RestorePropertyType.Thew:
                        BelongCharacter.AddThew(restoreAmount);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }

            if (_parasitiferCharacter != null)
            {
                _totalParasticEffect += damage;
            }

            if (character.MagicToUseWhenBeAttacked != null)
            {
                Vector2   destination;
                Character target  = null;
                var       dirType = (Character.BeAttackedUseMagicDirection)character.MagicDirectionWhenBeAttacked;
                switch (dirType)
                {
                case Character.BeAttackedUseMagicDirection.Attacker:
                    destination = BelongCharacter.PositionInWorld;
                    target      = BelongCharacter;
                    break;

                case Character.BeAttackedUseMagicDirection.MagicSpriteOppDirection:
                    destination = RealMoveDirection == Vector2.Zero
                            ? (character.PositionInWorld + Utils.GetDirection8(character.CurrentDirection))
                            : (character.PositionInWorld - RealMoveDirection);
                    break;

                case Character.BeAttackedUseMagicDirection.CurrentNpcDirection:
                    destination = character.PositionInWorld + Utils.GetDirection8(character.CurrentDirection);
                    break;

                default:
                    destination = BelongCharacter.PositionInWorld;
                    break;
                }
                MagicManager.UseMagic(character, character.MagicToUseWhenBeAttacked, character.PositionInWorld, destination, target);
            }

            {
                Player player = null;
                MagicListManager.MagicItemInfo info = null;
                if (BelongCharacter.IsPlayer)
                {
                    player = BelongCharacter as Player;
                    info   = BelongMagic.ItemInfo;
                }
                else if (BelongCharacter.ControledMagicSprite != null)
                {
                    player = BelongCharacter.ControledMagicSprite.BelongCharacter as Player;
                    if (player != null)
                    {
                        info = player.CurrentMagicInUse;
                    }
                }
                else if (BelongCharacter.SummonedByMagicSprite != null && BelongCharacter.SummonedByMagicSprite.BelongCharacter.IsPlayer)
                {
                    //Summoned by player, add player's exp
                    player = BelongCharacter.SummonedByMagicSprite.BelongCharacter as Player;
                    if (player != null)
                    {
                        info = player.CurrentMagicInUse;
                    }
                }
                if (addMagicHitedExp && player != null && info != null)
                {
                    var amount = Utils.GetMagicExp(character.Level);
                    player.AddMagicExp(info, amount);
                }
            }

            //Exp
            if (BelongCharacter.IsPlayer || BelongCharacter.IsFighterFriend)
            {
                character.NotifyEnemyAndAllNeighbor(BelongCharacter);
                var isSummonedByPlayerorPartner = (BelongCharacter.SummonedByMagicSprite != null &&
                                                   (BelongCharacter.SummonedByMagicSprite.BelongCharacter.IsPlayer ||
                                                    BelongCharacter.SummonedByMagicSprite.BelongCharacter.IsPartner));
                var isControledByPlayer = (BelongCharacter.ControledMagicSprite != null &&
                                           BelongCharacter.ControledMagicSprite.BelongCharacter.IsPlayer);
                //Hited character death
                if (!isInDeath &&             //Alive before hited
                    character.IsInDeathing && //Death after hited
                    (BelongCharacter.IsPlayer ||
                     BelongCharacter.IsPartner ||
                     isSummonedByPlayerorPartner ||
                     isControledByPlayer))
                {
                    var player = Globals.ThePlayer;
                    var exp    = Utils.GetCharacterDeathExp(Globals.ThePlayer, character);
                    player.AddExp(exp, true);
                }
            }
        }
Ejemplo n.º 2
0
        private void CharacterHited(Character character, int damage)
        {
            //Hit ratio
            var         targetEvade          = character.Evade;
            var         belongCharacterEvade = BelongCharacter.Evade;
            const float maxOffset            = 100f;
            const float baseHitRatio         = 0.05f;
            const float belowRatio           = 0.5f;
            const float upRatio  = 0.45f;
            var         hitRatio = baseHitRatio;

            if (targetEvade >= belongCharacterEvade)
            {
                hitRatio += ((float)belongCharacterEvade / (float)targetEvade) * belowRatio;
            }
            else
            {
                var upOffsetRatio = ((float)belongCharacterEvade - targetEvade) / maxOffset;
                if (upOffsetRatio > 1f)
                {
                    upOffsetRatio = 1f;
                }
                hitRatio += belowRatio + upOffsetRatio * upRatio;
            }

            if (Globals.TheRandom.Next(101) <= (int)(hitRatio * 100f))
            {
                var effect = damage - character.Defend;
                foreach (var magicSprite in character.MagicSpritesInEffect)
                {
                    var magic = magicSprite.BelongMagic;
                    switch (magic.MoveKind)
                    {
                    case 13:
                        if (magic.SpecialKind == 3)
                        {
                            //Target character have protecter
                            var damageReduce = MagicManager.GetEffectAmount(magic, character);
                            effect -= damageReduce;
                        }
                        break;
                    }
                }
                if (effect > character.Life)
                {
                    //Effect amount should less than or equal target character current life amount.
                    effect = character.Life;
                }
                character.DecreaseLifeAddHurt(effect < MinimalDamage ? MinimalDamage : effect);

                //Restore
                if (BelongMagic.RestoreProbability > 0 &&
                    Globals.TheRandom.Next(0, 100) < BelongMagic.RestoreProbability)
                {
                    var restoreAmount = (effect * BelongMagic.RestorePercent) / 100;
                    switch ((Magic.RestorePropertyType)BelongMagic.RestoreType)
                    {
                    case Magic.RestorePropertyType.Life:
                        BelongCharacter.AddLife(restoreAmount);
                        break;

                    case Magic.RestorePropertyType.Mana:
                        BelongCharacter.AddMana(restoreAmount);
                        break;

                    case Magic.RestorePropertyType.Thew:
                        BelongCharacter.AddThew(restoreAmount);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }

            {
                Player player = null;
                MagicListManager.MagicItemInfo info = null;
                if (BelongCharacter.IsPlayer)
                {
                    player = BelongCharacter as Player;
                    info   = BelongMagic.ItemInfo;
                }
                else if (BelongCharacter.ControledMagicSprite != null)
                {
                    player = BelongCharacter.ControledMagicSprite.BelongCharacter as Player;
                    if (player != null)
                    {
                        info = player.CurrentMagicInUse;
                    }
                }
                else if (BelongCharacter.SummonedByMagicSprite != null && BelongCharacter.SummonedByMagicSprite.BelongCharacter.IsPlayer)
                {
                    //Summoned by player, add player's exp
                    player = BelongCharacter.SummonedByMagicSprite.BelongCharacter as Player;
                    if (player != null)
                    {
                        info = player.CurrentMagicInUse;
                    }
                }
                if (player != null && info != null)
                {
                    var amount = Utils.GetMagicExp(character.Level);
                    player.AddMagicExp(info, amount);
                }
            }
        }