forked from Oshima-Studios/OshimaGameModule
103 lines
4.2 KiB
C#
103 lines
4.2 KiB
C#
using Milimoe.FunGame.Core.Entity;
|
|
using Milimoe.FunGame.Core.Library.Constant;
|
|
|
|
namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
|
|
{
|
|
public class 气绝 : Effect
|
|
{
|
|
public override long Id => 4109;
|
|
public override string Name => "气绝";
|
|
public override string Description => $"此角色处于气绝状态,行动受限并且每{GameplayEquilibriumConstant.InGameTime}持续流失 {(_isPercentage ? $"{_durationDamagePercent * 100:0.##}% [ {Damage:0.##} ]" : Damage.ToString("0.##"))} 点当前生命值。来自:[ {Source} ] 的 [ {Skill.Name} ]";
|
|
public override EffectType EffectType => EffectType.Bleed;
|
|
public override DispelledType DispelledType => DispelledType.Strong;
|
|
public override bool IsDebuff => true;
|
|
public override Character Source => _sourceCharacter;
|
|
public override bool Durative => _durative;
|
|
public override double Duration => _duration;
|
|
public override int DurationTurn => _durationTurn;
|
|
|
|
private readonly Character _targetCharacter;
|
|
private readonly Character _sourceCharacter;
|
|
private readonly bool _durative;
|
|
private readonly double _duration;
|
|
private readonly int _durationTurn;
|
|
private readonly bool _isPercentage;
|
|
private readonly double _durationDamage;
|
|
private readonly double _durationDamagePercent;
|
|
private double Damage => _isPercentage ? _targetCharacter.HP * _durationDamagePercent : _durationDamage;
|
|
|
|
public 气绝(Skill skill, Character targetCharacter, Character sourceCharacter, bool durative = false, double duration = 0, int durationTurn = 1,
|
|
bool isPercentage = true, double durationDamage = 100, double durationDamagePercent = 0.02) : base(skill)
|
|
{
|
|
GamingQueue = skill.GamingQueue;
|
|
_targetCharacter = targetCharacter;
|
|
_sourceCharacter = sourceCharacter;
|
|
_durative = durative;
|
|
_duration = duration;
|
|
_durationTurn = durationTurn;
|
|
_isPercentage = isPercentage;
|
|
_durationDamage = durationDamage;
|
|
_durationDamagePercent = durationDamagePercent;
|
|
}
|
|
|
|
private double GetDamage(double hp, double elapsed)
|
|
{
|
|
if (hp <= 0)
|
|
{
|
|
return 0;
|
|
}
|
|
double damage = _isPercentage ? hp * _durationDamagePercent : _durationDamage;
|
|
return damage * elapsed;
|
|
}
|
|
|
|
public override void OnTimeElapsed(Character character, double elapsed)
|
|
{
|
|
if (character == _targetCharacter && character.HP > 0)
|
|
{
|
|
double hp = character.HP;
|
|
double damage = GetDamage(hp, elapsed);
|
|
if (elapsed > 1)
|
|
{
|
|
damage = 0;
|
|
int loop = 0;
|
|
int elapsedSecond = (int)elapsed;
|
|
for (; loop < elapsedSecond; loop++)
|
|
{
|
|
double current = GetDamage(hp, 1);
|
|
damage += current;
|
|
hp -= current;
|
|
elapsed--;
|
|
}
|
|
if (elapsed > 0)
|
|
{
|
|
damage += GetDamage(hp, elapsed);
|
|
}
|
|
}
|
|
WriteLine($"[ {character} ] 因气绝而流失生命值!");
|
|
DamageToEnemy(Source, character, DamageType.True, MagicType, damage);
|
|
}
|
|
}
|
|
|
|
public override void OnEffectGained(Character character)
|
|
{
|
|
if (_durative && RemainDuration == 0)
|
|
{
|
|
RemainDuration = Duration;
|
|
}
|
|
else if (RemainDurationTurn == 0)
|
|
{
|
|
RemainDurationTurn = DurationTurn;
|
|
}
|
|
AddEffectTypeToCharacter(character, [EffectType.Bleed]);
|
|
AddEffectStatesToCharacter(character, [CharacterState.ActionRestricted]);
|
|
InterruptCasting(character, Source);
|
|
}
|
|
|
|
public override void OnEffectLost(Character character)
|
|
{
|
|
RemoveEffectTypesFromCharacter(character);
|
|
RemoveEffectStatesFromCharacter(character);
|
|
}
|
|
}
|
|
}
|