为技能系统添加更多功能;删除SkillFactory

This commit is contained in:
milimoe 2024-09-11 21:59:26 +08:00
parent 780979fa5b
commit 42e5042154
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
7 changed files with 106 additions and 69 deletions

View File

@ -1,15 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Interface.Base;
namespace Milimoe.FunGame.Core.Api.Factory
{
internal class SkillFactory : IFactory<Skill>
{
public Type EntityType => typeof(Skill);
public Skill Create()
{
return new();
}
}
}

View File

@ -296,6 +296,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
// 基础硬直时间 // 基础硬直时间
double baseTime = 10; double baseTime = 10;
bool isCheckProtected = true;
// 敌人列表 // 敌人列表
List<Character> enemys = [.. _queue.Where(c => c != character && !c.IsUnselectable)]; List<Character> enemys = [.. _queue.Where(c => c != character && !c.IsUnselectable)];
@ -419,7 +420,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
baseTime = character.NormalAttack.HardnessTime; baseTime = character.NormalAttack.HardnessTime;
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList())
{ {
effect.AlterHardnessTimeAfterNormalAttack(character, ref baseTime); effect.AlterHardnessTimeAfterNormalAttack(character, ref baseTime, ref isCheckProtected);
} }
} }
} }
@ -434,25 +435,25 @@ namespace Milimoe.FunGame.Core.Api.Utility
character.CharacterState = CharacterState.Casting; character.CharacterState = CharacterState.Casting;
_castingSkills.Add(character, skill); _castingSkills.Add(character, skill);
baseTime = skill.CastTime; baseTime = skill.CastTime;
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) skill.OnSkillCasting(this, character);
{
effect.OnSkillCasting(character);
}
} }
else else
{ {
if (CheckCanCast(character, skill, out double cost)) if (CheckCanCast(character, skill, out double cost))
{ {
skill.OnSkillCasting(this, character);
character.EP = Calculation.Round2Digits(character.EP - cost); character.EP = Calculation.Round2Digits(character.EP - cost);
baseTime = skill.HardnessTime; baseTime = skill.HardnessTime;
skill.CurrentCD = Calculation.Round2Digits(Math.Max(1, skill.CD * (1 - character.CDR))); skill.CurrentCD = Calculation.Round2Digits(Math.Max(1, skill.CD * (1 - character.CDR)));
skill.Enable = false; skill.Enable = false;
WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点能量,释放了{(skill.IsSuperSkill ? "" : "")} {skill.Name}"); WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点能量,释放了{(skill.IsSuperSkill ? "" : "")} {skill.Name}");
skill.Trigger(this, character, enemys, teammates); skill.OnSkillCasted(this, character, enemys, teammates);
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList())
{ {
effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime); effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime, ref isCheckProtected);
} }
} }
} }
@ -473,7 +474,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
skill.Enable = false; skill.Enable = false;
WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点魔法值,释放了技能 {skill.Name}"); WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点魔法值,释放了技能 {skill.Name}");
skill.Trigger(this, character, enemys, teammates); skill.OnSkillCasted(this, character, enemys, teammates);
} }
else else
{ {
@ -484,7 +485,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList())
{ {
effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime); effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime, ref isCheckProtected);
} }
} }
else if (type == CharacterActionType.CastSuperSkill) else if (type == CharacterActionType.CastSuperSkill)
@ -503,7 +504,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
skill.Enable = false; skill.Enable = false;
WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点能量值,释放了爆发技 {skill.Name}"); WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点能量值,释放了爆发技 {skill.Name}");
skill.Trigger(this, character, enemys, teammates); skill.OnSkillCasted(this, character, enemys, teammates);
} }
else else
{ {
@ -514,7 +515,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList())
{ {
effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime); effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime, ref isCheckProtected);
} }
} }
else if (type == CharacterActionType.UseItem) else if (type == CharacterActionType.UseItem)
@ -543,7 +544,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
newHardnessTime = Math.Max(0, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient))); newHardnessTime = Math.Max(0, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient)));
WriteLine("[ " + character + " ] 进行吟唱,持续时间: " + newHardnessTime); WriteLine("[ " + character + " ] 进行吟唱,持续时间: " + newHardnessTime);
} }
AddCharacter(character, newHardnessTime); AddCharacter(character, newHardnessTime, isCheckProtected);
// 有人想要插队吗? // 有人想要插队吗?
WillPreCastSuperSkill(character); WillPreCastSuperSkill(character);
@ -616,19 +617,19 @@ namespace Milimoe.FunGame.Core.Api.Utility
{ {
character.HP = Calculation.Round2Digits(character.HP + reallyReHP); character.HP = Calculation.Round2Digits(character.HP + reallyReHP);
character.MP = Calculation.Round2Digits(character.MP + reallyReMP); character.MP = Calculation.Round2Digits(character.MP + reallyReMP);
WriteLine("角色 " + character.Name + " 回血:" + recoveryHP + " / " + "回蓝:" + recoveryMP); WriteLine("角色 " + character.NickName + " 回血:" + recoveryHP + " / " + "回蓝:" + recoveryMP);
} }
else else
{ {
if (reallyReHP > 0) if (reallyReHP > 0)
{ {
character.HP = Calculation.Round2Digits(character.HP + reallyReHP); character.HP = Calculation.Round2Digits(character.HP + reallyReHP);
WriteLine("角色 " + character.Name + " 回血:" + recoveryHP); WriteLine("角色 " + character.NickName + " 回血:" + recoveryHP);
} }
if (reallyReMP > 0) if (reallyReMP > 0)
{ {
character.MP = Calculation.Round2Digits(character.MP + reallyReMP); character.MP = Calculation.Round2Digits(character.MP + reallyReMP);
WriteLine("角色 " + character.Name + " 回蓝:" + recoveryMP); WriteLine("角色 " + character.NickName + " 回蓝:" + recoveryMP);
} }
} }
@ -689,13 +690,18 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// <param name="damageResult"></param> /// <param name="damageResult"></param>
public void DamageToEnemy(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal) public void DamageToEnemy(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal)
{ {
bool isEvaded = damageResult == DamageResult.Evaded;
foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList())
{ {
effect.AlterActualDamageAfterCalculation(actor, enemy, ref damage, isNormalAttack, isMagicDamage, magicType, damageResult); if (effect.AlterActualDamageAfterCalculation(actor, enemy, ref damage, isNormalAttack, isMagicDamage, magicType, damageResult))
{
isEvaded = true;
damageResult = DamageResult.Evaded;
}
} }
// 闪避了就没伤害了 // 闪避了就没伤害了
if (damageResult != DamageResult.Evaded) if (!isEvaded)
{ {
if (damage < 0) damage = 0; if (damage < 0) damage = 0;
if (isMagicDamage) if (isMagicDamage)
@ -728,7 +734,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
{ {
effect.AfterDamageCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult); effect.AfterDamageCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult);
} }
if (enemy.HP <= 0) if (enemy.HP <= 0 && !_eliminated.Contains(enemy))
{ {
DeathCalculation(actor, enemy); DeathCalculation(actor, enemy);
// 给所有角色的特效广播角色死亡结算 // 给所有角色的特效广播角色死亡结算
@ -766,6 +772,17 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// <returns></returns> /// <returns></returns>
public DamageResult CalculatePhysicalDamage(Character actor, Character enemy, bool isNormalAttack, double expectedDamage, out double finalDamage) public DamageResult CalculatePhysicalDamage(Character actor, Character enemy, bool isNormalAttack, double expectedDamage, out double finalDamage)
{ {
bool isMagic = false;
MagicType magicType = MagicType.None;
foreach(Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList())
{
effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref isMagic, ref magicType);
}
if (isMagic)
{
return CalculateMagicalDamage(actor, enemy, isNormalAttack, magicType, expectedDamage, out finalDamage);
}
foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList())
{ {
effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, false, MagicType.None); effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, false, MagicType.None);
@ -782,7 +799,10 @@ namespace Milimoe.FunGame.Core.Api.Utility
bool isAlterEvaded = false; bool isAlterEvaded = false;
foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList())) foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList()))
{ {
isAlterEvaded = effect.OnEvadedTriggered(actor, enemy, dice); if (effect.OnEvadedTriggered(actor, enemy, dice))
{
isAlterEvaded = true;
}
} }
if (!isAlterEvaded) if (!isAlterEvaded)
{ {
@ -830,6 +850,16 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// <returns></returns> /// <returns></returns>
public DamageResult CalculateMagicalDamage(Character actor, Character enemy, bool isNormalAttack, MagicType magicType, double expectedDamage, out double finalDamage) public DamageResult CalculateMagicalDamage(Character actor, Character enemy, bool isNormalAttack, MagicType magicType, double expectedDamage, out double finalDamage)
{ {
bool isMagic = true;
foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList())
{
effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref isMagic, ref magicType);
}
if (!isMagic)
{
return CalculatePhysicalDamage(actor, enemy, isNormalAttack, expectedDamage, out finalDamage);
}
foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList())
{ {
effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, true, magicType); effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, true, magicType);
@ -846,7 +876,10 @@ namespace Milimoe.FunGame.Core.Api.Utility
bool isAlterEvaded = false; bool isAlterEvaded = false;
foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList())) foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList()))
{ {
isAlterEvaded = effect.OnEvadedTriggered(actor, enemy, dice); if (effect.OnEvadedTriggered(actor, enemy, dice))
{
isAlterEvaded = true;
}
} }
if (!isAlterEvaded) if (!isAlterEvaded)
{ {
@ -1068,10 +1101,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
_hardnessTimes[c] = Calculation.Round2Digits(_hardnessTimes[c] + 0.01); _hardnessTimes[c] = Calculation.Round2Digits(_hardnessTimes[c] + 0.01);
} }
} }
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) skill.OnSkillCasting(this, other);
{
effect.OnSkillCasting(character);
}
} }
} }
} }
@ -1097,7 +1127,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
WriteLine($"[ {caster} ] 的施法被 [ {interrupter} ] 打断了!!"); WriteLine($"[ {caster} ] 的施法被 [ {interrupter} ] 打断了!!");
foreach (Effect e in cast.Effects.Where(e => e.Level > 0).ToList()) foreach (Effect e in cast.Effects.Where(e => e.Level > 0).ToList())
{ {
e.OnSkillCastInterrupted(caster, interrupter); e.OnSkillCastInterrupted(caster, cast, interrupter);
} }
} }
} }

