RandomGFGoStop/Assets/Scripts/UI/GamePanel/GamePanel_CheckMathAfterDis...

210 lines
9.8 KiB
C#

using CodeJay.Enum;
using UnityEngine;
public partial class GamePanel : MonoBehaviour
{
private enum ECheckDiscardMatchedState
{
CheckMatchedCardNumber,
CardSelectLogic,
WaitForCardSelect,
Complete
}
internal int _checkIndex = 0;
private ECheckDiscardMatchedState _checkMatchedDiscardState = ECheckDiscardMatchedState.CheckMatchedCardNumber;
private EEffectDirectType _checkDiscardEffectType = EEffectDirectType.Max;
private void InitCheckMatchedAfterDiscardData()
{
_checkIndex = 0;
_checkMatchedDiscardState = ECheckDiscardMatchedState.CheckMatchedCardNumber;
_checkDiscardEffectType = EEffectDirectType.Max;
}
private void CheckDiscardMatchedStateMachine()
{
switch (_checkMatchedDiscardState)
{
case ECheckDiscardMatchedState.CheckMatchedCardNumber:
{
if (_discardSlot == null)
{
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
break;
}
var matchedFloorCards = GetMatchedCardSlots(ECardLocationType.Floor, _discardSlot.MonthType);
// 제출 후 4장: 자뻑 / 뻑먹음
if (matchedFloorCards.Count == 4)
{
GameManager.Sound.PlaySFX(ESFXType.Card_Hit);
if (_useBomb)
{
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
_useBomb = false;
}
else
{
if (_dicBbug_State.ContainsKey(_discardSlot.MonthType))
{
// 뻑을 플레이어가 했다면
if (_dicBbug_State[_discardSlot.MonthType] == EBbugState.Player)
{
_checkDiscardEffectType = PlayerTurn ? EEffectDirectType.GetBbug_Own : EEffectDirectType.GetBbug;
_checkIndex = PlayerTurn ? 2 : 1;
}
// 뻑을 AI가 했다면
else if (_dicBbug_State[_discardSlot.MonthType] == EBbugState.AI)
{
_checkDiscardEffectType = PlayerTurn ? EEffectDirectType.GetBbug : EEffectDirectType.GetBbug_Own;
_checkIndex = PlayerTurn ? 1 : 2;
}
// 카드를 제출 후 4장이 된것이기 때문에 오류이다.
else
{
LogicalError($"{nameof(CheckDiscardMatchedStateMachine)} Logical Error");
}
}
else
{
_checkDiscardEffectType = EEffectDirectType.GetBbug;
_checkIndex = 1;
}
for (int i = 0; i < matchedFloorCards.Count; i++)
_lstAvailableCardTypes.Add(matchedFloorCards[i].CardType);
// 같이 있던 보너스카드도 가져온다.
if (_dicReservedBonusCard.ContainsKey(ECardType.Bonus_1))
{
if (_dicReservedBonusCard[ECardType.Bonus_1] == _discardSlot.MonthType)
_lstAvailableCardTypes.Add(ECardType.Bonus_1);
}
if (_dicReservedBonusCard.ContainsKey(ECardType.Bonus_2))
{
if (_dicReservedBonusCard[ECardType.Bonus_2] == _discardSlot.MonthType)
_lstAvailableCardTypes.Add(ECardType.Bonus_2);
}
if (_dicReservedBonusCard.ContainsKey(ECardType.Bonus_3))
{
if (_dicReservedBonusCard[ECardType.Bonus_3] == _discardSlot.MonthType)
_lstAvailableCardTypes.Add(ECardType.Bonus_3);
}
BringOtherPlayersPeeCard(_checkIndex, PlayerTurn);
_checkIndex = 0;
_delay = EffectPanel.Direct(_checkDiscardEffectType, PlayerTurn);
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
}
}
// 제출 후 3장: 카드 선택
else if (matchedFloorCards.Count == 3)
{
GameManager.Sound.PlaySFX(ESFXType.Card_Hit);
_delay = (CardSlot.TWEEN_DURATION * 1.25f) / GameSpeed;
_checkMatchedDiscardState = ECheckDiscardMatchedState.CardSelectLogic;
}
// 제출 후 2장: 바닥패와 매치됨.
else if (matchedFloorCards.Count == 2)
{
GameManager.Sound.PlaySFX(ESFXType.Card_Hit);
_lstAvailableCardTypes.Add(matchedFloorCards[0].CardType);
_lstAvailableCardTypes.Add(matchedFloorCards[1].CardType);
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
_delay = 0.05f;
}
// 바닥패와 매치되지 않음.
else if (matchedFloorCards.Count == 1)
{
GameManager.Sound.PlaySFX(ESFXType.Card_NoHit);
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
}
else
{
// _discardSlot이 Null인 경우는 패에서 Flip 카드를 냈을 때 밖에 없다.
if (_discardSlot != null)
LogicalError($"{nameof(CheckDiscardMatchedStateMachine)} Logical Error");
}
}
break;
case ECheckDiscardMatchedState.CardSelectLogic:
{
var matchedFloorCards = GetMatchedCardSlots(ECardLocationType.Floor, _discardSlot.MonthType);
ECardType leftCard = ECardType.Max;
ECardType rightCard = ECardType.Max;
for (int i = 0; i < matchedFloorCards.Count; i++)
{
if (matchedFloorCards[i].CardType == _discardSlot.CardType)
continue;
else
{
if (leftCard == ECardType.Max)
leftCard = matchedFloorCards[i].CardType;
else if (rightCard == ECardType.Max)
rightCard = matchedFloorCards[i].CardType;
else
break;
}
}
ECardScoreType leftScoreType = CodeJay.CodeJayUtility.Converter.CardTypeToScoreType(leftCard);
ECardScoreType rightScoreType = CodeJay.CodeJayUtility.Converter.CardTypeToScoreType(rightCard);
bool isDoublePee_left = CodeJay.CodeJayUtility.Utility.IsDoublePee(leftCard, UseSepYulgget_To_Pee);
bool isDoublePee_right = CodeJay.CodeJayUtility.Utility.IsDoublePee(rightCard, UseSepYulgget_To_Pee);
// 쌍피가 아니고 고를 카드가 둘 다 '피' 일 때
if (isDoublePee_left == false && isDoublePee_right == false && leftScoreType == ECardScoreType.Pee && rightScoreType == ECardScoreType.Pee)
{
CardSelectCallback_Discard(Random.Range(0, 2) == 0 ? leftCard : rightCard);
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
_delay = 0.2f;
}
else
{
if (PlayerTurn)
{
GameManager.UI.ShowNStackPopup<FloorCardSelectPopup>(EPopupType.FloorCardSelectPopup).SetData(leftCard, rightCard, this.CardSelectCallback_Discard);
_checkMatchedDiscardState = ECheckDiscardMatchedState.WaitForCardSelect;
_delay = 0.2f;
}
else
{
GameManager.UI.ShowNStackPopup<WaitForAIBehaviourPopup>(EPopupType.WaitForAIBehaviourPopup).SetData(1f);
CardSelectCallback_Discard(Random.Range(0, 2) > 0 ? leftCard : rightCard);
_delay = 1f;
_checkMatchedDiscardState = ECheckDiscardMatchedState.WaitForCardSelect;
}
}
}
break;
case ECheckDiscardMatchedState.WaitForCardSelect:
if (GameManager.UI.IsAnyPopupOpened() == false)
{
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
}
break;
case ECheckDiscardMatchedState.Complete:
{
_delay = 0.2f;
InitCheckMatchedAfterDiscardData();
CurrentCoroutineType = EGameWorkFlowType.FlipCenterCard;
}
break;
}
}
private void CardSelectCallback_Discard(ECardType type)
{
_lstAvailableCardTypes.Add(type);
_lstAvailableCardTypes.Add(_discardSlot.CardType);
}
}