286 lines
10 KiB
C#
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;
|
|
}
|
|
}
|
|
} |