View File

@ -12,7 +12,6 @@ namespace Milimoe.FunGame.Core.Api.Utility
private readonly static InventoryFactory InventoryFactory = new(); private readonly static InventoryFactory InventoryFactory = new();
private readonly static ItemFactory ItemFactory = new(); private readonly static ItemFactory ItemFactory = new();
private readonly static RoomFactory RoomFactory = new(); private readonly static RoomFactory RoomFactory = new();
private readonly static SkillFactory SkillFactory = new();
private readonly static UserFactory UserFactory = new(); private readonly static UserFactory UserFactory = new();
/// <summary> /// <summary>
@ -137,15 +136,6 @@ namespace Milimoe.FunGame.Core.Api.Utility
return RoomFactory.Create(); return RoomFactory.Create();
} }
/// <summary>
/// 获取技能实例
/// </summary>
/// <returns></returns>
public static Skill GetSkill()
{
return SkillFactory.Create();
}
/// <summary> /// <summary>
/// 获取用户实例 /// 获取用户实例
/// </summary> /// </summary>

View File

@ -547,17 +547,17 @@ namespace Milimoe.FunGame.Core.Entity
/// <summary> /// <summary>
/// 力量 = 基础力量 + 额外力量 /// 力量 = 基础力量 + 额外力量
/// </summary> /// </summary>
public double STR => BaseSTR + ExSTR; public double STR => Calculation.Round2Digits(BaseSTR + ExSTR);
/// <summary> /// <summary>
/// 敏捷 = 基础敏捷 + 额外敏捷 /// 敏捷 = 基础敏捷 + 额外敏捷
/// </summary> /// </summary>
public double AGI => BaseAGI + ExAGI; public double AGI => Calculation.Round2Digits(BaseAGI + ExAGI);
/// <summary> /// <summary>
/// 智力 = 基础智力 + 额外智力 /// 智力 = 基础智力 + 额外智力
/// </summary> /// </summary>
public double INT => BaseINT + ExINT; public double INT => Calculation.Round2Digits(BaseINT + ExINT);
/// <summary> /// <summary>
/// 力量成长值(+BaseSTR/Lv) /// 力量成长值(+BaseSTR/Lv)
@ -941,6 +941,15 @@ namespace Milimoe.FunGame.Core.Entity
} }
} }
if (Effects.Count > 0)
{
builder.AppendLine("== 状态栏 ==");
foreach (Effect effect in Effects)
{
builder.Append(effect.ToString());
}
}
return builder.ToString(); return builder.ToString();
} }

