using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Bansonic; using UnityEngine.SceneManagement; #if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX using Steamworks; #endif #if UNITY_EDITOR using UnityEditor; #endif public class userSettings : MonoBehaviour { [Header("Inspector")] [Tooltip("Documentation text normalized.")] public Text user_login_source_text; [Tooltip("Documentation text normalized.")] public Text user_source_uid_text; [Header("Inspector")] [Tooltip("Documentation text normalized.")] public Dropdown language_dropdown; [Header("Inspector")] [Tooltip("Documentation text normalized.")] public Button export_saveData_button; [Tooltip("Documentation text normalized.")] public Button import_saveData_button; [Tooltip("Documentation text normalized.")] public Button clearup_saveData_button; [Header("Inspector")] [Tooltip("Documentation text normalized.")] public Button view_detailedHighlight_button; private const string RuntimeResourcesPath = "song_songIndex"; private const string EditorAssetsPath = "Assets/Resources/song_songIndex"; [SerializeField] private float clearupConfirmSeconds = 5f; private int clearupClickCount = 0; private float clearupExpireTime; private bool _updatingLanguageDropdown; private readonly List _availableLanguageCodes = new List(); private void Start() { InitializeLanguageDropdown(); UpdateUserInfoDisplay(); } private void UpdateUserInfoDisplay() { #if UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX if (SteamManager.Initialized) { if (user_login_source_text != null) { string branch; if (SteamApps.GetCurrentBetaName(out branch, 64)) { user_login_source_text.text = "(Steam) " + branch; } else { user_login_source_text.text = LocalizationService.Get("settings.source.steam_public", "(Steam) public"); } } if (user_source_uid_text != null) { CSteamID steamID = SteamUser.GetSteamID(); string personaName = SteamFriends.GetPersonaName(); user_source_uid_text.text = string.Format("{0} ({1})", personaName, steamID.m_SteamID.ToString()); } return; } #endif if (user_login_source_text != null) user_login_source_text.text = LocalizationService.Get("settings.source.unknown_server", "Unknown Server"); if (user_source_uid_text != null) user_source_uid_text.text = LocalizationService.Get("settings.source.unknown_user", "Unknown User"); } private void OnEnable() { LocalizationService.LanguageChanged += HandleLanguageChanged; if (clearup_saveData_button != null) clearup_saveData_button.onClick.AddListener(OnClearupSaveDataClicked); if (export_saveData_button != null) export_saveData_button.onClick.AddListener(OnUnimplementedFeatureClicked); if (import_saveData_button != null) import_saveData_button.onClick.AddListener(OnUnimplementedFeatureClicked); if (view_detailedHighlight_button != null) view_detailedHighlight_button.onClick.AddListener(OnUnimplementedFeatureClicked); if (language_dropdown != null) language_dropdown.onValueChanged.AddListener(OnLanguageDropdownValueChanged); ResetClearupCounter(); InitializeLanguageDropdown(); SyncLanguageDropdownValue(); } private void OnDisable() { LocalizationService.LanguageChanged -= HandleLanguageChanged; if (clearup_saveData_button != null) clearup_saveData_button.onClick.RemoveListener(OnClearupSaveDataClicked); if (export_saveData_button != null) export_saveData_button.onClick.RemoveListener(OnUnimplementedFeatureClicked); if (import_saveData_button != null) import_saveData_button.onClick.RemoveListener(OnUnimplementedFeatureClicked); if (view_detailedHighlight_button != null) view_detailedHighlight_button.onClick.RemoveListener(OnUnimplementedFeatureClicked); if (language_dropdown != null) language_dropdown.onValueChanged.RemoveListener(OnLanguageDropdownValueChanged); ResetClearupCounter(); } private void Update() { if (clearupClickCount > 0 && Time.unscaledTime > clearupExpireTime) { ResetClearupCounter(); } } private void ResetClearupCounter() { clearupClickCount = 0; } // 导出/导入存档、查看详细高光等按钮已定义 UI 但尚未接入实际逻辑, // 点击时提示功能未开放。仍复位危险操作确认计数,保持原有副作用。 private void OnUnimplementedFeatureClicked() { ResetClearupCounter(); gNotice.error.display(LocalizationService.LocalizeLiteral("功能未开放")); } private void InitializeLanguageDropdown() { if (language_dropdown == null) { return; } LocalizationService.EnsureInitialized(); IReadOnlyList availableCodes = LocalizationService.GetAvailableLanguageCodes(); _availableLanguageCodes.Clear(); List options = new List(); for (int i = 0; i < availableCodes.Count; i++) { string code = availableCodes[i]; _availableLanguageCodes.Add(code); options.Add(new Dropdown.OptionData(GetLanguageDisplayName(code))); } if (options.Count == 0) { _availableLanguageCodes.Add(LocalizationService.DefaultLanguageCode); _availableLanguageCodes.Add("en-US"); options.Add(new Dropdown.OptionData("简体中文")); options.Add(new Dropdown.OptionData("English")); } _updatingLanguageDropdown = true; language_dropdown.ClearOptions(); language_dropdown.AddOptions(options); language_dropdown.RefreshShownValue(); _updatingLanguageDropdown = false; SyncLanguageDropdownValue(); } private static string GetLanguageDisplayName(string languageCode) { if (string.IsNullOrWhiteSpace(languageCode)) { return "Unknown"; } if (languageCode.StartsWith("zh", System.StringComparison.OrdinalIgnoreCase)) { return "简体中文"; } if (languageCode.StartsWith("en", System.StringComparison.OrdinalIgnoreCase)) { return "English"; } return languageCode; } private void SyncLanguageDropdownValue() { if (language_dropdown == null || _availableLanguageCodes.Count == 0) { return; } string currentCode = LocalizationService.CurrentLanguageCode; int index = GetLanguageDropdownIndex(currentCode); _updatingLanguageDropdown = true; language_dropdown.SetValueWithoutNotify(index); language_dropdown.RefreshShownValue(); _updatingLanguageDropdown = false; } private int GetLanguageDropdownIndex(string languageCode) { for (int i = 0; i < _availableLanguageCodes.Count; i++) { if (string.Equals(_availableLanguageCodes[i], languageCode, System.StringComparison.OrdinalIgnoreCase)) { return i; } } for (int i = 0; i < _availableLanguageCodes.Count; i++) { if (languageCode.StartsWith("zh", System.StringComparison.OrdinalIgnoreCase) && _availableLanguageCodes[i].StartsWith("zh", System.StringComparison.OrdinalIgnoreCase)) { return i; } if (languageCode.StartsWith("en", System.StringComparison.OrdinalIgnoreCase) && _availableLanguageCodes[i].StartsWith("en", System.StringComparison.OrdinalIgnoreCase)) { return i; } } return 0; } private void OnLanguageDropdownValueChanged(int index) { ResetClearupCounter(); if (_updatingLanguageDropdown || _availableLanguageCodes.Count == 0) { return; } if (index < 0 || index >= _availableLanguageCodes.Count) { index = 0; } string targetLanguageCode = _availableLanguageCodes[index]; if (IsTemporarilyUnsupportedLanguage(targetLanguageCode)) { gNotice.error.display(LocalizationService.LocalizeLiteral("暂不支持该语言")); SyncLanguageDropdownValue(); return; } LocalizationService.SetLanguage(targetLanguageCode); } private void HandleLanguageChanged(string languageCode) { SyncLanguageDropdownValue(); UpdateUserInfoDisplay(); } private static bool IsTemporarilyUnsupportedLanguage(string languageCode) { return !string.IsNullOrWhiteSpace(languageCode) && languageCode.StartsWith("en", System.StringComparison.OrdinalIgnoreCase); } private void OnClearupSaveDataClicked() { if (clearupClickCount > 0 && Time.unscaledTime > clearupExpireTime) { ResetClearupCounter(); } clearupClickCount++; clearupExpireTime = Time.unscaledTime + clearupConfirmSeconds; if (clearupClickCount == 1) { gNotice.warning.display(LocalizationService.LocalizeLiteral("此操作将重置存档")); } else if (clearupClickCount == 2) { gNotice.error.display(LocalizationService.LocalizeLiteral("再次点击以确认此危险操作")); } else if (clearupClickCount >= 3) { ResetClearupCounter(); StartCoroutine(ClearSongDataRoutine()); } } private IEnumerator ClearSongDataRoutine() { Dictionary songs = new Dictionary(); SongData[] runtimeSongs = RuntimeResourcesCache.LoadSongsFromPath(RuntimeResourcesPath); if (runtimeSongs != null) { for (int i = 0; i < runtimeSongs.Length; i++) { SongData so = runtimeSongs[i]; if (so != null && !songs.ContainsKey(so.songID)) songs.Add(so.songID, so); if ((i % 24) == 0) yield return null; } } #if UNITY_EDITOR string[] guids = AssetDatabase.FindAssets("t:SongData", new[] { EditorAssetsPath }); if (guids != null) { for (int i = 0; i < guids.Length; i++) { string path = AssetDatabase.GUIDToAssetPath(guids[i]); SongData so = AssetDatabase.LoadAssetAtPath(path); if (so != null && !songs.ContainsKey(so.songID)) songs.Add(so.songID, so); if ((i % 24) == 0) yield return null; } } #endif int index = 0; foreach (var kvp in songs) { SongData so = kvp.Value; if (so != null) so.ClearSaveDataAndReload(); index++; if ((index % 16) == 0) yield return null; } AllyHeroDeployLedger.EnsureInstance().ResetGrowthProgressOnly(); yield return null; ExpBottleLedger.EnsureInstance().ResetAllToZero(); yield return null; DushMaterialLedger.EnsureInstance().ResetAllToZero(); yield return null; EquipmentConsumableLedger.EnsureInstance().ResetAllToZero(); yield return null; AllyHero_SO.ClearAllEquippedSkills(); yield return null; equipSmelt.ClearPersistentState(); yield return null; PlayerPrefs.DeleteKey("bansonic_equipment_next_id_v1"); yield return null; Bansonic.equipmentGenerator.ClearRuntimeGeneratedPersistence(); yield return null; PlayerRksService.ClearPersistentState(); yield return null; PlayerSkillService.ClearPersistentState(); yield return null; #if UNITY_EDITOR AssetDatabase.SaveAssets(); #endif if (!gTransition.LoadScene("Main_main", LoadSceneMode.Single)) { SceneManager.LoadScene("Main_main"); } } }