From 1487ad3ee9dd445de8823f5748ea262ed16e95ba Mon Sep 17 00:00:00 2001 From: ReznoRMichael Date: Wed, 10 Feb 2021 18:16:26 +0100 Subject: [PATCH] switch filenames to new version --- ...pletion-v2.js => HKCheckCompletion-old.js} | 189 +- src/js/HKCheckCompletion.js | 189 +- src/js/hk-database-old.js | 458 +++++ src/js/hk-database-v2.js | 1121 ------------ src/js/hk-database.js | 1525 ++++++++++++----- 5 files changed, 1741 insertions(+), 1741 deletions(-) rename src/js/{HKCheckCompletion-v2.js => HKCheckCompletion-old.js} (88%) create mode 100644 src/js/hk-database-old.js delete mode 100644 src/js/hk-database-v2.js diff --git a/src/js/HKCheckCompletion-v2.js b/src/js/HKCheckCompletion-old.js similarity index 88% rename from src/js/HKCheckCompletion-v2.js rename to src/js/HKCheckCompletion-old.js index ed468ed..48e7a4c 100644 --- a/src/js/HKCheckCompletion-v2.js +++ b/src/js/HKCheckCompletion-old.js @@ -2,7 +2,7 @@ // ---------------- Load main Hollow Knight database file ----------------- // -import HK from "./hk-database-v2.js"; +import * as HK from "./hk-database.js"; // ---------------- Load image files (necessary for Webpack) ----------------- // @@ -77,6 +77,32 @@ function HKCheckCompletion(jsonObject) { // Prevents adding current percent data after each function call (each click of Analyze button) ResetCompletion(HK.DIV_ID); + // Shallow Clone const objects (used for destructive functions) + let HK_HINTS_temp = Object.assign({}, HK.HINTS); + let HK_BOSSES_temp = Object.assign({}, HK.BOSSES); + let HK_BOSSES_WORLD_temp = Object.assign({}, HK.BOSSES_WORLD); + let HK_CHARMS_temp = Object.assign({}, HK.CHARMS); + let HK_COLOSSEUM_temp = Object.assign({}, HK.COLOSSEUM); + let HK_DREAMERS_temp = Object.assign({}, HK.DREAMERS); + let HK_DREAMNAIL_temp = Object.assign({}, HK.DREAMNAIL); + let HK_EQUIPMENT_temp = Object.assign({}, HK.EQUIPMENT); + let HK_MASKSHARDS_temp = Object.assign({}, HK.MASKSHARDS); + let HK_MASKSHARDS_WORLD_temp = Object.assign({}, HK.MASKSHARDS_WORLD); + let HK_NAILARTS_temp = Object.assign({}, HK.NAILARTS); + let HK_VESSELFRAGMENTS_temp = Object.assign({}, HK.VESSELFRAGMENTS); + let HK_VESSELFRAGMENTS_WORLD_temp = Object.assign({}, HK.VESSELFRAGMENTS_WORLD); + let HK_WARRIORDREAMS_temp = Object.assign({}, HK.WARRIORDREAMS); + let HK_GRIMMTROUPE_temp = Object.assign({}, HK.GRIMMTROUPE); + let HK_LIFEBLOOD_temp = Object.assign({}, HK.LIFEBLOOD); + let HK_GODMASTER_temp = Object.assign({}, HK.GODMASTER); + + // Shallow Clone const arrays (used for destructive functions) + let HK_GODMASTER_DOORS_temp = Array.from(HK.GODMASTER_DOORS); + let HK_NAILUPGRADES_temp = Array.from(HK.NAILUPGRADES); + + // Deep Clone const spells multi-layer object (used for destructive functions) + let HK_SPELLS_temp = JSON.parse(JSON.stringify(HK.SPELLS)); + // ================================================================================== // // ---------------- Time Played ----------------- // @@ -109,80 +135,87 @@ function HKCheckCompletion(jsonObject) { // ---------------- Bosses (Base Game) --------------------- // - CheckIfDataTrue(HK.DIV_ID.bosses, HK.BOSSES, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.bosses, HK_BOSSES_temp, HKPlayerData); // ---------------- Gruz Mother and Mawlek (World Map) --------------------- // - if (HKWorldItems) CheckWorldDataTrue(HK.DIV_ID.bosses, "Battle Scene", HK.BOSSES_WORLD, HKWorldItems); + if (HKWorldItems) CheckWorldDataTrue(HK.DIV_ID.bosses, "Battle Scene", HK_BOSSES_WORLD_temp, HKWorldItems); // ---------------- Charms --------------------- // - CheckIfDataTrue(HK.DIV_ID.charms, HK.CHARMS, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.charms, HK_CHARMS_temp, HKPlayerData); // ---------------- Colosseum of Fools --------------------- // - CheckIfDataTrue(HK.DIV_ID.colosseum, HK.COLOSSEUM, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.colosseum, HK_COLOSSEUM_temp, HKPlayerData); // ---------------- Dreamers --------------------- // - CheckIfDataTrue(HK.DIV_ID.dreamers, HK.DREAMERS, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.dreamers, HK_DREAMERS_temp, HKPlayerData); // ---------------- Dream Nail and Essence --------------------- // - CheckIfDataTrue(HK.DIV_ID.dreamNail, HK.DREAMNAIL, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.dreamNail, HK_DREAMNAIL_temp, HKPlayerData); // ---------------- Equipment --------------------- // - CheckIfDataTrue(HK.DIV_ID.equipment, HK.EQUIPMENT, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.equipment, HK_EQUIPMENT_temp, HKPlayerData); // ---------------- Nail Upgrades --------------------- // - CheckNailUpgrades(HK.DIV_ID.nailUpgrades, HK.NAILUPGRADES, HKPlayerData); + for (let i = 0, length = HK_NAILUPGRADES_temp.length; i < length; i++) { + (HKPlayerData.nailSmithUpgrades >= i) ? CurrentDataTrue(HK.DIV_ID.nailUpgrades): CurrentDataFalse(); + FillHTML(HK.DIV_ID.nailUpgrades, HK_NAILUPGRADES_temp[i][0], HK_NAILUPGRADES_temp[i][1]); + } + if (HK.DIV_ID.nailUpgrades.percent) HK.DIV_ID.nailUpgrades.percent--; // subject one for the Old Nail // ---------------- Mask Shards --------------------- // - CheckIfDataTrue(HK.DIV_ID.maskShards, HK.MASKSHARDS, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.maskShards, HK_MASKSHARDS_temp, HKPlayerData); // ---------------- Mask Shards (World Map) --------------------- // - CheckWorldDataTrue(HK.DIV_ID.maskShards, "Heart Piece", HK.MASKSHARDS_WORLD, HKWorldItems); + CheckWorldDataTrue(HK.DIV_ID.maskShards, "Heart Piece", HK_MASKSHARDS_WORLD_temp, HKWorldItems); // ---------------- Nail Arts --------------------- // - CheckIfDataTrue(HK.DIV_ID.nailArts, HK.NAILARTS, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.nailArts, HK_NAILARTS_temp, HKPlayerData); // ---------------- Spells --------------------- // - CheckSpellLevel(HK.DIV_ID.spells, HK.SPELLS, HKPlayerData); + CheckSpellLevel(HK.DIV_ID.spells, HK_SPELLS_temp, HKPlayerData); // ---------------- Vessel Fragments --------------------- // - CheckIfDataTrue(HK.DIV_ID.vesselFragments, HK.VESSELFRAGMENTS, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.vesselFragments, HK_VESSELFRAGMENTS_temp, HKPlayerData); // ---------------- Vessel Fragments (World Map) --------------------- // - CheckWorldDataTrue(HK.DIV_ID.vesselFragments, "Vessel Fragment", HK.VESSELFRAGMENTS_WORLD, HKWorldItems); + CheckWorldDataTrue(HK.DIV_ID.vesselFragments, "Vessel Fragment", HK_VESSELFRAGMENTS_WORLD_temp, HKWorldItems); // ---------------- Warrior Dreams --------------------- // - CheckWarriorDreams(HK.DIV_ID.warriorDreams, HK.WARRIORDREAMS, HKPlayerData); + CheckWarriorDreams(HK.DIV_ID.warriorDreams, HK_WARRIORDREAMS_temp, HKPlayerData); // ---------------- Grimm Troupe Content Pack --------------------- // - CheckIfDataTrue(HK.DIV_ID.grimmTroupe, HK.GRIMMTROUPE, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.grimmTroupe, HK_GRIMMTROUPE_temp, HKPlayerData); (HKPlayerData.grimmChildLevel >= 4) ? CurrentDataTrue(HK.DIV_ID.grimmTroupe): CurrentDataFalse(); FillHTML(HK.DIV_ID.grimmTroupe, "Nightmare King Grimm / Banishment", "Dirtmouth or Howling Cliffs"); // ---------------- Lifeblood Content Pack --------------------- // - CheckIfDataTrue(HK.DIV_ID.lifeblood, HK.LIFEBLOOD, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.lifeblood, HK_LIFEBLOOD_temp, HKPlayerData); // ---------------- Godmaster Content Pack --------------------- // - CheckIfDataTrue(HK.DIV_ID.godmaster, HK.GODMASTER, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.godmaster, HK_GODMASTER_temp, HKPlayerData); - CheckGodmasterDoors(HK.DIV_ID.godmaster, HK.GODMASTER_DOORS, HKPlayerData); + for (let i = 1; i <= 4; i++) { + (HKPlayerData["bossDoorStateTier" + i].completed === true) ? CurrentDataTrue(HK.DIV_ID.godmaster): CurrentDataFalse(); + FillHTML(HK.DIV_ID.godmaster, HK_GODMASTER_DOORS_temp[i - 1][0], HK_GODMASTER_DOORS_temp[i - 1][1]); + } // ---------------- Fleur Divide ----------------- // @@ -210,7 +243,7 @@ function HKCheckCompletion(jsonObject) { // ------------------------- Hints ----------------------------- // - CheckHintsTrue(HK.DIV_ID.hints, HK.HINTS, HKPlayerData, HKWorldItems); + CheckHintsTrue(HK.DIV_ID.hints, HK_HINTS_temp, HKPlayerData, HKWorldItems); // ------------------------- Fill completion ----------------------------- // @@ -551,7 +584,7 @@ function CheckIfDataTrue(divId, dataObject, playerData) { default: (playerData[i] === true) ? CurrentDataTrue(divId): CurrentDataFalse(); } - FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); } } @@ -562,26 +595,10 @@ function CheckIfDataTrue(divId, dataObject, playerData) { * @param {object} playerData Reference/pointer to specific data where to search */ function CheckSpellLevel(divId, dataObject, playerData) { - for (let i in dataObject) { - switch (i) { - case "vengefulSpirit": - case "shadeSoul": - (playerData.fireballLevel >= dataObject[i].fireballLevel) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); - break; - case "desolateDive": - case "descendingDark": - (playerData.quakeLevel >= dataObject[i].quakeLevel) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); - break; - case "howlingWraiths": - case "abyssShriek": - (playerData.screamLevel >= dataObject[i].screamLevel) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); - break; - default: - break; + for (let j = 1; j <= 2; j++) { + (playerData[i] >= j) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[i][j][0], dataObject[i][j][1]); } } } @@ -589,54 +606,16 @@ function CheckSpellLevel(divId, dataObject, playerData) { /** * Verifies if the data in a specific object is 0 or > 0, and appends HTML accordingly. * @param {object} divId ID of the HTML element for data appending - * @param {object} dataObject Object containing data to be verified + * @param {object} dataObject Object containing data to be verified (use copy - data inside this object will be deleted) * @param {object} playerData Reference/pointer to specific data where to search */ function CheckWarriorDreams(divId, dataObject, playerData) { - for (let i in dataObject) { - (playerData[i] >= 2) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); + (playerData[i] > 0) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); } } -/** - * Verifies if the Godmaster Pantheons 1-4 are completed by the player, and appends HTML accordingly. - * @param {object} divId ID of the HTML element for data appending - * @param {object} dataObject Object containing pantheon data to be verified - * @param {object} playerData Reference/pointer to specific data where to search in the save file - */ -function CheckGodmasterDoors(divId, dataObject, playerData) { - - // appends "pantheon" to every array element - // same as names in the database object - let pantheon = ["Master", "Artist", "Sage", "Knight"].map((element) => "pantheon" + element); - - for (let i = 0; i < 4; i++) { - (playerData["bossDoorStateTier" + (i + 1)].completed === true) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[pantheon[i]].name, dataObject[pantheon[i]].spoiler); - } -} - -/** - * Verifies the level of player's nail upgrades, and appends HTML accordingly. - * @param {object} divId ID of the HTML element for data appending - * @param {object} dataObject Object containing nail upgrades data to be verified - * @param {object} playerData Reference/pointer to specific data where to search in the save file - */ -function CheckNailUpgrades(divId, dataObject, playerData) { - - // appends "Nail" to every array element - // same as names in the database object - let nail = ["old", "sharpened", "channeled", "coiled", "pure"].map((element) => element + "Nail"); - - for (let i = 0; i < 5; i++) { - (playerData.nailSmithUpgrades >= i) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[nail[i]].name, dataObject[nail[i]].spoiler); - } - if (divId.percent) divId.percent--; // subject one for the Old Nail -} - /** * Verifies if the data in a specific object are true or false, and appends HTML accordingly. Creates a copy of dataObject. * @param {object} divId ID of the HTML element for data appending @@ -650,7 +629,7 @@ function CheckWorldDataTrue(divId, idText, dataObject, worldData) { // Order the items before displaying them (creates a copy of dataObject) for (let i in dataObject) { - orderedArray.push([i, dataObject[i].name, dataObject[i].spoiler, false]); + orderedArray.push([i, dataObject[i][0], dataObject[i][1], false]); } // Search for completed items and mark them for display @@ -741,7 +720,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa for (let i = 0; i < arrayLength; i++) { if (sceneData.geoRocks[i].hitsLeft > 0) { countTotal++; - console.log(`#${countTotal} | ${sceneData.geoRocks[i].id} | ${sceneData.geoRocks[i].sceneName}`); + console.log(`#${countTotal} | ${sceneData.geoRocks[i].id} | Map location: ${sceneData.geoRocks[i].sceneName}`); } } console.groupEnd(); @@ -782,7 +761,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa if (length) { console.groupCollapsed("%cUnrescued Grubs List:", "color: #16c60c;"); for (let i = 0; i < length; i++) { - console.log(`#${HK.GRUBS_LIST.indexOf(missingGrubsList[i]) + 1} | ${missingGrubsList[i]}`); + console.log(`#${HK.GRUBS_LIST.indexOf(missingGrubsList[i]) + 1} | Map location: ${missingGrubsList[i]}`); } console.groupEnd(); } @@ -792,8 +771,8 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa // Start main loop for (let i in dataObject) { - textPrefix = dataObject[i].name; - (dataObject[i].hasOwnProperty("spoiler")) ? textSuffix = dataObject[i].spoiler: textSuffix = ""; + textPrefix = dataObject[i][0]; + (dataObject[i][1]) ? textSuffix = dataObject[i][1]: textSuffix = ""; let { amount, @@ -818,7 +797,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa case "whiteDefenderDefeats": case "greyPrinceDefeats": if (i === "areaMaps") { - amount = CountMaps(dataObject[i].list); + amount = CountMaps(dataObject[i][3]); } else if (i === "whisperingRoots") { amount = CountWorldItem("Dream Plant"); } else { @@ -833,7 +812,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa } if (i === "grubsCollected") LogMissingGrubs(); textPrefix += ": " + countTotal; - (amount >= dataObject[i].max) ? CurrentDataTrue(): CurrentDataBlank(); + (amount >= dataObject[i][2]) ? CurrentDataTrue(): CurrentDataBlank(); break; case "geoPool": case "rancidEggs": @@ -887,8 +866,8 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa case "relicsHallownestSeal": case "relicsKingsIdol": case "relicsArcaneEgg": - total = playerData[dataObject[i].nameHeld] + playerData[dataObject[i].nameSold]; - (total >= dataObject[i].max) ? CurrentDataTrue(): CurrentDataBlank(); + total = playerData[dataObject[i][3]] + playerData[dataObject[i][4]]; + (total >= dataObject[i][2]) ? CurrentDataTrue(): CurrentDataBlank(); textPrefix += ": " + total; break; case "bossDoorStateTier5": @@ -941,7 +920,7 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { if (playerData[i] >= 1) { continue; } else { - FillHTML(divId, "", dataObject[i].spoiler); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); return false; } } else if (i === "Crossroads_04") { @@ -956,7 +935,7 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { if (GruzMotherDefeated) { continue; // next dataObject (i) } else { - FillHTML(divId, "", dataObject[i].spoiler); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); return false; } } else if (i === "dungDefenderOrHornet2") { @@ -965,7 +944,7 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { } else if (playerData.hornetOutskirtsDefeated === true) { continue; } else { // if no Dung Defender or Hornet 2 - FillHTML(divId, "", dataObject[i].spoiler); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); return false; } } else if (i === "ismaTearOrShadeCloak") { @@ -975,15 +954,15 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { if (playerData.hasShadowDash === true) { continue; } else { // if Kings Brand but no Shade Cloak - FillHTML(divId, "", dataObject[i].spoiler); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); return false; } } else { // if no Isma's Tear or Kings Brand - FillHTML(divId, "", dataObject[i].spoiler); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); return false; } } else { // if anything from the hints list is not done - FillHTML(divId, "", dataObject[i].spoiler); + FillHTML(divId, dataObject[i][0], dataObject[i][1]); return false; } } // end: for (let i in dataObject) @@ -1059,7 +1038,7 @@ function InitialHTMLPopulate(divIdObj) { CheckGeo(divIdObj.intro); // First Hint Only - FillHTML(divIdObj.hints, "", HK.HINTS.fireballLevel.spoiler); + FillHTML(divIdObj.hints, HK.HINTS.fireballLevel[0], HK.HINTS.fireballLevel[1]); // Temp arrays storing references (addresses) to objects for looping through them (duplicates important) let hkObjArray = [HK.BOSSES, HK.BOSSES_WORLD, HK.CHARMS, HK.EQUIPMENT, HK.NAILARTS, HK.MASKSHARDS, HK.MASKSHARDS_WORLD, HK.VESSELFRAGMENTS, HK.VESSELFRAGMENTS_WORLD, HK.DREAMERS, HK.COLOSSEUM, HK.DREAMNAIL, HK.WARRIORDREAMS, HK.GRIMMTROUPE, HK.LIFEBLOOD, HK.GODMASTER, HK.ESSENTIAL, HK.ACHIEVEMENTS, HK.STATISTICS]; @@ -1070,27 +1049,29 @@ function InitialHTMLPopulate(divIdObj) { // Looped filling to reduce redundancy do { for (let parameter in hkObjArray[0]) { - FillHTML(divObjArray[0], hkObjArray[0][parameter].name, hkObjArray[0][parameter].spoiler); + FillHTML(divObjArray[0], hkObjArray[0][parameter][0], hkObjArray[0][parameter][1]); } divObjArray.shift(); } while (hkObjArray.shift()); // Nail Upgrades Misc - for (let i in HK.NAILUPGRADES) { - FillHTML(divIdObj.nailUpgrades, HK.NAILUPGRADES[i].name, HK.NAILUPGRADES[i].spoiler); + for (let i = 0; i < HK.NAILUPGRADES.length; i++) { + FillHTML(divIdObj.nailUpgrades, HK.NAILUPGRADES[i][0], HK.NAILUPGRADES[i][1]); } // Spells Misc for (let i in HK.SPELLS) { - FillHTML(divIdObj.spells, HK.SPELLS[i].name, HK.SPELLS[i].spoiler); + for (let j = 1; j <= 2; j++) { + FillHTML(divIdObj.spells, HK.SPELLS[i][j][0], HK.SPELLS[i][j][1]); + } } // Nightmare King Grimm / Banishment Misc FillHTML(divIdObj.grimmTroupe, "Nightmare King Grimm / Banishment", "Dirtmouth or Howling Cliffs"); // Godmaster Doors Misc - for (let i in HK.GODMASTER_DOORS) { - FillHTML(divIdObj.godmaster, HK.GODMASTER_DOORS[i].name, HK.GODMASTER_DOORS[i].spoiler); + for (let i = 0; i < ObjectLength(HK.GODMASTER_DOORS); i++) { + FillHTML(divIdObj.godmaster, HK.GODMASTER_DOORS[i][0], HK.GODMASTER_DOORS[i][1]); } // Fleur Dividers diff --git a/src/js/HKCheckCompletion.js b/src/js/HKCheckCompletion.js index 48e7a4c..92f0544 100644 --- a/src/js/HKCheckCompletion.js +++ b/src/js/HKCheckCompletion.js @@ -2,7 +2,7 @@ // ---------------- Load main Hollow Knight database file ----------------- // -import * as HK from "./hk-database.js"; +import HK from "./hk-database.js"; // ---------------- Load image files (necessary for Webpack) ----------------- // @@ -77,32 +77,6 @@ function HKCheckCompletion(jsonObject) { // Prevents adding current percent data after each function call (each click of Analyze button) ResetCompletion(HK.DIV_ID); - // Shallow Clone const objects (used for destructive functions) - let HK_HINTS_temp = Object.assign({}, HK.HINTS); - let HK_BOSSES_temp = Object.assign({}, HK.BOSSES); - let HK_BOSSES_WORLD_temp = Object.assign({}, HK.BOSSES_WORLD); - let HK_CHARMS_temp = Object.assign({}, HK.CHARMS); - let HK_COLOSSEUM_temp = Object.assign({}, HK.COLOSSEUM); - let HK_DREAMERS_temp = Object.assign({}, HK.DREAMERS); - let HK_DREAMNAIL_temp = Object.assign({}, HK.DREAMNAIL); - let HK_EQUIPMENT_temp = Object.assign({}, HK.EQUIPMENT); - let HK_MASKSHARDS_temp = Object.assign({}, HK.MASKSHARDS); - let HK_MASKSHARDS_WORLD_temp = Object.assign({}, HK.MASKSHARDS_WORLD); - let HK_NAILARTS_temp = Object.assign({}, HK.NAILARTS); - let HK_VESSELFRAGMENTS_temp = Object.assign({}, HK.VESSELFRAGMENTS); - let HK_VESSELFRAGMENTS_WORLD_temp = Object.assign({}, HK.VESSELFRAGMENTS_WORLD); - let HK_WARRIORDREAMS_temp = Object.assign({}, HK.WARRIORDREAMS); - let HK_GRIMMTROUPE_temp = Object.assign({}, HK.GRIMMTROUPE); - let HK_LIFEBLOOD_temp = Object.assign({}, HK.LIFEBLOOD); - let HK_GODMASTER_temp = Object.assign({}, HK.GODMASTER); - - // Shallow Clone const arrays (used for destructive functions) - let HK_GODMASTER_DOORS_temp = Array.from(HK.GODMASTER_DOORS); - let HK_NAILUPGRADES_temp = Array.from(HK.NAILUPGRADES); - - // Deep Clone const spells multi-layer object (used for destructive functions) - let HK_SPELLS_temp = JSON.parse(JSON.stringify(HK.SPELLS)); - // ================================================================================== // // ---------------- Time Played ----------------- // @@ -135,87 +109,80 @@ function HKCheckCompletion(jsonObject) { // ---------------- Bosses (Base Game) --------------------- // - CheckIfDataTrue(HK.DIV_ID.bosses, HK_BOSSES_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.bosses, HK.BOSSES, HKPlayerData); // ---------------- Gruz Mother and Mawlek (World Map) --------------------- // - if (HKWorldItems) CheckWorldDataTrue(HK.DIV_ID.bosses, "Battle Scene", HK_BOSSES_WORLD_temp, HKWorldItems); + if (HKWorldItems) CheckWorldDataTrue(HK.DIV_ID.bosses, "Battle Scene", HK.BOSSES_WORLD, HKWorldItems); // ---------------- Charms --------------------- // - CheckIfDataTrue(HK.DIV_ID.charms, HK_CHARMS_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.charms, HK.CHARMS, HKPlayerData); // ---------------- Colosseum of Fools --------------------- // - CheckIfDataTrue(HK.DIV_ID.colosseum, HK_COLOSSEUM_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.colosseum, HK.COLOSSEUM, HKPlayerData); // ---------------- Dreamers --------------------- // - CheckIfDataTrue(HK.DIV_ID.dreamers, HK_DREAMERS_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.dreamers, HK.DREAMERS, HKPlayerData); // ---------------- Dream Nail and Essence --------------------- // - CheckIfDataTrue(HK.DIV_ID.dreamNail, HK_DREAMNAIL_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.dreamNail, HK.DREAMNAIL, HKPlayerData); // ---------------- Equipment --------------------- // - CheckIfDataTrue(HK.DIV_ID.equipment, HK_EQUIPMENT_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.equipment, HK.EQUIPMENT, HKPlayerData); // ---------------- Nail Upgrades --------------------- // - for (let i = 0, length = HK_NAILUPGRADES_temp.length; i < length; i++) { - (HKPlayerData.nailSmithUpgrades >= i) ? CurrentDataTrue(HK.DIV_ID.nailUpgrades): CurrentDataFalse(); - FillHTML(HK.DIV_ID.nailUpgrades, HK_NAILUPGRADES_temp[i][0], HK_NAILUPGRADES_temp[i][1]); - } - if (HK.DIV_ID.nailUpgrades.percent) HK.DIV_ID.nailUpgrades.percent--; // subject one for the Old Nail + CheckNailUpgrades(HK.DIV_ID.nailUpgrades, HK.NAILUPGRADES, HKPlayerData); // ---------------- Mask Shards --------------------- // - CheckIfDataTrue(HK.DIV_ID.maskShards, HK_MASKSHARDS_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.maskShards, HK.MASKSHARDS, HKPlayerData); // ---------------- Mask Shards (World Map) --------------------- // - CheckWorldDataTrue(HK.DIV_ID.maskShards, "Heart Piece", HK_MASKSHARDS_WORLD_temp, HKWorldItems); + CheckWorldDataTrue(HK.DIV_ID.maskShards, "Heart Piece", HK.MASKSHARDS_WORLD, HKWorldItems); // ---------------- Nail Arts --------------------- // - CheckIfDataTrue(HK.DIV_ID.nailArts, HK_NAILARTS_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.nailArts, HK.NAILARTS, HKPlayerData); // ---------------- Spells --------------------- // - CheckSpellLevel(HK.DIV_ID.spells, HK_SPELLS_temp, HKPlayerData); + CheckSpellLevel(HK.DIV_ID.spells, HK.SPELLS, HKPlayerData); // ---------------- Vessel Fragments --------------------- // - CheckIfDataTrue(HK.DIV_ID.vesselFragments, HK_VESSELFRAGMENTS_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.vesselFragments, HK.VESSELFRAGMENTS, HKPlayerData); // ---------------- Vessel Fragments (World Map) --------------------- // - CheckWorldDataTrue(HK.DIV_ID.vesselFragments, "Vessel Fragment", HK_VESSELFRAGMENTS_WORLD_temp, HKWorldItems); + CheckWorldDataTrue(HK.DIV_ID.vesselFragments, "Vessel Fragment", HK.VESSELFRAGMENTS_WORLD, HKWorldItems); // ---------------- Warrior Dreams --------------------- // - CheckWarriorDreams(HK.DIV_ID.warriorDreams, HK_WARRIORDREAMS_temp, HKPlayerData); + CheckWarriorDreams(HK.DIV_ID.warriorDreams, HK.WARRIORDREAMS, HKPlayerData); // ---------------- Grimm Troupe Content Pack --------------------- // - CheckIfDataTrue(HK.DIV_ID.grimmTroupe, HK_GRIMMTROUPE_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.grimmTroupe, HK.GRIMMTROUPE, HKPlayerData); (HKPlayerData.grimmChildLevel >= 4) ? CurrentDataTrue(HK.DIV_ID.grimmTroupe): CurrentDataFalse(); FillHTML(HK.DIV_ID.grimmTroupe, "Nightmare King Grimm / Banishment", "Dirtmouth or Howling Cliffs"); // ---------------- Lifeblood Content Pack --------------------- // - CheckIfDataTrue(HK.DIV_ID.lifeblood, HK_LIFEBLOOD_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.lifeblood, HK.LIFEBLOOD, HKPlayerData); // ---------------- Godmaster Content Pack --------------------- // - CheckIfDataTrue(HK.DIV_ID.godmaster, HK_GODMASTER_temp, HKPlayerData); + CheckIfDataTrue(HK.DIV_ID.godmaster, HK.GODMASTER, HKPlayerData); - for (let i = 1; i <= 4; i++) { - (HKPlayerData["bossDoorStateTier" + i].completed === true) ? CurrentDataTrue(HK.DIV_ID.godmaster): CurrentDataFalse(); - FillHTML(HK.DIV_ID.godmaster, HK_GODMASTER_DOORS_temp[i - 1][0], HK_GODMASTER_DOORS_temp[i - 1][1]); - } + CheckGodmasterDoors(HK.DIV_ID.godmaster, HK.GODMASTER_DOORS, HKPlayerData); // ---------------- Fleur Divide ----------------- // @@ -243,7 +210,7 @@ function HKCheckCompletion(jsonObject) { // ------------------------- Hints ----------------------------- // - CheckHintsTrue(HK.DIV_ID.hints, HK_HINTS_temp, HKPlayerData, HKWorldItems); + CheckHintsTrue(HK.DIV_ID.hints, HK.HINTS, HKPlayerData, HKWorldItems); // ------------------------- Fill completion ----------------------------- // @@ -584,7 +551,7 @@ function CheckIfDataTrue(divId, dataObject, playerData) { default: (playerData[i] === true) ? CurrentDataTrue(divId): CurrentDataFalse(); } - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); } } @@ -595,10 +562,26 @@ function CheckIfDataTrue(divId, dataObject, playerData) { * @param {object} playerData Reference/pointer to specific data where to search */ function CheckSpellLevel(divId, dataObject, playerData) { + for (let i in dataObject) { - for (let j = 1; j <= 2; j++) { - (playerData[i] >= j) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[i][j][0], dataObject[i][j][1]); + switch (i) { + case "vengefulSpirit": + case "shadeSoul": + (playerData.fireballLevel >= dataObject[i].fireballLevel) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); + break; + case "desolateDive": + case "descendingDark": + (playerData.quakeLevel >= dataObject[i].quakeLevel) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); + break; + case "howlingWraiths": + case "abyssShriek": + (playerData.screamLevel >= dataObject[i].screamLevel) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); + break; + default: + break; } } } @@ -606,16 +589,54 @@ function CheckSpellLevel(divId, dataObject, playerData) { /** * Verifies if the data in a specific object is 0 or > 0, and appends HTML accordingly. * @param {object} divId ID of the HTML element for data appending - * @param {object} dataObject Object containing data to be verified (use copy - data inside this object will be deleted) + * @param {object} dataObject Object containing data to be verified * @param {object} playerData Reference/pointer to specific data where to search */ function CheckWarriorDreams(divId, dataObject, playerData) { + for (let i in dataObject) { - (playerData[i] > 0) ? CurrentDataTrue(divId): CurrentDataFalse(); - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + (playerData[i] >= 2) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[i].name, dataObject[i].spoiler); } } +/** + * Verifies if the Godmaster Pantheons 1-4 are completed by the player, and appends HTML accordingly. + * @param {object} divId ID of the HTML element for data appending + * @param {object} dataObject Object containing pantheon data to be verified + * @param {object} playerData Reference/pointer to specific data where to search in the save file + */ +function CheckGodmasterDoors(divId, dataObject, playerData) { + + // appends "pantheon" to every array element + // same as names in the database object + let pantheon = ["Master", "Artist", "Sage", "Knight"].map((element) => "pantheon" + element); + + for (let i = 0; i < 4; i++) { + (playerData["bossDoorStateTier" + (i + 1)].completed === true) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[pantheon[i]].name, dataObject[pantheon[i]].spoiler); + } +} + +/** + * Verifies the level of player's nail upgrades, and appends HTML accordingly. + * @param {object} divId ID of the HTML element for data appending + * @param {object} dataObject Object containing nail upgrades data to be verified + * @param {object} playerData Reference/pointer to specific data where to search in the save file + */ +function CheckNailUpgrades(divId, dataObject, playerData) { + + // appends "Nail" to every array element + // same as names in the database object + let nail = ["old", "sharpened", "channeled", "coiled", "pure"].map((element) => element + "Nail"); + + for (let i = 0; i < 5; i++) { + (playerData.nailSmithUpgrades >= i) ? CurrentDataTrue(divId): CurrentDataFalse(); + FillHTML(divId, dataObject[nail[i]].name, dataObject[nail[i]].spoiler); + } + if (divId.percent) divId.percent--; // subject one for the Old Nail +} + /** * Verifies if the data in a specific object are true or false, and appends HTML accordingly. Creates a copy of dataObject. * @param {object} divId ID of the HTML element for data appending @@ -629,7 +650,7 @@ function CheckWorldDataTrue(divId, idText, dataObject, worldData) { // Order the items before displaying them (creates a copy of dataObject) for (let i in dataObject) { - orderedArray.push([i, dataObject[i][0], dataObject[i][1], false]); + orderedArray.push([i, dataObject[i].name, dataObject[i].spoiler, false]); } // Search for completed items and mark them for display @@ -720,7 +741,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa for (let i = 0; i < arrayLength; i++) { if (sceneData.geoRocks[i].hitsLeft > 0) { countTotal++; - console.log(`#${countTotal} | ${sceneData.geoRocks[i].id} | Map location: ${sceneData.geoRocks[i].sceneName}`); + console.log(`#${countTotal} | ${sceneData.geoRocks[i].id} | ${sceneData.geoRocks[i].sceneName}`); } } console.groupEnd(); @@ -761,7 +782,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa if (length) { console.groupCollapsed("%cUnrescued Grubs List:", "color: #16c60c;"); for (let i = 0; i < length; i++) { - console.log(`#${HK.GRUBS_LIST.indexOf(missingGrubsList[i]) + 1} | Map location: ${missingGrubsList[i]}`); + console.log(`#${HK.GRUBS_LIST.indexOf(missingGrubsList[i]) + 1} | ${missingGrubsList[i]}`); } console.groupEnd(); } @@ -771,8 +792,8 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa // Start main loop for (let i in dataObject) { - textPrefix = dataObject[i][0]; - (dataObject[i][1]) ? textSuffix = dataObject[i][1]: textSuffix = ""; + textPrefix = dataObject[i].name; + (dataObject[i].hasOwnProperty("spoiler")) ? textSuffix = dataObject[i].spoiler: textSuffix = ""; let { amount, @@ -797,7 +818,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa case "whiteDefenderDefeats": case "greyPrinceDefeats": if (i === "areaMaps") { - amount = CountMaps(dataObject[i][3]); + amount = CountMaps(dataObject[i].list); } else if (i === "whisperingRoots") { amount = CountWorldItem("Dream Plant"); } else { @@ -812,7 +833,7 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa } if (i === "grubsCollected") LogMissingGrubs(); textPrefix += ": " + countTotal; - (amount >= dataObject[i][2]) ? CurrentDataTrue(): CurrentDataBlank(); + (amount >= dataObject[i].max) ? CurrentDataTrue(): CurrentDataBlank(); break; case "geoPool": case "rancidEggs": @@ -866,8 +887,8 @@ function CheckAdditionalThings(divId, dataObject, playerData, worldData, sceneDa case "relicsHallownestSeal": case "relicsKingsIdol": case "relicsArcaneEgg": - total = playerData[dataObject[i][3]] + playerData[dataObject[i][4]]; - (total >= dataObject[i][2]) ? CurrentDataTrue(): CurrentDataBlank(); + total = playerData[dataObject[i].nameHeld] + playerData[dataObject[i].nameSold]; + (total >= dataObject[i].max) ? CurrentDataTrue(): CurrentDataBlank(); textPrefix += ": " + total; break; case "bossDoorStateTier5": @@ -920,7 +941,7 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { if (playerData[i] >= 1) { continue; } else { - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + FillHTML(divId, "", dataObject[i].spoiler); return false; } } else if (i === "Crossroads_04") { @@ -935,7 +956,7 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { if (GruzMotherDefeated) { continue; // next dataObject (i) } else { - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + FillHTML(divId, "", dataObject[i].spoiler); return false; } } else if (i === "dungDefenderOrHornet2") { @@ -944,7 +965,7 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { } else if (playerData.hornetOutskirtsDefeated === true) { continue; } else { // if no Dung Defender or Hornet 2 - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + FillHTML(divId, "", dataObject[i].spoiler); return false; } } else if (i === "ismaTearOrShadeCloak") { @@ -954,15 +975,15 @@ function CheckHintsTrue(divId, dataObject, playerData, worldData) { if (playerData.hasShadowDash === true) { continue; } else { // if Kings Brand but no Shade Cloak - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + FillHTML(divId, "", dataObject[i].spoiler); return false; } } else { // if no Isma's Tear or Kings Brand - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + FillHTML(divId, "", dataObject[i].spoiler); return false; } } else { // if anything from the hints list is not done - FillHTML(divId, dataObject[i][0], dataObject[i][1]); + FillHTML(divId, "", dataObject[i].spoiler); return false; } } // end: for (let i in dataObject) @@ -1038,7 +1059,7 @@ function InitialHTMLPopulate(divIdObj) { CheckGeo(divIdObj.intro); // First Hint Only - FillHTML(divIdObj.hints, HK.HINTS.fireballLevel[0], HK.HINTS.fireballLevel[1]); + FillHTML(divIdObj.hints, "", HK.HINTS.fireballLevel.spoiler); // Temp arrays storing references (addresses) to objects for looping through them (duplicates important) let hkObjArray = [HK.BOSSES, HK.BOSSES_WORLD, HK.CHARMS, HK.EQUIPMENT, HK.NAILARTS, HK.MASKSHARDS, HK.MASKSHARDS_WORLD, HK.VESSELFRAGMENTS, HK.VESSELFRAGMENTS_WORLD, HK.DREAMERS, HK.COLOSSEUM, HK.DREAMNAIL, HK.WARRIORDREAMS, HK.GRIMMTROUPE, HK.LIFEBLOOD, HK.GODMASTER, HK.ESSENTIAL, HK.ACHIEVEMENTS, HK.STATISTICS]; @@ -1049,29 +1070,27 @@ function InitialHTMLPopulate(divIdObj) { // Looped filling to reduce redundancy do { for (let parameter in hkObjArray[0]) { - FillHTML(divObjArray[0], hkObjArray[0][parameter][0], hkObjArray[0][parameter][1]); + FillHTML(divObjArray[0], hkObjArray[0][parameter].name, hkObjArray[0][parameter].spoiler); } divObjArray.shift(); } while (hkObjArray.shift()); // Nail Upgrades Misc - for (let i = 0; i < HK.NAILUPGRADES.length; i++) { - FillHTML(divIdObj.nailUpgrades, HK.NAILUPGRADES[i][0], HK.NAILUPGRADES[i][1]); + for (let i in HK.NAILUPGRADES) { + FillHTML(divIdObj.nailUpgrades, HK.NAILUPGRADES[i].name, HK.NAILUPGRADES[i].spoiler); } // Spells Misc for (let i in HK.SPELLS) { - for (let j = 1; j <= 2; j++) { - FillHTML(divIdObj.spells, HK.SPELLS[i][j][0], HK.SPELLS[i][j][1]); - } + FillHTML(divIdObj.spells, HK.SPELLS[i].name, HK.SPELLS[i].spoiler); } // Nightmare King Grimm / Banishment Misc FillHTML(divIdObj.grimmTroupe, "Nightmare King Grimm / Banishment", "Dirtmouth or Howling Cliffs"); // Godmaster Doors Misc - for (let i = 0; i < ObjectLength(HK.GODMASTER_DOORS); i++) { - FillHTML(divIdObj.godmaster, HK.GODMASTER_DOORS[i][0], HK.GODMASTER_DOORS[i][1]); + for (let i in HK.GODMASTER_DOORS) { + FillHTML(divIdObj.godmaster, HK.GODMASTER_DOORS[i].name, HK.GODMASTER_DOORS[i].spoiler); } // Fleur Dividers diff --git a/src/js/hk-database-old.js b/src/js/hk-database-old.js new file mode 100644 index 0000000..2b3850c --- /dev/null +++ b/src/js/hk-database-old.js @@ -0,0 +1,458 @@ +// ---------------- Hollow Knight Data Constant Objects ----------------- // +/* + This is the whole database for the tool, based on the .json save file data +*/ + +const DIV_ID = { + intro: { + h2: "Game Status", + id: "hk-intro", + maxPercent: 112 + }, + hints: { + h2: "My friend Elderbug once told me about...", + id: "hk-hints", + }, + bosses: { + h2: "Bosses", + id: "hk-bosses", + percent: 0, + maxPercent: 14 + }, + charms: { + h2: "Charms", + id: "hk-charms", + percent: 0, + maxPercent: 36 + }, + equipment: { + h2: "Equipment", + id: "hk-equipment", + percent: 0, + maxPercent: 14 + }, + nailUpgrades: { + h2: "Nail Upgrades", + id: "hk-nailupgrades", + percent: 0, + maxPercent: 4 + }, + nailArts: { + h2: "Nail Arts", + id: "hk-nailarts", + percent: 0, + maxPercent: 3 + }, + spells: { + h2: "Spells", + id: "hk-spells", + percent: 0, + maxPercent: 6 + }, + maskShards: { + h2: "Mask Shards", + id: "hk-maskshards", + percent: 0, + maxPercent: 4 + }, + vesselFragments: { + h2: "Vessel Fragments", + id: "hk-vesselfragments", + percent: 0, + maxPercent: 3 + }, + dreamNail: { + h2: "Dream Nail and Essence", + id: "hk-dreamnail", + percent: 0, + maxPercent: 3 + }, + warriorDreams: { + h2: "Warrior Dreams", + id: "hk-warriordreams", + percent: 0, + maxPercent: 7 + }, + dreamers: { + h2: "Dreamers", + id: "hk-dreamers", + percent: 0, + maxPercent: 3 + }, + colosseum: { + h2: "Colosseum of Fools", + id: "hk-colosseum", + percent: 0, + maxPercent: 3 + }, + grimmTroupe: { + h2: "Grimm Troupe Content Pack", + id: "hk-grimmtroupe", + percent: 0, + maxPercent: 6 + }, + lifeblood: { + h2: "Lifeblood Content Pack", + id: "hk-lifeblood", + percent: 0, + maxPercent: 1 + }, + godmaster: { + h2: "Godmaster Content Pack", + id: "hk-godmaster", + percent: 0, + maxPercent: 5 + }, + essential: { + h2: "Game Completion Essentials", + id: "hk-essential" + }, + achievements: { + h2: "Achievements Essentials", + id: "hk-achievements" + }, + statistics: { + h2: "Game Statistics", + id: "hk-statistics" + } +}; + +const HINTS = { + fireballLevel: ["", "...a mysterious shaman living in a dwelling below the town of Dirtmouth"], + hornet1Defeated: ["", "...a skilled protector guarding ruins in a lush green forest"], + hasDash: ["", "...an old cloak lying on a green path near a broken shell"], + hasWalljump: ["", "...a sharp claw lying forgotten somewhere amidst the insect village"], + Crossroads_04: ["", "...a mother sleeping peacefully below the town of Dirtmouth"], + slyRescued: ["", "...a fellow town bug who seems to be lost somewhere in the crossroads"], + hasLantern: ["", "...a precious item able to carry some light to even the darkest places"], + hasSuperDash: ["", "...some powerful crystal beating somewhere deep inside the mines"], + hasDreamNail: ["", "...a weapon from a dream world only found where the souls can peacefully rest"], + killedInfectedKnight: ["", "...a shattered corpse forgotten in a windy cave in the ancient depths below the city"], + hasDoubleJump: ["", "...something incredibly light dropped by a monarchfly in the ancient depths below the city"], + killedBlackKnight: ["", "...discarded shells of black guards lying on the floor of a high spire"], + lurienDefeated: ["", "...a dreamer sleeping somewhere at the top of a high spire"], + dungDefenderOrHornet2: ["", "...a skilled combatant living at the heart of the sewers or watching over a shell amidst ash falling from the sky"], + ismaTearOrShadeCloak: ["", "...something precious in a grove accessed from the waterways or a massive royal door guarding a cloak behind the darkness"], + defeatedMegaJelly: ["", "...an intelligent being floating inside hidden archives behind the fog"], + monomonDefeated: ["", "...a dreamer sleeping somewhere hidden in a foggy area"], + hegemolDefeated: ["", "...a dreamer sleeping near a spider nest area"], + killedHollowKnight: ["", "...a disturbance inside a black temple"], +}; + +const BOSSES = { + falseKnightDefeated: ["False Knight", "Forgotten Crossroads"], // "Battle Scene" - "Crossroads_10" ? + hornet1Defeated: ["Hornet Protector", "Greenpath"], + defeatedDungDefender: ["Dung Defender", "Royal Waterways"], + mageLordDefeated: ["Soul Master", "City of Tears: Soul Sanctum"], + killedBlackKnight: ["Watcher Knights", "City of Tears: Watcher's Spire"], + collectorDefeated: ["The Collector", "City of Tears: Tower of Love"], + defeatedMantisLords: ["Mantis Lords", "Mantis Village"], + defeatedMegaJelly: ["Uumuu", "Fog Canyon: Teacher's Archives"], + hornetOutskirtsDefeated: ["Hornet Sentinel", "Kingdom's Edge"], + killedInfectedKnight: ["Broken Vessel", "Ancient Basin"], + killedMimicSpider: ["Nosk", "Deepnest"], // "Battle Scene" - "Deepnest_32" ? + killedTraitorLord: ["Traitor Lord", "Queen's Gardens"] // "Battle Scene" - "Fungus3_23" ? +}; + +// "Battle Scene" sceneData.persistentBoolItems.id +const BOSSES_WORLD = { + Crossroads_04: ["Gruz Mother", "Forgotten Crossroads"], // killedBigFly + Crossroads_09: ["Brooding Mawlek", "Forgotten Crossroads"] // killedMawlek +}; + +// reference: https://radiance.host/apidocs/Charms.html +const CHARMS = { + gotCharm_1: ["#1 Gathering Swarm", "Sly: 300 Geo"], // 1 + gotCharm_2: ["#2 Wayward Compass", "Iselda: 220 Geo"], // 1 + gotCharm_3: ["#3 Grubsong", "Grubfather: 10 Grubs rescued"], // 1 + gotCharm_4: ["#4 Stalwart Shell", "Sly: 200 Geo"], // 2 + gotCharm_5: ["#5 Baldur Shell", "Howling Cliffs"], // 2 + gotCharm_6: ["#6 Fury of the Fallen", "King's Pass"], // 2 + gotCharm_7: ["#7 Quick Focus", "Salubra: 800 Geo"], // 3 + gotCharm_8: ["#8 Lifeblood Heart", "Salubra: 250 Geo"], // 2 + gotCharm_9: ["#9 Lifeblood Core", "The Abyss: 15 Lifeblood masks"], // 3 + gotCharm_10: ["#10 Defender's Crest", "Royal Waterways"], // 1 + gotCharm_11: ["#11 Flukenest", "Royal Waterways"], // 3 + gotCharm_12: ["#12 Thorns of Agony", "Greenpath"], // 1 + gotCharm_13: ["#13 Mark of Pride", "Mantis Village"], // 3 + gotCharm_14: ["#14 Steady Body", "Salubra: 120 Geo"], // 1 + gotCharm_15: ["#15 Heavy Blow", "Sly: 350 Geo + Shopkeeper's Key"], // 2 + gotCharm_16: ["#16 Sharp Shadow", "Deepnest"], // 2 + gotCharm_17: ["#17 Spore Shroom", "Fungal Wastes"], // 1 + gotCharm_18: ["#18 Longnail", "Salubra: 300 Geo"], // 2 + gotCharm_19: ["#19 Shaman Stone", "Salubra: 220 Geo"], // 3 + gotCharm_20: ["#20 Soul Catcher", "Forgotten Crossroads: Ancestral Mound"], // 2 + gotCharm_21: ["#21 Soul Eater", "Resting Grounds"], // 4 + gotCharm_22: ["#22 Glowing Womb", "Forgotten Crossroads"], // 2 + gotCharm_23: ["#23 Fragile Heart", "Leg Eater: 350/280 Geo"], // 2 + gotCharm_24: ["#24 Fragile Greed", "Leg Eater: 250/200 Geo"], // 2 + gotCharm_25: ["#25 Fragile Strength", "Leg Eater: 600/480 Geo"], // 3 + gotCharm_26: ["#26 Nailmaster’s Glory", "Sly: All Nail Arts"], // 1 + gotCharm_27: ["#27 Joni’s Blessing", "Howling Cliffs: Joni's Repose"], // 4 + gotCharm_28: ["#28 Shape of Unn", "Greenpath: Lake of Unn"], // 2 + gotCharm_29: ["#29 Hiveblood", "The Hive"], // 4 + gotCharm_30: ["#30 Dream Wielder", "Seer: 500 Essence"], // 1 + gotCharm_31: ["#31 Dashmaster", "Fungal Wastes"], // 2 + gotCharm_32: ["#32 Quick Slash", "Kingdom's Edge"], // 3 + gotCharm_33: ["#33 Spell Twister", "City of Tears: Soul Sanctum"], // 2 + gotCharm_34: ["#34 Deep Focus", "Crystal Peak"], // 4 + gotCharm_35: ["#35 Grubberfly’s Elegy", "Grubfather: 46 Grubs rescued"], // 3 + gotCharm_36: ["#36 Kingsoul", "Queen's Gardens + Ancient Basin"], // 5 +}; + +const COLOSSEUM = { + colosseumBronzeCompleted: ["Trial of the Warrior", "Little Fool: 100 Geo"], + colosseumSilverCompleted: ["Trial of the Conqueror", "Little Fool: 450 Geo + Warrior completed"], + colosseumGoldCompleted: ["Trial of the Fool", "Little Fool: 800 Geo + Conqueror completed"], +}; + +const DREAMERS = { + lurienDefeated: ["Lurien the Watcher", "City of Tears: Watcher's Spire"], + monomonDefeated: ["Monomon the Teacher", "Fog Canyon: Teacher's Archives"], + hegemolDefeated: ["Herrah the Beast", "Deepnest: Distant Village"] +}; + +const DREAMNAIL = { + hasDreamNail: ["Dream Nail acquired", "Resting Grounds"], + dreamNailUpgraded: ["Awoken Dream Nail", "Seer: 1800 Essence"], + mothDeparted: ["Hear the Seer's final words", "Seer: 2400 Essence"] +}; + +const EQUIPMENT = { + hasDash: ["Mothwing Cloak", "Greenpath: Dash ability"], + hasWalljump: ["Mantis Claw", "Mantis Village: Wall Jump ability"], + hasSuperDash: ["Crystal Heart", "Crystal Peak: Super Dash ability"], + hasDoubleJump: ["Monarch Wings", "Ancient Basin: Double Jump ability"], + hasAcidArmour: ["Isma's Tear", "Royal Waterways: Acid Armour ability"], + hasKingsBrand: ["King's Brand", "Kingdom's Edge"], + hasShadowDash: ["Shade Cloak", "The Abyss: Shadow Dash ability"] +}; + +const MASKSHARDS = { + slyShellFrag1: ["Mask Shard #1", "Sly: 150 Geo"], + slyShellFrag2: ["Mask Shard #2", "Sly: 500 Geo"], + slyShellFrag3: ["Mask Shard #3", "Sly: 800 Geo + Shopkeeper's Key"], + slyShellFrag4: ["Mask Shard #4", "Sly: 1500 Geo + Shopkeeper's Key"], + dreamReward7: ["Mask Shard #5", "Seer: 1500 Essence"] +}; + +// "Heart Piece" sceneData.persistentBoolItems.id +const MASKSHARDS_WORLD = { + Crossroads_13: ["Mask Shard #6", "Forgotten Crossroads: below Hot Springs"], + Crossroads_09: ["Mask Shard #7", "Forgotten Crossroads: Brooding Mawlek"], + Crossroads_38: ["Mask Shard #8", "Grubfather: 5 Grubs rescued"], + Room_Bretta: ["Mask Shard #9", "Dirtmouth: Bretta's Room, rescue Bretta"], + Fungus2_01: ["Mask Shard #10", "Queen's Station, requires Mantis Claw"], + Waterways_04b: ["Mask Shard #11", "Royal Waterways"], + Fungus1_36: ["Mask Shard #12", "Greenpath: Stone Sanctuary"], + Mines_32: ["Mask Shard #13", "Crystal Peak: Enraged Guardian"], + Fungus2_25: ["Mask Shard #14", "Deepnest: entrance from Fungal Wastes"], + Hive_04: ["Mask Shard #15", "The Hive, use Hive Guardian"], + Room_Mansion: ["Mask Shard #16", "Resting Grounds: Delicate Flower"] +}; + +const VESSELFRAGMENTS = { + slyVesselFrag1: ["Vessel Fragment #1", "Sly: 550 Geo"], + slyVesselFrag2: ["Vessel Fragment #2", "Sly: 900 Geo + Shopkeeper's Key"], + dreamReward5: ["Vessel Fragment #3", "Seer: 700 Essence"], + vesselFragStagNest: ["Vessel Fragment #4", "Stag Nest"] +}; + +// "Vessel Fragment" sceneData.persistentBoolItems.id +const VESSELFRAGMENTS_WORLD = { + Fungus1_13: ["Vessel Fragment #5", "Greenpath: near Queen's Gardens exit"], + Crossroads_37: ["Vessel Fragment #6", "Forgotten Crossroads: unlock City of Tears lift"], + Ruins2_09: ["Vessel Fragment #7", "Above King's Station"], + Deepnest_38: ["Vessel Fragment #8", "Deepnest: Goam platforming challenge"], + Abyss_04: ["Vessel Fragment #9", "Ancient Basin Fountain: 3000 Geo"] +}; + +const NAILARTS = { + hasDashSlash: ["Great Slash", "Nailmaster Sheo: Greenpath"], // this is correct + hasUpwardSlash: ["Dash Slash", "Nailmaster Oro: Kingdom's Edge, 800 Geo"], // this is correct + hasCyclone: ["Cyclone Slash", " Nailmaster Mato: Howling Cliffs"], +}; + +const NAILUPGRADES = [ + ["#0 Old Nail", "Starting Weapon"], + ["#1 Sharpened Nail", "Nailsmith: 250 Geo"], + ["#2 Channeled Nail", "Nailsmith: 800 Geo + 1 Pale Ore"], + ["#3 Coiled Nail", "Nailsmith: 2000 Geo + 2 Pale Ore"], + ["#4 Pure Nail", "Nailsmith: 4000 Geo + 3 Pale Ore"] +]; + +const SPELLS = { + fireballLevel: { + 1: ["Vengeful Spirit", "Forgotten Crossroads: Ancestral Mound"], + 2: ["Shade Soul", "City of Tears: Soul Sanctum + Elegant Key"], + }, + quakeLevel: { + 1: ["Desolate Dive", "City of Tears: Soul Sanctum"], + 2: ["Descending Dark", "Crystal Peak: Crystallised Mound"], + }, + screamLevel: { + 1: ["Howling Wraiths", "Fog Canyon: Overgrown Mound"], + 2: ["Abyss Shriek", "The Abyss"], + } +}; + +const WARRIORDREAMS = { + xeroDefeated: ["Xero", "Resting Grounds"], + noEyesDefeated: ["No Eyes", "Greenpath: Stone Sanctuary"], + elderHuDefeated: ["Elder Hu", "Fungal Wastes"], + aladarSlugDefeated: ["Gorb", "Howling Cliffs"], + mumCaterpillarDefeated: ["Marmu", "Queen's Gardens"], + galienDefeated: ["Galien", "Deepnest"], + markothDefeated: ["Markoth", "Kingdom's Edge, requires Shade Cloak"], +}; + +const GRIMMTROUPE = { + gotCharm_37: ["Charm #37 Sprintmaster", "Sly: 400 Geo + Shopkeeper's Key"], + gotCharm_38: ["Charm #38 Dreamshield", "Resting Grounds"], + gotCharm_39: ["Charm #39 Weaversong", "Deepnest: Weaver's Den"], + gotCharm_40: ["Charm #40 Grimmchild / Carefree Melody", "Dirtmouth"], + killedGrimm: ["Troupe Leader Grimm", "Dirtmouth"] +}; + +const LIFEBLOOD = { + killedHiveKnight: ["Hive Knight", "The Hive"] +}; + +const GODMASTER = { + hasGodfinder: ["Godtuner", "Junk Pit, requires Simple Key"] +}; + +const GODMASTER_DOORS = [ + ["#1 Pantheon of the Master", "Godhome"], + ["#2 Pantheon of the Artist", "Godhome"], + ["#3 Pantheon of the Sage", "Godhome"], + ["#4 Pantheon of the Knight", "Godhome"] +]; + +const ESSENTIAL = { + grubsCollected: ["Grubs Rescued", "out of 46 total", 46], + dreamOrbs: ["Essence Collected", "Dream Nail (2400 for completion)", 2400], + stationsOpened: ["Stag Stations opened", "out of 10 total", 10], + fountainGeo: ["Geo in Fountain", "Ancient Basin: 3000 Geo maximum", 3000], + slyRescued: ["Sly Rescued", "Forgotten Crossroads, near Gruz Mother"], + brettaRescued: ["Bretta Rescued", "Fungal Wastes, near Dashmaster charm statue"], + hasLantern: ["Lumafly Lantern", "Sly: 1800 Geo"], + shopkeeperKey: ["Shopkeeper's Key", "Crystal Peak"], + elegantKey: ["Elegant Key", "Sly: 800 Geo + Shopkeeper's Key"], + loveKey: ["Love Key", "Queen's Gardens, near Fungal Wastes"], + slySimpleKey: ["Simple Key #1", "Sly: 950 Geo"], + simpleKeyCityOfTears: ["Simple Key #2", "City of Tears"], + simpleKeyAncientBasin: ["Simple Key #3", "Ancient Basin"], + gotLurkerKey: ["Simple Key #4", "Kingdom's Edge: Colosseum of Fools"], + paleOreAncientBasin: ["Pale Ore #1", "Ancient Basin"], + paleOreSeer: ["Pale Ore #2", "Seer: 300 Essence"], + paleOreCrystalPeak: ["Pale Ore #3", "Crystal Peak: Hallownest's Crown"], + paleOreDeepnest: ["Pale Ore #4", "Deepnest, Nosk reward"], + paleOreGrubfather: ["Pale Ore #5", "Grubfather: 31 Grubs rescued"], + paleOreColosseum: ["Pale Ore #6", "Colosseum of Fools: Trial of the Conqueror"], + hasTramPass: ["Tram Pass", "Deepnest, Failed Tramway"], + nightmareLanternLit: ["Nightmare Lantern Lit", "Howling Cliffs, corpse of a large bug"] +}; + +const GRUBS_LIST = ["Crossroads_35", "Crossroads_03", "Crossroads_05", "Crossroads_48", "Crossroads_31", "Fungus1_06", "Fungus1_07", "Fungus1_21", "Fungus1_28", "Fungus2_18", "Ruins1_05", "Mines_04", "Mines_03", "Mines_31", "Mines_19", "Ruins1_32", "RestingGrounds_10", "Ruins_House_01", "Mines_35", "Mines_16", "Waterways_04", "Waterways_13", "Abyss_19", "Abyss_17", "Mines_24", "Fungus1_13", "Fungus3_47", "Fungus3_10", "Fungus3_48", "Fungus3_22", "Ruins2_07", "Ruins2_11_1", "Ruins2_11_2", "Ruins2_11_3", "Deepnest_East_11", "Deepnest_East_14", "Fungus2_20", "Ruins2_03", "Deepnest_36", "Deepnest_03", "Deepnest_31", "Deepnest_39", "Deepnest_Spider_Town", "Waterways_14", "Hive_03", "Hive_04"]; + +const ACHIEVEMENTS = { + areaMaps: ["Area Maps", "Cornifer and Iselda (out of 13)", 13, [ + "mapCrossroads", "mapGreenpath", "mapFogCanyon", "mapRoyalGardens", "mapFungalWastes", "mapCity", "mapWaterways", "mapMines", "mapDeepnest", "mapCliffs", "mapOutskirts", "mapRestingGrounds", "mapAbyss" + ]], + journalEntriesCompleted: ["Creatures Encountered", "Hunter's Journal (164 max)", 164], + journalNotesCompleted: ["Hunter Notes Completed", "Hunter's Journal (164 max)", 164], + hasJournal: ["Hunter's Journal", "Greenpath: Hunter"], + hasHuntersMark: ["Hunter's Mark", "Greenpath: Hunter"], + killedPrayerSlug: ["Journal: Maggot", "Forgotten Crossroads: False Knight secret room"], + killedOrangeScuttler: ["Journal: Lightseed", "Infected Crossroads"], + killedPigeon: ["Journal: Maskfly", "Greenpath, Queen's Gardens"], + killedLazyFlyer: ["Journal: Aluba", "Lake of Unn, Queen's Gardens (near White Lady)"], + killedAcidFlyer: ["Journal: Duranda", "Greenpath: Nailmaster Sheo's tent path"], + killedAcidWalker: ["Journal: Durandoo", "Greenpath, Queen's Gardens"], + killedPlantShooter: ["Journal: Gulka", "Greenpath: west of Stone Sanctuary"], + killedMushroomTurret: ["Journal: Sporg", "Fungal Wastes"], + killedZapBug: ["Journal: Charged Lumafly", "Fog Canyon: Teacher's Archives (tank)"], + killedCrystalCrawler: ["Journal: Crystal Crawler", "Crystal Peak"], + killedGorgeousHusk: ["Journal: Gorgeous Husk", "City of Tears: secret room"], + killedWorm: ["Journal: Goam", "Infected Crossroads: near Fungal Wastes entrance"], + killedBigCentipede: ["Journal: Garpede", "Deepnest: east of Hot Spring"], + killedAbyssTendril: ["Journal: Void Tendrils", "The Abyss: secret room"], + killedPaleLurker: ["Journal: Pale Lurker", "Colosseum of Fools: secret area"], + falseKnightDreamDefeated: ["Failed Champion", "Forgotten Crossroads"], + mageLordDreamDefeated: ["Soul Tyrant", "City of Tears: Soul Sanctum"], + infectedKnightDreamDefeated: ["Lost Kin", "Ancient Basin"], + whiteDefenderDefeated: ["White Defender", "Royal Waterways"], + greyPrinceDefeated: ["Grey Prince Zote", "Dirtmouth: Bretta's Room (per save choice)"], + killedHollowKnight: ["Hollow Knight", "Forgotten Crossroads: Black Egg Temple"], + salubraBlessing: ["Salubra's Blessing", "Salubra: 800 Geo + all 40 Charms found"], + gotShadeCharm: ["Void Heart", "Kingsoul + Birthplace"], + killedFinalBoss: ["Radiance", "Forgotten Crossroads: Black Egg Temple"], + bossDoorStateTier5: ["Embrace the Void", "Godhome: Pantheon of Hallownest"], + zoteDead: ["Optimal Zote", "Neglect achievement (per save choice)"], + nailsmithSpared: ["Optimal Nailsmith", "Happy Couple achievement (per save choice)"], +}; + +const STATISTICS = { + nailDamage: ["Nail Damage", "Nailsmith upgrades, City of Tears", 21], + charmSlots: ["Charm Notches", "out of 11 total", 11], + whisperingRoots: ["Whispering Roots completed", "Dream Nail (out of 15)", 15], + relicsWandererJournal: ["Relic #1 found total", "Wanderer's Journal (out of 14)", 14, "trinket1", "soldTrinket1"], + relicsHallownestSeal: ["Relic #2 found total", "Hallownest Seal (out of 17)", 17, "trinket2", "soldTrinket2"], + relicsKingsIdol: ["Relic #3 found total", "King's Idol (out of 8)", 8, "trinket3", "soldTrinket3"], + relicsArcaneEgg: ["Relic #4 found total", "Arcane Egg (4 max, 1 missable)", 4, "trinket4", "soldTrinket4"], + geoRocks: ["Geo Rocks", "Unbroken/Broken/Discovered Total"], + geoPool: ["Shade Geo", "Amount of Geo the Shade is currently holding", 0], // not ghostCoins + rancidEggs: ["Rancid Eggs", "Find: Hallownest, Buy: Sly, Tuk"], + xunFlowerBrokeTimes: ["Delicate Flowers broken", "Resting Grounds: Grey Mourner"], + notchShroomOgres: ["Charm Notch #1", "Fungal Wastes: Shroom Ogres room"], + salubraNotch1: ["Charm Notch #2", "Salubra: 120 Geo + 5 Charms found"], + salubraNotch2: ["Charm Notch #3", "Salubra: 500 Geo + 10 Charms found"], + salubraNotch3: ["Charm Notch #4", "Salubra: 900 Geo + 18 Charms found"], + salubraNotch4: ["Charm Notch #5", "Salubra: 1400 Geo + 25 Charms found"], + colosseumBronzeCompleted: ["Charm Notch #6", "Colosseum of Fools: Trial of the Warrior"], + notchFogCanyon: ["Charm Notch #7", "Fog Canyon: explosive eggs room"], + gotGrimmNotch: ["Charm Notch #8", "Dirtmouth: Troupe Leader Grimm"], + hasDreamGate: ["Dream Gate", "Seer: 900 Essence"], + fragileGreed_unbreakable: ["Unbreakable Greed", "Divine: Fragile Greed + 9000 Geo"], + fragileHealth_unbreakable: ["Unbreakable Heart", "Divine: Fragile Heart + 12000 Geo"], + fragileStrength_unbreakable: ["Unbreakable Strength", "Divine: Fragile Strength + 15000 Geo"], + killedMenderBug: ["Journal: Menderbug", "Forgotten Crossroads + destroy sign"], + killedBindingSeal: ["Journal: Seal of Binding", "White Palace: Path of Pain completion"], + killedGodseekerMask: ["Journal: Weathered Mask", "Godhome: Land of Storms"], + killedVoidIdol_1: ["Journal: Void Idol Attuned", "Godhome: Hall of Gods, defeat all"], + killedVoidIdol_2: ["Journal: Void Idol Ascended", "Godhome: Hall of Gods, defeat all"], + killedVoidIdol_3: ["Journal: Void Idol Radiant", "Godhome: Hall of Gods, defeat all"], + whiteDefenderDefeats: ["White Defender times defeated", "Royal Waterways (5 max)", 5], + greyPrinceDefeats: ["Grey Prince Zote times defeated", "Dirtmouth (10 max)", 10], + whitePalaceSecretRoomVisited: ["White Palace Secret Room visited", "Help identify this room!"], + killsBindingSeal: ["Path of Pain", "White Palace: main secret area"], +}; + +export { + DIV_ID, + HINTS, + BOSSES, + BOSSES_WORLD, + CHARMS, + EQUIPMENT, + NAILARTS, + NAILUPGRADES, + SPELLS, + MASKSHARDS, + MASKSHARDS_WORLD, + VESSELFRAGMENTS, + VESSELFRAGMENTS_WORLD, + DREAMERS, + COLOSSEUM, + DREAMNAIL, + WARRIORDREAMS, + GRIMMTROUPE, + LIFEBLOOD, + GODMASTER, + GODMASTER_DOORS, + ESSENTIAL, + GRUBS_LIST, + ACHIEVEMENTS, + STATISTICS +}; \ No newline at end of file diff --git a/src/js/hk-database-v2.js b/src/js/hk-database-v2.js deleted file mode 100644 index 5e34939..0000000 --- a/src/js/hk-database-v2.js +++ /dev/null @@ -1,1121 +0,0 @@ -// ---------------- Hollow Knight Data Constant Objects ----------------- // -/* - This is the whole database for the tool, based on the .json save file data -*/ - -const HK = { - DIV_ID: { - intro: { - h2: "Game Status", - id: "hk-intro", - maxPercent: 112 - }, - hints: { - h2: "My friend Elderbug once told me about...", - id: "hk-hints", - }, - bosses: { - h2: "Bosses", - id: "hk-bosses", - percent: 0, - maxPercent: 14 - }, - charms: { - h2: "Charms", - id: "hk-charms", - percent: 0, - maxPercent: 36 - }, - equipment: { - h2: "Equipment", - id: "hk-equipment", - percent: 0, - maxPercent: 14 - }, - nailUpgrades: { - h2: "Nail Upgrades", - id: "hk-nailupgrades", - percent: 0, - maxPercent: 4 - }, - nailArts: { - h2: "Nail Arts", - id: "hk-nailarts", - percent: 0, - maxPercent: 3 - }, - spells: { - h2: "Spells", - id: "hk-spells", - percent: 0, - maxPercent: 6 - }, - maskShards: { - h2: "Mask Shards", - id: "hk-maskshards", - percent: 0, - maxPercent: 4 - }, - vesselFragments: { - h2: "Vessel Fragments", - id: "hk-vesselfragments", - percent: 0, - maxPercent: 3 - }, - dreamNail: { - h2: "Dream Nail and Essence", - id: "hk-dreamnail", - percent: 0, - maxPercent: 3 - }, - warriorDreams: { - h2: "Warrior Dreams", - id: "hk-warriordreams", - percent: 0, - maxPercent: 7 - }, - dreamers: { - h2: "Dreamers", - id: "hk-dreamers", - percent: 0, - maxPercent: 3 - }, - colosseum: { - h2: "Colosseum of Fools", - id: "hk-colosseum", - percent: 0, - maxPercent: 3 - }, - grimmTroupe: { - h2: "Grimm Troupe Content Pack", - id: "hk-grimmtroupe", - percent: 0, - maxPercent: 6 - }, - lifeblood: { - h2: "Lifeblood Content Pack", - id: "hk-lifeblood", - percent: 0, - maxPercent: 1 - }, - godmaster: { - h2: "Godmaster Content Pack", - id: "hk-godmaster", - percent: 0, - maxPercent: 5 - }, - essential: { - h2: "Game Completion Essentials", - id: "hk-essential" - }, - achievements: { - h2: "Achievements Essentials", - id: "hk-achievements" - }, - statistics: { - h2: "Game Statistics", - id: "hk-statistics" - } - }, - // hk-hints - HINTS: { - fireballLevel: { - spoiler: "...a mysterious shaman living in a dwelling below the town of Dirtmouth" - }, - hornet1Defeated: { - spoiler: "...a skilled protector guarding ruins in a lush green forest" - }, - hasDash: { - spoiler: "...an old cloak lying on a green path near a broken shell" - }, - hasWalljump: { - spoiler: "...a sharp claw lying forgotten somewhere amidst the insect village" - }, - Crossroads_04: { - spoiler: "...a mother sleeping peacefully below the town of Dirtmouth" - }, - slyRescued: { - spoiler: "...a fellow town bug who seems to be lost somewhere in the crossroads" - }, - hasLantern: { - spoiler: "...a precious item able to carry some light to even the darkest places" - }, - hasSuperDash: { - spoiler: "...some powerful crystal beating somewhere deep inside the mines" - }, - hasDreamNail: { - spoiler: "...a weapon from a dream world only found where the souls can peacefully rest" - }, - killedInfectedKnight: { - spoiler: "...a shattered corpse forgotten in a windy cave in the ancient depths below the city" - }, - hasDoubleJump: { - spoiler: "...something incredibly light dropped by a monarchfly in the ancient depths below the city" - }, - killedBlackKnight: { - spoiler: "...discarded shells of black guards lying on the floor of a high spire" - }, - lurienDefeated: { - spoiler: "...a dreamer sleeping somewhere at the top of a high spire" - }, - dungDefenderOrHornet2: { - spoiler: "...a skilled combatant living at the heart of the sewers or watching over a shell amidst ash falling from the sky" - }, - ismaTearOrShadeCloak: { - spoiler: "...something precious in a grove accessed from the waterways or a massive royal door guarding a cloak behind the darkness" - }, - defeatedMegaJelly: { - spoiler: "...an intelligent being floating inside hidden archives behind the fog" - }, - monomonDefeated: { - spoiler: "...a dreamer sleeping somewhere hidden in a foggy area" - }, - hegemolDefeated: { - spoiler: "...a dreamer sleeping near a spider nest area" - }, - killedHollowKnight: { - spoiler: "...a disturbance inside a black temple" - }, - }, - // hk-bosses - BOSSES: { - falseKnightDefeated: { - name: "False Knight", - spoiler: "Forgotten Crossroads", - wiki: "False_Knight" - }, // "Battle Scene" - "Crossroads_10" ? - hornet1Defeated: { - name: "Hornet Protector", - spoiler: "Greenpath", - wiki: "Hornet_Protector" - }, - defeatedDungDefender: { - name: "Dung Defender", - spoiler: "Royal Waterways", - wiki: "Dung_Defender" - }, - mageLordDefeated: { - name: "Soul Master", - spoiler: "City of Tears: Soul Sanctum", - wiki: "Soul_Master" - }, - killedBlackKnight: { - name: "Watcher Knights", - spoiler: "City of Tears: Watcher's Spire", - wiki: "Watcher_Knight" - }, - collectorDefeated: { - name: "The Collector", - spoiler: "City of Tears: Tower of Love", - wiki: "Collector" - }, - defeatedMantisLords: { - name: "Mantis Lords", - spoiler: "Mantis Village", - wiki: "Mantis_Lords" - }, - defeatedMegaJelly: { - name: "Uumuu", - spoiler: "Fog Canyon: Teacher's Archives", - wiki: "Uumuu" - }, - hornetOutskirtsDefeated: { - name: "Hornet Sentinel", - spoiler: "Kingdom's Edge", - wiki: "Hornet_Sentinel" - }, - killedInfectedKnight: { - name: "Broken Vessel", - spoiler: "Ancient Basin", - wiki: "Broken_Vessel" - }, - killedMimicSpider: { - name: "Nosk", - spoiler: "Deepnest", - wiki: "Nosk" - }, // "Battle Scene" - "Deepnest_32" ? - killedTraitorLord: { - name: "Traitor Lord", - spoiler: "Queen's Gardens", - wiki: "Traitor_Lord" - } // "Battle Scene" - "Fungus3_23" ? - }, - // hk-bosses - // "Battle Scene" sceneData.persistentBoolItems.id - BOSSES_WORLD: { - Crossroads_04: { - name: "Gruz Mother", - spoiler: "Forgotten Crossroads", - wiki: "Gruz_Mother" - }, // killedBigFly - Crossroads_09: { - name: "Brooding Mawlek", - spoiler: "Forgotten Crossroads", - wiki: "Brooding_Mawlek" - } // killedMawlek - }, - // reference: https://radiance.host/apidocs/Charms.html - CHARMS: { - gotCharm_1: { - name: "#1 Gathering Swarm", - spoiler: "Sly: 300 Geo" - }, // 1 - gotCharm_2: { - name: "#2 Wayward Compass", - spoiler: "Iselda: 220 Geo" - }, // 1 - gotCharm_3: { - name: "#3 Grubsong", - spoiler: "Grubfather: 10 Grubs rescued" - }, // 1 - gotCharm_4: { - name: "#4 Stalwart Shell", - spoiler: "Sly: 200 Geo" - }, // 2 - gotCharm_5: { - name: "#5 Baldur Shell", - spoiler: "Howling Cliffs" - }, // 2 - gotCharm_6: { - name: "#6 Fury of the Fallen", - spoiler: "King's Pass" - }, // 2 - gotCharm_7: { - name: "#7 Quick Focus", - spoiler: "Salubra: 800 Geo" - }, // 3 - gotCharm_8: { - name: "#8 Lifeblood Heart", - spoiler: "Salubra: 250 Geo" - }, // 2 - gotCharm_9: { - name: "#9 Lifeblood Core", - spoiler: "The Abyss: 15 Lifeblood masks" - }, // 3 - gotCharm_10: { - name: "#10 Defender's Crest", - spoiler: "Royal Waterways" - }, // 1 - gotCharm_11: { - name: "#11 Flukenest", - spoiler: "Royal Waterways" - }, // 3 - gotCharm_12: { - name: "#12 Thorns of Agony", - spoiler: "Greenpath" - }, // 1 - gotCharm_13: { - name: "#13 Mark of Pride", - spoiler: "Mantis Village" - }, // 3 - gotCharm_14: { - name: "#14 Steady Body", - spoiler: "Salubra: 120 Geo" - }, // 1 - gotCharm_15: { - name: "#15 Heavy Blow", - spoiler: "Sly: 350 Geo + Shopkeeper's Key" - }, // 2 - gotCharm_16: { - name: "#16 Sharp Shadow", - spoiler: "Deepnest" - }, // 2 - gotCharm_17: { - name: "#17 Spore Shroom", - spoiler: "Fungal Wastes" - }, // 1 - gotCharm_18: { - name: "#18 Longnail", - spoiler: "Salubra: 300 Geo" - }, // 2 - gotCharm_19: { - name: "#19 Shaman Stone", - spoiler: "Salubra: 220 Geo" - }, // 3 - gotCharm_20: { - name: "#20 Soul Catcher", - spoiler: "Forgotten Crossroads: Ancestral Mound" - }, // 2 - gotCharm_21: { - name: "#21 Soul Eater", - spoiler: "Resting Grounds" - }, // 4 - gotCharm_22: { - name: "#22 Glowing Womb", - spoiler: "Forgotten Crossroads" - }, // 2 - gotCharm_23: { - name: "#23 Fragile Heart", - spoiler: "Leg Eater: 350/280 Geo" - }, // 2 - gotCharm_24: { - name: "#24 Fragile Greed", - spoiler: "Leg Eater: 250/200 Geo" - }, // 2 - gotCharm_25: { - name: "#25 Fragile Strength", - spoiler: "Leg Eater: 600/480 Geo" - }, // 3 - gotCharm_26: { - name: "#26 Nailmaster’s Glory", - spoiler: "Sly: All Nail Arts" - }, // 1 - gotCharm_27: { - name: "#27 Joni’s Blessing", - spoiler: "Howling Cliffs: Joni's Repose" - }, // 4 - gotCharm_28: { - name: "#28 Shape of Unn", - spoiler: "Greenpath: Lake of Unn" - }, // 2 - gotCharm_29: { - name: "#29 Hiveblood", - spoiler: "The Hive" - }, // 4 - gotCharm_30: { - name: "#30 Dream Wielder", - spoiler: "Seer: 500 Essence" - }, // 1 - gotCharm_31: { - name: "#31 Dashmaster", - spoiler: "Fungal Wastes" - }, // 2 - gotCharm_32: { - name: "#32 Quick Slash", - spoiler: "Kingdom's Edge" - }, // 3 - gotCharm_33: { - name: "#33 Spell Twister", - spoiler: "City of Tears: Soul Sanctum" - }, // 2 - gotCharm_34: { - name: "#34 Deep Focus", - spoiler: "Crystal Peak" - }, // 4 - gotCharm_35: { - name: "#35 Grubberfly’s Elegy", - spoiler: "Grubfather: 46 Grubs rescued" - }, // 3 - gotCharm_36: { - name: "#36 Kingsoul", - spoiler: "Queen's Gardens + Ancient Basin" - }, // 5 - }, - COLOSSEUM: { - colosseumBronzeCompleted: { - name: "Trial of the Warrior", - spoiler: "Little Fool: 100 Geo" - }, - colosseumSilverCompleted: { - name: "Trial of the Conqueror", - spoiler: "Little Fool: 450 Geo + Warrior completed" - }, - colosseumGoldCompleted: { - name: "Trial of the Fool", - spoiler: "Little Fool: 800 Geo + Conqueror completed" - }, - }, - DREAMERS: { - lurienDefeated: { - name: "Lurien the Watcher", - spoiler: "City of Tears: Watcher's Spire" - }, - monomonDefeated: { - name: "Monomon the Teacher", - spoiler: "Fog Canyon: Teacher's Archives" - }, - hegemolDefeated: { - name: "Herrah the Beast", - spoiler: "Deepnest: Distant Village" - } - }, - DREAMNAIL: { - hasDreamNail: { - name: "Dream Nail acquired", - spoiler: "Resting Grounds" - }, - dreamNailUpgraded: { - name: "Awoken Dream Nail", - spoiler: "Seer: 1800 Essence" - }, - mothDeparted: { - name: "Hear the Seer's final words", - spoiler: "Seer: 2400 Essence" - } - }, - EQUIPMENT: { - hasDash: { - name: "Mothwing Cloak", - spoiler: "Greenpath: Dash ability" - }, - hasWalljump: { - name: "Mantis Claw", - spoiler: "Mantis Village: Wall Jump ability" - }, - hasSuperDash: { - name: "Crystal Heart", - spoiler: "Crystal Peak: Super Dash ability" - }, - hasDoubleJump: { - name: "Monarch Wings", - spoiler: "Ancient Basin: Double Jump ability" - }, - hasAcidArmour: { - name: "Isma's Tear", - spoiler: "Royal Waterways: Acid Armour ability" - }, - hasKingsBrand: { - name: "King's Brand", - spoiler: "Kingdom's Edge" - }, - hasShadowDash: { - name: "Shade Cloak", - spoiler: "The Abyss: Shadow Dash ability" - } - }, - MASKSHARDS: { - slyShellFrag1: { - name: "Mask Shard #1", - spoiler: "Sly: 150 Geo" - }, - slyShellFrag2: { - name: "Mask Shard #2", - spoiler: "Sly: 500 Geo" - }, - slyShellFrag3: { - name: "Mask Shard #3", - spoiler: "Sly: 800 Geo + Shopkeeper's Key" - }, - slyShellFrag4: { - name: "Mask Shard #4", - spoiler: "Sly: 1500 Geo + Shopkeeper's Key" - }, - dreamReward7: { - name: "Mask Shard #5", - spoiler: "Seer: 1500 Essence" - } - }, - // "Heart Piece" sceneData.persistentBoolItems.id - MASKSHARDS_WORLD: { - Crossroads_13: { - name: "Mask Shard #6", - spoiler: "Forgotten Crossroads: below Hot Springs" - }, - Crossroads_09: { - name: "Mask Shard #7", - spoiler: "Forgotten Crossroads: Brooding Mawlek" - }, - Crossroads_38: { - name: "Mask Shard #8", - spoiler: "Grubfather: 5 Grubs rescued" - }, - Room_Bretta: { - name: "Mask Shard #9", - spoiler: "Dirtmouth: Bretta's Room, rescue Bretta" - }, - Fungus2_01: { - name: "Mask Shard #10", - spoiler: "Queen's Station, requires Mantis Claw" - }, - Waterways_04b: { - name: "Mask Shard #11", - spoiler: "Royal Waterways" - }, - Fungus1_36: { - name: "Mask Shard #12", - spoiler: "Greenpath: Stone Sanctuary" - }, - Mines_32: { - name: "Mask Shard #13", - spoiler: "Crystal Peak: Enraged Guardian" - }, - Fungus2_25: { - name: "Mask Shard #14", - spoiler: "Deepnest: entrance from Fungal Wastes" - }, - Hive_04: { - name: "Mask Shard #15", - spoiler: "The Hive, use Hive Guardian" - }, - Room_Mansion: { - name: "Mask Shard #16", - spoiler: "Resting Grounds: Delicate Flower" - } - }, - VESSELFRAGMENTS: { - slyVesselFrag1: { - name: "Vessel Fragment #1", - spoiler: "Sly: 550 Geo" - }, - slyVesselFrag2: { - name: "Vessel Fragment #2", - spoiler: "Sly: 900 Geo + Shopkeeper's Key" - }, - dreamReward5: { - name: "Vessel Fragment #3", - spoiler: "Seer: 700 Essence" - }, - vesselFragStagNest: { - name: "Vessel Fragment #4", - spoiler: "Stag Nest" - } - }, - // "Vessel Fragment" sceneData.persistentBoolItems.id - VESSELFRAGMENTS_WORLD: { - Fungus1_13: { - name: "Vessel Fragment #5", - spoiler: "Greenpath: near Queen's Gardens exit" - }, - Crossroads_37: { - name: "Vessel Fragment #6", - spoiler: "Forgotten Crossroads: unlock City of Tears lift" - }, - Ruins2_09: { - name: "Vessel Fragment #7", - spoiler: "Above King's Station" - }, - Deepnest_38: { - name: "Vessel Fragment #8", - spoiler: "Deepnest: Goam platforming challenge" - }, - Abyss_04: { - name: "Vessel Fragment #9", - spoiler: "Ancient Basin Fountain: 3000 Geo" - } - }, - NAILARTS: { - hasDashSlash: { - name: "Great Slash", - spoiler: "Nailmaster Sheo: Greenpath" - }, // this is correct - hasUpwardSlash: { - name: "Dash Slash", - spoiler: "Nailmaster Oro: Kingdom's Edge, 800 Geo" - }, // this is correct - hasCyclone: { - name: "Cyclone Slash", - spoiler: "Nailmaster Mato: Howling Cliffs" - }, - }, - NAILUPGRADES: { - oldNail: { - name: "#0 Old Nail", - spoiler: "Starting Weapon" - }, - sharpenedNail: { - name: "#1 Sharpened Nail", - spoiler: "Nailsmith: 250 Geo" - }, - channeledNail: { - name: "#2 Channeled Nail", - spoiler: "Nailsmith: 800 Geo + 1 Pale Ore" - }, - coiledNail: { - name: "#3 Coiled Nail", - spoiler: "Nailsmith: 2000 Geo + 2 Pale Ore" - }, - pureNail: { - name: "#4 Pure Nail", - spoiler: "Nailsmith: 4000 Geo + 3 Pale Ore" - } - }, - SPELLS: { - vengefulSpirit: { - fireballLevel: 1, - name: "Vengeful Spirit", - spoiler: "Forgotten Crossroads: Ancestral Mound" - }, - shadeSoul: { - fireballLevel: 2, - name: "Shade Soul", - spoiler: "City of Tears: Soul Sanctum + Elegant Key" - }, - desolateDive: { - quakeLevel: 1, - name: "Desolate Dive", - spoiler: "City of Tears: Soul Sanctum" - }, - descendingDark: { - quakeLevel: 2, - name: "Descending Dark", - spoiler: "Crystal Peak: Crystallised Mound" - }, - howlingWraiths: { - screamLevel: 1, - name: "Howling Wraiths", - spoiler: "Fog Canyon: Overgrown Mound" - }, - abyssShriek: { - screamLevel: 2, - name: "Abyss Shriek", - spoiler: "The Abyss" - } - }, - WARRIORDREAMS: { - xeroDefeated: { - name: "Xero", - spoiler: "Resting Grounds" - }, - noEyesDefeated: { - name: "No Eyes", - spoiler: "Greenpath: Stone Sanctuary" - }, - elderHuDefeated: { - name: "Elder Hu", - spoiler: "Fungal Wastes" - }, - aladarSlugDefeated: { - name: "Gorb", - spoiler: "Howling Cliffs" - }, - mumCaterpillarDefeated: { - name: "Marmu", - spoiler: "Queen's Gardens" - }, - galienDefeated: { - name: "Galien", - spoiler: "Deepnest" - }, - markothDefeated: { - name: "Markoth", - spoiler: "Kingdom's Edge, requires Shade Cloak" - }, - }, - GRIMMTROUPE: { - gotCharm_37: { - name: "Charm #37 Sprintmaster", - spoiler: "Sly: 400 Geo + Shopkeeper's Key" - }, - gotCharm_38: { - name: "Charm #38 Dreamshield", - spoiler: "Resting Grounds" - }, - gotCharm_39: { - name: "Charm #39 Weaversong", - spoiler: "Deepnest: Weaver's Den" - }, - gotCharm_40: { - name: "Charm #40 Grimmchild / Carefree Melody", - spoiler: "Dirtmouth" - }, - killedGrimm: { - name: "Troupe Leader Grimm", - spoiler: "Dirtmouth" - } - }, - LIFEBLOOD: { - killedHiveKnight: { - name: "Hive Knight", - spoiler: "The Hive" - } - }, - GODMASTER_DOORS: { - pantheonMaster: { - name: "#1 Pantheon of the Master", - spoiler: "Godhome" - }, - pantheonArtist: { - name: "#2 Pantheon of the Artist", - spoiler: "Godhome" - }, - pantheonSage: { - name: "#3 Pantheon of the Sage", - spoiler: "Godhome" - }, - pantheonKnight: { - name: "#4 Pantheon of the Knight", - spoiler: "Godhome" - } - }, - GODMASTER: { - hasGodfinder: { - name: "Godtuner", - spoiler: "Junk Pit, requires Simple Key" - } - }, - ESSENTIAL: { - grubsCollected: { - name: "Grubs Rescued", - spoiler: "out of 46 total", - max: 46 - }, - dreamOrbs: { - name: "Essence Collected", - spoiler: "Dream Nail (2400 for completion)", - max: 2400 - }, - stationsOpened: { - name: "Stag Stations opened", - spoiler: "out of 10 total", - max: 10 - }, - fountainGeo: { - name: "Geo in Fountain", - spoiler: "Ancient Basin: 3000 Geo maximum", - max: 3000 - }, - slyRescued: { - name: "Sly Rescued", - spoiler: "Forgotten Crossroads, near Gruz Mother" - }, - brettaRescued: { - name: "Bretta Rescued", - spoiler: "Fungal Wastes, near Dashmaster charm statue" - }, - hasLantern: { - name: "Lumafly Lantern", - spoiler: "Sly: 1800 Geo" - }, - shopkeeperKey: { - name: "Shopkeeper's Key", - spoiler: "Crystal Peak" - }, - elegantKey: { - name: "Elegant Key", - spoiler: "Sly: 800 Geo + Shopkeeper's Key" - }, - loveKey: { - name: "Love Key", - spoiler: "Queen's Gardens, near Fungal Wastes" - }, - slySimpleKey: { - name: "Simple Key #1", - spoiler: "Sly: 950 Geo" - }, - simpleKeyCityOfTears: { - name: "Simple Key #2", - spoiler: "City of Tears" - }, - simpleKeyAncientBasin: { - name: "Simple Key #3", - spoiler: "Ancient Basin" - }, - gotLurkerKey: { - name: "Simple Key #4", - spoiler: "Kingdom's Edge: Colosseum of Fools" - }, - paleOreAncientBasin: { - name: "Pale Ore #1", - spoiler: "Ancient Basin" - }, - paleOreSeer: { - name: "Pale Ore #2", - spoiler: "Seer: 300 Essence" - }, - paleOreCrystalPeak: { - name: "Pale Ore #3", - spoiler: "Crystal Peak: Hallownest's Crown" - }, - paleOreDeepnest: { - name: "Pale Ore #4", - spoiler: "Deepnest, Nosk reward" - }, - paleOreGrubfather: { - name: "Pale Ore #5", - spoiler: "Grubfather: 31 Grubs rescued" - }, - paleOreColosseum: { - name: "Pale Ore #6", - spoiler: "Colosseum of Fools: Trial of the Conqueror" - }, - hasTramPass: { - name: "Tram Pass", - spoiler: "Deepnest, Failed Tramway" - }, - nightmareLanternLit: { - name: "Nightmare Lantern Lit", - spoiler: "Howling Cliffs, corpse of a large bug" - } - }, - GRUBS_LIST: ["Crossroads_35", "Crossroads_03", "Crossroads_05", "Crossroads_48", "Crossroads_31", "Fungus1_06", "Fungus1_07", "Fungus1_21", "Fungus1_28", "Fungus2_18", "Ruins1_05", "Mines_04", "Mines_03", "Mines_31", "Mines_19", "Ruins1_32", "RestingGrounds_10", "Ruins_House_01", "Mines_35", "Mines_16", "Waterways_04", "Waterways_13", "Abyss_19", "Abyss_17", "Mines_24", "Fungus1_13", "Fungus3_47", "Fungus3_10", "Fungus3_48", "Fungus3_22", "Ruins2_07", "Ruins2_11_1", "Ruins2_11_2", "Ruins2_11_3", "Deepnest_East_11", "Deepnest_East_14", "Fungus2_20", "Ruins2_03", "Deepnest_36", "Deepnest_03", "Deepnest_31", "Deepnest_39", "Deepnest_Spider_Town", "Waterways_14", "Hive_03", "Hive_04"], - ACHIEVEMENTS: { - areaMaps: { - name: "Area Maps", - spoiler: "Cornifer and Iselda (out of 13)", - max: 13, - list: [ - "mapCrossroads", "mapGreenpath", "mapFogCanyon", "mapRoyalGardens", "mapFungalWastes", "mapCity", "mapWaterways", "mapMines", "mapDeepnest", "mapCliffs", "mapOutskirts", "mapRestingGrounds", "mapAbyss" - ] - }, - journalEntriesCompleted: { - name: "Creatures Encountered", - spoiler: "Hunter's Journal (164 max)", - max: 164 - }, - journalNotesCompleted: { - name: "Hunter Notes Completed", - spoiler: "Hunter's Journal (164 max)", - max: 164 - }, - hasJournal: { - name: "Hunter's Journal", - spoiler: "Greenpath: Hunter" - }, - hasHuntersMark: { - name: "Hunter's Mark", - spoiler: "Greenpath: Hunter" - }, - killedPrayerSlug: { - name: "Journal: Maggot", - spoiler: "Forgotten Crossroads: False Knight secret room" - }, - killedOrangeScuttler: { - name: "Journal: Lightseed", - spoiler: "Infected Crossroads" - }, - killedPigeon: { - name: "Journal: Maskfly", - spoiler: "Greenpath, Queen's Gardens" - }, - killedLazyFlyer: { - name: "Journal: Aluba", - spoiler: "Lake of Unn, Queen's Gardens (near White Lady)" - }, - killedAcidFlyer: { - name: "Journal: Duranda", - spoiler: "Greenpath: Nailmaster Sheo's tent path" - }, - killedAcidWalker: { - name: "Journal: Durandoo", - spoiler: "Greenpath, Queen's Gardens" - }, - killedPlantShooter: { - name: "Journal: Gulka", - spoiler: "Greenpath: west of Stone Sanctuary" - }, - killedMushroomTurret: { - name: "Journal: Sporg", - spoiler: "Fungal Wastes" - }, - killedZapBug: { - name: "Journal: Charged Lumafly", - spoiler: "Fog Canyon: Teacher's Archives (tank)" - }, - killedCrystalCrawler: { - name: "Journal: Crystal Crawler", - spoiler: "Crystal Peak" - }, - killedGorgeousHusk: { - name: "Journal: Gorgeous Husk", - spoiler: "City of Tears: secret room" - }, - killedWorm: { - name: "Journal: Goam", - spoiler: "Infected Crossroads: near Fungal Wastes entrance" - }, - killedBigCentipede: { - name: "Journal: Garpede", - spoiler: "Deepnest: east of Hot Spring" - }, - killedAbyssTendril: { - name: "Journal: Void Tendrils", - spoiler: "The Abyss: secret room" - }, - killedPaleLurker: { - name: "Journal: Pale Lurker", - spoiler: "Colosseum of Fools: secret area" - }, - falseKnightDreamDefeated: { - name: "Failed Champion", - spoiler: "Forgotten Crossroads" - }, - mageLordDreamDefeated: { - name: "Soul Tyrant", - spoiler: "City of Tears: Soul Sanctum" - }, - infectedKnightDreamDefeated: { - name: "Lost Kin", - spoiler: "Ancient Basin" - }, - whiteDefenderDefeated: { - name: "White Defender", - spoiler: "Royal Waterways" - }, - greyPrinceDefeated: { - name: "Grey Prince Zote", - spoiler: "Dirtmouth: Bretta's Room (per save choice)" - }, - killedHollowKnight: { - name: "Hollow Knight", - spoiler: "Forgotten Crossroads: Black Egg Temple" - }, - salubraBlessing: { - name: "Salubra's Blessing", - spoiler: "Salubra: 800 Geo + all 40 Charms found" - }, - gotShadeCharm: { - name: "Void Heart", - spoiler: "Kingsoul + Birthplace" - }, - killedFinalBoss: { - name: "Radiance", - spoiler: "Forgotten Crossroads: Black Egg Temple" - }, - bossDoorStateTier5: { - name: "Embrace the Void", - spoiler: "Godhome: Pantheon of Hallownest" - }, - zoteDead: { - name: "Optimal Zote", - spoiler: "Neglect achievement (per save choice)" - }, - nailsmithSpared: { - name: "Optimal Nailsmith", - spoiler: "Happy Couple achievement (per save choice)" - }, - }, - STATISTICS: { - nailDamage: { - name: "Nail Damage", - spoiler: "Nailsmith upgrades, City of Tears", - max: 21 - }, - charmSlots: { - name: "Charm Notches", - spoiler: "out of 11 total", - max: 11 - }, - whisperingRoots: { - name: "Whispering Roots completed", - spoiler: "Dream Nail (out of 15)", - max: 15 - }, - relicsWandererJournal: { - name: "Relic #1 found total", - nameHeld: "trinket1", - nameSold: "soldTrinket1", - spoiler: "Wanderer's Journal (out of 14)", - max: 14, - }, - relicsHallownestSeal: { - name: "Relic #2 found total", - nameHeld: "trinket2", - nameSold: "soldTrinket2", - spoiler: "Hallownest Seal (out of 17)", - max: 17, - }, - relicsKingsIdol: { - name: "Relic #3 found total", - nameHeld: "trinket3", - nameSold: "soldTrinket3", - spoiler: "King's Idol (out of 8)", - max: 8, - }, - relicsArcaneEgg: { - name: "Relic #4 found total", - nameHeld: "trinket4", - nameSold: "soldTrinket4", - spoiler: "Arcane Egg (4 max, 1 missable)", - max: 4, - }, - geoRocks: { - name: "Geo Rocks", - spoiler: "Unbroken/Broken/Discovered Total" - }, - geoPool: { - name: "Shade Geo", - spoiler: "Amount of Geo the Shade is currently holding", - min: 0 - }, // not ghostCoins - rancidEggs: { - name: "Rancid Eggs", - spoiler: "Find: Hallownest, Buy: Sly, Tuk" - }, - xunFlowerBrokeTimes: { - name: "Delicate Flowers broken", - spoiler: "Resting Grounds: Grey Mourner" - }, - notchShroomOgres: { - name: "Charm Notch #1", - spoiler: "Fungal Wastes: Shroom Ogres room" - }, - salubraNotch1: { - name: "Charm Notch #2", - spoiler: "Salubra: 120 Geo + 5 Charms found" - }, - salubraNotch2: { - name: "Charm Notch #3", - spoiler: "Salubra: 500 Geo + 10 Charms found" - }, - salubraNotch3: { - name: "Charm Notch #4", - spoiler: "Salubra: 900 Geo + 18 Charms found" - }, - salubraNotch4: { - name: "Charm Notch #5", - spoiler: "Salubra: 1400 Geo + 25 Charms found" - }, - colosseumBronzeCompleted: { - name: "Charm Notch #6", - spoiler: "Colosseum of Fools: Trial of the Warrior" - }, - notchFogCanyon: { - name: "Charm Notch #7", - spoiler: "Fog Canyon: explosive eggs room" - }, - gotGrimmNotch: { - name: "Charm Notch #8", - spoiler: "Dirtmouth: Troupe Leader Grimm" - }, - hasDreamGate: { - name: "Dream Gate", - spoiler: "Seer: 900 Essence" - }, - fragileGreed_unbreakable: { - name: "Unbreakable Greed", - spoiler: "Divine: Fragile Greed + 9000 Geo" - }, - fragileHealth_unbreakable: { - name: "Unbreakable Heart", - spoiler: "Divine: Fragile Heart + 12000 Geo" - }, - fragileStrength_unbreakable: { - name: "Unbreakable Strength", - spoiler: "Divine: Fragile Strength + 15000 Geo" - }, - killedMenderBug: { - name: "Journal: Menderbug", - spoiler: "Forgotten Crossroads + destroy sign" - }, - killedBindingSeal: { - name: "Journal: Seal of Binding", - spoiler: "White Palace: Path of Pain completion" - }, - killedGodseekerMask: { - name: "Journal: Weathered Mask", - spoiler: "Godhome: Land of Storms" - }, - killedVoidIdol_1: { - name: "Journal: Void Idol Attuned", - spoiler: "Godhome: Hall of Gods, defeat all" - }, - killedVoidIdol_2: { - name: "Journal: Void Idol Ascended", - spoiler: "Godhome: Hall of Gods, defeat all" - }, - killedVoidIdol_3: { - name: "Journal: Void Idol Radiant", - spoiler: "Godhome: Hall of Gods, defeat all" - }, - whiteDefenderDefeats: { - name: "White Defender times defeated", - spoiler: "Royal Waterways (5 max)", - max: 5 - }, - greyPrinceDefeats: { - name: "Grey Prince Zote times defeated", - spoiler: "Dirtmouth (10 max)", - max: 10 - }, - whitePalaceSecretRoomVisited: { - name: "White Palace Secret Room visited", - spoiler: "Help identify this room!" - }, - killsBindingSeal: { - name: "Path of Pain", - spoiler: "White Palace: main secret area" - }, - } -}; - -export default HK; \ No newline at end of file diff --git a/src/js/hk-database.js b/src/js/hk-database.js index 2b3850c..5e34939 100644 --- a/src/js/hk-database.js +++ b/src/js/hk-database.js @@ -3,456 +3,1119 @@ This is the whole database for the tool, based on the .json save file data */ -const DIV_ID = { - intro: { - h2: "Game Status", - id: "hk-intro", - maxPercent: 112 +const HK = { + DIV_ID: { + intro: { + h2: "Game Status", + id: "hk-intro", + maxPercent: 112 + }, + hints: { + h2: "My friend Elderbug once told me about...", + id: "hk-hints", + }, + bosses: { + h2: "Bosses", + id: "hk-bosses", + percent: 0, + maxPercent: 14 + }, + charms: { + h2: "Charms", + id: "hk-charms", + percent: 0, + maxPercent: 36 + }, + equipment: { + h2: "Equipment", + id: "hk-equipment", + percent: 0, + maxPercent: 14 + }, + nailUpgrades: { + h2: "Nail Upgrades", + id: "hk-nailupgrades", + percent: 0, + maxPercent: 4 + }, + nailArts: { + h2: "Nail Arts", + id: "hk-nailarts", + percent: 0, + maxPercent: 3 + }, + spells: { + h2: "Spells", + id: "hk-spells", + percent: 0, + maxPercent: 6 + }, + maskShards: { + h2: "Mask Shards", + id: "hk-maskshards", + percent: 0, + maxPercent: 4 + }, + vesselFragments: { + h2: "Vessel Fragments", + id: "hk-vesselfragments", + percent: 0, + maxPercent: 3 + }, + dreamNail: { + h2: "Dream Nail and Essence", + id: "hk-dreamnail", + percent: 0, + maxPercent: 3 + }, + warriorDreams: { + h2: "Warrior Dreams", + id: "hk-warriordreams", + percent: 0, + maxPercent: 7 + }, + dreamers: { + h2: "Dreamers", + id: "hk-dreamers", + percent: 0, + maxPercent: 3 + }, + colosseum: { + h2: "Colosseum of Fools", + id: "hk-colosseum", + percent: 0, + maxPercent: 3 + }, + grimmTroupe: { + h2: "Grimm Troupe Content Pack", + id: "hk-grimmtroupe", + percent: 0, + maxPercent: 6 + }, + lifeblood: { + h2: "Lifeblood Content Pack", + id: "hk-lifeblood", + percent: 0, + maxPercent: 1 + }, + godmaster: { + h2: "Godmaster Content Pack", + id: "hk-godmaster", + percent: 0, + maxPercent: 5 + }, + essential: { + h2: "Game Completion Essentials", + id: "hk-essential" + }, + achievements: { + h2: "Achievements Essentials", + id: "hk-achievements" + }, + statistics: { + h2: "Game Statistics", + id: "hk-statistics" + } }, - hints: { - h2: "My friend Elderbug once told me about...", - id: "hk-hints", + // hk-hints + HINTS: { + fireballLevel: { + spoiler: "...a mysterious shaman living in a dwelling below the town of Dirtmouth" + }, + hornet1Defeated: { + spoiler: "...a skilled protector guarding ruins in a lush green forest" + }, + hasDash: { + spoiler: "...an old cloak lying on a green path near a broken shell" + }, + hasWalljump: { + spoiler: "...a sharp claw lying forgotten somewhere amidst the insect village" + }, + Crossroads_04: { + spoiler: "...a mother sleeping peacefully below the town of Dirtmouth" + }, + slyRescued: { + spoiler: "...a fellow town bug who seems to be lost somewhere in the crossroads" + }, + hasLantern: { + spoiler: "...a precious item able to carry some light to even the darkest places" + }, + hasSuperDash: { + spoiler: "...some powerful crystal beating somewhere deep inside the mines" + }, + hasDreamNail: { + spoiler: "...a weapon from a dream world only found where the souls can peacefully rest" + }, + killedInfectedKnight: { + spoiler: "...a shattered corpse forgotten in a windy cave in the ancient depths below the city" + }, + hasDoubleJump: { + spoiler: "...something incredibly light dropped by a monarchfly in the ancient depths below the city" + }, + killedBlackKnight: { + spoiler: "...discarded shells of black guards lying on the floor of a high spire" + }, + lurienDefeated: { + spoiler: "...a dreamer sleeping somewhere at the top of a high spire" + }, + dungDefenderOrHornet2: { + spoiler: "...a skilled combatant living at the heart of the sewers or watching over a shell amidst ash falling from the sky" + }, + ismaTearOrShadeCloak: { + spoiler: "...something precious in a grove accessed from the waterways or a massive royal door guarding a cloak behind the darkness" + }, + defeatedMegaJelly: { + spoiler: "...an intelligent being floating inside hidden archives behind the fog" + }, + monomonDefeated: { + spoiler: "...a dreamer sleeping somewhere hidden in a foggy area" + }, + hegemolDefeated: { + spoiler: "...a dreamer sleeping near a spider nest area" + }, + killedHollowKnight: { + spoiler: "...a disturbance inside a black temple" + }, }, - bosses: { - h2: "Bosses", - id: "hk-bosses", - percent: 0, - maxPercent: 14 + // hk-bosses + BOSSES: { + falseKnightDefeated: { + name: "False Knight", + spoiler: "Forgotten Crossroads", + wiki: "False_Knight" + }, // "Battle Scene" - "Crossroads_10" ? + hornet1Defeated: { + name: "Hornet Protector", + spoiler: "Greenpath", + wiki: "Hornet_Protector" + }, + defeatedDungDefender: { + name: "Dung Defender", + spoiler: "Royal Waterways", + wiki: "Dung_Defender" + }, + mageLordDefeated: { + name: "Soul Master", + spoiler: "City of Tears: Soul Sanctum", + wiki: "Soul_Master" + }, + killedBlackKnight: { + name: "Watcher Knights", + spoiler: "City of Tears: Watcher's Spire", + wiki: "Watcher_Knight" + }, + collectorDefeated: { + name: "The Collector", + spoiler: "City of Tears: Tower of Love", + wiki: "Collector" + }, + defeatedMantisLords: { + name: "Mantis Lords", + spoiler: "Mantis Village", + wiki: "Mantis_Lords" + }, + defeatedMegaJelly: { + name: "Uumuu", + spoiler: "Fog Canyon: Teacher's Archives", + wiki: "Uumuu" + }, + hornetOutskirtsDefeated: { + name: "Hornet Sentinel", + spoiler: "Kingdom's Edge", + wiki: "Hornet_Sentinel" + }, + killedInfectedKnight: { + name: "Broken Vessel", + spoiler: "Ancient Basin", + wiki: "Broken_Vessel" + }, + killedMimicSpider: { + name: "Nosk", + spoiler: "Deepnest", + wiki: "Nosk" + }, // "Battle Scene" - "Deepnest_32" ? + killedTraitorLord: { + name: "Traitor Lord", + spoiler: "Queen's Gardens", + wiki: "Traitor_Lord" + } // "Battle Scene" - "Fungus3_23" ? }, - charms: { - h2: "Charms", - id: "hk-charms", - percent: 0, - maxPercent: 36 + // hk-bosses + // "Battle Scene" sceneData.persistentBoolItems.id + BOSSES_WORLD: { + Crossroads_04: { + name: "Gruz Mother", + spoiler: "Forgotten Crossroads", + wiki: "Gruz_Mother" + }, // killedBigFly + Crossroads_09: { + name: "Brooding Mawlek", + spoiler: "Forgotten Crossroads", + wiki: "Brooding_Mawlek" + } // killedMawlek }, - equipment: { - h2: "Equipment", - id: "hk-equipment", - percent: 0, - maxPercent: 14 + // reference: https://radiance.host/apidocs/Charms.html + CHARMS: { + gotCharm_1: { + name: "#1 Gathering Swarm", + spoiler: "Sly: 300 Geo" + }, // 1 + gotCharm_2: { + name: "#2 Wayward Compass", + spoiler: "Iselda: 220 Geo" + }, // 1 + gotCharm_3: { + name: "#3 Grubsong", + spoiler: "Grubfather: 10 Grubs rescued" + }, // 1 + gotCharm_4: { + name: "#4 Stalwart Shell", + spoiler: "Sly: 200 Geo" + }, // 2 + gotCharm_5: { + name: "#5 Baldur Shell", + spoiler: "Howling Cliffs" + }, // 2 + gotCharm_6: { + name: "#6 Fury of the Fallen", + spoiler: "King's Pass" + }, // 2 + gotCharm_7: { + name: "#7 Quick Focus", + spoiler: "Salubra: 800 Geo" + }, // 3 + gotCharm_8: { + name: "#8 Lifeblood Heart", + spoiler: "Salubra: 250 Geo" + }, // 2 + gotCharm_9: { + name: "#9 Lifeblood Core", + spoiler: "The Abyss: 15 Lifeblood masks" + }, // 3 + gotCharm_10: { + name: "#10 Defender's Crest", + spoiler: "Royal Waterways" + }, // 1 + gotCharm_11: { + name: "#11 Flukenest", + spoiler: "Royal Waterways" + }, // 3 + gotCharm_12: { + name: "#12 Thorns of Agony", + spoiler: "Greenpath" + }, // 1 + gotCharm_13: { + name: "#13 Mark of Pride", + spoiler: "Mantis Village" + }, // 3 + gotCharm_14: { + name: "#14 Steady Body", + spoiler: "Salubra: 120 Geo" + }, // 1 + gotCharm_15: { + name: "#15 Heavy Blow", + spoiler: "Sly: 350 Geo + Shopkeeper's Key" + }, // 2 + gotCharm_16: { + name: "#16 Sharp Shadow", + spoiler: "Deepnest" + }, // 2 + gotCharm_17: { + name: "#17 Spore Shroom", + spoiler: "Fungal Wastes" + }, // 1 + gotCharm_18: { + name: "#18 Longnail", + spoiler: "Salubra: 300 Geo" + }, // 2 + gotCharm_19: { + name: "#19 Shaman Stone", + spoiler: "Salubra: 220 Geo" + }, // 3 + gotCharm_20: { + name: "#20 Soul Catcher", + spoiler: "Forgotten Crossroads: Ancestral Mound" + }, // 2 + gotCharm_21: { + name: "#21 Soul Eater", + spoiler: "Resting Grounds" + }, // 4 + gotCharm_22: { + name: "#22 Glowing Womb", + spoiler: "Forgotten Crossroads" + }, // 2 + gotCharm_23: { + name: "#23 Fragile Heart", + spoiler: "Leg Eater: 350/280 Geo" + }, // 2 + gotCharm_24: { + name: "#24 Fragile Greed", + spoiler: "Leg Eater: 250/200 Geo" + }, // 2 + gotCharm_25: { + name: "#25 Fragile Strength", + spoiler: "Leg Eater: 600/480 Geo" + }, // 3 + gotCharm_26: { + name: "#26 Nailmaster’s Glory", + spoiler: "Sly: All Nail Arts" + }, // 1 + gotCharm_27: { + name: "#27 Joni’s Blessing", + spoiler: "Howling Cliffs: Joni's Repose" + }, // 4 + gotCharm_28: { + name: "#28 Shape of Unn", + spoiler: "Greenpath: Lake of Unn" + }, // 2 + gotCharm_29: { + name: "#29 Hiveblood", + spoiler: "The Hive" + }, // 4 + gotCharm_30: { + name: "#30 Dream Wielder", + spoiler: "Seer: 500 Essence" + }, // 1 + gotCharm_31: { + name: "#31 Dashmaster", + spoiler: "Fungal Wastes" + }, // 2 + gotCharm_32: { + name: "#32 Quick Slash", + spoiler: "Kingdom's Edge" + }, // 3 + gotCharm_33: { + name: "#33 Spell Twister", + spoiler: "City of Tears: Soul Sanctum" + }, // 2 + gotCharm_34: { + name: "#34 Deep Focus", + spoiler: "Crystal Peak" + }, // 4 + gotCharm_35: { + name: "#35 Grubberfly’s Elegy", + spoiler: "Grubfather: 46 Grubs rescued" + }, // 3 + gotCharm_36: { + name: "#36 Kingsoul", + spoiler: "Queen's Gardens + Ancient Basin" + }, // 5 }, - nailUpgrades: { - h2: "Nail Upgrades", - id: "hk-nailupgrades", - percent: 0, - maxPercent: 4 + COLOSSEUM: { + colosseumBronzeCompleted: { + name: "Trial of the Warrior", + spoiler: "Little Fool: 100 Geo" + }, + colosseumSilverCompleted: { + name: "Trial of the Conqueror", + spoiler: "Little Fool: 450 Geo + Warrior completed" + }, + colosseumGoldCompleted: { + name: "Trial of the Fool", + spoiler: "Little Fool: 800 Geo + Conqueror completed" + }, }, - nailArts: { - h2: "Nail Arts", - id: "hk-nailarts", - percent: 0, - maxPercent: 3 + DREAMERS: { + lurienDefeated: { + name: "Lurien the Watcher", + spoiler: "City of Tears: Watcher's Spire" + }, + monomonDefeated: { + name: "Monomon the Teacher", + spoiler: "Fog Canyon: Teacher's Archives" + }, + hegemolDefeated: { + name: "Herrah the Beast", + spoiler: "Deepnest: Distant Village" + } }, - spells: { - h2: "Spells", - id: "hk-spells", - percent: 0, - maxPercent: 6 + DREAMNAIL: { + hasDreamNail: { + name: "Dream Nail acquired", + spoiler: "Resting Grounds" + }, + dreamNailUpgraded: { + name: "Awoken Dream Nail", + spoiler: "Seer: 1800 Essence" + }, + mothDeparted: { + name: "Hear the Seer's final words", + spoiler: "Seer: 2400 Essence" + } }, - maskShards: { - h2: "Mask Shards", - id: "hk-maskshards", - percent: 0, - maxPercent: 4 + EQUIPMENT: { + hasDash: { + name: "Mothwing Cloak", + spoiler: "Greenpath: Dash ability" + }, + hasWalljump: { + name: "Mantis Claw", + spoiler: "Mantis Village: Wall Jump ability" + }, + hasSuperDash: { + name: "Crystal Heart", + spoiler: "Crystal Peak: Super Dash ability" + }, + hasDoubleJump: { + name: "Monarch Wings", + spoiler: "Ancient Basin: Double Jump ability" + }, + hasAcidArmour: { + name: "Isma's Tear", + spoiler: "Royal Waterways: Acid Armour ability" + }, + hasKingsBrand: { + name: "King's Brand", + spoiler: "Kingdom's Edge" + }, + hasShadowDash: { + name: "Shade Cloak", + spoiler: "The Abyss: Shadow Dash ability" + } }, - vesselFragments: { - h2: "Vessel Fragments", - id: "hk-vesselfragments", - percent: 0, - maxPercent: 3 + MASKSHARDS: { + slyShellFrag1: { + name: "Mask Shard #1", + spoiler: "Sly: 150 Geo" + }, + slyShellFrag2: { + name: "Mask Shard #2", + spoiler: "Sly: 500 Geo" + }, + slyShellFrag3: { + name: "Mask Shard #3", + spoiler: "Sly: 800 Geo + Shopkeeper's Key" + }, + slyShellFrag4: { + name: "Mask Shard #4", + spoiler: "Sly: 1500 Geo + Shopkeeper's Key" + }, + dreamReward7: { + name: "Mask Shard #5", + spoiler: "Seer: 1500 Essence" + } }, - dreamNail: { - h2: "Dream Nail and Essence", - id: "hk-dreamnail", - percent: 0, - maxPercent: 3 + // "Heart Piece" sceneData.persistentBoolItems.id + MASKSHARDS_WORLD: { + Crossroads_13: { + name: "Mask Shard #6", + spoiler: "Forgotten Crossroads: below Hot Springs" + }, + Crossroads_09: { + name: "Mask Shard #7", + spoiler: "Forgotten Crossroads: Brooding Mawlek" + }, + Crossroads_38: { + name: "Mask Shard #8", + spoiler: "Grubfather: 5 Grubs rescued" + }, + Room_Bretta: { + name: "Mask Shard #9", + spoiler: "Dirtmouth: Bretta's Room, rescue Bretta" + }, + Fungus2_01: { + name: "Mask Shard #10", + spoiler: "Queen's Station, requires Mantis Claw" + }, + Waterways_04b: { + name: "Mask Shard #11", + spoiler: "Royal Waterways" + }, + Fungus1_36: { + name: "Mask Shard #12", + spoiler: "Greenpath: Stone Sanctuary" + }, + Mines_32: { + name: "Mask Shard #13", + spoiler: "Crystal Peak: Enraged Guardian" + }, + Fungus2_25: { + name: "Mask Shard #14", + spoiler: "Deepnest: entrance from Fungal Wastes" + }, + Hive_04: { + name: "Mask Shard #15", + spoiler: "The Hive, use Hive Guardian" + }, + Room_Mansion: { + name: "Mask Shard #16", + spoiler: "Resting Grounds: Delicate Flower" + } }, - warriorDreams: { - h2: "Warrior Dreams", - id: "hk-warriordreams", - percent: 0, - maxPercent: 7 + VESSELFRAGMENTS: { + slyVesselFrag1: { + name: "Vessel Fragment #1", + spoiler: "Sly: 550 Geo" + }, + slyVesselFrag2: { + name: "Vessel Fragment #2", + spoiler: "Sly: 900 Geo + Shopkeeper's Key" + }, + dreamReward5: { + name: "Vessel Fragment #3", + spoiler: "Seer: 700 Essence" + }, + vesselFragStagNest: { + name: "Vessel Fragment #4", + spoiler: "Stag Nest" + } }, - dreamers: { - h2: "Dreamers", - id: "hk-dreamers", - percent: 0, - maxPercent: 3 + // "Vessel Fragment" sceneData.persistentBoolItems.id + VESSELFRAGMENTS_WORLD: { + Fungus1_13: { + name: "Vessel Fragment #5", + spoiler: "Greenpath: near Queen's Gardens exit" + }, + Crossroads_37: { + name: "Vessel Fragment #6", + spoiler: "Forgotten Crossroads: unlock City of Tears lift" + }, + Ruins2_09: { + name: "Vessel Fragment #7", + spoiler: "Above King's Station" + }, + Deepnest_38: { + name: "Vessel Fragment #8", + spoiler: "Deepnest: Goam platforming challenge" + }, + Abyss_04: { + name: "Vessel Fragment #9", + spoiler: "Ancient Basin Fountain: 3000 Geo" + } }, - colosseum: { - h2: "Colosseum of Fools", - id: "hk-colosseum", - percent: 0, - maxPercent: 3 + NAILARTS: { + hasDashSlash: { + name: "Great Slash", + spoiler: "Nailmaster Sheo: Greenpath" + }, // this is correct + hasUpwardSlash: { + name: "Dash Slash", + spoiler: "Nailmaster Oro: Kingdom's Edge, 800 Geo" + }, // this is correct + hasCyclone: { + name: "Cyclone Slash", + spoiler: "Nailmaster Mato: Howling Cliffs" + }, }, - grimmTroupe: { - h2: "Grimm Troupe Content Pack", - id: "hk-grimmtroupe", - percent: 0, - maxPercent: 6 + NAILUPGRADES: { + oldNail: { + name: "#0 Old Nail", + spoiler: "Starting Weapon" + }, + sharpenedNail: { + name: "#1 Sharpened Nail", + spoiler: "Nailsmith: 250 Geo" + }, + channeledNail: { + name: "#2 Channeled Nail", + spoiler: "Nailsmith: 800 Geo + 1 Pale Ore" + }, + coiledNail: { + name: "#3 Coiled Nail", + spoiler: "Nailsmith: 2000 Geo + 2 Pale Ore" + }, + pureNail: { + name: "#4 Pure Nail", + spoiler: "Nailsmith: 4000 Geo + 3 Pale Ore" + } }, - lifeblood: { - h2: "Lifeblood Content Pack", - id: "hk-lifeblood", - percent: 0, - maxPercent: 1 + SPELLS: { + vengefulSpirit: { + fireballLevel: 1, + name: "Vengeful Spirit", + spoiler: "Forgotten Crossroads: Ancestral Mound" + }, + shadeSoul: { + fireballLevel: 2, + name: "Shade Soul", + spoiler: "City of Tears: Soul Sanctum + Elegant Key" + }, + desolateDive: { + quakeLevel: 1, + name: "Desolate Dive", + spoiler: "City of Tears: Soul Sanctum" + }, + descendingDark: { + quakeLevel: 2, + name: "Descending Dark", + spoiler: "Crystal Peak: Crystallised Mound" + }, + howlingWraiths: { + screamLevel: 1, + name: "Howling Wraiths", + spoiler: "Fog Canyon: Overgrown Mound" + }, + abyssShriek: { + screamLevel: 2, + name: "Abyss Shriek", + spoiler: "The Abyss" + } }, - godmaster: { - h2: "Godmaster Content Pack", - id: "hk-godmaster", - percent: 0, - maxPercent: 5 + WARRIORDREAMS: { + xeroDefeated: { + name: "Xero", + spoiler: "Resting Grounds" + }, + noEyesDefeated: { + name: "No Eyes", + spoiler: "Greenpath: Stone Sanctuary" + }, + elderHuDefeated: { + name: "Elder Hu", + spoiler: "Fungal Wastes" + }, + aladarSlugDefeated: { + name: "Gorb", + spoiler: "Howling Cliffs" + }, + mumCaterpillarDefeated: { + name: "Marmu", + spoiler: "Queen's Gardens" + }, + galienDefeated: { + name: "Galien", + spoiler: "Deepnest" + }, + markothDefeated: { + name: "Markoth", + spoiler: "Kingdom's Edge, requires Shade Cloak" + }, }, - essential: { - h2: "Game Completion Essentials", - id: "hk-essential" + GRIMMTROUPE: { + gotCharm_37: { + name: "Charm #37 Sprintmaster", + spoiler: "Sly: 400 Geo + Shopkeeper's Key" + }, + gotCharm_38: { + name: "Charm #38 Dreamshield", + spoiler: "Resting Grounds" + }, + gotCharm_39: { + name: "Charm #39 Weaversong", + spoiler: "Deepnest: Weaver's Den" + }, + gotCharm_40: { + name: "Charm #40 Grimmchild / Carefree Melody", + spoiler: "Dirtmouth" + }, + killedGrimm: { + name: "Troupe Leader Grimm", + spoiler: "Dirtmouth" + } }, - achievements: { - h2: "Achievements Essentials", - id: "hk-achievements" + LIFEBLOOD: { + killedHiveKnight: { + name: "Hive Knight", + spoiler: "The Hive" + } }, - statistics: { - h2: "Game Statistics", - id: "hk-statistics" + GODMASTER_DOORS: { + pantheonMaster: { + name: "#1 Pantheon of the Master", + spoiler: "Godhome" + }, + pantheonArtist: { + name: "#2 Pantheon of the Artist", + spoiler: "Godhome" + }, + pantheonSage: { + name: "#3 Pantheon of the Sage", + spoiler: "Godhome" + }, + pantheonKnight: { + name: "#4 Pantheon of the Knight", + spoiler: "Godhome" + } + }, + GODMASTER: { + hasGodfinder: { + name: "Godtuner", + spoiler: "Junk Pit, requires Simple Key" + } + }, + ESSENTIAL: { + grubsCollected: { + name: "Grubs Rescued", + spoiler: "out of 46 total", + max: 46 + }, + dreamOrbs: { + name: "Essence Collected", + spoiler: "Dream Nail (2400 for completion)", + max: 2400 + }, + stationsOpened: { + name: "Stag Stations opened", + spoiler: "out of 10 total", + max: 10 + }, + fountainGeo: { + name: "Geo in Fountain", + spoiler: "Ancient Basin: 3000 Geo maximum", + max: 3000 + }, + slyRescued: { + name: "Sly Rescued", + spoiler: "Forgotten Crossroads, near Gruz Mother" + }, + brettaRescued: { + name: "Bretta Rescued", + spoiler: "Fungal Wastes, near Dashmaster charm statue" + }, + hasLantern: { + name: "Lumafly Lantern", + spoiler: "Sly: 1800 Geo" + }, + shopkeeperKey: { + name: "Shopkeeper's Key", + spoiler: "Crystal Peak" + }, + elegantKey: { + name: "Elegant Key", + spoiler: "Sly: 800 Geo + Shopkeeper's Key" + }, + loveKey: { + name: "Love Key", + spoiler: "Queen's Gardens, near Fungal Wastes" + }, + slySimpleKey: { + name: "Simple Key #1", + spoiler: "Sly: 950 Geo" + }, + simpleKeyCityOfTears: { + name: "Simple Key #2", + spoiler: "City of Tears" + }, + simpleKeyAncientBasin: { + name: "Simple Key #3", + spoiler: "Ancient Basin" + }, + gotLurkerKey: { + name: "Simple Key #4", + spoiler: "Kingdom's Edge: Colosseum of Fools" + }, + paleOreAncientBasin: { + name: "Pale Ore #1", + spoiler: "Ancient Basin" + }, + paleOreSeer: { + name: "Pale Ore #2", + spoiler: "Seer: 300 Essence" + }, + paleOreCrystalPeak: { + name: "Pale Ore #3", + spoiler: "Crystal Peak: Hallownest's Crown" + }, + paleOreDeepnest: { + name: "Pale Ore #4", + spoiler: "Deepnest, Nosk reward" + }, + paleOreGrubfather: { + name: "Pale Ore #5", + spoiler: "Grubfather: 31 Grubs rescued" + }, + paleOreColosseum: { + name: "Pale Ore #6", + spoiler: "Colosseum of Fools: Trial of the Conqueror" + }, + hasTramPass: { + name: "Tram Pass", + spoiler: "Deepnest, Failed Tramway" + }, + nightmareLanternLit: { + name: "Nightmare Lantern Lit", + spoiler: "Howling Cliffs, corpse of a large bug" + } + }, + GRUBS_LIST: ["Crossroads_35", "Crossroads_03", "Crossroads_05", "Crossroads_48", "Crossroads_31", "Fungus1_06", "Fungus1_07", "Fungus1_21", "Fungus1_28", "Fungus2_18", "Ruins1_05", "Mines_04", "Mines_03", "Mines_31", "Mines_19", "Ruins1_32", "RestingGrounds_10", "Ruins_House_01", "Mines_35", "Mines_16", "Waterways_04", "Waterways_13", "Abyss_19", "Abyss_17", "Mines_24", "Fungus1_13", "Fungus3_47", "Fungus3_10", "Fungus3_48", "Fungus3_22", "Ruins2_07", "Ruins2_11_1", "Ruins2_11_2", "Ruins2_11_3", "Deepnest_East_11", "Deepnest_East_14", "Fungus2_20", "Ruins2_03", "Deepnest_36", "Deepnest_03", "Deepnest_31", "Deepnest_39", "Deepnest_Spider_Town", "Waterways_14", "Hive_03", "Hive_04"], + ACHIEVEMENTS: { + areaMaps: { + name: "Area Maps", + spoiler: "Cornifer and Iselda (out of 13)", + max: 13, + list: [ + "mapCrossroads", "mapGreenpath", "mapFogCanyon", "mapRoyalGardens", "mapFungalWastes", "mapCity", "mapWaterways", "mapMines", "mapDeepnest", "mapCliffs", "mapOutskirts", "mapRestingGrounds", "mapAbyss" + ] + }, + journalEntriesCompleted: { + name: "Creatures Encountered", + spoiler: "Hunter's Journal (164 max)", + max: 164 + }, + journalNotesCompleted: { + name: "Hunter Notes Completed", + spoiler: "Hunter's Journal (164 max)", + max: 164 + }, + hasJournal: { + name: "Hunter's Journal", + spoiler: "Greenpath: Hunter" + }, + hasHuntersMark: { + name: "Hunter's Mark", + spoiler: "Greenpath: Hunter" + }, + killedPrayerSlug: { + name: "Journal: Maggot", + spoiler: "Forgotten Crossroads: False Knight secret room" + }, + killedOrangeScuttler: { + name: "Journal: Lightseed", + spoiler: "Infected Crossroads" + }, + killedPigeon: { + name: "Journal: Maskfly", + spoiler: "Greenpath, Queen's Gardens" + }, + killedLazyFlyer: { + name: "Journal: Aluba", + spoiler: "Lake of Unn, Queen's Gardens (near White Lady)" + }, + killedAcidFlyer: { + name: "Journal: Duranda", + spoiler: "Greenpath: Nailmaster Sheo's tent path" + }, + killedAcidWalker: { + name: "Journal: Durandoo", + spoiler: "Greenpath, Queen's Gardens" + }, + killedPlantShooter: { + name: "Journal: Gulka", + spoiler: "Greenpath: west of Stone Sanctuary" + }, + killedMushroomTurret: { + name: "Journal: Sporg", + spoiler: "Fungal Wastes" + }, + killedZapBug: { + name: "Journal: Charged Lumafly", + spoiler: "Fog Canyon: Teacher's Archives (tank)" + }, + killedCrystalCrawler: { + name: "Journal: Crystal Crawler", + spoiler: "Crystal Peak" + }, + killedGorgeousHusk: { + name: "Journal: Gorgeous Husk", + spoiler: "City of Tears: secret room" + }, + killedWorm: { + name: "Journal: Goam", + spoiler: "Infected Crossroads: near Fungal Wastes entrance" + }, + killedBigCentipede: { + name: "Journal: Garpede", + spoiler: "Deepnest: east of Hot Spring" + }, + killedAbyssTendril: { + name: "Journal: Void Tendrils", + spoiler: "The Abyss: secret room" + }, + killedPaleLurker: { + name: "Journal: Pale Lurker", + spoiler: "Colosseum of Fools: secret area" + }, + falseKnightDreamDefeated: { + name: "Failed Champion", + spoiler: "Forgotten Crossroads" + }, + mageLordDreamDefeated: { + name: "Soul Tyrant", + spoiler: "City of Tears: Soul Sanctum" + }, + infectedKnightDreamDefeated: { + name: "Lost Kin", + spoiler: "Ancient Basin" + }, + whiteDefenderDefeated: { + name: "White Defender", + spoiler: "Royal Waterways" + }, + greyPrinceDefeated: { + name: "Grey Prince Zote", + spoiler: "Dirtmouth: Bretta's Room (per save choice)" + }, + killedHollowKnight: { + name: "Hollow Knight", + spoiler: "Forgotten Crossroads: Black Egg Temple" + }, + salubraBlessing: { + name: "Salubra's Blessing", + spoiler: "Salubra: 800 Geo + all 40 Charms found" + }, + gotShadeCharm: { + name: "Void Heart", + spoiler: "Kingsoul + Birthplace" + }, + killedFinalBoss: { + name: "Radiance", + spoiler: "Forgotten Crossroads: Black Egg Temple" + }, + bossDoorStateTier5: { + name: "Embrace the Void", + spoiler: "Godhome: Pantheon of Hallownest" + }, + zoteDead: { + name: "Optimal Zote", + spoiler: "Neglect achievement (per save choice)" + }, + nailsmithSpared: { + name: "Optimal Nailsmith", + spoiler: "Happy Couple achievement (per save choice)" + }, + }, + STATISTICS: { + nailDamage: { + name: "Nail Damage", + spoiler: "Nailsmith upgrades, City of Tears", + max: 21 + }, + charmSlots: { + name: "Charm Notches", + spoiler: "out of 11 total", + max: 11 + }, + whisperingRoots: { + name: "Whispering Roots completed", + spoiler: "Dream Nail (out of 15)", + max: 15 + }, + relicsWandererJournal: { + name: "Relic #1 found total", + nameHeld: "trinket1", + nameSold: "soldTrinket1", + spoiler: "Wanderer's Journal (out of 14)", + max: 14, + }, + relicsHallownestSeal: { + name: "Relic #2 found total", + nameHeld: "trinket2", + nameSold: "soldTrinket2", + spoiler: "Hallownest Seal (out of 17)", + max: 17, + }, + relicsKingsIdol: { + name: "Relic #3 found total", + nameHeld: "trinket3", + nameSold: "soldTrinket3", + spoiler: "King's Idol (out of 8)", + max: 8, + }, + relicsArcaneEgg: { + name: "Relic #4 found total", + nameHeld: "trinket4", + nameSold: "soldTrinket4", + spoiler: "Arcane Egg (4 max, 1 missable)", + max: 4, + }, + geoRocks: { + name: "Geo Rocks", + spoiler: "Unbroken/Broken/Discovered Total" + }, + geoPool: { + name: "Shade Geo", + spoiler: "Amount of Geo the Shade is currently holding", + min: 0 + }, // not ghostCoins + rancidEggs: { + name: "Rancid Eggs", + spoiler: "Find: Hallownest, Buy: Sly, Tuk" + }, + xunFlowerBrokeTimes: { + name: "Delicate Flowers broken", + spoiler: "Resting Grounds: Grey Mourner" + }, + notchShroomOgres: { + name: "Charm Notch #1", + spoiler: "Fungal Wastes: Shroom Ogres room" + }, + salubraNotch1: { + name: "Charm Notch #2", + spoiler: "Salubra: 120 Geo + 5 Charms found" + }, + salubraNotch2: { + name: "Charm Notch #3", + spoiler: "Salubra: 500 Geo + 10 Charms found" + }, + salubraNotch3: { + name: "Charm Notch #4", + spoiler: "Salubra: 900 Geo + 18 Charms found" + }, + salubraNotch4: { + name: "Charm Notch #5", + spoiler: "Salubra: 1400 Geo + 25 Charms found" + }, + colosseumBronzeCompleted: { + name: "Charm Notch #6", + spoiler: "Colosseum of Fools: Trial of the Warrior" + }, + notchFogCanyon: { + name: "Charm Notch #7", + spoiler: "Fog Canyon: explosive eggs room" + }, + gotGrimmNotch: { + name: "Charm Notch #8", + spoiler: "Dirtmouth: Troupe Leader Grimm" + }, + hasDreamGate: { + name: "Dream Gate", + spoiler: "Seer: 900 Essence" + }, + fragileGreed_unbreakable: { + name: "Unbreakable Greed", + spoiler: "Divine: Fragile Greed + 9000 Geo" + }, + fragileHealth_unbreakable: { + name: "Unbreakable Heart", + spoiler: "Divine: Fragile Heart + 12000 Geo" + }, + fragileStrength_unbreakable: { + name: "Unbreakable Strength", + spoiler: "Divine: Fragile Strength + 15000 Geo" + }, + killedMenderBug: { + name: "Journal: Menderbug", + spoiler: "Forgotten Crossroads + destroy sign" + }, + killedBindingSeal: { + name: "Journal: Seal of Binding", + spoiler: "White Palace: Path of Pain completion" + }, + killedGodseekerMask: { + name: "Journal: Weathered Mask", + spoiler: "Godhome: Land of Storms" + }, + killedVoidIdol_1: { + name: "Journal: Void Idol Attuned", + spoiler: "Godhome: Hall of Gods, defeat all" + }, + killedVoidIdol_2: { + name: "Journal: Void Idol Ascended", + spoiler: "Godhome: Hall of Gods, defeat all" + }, + killedVoidIdol_3: { + name: "Journal: Void Idol Radiant", + spoiler: "Godhome: Hall of Gods, defeat all" + }, + whiteDefenderDefeats: { + name: "White Defender times defeated", + spoiler: "Royal Waterways (5 max)", + max: 5 + }, + greyPrinceDefeats: { + name: "Grey Prince Zote times defeated", + spoiler: "Dirtmouth (10 max)", + max: 10 + }, + whitePalaceSecretRoomVisited: { + name: "White Palace Secret Room visited", + spoiler: "Help identify this room!" + }, + killsBindingSeal: { + name: "Path of Pain", + spoiler: "White Palace: main secret area" + }, } }; -const HINTS = { - fireballLevel: ["", "...a mysterious shaman living in a dwelling below the town of Dirtmouth"], - hornet1Defeated: ["", "...a skilled protector guarding ruins in a lush green forest"], - hasDash: ["", "...an old cloak lying on a green path near a broken shell"], - hasWalljump: ["", "...a sharp claw lying forgotten somewhere amidst the insect village"], - Crossroads_04: ["", "...a mother sleeping peacefully below the town of Dirtmouth"], - slyRescued: ["", "...a fellow town bug who seems to be lost somewhere in the crossroads"], - hasLantern: ["", "...a precious item able to carry some light to even the darkest places"], - hasSuperDash: ["", "...some powerful crystal beating somewhere deep inside the mines"], - hasDreamNail: ["", "...a weapon from a dream world only found where the souls can peacefully rest"], - killedInfectedKnight: ["", "...a shattered corpse forgotten in a windy cave in the ancient depths below the city"], - hasDoubleJump: ["", "...something incredibly light dropped by a monarchfly in the ancient depths below the city"], - killedBlackKnight: ["", "...discarded shells of black guards lying on the floor of a high spire"], - lurienDefeated: ["", "...a dreamer sleeping somewhere at the top of a high spire"], - dungDefenderOrHornet2: ["", "...a skilled combatant living at the heart of the sewers or watching over a shell amidst ash falling from the sky"], - ismaTearOrShadeCloak: ["", "...something precious in a grove accessed from the waterways or a massive royal door guarding a cloak behind the darkness"], - defeatedMegaJelly: ["", "...an intelligent being floating inside hidden archives behind the fog"], - monomonDefeated: ["", "...a dreamer sleeping somewhere hidden in a foggy area"], - hegemolDefeated: ["", "...a dreamer sleeping near a spider nest area"], - killedHollowKnight: ["", "...a disturbance inside a black temple"], -}; - -const BOSSES = { - falseKnightDefeated: ["False Knight", "Forgotten Crossroads"], // "Battle Scene" - "Crossroads_10" ? - hornet1Defeated: ["Hornet Protector", "Greenpath"], - defeatedDungDefender: ["Dung Defender", "Royal Waterways"], - mageLordDefeated: ["Soul Master", "City of Tears: Soul Sanctum"], - killedBlackKnight: ["Watcher Knights", "City of Tears: Watcher's Spire"], - collectorDefeated: ["The Collector", "City of Tears: Tower of Love"], - defeatedMantisLords: ["Mantis Lords", "Mantis Village"], - defeatedMegaJelly: ["Uumuu", "Fog Canyon: Teacher's Archives"], - hornetOutskirtsDefeated: ["Hornet Sentinel", "Kingdom's Edge"], - killedInfectedKnight: ["Broken Vessel", "Ancient Basin"], - killedMimicSpider: ["Nosk", "Deepnest"], // "Battle Scene" - "Deepnest_32" ? - killedTraitorLord: ["Traitor Lord", "Queen's Gardens"] // "Battle Scene" - "Fungus3_23" ? -}; - -// "Battle Scene" sceneData.persistentBoolItems.id -const BOSSES_WORLD = { - Crossroads_04: ["Gruz Mother", "Forgotten Crossroads"], // killedBigFly - Crossroads_09: ["Brooding Mawlek", "Forgotten Crossroads"] // killedMawlek -}; - -// reference: https://radiance.host/apidocs/Charms.html -const CHARMS = { - gotCharm_1: ["#1 Gathering Swarm", "Sly: 300 Geo"], // 1 - gotCharm_2: ["#2 Wayward Compass", "Iselda: 220 Geo"], // 1 - gotCharm_3: ["#3 Grubsong", "Grubfather: 10 Grubs rescued"], // 1 - gotCharm_4: ["#4 Stalwart Shell", "Sly: 200 Geo"], // 2 - gotCharm_5: ["#5 Baldur Shell", "Howling Cliffs"], // 2 - gotCharm_6: ["#6 Fury of the Fallen", "King's Pass"], // 2 - gotCharm_7: ["#7 Quick Focus", "Salubra: 800 Geo"], // 3 - gotCharm_8: ["#8 Lifeblood Heart", "Salubra: 250 Geo"], // 2 - gotCharm_9: ["#9 Lifeblood Core", "The Abyss: 15 Lifeblood masks"], // 3 - gotCharm_10: ["#10 Defender's Crest", "Royal Waterways"], // 1 - gotCharm_11: ["#11 Flukenest", "Royal Waterways"], // 3 - gotCharm_12: ["#12 Thorns of Agony", "Greenpath"], // 1 - gotCharm_13: ["#13 Mark of Pride", "Mantis Village"], // 3 - gotCharm_14: ["#14 Steady Body", "Salubra: 120 Geo"], // 1 - gotCharm_15: ["#15 Heavy Blow", "Sly: 350 Geo + Shopkeeper's Key"], // 2 - gotCharm_16: ["#16 Sharp Shadow", "Deepnest"], // 2 - gotCharm_17: ["#17 Spore Shroom", "Fungal Wastes"], // 1 - gotCharm_18: ["#18 Longnail", "Salubra: 300 Geo"], // 2 - gotCharm_19: ["#19 Shaman Stone", "Salubra: 220 Geo"], // 3 - gotCharm_20: ["#20 Soul Catcher", "Forgotten Crossroads: Ancestral Mound"], // 2 - gotCharm_21: ["#21 Soul Eater", "Resting Grounds"], // 4 - gotCharm_22: ["#22 Glowing Womb", "Forgotten Crossroads"], // 2 - gotCharm_23: ["#23 Fragile Heart", "Leg Eater: 350/280 Geo"], // 2 - gotCharm_24: ["#24 Fragile Greed", "Leg Eater: 250/200 Geo"], // 2 - gotCharm_25: ["#25 Fragile Strength", "Leg Eater: 600/480 Geo"], // 3 - gotCharm_26: ["#26 Nailmaster’s Glory", "Sly: All Nail Arts"], // 1 - gotCharm_27: ["#27 Joni’s Blessing", "Howling Cliffs: Joni's Repose"], // 4 - gotCharm_28: ["#28 Shape of Unn", "Greenpath: Lake of Unn"], // 2 - gotCharm_29: ["#29 Hiveblood", "The Hive"], // 4 - gotCharm_30: ["#30 Dream Wielder", "Seer: 500 Essence"], // 1 - gotCharm_31: ["#31 Dashmaster", "Fungal Wastes"], // 2 - gotCharm_32: ["#32 Quick Slash", "Kingdom's Edge"], // 3 - gotCharm_33: ["#33 Spell Twister", "City of Tears: Soul Sanctum"], // 2 - gotCharm_34: ["#34 Deep Focus", "Crystal Peak"], // 4 - gotCharm_35: ["#35 Grubberfly’s Elegy", "Grubfather: 46 Grubs rescued"], // 3 - gotCharm_36: ["#36 Kingsoul", "Queen's Gardens + Ancient Basin"], // 5 -}; - -const COLOSSEUM = { - colosseumBronzeCompleted: ["Trial of the Warrior", "Little Fool: 100 Geo"], - colosseumSilverCompleted: ["Trial of the Conqueror", "Little Fool: 450 Geo + Warrior completed"], - colosseumGoldCompleted: ["Trial of the Fool", "Little Fool: 800 Geo + Conqueror completed"], -}; - -const DREAMERS = { - lurienDefeated: ["Lurien the Watcher", "City of Tears: Watcher's Spire"], - monomonDefeated: ["Monomon the Teacher", "Fog Canyon: Teacher's Archives"], - hegemolDefeated: ["Herrah the Beast", "Deepnest: Distant Village"] -}; - -const DREAMNAIL = { - hasDreamNail: ["Dream Nail acquired", "Resting Grounds"], - dreamNailUpgraded: ["Awoken Dream Nail", "Seer: 1800 Essence"], - mothDeparted: ["Hear the Seer's final words", "Seer: 2400 Essence"] -}; - -const EQUIPMENT = { - hasDash: ["Mothwing Cloak", "Greenpath: Dash ability"], - hasWalljump: ["Mantis Claw", "Mantis Village: Wall Jump ability"], - hasSuperDash: ["Crystal Heart", "Crystal Peak: Super Dash ability"], - hasDoubleJump: ["Monarch Wings", "Ancient Basin: Double Jump ability"], - hasAcidArmour: ["Isma's Tear", "Royal Waterways: Acid Armour ability"], - hasKingsBrand: ["King's Brand", "Kingdom's Edge"], - hasShadowDash: ["Shade Cloak", "The Abyss: Shadow Dash ability"] -}; - -const MASKSHARDS = { - slyShellFrag1: ["Mask Shard #1", "Sly: 150 Geo"], - slyShellFrag2: ["Mask Shard #2", "Sly: 500 Geo"], - slyShellFrag3: ["Mask Shard #3", "Sly: 800 Geo + Shopkeeper's Key"], - slyShellFrag4: ["Mask Shard #4", "Sly: 1500 Geo + Shopkeeper's Key"], - dreamReward7: ["Mask Shard #5", "Seer: 1500 Essence"] -}; - -// "Heart Piece" sceneData.persistentBoolItems.id -const MASKSHARDS_WORLD = { - Crossroads_13: ["Mask Shard #6", "Forgotten Crossroads: below Hot Springs"], - Crossroads_09: ["Mask Shard #7", "Forgotten Crossroads: Brooding Mawlek"], - Crossroads_38: ["Mask Shard #8", "Grubfather: 5 Grubs rescued"], - Room_Bretta: ["Mask Shard #9", "Dirtmouth: Bretta's Room, rescue Bretta"], - Fungus2_01: ["Mask Shard #10", "Queen's Station, requires Mantis Claw"], - Waterways_04b: ["Mask Shard #11", "Royal Waterways"], - Fungus1_36: ["Mask Shard #12", "Greenpath: Stone Sanctuary"], - Mines_32: ["Mask Shard #13", "Crystal Peak: Enraged Guardian"], - Fungus2_25: ["Mask Shard #14", "Deepnest: entrance from Fungal Wastes"], - Hive_04: ["Mask Shard #15", "The Hive, use Hive Guardian"], - Room_Mansion: ["Mask Shard #16", "Resting Grounds: Delicate Flower"] -}; - -const VESSELFRAGMENTS = { - slyVesselFrag1: ["Vessel Fragment #1", "Sly: 550 Geo"], - slyVesselFrag2: ["Vessel Fragment #2", "Sly: 900 Geo + Shopkeeper's Key"], - dreamReward5: ["Vessel Fragment #3", "Seer: 700 Essence"], - vesselFragStagNest: ["Vessel Fragment #4", "Stag Nest"] -}; - -// "Vessel Fragment" sceneData.persistentBoolItems.id -const VESSELFRAGMENTS_WORLD = { - Fungus1_13: ["Vessel Fragment #5", "Greenpath: near Queen's Gardens exit"], - Crossroads_37: ["Vessel Fragment #6", "Forgotten Crossroads: unlock City of Tears lift"], - Ruins2_09: ["Vessel Fragment #7", "Above King's Station"], - Deepnest_38: ["Vessel Fragment #8", "Deepnest: Goam platforming challenge"], - Abyss_04: ["Vessel Fragment #9", "Ancient Basin Fountain: 3000 Geo"] -}; - -const NAILARTS = { - hasDashSlash: ["Great Slash", "Nailmaster Sheo: Greenpath"], // this is correct - hasUpwardSlash: ["Dash Slash", "Nailmaster Oro: Kingdom's Edge, 800 Geo"], // this is correct - hasCyclone: ["Cyclone Slash", " Nailmaster Mato: Howling Cliffs"], -}; - -const NAILUPGRADES = [ - ["#0 Old Nail", "Starting Weapon"], - ["#1 Sharpened Nail", "Nailsmith: 250 Geo"], - ["#2 Channeled Nail", "Nailsmith: 800 Geo + 1 Pale Ore"], - ["#3 Coiled Nail", "Nailsmith: 2000 Geo + 2 Pale Ore"], - ["#4 Pure Nail", "Nailsmith: 4000 Geo + 3 Pale Ore"] -]; - -const SPELLS = { - fireballLevel: { - 1: ["Vengeful Spirit", "Forgotten Crossroads: Ancestral Mound"], - 2: ["Shade Soul", "City of Tears: Soul Sanctum + Elegant Key"], - }, - quakeLevel: { - 1: ["Desolate Dive", "City of Tears: Soul Sanctum"], - 2: ["Descending Dark", "Crystal Peak: Crystallised Mound"], - }, - screamLevel: { - 1: ["Howling Wraiths", "Fog Canyon: Overgrown Mound"], - 2: ["Abyss Shriek", "The Abyss"], - } -}; - -const WARRIORDREAMS = { - xeroDefeated: ["Xero", "Resting Grounds"], - noEyesDefeated: ["No Eyes", "Greenpath: Stone Sanctuary"], - elderHuDefeated: ["Elder Hu", "Fungal Wastes"], - aladarSlugDefeated: ["Gorb", "Howling Cliffs"], - mumCaterpillarDefeated: ["Marmu", "Queen's Gardens"], - galienDefeated: ["Galien", "Deepnest"], - markothDefeated: ["Markoth", "Kingdom's Edge, requires Shade Cloak"], -}; - -const GRIMMTROUPE = { - gotCharm_37: ["Charm #37 Sprintmaster", "Sly: 400 Geo + Shopkeeper's Key"], - gotCharm_38: ["Charm #38 Dreamshield", "Resting Grounds"], - gotCharm_39: ["Charm #39 Weaversong", "Deepnest: Weaver's Den"], - gotCharm_40: ["Charm #40 Grimmchild / Carefree Melody", "Dirtmouth"], - killedGrimm: ["Troupe Leader Grimm", "Dirtmouth"] -}; - -const LIFEBLOOD = { - killedHiveKnight: ["Hive Knight", "The Hive"] -}; - -const GODMASTER = { - hasGodfinder: ["Godtuner", "Junk Pit, requires Simple Key"] -}; - -const GODMASTER_DOORS = [ - ["#1 Pantheon of the Master", "Godhome"], - ["#2 Pantheon of the Artist", "Godhome"], - ["#3 Pantheon of the Sage", "Godhome"], - ["#4 Pantheon of the Knight", "Godhome"] -]; - -const ESSENTIAL = { - grubsCollected: ["Grubs Rescued", "out of 46 total", 46], - dreamOrbs: ["Essence Collected", "Dream Nail (2400 for completion)", 2400], - stationsOpened: ["Stag Stations opened", "out of 10 total", 10], - fountainGeo: ["Geo in Fountain", "Ancient Basin: 3000 Geo maximum", 3000], - slyRescued: ["Sly Rescued", "Forgotten Crossroads, near Gruz Mother"], - brettaRescued: ["Bretta Rescued", "Fungal Wastes, near Dashmaster charm statue"], - hasLantern: ["Lumafly Lantern", "Sly: 1800 Geo"], - shopkeeperKey: ["Shopkeeper's Key", "Crystal Peak"], - elegantKey: ["Elegant Key", "Sly: 800 Geo + Shopkeeper's Key"], - loveKey: ["Love Key", "Queen's Gardens, near Fungal Wastes"], - slySimpleKey: ["Simple Key #1", "Sly: 950 Geo"], - simpleKeyCityOfTears: ["Simple Key #2", "City of Tears"], - simpleKeyAncientBasin: ["Simple Key #3", "Ancient Basin"], - gotLurkerKey: ["Simple Key #4", "Kingdom's Edge: Colosseum of Fools"], - paleOreAncientBasin: ["Pale Ore #1", "Ancient Basin"], - paleOreSeer: ["Pale Ore #2", "Seer: 300 Essence"], - paleOreCrystalPeak: ["Pale Ore #3", "Crystal Peak: Hallownest's Crown"], - paleOreDeepnest: ["Pale Ore #4", "Deepnest, Nosk reward"], - paleOreGrubfather: ["Pale Ore #5", "Grubfather: 31 Grubs rescued"], - paleOreColosseum: ["Pale Ore #6", "Colosseum of Fools: Trial of the Conqueror"], - hasTramPass: ["Tram Pass", "Deepnest, Failed Tramway"], - nightmareLanternLit: ["Nightmare Lantern Lit", "Howling Cliffs, corpse of a large bug"] -}; - -const GRUBS_LIST = ["Crossroads_35", "Crossroads_03", "Crossroads_05", "Crossroads_48", "Crossroads_31", "Fungus1_06", "Fungus1_07", "Fungus1_21", "Fungus1_28", "Fungus2_18", "Ruins1_05", "Mines_04", "Mines_03", "Mines_31", "Mines_19", "Ruins1_32", "RestingGrounds_10", "Ruins_House_01", "Mines_35", "Mines_16", "Waterways_04", "Waterways_13", "Abyss_19", "Abyss_17", "Mines_24", "Fungus1_13", "Fungus3_47", "Fungus3_10", "Fungus3_48", "Fungus3_22", "Ruins2_07", "Ruins2_11_1", "Ruins2_11_2", "Ruins2_11_3", "Deepnest_East_11", "Deepnest_East_14", "Fungus2_20", "Ruins2_03", "Deepnest_36", "Deepnest_03", "Deepnest_31", "Deepnest_39", "Deepnest_Spider_Town", "Waterways_14", "Hive_03", "Hive_04"]; - -const ACHIEVEMENTS = { - areaMaps: ["Area Maps", "Cornifer and Iselda (out of 13)", 13, [ - "mapCrossroads", "mapGreenpath", "mapFogCanyon", "mapRoyalGardens", "mapFungalWastes", "mapCity", "mapWaterways", "mapMines", "mapDeepnest", "mapCliffs", "mapOutskirts", "mapRestingGrounds", "mapAbyss" - ]], - journalEntriesCompleted: ["Creatures Encountered", "Hunter's Journal (164 max)", 164], - journalNotesCompleted: ["Hunter Notes Completed", "Hunter's Journal (164 max)", 164], - hasJournal: ["Hunter's Journal", "Greenpath: Hunter"], - hasHuntersMark: ["Hunter's Mark", "Greenpath: Hunter"], - killedPrayerSlug: ["Journal: Maggot", "Forgotten Crossroads: False Knight secret room"], - killedOrangeScuttler: ["Journal: Lightseed", "Infected Crossroads"], - killedPigeon: ["Journal: Maskfly", "Greenpath, Queen's Gardens"], - killedLazyFlyer: ["Journal: Aluba", "Lake of Unn, Queen's Gardens (near White Lady)"], - killedAcidFlyer: ["Journal: Duranda", "Greenpath: Nailmaster Sheo's tent path"], - killedAcidWalker: ["Journal: Durandoo", "Greenpath, Queen's Gardens"], - killedPlantShooter: ["Journal: Gulka", "Greenpath: west of Stone Sanctuary"], - killedMushroomTurret: ["Journal: Sporg", "Fungal Wastes"], - killedZapBug: ["Journal: Charged Lumafly", "Fog Canyon: Teacher's Archives (tank)"], - killedCrystalCrawler: ["Journal: Crystal Crawler", "Crystal Peak"], - killedGorgeousHusk: ["Journal: Gorgeous Husk", "City of Tears: secret room"], - killedWorm: ["Journal: Goam", "Infected Crossroads: near Fungal Wastes entrance"], - killedBigCentipede: ["Journal: Garpede", "Deepnest: east of Hot Spring"], - killedAbyssTendril: ["Journal: Void Tendrils", "The Abyss: secret room"], - killedPaleLurker: ["Journal: Pale Lurker", "Colosseum of Fools: secret area"], - falseKnightDreamDefeated: ["Failed Champion", "Forgotten Crossroads"], - mageLordDreamDefeated: ["Soul Tyrant", "City of Tears: Soul Sanctum"], - infectedKnightDreamDefeated: ["Lost Kin", "Ancient Basin"], - whiteDefenderDefeated: ["White Defender", "Royal Waterways"], - greyPrinceDefeated: ["Grey Prince Zote", "Dirtmouth: Bretta's Room (per save choice)"], - killedHollowKnight: ["Hollow Knight", "Forgotten Crossroads: Black Egg Temple"], - salubraBlessing: ["Salubra's Blessing", "Salubra: 800 Geo + all 40 Charms found"], - gotShadeCharm: ["Void Heart", "Kingsoul + Birthplace"], - killedFinalBoss: ["Radiance", "Forgotten Crossroads: Black Egg Temple"], - bossDoorStateTier5: ["Embrace the Void", "Godhome: Pantheon of Hallownest"], - zoteDead: ["Optimal Zote", "Neglect achievement (per save choice)"], - nailsmithSpared: ["Optimal Nailsmith", "Happy Couple achievement (per save choice)"], -}; - -const STATISTICS = { - nailDamage: ["Nail Damage", "Nailsmith upgrades, City of Tears", 21], - charmSlots: ["Charm Notches", "out of 11 total", 11], - whisperingRoots: ["Whispering Roots completed", "Dream Nail (out of 15)", 15], - relicsWandererJournal: ["Relic #1 found total", "Wanderer's Journal (out of 14)", 14, "trinket1", "soldTrinket1"], - relicsHallownestSeal: ["Relic #2 found total", "Hallownest Seal (out of 17)", 17, "trinket2", "soldTrinket2"], - relicsKingsIdol: ["Relic #3 found total", "King's Idol (out of 8)", 8, "trinket3", "soldTrinket3"], - relicsArcaneEgg: ["Relic #4 found total", "Arcane Egg (4 max, 1 missable)", 4, "trinket4", "soldTrinket4"], - geoRocks: ["Geo Rocks", "Unbroken/Broken/Discovered Total"], - geoPool: ["Shade Geo", "Amount of Geo the Shade is currently holding", 0], // not ghostCoins - rancidEggs: ["Rancid Eggs", "Find: Hallownest, Buy: Sly, Tuk"], - xunFlowerBrokeTimes: ["Delicate Flowers broken", "Resting Grounds: Grey Mourner"], - notchShroomOgres: ["Charm Notch #1", "Fungal Wastes: Shroom Ogres room"], - salubraNotch1: ["Charm Notch #2", "Salubra: 120 Geo + 5 Charms found"], - salubraNotch2: ["Charm Notch #3", "Salubra: 500 Geo + 10 Charms found"], - salubraNotch3: ["Charm Notch #4", "Salubra: 900 Geo + 18 Charms found"], - salubraNotch4: ["Charm Notch #5", "Salubra: 1400 Geo + 25 Charms found"], - colosseumBronzeCompleted: ["Charm Notch #6", "Colosseum of Fools: Trial of the Warrior"], - notchFogCanyon: ["Charm Notch #7", "Fog Canyon: explosive eggs room"], - gotGrimmNotch: ["Charm Notch #8", "Dirtmouth: Troupe Leader Grimm"], - hasDreamGate: ["Dream Gate", "Seer: 900 Essence"], - fragileGreed_unbreakable: ["Unbreakable Greed", "Divine: Fragile Greed + 9000 Geo"], - fragileHealth_unbreakable: ["Unbreakable Heart", "Divine: Fragile Heart + 12000 Geo"], - fragileStrength_unbreakable: ["Unbreakable Strength", "Divine: Fragile Strength + 15000 Geo"], - killedMenderBug: ["Journal: Menderbug", "Forgotten Crossroads + destroy sign"], - killedBindingSeal: ["Journal: Seal of Binding", "White Palace: Path of Pain completion"], - killedGodseekerMask: ["Journal: Weathered Mask", "Godhome: Land of Storms"], - killedVoidIdol_1: ["Journal: Void Idol Attuned", "Godhome: Hall of Gods, defeat all"], - killedVoidIdol_2: ["Journal: Void Idol Ascended", "Godhome: Hall of Gods, defeat all"], - killedVoidIdol_3: ["Journal: Void Idol Radiant", "Godhome: Hall of Gods, defeat all"], - whiteDefenderDefeats: ["White Defender times defeated", "Royal Waterways (5 max)", 5], - greyPrinceDefeats: ["Grey Prince Zote times defeated", "Dirtmouth (10 max)", 10], - whitePalaceSecretRoomVisited: ["White Palace Secret Room visited", "Help identify this room!"], - killsBindingSeal: ["Path of Pain", "White Palace: main secret area"], -}; - -export { - DIV_ID, - HINTS, - BOSSES, - BOSSES_WORLD, - CHARMS, - EQUIPMENT, - NAILARTS, - NAILUPGRADES, - SPELLS, - MASKSHARDS, - MASKSHARDS_WORLD, - VESSELFRAGMENTS, - VESSELFRAGMENTS_WORLD, - DREAMERS, - COLOSSEUM, - DREAMNAIL, - WARRIORDREAMS, - GRIMMTROUPE, - LIFEBLOOD, - GODMASTER, - GODMASTER_DOORS, - ESSENTIAL, - GRUBS_LIST, - ACHIEVEMENTS, - STATISTICS -}; \ No newline at end of file +export default HK; \ No newline at end of file