View File

@ -119,6 +119,19 @@ namespace Milimoe.FunGame.Core.Entity
} }
/// <summary>
/// 在伤害计算前修改伤害类型
/// </summary>
/// <param name="character"></param>
/// <param name="enemy"></param>
/// <param name="isNormalAttack"></param>
/// <param name="isMagicDamage"></param>
/// <param name="magicType"></param>
public virtual void AlterDamageTypeBeforeCalculation(Character character, Character enemy, ref bool isNormalAttack, ref bool isMagicDamage, ref MagicType magicType)
{
}
/// <summary> /// <summary>
/// 在伤害计算前修改预期伤害 /// 在伤害计算前修改预期伤害
/// </summary> /// </summary>
@ -134,7 +147,7 @@ namespace Milimoe.FunGame.Core.Entity
} }
/// <summary> /// <summary>
/// 在伤害计算完成后修改实际伤害 /// 在伤害计算完成后修改实际伤害 [ 允许取消伤害 ]
/// </summary> /// </summary>
/// <param name="character"></param> /// <param name="character"></param>
/// <param name="enemy"></param> /// <param name="enemy"></param>
@ -143,9 +156,10 @@ namespace Milimoe.FunGame.Core.Entity
/// <param name="isMagicDamage"></param> /// <param name="isMagicDamage"></param>
/// <param name="magicType"></param> /// <param name="magicType"></param>
/// <param name="damageResult"></param> /// <param name="damageResult"></param>
public virtual void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) /// <returns>返回 true 表示取消此伤害,等同于闪避</returns>
public virtual bool AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{ {
return false;
} }
/// <summary> /// <summary>
@ -153,7 +167,8 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary> /// </summary>
/// <param name="character"></param> /// <param name="character"></param>
/// <param name="baseHardnessTime"></param> /// <param name="baseHardnessTime"></param>
public virtual void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime) /// <param name="isCheckProtected"></param>
public virtual void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime, ref bool isCheckProtected)
{ {
} }
@ -163,7 +178,8 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary> /// </summary>
/// <param name="character"></param> /// <param name="character"></param>
/// <param name="baseHardnessTime"></param> /// <param name="baseHardnessTime"></param>
public virtual void AlterHardnessTimeAfterCastSkill(Character character, ref double baseHardnessTime) /// <param name="isCheckProtected"></param>
public virtual void AlterHardnessTimeAfterCastSkill(Character character, ref double baseHardnessTime, ref bool isCheckProtected)
{ {
} }
@ -201,8 +217,9 @@ namespace Milimoe.FunGame.Core.Entity
/// 技能吟唱被打断时 /// 技能吟唱被打断时
/// </summary> /// </summary>
/// <param name="caster"></param> /// <param name="caster"></param>
/// <param name="skill"></param>
/// <param name="interrupter"></param> /// <param name="interrupter"></param>
public virtual void OnSkillCastInterrupted(Character caster, Character interrupter) public virtual void OnSkillCastInterrupted(Character caster, Skill skill, Character interrupter)
{ {
} }

