using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using System.IO; using System.Text; using System.Text.RegularExpressions; using UnityEngine.UI; public class pressStart : MonoBehaviour { public string sceneName_toNextScene = "selectYourSongFirst"; public string testModeSceneName = "gamePlay_gamePlay"; [SerializeField] private string banflag_filePath = "C:/ProgramData/Bansonic/Caches/Bansonic_TestOutput"; private bool banflag_exists; public static string testmode_audioFile_path; public static string testmode_bgPicFile_path; public static string testmode_beatmapJSON_path; // new: store banflag content for other scenes to read public static string banflagContent = string.Empty; // UI text to show status public Text statusText; public Text warningText; // polling private Coroutine pollCoroutine; private float pollInterval = 3f; // Start is called before the first frame update void Start() { // sceneName_toNextScene = "Songs_Select"; banflag_exists = false; testmode_audioFile_path = string.Empty; testmode_bgPicFile_path = string.Empty; testmode_beatmapJSON_path = string.Empty; banflagContent = string.Empty; // Ensure status text shows idle UpdateStatus("��ʦ����ר�ã��س�Enter������Ϸ���԰�", Color.green); } // Update is called once per frame private bool check_enterNextScene = false; private static readonly string WARNING_TEXT_CONTENT = "当前处于测试阶段未授权版本版本号:v1.0.0,请注意风险。"; void Update() { // 增加对任何按键或点击的响应,提高 Build 包的兼容性 if (Input.anyKeyDown) { // 排除掉专门用于测试模式的 Enter 键 if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter)) { Debug.Log("[pressStart] Enter detected, starting test mode polling."); GameConfig.testMode = true; if (pollCoroutine != null) StopCoroutine(pollCoroutine); pollCoroutine = StartCoroutine(PollForBanflagAndProceed()); return; } // 正常流程:点击或空格 if (check_enterNextScene) { Debug.Log("[pressStart] Second input detected, loading UI_UI scene. Forcing Time.timeScale = 1."); Time.timeScale = 1f; // Ensure time is running for next scene SceneManager.LoadScene("UI_UI"); return; } Debug.Log("[pressStart] First input detected, setting check_enterNextScene = true"); GameConfig.testMode = false; if (warningText != null) { warningText.gameObject.SetActive(true); warningText.text = WARNING_TEXT_CONTENT; } check_enterNextScene = true; } } private IEnumerator PollForBanflagAndProceed() { UpdateStatus("Waiting for banflag...", new Color(1f, 0.5f, 0f)); // orange while (true) { bool found = check_banflag_testBanflag(); if (found) { UpdateStatus("Banflag detected. Loading test mode...", Color.green); // small delay to show status yield return new WaitForSeconds(0.5f); AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(testModeSceneName); while (!asyncLoad.isDone) { yield return null; } yield break; } else { UpdateStatus("Waiting for banflag...", new Color(1f, 0.5f, 0f)); // orange } yield return new WaitForSeconds(pollInterval); } } private IEnumerator LoadSceneAsync(string sceneName) { AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName); while (!asyncLoad.isDone) { yield return null; } } private void UpdateStatus(string message, Color color) { if (statusText != null) { statusText.text = message; statusText.color = color; } Debug.Log(message); } private string NormalizeToForwardSlashes(string path) { if (string.IsNullOrEmpty(path)) return string.Empty; try { // Get full absolute path to remove any relative segments string full = Path.GetFullPath(path); // Replace backslashes with forward slashes string fwd = full.Replace('\\', '/'); // Collapse multiple slashes into single string collapsed = Regex.Replace(fwd, "/{2,}", "/"); // Remove trailing slash except when path is root like "C:/" if (collapsed.Length > 3 && collapsed.EndsWith("/")) collapsed = collapsed.TrimEnd('/'); return collapsed; } catch { // Fallback: replace backslashes and collapse string f = path.Replace('\\', '/'); string c = Regex.Replace(f, "/{2,}", "/"); if (c.Length > 3 && c.EndsWith("/")) c = c.TrimEnd('/'); return c; } } // returns true if banflag detected private bool check_banflag_testBanflag() { try { // reset previous results banflag_exists = false; testmode_audioFile_path = string.Empty; testmode_bgPicFile_path = string.Empty; testmode_beatmapJSON_path = string.Empty; banflagContent = string.Empty; if (string.IsNullOrEmpty(banflag_filePath)) { Debug.LogWarning("banflag_filePath δ���á�"); UpdateStatus("Error: banflag path not configured", Color.red); return false; } string filePath = Path.Combine(banflag_filePath, "test.banflag"); if (!File.Exists(filePath)) { Debug.LogWarning($"δ�ҵ���Ӧ banflag �ļ�: {filePath}"); return false; } // mark exists banflag_exists = true; byte[] data = File.ReadAllBytes(filePath); if (data == null || data.Length == 0) { Debug.LogWarning($"banflag �ļ�Ϊ��: {filePath}"); } else { // ��UTF8��ȡ������Ϊ�����л��ı��� string text = null; try { text = Encoding.UTF8.GetString(data); } catch { text = null; } bool looksLikeText = false; if (!string.IsNullOrEmpty(text)) { // �Ƿ�����������ɴ�ӡ�ַ� int nonPrintable = 0; int checkLen = Mathf.Min(256, text.Length); for (int i = 0; i < checkLen; i++) { char c = text[i]; if (char.IsControl(c) && c != '\r' && c != '\n' && c != '\t') nonPrintable++; } looksLikeText = (nonPrintable == 0); } if (looksLikeText) { Debug.Log($"�ҵ� banflag �ļ�: {filePath}\n����:\n{text}"); // store the readable content for other scenes banflagContent = text; } else { // ���ǿɶ��ı�תΪbase64 string base64 = System.Convert.ToBase64String(data); Debug.Log($"�ҵ� banflag �ļ� (������): {filePath}������={data.Length} bytes��Base64 ǰ200 �ַ����鿴:\n{(base64.Length > 200 ? base64.Substring(0,200) + "..." : base64)}"); banflagContent = $"[Binary Data] Length: {data.Length} bytes"; } } // ����ͬĿ¼��ָ�������ļ� string dir = Path.GetDirectoryName(filePath); if (string.IsNullOrEmpty(dir)) dir = banflag_filePath; // find JSON string foundJson = string.Empty; try { string[] jsons = Directory.GetFiles(dir, "*.json", SearchOption.TopDirectoryOnly); if (jsons != null && jsons.Length > 0) { foundJson = jsons[0]; } } catch { } // find audio: mp3, wav, ogg (in that priority) string foundAudio = string.Empty; try { string[] exts = new string[] { "*.mp3", "*.wav", "*.ogg" }; foreach (var pat in exts) { string[] matches = Directory.GetFiles(dir, pat, SearchOption.TopDirectoryOnly); if (matches != null && matches.Length > 0) { foundAudio = matches[0]; break; } } } catch { } // find image: jpg/jpeg, png (priority jpg then png) string foundImage = string.Empty; try { string[] imgExts = new string[] { "*.jpg", "*.jpeg", "*.png" }; foreach (var pat in imgExts) { string[] matches = Directory.GetFiles(dir, pat, SearchOption.TopDirectoryOnly); if (matches != null && matches.Length > 0) { foundImage = matches[0]; break; } } } catch { } // normalize and assign testmode_beatmapJSON_path = string.IsNullOrEmpty(foundJson) ? string.Empty : NormalizeToForwardSlashes(foundJson); testmode_audioFile_path = string.IsNullOrEmpty(foundAudio) ? string.Empty : NormalizeToForwardSlashes(foundAudio); testmode_bgPicFile_path = string.IsNullOrEmpty(foundImage) ? string.Empty : NormalizeToForwardSlashes(foundImage); // Debug the normalized paths Debug.Log($"banflag_exists={banflag_exists}"); Debug.Log($"testmode_beatmapJSON_path = {testmode_beatmapJSON_path}"); Debug.Log($"testmode_audioFile_path = {testmode_audioFile_path}"); Debug.Log($"testmode_bgPicFile_path = {testmode_bgPicFile_path}"); UpdateStatus("Banflag found", Color.green); return banflag_exists; } catch (System.Exception ex) { Debug.LogError($"��ȡ banflag �ļ�ʱ����: {ex}"); UpdateStatus("Error reading banflag", Color.red); // ensure flags cleared on error banflag_exists = false; testmode_audioFile_path = string.Empty; testmode_bgPicFile_path = string.Empty; testmode_beatmapJSON_path = string.Empty; banflagContent = string.Empty; return false; } } }