diff --git a/Entity/Skill/NormalAttack.cs b/Entity/Skill/NormalAttack.cs index 0582aaa..de66fae 100644 --- a/Entity/Skill/NormalAttack.cs +++ b/Entity/Skill/NormalAttack.cs @@ -194,9 +194,9 @@ namespace Milimoe.FunGame.Core.Entity public int CanSelectTargetCount { get; set; } = 1; /// - /// 可选取的作用范围 + /// 可选取的作用范围 [ 单位:格 ] /// - public double CanSelectTargetRange { get; set; } = 0; + public int CanSelectTargetRange { get; set; } = 0; /// /// 普通攻击没有魔法消耗 diff --git a/Entity/Skill/Skill.cs b/Entity/Skill/Skill.cs index 61dde4f..f4bfe72 100644 --- a/Entity/Skill/Skill.cs +++ b/Entity/Skill/Skill.cs @@ -68,7 +68,6 @@ namespace Milimoe.FunGame.Core.Entity /// /// 是否是主动技能 [ 此项为高优先级 ] /// - [InitRequired] public bool IsActive => SkillType != SkillType.Passive; /// @@ -84,15 +83,19 @@ namespace Milimoe.FunGame.Core.Entity /// /// 是否是爆发技 [ 此项为高优先级 ] /// - [InitRequired] public bool IsSuperSkill => SkillType == SkillType.SuperSkill; /// /// 是否属于魔法 [ 必须为 true ],反之为战技 /// - [InitRequired] public bool IsMagic => SkillType == SkillType.Magic; + /// + /// 施法距离 [ 单位:格 ] + /// + [InitOptional] + public int CastRange { get; set; } = 5; + /// /// 可选取自身 /// @@ -124,9 +127,9 @@ namespace Milimoe.FunGame.Core.Entity public virtual int CanSelectTargetCount { get; set; } = 1; /// - /// 可选取的作用范围 + /// 可选取的作用范围 [ 单位:格 ] /// - public virtual double CanSelectTargetRange { get; set; } = 0; + public virtual int CanSelectTargetRange { get; set; } = 0; /// /// 选取角色的条件 diff --git a/Interface/Base/IGamingQueue.cs b/Interface/Base/IGamingQueue.cs index 925296f..3c6d468 100644 --- a/Interface/Base/IGamingQueue.cs +++ b/Interface/Base/IGamingQueue.cs @@ -1,4 +1,5 @@ using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; @@ -60,6 +61,11 @@ namespace Milimoe.FunGame.Core.Interface.Base /// public int TotalRound { get; } + /// + /// 使用的地图 + /// + public GameMap? Map { get; } + /// /// 显示队列信息 /// diff --git a/Interface/Entity/Typical/ISkill.cs b/Interface/Entity/Typical/ISkill.cs index 43d4fe1..15e3008 100644 --- a/Interface/Entity/Typical/ISkill.cs +++ b/Interface/Entity/Typical/ISkill.cs @@ -1,4 +1,5 @@ -using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; namespace Milimoe.FunGame.Core.Interface.Entity { @@ -57,9 +58,9 @@ namespace Milimoe.FunGame.Core.Interface.Entity public int CanSelectTargetCount { get; } /// - /// 可选取的作用范围 + /// 可选取的作用范围 [ 单位:格 ] /// - public double CanSelectTargetRange { get; } + public int CanSelectTargetRange { get; } /// /// 实际魔法消耗 [ 魔法 ] diff --git a/Library/Common/JsonConverter/SkillConverter.cs b/Library/Common/JsonConverter/SkillConverter.cs index f1f1ae2..d7b3d26 100644 --- a/Library/Common/JsonConverter/SkillConverter.cs +++ b/Library/Common/JsonConverter/SkillConverter.cs @@ -41,6 +41,9 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case nameof(Skill.Level): result.Level = reader.GetInt32(); break; + case nameof(Skill.CastRange): + result.CastRange = reader.GetInt32(); + break; case nameof(Skill.CanSelectSelf): result.CanSelectSelf = reader.GetBoolean(); break; @@ -125,6 +128,7 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter if (value.GeneralDescription.Length > 0) writer.WriteString(nameof(Skill.GeneralDescription), value.GeneralDescription); if (value.Slogan.Length > 0) writer.WriteString(nameof(Skill.Slogan), value.Slogan); if (value.Level > 0) writer.WriteNumber(nameof(Skill.Level), value.Level); + writer.WriteNumber(nameof(Skill.CastRange), value.CastRange); if (value.CanSelectSelf) writer.WriteBoolean(nameof(Skill.CanSelectSelf), value.CanSelectSelf); if (!value.CanSelectEnemy) writer.WriteBoolean(nameof(Skill.CanSelectEnemy), value.CanSelectEnemy); if (value.CanSelectTeammate) writer.WriteBoolean(nameof(Skill.CanSelectTeammate), value.CanSelectTeammate); diff --git a/Library/Constant/TypeEnum.cs b/Library/Constant/TypeEnum.cs index 41720af..8db44a1 100644 --- a/Library/Constant/TypeEnum.cs +++ b/Library/Constant/TypeEnum.cs @@ -740,6 +740,7 @@ namespace Milimoe.FunGame.Core.Library.Constant public enum CharacterActionType { None, + Move, NormalAttack, PreCastSkill, CastSkill, diff --git a/Model/GamingQueue.cs b/Model/GamingQueue.cs index 27ac7c0..bee9a44 100644 --- a/Model/GamingQueue.cs +++ b/Model/GamingQueue.cs @@ -2,6 +2,7 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Interface.Entity; +using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Model @@ -122,6 +123,11 @@ namespace Milimoe.FunGame.Core.Model /// public Dictionary EarnedMoney => _earnedMoney; + /// + /// 使用的地图 + /// + public GameMap? Map => _map; + #endregion #region 保护变量 @@ -241,6 +247,11 @@ namespace Milimoe.FunGame.Core.Model /// protected bool _isInRound = false; + /// + /// 使用的地图 + /// + protected GameMap? _map = null; + #endregion #region 构造函数 @@ -249,13 +260,18 @@ namespace Milimoe.FunGame.Core.Model /// 新建一个基础回合制游戏队列 /// /// 用于文本输出 - public GamingQueue(Action? writer = null) + /// 游戏地图 + public GamingQueue(Action? writer = null, GameMap? map = null) { if (writer != null) { WriteLine = writer; } WriteLine ??= new Action(Console.WriteLine); + if (map != null) + { + LoadGameMap(map); + } } /// @@ -263,18 +279,36 @@ namespace Milimoe.FunGame.Core.Model /// /// 参与本次游戏的角色列表 /// 用于文本输出 - public GamingQueue(List characters, Action? writer = null) + /// 游戏地图 + public GamingQueue(List characters, Action? writer = null, GameMap? map = null) { if (writer != null) { WriteLine = writer; } WriteLine ??= new Action(Console.WriteLine); + if (map != null) + { + LoadGameMap(map); + } InitCharacters(characters); } #endregion + #region 战棋地图(#TODO) + + /// + /// 加载地图 + /// + /// + public void LoadGameMap(GameMap map) + { + _map = map; + } + + #endregion + #region 队列框架 /// @@ -800,6 +834,10 @@ namespace Milimoe.FunGame.Core.Model effect.AlterSelectListBeforeAction(character, enemys, teammates, skills, continuousKillingTemp, earnedMoneyTemp); } + // 这里筛掉重复角色 + enemys = [.. enemys.Distinct()]; + teammates = [.. teammates.Distinct()]; + // 作出了什么行动 CharacterActionType type = CharacterActionType.None; @@ -1209,6 +1247,13 @@ namespace Milimoe.FunGame.Core.Model WriteLine($"[ {character} ] 结束了回合!"); await OnCharacterDoNothingAsync(character); } + else if (type == CharacterActionType.Move) + { + baseTime = 3; + decided = true; + WriteLine($"[ {character} ] 进行了移动,并结束了回合!"); + await OnCharacterMoveAsync(character); + } else { decided = true; @@ -3498,6 +3543,21 @@ namespace Milimoe.FunGame.Core.Model await (CharacterGiveUp?.Invoke(this, actor) ?? Task.CompletedTask); } + public delegate Task CharacterMoveEventHandler(GamingQueue queue, Character actor); + /// + /// 角色移动事件 + /// + public event CharacterMoveEventHandler? CharacterMove; + /// + /// 角色移动事件 + /// + /// + /// + protected async Task OnCharacterMoveAsync(Character actor) + { + await (CharacterMove?.Invoke(this, actor) ?? Task.CompletedTask); + } + public delegate Task GameEndEventHandler(GamingQueue queue, Character winner); /// /// 游戏结束事件