RandomGFGoStop/Assets/Scripts/UI/GamePanel/GamePanel_DiscardEffect.cs

274 lines
11 KiB
C#
Raw Normal View History

2025-08-27 21:08:17 +00:00
using System.Collections.Generic;
using CodeJay.Enum;
using UnityEngine;
public partial class GamePanel : MonoBehaviour
{
public enum EDiscardState
{
ActionBeforeDiscard,
WaitForDiscard,
CheckGuide,
BonusCardAction,
CheckBellCard,
WaitForShake,
CheckBombCard,
BringTheCardAfterBomb,
MoveToFloor,
Complete
}
private int _discardIndex = 0;
private EDiscardState _discardState = EDiscardState.ActionBeforeDiscard;
private bool _useBomb = false;
private void InitDiscardData()
{
_discardIndex = 0;
_discardState = EDiscardState.ActionBeforeDiscard;
}
private void DiscardStateMachine()
{
switch (_discardState)
{
case EDiscardState.ActionBeforeDiscard:
{
SetGuideData(true);
_discardSlot = null;
_useBomb = false;
if (PlayerTurn)
{
if (_isFirstTurn_Player)
SortPlayerCards();
EnabledPlayerHandRaycast(true);
EffectPanel.PlayerTurnDirectEnabled(true);
}
_discardState = EDiscardState.WaitForDiscard;
}
break;
case EDiscardState.WaitForDiscard:
if (PlayerTurn)
{
if (_discardSlot != null)
{
_discardState = EDiscardState.CheckGuide;
EnabledPlayerHandRaycast(false);
SetGuideData(false);
EffectPanel.PlayerTurnDirectEnabled(false);
}
}
else
{
var aihandCardSlots = GetMatchedCardSlots(ECardLocationType.AI_Hand);
_discardSlot = aihandCardSlots[Random.Range(0, aihandCardSlots.Count)];
_discardState = EDiscardState.CheckGuide;
}
break;
#region Bonus
case EDiscardState.BonusCardAction:
{
for (int i = 0; i < _lstCardSlots.Count; i++)
{
if (_lstCardSlots[i].LocationType == ECardLocationType.Center)
{
if (PlayerTurn)
_lstCardSlots[i].Move(ECardLocationType.Center, ECardLocationType.Player_Hand, GetRectTransformAndModifyContainer(ECardLocationType.Player_Hand, _lstCardSlots[i].CardType));
else
_lstCardSlots[i].Move(ECardLocationType.Center, ECardLocationType.AI_Hand, GetRectTransformAndModifyContainer(ECardLocationType.AI_Hand, _lstCardSlots[i].CardType));
break;
}
}
GameManager.Sound.ReserveSFX(ESFXType.Card_Hit, 0.25f);
EffectPanel.Direct(EEffectDirectType.Bonus, PlayerTurn);
BringOtherPlayersPeeCard(1, PlayerTurn);
_delay = 0.25f;
_discardState = EDiscardState.ActionBeforeDiscard;
_discardSlot = null;
if (PlayerTurn)
SortPlayerCards();
}
break;
case EDiscardState.CheckGuide:
if (_discardSlot.CardType == ECardType.Bonus_1 || _discardSlot.CardType == ECardType.Bonus_2 || _discardSlot.CardType == ECardType.Bonus_3)
{
if (PlayerTurn)
{
_discardSlot.Move(ECardLocationType.Player_Hand, ECardLocationType.Player_Score, GetRectTransformAndModifyContainer(ECardLocationType.Player_Score, _discardSlot.CardType));
DataMove(ECardLocationType.Player_Hand, _discardSlot.CardType);
}
else
{
_discardSlot.Move(ECardLocationType.AI_Hand, ECardLocationType.AI_Score, GetRectTransformAndModifyContainer(ECardLocationType.AI_Score, _discardSlot.CardType));
DataMove(ECardLocationType.AI_Hand, _discardSlot.CardType);
}
_discardState = EDiscardState.BonusCardAction;
}
else if (_discardSlot.GuideType == EGuideType.Bell)
{
_discardState = EDiscardState.CheckBellCard;
}
else if (_discardSlot.GuideType == EGuideType.Bomb_Double || _discardSlot.GuideType == EGuideType.Bomb_Triple)
{
_discardIndex = 0;
_discardState = EDiscardState.CheckBombCard;
}
else if (_discardSlot.CardType == ECardType.FlipCard_1 || _discardSlot.CardType == ECardType.FlipCard_2)
{
DataMove(PlayerTurn ? ECardLocationType.Player_Hand : ECardLocationType.AI_Hand, _discardSlot.CardType);
_lstCardSlots.Remove(_discardSlot);
Destroy(_discardSlot.gameObject);
_discardSlot = null;
_discardState = EDiscardState.Complete;
}
else
{
_discardState = EDiscardState.MoveToFloor;
}
break;
#endregion
#region Shake (Bell)
case EDiscardState.CheckBellCard:
if (PlayerTurn)
{
var cardSlots = GetMatchedCardSlots(ECardLocationType.Player_Hand, _discardSlot.MonthType);
List<ECardType> cardTypes = new List<ECardType>();
for (int i = 0; i < cardSlots.Count; i++)
cardTypes.Add(cardSlots[i].CardType);
GameManager.UI.ShowNStackPopup<ShakeSelectPopup>(EPopupType.ShakeSelectPopup).SetData(cardTypes.ToArray(), cardSlots.Count >= 4);
_discardState = EDiscardState.WaitForShake;
_delay = 0.05f;
_discardIndex = Player_Bell;
}
else
{
var cardSlots = GetMatchedCardSlots(ECardLocationType.Player_Hand, _discardSlot.MonthType);
List<ECardType> cardTypes = new List<ECardType>();
for (int i = 0; i < cardSlots.Count; i++)
cardTypes.Add(cardSlots[i].CardType);
GameManager.UI.ShowNStackPopup<ShakeSelectPopup_AI>(EPopupType.ShakeSelectPopup_AI).SetData(cardTypes.ToArray(), cardSlots.Count >= 4);
_discardState = EDiscardState.WaitForShake;
_delay = 2;
}
break;
case EDiscardState.WaitForShake:
if (GameManager.UI.IsAnyPopupOpened() == false)
{
if (PlayerTurn)
{
if (Player_Bell == _discardIndex)
_delay = 1.6f;
}
_discardState = EDiscardState.MoveToFloor;
_discardIndex = 0;
}
break;
#endregion
case EDiscardState.CheckBombCard:
if (_discardSlot.GuideType == EGuideType.Bomb_Double || _discardSlot.GuideType == EGuideType.Bomb_Triple)
{
ECardLocationType location = PlayerTurn ? ECardLocationType.Player_Hand : ECardLocationType.AI_Hand;
var matchedSlot = GetMatchedCardSlots(location, _discardSlot.MonthType);
if (matchedSlot.Count > 0)
{
RectTransform rt = GetRectTransformAndModifyContainer(ECardLocationType.Floor, matchedSlot[matchedSlot.Count - 1].CardType);
matchedSlot[matchedSlot.Count - 1].Move(location, ECardLocationType.Floor, rt);
DataMove(location, matchedSlot[matchedSlot.Count - 1].CardType);
_delay = 0.1f;
GameManager.Sound.ReserveSFX(ESFXType.Card_Hit, CardSlot.TWEEN_DURATION);
}
else
{
_useBomb = true;
int num;
if (_discardSlot.GuideType == EGuideType.Bomb_Double)
num = 1;
else
num = 2;
var matchedCardSlot = GetMatchedCardSlots(ECardLocationType.Floor, _discardSlot.MonthType);
for (int i = 0; i < matchedCardSlot.Count; i++)
_lstAvailableCardTypes.Add(matchedCardSlot[i].CardType);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><20><>´<EFBFBD>.
for (int i = 0; i < num; i++)
{
CardSlot slot = Instantiate(CardSlotPrefab).GetComponent<CardSlot>();
slot.Initialize();
slot.SetData(ECardType.FlipCard_1 + i);
slot.Move(ECardLocationType.Max, location, GetRectTransformAndModifyContainer(location, slot.CardType));
_lstCardSlots.Add(slot);
}
if (_discardSlot.GuideType == EGuideType.Bomb_Double)
{
_delay = EffectPanel.GetEffectDuration(EEffectDirectType.Bomb_Double);
EffectPanel.Direct(EEffectDirectType.Bomb_Double, PlayerTurn);
}
else
{
_delay = EffectPanel.GetEffectDuration(EEffectDirectType.Bomb_Triple);
EffectPanel.Direct(EEffectDirectType.Bomb_Triple, PlayerTurn);
}
_discardState = EDiscardState.BringTheCardAfterBomb;
}
}
else
{
LogicalError($"Only Reached {nameof(_discardSlot)}.GuideType : Bomb_Double, Bomb_Triple");
}
break;
case EDiscardState.BringTheCardAfterBomb:
{
BringOtherPlayersPeeCard(1, PlayerTurn);
_delay = 0.1f;
_discardState = EDiscardState.Complete;
}
break;
case EDiscardState.MoveToFloor:
{
RectTransform rt = GetRectTransformAndModifyContainer(ECardLocationType.Floor, _discardSlot.CardType);
ECardLocationType location = PlayerTurn ? ECardLocationType.Player_Hand : ECardLocationType.AI_Hand;
DataMove(location, _discardSlot.CardType);
// <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> CardSlot<6F><74> <20><><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>.
_discardSlot.Move(location, ECardLocationType.Floor, rt);
_delay = 0.25f;
_discardState = EDiscardState.Complete;
}
break;
case EDiscardState.Complete:
{
this.InitDiscardData();
CurrentCoroutineType = EGameWorkFlowType.CheckMatchedCardAfterDiscard;
}
break;
}
}
}