为技能系统添加更多功能;删除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;
bool isCheckProtected = true;
// 敌人列表
List<Character> enemys = [.. _queue.Where(c => c != character && !c.IsUnselectable)];
@ -419,7 +420,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
baseTime = character.NormalAttack.HardnessTime;
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;
_castingSkills.Add(character, skill);
baseTime = skill.CastTime;
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList())
{
effect.OnSkillCasting(character);
}
skill.OnSkillCasting(this, character);
}
else
{
if (CheckCanCast(character, skill, out double cost))
{
skill.OnSkillCasting(this, character);
character.EP = Calculation.Round2Digits(character.EP - cost);
baseTime = skill.HardnessTime;
skill.CurrentCD = Calculation.Round2Digits(Math.Max(1, skill.CD * (1 - character.CDR)));
skill.Enable = false;
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())
{
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;
WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点魔法值,释放了技能 {skill.Name}");
skill.Trigger(this, character, enemys, teammates);
skill.OnSkillCasted(this, character, enemys, teammates);
}
else
{
@ -484,7 +485,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
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)
@ -503,7 +504,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
skill.Enable = false;
WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点能量值,释放了爆发技 {skill.Name}");
skill.Trigger(this, character, enemys, teammates);
skill.OnSkillCasted(this, character, enemys, teammates);
}
else
{
@ -514,7 +515,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
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)
@ -543,7 +544,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
newHardnessTime = Math.Max(0, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient)));
WriteLine("[ " + character + " ] 进行吟唱,持续时间: " + newHardnessTime);
}
AddCharacter(character, newHardnessTime);
AddCharacter(character, newHardnessTime, isCheckProtected);
// 有人想要插队吗?
WillPreCastSuperSkill(character);
@ -616,19 +617,19 @@ namespace Milimoe.FunGame.Core.Api.Utility
{
character.HP = Calculation.Round2Digits(character.HP + reallyReHP);
character.MP = Calculation.Round2Digits(character.MP + reallyReMP);
WriteLine("角色 " + character.Name + " 回血:" + recoveryHP + " / " + "回蓝:" + recoveryMP);
WriteLine("角色 " + character.NickName + " 回血:" + recoveryHP + " / " + "回蓝:" + recoveryMP);
}
else
{
if (reallyReHP > 0)
{
character.HP = Calculation.Round2Digits(character.HP + reallyReHP);
WriteLine("角色 " + character.Name + " 回血:" + recoveryHP);
WriteLine("角色 " + character.NickName + " 回血:" + recoveryHP);
}
if (reallyReMP > 0)
{
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>
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())
{
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 (isMagicDamage)
@ -728,7 +734,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
{
effect.AfterDamageCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult);
}
if (enemy.HP <= 0)
if (enemy.HP <= 0 && !_eliminated.Contains(enemy))
{
DeathCalculation(actor, enemy);
// 给所有角色的特效广播角色死亡结算
@ -766,6 +772,17 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// <returns></returns>
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())
{
effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, false, MagicType.None);
@ -782,7 +799,10 @@ namespace Milimoe.FunGame.Core.Api.Utility
bool isAlterEvaded = false;
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)
{
@ -830,6 +850,16 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// <returns></returns>
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())
{
effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, true, magicType);
@ -846,7 +876,10 @@ namespace Milimoe.FunGame.Core.Api.Utility
bool isAlterEvaded = false;
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)
{
@ -1068,10 +1101,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
_hardnessTimes[c] = Calculation.Round2Digits(_hardnessTimes[c] + 0.01);
}
}
foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList())
{
effect.OnSkillCasting(character);
}
skill.OnSkillCasting(this, other);
}
}
}
@ -1097,7 +1127,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
WriteLine($"[ {caster} ] 的施法被 [ {interrupter} ] 打断了!!");
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 ItemFactory ItemFactory = new();
private readonly static RoomFactory RoomFactory = new();
private readonly static SkillFactory SkillFactory = new();
private readonly static UserFactory UserFactory = new();
/// <summary>
@ -137,15 +136,6 @@ namespace Milimoe.FunGame.Core.Api.Utility
return RoomFactory.Create();
}
/// <summary>
/// 获取技能实例
/// </summary>
/// <returns></returns>
public static Skill GetSkill()
{
return SkillFactory.Create();
}
/// <summary>
/// 获取用户实例
/// </summary>

View File

@ -547,17 +547,17 @@ namespace Milimoe.FunGame.Core.Entity
/// <summary>
/// 力量 = 基础力量 + 额外力量
/// </summary>
public double STR => BaseSTR + ExSTR;
public double STR => Calculation.Round2Digits(BaseSTR + ExSTR);
/// <summary>
/// 敏捷 = 基础敏捷 + 额外敏捷
/// </summary>
public double AGI => BaseAGI + ExAGI;
public double AGI => Calculation.Round2Digits(BaseAGI + ExAGI);
/// <summary>
/// 智力 = 基础智力 + 额外智力
/// </summary>
public double INT => BaseINT + ExINT;
public double INT => Calculation.Round2Digits(BaseINT + ExINT);
/// <summary>
/// 力量成长值(+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();
}

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>
@ -134,7 +147,7 @@ namespace Milimoe.FunGame.Core.Entity
}
/// <summary>
/// 在伤害计算完成后修改实际伤害
/// 在伤害计算完成后修改实际伤害 [ 允许取消伤害 ]
/// </summary>
/// <param name="character"></param>
/// <param name="enemy"></param>
@ -143,9 +156,10 @@ namespace Milimoe.FunGame.Core.Entity
/// <param name="isMagicDamage"></param>
/// <param name="magicType"></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>
@ -153,7 +167,8 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary>
/// <param name="character"></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>
/// <param name="character"></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>
/// <param name="caster"></param>
/// <param name="skill"></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;
}
internal Skill()
{
SkillType = SkillType.Passive;
}
/// <summary>
/// 触发技能升级
/// </summary>
@ -158,6 +153,7 @@ namespace Milimoe.FunGame.Core.Entity
{
foreach (Effect e in AddInactiveEffectToCharacter())
{
e.ActionQueue = ActionQueue;
if (Character != null && !Character.Effects.Contains(e))
{
Character.Effects.Add(e);
@ -177,10 +173,23 @@ namespace Milimoe.FunGame.Core.Entity
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>
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;
foreach (Effect e in Effects)

View File

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