diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs index 6bda9d53..b57a6458 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs @@ -31,6 +31,11 @@ internal sealed class SettingEntry /// public const string SystemBackdropType = "SystemBackdropType"; + /// + /// 启用高级功能 + /// + public const string IsAdvancedLaunchOptionsEnabled = "IsAdvancedLaunchOptionsEnabled"; + /// /// 实时便笺刷新时间 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Avatar/Avatar.Implementation.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Avatar/Avatar.Implementation.cs index ea1ae0ba..bc14e22d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Avatar/Avatar.Implementation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Avatar/Avatar.Implementation.cs @@ -1,13 +1,13 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Model.Binding.Hutao; using Snap.Hutao.Model.Calculable; using Snap.Hutao.Model.Metadata.Abstraction; using Snap.Hutao.Model.Metadata.Converter; using Snap.Hutao.Model.Metadata.Item; using Snap.Hutao.ViewModel.Complex; using Snap.Hutao.ViewModel.GachaLog; +using Snap.Hutao.ViewModel.Wiki; namespace Snap.Hutao.Model.Metadata.Avatar; @@ -36,6 +36,7 @@ internal partial class Avatar : IStatisticsItemSource, ISummaryItemSource, IName /// /// 最大等级 /// + [SuppressMessage("", "CA1822")] public int MaxLevel { get => 90; } /// diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Item/Material.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Item/Material.cs index 1a2906a7..b6a041a1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Item/Material.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Item/Material.cs @@ -3,6 +3,7 @@ using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Model.Primitive; +using Snap.Hutao.ViewModel.Cultivation; using System.Collections.Immutable; namespace Snap.Hutao.Model.Metadata.Item; @@ -81,6 +82,7 @@ internal sealed class Material : Display return true; } + // TODO: Currently only support CN return TypeDescription switch { "角色与武器培养素材" => true, @@ -114,23 +116,23 @@ internal sealed class Material : Display /// 获取物品对应的 DaysOfWeek /// /// DaysOfWeek - public Binding.Cultivation.DaysOfWeek GetDaysOfWeek() + public DaysOfWeek GetDaysOfWeek() { if (MondayThursdayItems.Contains(Id)) { - return Binding.Cultivation.DaysOfWeek.MondayAndThursday; + return DaysOfWeek.MondayAndThursday; } if (TuesdayFridayItems.Contains(Id)) { - return Binding.Cultivation.DaysOfWeek.TuesdayAndFriday; + return DaysOfWeek.TuesdayAndFriday; } if (WednesdaySaturdayItems.Contains(Id)) { - return Binding.Cultivation.DaysOfWeek.WednesdayAndSaturday; + return DaysOfWeek.WednesdayAndSaturday; } - return Binding.Cultivation.DaysOfWeek.Any; + return DaysOfWeek.Any; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index 737cbf0c..baecfbb4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -3561,6 +3561,15 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 启用「启动游戏-高级功能」的任意功能 您需要在设置里解锁它 的本地化字符串。 + /// + internal static string ViewPageLaunchGameAdvancedFeatureElevationHint { + get { + return ResourceManager.GetString("ViewPageLaunchGameAdvancedFeatureElevationHint", resourceCulture); + } + } + /// /// 查找类似 高级功能 的本地化字符串。 /// @@ -4191,6 +4200,33 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 的本地化字符串。 + /// + internal static string ViewPageSettingIsAdvancedLaunchOptionsEnabledDescription { + get { + return ResourceManager.GetString("ViewPageSettingIsAdvancedLaunchOptionsEnabledDescription", resourceCulture); + } + } + + /// + /// 查找类似 启动高级功能 的本地化字符串。 + /// + internal static string ViewPageSettingIsAdvancedLaunchOptionsEnabledHeader { + get { + return ResourceManager.GetString("ViewPageSettingIsAdvancedLaunchOptionsEnabledHeader", resourceCulture); + } + } + + /// + /// 查找类似 您解锁了「启动游戏-高级功能」!其含有潜在违反原神服务条款的风险,一旦启用,您将咨询承担可能的后果。慎重选择! 的本地化字符串。 + /// + internal static string ViewPageSettingFeaturesDangerousHint { + get { + return ResourceManager.GetString("ViewPageSettingFeaturesDangerousHint", resourceCulture); + } + } + /// /// 查找类似 Github 上反馈的问题会优先处理 的本地化字符串。 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 29cf45c9..16e664c4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -1284,6 +1284,9 @@ 启动游戏 + + 启用「启动游戏-高级功能」的任意功能 您需要在设置里解锁它 + 高级功能 @@ -1494,6 +1497,15 @@ 显示 + + 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 + + + 启动高级功能 + + + 您解锁了「启动游戏-高级功能」!其含有潜在违反原神服务条款的风险,一旦启用,您将咨询承担可能的后果。慎重选择! + Github 上反馈的问题会优先处理 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index fa0dd172..b76dfb3e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -6,6 +6,7 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Snap.Hutao.Core.Database; +using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Database; using System.Globalization; @@ -24,6 +25,7 @@ internal sealed class AppOptions : ObservableObject, IOptions private bool? isEmptyHistoryWishVisible; private Core.Windowing.BackdropType? backdropType; private CultureInfo? currentCulture; + private bool? isAdvancedLaunchOptionsEnabled; /// /// 构造一个新的应用程序选项 @@ -171,6 +173,40 @@ internal sealed class AppOptions : ObservableObject, IOptions } } + /// + /// 是否启用高级功能 + /// + public bool IsAdvancedLaunchOptionsEnabled + { + get + { + if (isAdvancedLaunchOptionsEnabled == null) + { + using (IServiceScope scope = serviceScopeFactory.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + string? value = appDbContext.Settings.SingleOrDefault(e => e.Key == SettingEntry.IsAdvancedLaunchOptionsEnabled)?.Value; + isAdvancedLaunchOptionsEnabled = value != null && bool.Parse(value); + } + } + + return isAdvancedLaunchOptionsEnabled.Value; + } + + set + { + if (SetProperty(ref isAdvancedLaunchOptionsEnabled, value)) + { + using (IServiceScope scope = serviceScopeFactory.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + appDbContext.Settings.ExecuteDeleteWhere(e => e.Key == SettingEntry.IsAdvancedLaunchOptionsEnabled); + appDbContext.Settings.AddAndSave(new(SettingEntry.IsAdvancedLaunchOptionsEnabled, value.ToString())); + } + } + } + } + /// public AppOptions Value { get => this; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs index 9f3d22fc..beb0d7c0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs @@ -13,11 +13,8 @@ using Snap.Hutao.Model.Entity.Primitive; using Snap.Hutao.Model.Metadata.Item; using Snap.Hutao.Model.Primitive; using Snap.Hutao.Service.Metadata; +using Snap.Hutao.ViewModel.Cultivation; using System.Collections.ObjectModel; -using BindingCultivateEntry = Snap.Hutao.Model.Binding.Cultivation.CultivateEntryView; -using BindingCultivateItem = Snap.Hutao.Model.Binding.Cultivation.CultivateItem; -using BindingInventoryItem = Snap.Hutao.Model.Binding.Inventory.InventoryItem; -using BindingStatisticsItem = Snap.Hutao.Model.Binding.Cultivation.StatisticsCultivateItem; namespace Snap.Hutao.Service.Cultivation; @@ -64,7 +61,7 @@ internal sealed class CultivationService : ICultivationService try { - Current ??= projects.SingleOrDefault(proj => proj.IsSelected); + Current ??= projects.SelectedOrDefault(); } catch (DbUpdateConcurrencyException ex) { @@ -129,7 +126,7 @@ internal sealed class CultivationService : ICultivationService } /// - public List GetInventoryItems(CultivateProject cultivateProject, List metadata, ICommand saveCommand) + public List GetInventoryItems(CultivateProject cultivateProject, List metadata, ICommand saveCommand) { Guid projectId = cultivateProject.InnerId; using (IServiceScope scope = scopeFactory.CreateScope()) @@ -139,7 +136,7 @@ internal sealed class CultivationService : ICultivationService .Where(a => a.ProjectId == projectId) .ToList(); - List results = new(); + List results = new(); foreach (Material meta in metadata.Where(m => m.IsInventoryItem()).OrderBy(m => m.Id)) { InventoryItem entity = entities.SingleOrDefault(e => e.ItemId == meta.Id) ?? InventoryItem.Create(projectId, meta.Id); @@ -151,7 +148,7 @@ internal sealed class CultivationService : ICultivationService } /// - public async Task> GetCultivateEntriesAsync(CultivateProject cultivateProject) + public async Task> GetCultivateEntriesAsync(CultivateProject cultivateProject) { await ThreadHelper.SwitchToBackgroundAsync(); using (IServiceScope scope = scopeFactory.CreateScope()) @@ -163,7 +160,7 @@ internal sealed class CultivationService : ICultivationService Dictionary idAvatarMap = await metadataService.GetIdToAvatarMapAsync().ConfigureAwait(false); Dictionary idWeaponMap = await metadataService.GetIdToWeaponMapAsync().ConfigureAwait(false); - List results = new(); + List results = new(); List entries = await appDbContext.CultivateEntries .Where(e => e.ProjectId == cultivateProject.InnerId) .ToListAsync() @@ -173,7 +170,7 @@ internal sealed class CultivationService : ICultivationService { Guid entryId = entry.InnerId; - List resultItems = new(); + List resultItems = new(); foreach (CultivateItem item in await GetEntryItemsAsync(appDbContext, entryId).ConfigureAwait(false)) { @@ -197,11 +194,11 @@ internal sealed class CultivationService : ICultivationService } /// - public async Task> GetStatisticsCultivateItemCollectionAsync(CultivateProject cultivateProject, CancellationToken token) + public async Task> GetStatisticsCultivateItemCollectionAsync(CultivateProject cultivateProject, CancellationToken token) { using (IServiceScope scope = scopeFactory.CreateScope()) { - List resultItems = new(); + List resultItems = new(); AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); List materials = await scope.ServiceProvider @@ -222,7 +219,7 @@ internal sealed class CultivationService : ICultivationService continue; } - if (resultItems.SingleOrDefault(i => i.Inner.Id == item.ItemId) is BindingStatisticsItem existedItem) + if (resultItems.SingleOrDefault(i => i.Inner.Id == item.ItemId) is StatisticsCultivateItem existedItem) { existedItem.Count += item.Count; } @@ -237,7 +234,7 @@ internal sealed class CultivationService : ICultivationService foreach (InventoryItem inventoryItem in await GetProjectInventoryAsync(appDbContext, projectId).ConfigureAwait(false)) { - if (resultItems.SingleOrDefault(i => i.Inner.Id == inventoryItem.ItemId) is BindingStatisticsItem existedItem) + if (resultItems.SingleOrDefault(i => i.Inner.Id == inventoryItem.ItemId) is StatisticsCultivateItem existedItem) { existedItem.TotalCount += inventoryItem.Count; } @@ -264,7 +261,7 @@ internal sealed class CultivationService : ICultivationService } /// - public void SaveInventoryItem(BindingInventoryItem item) + public void SaveInventoryItem(InventoryItemView item) { using (IServiceScope scope = scopeFactory.CreateScope()) { @@ -295,7 +292,7 @@ internal sealed class CultivationService : ICultivationService try { - Current ??= appDbContext.CultivateProjects.AsNoTracking().SingleOrDefault(proj => proj.IsSelected); + Current ??= appDbContext.CultivateProjects.AsNoTracking().SelectedOrDefault(); } catch (InvalidOperationException ex) { diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs index 324c20fe..b7fbc887 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs @@ -1,10 +1,10 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Model.Binding.Cultivation; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Primitive; using Snap.Hutao.Model.Metadata.Item; +using Snap.Hutao.ViewModel.Cultivation; using Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate; using System.Collections.ObjectModel; @@ -35,7 +35,7 @@ internal interface ICultivationService /// 元数据 /// 保存命令 /// 物品列表 - List GetInventoryItems(CultivateProject cultivateProject, List metadata, ICommand saveCommand); + List GetInventoryItems(CultivateProject cultivateProject, List metadata, ICommand saveCommand); /// /// 获取用于绑定的项目集合 @@ -84,7 +84,7 @@ internal interface ICultivationService /// 保存单个物品 /// /// 物品 - void SaveInventoryItem(Model.Binding.Inventory.InventoryItem item); + void SaveInventoryItem(InventoryItemView item); /// /// 异步尝试添加新的项目 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs index 6c7d14ac..adc7a248 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs @@ -301,15 +301,16 @@ internal sealed class GameService : IGameService try { Interlocked.Increment(ref runningGamesCounter); - bool isElevated = Activation.GetElevated(); game.Start(); - if (isElevated && launchOptions.MultipleInstances) + + bool isAdvancedOptionsAllowed = Activation.GetElevated() && appOptions.IsAdvancedLaunchOptionsEnabled; + if (isAdvancedOptionsAllowed && launchOptions.MultipleInstances) { - await ProcessInterop.DisableProtectionAsync(game, gamePath).ConfigureAwait(false); + ProcessInterop.DisableProtection(game, gamePath); } - if (isElevated && launchOptions.UnlockFps) + if (isAdvancedOptionsAllowed && launchOptions.UnlockFps) { await ProcessInterop.UnlockFpsAsync(game, launchOptions).ConfigureAwait(false); } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs index ee12a971..a01101ac 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/ProcessInterop.cs @@ -2,11 +2,9 @@ // Licensed under the MIT license. using Snap.Hutao.Core; -using Snap.Hutao.Core.IO; using Snap.Hutao.Service.Game.Unlocker; using System.Diagnostics; using System.IO; -using System.Runtime.InteropServices; namespace Snap.Hutao.Service.Game; @@ -69,21 +67,17 @@ internal static class ProcessInterop /// 游戏进程 /// 游戏路径 /// 是否禁用成功 - public static async Task DisableProtectionAsync(Process game, string gamePath) + public static bool DisableProtection(Process game, string gamePath) { string? gameFolder = Path.GetDirectoryName(gamePath); if (!string.IsNullOrEmpty(gameFolder)) { - string pbasePath = Path.Combine(gameFolder, "mhypbase.dll"); - SafeHandle handle = File.OpenHandle(pbasePath, share: FileShare.None); - while (true) { - if (game.MainWindowHandle != nint.Zero) { - handle.Close(); - break; - } - await Task.Delay(100).ConfigureAwait(false); + string mhypbaseDll = Path.Combine(gameFolder, "mhypbase.dll"); + using (File.OpenHandle(mhypbaseDll, share: FileShare.None)) + { + SpinWait.SpinUntil(() => game.MainWindowHandle != 0); + return true; } - return true; } return false; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml.cs index 4f7e6567..15318fa6 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml.cs @@ -4,7 +4,7 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Snap.Hutao.Control; -using Snap.Hutao.Model.Binding.BaseValue; +using Snap.Hutao.ViewModel.Wiki; namespace Snap.Hutao.View.Control; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml index 05972186..2c285939 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml @@ -251,12 +251,18 @@ - + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml.cs index ab04e179..a3ad6ff2 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using Snap.Hutao.Control; -using Snap.Hutao.ViewModel; +using Snap.Hutao.ViewModel.Wiki; namespace Snap.Hutao.View.Page; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml index 834af513..25f83b4f 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml @@ -12,10 +12,10 @@ xmlns:shci="using:Snap.Hutao.Control.Image" xmlns:shcm="using:Snap.Hutao.Control.Markup" xmlns:shcp="using:Snap.Hutao.Control.Panel" - xmlns:shv="using:Snap.Hutao.ViewModel" xmlns:shvc="using:Snap.Hutao.View.Control" + xmlns:shvw="using:Snap.Hutao.ViewModel.Wiki" xmlns:wsc="using:WinUICommunity.SettingsUI.Controls" - d:DataContext="{d:DesignInstance Type=shv:WikiMonsterViewModel}" + d:DataContext="{d:DesignInstance Type=shvw:WikiMonsterViewModel}" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" mc:Ignorable="d"> diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml.cs index 7f04b2dd..2610c647 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiMonsterPage.xaml.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using Snap.Hutao.Control; -using Snap.Hutao.ViewModel; +using Snap.Hutao.ViewModel.Wiki; namespace Snap.Hutao.View.Page; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml index a06b11d7..8b62d175 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml @@ -13,9 +13,9 @@ xmlns:shcm="using:Snap.Hutao.Control.Markup" xmlns:shcp="using:Snap.Hutao.Control.Panel" xmlns:shct="using:Snap.Hutao.Control.Text" - xmlns:shv="using:Snap.Hutao.ViewModel" xmlns:shvc="using:Snap.Hutao.View.Control" - d:DataContext="{d:DesignInstance Type=shv:WikiWeaponViewModel}" + xmlns:shvw="using:Snap.Hutao.ViewModel.Wiki" + d:DataContext="{d:DesignInstance Type=shvw:WikiWeaponViewModel}" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" mc:Ignorable="d"> diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml.cs index f8829cfd..1f76afab 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiWeaponPage.xaml.cs @@ -2,7 +2,7 @@ // Licensed under the MIT license. using Snap.Hutao.Control; -using Snap.Hutao.ViewModel; +using Snap.Hutao.ViewModel.Wiki; namespace Snap.Hutao.View.Page; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateEntryView.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateEntryView.cs index 72644e00..1a9f411a 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateEntryView.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateEntryView.cs @@ -1,7 +1,9 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -namespace Snap.Hutao.Model.Binding.Cultivation; +using Snap.Hutao.Model.Binding; + +namespace Snap.Hutao.ViewModel.Cultivation; /// /// 养成物品 @@ -15,7 +17,7 @@ internal sealed class CultivateEntryView : Item /// 实体入口 /// 对应物品 /// 物品列表 - public CultivateEntryView(Entity.CultivateEntry entry, Item item, List items) + public CultivateEntryView(Model.Entity.CultivateEntry entry, Item item, List items) { Id = entry.Id; EntryId = entry.InnerId; @@ -39,7 +41,7 @@ internal sealed class CultivateEntryView : Item /// /// 实体 /// - public List Items { get; set; } = default!; + public List Items { get; set; } = default!; /// /// 是否为今日的材料 diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateItem.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateItemView.cs similarity index 77% rename from src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateItem.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateItemView.cs index 37078db8..24ce847d 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateItem.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivateItemView.cs @@ -2,22 +2,23 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.ComponentModel; +using Snap.Hutao.Model.Binding; using Snap.Hutao.Model.Metadata.Item; -namespace Snap.Hutao.Model.Binding.Cultivation; +namespace Snap.Hutao.ViewModel.Cultivation; /// /// 养成物品 /// [HighQuality] -internal sealed class CultivateItem : ObservableObject, IEntityWithMetadata +internal sealed class CultivateItemView : ObservableObject, IEntityWithMetadata { /// /// 养成物品 /// /// 实体 /// 元数据 - public CultivateItem(Entity.CultivateItem entity, Material inner) + public CultivateItemView(Model.Entity.CultivateItem entity, Material inner) { Entity = entity; Inner = inner; @@ -31,7 +32,7 @@ internal sealed class CultivateItem : ObservableObject, IEntityWithMetadata /// 实体 /// - public Entity.CultivateItem Entity { get; } + public Model.Entity.CultivateItem Entity { get; } /// /// 是否完成此项 diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs index 0fe833e7..8e9c543c 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs @@ -3,7 +3,6 @@ using CommunityToolkit.Mvvm.Input; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Model.Binding.Cultivation; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Metadata.Item; using Snap.Hutao.Service.Abstraction; @@ -31,7 +30,7 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel private ObservableCollection? projects; private CultivateProject? selectedProject; - private List? inventoryItems; + private List? inventoryItems; private ObservableCollection? cultivateEntries; private ObservableCollection? statisticsItems; @@ -39,8 +38,6 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel /// 构造一个新的养成视图模型 /// /// 服务提供器 - /// 元数据服务 - /// 日志器 public CultivationViewModel(IServiceProvider serviceProvider) { cultivationService = serviceProvider.GetRequiredService(); @@ -51,9 +48,9 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel AddProjectCommand = new AsyncRelayCommand(AddProjectAsync); RemoveProjectCommand = new AsyncRelayCommand(RemoveProjectAsync); RemoveEntryCommand = new AsyncRelayCommand(RemoveEntryAsync); - SaveInventoryItemCommand = new RelayCommand(SaveInventoryItem); + SaveInventoryItemCommand = new RelayCommand(SaveInventoryItem); NavigateToPageCommand = new RelayCommand(NavigateToPage); - FinishStateCommand = new RelayCommand(UpdateFinishedState); + FinishStateCommand = new RelayCommand(UpdateFinishedState); } /// @@ -79,7 +76,7 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel /// /// 物品列表 /// - public List? InventoryItems { get => inventoryItems; set => SetProperty(ref inventoryItems, value); } + public List? InventoryItems { get => inventoryItems; set => SetProperty(ref inventoryItems, value); } /// /// 养成列表 @@ -203,7 +200,7 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel } } - private void SaveInventoryItem(Model.Binding.Inventory.InventoryItem? inventoryItem) + private void SaveInventoryItem(InventoryItemView? inventoryItem) { if (inventoryItem != null) { @@ -212,7 +209,7 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel } } - private void UpdateFinishedState(Model.Binding.Cultivation.CultivateItem? item) + private void UpdateFinishedState(CultivateItemView? item) { if (item != null) { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/DaysOfWeek.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/DaysOfWeek.cs index 58d4640a..4749aaf0 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/DaysOfWeek.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/DaysOfWeek.cs @@ -1,7 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -namespace Snap.Hutao.Model.Binding.Cultivation; +namespace Snap.Hutao.ViewModel.Cultivation; /// /// 游戏内星期中的天 diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Inventory/InventoryItem.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/InventoryItemView.cs similarity index 76% rename from src/Snap.Hutao/Snap.Hutao/Model/Binding/Inventory/InventoryItem.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/InventoryItemView.cs index 2a570dfc..807f0e82 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Inventory/InventoryItem.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/InventoryItemView.cs @@ -2,15 +2,16 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.ComponentModel; +using Snap.Hutao.Model.Binding; using Snap.Hutao.Model.Metadata.Item; -namespace Snap.Hutao.Model.Binding.Inventory; +namespace Snap.Hutao.ViewModel.Cultivation; /// /// 背包物品 /// [HighQuality] -internal sealed class InventoryItem : ObservableObject, IEntityWithMetadata +internal sealed class InventoryItemView : ObservableObject, IEntityWithMetadata { /// /// 创建一个新的背包物品 @@ -18,7 +19,7 @@ internal sealed class InventoryItem : ObservableObject, IEntityWithMetadata实体 /// 元数据 /// 保存命令 - public InventoryItem(Entity.InventoryItem entity, Material inner, ICommand saveCommand) + public InventoryItemView(Model.Entity.InventoryItem entity, Material inner, ICommand saveCommand) { Entity = entity; Inner = inner; @@ -28,7 +29,7 @@ internal sealed class InventoryItem : ObservableObject, IEntityWithMetadata /// 实体 /// - public Entity.InventoryItem Entity { get; set; } + public Model.Entity.InventoryItem Entity { get; set; } /// /// 元数据 diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/StatisticsCultivateItem.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/StatisticsCultivateItem.cs index cbfb324c..ea004849 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/StatisticsCultivateItem.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/StatisticsCultivateItem.cs @@ -3,7 +3,7 @@ using Snap.Hutao.Model.Metadata.Item; -namespace Snap.Hutao.Model.Binding.Cultivation; +namespace Snap.Hutao.ViewModel.Cultivation; /// /// 仅用于统计总数的养成物品 @@ -16,7 +16,7 @@ internal sealed class StatisticsCultivateItem /// /// 材料 /// 实体 - public StatisticsCultivateItem(Material inner, Entity.CultivateItem entity) + public StatisticsCultivateItem(Material inner, Model.Entity.CultivateItem entity) { Inner = inner; Count = entity.Count; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModel.cs index d3b072ca..3affcae9 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModel.cs @@ -53,6 +53,7 @@ internal sealed class LaunchGameViewModel : Abstraction.ViewModel gameService = serviceProvider.GetRequiredService(); memoryCache = serviceProvider.GetRequiredService(); Options = serviceProvider.GetRequiredService(); + AppOptions = serviceProvider.GetRequiredService(); this.serviceProvider = serviceProvider; LaunchCommand = new AsyncRelayCommand(LaunchAsync, AsyncRelayCommandOptions.AllowConcurrentExecutions); @@ -100,6 +101,11 @@ internal sealed class LaunchGameViewModel : Abstraction.ViewModel /// public LaunchOptions Options { get; } + /// + /// 应用选项 + /// + public AppOptions AppOptions { get; } + /// /// 游戏资源 /// diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/Screenshot.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/Screenshot.cs deleted file mode 100644 index 9c3594bd..00000000 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/Screenshot.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Snap.Hutao.Model.Binding; -using Snap.Hutao.Service.Game; -using System.IO; -using System.Text; - -namespace Snap.Hutao.ViewModel.Game; - -/// -/// 截图 -/// -internal sealed class Screenshot : INameIcon -{ - /// - /// 构造一个新的截图 - /// - /// 路径 - public Screenshot(string path) - { - Name = $"{new FileInfo(path).CreationTime}"; - Icon = path.ToUri(); - } - - /// - public string Name { get; } - - /// - public Uri Icon { get; } -} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/ScreenshotViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/ScreenshotViewModel.cs deleted file mode 100644 index dd5b1228..00000000 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/ScreenshotViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Snap.Hutao.Service.Game; - -namespace Snap.Hutao.ViewModel.Game; - -/// -/// 截图视图模型 -/// -[Injection(InjectAs.Scoped)] -internal sealed class ScreenshotViewModel : Abstraction.ViewModel -{ - /// - /// 构造一个新的截图视图模型 - /// - /// 游戏服务 - public ScreenshotViewModel(IGameService gameService) - { - - } - - /// - protected override async Task OpenUIAsync() - { - - } -} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs index c41b6039..2af84939 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs @@ -8,6 +8,7 @@ using Microsoft.Windows.AppLifecycle; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.IO; using Snap.Hutao.Core.IO.DataTransfer; +using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Core.Setting; using Snap.Hutao.Core.Windowing; using Snap.Hutao.Factory.Abstraction; @@ -162,6 +163,11 @@ internal sealed class SettingViewModel : Abstraction.ViewModel /// public ExperimentalFeaturesViewModel Experimental { get; } + /// + /// 是否提权 + /// + public bool IsElevated { get => Activation.GetElevated(); } + /// /// 设置游戏路径命令 /// @@ -272,15 +278,16 @@ internal sealed class SettingViewModel : Abstraction.ViewModel private async Task SetDataFolderAsync() { - IPickerFactory pickerFactory = serviceProvider.GetRequiredService(); - FolderPicker picker = pickerFactory.GetFolderPicker(); - (bool isOk, string folder) = await picker.TryPickSingleFolderAsync().ConfigureAwait(false); + (bool isOk, string folder) = await serviceProvider + .GetRequiredService() + .GetFolderPicker() + .TryPickSingleFolderAsync() + .ConfigureAwait(false); - IInfoBarService infoBarService = serviceProvider.GetRequiredService(); if (isOk) { LocalSetting.Set(SettingKeys.DataFolderPath, folder); - infoBarService.Success(SH.ViewModelSettingSetDataFolderSuccess); + serviceProvider.GetRequiredService().Success(SH.ViewModelSettingSetDataFolderSuccess); } } @@ -292,8 +299,7 @@ internal sealed class SettingViewModel : Abstraction.ViewModel private void CopyDeviceId() { - IInfoBarService infoBarService = serviceProvider.GetRequiredService(); Clipboard.SetText(DeviceId); - infoBarService.Success(SH.ViewModelSettingCopyDeviceIdSuccess); + serviceProvider.GetRequiredService().Success(SH.ViewModelSettingCopyDeviceIdSuccess); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/BaseValue/BaseValueInfo.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/BaseValueInfo.cs similarity index 96% rename from src/Snap.Hutao/Snap.Hutao/Model/Binding/BaseValue/BaseValueInfo.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/BaseValueInfo.cs index 525af597..f1b6704e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/BaseValue/BaseValueInfo.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/BaseValueInfo.cs @@ -2,10 +2,11 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.ComponentModel; +using Snap.Hutao.Model; using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Model.Metadata; -namespace Snap.Hutao.Model.Binding.BaseValue; +namespace Snap.Hutao.ViewModel.Wiki; /// /// 基础数值信息 @@ -101,7 +102,7 @@ internal sealed class BaseValueInfo : ObservableObject value += addValue; } - values.Add(Metadata.Converter.PropertyDescriptor.FormatNameValue(propValue.Property, value)); + values.Add(Model.Metadata.Converter.PropertyDescriptor.FormatNameValue(propValue.Property, value)); } Values = values; diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Hutao/CookBonusView.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/CookBonusView.cs similarity index 96% rename from src/Snap.Hutao/Snap.Hutao/Model/Binding/Hutao/CookBonusView.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/CookBonusView.cs index 1de3aa6b..8337de49 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Hutao/CookBonusView.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/CookBonusView.cs @@ -5,7 +5,7 @@ using Snap.Hutao.Model.Metadata.Avatar; using Snap.Hutao.Model.Metadata.Item; using Snap.Hutao.Model.Primitive; -namespace Snap.Hutao.Model.Binding.Hutao; +namespace Snap.Hutao.ViewModel.Wiki; /// /// 料理奖励视图 diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/BaseValue/PropertyCurveValue.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/PropertyCurveValue.cs similarity index 95% rename from src/Snap.Hutao/Snap.Hutao/Model/Binding/BaseValue/PropertyCurveValue.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/PropertyCurveValue.cs index 448f95d1..99088b81 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/BaseValue/PropertyCurveValue.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/PropertyCurveValue.cs @@ -3,7 +3,7 @@ using Snap.Hutao.Model.Intrinsic; -namespace Snap.Hutao.Model.Binding.BaseValue; +namespace Snap.Hutao.ViewModel.Wiki; /// /// 战斗属性与初始值 diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiAvatarViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs similarity index 99% rename from src/Snap.Hutao/Snap.Hutao/ViewModel/WikiAvatarViewModel.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs index ce5548bc..7d5c3e95 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiAvatarViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs @@ -5,8 +5,6 @@ using CommunityToolkit.Mvvm.Input; using CommunityToolkit.WinUI.UI; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Primitives; -using Snap.Hutao.Model.Binding.BaseValue; -using Snap.Hutao.Model.Binding.Hutao; using Snap.Hutao.Model.Entity.Primitive; using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Model.Intrinsic.Immutable; @@ -30,7 +28,7 @@ using CalcConsumption = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.Consumptio using CalcItem = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.Item; using CalcItemHelper = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.ItemHelper; -namespace Snap.Hutao.ViewModel; +namespace Snap.Hutao.ViewModel.Wiki; /// /// 角色资料视图模型 diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiMonsterViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiMonsterViewModel.cs similarity index 97% rename from src/Snap.Hutao/Snap.Hutao/ViewModel/WikiMonsterViewModel.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiMonsterViewModel.cs index 0a52fccc..4095e9f2 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiMonsterViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiMonsterViewModel.cs @@ -3,7 +3,6 @@ using CommunityToolkit.WinUI.UI; using Microsoft.Extensions.DependencyInjection; -using Snap.Hutao.Model.Binding.BaseValue; using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Model.Metadata.Item; using Snap.Hutao.Model.Metadata.Monster; @@ -11,7 +10,7 @@ using Snap.Hutao.Model.Primitive; using Snap.Hutao.Service.Metadata; using System.Collections.Immutable; -namespace Snap.Hutao.ViewModel; +namespace Snap.Hutao.ViewModel.Wiki; /// /// 怪物资料视图模型 diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs similarity index 99% rename from src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs index 21a3a9af..4b78f7ec 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs @@ -5,7 +5,6 @@ using CommunityToolkit.Mvvm.Input; using CommunityToolkit.WinUI.UI; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Primitives; -using Snap.Hutao.Model.Binding.BaseValue; using Snap.Hutao.Model.Entity.Primitive; using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Model.Intrinsic.Immutable; @@ -26,7 +25,7 @@ using CalcAvatarPromotionDelta = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.A using CalcClient = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.CalculateClient; using CalcConsumption = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.Consumption; -namespace Snap.Hutao.ViewModel; +namespace Snap.Hutao.ViewModel.Wiki; /// /// 武器资料视图模型