FunGame-Core/Entity/Character/AssistDetail.cs
milimoe 769d0e4281
添加免疫、驱散;顺序表、爆发技、助攻修改 (#129)
* 特效底层支持直接修改硬直时间;添加驱散类型

* 添加 debuff

* 明确了驱散定义;添加助攻窗口期;修改预释放爆发技为不可驱散;预释放爆发技一定是最先行动;修复复活时导致硬直时间变成负数的问题

* 调整驱散描述

* 实现驱散系统;修复角色百分比公式错误;添加非伤害类助攻;添加辅助数据统计;修改一些文本显示

* 添加免疫、吸血、护盾机制

* 继续完善免疫和驱散、护盾和特效钩子等

* 添加新特效类型
2025-04-26 03:07:10 +08:00

105 lines
3.2 KiB
C#

using Milimoe.FunGame.Core.Api.Utility;
namespace Milimoe.FunGame.Core.Entity
{
/// <summary>
/// 用于记录对哪个角色造成了多少伤害
/// </summary>
public class AssistDetail
{
/// <summary>
/// 此详情类属于哪个角色
/// </summary>
public Character Character { get; }
/// <summary>
/// 对敌人造成的伤害
/// </summary>
public Dictionary<Character, double> Damages { get; } = [];
/// <summary>
/// 最后一次造成伤害的时间
/// </summary>
public Dictionary<Character, double> DamageLastTime { get; } = [];
/// <summary>
/// 对某角色最后一次友方非伤害辅助的时间
/// </summary>
public Dictionary<Character, double> NotDamageAssistLastTime { get; } = [];
/// <summary>
/// 初始化一个助攻详情类
/// </summary>
/// <param name="character"></param>
/// <param name="enemys"></param>
public AssistDetail(Character character, IEnumerable<Character> enemys)
{
Character = character;
foreach (Character enemy in enemys)
{
this[enemy] = 0;
}
}
/// <summary>
/// 获取和设置对 <paramref name="enemy"/> 的伤害,并设置时间
/// </summary>
/// <param name="enemy"></param>
/// <param name="time"></param>
/// <returns></returns>
public double this[Character enemy, double? time = null]
{
get
{
return Damages[enemy];
}
set
{
Damages[enemy] = Calculation.Round2Digits(value);
if (time.HasValue)
{
DamageLastTime[enemy] = time.Value;
}
}
}
/// <summary>
/// 获取对 <paramref name="enemy"/> 的伤害
/// </summary>
/// <param name="enemy"></param>
/// <returns>目标的 <see cref="Character.MaxHP"/> 的百分比形式</returns>
public double GetPercentage(Character enemy)
{
return Calculation.Round2Digits(Damages[enemy] / enemy.MaxHP);
}
/// <summary>
/// 获取对 <paramref name="enemy"/> 造成伤害的最后时间
/// </summary>
/// <param name="enemy"></param>
/// <returns>-1 意味着没有时间</returns>
public double GetLastTime(Character enemy)
{
if (DamageLastTime.TryGetValue(enemy, out double time))
{
return time;
}
return -1;
}
/// <summary>
/// 获取对某角色友方非伤害辅助的最后时间
/// </summary>
/// <param name="character"></param>
/// <returns>-1 意味着没有时间</returns>
public double GetNotDamageAssistLastTime(Character character)
{
if (NotDamageAssistLastTime.TryGetValue(character, out double time))
{
return time;
}
return -1;
}
}
}