2025-08-27 21:08:17 +00:00
|
|
|
|
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);
|
|
|
|
|
|
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><> 4<><34>: <20>ڻ<EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-08-27 21:08:17 +00:00
|
|
|
|
if (matchedFloorCards.Count == 4)
|
|
|
|
|
|
{
|
|
|
|
|
|
GameManager.Sound.PlaySFX(ESFXType.Card_Hit);
|
|
|
|
|
|
|
|
|
|
|
|
if (_useBomb)
|
|
|
|
|
|
{
|
|
|
|
|
|
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
|
|
|
|
|
|
_useBomb = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_dicBbug_State.ContainsKey(_discardSlot.MonthType))
|
|
|
|
|
|
{
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾ <20>ߴٸ<DFB4>
|
2025-08-27 21:08:17 +00:00
|
|
|
|
if (_dicBbug_State[_discardSlot.MonthType] == EBbugState.Player)
|
|
|
|
|
|
{
|
|
|
|
|
|
_checkDiscardEffectType = PlayerTurn ? EEffectDirectType.GetBbug_Own : EEffectDirectType.GetBbug;
|
|
|
|
|
|
_checkIndex = PlayerTurn ? 2 : 1;
|
|
|
|
|
|
}
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20><><EFBFBD><EFBFBD> AI<41><49> <20>ߴٸ<DFB4>
|
2025-08-27 21:08:17 +00:00
|
|
|
|
else if (_dicBbug_State[_discardSlot.MonthType] == EBbugState.AI)
|
|
|
|
|
|
{
|
|
|
|
|
|
_checkDiscardEffectType = PlayerTurn ? EEffectDirectType.GetBbug : EEffectDirectType.GetBbug_Own;
|
|
|
|
|
|
_checkIndex = PlayerTurn ? 1 : 2;
|
|
|
|
|
|
}
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// ī<>带 <20><><EFBFBD><EFBFBD> <20><> 4<><34><EFBFBD><EFBFBD> <20>Ȱ<EFBFBD><C8B0>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
2025-08-27 21:08:17 +00:00
|
|
|
|
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);
|
|
|
|
|
|
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD>ī<EFBFBD>嵵 <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
2025-08-27 21:08:17 +00:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><> 3<><33>: ī<><C4AB> <20><><EFBFBD><EFBFBD>
|
2025-08-27 21:08:17 +00:00
|
|
|
|
else if (matchedFloorCards.Count == 3)
|
|
|
|
|
|
{
|
|
|
|
|
|
GameManager.Sound.PlaySFX(ESFXType.Card_Hit);
|
|
|
|
|
|
_delay = (CardSlot.TWEEN_DURATION * 1.25f) / GameSpeed;
|
|
|
|
|
|
_checkMatchedDiscardState = ECheckDiscardMatchedState.CardSelectLogic;
|
|
|
|
|
|
}
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><> 2<><32>: <20>ٴ<EFBFBD><D9B4>п<EFBFBD> <20><>ġ<EFBFBD><C4A1>.
|
2025-08-27 21:08:17 +00:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20>ٴ<EFBFBD><D9B4>п<EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
2025-08-27 21:08:17 +00:00
|
|
|
|
else if (matchedFloorCards.Count == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
GameManager.Sound.PlaySFX(ESFXType.Card_NoHit);
|
|
|
|
|
|
_checkMatchedDiscardState = ECheckDiscardMatchedState.Complete;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// _discardSlot<6F><74> Null<6C><6C> <20><><EFBFBD><EFBFBD> <20>п<EFBFBD><D0BF><EFBFBD> Flip ī<>带 <20><><EFBFBD><EFBFBD> <20><> <20>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
2025-08-27 21:08:17 +00:00
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
2025-09-10 23:31:41 +00:00
|
|
|
|
// <20><><EFBFBD>ǰ<EFBFBD> <20>ƴϰ<C6B4> <20><><EFBFBD> ī<>尡 <20><> <20><> '<27><>' <20><> <20><>
|
2025-08-27 21:08:17 +00:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|