Files
Continentis/Assets/Scripts/MainGame/Card/CardView/HandCardView/HandCardView_Operations.cs
SoulliesOfficial 4c7e5c397b 五张牌!
2025-10-30 04:21:28 -04:00

295 lines
13 KiB
C#

using System.Collections.Generic;
using Continentis.MainGame.Character;
using Continentis.MainGame.Combat;
using Continentis.MainGame.UI;
using SLSFramework.General;
using UnityEngine;
using UnityEngine.EventSystems;
namespace Continentis.MainGame.Card
{
public partial class HandCardView : IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerClickHandler
{
public CombatCharacterViewBase currentTargetingCharacterView;
public List<CharacterBase> validTargets = new List<CharacterBase>();
public List<CharacterBase> conditionNotMetTargets = new List<CharacterBase>();
public List<CharacterBase> invalidTargets = new List<CharacterBase>();
public override void OnPointerEnter(PointerEventData eventData)
{
base.OnPointerEnter(eventData);
if (CombatUIManager.Instance.selectingCardView == null)
{
canvas.overrideSorting = true;
canvas.sortingLayerName = "UI";
canvas.sortingOrder = 10;
}
}
public override void OnPointerExit(PointerEventData eventData)
{
base.OnPointerExit(eventData);
if (!isSelecting)
{
canvas.overrideSorting = false;
canvas.sortingOrder = 0;
}
}
public void OnPointerClick(PointerEventData eventData)
{
if (CombatUIManager.Instance.combatMainPage.handCardSelector.gameObject.activeInHierarchy)
{
if(isOccupied) return;
if (CombatUIManager.Instance.combatMainPage.handCardSelector.selectedCards.Contains(cardInstance))
{
CombatUIManager.Instance.combatMainPage.handCardSelector.Deselect(this);
}
else
{
CombatUIManager.Instance.combatMainPage.handCardSelector.Select(this);
}
}
else if (CombatUIManager.Instance.combatMainPage.customCardSelector.gameObject.activeInHierarchy)
{
if(isOccupied) return;
if (CombatUIManager.Instance.combatMainPage.customCardSelector.selectedCards.Contains(cardInstance))
{
CombatUIManager.Instance.combatMainPage.customCardSelector.Deselect(this);
}
else
{
CombatUIManager.Instance.combatMainPage.customCardSelector.Select(this);
}
}
}
public void OnBeginDrag(PointerEventData eventData)
{
isSelecting = true;
CombatUIManager.Instance.selectingCardView = this;
cardInstance.user = CombatMainManager.Instance.currentCharacter;
cardLogic.DetectTargetsValidity(out validTargets, out conditionNotMetTargets, out invalidTargets);
if (cardLogic.attributeSubmodule.targetCount == 1)
{
CombatUIManager.Instance.arrowsPage.GeneratePointerArrow(cardTransform.position, cardTransform.position, true);
}
else if (cardLogic.attributeSubmodule.targetCount == -1)
{
CombatUIManager.Instance.arrowsPage.GeneratePointerArrow(cardTransform.position, cardTransform.position, true);
for (int i = 0; i < validTargets.Count + conditionNotMetTargets.Count - 1; i++)
{
CombatUIManager.Instance.arrowsPage.GeneratePointerArrow(cardTransform.position, cardTransform.position, false);
}
}
}
public void OnDrag(PointerEventData eventData)
{
RectTransform arrowCanvasRect = CombatUIManager.Instance.arrowsPage.rectTransform;
Camera uiCamera = CombatUIManager.Instance.uiCamera;
Camera worldCamera = CombatUIManager.Instance.combatCamera;
// 先检查悬停的视图是否和当前记录的目标视图发生了变化
if (CombatUIManager.Instance.hoveringCharacterView != currentTargetingCharacterView)
{
// 如果悬停视图不是空的,说明鼠标移动到了一个新的目标上
if (CombatUIManager.Instance.hoveringCharacterView != null)
{
cardLogic.eventSubmodule.onTargeting(CombatUIManager.Instance.hoveringCharacterView.character);
currentTargetingCharacterView = CombatUIManager.Instance.hoveringCharacterView;
}
else // 悬停视图是空的,说明鼠标离开了之前的目标
{
cardLogic.eventSubmodule.onUntargeting();
currentTargetingCharacterView = null;
}
// 因为目标发生了变化(无论是选中了新的还是取消了),所以统一在这里更新描述
CardTextInterpreter.InterpretText(cardLogic);
cardDescriptionText.text = cardLogic.contentSubmodule.interpretedFunctionText;
}
Vector3 startPosition = cardTransform.position + new Vector3(0, cardTransform.rect.height * cardTransform.lossyScale.y / 2, 0);
Vector3 endPosition = SpaceConverter.ScreenPointToUIPoint(arrowCanvasRect, eventData.position, uiCamera);
PointerArrow mainPointerArrow = CombatUIManager.Instance.arrowsPage.mainPointerArrow;
CombatCharacterViewBase hoveringCharacterView = CombatUIManager.Instance.hoveringCharacterView;
CharacterBase hoveringCharacter = hoveringCharacterView != null ? hoveringCharacterView.character : null;
if (cardLogic.attributeSubmodule.targetCount == 1)
{
mainPointerArrow.SetArrow(startPosition, endPosition);
if (hoveringCharacter != null)
{
if (validTargets.Contains(hoveringCharacter))
{
mainPointerArrow.SetColor(Color.white);
}
else if (conditionNotMetTargets.Contains(hoveringCharacter))
{
mainPointerArrow.SetColor(Color.yellow);
}
else if (invalidTargets.Contains(hoveringCharacter))
{
mainPointerArrow.SetColor(Color.red);
}
}
else
{
mainPointerArrow.SetColor(Color.white);
}
}
else if (cardLogic.attributeSubmodule.targetCount == -1)
{
mainPointerArrow.SetArrow(startPosition, endPosition);
if (validTargets.Count > 0)
{
if (hoveringCharacter != null)
{
mainPointerArrow.SetColor(Color.white);
}
if (validTargets.Contains(hoveringCharacter))
{
mainPointerArrow.SetColor(Color.white);
}
else if (conditionNotMetTargets.Contains(hoveringCharacter))
{
mainPointerArrow.SetColor(Color.yellow);
}
else if (invalidTargets.Contains(hoveringCharacter))
{
mainPointerArrow.SetColor(Color.red);
}
}
else
{
mainPointerArrow.SetColor(Color.red);
return;
}
if (hoveringCharacter != null && (validTargets.Contains(hoveringCharacter) || conditionNotMetTargets.Contains(hoveringCharacter)))
{
List<CharacterBase> validTargetsExceptHovering =
validTargets.FindAll(target => target != hoveringCharacter);
List<CharacterBase> notMetTargetsExceptHovering =
conditionNotMetTargets.FindAll(target => target != hoveringCharacter);
for (int i = 0; i < validTargetsExceptHovering.Count; i++)
{
PointerArrow arrow = CombatUIManager.Instance.arrowsPage.otherPointerArrows[i];
CharacterBase target = validTargetsExceptHovering[i];
Vector3 targetViewPosition = target.characterView.transform.position;
arrow.gameObject.SetActive(true);
Vector3 otherEndPosition = SpaceConverter.WorldPointToUIPoint(arrowCanvasRect, targetViewPosition, worldCamera, uiCamera);
arrow.SetArrow(startPosition, otherEndPosition);
arrow.SetColor(Color.white);
}
for (int i = validTargetsExceptHovering.Count; i < validTargetsExceptHovering.Count + notMetTargetsExceptHovering.Count; i++)
{
PointerArrow arrow = CombatUIManager.Instance.arrowsPage.otherPointerArrows[i];
CharacterBase target = notMetTargetsExceptHovering[i];
Vector3 targetViewPosition = target.characterView.transform.position;
arrow.gameObject.SetActive(true);
Vector3 otherEndPosition = SpaceConverter.WorldPointToUIPoint(arrowCanvasRect, targetViewPosition, worldCamera, uiCamera);
arrow.SetArrow(startPosition, otherEndPosition);
arrow.SetColor(Color.yellow);
}
}
else
{
CombatUIManager.Instance.arrowsPage.otherPointerArrows.ForEach(arrow => { arrow.gameObject.SetActive(false); });
}
}
else if (cardLogic.attributeSubmodule.targetCount == 0)
{
Vector3 cardPosition = SpaceConverter.ScreenPointToUIPoint(arrowCanvasRect, eventData.position, uiCamera);
cardTransform.position = cardPosition;
}
}
public void OnEndDrag(PointerEventData eventData)
{
CombatCharacterViewBase hoveringCharacterView = CombatUIManager.Instance.hoveringCharacterView;
CharacterBase hoveringCharacter = hoveringCharacterView != null ? hoveringCharacterView.character : null;
Camera uiCamera = CombatUIManager.Instance.uiCamera;
CombatUIManager.Instance.arrowsPage.ClearPointerArrows();
if (isSelecting)
{
isSelecting = false;
isHovering = false;
CombatUIManager.Instance.selectingCardView = null;
canvas.overrideSorting = false;
canvas.sortingOrder = 0;
cardLogic.eventSubmodule.onUntargeting();
CardTextInterpreter.InterpretText(cardLogic);
cardDescriptionText.text = cardLogic.contentSubmodule.interpretedFunctionText;
}
else
{
return;
}
if (cardLogic.HasKeyword("Unplayable")) // 如果有“不能打出”关键词,直接返回
{
return;
}
if (!cardLogic.HasKeyword("TargetSelf"))
{
if (!validTargets.Contains(hoveringCharacter))
{
// 当前鼠标悬停的目标不在有效目标列表中
return;
}
}
// 根据目标类型,打出卡牌
if (cardLogic.attributeSubmodule.targetCount == 1)
{
if (hoveringCharacter != null)
{
if (!cardLogic.Play(new List<CharacterBase>() { CombatUIManager.Instance.hoveringCharacterView.character }))
{
cardLogic.eventSubmodule.onUntargeting();
CardTextInterpreter.InterpretText(cardLogic);
cardDescriptionText.text = cardLogic.contentSubmodule.interpretedFunctionText;
}
}
}
else
{
RectTransform dropZone = CombatUIManager.Instance.combatMainPage.dropZone;
bool isInDropZone = RectTransformUtility.RectangleContainsScreenPoint(dropZone, eventData.position, uiCamera);
List<CharacterBase> targetList = new List<CharacterBase>();
if (cardLogic.attributeSubmodule.targetCount == -1)
{
targetList.AddRange(validTargets);
}
else if (cardLogic.HasKeyword("TargetSelf") && cardLogic.attributeSubmodule.targetCount == 0)
{
targetList.Add(cardLogic.user);
}
if (!isInDropZone)
{
cardLogic.Play(targetList);
}
}
}
}
}