diff --git a/VPet.ModMaker/Models/ModMaker.cs b/VPet.ModMaker/Models/ModMaker.cs index a36830c..2e195ba 100644 --- a/VPet.ModMaker/Models/ModMaker.cs +++ b/VPet.ModMaker/Models/ModMaker.cs @@ -53,7 +53,8 @@ public class ModMaker : MainPlugin foreach (var pet in MW.Pets) { var petModel = new PetModel(); - petModel.Id.Value = pet.Name; + petModel.SourceId = pet.Name; + petModel.Id.Value = pet.Name + " (来自本体)".Translate(); ModMakerInfo.Pets.Add(petModel); } //Maker.ModMaker = this; diff --git a/VPet.ModMaker/Models/ModMakerInfo.cs b/VPet.ModMaker/Models/ModMakerInfo.cs index a6f127f..787adfa 100644 --- a/VPet.ModMaker/Models/ModMakerInfo.cs +++ b/VPet.ModMaker/Models/ModMakerInfo.cs @@ -32,5 +32,8 @@ public static class ModMakerInfo /// public static int GameVersion { get; set; } = 100; + /// + /// 本体的宠物 + /// public static List Pets { get; } = new(); } diff --git a/VPet.ModMaker/Models/ModModel/ModInfoModel.cs b/VPet.ModMaker/Models/ModModel/ModInfoModel.cs index 87296b4..5c589d0 100644 --- a/VPet.ModMaker/Models/ModModel/ModInfoModel.cs +++ b/VPet.ModMaker/Models/ModModel/ModInfoModel.cs @@ -96,7 +96,7 @@ public class ModInfoModel : I18nModel /// /// 宠物 /// - public ObservableCollection Pets { get; } = new(ModMakerInfo.Pets); + public ObservableCollection Pets { get; } = new(); /// /// 其它I18n数据 @@ -139,15 +139,25 @@ public class ModInfoModel : I18nModel LowTexts.Add(new(lowText)); foreach (var selectText in loader.SelectTexts) SelectTexts.Add(new(selectText)); + // 缓存pets + var pets = new List(); foreach (var pet in loader.Pets) { var petModel = new PetModel(pet); - Pets.Add(petModel); + pets.Add(petModel); foreach (var p in pet.path) - { LoadAnime(petModel, p); - } } + // 先载入本体宠物 + foreach (var pet in ModMakerInfo.Pets) + { + // 确保Id不重复 + if (pets.All(i => i.Id.Value != pet.SourceId)) + Pets.Add(pet); + } + // 再载入模组宠物 + foreach (var pet in pets) + Pets.Add(pet); foreach (var lang in loader.I18nDatas) I18nDatas.Add(lang.Key, lang.Value); diff --git a/VPet.ModMaker/Models/ModModel/PetModel.cs b/VPet.ModMaker/Models/ModModel/PetModel.cs index 22e8059..7dacebe 100644 --- a/VPet.ModMaker/Models/ModModel/PetModel.cs +++ b/VPet.ModMaker/Models/ModModel/PetModel.cs @@ -1,6 +1,7 @@ using HKW.HKWViewModels.SimpleObservable; using LinePutScript; using LinePutScript.Converter; +using LinePutScript.Localization.WPF; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -20,6 +21,11 @@ namespace VPet.ModMaker.Models; /// public class PetModel : I18nModel { + /// + /// 显示的Id 若不为空则判断为来自本体的宠物 + /// + public string? SourceId { get; set; } = null; + /// /// Id /// @@ -92,6 +98,7 @@ public class PetModel : I18nModel public PetModel() { + PetNameId.Value = $"{Id.Value}_{nameof(PetNameId)}"; DescriptionId.Value = $"{Id.Value}_{nameof(DescriptionId)}"; Id.ValueChanged += (o, n) => { @@ -208,6 +215,8 @@ public class PetModel : I18nModel /// 路径 public void Save(string path) { + if (SourceId is not null) + Id.Value = SourceId; if (IsSimplePetModel) { SaveSimplePetInfo(path); @@ -242,6 +251,8 @@ public class PetModel : I18nModel anime.Save(petAnimePath); foreach (var anime in FoodAnimes) anime.Save(petAnimePath); + if (SourceId is not null) + Id.Value = SourceId + " (来自本体)".Translate(); } private void SaveSimplePetInfo(string path)