Advertisement
UraniumGames

Game

Dec 18th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 58.64 KB | None | 0 0
  1. using NUnit.Framework.Interfaces;
  2. using Photon.Pun;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using BEKStudio;
  6. using TMPro;
  7. using UnityEngine;
  8. using UnityEngine.SceneManagement;
  9. using UnityEngine.UI;
  10.  
  11. namespace BEKStudio{
  12.     public class GameController : MonoBehaviour{
  13.         public static GameController Instance;
  14.  
  15.         public enum GameState{
  16.             READY,
  17.             WAIT,
  18.             SWITCH_MASTER,
  19.             WIN,
  20.             LOSE
  21.         };
  22.  
  23.         public GameState gameState;
  24.         public Rigidbody2D playerPuck;
  25.         public PhotonView playerPhotonView;
  26.         public List<GameObject> homePucksCollected;
  27.         public List<GameObject> awayPucksCollected;
  28.         public List<GameObject> pucksCollected;
  29.         public Sprite[] avatars;
  30.         [Header("Top")]
  31.         public TextMeshProUGUI topTotalBetText;
  32.         public Image topHomeAvatar;
  33.         public Image topHomeAvatarTimer;
  34.         public TextMeshProUGUI topHomeNameText;
  35.         public TextMeshProUGUI topHomeScoreText;
  36.         public Image topAwayAvatar;
  37.         public Image topAwayAvatarTimer;
  38.         public TextMeshProUGUI topAwayNameText;
  39.         public TextMeshProUGUI topAwayScoreText;
  40.         public Transform topCoinParentForAnim;
  41.         [Header("Toast Message")]
  42.         public GameObject toastMessage;
  43.         public TextMeshProUGUI toastMessageText;
  44.         [Header("Settings")]
  45.         public GameObject settingsScreen;
  46.         public Image settingsBackground;
  47.         public RectTransform settingsContinue;
  48.         public RectTransform settingsMenu;
  49.         public Slider playerSlider;
  50.         public Slider opponentSlider;
  51.         [Header("Puck")]
  52.         public Puck[] allPucks;
  53.         public float playerPuckMinX;
  54.         public float playerPuckMaxX;
  55.         [Header("Others")]
  56.         public bool isPucksFixed;
  57.         public bool shootAgain;
  58.         string targetTag;
  59.         public string masterClientTag;
  60.         public float timer;
  61.         public bool reduceTimer;
  62.         public GameObject redPuck;
  63.         public GameObject statusScreen;
  64.         public Image statusBackground;
  65.         public RectTransform statusPanel;
  66.         public TextMeshProUGUI statusPanelText;
  67.         public bool redPuckCollected;
  68.         public bool practiceMode;
  69.         public bool redPuckWaiting;
  70.  
  71.  
  72.         void Awake(){
  73.             if (Instance == null){
  74.                 Instance = this;
  75.             }
  76.         }
  77.  
  78.         void Start(){
  79.             masterClientTag = "White";
  80.             CheckTurn();
  81.            
  82.             homePucksCollected = new List<GameObject>();
  83.             awayPucksCollected = new List<GameObject>();
  84.             pucksCollected = new List<GameObject>();
  85.  
  86.             targetTag = (string)PhotonNetwork.LocalPlayer.CustomProperties["tag"];
  87.            
  88.             redPuck.SetActive(PhotonController.Instance.whichMode == "carrom");
  89.  
  90.             topTotalBetText.text = (PhotonController.Instance.roomEntryPice * 2).ToString("###,###,###");
  91.  
  92.             if (PhotonNetwork.PlayerList.Length == 2){
  93.                 topHomeNameText.text = PhotonNetwork.PlayerList[0].NickName;
  94.                 topHomeAvatar.sprite = avatars[(int)PhotonNetwork.PlayerList[0].CustomProperties["avatar"]];
  95.                 topAwayNameText.text = PhotonNetwork.PlayerList[1].NickName;
  96.                 topAwayAvatar.sprite = avatars[(int)PhotonNetwork.PlayerList[1].CustomProperties["avatar"]];
  97.             } else{
  98.                 topHomeNameText.text = PhotonNetwork.PlayerList[0].NickName;
  99.                 topHomeAvatar.sprite = avatars[(int)PhotonNetwork.PlayerList[0].CustomProperties["avatar"]];
  100.                 topAwayNameText.text = "";
  101.                 topAwayAvatar.sprite = null;
  102.             }
  103.  
  104.             if (practiceMode){
  105.                 topTotalBetText.text = "0";
  106.                 topAwayNameText.transform.parent.gameObject.SetActive(false);
  107.                 topHomeScoreText.transform.parent.gameObject.SetActive(false);
  108.             }
  109.  
  110.             isPucksFixed = true;
  111.  
  112.             StartMessage();
  113.         }
  114.  
  115.         void StartMessage(){
  116.             if (practiceMode){
  117.                 statusPanelText.text = "YOU START";
  118.                 toastMessageText.text = "Practice Mode";
  119.             } else if (targetTag == "White"){
  120.                 statusPanelText.text = "YOU START";
  121.                 toastMessageText.text = "Pot all white pucks to win the match";
  122.             } else if (targetTag == "Black"){
  123.                 statusPanelText.text = "OPPONENT START";
  124.                 toastMessageText.text = "Pot all black pucks to win the match";
  125.             }
  126.  
  127.             statusPanel.anchoredPosition = new Vector2(-940f, statusPanel.anchoredPosition.y);
  128.             statusBackground.color = new Color(0, 0, 0, 0);
  129.             statusScreen.SetActive(true);
  130.  
  131.             LeanTween.alpha(statusBackground.GetComponent<RectTransform>(), 0.5f, 0.5f);
  132.             LeanTween.move(statusPanel, new Vector2(0, statusPanel.anchoredPosition.y), 0.3f).setDelay(0.5f)
  133.                 .setEase(LeanTweenType.easeOutBack).setOnComplete(() => {
  134.                     LeanTween.move(statusPanel, new Vector2(940, statusPanel.anchoredPosition.y), 0.3f).setDelay(1f)
  135.                         .setEase(LeanTweenType.easeInBack).setOnComplete(
  136.                             () => { statusScreen.SetActive(false); });
  137.                 });
  138.         }
  139.  
  140.         void Update(){
  141.             if (practiceMode) return;
  142.  
  143.             RunTimer();
  144.         }
  145.  
  146.         void FixedUpdate(){
  147.             if (gameState == GameState.READY || gameState == GameState.WAIT){
  148.                 isPucksFixed = GetPuckStatus();
  149.             }
  150.         }
  151.  
  152.         void RunTimer(){
  153.             if (gameState != GameState.READY) return;
  154.  
  155.             if (reduceTimer){
  156.                 timer -= 1 * Time.deltaTime;
  157.             }
  158.  
  159.             if (PhotonNetwork.InRoom){
  160.                 if (masterClientTag == "White"){
  161.                     topHomeAvatarTimer.fillAmount = Mathf.InverseLerp(0, Constants.PLAY_TIME_FOR_PLAYER, timer);
  162.                 } else{
  163.                     topAwayAvatarTimer.fillAmount = Mathf.InverseLerp(0, Constants.PLAY_TIME_FOR_PLAYER, timer);
  164.                 }
  165.             }
  166.  
  167.             if (timer <= 0 && playerPhotonView.IsMine){
  168.                 gameState = GameState.WAIT;
  169.                 PlayerPuck.Instance.isTouch = false;
  170.                 PlayerPuck.Instance.arrow.SetActive(false);
  171.                 PlayerPuck.Instance.tutorial.SetActive(false);
  172.                 PlayerPuck.Instance.tutorialShowDelay = 2f;
  173.                 shootAgain = false;
  174.  
  175.                 StartCoroutine(WaitForPucks());
  176.             }
  177.         }
  178.  
  179.         public void SettingsBtn(){
  180.             if (gameState == GameState.WIN || gameState == GameState.LOSE) return;
  181.  
  182.             settingsContinue.anchoredPosition = new Vector2(-940f, settingsContinue.anchoredPosition.y);
  183.             settingsMenu.anchoredPosition = new Vector2(-940f, settingsMenu.anchoredPosition.y);
  184.             settingsBackground.color = new Color(0, 0, 0, 0);
  185.             settingsScreen.SetActive(true);
  186.  
  187.             LeanTween.alpha(settingsBackground.GetComponent<RectTransform>(), 0.75f, 0.25f);
  188.             LeanTween.move(settingsContinue, new Vector2(0, settingsContinue.anchoredPosition.y), 0.3f).setDelay(0.25f)
  189.                 .setEase(LeanTweenType.easeOutBack);
  190.             LeanTween.move(settingsMenu, new Vector2(0, settingsMenu.anchoredPosition.y), 0.3f).setDelay(0.5f)
  191.                 .setEase(LeanTweenType.easeOutBack);
  192.         }
  193.  
  194.         public void SettingsContinueBtn(){
  195.             settingsScreen.SetActive(false);
  196.         }
  197.  
  198.         public void SettingsMenuBtn(){
  199.             settingsContinue.GetComponent<Button>().interactable = false;
  200.             settingsMenu.GetComponent<Button>().interactable = false;
  201.  
  202.             PhotonNetwork.AutomaticallySyncScene = false;
  203.             AdsManager.Instance.ShowInterstitialAd();
  204.             if (PhotonNetwork.InRoom){
  205.                 PhotonNetwork.LeaveRoom();
  206.             }
  207.         }
  208.  
  209.         public void Shoot(){
  210.             playerSlider.interactable = false;
  211.             if (opponentSlider != null){
  212.                 opponentSlider.interactable = false;
  213.             }
  214.  
  215.             shootAgain = false;
  216.             gameState = GameState.WAIT;
  217.  
  218.             playerSlider.value = 0.5f;
  219.             if (opponentSlider != null){
  220.                 opponentSlider.value = 0.5f;
  221.             }
  222.  
  223.             StartCoroutine(WaitForPucks());
  224.         }
  225.  
  226.         public void NavigatorSliderValueChanged(){
  227.             if (!playerPhotonView.IsMine || gameState != GameState.READY) return;
  228.  
  229.             playerPuck.transform.localPosition = new Vector2(Mathf.Lerp(playerPuckMinX, playerPuckMaxX, playerSlider.value),playerPuck.transform.localPosition.y);
  230.         }
  231.  
  232.         bool GetPuckStatus(){
  233.             for (int i = 0; i < allPucks.Length; i++){
  234.                 if (allPucks[i].isMoving){
  235.                     reduceTimer = false;
  236.                     return false;
  237.                 }
  238.             }
  239.  
  240.             if (PlayerPuck.Instance.isMoving){
  241.                 return false;
  242.             }
  243.  
  244.             return true;
  245.         }
  246.  
  247.         public void CheckTurn(){
  248.             redPuckWaiting = false;
  249.             reduceTimer = true;
  250.             timer = Constants.PLAY_TIME_FOR_PLAYER;
  251.             topHomeAvatarTimer.fillAmount = 0;
  252.             topAwayAvatarTimer.fillAmount = 0;
  253.  
  254.             if (PhotonNetwork.IsMasterClient){
  255.                 PlayerPuck.Instance.ResetPosition();
  256.                
  257.                 playerSlider.interactable = true;
  258.                 if (opponentSlider != null){
  259.                     opponentSlider.interactable = false;
  260.                 }
  261.             } else{
  262.                 playerSlider.interactable = false;
  263.                 if (opponentSlider != null){
  264.                     opponentSlider.interactable = true;
  265.                 }
  266.             }
  267.  
  268.             gameState = GameState.READY;
  269.  
  270.             if (practiceMode){
  271.                 allPucks[0].ResetPosition();
  272.             }
  273.  
  274.             for (int i = 0; i < allPucks.Length; i++){
  275.                 allPucks[i].GetComponent<CircleCollider2D>().enabled = true;
  276.             }
  277.         }
  278.  
  279.         public void PuckOnHole(string puckTag, string puckName){
  280.             if (practiceMode) return;
  281.             if(gameState == GameState.WIN || gameState == GameState.LOSE) return;
  282.            
  283.             if (puckTag == "Player"){
  284.                 pucksCollected.Add(playerPuck.gameObject);
  285.             } else {
  286.                 Puck getPuck = getPuckFromList(puckName);
  287.                 if (getPuck != null){
  288.                     pucksCollected.Add(getPuck.gameObject);
  289.                 }
  290.             }
  291.         }
  292.  
  293.         Puck getPuckFromList(string puckName){
  294.             for (int i = 0; i < allPucks.Length; i++){
  295.                 if (allPucks[i].name == puckName){
  296.                     return allPucks[i];
  297.                 }
  298.             }
  299.  
  300.             return null;
  301.         }
  302.  
  303.         IEnumerator WaitForPucks(){
  304.             yield return new WaitForSecondsRealtime(1f);
  305.             yield return new WaitUntil(() => isPucksFixed);
  306.             yield return new WaitForSecondsRealtime(1f);
  307.  
  308.             CheckGameStatus();
  309.         }
  310.  
  311.         void CheckGameStatus(){
  312.             if (pucksCollected.Contains(playerPuck.gameObject)){
  313.                 CheckPlayerPenalty();
  314.             } else if (pucksCollected.Contains(redPuck)){
  315.                 CheckRedPuckPenalty();
  316.             } else {
  317.                 CheckPucks();
  318.             }
  319.            
  320.             playerPuck.GetComponent<PlayerPuck>().ResetPosition();
  321.            
  322.             UpdateScoreText();
  323.  
  324.             if (practiceMode){
  325.                 CheckTurn();
  326.                 return;
  327.             }
  328.  
  329.             if (PhotonController.Instance.whichMode == "disc"){
  330.                 if (homePucksCollected.Count == 2){
  331.                     gameState = targetTag == "White" ? GameState.WIN : GameState.LOSE;
  332.                 } else if (awayPucksCollected.Count == 2){
  333.                     gameState = targetTag == "Black" ? GameState.WIN : GameState.LOSE;
  334.                 }
  335.             } else if (PhotonController.Instance.whichMode == "carrom"){
  336.                 if (redPuckCollected){
  337.                     if (homePucksCollected.Count == 2){
  338.                         gameState = targetTag == "White" ? GameState.WIN : GameState.LOSE;
  339.                     } else if (awayPucksCollected.Count == 2){
  340.                         gameState = targetTag == "Black" ? GameState.WIN : GameState.LOSE;
  341.                     }
  342.                 }
  343.             }
  344.  
  345.             if (gameState == GameState.WIN || gameState == GameState.LOSE){
  346.                 GameOver();
  347.                 return;
  348.             }
  349.  
  350.             PlayerPuck.Instance.ResetPosition();
  351.             reduceTimer = true;
  352.  
  353.             if (gameState == GameState.WAIT && playerPhotonView.IsMine){
  354.                 if (!shootAgain){
  355.                     gameState = GameState.SWITCH_MASTER;
  356.                     StartCoroutine(SwitchMasterDelay());
  357.                 } else{
  358.                     playerSlider.interactable = true;
  359.                     gameState = GameState.READY;
  360.                 }
  361.             } else{
  362.                 gameState = GameState.READY;
  363.             }
  364.         }
  365.  
  366.         IEnumerator SwitchMasterDelay(){
  367.             yield return new WaitForSecondsRealtime(1.5f);
  368.             PhotonNetwork.SetMasterClient(PhotonNetwork.MasterClient.GetNext());
  369.         }
  370.  
  371.         void CheckPlayerPenalty(){
  372.             if (pucksCollected.Contains(redPuck)){
  373.                 pucksCollected.Remove(redPuck);
  374.                 redPuck.GetComponent<Puck>().ResetPosition();
  375.             }
  376.            
  377.             for (int i = 0; i < pucksCollected.Count; i++){
  378.                 GameObject targetPuck = pucksCollected[i];
  379.                
  380.                 if(targetPuck.CompareTag("Player")) continue;
  381.                
  382.                 if (targetPuck.CompareTag(masterClientTag)){
  383.                     targetPuck.GetComponent<Puck>().ResetPosition();
  384.                 } else {
  385.                     if (masterClientTag == "White"){
  386.                         if (awayPucksCollected.Count < 2){
  387.                             awayPucksCollected.Add(targetPuck);
  388.                         }
  389.                     } else {
  390.                         if (homePucksCollected.Count < 2){
  391.                             homePucksCollected.Add(targetPuck);
  392.                         }
  393.                     }
  394.                    
  395.                     targetPuck.GetComponent<Puck>().ResetPosition();
  396.                 }
  397.             }
  398.            
  399.             pucksCollected.Clear();
  400.            
  401.             if (masterClientTag == "White"){
  402.                 if (homePucksCollected.Count > 0){
  403.                     GameObject targetPuck = homePucksCollected[0];
  404.                     homePucksCollected.Remove(targetPuck);
  405.                     targetPuck.GetComponent<Puck>().ResetPosition();
  406.                 }
  407.             } else {
  408.                 if (awayPucksCollected.Count > 0){
  409.                     GameObject targetPuck = awayPucksCollected[0];
  410.                     awayPucksCollected.Remove(targetPuck);
  411.                     targetPuck.GetComponent<Puck>().ResetPosition();
  412.                 }
  413.             }
  414.         }
  415.  
  416.         void CheckRedPuckPenalty(){
  417.             if (pucksCollected.Count == 1){
  418.                 redPuckWaiting = true;
  419.                 shootAgain = true;
  420.                 pucksCollected.Remove(redPuck);
  421.                 return;
  422.             }
  423.            
  424.             for (int i = 0; i < pucksCollected.Count; i++){
  425.                 GameObject targetPuck = pucksCollected[i];
  426.                
  427.                 if(targetPuck.CompareTag("Player")) continue;
  428.                
  429.                 targetPuck.GetComponent<Puck>().ResetPosition();
  430.             }
  431.            
  432.             pucksCollected.Clear();
  433.         }
  434.  
  435.         void CheckPucks(){
  436.             bool tempRedPuckWaiting = redPuckWaiting;
  437.            
  438.             if (pucksCollected.Count == 0){
  439.                 if (redPuckWaiting){
  440.                     redPuckWaiting = false;
  441.                     redPuck.GetComponent<Puck>().ResetPosition();
  442.                 }
  443.                 return;
  444.             }
  445.            
  446.             for (int i = 0; i < pucksCollected.Count; i++){
  447.                 var targetPuck = pucksCollected[i];
  448.  
  449.                 if (targetPuck.CompareTag(masterClientTag)){
  450.                     shootAgain = true;
  451.                 }
  452.  
  453.                 if (PhotonController.Instance.whichMode == "carrom"){
  454.                     if (masterClientTag == "White"){
  455.                         if (targetPuck.CompareTag("White")){
  456.                             if (tempRedPuckWaiting){
  457.                                 redPuckCollected = true;
  458.                                 tempRedPuckWaiting = false;
  459.                             }
  460.                            
  461.                             if (homePucksCollected.Count == 1 && !redPuckCollected){
  462.                                 targetPuck.GetComponent<Puck>().ResetPosition();
  463.                             } else {
  464.                                 homePucksCollected.Add(targetPuck);
  465.                             }
  466.                         } else {
  467.                             if (tempRedPuckWaiting){
  468.                                 tempRedPuckWaiting = false;
  469.                                 redPuck.GetComponent<Puck>().ResetPosition();
  470.                                 targetPuck.GetComponent<Puck>().ResetPosition();
  471.                             } else {
  472.                                 if (awayPucksCollected.Count == 1){
  473.                                     if (redPuckCollected){
  474.                                         awayPucksCollected.Add(targetPuck);
  475.                                     } else {
  476.                                         targetPuck.GetComponent<Puck>().ResetPosition();
  477.                                     }
  478.                                 } else{
  479.                                     awayPucksCollected.Add(targetPuck);
  480.                                 }
  481.                             }
  482.                         }
  483.                     } else if (masterClientTag == "Black"){
  484.                         if (targetPuck.CompareTag("Black")){
  485.                             if (tempRedPuckWaiting){
  486.                                 redPuckCollected = true;
  487.                                 tempRedPuckWaiting = false;
  488.                             }
  489.                             if (awayPucksCollected.Count == 1 && !redPuckCollected){
  490.                                 targetPuck.GetComponent<Puck>().ResetPosition();
  491.                             } else {
  492.                                 awayPucksCollected.Add(targetPuck);
  493.                             }
  494.                         } else {
  495.                             if (tempRedPuckWaiting){
  496.                                 tempRedPuckWaiting = false;
  497.                                 redPuck.GetComponent<Puck>().ResetPosition();
  498.                                 targetPuck.GetComponent<Puck>().ResetPosition();
  499.                             } else {
  500.                                 if (homePucksCollected.Count == 1){
  501.                                     if (redPuckCollected){
  502.                                         homePucksCollected.Add(targetPuck);
  503.                                     } else {
  504.                                         targetPuck.GetComponent<Puck>().ResetPosition();
  505.                                     }
  506.                                 } else{
  507.                                     homePucksCollected.Add(targetPuck);
  508.                                 }
  509.                             }
  510.                         }
  511.                     }
  512.                 } else {
  513.                     if (targetPuck.CompareTag("White")){
  514.                         homePucksCollected.Add(targetPuck);
  515.                     } else if (targetPuck.CompareTag("Black")){
  516.                         awayPucksCollected.Add(targetPuck);
  517.                     }
  518.                 }
  519.             }
  520.             pucksCollected.Clear();
  521.             redPuckWaiting = tempRedPuckWaiting;
  522.         }
  523.  
  524.         void UpdateScoreText(){
  525.             if (homePucksCollected.Contains(redPuck)){
  526.                 topHomeScoreText.text = (homePucksCollected.Count - 1).ToString();
  527.             } else{
  528.                 topHomeScoreText.text = homePucksCollected.Count.ToString();
  529.             }
  530.  
  531.             if (awayPucksCollected.Contains(redPuck)){
  532.                 topAwayScoreText.text = (awayPucksCollected.Count - 1).ToString();
  533.             } else {
  534.                 topAwayScoreText.text = awayPucksCollected.Count.ToString();
  535.             }
  536.         }
  537.  
  538.         public void CheckRoomPlayers(){
  539.             if (gameState == GameState.WIN || gameState == GameState.LOSE) return;
  540.  
  541.             if (PhotonNetwork.PlayerList.Length == 1){
  542.                 gameState = GameState.WIN;
  543.                 GameOver();
  544.             }
  545.         }
  546.  
  547.         void GameOver(){
  548.             settingsScreen.SetActive(false);
  549.             PhotonNetwork.AutomaticallySyncScene = false;
  550.  
  551.             if (gameState == GameState.WIN){
  552.                 PlayerPrefs.SetInt("coin", PlayerPrefs.GetInt("coin") + (PhotonController.Instance.roomEntryPice * 2));
  553.                 PlayerPrefs.Save();
  554.                 statusPanelText.text = "YOU WIN";
  555.             } else if (gameState == GameState.LOSE){
  556.                 statusPanelText.text = "YOU LOSE";
  557.             }
  558.  
  559.             statusPanel.anchoredPosition = new Vector2(-940f, statusPanel.anchoredPosition.y);
  560.             statusBackground.color = new Color(0, 0, 0, 0);
  561.             statusScreen.SetActive(true);
  562.  
  563.             LeanTween.alpha(statusBackground.GetComponent<RectTransform>(), 0.75f, 0.5f);
  564.             LeanTween.move(statusPanel, new Vector2(0, statusPanel.anchoredPosition.y), 0.3f).setDelay(0.5f)
  565.                 .setEase(LeanTweenType.easeOutBack).setOnComplete(() => {
  566.                     LeanTween.move(statusPanel, new Vector2(940, statusPanel.anchoredPosition.y), 0.3f).setDelay(1f)
  567.                         .setEase(LeanTweenType.easeInBack).setOnComplete(
  568.                             () => {
  569.                                 statusBackground.color = new Color(0, 0, 0, 0);
  570.                                 Vector2 targetPos = topCoinParentForAnim.position;
  571.                                 if (gameState == GameState.WIN){
  572.                                     if (targetTag == "White"){
  573.                                         targetPos = topHomeAvatarTimer.transform.position;
  574.                                     } else{
  575.                                         targetPos = topAwayAvatarTimer.transform.position;
  576.                                     }
  577.                                 } else if (gameState == GameState.LOSE){
  578.                                     if (targetTag == "White"){
  579.                                         targetPos = topAwayAvatarTimer.transform.position;
  580.                                     } else{
  581.                                         targetPos = topHomeAvatarTimer.transform.position;
  582.                                     }
  583.                                 }
  584.  
  585.                                 topCoinParentForAnim.gameObject.SetActive(true);
  586.                                 for (int i = 0; i < topCoinParentForAnim.childCount; i++){
  587.                                     GameObject go = topCoinParentForAnim.GetChild(i).gameObject;
  588.                                     LeanTween.move(go, targetPos, 0.5f).setDelay(i * 0.1f).setOnComplete(() => {
  589.                                         go.SetActive(false);
  590.                                     });
  591.                                 }
  592.  
  593.                                 LeanTween.value(PhotonController.Instance.roomEntryPice * 2, 0, 1.5f).setOnUpdate(
  594.                                     (float val) => {
  595.                                         if (val < 1){
  596.                                             topTotalBetText.text = "0";
  597.                                         } else{
  598.                                             topTotalBetText.text = ((int)val).ToString("###,###,###");
  599.                                         }
  600.                                     }).setOnComplete(() => {
  601.                                     AdsManager.Instance.ShowInterstitialAd();
  602.                                     if (PhotonNetwork.InRoom){
  603.                                         PhotonNetwork.LeaveRoom();
  604.                                     }
  605.                                 });
  606.                             });
  607.                 });
  608.         }
  609.     }
  610. }
  611.  
  612.  
  613.  
  614.  
  615.  
  616. using System.Collections;
  617. using System.Collections.Generic;
  618. using UnityEngine;
  619. using UnityEngine.SceneManagement;
  620. using Photon.Pun;
  621. using Photon.Realtime;
  622.  
  623. namespace BEKStudio{
  624.     public class PhotonController : MonoBehaviourPunCallbacks {
  625.         public static PhotonController Instance;
  626.         public string whichMode;
  627.         public string whichRoom;
  628.         public int roomEntryPice = 0;
  629.  
  630.  
  631.         void Awake() {
  632.             if (Instance == null) {
  633.                 Instance = this;
  634.             }
  635.         }
  636.  
  637.         public void Start() {
  638.             PhotonNetwork.KeepAliveInBackground = 60;
  639.             if (!PhotonNetwork.IsConnectedAndReady) {
  640.                 PhotonNetwork.ConnectUsingSettings();
  641.             } else {
  642.                 JoinLobby();
  643.             }
  644.         }
  645.  
  646.         public override void OnConnectedToMaster() {
  647.             if (PlayerPrefs.HasKey("username")){
  648.                 PhotonNetwork.NickName = PlayerPrefs.GetString("username");
  649.             }
  650.            
  651.             JoinLobby();
  652.         }
  653.  
  654.         public void JoinLobby() {
  655.             PhotonNetwork.JoinLobby();
  656.         }
  657.  
  658.         public override void OnJoinedLobby(){
  659.            
  660.         }
  661.  
  662.         public override void OnLeftLobby(){
  663.            
  664.         }
  665.  
  666.         public void FindRoom() {
  667.             MenuController.Instance.vsMsgText.text = "Searching room...";
  668.  
  669.             ExitGames.Client.Photon.Hashtable roomHastable = new ExitGames.Client.Photon.Hashtable {
  670.                 { "roomType", whichRoom }
  671.             };
  672.  
  673.             PhotonNetwork.JoinRandomRoom(roomHastable, 0);
  674.         }
  675.  
  676.         public void CreatePracticeRoom(){
  677.             RoomOptions roomOptions = new RoomOptions();
  678.             roomOptions.CustomRoomPropertiesForLobby = new string[] { "roomType" };
  679.             roomOptions.IsOpen = false;
  680.             roomOptions.IsVisible = false;
  681.             PhotonNetwork.CreateRoom(null, roomOptions);
  682.         }
  683.  
  684.         public override void OnJoinRandomFailed(short returnCode, string message) {
  685.             ExitGames.Client.Photon.Hashtable roomHastable = new ExitGames.Client.Photon.Hashtable {
  686.                 { "roomType", whichRoom }
  687.             };
  688.  
  689.             RoomOptions roomOptions = new RoomOptions();
  690.             roomOptions.CustomRoomProperties = roomHastable;
  691.             roomOptions.CustomRoomPropertiesForLobby = new string[] { "roomType" };
  692.             roomOptions.IsOpen = true;
  693.             roomOptions.IsVisible = true;
  694.             PhotonNetwork.CreateRoom(null, roomOptions);
  695.         }
  696.  
  697.         public override void OnJoinedRoom() {
  698.             if (whichMode == "practice"){
  699.                 SceneManager.LoadScene("Practice");
  700.             } else{
  701.                 ExitGames.Client.Photon.Hashtable userHastable = new ExitGames.Client.Photon.Hashtable();
  702.                 userHastable.Add("avatar", PlayerPrefs.GetInt("avatar"));
  703.                
  704.                 if (PhotonNetwork.PlayerList.Length == 1){
  705.                     userHastable.Add("tag", "White");
  706.                 } else {
  707.                     userHastable.Add("tag", "Black");
  708.                 }
  709.                
  710.                 PhotonNetwork.LocalPlayer.SetCustomProperties(userHastable);
  711.                 MenuController.Instance.VsJoinedRoom();
  712.                 PhotonNetwork.AutomaticallySyncScene = true;
  713.             }
  714.         }
  715.  
  716.         public override void OnLeftRoom() {
  717.             PhotonNetwork.AutomaticallySyncScene = false;
  718.  
  719.             if (SceneManager.GetActiveScene().name == "Menu") {
  720.                 MenuController.Instance.VsOnLeftRoom();
  721.             } else if (SceneManager.GetActiveScene().name == "Game" || SceneManager.GetActiveScene().name == "Practice"){
  722.                 SceneManager.LoadScene("Menu");
  723.             }
  724.         }
  725.  
  726.         public override void OnCreatedRoom() {
  727.            
  728.         }
  729.  
  730.         public override void OnPlayerEnteredRoom(Player newPlayer) {
  731.             if (PhotonNetwork.IsMasterClient) {
  732.                 MenuController.Instance.VsOnPlayerJoinedRoom();
  733.             }
  734.         }
  735.  
  736.         public override void OnPlayerLeftRoom(Player otherPlayer) {
  737.             if (SceneManager.GetActiveScene().name == "Game") {
  738.                 GameController.Instance.CheckRoomPlayers();
  739.             }
  740.         }
  741.  
  742.         public override void OnMasterClientSwitched(Player newMasterClient){
  743.             GameController.Instance.masterClientTag = (string)newMasterClient.CustomProperties["tag"];
  744.             GameController.Instance.CheckTurn();
  745.         }
  746.  
  747.         public override void OnDisconnected(DisconnectCause cause) {
  748.            
  749.         }
  750.  
  751.     }
  752. }
  753.  
  754.  
  755.  
  756. using UnityEngine;
  757. using TMPro;
  758. using Photon.Pun;
  759. using Photon.Realtime;
  760. using ExitGames.Client.Photon;
  761. using System.Collections;
  762. using Hashtable = ExitGames.Client.Photon.Hashtable;
  763.  
  764. namespace BEKStudio
  765. {
  766.     public class RoomManager : MonoBehaviourPunCallbacks
  767.     {
  768.         [Header("Panels")]
  769.         public GameObject roomMenuPanel; // Панель с кнопками "Создать" и "Войти"
  770.         public GameObject createRoomPanel; // Панель создания комнаты
  771.         public GameObject joinRoomPanel; // Панель входа в комнату
  772.  
  773.         [Header("Create Room Fields")]
  774.         public TMP_InputField roomNameInput; // Поле для ввода имени комнаты
  775.         public TMP_InputField roomPasswordInput; // Поле для ввода пароля для комнаты
  776.         public TMP_InputField roomCoinBetInput; // Поле для ввода ставки в монетах
  777.  
  778.         [Header("Join Room Fields")]
  779.         public TMP_InputField joinRoomNameInput; // Поле для ввода имени комнаты при присоединении
  780.         public TMP_InputField joinRoomPasswordInput; // Поле для ввода пароля при присоединении
  781.  
  782.         private string inputPassword; // Временное хранение введенного пароля
  783.         private bool isJoiningRoom = false; // Флаг, чтобы различать создание и вход
  784.  
  785.         void Start()
  786.         {
  787.             roomMenuPanel.SetActive(true); // Показываем главное меню при запуске
  788.             createRoomPanel.SetActive(false); // Скрываем панель создания комнаты
  789.             joinRoomPanel.SetActive(false); // Скрываем панель входа в комнату
  790.         }
  791.  
  792.         // Открыть панель для создания комнаты
  793.         public void OpenCreateRoomPanel()
  794.         {
  795.             roomMenuPanel.SetActive(false); // Скрываем главное меню
  796.             createRoomPanel.SetActive(true); // Показываем панель для создания комнаты
  797.         }
  798.  
  799.         // Открыть панель для входа в комнату
  800.         public void OpenJoinRoomPanel()
  801.         {
  802.             roomMenuPanel.SetActive(false); // Скрываем главное меню
  803.             joinRoomPanel.SetActive(true); // Показываем панель для входа в комнату
  804.         }
  805.  
  806.         // Вернуться в главное меню
  807.         public void BackToMenu()
  808.         {
  809.             createRoomPanel.SetActive(false); // Скрываем панель для создания комнаты
  810.             joinRoomPanel.SetActive(false); // Скрываем панель для входа в комнату
  811.             roomMenuPanel.SetActive(true); // Показываем главное меню
  812.         }
  813.  
  814.         // Создание комнаты с кастомными параметрами
  815.         public void CreateRoom()
  816.         {
  817.             string roomName = roomNameInput.text; // Получаем имя комнаты
  818.             string password = roomPasswordInput.text; // Получаем пароль для комнаты
  819.             string coinBet = roomCoinBetInput.text; // Получаем ставку в монетах
  820.  
  821.             // Создаем хэш-таблицу для хранения кастомных свойств комнаты
  822.             Hashtable roomProperties = new Hashtable
  823.             {
  824.                 { "password", password }, // Добавляем пароль в свойства комнаты
  825.                 { "coinBet", coinBet } // Добавляем ставку в монетах
  826.             };
  827.  
  828.             // Создаем опции для комнаты
  829.             RoomOptions options = new RoomOptions
  830.             {
  831.                 MaxPlayers = 2, // Максимальное количество игроков в комнате
  832.                 CustomRoomProperties = roomProperties, // Устанавливаем кастомные свойства
  833.                 CustomRoomPropertiesForLobby = new string[] { "coinBet" } // Добавляем ставки в монетах в список свойств для лобби
  834.             };
  835.  
  836.             // Создаем комнату с заданными параметрами
  837.             PhotonNetwork.CreateRoom(roomName, options, TypedLobby.Default);
  838.             Debug.Log($"Комната создана: {roomName}, пароль: {password}, ставка: {coinBet}");
  839.         }
  840.  
  841.         // Вход в комнату с проверкой пароля
  842.         public void JoinRoom()
  843.         {
  844.             string roomName = joinRoomNameInput.text; // Получаем имя комнаты
  845.             inputPassword = joinRoomPasswordInput.text; // Сохраняем введенный пароль
  846.             isJoiningRoom = true; // Устанавливаем флаг входа
  847.             PhotonNetwork.JoinRoom(roomName); // Пробуем присоединиться к комнате
  848.         }
  849.  
  850.         // Вызывается после успешного входа в комнату
  851.         public override void OnJoinedRoom()
  852.         {
  853.             if (isJoiningRoom) // Проверяем пароль только при входе, не при создании
  854.             {
  855.                 string roomPassword = PhotonNetwork.CurrentRoom.CustomProperties["password"].ToString(); // Получаем пароль из свойств комнаты
  856.                 if (roomPassword == inputPassword) // Если пароль правильный
  857.                 {
  858.                     Debug.Log("Пароль верный. Подключение успешно!");
  859.                 }
  860.                 else // Если пароль неверный
  861.                 {
  862.                     Debug.LogError("Неверный пароль. Отключаемся...");
  863.                     PhotonNetwork.LeaveRoom(); // Отключаемся от комнаты
  864.                 }
  865.             }
  866.             else
  867.             {
  868.                 Debug.Log("Комната успешно создана.");
  869.             }
  870.  
  871.             isJoiningRoom = false; // Сбрасываем флаг
  872.         }
  873.  
  874.         // Обработчик ошибки при создании комнаты
  875.         public override void OnCreateRoomFailed(short returnCode, string message)
  876.         {
  877.             Debug.LogError("Ошибка создания комнаты: " + message);
  878.         }
  879.  
  880.         // Обработчик ошибки при входе в комнату
  881.         public override void OnJoinRoomFailed(short returnCode, string message)
  882.         {
  883.             Debug.LogError("Ошибка подключения к комнате: " + message);
  884.             isJoiningRoom = false; // Сбрасываем флаг
  885.         }
  886.  
  887.         // Обработчик, когда игрок покидает комнату
  888.         public override void OnLeftRoom()
  889.         {
  890.             Debug.Log("Отключен от комнаты.");
  891.         }
  892.     }
  893. }
  894.  
  895.  
  896.  
  897.  
  898. using System.Collections;
  899. using System.Collections.Generic;
  900. using BEKStudio;
  901. using UnityEngine;
  902. using UnityEngine.SceneManagement;
  903. using UnityEngine.UI;
  904. using TMPro;
  905. using Photon.Realtime;
  906. using Photon.Pun;
  907. using Hashtable = ExitGames.Client.Photon.Hashtable;
  908.  
  909. namespace BEKStudio{
  910.     public class MenuController : MonoBehaviour{
  911.         public static MenuController Instance;
  912.         public GameObject dontDestroyPrefab;
  913.         public TextMeshProUGUI coinText;
  914.         public Image avatarImg;
  915.         public TextMeshProUGUI avatarUsernameText;
  916.         public Sprite[] avatars;
  917.         [Header("Main")] public GameObject mainScreen;
  918.         public RectTransform mainDiscPoolRect;
  919.         public RectTransform mainCarromRect;
  920.         public RectTransform mainPracticeRect;
  921.         [Header("Room")] public GameObject roomScreen;
  922.         public TextMeshProUGUI roomLondonEntryPriceText;
  923.         public TextMeshProUGUI roomLondonWinPriceText;
  924.         public TextMeshProUGUI roomParisEntryPriceText;
  925.         public TextMeshProUGUI roomParisWinPriceText;
  926.         public TextMeshProUGUI roomBerlinEntryPriceText;
  927.         public TextMeshProUGUI roomBerlinWinPriceText;
  928.         [Header("Vs")] public GameObject vsScreen;
  929.         public TextMeshProUGUI vsMsgText;
  930.         public Button vsBackBtn;
  931.         public GameObject vsUsersParent;
  932.         public TextMeshProUGUI vsHomeUsernameText;
  933.         public TextMeshProUGUI vsHomeUserBetText;
  934.         public TextMeshProUGUI vsAwayUsernameText;
  935.         public TextMeshProUGUI vsAwayUserBetText;
  936.         public TextMeshProUGUI vsTotalBetText;
  937.         [Header("Username")] public GameObject usernameScreen;
  938.         public TMP_InputField usernameText;
  939.         [Header("Shop")] public GameObject shopScreen;
  940.  
  941.  
  942.  
  943.         void Awake(){
  944.             if (Instance == null){
  945.                 Instance = this;
  946.             }
  947.         }
  948.  
  949.         void Start(){
  950.             if (!PlayerPrefs.HasKey("default")){
  951.                 PlayerPrefs.SetInt("default", 1);
  952.                 PlayerPrefs.SetInt("avatar", Random.Range(0, 20));
  953.                 PlayerPrefs.SetInt("coin", Constants.DEFAULT_COIN);
  954.                 PlayerPrefs.Save();
  955.             }
  956.  
  957.             avatarImg.sprite = avatars[PlayerPrefs.GetInt("avatar")];
  958.  
  959.             GameObject dontDestroyObj = GameObject.Find("DontDestroy");
  960.             if (dontDestroyObj == null){
  961.                 dontDestroyObj = Instantiate(dontDestroyPrefab);
  962.                 dontDestroyObj.name = "DontDestroy";
  963.                 DontDestroyOnLoad(dontDestroyObj);
  964.             }
  965.  
  966.             UpdateCurrencyText();
  967.  
  968.             mainScreen.SetActive(false);
  969.             roomScreen.SetActive(false);
  970.             vsScreen.SetActive(false);
  971.             shopScreen.SetActive(false);
  972.             usernameScreen.SetActive(false);
  973.  
  974.             if (PlayerPrefs.HasKey("username")){
  975.                 avatarUsernameText.text = PlayerPrefs.GetString("username");
  976.                 OpenMainScreen();
  977.             }  else {
  978.                 usernameScreen.SetActive(true);
  979.             }
  980.  
  981.             Hashtable playerProperties = new Hashtable{
  982.                 { "avatar", PlayerPrefs.GetInt("avatar") }
  983.             };
  984.             PhotonNetwork.SetPlayerCustomProperties(playerProperties);
  985.         }
  986.  
  987.         public void UsernameSaveBtn(){
  988.             if (usernameText.text.Length < 3) return;
  989.  
  990.             PlayerPrefs.SetString("username", usernameText.text);
  991.             PlayerPrefs.Save();
  992.  
  993.             if (PhotonNetwork.IsConnectedAndReady){
  994.                 PhotonNetwork.NickName = usernameText.text;
  995.             }
  996.  
  997.             avatarUsernameText.text = PlayerPrefs.GetString("username");
  998.  
  999.             OpenMainScreen();
  1000.         }
  1001.  
  1002.         void OpenMainScreen(){
  1003.             mainScreen.SetActive(true);
  1004.             roomScreen.SetActive(false);
  1005.             vsScreen.SetActive(false);
  1006.             shopScreen.SetActive(false);
  1007.             usernameScreen.SetActive(false);
  1008.  
  1009.             mainDiscPoolRect.anchoredPosition = new Vector2(-759f, -198f);
  1010.             mainCarromRect.anchoredPosition = new Vector2(759f, -198f);
  1011.             mainPracticeRect.anchoredPosition = new Vector2(0, -1103);
  1012.  
  1013.             LeanTween.move(mainDiscPoolRect, new Vector2(-216f, -198f), 0.5f).setEaseOutBack();
  1014.             LeanTween.move(mainCarromRect, new Vector2(227, -198f), 0.5f).setEaseOutBack();
  1015.             LeanTween.move(mainPracticeRect, new Vector2(0, -744), 0.5f).setEaseOutBack();
  1016.         }
  1017.  
  1018.         public void UpdateCurrencyText(){
  1019.             if (PlayerPrefs.GetInt("coin") == 0){
  1020.                 coinText.text = "0";
  1021.             }
  1022.             else{
  1023.                 coinText.text = PlayerPrefs.GetInt("coin", 0).ToString("###,###,###");
  1024.             }
  1025.         }
  1026.  
  1027.         public void FreeCoinsBtn(){
  1028.             AdsManager.Instance.ShowRewardedAd();
  1029.         }
  1030.  
  1031.         public void DiscPoolBtn(){
  1032.             if(!PhotonNetwork.IsConnectedAndReady) return;
  1033.            
  1034.             if (PlayerPrefs.GetInt("coin") == 0){
  1035.                 ShopBtn();
  1036.                 return;
  1037.             }
  1038.  
  1039.             PhotonController.Instance.whichMode = "disc";
  1040.             ShowRooms();
  1041.         }
  1042.  
  1043.         public void CarromBtn(){
  1044.             if(!PhotonNetwork.IsConnectedAndReady) return;
  1045.            
  1046.             if (PlayerPrefs.GetInt("coin") == 0){
  1047.                 ShopBtn();
  1048.                 return;
  1049.             }
  1050.  
  1051.             PhotonController.Instance.whichMode = "carrom";
  1052.             ShowRooms();
  1053.         }
  1054.  
  1055.         public void PracticeModeBtn(){
  1056.             if(!PhotonNetwork.IsConnectedAndReady) return;
  1057.            
  1058.             PhotonController.Instance.whichMode = "practice";
  1059.             PhotonController.Instance.CreatePracticeRoom();
  1060.         }
  1061.  
  1062.         public void ShopBtn(){
  1063.             if (shopScreen.activeInHierarchy) return;
  1064.  
  1065.             mainScreen.SetActive(false);
  1066.             shopScreen.SetActive(true);
  1067.         }
  1068.  
  1069.         public void ShopItemBtn(int id){
  1070.             Purchaser.Instance.BuyConsumable(id);
  1071.         }
  1072.  
  1073.         public void ShopBackBtn(){
  1074.             mainScreen.SetActive(true);
  1075.             shopScreen.SetActive(false);
  1076.         }
  1077.  
  1078.         public void ShowRooms(){
  1079.             roomLondonEntryPriceText.text = Constants.ROOM_LONDON_ENTRY_PRICE.ToString("###,###,###");
  1080.             roomLondonWinPriceText.text = (Constants.ROOM_LONDON_ENTRY_PRICE * 2).ToString("###,###,###");
  1081.             roomParisEntryPriceText.text = Constants.ROOM_PARIS_ENTRY_PRICE.ToString("###,###,###");
  1082.             roomParisWinPriceText.text = (Constants.ROOM_PARIS_ENTRY_PRICE * 2).ToString("###,###,###");
  1083.             roomBerlinEntryPriceText.text = Constants.ROOM_BERLIN_ENTRY_PRICE.ToString("###,###,###");
  1084.             roomBerlinWinPriceText.text = (Constants.ROOM_BERLIN_ENTRY_PRICE * 2).ToString("###,###,###");
  1085.  
  1086.             mainScreen.SetActive(false);
  1087.             roomScreen.SetActive(true);
  1088.         }
  1089.  
  1090.         public void RoomsBtn(string room){
  1091.             roomScreen.SetActive(false);
  1092.  
  1093.             vsBackBtn.gameObject.SetActive(false);
  1094.             vsBackBtn.interactable = true;
  1095.             vsUsersParent.SetActive(false);
  1096.             vsScreen.SetActive(true);
  1097.  
  1098.             PhotonController.Instance.whichRoom = room;
  1099.             if (room == "london"){
  1100.                 PhotonController.Instance.roomEntryPice = Constants.ROOM_LONDON_ENTRY_PRICE;
  1101.             }
  1102.             else if (room == "paris"){
  1103.                 PhotonController.Instance.roomEntryPice = Constants.ROOM_PARIS_ENTRY_PRICE;
  1104.             }
  1105.             else if (room == "berlin"){
  1106.                 PhotonController.Instance.roomEntryPice = Constants.ROOM_BERLIN_ENTRY_PRICE;
  1107.             }
  1108.  
  1109.             PhotonController.Instance.FindRoom();
  1110.  
  1111.         }
  1112.  
  1113.         public void RoomsBackBtn(){
  1114.             mainScreen.SetActive(true);
  1115.             roomScreen.SetActive(false);
  1116.         }
  1117.  
  1118.         public void VsBackBtn(){
  1119.             vsBackBtn.interactable = false;
  1120.             vsMsgText.text = "Leaveing room...";
  1121.  
  1122.             PhotonNetwork.LeaveRoom();
  1123.         }
  1124.  
  1125.         public void VsOnLeftRoom(){
  1126.             vsBackBtn.gameObject.SetActive(false);
  1127.             vsBackBtn.interactable = true;
  1128.             vsUsersParent.SetActive(false);
  1129.             vsScreen.SetActive(false);
  1130.             mainScreen.SetActive(true);
  1131.         }
  1132.  
  1133.         public void VsJoinedRoom(){
  1134.             vsHomeUserBetText.text = PhotonController.Instance.roomEntryPice.ToString("###,###,###");
  1135.             vsAwayUserBetText.text = PhotonController.Instance.roomEntryPice.ToString("###,###,###");
  1136.             vsTotalBetText.text = "0";
  1137.  
  1138.             vsBackBtn.gameObject.SetActive(true);
  1139.             vsBackBtn.interactable = true;
  1140.             vsMsgText.text = "Waiting opponent...";
  1141.             vsUsersParent.SetActive(true);
  1142.  
  1143.             if (PhotonNetwork.PlayerList.Length == 1){
  1144.                 vsHomeUsernameText.text = PhotonNetwork.PlayerList[0].NickName;
  1145.             }
  1146.             else if (PhotonNetwork.PlayerList.Length == 2){
  1147.                 vsHomeUsernameText.text = PhotonNetwork.PlayerList[0].NickName;
  1148.                 vsAwayUsernameText.text = PhotonNetwork.PlayerList[1].NickName;
  1149.                 VsStartMatch();
  1150.             }
  1151.         }
  1152.  
  1153.         public void VsOnPlayerJoinedRoom(){
  1154.             if (PhotonNetwork.CurrentRoom.PlayerCount == 2){
  1155.                 PhotonNetwork.CurrentRoom.IsOpen = false;
  1156.                 PhotonNetwork.CurrentRoom.IsVisible = false;
  1157.                
  1158.                 vsHomeUsernameText.text = PhotonNetwork.PlayerList[0].NickName;
  1159.                 vsAwayUsernameText.text = PhotonNetwork.PlayerList[1].NickName;
  1160.                 VsStartMatch();
  1161.             }
  1162.         }
  1163.  
  1164.         void VsStartMatch(){
  1165.             float currentCoin = PlayerPrefs.GetInt("coin");
  1166.             float newCoin = currentCoin - PhotonController.Instance.roomEntryPice;
  1167.  
  1168.             PlayerPrefs.SetInt("coin", PlayerPrefs.GetInt("coin") - PhotonController.Instance.roomEntryPice);
  1169.             PlayerPrefs.Save();
  1170.  
  1171.             vsBackBtn.gameObject.SetActive(false);
  1172.  
  1173.             LeanTween.value(PhotonController.Instance.roomEntryPice, 0, 1f).setOnUpdate((float val) => {
  1174.                 vsHomeUserBetText.text = "" + (int)val;
  1175.                 vsAwayUserBetText.text = "" + (int)val;
  1176.             });
  1177.  
  1178.             LeanTween.value(currentCoin, newCoin, 1f).setOnUpdate((float val) => {
  1179.                 if (val < 1){
  1180.                     coinText.text = "0";
  1181.                 }
  1182.                 else{
  1183.                     coinText.text = ((int)val).ToString("###,###,###");
  1184.                 }
  1185.             });
  1186.  
  1187.             LeanTween.value(0, PhotonController.Instance.roomEntryPice * 2, 1f).setOnUpdate((float val) => {
  1188.                 vsTotalBetText.text = "" + (int)val;
  1189.             }).setOnComplete(() => {
  1190.                 UpdateCurrencyText();
  1191.                 if (PhotonNetwork.IsMasterClient){
  1192.                     SceneManager.LoadScene("Game");
  1193.                 }
  1194.             });
  1195.         }
  1196.  
  1197.     }
  1198. }
  1199.  
  1200.  
  1201.  
  1202. using System.Collections;
  1203. using System.Collections.Generic;
  1204. using UnityEngine;
  1205.  
  1206. namespace BEKStudio{
  1207.     public class Constants{
  1208.  
  1209.         public static int DEFAULT_COIN = 1000;
  1210.         public static float PLAY_TIME_FOR_PLAYER = 15;
  1211.  
  1212.         public static int ROOM_LONDON_ENTRY_PRICE = 250;
  1213.         public static int ROOM_PARIS_ENTRY_PRICE = 500;
  1214.         public static int ROOM_BERLIN_ENTRY_PRICE = 1000;
  1215.  
  1216.         public static string ADMOB_INTERSTITIAL_ANDROID_ID = "ca-app-pub-3940256099942544/1033173712";
  1217.         public static string ADMOB_INTERSTITIAL_IOS_ID = "ca-app-pub-3940256099942544/4411468910";
  1218.         public static string ADMOB_REWARDED_ANDROID_ID = "ca-app-pub-3940256099942544/5224354917";
  1219.         public static string ADMOB_REWARDED_IOS_ID = "ca-app-pub-3940256099942544/1712485313";
  1220.  
  1221.         public static int REWARDED_AD_PRIZE = 250;
  1222.    
  1223.         public static string SHOP_PACK_1_ID = "coin5000";
  1224.         public static string SHOP_PACK_2_ID = "coin10000";
  1225.         public static string SHOP_PACK_3_ID = "coin25000";
  1226.         public static string SHOP_PACK_4_ID = "coin50000";
  1227.  
  1228.         public static int SHOP_PACK_1_COIN = 5000;
  1229.         public static int SHOP_PACK_2_COIN = 10000;
  1230.         public static int SHOP_PACK_3_COIN = 25000;
  1231.         public static int SHOP_PACK_4_COIN = 50000;
  1232.  
  1233.     }
  1234. }
  1235.  
  1236.  
  1237.  
  1238. using System.Collections;
  1239. using System.Collections.Generic;
  1240. using UnityEngine;
  1241. using Photon.Pun;
  1242. using BEKStudio;
  1243.  
  1244. namespace BEKStudio{
  1245.     public class PlayerPuck : MonoBehaviourPun, IPunObservable{
  1246.         public static PlayerPuck Instance;
  1247.         Rigidbody2D rb;
  1248.         SpriteRenderer spriteRenderer;
  1249.         PhotonView photonView;
  1250.         public PhysicsMaterial2D physicMaterial;
  1251.         public Vector2 startPos;
  1252.         public Vector2 endPos;
  1253.         public Vector2 totalPos;
  1254.         public bool isTouch;
  1255.         float opponentSliderValue;
  1256.         Vector2 puckStartPos;
  1257.         public GameObject arrow;
  1258.         public float force;
  1259.         float forceMultiplier;
  1260.         Vector2 lastVel;
  1261.         public bool isMoving;
  1262.         private Vector2 arrowLocalScale;
  1263.         public GameObject tutorial;
  1264.         public float tutorialShowDelay = 2;
  1265.  
  1266.  
  1267.         void Awake(){
  1268.             if (Instance == null){
  1269.                 Instance = this;
  1270.             }
  1271.         }
  1272.  
  1273.         void Start(){
  1274.             rb = GetComponent<Rigidbody2D>();
  1275.             spriteRenderer = GetComponent<SpriteRenderer>();
  1276.             photonView = GetComponent<PhotonView>();
  1277.  
  1278.             puckStartPos = transform.localPosition;
  1279.  
  1280.             opponentSliderValue = 0.5f;
  1281.  
  1282.             lastVel = Vector2.zero;
  1283.             isMoving = false;
  1284.             arrowLocalScale = arrow.transform.localScale;
  1285.         }
  1286.  
  1287.         void Update(){
  1288.             isMoving = lastVel != Vector2.zero;
  1289.  
  1290.             if (GameController.Instance.opponentSlider != null){
  1291.                 GameController.Instance.opponentSlider.value = Mathf.MoveTowards(
  1292.                     GameController.Instance.opponentSlider.value, opponentSliderValue, 5 * Time.deltaTime);
  1293.             }
  1294.  
  1295.             if (photonView.IsMine){
  1296.                 opponentSliderValue = 0.5f;
  1297.  
  1298.                 if (rb.sharedMaterial == null){
  1299.                     rb.sharedMaterial = physicMaterial;
  1300.                 }
  1301.  
  1302.                 if (arrow.activeInHierarchy){
  1303.                     arrow.transform.localScale =
  1304.                         Vector2.MoveTowards(arrow.transform.localScale, arrowLocalScale, 5 * Time.deltaTime);
  1305.                 }
  1306.  
  1307.                 if (!isTouch && GameController.Instance.gameState == GameController.GameState.READY){
  1308.                     if (tutorialShowDelay > 0){
  1309.                         tutorialShowDelay -= 1 * Time.deltaTime;
  1310.                     }
  1311.                     else{
  1312.                         if (!tutorial.activeInHierarchy){
  1313.                             tutorial.SetActive(true);
  1314.                         }
  1315.                     }
  1316.                 }
  1317.             }
  1318.             else{
  1319.                 tutorial.SetActive(false);
  1320.  
  1321.                 if (rb.sharedMaterial != null){
  1322.                     rb.sharedMaterial = null;
  1323.                 }
  1324.  
  1325.                 if (arrow.activeInHierarchy){
  1326.                     arrow.transform.localScale = Vector2.MoveTowards(arrow.transform.localScale, arrowLocalScale,
  1327.                         50 * Time.deltaTime);
  1328.                 }
  1329.  
  1330.                 return;
  1331.             }
  1332.  
  1333.             if (isTouch){
  1334.                 endPos = Input.mousePosition;
  1335.                 totalPos = endPos - startPos;
  1336.  
  1337.                 forceMultiplier = Mathf.InverseLerp(0, 500, (endPos - startPos).magnitude);
  1338.  
  1339.                 if (forceMultiplier >= 0.2f){
  1340.                     arrow.GetComponent<SpriteRenderer>().enabled = true;
  1341.                 }
  1342.                 else{
  1343.                     arrow.GetComponent<SpriteRenderer>().enabled = false;
  1344.                 }
  1345.  
  1346.                 arrow.transform.localScale = new Vector3(forceMultiplier * 2.3f, forceMultiplier * 2.3f, 1);
  1347.  
  1348.                 float AngleRad = Mathf.Atan2(-(endPos.y - startPos.y), -(endPos.x - startPos.x));
  1349.                 float AngleDeg = (180 / Mathf.PI) * AngleRad;
  1350.                 transform.rotation = Quaternion.Euler(0, 0, AngleDeg);
  1351.             }
  1352.         }
  1353.  
  1354.         void FixedUpdate(){
  1355.             if (photonView.IsMine){
  1356.                 lastVel = rb.linearVelocity;
  1357.             }
  1358.         }
  1359.  
  1360.         public void OnMouseDown(){
  1361.             if (!photonView.IsMine || GameController.Instance.gameState != GameController.GameState.READY) return;
  1362.  
  1363.  
  1364.             arrow.transform.localScale = Vector2.zero;
  1365.             arrow.SetActive(true);
  1366.             startPos = Input.mousePosition;
  1367.             endPos = startPos;
  1368.  
  1369.             isTouch = true;
  1370.  
  1371.             tutorial.SetActive(false);
  1372.             tutorialShowDelay = 2;
  1373.         }
  1374.  
  1375.         public void OnMouseUp(){
  1376.             if (!photonView.IsMine || GameController.Instance.gameState != GameController.GameState.READY) return;
  1377.  
  1378.             arrow.SetActive(false);
  1379.             isTouch = false;
  1380.  
  1381.             if (forceMultiplier >= 0.2f){
  1382.                 photonView.RPC("Shoot", RpcTarget.AllBuffered);
  1383.             }
  1384.         }
  1385.  
  1386.         [PunRPC]
  1387.         void Shoot(){
  1388.             if (photonView.IsMine){
  1389.                 rb.AddForce(transform.right * (forceMultiplier * force), ForceMode2D.Impulse);
  1390.             }
  1391.  
  1392.             GameController.Instance.Shoot();
  1393.         }
  1394.  
  1395.         public void ResetPosition(){
  1396.             transform.rotation = Quaternion.Euler(0, 0, 90);
  1397.             if (photonView.IsMine){
  1398.                 transform.localPosition = puckStartPos;
  1399.             }
  1400.            
  1401.             GetComponent<CircleCollider2D>().enabled = true;
  1402.             rb.linearVelocity = Vector2.zero;
  1403.             rb.simulated = true;
  1404.             spriteRenderer.color = new Color32(255, 255, 255, 255);
  1405.             lastVel = Vector2.zero;
  1406.             isMoving = false;
  1407.         }
  1408.  
  1409.         public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){
  1410.             if (stream.IsWriting){
  1411.                 stream.SendNext(rb.linearVelocity);
  1412.                 stream.SendNext(GameController.Instance.playerSlider.value);
  1413.                 stream.SendNext(arrow.activeInHierarchy);
  1414.                 stream.SendNext(arrow.transform.localScale);
  1415.                 stream.SendNext(arrow.transform.localRotation);
  1416.             }
  1417.             else{
  1418.                 lastVel = (Vector2)stream.ReceiveNext();
  1419.                 opponentSliderValue = (float)stream.ReceiveNext();
  1420.                 arrow.SetActive((bool)stream.ReceiveNext());
  1421.                 arrowLocalScale = (Vector3)stream.ReceiveNext();
  1422.                 arrow.transform.localRotation = (Quaternion)stream.ReceiveNext();
  1423.             }
  1424.         }
  1425.  
  1426.         void OnTriggerEnter2D(Collider2D col){
  1427.             if (col.CompareTag("Hole")){
  1428.                 GetComponent<CircleCollider2D>().enabled = false;
  1429.                 rb.linearVelocity = Vector2.zero;
  1430.                 rb.simulated = false;
  1431.                 lastVel = Vector2.zero;
  1432.                 isMoving = false;
  1433.                
  1434.                 LeanTween.color(gameObject, new Color32(255, 255, 255, 0), 0.5f).setOnComplete(() => {
  1435.                     if (!photonView.IsMine) return;
  1436.                    
  1437.                     photonView.RPC("PuckOnHole", RpcTarget.AllBuffered, gameObject.tag, gameObject.name);
  1438.                 });
  1439.             }
  1440.         }
  1441.  
  1442.         [PunRPC]
  1443.         void PuckOnHole(string puckTag, string puckName){
  1444.             GameController.Instance.PuckOnHole(puckTag, puckName);
  1445.         }
  1446.  
  1447.     }
  1448. }
  1449.  
  1450.  
  1451. using Photon.Pun;
  1452. using System.Collections;
  1453. using System.Collections.Generic;
  1454. using UnityEngine;
  1455.  
  1456. namespace BEKStudio{
  1457.     public class Puck : MonoBehaviourPun, IPunObservable{
  1458.         public PhotonView photonView;
  1459.         Rigidbody2D rb;
  1460.         SpriteRenderer spriteRenderer;
  1461.         Vector2 puckStartPos;
  1462.         Vector2 lastVel;
  1463.         public bool isMoving;
  1464.  
  1465.         void Start(){
  1466.             photonView = GetComponent<PhotonView>();
  1467.             rb = GetComponent<Rigidbody2D>();
  1468.             spriteRenderer = GetComponent<SpriteRenderer>();
  1469.             puckStartPos = transform.localPosition;
  1470.  
  1471.             lastVel = Vector2.zero;
  1472.             isMoving = false;
  1473.  
  1474.             if (GameController.Instance.practiceMode){
  1475.                 ResetPosition();
  1476.             }
  1477.         }
  1478.  
  1479.         void Update(){
  1480.             isMoving = lastVel != Vector2.zero;
  1481.         }
  1482.  
  1483.         void FixedUpdate(){
  1484.             if (photonView.IsMine){
  1485.                 lastVel = rb.linearVelocity;
  1486.             }
  1487.         }
  1488.  
  1489.         public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){
  1490.             if (stream.IsWriting){
  1491.                 stream.SendNext(rb.linearVelocity);
  1492.             }
  1493.             else{
  1494.                 lastVel = (Vector2)stream.ReceiveNext();
  1495.             }
  1496.         }
  1497.  
  1498.         void OnTriggerEnter2D(Collider2D col){
  1499.             if (col.CompareTag("Hole")){
  1500.                 GetComponent<CircleCollider2D>().enabled = false;
  1501.                 rb.linearVelocity = Vector2.zero;
  1502.                 rb.simulated = false;
  1503.                 lastVel = Vector2.zero;
  1504.                 isMoving = false;
  1505.                
  1506.                 LeanTween.color(gameObject, new Color32(255, 255, 255, 0), 0.5f);
  1507.                
  1508.                 if (!photonView.IsMine) return;
  1509.                 GetComponent<PhotonView>().RPC("PuckOnHole", RpcTarget.AllBuffered, gameObject.tag, gameObject.name);
  1510.             }
  1511.         }
  1512.  
  1513.         public void ResetPosition(){
  1514.             if (GameController.Instance.practiceMode){
  1515.                 transform.localPosition = new Vector2(Random.Range(-1.89f, 1.89f), Random.Range(-1.16f, 1.16f));
  1516.             } else {
  1517.                 if (photonView.IsMine){
  1518.                     transform.localPosition = puckStartPos;
  1519.                 }
  1520.             }
  1521.            
  1522.             rb.linearVelocity = Vector2.zero;
  1523.             rb.simulated = true;
  1524.             spriteRenderer.color = new Color32(255, 255, 255, 255);
  1525.             lastVel = Vector2.zero;
  1526.             isMoving = false;
  1527.         }
  1528.  
  1529.         [PunRPC]
  1530.         void PuckOnHole(string puckTag, string puckName){
  1531.             GameController.Instance.PuckOnHole(puckTag, puckName);
  1532.         }
  1533.  
  1534.         void OnCollisionEnter2D(Collision2D col){
  1535.             if (col.gameObject.CompareTag("Player")){
  1536.                 if (!GetComponent<AudioSource>().isPlaying){
  1537.                     GetComponent<AudioSource>().Play();
  1538.                 }
  1539.             }
  1540.         }
  1541.  
  1542.     }
  1543. }
  1544.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement