switch filenames to new version
This commit is contained in:
parent
e845a6edc0
commit
1487ad3ee9
5 changed files with 1741 additions and 1741 deletions
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
458
src/js/hk-database-old.js
Normal file
458
src/js/hk-database-old.js
Normal file
|
|
@ -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
|
||||
};
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue