mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-22 03:59:35 +08:00
为技能系统添加更多功能;删除SkillFactory
This commit is contained in:
parent
780979fa5b
commit
42e5042154
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user