2026-01-05 12:16:58 +05:30

261 lines
9.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using DG.Tweening;
using UnityEngine;
public class LevelScreen : ScreenBase
{
[SerializeField] private Level[] levelObjects;
[SerializeField] private Level currentFinishedLvl, newUnlockedLvl;
[SerializeField] private Transform[] levelObjectPoints;
[SerializeField] private Transform currentFinishedLvlTransform;
[SerializeField] private Transform newUnlockedLvlTransform;
[SerializeField] private Vector3 startAdditionalSlideOffset = new Vector3(0f, 50f, 0);
[SerializeField] private Vector3 finalAdditionalSlideOffset = new Vector3(0f, 25f, 0);
[SerializeField] private float startTweenDelay = 0.25f;
[SerializeField] private float finalTweenDelay = 0.25f;
[SerializeField] private float levelObjectSlideDelay = 1f;
[Tooltip("Difference between center node/active level node and last node visible on top of screen")]
[SerializeField] private int diff;
private LevelManager levelManager;
private int levelObjectPointStartIndex = 0;
private Queue<Level> levelsQueue = new Queue<Level>();
public void InitLevelManager(LevelManager levelManager)
{
this.levelManager = levelManager;
}
private int GetLevelPageStartVal() => levelManager.CurrentLevelNumber == 1 || levelManager.CurrentLevelNumber == 2 ?
1 : (!levelManager.CanPlayLevel ? levelManager.CurrentLevelNumber - 2 : levelManager.CurrentLevelNumber - 1);
public void InitLevelObjects()
{
int levelStartVal = GetLevelPageStartVal();
for (int indexI = 0; indexI < levelObjects.Length; indexI++)
{
levelObjects[indexI].SetLevelText(levelStartVal++);
}
StartCoroutine(ShowLevelPageAnims());
}
private void InitLevelsQueue()
{
Debug.Log($"GetLevelStartVal(): {GetLevelPageStartVal()}");
var addBarricade = levelManager.CurrentLevelNumber > levelManager.TotalLevelsCount - diff;
var endIndex = addBarricade ? levelManager.TotalLevelsCount - GetLevelPageStartVal() + 1 : levelObjects.Length;
Debug.Log($"EndIndex: {endIndex}");
for (int indexI = 0; indexI < endIndex; indexI++)
{
levelsQueue.Enqueue(levelObjects[indexI]);
}
if (addBarricade)
{
Debug.Log($"### levelManager.CurrentLevelNumber: {levelManager.CurrentLevelNumber}, {levelManager.TotalLevelsCount - diff}");
Level lvlObj = levelObjects[endIndex];
lvlObj.SetLevelEndBarricade();
lvlObj.gameObject.SetActive(true);
levelsQueue.Enqueue(lvlObj);
}
Debug.Log($"levelsQueue count: {levelsQueue.Count}");
}
private IEnumerator ShowLevelPageAnims()
{
yield return new WaitUntil(() => levelManager != null && levelManager.HasInitializedLevelsData);
InitLevelsQueue();
for (int indexI = 0; indexI < levelObjects.Length; indexI++)
{
// if (levelObjects[indexI].HasBarricade) continue;
levelObjects[indexI].ShowUnselectedLevelView();
}
if ((levelManager.CurrentLevelNumber != 1 && (levelManager.CanPlayLevel || levelManager.LevelState == LevelState.Lost)) || levelManager.CurrentLevelNumber > 2)
{
AlignLevelObjectPositions();
}
Debug.Log($"OnLevelComplete");
CanTriggerScrolling = !levelManager.CanPlayLevel && levelManager.PrevLevelNumber != levelManager.CurrentLevelNumber
&& levelManager.LevelState != LevelState.Lost && levelManager.CurrentLevelNumber != 1;
UpdateLevelPageInfo();
StartCoroutine(StartLevelObjectAnims());
}
private bool CanTriggerScrolling = false;
private void AlignLevelObjectPositions()
{
int levelObjPointIdx = 1;
int levelObjectsLen = levelObjects.Length;
if (!levelManager.CanPlayLevel && levelManager.CurrentLevelNumber >= levelManager.TotalLevelsCount)
{
levelObjectsLen -= 1;
}
else if (levelManager.CurrentLevelNumber > (levelManager.TotalLevelsCount - diff))
{
var decreaseCounter = levelManager.CurrentLevelNumber - (levelManager.TotalLevelsCount - diff);
levelObjectsLen -= decreaseCounter;
}
for (int indexI = 0; indexI < levelObjectsLen; indexI++)
{
levelObjects[indexI].transform.position = levelObjectPoints[levelObjPointIdx].position;
levelObjPointIdx++;
}
}
private IEnumerator StartLevelObjectAnims()
{
foreach (var levelObject in levelsQueue)
{
Debug.Log($"levelObject: {levelObject.name}");
levelObject.PlayScaleInAnims();
yield return new WaitForSeconds(0.25f);
}
Debug.Log($"LEVELNUMBER: PrevLevelNumber: {levelManager.PrevLevelNumber}");
Debug.Log($"LEVELNUMBER: CurrentLevelNumber: {levelManager.CurrentLevelNumber}");
if (CanTriggerScrolling)
TriggerScrollingAnim();
else
{
foreach (var level in levelsQueue)
level.InitListenersLevelObject();
}
}
private void UpdateLevelPageInfo()
{
if (levelManager.CurrentLevelNumber == 1)
{
var testList = levelsQueue.ToList();
testList[0].ShowSelectedLevelView();
testList[0].TogglePlayBtnState(true);
}
else if (levelManager.CurrentLevelNumber == 2)
{
var testList = levelsQueue.ToList();
newUnlockedLvl = testList[1]; // current centered object
newUnlockedLvl.ShowSelectedLevelView();
EnablePlayButton();
newUnlockedLvl.SetLevelText(levelManager.CurrentLevelNumber);
}
else if (levelManager.CurrentLevelNumber <= levelManager.TotalLevelsCount)
{
Debug.Log($"levelQueue first: {levelsQueue.First().LevelNum}");
var testList = levelsQueue.ToList();
var middleIndex = !levelManager.CanPlayLevel ? 2 : 1; // TODO :: use len/2 if possible
newUnlockedLvl = testList[middleIndex]; // current centered object
newUnlockedLvl.ShowSelectedLevelView();
EnablePlayButton();
newUnlockedLvl.SetLevelText(levelManager.CurrentLevelNumber);
Debug.Log($"currentFinishedLvl: {currentFinishedLvl.LevelNum}");
//newUnlockedLvl = testList[2]; // next object/level to show
//newUnlockedLvl.ShowSelectedLevelView();
Debug.Log($"newUnlockedLvl: {newUnlockedLvl.LevelNum}");
}
else
{
newUnlockedLvl = levelsQueue.Last();
Debug.Log($"test1 :: newUnlockedLvl.HasBarricade: {newUnlockedLvl.HasBarricade}, && CanTriggerScrolling: {CanTriggerScrolling}");
newUnlockedLvl.ShowSelectedLevelView();
if (newUnlockedLvl.HasBarricade && !CanTriggerScrolling)
{
newUnlockedLvl.ShowRestartButton();
}
}
}
public void EnablePlayButton()
{
if (levelManager.CanPlayLevel || levelManager.LevelState == LevelState.Lost)
newUnlockedLvl.TogglePlayBtnState(true);
}
public void TriggerScrollingAnim()
{
Tween tween = null, tween1 = null, tween2 = null;
StartTween(out tween, additionalPos: startAdditionalSlideOffset, delay: startTweenDelay, useOffset: true);
tween.OnComplete(() =>
{
// // tween.Kill();
StartTween(out tween1, additionalPos: Vector3.zero, levelObjectSlideDelay, useOffset: false);
tween1.OnComplete(() =>
{
StartTween(out tween2, additionalPos: finalAdditionalSlideOffset, finalTweenDelay, useOffset: false);
tween2.OnComplete(() =>
{
Level cachedLastLevel = levelsQueue.Last();
Level dequeuedLevel = null;
if (levelManager.CurrentLevelNumber > 2 && levelManager.CurrentLevelNumber <= levelManager.TotalLevelsCount)
{
dequeuedLevel = levelsQueue.Dequeue();
dequeuedLevel.gameObject.SetActive(false);
dequeuedLevel.transform.position = levelObjectPoints[levelObjectPoints.Length - 1].position;
if (cachedLastLevel.LevelNum != levelManager.TotalLevelsCount && !cachedLastLevel.HasBarricade)
{
levelsQueue.Enqueue(dequeuedLevel);
dequeuedLevel.gameObject.SetActive(true);
dequeuedLevel.SetLevelText(cachedLastLevel.LevelNum + 1);
}
}
if (!newUnlockedLvl.HasBarricade)
{
newUnlockedLvl.TogglePlayBtnState(true);
newUnlockedLvl.ScaleLevelButton();
}
else
{
newUnlockedLvl.ShowRestartButton();
}
foreach (var level in levelsQueue)
level.InitListenersLevelObject();
});
});
});
}
private void StartTween(out Tween tween, Vector3 additionalPos, float delay, bool useOffset = false)
{
tween = null;
Debug.Log($"StartTween CurrentLevelNumber: {levelManager.CurrentLevelNumber}");
levelObjectPointStartIndex = levelManager.CurrentLevelNumber <= 2 ? 1 : 0;
Debug.Log($"levelObjectPointStartIndex: {levelObjectPointStartIndex}");
var indexer = levelObjectPointStartIndex;
Debug.Log($"Indexer: {indexer}");
foreach (var levelObject in levelsQueue)
{
tween = levelObject.transform.DOMove(useOffset ? levelObject.transform.position + additionalPos : levelObjectPoints[indexer++].position + additionalPos, delay);
}
}
}