450 lines
12 KiB
C#
450 lines
12 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class EpisodeSelector : MonoBehaviour
|
|
{
|
|
public int CurrentPage
|
|
{
|
|
get
|
|
{
|
|
return Mathf.Clamp(Mathf.RoundToInt(this.m_scrollPivot.transform.localPosition.x / -this.m_hudCamera.ScreenToWorldPoint(new Vector3((float)Screen.width, 0f, 0f)).x), 0, this.m_pageCount);
|
|
}
|
|
}
|
|
|
|
public List<GameObject> Episodes
|
|
{
|
|
get
|
|
{
|
|
return this.m_episodes;
|
|
}
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
Singleton<GameManager>.Instance.CreateMenuBackground();
|
|
this.m_hudCamera = GameObject.FindGameObjectWithTag("HUDCamera").GetComponent<Camera>();
|
|
this.m_scrollPivot = base.transform.Find("ScrollPivot").gameObject;
|
|
for (int i = 0; i < this.m_episodes.Count; i++)
|
|
{
|
|
this.m_episodes[i] = UnityEngine.Object.Instantiate<GameObject>(this.m_episodes[i]);
|
|
this.m_episodes[i].transform.parent = this.m_scrollPivot.transform;
|
|
}
|
|
this.m_screenWidth = Screen.width;
|
|
this.m_screenHeight = Screen.height;
|
|
this.Layout();
|
|
if (this.m_pageCount > 1)
|
|
{
|
|
this.CreatePageDots();
|
|
}
|
|
this.SetPage(UserSettings.GetInt(Singleton<GameManager>.Instance.CurrentSceneName + "_active_page", 0));
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
if (GameProgress.GetBool("show_content_limit_popup", false, GameProgress.Location.Local, null))
|
|
{
|
|
GameProgress.DeleteKey("show_content_limit_popup", GameProgress.Location.Local);
|
|
LevelInfo.DisplayContentLimitNotification();
|
|
}
|
|
}
|
|
|
|
private void SetPage(int page)
|
|
{
|
|
this.m_page = Mathf.Clamp(page, 0, this.m_pageCount - 1);
|
|
Vector3 position = new Vector3(-this.m_hudCamera.ScreenToWorldPoint(new Vector3((float)(Screen.width / 2 + Screen.width * this.m_page), 0f, 0f)).x, this.m_scrollPivot.transform.localPosition.y, this.m_scrollPivot.transform.localPosition.z);
|
|
this.m_scrollPivot.transform.position = position;
|
|
for (int i = 0; i < this.m_dotsList.Count; i++)
|
|
{
|
|
if (i == this.m_page)
|
|
{
|
|
this.m_dotsList[i].Enable();
|
|
}
|
|
else
|
|
{
|
|
this.m_dotsList[i].Disable();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void NextPage()
|
|
{
|
|
this.m_page = Mathf.Clamp(this.m_page + 1, 0, this.m_pageCount - 1);
|
|
for (int i = 0; i < this.m_dotsList.Count; i++)
|
|
{
|
|
if (i == this.m_page)
|
|
{
|
|
this.m_dotsList[i].Enable();
|
|
}
|
|
else
|
|
{
|
|
this.m_dotsList[i].Disable();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void PreviousPage()
|
|
{
|
|
this.m_page = Mathf.Clamp(this.m_page - 1, 0, this.m_pageCount - 1);
|
|
for (int i = 0; i < this.m_dotsList.Count; i++)
|
|
{
|
|
if (i == this.m_page)
|
|
{
|
|
this.m_dotsList[i].Enable();
|
|
}
|
|
else
|
|
{
|
|
this.m_dotsList[i].Disable();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
KeyListener.keyReleased += this.HandleKeyListenerkeyReleased;
|
|
KeyListener.mouseWheel += this.HandleKeyListenerMouseWheel;
|
|
this.SetPage(UserSettings.GetInt(Singleton<GameManager>.Instance.CurrentSceneName + "_active_page", 0));
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
KeyListener.keyReleased -= this.HandleKeyListenerkeyReleased;
|
|
KeyListener.mouseWheel -= this.HandleKeyListenerMouseWheel;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (this.m_screenWidth != Screen.width || this.m_screenHeight != Screen.height)
|
|
{
|
|
this.m_screenWidth = Screen.width;
|
|
this.m_screenHeight = Screen.height;
|
|
this.SetPage(0);
|
|
this.Layout();
|
|
Transform transform = base.transform.Find("PageDots");
|
|
int num = 0;
|
|
if (transform != null)
|
|
{
|
|
num = transform.childCount;
|
|
}
|
|
if ((this.m_pageCount > 1 && transform == null) || num <= 1)
|
|
{
|
|
this.CreatePageDots();
|
|
}
|
|
else if (this.m_pageCount <= 1 && num >= 1)
|
|
{
|
|
transform.gameObject.SetActive(false);
|
|
}
|
|
else if (this.m_pageCount > 1 && num >= 1)
|
|
{
|
|
for (int i = 0; i < this.m_dotsList.Count; i++)
|
|
{
|
|
if (i == this.m_page)
|
|
{
|
|
this.m_dotsList[i].Enable();
|
|
}
|
|
else
|
|
{
|
|
this.m_dotsList[i].Disable();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (this.m_pageCount <= 1)
|
|
{
|
|
return;
|
|
}
|
|
if (!this.m_interacting)
|
|
{
|
|
Vector3 a = new Vector3(-this.m_hudCamera.ScreenToWorldPoint(new Vector3((float)(Screen.width / 2 + Screen.width * this.m_page), 0f, 0f)).x, this.m_scrollPivot.transform.localPosition.y, this.m_scrollPivot.transform.localPosition.z);
|
|
this.m_scrollPivot.transform.position += (a - this.m_scrollPivot.transform.position) * Time.deltaTime * 4f;
|
|
float magnitude = (a - this.m_scrollPivot.transform.position).magnitude;
|
|
if (magnitude < 1f)
|
|
{
|
|
if (UserSettings.GetInt(Singleton<GameManager>.Instance.CurrentSceneName + "_active_page", -1) != this.m_page)
|
|
{
|
|
UserSettings.SetInt(Singleton<GameManager>.Instance.CurrentSceneName + "_active_page", this.m_page);
|
|
}
|
|
if (!Singleton<InputManager>.Instance.UsesTouchInput)
|
|
{
|
|
this.m_rightScroll.SetActive(true);
|
|
this.m_leftScroll.SetActive(true);
|
|
}
|
|
}
|
|
else if (!Singleton<InputManager>.Instance.UsesTouchInput)
|
|
{
|
|
this.m_rightScroll.SetActive(false);
|
|
this.m_leftScroll.SetActive(false);
|
|
}
|
|
if (!Singleton<InputManager>.Instance.UsesTouchInput)
|
|
{
|
|
if (this.CurrentPage == 0)
|
|
{
|
|
this.m_leftScroll.SetActive(false);
|
|
}
|
|
if (this.CurrentPage == this.m_pageCount || this.m_pageCount == 1)
|
|
{
|
|
this.m_rightScroll.SetActive(false);
|
|
}
|
|
}
|
|
}
|
|
GuiManager.Pointer pointer = GuiManager.GetPointer();
|
|
if (pointer.down && pointer.widget != this.m_leftScroll.GetComponent<Widget>() && pointer.widget != this.m_rightScroll.GetComponent<Widget>())
|
|
{
|
|
this.m_initialInputPos = pointer.position;
|
|
this.m_lastInputPos = pointer.position;
|
|
this.m_interacting = true;
|
|
}
|
|
if (pointer.dragging && this.m_interacting)
|
|
{
|
|
Vector3 vector = this.m_hudCamera.ScreenToWorldPoint(this.m_lastInputPos);
|
|
Vector3 vector2 = this.m_hudCamera.ScreenToWorldPoint(pointer.position);
|
|
this.m_lastInputPos = pointer.position;
|
|
float num2 = vector2.x - vector.x;
|
|
this.m_scrollPivot.transform.localPosition = new Vector3(Mathf.Clamp(this.m_scrollPivot.transform.localPosition.x + num2, this.m_rightDragLimit, this.m_leftDragLimit), this.m_scrollPivot.transform.localPosition.y, this.m_scrollPivot.transform.localPosition.z);
|
|
Vector3 vector3 = this.m_hudCamera.ScreenToWorldPoint(this.m_initialInputPos);
|
|
if (!Singleton<InputManager>.Instance.UsesTouchInput && Mathf.Abs(vector2.x - vector3.x) > 0.2f)
|
|
{
|
|
this.m_rightScroll.SetActive(false);
|
|
this.m_leftScroll.SetActive(false);
|
|
}
|
|
if (Mathf.Abs(vector2.x - vector3.x) > 1f)
|
|
{
|
|
Singleton<GuiManager>.Instance.ResetFocus();
|
|
}
|
|
}
|
|
if (pointer.up && this.m_interacting)
|
|
{
|
|
float num3 = this.m_lastInputPos.x - this.m_initialInputPos.x;
|
|
if (num3 < (float)(-(float)Screen.width / 16))
|
|
{
|
|
this.m_page++;
|
|
this.m_page = Mathf.Clamp(this.m_page, 0, this.m_pageCount - 1);
|
|
for (int j = 0; j < this.m_dotsList.Count; j++)
|
|
{
|
|
if (j == this.m_page)
|
|
{
|
|
this.m_dotsList[j].Enable();
|
|
}
|
|
else
|
|
{
|
|
this.m_dotsList[j].Disable();
|
|
}
|
|
}
|
|
}
|
|
else if (num3 > (float)(Screen.width / 16))
|
|
{
|
|
this.m_page--;
|
|
this.m_page = Mathf.Clamp(this.m_page, 0, this.m_pageCount - 1);
|
|
for (int k = 0; k < this.m_dotsList.Count; k++)
|
|
{
|
|
if (k == this.m_page)
|
|
{
|
|
this.m_dotsList[k].Enable();
|
|
}
|
|
else
|
|
{
|
|
this.m_dotsList[k].Disable();
|
|
}
|
|
}
|
|
}
|
|
this.m_page = Mathf.Clamp(this.m_page, 0, this.m_pageCount - 1);
|
|
this.m_interacting = false;
|
|
}
|
|
}
|
|
|
|
private void Layout()
|
|
{
|
|
float num = 2f * this.m_hudCamera.orthographicSize * (float)Screen.width / (float)Screen.height;
|
|
int count = this.m_episodes.Count;
|
|
Vector2 size = this.m_episodes[0].GetComponent<Sprite>().Size;
|
|
float num2 = this.EdgeMargin + size.x / 2f + this.m_scrollButtonMargin;
|
|
float y = 1f;
|
|
Vector3 vector = new Vector3(-num / 2f + num2, y);
|
|
float num3 = num - 2f * num2;
|
|
float num4 = num3 / (float)(count - 1);
|
|
if (num4 < this.MinGap)
|
|
{
|
|
this.MinGap = 6.5f;
|
|
this.EdgeMargin = 2f;
|
|
num2 = this.EdgeMargin + size.x / 2f + this.m_scrollButtonMargin;
|
|
y = 1f;
|
|
vector = new Vector3(-num / 2f + num2, y);
|
|
num3 = num - 2f * num2;
|
|
this.m_episodesPerPage = (int)(num3 / this.MinGap) + 1;
|
|
if (this.m_episodesPerPage < count && this.gameData != null && this.m_episodesPerPage > this.gameData.m_episodeLevels.Count)
|
|
{
|
|
this.m_episodesPerPage = this.gameData.m_episodeLevels.Count;
|
|
}
|
|
vector.x = -((float)(this.m_episodesPerPage - 1) * this.MinGap) / 2f;
|
|
num4 = this.MinGap;
|
|
this.m_pageCount = this.m_episodes.Count / this.m_episodesPerPage + ((this.m_episodes.Count % this.m_episodesPerPage != 0) ? 1 : 0);
|
|
}
|
|
else if (num4 > this.MaxGap)
|
|
{
|
|
this.m_pageCount = 1;
|
|
vector.x += (num4 - this.MaxGap) * (float)(count - 1) / 2f;
|
|
num4 = this.MaxGap;
|
|
}
|
|
if (this.m_pageCount == 1)
|
|
{
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
this.m_episodes[i].transform.position = vector + Vector3.right * num4 * (float)i;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Vector3 a = vector;
|
|
int j = 0;
|
|
int num5 = 0;
|
|
while (j < count)
|
|
{
|
|
int num6 = this.m_episodesPerPage;
|
|
if (num6 > count - j)
|
|
{
|
|
num6 = count - j;
|
|
}
|
|
a.x = -((float)(num6 - 1) * this.MinGap) / 2f;
|
|
vector = a + (float)num5 * num * Vector3.right;
|
|
for (int k = 0; k < num6; k++)
|
|
{
|
|
this.m_episodes[j].transform.position = vector + Vector3.right * num4 * (float)k;
|
|
j++;
|
|
if (j >= count)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
num5++;
|
|
}
|
|
}
|
|
this.m_rightDragLimit = -this.m_hudCamera.ScreenToWorldPoint(new Vector3((float)(Screen.width * this.m_pageCount) - this.EdgeMargin, 0f, 0f)).x;
|
|
this.m_leftDragLimit = -this.m_hudCamera.ScreenToWorldPoint(new Vector3(this.EdgeMargin, 0f, 0f)).x;
|
|
if (Singleton<InputManager>.Instance.UsesTouchInput || this.m_pageCount <= 1)
|
|
{
|
|
this.m_leftScroll.SetActive(false);
|
|
this.m_rightScroll.SetActive(false);
|
|
}
|
|
}
|
|
|
|
private void CreatePageDots()
|
|
{
|
|
Vector3 position = -Vector3.up * this.m_hudCamera.orthographicSize / 1.25f;
|
|
GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(new GameObject(), position, Quaternion.identity);
|
|
gameObject.name = "PageDots";
|
|
gameObject.transform.parent = base.transform;
|
|
float num = -(float)this.m_pageCount / 2f * 1.2f;
|
|
for (int i = 0; i < this.m_pageCount; i++)
|
|
{
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate<GameObject>(this.m_pageDot);
|
|
gameObject2.transform.parent = gameObject.transform;
|
|
gameObject2.transform.localPosition = new Vector3(num + (float)i * 1.2f, 0f, -95f);
|
|
gameObject2.name = "Dot" + i + 1;
|
|
PageDot component = gameObject2.GetComponent<PageDot>();
|
|
this.m_dotsList.Add(component);
|
|
if (i == this.m_page)
|
|
{
|
|
this.m_dotsList[i].Enable();
|
|
}
|
|
else
|
|
{
|
|
this.m_dotsList[i].Disable();
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool isInInteractiveArea(Vector2 touchPos)
|
|
{
|
|
return touchPos.y > (float)Screen.height * 0.1f && touchPos.y < (float)Screen.height * 0.8f;
|
|
}
|
|
|
|
public void GoToMainMenu()
|
|
{
|
|
this.SendExitEpisodeSelectionFlurryEvent();
|
|
Singleton<GameManager>.Instance.LoadMainMenu(false);
|
|
}
|
|
|
|
private void HandleKeyListenerkeyReleased(KeyCode obj)
|
|
{
|
|
if (obj == KeyCode.Escape)
|
|
{
|
|
this.GoToMainMenu();
|
|
}
|
|
else if (DeviceInfo.ActiveDeviceFamily != DeviceInfo.DeviceFamily.Android && obj == KeyCode.RightArrow && this.m_rightScroll.activeInHierarchy)
|
|
{
|
|
this.NextPage();
|
|
}
|
|
else if (DeviceInfo.ActiveDeviceFamily != DeviceInfo.DeviceFamily.Android && obj == KeyCode.LeftArrow && this.m_leftScroll.activeInHierarchy)
|
|
{
|
|
this.PreviousPage();
|
|
}
|
|
}
|
|
|
|
private void HandleKeyListenerMouseWheel(float delta)
|
|
{
|
|
if (delta < 0f && this.m_rightScroll.activeInHierarchy && !this.m_interacting)
|
|
{
|
|
this.NextPage();
|
|
}
|
|
else if (delta > 0f && this.m_leftScroll.activeInHierarchy && !this.m_interacting)
|
|
{
|
|
this.PreviousPage();
|
|
}
|
|
}
|
|
|
|
public void SendExitEpisodeSelectionFlurryEvent()
|
|
{
|
|
}
|
|
|
|
[SerializeField]
|
|
private GameData gameData;
|
|
|
|
[SerializeField]
|
|
private List<GameObject> m_episodes = new List<GameObject>();
|
|
|
|
[SerializeField]
|
|
private float MinGap = 6f;
|
|
|
|
[SerializeField]
|
|
private float MaxGap = 6f;
|
|
|
|
[SerializeField]
|
|
private float EdgeMargin = 0.65f;
|
|
|
|
[SerializeField]
|
|
private GameObject m_pageDot;
|
|
|
|
[SerializeField]
|
|
private GameObject m_leftScroll;
|
|
|
|
[SerializeField]
|
|
private GameObject m_rightScroll;
|
|
|
|
[SerializeField]
|
|
private float m_scrollButtonMargin = 0.5f;
|
|
|
|
private int m_screenWidth;
|
|
|
|
private int m_screenHeight;
|
|
|
|
private Camera m_hudCamera;
|
|
|
|
private int m_episodesPerPage;
|
|
|
|
private int m_pageCount;
|
|
|
|
private int m_page;
|
|
|
|
private List<PageDot> m_dotsList = new List<PageDot>();
|
|
|
|
private bool m_interacting;
|
|
|
|
private Vector2 m_initialInputPos;
|
|
|
|
private Vector2 m_lastInputPos;
|
|
|
|
private float m_leftDragLimit;
|
|
|
|
private float m_rightDragLimit;
|
|
|
|
private GameObject m_scrollPivot;
|
|
}
|