Files
Continentis/Assets/Scripts/MainGame/Combat/CombatMainManager.cs

234 lines
10 KiB
C#
Raw Normal View History

2025-10-03 00:02:43 -04:00
using System;
using System.Collections.Generic;
using System.Linq;
using Continentis.MainGame.Card;
using Continentis.MainGame.Character;
using Continentis.MainGame.Commands;
using Continentis.MainGame.Equipment;
using Continentis.MainGame.UI;
2025-10-23 00:49:44 -04:00
using SLSFramework.General;
using SLSFramework.UModAssistance;
2025-10-03 00:02:43 -04:00
using TMPro;
using UnityEngine;
2025-10-23 00:49:44 -04:00
namespace Continentis.MainGame.Combat
2025-10-03 00:02:43 -04:00
{
public partial class CombatMainManager : Singleton<CombatMainManager>
{
2025-10-23 00:49:44 -04:00
public CombatCharacterController characterController;
2025-10-03 00:02:43 -04:00
}
public partial class CombatMainManager
{
2025-10-23 00:49:44 -04:00
[Header("Combat State")]
2025-10-03 00:02:43 -04:00
public int currentRound;
public int currentActionIndex;
public CharacterBase currentCharacter;
}
public partial class CombatMainManager
{
2025-10-23 00:49:44 -04:00
[Header("Events")]
2025-10-03 00:02:43 -04:00
public CombatEventCollection eventCollection;
}
public partial class CombatMainManager
{
protected override void Awake()
{
base.Awake();
2025-10-23 00:49:44 -04:00
characterController = new CombatCharacterController();
2025-10-03 00:02:43 -04:00
eventCollection = new CombatEventCollection();
}
private void Start()
{
2025-10-23 00:49:44 -04:00
characterController.Initialize(MainGameManager.Instance.playerHeroDataList, MainGameManager.Instance.enemyDataList);
2025-10-03 00:02:43 -04:00
StartCombat();
}
}
public partial class CombatMainManager
{
public CardData testCardData;
public EquipmentData testEquipmentData;
public void StartCombat()
{
2025-10-23 00:49:44 -04:00
foreach (CharacterBase character in characterController.characters)
{
character.InitializeCards();
}
testEquipmentData = ModManager.GetAsset<EquipmentData>("EquipmentData_Basic_SteelBracer");
EquipmentBase.GenerateEquipment(testEquipmentData, characterController.characters[0]);
2025-10-03 00:02:43 -04:00
currentRound = 0;
eventCollection.onCombatStart.Invoke();
2025-10-23 00:49:44 -04:00
foreach (CharacterBase character in characterController.characters)
2025-10-03 00:02:43 -04:00
{
2025-10-23 00:49:44 -04:00
character.eventSubmodule.onCombatStart.Invoke();
2025-10-03 00:02:43 -04:00
2025-10-23 00:49:44 -04:00
foreach (EquipmentBase equipment in character.equipmentSubmodule.currentEquipments)
2025-10-03 00:02:43 -04:00
{
2025-10-23 00:49:44 -04:00
equipment.eventSubmodule.onCombatStart.Invoke();
2025-10-03 00:02:43 -04:00
}
}
2025-10-23 00:49:44 -04:00
foreach (CardInstance card in characterController.characters.SelectMany(character => character.deckSubmodule.GetAllCards()))
2025-10-03 00:02:43 -04:00
{
card.cardLogic.eventSubmodule.onCombatStart.Invoke();
}
NextRound();
}
public void NextRound()
{
currentRound++;
eventCollection.onRoundStart.Invoke();
2025-10-23 00:49:44 -04:00
foreach (CharacterBase character in characterController.characters)
2025-10-03 00:02:43 -04:00
{
2025-10-23 00:49:44 -04:00
character.actionCountThisRound = 0;
2025-10-03 00:02:43 -04:00
}
2025-10-23 00:49:44 -04:00
characterController.SetActionOrder();
CombatUIManager.Instance.combatMainPage.actionOrderDisplayer.InitializeTurnOrder();
2025-10-03 00:02:43 -04:00
currentActionIndex = 0;
2025-10-23 00:49:44 -04:00
foreach (CharacterBase character in characterController.characters)
2025-10-03 00:02:43 -04:00
{
if (character is CombatNPC npc)
{
npc.intentionSubmodule.getIntendedCards.Invoke();
foreach (IntendedCard intendedCard in npc.intentionSubmodule.intendedCards)
{
intendedCard.cardInstance.GenerateIntentionCardView();
2025-10-23 00:49:44 -04:00
if (intendedCard.targets.Count > 0)
{
var cardLogic = intendedCard.cardInstance.cardLogic;
cardLogic.eventSubmodule.onTargeting(intendedCard.targets[0]);
CardTextInterpreter.InterpretText(cardLogic);
cardLogic.intentionCardView.cardDescriptionText.text = cardLogic.contentSubmodule.interpretedFunctionText;
//TODO: 现在仅对第一个目标显示指向,后续可以对多目标进行优化
}
2025-10-03 00:02:43 -04:00
}
}
2025-10-30 12:07:59 -04:00
character.eventSubmodule.onRoundStart.Invoke();
character.equipmentSubmodule.currentEquipments.ForEach(equipment => equipment.eventSubmodule.onRoundStart.Invoke());
character.combatBuffSubmodule.RoundStart();
2025-10-03 00:02:43 -04:00
}
NextAction();
}
2025-10-23 00:49:44 -04:00
2025-10-03 00:02:43 -04:00
public void NextAction()
{
2025-10-23 00:49:44 -04:00
if (characterController.actionOrderList.Count == 0)
2025-10-03 00:02:43 -04:00
{
2025-10-30 12:07:59 -04:00
foreach (CharacterBase character in characterController.characters)
{
character.eventSubmodule.onRoundEnd.Invoke();
character.equipmentSubmodule.currentEquipments.ForEach(equipment => equipment.eventSubmodule.onRoundEnd.Invoke());
character.combatBuffSubmodule.RoundEnd();
}
2025-10-03 00:02:43 -04:00
NextRound();
return;
}
2025-10-23 00:49:44 -04:00
currentCharacter = characterController.actionOrderList[0];
2025-10-03 00:02:43 -04:00
currentCharacter.eventSubmodule.onActionStart.Invoke();
//currentCharacter.StartActionSetUI();
if (currentCharacter is PlayerHero playerHero)
{
2025-10-23 00:49:44 -04:00
CombatMainPage combatMainPage = CombatUIManager.Instance.combatMainPage;
2025-10-03 00:02:43 -04:00
2025-10-23 00:49:44 -04:00
playerHero.deckSubmodule.SetUpHandCardViews();
2025-10-24 09:11:22 -04:00
playerHero.combatBuffSubmodule.ActionStart();
2025-10-03 00:02:43 -04:00
2025-10-23 00:49:44 -04:00
combatMainPage.handPile.isUpdatingLayout = false;
2025-11-01 06:13:58 -04:00
CommandQueueManager.Instance.AddCommand(playerHero.deckSubmodule.DrawCards(playerHero.GetAttribute("DrawCardAmountPerAction")));
2025-10-24 09:11:22 -04:00
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0f, () =>
{
//Debug.Log((drawCard.groupContext.context["DrawnCards"] as List<CardInstance>).Count);
combatMainPage.handPile.isUpdatingLayout = true;
}));
2025-10-03 00:02:43 -04:00
2025-10-23 00:49:44 -04:00
combatMainPage.combatResourcesDisplayer.SetCharacter(playerHero);
2025-10-03 00:02:43 -04:00
2025-10-23 00:49:44 -04:00
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "End Action";
CombatUIManager.Instance.combatMainPage.endActionButton.interactable = true;
2025-10-03 00:02:43 -04:00
}
else if (currentCharacter is CombatNPC)
{
if (currentCharacter.fraction == Fraction.Enemy)
{
2025-10-23 00:49:44 -04:00
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Enemy Action";
2025-10-03 00:02:43 -04:00
}
else if (currentCharacter.fraction == Fraction.Enemy)
{
2025-10-23 00:49:44 -04:00
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Ally Action";
2025-10-03 00:02:43 -04:00
}
else
{
2025-10-23 00:49:44 -04:00
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Others Action";
2025-10-03 00:02:43 -04:00
}
2025-10-23 00:49:44 -04:00
CombatUIManager.Instance.combatMainPage.endActionButton.interactable = false;
2025-10-03 00:02:43 -04:00
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0.25f, null));
foreach (IntendedCard intendedCard in currentCharacter.intentionSubmodule.intendedCards)
{
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0.25f, () => intendedCard.cardInstance.DestroyIntentionCardView()));
intendedCard.cardInstance.cardLogic.Play(intendedCard.targets, currentCharacter, false);
}
CommandQueueManager.Instance.AddCommand(new Cmd_Function(0f, EndAction));
}
2025-10-23 00:49:44 -04:00
currentCharacter.actionCountThisRound++;
}
2025-10-03 00:02:43 -04:00
public void EndAction()
{
2025-10-23 00:49:44 -04:00
CombatUIManager.Instance.combatMainPage.endActionButton.GetComponentInChildren<TMP_Text>().text = "Waiting...";
CombatUIManager.Instance.combatMainPage.endActionButton.interactable = false;
2025-10-03 00:02:43 -04:00
2025-10-23 00:49:44 -04:00
CommandQueueManager.Instance.AddCommand(new Cmd_Function(currentCharacter.eventSubmodule.onActionEnd.Invoke));
foreach (var card in currentCharacter.deckSubmodule.GetAllCards())
2025-10-03 00:02:43 -04:00
{
2025-10-23 00:49:44 -04:00
CommandQueueManager.Instance.AddCommand(new Cmd_Function(card.cardLogic.eventSubmodule.onActionEnd.Invoke));
2025-10-03 00:02:43 -04:00
}
2025-10-23 00:49:44 -04:00
CommandQueueManager.Instance.AddCommand(new Cmd_Function(() =>
2025-10-03 00:02:43 -04:00
{
2025-10-23 00:49:44 -04:00
if (currentCharacter is PlayerHero playerHero)
2025-10-03 00:02:43 -04:00
{
2025-10-24 09:11:22 -04:00
playerHero.combatBuffSubmodule.ActionEnd();
2025-10-23 00:49:44 -04:00
Debug.Log(currentCharacter.data.className + " 结束行动,整理手牌。");
List<CardInstance> handPile = new List<CardInstance>(playerHero.deckSubmodule.HandPile);
List<CardInstance> cardToRetain = handPile.Where(card => card.cardLogic.HasKeyword("Retain")).ToList(); //含有“保留”关键词的卡牌
List<CardInstance> cardToExhaust = handPile.Where(card => card.cardLogic.HasKeyword("Ethereal")).ToList(); //含有“虚无”关键词的卡牌
List<CardInstance> cardsToDiscard = handPile.Except(cardToRetain).Except(cardToExhaust).ToList(); //其他卡牌,默认丢弃
2025-10-30 23:31:29 -04:00
CommandQueueManager.Instance.AddCommand(playerHero.deckSubmodule.ExhaustCards(cardToExhaust));
2025-10-31 10:02:30 -04:00
CommandQueueManager.Instance.AddCommand(playerHero.deckSubmodule.DiscardCards(cardsToDiscard, false));
2025-10-03 00:02:43 -04:00
}
2025-10-23 00:49:44 -04:00
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));
}));
2025-10-03 00:02:43 -04:00
}
}
}