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 void Update() { bool check_enterNextScene = false; if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) { if (check_enterNextScene) return; GameConfig.testMode = false; warningText.text = "你正在尝试进入未完整开发版本,点击y键忽略警告进入。"; check_enterNextScene = true; } if (Input.GetKeyDown(KeyCode.Mouse0) && check_enterNextScene) { SceneManager.LoadScene("UI_UI"); } // Enter进入测试模式,不加载json,开始轮询banflag if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter)) { Debug.Log("Entering test mode"); GameConfig.testMode = true; // start polling for banflag every 3 seconds if (pollCoroutine != null) { StopCoroutine(pollCoroutine); } pollCoroutine = StartCoroutine(PollForBanflagAndProceed()); } } 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); SceneManager.LoadScene(testModeSceneName); yield break; } else { UpdateStatus("Waiting for banflag...", new Color(1f, 0.5f, 0f)); // orange } yield return new WaitForSeconds(pollInterval); } } 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; } } }