This commit is contained in:
SoulliesOfficial
2026-03-14 02:30:26 -04:00
parent cf86f0ee51
commit aee62cd637
2041 changed files with 246771 additions and 129128 deletions

View File

@@ -0,0 +1,78 @@
using UnityEditor;
using UnityEngine;
using System.IO;
using Ichni.RhythmGame.Beatmap;
namespace Ichni.Editor
{
public class IchniProjectDecryptor : EditorWindow
{
[MenuItem("Tools/Ichni/Decrypt Exported Project")]
public static void ShowWindow()
{
// 打开文件夹选择面板,让用户选择被加密(导出)的工程文件夹
string exportFolderPath = EditorUtility.OpenFolderPanel("Select Exported Project Folder", Application.streamingAssetsPath + "/Export", "");
if (string.IsNullOrEmpty(exportFolderPath)) return;
string projectName = new DirectoryInfo(exportFolderPath).Name;
// 选择要输出解密后的工程文件夹(默认为 Projects 文件夹下的同名文件夹)
string saveFolderPath = EditorUtility.SaveFolderPanel("Select Output Directory for Decrypted Project", Application.streamingAssetsPath + "/Projects", projectName);
if (string.IsNullOrEmpty(saveFolderPath)) return;
// 确保输出文件夹存在
if (!Directory.Exists(saveFolderPath))
{
Directory.CreateDirectory(saveFolderPath);
}
bool success = true;
// 分别解密并转存四个主要配置/谱面文件
success &= DecryptAndSave<ProjectInformation_BM>("ProjectInformation", exportFolderPath + "/ProjectInfo.bytes", saveFolderPath + "/ProjectInfo.json");
success &= DecryptAndSave<SongInformation_BM>("SongInformation", exportFolderPath + "/SongInfo.bytes", saveFolderPath + "/SongInfo.json");
success &= DecryptAndSave<BeatmapContainer_BM>("Beatmap", exportFolderPath + "/Beatmap.bytes", saveFolderPath + "/Beatmap.json");
success &= DecryptAndSave<CommandScripts_BM>("CommandScripts", exportFolderPath + "/CommandScripts.bytes", saveFolderPath + "/CommandScripts.json");
if (success)
{
EditorUtility.DisplayDialog("Decryption Complete", $"Project '{projectName}' has been successfully decrypted and saved to:\n{saveFolderPath}", "OK");
}
else
{
EditorUtility.DisplayDialog("Decryption Finished with Warnings", $"Project '{projectName}' decryption finished, but some files might be missing or failed to decode. Check Console for details.", "OK");
}
// 刷新 AssetDatabase
AssetDatabase.Refresh();
}
private static bool DecryptAndSave<T>(string key, string inputPath, string outputPath)
{
if (!File.Exists(inputPath))
{
Debug.LogWarning($"[IchniDecryptor] Missing encrypted file, skipping: {inputPath}");
return true; // 允许部分文件缺失例如可能没有CommandScripts
}
try
{
// 使用导出的加密配置进行读取
T data = ES3.Load<T>(key, inputPath, ProjectManager.ExportSettings);
// 使用明文保存配置转存为 JSON
ES3.Save<T>(key, data, outputPath, ProjectManager.SaveSettings);
Debug.Log($"[IchniDecryptor] Successfully decrypted: {Path.GetFileName(inputPath)} -> {Path.GetFileName(outputPath)}");
return true;
}
catch (System.Exception e)
{
Debug.LogError($"[IchniDecryptor] Failed to decrypt {Path.GetFileName(inputPath)}: {e.Message}\n{e.StackTrace}");
return false;
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 814b828a6867ee948b48bbb57a566645