430 lines
16 KiB
C#
430 lines
16 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class NewMainMenu_Slots : MonoBehaviour
|
|
{
|
|
[Serializable]
|
|
public class SlotSymbol
|
|
{
|
|
public Sprite sprite;
|
|
|
|
public float odds;
|
|
|
|
public float triplepayout;
|
|
|
|
public AudioClip selectsound;
|
|
|
|
public AudioClip triplesound;
|
|
}
|
|
|
|
[Header("-= Slot Settings =-")]
|
|
public RectTransform[] columns;
|
|
|
|
public int visibleRows = 3;
|
|
|
|
public float spinDuration = 2f;
|
|
|
|
public float spinSpeed = 500f;
|
|
|
|
public float alignLerpSpeed = 5f;
|
|
|
|
[SerializeField]
|
|
private TextMeshProUGUI TextMoney;
|
|
|
|
[SerializeField]
|
|
private TextMeshProUGUI ControlsText;
|
|
|
|
[Header("-= Slot Sound =-")]
|
|
[SerializeField]
|
|
private AudioClip SFX_SlotClick;
|
|
|
|
[SerializeField]
|
|
private AudioClip SFX_SpendMoney;
|
|
|
|
[SerializeField]
|
|
private AudioClip Mus_Gambling;
|
|
|
|
[SerializeField]
|
|
private AudioClip mus_woody;
|
|
|
|
[Header("-= Symbols =-")]
|
|
public List<SlotSymbol> slotSymbols = new List<SlotSymbol>();
|
|
|
|
public List<Image[]> columnImages = new List<Image[]>();
|
|
|
|
private float slotHeight;
|
|
|
|
private int symbolsPerColumn;
|
|
|
|
private bool currentlySpinning;
|
|
|
|
[SerializeField]
|
|
private GameObject ConsoleMenu;
|
|
|
|
public List<Image> WinnerColumns = new List<Image>();
|
|
|
|
private bool AllTextShown;
|
|
|
|
private bool wasEnabled;
|
|
|
|
public List<TextMeshProUGUI> BackgroundTextLines = new List<TextMeshProUGUI>();
|
|
|
|
[SerializeField]
|
|
private List<int> BackgroundTextMaxCount = new List<int>();
|
|
|
|
[Header("-= Woody =-")]
|
|
[SerializeField]
|
|
private bool WoodyActive;
|
|
|
|
[SerializeField]
|
|
private GameObject WoodyGiygas;
|
|
|
|
[SerializeField]
|
|
private Image WoodyFade;
|
|
|
|
[SerializeField]
|
|
private Material WoodyMaterial;
|
|
|
|
private int spinCounter;
|
|
|
|
private void Start()
|
|
{
|
|
symbolsPerColumn = visibleRows + 2;
|
|
slotHeight = columns[0].rect.height / (float)visibleRows;
|
|
slotSymbols[5].odds = PlayerPrefs.GetInt("Gambling_WoodyChance", 100);
|
|
RectTransform[] array = columns;
|
|
foreach (RectTransform rectTransform in array)
|
|
{
|
|
Image[] array2 = new Image[symbolsPerColumn];
|
|
for (int j = 0; j < symbolsPerColumn; j++)
|
|
{
|
|
GameObject gameObject = new GameObject($"Slot_{j}", typeof(Image));
|
|
gameObject.transform.SetParent(rectTransform, worldPositionStays: false);
|
|
array2[j] = gameObject.GetComponent<Image>();
|
|
array2[j].rectTransform.sizeDelta = new Vector2(rectTransform.rect.width - 20f, slotHeight);
|
|
float num = slotHeight * (float)(symbolsPerColumn - visibleRows) / 2f;
|
|
array2[j].rectTransform.anchoredPosition = new Vector2(0f, num - (float)j * slotHeight);
|
|
if (j == 1)
|
|
{
|
|
WinnerColumns.Add(array2[j]);
|
|
}
|
|
}
|
|
columnImages.Add(array2);
|
|
}
|
|
foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines)
|
|
{
|
|
BackgroundTextMaxCount.Add(backgroundTextLine.text.Length);
|
|
backgroundTextLine.maxVisibleCharacters = 0;
|
|
}
|
|
ResetColumns();
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
wasEnabled = false;
|
|
AllTextShown = false;
|
|
foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines)
|
|
{
|
|
backgroundTextLine.maxVisibleCharacters = 0;
|
|
}
|
|
currentlySpinning = false;
|
|
StopCoroutine("SpinRoutine");
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (Input.GetKeyDown(PlayerInput.Instance.Key_Confirm) && !currentlySpinning && !WoodyActive)
|
|
{
|
|
if (SecurePlayerPrefs.GetSecureInt("TotalCash") >= 10)
|
|
{
|
|
Spin();
|
|
NewMainMenuManager.instance.MenuSource.PlayOneShot(SFX_SpendMoney);
|
|
SecurePlayerPrefs.SetSecureInt("TotalCash", SecurePlayerPrefs.GetSecureInt("TotalCash") - 10);
|
|
TextMoney.text = string.Format("{0}$", SecurePlayerPrefs.GetSecureInt("TotalCash"));
|
|
}
|
|
else
|
|
{
|
|
NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuDeny);
|
|
}
|
|
}
|
|
if (Input.GetKeyDown(PlayerInput.Instance.Key_Cancel) && !currentlySpinning && !WoodyActive)
|
|
{
|
|
NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuDeny);
|
|
ConsoleMenu.SetActive(value: true);
|
|
base.gameObject.SetActive(value: false);
|
|
MusicManager.StopSong(Fade: false, 0f);
|
|
CameraManager.instance.ReverbFilter.reverbPreset = AudioReverbPreset.Generic;
|
|
}
|
|
if (!wasEnabled && base.gameObject.activeSelf)
|
|
{
|
|
wasEnabled = true;
|
|
TextMoney.text = string.Format("{0}$", SecurePlayerPrefs.GetSecureInt("TotalCash"));
|
|
StartCoroutine(ShowBackgroundText());
|
|
CameraManager.instance.ReverbFilter.reverbPreset = AudioReverbPreset.Off;
|
|
MusicManager.PlaySong(Mus_Gambling, FadePreviousSong: false, 0f);
|
|
ControlsText.text = $"{PlayerInput.Instance.Key_Confirm} to Spin\n{PlayerInput.Instance.Key_Cancel} to Return";
|
|
}
|
|
}
|
|
|
|
public void ResetColumns()
|
|
{
|
|
foreach (Image[] columnImage in columnImages)
|
|
{
|
|
for (int i = 0; i < columnImage.Length; i++)
|
|
{
|
|
columnImage[i].sprite = GetRandomSymbol(columnImage[i]);
|
|
columnImage[i].rectTransform.anchoredPosition = new Vector2(0f, slotHeight * (float)(symbolsPerColumn - visibleRows) / 2f - (float)i * slotHeight);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Spin()
|
|
{
|
|
currentlySpinning = true;
|
|
spinCounter++;
|
|
if (spinCounter % 3 == 0)
|
|
{
|
|
ResetColumns();
|
|
}
|
|
StartCoroutine(SpinRoutine());
|
|
DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.CheekyGrin);
|
|
}
|
|
|
|
private IEnumerator SpinRoutine()
|
|
{
|
|
float elapsedTime = 0f;
|
|
while (elapsedTime < spinDuration)
|
|
{
|
|
float num = Mathf.Clamp01(elapsedTime / (spinDuration / 4f));
|
|
foreach (Image[] columnImage in columnImages)
|
|
{
|
|
for (int i = 0; i < columnImage.Length; i++)
|
|
{
|
|
RectTransform rectTransform = columnImage[i].rectTransform;
|
|
rectTransform.anchoredPosition += new Vector2(0f, (0f - spinSpeed) * num * Time.deltaTime);
|
|
if (rectTransform.anchoredPosition.y <= (0f - slotHeight) * (float)(symbolsPerColumn - 1))
|
|
{
|
|
rectTransform.anchoredPosition += new Vector2(0f, slotHeight * (float)symbolsPerColumn + slotHeight);
|
|
columnImage[i].sprite = GetRandomSymbol(columnImage[i], enableForgiveness: true);
|
|
CutsceneUtils.PlaySound(SFX_SlotClick, CutsceneUtils.DRH_MixerChannels.Effect, 0.5f, UnityEngine.Random.Range(0.9f, 1.1f));
|
|
}
|
|
}
|
|
}
|
|
elapsedTime += Time.deltaTime;
|
|
yield return null;
|
|
}
|
|
if (PlayerPrefs.GetInt("Gambling_WoodyChance", 100) > 0)
|
|
{
|
|
PlayerPrefs.SetInt("Gambling_WoodyChance", PlayerPrefs.GetInt("Gambling_WoodyChance", 100) + 25);
|
|
slotSymbols[5].odds = PlayerPrefs.GetInt("Gambling_WoodyChance", 100);
|
|
}
|
|
AlignColumns();
|
|
}
|
|
|
|
private Sprite GetRandomSymbol(Image img, bool enableForgiveness = false)
|
|
{
|
|
float num = 0f;
|
|
foreach (SlotSymbol slotSymbol in slotSymbols)
|
|
{
|
|
num += slotSymbol.odds;
|
|
}
|
|
float num2 = UnityEngine.Random.Range(0f, num);
|
|
float num3 = 0f;
|
|
if (enableForgiveness && (double)UnityEngine.Random.value < 0.3 && img == WinnerColumns[2] && WinnerColumns[0].sprite == WinnerColumns[1].sprite)
|
|
{
|
|
return WinnerColumns[0].sprite;
|
|
}
|
|
foreach (SlotSymbol slotSymbol2 in slotSymbols)
|
|
{
|
|
num3 += slotSymbol2.odds;
|
|
if (num2 <= num3)
|
|
{
|
|
return slotSymbol2.sprite;
|
|
}
|
|
}
|
|
return slotSymbols[0].sprite;
|
|
}
|
|
|
|
private void AlignColumns()
|
|
{
|
|
StartCoroutine(AlignRoutine());
|
|
}
|
|
|
|
private IEnumerator AlignRoutine()
|
|
{
|
|
bool aligning = true;
|
|
while (aligning)
|
|
{
|
|
aligning = false;
|
|
for (int columnIndex = 0; columnIndex < columnImages.Count; columnIndex++)
|
|
{
|
|
Image[] array = columnImages[columnIndex];
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
RectTransform rectTransform = array[i].rectTransform;
|
|
float num = Mathf.Round(rectTransform.anchoredPosition.y / slotHeight) * slotHeight;
|
|
float y = Mathf.Lerp(rectTransform.anchoredPosition.y, num, Time.deltaTime * alignLerpSpeed);
|
|
rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, y);
|
|
if (Mathf.Abs(rectTransform.anchoredPosition.y - num) > 0.1f)
|
|
{
|
|
aligning = true;
|
|
}
|
|
}
|
|
yield return null;
|
|
}
|
|
}
|
|
bool playWinSound = false;
|
|
AudioClip winSound = null;
|
|
for (int columnIndex = 0; columnIndex < columnImages.Count; columnIndex++)
|
|
{
|
|
Image[] array2 = columnImages[columnIndex];
|
|
int num2 = visibleRows / 2;
|
|
Image image = array2[num2];
|
|
SlotSymbol symbolFromImage = GetSymbolFromImage(image.sprite);
|
|
if (symbolFromImage != null)
|
|
{
|
|
MonoBehaviour.print($"Column {columnIndex + 1}: {symbolFromImage.sprite.name}");
|
|
CutsceneUtils.PlaySound(symbolFromImage.selectsound, CutsceneUtils.DRH_MixerChannels.Effect, 0.8f);
|
|
if (columnImages[0][visibleRows / 2].sprite == columnImages[1][visibleRows / 2].sprite && columnImages[1][visibleRows / 2].sprite == columnImages[2][visibleRows / 2].sprite)
|
|
{
|
|
Sprite sprite = columnImages[0][visibleRows / 2].sprite;
|
|
SlotSymbol symbolFromImage2 = GetSymbolFromImage(sprite);
|
|
if (symbolFromImage2 != null)
|
|
{
|
|
playWinSound = true;
|
|
winSound = symbolFromImage2.triplesound;
|
|
float triplepayout = symbolFromImage2.triplepayout;
|
|
SecurePlayerPrefs.SetSecureInt("TotalCash", SecurePlayerPrefs.GetSecureInt("TotalCash") + Mathf.RoundToInt(triplepayout), disableTotalCashDisplay: true);
|
|
TextMoney.text = string.Format("{0}$", SecurePlayerPrefs.GetSecureInt("TotalCash"));
|
|
DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.Shock_NoSound);
|
|
MonoBehaviour.print($"Payout awarded: {triplepayout}$");
|
|
if (symbolFromImage2 == slotSymbols[5])
|
|
{
|
|
StartCoroutine(WoodyScene());
|
|
PlayerPrefs.SetInt("Gambling_WoodyChance", 0);
|
|
slotSymbols[5].odds = 0f;
|
|
NewMainMenu_Trophys.instance.UpdateTrophys();
|
|
PlayerPrefs.SetInt("Trophy_Woody", 1);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.Annoyed);
|
|
}
|
|
}
|
|
yield return new WaitForSeconds(0.2f);
|
|
}
|
|
if (playWinSound && winSound != null)
|
|
{
|
|
MusicManager.PauseMusic();
|
|
CutsceneUtils.PlaySound(winSound);
|
|
yield return new WaitForSeconds(winSound.length);
|
|
DEBUG_EnableMarkiplier.ChangeMarkiplierState(DEBUG_EnableMarkiplier.MarkiplierEmotions.Crying);
|
|
MusicManager.ResumeMusic();
|
|
}
|
|
currentlySpinning = false;
|
|
}
|
|
|
|
private IEnumerator ShowBackgroundText()
|
|
{
|
|
if (!SettingsManager.Instance.GetBoolSettingValue("SimpleVFX"))
|
|
{
|
|
List<TextMeshProUGUI> finishedTexts = new List<TextMeshProUGUI>();
|
|
while (!AllTextShown)
|
|
{
|
|
yield return null;
|
|
foreach (TextMeshProUGUI backgroundTextLine in BackgroundTextLines)
|
|
{
|
|
if (!finishedTexts.Contains(backgroundTextLine) && backgroundTextLine.maxVisibleCharacters >= backgroundTextLine.text.Length)
|
|
{
|
|
finishedTexts.Add(backgroundTextLine);
|
|
}
|
|
else if (backgroundTextLine.maxVisibleCharacters < backgroundTextLine.text.Length)
|
|
{
|
|
float num = 100 + UnityEngine.Random.Range(-60, -10);
|
|
backgroundTextLine.maxVisibleCharacters += Mathf.CeilToInt(num * Time.deltaTime);
|
|
backgroundTextLine.maxVisibleCharacters = Mathf.Clamp(backgroundTextLine.maxVisibleCharacters, 0, backgroundTextLine.text.Length);
|
|
NewMainMenuManager.instance.MenuSource.PlayOneShot(NewMainMenuManager.instance.SFX_MenuClick);
|
|
}
|
|
}
|
|
if (CompareTextLists(finishedTexts, BackgroundTextLines))
|
|
{
|
|
AllTextShown = true;
|
|
MonoBehaviour.print("all text shown");
|
|
}
|
|
}
|
|
yield break;
|
|
}
|
|
foreach (TextMeshProUGUI backgroundTextLine2 in BackgroundTextLines)
|
|
{
|
|
backgroundTextLine2.maxVisibleCharacters = backgroundTextLine2.text.Length;
|
|
}
|
|
}
|
|
|
|
private bool CompareTextLists(List<TextMeshProUGUI> list1, List<TextMeshProUGUI> list2)
|
|
{
|
|
if (list1.Count != list2.Count)
|
|
{
|
|
return false;
|
|
}
|
|
for (int i = 0; i < list1.Count; i++)
|
|
{
|
|
if (list1[i].text != list2[i].text)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private SlotSymbol GetSymbolFromImage(Sprite sprite)
|
|
{
|
|
foreach (SlotSymbol slotSymbol in slotSymbols)
|
|
{
|
|
if (slotSymbol.sprite == sprite)
|
|
{
|
|
return slotSymbol;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private IEnumerator WoodyScene()
|
|
{
|
|
WoodyActive = true;
|
|
WoodyFade.enabled = true;
|
|
WoodyGiygas.SetActive(value: true);
|
|
MusicManager.PlaySong(mus_woody, FadePreviousSong: false, 0f);
|
|
float duration = 90f;
|
|
float elapsedTime = 0f;
|
|
Color fadeColor = WoodyFade.color;
|
|
while (elapsedTime < duration)
|
|
{
|
|
fadeColor.a = Mathf.Lerp(1f, 0f, elapsedTime / duration);
|
|
WoodyFade.color = fadeColor;
|
|
float num = ((!(elapsedTime <= 53f)) ? 8.5f : 1.25f);
|
|
float num2 = Mathf.PerlinNoise(Time.time * 0.5f, 0f) * num;
|
|
float num3 = Mathf.PerlinNoise(0f, Time.time * 0.5f) * num;
|
|
WoodyMaterial.SetFloat("_TimeScalingX", 32f + elapsedTime * 2f + num2);
|
|
WoodyMaterial.SetFloat("_TimeScalingY", 32f + elapsedTime * 2f + num3);
|
|
elapsedTime += Time.deltaTime;
|
|
yield return null;
|
|
}
|
|
ResetColumns();
|
|
WoodyMaterial.SetFloat("_TimeScalingX", 32f);
|
|
WoodyMaterial.SetFloat("_TimeScalingY", 32f);
|
|
fadeColor.a = 0f;
|
|
WoodyFade.color = fadeColor;
|
|
yield return new WaitForSeconds(2f);
|
|
WoodyGiygas.SetActive(value: false);
|
|
WoodyFade.enabled = false;
|
|
WoodyActive = false;
|
|
MusicManager.PlaySong(Mus_Gambling, FadePreviousSong: false, 0f);
|
|
}
|
|
}
|