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;