Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
6.6 kB
1
Indexable
Never
using UnityEngine;
using NovemberGames.Utils;
using UISystem;
using InputSystem;
using DG.Tweening;
using System;
using AudioSystem;
using System.Collections.Generic;
using TMPro;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace Pinata.Builder
{
    #region GLOBAL MEMBERS

    public enum UIScreen { LoadingScreen, MainMenu, GameHUD, LoadMenu, SaveMenu }

    #endregion

    public class GameManager : Singleton<GameManager>
    {
        #region MEMBER FIELDS

        public const int GameID = 1;

        public Camera MainCamera;
        public CameraOffset OffScreenCameraOffset;

        [NonSerialized] public SkinnedCharacter Pinata;
        [NonSerialized] public PlayerDataResponse PlayerData;

        public delegate void OnCameraReady();

        [Serializable]
        public class CameraOffset
        {
            public Vector2 Offset;
            public float Zoom;
            public float Speed;
            public float RotateSpeed;

            public void Apply(OnCameraReady onCameraReady = null)
            {
                Instance.OffsetCamera(this, onCameraReady);
            }
        }

        private Material _playerSkinMaterial;

        public Material PlayerSkinMaterial
        {
            get { return _playerSkinMaterial; }
        }

        private IEnumerator<float> _launchDataCheckerRoutine;
        private string _lastLaunchDataId;

        #endregion


        #region INIT

        private void Awake()
        {
            Misc.EnableLogCategory("dev");
            Debug.Log(AudioManager.Instance.name);
            UIManager.Instance.DefineStates(new UIScreen());
            InputManager.Instance.Instantiate();
            DataManager.Instance.Init();
            //DataManager.Instance.SetPlayerSkinTest("Pegasus");
        }


        private void Start()
        {
            //start on loading screen
            UIManager.Instance.SetState(UIScreen.LoadingScreen);
        }


        public void InitGame(PlayerDataResponse playerData, Material skinMaterial, bool showPopper = false)
        {
            Popper.PopperManager.Instance.SetupCandy(playerData.candy);

            if (Pinata != null) Destroy(Pinata.gameObject);

            OffScreenCameraOffset.Apply();//make sure our camera is offscreen

            PlayerData = playerData;
            _playerSkinMaterial = skinMaterial;

            if (showPopper)
            {
                Popper.PopperManager.Instance.InitializeGame();
                return;
            }

            Pinata = SkinManager.Instance.InstantiatePrefab(this.PlayerData.skin, _playerSkinMaterial);

            RotatorManager.Instance.Target = Pinata.transform;
            Pinata.transform.localScale = Vector3.one * 15f;

            WorldCloud.Speed = 1.2f;//animate in the clouds at a 1.2 speed
            //wait just a tad to bring in the main menu
            Chronos.WaitForSeconds(0.5f, () =>
            {
                //display MainMenuUI
                UIManager.Instance.SetState(UIScreen.MainMenu);

                //start the piñata rotator
                RotatorManager.Instance.AutoRotate.Enabled = true;

                Chronos.Kill(_launchDataCheckerRoutine);
                _launchDataCheckerRoutine = Chronos.InvokeRepeating(1f, CheckForLaunchData);
            });
        }


        private bool CheckForLaunchData()
        {
            AndroidJavaClass UnityPlayer = null;
            AndroidJavaObject currentActivity = null;

            AndroidJavaObject intent = null;

            try
            {
                UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
                intent = currentActivity.Call<AndroidJavaObject>("getIntent");
            }
            catch (Exception e)
            {
                return true;
            }


            if (!intent.Call<bool>("hasExtra", "id")) return true;
            if (!intent.Call<bool>("hasExtra", "skin")) return true;

            AndroidJavaObject extras = intent.Call<AndroidJavaObject>("getExtras");
            string skinName = extras.Call<string>("getString", "skin");
            string intentId = extras.Call<string>("getString", "id");

            //only trigger if we received new data
            if (intentId.Equals(_lastLaunchDataId)) return true;

            _lastLaunchDataId = intentId;

            if (string.IsNullOrEmpty(skinName)) return true;

            DataManager.Instance.GetPlayerData(skinName, (player) =>
            {
                if (!player.success)
                {
                    Misc.Log("No data found for player " + skinName, "dev");
                    player.skin = new SkinManager.SkinConfiguration();//set the default skin
                    player.name = skinName;

                    //since the player didnt exist, save it...
                    WWWForm data = new WWWForm();
                    data.AddField("skin", JsonUtility.ToJson(player.skin));
                    DataManager.Instance.SetPlayerData(skinName, data, true, null);
                }

                //create the combined material, remove our current screen and init the game again
                Material skinMaterial = SkinManager.Instance.CreateCombinedMaterial(player.skin);
                UIManager.Instance.RemoveCurrentState();
                InitGame(player, skinMaterial, true);
            });

            return true;
        }


        #endregion



        #region CAMERA 

        public void OffsetCamera(CameraOffset targetOffset, OnCameraReady onCameraReady = null)
        {

            MainCamera.transform.DOLocalMoveX(targetOffset.Offset.x, targetOffset.Speed).SetEase(Ease.OutCubic);

            MainCamera.transform.DOLocalMoveY(targetOffset.Offset.y, targetOffset.Speed).SetEase(Ease.OutCubic);

            MainCamera.transform.DOLocalMoveZ(targetOffset.Zoom, targetOffset.Speed).SetEase(Ease.OutCubic).OnComplete(() =>
            {
                RotatorManager.Instance.AutoRotate.Speed = targetOffset.RotateSpeed;
                onCameraReady?.Invoke();
            });
        }

        #endregion



        #region DESTROY

        public void QuitApplication()
        {
            //If we are running in a standalone build of the game
#if UNITY_STANDALONE
            //Quit the application
            Application.Quit();
#endif

            //If we are running in the editor
#if UNITY_EDITOR
            //Stop playing the scene
            EditorApplication.isPlaying = false;
#endif
        }

        #endregion
    }
}