isPrerequisiteFulfilled(questId, extraContexts = {}){
			var questObj = this.get(questId);
			// Definitions of prerequisites, not take 'tracking' counts into account here.
			// Just give some typical samples, not completed for all period quests yet.
			var questCondsLibrary = {
				"249": // Bm1 Sortie a fleet has: Myoukou, Nachi, Haguro
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShip(62) && fleet.hasShip(63) && fleet.hasShip(65);
					},
				"257": // Bm3 Sortie CL as flagship, 0-2 more CL and 1 DD at least, no other ship type
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType(3, 0)
							&& fleet.countShipType(3) <= 3
							&& fleet.countShipType(2) >= 1
							// Progress not counted in-game if there is ETS FCF retreated ship, so use KCKai vita logic to simulate
							//&& fleet.countShipType([2, 3], true) === 0;
							&& fleet.countShipType([2, 3], false, true) === fleet.countShips(false);
					},
				"259": // Bm4 Sortie 3 BB (4 classes below only) and 1 CL
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.countShipClass([
								37, // Yamato-class
								19, // Nagato-class
								2,  // Ise-class
								26, // Fusou-class
							]) === 3 && fleet.countShipType(3) === 1;
					},
				"280": // Bm8 Sortie 1 CVL/CL(T)/CT and 3 DD/DE
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType([3, 4, 7, 21])
							&& fleet.countShipType([1, 2]) >= 3;
					},
				"284": // Bq11 Sortie 1 CVL/CL(T)/CT and 3 DD/DE
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType([3, 4, 7, 21])
							&& fleet.countShipType([1, 2]) >= 3;
					},
				"318": // C16 PvP with 2 more CLs in 1st fleet
					() => {
						const firstFleet = PlayerManager.fleets[0];
						return KC3SortieManager.isPvP() && KC3SortieManager.fleetSent == 1 &&
							firstFleet.countShipType(3) >= 2;
					},
				"330": // C29 PvP with CV(L/B) as flagship, 1 more CV(L/B) and 2 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() &&
							fleet.hasShipType([7, 11, 18], 0) &&
							fleet.countShipType([7, 11, 18]) >= 2 &&
							fleet.countShipType(2) >= 2;
					},
				"337": // C38 PvP with Arare, Kagerou, Kasumi, Shiranui
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip(17)  // Kagerou any remodel
							&& fleet.hasShip(18)  // Shiranui any remodel
							&& fleet.hasShip(48)  // Arare any remodel
							&& fleet.hasShip(49); // Kasumi any remodel
					},
				"339": // C42 PvP with Isonami, Uranami, Ayanami, Shikinami
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip(12)   // Isonami any remodel
							&& fleet.hasShip(13)   // Ayanami any remodel
							&& fleet.hasShip(14)   // Shikinami any remodel
							&& fleet.hasShip(486); // Uranami any remodel
					},
				"342": // C44 PvP with 3 DD/DE and 1 more DD/DE/CL(T)/CT
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() && (
							fleet.countShipType([1, 2]) >= 4 ||
							fleet.countShipType([1, 2]) >= 3 &&
							fleet.hasShipType([3, 4, 21])
						);
					},
				"345": // C49 PvP with 4 of Warspite, Kongou, Ark Royal, Nelson, J-Class DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() && (
							fleet.countShip(439)   + // Warspite any remodel
							fleet.countShip(78)    + // Kongou any remodel
							fleet.countShip(515)   + // Ark Royal any remodel
							fleet.countShip(571)   + // Nelson any remodel
							fleet.countShipClass(82) // J-Class any remodel
						) >= 4;
					},
				"346": // C50 PvP with Yuugumo K2, Makigumo K2, Kazagumo K2, Akigumo K2
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip([542])  // Yuugumo K2
							&& fleet.hasShip([563])  // Makigumo K2
							&& fleet.hasShip([564])  // Kazagumo K2
							&& fleet.hasShip([648]); // Akigumo K2
					},
				"348": // C53 PvP with CL/CT as flagship, 2 more CL(T)/CT, 2 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShipType([3, 21], 0)
							&& fleet.countShipType([3, 4, 21]) >= 3
							&& fleet.countShipType(2) >= 2;
					},
				"350": // C55 PvP with Oboro, Akebono, Sazanami, Ushio
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip(15)  // Akebono any remodel
							&& fleet.hasShip(16)  // Ushio any remodel
							&& fleet.hasShip(93)  // Oboro any remodel
							&& fleet.hasShip(94); // Sazanami any remodel
					},
				"353": // C58 PvP with CA(V) as flagship, 3 more CA(V), 2 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShipType([5, 6], 0)
							&& fleet.countShipType([5, 6]) >= 4
							&& fleet.countShipType(2) >= 2;
					},
				"354": // C60 PvP with Gambier Bay Mk.II as flagship, 2 Fletcher-class, John C.Butler-class DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip([707], 0)
							&& fleet.countShipClass([87, 91]) >= 2;
					},
				"355": // C62 PvP with Kuroshio K2/Oyashio K2 as flagship, another ship as 2nd ship
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip([568, 670], 0)
							&& fleet.hasShip([670, 568], 1);
					},
				"356": // C65 PvP with Isonami K2, Uranami K2, Ayanami K2, Shikinami K2
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip([666])  // Isonami K2
							&& fleet.hasShip([647])  // Uranami K2
							&& fleet.hasShip([195])  // Ayanami K2
							&& fleet.hasShip([627]); // Shikinami K2
					},
				"357": // C66 PvP with Yamato, Musashi, 1 CL, 2 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip(131)  // Yamato any remodel
							&& fleet.hasShip(143)  // Musashi any remodel
							&& fleet.countShipType(3) >= 1
							&& fleet.countShipType(2) >= 2;
					},
				"362": // C72 PvP with Fubuki, Shirayuki, Hatsuyuki, Miyuki
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP()
							&& fleet.hasShip(9)   // Fubuki any remodel
							&& fleet.hasShip(10)  // Shirayuki any remodel
							&& fleet.hasShip(32)  // Hatsuyuki any remodel
							&& fleet.hasShip(11); // Miyuki any remodel
					},
				"368": // Cy11 PvP with 2 of Amatsukaze, Yukikaze, Tokitsukaze, Hatsukaze
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() && (
							fleet.countShip(181) + // Amatsukaze any remodel
							fleet.countShip(20)  + // Yukikaze any remodel
							fleet.countShip(186) + // Tokitsukaze any remodel
							fleet.countShip(190)   // Hatsukaze any remodel
						) >= 2;
					},
				"371": // Cy12 PvP with Harusame as flagship, 3 of Murasame, Yuudachi, Samidare, Shiratsuyu, Shigure
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() &&
							fleet.hasShip(405, 0) && ( // Harusame flagship
							fleet.countShip(44) + // Murasame any remodel
							fleet.countShip(45) + // Yuudachi any remodel
							fleet.countShip(46) + // Samidare any remodel
							fleet.countShip(42) + // Shiratsuyu any remodel
							fleet.countShip(43)   // Shigure any remodel
						) >= 3;
					},
				"372": // Cy13 PvP with Akizuki-class as flagship, 2 DD, 2 BBV
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() &&
							fleet.hasShipClass(54, 0) &&   // Akizuki-class
							fleet.countShipType(2) >= 3 && // 3 DD in total
							fleet.countShipType(10) >= 2;
					},
				"373": // Cy14 PvP with French ship as flagship, 2 more French ships
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() &&
							fleet.hasShipClass(KC3Meta.ctypesByCountryName("France"), 0) &&   // French flagship
							fleet.countShipClass(KC3Meta.ctypesByCountryName("France")) >= 3; // 3 French ships in total
					},
				"375": // Cy15 PvP with Hiei, Kirishima, 1 CL, 2 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() &&
							fleet.hasShip(86) &&   // Hiei any remodel
							fleet.hasShip(85) &&   // Kirishima any remodel
							fleet.countShipType(3) >= 1 &&
							fleet.countShipType(2) >= 2;
					},
				"377": // Cy16 PvP with Hayashimo/Akishimo/Kiyoshimo as flagship, 2 of Hayashimo/Akishimo/Kiyoshimo/Asashimo
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return KC3SortieManager.isPvP() && (
								fleet.hasShip(409, 0)    // Hayashimo any remodel
								|| fleet.hasShip(625, 0) // Akishimo any remodel
								|| fleet.hasShip(410, 0) // Kiyoshimo any remodel
							) && (fleet.countShip(409)   // Hayashimo any remodel
								+ fleet.countShip(625)   // Akishimo any remodel
								+ fleet.countShip(410)   // Kiyoshimo any remodel
								+ fleet.countShip(425)   // Asashimo any remodel
							) >= 3; // including flagship
					},
				"626": // F22 Have 1 Skilled Crew Member. Houshou as secretary, equip her with a >> Type 0 Fighter Model 21
					() => {
						const firstFleet = PlayerManager.fleets[0];
						const isMaxProType0Model21Equipped = firstFleet.ship(0)
							.equipment().some(gear => gear.masterId === 20 && gear.ace >= 7);
						return PlayerManager.consumables.skilledCrew >= 1
							&& firstFleet.hasShip(89, 0)
							&& isMaxProType0Model21Equipped;
					},
				"643": // F32 Have 1 Type 96 Land-based Attack Aircraft and 2 Type 97 Torpedo Bombers
					() => (KC3GearManager.countFree(168) >= 1
						&& KC3GearManager.countFree(16) >= 2
					),
				"645": // F41 Have 750 fuel, 750 ammo, 2 Drum Canisters and 1 Type 91 AP Shell
					() => (PlayerManager.hq.lastMaterial[0] >= 750
						&& PlayerManager.hq.lastMaterial[1] >= 750
						&& KC3GearManager.countFree(75) >= 2
						&& KC3GearManager.countFree(36) >= 1
					),
				"654": // F93 Have 1 Skilled Crew Member, 1500 ammo, 1500 bauxite. Ary Royal as secretary, equip her 1st slot with a maxed star Swordfish
					() => {
						const firstFleet = PlayerManager.fleets[0];
						const firstSlotGear = firstFleet.ship(0).equipment(0);
						const isMaxSwordfishEquipped = firstSlotGear.masterId === 242 && firstSlotGear.stars >= 10;
						return PlayerManager.hq.lastMaterial[1] >= 1500
							&& PlayerManager.hq.lastMaterial[4] >= 1500
							&& PlayerManager.consumables.skilledCrew >= 1
							&& firstFleet.hasShip(515, 0)
							&& isMaxSwordfishEquipped;
					},
				"663": // F55/Fq3 Have 18000 steel (scrapping not counted here, unused)
					() => PlayerManager.hq.lastMaterial[2] >= 18000,
				"1123": // Fy10 Have 950 bauxite, 2 New Model Aviation Armament Materials, 2 Skilled Crew Members. Tone Kai Ni/Yura Kai Ni as secretary, 1st slot with a maxed Type 0 Reconnaissance Seaplane (scrapping only checks secretary, unused)
					() => {
						const firstFleet = PlayerManager.fleets[0];
						const firstSlotGear = firstFleet.ship(0).equipment(0);
						const isMaxType0ReconSeaplaneEquipped = firstSlotGear.masterId === 25 && firstSlotGear.stars >= 10;
						return PlayerManager.hq.lastMaterial[4] >= 950
							&& PlayerManager.consumables.newArmamentMaterial >= 2
							&& PlayerManager.consumables.skilledCrew >= 2
							&& firstFleet.hasShip([188, 488], 0)
							&& isMaxType0ReconSeaplaneEquipped;
					},
				"1138": // Fy11 Have 1300 bauxite, 480 steel, 4 buckets and 16 Development Materials. Akizuki-class as secretary (scrapping only checks secretary, unsed)
					() => {
						const firstFleet = PlayerManager.fleets[0];
						return PlayerManager.hq.lastMaterial[3] >= 480
							&& PlayerManager.hq.lastMaterial[4] >= 1300
							&& PlayerManager.consumables.buckets >= 4
							&& PlayerManager.consumables.devmats >= 16
							&& firstFleet.hasShipClass(54, 0);
					},
				"854": // Bq2 Sortie 1st fleet (sortie maps and battle ranks not counted here)
					() => KC3SortieManager.isOnSortie() && KC3SortieManager.fleetSent == 1,
				"861": // Bq3 Sortie 2 of BBV or AO
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return (fleet.countShipType(10) +
							fleet.countShipType(22)) >= 2;
					},
				"862": // Bq4 Sortie 1 AV, 2 CL
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType(16)
							&& fleet.countShipType(3) >= 2;
					},
				"872": // Bq10 Sortie 1st fleet
					() => KC3SortieManager.isOnSortie() && KC3SortieManager.fleetSent == 1,
				"873": // Bq5 Sortie 1 CL
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType(3);
					},
				"875": // Bq6 Sortie DesDiv 31
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShip([543]) // Naganami K2
							&& fleet.hasShip([
								345, 649, // Takanami Kai/K2
								359, 569, // Okinami Kai/K2
								344, 578, // Asashimo Kai/K2
							]);
					},
				"888": // Bq7 Sortie New Mikawa Fleet
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.countShip(69)  + // Choukai any remodel
							   fleet.countShip(61)  + // Aoba any remodel
							   fleet.countShip(123) + // Kinugasa any remodel
							   fleet.countShip(60)  + // Kako any remodel
							   fleet.countShip(59)  + // Furutaka any remodel
							   fleet.countShip(51)  + // Tenryuu any remodel
							   fleet.countShip(115)   // Yuubari any remodel
							>= 4;
					},
				"894": // Bq9 Sortie 1 CV(L/B)
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType([7, 11, 18]);
					},
				"903": // Bq13 Sortie Yuubari K2+ as flagship, 2 of 6th Torpedo Squad, or Yura K2
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						// Yuubari Kai Ni any variant as flagship
						return RemodelDb.remodelGroup(115).indexOf(fleet.ship(0).masterId) >= 2 && ((
							fleet.countShip(1)   + // Mutsuki any remodel
							fleet.countShip(2)   + // Kisaragi any remodel
							fleet.countShip(30)  + // Kikuzuki any remodel
							fleet.countShip(31)  + // Mochizuki any remodel
							fleet.countShip(164) + // Yayoi any remodel
							fleet.countShip(165)   // Uzuki any remodel
						) >= 2 || (
							fleet.hasShip([488])   // Yura K2
						));
					},
				"904": // By1 Sortie Ayanami K2, Shikinami K2
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShip([
							195, // Ayanami K2
							627, // Shikinami K2
						]);
					},
				"905": // By2 Sortie 3 DE, up to 5 ships
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.countShipType(1) >= 3 && fleet.countShips() <= 5;
					},
				"912": // By3 Sortie Akashi as flagship, 3 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType(19, 0) && fleet.countShipType(2) >= 3;
					},
				"914": // By4 Sortie 3 CA, 1 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.countShipType(5) >= 3 && fleet.countShipType(2) >= 1;
					},
				"928": // By5 Sortie 2 of Haguro/Ashigara/Myoukou/Takao/Kamikaze
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return (
							fleet.countShip(65)   + // Haguro any remodel
							fleet.countShip(64)   + // Ashigara any remodel
							fleet.countShip(62)   + // Myoukou any remodel
							fleet.countShip(66)   + // Takao any remodel
							fleet.countShip(471)    // Kamikaze any remodel
						) >= 2;
					},
				"944": // By6 Sortie CA/DD as flagship, 3 DD/DE (excluding flagship DD)
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType([2, 5], 0)
							&& (fleet.hasShipType(2, 0) ?
								fleet.countShipType(1) + (fleet.countShipType(2) - 1) >= 3 :
								fleet.countShipType([1, 2]) >= 3);
					},
				"945": // By7 Sortie CL/CT/DD as flagship, 3 DD/DE (excluding flagship DD)
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType([2, 3, 21], 0)
							&& (fleet.hasShipType(2, 0) ?
								fleet.countShipType(1) + (fleet.countShipType(2) - 1) >= 3 :
								fleet.countShipType([1, 2]) >= 3);
					},
				"946": // By8 Sortie CV(L/B) as flagship, 2 CA(V)
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipType([7, 11, 18], 0)
							&& fleet.countShipType([5, 6]) >= 2;
					},
				"947": // By9 Sortie 2 CVL
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.countShipType(7) >= 2;
					},
				"948": // By10 Sortie 1st fleet with CV(L/B) as flagship
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleetSent == 1 && fleet.hasShipType([7, 11, 18], 0);
					},
				"973": // By11 Sortie 3 American/British ships without any carrier
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.countShipType([7, 11, 18]) === 0
							&& fleet.countShipClass(
								KC3Meta.ctypesByCountryName("UnitedStates").concat(
									KC3Meta.ctypesByCountryName("UnitedKingdom")
								)
							) >= 3;
					},
				"975": // By12 Sortie Isonami K2, Uranami K2, Ayanami K2, Shikinami K2
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShip([666])  // Isonami K2
							&& fleet.hasShip([647])  // Uranami K2
							&& fleet.hasShip([195])  // Ayanami K2
							&& fleet.hasShip([627]); // Shikinami K2
					},
				"1005": // By13 Sortie Oboro K, Sazanami K, Akebono K/K2, Ushio K/K2
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShip([231, 665])  // Akebono
							&& fleet.hasShip([233, 407])  // Ushio
							&& fleet.hasShip([230])       // Oboro
							&& fleet.hasShip([232]);      // Sazanami
					},
				"1012": // By14 Sortie Ukuru-class as flagship, 3 DE (excluding flagship DE), no other ship type
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShipClass(117, 0)
							&& fleet.countShipType(1) <= 4
							&& fleet.countShipType(1, true, false) === 0;
					},
				"1018": // By15 Sortie Hiei, Kirishima, 2 DD
					({fleetSent = KC3SortieManager.fleetSent}) => {
						const fleet = PlayerManager.fleets[fleetSent - 1];
						return fleet.hasShip(85)  // Kirishima
							&& fleet.hasShip(86)  // Hiei
							&& fleet.countShipType(2) >= 2;
					},
			};
			if(questObj.id && questCondsLibrary[questId]){
				return !!questCondsLibrary[questId].call(questObj, extraContexts);
			}
			// if no condition definition found, return undefined as 'unknown'
			return;
		}
Check if specified quest's completion prerequisites are fulfilled.
Such quests usually require some conditions can be checked at client-side,
such as: specified composition of ships, have xxx resources / equipment...

@param questId - the api_id of quest to be checked
@param extraContexts - extra context object, eg: fleet num to be sent to sortie
@see https://github.com/andanteyk/ElectronicObserver/blob/master/ElectronicObserver/Other/Information/kcmemo.md#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%81%B4%E3%81%A7%E9%81%94%E6%88%90%E5%88%A4%E5%AE%9A%E3%81%8C%E3%81%AA%E3%81%95%E3%82%8C%E3%82%8B%E4%BB%BB%E5%8B%99
@see `Kcsapi.resultScreenQuestFulfillment` about conditions of sortie and battles.
@return true if current state fulfill the prerequisites of the quest; false if not.
        undefined if condition of specified quest is undefined.

Should move this to an independent module if condition library grows bigger.