Files
bansonic_beta_main/Assets/scripts/Main_main/pressStart.cs
T

286 lines
10 KiB
C#

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()
{
if (Input.GetKeyDown(KeyCode.Space) /*|| Input.GetMouseButtonDown(0)*/)
{
GameConfig.testMode = false;
warningText.text = "<color=orange>你正在尝试进入</color><color=red>未完整开发</color><color=orange>版本,点击</color><color=red>y键</color><color=orange>忽略警告进入。</color>";
if (Input.GetKeyDown(KeyCode.Y))
{
SceneManager.LoadScene(sceneName_toNextScene);
}
}
// 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;
}
}
}