237 lines
8.7 KiB
C#
237 lines
8.7 KiB
C#
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using UnityEngine.SceneManagement;
|
|||
|
|
|
|||
|
|
public class NextLevel : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
public int ThisLevel;
|
|||
|
|
public int LevelComplete;
|
|||
|
|
int RightComplete;
|
|||
|
|
int CenterComplete;
|
|||
|
|
int LeftComplete;
|
|||
|
|
|
|||
|
|
public int Num;
|
|||
|
|
public int Place;
|
|||
|
|
public string NextScene = "0";
|
|||
|
|
|
|||
|
|
private List<int> HaveSkin = new();
|
|||
|
|
public bool IsMiniGame;
|
|||
|
|
public int MinigameNumber;
|
|||
|
|
public int NPC0QP;
|
|||
|
|
public int QLID;
|
|||
|
|
public bool IsQL;
|
|||
|
|
public bool IsDL;
|
|||
|
|
public bool IsLastLevel;
|
|||
|
|
private string LoadedScene;
|
|||
|
|
[SerializeField] GameObject Tobj;
|
|||
|
|
|
|||
|
|
public int GiveSkin;
|
|||
|
|
|
|||
|
|
//public bool Finished = false;
|
|||
|
|
|
|||
|
|
public static TextAsset csvFile;
|
|||
|
|
public string[] dataLines;
|
|||
|
|
|
|||
|
|
float ttime;
|
|||
|
|
|
|||
|
|
private void Start()
|
|||
|
|
{
|
|||
|
|
csvFile = Resources.Load<TextAsset>("LevelsMeta");
|
|||
|
|
dataLines = csvFile.text.Split('\n');
|
|||
|
|
NPC0QP = PlayerPrefs.GetInt("NPC0QP");
|
|||
|
|
//ThisLevel = SceneManager.GetActiveScene().buildIndex;
|
|||
|
|
LevelComplete = PlayerPrefs.GetInt("LevelComplete");
|
|||
|
|
HaveSkin = Currencies.Load("HaveS");
|
|||
|
|
LeftComplete = PlayerPrefs.GetInt("CompleteLeftL");
|
|||
|
|
CenterComplete = PlayerPrefs.GetInt("CompleteCenterL");
|
|||
|
|
RightComplete = PlayerPrefs.GetInt("RightCompleteL");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Update()
|
|||
|
|
{
|
|||
|
|
ttime += Time.deltaTime;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnTriggerEnter2D(Collider2D collision)
|
|||
|
|
{
|
|||
|
|
/* if (collision.tag == "Player" && !GameObject.Find("player").GetComponent<Move>().Finished)
|
|||
|
|
{
|
|||
|
|
// ПРИНУДИТЕЛЬНАЯ ЗАЩИТА: отключаем флаги мини-игры, если это стандартный уровень
|
|||
|
|
IsMiniGame = false;
|
|||
|
|
IsDL = false;
|
|||
|
|
IsQL = false;
|
|||
|
|
}*/
|
|||
|
|
{GameObject.Find("player").GetComponent<Move>().Finished = true;
|
|||
|
|
//GameObject.Find("Player").SetActive(false);
|
|||
|
|
int WinCount = PlayerPrefs.GetInt("CountWin");
|
|||
|
|
int MinigamesComplete = PlayerPrefs.GetInt("MiniGamesComplete");
|
|||
|
|
PlayerPrefs.SetInt("CountWin", WinCount + 1);
|
|||
|
|
switch (Place)
|
|||
|
|
{
|
|||
|
|
case 0:
|
|||
|
|
if (GiveSkin != 0)
|
|||
|
|
{
|
|||
|
|
HaveSkin = Currencies.Load("HaveS");
|
|||
|
|
if (!HaveSkin.Contains(GiveSkin))
|
|||
|
|
{
|
|||
|
|
HaveSkin.Add(GiveSkin);
|
|||
|
|
}
|
|||
|
|
Currencies.Save("HaveS", HaveSkin);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Если это специфический режим, выполняем его логику
|
|||
|
|
if (IsDL)
|
|||
|
|
{
|
|||
|
|
SceneManager.LoadScene(1);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ДОБАВЛЕНА ПРОВЕРКА: если уровень обычный, игнорируем QL и мини-игры
|
|||
|
|
if (IsQL)
|
|||
|
|
{
|
|||
|
|
switch (QLID)
|
|||
|
|
{
|
|||
|
|
case 0:
|
|||
|
|
if (NPC0QP < 2)
|
|||
|
|
{
|
|||
|
|
PlayerPrefs.SetInt("NPC0QP", 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
End(1);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (IsMiniGame)
|
|||
|
|
{
|
|||
|
|
if (MinigamesComplete < MinigameNumber)
|
|||
|
|
{
|
|||
|
|
PlayerPrefs.SetInt("MiniGamesComplete", MinigameNumber);
|
|||
|
|
}
|
|||
|
|
End("MiniGames");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (ThisLevel == 9)
|
|||
|
|
{
|
|||
|
|
HaveSkin = Currencies.Load("HaveS");
|
|||
|
|
HaveSkin.Add(11);
|
|||
|
|
Currencies.Save("HaveS", HaveSkin);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (IsLastLevel)
|
|||
|
|
{
|
|||
|
|
End("Anim");
|
|||
|
|
PlayerPrefs.SetInt("LevelComplete", ThisLevel);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 1. Сначала обновляем прогресс в PlayerPrefs
|
|||
|
|
if (ThisLevel > LevelComplete && !IsMiniGame && !IsQL && !IsDL)
|
|||
|
|
{
|
|||
|
|
PlayerPrefs.SetInt("LevelComplete", ThisLevel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. УДАЛЯЕМ старый мусорный код загрузки и ВСТАВЛЯЕМ ЭТО:
|
|||
|
|
|
|||
|
|
// Чистим старые объекты, чтобы не было дублей в DDOL
|
|||
|
|
GameObject oldTobj = GameObject.Find("Tobj");
|
|||
|
|
if (oldTobj != null) Destroy(oldTobj);
|
|||
|
|
|
|||
|
|
// Создаем новый контейнер данных
|
|||
|
|
GameObject newTobj = Instantiate(Tobj);
|
|||
|
|
newTobj.name = "Tobj";
|
|||
|
|
newTobj.SetActive(true);
|
|||
|
|
|
|||
|
|
TransferScript ts = newTobj.GetComponent<TransferScript>();
|
|||
|
|
// ВАЖНО: используем ThisLevel + 1 для формирования имени следующей сцены
|
|||
|
|
ts.string1 = "Level" + (ThisLevel + 1);
|
|||
|
|
ts.bool1 = false;
|
|||
|
|
|
|||
|
|
DontDestroyOnLoad(newTobj);
|
|||
|
|
|
|||
|
|
// 3. Запускаем переход через Buttons (он сам сделает Delay и загрузит ImportLeverl)
|
|||
|
|
Buttons.End("ImportLeverl");
|
|||
|
|
|
|||
|
|
// ОБЯЗАТЕЛЬНО: убедись, что после Buttons.End("ImportLeverl")
|
|||
|
|
// в коде НЕТ вызовов других методов типа End(...) или Invoke(...)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
break; // Конец case 0
|
|||
|
|
|
|||
|
|
case 1:
|
|||
|
|
if (Num > LeftComplete)
|
|||
|
|
{
|
|||
|
|
PlayerPrefs.SetInt("CompleteLeftL", Num);
|
|||
|
|
}
|
|||
|
|
if (NextScene == "0")
|
|||
|
|
{
|
|||
|
|
End(SceneManager.GetActiveScene().buildIndex + 1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
End(NextScene);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
if (Num > CenterComplete)
|
|||
|
|
{
|
|||
|
|
PlayerPrefs.SetInt("CompleteCenterL", Num);
|
|||
|
|
}
|
|||
|
|
if (NextScene == "0")
|
|||
|
|
{
|
|||
|
|
End(SceneManager.GetActiveScene().buildIndex + 1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
End(NextScene);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
if (Num > RightComplete)
|
|||
|
|
{
|
|||
|
|
PlayerPrefs.SetInt("CompleteRightL", Num);
|
|||
|
|
}
|
|||
|
|
if (NextScene == "0")
|
|||
|
|
{
|
|||
|
|
End(SceneManager.GetActiveScene().buildIndex + 1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
End(NextScene);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void BackLLast()
|
|||
|
|
{
|
|||
|
|
PlayerPrefs.SetInt("LevelCoplete", 10);
|
|||
|
|
}
|
|||
|
|
public void End(object S)
|
|||
|
|
{
|
|||
|
|
Debug.Log($"[End Called] Scene/Trigger requested: {S}, ThisLevel = {ThisLevel}, Time = {ttime}");
|
|||
|
|
GameObject.FindGameObjectWithTag("Transition").GetComponent<Animator>().SetTrigger("End");
|
|||
|
|
LoadedScene = S.ToString();
|
|||
|
|
Invoke("loadS", 0.75f);
|
|||
|
|
Debug.Log(S);
|
|||
|
|
}
|
|||
|
|
public void loadS()
|
|||
|
|
{
|
|||
|
|
Time.timeScale = 1f;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
int L = int.Parse(LoadedScene);
|
|||
|
|
SceneManager.LoadScene(L);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
SceneManager.LoadScene(LoadedScene);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|