View File

@ -144,11 +144,6 @@ namespace Milimoe.FunGame.Core.Entity
Character = character; Character = character;
} }
internal Skill()
{
SkillType = SkillType.Passive;
}
/// <summary> /// <summary>
/// 触发技能升级 /// 触发技能升级
/// </summary> /// </summary>
@ -158,6 +153,7 @@ namespace Milimoe.FunGame.Core.Entity
{ {
foreach (Effect e in AddInactiveEffectToCharacter()) foreach (Effect e in AddInactiveEffectToCharacter())
{ {
e.ActionQueue = ActionQueue;
if (Character != null && !Character.Effects.Contains(e)) if (Character != null && !Character.Effects.Contains(e))
{ {
Character.Effects.Add(e); Character.Effects.Add(e);
@ -177,10 +173,23 @@ namespace Milimoe.FunGame.Core.Entity
OnLevelUp(); OnLevelUp();
} }
/// <summary>
/// 技能开始吟唱时 [ 吟唱魔法、释放战技和爆发技、预释放爆发技均可触发 ]
/// </summary>
public void OnSkillCasting(ActionQueue queue, Character actor)
{
ActionQueue = queue;
foreach (Effect e in Effects)
{
e.ActionQueue = ActionQueue;
e.OnSkillCasting(actor);
}
}
/// <summary> /// <summary>
/// 触发技能效果 /// 触发技能效果
/// </summary> /// </summary>
public void Trigger(ActionQueue queue, Character actor, List<Character> enemys, List<Character> teammates) public void OnSkillCasted(ActionQueue queue, Character actor, List<Character> enemys, List<Character> teammates)
{ {
ActionQueue = queue; ActionQueue = queue;
foreach (Effect e in Effects) foreach (Effect e in Effects)

View File

@ -332,10 +332,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
get get
{ {
List<Skill> list = []; List<Skill> list = [];
Skill s = Factory.GetSkill(); // 技能应该在GameModule中新建类继承Skill实现再自行构造。
s.Name = "Example Skill";
s.Description = "技能应该在GameModule中继承实现再自行构造。";
list.Add(s);
return list; return list;
} }
} }