diff --git a/ElectronicObserver/Data/GimmickQuestData.cs b/ElectronicObserver/Data/GimmickQuestData.cs new file mode 100644 index 000000000..d6b10fe38 --- /dev/null +++ b/ElectronicObserver/Data/GimmickQuestData.cs @@ -0,0 +1,147 @@ +using ElectronicObserver.Window.Dialog.QuestTrackerManager.Enums; +using ElectronicObserver.Window.Dialog.QuestTrackerManager.Models; +using MessagePack; + +namespace ElectronicObserver.Data; + +/// +/// Custom quest made for event gimmicks +/// +[MessagePackObject] +public class GimmickQuestData : IQuestData +{ + /// + /// ID of the area for this custom quest + /// + [Key("world")] + public int MapArea { get; set; } + + /// + /// Number of the map for this custom quest + /// + [Key("map")] + public int MapNumber { get; set; } + + /// + /// Gauge number for this requirement to be active + /// + [Key("gaugeNum")] + public int GaugeNumber { get; set; } + + /// + /// Gimmick type + /// + [Key("type")] + public GimmickType GimmickType { get; set; } + + /// + /// If multiple gimmick of same type on a map, this is the gimmick number of it + /// + [IgnoreMember] + public int GimmickNumber { get; set; } + + /// + /// If multiple gimmick of same type on a map, this is the gimmick number of it + /// + [IgnoreMember] + public string DisplayGimmickNumber => GimmickNumber > 0 ? GimmickNumber.ToString() : string.Empty; + + /// + /// Quest tracker + /// + [Key("tracker")] + public TrackerModel? Tracker { get; set; } + + /// + /// Quest ID (need to be set manually) + /// + [IgnoreMember] + public int QuestID { get; set; } + + /// + /// 任務カテゴリ + /// + [IgnoreMember] + public int Category => (int)QuestCategory.Sortie; + + /// + /// 任務出現タイプ + /// 1=デイリー, 2=ウィークリー, 3=マンスリー, 4=単発, 5=他 + /// + [IgnoreMember] + public int Type => (int)QuestResetType.Never; + + /// + /// Not used for custom quests (always Sortie type) + /// + [IgnoreMember] + public int LabelType => (int)QuestResetType.Unknown; + + /// + /// 遂行状態 + /// 1=未受領, 2=遂行中, 3=達成 + /// + [IgnoreMember] + public int State { get; set; } + + /// + /// Quest code + /// + [IgnoreMember] + public string Code => $"{MapArea}{MapNumber}{GimmickType.ToString()[0]}{DisplayGimmickNumber}"; + + /// + /// Name (TODO : translate) + /// + [IgnoreMember] + public string Name => GimmickType switch + { + GimmickType.Other => "Gimmick", + GimmickType.Unlock => "Unlock", + GimmickType.Debuff => "Armor break", + _ => "" + } + $" - {(MapArea > 20 ? "E" : $"{MapArea}-")}{MapNumber}"; + + /// + /// Name in japanese (TODO : UNtranslate) + /// + [IgnoreMember] + public string NameJP => Name; + + /// + /// Description (TODO : translate) + /// + [IgnoreMember] + public string Description => GimmickType switch + { + GimmickType.Other => "", + GimmickType.Unlock => "Unlock a new path after completing the quest requirements", + GimmickType.Debuff => "Break the enemy armor after completing the quest requirements", + _ => "" + }; + + /// + /// (TODO : UNtranslate) + /// + [IgnoreMember] + public string DescriptionJP => Description; + + //undone:api_bonus_flag + + /// + /// True if quest is translated + /// + [IgnoreMember] + public bool Translated => true; + + /// + /// Quest progress (0 = use EO progress ?) + /// + [IgnoreMember] + public int Progress => 0; + + [IgnoreMember] + public int ID => QuestID; + + public override string ToString() => $"[{QuestID}] {Name}"; +} diff --git a/ElectronicObserver/Data/IQuestData.cs b/ElectronicObserver/Data/IQuestData.cs new file mode 100644 index 000000000..c34eb23a0 --- /dev/null +++ b/ElectronicObserver/Data/IQuestData.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ElectronicObserver.Data.Translation; + +namespace ElectronicObserver.Data; + +/// +/// 任務のデータを保持します。 +/// +public interface IQuestData : IIdentifiable +{ + public int QuestID { get; } + + /// + /// 任務カテゴリ + /// + public int Category { get; } + + /// + /// 任務出現タイプ + /// 1=デイリー, 2=ウィークリー, 3=マンスリー, 4=単発, 5=他 + /// + public int Type { get; } + + /// + /// 周期アイコン種別 + /// 1=単発, 2=デイリー, 3=ウィークリー, 6=マンスリー, 7=他(輸送5と空母3,クォータリー), 100+x=イヤーリー(x月-) + /// + public int LabelType { get; } + + /// + /// 遂行状態 + /// 1=未受領, 2=遂行中, 3=達成 + /// + public int State { get; set; } + + public string Code { get; } + + /// + /// Name (Translated) + /// + public string Name { get; } + + /// + /// 任務名 + /// + public string NameJP { get; } + + /// + /// Description (Translated) + /// + public string Description { get; } + + /// + /// 説明 + /// + public string DescriptionJP { get; } + + //undone:api_bonus_flag + + /// + /// True if quest is translated + /// + public bool Translated { get; } + + /// + /// 進捗 + /// + public int Progress { get; } + + /// + /// The quest ID + /// + public int ID => QuestID; + + /// + /// Implement override of ToString (needed ?) + /// + /// + public string ToString(); +} diff --git a/ElectronicObserver/Data/Quest/ProgressAGo.cs b/ElectronicObserver/Data/Quest/ProgressAGo.cs index 3fb3ea39a..07a3a070f 100644 --- a/ElectronicObserver/Data/Quest/ProgressAGo.cs +++ b/ElectronicObserver/Data/Quest/ProgressAGo.cs @@ -127,7 +127,7 @@ private int bossWinCountTemp #endregion - public ProgressAGo(QuestData quest) + public ProgressAGo(IQuestData quest) : base(quest, 0) { } @@ -159,7 +159,7 @@ public override void Decrement() } - public override void CheckProgress(QuestData q) + public override void CheckProgress(IQuestData q) { if (TemporaryProgress != 0) diff --git a/ElectronicObserver/Data/Quest/ProgressBattle.cs b/ElectronicObserver/Data/Quest/ProgressBattle.cs index ccc50d258..2c0e8f77d 100644 --- a/ElectronicObserver/Data/Quest/ProgressBattle.cs +++ b/ElectronicObserver/Data/Quest/ProgressBattle.cs @@ -33,7 +33,7 @@ public class ProgressBattle : ProgressData private bool IsBossOnly { get; set; } - public ProgressBattle(QuestData quest, int maxCount, string lowestRank, int[] targetArea, bool isBossOnly) + public ProgressBattle(IQuestData quest, int maxCount, string lowestRank, int[] targetArea, bool isBossOnly) : base(quest, maxCount) { diff --git a/ElectronicObserver/Data/Quest/ProgressConstruction.cs b/ElectronicObserver/Data/Quest/ProgressConstruction.cs index 5fd5b74e8..6b0ae26e1 100644 --- a/ElectronicObserver/Data/Quest/ProgressConstruction.cs +++ b/ElectronicObserver/Data/Quest/ProgressConstruction.cs @@ -14,7 +14,7 @@ namespace ElectronicObserver.Data.Quest; public class ProgressConstruction : ProgressData { - public ProgressConstruction(QuestData quest, int maxCount) + public ProgressConstruction(IQuestData quest, int maxCount) : base(quest, maxCount) { } diff --git a/ElectronicObserver/Data/Quest/ProgressData.cs b/ElectronicObserver/Data/Quest/ProgressData.cs index d13b4e068..dfcb2fac2 100644 --- a/ElectronicObserver/Data/Quest/ProgressData.cs +++ b/ElectronicObserver/Data/Quest/ProgressData.cs @@ -73,7 +73,7 @@ public abstract class ProgressData : IIdentifiable public bool IsCleared => ProgressPercentage >= 1.0; - public ProgressData(QuestData quest, int maxCount) + public ProgressData(IQuestData quest, int maxCount) { QuestID = quest.QuestID; ProgressMax = maxCount; @@ -136,7 +136,7 @@ public virtual void Decrement() /// 実際の進捗データから、進捗度を補正します。 /// /// 任務データ。 - public virtual void CheckProgress(QuestData q) + public virtual void CheckProgress(IQuestData q) { ApplyTemporaryProgress(q); @@ -180,7 +180,7 @@ public virtual void CheckProgress(QuestData q) } - public virtual void ApplyTemporaryProgress(QuestData q) + public virtual void ApplyTemporaryProgress(IQuestData q) { if (TemporaryProgress > 0) { diff --git a/ElectronicObserver/Data/Quest/ProgressDestruction.cs b/ElectronicObserver/Data/Quest/ProgressDestruction.cs index 70f3ff4c7..27fb57bfe 100644 --- a/ElectronicObserver/Data/Quest/ProgressDestruction.cs +++ b/ElectronicObserver/Data/Quest/ProgressDestruction.cs @@ -14,7 +14,7 @@ namespace ElectronicObserver.Data.Quest; public class ProgressDestruction : ProgressData { - public ProgressDestruction(QuestData quest, int maxCount) + public ProgressDestruction(IQuestData quest, int maxCount) : base(quest, maxCount) { } diff --git a/ElectronicObserver/Data/Quest/ProgressDevelopment.cs b/ElectronicObserver/Data/Quest/ProgressDevelopment.cs index d9a591897..61a68f8e5 100644 --- a/ElectronicObserver/Data/Quest/ProgressDevelopment.cs +++ b/ElectronicObserver/Data/Quest/ProgressDevelopment.cs @@ -14,7 +14,7 @@ namespace ElectronicObserver.Data.Quest; public class ProgressDevelopment : ProgressData { - public ProgressDevelopment(QuestData quest, int maxCount) + public ProgressDevelopment(IQuestData quest, int maxCount) : base(quest, maxCount) { } diff --git a/ElectronicObserver/Data/Quest/ProgressDiscard.cs b/ElectronicObserver/Data/Quest/ProgressDiscard.cs index 8a46ebabc..d5f2c8192 100644 --- a/ElectronicObserver/Data/Quest/ProgressDiscard.cs +++ b/ElectronicObserver/Data/Quest/ProgressDiscard.cs @@ -37,10 +37,10 @@ public class ProgressDiscard : ProgressData protected int CategoryIndex { get; set; } - public ProgressDiscard(QuestData quest, int maxCount, bool countsAmount, int[] categories) + public ProgressDiscard(IQuestData quest, int maxCount, bool countsAmount, int[] categories) : this(quest, maxCount, countsAmount, categories, 2) { } - public ProgressDiscard(QuestData quest, int maxCount, bool countsAmount, int[] categories, int categoryIndex) + public ProgressDiscard(IQuestData quest, int maxCount, bool countsAmount, int[] categories, int categoryIndex) : base(quest, maxCount) { CountsAmount = countsAmount; diff --git a/ElectronicObserver/Data/Quest/ProgressDocking.cs b/ElectronicObserver/Data/Quest/ProgressDocking.cs index 72808dd2e..542f93416 100644 --- a/ElectronicObserver/Data/Quest/ProgressDocking.cs +++ b/ElectronicObserver/Data/Quest/ProgressDocking.cs @@ -14,7 +14,7 @@ namespace ElectronicObserver.Data.Quest; public class ProgressDocking : ProgressData { - public ProgressDocking(QuestData quest, int maxCount) + public ProgressDocking(IQuestData quest, int maxCount) : base(quest, maxCount) { } diff --git a/ElectronicObserver/Data/Quest/ProgressExpedition.cs b/ElectronicObserver/Data/Quest/ProgressExpedition.cs index d9d1744ef..0e73a4e5d 100644 --- a/ElectronicObserver/Data/Quest/ProgressExpedition.cs +++ b/ElectronicObserver/Data/Quest/ProgressExpedition.cs @@ -21,7 +21,7 @@ public class ProgressExpedition : ProgressData private HashSet TargetArea { get; set; } - public ProgressExpedition(QuestData quest, int maxCount, int[] targetArea) + public ProgressExpedition(IQuestData quest, int maxCount, int[] targetArea) : base(quest, maxCount) { diff --git a/ElectronicObserver/Data/Quest/ProgressImprovement.cs b/ElectronicObserver/Data/Quest/ProgressImprovement.cs index 9a3a214ca..281a9c35e 100644 --- a/ElectronicObserver/Data/Quest/ProgressImprovement.cs +++ b/ElectronicObserver/Data/Quest/ProgressImprovement.cs @@ -14,7 +14,7 @@ namespace ElectronicObserver.Data.Quest; public class ProgressImprovement : ProgressData { - public ProgressImprovement(QuestData quest, int maxCount) + public ProgressImprovement(IQuestData quest, int maxCount) : base(quest, maxCount) { } diff --git a/ElectronicObserver/Data/Quest/ProgressModernization.cs b/ElectronicObserver/Data/Quest/ProgressModernization.cs index 82c71525b..24b6cebf7 100644 --- a/ElectronicObserver/Data/Quest/ProgressModernization.cs +++ b/ElectronicObserver/Data/Quest/ProgressModernization.cs @@ -14,7 +14,7 @@ namespace ElectronicObserver.Data.Quest; public class ProgressModernization : ProgressData { - public ProgressModernization(QuestData quest, int maxCount) + public ProgressModernization(IQuestData quest, int maxCount) : base(quest, maxCount) { } diff --git a/ElectronicObserver/Data/Quest/ProgressMultiBattle.cs b/ElectronicObserver/Data/Quest/ProgressMultiBattle.cs index ffadf0c6c..fbe71f261 100644 --- a/ElectronicObserver/Data/Quest/ProgressMultiBattle.cs +++ b/ElectronicObserver/Data/Quest/ProgressMultiBattle.cs @@ -16,7 +16,7 @@ public class ProgressMultiBattle : ProgressData [DataMember] private ProgressBattle[] ProgressList; - public ProgressMultiBattle(QuestData quest, IEnumerable progressList) + public ProgressMultiBattle(IQuestData quest, IEnumerable progressList) : base(quest, 1) { ProgressList = progressList.ToArray(); @@ -45,7 +45,7 @@ public override void Decrement() throw new NotSupportedException(); } - public override void CheckProgress(QuestData q) + public override void CheckProgress(IQuestData q) { foreach (var p in ProgressList) p.ApplyTemporaryProgress(q); diff --git a/ElectronicObserver/Data/Quest/ProgressMultiDiscard.cs b/ElectronicObserver/Data/Quest/ProgressMultiDiscard.cs index f0e3a37da..fff97e32d 100644 --- a/ElectronicObserver/Data/Quest/ProgressMultiDiscard.cs +++ b/ElectronicObserver/Data/Quest/ProgressMultiDiscard.cs @@ -14,7 +14,7 @@ public class ProgressMultiDiscard : ProgressData [DataMember] private ProgressDiscard[] ProgressList; - public ProgressMultiDiscard(QuestData quest, IEnumerable progressList) + public ProgressMultiDiscard(IQuestData quest, IEnumerable progressList) : base(quest, 1) { ProgressList = progressList.ToArray(); @@ -45,7 +45,7 @@ public override void Decrement() } - public override void CheckProgress(QuestData q) + public override void CheckProgress(IQuestData q) { foreach (var p in ProgressList) p.ApplyTemporaryProgress(q); diff --git a/ElectronicObserver/Data/Quest/ProgressMultiExpedition.cs b/ElectronicObserver/Data/Quest/ProgressMultiExpedition.cs index 9286cc28a..a2492db1a 100644 --- a/ElectronicObserver/Data/Quest/ProgressMultiExpedition.cs +++ b/ElectronicObserver/Data/Quest/ProgressMultiExpedition.cs @@ -13,7 +13,7 @@ public class ProgressMultiExpedition : ProgressData [DataMember] private ProgressExpedition[] ProgressList; - public ProgressMultiExpedition(QuestData quest, IEnumerable progressList) + public ProgressMultiExpedition(IQuestData quest, IEnumerable progressList) : base(quest, 1) { ProgressList = progressList.ToArray(); @@ -42,7 +42,7 @@ public override void Decrement() throw new NotSupportedException(); } - public override void CheckProgress(QuestData q) + public override void CheckProgress(IQuestData q) { foreach (var p in ProgressList) p.ApplyTemporaryProgress(q); diff --git a/ElectronicObserver/Data/Quest/ProgressPractice.cs b/ElectronicObserver/Data/Quest/ProgressPractice.cs index 7cb49cc79..1b2501697 100644 --- a/ElectronicObserver/Data/Quest/ProgressPractice.cs +++ b/ElectronicObserver/Data/Quest/ProgressPractice.cs @@ -27,14 +27,14 @@ public class ProgressPractice : ProgressData [DataMember] private int LowestRank { get; set; } - public ProgressPractice(QuestData quest, int maxCount, bool winOnly) + public ProgressPractice(IQuestData quest, int maxCount, bool winOnly) : base(quest, maxCount) { LowestRank = winOnly ? Constants.GetWinRank("B") : Constants.GetWinRank(""); WinOnly = winOnly; } - public ProgressPractice(QuestData quest, int maxCount, string lowestRank) + public ProgressPractice(IQuestData quest, int maxCount, string lowestRank) : base(quest, maxCount) { LowestRank = Constants.GetWinRank(lowestRank); diff --git a/ElectronicObserver/Data/Quest/ProgressSlaughter.cs b/ElectronicObserver/Data/Quest/ProgressSlaughter.cs index fc3584831..1217fff80 100644 --- a/ElectronicObserver/Data/Quest/ProgressSlaughter.cs +++ b/ElectronicObserver/Data/Quest/ProgressSlaughter.cs @@ -22,7 +22,7 @@ public class ProgressSlaughter : ProgressData [DataMember] private HashSet TargetShipType { get; set; } - public ProgressSlaughter(QuestData quest, int maxCount, int[] targetShipType) + public ProgressSlaughter(IQuestData quest, int maxCount, int[] targetShipType) : base(quest, maxCount) { diff --git a/ElectronicObserver/Data/Quest/ProgressSpecialBattle.cs b/ElectronicObserver/Data/Quest/ProgressSpecialBattle.cs index bc1d7d22d..9187f33eb 100644 --- a/ElectronicObserver/Data/Quest/ProgressSpecialBattle.cs +++ b/ElectronicObserver/Data/Quest/ProgressSpecialBattle.cs @@ -19,11 +19,11 @@ public class ProgressSpecialBattle : ProgressBattle [DataMember] private int GaugeIndex = -1; - public ProgressSpecialBattle(QuestData quest, int maxCount, string lowestRank, int[] targetArea, bool isBossOnly) : base(quest, maxCount, lowestRank, targetArea, isBossOnly) + public ProgressSpecialBattle(IQuestData quest, int maxCount, string lowestRank, int[] targetArea, bool isBossOnly) : base(quest, maxCount, lowestRank, targetArea, isBossOnly) { } - public ProgressSpecialBattle(QuestData quest, int maxCount, string lowestRank, int[] targetArea, bool isBossOnly, int gaugeIndex) : base(quest, maxCount, lowestRank, targetArea, isBossOnly) + public ProgressSpecialBattle(IQuestData quest, int maxCount, string lowestRank, int[] targetArea, bool isBossOnly, int gaugeIndex) : base(quest, maxCount, lowestRank, targetArea, isBossOnly) { GaugeIndex = gaugeIndex; } diff --git a/ElectronicObserver/Data/Quest/ProgressSupply.cs b/ElectronicObserver/Data/Quest/ProgressSupply.cs index 086ed339b..34f479a17 100644 --- a/ElectronicObserver/Data/Quest/ProgressSupply.cs +++ b/ElectronicObserver/Data/Quest/ProgressSupply.cs @@ -14,7 +14,7 @@ namespace ElectronicObserver.Data.Quest; public class ProgressSupply : ProgressData { - public ProgressSupply(QuestData quest, int maxCount) + public ProgressSupply(IQuestData quest, int maxCount) : base(quest, maxCount) { } diff --git a/ElectronicObserver/Data/QuestData.cs b/ElectronicObserver/Data/QuestData.cs index c335924c7..6590f1cd7 100644 --- a/ElectronicObserver/Data/QuestData.cs +++ b/ElectronicObserver/Data/QuestData.cs @@ -11,7 +11,7 @@ namespace ElectronicObserver.Data; /// /// 任務のデータを保持します。 /// -public class QuestData : ResponseWrapper, IIdentifiable +public class QuestData : ResponseWrapper, IQuestData { /// diff --git a/ElectronicObserver/Data/QuestManager.cs b/ElectronicObserver/Data/QuestManager.cs index ac153cad1..63a183e79 100644 --- a/ElectronicObserver/Data/QuestManager.cs +++ b/ElectronicObserver/Data/QuestManager.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using ElectronicObserver.Data.Translation; using ElectronicObserver.Utility.Mathematics; +using ElectronicObserver.Window.Dialog.QuestTrackerManager; namespace ElectronicObserver.Data; @@ -16,7 +19,7 @@ public class QuestManager : APIWrapper /// /// 任務リスト /// - public IDDictionary Quests { get; private set; } + public IDDictionary Quests { get; private set; } /// /// 任務数(未ロード含む) @@ -41,15 +44,15 @@ public class QuestManager : APIWrapper public QuestManager() { - Quests = new IDDictionary(); + Quests = new IDDictionary(); IsLoaded = false; } - public QuestData this[int key] => Quests[key]; + public IQuestData this[int key] => Quests[key]; - public override void LoadFromResponse(string apiname, dynamic data) + public async override void LoadFromResponse(string apiname, dynamic data) { base.LoadFromResponse(apiname, (object)data); @@ -107,7 +110,7 @@ public override void LoadFromResponse(string apiname, dynamic data) } else { - Quests[id].LoadFromResponse(apiname, elem); + (Quests[id] as QuestData)?.LoadFromResponse(apiname, elem); } } @@ -115,6 +118,9 @@ public override void LoadFromResponse(string apiname, dynamic data) } + // Init custom quests (TODO : setting) + SystemGimmickQuestManager.Load(); + IsLoaded = true; @@ -153,7 +159,6 @@ public void Clear() IsLoaded = false; } - // QuestProgressManager から呼ばれます internal void OnQuestUpdated() { diff --git a/ElectronicObserver/Utility/SoftwareUpdater.cs b/ElectronicObserver/Utility/SoftwareUpdater.cs index 4cfb79fec..0fb4edad3 100644 --- a/ElectronicObserver/Utility/SoftwareUpdater.cs +++ b/ElectronicObserver/Utility/SoftwareUpdater.cs @@ -139,6 +139,10 @@ public static async Task CheckUpdateAsync() { downloadList.Add(Path.Combine("Data", "QuestTrackers.json")); } + if (CurrentVersion.GimmickQuests < LatestVersion.GimmickQuests) + { + downloadList.Add(Path.Combine("Data", "GimmickQuests.json")); + } needReload = downloadList.Any(); downloadList.Add("update.json"); @@ -274,6 +278,12 @@ internal static UpdateData ParseUpdate(dynamic dataJson, dynamic translationJson _ => 0 }; + int gimmickQuestsVersion = dataJson.QuestTrackers() switch + { + true => (int)dataJson.GimmickQuests, + _ => 0 + }; + DateTime maintenanceDate = DateTimeHelper.CSVStringToTime(dataJson.kancolle_mt); var eventState = (MaintenanceState)(int)dataJson.event_state; @@ -290,6 +300,7 @@ internal static UpdateData ParseUpdate(dynamic dataJson, dynamic translationJson Quest = questVersion, Ship = shipVersion, QuestTrackers = questTrackersVersion, + GimmickQuests = gimmickQuestsVersion, MaintenanceDate = maintenanceDate, EventState = eventState }; @@ -336,6 +347,7 @@ public class UpdateData public string Quest { get; set; } = ""; public string Ship { get; set; } = ""; public int QuestTrackers { get; set; } + public int GimmickQuests { get; set; } public DateTime MaintenanceDate { get; set; } /// diff --git a/ElectronicObserver/Window/Dialog/QuestTrackerManager/Enums/GimmickType.cs b/ElectronicObserver/Window/Dialog/QuestTrackerManager/Enums/GimmickType.cs new file mode 100644 index 000000000..28a291254 --- /dev/null +++ b/ElectronicObserver/Window/Dialog/QuestTrackerManager/Enums/GimmickType.cs @@ -0,0 +1,8 @@ +namespace ElectronicObserver.Window.Dialog.QuestTrackerManager.Enums; + +public enum GimmickType : int +{ + Other = 0, + Unlock = 1, + Debuff = 2 +} diff --git a/ElectronicObserver/Window/Dialog/QuestTrackerManager/Models/QuestModel.cs b/ElectronicObserver/Window/Dialog/QuestTrackerManager/Models/QuestModel.cs index bad63353f..aa8fa57fb 100644 --- a/ElectronicObserver/Window/Dialog/QuestTrackerManager/Models/QuestModel.cs +++ b/ElectronicObserver/Window/Dialog/QuestTrackerManager/Models/QuestModel.cs @@ -56,7 +56,7 @@ public record QuestModel([property: Key(0)] int Id) [IgnoreMember] public string Display => $"{Code}: {Name} (ID: {Id})"; - private QuestData? TryGetQuest() + private IQuestData? TryGetQuest() { if (!KCDatabase.Instance.Quest.Quests.ContainsKey(Id)) return null; diff --git a/ElectronicObserver/Window/Dialog/QuestTrackerManager/SystemGimmickQuestManager.cs b/ElectronicObserver/Window/Dialog/QuestTrackerManager/SystemGimmickQuestManager.cs new file mode 100644 index 000000000..f70d14d58 --- /dev/null +++ b/ElectronicObserver/Window/Dialog/QuestTrackerManager/SystemGimmickQuestManager.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows; +using ElectronicObserver.Data; +using ElectronicObserver.Data.Translation; +using ElectronicObserver.Window.Dialog.QuestTrackerManager.Models; +using ElectronicObserver.Window.Dialog.QuestTrackerManager.ViewModels; +using MessagePack; + +namespace ElectronicObserver.Window.Dialog.QuestTrackerManager; + +public static class SystemGimmickQuestManager +{ + private static int QuestId = 10000; + + private static bool IsInitialized = false; + + private static string GimmickQuestsPath => Path.Join(DataAndTranslationManager.DataFolder, "GimmickQuests.json"); + + + public static void Load() + { + if (IsInitialized) return; + if (!File.Exists(GimmickQuestsPath)) return; + + try + { + byte[] data = MessagePackSerializer.ConvertFromJson(File.ReadAllText(GimmickQuestsPath)); + List quests = MessagePackSerializer.Deserialize>(data); + + int currentUnlockPartCount = 0; + GimmickQuestData? previousQuest = null; + + foreach (GimmickQuestData quest in quests + .OrderBy(quest => quest.MapArea) + .ThenBy(quest => quest.MapNumber) + .ThenBy(quest => quest.GaugeNumber) + .ThenBy(quest => quest.Type)) + { + // --- Assign quest id : + int questID = ++QuestId; + quest.QuestID = questID; + if (quest.Tracker is not null) quest.Tracker.Quest = new QuestModel(questID); + + // --- Init GimmickNumber + if (previousQuest != null && previousQuest.MapArea == quest.MapArea && previousQuest.MapNumber == quest.MapNumber && previousQuest.GaugeNumber == quest.GaugeNumber && previousQuest.Type == quest.Type) + { + if (previousQuest.GimmickNumber == 0) + { + previousQuest.GimmickNumber = ++currentUnlockPartCount; + } + + quest.GimmickNumber = ++currentUnlockPartCount; + } + + previousQuest = quest; + } + + // Update Quests + foreach (GimmickQuestData quest in quests.OrderBy(quest => quest.QuestID)) + { + KCDatabase.Instance.Quest.Quests.Add(quest); + } + + // Update trackers + List trackerList = quests + .Where(quest => quest.Tracker != null) + .Select(quest => quest.Tracker) + .ToList()!; + + KCDatabase.Instance.SystemQuestTrackerManager.MergeTrackers(trackerList); + + IsInitialized = true; + } + catch + { + + } + } +} diff --git a/ElectronicObserver/Window/Dialog/QuestTrackerManager/SystemQuestTrackerManager.cs b/ElectronicObserver/Window/Dialog/QuestTrackerManager/SystemQuestTrackerManager.cs index cef8ebbf6..195fe7195 100644 --- a/ElectronicObserver/Window/Dialog/QuestTrackerManager/SystemQuestTrackerManager.cs +++ b/ElectronicObserver/Window/Dialog/QuestTrackerManager/SystemQuestTrackerManager.cs @@ -22,7 +22,7 @@ public SystemQuestTrackerManager() IsInitialized = true; } - private void MergeTrackers(List trackers) + public void MergeTrackers(List trackers) { IEnumerable existingQuestIds = Trackers.Select(t => t.QuestId); List clashingTrackers = trackers.Where(t => existingQuestIds.Contains(t.Quest.Id)).ToList(); diff --git a/ElectronicObserver/Window/FormQuest.cs b/ElectronicObserver/Window/FormQuest.cs index afa386413..0b36e707d 100644 --- a/ElectronicObserver/Window/FormQuest.cs +++ b/ElectronicObserver/Window/FormQuest.cs @@ -290,7 +290,7 @@ void Updated() .OrderBy(q => q.ID) .Select((q, i) => (q, i)); - foreach ((QuestData q, int questIndex) in indexedQuests) + foreach ((IQuestData q, int questIndex) in indexedQuests) { if (MenuMain_ShowRunningOnly.Checked && !(q.State == 2 || q.State == 3)) @@ -911,7 +911,7 @@ private void ManuMain_QuestTranslate_Click(object sender, EventArgs e) { bool needTranslation = false; dynamic json = new JsonObject(); - foreach (QuestData quest in KCDatabase.Instance.Quest.Quests.Values) + foreach (IQuestData quest in KCDatabase.Instance.Quest.Quests.Values) { if (quest.Translated) continue; diff --git a/ElectronicObserver/Window/Wpf/Quest/QuestItemViewModel.cs b/ElectronicObserver/Window/Wpf/Quest/QuestItemViewModel.cs index 2347e4ed3..73c9f6b2a 100644 --- a/ElectronicObserver/Window/Wpf/Quest/QuestItemViewModel.cs +++ b/ElectronicObserver/Window/Wpf/Quest/QuestItemViewModel.cs @@ -6,7 +6,7 @@ namespace ElectronicObserver.Window.Wpf.Quest; public class QuestItemViewModel { - private QuestData Quest { get; } + private IQuestData Quest { get; } private int QuestIndex { get; } public int QuestId => Quest.QuestID; @@ -83,7 +83,7 @@ public QuestItemViewModel() } - public QuestItemViewModel(QuestData quest, int questIndex) + public QuestItemViewModel(IQuestData quest, int questIndex) { Quest = quest; QuestIndex = questIndex; diff --git a/ElectronicObserver/Window/Wpf/Quest/QuestViewModel.cs b/ElectronicObserver/Window/Wpf/Quest/QuestViewModel.cs index 36a0e0f7e..676cdc80c 100644 --- a/ElectronicObserver/Window/Wpf/Quest/QuestViewModel.cs +++ b/ElectronicObserver/Window/Wpf/Quest/QuestViewModel.cs @@ -279,7 +279,7 @@ private void Updated() .OrderBy(q => q.ID) .Select((q, i) => (q, i)); - foreach ((QuestData q, int questIndex) in indexedQuests) + foreach ((IQuestData q, int questIndex) in indexedQuests) { if (MenuMain_ShowRunningOnly && !(q.State is 2 or 3)) @@ -562,7 +562,7 @@ private void ManuMain_QuestTranslate_Click() { bool needTranslation = false; dynamic json = new JsonObject(); - foreach (QuestData quest in KCDatabase.Instance.Quest.Quests.Values) + foreach (IQuestData quest in KCDatabase.Instance.Quest.Quests.Values) { if (quest.Translated) continue; @@ -723,7 +723,7 @@ private void MenuProgress_Reset_Click() int id = SelectedQuest.QuestId; - QuestData? quest = KCDatabase.Instance.Quest[id]; + IQuestData? quest = KCDatabase.Instance.Quest[id]; ProgressData? progress = KCDatabase.Instance.QuestProgress[id]; if (id == -1 || (quest == null && progress == null)) return;