diff --git a/Assets/ModuleCore/ModuleBattle/BattleCharacter.cs b/Assets/ModuleCore/ModuleBattle/BattleCharacter.cs index 8dec0c6..7a76e7e 100644 --- a/Assets/ModuleCore/ModuleBattle/BattleCharacter.cs +++ b/Assets/ModuleCore/ModuleBattle/BattleCharacter.cs @@ -9,24 +9,29 @@ public class BattleCharacter : DataAttribute { /// 角色数据 public readonly DataCharacter character; + /// 归属队伍 + public int team; /// 角色名字 public string name; /// 战斗等级 public int level; - /// 生命点 - public int hitPoint; - /// 护甲等级 - public int armorClass; + /// 战场位置 + public int position; /// 先攻顺序 public int sequence; + /// 护甲等级 + public int armorClass; + /// 生命点 + public Vector2Int hitPoint; - public BattleCharacter(DataCharacter character) { + public BattleCharacter(DataCharacter character, int team) { this.character = character; Cover(character); + this.team = team; name = character.name; level = character.Level; - hitPoint = character.HitPoint; + position = 1; + hitPoint = new Vector2Int(character.HitPoint, character.HitPoint); armorClass = character.ArmorClass; } - } diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase.meta b/Assets/ModuleCore/ModuleBattle/BattlePhase.meta new file mode 100644 index 0000000..1b5b791 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 59e1aa3dad18b83438571f22a94d78af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/BattlePhase.cs b/Assets/ModuleCore/ModuleBattle/BattlePhase/BattlePhase.cs new file mode 100644 index 0000000..b7e117c --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/BattlePhase.cs @@ -0,0 +1,41 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 阶段类型 +/// +public enum PhaseType { + 先攻阶段, + 突袭阶段, + 回合阶段, + 行动阶段, + 结算阶段, +} +/// +/// 阶段 +/// +public interface IPhase { + /// 开始阶段 + public void StartPhase(); + /// 更新阶段 + public void UpdatePhase(); + /// 退出阶段 + public void QuitPhase(); +} +/// +/// 战斗阶段 +/// +public abstract class BattlePhase : IPhase { + /// 模拟器 + public readonly BattleSimulator simulator; + + /// 战斗队列 + public BattleQueue BattleQueue => simulator.battleQueue; + + public BattlePhase(BattleSimulator simulator) => this.simulator = simulator; + + public abstract void StartPhase(); + public abstract void UpdatePhase(); + public abstract void QuitPhase(); +} \ No newline at end of file diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/BattlePhase.cs.meta b/Assets/ModuleCore/ModuleBattle/BattlePhase/BattlePhase.cs.meta new file mode 100644 index 0000000..18ee1b1 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/BattlePhase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ee046dc0d64f6184c966baba17876ec9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAction.cs b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAction.cs new file mode 100644 index 0000000..9ac3326 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAction.cs @@ -0,0 +1,30 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 行动阶段 +/// +public class PhaseAction : BattlePhase { + + public PhaseAction(BattleSimulator simulator) : base(simulator) { } + + public override void StartPhase() { + // throw new System.NotImplementedException(); + } + public override void UpdatePhase() { + // 选择行动目标,没有行动目标则进入结算阶段 + if (!BattleQueue.Dequeue(out BattleCharacter character)) { simulator.Transition(PhaseType.结算阶段); return; } + // 判断是否可以行动 + + // 选择一个目标 + + // 对目标进行攻击 + + // TODO:记录器 + // Debug.Log($"正式回合:{roundCount}"); + } + public override void QuitPhase() { + // throw new System.NotImplementedException(); + } +} diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAction.cs.meta b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAction.cs.meta new file mode 100644 index 0000000..c19d736 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad6c0033db83a3c4fa9d92f3f1912d5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAssault.cs b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAssault.cs new file mode 100644 index 0000000..017eddc --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAssault.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 突袭阶段 +/// +public class PhaseAssault : BattlePhase { + + public PhaseAssault(BattleSimulator simulator) : base(simulator) { } + + public override void StartPhase() { + throw new System.NotImplementedException(); + } + public override void UpdatePhase() { + throw new System.NotImplementedException(); + } + public override void QuitPhase() { + throw new System.NotImplementedException(); + } +} diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAssault.cs.meta b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAssault.cs.meta new file mode 100644 index 0000000..341e9ea --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseAssault.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 620e71ced51f8e94997a198ac8b1e6c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFinish.cs b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFinish.cs new file mode 100644 index 0000000..e9edc73 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFinish.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 结束阶段 +/// +public class PhaseFinish : BattlePhase { + + public PhaseFinish(BattleSimulator simulator) : base(simulator) { } + + public override void StartPhase() { + throw new System.NotImplementedException(); + } + public override void UpdatePhase() { + throw new System.NotImplementedException(); + } + public override void QuitPhase() { + throw new System.NotImplementedException(); + } +} diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFinish.cs.meta b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFinish.cs.meta new file mode 100644 index 0000000..6b1f5ae --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFinish.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 357207f5d09ca394e84210d51916507b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFormal.cs b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFormal.cs new file mode 100644 index 0000000..c6dd6a5 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFormal.cs @@ -0,0 +1,27 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 正式阶段 +/// +public class PhaseFormal : BattlePhase { + /// 回合计数 + public int roundCount; + + public PhaseFormal(BattleSimulator simulator) : base(simulator) { } + + public override void StartPhase() { + // throw new System.NotImplementedException(); + } + public override void UpdatePhase() { + roundCount++; + BattleQueue.UpdateQueue(); + simulator.Transition(PhaseType.行动阶段); + // TODO:记录器 + Debug.Log($"正式回合:{roundCount}"); + } + public override void QuitPhase() { + // throw new System.NotImplementedException(); + } +} diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFormal.cs.meta b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFormal.cs.meta new file mode 100644 index 0000000..2ffef63 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseFormal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 066680fafb7f9cf4dbac4f7291e682cc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseInitiative.cs b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseInitiative.cs new file mode 100644 index 0000000..a0202af --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseInitiative.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 先攻阶段 +/// +public class PhaseInitiative : BattlePhase { + + public PhaseInitiative(BattleSimulator simulator) : base(simulator) { } + + public override void StartPhase() { + // throw new System.NotImplementedException(); + } + public override void UpdatePhase() { + BattleQueue.ForEach(obj => obj.sequence = Dice.Roll20(obj.DexModifier)); + BattleQueue.OrderByDescending(c => c.sequence); + // TODO:需要添加突袭阶段 + simulator.Transition(PhaseType.回合阶段); + // TODO:记录器 + Debug.Log("先攻"); + } + public override void QuitPhase() { + // throw new System.NotImplementedException(); + } +} diff --git a/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseInitiative.cs.meta b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseInitiative.cs.meta new file mode 100644 index 0000000..f141af4 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattlePhase/PhaseInitiative.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4fc0f8aced9d5f04f879b8300fd02e47 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/BattleQueue.cs b/Assets/ModuleCore/ModuleBattle/BattleQueue.cs index 51873b1..b70baff 100644 --- a/Assets/ModuleCore/ModuleBattle/BattleQueue.cs +++ b/Assets/ModuleCore/ModuleBattle/BattleQueue.cs @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -20,20 +21,20 @@ public class BattleQueue { public void Add(BattleCharacter character) { characters.Add(character); } - /// 先攻:d20 + 敏捷调整值 - public void Sequence() { - characters.ForEach(obj => obj.sequence = Dice.Roll20(obj.DexModifier)); + /// 遍历角色 + public void ForEach(Action action) { + characters.ForEach(action); } - /// 排序:大到小 - public void OrderByDescending() { - characters = characters.OrderByDescending(c => c.sequence).ToList(); + // /// 排序:大到小 + public void OrderByDescending(Func func) { + characters = characters.OrderByDescending(func).ToList(); } - /// 回合 - public void Reset() { + /// 更新队列 + public void UpdateQueue() { queue = new Queue(characters); } - /// 当前行动者 - public bool Current(out BattleCharacter battle) { + /// 取出一个 + public bool Dequeue(out BattleCharacter battle) { battle = queue.Count > 0 ? queue.Dequeue() : null; return battle != null; } diff --git a/Assets/ModuleCore/ModuleBattle/BattleSimulator.cs b/Assets/ModuleCore/ModuleBattle/BattleSimulator.cs index f6a39a0..aea05fc 100644 --- a/Assets/ModuleCore/ModuleBattle/BattleSimulator.cs +++ b/Assets/ModuleCore/ModuleBattle/BattleSimulator.cs @@ -10,97 +10,41 @@ using UnityEngine; /// public class BattleSimulator { - // 先攻判断 - // 艾薇拉(18) → 哥布林射手(15) → 托尔吉(7) → 哥布林战士(5) - - // 突袭轮 - // 哥布林射手 使用短弓射击(23)对艾薇拉(AC12)造成了 5穿刺伤害 - - // 正式回合1 - // ‌艾薇拉 施放纠缠术‌(法术豁免DC14),哥布林射手(敏捷豁免6)被束缚 - // ‌艾薇拉 躲至矿石掩体后(AC提升至14) - - // 哥布林射手 试图挣脱藤蔓(力量豁免‌3‌)失败了 - // 哥布林射手 使用多重射击,第一箭(劣势2)对托尔吉(AC14)未命中,第二箭(劣势9)对托尔吉(AC14)未命中 - - // 托尔吉 使用狂暴‌(附赠动作开启)→ 获得力量加成与抗性 - // 托尔吉 移动至哥布林战士前面 - // 托尔吉 使用巨斧猛击(19)对哥布林战士(AC12) 造成了 14钝击伤害 - - // 哥布林战士死亡 - - // 正式回合2 - // ‌艾薇拉 施放奥术飞弹‌(法术豁免DC14),哥布林射手(敏捷豁免6)受到了 10奥术伤害 - - // 哥布林射手死亡 - - /// 回合计数 - public int roundCount; - /// 行动间隔 - public float interval; - /// 最大间隔 - public float maxInterval = 1f; - /// 当前行动 - public Action currentAction; - /// 队伍1 - public BattleTeam team1; - /// 队伍2 - public BattleTeam team2; /// 战斗队列 public BattleQueue battleQueue = new BattleQueue(); - public BattleSimulator(List cha1, List cha2) { - List bCha1 = new List(); - cha1.ForEach(obj => bCha1.Add(new BattleCharacter(obj))); - List bCha2 = new List(); - cha2.ForEach(obj => bCha2.Add(new BattleCharacter(obj))); + /// 当前阶段 + public IPhase currentPhase; + /// 阶段字典 + public Dictionary dictionary = new Dictionary(); - team1 = new BattleTeam(bCha1); - team2 = new BattleTeam(bCha2); + public BattleSimulator(BattleTeam team1, BattleTeam team2) { + battleQueue.Add(team1.battles); + battleQueue.Add(team2.battles); - battleQueue.Add(bCha1); - battleQueue.Add(bCha2); - battleQueue.Sequence(); - battleQueue.OrderByDescending(); - - currentAction = UpdateRound; + dictionary.Add(PhaseType.先攻阶段, new PhaseInitiative(this)); + dictionary.Add(PhaseType.突袭阶段, new PhaseAssault(this)); + dictionary.Add(PhaseType.回合阶段, new PhaseFormal(this)); + dictionary.Add(PhaseType.行动阶段, new PhaseAction(this)); + dictionary.Add(PhaseType.结算阶段, new PhaseFinish(this)); } public void Update() { - if (interval > 0) { interval -= Time.deltaTime; return; } - currentAction?.Invoke(); + currentPhase?.UpdatePhase(); } - /// 更新回合 - public void UpdateRound() { - roundCount++; - battleQueue.Reset(); - Debug.Log($"正式回合 {roundCount}"); - - interval = maxInterval; - currentAction = SelectActionTarget; - } - /// 选择行动对象 - public void SelectActionTarget() { - if (!battleQueue.Current(out BattleCharacter character)) { - currentAction = UpdateRound; return; + /// 阶段过渡 + public void Transition(PhaseType phaseType) { + // 检查阶段字典中是否存在指定的阶段类型 + if (dictionary.TryGetValue(phaseType, out IPhase newPhase)) { + // 如果存在则更新当前阶段 + currentPhase?.QuitPhase(); + currentPhase = newPhase; + currentPhase?.StartPhase(); + Debug.Log($"战斗阶段已转换为: {phaseType}"); + } + else { + // 不存在时输出警告信息 + Debug.LogWarning($"阶段字典中不存在 {phaseType} 对应的阶段实现"); } - Debug.Log($"当前 {character.name}({character.sequence}) 行动"); - - interval = maxInterval; - currentAction = SelectActionTarget; - } - public void SelectAttackTarget(BattleCharacter character) { - } } -/// -/// 战斗队伍 -/// -public class BattleTeam { - - public List characters; - - public BattleTeam(List characters) { - this.characters = characters; - } -} \ No newline at end of file diff --git a/Assets/ModuleCore/ModuleBattle/BattleTeam.cs b/Assets/ModuleCore/ModuleBattle/BattleTeam.cs new file mode 100644 index 0000000..ca3b013 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattleTeam.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// +/// 战斗队伍 +/// +public class BattleTeam { + /// 队伍名字 + public string name; + /// 原始数据 + public List characters = new List(); + /// 战斗数据 + public List battles = new List(); + + /// 添加角色 + public void Add(List list) { + characters.AddRange(list); + } + /// 添加角色 + public void Add(DataCharacter obj) { + characters.Add(obj); + } + /// 删除角色 + public void Remove(DataCharacter character) { + characters.Remove(character); + } + + /// 战斗初始化 + public void Initial(int id) { + characters.ForEach(obj => battles.Add(new BattleCharacter(obj, id))); + } +} \ No newline at end of file diff --git a/Assets/ModuleCore/ModuleBattle/BattleTeam.cs.meta b/Assets/ModuleCore/ModuleBattle/BattleTeam.cs.meta new file mode 100644 index 0000000..c8c2a66 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/BattleTeam.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 60ddd9f20d0d1bd49a6b68d86ccc904a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleBattle/Sample.md b/Assets/ModuleCore/ModuleBattle/Sample.md new file mode 100644 index 0000000..b0e0943 --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/Sample.md @@ -0,0 +1,25 @@ +### 战斗流程示例 + +#### 先攻判断 +- 艾薇拉(18) → 哥布林射手(15) → 托尔吉(7) → 哥布林战士(5) + +#### 突袭轮 +- 哥布林射手 使用短弓射击(23)对艾薇拉(AC12)造成了 5穿刺伤害 + +#### 正式回合1 +- 艾薇拉 施放纠缠术(法术豁免DC14),哥布林射手(敏捷豁免6)被束缚 +- 艾薇拉 躲至矿石掩体后(AC提升至14) + +- 哥布林射手 试图挣脱藤蔓(力量豁免3)失败了 +- 哥布林射手 使用多重射击,第一箭(劣势2)对托尔吉(AC14)未命中,第二箭(劣势9)对托尔吉(AC14)未命中 + +- 托尔吉 使用狂暴(附赠动作开启)→ 获得力量加成与抗性 +- 托尔吉 移动至哥布林战士前面 +- 托尔吉 使用巨斧猛击(19)对哥布林战士(AC12) 造成了 14钝击伤害 + +- 哥布林战士死亡 + +#### 正式回合2 +- 艾薇拉 施放奥术飞弹(法术豁免DC14),哥布林射手(敏捷豁免6)受到了 10奥术伤害 + +- 哥布林射手死亡 \ No newline at end of file diff --git a/Assets/ModuleCore/ModuleBattle/Sample.md.meta b/Assets/ModuleCore/ModuleBattle/Sample.md.meta new file mode 100644 index 0000000..5d1057b --- /dev/null +++ b/Assets/ModuleCore/ModuleBattle/Sample.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: dc4066f5b83586a47bc6bc8ce0115d1d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ModuleCore/ModuleSingle/ManagerSimulator.cs b/Assets/ModuleCore/ModuleSingle/ManagerSimulator.cs index bf971c7..67c7dbe 100644 --- a/Assets/ModuleCore/ModuleSingle/ManagerSimulator.cs +++ b/Assets/ModuleCore/ModuleSingle/ManagerSimulator.cs @@ -8,18 +8,25 @@ using MuHua; /// public class ManagerSimulator : ModuleSingle { - public List cha1 = new List(); - public List cha2 = new List(); + /// 队伍1 + public BattleTeam team1; + /// 队伍2 + public BattleTeam team2; + public BattleSimulator battleSimulator; protected override void Awake() => NoReplace(false); private void Start() { - cha1.Add(RandomCharacter("艾薇拉")); - cha1.Add(RandomCharacter("托尔吉")); - cha2.Add(RandomCharacter("哥布林射手")); - cha2.Add(RandomCharacter("哥布林战士")); - battleSimulator = new BattleSimulator(cha1, cha2); + team1 = new BattleTeam(); + team1.Add(RandomCharacter("艾薇拉")); + team1.Add(RandomCharacter("托尔吉")); + + team2 = new BattleTeam(); + team2.Add(RandomCharacter("哥布林射手")); + team2.Add(RandomCharacter("哥布林战士")); + + battleSimulator = new BattleSimulator(team1, team2); } private void Update() { battleSimulator.Update();