add the connections and sendToTest.cs for connecting with the game test
This commit is contained in:
@@ -2,25 +2,285 @@ 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";
|
||||
// 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))
|
||||
if (Input.GetKeyDown(KeyCode.Space) /*|| Input.GetMouseButtonDown(0)*/)
|
||||
{
|
||||
SceneManager.LoadScene(sceneName_toNextScene);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user