2026-01-15 01:27:48 +08:00

95 lines
4.5 KiB
C#

using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects.PassiveEffects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "深海之戟";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override string ExemptionDescription => Effects.Count > 0 ? Effects.First().ExemptionDescription : "";
public override int CanSelectTargetRange => 5;
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddPassiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description
{
get
{
string str = $"分裂伤害:{分裂百分比 * 100:0.##}%。无视免疫。";
if ( != null)
{
return $"技能机制受 [ {nameof(海王星的野望)} ] 影响而改变:{野望.爆炸伤害描述}未攻击标记目标时,按原机制,在普通攻击暴击时分裂。";
}
else if (GamingQueue?.Map != null)
{
return $"普通攻击暴击时会自动产生分裂伤害至其附近半径为 {Skill.CanSelectTargetRange} 格的菱形区域内的敌人,但最多只会对两个敌人造成分裂伤害。{str}";
}
else
{
return $"普通攻击暴击时会自动产生分裂伤害至其他两个随机的敌人。{str}";
}
}
}
public override ImmuneType IgnoreImmune => ImmuneType.All;
public double => Math.Min(0.5, 0.3 + (Skill.Character?.Level ?? 0 + 0.00) / 200);
public ? { get; set; } = null;
public override void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && != null && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && enemy.Effects.FirstOrDefault(e => e is ) is e)
{
.(character, enemy, actualDamage, damageType, magicType);
}
else if (character == Skill.Character && isNormalAttack && damageResult == DamageResult.Critical && GamingQueue != null)
{
List<Character> allEnemys = [.. GamingQueue.GetEnemies(character).Where(c => c != character && c != enemy && c.HP > 0)];
List<Character> targets = [];
if (GamingQueue?.Map is GameMap map)
{
List<Grid> grids = [];
Grid? enemyGrid = map.GetCharacterCurrentGrid(enemy);
if (enemyGrid != null)
{
grids.AddRange(map.GetGridsByRange(enemyGrid, Skill.CanSelectTargetRange, true));
grids = [.. grids.Where(g => g.Characters.Count > 0).OrderBy(g => GameMap.CalculateManhattanDistance(enemyGrid, g)).Take(2)];
}
targets = Skill.SelectTargetsByRange(character, allEnemys, [], [], grids, false);
}
else
{
targets.AddRange(allEnemys.OrderBy(o => Random.Shared.Next()).Take(2));
}
double = actualDamage * ;
foreach (Character target in targets)
{
DamageToEnemy(character, target, damageType, magicType, , new()
{
CalculateCritical = false,
CalculateReduction = true,
TriggerEffects = false,
IgnoreImmune = true
});
}
}
}
}
}