poi-plugin-quest-info-2 0.8.2 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/kcQuestsData/DATA_VERSION +1 -1
- package/build/kcQuestsData/index.ts +1 -1
- package/build/kcQuestsData/quests-scn-new.json +16 -1
- package/build/kcQuestsData/quests-scn.json +134 -7
- package/build/kcanotifyGamedata/DATA_VERSION +1 -1
- package/build/kcanotifyGamedata/index.ts +1 -1
- package/build/kcanotifyGamedata/quests-en.json +30 -0
- package/build/kcanotifyGamedata/quests-jp.json +31 -1
- package/build/kcanotifyGamedata/quests-ko.json +30 -0
- package/build/kcanotifyGamedata/quests-scn.json +30 -0
- package/build/kcanotifyGamedata/quests-tcn.json +18 -0
- package/build/prePostQuest.json +69 -4
- package/build/questCategory.json +11 -1
- package/build/questCodeMap.json +17 -3
- package/package.json +5 -3
- package/src/Toolbar.tsx +1 -10
- package/src/__tests__/__snapshots__/questCategory.spec.ts.snap +10 -0
- package/src/__tests__/__snapshots__/questHelper.spec.ts.snap +4 -0
- package/src/__tests__/kcanotifyData.spec.ts +1 -1
- package/src/__tests__/kcwikiData.spec.ts +1 -1
- package/src/__tests__/questCategory.spec.ts +2 -2
- package/src/components/QuestCard/index.tsx +0 -1
- package/src/components/QuestList.tsx +51 -69
- package/src/components/QuestTag.tsx +10 -2
- package/src/poi/hooks.ts +3 -1
- package/src/poi/store.ts +2 -4
- package/src/questHelper.ts +28 -8
- package/src/store/gameQuest.tsx +20 -0
- package/src/store/quest.ts +11 -7
- package/src/store/store.tsx +26 -23
- package/src/tags.tsx +4 -4
- package/src/utils.ts +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
9e40dc8e52e658d7b57356703dae2a4fab7dd950
|
|
@@ -2103,10 +2103,10 @@
|
|
|
2103
2103
|
]
|
|
2104
2104
|
},
|
|
2105
2105
|
"315": {
|
|
2106
|
-
"code": "
|
|
2107
|
-
"desc": "
|
|
2106
|
+
"code": "C64",
|
|
2107
|
+
"desc": "在春季的一天之内取得 8 次以上「演习」的胜利,进一步提高舰队的水平!",
|
|
2108
2108
|
"memo": "奖励:间宫 *1 礼物箱 *1",
|
|
2109
|
-
"memo2": "
|
|
2109
|
+
"memo2": "春季限定单日内演习取得 8 次胜利与「春季大演習 (C54)」内容相同",
|
|
2110
2110
|
"name": "春季大演习",
|
|
2111
2111
|
"pre": [
|
|
2112
2112
|
"C2"
|
|
@@ -2476,6 +2476,24 @@
|
|
|
2476
2476
|
"B117"
|
|
2477
2477
|
]
|
|
2478
2478
|
},
|
|
2479
|
+
"356": {
|
|
2480
|
+
"code": "C65",
|
|
2481
|
+
"desc": "精锐驱逐舰演习任务:编成包含精锐第十九驱逐队「矶波改二」「浦波改二」「绫波改二」「敷波改二」四舰的演习舰队。以该舰队于本日取得演习【S 判定】胜利 3 次以上!",
|
|
2482
|
+
"memo": "奖励:以下奖励二选一:伊良湖 开发资材 ×4 以下奖励三选一:熟練見張員 Green",
|
|
2483
|
+
"memo2": "包含矶波改二、浦波改二、绫波改二、敷波改二的舰队单日内演习 3 次 S 胜",
|
|
2484
|
+
"name": "精锐「第十九驱逐队」演习!",
|
|
2485
|
+
"pre": [
|
|
2486
|
+
"B180"
|
|
2487
|
+
]
|
|
2488
|
+
},
|
|
2489
|
+
"357": {
|
|
2490
|
+
"code": "C66",
|
|
2491
|
+
"desc": "大和型战舰演习任务:编成以大和型战舰「大和」以及「武藏」两舰、僚舰轻巡 1 艘、驱逐舰 2 艘以上的演习舰队。今日在同一舰队的演习中取得 3 次或更多【S 胜利】以上的的判定吧!",
|
|
2492
|
+
"memo": "奖励:以下奖励三选一:15.5cm 三連装副砲 ×2 新型火炮兵装资材 开发资材 ×6 以下奖励三选一:间宫 21 号対空電探 ×2 改修资材 ×4",
|
|
2493
|
+
"memo2": "大和 + 武藏 + 轻巡 1 艘 + 驱逐舰 2 艘 + 任意舰,在演习取得 3 次【S 胜利】。",
|
|
2494
|
+
"name": "「大和型战舰」第一舰队演习开始!",
|
|
2495
|
+
"pre": []
|
|
2496
|
+
},
|
|
2479
2497
|
"401": {
|
|
2480
2498
|
"code": "D1",
|
|
2481
2499
|
"desc": "舰队出发「远征」!",
|
|
@@ -5436,11 +5454,11 @@
|
|
|
5436
5454
|
]
|
|
5437
5455
|
},
|
|
5438
5456
|
"932": {
|
|
5439
|
-
"code": "
|
|
5440
|
-
"desc": "
|
|
5457
|
+
"code": "2204B1",
|
|
5458
|
+
"desc": "【春限定】以第十六驱逐队「天津风」为旗舰,第二僚舰配置「雪风」「时津风」「初风」其一,反复出击南西群岛海域巴士海峡、东部奥廖尔海、马六甲海峡槟榔屿海域深处!击败敌方舰队!",
|
|
5441
5459
|
"memo": "奖励:特制家具职人 以下奖励三选一:高速修复材 ×6 三式爆雷投射机 ×3 洋上补给 ×3",
|
|
5442
|
-
"memo2": "
|
|
5443
|
-
"name": "
|
|
5460
|
+
"memo2": "21 年旧限时任务。旗舰天津风,僚舰雪风、时津风,初风 3 选 1,加其他任意,出击 2-2、2-3、7-3P2,各两次 A 胜以上",
|
|
5461
|
+
"name": "【春限定】春之天津风!",
|
|
5444
5462
|
"pre": []
|
|
5445
5463
|
},
|
|
5446
5464
|
"933": {
|
|
@@ -5807,6 +5825,91 @@
|
|
|
5807
5825
|
"B176"
|
|
5808
5826
|
]
|
|
5809
5827
|
},
|
|
5828
|
+
"970": {
|
|
5829
|
+
"code": "B179",
|
|
5830
|
+
"desc": "以包含「浦波改二」「青叶」「鬼怒」的舰队,出击南西群岛防卫线、东部奥廖尔海、冲之岛海、塔威塔威泊地海岸、昭南本土航线!找出并歼灭敌方舰队!",
|
|
5831
|
+
"memo": "奖励:以下奖励三选一:新型火炮兵装资材 新型航空兵装资材 补强增设 以下奖励三选一:试制 长 12.7cm 连装炮 A 型改四新型航空兵装资材 ×3 战斗详报",
|
|
5832
|
+
"memo2": "浦波改二 + 青叶 + 鬼怒 + 任意舰,出击 1-4、2-3、2-5、7-2P2、7-4 各一次 S 胜",
|
|
5833
|
+
"name": "第十六战队,改装「浦波改二」出击!",
|
|
5834
|
+
"pre": []
|
|
5835
|
+
},
|
|
5836
|
+
"971": {
|
|
5837
|
+
"code": "2204B2",
|
|
5838
|
+
"desc": "「九周年限定任务」编成旗舰轻巡,僚舰驱逐舰 2 艘以上的舰队,出击镇守府正面海域,南西诸岛近海,制油所地带沿岸,南西诸岛防卫线,镇守府近海!确保镇守府海域周围的安全!",
|
|
5839
|
+
"memo": "奖励:以下奖励二选一:开发资材 ×9 高速修复材 ×9 以下奖励三选一:九九式艦爆二二型 ×3 九九式艦爆二二型 (熟練) 补强增设",
|
|
5840
|
+
"memo2": "1-1,1-2,1-3,1-4,1-5 S 胜各 1 次",
|
|
5841
|
+
"name": "「限定任务」舰队 9 周年,拔锚!",
|
|
5842
|
+
"pre": []
|
|
5843
|
+
},
|
|
5844
|
+
"972": {
|
|
5845
|
+
"code": "2204B3",
|
|
5846
|
+
"desc": "「九周年任务扩张作战」编成旗舰轻空母,僚舰驱逐舰 2 艘以上的舰队,出击东部奥缪尔海,北方 AL 海域,昭南本土航路,中部北海域孔雀岛近海!消灭敌方战力!",
|
|
5847
|
+
"memo": "奖励:家具 九周年春日装饰窗以下奖励三选一:新型航空兵装资材 ×6 勋章 ×351cm 連装砲",
|
|
5848
|
+
"memo2": "2-3,3-5,7-4,6-4 S 胜各 1 次",
|
|
5849
|
+
"name": "「限定任务」舰队九周年,扩张作战!",
|
|
5850
|
+
"pre": [
|
|
5851
|
+
"2204B2"
|
|
5852
|
+
]
|
|
5853
|
+
},
|
|
5854
|
+
"973": {
|
|
5855
|
+
"code": "By11",
|
|
5856
|
+
"desc": "编成含有 3 艘以上美英舰艇,且不含空母的舰队,出击北方海域莫雷海及阿尔锋西诺方向、西方海域里兰卡岛、南西海域槟榔屿海域深处,搜寻敌舰队并逐一击破!",
|
|
5857
|
+
"memo": "奖励:以下奖励三选一:开发资材 ×8 熟练搭乘员 新型航空兵装资材 以下奖励三选一:Swordfish (水上機型) ×2SOC Seagull OS2U",
|
|
5858
|
+
"memo2": "年常任务 (5 月) 包含任意英国和美国舰娘共三艘,加其他任意舰娘 Red",
|
|
5859
|
+
"name": "日英美联合水上舰队,起航!",
|
|
5860
|
+
"pre": [
|
|
5861
|
+
"B141"
|
|
5862
|
+
]
|
|
5863
|
+
},
|
|
5864
|
+
"974": {
|
|
5865
|
+
"code": "B180",
|
|
5866
|
+
"desc": "以包含改装特 I 型驱逐舰「矶波改二」的强力舰队,出击镇守府海域南西群岛近海、炼油厂地带沿岸以及南方海域前方!于各战斗海域搜寻歼灭敌方舰队!",
|
|
5867
|
+
"memo": "奖励:以下奖励三选一:高速修复材 ×9 新型火炮兵装资材 补强增设 以下奖励三选一:12.7cm 連装砲 A 型改二 61cm 三連装 (酸素) 魚雷 ×2 开发资材 ×9",
|
|
5868
|
+
"memo2": "包含矶波改二的舰队出击 1-2、1-3、5-1,各一次 S 胜",
|
|
5869
|
+
"name": "「矶波改二」,起航!",
|
|
5870
|
+
"pre": [
|
|
5871
|
+
"By1",
|
|
5872
|
+
"B79"
|
|
5873
|
+
]
|
|
5874
|
+
},
|
|
5875
|
+
"975": {
|
|
5876
|
+
"code": "By12",
|
|
5877
|
+
"desc": "以包含精锐第十九驱逐队「矶波改二」「浦波改二」「绫波改二」「敷波改二」的舰队,出击镇守府近海、南西群岛东部奥廖尔海、北方基斯岛海域、南方萨部岛近海海域!搜寻并歼灭敌舰队!",
|
|
5878
|
+
"memo": "奖励:以下奖励三选一:熟練見張員 ×2 改修资材 ×4 高速修复材 ×9 以下奖励三选一:勋章 ×212.7cm 連装砲 A 型改二 ×261cm 三連装 (酸素) 魚雷後期型",
|
|
5879
|
+
"memo2": "年常任务 (5 月) 包含矶波改二、浦波改二、绫波改二、敷波改二的舰队出击 1-5、2-3、3-2、5-3,各一次 S 胜",
|
|
5880
|
+
"name": "精锐「第十九驱逐队」,全力出击!",
|
|
5881
|
+
"pre": [
|
|
5882
|
+
"C65"
|
|
5883
|
+
]
|
|
5884
|
+
},
|
|
5885
|
+
"976": {
|
|
5886
|
+
"code": "B181",
|
|
5887
|
+
"desc": "以旗舰大和改二 / 重、僚舰轻巡 1 艘、驱逐舰 2 艘以上的舰队,出击镇守府海域南西群岛防卫线、南西群岛海域冲之岛海、南方海域前方、西方海域加斯加达马岛!摧毁敌方部队!",
|
|
5888
|
+
"memo": "奖励:以下奖励三选一:高速修复材 ×10 新型火炮兵装资材 ×2 补强增设 以下奖励三选一:試製 51cm 連装砲 15.5cm 三連装副砲改二★210cm 連装高角砲群集中配備",
|
|
5889
|
+
"memo2": "旗舰大和改二 / 改二重 + 轻巡 1 艘 + 驱逐舰 2 艘 + 任意舰出击 1-4、2-5、5-1、4-4,各一次 S 胜",
|
|
5890
|
+
"name": "改大和型战列舰「大和改二」、出击!",
|
|
5891
|
+
"pre": [
|
|
5892
|
+
"F109"
|
|
5893
|
+
]
|
|
5894
|
+
},
|
|
5895
|
+
"977": {
|
|
5896
|
+
"code": "B182",
|
|
5897
|
+
"desc": "部署由两艘改装大和级战列舰「大和改二 / 重」和「武蔵改二」以及两艘或以上的驱逐舰组成的舰队!在咖喱洋里兰卡岛海域、萨部岛近海海域、塔威塔威泊地海岸深处、kw 环礁沿海海域消灭敌人!",
|
|
5898
|
+
"memo": "奖励:以下奖励三选一:改装设计图 战斗详报 10cm 連装高角砲群 集中配備以下奖励三选一:15m 二重測距儀 + 21 号電探改二 46cm 三連装砲改 ★815.5cm 三連装副砲改二★2 x2",
|
|
5899
|
+
"memo2": "大和改二 / 改二重 + 武藏改二 + 驱逐舰 2 艘 + 2 任意舰出击 4-5、5-3、7-2P2、6-5 各 S 胜一次。",
|
|
5900
|
+
"name": "遇敌必歼!最精锐大和型「第一战队」起锚!",
|
|
5901
|
+
"pre": [
|
|
5902
|
+
"B181"
|
|
5903
|
+
]
|
|
5904
|
+
},
|
|
5905
|
+
"978": {
|
|
5906
|
+
"code": "B183",
|
|
5907
|
+
"desc": "【扩张作战】以重型改装「大和改二重」为旗舰的强大舰队出击槟榔屿海域深处、昭南本土航线、沙门海域北方、中部北海域孔雀岛近海!摧毁并粉碎每个海域的敌舰!",
|
|
5908
|
+
"memo": "奖励:以下奖励三选一:间宫 ×2 新型兵装资材 ×2 改修资材 以下奖励三选一:",
|
|
5909
|
+
"memo2": "旗舰大和改二重 + 任意舰出击 7-3P2、7-4、5-5、6-4 各一次 S 胜利",
|
|
5910
|
+
"name": "【扩张作战】重型改装「大和改二重」出击!",
|
|
5911
|
+
"pre": []
|
|
5912
|
+
},
|
|
5810
5913
|
"1101": {
|
|
5811
5914
|
"code": "F96",
|
|
5812
5915
|
"desc": "工厂整备:废弃「12.7cm 连装炮」x8,准备家具币 x4000 和「14cm 单装炮」「20.3cm 连装炮」各 x4!※完成任务后,准备了的家具币和必要装备 (低改修值的优先) 会被消费。",
|
|
@@ -5915,5 +6018,29 @@
|
|
|
5915
6018
|
"memo2": "",
|
|
5916
6019
|
"name": "镇守府大扫除",
|
|
5917
6020
|
"pre": []
|
|
6021
|
+
},
|
|
6022
|
+
"1113": {
|
|
6023
|
+
"code": "F107",
|
|
6024
|
+
"desc": "开发伊号一型乙导弹搭载机:准备陆军新型尖端袭击机「ki102 乙」*1,「二式复战 屠龙 丙型」*1,熟练搭乘员 * 2 以及新型航空兵装资材 * 4!(任务完成后,准备的资材会消失)",
|
|
6025
|
+
"memo": "奖励:准备キ 102 乙、二式複戦 屠龍 丙型、熟练搭乘员 X2、新型航空兵装资材 X4。奖励キ 102 乙改 + イ号一型乙 誘導弾",
|
|
6026
|
+
"memo2": "准备キ 102 乙、二式複戦 屠龍 丙型、熟练搭乘员 X2、新型航空兵装资材 X4。奖励キ 102 乙改 + イ号一型乙 誘導弾",
|
|
6027
|
+
"name": "装配「无线导弹」的新型袭击机编入实战",
|
|
6028
|
+
"pre": []
|
|
6029
|
+
},
|
|
6030
|
+
"1114": {
|
|
6031
|
+
"code": "F108",
|
|
6032
|
+
"desc": "废弃「小口径主炮」「中口径主炮」「副炮」各 * 3,准备「35.6 连装炮」*3、高速建造材 * 8、铝 800!(任务完成后会消耗准备的资源・装备・高速建造材)",
|
|
6033
|
+
"memo": "奖励:以下奖励三选一:新型火炮兵装资材 新型航空兵装资材 开发资材 ×5 以下奖励三选一:新型兵装资材 新型喷进装备开发资材 改修资材 ×3",
|
|
6034
|
+
"memo2": "废弃小口径主炮、中口径主炮、副炮各 3 个准备 35.6cm 连装炮 ×3、高速建造材 ×8、铝 ×800",
|
|
6035
|
+
"name": "「工厂任务」新装备开发计划 I",
|
|
6036
|
+
"pre": []
|
|
6037
|
+
},
|
|
6038
|
+
"1115": {
|
|
6039
|
+
"code": "F109",
|
|
6040
|
+
"desc": "废弃大口径主炮、副炮、水上侦察机各装备各废弃 3 个,准备 46cm 三连装炮 x2、洋上补给 x4 以及 2700 弹药!※任务完成后,准备的装备和资源会被消耗。",
|
|
6041
|
+
"memo": "奖励:以下奖励三选一:新型火炮兵装资材 新型高温高圧缶 开发资材 ×6 以下奖励三选一:新型兵装资材 ×2 新型高温高圧缶 勋章",
|
|
6042
|
+
"memo2": "",
|
|
6043
|
+
"name": "【工厂任务】新装备开发计划 II",
|
|
6044
|
+
"pre": []
|
|
5918
6045
|
}
|
|
5919
6046
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
2022061801
|
|
@@ -2063,6 +2063,12 @@
|
|
|
2063
2063
|
"desc": "Secure 4 S-Rank victories in Exercises within the same day using Oyashio Kai Ni and Kuroshio Kai Ni as the first two ships and up to 4 additional ships.",
|
|
2064
2064
|
"memo": "This quest resets on the first quest reset of October. ※Elite DesDiv 15 First Platoon Exercises! ➣Rewards: ¶First choice: Either a ★+2 Type 22 Surface Radar Kai 4 OR a ★+2 Skilled Lookouts ¶Second choice: Either two Irako OR three Screws"
|
|
2065
2065
|
},
|
|
2066
|
+
"356": {
|
|
2067
|
+
"code": "C65",
|
|
2068
|
+
"name": "Annual DesDiv 19 Excercises - May",
|
|
2069
|
+
"desc": "Secure 3 S-Rank victories in Exercises within the same day using Isonami Kai Ni, Uranami Kai Ni, Ayanami Kai Ni, Shikinami Kai Ni and up to 2 additional ships.",
|
|
2070
|
+
"memo": "This quest resets on the first quest reset of May. ※Elite DesDiv 19 Exercises! ➣Rewards: ¶First choice: Either a Irako OR four Development Materials ¶Second choice: Either a ★+4 Skilled Lookouts OR a Mamiya OR three Screws"
|
|
2071
|
+
},
|
|
2066
2072
|
"401": {
|
|
2067
2073
|
"code": "D1",
|
|
2068
2074
|
"name": "The First Expedition!",
|
|
@@ -4139,6 +4145,24 @@
|
|
|
4139
4145
|
"desc": "Sortie a CVL as flagship, 2 DD and up to 3 additional ships to [W2-3], [W3-5], [W7-4] and [W6-4]. S-Rank each boss node.",
|
|
4140
4146
|
"memo": "➣ Rewards either six New Model Aviation Armament Materials OR 3 Medals OR a 51cm Twin Gun Mount"
|
|
4141
4147
|
},
|
|
4148
|
+
"973": {
|
|
4149
|
+
"code": "By11",
|
|
4150
|
+
"name": "Annual UK-US Joint Surface Fleet - May",
|
|
4151
|
+
"desc": "Sortie 3 British/American ships, no any CV(L/B) and up to 3 additional ships to [W3-1], [W3-3], [W4-3] and [W7-3-P]. A-Rank+ the boss node of each.",
|
|
4152
|
+
"memo": "This quest resets on the first quest reset of May. ※Japan-UK-US Joint Surface Fleet, Weigh Anchor! ➣Rewards: ¶First choice: Either eight Development Materials OR a Skilled Crew Member OR a New Model Aviation Armament Materials ¶Second choice: Either two Swordfish (Seaplane Model) OR a SOC Seagull OR a OS2U"
|
|
4153
|
+
},
|
|
4154
|
+
"974": {
|
|
4155
|
+
"code": "B180",
|
|
4156
|
+
"name": "Isonami Kai Ni, Weigh Anchor!",
|
|
4157
|
+
"desc": "Sortie a fleet with Isonami Kai Ni and up to 5 additional ships to [W1-2], [W1-3] and [W5-1]. S-Rank each boss node.",
|
|
4158
|
+
"memo": "➣Rewards: ¶First choice: Either nine Buckets OR a New Model Artillery Armament Materials OR a Reinforcement Expansion ¶Second choice: Either a 12.7cm Twin Gun Mount Model A Kai Ni OR two 61cm Triple (Oxygen) Torpedo Mount OR nine Development Materials"
|
|
4159
|
+
},
|
|
4160
|
+
"975": {
|
|
4161
|
+
"code": "By12",
|
|
4162
|
+
"name": "Annual DesDev 19 Sortie - May",
|
|
4163
|
+
"desc": "Sortie Isonami Kai Ni, Uranami Kai Ni, Ayanami Kai Ni, Shikinami Kai Ni, and up to 2 additional ships to [W1-5], [W2-3], [W3-2] and [W5-3]. S-Rank the boss node of each.",
|
|
4164
|
+
"memo": "This quest resets on the first quest reset of May. ※Elite DesDiv 19, All-out Sortie! ➣Rewards: ¶First choice: Either two Skilled Lookouts OR four Screws OR nine Buckets ¶Second choice: Either two Medals OR two 12.7cm Twin Gun Mount Model A Kai Ni OR a 61cm Triple (Oxygen) Torpedo Mount Late Model"
|
|
4165
|
+
},
|
|
4142
4166
|
"1101": {
|
|
4143
4167
|
"code": "F96",
|
|
4144
4168
|
"name": "Another Naval Arsenal Maintenance",
|
|
@@ -4210,5 +4234,11 @@
|
|
|
4210
4234
|
"name": "Deployment a New Assault Aircraft with [Guided Missile]",
|
|
4211
4235
|
"desc": "Have a Ki-102 B, a Type 2 Two-seat Fighter Toryuu Model C, two Skilled Crew Members and four New Model Aviation Armament Materials.",
|
|
4212
4236
|
"memo": "✘ Consumes the items (even with any ★). ➣ Rewards a Ki-102 B Kai + No.1 Model 1B Guided Missile"
|
|
4237
|
+
},
|
|
4238
|
+
"1114": {
|
|
4239
|
+
"code": "F108",
|
|
4240
|
+
"name": "New Equipment Development Plan I",
|
|
4241
|
+
"desc": "Have three 35.6cm Twin Gun Mounts, 8 Flamethrowers and 800 bauxite. Scrap 3 Small Cal. Main Guns, 3 Medium Cal. Main Guns and 3 Secondary Guns.",
|
|
4242
|
+
"memo": "✘Consumes the items and resources. ➣Rewards: ¶First choice: Either a New Model Artillery Armament Materials OR a New Model Aviation Armament Materials OR five Development Materials ¶Second choice: Either a New Model Armament Materials OR a New Model Rocket Development Materials OR three Screws"
|
|
4213
4243
|
}
|
|
4214
4244
|
}
|
|
@@ -1396,6 +1396,12 @@
|
|
|
1396
1396
|
"desc": "旗艦に「黒潮改二」または「親潮改二」、そのいずれかを二番艦とする演習艦隊で、本日中に【S 判定】勝利を 4 回以上達成せよ!",
|
|
1397
1397
|
"memo": "※イヤーリー (10 月) ※演習:当日中に演習で 4 回 S 勝利 ※編成:黒潮改二・親潮改二を旗艦 + 黒親潮改二・潮改二を二番艦 + 自由枠 4 [獲] 二回選択報酬: 22 号対水上電探改四★2x1、熟練見張員★2x1 / 給糧艦「伊良湖」x2、改修資材 x3"
|
|
1398
1398
|
},
|
|
1399
|
+
"356": {
|
|
1400
|
+
"code": "C65",
|
|
1401
|
+
"name": "精鋭「第十九駆逐隊」演習!",
|
|
1402
|
+
"desc": "精鋭駆逐艦演習任務:精鋭第十九駆逐隊「磯波改二」「浦波改二」「綾波改二」「敷波改二」4 隻を含む演習艦隊を編成。同艦隊で本日中に演習で【S 判定】勝利 3 回以上を達成せよ!",
|
|
1403
|
+
"memo": "※イヤーリー (5 月) ※演習:当日中に演習で 3 回 S 勝利 ※編成:磯波改二 + 浦波改二 + 綾波改二 + 敷波改二 + 自由枠 2 [獲] 二回選択報酬:給糧艦「伊良湖」x1、開発資材 x4 / 熟練見張員★4x1、給糧艦「間宮」x1、改修資材 x3"
|
|
1404
|
+
},
|
|
1399
1405
|
"401": {
|
|
1400
1406
|
"code": "D1",
|
|
1401
1407
|
"name": "はじめての「遠征」!",
|
|
@@ -3113,7 +3119,7 @@
|
|
|
3113
3119
|
"code": "B179",
|
|
3114
3120
|
"name": "第十六戦隊、改装「浦波改二」出撃します!",
|
|
3115
3121
|
"desc": "「浦波改二」、さらに「青葉」「鬼怒」を含む艦隊で、南西諸島防衛線、東部オリョール海、沖ノ島沖、タウイタウイ泊地沖深部、昭南本土航路へ出撃!敵艦隊を捕捉撃滅せよ!",
|
|
3116
|
-
"memo": "※出撃:1-4・2-3・2-5・7-2-M・7-4 のボスマスを各 1 回ずつ S
|
|
3122
|
+
"memo": "※出撃:1-4・2-3・2-5・7-2-M・7-4 のボスマスを各 1 回ずつ S 勝利 ※編成:浦波改二 + 青葉 + 鬼怒 + 自由枠 3 [獲] 二回選択報酬:新型砲熕兵装資材 x1、新型航空兵装資材 x1、補強増設 x1 / 試製 長 12.7cm 連装砲 A 型改四 x1、新型航空兵装資材 x3、戦闘詳報 x1"
|
|
3117
3123
|
},
|
|
3118
3124
|
"971": {
|
|
3119
3125
|
"code": "2204B2",
|
|
@@ -3127,6 +3133,24 @@
|
|
|
3127
3133
|
"desc": "【九周年任務拡張作戦】旗艦に軽空母、随伴駆逐艦 2 隻以上の艦隊で、東部オリョール海、北方 AL 海域、昭南本土航路、中部北海域ピーコック島沖へ出撃!敵戦力を撃滅せよ!",
|
|
3128
3134
|
"memo": "※期間限定 ※出撃:2-3・3-5・7-4・6-4 のボスマスを各 1 回ずつ S 勝利 ※編成:軽母を旗艦 + 駆逐 2 + 自由枠 3 [獲] 家具「祝九周年!春の飾り窓」、選択報酬:新型航空兵装資材 x6、勲章 x3、51cm 連装砲 x1"
|
|
3129
3135
|
},
|
|
3136
|
+
"973": {
|
|
3137
|
+
"code": "By11",
|
|
3138
|
+
"name": "日英米合同水上艦隊、抜錨せよ!",
|
|
3139
|
+
"desc": "米英艦艇 3 隻以上を含む空母を伴わない艦隊で、北方海域モーレイ海及びアルフォンシーノ方面、西方海域リランカ島、南西海域ペナン島沖深部を哨戒、敵戦力を捕捉、これを撃破せよ!",
|
|
3140
|
+
"memo": "※イヤーリー (5 月) ※出撃:3-1・3-3・4-3・7-3-P のボスマスを各 1 回ずつ A 勝利以上 ※編成:空母なしの (米英艦計 3 隻 + 自由枠 3) ※空母だから軽空母も護衛空母も装甲空母も不可なので注意 ※自由枠だからタイトルと関係なく日本艦なくても可、その他の海外艦いても可 ※金剛は英艦ではなく自由枠になるので注意 ※2022 年 4 月まで実装された米英艦に限られる可能性にも注意 [獲] 二回選択報酬:開発資材 x8、熟練搭乗員 x1、新型航空兵装資材 x1 / Swordfish (水上機型) x2、SOC Seagull x1、OS2U x1"
|
|
3141
|
+
},
|
|
3142
|
+
"974": {
|
|
3143
|
+
"code": "B180",
|
|
3144
|
+
"name": "「磯波改二」、抜錨せよ!",
|
|
3145
|
+
"desc": "改装特 I 型駆逐艦「磯波改二」を含む有力な艦隊で、鎮守府海域南西諸島沖、製油所地帯沿岸、さらに南方海域前面に展開!各作戦海域の敵艦隊を捕捉、これを撃滅せよ!",
|
|
3146
|
+
"memo": "※出撃:1-2・1-3・5-1 のボスマスを各 1 回ずつ S 勝利 ※編成:磯波改二 + 自由枠 5 [獲] 二回選択報酬:高速修復材 x9、新型砲熕兵装資材 x1、補強増設 x1 / 12.7cm 連装砲 A 型改二 x1、61cm 三連装 (酸素) 魚雷 x2、開発資材 x9"
|
|
3147
|
+
},
|
|
3148
|
+
"975": {
|
|
3149
|
+
"code": "By12",
|
|
3150
|
+
"name": "精鋭「第十九駆逐隊」、全力出撃!",
|
|
3151
|
+
"desc": "精鋭第十九駆逐隊「磯波改二」「浦波改二」「綾波改二」「敷波改二」を含む艦隊で、鎮守府近海、南西諸島東部オリョール海、北方キス島沖、南方サブ島沖海域に出撃!敵艦隊を捕捉撃滅せよ!",
|
|
3152
|
+
"memo": "※イヤーリー (5 月) ※出撃:1-5・2-3・3-2・5-3 のボスマスを各 1 回ずつ S 勝利 ※編成:磯波改二 + 浦波改二 + 綾波改二 + 敷波改二 + 自由枠 2 [獲] 二回選択報酬:熟練見張員 x2、改修資材 x4、高速修復材 x9 / 勲章 x2、12.7cm 連装砲 A 型改二 x2、61cm 三連装 (酸素) 魚雷後期型 x1"
|
|
3153
|
+
},
|
|
3130
3154
|
"1101": {
|
|
3131
3155
|
"code": "F96",
|
|
3132
3156
|
"name": "海軍工廠の再整備",
|
|
@@ -3198,5 +3222,11 @@
|
|
|
3198
3222
|
"name": "「無線誘導弾」装備新型襲撃機の実戦配備",
|
|
3199
3223
|
"desc": "イ号一型乙誘導弾搭載機の開発:陸軍新鋭襲撃機「キ 102 乙」x1 及び「二式複戦 屠龍 丙型」x1、熟練搭乗員 x2、さらに新型航空兵装資材 x4 を準備せよ!(任務達成後、用意した資材等は消滅します)",
|
|
3200
3224
|
"memo": "※消費装備のロックを予め解除しておくこと ※もし達成状態一時解除したい場合はどれかを基地に配備すればいい ※いつも通り改修値が消えるので嫌なら別の無改修キ 102 乙を用意すること [獲] キ 102 乙改 + イ号一型乙 誘導弾 x1"
|
|
3225
|
+
},
|
|
3226
|
+
"1114": {
|
|
3227
|
+
"code": "F108",
|
|
3228
|
+
"name": "【工廠任務】新装備開発計画 I",
|
|
3229
|
+
"desc": "「小口径主砲」「中口径主砲」「副砲」各 x3 装備を廃棄、「35.6cm 連装砲」x3、高速建造材 x8、ボーキサイト 800 を準備せよ!(任務達成後、準備した資源・装備・高速建造材は消費します)",
|
|
3230
|
+
"memo": "[獲] 二回選択報酬:新型砲熕兵装資材 x1、新型航空兵装資材 x1、開発資材 x5 / 新型兵装資材 x1、新型噴進装備開発資材 x1、改修資材 x3"
|
|
3201
3231
|
}
|
|
3202
3232
|
}
|
|
@@ -1475,6 +1475,12 @@
|
|
|
1475
1475
|
"desc": "기함에 「쿠로시오 개2」 또는 「오야시오 개2」, 나머지를 2번함으로 하는 연습함대로, 오늘 중에 【S판정】승리를 4회 이상 달성하라!",
|
|
1476
1476
|
"memo": "※연간 임무 (10월). 쿠로시오 개2와 오야시오 개2를 1, 2번함으로 하는 함대로 하루에 연습전 S승리 4회 / 보상 : 연료 150, 탄약 150, 강재 150, (22호 대수상전탐 개4 ☆+2 or숙련견시원 ☆+2), (급양함 「이라코」×2 or개수자재×5)"
|
|
1477
1477
|
},
|
|
1478
|
+
"356": {
|
|
1479
|
+
"code": "C65",
|
|
1480
|
+
"name": "정예 「제19구축대」, 전력 출격!",
|
|
1481
|
+
"desc": "정예 구축함 연습 임무 : 정예 제19구축대 「이소나미 개2」 「우라나미 개2」 「아야나미 개2」 「시키나미 개2」 4척을 포함한 연습함대를 편성. 동 함대로 오늘 중에 연습에서 【S판정】 승리 3회 이상을 달성하라!",
|
|
1482
|
+
"memo": "※연간 임무 (5월). 이소나미 개2, 우라나미 개2, 아야나미 개2, 시키나미 개2를 포함한 함대로 하루에 연습전 S승리 3회 / 보상 : 연료 190, 탄약 190, 강재 190, (급양함 「이라코」 or 개발자재×4), (숙련견시원★+4 or 급양함 「마미야」 or 개수자재×3)"
|
|
1483
|
+
},
|
|
1478
1484
|
"401": {
|
|
1479
1485
|
"code": "D1",
|
|
1480
1486
|
"name": "첫 원정",
|
|
@@ -3203,6 +3209,24 @@
|
|
|
3203
3209
|
"desc": "【9주년 임무 확장작전】기함에 경항모, 수반 구축함 2척 이상의 함대로, 동부 오룔 해, 북방AL해역, 싱가포르 본토 항로, 중부 북해역 피콕 섬 앞바다에 출격! 적 전력을 격멸하라!",
|
|
3204
3210
|
"memo": "※기함 경항모, 구축함 2척 이상이 포함된 함대로 2-3, 3-5, 6-4, 7-4 각각 S승리 1회 / 보상 : 연료 900, 탄약 900, 보크사이트 900, (가구) 祝 9주년! 봄 장식 창문, (신형항공병장자재×6 or 훈장×3 or 51cm 연장포)"
|
|
3205
3211
|
},
|
|
3212
|
+
"973": {
|
|
3213
|
+
"code": "By11",
|
|
3214
|
+
"name": "미일영 합동 수상함대, 발묘하라!",
|
|
3215
|
+
"desc": "미영함정 3척 이상을 포함하고 항모를 수반하지 않은 함대로, 북방해역 모레이 해 및 알폰시노 방면, 서방해역 리랑카 섬, 남서해역 페낭 섬 앞바다 심부를 초계, 적 전력을 포착, 이를 격파하라!",
|
|
3216
|
+
"memo": "※연간 임무(5월). 미국, 영국 칸무스 3척 이상 포함, '항공모함이 편성되지 않은 함대'로 3-1, 3-3, 4-3, 7-3-2 각각 S승리 / 보상 : 연료 350, 탄약 450, 강재 350, 보크사이트 550, (개발자재×8 or 숙련탑승원 or 신형항공병장자재), (Swordfish(수상기형)×2 or SOC Seagull or OS2U)"
|
|
3217
|
+
},
|
|
3218
|
+
"974": {
|
|
3219
|
+
"code": "B180",
|
|
3220
|
+
"name": "「이소나미 개2」, 발묘하라!",
|
|
3221
|
+
"desc": "개장 특1형 구축함 「이소나미 개2」를 포함한 유력한 함대로, 진수부해역 남서제도 앞바다, 제유소 지대 연안, 거기에 남방해역 전면에 전개! 각 작전해역의 적 함대를 포착, 이를 격멸하라!",
|
|
3222
|
+
"memo": "※이소나미 개2를 포함한 함대로 1-2, 1-3, 5-1 각각 S승리 / 보상 : 연료 190, 탄약 190, 강재 190, (고속수복재×9 or 신형포공병장자재 or 보강증설), (12.7cm 연장포 A형 개2 or 61cm 3연장(산소)어뢰×2 or 개발자재×9)"
|
|
3223
|
+
},
|
|
3224
|
+
"975": {
|
|
3225
|
+
"code": "By12",
|
|
3226
|
+
"name": "정예 「제19구축대」, 전력 출격!",
|
|
3227
|
+
"desc": "정예 제19구축대 「이소나미 개2」 「우라나미 개2」 「아야나미 개2」 「시키나미 개2」를 포함한 함대로, 진수부 근해, 남서제도 동부 오룔 해, 북방 키스 섬 앞바다, 남방 사부 섬 앞바다 해역에 출격! 적 함대를 포착 격멸하라!",
|
|
3228
|
+
"memo": "※연간 임무(5월). 이소나미 개2, 우라나미 개2, 아야나미 개2, 시키나미 개2를 포함한 함대로 1-5, 2-3, 3-2, 5-3 각각 S승리 / 보상 : 연료 190, 탄약 190, 강재 190, 보크사이트 190, (훈장×2 or 12.7cm 연장포 A형 개2×2 or 61cm 3연장(산소)어뢰 후기형), (숙련견시원x2 or 개수자재x4 or 고속수복재x9)"
|
|
3229
|
+
},
|
|
3206
3230
|
"1101": {
|
|
3207
3231
|
"code": "F96",
|
|
3208
3232
|
"name": "해군 공창의 재정비",
|
|
@@ -3274,5 +3298,11 @@
|
|
|
3274
3298
|
"name": "「무선 유도탄」 장비 신형 습격기의 실전 배비",
|
|
3275
3299
|
"desc": "이호 1형乙 유도탄 탑재기의 개발 : 육군 신예 습격기 「키-102을」×1 및 「2식복전 토류 병형」×1, 숙련탑승원×2, 거기에 신형항공병장자재×4를 준비하라! (임무 달성 후, 준비한 자재 등은 소멸합니다.)",
|
|
3276
3300
|
"memo": "※키-102을, 2식복전 토류 병형 각각 1기, 숙련탑승원 2개, 신형항공병자자재 4개 준비(※ 키-102을이 강화된 상태일 경우, 그 강화치는 임무 달성 후 0으로 줄어듦에 주의) 보상 : 보크사이트 300, 키-102을 개 + 이호 1형乙 유도탄"
|
|
3301
|
+
},
|
|
3302
|
+
"1114": {
|
|
3303
|
+
"code": "F108",
|
|
3304
|
+
"name": "【공창임무】신장비 개발 계획 1",
|
|
3305
|
+
"desc": "「소구경주포」 「중구경주포」 「부포」 각×3 장비를 폐기, 「35.6cm 연장포」×3, 고속건조재×8, 보크사이트 800을 준비하라! (임무 달성 후, 준비한 자원·장비·고속건조재는 소비합니다.)",
|
|
3306
|
+
"memo": "※35.6cm 연장포×3, 고속건조재×8, 보크사이트 800 준비, 소구경주포/중구경주포/부포 계열 장비 각각 3기씩 폐기 / 보상 : 탄약 200, 강재 200, (신형포공병장자재 or 신형항공병장자재 or 개발자재×5), (신형병장자재 or 신형분진장비개발자재 or 개수자재×3)"
|
|
3277
3307
|
}
|
|
3278
3308
|
}
|
|
@@ -1543,6 +1543,12 @@
|
|
|
1543
1543
|
"desc": "旗舰「黑潮改二」或「亲潮改二」,另一只置于 2 号舰,在一日中取得 S 胜利 4 次",
|
|
1544
1544
|
"memo": "选择奖励:22 号对水上电探改四★2 或 熟练瞭望员★2 选择奖励:伊良湖 * 2 或 改修资材 * 3"
|
|
1545
1545
|
},
|
|
1546
|
+
"356": {
|
|
1547
|
+
"code": "C65",
|
|
1548
|
+
"name": "精锐「第十九驱逐队」演习!",
|
|
1549
|
+
"desc": "包含「矶波改二」「浦波改二」「绫波改二」「敷波改二」的舰队单日内演习 3 次 S 胜",
|
|
1550
|
+
"memo": "选择奖励:伊良湖 或 开发资材 ×4 选择奖励:熟练瞭望员★4 或 间宫 或 改修资材 ×3"
|
|
1551
|
+
},
|
|
1546
1552
|
"401": {
|
|
1547
1553
|
"code": "D1",
|
|
1548
1554
|
"name": "初次的「远征」",
|
|
@@ -3284,6 +3290,24 @@
|
|
|
3284
3290
|
"desc": "「九周年任务扩张作战」编成旗舰轻空母,僚舰驱逐舰 2 艘以上的舰队,出击 2-3,3-5,7-4,6-4! 消灭敌方战力并取得 S 胜各 1 次",
|
|
3285
3291
|
"memo": "选择奖励:新型航空兵装资材 * 6 或 勋章 * 3 或 51cm 连装炮"
|
|
3286
3292
|
},
|
|
3293
|
+
"973": {
|
|
3294
|
+
"code": "By11",
|
|
3295
|
+
"name": "(年任) 日英美联合水上舰队,起航!",
|
|
3296
|
+
"desc": "包含任意英国和美国舰娘共三艘,加其他任意舰娘(不含空母系)的舰队、出击 3-1,3-3,4-3,7-3P2 各一次 A 胜以上",
|
|
3297
|
+
"memo": "选择奖励:开发资材 ×8 或 熟练搭乘员 或 新型航空兵装资材 选择奖励: Swordfish(水上机型)×2 或 SOC Seagull 或 OS2U"
|
|
3298
|
+
},
|
|
3299
|
+
"974": {
|
|
3300
|
+
"code": "B180",
|
|
3301
|
+
"name": "「矶波改二」,起航!",
|
|
3302
|
+
"desc": "包含「矶波改二」的舰队,出击 1-2、1-3、5-1 并取得 S 胜",
|
|
3303
|
+
"memo": "选择奖励:高速修复材 ×9 或 新型火炮兵装资材 或 补强增设 选择奖励: 12.7cm 连装炮 A 型改二 或 61cm 三连装(酸素)鱼雷 ×2 或 开发资材 ×9"
|
|
3304
|
+
},
|
|
3305
|
+
"975": {
|
|
3306
|
+
"code": "By12",
|
|
3307
|
+
"name": "(年任) 精锐「第十九驱逐队」,全力出击!",
|
|
3308
|
+
"desc": "包含「矶波改二」「浦波改二」「绫波改二」「敷波改二」的舰队、出击 1-5、2-3、3-2、5-3,各一次 S 胜",
|
|
3309
|
+
"memo": "选择奖励:熟练瞭望员 ×2 或 改修资材 ×4 或 高速修复材 ×9 选择奖励:勋章 ×2 或 12.7cm 连装炮 A 型改二 ×2 或 61cm 三连装(酸素)鱼雷后期型"
|
|
3310
|
+
},
|
|
3287
3311
|
"1101": {
|
|
3288
3312
|
"code": "F96",
|
|
3289
3313
|
"name": "再次整备海军工厂",
|
|
@@ -3353,5 +3377,11 @@
|
|
|
3353
3377
|
"name": "装配「无线飞弹」的新型袭击机编入实战",
|
|
3354
3378
|
"desc": "开发伊号一型乙飞弹搭载机:准备陆军新型尖端袭击机「キ 102 乙」,「二式复战屠龙丙型」, 熟练搭乘员 * 2 以及新型航空兵装资材 * 4!",
|
|
3355
3379
|
"memo": "任务完成后,准备的资材会消失"
|
|
3380
|
+
},
|
|
3381
|
+
"1114": {
|
|
3382
|
+
"code": "F108",
|
|
3383
|
+
"name": "【工厂任务】新装备开发计划 I",
|
|
3384
|
+
"desc": "废弃小口径主炮、中口径主炮、副炮各 3 个 准备 35.6cm 连装炮 ×3、高速建造材 ×8、铝 ×800(任务完成后会消耗准备的资源・装备・高速建造材)",
|
|
3385
|
+
"memo": "选择奖励:新型火炮兵装资材 或 新型航空兵装资材 或 开发资材 ×5 选择奖励:新型兵装资材 或 新型喷进装备开发资材 或 改修资材 ×3"
|
|
3356
3386
|
}
|
|
3357
3387
|
}
|
|
@@ -3264,6 +3264,24 @@
|
|
|
3264
3264
|
"desc": "「九周年任務擴張作戰」編成旗艦輕空母,僚艦驅逐艦 2 艘以上的艦隊,出擊 2-3,3-5,7-4,6-4! 消滅敵方戰力並取得 S 勝各 1 次",
|
|
3265
3265
|
"memo": "選擇獎勵:新型航空兵裝資材 * 6 或 勳章 * 3 或 51cm 連裝炮"
|
|
3266
3266
|
},
|
|
3267
|
+
"973": {
|
|
3268
|
+
"code": "By11",
|
|
3269
|
+
"name": "(年任) 日英美聯合水上艦隊,起航!",
|
|
3270
|
+
"desc": "包含任意英國和美國艦娘共三艘,加其他任意艦娘(不含空母系)的艦隊、出擊 3-1,3-3,4-3,7-3P2 各一次 A 勝以上",
|
|
3271
|
+
"memo": "選擇獎勵:開發資材 ×8 或 熟練搭乘員 或 新型航空兵裝資材 選擇獎勵: Swordfish(水上機型)×2 或 SOC Seagull 或 OS2U"
|
|
3272
|
+
},
|
|
3273
|
+
"974": {
|
|
3274
|
+
"code": "B180",
|
|
3275
|
+
"name": "「磯波改二」,起航! ",
|
|
3276
|
+
"desc": "以包含「磯波改二」的艦隊,出擊 1-2、1-3、5-1 並取得 S 勝",
|
|
3277
|
+
"memo": "選擇獎勵:高速修復材 ×9 或 新型火砲兵裝資材 或 補強增設 選擇獎勵: 12.7cm 連裝炮 A 型改二 或 61cm 三連裝(酸素)魚雷 ×2 或 開發資材 ×9"
|
|
3278
|
+
},
|
|
3279
|
+
"975": {
|
|
3280
|
+
"code": "By12",
|
|
3281
|
+
"name": "(年任) 精銳「第十九驅逐隊」,全力出擊! ",
|
|
3282
|
+
"desc": "包含「磯波改二」「浦波改二」「綾波改二」「敷波改二」的艦隊、出擊 1-5、2-3、3-2、5-3,各一次 S 勝",
|
|
3283
|
+
"memo": "選擇獎勵:熟練瞭望員 ×2 或 改修資材 ×4 或 高速修復材 ×9 選擇獎勵:勳章 ×2 或 12.7cm 連裝炮 A 型改二 ×2 或 61cm 三連裝(酸素)魚雷後期型"
|
|
3284
|
+
},
|
|
3267
3285
|
"1101": {
|
|
3268
3286
|
"code": "F96",
|
|
3269
3287
|
"name": "再次整備海軍工廠",
|
package/build/prePostQuest.json
CHANGED
|
@@ -1753,7 +1753,7 @@
|
|
|
1753
1753
|
"C3",
|
|
1754
1754
|
"C61",
|
|
1755
1755
|
"C63",
|
|
1756
|
-
"
|
|
1756
|
+
"C64",
|
|
1757
1757
|
"C48",
|
|
1758
1758
|
"F44",
|
|
1759
1759
|
"F82",
|
|
@@ -2065,6 +2065,14 @@
|
|
|
2065
2065
|
],
|
|
2066
2066
|
"post": []
|
|
2067
2067
|
},
|
|
2068
|
+
"356": {
|
|
2069
|
+
"pre": [
|
|
2070
|
+
"B180"
|
|
2071
|
+
],
|
|
2072
|
+
"post": [
|
|
2073
|
+
"By12"
|
|
2074
|
+
]
|
|
2075
|
+
},
|
|
2068
2076
|
"401": {
|
|
2069
2077
|
"pre": [
|
|
2070
2078
|
"A5"
|
|
@@ -3557,7 +3565,8 @@
|
|
|
3557
3565
|
"B78"
|
|
3558
3566
|
],
|
|
3559
3567
|
"post": [
|
|
3560
|
-
"B86"
|
|
3568
|
+
"B86",
|
|
3569
|
+
"B180"
|
|
3561
3570
|
]
|
|
3562
3571
|
},
|
|
3563
3572
|
"828": {
|
|
@@ -4084,7 +4093,8 @@
|
|
|
4084
4093
|
"B140"
|
|
4085
4094
|
],
|
|
4086
4095
|
"post": [
|
|
4087
|
-
"Bq13"
|
|
4096
|
+
"Bq13",
|
|
4097
|
+
"By11"
|
|
4088
4098
|
]
|
|
4089
4099
|
},
|
|
4090
4100
|
"903": {
|
|
@@ -4097,7 +4107,9 @@
|
|
|
4097
4107
|
"pre": [
|
|
4098
4108
|
"B44"
|
|
4099
4109
|
],
|
|
4100
|
-
"post": [
|
|
4110
|
+
"post": [
|
|
4111
|
+
"B180"
|
|
4112
|
+
]
|
|
4101
4113
|
},
|
|
4102
4114
|
"905": {
|
|
4103
4115
|
"pre": [
|
|
@@ -4529,6 +4541,53 @@
|
|
|
4529
4541
|
],
|
|
4530
4542
|
"post": []
|
|
4531
4543
|
},
|
|
4544
|
+
"971": {
|
|
4545
|
+
"pre": [],
|
|
4546
|
+
"post": [
|
|
4547
|
+
"2204B3"
|
|
4548
|
+
]
|
|
4549
|
+
},
|
|
4550
|
+
"972": {
|
|
4551
|
+
"pre": [
|
|
4552
|
+
"2204B2"
|
|
4553
|
+
],
|
|
4554
|
+
"post": []
|
|
4555
|
+
},
|
|
4556
|
+
"973": {
|
|
4557
|
+
"pre": [
|
|
4558
|
+
"B141"
|
|
4559
|
+
],
|
|
4560
|
+
"post": []
|
|
4561
|
+
},
|
|
4562
|
+
"974": {
|
|
4563
|
+
"pre": [
|
|
4564
|
+
"B79",
|
|
4565
|
+
"By1"
|
|
4566
|
+
],
|
|
4567
|
+
"post": [
|
|
4568
|
+
"C65"
|
|
4569
|
+
]
|
|
4570
|
+
},
|
|
4571
|
+
"975": {
|
|
4572
|
+
"pre": [
|
|
4573
|
+
"C65"
|
|
4574
|
+
],
|
|
4575
|
+
"post": []
|
|
4576
|
+
},
|
|
4577
|
+
"976": {
|
|
4578
|
+
"pre": [
|
|
4579
|
+
"F109"
|
|
4580
|
+
],
|
|
4581
|
+
"post": [
|
|
4582
|
+
"B182"
|
|
4583
|
+
]
|
|
4584
|
+
},
|
|
4585
|
+
"977": {
|
|
4586
|
+
"pre": [
|
|
4587
|
+
"B181"
|
|
4588
|
+
],
|
|
4589
|
+
"post": []
|
|
4590
|
+
},
|
|
4532
4591
|
"1101": {
|
|
4533
4592
|
"pre": [],
|
|
4534
4593
|
"post": [
|
|
@@ -4578,5 +4637,11 @@
|
|
|
4578
4637
|
"B173"
|
|
4579
4638
|
],
|
|
4580
4639
|
"post": []
|
|
4640
|
+
},
|
|
4641
|
+
"1115": {
|
|
4642
|
+
"pre": [],
|
|
4643
|
+
"post": [
|
|
4644
|
+
"B181"
|
|
4645
|
+
]
|
|
4581
4646
|
}
|
|
4582
4647
|
}
|
package/build/questCategory.json
CHANGED
|
@@ -117,6 +117,8 @@
|
|
|
117
117
|
946,
|
|
118
118
|
947,
|
|
119
119
|
948,
|
|
120
|
+
973,
|
|
121
|
+
975,
|
|
120
122
|
1103,
|
|
121
123
|
1104,
|
|
122
124
|
1105,
|
|
@@ -327,6 +329,8 @@
|
|
|
327
329
|
347,
|
|
328
330
|
351,
|
|
329
331
|
352,
|
|
332
|
+
356,
|
|
333
|
+
357,
|
|
330
334
|
401,
|
|
331
335
|
405,
|
|
332
336
|
406,
|
|
@@ -591,6 +595,10 @@
|
|
|
591
595
|
970,
|
|
592
596
|
971,
|
|
593
597
|
972,
|
|
598
|
+
974,
|
|
599
|
+
976,
|
|
600
|
+
977,
|
|
601
|
+
978,
|
|
594
602
|
1101,
|
|
595
603
|
1102,
|
|
596
604
|
1106,
|
|
@@ -599,6 +607,8 @@
|
|
|
599
607
|
1110,
|
|
600
608
|
1111,
|
|
601
609
|
1112,
|
|
602
|
-
1113
|
|
610
|
+
1113,
|
|
611
|
+
1114,
|
|
612
|
+
1115
|
|
603
613
|
]
|
|
604
614
|
}
|
package/build/questCodeMap.json
CHANGED
|
@@ -205,7 +205,7 @@
|
|
|
205
205
|
"C9": 312,
|
|
206
206
|
"C61": 313,
|
|
207
207
|
"C63": 314,
|
|
208
|
-
"
|
|
208
|
+
"C64": 315,
|
|
209
209
|
"C13": 316,
|
|
210
210
|
"C15": 317,
|
|
211
211
|
"C16": 318,
|
|
@@ -244,6 +244,8 @@
|
|
|
244
244
|
"C58": 353,
|
|
245
245
|
"C60": 354,
|
|
246
246
|
"C62": 355,
|
|
247
|
+
"C65": 356,
|
|
248
|
+
"C66": 357,
|
|
247
249
|
"D1": 401,
|
|
248
250
|
"D2": 402,
|
|
249
251
|
"D3": 403,
|
|
@@ -532,7 +534,7 @@
|
|
|
532
534
|
"B156": 929,
|
|
533
535
|
"B157": 930,
|
|
534
536
|
"B158": 931,
|
|
535
|
-
"
|
|
537
|
+
"2204B1": 932,
|
|
536
538
|
"B159": 933,
|
|
537
539
|
"B160": 934,
|
|
538
540
|
"B161": 935,
|
|
@@ -570,6 +572,15 @@
|
|
|
570
572
|
"B176": 967,
|
|
571
573
|
"B177": 968,
|
|
572
574
|
"B178": 969,
|
|
575
|
+
"B179": 970,
|
|
576
|
+
"2204B2": 971,
|
|
577
|
+
"2204B3": 972,
|
|
578
|
+
"By11": 973,
|
|
579
|
+
"B180": 974,
|
|
580
|
+
"By12": 975,
|
|
581
|
+
"B181": 976,
|
|
582
|
+
"B182": 977,
|
|
583
|
+
"B183": 978,
|
|
573
584
|
"F96": 1101,
|
|
574
585
|
"F97": 1102,
|
|
575
586
|
"F98": 1103,
|
|
@@ -581,5 +592,8 @@
|
|
|
581
592
|
"F104": 1109,
|
|
582
593
|
"21FaLF01": 1110,
|
|
583
594
|
"F105": 1111,
|
|
584
|
-
"F106": 1112
|
|
595
|
+
"F106": 1112,
|
|
596
|
+
"F107": 1113,
|
|
597
|
+
"F108": 1114,
|
|
598
|
+
"F109": 1115
|
|
585
599
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "poi-plugin-quest-info-2",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "show quest info",
|
|
6
6
|
"homepage": "https://github.com/lawvs/poi-plugin-quest-2/",
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"moize": "^6.1.1",
|
|
38
38
|
"react-use": "^17.3.1",
|
|
39
|
-
"react-virtualized": "^
|
|
39
|
+
"react-virtualized-auto-sizer": "^1.0.6",
|
|
40
|
+
"react-window": "^1.8.7"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@babel/core": "^7.12.10",
|
|
@@ -47,7 +48,8 @@
|
|
|
47
48
|
"@storybook/react": "^6.3.4",
|
|
48
49
|
"@types/jest": "^27.4.1",
|
|
49
50
|
"@types/pangu": "^3.3.0",
|
|
50
|
-
"@types/react-virtualized": "^
|
|
51
|
+
"@types/react-virtualized-auto-sizer": "^1.0.1",
|
|
52
|
+
"@types/react-window": "^1.8.5",
|
|
51
53
|
"@types/sharp": "^0.27.1",
|
|
52
54
|
"@types/styled-components": "^5.1.7",
|
|
53
55
|
"@typescript-eslint/eslint-plugin": "^5.22.0",
|
package/src/Toolbar.tsx
CHANGED
|
@@ -11,6 +11,7 @@ import { useQuest, useSyncWithGame } from './store'
|
|
|
11
11
|
import { useFilterTags, useSyncGameTagEffect } from './store/filterTags'
|
|
12
12
|
import { useSearchInput } from './store/search'
|
|
13
13
|
import { CategoryTags, CATEGORY_TAGS, TypeTags, TYPE_TAGS } from './tags'
|
|
14
|
+
import { And, Or } from './utils'
|
|
14
15
|
|
|
15
16
|
const ToolbarWrapper = styled.div`
|
|
16
17
|
display: flex;
|
|
@@ -115,16 +116,6 @@ const useInputStringFilter = () => {
|
|
|
115
116
|
return stringFilter
|
|
116
117
|
}
|
|
117
118
|
|
|
118
|
-
const And =
|
|
119
|
-
<T extends (...args: any[]) => boolean>(...fnArray: T[]) =>
|
|
120
|
-
(...args: Parameters<T>) =>
|
|
121
|
-
fnArray.every((fn) => fn(...args))
|
|
122
|
-
|
|
123
|
-
const Or =
|
|
124
|
-
<T extends (...args: any[]) => boolean>(...fnArray: T[]) =>
|
|
125
|
-
(...args: Parameters<T>) =>
|
|
126
|
-
fnArray.some((fn) => fn(...args))
|
|
127
|
-
|
|
128
119
|
const useToolbarFilter = () => {
|
|
129
120
|
const stringFilter = useInputStringFilter()
|
|
130
121
|
const { typeTags, categoryTags } = useFilterTags()
|
|
@@ -557,6 +557,16 @@ Object {
|
|
|
557
557
|
"gameId": 948,
|
|
558
558
|
"name": "机动部队决战",
|
|
559
559
|
},
|
|
560
|
+
Object {
|
|
561
|
+
"code": "By11",
|
|
562
|
+
"gameId": 973,
|
|
563
|
+
"name": "日英美联合水上舰队,起航!",
|
|
564
|
+
},
|
|
565
|
+
Object {
|
|
566
|
+
"code": "By12",
|
|
567
|
+
"gameId": 975,
|
|
568
|
+
"name": "精锐「第十九驱逐队」,全力出击!",
|
|
569
|
+
},
|
|
560
570
|
Object {
|
|
561
571
|
"code": "F98",
|
|
562
572
|
"gameId": 1103,
|
|
@@ -178,6 +178,7 @@ Object {
|
|
|
178
178
|
"346": true,
|
|
179
179
|
"347": true,
|
|
180
180
|
"355": true,
|
|
181
|
+
"356": true,
|
|
181
182
|
"401": true,
|
|
182
183
|
"402": true,
|
|
183
184
|
"403": true,
|
|
@@ -371,6 +372,9 @@ Object {
|
|
|
371
372
|
"967": true,
|
|
372
373
|
"968": true,
|
|
373
374
|
"969": true,
|
|
375
|
+
"973": true,
|
|
376
|
+
"974": true,
|
|
377
|
+
"975": true,
|
|
374
378
|
}
|
|
375
379
|
`;
|
|
376
380
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { version, QuestData } from '../../build/kcanotifyGamedata'
|
|
2
2
|
|
|
3
3
|
test('should Kcanotify Game data version correct', () => {
|
|
4
|
-
expect(version).toMatchInlineSnapshot(`"
|
|
4
|
+
expect(version).toMatchInlineSnapshot(`"2022061801"`)
|
|
5
5
|
})
|
|
6
6
|
|
|
7
7
|
test('should Kcanotify Game data keys correct', () => {
|
|
@@ -4,7 +4,7 @@ import newQuestData from '../../build/kcQuestsData/quests-scn-new.json'
|
|
|
4
4
|
describe('should version correct', () => {
|
|
5
5
|
test('should KcwikiQuestData Game data version correct', () => {
|
|
6
6
|
expect(version).toMatchInlineSnapshot(
|
|
7
|
-
`"
|
|
7
|
+
`"9e40dc8e52e658d7b57356703dae2a4fab7dd950"`
|
|
8
8
|
)
|
|
9
9
|
})
|
|
10
10
|
|
|
@@ -8,8 +8,8 @@ describe('should questCategory correct', () => {
|
|
|
8
8
|
expect(questCategory.weeklyQuest.length).toMatchInlineSnapshot(`17`)
|
|
9
9
|
expect(questCategory.monthlyQuest.length).toMatchInlineSnapshot(`11`)
|
|
10
10
|
expect(questCategory.quarterlyQuest.length).toMatchInlineSnapshot(`25`)
|
|
11
|
-
expect(questCategory.yearlyQuest.length).toMatchInlineSnapshot(`
|
|
12
|
-
expect(questCategory.singleQuest.length).toMatchInlineSnapshot(`
|
|
11
|
+
expect(questCategory.yearlyQuest.length).toMatchInlineSnapshot(`39`)
|
|
12
|
+
expect(questCategory.singleQuest.length).toMatchInlineSnapshot(`485`)
|
|
13
13
|
})
|
|
14
14
|
|
|
15
15
|
test('snapshot', () => {
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import React, { useCallback, useEffect, useRef } from 'react'
|
|
2
|
-
import
|
|
3
|
-
//
|
|
4
|
-
import {
|
|
5
|
-
AutoSizer,
|
|
6
|
-
CellMeasurer,
|
|
7
|
-
CellMeasurerCache,
|
|
8
|
-
List,
|
|
9
|
-
ListRowRenderer,
|
|
10
|
-
} from 'react-virtualized'
|
|
2
|
+
import AutoSizer from 'react-virtualized-auto-sizer'
|
|
3
|
+
// https://github.com/bvaughn/react-window
|
|
4
|
+
import { ListChildComponentProps, VariableSizeList as List } from 'react-window'
|
|
11
5
|
import styled from 'styled-components'
|
|
12
6
|
import { useIsQuestPluginTab } from '../poi/hooks'
|
|
13
7
|
import type { UnionQuest } from '../questHelper'
|
|
@@ -17,89 +11,77 @@ const QuestListWrapper = styled.div`
|
|
|
17
11
|
flex: 1;
|
|
18
12
|
`
|
|
19
13
|
|
|
20
|
-
const MINIMAL_CARD_HEIGHT = 70
|
|
21
|
-
// const LARGE_CARD_HEIGHT = 120
|
|
22
|
-
const cache = new CellMeasurerCache({
|
|
23
|
-
defaultHeight: MINIMAL_CARD_HEIGHT,
|
|
24
|
-
fixedWidth: true,
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
const useQuestsRowRenderer = (quests: UnionQuest[]) => {
|
|
28
|
-
const rowRenderer = useCallback(
|
|
29
|
-
({ key, index, style, parent }: ListRowProps) => {
|
|
30
|
-
const quest = quests[index]
|
|
31
|
-
const { gameId } = quest
|
|
32
|
-
const { code, name, desc, memo, memo2, pre } = quest.docQuest
|
|
33
|
-
|
|
34
|
-
return (
|
|
35
|
-
<CellMeasurer
|
|
36
|
-
cache={cache}
|
|
37
|
-
columnIndex={0}
|
|
38
|
-
key={key}
|
|
39
|
-
parent={parent}
|
|
40
|
-
rowIndex={index}
|
|
41
|
-
>
|
|
42
|
-
<div style={style}>
|
|
43
|
-
<QuestCard
|
|
44
|
-
style={{ margin: '4px' }}
|
|
45
|
-
gameId={gameId}
|
|
46
|
-
code={code}
|
|
47
|
-
name={name}
|
|
48
|
-
desc={desc}
|
|
49
|
-
tip={memo}
|
|
50
|
-
tip2={memo2}
|
|
51
|
-
preQuest={pre}
|
|
52
|
-
></QuestCard>
|
|
53
|
-
</div>
|
|
54
|
-
</CellMeasurer>
|
|
55
|
-
)
|
|
56
|
-
},
|
|
57
|
-
[quests]
|
|
58
|
-
)
|
|
59
|
-
return rowRenderer
|
|
60
|
-
}
|
|
61
|
-
|
|
62
14
|
export const QuestList = ({ quests }: { quests: UnionQuest[] }) => {
|
|
63
15
|
const activeTab = useIsQuestPluginTab()
|
|
64
16
|
const listRef = useRef<List>(null)
|
|
65
|
-
const
|
|
17
|
+
const rowHeights = useRef<Record<number, number>>({})
|
|
66
18
|
|
|
67
19
|
useEffect(() => {
|
|
68
|
-
|
|
69
|
-
listRef.current?.recomputeRowHeights()
|
|
20
|
+
listRef.current?.resetAfterIndex(0)
|
|
70
21
|
}, [quests])
|
|
71
22
|
|
|
72
23
|
useEffect(() => {
|
|
73
24
|
if (activeTab) {
|
|
74
|
-
|
|
75
|
-
listRef.current?.recomputeRowHeights()
|
|
25
|
+
listRef.current?.resetAfterIndex(0)
|
|
76
26
|
}
|
|
77
27
|
}, [activeTab])
|
|
78
28
|
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
29
|
+
const setRowHeight = useCallback((index, size) => {
|
|
30
|
+
if (rowHeights.current[index] === size) {
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
rowHeights.current = { ...rowHeights.current, [index]: size }
|
|
34
|
+
listRef.current?.resetAfterIndex(index)
|
|
82
35
|
}, [])
|
|
83
36
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
37
|
+
const getRowHeight = useCallback((index) => {
|
|
38
|
+
return rowHeights.current[index] + 8 || 200
|
|
39
|
+
}, [])
|
|
40
|
+
|
|
41
|
+
const Row = ({ index, style }: ListChildComponentProps) => {
|
|
42
|
+
const rowRef = useRef<HTMLDivElement>(null)
|
|
43
|
+
|
|
44
|
+
const quest = quests[index]
|
|
45
|
+
const { gameId } = quest
|
|
46
|
+
const { code, name, desc, memo, memo2 } = quest.docQuest
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (rowRef.current) {
|
|
50
|
+
setRowHeight(index, rowRef.current.clientHeight)
|
|
51
|
+
}
|
|
52
|
+
}, [index])
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<div style={style}>
|
|
56
|
+
<div ref={rowRef}>
|
|
57
|
+
<QuestCard
|
|
58
|
+
style={{ margin: '4px' }}
|
|
59
|
+
gameId={gameId}
|
|
60
|
+
code={code}
|
|
61
|
+
name={name}
|
|
62
|
+
desc={desc}
|
|
63
|
+
tip={memo}
|
|
64
|
+
tip2={memo2}
|
|
65
|
+
/>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
)
|
|
88
69
|
}
|
|
89
70
|
|
|
90
71
|
return (
|
|
91
72
|
<QuestListWrapper>
|
|
92
|
-
<AutoSizer
|
|
73
|
+
<AutoSizer>
|
|
93
74
|
{({ height, width }) => (
|
|
94
75
|
<List
|
|
95
76
|
ref={listRef}
|
|
96
77
|
height={height}
|
|
97
78
|
width={width}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
79
|
+
itemCount={quests.length}
|
|
80
|
+
estimatedItemSize={200}
|
|
81
|
+
itemSize={getRowHeight}
|
|
82
|
+
>
|
|
83
|
+
{Row}
|
|
84
|
+
</List>
|
|
103
85
|
)}
|
|
104
86
|
</AutoSizer>
|
|
105
87
|
</QuestListWrapper>
|
|
@@ -35,8 +35,16 @@ const QuestTooltip = forwardRef<
|
|
|
35
35
|
<>
|
|
36
36
|
<div>{`${quest.code} - ${quest.name}`}</div>
|
|
37
37
|
<div>{quest.desc}</div>
|
|
38
|
-
{quest.memo2 &&
|
|
39
|
-
|
|
38
|
+
{quest.memo2 && (
|
|
39
|
+
<div>
|
|
40
|
+
<b>{quest.memo2}</b>
|
|
41
|
+
</div>
|
|
42
|
+
)}
|
|
43
|
+
{quest.memo && (
|
|
44
|
+
<div>
|
|
45
|
+
<i>{quest.memo}</i>
|
|
46
|
+
</div>
|
|
47
|
+
)}
|
|
40
48
|
</>
|
|
41
49
|
}
|
|
42
50
|
placement={'top'}
|
package/src/poi/hooks.ts
CHANGED
|
@@ -24,10 +24,12 @@ export const usePluginTranslation = () => {
|
|
|
24
24
|
return useTranslation(PACKAGE_NAME)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
const emptyArray = [] as GameQuest[]
|
|
27
28
|
export const useGameQuest = () => {
|
|
28
29
|
const [quests, setQuests] = useState<GameQuest[]>([])
|
|
29
30
|
useEffect(() => {
|
|
30
|
-
const listener = (quests: GameQuest[] | null) =>
|
|
31
|
+
const listener = (quests: GameQuest[] | null) =>
|
|
32
|
+
setQuests(quests ?? emptyArray)
|
|
31
33
|
// See reducer.ts
|
|
32
34
|
return observePluginStore(listener, (i) => i?._?.questList)
|
|
33
35
|
}, [setQuests])
|
package/src/poi/store.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { name as PACKAGE_NAME } from '../../package.json'
|
|
2
2
|
import type { PluginState } from '../reducer'
|
|
3
|
-
import {
|
|
3
|
+
import { id, noop } from '../utils'
|
|
4
|
+
import { importFromPoi, IN_POI } from './env'
|
|
4
5
|
import type { PoiState, Store } from './types'
|
|
5
6
|
|
|
6
|
-
const noop = () => {}
|
|
7
|
-
const id = <T>(x: T) => x
|
|
8
|
-
|
|
9
7
|
/**
|
|
10
8
|
* See https://redux.js.org/api/store#subscribelistener
|
|
11
9
|
*/
|
package/src/questHelper.ts
CHANGED
|
@@ -248,15 +248,35 @@ const calcQuestMap = (
|
|
|
248
248
|
return map
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
-
export const getCompletedQuest = moize(
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
251
|
+
export const getCompletedQuest = moize(
|
|
252
|
+
(inProgressQuest: number[]) => {
|
|
253
|
+
const completedQuest = calcQuestMap(inProgressQuest, getPreQuestIds)
|
|
254
|
+
return completedQuest
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
matchesArg: (cacheKeyArg, keyArg) => {
|
|
258
|
+
if (Array.isArray(cacheKeyArg) && Array.isArray(keyArg)) {
|
|
259
|
+
return cacheKeyArg.join(',') === keyArg.join(',')
|
|
260
|
+
}
|
|
261
|
+
return cacheKeyArg === keyArg
|
|
262
|
+
},
|
|
263
|
+
}
|
|
264
|
+
)
|
|
255
265
|
|
|
256
|
-
export const getLockedQuest = moize(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
266
|
+
export const getLockedQuest = moize(
|
|
267
|
+
(inProgressQuest: number[]) => {
|
|
268
|
+
const lockedQuest = calcQuestMap(inProgressQuest, getPostQuestIds)
|
|
269
|
+
return lockedQuest
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
matchesArg: (cacheKeyArg, keyArg) => {
|
|
273
|
+
if (Array.isArray(cacheKeyArg) && Array.isArray(keyArg)) {
|
|
274
|
+
return cacheKeyArg.join(',') === keyArg.join(',')
|
|
275
|
+
}
|
|
276
|
+
return cacheKeyArg === keyArg
|
|
277
|
+
},
|
|
278
|
+
}
|
|
279
|
+
)
|
|
260
280
|
|
|
261
281
|
export const questApiStateToQuestStatus = (
|
|
262
282
|
state: QUEST_API_STATE | undefined
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React, { createContext, useContext } from 'react'
|
|
2
|
+
import type { ReactNode } from 'react'
|
|
3
|
+
import { GameQuest } from '../poi/types'
|
|
4
|
+
import { useGameQuest } from '../poi/hooks'
|
|
5
|
+
|
|
6
|
+
export const GameQuestContext = createContext<GameQuest[]>([])
|
|
7
|
+
|
|
8
|
+
export const GameQuestProvider = ({ children }: { children?: ReactNode }) => {
|
|
9
|
+
const gameQuest = useGameQuest()
|
|
10
|
+
return (
|
|
11
|
+
<GameQuestContext.Provider value={gameQuest}>
|
|
12
|
+
{children}
|
|
13
|
+
</GameQuestContext.Provider>
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const useGlobalGameQuest = () => {
|
|
18
|
+
const gameQuest = useContext(GameQuestContext)
|
|
19
|
+
return gameQuest
|
|
20
|
+
}
|
package/src/store/quest.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback } from 'react'
|
|
2
|
-
import {
|
|
2
|
+
import { usePluginTranslation } from '../poi/hooks'
|
|
3
3
|
import {
|
|
4
4
|
DocQuest,
|
|
5
5
|
getCategory,
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
QUEST_STATUS,
|
|
12
12
|
UnionQuest,
|
|
13
13
|
} from '../questHelper'
|
|
14
|
+
import { useGlobalGameQuest } from './gameQuest'
|
|
14
15
|
import { checkIsKcwikiSupportedLanguages, useKcwikiData } from './kcwiki'
|
|
15
16
|
import { useStore, useSyncWithGame } from './store'
|
|
16
17
|
|
|
@@ -51,7 +52,7 @@ const useQuestMap = (): Record<string, DocQuest> => {
|
|
|
51
52
|
|
|
52
53
|
export const useQuest = (): UnionQuest[] => {
|
|
53
54
|
const docQuestMap = useQuestMap()
|
|
54
|
-
const gameQuest =
|
|
55
|
+
const gameQuest = useGlobalGameQuest()
|
|
55
56
|
const { syncWithGame } = useSyncWithGame()
|
|
56
57
|
|
|
57
58
|
if (syncWithGame && gameQuest.length) {
|
|
@@ -88,7 +89,7 @@ export const useQuest = (): UnionQuest[] => {
|
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
export const useQuestByCode = (code: string)
|
|
92
|
+
export const useQuestByCode = (code: string) => {
|
|
92
93
|
const questMap = useQuestMap()
|
|
93
94
|
const gameId = getQuestIdByCode(code)
|
|
94
95
|
if (gameId && gameId in questMap) {
|
|
@@ -101,18 +102,21 @@ export const useQuestByCode = (code: string): UnionQuest | null => {
|
|
|
101
102
|
}
|
|
102
103
|
|
|
103
104
|
export const useQuestStatus = (gameId: number | null) => {
|
|
104
|
-
const gameQuest =
|
|
105
|
-
const gameQuestId = gameQuest.map((quest) => quest.api_no)
|
|
106
|
-
const completedQuest = getCompletedQuest(gameQuestId)
|
|
107
|
-
const lockedQuest = getLockedQuest(gameQuestId)
|
|
105
|
+
const gameQuest = useGlobalGameQuest()
|
|
108
106
|
|
|
109
107
|
if (!gameId) {
|
|
110
108
|
return QUEST_STATUS.UNKNOWN
|
|
111
109
|
}
|
|
112
110
|
const theGameQuest = gameQuest.find((quest) => quest.api_no === gameId)
|
|
113
111
|
if (theGameQuest) {
|
|
112
|
+
// the quest is in game
|
|
114
113
|
return questApiStateToQuestStatus(theGameQuest.api_state)
|
|
115
114
|
}
|
|
115
|
+
|
|
116
|
+
const gameQuestId = gameQuest.map((quest) => quest.api_no)
|
|
117
|
+
const completedQuest = getCompletedQuest(gameQuestId)
|
|
118
|
+
const lockedQuest = getLockedQuest(gameQuestId)
|
|
119
|
+
|
|
116
120
|
if (gameId in lockedQuest) {
|
|
117
121
|
return QUEST_STATUS.LOCKED
|
|
118
122
|
}
|
package/src/store/store.tsx
CHANGED
|
@@ -4,10 +4,12 @@ import React, {
|
|
|
4
4
|
SetStateAction,
|
|
5
5
|
useCallback,
|
|
6
6
|
useContext,
|
|
7
|
+
useState,
|
|
7
8
|
} from 'react'
|
|
8
|
-
import {
|
|
9
|
+
import { useMount, useUpdateEffect } from 'react-use'
|
|
9
10
|
import { name as PACKAGE_NAME } from '../../package.json'
|
|
10
|
-
import {
|
|
11
|
+
import { ALL_CATEGORY_TAG, ALL_TYPE_TAG } from '../tags'
|
|
12
|
+
import { GameQuestProvider } from './gameQuest'
|
|
11
13
|
|
|
12
14
|
export const initialState = {
|
|
13
15
|
searchInput: '',
|
|
@@ -27,28 +29,29 @@ export type State = typeof initialState
|
|
|
27
29
|
// Persist state
|
|
28
30
|
const STORAGE_KEY = PACKAGE_NAME
|
|
29
31
|
|
|
30
|
-
const useStorage = (
|
|
31
|
-
|
|
32
|
-
setState: (state: State) => void,
|
|
33
|
-
merge = true
|
|
34
|
-
) => {
|
|
32
|
+
const useStorage = <T,>(initialValue: T) => {
|
|
33
|
+
const [state, setState] = useState<T>(initialValue)
|
|
35
34
|
// Load storage at mount
|
|
36
35
|
useMount(() => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
try {
|
|
37
|
+
const stringStore = localStorage.getItem(STORAGE_KEY)
|
|
38
|
+
if (stringStore == null) {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
const parsedStorage: T = JSON.parse(stringStore)
|
|
42
|
+
setState(parsedStorage)
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error('Failed to load storage', error)
|
|
40
45
|
}
|
|
41
|
-
const parsedStorage: State = JSON.parse(stringStore)
|
|
42
|
-
// TODO use deep merge
|
|
43
|
-
const storageStore = merge ? { ...store, ...parsedStorage } : parsedStorage
|
|
44
|
-
setState(storageStore)
|
|
45
46
|
})
|
|
46
47
|
|
|
47
48
|
// Save storage when store change
|
|
48
49
|
useUpdateEffect(() => {
|
|
49
|
-
const serializedStore = JSON.stringify(
|
|
50
|
+
const serializedStore = JSON.stringify(state)
|
|
50
51
|
localStorage.setItem(STORAGE_KEY, serializedStore)
|
|
51
|
-
}, [
|
|
52
|
+
}, [state])
|
|
53
|
+
|
|
54
|
+
return [state, setState] as const
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
export const getStorage = () => {
|
|
@@ -62,15 +65,14 @@ export const getStorage = () => {
|
|
|
62
65
|
const StateContext = createContext<State>(initialState)
|
|
63
66
|
const SetStateContext = createContext<Dispatch<SetStateAction<State>>>(() => {})
|
|
64
67
|
|
|
65
|
-
const useGlobalState = createGlobalState<State>(initialState)
|
|
66
|
-
|
|
67
68
|
export const StoreProvider = ({ children }: { children?: React.ReactNode }) => {
|
|
68
|
-
const [state, setState] =
|
|
69
|
-
useStorage(state, setState)
|
|
69
|
+
const [state, setState] = useStorage<State>(initialState)
|
|
70
70
|
return (
|
|
71
|
-
<
|
|
72
|
-
<
|
|
73
|
-
|
|
71
|
+
<GameQuestProvider>
|
|
72
|
+
<SetStateContext.Provider value={setState}>
|
|
73
|
+
<StateContext.Provider value={state}>{children}</StateContext.Provider>
|
|
74
|
+
</SetStateContext.Provider>
|
|
75
|
+
</GameQuestProvider>
|
|
74
76
|
)
|
|
75
77
|
}
|
|
76
78
|
|
|
@@ -111,6 +113,7 @@ export const useSyncWithGame = () => {
|
|
|
111
113
|
}, [setSyncWithGame, syncWithGame])
|
|
112
114
|
return {
|
|
113
115
|
syncWithGame,
|
|
116
|
+
setSyncWithGame,
|
|
114
117
|
toggleSyncWithGame,
|
|
115
118
|
}
|
|
116
119
|
}
|
package/src/tags.tsx
CHANGED
|
@@ -2,7 +2,7 @@ import { Tag } from '@blueprintjs/core'
|
|
|
2
2
|
import React from 'react'
|
|
3
3
|
import styled from 'styled-components'
|
|
4
4
|
import { IN_POI } from './poi/env'
|
|
5
|
-
import {
|
|
5
|
+
import { useGameTab, usePluginTranslation } from './poi/hooks'
|
|
6
6
|
import { GameQuest, QuestTab } from './poi/types'
|
|
7
7
|
import type { UnionQuest } from './questHelper'
|
|
8
8
|
import {
|
|
@@ -27,8 +27,8 @@ import {
|
|
|
27
27
|
} from './questHelper'
|
|
28
28
|
import { useSyncWithGame } from './store'
|
|
29
29
|
import { useFilterTags } from './store/filterTags'
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
import { useGlobalGameQuest } from './store/gameQuest'
|
|
31
|
+
import { yes } from './utils'
|
|
32
32
|
|
|
33
33
|
export const ALL_CATEGORY_TAG = {
|
|
34
34
|
name: 'All',
|
|
@@ -119,7 +119,7 @@ export const TypeTags = () => {
|
|
|
119
119
|
const { t } = usePluginTranslation()
|
|
120
120
|
const gameTab = useGameTab()
|
|
121
121
|
const { syncWithGame } = useSyncWithGame()
|
|
122
|
-
const gameQuests =
|
|
122
|
+
const gameQuests = useGlobalGameQuest()
|
|
123
123
|
const inProgressQuest = gameQuests.filter((gameQuest) =>
|
|
124
124
|
isInProgressQuest(gameQuest)
|
|
125
125
|
)
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const noop = () => {}
|
|
2
|
+
|
|
3
|
+
export const id = <T>(x: T) => x
|
|
4
|
+
|
|
5
|
+
export const yes = () => true as const
|
|
6
|
+
|
|
7
|
+
export const And =
|
|
8
|
+
<T extends (...args: any[]) => boolean>(...fnArray: T[]) =>
|
|
9
|
+
(...args: Parameters<T>) =>
|
|
10
|
+
fnArray.every((fn) => fn(...args))
|
|
11
|
+
|
|
12
|
+
export const Or =
|
|
13
|
+
<T extends (...args: any[]) => boolean>(...fnArray: T[]) =>
|
|
14
|
+
(...args: Parameters<T>) =>
|
|
15
|
+
fnArray.some((fn) => fn(...args))
|