架构大更

This commit is contained in:
SoulliesOfficial
2026-03-20 11:56:50 -04:00
parent e60ef64d01
commit d09b58fd80
3663 changed files with 15232012 additions and 105579 deletions

View File

@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Continentis.MainGame.Card;
@@ -43,7 +42,9 @@ namespace Continentis.MainGame.Combat
private void Start()
{
characterController.Initialize(MainGameManager.Instance.playerHeroDataList, MainGameManager.Instance.enemyDataList);
characterController.Initialize(
MainGameManager.Instance.playerHeroDataList,
MainGameManager.Instance.enemyDataList);
StartCombat();
CombatUIManager.Instance.UpdateAll();
}
@@ -51,196 +52,211 @@ namespace Continentis.MainGame.Combat
public partial class CombatMainManager
{
//public EquipmentData testEquipmentData;
public void StartCombat()
{
foreach (CharacterBase character in characterController.characters)
{
character.InitializeCards();
}
//testEquipmentData = ModManager.GetAsset<EquipmentData>("EquipmentData_Basic_SteelBracer");
//EquipmentBase.GenerateEquipment(testEquipmentData, characterController.characters[0]);
currentRound = 0;
eventCollection.onCombatStart.Invoke();
foreach (CharacterBase character in characterController.characters)
{
character.eventSubmodule.onCombatStart.Invoke();
foreach (EquipmentBase equipment in character.equipmentSubmodule.currentEquipments)
{
equipment.eventSubmodule.onCombatStart.Invoke();
}
}
foreach (CardInstance card in characterController.characters.SelectMany(character => character.deckSubmodule.GetAllCards()))
foreach (CardInstance card in characterController.characters
.SelectMany(character => character.deckSubmodule.GetAllCards()))
{
card.eventSubmodule.onCombatStart.Invoke();
}
NextRound();
}
public void NextRound()
{
currentRound++;
// UI 反馈:回合提示动画(同步,纯 UI 无逻辑影响)
CombatUIManager.Instance.combatMainPage.roundHint.PlayRoundHint(currentRound);
// ── 纯逻辑初始化(无视觉反馈,同步执行)────────────────────────────
eventCollection.onRoundStart.Invoke();
foreach (CharacterBase character in characterController.characters)
{
character.actionCountThisRound = 0;
}
characterController.SetActionOrder();
CombatUIManager.Instance.combatMainPage.actionOrderDisplayer.InitializeTurnOrder();
currentActionIndex = 0;
// ── NPC 意图决策(同步,不产生视觉效果)────────────────────────────
foreach (CharacterBase character in characterController.characters)
{
if (character is CombatNPC npc)
{
npc.IntentionBrain();
npc.deckSubmodule.PoolPile.ForEach(card => card.weightSubmodule.RefreshCurrentWeight());
npc.intentionSubmodule.getIntendedCards.Invoke();
foreach (IntendedCard intendedCard in npc.intentionSubmodule.intendedCards)
{
intendedCard.cardInstance.GenerateIntentionCardView();
if (intendedCard.targets.Count > 0)
{
CardInstance card = intendedCard.cardInstance;
card.eventSubmodule.onTargeting(intendedCard.targets[0]);
card.eventSubmodule.onTargeting(intendedCard.targets[0]);
card.contentSubmodule.dirtyMark = true;
//TODO: 现在仅对第一个目标显示指向,后续可以对多目标进行优化
}
}
}
character.eventSubmodule.onRoundStart.Invoke();
character.equipmentSubmodule.currentEquipments.ForEach(equipment => equipment.eventSubmodule.onRoundStart.Invoke());
character.combatBuffSubmodule.RoundStart();
}
NextAction();
// ── 以下所有事件入队,确保 Buff 触发的视觉效果顺序正确 ────────────
foreach (CharacterBase character in characterController.characters)
{
CharacterBase captured = character;
CommandQueueManager.Instance.AddCommand(Cmd.Do(
() => captured.eventSubmodule.onRoundStart.Invoke()));
CommandQueueManager.Instance.AddCommand(Cmd.Do(
() => captured.equipmentSubmodule.currentEquipments.ForEach(
equipment => equipment.eventSubmodule.onRoundStart.Invoke())));
CommandQueueManager.Instance.AddCommand(Cmd.Do(
() => captured.combatBuffSubmodule.RoundStart()));
}
// ── 所有回合开始事件处理完毕后,进入第一个行动 ────────────────────
CommandQueueManager.Instance.AddCommand(Cmd.Do(NextAction));
}
public void NextAction()
{
if (characterController.actionOrderList.Count == 0)
{
// 回合结束:所有角色的 onRoundEnd 和 Buff 触发均入队
foreach (CharacterBase character in characterController.characters)
{
character.eventSubmodule.onRoundEnd.Invoke();
character.equipmentSubmodule.currentEquipments.ForEach(equipment => equipment.eventSubmodule.onRoundEnd.Invoke());
character.combatBuffSubmodule.RoundEnd();
CharacterBase captured = character;
CommandQueueManager.Instance.AddCommand(Cmd.Do(
() => captured.eventSubmodule.onRoundEnd.Invoke()));
CommandQueueManager.Instance.AddCommand(Cmd.Do(
() => captured.equipmentSubmodule.currentEquipments.ForEach(
equipment => equipment.eventSubmodule.onRoundEnd.Invoke())));
CommandQueueManager.Instance.AddCommand(Cmd.Do(
() => captured.combatBuffSubmodule.RoundEnd()));
}
NextRound();
CommandQueueManager.Instance.AddCommand(Cmd.Do(NextRound));
return;
}
currentCharacter = characterController.actionOrderList[0];
currentCharacter.eventSubmodule.onActionStart.Invoke();
currentCharacter.combatBuffSubmodule.ActionStart();
currentCharacter.recordSubmodule.SetAction(currentRound, ++currentActionIndex);
CharacterBase actionCharacter = currentCharacter;
CommandQueueManager.Instance.AddCommand(Cmd.Do(() =>
{
actionCharacter.eventSubmodule.onActionStart.Invoke();
actionCharacter.combatBuffSubmodule.ActionStart();
actionCharacter.recordSubmodule.SetAction(currentRound, ++currentActionIndex);
}));
if (currentCharacter is PlayerHero playerHero)
{
CombatMainPage combatMainPage = CombatUIManager.Instance.combatMainPage;
playerHero.deckSubmodule.SetUpHandCardViews();
combatMainPage.handPile.isUpdatingLayout = false;
CommandQueueManager.Instance.AddCommand(playerHero.deckSubmodule.DrawCards(playerHero.GetAttribute("DrawCardAmountPerAction")));
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0f, () =>
CommandQueueManager.Instance.AddCommand(
playerHero.deckSubmodule.DrawCards(playerHero.GetAttribute("DrawCardAmountPerAction")));
CommandQueueManager.Instance.AddCommand(Cmd.Do(() =>
{
//Debug.Log((drawCard.groupContext.context["DrawnCards"] as List<CardInstance>).Count);
combatMainPage.handPile.isUpdatingLayout = true;
}));
combatMainPage.combatResourcesDisplayer.SetCharacter(playerHero);
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "End Action";
CombatUIManager.Instance.combatMainPage.endActionButton
.GetComponentInChildren<TMP_Text>().text = "End Action";
CombatUIManager.Instance.combatMainPage.endActionButton.interactable = true;
}
else if (currentCharacter is CombatNPC)
{
if (currentCharacter.fraction == Fraction.Enemy)
{
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Enemy Action";
}
else if (currentCharacter.fraction == Fraction.Enemy)
{
else if (currentCharacter.fraction == Fraction.Ally)
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Ally Action";
}
else
{
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Others Action";
}
CombatUIManager.Instance.combatMainPage.endActionButton.interactable = false;
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0.25f, null));
CommandQueueManager.Instance.AddCommand(Cmd.Wait(0.25f));
foreach (IntendedCard intendedCard in currentCharacter.intentionSubmodule.intendedCards)
{
//TODO: 临时的,刷新一次意图目标
currentCharacter.CheckAvailabilityAndSetTargets(intendedCard.cardInstance, out intendedCard.targets);
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0.25f, () =>
{
intendedCard.cardInstance.Play(intendedCard.targets, currentCharacter);
intendedCard.cardInstance.DestroyIntentionCardView();
}));
IntendedCard captured = intendedCard;
currentCharacter.CheckAvailabilityAndSetTargets(captured.cardInstance, out captured.targets);
CommandQueueManager.Instance.AddCommand(Cmd.Sequential(
Cmd.Do(() => {
captured.cardInstance.Play(captured.targets, currentCharacter);
captured.cardInstance.DestroyIntentionCardView();
}),
Cmd.Wait(0.25f)
));
}
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0f, EndAction));
CommandQueueManager.Instance.AddCommand(Cmd.Do(EndAction));
}
currentCharacter.characterView.hudContainer.UpdateAllHUD();
CombatUIManager.Instance.combatMainPage.actionOrderDisplayer.avatars.Find(avatar => avatar.character == currentCharacter)?.Highlight(true);
CombatUIManager.Instance.combatMainPage.actionOrderDisplayer.avatars
.Find(avatar => avatar.character == currentCharacter)?.Highlight(true);
currentCharacter.actionCountThisRound++;
}
public void EndAction()
{
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Waiting...";
CombatUIManager.Instance.combatMainPage.endActionButton
.GetComponentInChildren<TMP_Text>().text = "Waiting...";
CombatUIManager.Instance.combatMainPage.endActionButton.interactable = false;
CommandQueueManager.Instance.AddCommand(new Cmd_Function(currentCharacter.eventSubmodule.onActionEnd.Invoke));
foreach (var card in currentCharacter.deckSubmodule.GetAllCards())
CommandQueueManager.Instance.AddCommand(
Cmd.Do(currentCharacter.eventSubmodule.onActionEnd.Invoke));
foreach (CardInstance card in currentCharacter.deckSubmodule.GetAllCards())
{
CommandQueueManager.Instance.AddCommand(new Cmd_Function(card.eventSubmodule.onActionEnd.Invoke));
CardInstance captured = card;
CommandQueueManager.Instance.AddCommand(
Cmd.Do(captured.eventSubmodule.onActionEnd.Invoke));
}
CommandQueueManager.Instance.AddCommand(new Cmd_Function(() =>
CommandQueueManager.Instance.AddCommand(Cmd.Do(() =>
{
currentCharacter.combatBuffSubmodule.ActionEnd();
if (currentCharacter is PlayerHero playerHero)
{
//Debug.Log(currentCharacter.data.className + " 结束行动,整理手牌。");
List<CardInstance> handPile = new List<CardInstance>(playerHero.deckSubmodule.HandPile);
List<CardInstance> cardToRetain = handPile.Where(card => card.HasKeyword("Retain")).ToList(); //含有“保留”关键词的卡牌
List<CardInstance> cardToExhaust = handPile.Where(card => card.HasKeyword("Ethereal")).ToList(); //含有“虚无”关键词的卡牌
List<CardInstance> cardsToDiscard = handPile.Except(cardToRetain).Except(cardToExhaust).ToList(); //其他卡牌,默认丢弃
List<CardInstance> cardToRetain = handPile.Where(c => c.HasKeyword("Retain")).ToList();
List<CardInstance> cardToExhaust = handPile.Where(c => c.HasKeyword("Ethereal")).ToList();
List<CardInstance> cardsToDiscard = handPile.Except(cardToRetain).Except(cardToExhaust).ToList();
CommandQueueManager.Instance.AddCommand(playerHero.deckSubmodule.ExhaustCards(cardToExhaust));
CommandQueueManager.Instance.AddCommand(playerHero.deckSubmodule.DiscardCards(cardsToDiscard, false));
}
characterController.actionOrderList.Remove(currentCharacter);
CombatUIManager.Instance.combatMainPage.actionOrderDisplayer.EndAction();
CommandQueueManager.Instance.AddCommand(new Cmd_Function(CombatUIManager.Instance.combatMainPage.ClearAllCardViews));
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0.5f, null));
CommandQueueManager.Instance.AddCommand(new Cmd_Function(NextAction));
CommandQueueManager.Instance.AddCommand(Cmd.Do(CombatUIManager.Instance.combatMainPage.ClearAllCardViews));
CommandQueueManager.Instance.AddCommand(Cmd.Wait(0.5f));
CommandQueueManager.Instance.AddCommand(Cmd.Do(NextAction));
}));
}
}
}
}