mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-21 19:49:34 +08:00
381 lines
10 KiB
C#
381 lines
10 KiB
C#
using Milimoe.FunGame.Core.Api.Utility;
|
|
using Milimoe.FunGame.Core.Interface.Entity;
|
|
using Milimoe.FunGame.Core.Library.Constant;
|
|
|
|
namespace Milimoe.FunGame.Core.Entity
|
|
{
|
|
public class Character : BaseEntity, ICopyable<Character>
|
|
{
|
|
/// <summary>
|
|
/// 角色的姓
|
|
/// </summary>
|
|
public override string Name { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// 角色的名字
|
|
/// </summary>
|
|
public string FirstName { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// 角色的昵称
|
|
/// </summary>
|
|
public string NickName { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// 角色所属的玩家
|
|
/// </summary>
|
|
public User? User { get; set; } = null;
|
|
|
|
/// <summary>
|
|
/// 角色统计数据
|
|
/// </summary>
|
|
public CharacterStatistics? Statistics { get; set; } = null;
|
|
|
|
/// <summary>
|
|
/// 魔法属性
|
|
/// </summary>
|
|
public MagicType MagicType { get; set; } = MagicType.Particle;
|
|
|
|
/// <summary>
|
|
/// 角色定位1
|
|
/// </summary>
|
|
public RoleType FirstRoleType { get; set; } = RoleType.Core;
|
|
|
|
/// <summary>
|
|
/// 角色定位2
|
|
/// </summary>
|
|
public RoleType SecondRoleType { get; set; } = RoleType.Guardian;
|
|
|
|
/// <summary>
|
|
/// 角色定位3
|
|
/// </summary>
|
|
public RoleType ThirdRoleType { get; set; } = RoleType.Vanguard;
|
|
|
|
/// <summary>
|
|
/// 角色评级
|
|
/// </summary>
|
|
public RoleRating RoleRating { get; set; } = RoleRating.E;
|
|
|
|
/// <summary>
|
|
/// 晋升点数
|
|
/// </summary>
|
|
public int Promotion { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 等级
|
|
/// </summary>
|
|
public int Level { get; set; } = 1;
|
|
|
|
/// <summary>
|
|
/// 经验值
|
|
/// </summary>
|
|
public double EXP { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 基础生命值
|
|
/// </summary>
|
|
public double BaseHP { get; set; } = 1;
|
|
|
|
/// <summary>
|
|
/// 生命值
|
|
/// </summary>
|
|
public double HP { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 基础魔法值
|
|
/// </summary>
|
|
public double BaseMP { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 魔法值
|
|
/// </summary>
|
|
public double MP { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 爆发能量
|
|
/// </summary>
|
|
public double EP { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 基础攻击力
|
|
/// </summary>
|
|
public double BaseATK { get; set; } = 1;
|
|
|
|
/// <summary>
|
|
/// 攻击力
|
|
/// </summary>
|
|
public double ATK { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 基础物理护甲
|
|
/// </summary>
|
|
public double BaseDEF { get; set; } = 5;
|
|
|
|
/// <summary>
|
|
/// 物理护甲
|
|
/// </summary>
|
|
public double DEF { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 物理伤害减免(%)
|
|
/// </summary>
|
|
public double PDR
|
|
{
|
|
get
|
|
{
|
|
double value = Math.Round((BaseDEF + DEF) / BaseDEF + DEF + 300, 4, MidpointRounding.AwayFromZero) + ExPDR;
|
|
return value > 1 ? 1 : value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 额外物理伤害减免(%)
|
|
/// </summary>
|
|
public double ExPDR { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 魔法抗性(%)
|
|
/// </summary>
|
|
public double MDF { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 物理穿透(%)
|
|
/// </summary>
|
|
public double PhysicalPenetration { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 魔法穿透(%)
|
|
/// </summary>
|
|
public double MagicalPenetration { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 生命回复力
|
|
/// </summary>
|
|
public double HR { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 魔法回复力
|
|
/// </summary>
|
|
public double MR { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 能量回复力
|
|
/// </summary>
|
|
public double ER { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 基础力量
|
|
/// </summary>
|
|
public double BaseSTR { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 基础敏捷
|
|
/// </summary>
|
|
public double BaseAGI { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 基础智力
|
|
/// </summary>
|
|
public double BaseINT { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 力量
|
|
/// </summary>
|
|
public double STR { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 敏捷
|
|
/// </summary>
|
|
public double AGI { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 智力
|
|
/// </summary>
|
|
public double INT { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 力量成长值
|
|
/// </summary>
|
|
public double STRGrowth { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 敏捷成长值
|
|
/// </summary>
|
|
public double AGIGrowth { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 智力成长值
|
|
/// </summary>
|
|
public double INTGrowth { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 行动速度
|
|
/// </summary>
|
|
public double SPD { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 行动系数(%)
|
|
/// </summary>
|
|
public double ActionCoefficient
|
|
{
|
|
get
|
|
{
|
|
double value = Math.Round(SPD / 1500.00, 4, MidpointRounding.AwayFromZero) + ExActionCoefficient;
|
|
return value > 1 ? 1 : value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 额外行动系数(%)
|
|
/// </summary>
|
|
public double ExActionCoefficient { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 加速系数(%)
|
|
/// </summary>
|
|
public double AccelerationCoefficient { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 冷却缩减(%)
|
|
/// </summary>
|
|
public double CDR { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 攻击距离
|
|
/// </summary>
|
|
public double ATR { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// 暴击率(%)
|
|
/// </summary>
|
|
public double CritRate { get; set; } = 0.05;
|
|
|
|
/// <summary>
|
|
/// 暴击伤害(%)
|
|
/// </summary>
|
|
public double CritDMG { get; set; } = 1.25;
|
|
|
|
/// <summary>
|
|
/// 闪避率(%)
|
|
/// </summary>
|
|
public double EvadeRate { get; set; } = 0.05;
|
|
|
|
/// <summary>
|
|
/// 角色的技能组
|
|
/// </summary>
|
|
public Dictionary<string, Skill> Skills { get; set; } = [];
|
|
|
|
/// <summary>
|
|
/// 角色携带的物品
|
|
/// </summary>
|
|
public Dictionary<string, Item> Items { get; set; } = [];
|
|
|
|
protected Character()
|
|
{
|
|
|
|
}
|
|
|
|
internal static Character GetInstance()
|
|
{
|
|
return new();
|
|
}
|
|
|
|
public void Init()
|
|
{
|
|
STR = BaseSTR;
|
|
AGI = BaseAGI;
|
|
INT = BaseINT;
|
|
HP = BaseHP;
|
|
MP = BaseMP;
|
|
ATK = BaseATK;
|
|
DEF = BaseDEF;
|
|
// STR
|
|
HP = Math.Round(HP + STR * 17, 2, MidpointRounding.AwayFromZero);
|
|
HR = Math.Round(HR + STR * 0.7, 2, MidpointRounding.AwayFromZero);
|
|
DEF = Math.Round(DEF + STR * 0.75, 2, MidpointRounding.AwayFromZero);
|
|
CritDMG = Math.Round(CritDMG + STR * 0.00575, 4, MidpointRounding.AwayFromZero);
|
|
// AGI
|
|
SPD = Math.Round(SPD + AGI * 0.65, 2, MidpointRounding.AwayFromZero);
|
|
EvadeRate = Math.Round(EvadeRate + AGI * 0.0025, 4, MidpointRounding.AwayFromZero);
|
|
CritRate = Math.Round(CritRate + AGI * 0.00235, 4, MidpointRounding.AwayFromZero);
|
|
// INT
|
|
MP = Math.Round(MP + INT * 8, 2, MidpointRounding.AwayFromZero);
|
|
MR = Math.Round(MR + INT * 0.4, 2, MidpointRounding.AwayFromZero);
|
|
CDR = Math.Round(CDR + INT * 0.0025, 4, MidpointRounding.AwayFromZero);
|
|
}
|
|
|
|
public override bool Equals(IBaseEntity? other)
|
|
{
|
|
return other is Character c && c.Name == Name;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
bool isChineseName = NetworkUtility.IsChineseName(Name + FirstName);
|
|
string str = isChineseName ? (Name + FirstName).Trim() : (Name + " " + FirstName).Trim();
|
|
if (NickName != "")
|
|
{
|
|
if (str != "") str += ", ";
|
|
str += NickName;
|
|
}
|
|
if (User != null && User.Username != "")
|
|
{
|
|
str += "(" + User.Username + ")";
|
|
}
|
|
return str;
|
|
}
|
|
|
|
public Character Copy()
|
|
{
|
|
Character c = new()
|
|
{
|
|
Name = Name,
|
|
FirstName = FirstName,
|
|
NickName = NickName,
|
|
Statistics = Statistics,
|
|
MagicType = MagicType,
|
|
FirstRoleType = FirstRoleType,
|
|
SecondRoleType = SecondRoleType,
|
|
ThirdRoleType = ThirdRoleType,
|
|
RoleRating = RoleRating,
|
|
Promotion = Promotion,
|
|
Level = Level,
|
|
EXP = EXP,
|
|
BaseHP = BaseHP,
|
|
HP = HP,
|
|
BaseMP = BaseMP,
|
|
MP = MP,
|
|
EP = EP,
|
|
BaseATK = BaseATK,
|
|
ATK = ATK,
|
|
BaseDEF = BaseDEF,
|
|
DEF = DEF,
|
|
MDF = MDF,
|
|
PhysicalPenetration = PhysicalPenetration,
|
|
MagicalPenetration = MagicalPenetration,
|
|
HR = HR,
|
|
MR = MR,
|
|
ER = ER,
|
|
BaseSTR = BaseSTR,
|
|
BaseAGI = BaseAGI,
|
|
BaseINT = BaseINT,
|
|
STR = STR,
|
|
AGI = AGI,
|
|
INT = INT,
|
|
STRGrowth = STRGrowth,
|
|
AGIGrowth = AGIGrowth,
|
|
INTGrowth = INTGrowth,
|
|
SPD = SPD,
|
|
AccelerationCoefficient = AccelerationCoefficient,
|
|
ATR = ATR,
|
|
CritRate = CritRate,
|
|
CritDMG = CritDMG,
|
|
EvadeRate = EvadeRate,
|
|
Skills = Skills,
|
|
Items = Items,
|
|
};
|
|
return c;
|
|
}
|
|
}
|
|
}
|