feat: waiting for all propositions on PC & add some SFX
This commit is contained in:
parent
a19f158828
commit
09f06fb715
BIN
Assets/Audio SFX/camera-flash-sound-effect.mp3
(Stored with Git LFS)
Normal file
BIN
Assets/Audio SFX/camera-flash-sound-effect.mp3
(Stored with Git LFS)
Normal file
Binary file not shown.
23
Assets/Audio SFX/camera-flash-sound-effect.mp3.meta
Normal file
23
Assets/Audio SFX/camera-flash-sound-effect.mp3.meta
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b4d0bdddc893f476a8eb330e58108608
|
||||||
|
AudioImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 7
|
||||||
|
defaultSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
loadType: 0
|
||||||
|
sampleRateSetting: 0
|
||||||
|
sampleRateOverride: 44100
|
||||||
|
compressionFormat: 1
|
||||||
|
quality: 1
|
||||||
|
conversionMode: 0
|
||||||
|
preloadAudioData: 0
|
||||||
|
platformSettingOverrides: {}
|
||||||
|
forceToMono: 0
|
||||||
|
normalize: 1
|
||||||
|
loadInBackground: 0
|
||||||
|
ambisonic: 0
|
||||||
|
3D: 1
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -15,9 +15,8 @@ public class RoomManager : MonoBehaviour
|
|||||||
/// TextMeshPro that show the value of the current rooom code
|
/// TextMeshPro that show the value of the current rooom code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public TextMeshProUGUI roomCodeLabel;
|
public TextMeshProUGUI roomCodeLabel;
|
||||||
|
public AudioClip playerJoinSFX;
|
||||||
public List<TextMeshProUGUI> waitingForPlayersLabels = new List<TextMeshProUGUI>();
|
public List<TextMeshProUGUI> waitingForPlayersLabels = new List<TextMeshProUGUI>();
|
||||||
private Dictionary<string, TextMeshProUGUI> waitingPlayersById = new Dictionary<string, TextMeshProUGUI>();
|
|
||||||
public PromptList promptList;
|
|
||||||
|
|
||||||
[Header("Explanation Page")]
|
[Header("Explanation Page")]
|
||||||
public GameObject explanationPage;
|
public GameObject explanationPage;
|
||||||
@ -31,10 +30,13 @@ public class RoomManager : MonoBehaviour
|
|||||||
public TextMeshProUGUI propositionCounter;
|
public TextMeshProUGUI propositionCounter;
|
||||||
public float propositionTime = 60;
|
public float propositionTime = 60;
|
||||||
public List<TextMeshProUGUI> waitingForPropositionsLabels = new List<TextMeshProUGUI>();
|
public List<TextMeshProUGUI> waitingForPropositionsLabels = new List<TextMeshProUGUI>();
|
||||||
|
private Dictionary<string, TextMeshProUGUI> propositionLabelsByID = new Dictionary<string, TextMeshProUGUI>();
|
||||||
private DateTime endOfPropositionDate = DateTime.MinValue;
|
private DateTime endOfPropositionDate = DateTime.MinValue;
|
||||||
private bool allPlayersHasProposedTwoPictures = false;
|
private bool allPlayersHasProposedTwoPictures = false;
|
||||||
|
private Dictionary<string, Proposition[]> propositionsPerPlayers = new Dictionary<string, Proposition[]>();
|
||||||
|
|
||||||
[Header("Other")]
|
[Header("Other")]
|
||||||
|
public PromptList promptList;
|
||||||
private Room myRoom = null;
|
private Room myRoom = null;
|
||||||
public float votingTime = 20;
|
public float votingTime = 20;
|
||||||
|
|
||||||
@ -94,13 +96,34 @@ private void Update()
|
|||||||
TimeSpan duration = endOfPropositionDate - DateTime.Now;
|
TimeSpan duration = endOfPropositionDate - DateTime.Now;
|
||||||
propositionCounter.text = ((int)duration.TotalSeconds).ToString("D1");
|
propositionCounter.text = ((int)duration.TotalSeconds).ToString("D1");
|
||||||
|
|
||||||
foreach (TextMeshProUGUI tmp in waitingForPropositionsLabels)
|
//foreach labels
|
||||||
|
foreach (var labelByID in propositionLabelsByID)
|
||||||
{
|
{
|
||||||
if (tmp.gameObject.activeSelf)
|
//if the label is connected to a player
|
||||||
|
if (labelByID.Value.gameObject.activeSelf)
|
||||||
{
|
{
|
||||||
|
//check if this player has send 2 propositions
|
||||||
|
bool playerHasAnswerBoth = true;
|
||||||
|
foreach (Proposition p in propositionsPerPlayers[labelByID.Key])
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(p.photoUrl))
|
||||||
|
{
|
||||||
|
playerHasAnswerBoth = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//if its the case
|
||||||
|
if (playerHasAnswerBoth)
|
||||||
|
{
|
||||||
|
//put player label in green if finished
|
||||||
|
labelByID.Value.color = Color.green;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allPlayersHasProposedTwoPictures || duration.TotalMilliseconds <= 0)
|
||||||
|
{
|
||||||
|
SendRoomState(GameState.MakeVote);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +134,6 @@ private void SendRoomState(GameState _newState)
|
|||||||
|
|
||||||
private void ResetAllPlayerLabels()
|
private void ResetAllPlayerLabels()
|
||||||
{
|
{
|
||||||
waitingPlayersById.Clear();
|
|
||||||
for (int i = 0; i < waitingForPlayersLabels.Count; i++)
|
for (int i = 0; i < waitingForPlayersLabels.Count; i++)
|
||||||
{
|
{
|
||||||
waitingForPlayersLabels[i].text = $"Waiting for P{i + 1}";
|
waitingForPlayersLabels[i].text = $"Waiting for P{i + 1}";
|
||||||
@ -226,11 +248,6 @@ private int GenerateRandomAvailableCode(List<int> _impossibleCodes)
|
|||||||
return random;
|
return random;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PlayerSendProposition(Proposition _proposition)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called when the first player clicked "Start"
|
/// Called when the first player clicked "Start"
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -240,54 +257,31 @@ public void HostHasStartedGame()
|
|||||||
waitingForPlayersPage.SetActive(false);
|
waitingForPlayersPage.SetActive(false);
|
||||||
endOfPropositionDate = DateTime.Now.AddSeconds(propositionTime);
|
endOfPropositionDate = DateTime.Now.AddSeconds(propositionTime);
|
||||||
|
|
||||||
|
propositionLabelsByID.Clear();
|
||||||
|
|
||||||
|
//display only correct numbers of labels
|
||||||
for (int i = 0; i < waitingForPropositionsLabels.Count; i++)
|
for (int i = 0; i < waitingForPropositionsLabels.Count; i++)
|
||||||
{
|
{
|
||||||
TextMeshProUGUI tmp = waitingForPropositionsLabels[i];
|
TextMeshProUGUI tmp = waitingForPropositionsLabels[i];
|
||||||
tmp.gameObject.SetActive(i < myRoom.players.Count);
|
tmp.gameObject.SetActive(i < myRoom.players.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//registers the labels per player ID
|
||||||
|
List<Player> orderedPlayers = myRoom.GetPlayerList().OrderBy(x => x.creationDate).ToList();
|
||||||
|
for (int i = 0; i < orderedPlayers.Count; i++)
|
||||||
|
{
|
||||||
|
propositionLabelsByID.Add(orderedPlayers[i].id, waitingForPropositionsLabels[i]);
|
||||||
|
waitingForPlayersLabels[i].text = orderedPlayers[i].name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
//Register all propositions of each players
|
||||||
/// Start the proposition timer
|
foreach (Player p in myRoom.GetOrderedPlayerList())
|
||||||
/// </summary>
|
|
||||||
public void StartPropositionTimer()
|
|
||||||
{
|
{
|
||||||
|
List<Proposition> propositionsForPlayer = myRoom.GetPropositionsByPlayer(p);
|
||||||
|
propositionsPerPlayers.Add(p.id, propositionsForPlayer.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Automatically called when the proposition timer has finished
|
|
||||||
/// </summary>
|
|
||||||
public void PropositionTimerFinished()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Start the voting timer
|
|
||||||
/// </summary>
|
|
||||||
public void StartVotingTimer()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Automatically called when the voting timer has finished
|
|
||||||
/// </summary>
|
|
||||||
public void VotingTimerFinished()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Automatically called when a proposition is updated (someone has voted or a picture has been proposed)
|
|
||||||
/// </summary>
|
|
||||||
public void OnPropositionUpdate()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GeneratePrompts()
|
public void GeneratePrompts()
|
||||||
@ -347,8 +341,14 @@ private void OnRoomUpdate(object sender, ValueChangedEventArgs value)
|
|||||||
Debug.LogError(value.DatabaseError.Message);
|
Debug.LogError(value.DatabaseError.Message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (value.Snapshot.Value == null)
|
||||||
|
{
|
||||||
|
Debug.Log("Trying to update room, but it's empty. Maybe you are exiting the app, so it's ok", this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
string JSON = value.Snapshot.GetRawJsonValue();
|
string JSON = value.Snapshot.GetRawJsonValue();
|
||||||
Debug.Log($"your room has been updated :\n{JSON}");
|
Debug.Log($"your room has been updated :\n{JSON}");
|
||||||
|
GameState lastState = (GameState)myRoom.currentState;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
myRoom = JsonConvert.DeserializeObject<Room>(JSON);
|
myRoom = JsonConvert.DeserializeObject<Room>(JSON);
|
||||||
@ -358,19 +358,50 @@ private void OnRoomUpdate(object sender, ValueChangedEventArgs value)
|
|||||||
Debug.LogException(ex);
|
Debug.LogException(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this is done only when entering a new state
|
||||||
|
if (lastState != (GameState)myRoom.currentState)
|
||||||
|
{
|
||||||
|
OnNewGameStateStarted();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//this is done each time something change
|
||||||
switch (myRoom.currentState)
|
switch (myRoom.currentState)
|
||||||
{
|
{
|
||||||
case (int)GameState.WaitingForOtherPlayersToJoin:
|
case (int)GameState.WaitingForOtherPlayersToJoin:
|
||||||
UpdateConnectedPlayerList(myRoom.GetPlayerList());
|
UpdateConnectedPlayerList(myRoom.GetPlayerList());
|
||||||
break;
|
break;
|
||||||
case (int)GameState.Explanation:
|
case (int)GameState.Explanation:
|
||||||
|
break;
|
||||||
|
case (int)GameState.MakeProposition:
|
||||||
|
CheckPlayersPropositions();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when we enter in a new game state
|
||||||
|
/// </summary>
|
||||||
|
private void OnNewGameStateStarted()
|
||||||
|
{
|
||||||
|
switch (myRoom.currentState)
|
||||||
|
{
|
||||||
|
case (int)GameState.WaitingForOtherPlayersToJoin:
|
||||||
|
Debug.Log("New State : WaitingForOtherPlayersToJoin");
|
||||||
|
break;
|
||||||
|
case (int)GameState.Explanation:
|
||||||
|
Debug.Log("New State : Explanation");
|
||||||
waitingForPlayersPage.SetActive(false);
|
waitingForPlayersPage.SetActive(false);
|
||||||
explanationPage.SetActive(true);
|
explanationPage.SetActive(true);
|
||||||
endOfExplanationDate = DateTime.Now.AddSeconds(explanationTime);
|
endOfExplanationDate = DateTime.Now.AddSeconds(explanationTime);
|
||||||
AudioSource.PlayClipAtPoint(counterSFX, Vector3.zero);
|
AudioSource.PlayClipAtPoint(counterSFX, Vector3.zero);
|
||||||
break;
|
break;
|
||||||
case (int)GameState.MakeProposition:
|
case (int)GameState.MakeProposition:
|
||||||
|
Debug.Log("New State : MakeProposition");
|
||||||
HostHasStartedGame();
|
HostHasStartedGame();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -378,19 +409,37 @@ private void OnRoomUpdate(object sender, ValueChangedEventArgs value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Will update allPlayersHasProposedTwoPictures to true or false
|
||||||
|
/// </summary>
|
||||||
|
private void CheckPlayersPropositions()
|
||||||
|
{
|
||||||
|
allPlayersHasProposedTwoPictures = true;
|
||||||
|
|
||||||
|
foreach (var propositionsByPlayer in propositionsPerPlayers)
|
||||||
|
{
|
||||||
|
foreach (Proposition p in propositionsByPlayer.Value)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(p.photoUrl))
|
||||||
|
allPlayersHasProposedTwoPictures = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the player labels on the WaitingForPlayer page
|
/// Update the player labels on the WaitingForPlayer page
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="_players"></param>
|
/// <param name="_players"></param>
|
||||||
private void UpdateConnectedPlayerList(List<Player> _players)
|
private void UpdateConnectedPlayerList(List<Player> _players)
|
||||||
{
|
{
|
||||||
|
AudioSource.PlayClipAtPoint(playerJoinSFX, Vector3.zero);
|
||||||
ResetAllPlayerLabels();
|
ResetAllPlayerLabels();
|
||||||
|
|
||||||
Debug.Log($"players count = {_players.Count}");
|
Debug.Log($"players count = {_players.Count}");
|
||||||
List<Player> orderedPlayers = _players.OrderBy(x => x.creationDate).ToList();
|
List<Player> orderedPlayers = _players.OrderBy(x => x.creationDate).ToList();
|
||||||
for (int i = 0; i < orderedPlayers.Count; i++)
|
for (int i = 0; i < orderedPlayers.Count; i++)
|
||||||
{
|
{
|
||||||
waitingPlayersById.Add(orderedPlayers[i].id, waitingForPlayersLabels[i]);
|
|
||||||
Debug.Log($"player {i} = {orderedPlayers[i].name}");
|
Debug.Log($"player {i} = {orderedPlayers[i].name}");
|
||||||
waitingForPlayersLabels[i].text = orderedPlayers[i].name;
|
waitingForPlayersLabels[i].text = orderedPlayers[i].name;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user