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); } } }
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); } } }