-
Notifications
You must be signed in to change notification settings - Fork 0
/
Table.cs
131 lines (118 loc) · 4.53 KB
/
Table.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Cards;
using Commons;
using Commons.Events;
using UnityEngine;
namespace Tables
{
public class Table : MonoBehaviour
{
[SerializeField] private CardSo[] availableCards;
[SerializeField] private TableEventChannel tableEventChannel;
[SerializeField] private GameEventChannel gameEventChannel;
[SerializeField] private int cardsAmount;
[SerializeField] private float cardDealSpeedInSeconds;
[SerializeField] private AudioClip[] errorAudioClips;
[SerializeField] private AudioClip[] matchAudioClips;
[SerializeField] private GameInformation gameInformation;
[SerializeField] private GameObject gun;
private AudioSource _audioSource;
private int _cardsMatched;
private int _cardsReady;
private Coins[] _coins;
private int _currentCardUpIndex = -1;
private bool _isTableInitialized;
private bool _isMultiplayer;
private int _currentTurn = 1;
private Card[] Cards { get; set; }
private void Start()
{
_cardsMatched = 0;
Cards = GetComponentsInChildren<Card>();
_audioSource = GetComponent<AudioSource>();
_coins = GetComponentsInChildren<Coins>();
_isMultiplayer = gameInformation.numberOfPlayers > 1;
gun.SetActive(!_isMultiplayer);
_coins[1].gameObject.SetActive(_isMultiplayer);
ResetBoard();
}
public void SelectCard(int index)
{
Cards[index].OnPointerClick(null);
}
public void OnCardTurnedUp(int cardIndex)
{
if (_currentCardUpIndex < 0)
{
tableEventChannel.SetCardsInteractionActive(true);
_currentCardUpIndex = cardIndex;
}
else
{
var currentCardUp = Cards[_currentCardUpIndex];
var newCardUp = Cards[cardIndex];
tableEventChannel.SetCardsInteractionActive(false);
if (newCardUp.IsSameCardSo(currentCardUp))
{
_cardsMatched += 2;
currentCardUp.MarkCardAsMatched();
newCardUp.MarkCardAsMatched();
_audioSource.clip = matchAudioClips[Random.Range(0, matchAudioClips.Length)];
if (_cardsMatched >= cardsAmount) gameEventChannel.GameEnd(true);
}
else
{
currentCardUp.TurnCardDown();
newCardUp.TurnCardDown();
_coins[_currentTurn-1].RemoveCoin();
_audioSource.clip = errorAudioClips[Random.Range(0, errorAudioClips.Length)];
}
_audioSource.Play();
_currentCardUpIndex = -1;
if (_isMultiplayer) _currentTurn = _currentTurn == 1 ? 2 : 1;
}
}
public void OnCardReady()
{
_cardsReady++;
if (_isTableInitialized) return;
if (_cardsReady < cardsAmount) return;
tableEventChannel.SetCardsInteractionActive(true);
_isTableInitialized = true;
_cardsReady = 0;
}
private void ResetBoard()
{
foreach (var card in Cards) card.SetVisible(false);
_cardsReady = 0;
_isTableInitialized = false;
RandomizeCards();
StartCoroutine(DealCards());
}
private void RandomizeCards()
{
IList<CardSo> finalCards = new List<CardSo>(cardsAmount);
IList<CardSo> temporalAvailableCards = new List<CardSo>(availableCards);
for (var i = 0; i < cardsAmount; i += 2)
{
var availableCardIndex = Random.Range(0, temporalAvailableCards.Count);
var cardSo = temporalAvailableCards[availableCardIndex];
finalCards.Add(cardSo);
finalCards.Add(cardSo);
temporalAvailableCards.RemoveAt(availableCardIndex);
}
var shuffledCards = finalCards.OrderBy(_ => Random.value).ToList();
for (var i = 0; i < Cards.Length; i++) Cards[i].InitialData(i, shuffledCards[i], this);
}
private IEnumerator DealCards()
{
foreach (var card in Cards)
{
card.Initialize();
yield return new WaitForSeconds(cardDealSpeedInSeconds);
}
}
}
}