\"\r\n].join(\"\\n\");\r\n\r\nlet divStartCenter = [\r\n \"
\"\r\n].join(\"\\n\");\r\n\r\nlet divEnd = [\r\n \"
\"\r\n].join(\"\\n\");\r\n\r\nlet pSpan = \"
\";\r\n\r\n/* let benchHKCCBegin, benchHKCCEnd; */\r\n\r\n/* -------------------------- Functions ------------------------------------------------------------------------------------------- */\r\n\r\n/**\r\n * Main Function. Checks Hollow Knight game completion by analyzing the save file\r\n * @param {object} jsonObject Decoded save data in JavaScript Object Notation form (JSON)\r\n */\r\nfunction HKCheckCompletion(jsonObject, benchStart = performance.now()) {\r\n\r\n // start benchmark\r\n // benchHKCCBegin = new Date();\r\n benchmarkTimes.CheckCompletion.timeStart = benchStart;\r\n\r\n let HKPlayerData;\r\n let HKWorldItems;\r\n let HKSceneData;\r\n\r\n if (jsonObject.hasOwnProperty(\"playerData\")) {\r\n HKPlayerData = jsonObject.playerData;\r\n } else {\r\n HK.saveAnalyzed = false;\r\n return false;\r\n }\r\n\r\n if (jsonObject.hasOwnProperty(\"sceneData\")) {\r\n HKSceneData = jsonObject.sceneData;\r\n if (jsonObject.sceneData.hasOwnProperty(\"persistentBoolItems\")) {\r\n HKWorldItems = jsonObject.sceneData.persistentBoolItems;\r\n } else {\r\n HK.saveAnalyzed = false;\r\n return false;\r\n }\r\n } else {\r\n HK.saveAnalyzed = false;\r\n return false;\r\n }\r\n\r\n /* Initialize DataChecker object for checking status of items in save file */\r\n let saveDataChecker = new DataChecker(jsonObject);\r\n\r\n // Pre-Cleaning and filling initial data (h2, id) needed for PrepareHTMLString()\r\n // PrefillHTML(HK.sections);\r\n\r\n // Prevents adding current percent data after each function call and resets what the analyzing has done to the original object. Prevents wrong data display after subsequent save analyzing.\r\n ResetCompletion(HK);\r\n\r\n // ============================================================================================================================= //\r\n\r\n // ---------------- Time Played ----------------------------------------------------------------------------------------------- //\r\n\r\n CheckPlayTime(HK.sections.intro, HKPlayerData.playTime);\r\n\r\n // ---------------- Game Completion Status ------------------------------------------------------------------------------------ //\r\n\r\n CheckCompletionPercent(HK.sections.intro, HKPlayerData);\r\n\r\n // ---------------- Game Completion Status ------------------------------------------------------------------------------------ //\r\n\r\n CheckSaveFileVersion(HK.sections.intro, HKPlayerData.version);\r\n\r\n // ---------------- Health Masks ---------------------------------------------------------------------------------------------- //\r\n\r\n CheckHealthMasks(HK.sections.intro, HKPlayerData.maxHealthBase, HKPlayerData.permadeathMode);\r\n\r\n // ---------------- Soul Orbs ------------------------------------------------------------------------------------------------- //\r\n\r\n CheckSoulOrbs(HK.sections.intro, HKPlayerData.maxMP + HKPlayerData.MPReserveMax);\r\n\r\n // ---------------- Charm Notches (Slots) ------------------------------------------------------------------------------------- //\r\n\r\n CheckNotches(HK.sections.intro, HKPlayerData.charmSlots, HKPlayerData.charmSlotsFilled);\r\n\r\n // ---------------- Geo Amount ------------------------------------------------------------------------------------------------ //\r\n\r\n CheckGeo(HK.sections.intro, HKPlayerData.geo, HKPlayerData.geoPool);\r\n\r\n // ---------------- Bosses (Base Game) ---------------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.bosses, HK.sections.bosses.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ---------------- Charms ---------------------------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.charms, HK.sections.charms.entries, HKPlayerData);\r\n\r\n // ---------------- Colosseum of Fools ---------------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.colosseum, HK.sections.colosseum.entries, HKPlayerData);\r\n\r\n // ---------------- Dreamers -------------------------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.dreamers, HK.sections.dreamers.entries, HKPlayerData);\r\n\r\n // ---------------- Dream Nail and Essence ------------------------------------------------------------------------------------ //\r\n\r\n CheckIfDataTrue(HK.sections.dreamNail, HK.sections.dreamNail.entries, HKPlayerData);\r\n\r\n // ---------------- Equipment ------------------------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.equipment, HK.sections.equipment.entries, HKPlayerData);\r\n\r\n // ---------------- Nail Upgrades --------------------------------------------------------------------------------------------- //\r\n\r\n CheckNailUpgrades(HK.sections.nailUpgrades, HK.sections.nailUpgrades.entries, HKPlayerData);\r\n\r\n // ---------------- Mask Shards ----------------------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.maskShards, HK.sections.maskShards.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ---------------- Nail Arts ------------------------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.nailArts, HK.sections.nailArts.entries, HKPlayerData);\r\n\r\n // ---------------- Spells ---------------------------------------------------------------------------------------------------- //\r\n\r\n CheckSpellLevel(HK.sections.spells, HK.sections.spells.entries, HKPlayerData);\r\n\r\n // ---------------- Vessel Fragments ------------------------------------------------------------------------------------------ //\r\n\r\n CheckIfDataTrue(HK.sections.vesselFragments, HK.sections.vesselFragments.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ---------------- Warrior Dreams -------------------------------------------------------------------------------------------- //\r\n\r\n CheckWarriorDreams(HK.sections.warriorDreams, HK.sections.warriorDreams.entries, HKPlayerData);\r\n\r\n // ---------------- Grimm Troupe Content Pack --------------------------------------------------------------------------------- //\r\n\r\n CheckIfDataTrue(HK.sections.grimmTroupe, HK.sections.grimmTroupe.entries, HKPlayerData);\r\n\r\n // ---------------- Lifeblood Content Pack ------------------------------------------------------------------------------------ //\r\n\r\n CheckIfDataTrue(HK.sections.lifeblood, HK.sections.lifeblood.entries, HKPlayerData);\r\n\r\n // ---------------- Godmaster Content Pack ------------------------------------------------------------------------------------ //\r\n\r\n CheckIfDataTrue(HK.sections.godmaster, HK.sections.godmaster.entries, HKPlayerData);\r\n\r\n // ------------------------- Hunter's Journal --------------------------------------------------------------------------------- //\r\n /* Must be checked before Statistics (for correct entry numbers) */\r\n\r\n CheckHuntersJournal(HK, \"huntersJournal\", HKPlayerData);\r\n CheckHuntersJournal(HK, \"huntersJournalOptional\", HKPlayerData);\r\n\r\n // ------------------------- Essential Things --------------------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.essential, HK.sections.essential.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ------------------------- Achievements ------------------------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.achievements, HK.sections.achievements.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ------------------------- Collectibles -> Charm Notches ---------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.charmNotches, HK.sections.charmNotches.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ------------------------- Collectibles -> Grubs ---------------------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.grubs);\r\n\r\n // ------------------------- Collectibles -> Whispering Roots ---------------------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.whisperingRoots);\r\n\r\n // ------------------------- Collectibles -> Relics - Wanderer's Journal ----------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.relicsWanderersJournal);\r\n\r\n // ------------------------- Collectibles -> Relics - Hallownest Seal ----------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.relicsHallownestSeal);\r\n\r\n // ------------------------- Collectibles -> Relics - King's Idol ----------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.relicsKingsIdol);\r\n\r\n // ------------------------- Collectibles -> Relics - Arcane Egg ----------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.relicsArcaneEgg);\r\n\r\n // ------------------------- Collectibles -> Rancid Eggs ----------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.rancidEggs);\r\n\r\n // ------------------------- Collectibles -> Items ---------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.items, HK.sections.items.entries, HKPlayerData, HKWorldItems);\r\n \r\n // ------------------------- Geo Caches -> Geo Chests ----------------------------------------------------------- //\r\n\r\n saveDataChecker.checkItems(HK.sections.geoChests);\r\n\r\n // ------------------------- Geo Caches -> Geo Rocks ----------------------------------------------------------- //\r\n\r\n saveDataChecker.checkGeoRocks(HK.sections.geoRocks);\r\n\r\n // ------------------------- Secrets -> World Interactions ---------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.worldInteractions, HK.sections.worldInteractions.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ------------------------- Secrets -> Secret Rooms ---------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.secretRooms, HK.sections.secretRooms.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ------------------------- Game Statistics ---------------------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.statistics, HK.sections.statistics.entries, HKPlayerData, HKWorldItems, HKSceneData);\r\n\r\n // ------------------------- Godhome Statistics ------------------------------------------------------------------------------- //\r\n\r\n CheckAdditionalThings(HK.sections.godhomeStatistics, HK.sections.godhomeStatistics.entries, HKPlayerData, HKWorldItems, HKSceneData);\r\n\r\n /* ------------------------- Pantheon Statistics ------------------------------------------------------------------------------ */\r\n\r\n CheckPantheon(HK, \"pantheonOfTheMaster\", HKPlayerData);\r\n CheckPantheon(HK, \"pantheonOfTheArtist\", HKPlayerData);\r\n CheckPantheon(HK, \"pantheonOfTheSage\", HKPlayerData);\r\n CheckPantheon(HK, \"pantheonOfTheKnight\", HKPlayerData);\r\n CheckPantheon(HK, \"pantheonOfHallownest\", HKPlayerData);\r\n\r\n CheckHallOfGods(HK, HKPlayerData);\r\n\r\n // ------------------------- Hints ---------------------------------------------------------------------------------------------- //\r\n\r\n CheckHintsTrue(HK.sections.hints, HK.sections.hints.entries, HKPlayerData, HKWorldItems);\r\n\r\n // ------------------------- Extended game completion check --------------------------------------------------------------------- //\r\n\r\n /* Percent completion is filled inside GenerateInnerHTML() using CompletionFill() */\r\n CheckExtendedCompletion(HK);\r\n\r\n // ------------------------- Indicate that the save file was loaded and analyzed correctly -------------------------------------- //\r\n\r\n HK.saveAnalyzed = true;\r\n\r\n // ------------------------- Generate everything on the page with updated values ------------------------------------------------ //\r\n\r\n GenerateInnerHTML(HK);\r\n\r\n // Prevents wrong checkbox behaviour (must run after everything is finished)\r\n CheckboxHintsToggle();\r\n CheckboxSpoilersToggle();\r\n\r\n /* focus the text area after analyzing the save, without scrolling the document (too slow) */\r\n /* document.getElementById(\"save-area\").focus({preventScroll: true}); */\r\n\r\n // finish and show benchmark\r\n // benchHKCCEnd = new Date();\r\n benchmarkTimes.CheckCompletion.timeEnd = performance.now();\r\n // console.info(\"HKCheckCompletion() time (ms) =\", benchHKCCEnd - benchHKCCBegin);\r\n\r\n // Benchmark(benchmarkTimes);\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Generates and appends a new entry inside the HTML of a given ID\r\n * @param {object} section object containing div ID and h2 title of the HTML element\r\n * @param {string} textPrefix Main name of the entry\r\n * @param {string} textSuffix Optional suffix after the main name (spoilers: locations, costs etc.)\r\n */\r\nfunction PrepareHTMLString(section, textPrefix = \"Unknown Completion Element: \", textSuffix = \"Unknown Description Element\", wiki = \"\") {\r\n\r\n let icon = completionSymbol;\r\n let b = [\"
\", \"\"];\r\n if (!textPrefix.length) b = [\"\", \"\"];\r\n if (wiki.length) b = [`
`, \"\"];\r\n\r\n let span = [\"
\", \"\"];\r\n let spoilerSpan = [\"
\", \"\"];\r\n if (section.id === \"hk-hints\") {\r\n span[0] = \"
\";\r\n icon = \"\";\r\n }\r\n\r\n // let dash = \"\";\r\n if (textSuffix.length && textPrefix.length) textSuffix = \"— \" + textSuffix;\r\n if (textPrefix.includes(\"\")) textSuffix = `${textSuffix}`;\r\n\r\n // return divStart + icon + b[0] + textPrefix + b[1] + span[0] + pSpan + spoilerSpan[0] + dash + textSuffix + spoilerSpan[1] + span[1] + divEnd;\r\n return `\r\n ${divStart}\r\n ${icon}${b[0]}${textPrefix}${b[1]}${span[0]}${pSpan}${spoilerSpan[0]}${textSuffix}${spoilerSpan[1]}${span[1]}\r\n ${divEnd}\r\n `;\r\n}\r\n\r\n/**\r\n * Fills HTML with the playTime value of the save file\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {number} playTime Number of total gameplay time in seconds\r\n */\r\nfunction CheckPlayTime(section, playTime) {\r\n\r\n let seconds = Math.floor(playTime);\r\n let minutes = Math.floor((seconds / 60) % 60);\r\n let hours = Math.floor(seconds / 3600);\r\n let sec = Math.floor(seconds % 60);\r\n\r\n section.entries.timePlayed.timeH = hours;\r\n section.entries.timePlayed.timeM = minutes;\r\n section.entries.timePlayed.timeS = sec;\r\n\r\n if (sec < 10) sec = \"0\" + sec;\r\n if (minutes < 10) minutes = \"0\" + minutes;\r\n\r\n let textFill = \"Time Played:\" + pSpan + \"\" + hours + \" h \" + minutes + \" min \" + sec + \" sec\";\r\n\r\n section.entries.timePlayed.spoiler = hours + \" h \" + minutes + \" min \" + sec + \" sec\";\r\n\r\n // document.getElementById(section.id).innerHTML += divStart + SYMBOL_CLOCK + textFill + divEnd;\r\n}\r\n\r\n/**\r\n * Searches for completionPercentage in playerData and fills HTML with the value of the save file\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {number} completionPercentage Number of completion percentage\r\n */\r\nfunction CheckCompletionPercent(section, playerData) {\r\n\r\n let completionPercentage = Math.round(playerData.completionPercentage);\r\n let maxPercent = 0;\r\n\r\n /* Normal (current) game version behaviour: 112% */\r\n section.maxPercent = section.maxPercentDefault;\r\n maxPercent = section.maxPercentDefault;\r\n section.entries.gameCompletion.spoilerAfter = section.entries.gameCompletion.spoilerAfterDefault;\r\n\r\n section.percent = completionPercentage;\r\n section.entries.gameCompletion.spoiler = completionPercentage;\r\n\r\n /* Lifeblood behaviour: 107% */\r\n if (!playerData.hasOwnProperty(\"hasGodfinder\")) {\r\n\r\n section.maxPercent = section.maxPercentLifeblood;\r\n maxPercent = section.maxPercentLifeblood;\r\n section.entries.gameCompletion.spoilerAfter = section.entries.gameCompletion.spoilerAfterLifeblood;\r\n }\r\n\r\n /* Grimm Troupe bahaviour: 106% */\r\n if (!playerData.hasOwnProperty(\"killedHiveKnight\")) {\r\n\r\n section.maxPercent = section.maxPercentGrimmTroupe;\r\n maxPercent = section.maxPercentGrimmTroupe;\r\n section.entries.gameCompletion.spoilerAfter = section.entries.gameCompletion.spoilerAfterGrimmTroupe;\r\n }\r\n\r\n /* Base Game behaviour with no Content Packs: 100% */\r\n if (!playerData.hasOwnProperty(\"gotCharm_37\")) {\r\n\r\n section.maxPercent = section.maxPercentBaseGame;\r\n maxPercent = section.maxPercentBaseGame;\r\n section.entries.gameCompletion.spoilerAfter = section.entries.gameCompletion.spoilerAfterBaseGame;\r\n }\r\n\r\n (completionPercentage >= maxPercent) ? SetIconGreen(section, \"gameCompletion\"): SetIconRed(section, \"gameCompletion\");\r\n\r\n /* let textFill = \"Game Completion:\" + pSpan + \"\" + completionPercentage + \" %\" + pSpan + \"(out of \" + section.maxPercent + \" %)\"; */\r\n // document.getElementById(section.id).innerHTML += divStart + completionSymbol + textFill + divEnd;\r\n}\r\n\r\n/**\r\n * Calculates the amount of all green ticks and total entries. Saves them to database for later display.\r\n * @param {object} db reference to the main HK database\r\n */\r\nfunction CheckExtendedCompletion(db) {\r\n\r\n let sections = db.sections;\r\n let entries = {};\r\n let gameCompletionExtended = db.sections.intro.entries.gameCompletionExtended;\r\n let intro = db.sections.intro;\r\n\r\n let amount = 0;\r\n let max = 0;\r\n\r\n for (let section in sections) {\r\n\r\n entries = sections[section].entries;\r\n\r\n switch (section) {\r\n\r\n /* Ignore these sections totally */\r\n case \"intro\":\r\n case \"hints\":\r\n case \"huntersJournal\":\r\n case \"huntersJournalOptional\":\r\n\r\n continue;\r\n\r\n default:\r\n\r\n // console.info(\"Section loop:\", section);\r\n\r\n for (let entry in entries) {\r\n\r\n // console.info(\"Entry loop:\", entry);\r\n\r\n switch (entry) {\r\n\r\n /* Do not count (ignore) these entries at all */\r\n case \"oldNail\":\r\n case \"pantheonMaster\": // Pantheons are counted in Godmaster section\r\n case \"pantheonArtist\":\r\n case \"pantheonSage\":\r\n case \"pantheonKnight\":\r\n case \"pantheonHallownest\":\r\n case \"geoPool\":\r\n case \"dreamOrbs\":\r\n case \"charmsOwned\":\r\n case \"nailDamage\":\r\n case \"jinnEggsSold\":\r\n case \"xunFlowerBrokeTimes\":\r\n case \"itemsDiscovered\":\r\n case \"stagStationsOpened\":\r\n case \"areaMaps\":\r\n case \"killedMegaMossCharger\":\r\n case \"killedBigBuzzer\":\r\n case \"killedOblobble\":\r\n case \"killedLobsterLancer\":\r\n case \"killedFlukeMother\":\r\n case \"killedNailBros\":\r\n case \"killedPaintmaster\":\r\n case \"killedNailsage\":\r\n case \"killedHollowKnightPrime\":\r\n case \"killsBigBuzzer\":\r\n case \"whiteDefenderDefeated\":\r\n case \"greyPrinceDefeated\":\r\n case \"killedHollowKnight\":\r\n case \"killedFinalBoss\":\r\n case \"grubsCollected\": /* Collectibles are counted in their own sections */\r\n case \"whisperingRoots\":\r\n case \"relicsWandererJournal\":\r\n case \"relicsHallownestSeal\":\r\n case \"relicsKingsIdol\":\r\n case \"relicsArcaneEgg\":\r\n case \"rancidEggs\":\r\n case \"geoRocks\":\r\n\r\n // console.info(\"Ignored:\", entry);\r\n\r\n continue;\r\n }\r\n\r\n if (entries[entry].hasOwnProperty(\"icon\")) {\r\n\r\n switch (entry) {\r\n\r\n /* Do not add these to total and done (they will be added as amount/max later instead) */\r\n case \"grubsCollected\":\r\n case \"grubRewards\":\r\n case \"areaMaps\":\r\n case \"journalEntriesCompleted\":\r\n case \"journalNotesCompleted\":\r\n case \"whisperingRoots\":\r\n case \"relicsWandererJournal\":\r\n case \"relicsHallownestSeal\":\r\n case \"relicsKingsIdol\":\r\n case \"relicsArcaneEgg\":\r\n case \"geoRocks\":\r\n case \"whiteDefenderDefeats\":\r\n case \"greyPrinceDefeats\":\r\n\r\n /* console.info(\"Ignored:\", entry); */\r\n\r\n break;\r\n\r\n default:\r\n\r\n if (entries[entry].icon !== \"none\") {\r\n intro.extendedCompletionTotal++;\r\n\r\n // console.info(\"Counted Total:\", entry);\r\n }\r\n /* else {\r\n console.info(\"Not Counted Total:\", entry);\r\n } */\r\n\r\n /* Missable Arcane Egg exception, subtract from total */\r\n if (entries[entry].icon === \"none\" && entry === \"arcaneEggLifebloodCoreRoom\") {\r\n\r\n /* console.info(`${entry} has passed:`, entries[entry].icon); */\r\n\r\n /* When got the Lifeblood Core charm, but didn't pick up the Arcane Egg */\r\n if (sections.charms.entries.gotCharm_9.icon === \"green\") {\r\n intro.extendedCompletionTotal--;\r\n\r\n /* console.info(`${entry} completion Total subtracted`); */\r\n }\r\n }\r\n\r\n switch (entries[entry].icon) {\r\n\r\n case \"red\":\r\n case \"none\":\r\n case \"partial\":\r\n case \"partialJournal\":\r\n continue;\r\n\r\n default:\r\n\r\n intro.extendedCompletionDone++;\r\n\r\n // console.info(\"Counted (Done):\", entry);\r\n }\r\n }\r\n\r\n /* Skip disabled entries entirely from counting (subtract a point from Total) */\r\n if (entries[entry].hasOwnProperty(\"disabled\") && entries[entry].disabled === true) {\r\n\r\n /* Do not subtract a point for WD/GPZ Defeats nr if they were not added to Total in the first place */\r\n if (entry === \"greyPrinceDefeats\" || entry === \"whiteDefenderDefeats\") {\r\n continue;\r\n }\r\n\r\n intro.extendedCompletionTotal--;\r\n\r\n // console.info(\"Subtracted Total:\", entry);\r\n }\r\n /* Counting amount/max for several entries */\r\n else if (entries[entry].hasOwnProperty(\"amount\") && entries[entry].hasOwnProperty(\"max\")) {\r\n\r\n /* Skip counting 3000 Fountain Geo, too much */\r\n if (entry === \"fountainGeo\") {\r\n continue; // continue to next entry loop\r\n }\r\n\r\n amount = entries[entry].amount;\r\n max = entries[entry].max;\r\n\r\n /* Prevent overflowing the counter */\r\n if (amount > max) {\r\n amount = max;\r\n }\r\n\r\n intro.extendedCompletionDone += amount;\r\n intro.extendedCompletionTotal += max;\r\n\r\n // console.info(`${entry}: ${amount}/${max}`, entries[entry].name);\r\n\r\n amount = 0;\r\n max = 0;\r\n }\r\n /* Counting Geo Rocks */\r\n /* else if (entries[entry].hasOwnProperty(\"activated\") && entries[entry].hasOwnProperty(\"max\")) {\r\n\r\n amount = entries[entry].activated;\r\n max = entries[entry].max;\r\n\r\n // Check in case the player has discovered more than 205 (max) Geo Rocks\r\n if (max < entries[entry].discoveredTotal) {\r\n max = entries[entry].discoveredTotal;\r\n }\r\n\r\n intro.extendedCompletionDone += amount;\r\n intro.extendedCompletionTotal += max;\r\n\r\n console.info(`${entry}: ${amount}/${max}`, entries[entry].name);\r\n\r\n amount = 0;\r\n max = 0;\r\n } */\r\n }\r\n }\r\n\r\n }\r\n }\r\n\r\n if (intro.extendedCompletionDone >= intro.extendedCompletionTotal) {\r\n gameCompletionExtended.icon = \"green\";\r\n } else {\r\n gameCompletionExtended.icon = \"red\";\r\n }\r\n\r\n let percent = (intro.extendedCompletionDone / intro.extendedCompletionTotal) * 100;\r\n\r\n gameCompletionExtended.spoiler = intro.extendedCompletionDone;\r\n gameCompletionExtended.spoilerAfter = ` / ${intro.extendedCompletionTotal} = ${percent.toFixed(2)} %`;\r\n}\r\n\r\n/**\r\n * Reads the \"version\" string from the save file and appends it to the selected div ID element\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {string} saveVersion Save File version in format 0.0.0.0\r\n */\r\nfunction CheckSaveFileVersion(section, saveVersion = HK.sections.intro.entries.saveVersion.spoiler) {\r\n\r\n SetIconNone(section, section.entries.saveVersion.id);\r\n\r\n section.entries.saveVersion.spoiler = `${saveVersion}`;\r\n\r\n /* let textFill = `Save Version:${pSpan}${saveVersion}${pSpan}`; */\r\n // document.getElementById(section.id).innerHTML += divStart + completionSymbol + textFill + divEnd;\r\n}\r\n\r\n/**\r\n * Fills HTML with appropriate number of health mask images\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {number} masks Number of max health masks from the save (baseline without charms and lifeblood)\r\n * @param {number} permadeathMode Value of permadeathMode property. 0 = Normal, 1 = Steel Soul, 2 = Steel Soul broken save\r\n */\r\nfunction CheckHealthMasks(section, masks = 5, permadeathMode = 0) {\r\n\r\n section.entries.health.amountTotal = masks;\r\n\r\n if (permadeathMode > 0) {\r\n section.entries.health.permadeathMode = true;\r\n } else {\r\n section.entries.health.permadeathMode = false;\r\n }\r\n\r\n /* let icon = SYMBOL_EMPTY;\r\n let textFill = \"Health:\";\r\n let maskImages = \"\";\r\n let maskNormal = `
`;\r\n let maskSteel = `
`;\r\n let maskImg = \"\";\r\n\r\n (permadeathMode > 0) ? maskImg = maskSteel: maskImg = maskNormal;\r\n\r\n for (let i = 0; i < masks; i++) {\r\n maskImages += maskImg;\r\n } */\r\n\r\n // document.getElementById(section.id).innerHTML += divStartCenter + icon + textFill + maskImages + divEnd;\r\n}\r\n\r\n/**\r\n * Fills HTML with appropriate number of soul orbs images\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {number} totalSoul Number of max Soul reserve from the save. 99 = full Soul Orb\r\n */\r\nfunction CheckSoulOrbs(section, totalSoul) {\r\n\r\n /* let icon = SYMBOL_EMPTY;\r\n let textFill = \"Soul:\";\r\n let soulImages = \"\";\r\n let soulNormal = `
`;\r\n let soulImg = soulNormal;\r\n\r\n for (let i = 0, total = totalSoul / 33; i < total; i++) {\r\n soulImages += soulImg;\r\n } */\r\n\r\n section.entries.soul.amountTotal = totalSoul;\r\n\r\n // document.getElementById(section.id).innerHTML += divStartCenter + icon + textFill + soulImages + divEnd;\r\n}\r\n\r\n/**\r\n * Fills HTML with the Geo value of the save file\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {number} geoValue Number of total Geo value\r\n */\r\nfunction CheckGeo(section, geoValue = 0, geoPoolValue = 0) {\r\n\r\n section.entries.geo.amount = geoValue;\r\n section.entries.geo.amountShade = geoPoolValue;\r\n section.entries.geo.amountTotal = geoValue + geoPoolValue;\r\n\r\n /* let icon = SYMBOL_EMPTY;\r\n let textFill = `Geo:
${geoValue}`;\r\n\r\n // Show Shade Geo value and image only if Shade has at least 1 Geo on it\r\n if (geoPoolValue > 0) textFill += `\r\n ${pSpan}+
${geoPoolValue}`;\r\n\r\n // Show also total Geo (Geo + Shade Geo) if player has at least 1 geo alongside the shade geo\r\n if (geoValue > 0 && geoPoolValue > 0) textFill += `${pSpan}=${pSpan}${geoValue+geoPoolValue}`; */\r\n\r\n // document.getElementById(section.id).innerHTML += divStartCenter + icon + textFill + divEnd;\r\n}\r\n\r\n/**\r\n * Fills HTML with appropriate number of notch images\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {number} totalNotches Number of total Charm Notches the player has. 11 = max\r\n * @param {number} filledNotches Number of total used Charm Notches (including overcharmed notches). 15 = max\r\n */\r\nfunction CheckNotches(section, notchesTotal = 3, notchesFilled = 0) {\r\n\r\n let {\r\n notchesOvercharmed,\r\n notchesUnused\r\n } = 0;\r\n\r\n section.entries.notches.amountTotal = notchesTotal;\r\n\r\n // How many overcharmed notches images to show\r\n notchesOvercharmed = notchesFilled - notchesTotal;\r\n if (notchesOvercharmed < 1) notchesOvercharmed = 0;\r\n\r\n section.entries.notches.amountOvercharmed = notchesOvercharmed;\r\n\r\n // How many unused notches images to show\r\n notchesUnused = notchesTotal - notchesFilled;\r\n if (notchesUnused < 1) notchesUnused = 0;\r\n\r\n section.entries.notches.amountUnused = notchesUnused;\r\n\r\n // Correct number of filled/used notches images to show when player is overcharmed\r\n if (notchesFilled > notchesTotal) notchesFilled = notchesTotal;\r\n\r\n section.entries.notches.amountFilled = notchesFilled;\r\n\r\n /* let icon = SYMBOL_EMPTY;\r\n let textFill = `Notches:${pSpan}`;\r\n\r\n let notchImages = \"\";\r\n let notchNormalImage = `
`;\r\n let notchFilledImage = `
`;\r\n let notchOvercharmedImage = `
`;\r\n\r\n // First check filled (used) notches and fill them (skips if no filled notches)\r\n if (notchesFilled > 0) {\r\n for (let i = 0; i < notchesFilled; i++) {\r\n notchImages += notchFilledImage;\r\n }\r\n }\r\n\r\n // Second check overcharmed notches and fill them (skips if player is not overcharmed)\r\n if (notchesOvercharmed > 0) {\r\n for (let i = 0; i < notchesOvercharmed; i++) {\r\n notchImages += notchOvercharmedImage;\r\n }\r\n }\r\n\r\n // Lastly, fill all unused notches\r\n if (notchesUnused > 0) {\r\n for (let i = 0; i < notchesUnused; i++) {\r\n notchImages += notchNormalImage;\r\n }\r\n } */\r\n\r\n // document.getElementById(section.id).innerHTML += divStartCenter + icon + textFill + notchImages + divEnd;\r\n}\r\n\r\n/**\r\n * Verifies if the data in a specific object is true or false, and appends HTML accordingly.\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified (use copy - data inside this object will be deleted)\r\n * @param {object} playerData Reference/pointer to specific data where to search (playerData)\r\n * @param {Array} worldData Reference/pointer to specific data where to search (sceneData.persistentBoolItems)\r\n */\r\nfunction CheckIfDataTrue(section, dataObject, playerData, worldData = []) {\r\n\r\n /* let {\r\n textPrefix,\r\n textSuffix,\r\n } = \"\";\r\n let sFillText = \"\";\r\n let wiki = \"\"; */\r\n let checkText = \"\";\r\n\r\n for (let i in dataObject) {\r\n\r\n /* textPrefix = dataObject[i].name;\r\n textSuffix = dataObject[i].spoiler;\r\n (dataObject[i].hasOwnProperty(\"wiki\")) ? wiki = dataObject[i].wiki: wiki = \"\"; */\r\n\r\n switch (i) {\r\n case \"gotCharm_36\":\r\n // prevents green checkbox and adding 1% when only got one white fragment\r\n (playerData.gotQueenFragment === true && playerData.gotKingFragment === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"gotCharm_37\":\r\n case \"gotCharm_38\":\r\n case \"gotCharm_39\":\r\n case \"gotCharm_40\":\r\n case \"killedGrimm\":\r\n case \"grimmChildLevel\":\r\n case \"killedHiveKnight\":\r\n case \"hasGodfinder\":\r\n\r\n // fades out the entries if save file is from older game versions\r\n if (playerData.hasOwnProperty(i) === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n /* textPrefix = `${textPrefix}`; */\r\n\r\n break;\r\n }\r\n\r\n // Checks for Nightmare King (4) or Banishment (5)\r\n if (i === \"grimmChildLevel\") {\r\n // (playerData.grimmChildLevel >= 4) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n\r\n /* Check if Nightmare King or Banishment by looking at grimmChildLevel */\r\n switch (playerData[i]) {\r\n\r\n case 4:\r\n dataObject[i].name = dataObject[i].nameNightmareKing;\r\n dataObject[i].spoiler = dataObject[i].spoilerNightmareKing;\r\n dataObject[i].wiki = dataObject[i].wikiNightmareKing;\r\n\r\n SetIconGreen(section, i);\r\n\r\n break;\r\n\r\n case 5:\r\n dataObject[i].name = dataObject[i].nameBanishment;\r\n dataObject[i].spoiler = dataObject[i].spoilerBanishment;\r\n dataObject[i].wiki = dataObject[i].wikiBanishment;\r\n\r\n SetIconGreen(section, i);\r\n\r\n break;\r\n\r\n default:\r\n SetIconRed(section, i);\r\n dataObject[i].name = dataObject[i].nameDefault;\r\n dataObject[i].spoiler = dataObject[i].spoilerDefault;\r\n dataObject[i].wiki = dataObject[i].wikiDefault;\r\n }\r\n\r\n break;\r\n }\r\n\r\n if (i === \"gotCharm_40\") {\r\n SetIconRed(section, i);\r\n dataObject[i].name = dataObject[i].nameDefault;\r\n dataObject[i].spoiler = dataObject[i].spoilerDefault;\r\n dataObject[i].wiki = dataObject[i].wikiDefault;\r\n\r\n switch (playerData.grimmChildLevel) {\r\n\r\n case 1:\r\n if (playerData[i] === true) {\r\n dataObject[i].name = dataObject[i].nameGrimmchildP1;\r\n dataObject[i].spoiler = dataObject[i].spoilerGrimmchildP1;\r\n dataObject[i].wiki = dataObject[i].wikiGrimmchild;\r\n\r\n SetIconGreen(section, i);\r\n }\r\n\r\n break;\r\n case 2:\r\n dataObject[i].name = dataObject[i].nameGrimmchildP2;\r\n dataObject[i].spoiler = dataObject[i].spoilerGrimmchildP2;\r\n dataObject[i].wiki = dataObject[i].wikiGrimmchild;\r\n\r\n SetIconGreen(section, i);\r\n\r\n break;\r\n case 3:\r\n dataObject[i].name = dataObject[i].nameGrimmchildP3;\r\n dataObject[i].spoiler = dataObject[i].spoilerGrimmchildP3;\r\n dataObject[i].wiki = dataObject[i].wikiGrimmchild;\r\n\r\n SetIconGreen(section, i);\r\n\r\n break;\r\n case 4:\r\n dataObject[i].name = dataObject[i].nameGrimmchildP4;\r\n dataObject[i].spoiler = dataObject[i].spoilerGrimmchildP4;\r\n dataObject[i].wiki = dataObject[i].wikiGrimmchild;\r\n\r\n SetIconGreen(section, i);\r\n\r\n break;\r\n case 5:\r\n dataObject[i].name = dataObject[i].nameCarefreeMelody;\r\n dataObject[i].spoiler = dataObject[i].spoilerCarefreeMelody;\r\n dataObject[i].wiki = dataObject[i].wikiCarefreeMelody;\r\n\r\n SetIconGreen(section, i);\r\n\r\n break;\r\n default:\r\n dataObject[i].name = dataObject[i].nameDefault;\r\n dataObject[i].spoiler = dataObject[i].spoilerDefault;\r\n dataObject[i].wiki = dataObject[i].wikiDefault;\r\n }\r\n\r\n break;\r\n }\r\n\r\n (playerData[i] === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n\r\n break;\r\n\r\n case \"bossGruzMother\":\r\n case \"bossBroodingMawlek\":\r\n case \"maskShardCrossroadsSprings\":\r\n case \"maskShardCrossroadsMawlek\":\r\n case \"maskShardGrubfather\":\r\n case \"maskShardBretta\":\r\n case \"maskShardQueensStation\":\r\n case \"maskShardWaterways\":\r\n case \"maskShardStoneSanctuary\":\r\n case \"maskShardCrystalPeak\":\r\n case \"maskShardDeepnest\":\r\n case \"maskShardHive\":\r\n case \"maskShardDelicateFlower\":\r\n case \"vesselFragmentGreenpath\":\r\n case \"vesselFragmentCrossroads\":\r\n case \"vesselFragmentCityOfTears\":\r\n case \"vesselFragmentDeepnest\":\r\n case \"vesselFragmentFountain\":\r\n (WorldDataActivated(dataObject[i].id, dataObject[i].sceneName, worldData)) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"pantheonMaster\":\r\n case \"pantheonArtist\":\r\n case \"pantheonSage\":\r\n case \"pantheonKnight\":\r\n checkText = CheckGodmasterDoors(dataObject[i], playerData);\r\n\r\n if (checkText === \"PropertyNotFound\") {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n /* textPrefix = `${textPrefix}`; */\r\n break;\r\n\r\n } else if (checkText === \"PantheonCompleted\") {\r\n SetIconGreen(section, i);\r\n break;\r\n\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n break;\r\n\r\n default:\r\n (playerData[i] === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n }\r\n\r\n /* sFillText += PrepareHTMLString(section, textPrefix, textSuffix, wiki); */\r\n }\r\n\r\n // AppendHTML(section, sFillText);\r\n}\r\n\r\n/**\r\n * Verifies if the data in a specific object is 0 or > 0, and appends HTML accordingly.\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified (use copy - data inside this object will be deleted)\r\n * @param {object} playerData Reference/pointer to specific data where to search\r\n */\r\nfunction CheckSpellLevel(section, dataObject, playerData) {\r\n\r\n // let sFillText = \"\";\r\n\r\n for (let i in dataObject) {\r\n switch (i) {\r\n case \"vengefulSpirit\":\r\n case \"shadeSoul\":\r\n (playerData.fireballLevel >= dataObject[i].fireballLevel) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n // sFillText += PrepareHTMLString(section, dataObject[i].name, dataObject[i].spoiler, dataObject[i].wiki);\r\n break;\r\n case \"desolateDive\":\r\n case \"descendingDark\":\r\n (playerData.quakeLevel >= dataObject[i].quakeLevel) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n // sFillText += PrepareHTMLString(section, dataObject[i].name, dataObject[i].spoiler, dataObject[i].wiki);\r\n break;\r\n case \"howlingWraiths\":\r\n case \"abyssShriek\":\r\n (playerData.screamLevel >= dataObject[i].screamLevel) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n // sFillText += PrepareHTMLString(section, dataObject[i].name, dataObject[i].spoiler, dataObject[i].wiki);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n // AppendHTML(section, sFillText);\r\n}\r\n\r\n/**\r\n * Verifies if the data in a specific object is 0 or > 0, and appends HTML accordingly.\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified\r\n * @param {object} playerData Reference/pointer to specific data where to search\r\n */\r\nfunction CheckWarriorDreams(section, dataObject, playerData) {\r\n\r\n let sFillText = \"\";\r\n\r\n for (let i in dataObject) {\r\n (playerData[i] >= 2) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n sFillText += PrepareHTMLString(section, dataObject[i].name, dataObject[i].spoiler, dataObject[i].wiki);\r\n }\r\n\r\n // AppendHTML(section, sFillText);\r\n}\r\n\r\n/**\r\n * Verifies if the Godmaster Pantheons 1-4 are completed by the player, and appends HTML accordingly.\r\n * @param {object} dataObject Object containing pantheon data to be verified (with property)\r\n * @param {object} playerData Reference/pointer to specific data where to search in the save file\r\n */\r\nfunction CheckGodmasterDoors(dataObject, playerData) {\r\n\r\n if (playerData.hasOwnProperty(dataObject.property) === false) {\r\n return \"PropertyNotFound\";\r\n } else if (playerData[dataObject.property].completed === true) {\r\n return \"PantheonCompleted\";\r\n } else {\r\n return \"PantheonNotCompleted\";\r\n }\r\n}\r\n\r\n/**\r\n * Verifies the level of player's nail upgrades, and appends HTML accordingly.\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing nail upgrades data to be verified\r\n * @param {object} playerData Reference/pointer to specific data where to search in the save file\r\n */\r\nfunction CheckNailUpgrades(section, dataObject, playerData) {\r\n\r\n // appends \"Nail\" to every array element\r\n // same as names in the database object\r\n let nail = [\"old\", \"sharpened\", \"channeled\", \"coiled\", \"pure\"].map((element) => element + \"Nail\");\r\n\r\n let sFillText = \"\";\r\n\r\n for (let i = 0; i < 5; i++) {\r\n (playerData.nailSmithUpgrades >= i) ? SetIconGreen(section, nail[i]): SetIconRed(section, nail[i]);\r\n sFillText += PrepareHTMLString(section, dataObject[nail[i]].name, dataObject[nail[i]].spoiler, dataObject[nail[i]].wiki);\r\n }\r\n if (section.percent) section.percent--; // subject one for the Old Nail\r\n\r\n // AppendHTML(section, sFillText);\r\n}\r\n\r\n/**\r\n * Verifies if the specific Interactable (Item, Boss, Chest etc.) is activated. Returns true or false.\r\n * @param {string} idText ID text of the Interactable (id in sceneData)\r\n * @param {string} sceneNameText Map codename of the Interactable (sceneName in sceneData)\r\n * @param {Array} worldData Array of Interactable data to search in (sceneData.persistentBoolItems)\r\n */\r\nfunction WorldDataActivated(idText, sceneNameText, worldData) {\r\n\r\n // Search for the Interactable\r\n for (let i = 0, length = worldData.length; i < length; i++) {\r\n // Verify if the Interactable is activated and return the result\r\n if (worldData[i].id === idText && worldData[i].sceneName === sceneNameText && worldData[i].activated === true) {\r\n return true;\r\n }\r\n }\r\n // If not, return false\r\n return false;\r\n}\r\n\r\n/**\r\n * Verifies if the data in a specific object are true or false, and appends HTML accordingly. Creates a copy of dataObject.\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {string} idText Text string inside save data to search for\r\n * @param {object} dataObject Object containing data to be verified\r\n * @param {object} worldData Reference/pointer to specific data where to search\r\n */\r\n/* function CheckWorldDataTrue(section, idText, dataObject, worldData) {\r\n let orderedArray = [];\r\n let size = ObjectLength(dataObject);\r\n let sFillText = \"\";\r\n\r\n // Order the items before displaying them (creates a copy of dataObject)\r\n for (let i in dataObject) {\r\n orderedArray.push([i, dataObject[i].name, dataObject[i].spoiler, dataObject[i].wiki, false]);\r\n }\r\n\r\n // Search for completed items and mark them for display\r\n for (let i = 0, length = worldData.length; i < length; i++) {\r\n for (let j = 0; j < size; j++) {\r\n if (worldData[i].id === idText && worldData[i].sceneName === orderedArray[j][0] && worldData[i].activated === true) {\r\n orderedArray[j][4] = true;\r\n }\r\n }\r\n }\r\n\r\n // Display the items as they were initially ordered\r\n for (let i = 0; i < size; i++) {\r\n SetIconRed();\r\n if (orderedArray[i][4] === true) SetIconGreen(section);\r\n sFillText += PrepareHTMLString(section, orderedArray[i][1], orderedArray[i][2], orderedArray[i][3]);\r\n }\r\n\r\n // AppendHTML(section, sFillText);\r\n} */\r\n\r\n/**\r\n * Verifies if the data in a specific object are true or false, or checks what values they have, and appends HTML accordingly.\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {object} dataObject Object containing data to be verified\r\n * @param {object} playerData Reference/pointer to specific data where to search (playerData)\r\n * @param {object} worldData Reference/pointer to specific data where to search (sceneData.persistentBoolItems)\r\n * @param {object} sceneData Reference/pointer to specific data where to search (sceneData)\r\n */\r\nfunction CheckAdditionalThings(section, dataObject, playerData, worldData, sceneData) {\r\n\r\n /* let {\r\n textPrefix,\r\n textSuffix,\r\n wiki\r\n } = \"\";\r\n let sFillText = \"\"; */\r\n\r\n // Start main loop\r\n for (let i in dataObject) {\r\n /* textPrefix = dataObject[i].name;\r\n (dataObject[i].hasOwnProperty(\"spoiler\")) ? textSuffix = dataObject[i].spoiler: textSuffix = \"\";\r\n (dataObject[i].hasOwnProperty(\"wiki\")) ? wiki = dataObject[i].wiki: wiki = \"\"; */\r\n\r\n let {\r\n amount,\r\n countTotal,\r\n total,\r\n notActivated,\r\n activated,\r\n discoveredTotal\r\n } = 0;\r\n\r\n switch (i) {\r\n case \"grubsCollected\":\r\n case \"grubRewards\":\r\n case \"charmsOwned\":\r\n case \"dreamOrbs\":\r\n case \"whisperingRoots\":\r\n case \"fountainGeo\":\r\n case \"nailDamage\":\r\n case \"journalEntriesCompleted\":\r\n case \"journalNotesCompleted\":\r\n case \"whiteDefenderDefeats\":\r\n case \"greyPrinceDefeats\":\r\n if (i === \"whisperingRoots\") {\r\n amount = CountWorldItem(\"Dream Plant\");\r\n } else {\r\n amount = playerData[i];\r\n }\r\n\r\n countTotal = amount;\r\n dataObject[i].amount = amount;\r\n\r\n if (i === \"journalEntriesCompleted\" || i === \"journalNotesCompleted\") {\r\n countTotal = `${amount} / ${playerData.journalEntriesTotal}`;\r\n dataObject[i].amountTotal = playerData.journalEntriesTotal;\r\n\r\n dataObject[i].spoiler = `${dataObject[i].spoilerDefault} (${dataObject[i].max} max)`;\r\n\r\n /* when Zote is dead, the max Journal entries will equal 4 less instead of 164. For the green tick */\r\n if (playerData.zoteRescuedBuzzer === false && playerData.hasWalljump === true) {\r\n\r\n if (playerData.hasOwnProperty(\"killedGreyPrince\")) {\r\n dataObject[i].max -= 4; // Subtract GPZ and 3 Zotelings from max\r\n }\r\n dataObject[i].spoiler = `${dataObject[i].spoilerDefault} (${dataObject[i].max} max)`; /* Change spoiler for less confusion */\r\n }\r\n\r\n /* when Grimm Troupe is banished, max Journal entries will be 1 or 2 less */\r\n if (playerData.hasOwnProperty(\"destroyedNightmareLantern\") && playerData.destroyedNightmareLantern === true) {\r\n\r\n dataObject[i].max--; // Subtract Nightmare King from max\r\n\r\n /* if the player didn't defeat any Grimmkin Nightmare before banishing, subtract it from max */\r\n if (playerData.killedFlameBearerLarge === false) {\r\n dataObject[i].max--; // Subtract Grimmkin Nightmare from max\r\n dataObject[i].spoiler = `${dataObject[i].spoilerDefault} (${dataObject[i].max} max)`; /* Change spoiler for less confusion */\r\n }\r\n }\r\n }\r\n\r\n /* if (i === \"grubsCollected\") {\r\n LogMissingGrubs();\r\n } */\r\n\r\n /* textPrefix += `: ${countTotal}`; */\r\n\r\n if (i === \"grubRewards\") {\r\n dataObject[i].amountTotal = playerData.grubsCollected;\r\n /* textPrefix += ` / ${playerData.grubsCollected}`; */\r\n }\r\n\r\n if (i === \"greyPrinceDefeats\") {\r\n // backwards compatibility with earlier game versions\r\n if (playerData.hasOwnProperty(i) === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n // textPrefix = `${dataObject[i].name}`;\r\n break;\r\n } else if (playerData.zoteDead === true || (playerData.zoteRescuedBuzzer === false && playerData.hasWalljump === true)) {\r\n dataObject[i].disabled = true;\r\n // textPrefix = `${textPrefix}`;\r\n }\r\n }\r\n\r\n if (i === \"whiteDefenderDefeats\") {\r\n // backwards compatibility with earlier game versions\r\n if (playerData.hasOwnProperty(i) === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n // textPrefix = `${dataObject[i].name}`;\r\n break;\r\n }\r\n }\r\n\r\n if (amount >= dataObject[i].max) {\r\n\r\n SetIconGreen(section, i);\r\n } else if (amount > 0) {\r\n\r\n SetIconPartial(section, i);\r\n } else {\r\n\r\n SetIconNone(section, i);\r\n }\r\n break;\r\n\r\n case \"geoPool\":\r\n case \"rancidEggs\":\r\n case \"jinnEggsSold\":\r\n case \"xunFlowerBrokeTimes\":\r\n // textPrefix += \": \" + Math.abs(playerData[i]);\r\n amount = Math.abs(playerData[i]);\r\n\r\n dataObject[i].amount = amount;\r\n\r\n if (amount > 0 && i == \"geoPool\") {\r\n SetIconPartial(section, i);\r\n } else {\r\n SetIconNone(section, i);\r\n }\r\n\r\n if (i === \"jinnEggsSold\") {\r\n // fade out if not on Steel Soul\r\n if (playerData.permadeathMode < 1) {\r\n\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n }\r\n }\r\n\r\n break;\r\n\r\n case \"tukDungEgg\":\r\n\r\n // fade out if on Steel Soul\r\n if (playerData.permadeathMode > 0) {\r\n\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n\r\n continue;\r\n }\r\n\r\n (playerData[i] === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n\r\n break;\r\n\r\n case \"bankerBalance\":\r\n\r\n amount = playerData[i];\r\n\r\n /* When value is negative, reset to zero */\r\n if (amount < 0) {\r\n amount = 0;\r\n }\r\n\r\n dataObject[i].amount = amount;\r\n\r\n SetIconNone(section, i);\r\n\r\n break;\r\n\r\n case \"millibelleLeft\":\r\n\r\n if (playerData.bankerTheft >= 1) {\r\n SetIconGreen(section, i);\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n\r\n break;\r\n\r\n case \"millibelleCheckedStand\":\r\n\r\n if (playerData.bankerTheft >= 2) {\r\n SetIconGreen(section, i);\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n\r\n break;\r\n\r\n case \"millibelleReclaimedAllGeo\":\r\n\r\n if (playerData.bankerTheft >= 1 && playerData.bankerBalance <= 0) {\r\n SetIconGreen(section, i);\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n\r\n break;\r\n\r\n /* case \"geoRocks\":\r\n discoveredTotal = sceneData.geoRocks.length;\r\n\r\n notActivated = CountGeoRocks(discoveredTotal, \"unbroken\");\r\n activated = CountGeoRocks(discoveredTotal, \"broken\");\r\n\r\n dataObject[i].discoveredTotal = discoveredTotal;\r\n dataObject[i].notActivated = notActivated;\r\n dataObject[i].activated = activated;\r\n\r\n if (activated >= dataObject[i].max) {\r\n SetIconGreen(section, i);\r\n } else {\r\n SetIconNone(section, i);\r\n }\r\n break;\r\n */\r\n case \"itemsDiscovered\":\r\n discoveredTotal = sceneData.persistentBoolItems.length;\r\n\r\n notActivated = CountItems(discoveredTotal, \"notActivated\");\r\n activated = CountItems(discoveredTotal, \"active\");\r\n\r\n dataObject[i].discoveredTotal = discoveredTotal;\r\n dataObject[i].notActivated = notActivated;\r\n dataObject[i].activated = activated;\r\n\r\n /* textPrefix += `: ${notActivated} | ${activated} | ${discoveredTotal}`; */\r\n SetIconNone(section, i);\r\n break;\r\n\r\n case \"shopkeeperKey\":\r\n (playerData.hasSlykey === true || playerData.gaveSlykey === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"elegantKey\":\r\n (playerData.hasWhiteKey === true || playerData.usedWhiteKey === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"loveKey\":\r\n (playerData.hasLoveKey === true || playerData.openedLoveDoor === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"paleOreSeer\": // #2\r\n (playerData.dreamReward3 === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n /* -------------------- Interactables ------------------------------- */\r\n case \"simpleKeyCityOfTears\": // #2\r\n case \"simpleKeyAncientBasin\": // #3\r\n case \"paleOreAncientBasin\": // #1\r\n case \"paleOreCrystalPeak\": // #3\r\n case \"paleOreDeepnest\": // #4\r\n case \"paleOreGrubfather\": // #5\r\n case \"paleOreColosseum\": // #6\r\n case \"pantheonSoulWarrior\":\r\n case \"pantheonCrystalGuardian\":\r\n case \"pantheonEnragedGuardian\":\r\n case \"mantisVillageFloorLever\":\r\n case \"pathOfPainEntrance\":\r\n case \"whiteLadyRoom\":\r\n case \"throneRoomLoreTablet\":\r\n case \"towerOfLoveSecretRoom\":\r\n case \"weaversDenSecretRoom1\":\r\n case \"weaversDenSecretRoom2\":\r\n case \"cityCrest\":\r\n (FindWorldItem(dataObject[i].id, dataObject[i].sceneName)) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"grimmTentSecretRoom\":\r\n\r\n /* Backwards compatibility with older save files */\r\n if (playerData.hasOwnProperty(\"destroyedNightmareLantern\") === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n } else if (FindWorldItem(dataObject[i].id, dataObject[i].sceneName)) {\r\n SetIconGreen(section, i);\r\n } else {\r\n\r\n /* When the Ritual has been completed or Grimm Troupe has been Banished, the secret is no longer possible to discover */\r\n if (playerData.grimmChildLevel >= 4) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n }\r\n \r\n break;\r\n\r\n case \"relicsWandererJournal\":\r\n case \"relicsHallownestSeal\":\r\n case \"relicsKingsIdol\":\r\n case \"relicsArcaneEgg\":\r\n total = playerData[dataObject[i].nameHeld] + playerData[dataObject[i].nameSold];\r\n\r\n if (total >= dataObject[i].max) {\r\n\r\n SetIconGreen(section, i);\r\n } else if (total > 0) {\r\n\r\n SetIconPartial(section, i);\r\n } else {\r\n\r\n SetIconNone(section, i);\r\n }\r\n\r\n dataObject[i].amount = total;\r\n\r\n /* textPrefix += \": \" + total; */\r\n break;\r\n\r\n case \"arcaneEggLifebloodCoreRoom\":\r\n (FindWorldItem(dataObject[i].id, dataObject[i].sceneName)) ? SetIconGreen(section, i): SetIconNone(section, i);\r\n break;\r\n\r\n case \"pantheonHallownest\":\r\n if (playerData.hasOwnProperty(\"bossDoorStateTier5\") === false) {\r\n\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n } else {\r\n (playerData.bossDoorStateTier5.completed === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n }\r\n break;\r\n\r\n case \"killsBindingSeal\":\r\n if (playerData.hasOwnProperty(i) === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n /* textPrefix = `${textPrefix}`; */\r\n break;\r\n }\r\n (playerData[i] == 0) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"killsBigBuzzer\":\r\n (playerData[i] == 0) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n break;\r\n\r\n case \"killedVoidIdol_1\":\r\n if (playerData.hasOwnProperty(i) === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n /* textPrefix = `${textPrefix}`; */\r\n break;\r\n }\r\n (playerData[i] === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n if (playerData[i] === false && (playerData.killedVoidIdol_2 === true || playerData.killedVoidIdol_3 === true)) SetIconGreen(section, i);\r\n break;\r\n\r\n case \"killedVoidIdol_2\":\r\n if (playerData.hasOwnProperty(i) === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n /* textPrefix = `${textPrefix}`; */\r\n break;\r\n }\r\n (playerData[i] === true) ? SetIconGreen(section, i): SetIconRed(section, i);\r\n if (playerData[i] === false && playerData.killedVoidIdol_3 === true) SetIconGreen(section, i);\r\n break;\r\n\r\n case \"greyPrinceDefeated\":\r\n // compatibility with earlier game versions\r\n if (playerData.hasOwnProperty(i) === false) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n /* textPrefix = `${textPrefix}`; */\r\n break;\r\n } else if (playerData.zoteDead === true || (playerData.zoteRescuedBuzzer === false && playerData.hasWalljump === true)) {\r\n dataObject[i].disabled = true;\r\n /* textPrefix = `${textPrefix}`; */\r\n }\r\n (playerData[i] === true) ? SetIconGreen(section, i): SetIconNone(section, i);\r\n if (playerData.zoteRescuedBuzzer === true && playerData[i] === false) SetIconRed(section, i);\r\n break;\r\n\r\n case \"zoteStatus\":\r\n SetIconRed(section, i);\r\n dataObject[i].name = dataObject[i].nameDefault;\r\n dataObject[i].spoiler = dataObject[i].spoilerDefault;\r\n\r\n if (playerData.zoteDead === true) {\r\n /* textPrefix = dataObject[i].nameNeglect;\r\n textSuffix = dataObject[i].spoilerNeglect; */\r\n dataObject[i].name = dataObject[i].nameNeglect;\r\n dataObject[i].spoiler = dataObject[i].spoilerNeglect;\r\n\r\n SetIconGreen(section, i);\r\n\r\n } else if (playerData.killedZote === true) {\r\n /* textPrefix = dataObject[i].nameRivalry;\r\n textSuffix = dataObject[i].spoilerRivalry; */\r\n dataObject[i].name = dataObject[i].nameRivalry;\r\n dataObject[i].spoiler = dataObject[i].spoilerRivalry;\r\n\r\n SetIconGreen(section, i);\r\n\r\n } else if (playerData.zoteRescuedBuzzer === false) {\r\n if (playerData.hasWalljump === false) {\r\n /* textPrefix = dataObject[i].nameTrappedVengefly;\r\n textSuffix = dataObject[i].spoilerTrappedVengefly; */\r\n dataObject[i].name = dataObject[i].nameTrappedVengefly;\r\n dataObject[i].spoiler = dataObject[i].spoilerTrappedVengefly;\r\n\r\n } else if (playerData.hasWalljump === true) {\r\n /* textPrefix = dataObject[i].nameNotRescuedVengefly;\r\n textSuffix = dataObject[i].spoilerNotRescuedVengefly; */\r\n dataObject[i].name = dataObject[i].nameNotRescuedVengefly;\r\n dataObject[i].spoiler = dataObject[i].spoilerNotRescuedVengefly;\r\n }\r\n } else if (playerData.zoteRescuedBuzzer === true) {\r\n if (playerData.zoteRescuedDeepnest === false) {\r\n /* textPrefix = dataObject[i].nameTrappedDeepnest;\r\n textSuffix = dataObject[i].spoilerTrappedDeepnest; */\r\n dataObject[i].name = dataObject[i].nameTrappedDeepnest;\r\n dataObject[i].spoiler = dataObject[i].spoilerTrappedDeepnest;\r\n\r\n } else if (playerData.zoteRescuedDeepnest === true) {\r\n if (playerData.killedZote === false) {\r\n /* textPrefix = dataObject[i].nameColosseum;\r\n textSuffix = dataObject[i].spoilerColosseum; */\r\n dataObject[i].name = dataObject[i].nameColosseum;\r\n dataObject[i].spoiler = dataObject[i].spoilerColosseum;\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case \"nailsmithStatus\":\r\n SetIconRed(section, i);\r\n dataObject[i].name = dataObject[i].nameDefault;\r\n dataObject[i].spoiler = dataObject[i].spoilerDefault;\r\n\r\n if (playerData.nailsmithKilled === true) {\r\n /* textPrefix = dataObject[i].namePurity;\r\n textSuffix = dataObject[i].spoilerPurity; */\r\n dataObject[i].name = dataObject[i].namePurity;\r\n dataObject[i].spoiler = dataObject[i].spoilerPurity;\r\n\r\n SetIconGreen(section, i);\r\n\r\n } else if (playerData.nailsmithConvoArt === true) {\r\n /* textPrefix = dataObject[i].nameHappyCouple;\r\n textSuffix = dataObject[i].spoilerHappyCouple; */\r\n dataObject[i].name = dataObject[i].nameHappyCouple;\r\n dataObject[i].spoiler = dataObject[i].spoilerHappyCouple;\r\n\r\n SetIconGreen(section, i);\r\n\r\n } else if (playerData.nailsmithSpared === true) {\r\n /* textPrefix = dataObject[i].nameSheoHutWaiting;\r\n textSuffix = dataObject[i].spoilerSheoHutWaiting; */\r\n dataObject[i].name = dataObject[i].nameSheoHutWaiting;\r\n dataObject[i].spoiler = dataObject[i].spoilerSheoHutWaiting;\r\n\r\n } else {\r\n /* textPrefix = dataObject[i].nameUpgradeNail;\r\n textSuffix = dataObject[i].spoilerUpgradeNail; */\r\n dataObject[i].name = dataObject[i].nameUpgradeNail;\r\n dataObject[i].spoiler = dataObject[i].spoilerUpgradeNail;\r\n }\r\n break;\r\n\r\n case \"mrMushroomState1\":\r\n case \"mrMushroomState2\":\r\n case \"mrMushroomState3\":\r\n case \"mrMushroomState4\":\r\n case \"mrMushroomState5\":\r\n case \"mrMushroomState6\":\r\n case \"mrMushroomState7\":\r\n CheckMrMushroomState(section, dataObject[i], playerData[\"mrMushroomState\"]);\r\n break;\r\n\r\n case \"openedTownBuilding\":\r\n case \"openedCrossroads\":\r\n case \"openedGreenpath\":\r\n case \"openedRuins1\":\r\n case \"openedRuins2\":\r\n case \"openedFungalWastes\":\r\n case \"openedRoyalGardens\":\r\n case \"openedRestingGrounds\":\r\n case \"openedDeepnest\":\r\n case \"openedHiddenStation\":\r\n case \"openedStagNest\":\r\n\r\n /* backwards compatibility with earlier game versions */\r\n if (playerData.hasOwnProperty(i) === false) {\r\n\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n\r\n break;\r\n\r\n } else if (playerData[i] === true) {\r\n\r\n SetIconGreen(section, i);\r\n\r\n /* Create amount property before incrementing (avoids NaN) */\r\n if (!dataObject.stagStationsOpened.hasOwnProperty(\"amount\")) {\r\n dataObject.stagStationsOpened.amount = 0;\r\n }\r\n\r\n /* increment the stag stations amount by one */\r\n dataObject.stagStationsOpened.amount++;\r\n\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n\r\n break;\r\n\r\n case \"stagStationsOpened\":\r\n\r\n /* backwards compatibility check */\r\n if (!playerData.hasOwnProperty(\"openedHiddenStation\")) {\r\n\r\n /* Subtract one from maximum for extended completion counting */\r\n dataObject[i].max--;\r\n }\r\n\r\n if (dataObject[i].amount >= dataObject[i].max) {\r\n SetIconGreen(section, i);\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n\r\n break;\r\n\r\n case \"mapCrossroads\":\r\n case \"mapGreenpath\":\r\n case \"mapFungalWastes\":\r\n case \"mapCliffs\":\r\n case \"mapCity\":\r\n case \"mapMines\":\r\n case \"mapWaterways\":\r\n case \"mapRestingGrounds\":\r\n case \"mapAbyss\":\r\n case \"mapOutskirts\":\r\n case \"mapFogCanyon\":\r\n case \"mapRoyalGardens\":\r\n case \"mapDeepnest\":\r\n\r\n if (playerData[i] === true) {\r\n\r\n SetIconGreen(section, i);\r\n\r\n /* Create amount property before incrementing (avoids NaN) */\r\n if (!dataObject.areaMaps.hasOwnProperty(\"amount\")) {\r\n dataObject.areaMaps.amount = 0;\r\n }\r\n\r\n /* increment the area maps amount by one */\r\n dataObject.areaMaps.amount++;\r\n\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n\r\n break;\r\n\r\n case \"areaMaps\":\r\n\r\n if (dataObject[i].amount >= dataObject[i].max) {\r\n SetIconGreen(section, i);\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n\r\n break;\r\n\r\n /* Unobtainable Unbreakable Charms after Grimm Troupe Banishment */\r\n case \"fragileGreed_unbreakable\":\r\n case \"fragileHealth_unbreakable\":\r\n case \"fragileStrength_unbreakable\":\r\n\r\n /* backwards compatibility with earlier game versions */\r\n if (playerData.hasOwnProperty(i) === false) {\r\n\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n\r\n } else if (playerData[i] === true) {\r\n SetIconGreen(section, i);\r\n } else {\r\n\r\n /* If player doesn't have an Unbreakable Charm, and they Banished the Grimm Troupe, the entry needs to be disabled */\r\n if (playerData.hasOwnProperty(\"destroyedNightmareLantern\") && playerData.destroyedNightmareLantern === true) {\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n } else {\r\n SetIconRed(section, i);\r\n }\r\n }\r\n\r\n break;\r\n\r\n default:\r\n\r\n // backwards compatibility with earlier game versions\r\n if (playerData.hasOwnProperty(i) === false) {\r\n\r\n SetIconNone(section, i);\r\n dataObject[i].disabled = true;\r\n // textPrefix = `${dataObject[i].name}`;\r\n break;\r\n\r\n } else if (playerData[i] === true) {\r\n\r\n SetIconGreen(section, i);\r\n } else {\r\n\r\n SetIconRed(section, i);\r\n }\r\n } // end switch (i)\r\n\r\n /* sFillText += PrepareHTMLString(section, textPrefix, textSuffix, wiki); */\r\n } // end for (let i in dataObject)\r\n\r\n // AppendHTML(section, sFillText);\r\n\r\n // ==========================================\r\n // -------------- Methods ---------------- //\r\n\r\n /**\r\n * Verifies if the specific Interactable (Item, Boss, Chest etc.) is activated (completed). Returns true or false.\r\n * @param {string} idText ID text of the Interactable (id in sceneData)\r\n * @param {string} sceneNameText Map codename of the Interactable (sceneName in sceneData)\r\n * @returns {boolean}\r\n */\r\n function FindWorldItem(idText = \"\", sceneNameText = \"\") {\r\n for (let i = 0, length = worldData.length; i < length; i++) {\r\n if (worldData[i].id === idText && worldData[i].sceneName === sceneNameText && worldData[i].activated === true) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Searches for a given item that the player has found and returns the amount of them that the player completed.\r\n * @param {string} itemId Name of the item\r\n * @returns {number}\r\n */\r\n function CountWorldItem(itemId = \"\") {\r\n let total = 0;\r\n for (let i = 0, length = worldData.length; i < length; i++) {\r\n if (worldData[i].id === itemId) {\r\n if (worldData[i].activated === true) total++;\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n /**\r\n * Counts the total amount of Geo Rocks Unbroken or Broken. Logs to console all the Unbroken IDs and Map locations.\r\n * @param {number} arrayLength How many items the Geo Rocks array is currently storing (for iteration)\r\n * @param {string} mode Choose which Geo Rocks to count (broken or unbroken)\r\n */\r\n /* function CountGeoRocks(arrayLength, mode = \"unbroken\") {\r\n\r\n let countTotal = 0;\r\n let geoRocksLog = [];\r\n\r\n if (mode === \"unbroken\") {\r\n for (let i = 0; i < arrayLength; i++) {\r\n if (sceneData.geoRocks[i].hitsLeft > 0) {\r\n countTotal++;\r\n geoRocksLog.push(`#${countTotal} 🏔️ ${sceneData.geoRocks[i].id} 🗺️ ${TranslateMapName(sceneData.geoRocks[i].sceneName)} ⌨️ ${sceneData.geoRocks[i].sceneName}`);\r\n }\r\n }\r\n\r\n if (!countTotal) {\r\n console.log(\"%cAll Geo Rocks Broken!\", \"color: #16c60c; font-weight: 700;\");\r\n } else {\r\n console.groupCollapsed(`%cUnbroken Geo Rocks (${countTotal}):`, \"color: #16c60c; font-weight: 700;\");\r\n\r\n for (let i = 0, length = geoRocksLog.length; i < length; i++) {\r\n console.log(geoRocksLog[i]);\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n } else {\r\n for (let i = 0; i < arrayLength; i++) {\r\n if (sceneData.geoRocks[i].hitsLeft === 0) countTotal++;\r\n }\r\n }\r\n\r\n return countTotal;\r\n } */\r\n\r\n /**\r\n * Counts the amount of in-game Interactables Activated or Not Activated. Logs to console all the Not Activated IDs and Map locations.\r\n * @param {number} arrayLength How many items the Interactables array is currently storing (for iteration)\r\n * @param {string} mode Choose which Interactables to count (notActivated or activated)\r\n */\r\n function CountItems(arrayLength, mode = \"notActivated\") {\r\n\r\n let countTotal = 0;\r\n let itemsLog = [];\r\n\r\n if (mode === \"notActivated\") {\r\n\r\n /* \r\n let list = new ItemListBox(worldData);\r\n \r\n */\r\n\r\n for (let i = 0; i < arrayLength; i++) {\r\n if (worldData[i].activated === false &&\r\n worldData[i].semiPersistent === false) {\r\n countTotal++;\r\n itemsLog.push(`#${countTotal} ${worldData[i].id} 🗺️ ${TranslateMapName(worldData[i].sceneName)} ⌨️ ${worldData[i].sceneName}`);\r\n }\r\n }\r\n\r\n if (!countTotal) {\r\n console.log(\"%cAll Interactables Activated!\", \"color: #16c60c; font-weight: 700;\");\r\n } else {\r\n console.groupCollapsed(`%cInteractables Not Activated (${countTotal}):`, \"color: #16c60c; font-weight: 700;\");\r\n\r\n for (let i = 0, length = itemsLog.length; i < length; i++) {\r\n console.log(itemsLog[i]);\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n } else {\r\n for (let i = 0; i < arrayLength; i++) {\r\n if (worldData[i].activated === true) countTotal++;\r\n }\r\n }\r\n\r\n return countTotal;\r\n }\r\n\r\n /**\r\n * Compares and logs all unrescued Grubs in a list: IDs and map locations\r\n */\r\n /* function LogMissingGrubs() {\r\n\r\n let rescuedGrubsSceneList = [];\r\n\r\n for (let i = 0, length = worldData.length; i < length; i++) {\r\n if (worldData[i].id.includes(\"Grub Bottle\")) {\r\n if (worldData[i].activated === true) {\r\n // There are 3 duplicates of the same map scene name from older game save files. Prevents adding duplicates\r\n // if (worldData[i].sceneName === \"Ruins2_11\" && worldData[i].id === \"Grub Bottle (1)\") {\r\n // continue;\r\n // } else if (worldData[i].sceneName === \"Ruins2_11\" && worldData[i].id === \"Grub Bottle (2)\") {\r\n // continue;\r\n // } else { \r\n rescuedGrubsSceneList.push(worldData[i].sceneName);\r\n // }\r\n }\r\n }\r\n }\r\n\r\n // Filtering the reference database Grub list to include only the missing values\r\n let missingGrubsList = section.grubsList.filter(x => !rescuedGrubsSceneList.includes(x));\r\n let length = missingGrubsList.length;\r\n\r\n if (!length) {\r\n console.log(\"%cAll Grubs Rescued!\", \"color: #16c60c; font-weight: 700;\");\r\n } else {\r\n console.groupCollapsed(`%cUnrescued Grubs (${length}):`, \"color: #16c60c; font-weight: 700;\");\r\n\r\n for (let i = 0; i < length; i++) {\r\n console.log(`#${section.grubsList.indexOf(missingGrubsList[i]) + 1} 🗺️ ${TranslateMapName(missingGrubsList[i])} ⌨️ ${missingGrubsList[i]}`);\r\n }\r\n\r\n console.groupEnd();\r\n }\r\n\r\n return false;\r\n } */\r\n} // end function CheckAdditionalThings()\r\n\r\n/**\r\n * Checks and fills all the 7 locations of Mr Mushroom.\r\n * @param {object} section ID of the HTML element for data appending\r\n * @param {object} entry object containing the Mr Mushroom name and spoilers/locations\r\n * @param {number} mrMushroomState playerData.mrMushroomState read from the save file. (0-8)\r\n */\r\nfunction CheckMrMushroomState(section, entry, mrMushroomState = 0) {\r\n\r\n if (mrMushroomState >= entry.state) {\r\n SetIconGreen(section, `mrMushroomState${entry.state - 1}`);\r\n } else {\r\n SetIconRed(section, `mrMushroomState${entry.state - 1}`);\r\n }\r\n}\r\n\r\n/**\r\n * Checks and marks all the Hunter's Journal creatures entries with amounts, partial completion etc.\r\n * @param {object} db Reference to the HK database\r\n * @param {object} playerData Reference to the player's save data\r\n */\r\nfunction CheckHuntersJournal(db, sectionName, playerData) {\r\n\r\n let section = db.sections[sectionName];\r\n let entries = db.sections[sectionName].entries;\r\n let entriesStatistics = db.sections.statistics.entries;\r\n let name = \"\";\r\n let nameDefault = \"\";\r\n let amountKillsLeft = 0;\r\n\r\n for (let entry in entries) {\r\n\r\n name = entries[entry].nameDefault;\r\n nameDefault = entries[entry].nameDefault;\r\n\r\n entries[entry].name = nameDefault;\r\n\r\n /* Entry Shade always unlocked */\r\n if (entry === \"ShadeJournal\") {\r\n SetIconGreen(section, entry);\r\n\r\n /* Proceed to next entry immediately */\r\n continue;\r\n }\r\n\r\n if (playerData.hasOwnProperty(`kills${entry}`)) {\r\n\r\n switch (entry) {\r\n\r\n case \"GreyPrince\":\r\n case \"ZotelingBalloon\":\r\n case \"ZotelingHopper\":\r\n case \"ZotelingBuzzer\":\r\n\r\n /* When Zote == OFF (Neglect route), fade the entry and move to the next iteration */\r\n if (playerData.zoteDead === true || (playerData.zoteRescuedBuzzer === false && playerData.hasWalljump === true)) {\r\n\r\n entries[entry].disabled = true;\r\n entries[entry].name = nameDefault;\r\n SetIconNone(section, entry);\r\n\r\n continue;\r\n }\r\n\r\n break;\r\n\r\n case \"FlameBearerLarge\":\r\n\r\n /* If the troupe was banished and the player didn't defeat any Grimmkin Nightmare, then it's entry cannot be obtained on this save */\r\n if (playerData.destroyedNightmareLantern === true && playerData.killedFlameBearerLarge === false) {\r\n\r\n entries[entry].disabled = true;\r\n entries[entry].name = nameDefault;\r\n SetIconNone(section, entry);\r\n\r\n continue;\r\n }\r\n\r\n break;\r\n\r\n case \"NightmareGrimm\":\r\n\r\n /* if the troupe was banished, the Nightmare King entry cannot be obtained on this save */\r\n if (playerData.destroyedNightmareLantern === true) {\r\n\r\n entries[entry].disabled = true;\r\n entries[entry].name = nameDefault;\r\n SetIconNone(section, entry);\r\n\r\n continue;\r\n }\r\n\r\n break;\r\n }\r\n\r\n amountKillsLeft = playerData[`kills${entry}`];\r\n\r\n /* When killed at least 1, the entry has a gray symbol */\r\n if (playerData[`killed${entry}`] === true) {\r\n\r\n SetIconPartialJournal(section, entry);\r\n\r\n /* When not killed, the entry is undiscovered */\r\n } else {\r\n\r\n SetIconRed(section, entry);\r\n }\r\n\r\n /* When the Hunter's Note is unlocked, the entry has a green symbol */\r\n if (amountKillsLeft === 0) {\r\n\r\n SetIconGreen(section, entry);\r\n\r\n /* If not, show how many remain to defeat in the name */\r\n } else {\r\n\r\n name += ` (${amountKillsLeft})`;\r\n entries[entry].name = name;\r\n }\r\n\r\n /* Void Idol backwards compatibility */\r\n if (entry === \"VoidIdol_1\") {\r\n if (playerData.killedVoidIdol_1 === false &&\r\n (playerData.killedVoidIdol_2 === true || playerData.killedVoidIdol_3 === true)) {\r\n\r\n SetIconGreen(section, entry);\r\n entries[entry].name = nameDefault;\r\n }\r\n }\r\n\r\n /* Earlier save files backwards compatibility (no undefined) */\r\n } else {\r\n\r\n amountKillsLeft = 0;\r\n entries[entry].disabled = true;\r\n entries[entry].name = name;\r\n\r\n /* Subtract one from maximum of journal entries (for extended completion and green icons) */\r\n switch (entry) {\r\n case \"VoidIdol_1\":\r\n case \"VoidIdol_2\":\r\n case \"VoidIdol_3\":\r\n case \"BindingSeal\":\r\n case \"GodseekerMask\":\r\n\r\n break;\r\n\r\n default:\r\n\r\n entriesStatistics.journalEntriesCompleted.max--;\r\n entriesStatistics.journalNotesCompleted.max--;\r\n }\r\n\r\n SetIconNone(section, entry);\r\n }\r\n }\r\n}\r\n\r\n\r\nfunction CheckPantheon(db, sectionName, playerData) {\r\n\r\n let section = db.sections[sectionName];\r\n let property = db.sections[sectionName].property;\r\n let entries = db.sections[sectionName].entries;\r\n\r\n for (let entry in entries) {\r\n\r\n /* Backwards compatibility, disable and skip to next when not found */\r\n if (!playerData.hasOwnProperty(property)) {\r\n\r\n SetIconNone(section, entry);\r\n entries[entry].disabled = true;\r\n\r\n continue;\r\n }\r\n\r\n if (playerData[property][entry] === true) {\r\n\r\n switch (entry) {\r\n\r\n case \"boundNail\":\r\n SetIcon(section, entry, \"bindingNail\");\r\n break;\r\n\r\n case \"boundShell\":\r\n SetIcon(section, entry, \"bindingShell\");\r\n break;\r\n\r\n case \"boundCharms\":\r\n SetIcon(section, entry, \"bindingCharms\");\r\n break;\r\n\r\n case \"boundSoul\":\r\n SetIcon(section, entry, \"bindingSoul\");\r\n break;\r\n\r\n case \"allBindings\":\r\n SetIcon(section, entry, \"bindingAll\");\r\n break;\r\n\r\n default:\r\n SetIconGreen(section, entry);\r\n }\r\n } else {\r\n SetIconRed(section, entry);\r\n }\r\n }\r\n}\r\n\r\n\r\nfunction CheckHallOfGods(db, playerData) {\r\n\r\n let section = db.sections.hallOfGods;\r\n let entries = db.sections.hallOfGods.entries;\r\n let id = \"\";\r\n let check = \"\";\r\n let isUnlocked = false;\r\n\r\n for (let entry in entries) {\r\n\r\n id = entries[entry].id;\r\n\r\n /* Backwards compatibility, disable and skip to next when not found */\r\n if (!playerData.hasOwnProperty(`statueState${id}`)) {\r\n\r\n SetIconNone(section, entry);\r\n entries[entry].disabled = true;\r\n\r\n continue;\r\n }\r\n\r\n check = entries[entry].check;\r\n isUnlocked = playerData[`statueState${id}`].isUnlocked;\r\n\r\n switch (entry) {\r\n\r\n case \"GreyPrinceUnlocked\":\r\n case \"GreyPrinceAttuned\":\r\n case \"GreyPrinceAscended\":\r\n case \"GreyPrinceRadiant\":\r\n\r\n /* When Zote OFF, disable entry and skip to next entry */\r\n if (playerData.zoteRescuedBuzzer === false && playerData.hasWalljump === true) {\r\n\r\n SetIconNone(section, entry);\r\n entries[entry].disabled = true;\r\n\r\n continue;\r\n }\r\n }\r\n\r\n if (playerData[`statueState${id}`][check] === true) {\r\n\r\n switch (check) {\r\n\r\n case \"isUnlocked\":\r\n SetIconGreen(section, entry);\r\n break;\r\n\r\n case \"completedTier1\":\r\n SetIcon(section, entry, \"attuned\");\r\n break;\r\n\r\n case \"completedTier2\":\r\n SetIcon(section, entry, \"ascended\");\r\n break;\r\n\r\n case \"completedTier3\":\r\n SetIcon(section, entry, \"radiant\");\r\n break;\r\n\r\n default:\r\n SetIcon(section, entry, \"partial\");\r\n break;\r\n }\r\n\r\n }\r\n /* When boss is only unlocked, other entries get a gray icon (awaiting completion) */\r\n else if (isUnlocked) {\r\n SetIcon(section, entry, \"partial\");\r\n }\r\n /* When not unlocked, every entry gets a red icon */\r\n else {\r\n SetIconRed(section, entry);\r\n }\r\n\r\n } /* end for (let entry in entries) */\r\n\r\n}\r\n\r\n\r\n/**\r\n * Checks, validates and shows hints to the player depending on their save progression, in chronological order. Shows only hint for the last uncompleted event. If Hollow Knight is defeated, shows a dummy text.\r\n * @param {object} section object containing div hints ID and h2 title\r\n * @param {object} dataObject object containing all hints data\r\n * @param {object} playerData object containing HK Player Data to look in\r\n * @param {object} worldData object containing HK World Data to look in\r\n * @returns {boolean} true when defeated Hollow Knight, false if not\r\n */\r\nfunction CheckHintsTrue(section, dataObject, playerData, worldData) {\r\n\r\n /* let sFillText = \"\"; */\r\n\r\n if (playerData.killedHollowKnight === true) {\r\n // a text to show when player already finished their first playthrough (killed Hollow Knight first time)\r\n /* AppendHTML(section, \"...a successful Knight who doesn't need hints anymore. The Knight explores the world of Hallownest patiently in constant search of its remaining secrets...\"); */\r\n section.current = \"endOfHints\";\r\n return true;\r\n }\r\n\r\n for (let i in dataObject) {\r\n\r\n if (i === \"endOfHints\") {\r\n break;\r\n } else if (playerData[i] === true) {\r\n continue;\r\n } else if (i === \"fireballLevel\") {\r\n if (playerData[i] >= 1) {\r\n continue;\r\n } else {\r\n section.current = i;\r\n break;\r\n }\r\n } else if (i === \"Crossroads_04\") {\r\n let GruzMotherDefeated = false;\r\n\r\n for (let k = 0, length = worldData.length; k < length; k++) {\r\n if (worldData[k].id === \"Battle Scene\" && worldData[k].sceneName === \"Crossroads_04\" && worldData[k].activated === true) {\r\n GruzMotherDefeated = true;\r\n break;\r\n }\r\n }\r\n if (GruzMotherDefeated) {\r\n continue; // next dataObject (i)\r\n } else {\r\n section.current = i;\r\n break;\r\n }\r\n } else if (i === \"dungDefenderOrHornet2\") {\r\n if (playerData.defeatedDungDefender === true) {\r\n continue;\r\n } else if (playerData.hornetOutskirtsDefeated === true) {\r\n continue;\r\n } else { // if no Dung Defender or Hornet 2\r\n section.current = i;\r\n break;\r\n }\r\n } else if (i === \"ismaTearOrShadeCloak\") {\r\n if (playerData.hasAcidArmour === true) {\r\n continue;\r\n } else if (playerData.hasKingsBrand === true) {\r\n if (playerData.hasShadowDash === true) {\r\n continue;\r\n } else { // if Kings Brand but no Shade Cloak\r\n section.current = i;\r\n break;\r\n }\r\n } else { // if no Isma's Tear or Kings Brand\r\n section.current = i;\r\n break;\r\n }\r\n } else { // if anything from the hints list is not done\r\n section.current = i;\r\n break;\r\n }\r\n } // end: for (let i in dataObject)\r\n\r\n // AppendHTML(section, sFillText);\r\n} // function CheckHintsTrue()\r\n\r\n/**\r\n * Pre-Cleans HTML. Reads contents inside text area and parses it to a JavaScript object. If not empty, runs HKCheckCompletion() to check data.\r\n */\r\nfunction HKReadTextArea(textAreaId = \"\") {\r\n\r\n // start benchmark\r\n benchmarkTimes.HKReadTextArea.timeStart = performance.now();\r\n\r\n let contents = document.getElementById(textAreaId).value;\r\n\r\n if (contents.length) {\r\n\r\n // starts the main HTML generating function GenerateInnerHTML() and ensures proper checkbox behaviour\r\n InitializeHTMLPopulation(HK);\r\n\r\n try {\r\n let jsonObject = JSON.parse(contents);\r\n // console.log(jsonObject);\r\n if (jsonObject.hasOwnProperty(\"playerData\")) {\r\n\r\n HKCheckCompletion(jsonObject);\r\n }\r\n\r\n // end benchmark and show results\r\n benchmarkTimes.HKReadTextArea.timeEnd = performance.now();\r\n\r\n let result = benchmarkTimes.HKReadTextArea.timeEnd - benchmarkTimes.HKReadTextArea.timeStart;\r\n\r\n console.info(`HKReadTextArea() time (ms) = %c${result.toFixed(2)}`, `color: #008cdc; font-weight: 700;`);\r\n\r\n } catch (error) {\r\n HK.saveAnalyzed = false;\r\n alert(`This seems like not a valid Hollow Knight save.\\n${error}`);\r\n console.info(`This seems like not a valid Hollow Knight save.\\n${error}`);\r\n }\r\n } else {\r\n /* reset timer */\r\n benchmarkTimes.HKReadTextArea.timeStart = 0;\r\n }\r\n}\r\n\r\n/**\r\n * Populate all HTML with given ID and their initial data set as false (used at DOM load)\r\n * @param {object} db JavaScript Object containing all HTML IDs to populate\r\n */\r\nfunction InitializeHTMLPopulation(db) {\r\n\r\n GenerateInnerHTML(db);\r\n\r\n // Check local storage first to set proper checkbox state before the below functions start (default is always unchecked)\r\n if (StorageAvailable('localStorage')) {\r\n if (localStorage.getItem(\"hkCheckboxHints\") === \"checked\") document.getElementById(\"checkbox-hints\").checked = true;\r\n if (localStorage.getItem(\"hkCheckboxSpoilers\") === \"checked\") document.getElementById(\"checkbox-spoilers\").checked = true;\r\n }\r\n\r\n // Prevents wrong checkbox behaviour (must run after everything is finished)\r\n CheckboxHintsToggle();\r\n CheckboxSpoilersToggle();\r\n}\r\n\r\n/**\r\n * Reset the object state in memory to default values, like before first save analyzing. Undo all changes.\r\n * @param {object} db database object reference\r\n */\r\nfunction ResetCompletion(db) {\r\n\r\n let sections = db.sections;\r\n let entries = {};\r\n\r\n db.saveAnalyzed = false;\r\n\r\n /* Bring Extended Completion to default values (0) */\r\n let gameCompletionExtended = db.sections.intro.entries.gameCompletionExtended;\r\n let intro = db.sections.intro;\r\n\r\n intro.extendedCompletionDone = 0;\r\n intro.extendedCompletionTotal = 0;\r\n gameCompletionExtended.spoiler = 0;\r\n gameCompletionExtended.spoilerAfter = \"\";\r\n\r\n for (let section in sections) {\r\n entries = sections[section].entries;\r\n\r\n if (sections[section].hasOwnProperty(\"percent\")) sections[section].percent = 0;\r\n\r\n switch (section) {\r\n case \"intro\":\r\n case \"hints\":\r\n break;\r\n\r\n default:\r\n\r\n for (let entry in entries) {\r\n if (entries[entry].hasOwnProperty(\"icon\")) {\r\n entries[entry].icon = \"red\";\r\n }\r\n\r\n if (entries[entry].hasOwnProperty(\"disabled\")) {\r\n entries[entry].disabled = false;\r\n }\r\n\r\n if (entries[entry].hasOwnProperty(\"amount\")) {\r\n entries[entry].amount = 0;\r\n }\r\n\r\n if (entries[entry].hasOwnProperty(\"amountTotal\")) {\r\n entries[entry].amountTotal = 0;\r\n }\r\n\r\n if (entries[entry].hasOwnProperty(\"max\")) {\r\n entries[entry].max = entries[entry].maxDefault;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/* -------------------------- Classes --------------------------------------------------------------------------------------- */\r\n\r\nclass DataChecker {\r\n\r\n /**\r\n * Used for checking and verifying data (like Grubs, Items or Geo Rocks) inside a player's save file.\r\n * Pass a save to the object and it will be split automatically to playerData, boolData and geoRocksData.\r\n * @param {object} saveFile The whole player's save file, in JSON format\r\n */\r\n constructor(saveFile) {\r\n this.saveFile = saveFile;\r\n this.playerData = saveFile.playerData;\r\n this.boolData = saveFile.sceneData.persistentBoolItems;\r\n this.geoRocksData = saveFile.sceneData.geoRocks;\r\n }\r\n\r\n /**\r\n * Verifies if a specific Collectible is found in boolData and returns true/false.\r\n * @param {string} id the Collectible's id in the database.\r\n * @param {string} sceneName the Collectible's sceneName in the database.\r\n * @returns {boolean}\r\n */\r\n _FindItem(entry = {}) {\r\n\r\n for (let i = 0, length = this.boolData.length; i < length; i++) {\r\n if (this.boolData[i].id === entry.id &&\r\n this.boolData[i].sceneName === entry.sceneName &&\r\n this.boolData[i].activated === true) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n } // end _FindItem\r\n\r\n /**\r\n * Verifies if a specific Geo Rock is destroyed and returns true/false.\r\n * @param {string} id the Geo Rock's id in the database.\r\n * @param {string} sceneName the Geo Rock's sceneName in the database.\r\n * @returns {boolean}\r\n */\r\n _FindGeoRock(entry = {}) {\r\n\r\n for (let i = 0, length = this.geoRocksData.length; i < length; i++) {\r\n if (this.geoRocksData[i].id === entry.id &&\r\n this.geoRocksData[i].sceneName === entry.sceneName &&\r\n this.geoRocksData[i].hitsLeft === 0) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n } // end _FindGeoRock\r\n\r\n /**\r\n * Verifies the status of all items in a given section (e.g. Grubs or Whispering Roots) from the database.\r\n * @param {object} section Provide a section object to check.\r\n */\r\n checkItems(section) {\r\n this.section = section;\r\n this.entries = section.entries;\r\n\r\n for (let entry in this.entries) {\r\n \r\n switch(entry) {\r\n\r\n // The Collector: Tower of Love Grubs activation Bug in the game - needs a workaround.\r\n // All 3 Grubs in the Tower of Love must be treated as one.\r\n case \"grub33\":\r\n case \"grub34\":\r\n\r\n if (this.entries.grub32.icon === \"green\") {\r\n SetIconGreen(this.section, entry);\r\n } else {\r\n SetIconRed(this.section, entry);\r\n }\r\n\r\n break;\r\n\r\n // playerData activation checks true/false\r\n case \"hallownestSeal17\": // The Seer's Essence Reward - Hallownest Seal\r\n case \"arcaneEgg2\": // The Seer's Essence Reward - Arcane Egg\r\n case \"rancidEgg20\": // Sly's Rancid Egg shop item\r\n\r\n if (this.playerData[this.entries[entry].id] === true) {\r\n SetIconGreen(this.section, entry);\r\n } else {\r\n SetIconRed(this.section, entry);\r\n }\r\n\r\n break;\r\n\r\n // Tuk's Rancid Egg - Normal or Steel Soul mode behaviour\r\n case \"rancidEgg21\":\r\n\r\n // Steel Soul\r\n if (this.playerData.permadeathMode > 0) {\r\n\r\n // id: \"Shiny Item\", sceneName: \"Waterways_03\"\r\n if (this._FindItem(this.entries[entry])) {\r\n SetIconGreen(this.section, entry);\r\n } else {\r\n SetIconRed(this.section, entry);\r\n }\r\n\r\n // Set Steel Soul text description\r\n this.entries[entry].spoiler = this.entries[entry].spoilerSteelSoul;\r\n }\r\n // Normal Mode\r\n else {\r\n\r\n // playerData.tukDungEgg\r\n if (this.playerData[this.entries[entry].idPlayerData] === true) {\r\n SetIconGreen(this.section, entry);\r\n } else {\r\n SetIconRed(this.section, entry);\r\n }\r\n\r\n // Set Normal Mode text description\r\n this.entries[entry].spoiler = this.entries[entry].spoilerNormal;\r\n }\r\n\r\n break;\r\n\r\n // missable Arcane Egg in Lifeblood Core Room\r\n case \"arcaneEgg4\":\r\n\r\n if (this._FindItem(this.entries[entry])) {\r\n SetIconGreen(this.section, entry);\r\n }\r\n // When got the Lifeblood Core charm, but didn't pick up the Arcane Egg\r\n else if (this.playerData.gotCharm_9 === true) {\r\n SetIconNone(this.section, entry);\r\n this.entries[entry].disabled = true;\r\n } else {\r\n SetIconRed(this.section, entry);\r\n }\r\n\r\n break;\r\n\r\n // boolData activation checks\r\n default:\r\n\r\n if (this._FindItem(this.entries[entry])) {\r\n SetIconGreen(this.section, entry);\r\n } else {\r\n SetIconRed(this.section, entry);\r\n }\r\n }\r\n }\r\n } // end checkItems\r\n\r\n /**\r\n * Verifies the status of all Geo Rocks from the database.\r\n * @param {object} section Provide a Geo Rocks section object to check.\r\n */\r\n checkGeoRocks(section) {\r\n this.section = section;\r\n this.entries = section.entries;\r\n\r\n for (let entry in this.entries) {\r\n \r\n switch(entry) {\r\n\r\n default:\r\n\r\n if (this._FindGeoRock(this.entries[entry])) {\r\n SetIconGreen(this.section, entry);\r\n } else {\r\n SetIconRed(this.section, entry);\r\n }\r\n }\r\n }\r\n } // end checkGeoRocks\r\n\r\n} // end class DataChecker\r\n\r\n/* ----------------------- Event Listeners -------------------------- */\r\n\r\n// Populate HTML at load (before img and css)\r\ndocument.addEventListener(\"DOMContentLoaded\", () => {\r\n InitializeHTMLPopulation(HK);\r\n});\r\n\r\n// Analyze Text button\r\ndocument.getElementById(\"save-area-read\").addEventListener(\"click\", () => {\r\n HKReadTextArea(\"save-area\");\r\n}, false);\r\n\r\nexport {\r\n // to use in LoadSaveFile.js for auto-analyzing file after decoding\r\n HKCheckCompletion\r\n};","/* \r\n Parts of the code thanks to bloodorca https://github.com/bloodorca/hollow (base64.js, functions.js) with slight modifications.\r\n The steps used there for decryption were taken from KayDeeTee https://github.com/KayDeeTee/Hollow-Knight-SaveManager\r\n Without these two people the existence of this tool wouldn't be possible :)\r\n*/\r\n\r\n// ---------------- Constants ----------------- //\r\n\r\n// AES JS for file decryption\r\nconst aesjs = require(\"./aes-js.js\");\r\n// For reading the text area after save decoding\r\nimport {\r\n HKCheckCompletion\r\n} from \"./HKCheckCompletion.js\";\r\n\r\nimport {\r\n Benchmark,\r\n benchmarkTimes\r\n} from \"./page-functions.js\";\r\n\r\nconst CSHARP_HEADER = [0, 1, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0]; // 22 bytes\r\n\r\nconst BASE64_ARRAY = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".split(\"\").map(c => c.charCodeAt(0));\r\nconst BASE64_DECODE_TABLE = new Map(BASE64_ARRAY.map((ord, i) => [ord, i]));\r\n\r\nconst AES_KEY = new TextEncoder().encode('UKu52ePUBwetZ9wNX88o54dnfKRu0T1l'); // encodes a string to Uint8Array (prepare for AES JS)\r\nconst ECB_STREAM_CIPHER = new aesjs.ModeOfOperation.ecb(AES_KEY); // create a new AES stream cipher object using the encoded key\r\n\r\n// ---------------- Variables ----------------- //\r\n\r\n/* let benchLSFBegin, benchLSFEnd, benchTotal; */\r\n\r\n// ---------------- Functions ----------------- //\r\n\r\n/**\r\n * Main input tag file function. Selects the first file, reads it as an Array Buffer, starts the processing of the file when loaded.\r\n * Starts benchmarking.\r\n * @param {FileList} input FileList object containing a list of File objects. The FileList behaves like an array, so you can check its length property to get the number of selected files.\r\n */\r\n// eslint-disable-next-line no-unused-vars\r\nfunction LoadSaveFile(input, time) {\r\n\r\n const inputFileList = input.files;\r\n // console.info(\"Input length: \" + input.files.length)\r\n // Cease further processing if user canceled the file input dialog\r\n if (inputFileList.length < 1) return false;\r\n\r\n // start benchmark\r\n benchmarkTimes.LoadSaveFile.timeStart = time;\r\n benchmarkTimes.Total.timeStart = time;\r\n benchmarkTimes.HKReadTextArea.timeStart = 0;\r\n benchmarkTimes.HKReadTextArea.timeEnd = 0;\r\n\r\n // Prepares a File object from the first file of the input files for reading as an Array Buffer\r\n let inputFileObject = inputFileList[0];\r\n\r\n // Cleans the file list to avoid problems after subsequent use\r\n // document.getElementById(\"save-area-file\").value = \"\";\r\n\r\n // 1. read file\r\n // The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer.\r\n // It is an array of bytes, often referred to in other languages as a \"byte array\".\r\n\r\n // new FileReader()\r\n let inputReader = new FileReader();\r\n // readAsArrayBuffer(file)\r\n inputReader.readAsArrayBuffer(inputFileObject);\r\n // addEventListener(\"load\", function) - to decode the file when loaded\r\n inputReader.addEventListener(\"load\", ProcessFileObject);\r\n}\r\n\r\n/**\r\n * Reads the File object as an Array Buffer and does all other operations (decoding, decryption, conversion to string, pasting to text area).\r\n * Launches the HKReadTextArea() function automatically after pasting the string to text area\r\n */\r\nfunction ProcessFileObject() {\r\n let inputArrayBuffer = this.result;\r\n let decodedString;\r\n\r\n // 2. Decode file\r\n\r\n try {\r\n // Uint8Array(ArrayBuffer) uint8_t equivalent in C\r\n inputArrayBuffer = new Uint8Array(inputArrayBuffer);\r\n\r\n // ArrayBuffer.slice()\r\n // The slice() method copies up to, but not including, the byte indicated by the end parameter.\r\n inputArrayBuffer.slice();\r\n\r\n // remove C# header and LengthPrefixedString header (ArrayBuffer)\r\n inputArrayBuffer = RemoveHeaders(inputArrayBuffer);\r\n\r\n // base64 Decoding (ArrayBuffer)\r\n inputArrayBuffer = Base64Decode(inputArrayBuffer);\r\n\r\n // AES decryption (ECB) removes pkcs7 padding (ArrayBuffer)\r\n inputArrayBuffer = AESDecryption(inputArrayBuffer);\r\n\r\n // Convert ArrayBuffer to string/text TextDecoder().decode(ArrayBuffer)\r\n decodedString = new TextDecoder().decode(inputArrayBuffer);\r\n\r\n // finish and show benchmark\r\n /* benchLSFEnd = new Date(); */\r\n benchmarkTimes.LoadSaveFile.timeEnd = performance.now();\r\n /* console.info(\"LoadSaveFile() time (ms) =\", benchLSFEnd - benchLSFBegin); */\r\n\r\n // 4. Analyze the decoded string immediately\r\n try {\r\n HKCheckCompletion(JSON.parse(decodedString));\r\n } catch (error) {\r\n alert(`This seems like not a valid Hollow Knight save. ${error}`);\r\n console.info(`This seems like not a valid Hollow Knight save. ${error}`);\r\n }\r\n\r\n // 5. Paste decoded string file to text area\r\n (async () => {\r\n document.getElementById(\"save-area\").value = \"\";\r\n document.getElementById(\"save-area\").value = await decodedString;\r\n })();\r\n\r\n // finish total and show benchmark\r\n benchmarkTimes.Total.timeEnd = performance.now();\r\n\r\n Benchmark(benchmarkTimes);\r\n /* console.info(\"Total time (ms) =\", benchTotal - benchLSFBegin); */\r\n\r\n // alert(`Decoded String: ${decodedString}`);\r\n // alert(`Array Buffer: ${inputArrayBuffer}`);\r\n } catch (error) {\r\n alert(`The file cannot be decoded. ${error}`);\r\n console.info(`The file cannot be decoded. ${error}`);\r\n }\r\n}\r\n\r\n/**\r\n * Removes C# header, LengthPrefixedString header and byte 11 at the end of the Uint8 Array Buffer\r\n * @param {Uint8Array} buffer Uint8Array buffer for removing the header from\r\n * @param {Uint8Array} csHeader Uint8Array for the C# header length calculation\r\n * @returns {Uint8Array}\r\n */\r\nfunction RemoveHeaders(buffer, csHeader = CSHARP_HEADER) {\r\n // Remove the fixed C# header and byte 11 at the end. \r\n buffer = buffer.subarray(csHeader.length, buffer.length - 1);\r\n\r\n // Remove LengthPrefixedString header\r\n let lengthCount = 0;\r\n for (let i = 0; i < 5; i++) {\r\n lengthCount++;\r\n if ((buffer[i] & 0x80) == 0) {\r\n break;\r\n }\r\n }\r\n\r\n return buffer.subarray(lengthCount);\r\n}\r\n\r\n/**\r\n * Decodes an Array Buffer using a Base64 decode table\r\n * @param {Uint8Array} buffer Uint8Array Buffer to decode\r\n * @returns {Uint8Array}\r\n */\r\nfunction Base64Decode(buffer) {\r\n buffer = new Uint8Array(buffer).slice();\r\n buffer = buffer.map(v => BASE64_DECODE_TABLE.get(v));\r\n\r\n // The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present.\r\n let p = buffer.indexOf(64);\r\n let end;\r\n\r\n if (p != -1) {\r\n end = p;\r\n } else {\r\n end = buffer.length;\r\n }\r\n\r\n buffer = buffer.subarray(0, end);\r\n\r\n let output = new Uint8Array(3 * buffer.length / 4);\r\n let continuous = Math.floor(buffer.length / 4) * 4;\r\n\r\n for (let i = 0; i < continuous; i += 4) {\r\n let k = 3 * i / 4;\r\n output[k] = buffer[i] << 2 | buffer[i + 1] >> 4;\r\n output[k + 1] = (buffer[i + 1] & 0x0F) << 4 | buffer[i + 2] >> 2;\r\n output[k + 2] = (buffer[i + 2] & 0x03) << 6 | buffer[i + 3];\r\n }\r\n if (buffer[continuous] != undefined) {\r\n let k = 3 * continuous / 4;\r\n output[k] = buffer[continuous] << 2 | buffer[continuous + 1] >> 4;\r\n if (buffer[continuous + 2] != undefined) {\r\n output[k + 1] = (buffer[continuous + 1] & 0x0F) << 4 | buffer[continuous + 2] >> 2;\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n\r\n/**\r\n * Decrypt an Uint8Array Buffer using aesjs (ECB) and a predefined AES key + remove pkcs7 padding\r\n * @param {Uint8Array} buffer Uint8Array buffer to decrypt\r\n * @returns {Uint8Array}\r\n */\r\nfunction AESDecryption(buffer, cipherObject = ECB_STREAM_CIPHER) {\r\n let output = cipherObject.decrypt(buffer);\r\n return output.subarray(0, -output[output.length - 1]);\r\n}\r\n\r\n// Assign actions (functions) to launch when a specific element is used\r\ndocument.getElementById(\"save-area-file\").addEventListener(\"change\", (event) => {\r\n LoadSaveFile(event.target, performance.now());\r\n});\r\ndocument.getElementById(\"save-area-file\").addEventListener(\"click\", (mouseEvent) => {\r\n mouseEvent.target.value = \"\";\r\n});\r\n\r\nexport {\r\n LoadSaveFile\r\n};","/* eslint-disable */\n\"use strict\";\n\n(function (root) {\n\n function checkInt(value) {\n return (parseInt(value) === value);\n }\n\n function checkInts(arrayish) {\n if (!checkInt(arrayish.length)) {\n return false;\n }\n\n for (var i = 0; i < arrayish.length; i++) {\n if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {\n return false;\n }\n }\n\n return true;\n }\n\n function coerceArray(arg, copy) {\n\n // ArrayBuffer view\n if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === 'Uint8Array') {\n\n if (copy) {\n if (arg.slice) {\n arg = arg.slice();\n } else {\n arg = Array.prototype.slice.call(arg);\n }\n }\n\n return arg;\n }\n\n // It's an array; check it is a valid representation of a byte\n if (Array.isArray(arg)) {\n if (!checkInts(arg)) {\n throw new Error('Array contains invalid value: ' + arg);\n }\n\n return new Uint8Array(arg);\n }\n\n // Something else, but behaves like an array (maybe a Buffer? Arguments?)\n if (checkInt(arg.length) && checkInts(arg)) {\n return new Uint8Array(arg);\n }\n\n throw new Error('unsupported array-like object');\n }\n\n function createArray(length) {\n return new Uint8Array(length);\n }\n\n function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {\n if (sourceStart != null || sourceEnd != null) {\n if (sourceArray.slice) {\n sourceArray = sourceArray.slice(sourceStart, sourceEnd);\n } else {\n sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);\n }\n }\n targetArray.set(sourceArray, targetStart);\n }\n\n\n\n var convertUtf8 = (function () {\n function toBytes(text) {\n var result = [],\n i = 0;\n text = encodeURI(text);\n while (i < text.length) {\n var c = text.charCodeAt(i++);\n\n // if it is a % sign, encode the following 2 bytes as a hex value\n if (c === 37) {\n result.push(parseInt(text.substr(i, 2), 16))\n i += 2;\n\n // otherwise, just the actual byte\n } else {\n result.push(c)\n }\n }\n\n return coerceArray(result);\n }\n\n function fromBytes(bytes) {\n var result = [],\n i = 0;\n\n while (i < bytes.length) {\n var c = bytes[i];\n\n if (c < 128) {\n result.push(String.fromCharCode(c));\n i++;\n } else if (c > 191 && c < 224) {\n result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f)));\n i += 2;\n } else {\n result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f)));\n i += 3;\n }\n }\n\n return result.join('');\n }\n\n return {\n toBytes: toBytes,\n fromBytes: fromBytes,\n }\n })();\n\n var convertHex = (function () {\n function toBytes(text) {\n var result = [];\n for (var i = 0; i < text.length; i += 2) {\n result.push(parseInt(text.substr(i, 2), 16));\n }\n\n return result;\n }\n\n // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html\n var Hex = '0123456789abcdef';\n\n function fromBytes(bytes) {\n var result = [];\n for (var i = 0; i < bytes.length; i++) {\n var v = bytes[i];\n result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);\n }\n return result.join('');\n }\n\n return {\n toBytes: toBytes,\n fromBytes: fromBytes,\n }\n })();\n\n\n // Number of rounds by keysize\n var numberOfRounds = {\n 16: 10,\n 24: 12,\n 32: 14\n }\n\n // Round constant words\n var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91];\n\n // S-box and Inverse S-box (S is for Substitution)\n var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];\n var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d];\n\n // Transformations for encryption\n var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];\n var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];\n var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];\n var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c];\n\n // Transformations for decryption\n var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];\n var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];\n var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];\n var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0];\n\n // Transformations for decryption key expansion\n var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];\n var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];\n var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];\n var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];\n\n function convertToInt32(bytes) {\n var result = [];\n for (var i = 0; i < bytes.length; i += 4) {\n result.push(\n (bytes[i] << 24) |\n (bytes[i + 1] << 16) |\n (bytes[i + 2] << 8) |\n bytes[i + 3]\n );\n }\n return result;\n }\n\n var AES = function (key) {\n if (!(this instanceof AES)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n Object.defineProperty(this, 'key', {\n value: coerceArray(key, true)\n });\n\n this._prepare();\n }\n\n\n AES.prototype._prepare = function () {\n\n var rounds = numberOfRounds[this.key.length];\n if (rounds == null) {\n throw new Error('invalid key size (must be 16, 24 or 32 bytes)');\n }\n\n // encryption round keys\n this._Ke = [];\n\n // decryption round keys\n this._Kd = [];\n\n for (var i = 0; i <= rounds; i++) {\n this._Ke.push([0, 0, 0, 0]);\n this._Kd.push([0, 0, 0, 0]);\n }\n\n var roundKeyCount = (rounds + 1) * 4;\n var KC = this.key.length / 4;\n\n // convert the key into ints\n var tk = convertToInt32(this.key);\n\n // copy values into round key arrays\n var index;\n for (var i = 0; i < KC; i++) {\n index = i >> 2;\n this._Ke[index][i % 4] = tk[i];\n this._Kd[rounds - index][i % 4] = tk[i];\n }\n\n // key expansion (fips-197 section 5.2)\n var rconpointer = 0;\n var t = KC,\n tt;\n while (t < roundKeyCount) {\n tt = tk[KC - 1];\n tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^\n (S[(tt >> 8) & 0xFF] << 16) ^\n (S[tt & 0xFF] << 8) ^\n S[(tt >> 24) & 0xFF] ^\n (rcon[rconpointer] << 24));\n rconpointer += 1;\n\n // key expansion (for non-256 bit)\n if (KC != 8) {\n for (var i = 1; i < KC; i++) {\n tk[i] ^= tk[i - 1];\n }\n\n // key expansion for 256-bit keys is \"slightly different\" (fips-197)\n } else {\n for (var i = 1; i < (KC / 2); i++) {\n tk[i] ^= tk[i - 1];\n }\n tt = tk[(KC / 2) - 1];\n\n tk[KC / 2] ^= (S[tt & 0xFF] ^\n (S[(tt >> 8) & 0xFF] << 8) ^\n (S[(tt >> 16) & 0xFF] << 16) ^\n (S[(tt >> 24) & 0xFF] << 24));\n\n for (var i = (KC / 2) + 1; i < KC; i++) {\n tk[i] ^= tk[i - 1];\n }\n }\n\n // copy values into round key arrays\n var i = 0,\n r, c;\n while (i < KC && t < roundKeyCount) {\n r = t >> 2;\n c = t % 4;\n this._Ke[r][c] = tk[i];\n this._Kd[rounds - r][c] = tk[i++];\n t++;\n }\n }\n\n // inverse-cipher-ify the decryption round key (fips-197 section 5.3)\n for (var r = 1; r < rounds; r++) {\n for (var c = 0; c < 4; c++) {\n tt = this._Kd[r][c];\n this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^\n U2[(tt >> 16) & 0xFF] ^\n U3[(tt >> 8) & 0xFF] ^\n U4[tt & 0xFF]);\n }\n }\n }\n\n AES.prototype.encrypt = function (plaintext) {\n if (plaintext.length != 16) {\n throw new Error('invalid plaintext size (must be 16 bytes)');\n }\n\n var rounds = this._Ke.length - 1;\n var a = [0, 0, 0, 0];\n\n // convert plaintext to (ints ^ key)\n var t = convertToInt32(plaintext);\n for (var i = 0; i < 4; i++) {\n t[i] ^= this._Ke[0][i];\n }\n\n // apply round transforms\n for (var r = 1; r < rounds; r++) {\n for (var i = 0; i < 4; i++) {\n a[i] = (T1[(t[i] >> 24) & 0xff] ^\n T2[(t[(i + 1) % 4] >> 16) & 0xff] ^\n T3[(t[(i + 2) % 4] >> 8) & 0xff] ^\n T4[t[(i + 3) % 4] & 0xff] ^\n this._Ke[r][i]);\n }\n t = a.slice();\n }\n\n // the last round is special\n var result = createArray(16),\n tt;\n for (var i = 0; i < 4; i++) {\n tt = this._Ke[rounds][i];\n result[4 * i] = (S[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;\n result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;\n result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;\n result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff;\n }\n\n return result;\n }\n\n AES.prototype.decrypt = function (ciphertext) {\n if (ciphertext.length != 16) {\n throw new Error('invalid ciphertext size (must be 16 bytes)');\n }\n\n var rounds = this._Kd.length - 1;\n var a = [0, 0, 0, 0];\n\n // convert plaintext to (ints ^ key)\n var t = convertToInt32(ciphertext);\n for (var i = 0; i < 4; i++) {\n t[i] ^= this._Kd[0][i];\n }\n\n // apply round transforms\n for (var r = 1; r < rounds; r++) {\n for (var i = 0; i < 4; i++) {\n a[i] = (T5[(t[i] >> 24) & 0xff] ^\n T6[(t[(i + 3) % 4] >> 16) & 0xff] ^\n T7[(t[(i + 2) % 4] >> 8) & 0xff] ^\n T8[t[(i + 1) % 4] & 0xff] ^\n this._Kd[r][i]);\n }\n t = a.slice();\n }\n\n // the last round is special\n var result = createArray(16),\n tt;\n for (var i = 0; i < 4; i++) {\n tt = this._Kd[rounds][i];\n result[4 * i] = (Si[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;\n result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;\n result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;\n result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff;\n }\n\n return result;\n }\n\n\n /**\n * Mode Of Operation - Electonic Codebook (ECB)\n */\n var ModeOfOperationECB = function (key) {\n if (!(this instanceof ModeOfOperationECB)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Electronic Code Block\";\n this.name = \"ecb\";\n\n this._aes = new AES(key);\n }\n\n ModeOfOperationECB.prototype.encrypt = function (plaintext) {\n plaintext = coerceArray(plaintext);\n\n if ((plaintext.length % 16) !== 0) {\n throw new Error('invalid plaintext size (must be multiple of 16 bytes)');\n }\n\n var ciphertext = createArray(plaintext.length);\n var block = createArray(16);\n\n for (var i = 0; i < plaintext.length; i += 16) {\n copyArray(plaintext, block, 0, i, i + 16);\n block = this._aes.encrypt(block);\n copyArray(block, ciphertext, i);\n }\n\n return ciphertext;\n }\n\n ModeOfOperationECB.prototype.decrypt = function (ciphertext) {\n ciphertext = coerceArray(ciphertext);\n\n if ((ciphertext.length % 16) !== 0) {\n throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');\n }\n\n var plaintext = createArray(ciphertext.length);\n var block = createArray(16);\n\n for (var i = 0; i < ciphertext.length; i += 16) {\n copyArray(ciphertext, block, 0, i, i + 16);\n block = this._aes.decrypt(block);\n copyArray(block, plaintext, i);\n }\n\n return plaintext;\n }\n\n\n /**\n * Mode Of Operation - Cipher Block Chaining (CBC)\n */\n var ModeOfOperationCBC = function (key, iv) {\n if (!(this instanceof ModeOfOperationCBC)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Cipher Block Chaining\";\n this.name = \"cbc\";\n\n if (!iv) {\n iv = createArray(16);\n\n } else if (iv.length != 16) {\n throw new Error('invalid initialation vector size (must be 16 bytes)');\n }\n\n this._lastCipherblock = coerceArray(iv, true);\n\n this._aes = new AES(key);\n }\n\n ModeOfOperationCBC.prototype.encrypt = function (plaintext) {\n plaintext = coerceArray(plaintext);\n\n if ((plaintext.length % 16) !== 0) {\n throw new Error('invalid plaintext size (must be multiple of 16 bytes)');\n }\n\n var ciphertext = createArray(plaintext.length);\n var block = createArray(16);\n\n for (var i = 0; i < plaintext.length; i += 16) {\n copyArray(plaintext, block, 0, i, i + 16);\n\n for (var j = 0; j < 16; j++) {\n block[j] ^= this._lastCipherblock[j];\n }\n\n this._lastCipherblock = this._aes.encrypt(block);\n copyArray(this._lastCipherblock, ciphertext, i);\n }\n\n return ciphertext;\n }\n\n ModeOfOperationCBC.prototype.decrypt = function (ciphertext) {\n ciphertext = coerceArray(ciphertext);\n\n if ((ciphertext.length % 16) !== 0) {\n throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');\n }\n\n var plaintext = createArray(ciphertext.length);\n var block = createArray(16);\n\n for (var i = 0; i < ciphertext.length; i += 16) {\n copyArray(ciphertext, block, 0, i, i + 16);\n block = this._aes.decrypt(block);\n\n for (var j = 0; j < 16; j++) {\n plaintext[i + j] = block[j] ^ this._lastCipherblock[j];\n }\n\n copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);\n }\n\n return plaintext;\n }\n\n\n /**\n * Mode Of Operation - Cipher Feedback (CFB)\n */\n var ModeOfOperationCFB = function (key, iv, segmentSize) {\n if (!(this instanceof ModeOfOperationCFB)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Cipher Feedback\";\n this.name = \"cfb\";\n\n if (!iv) {\n iv = createArray(16);\n\n } else if (iv.length != 16) {\n throw new Error('invalid initialation vector size (must be 16 size)');\n }\n\n if (!segmentSize) {\n segmentSize = 1;\n }\n\n this.segmentSize = segmentSize;\n\n this._shiftRegister = coerceArray(iv, true);\n\n this._aes = new AES(key);\n }\n\n ModeOfOperationCFB.prototype.encrypt = function (plaintext) {\n if ((plaintext.length % this.segmentSize) != 0) {\n throw new Error('invalid plaintext size (must be segmentSize bytes)');\n }\n\n var encrypted = coerceArray(plaintext, true);\n\n var xorSegment;\n for (var i = 0; i < encrypted.length; i += this.segmentSize) {\n xorSegment = this._aes.encrypt(this._shiftRegister);\n for (var j = 0; j < this.segmentSize; j++) {\n encrypted[i + j] ^= xorSegment[j];\n }\n\n // Shift the register\n copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n }\n\n return encrypted;\n }\n\n ModeOfOperationCFB.prototype.decrypt = function (ciphertext) {\n if ((ciphertext.length % this.segmentSize) != 0) {\n throw new Error('invalid ciphertext size (must be segmentSize bytes)');\n }\n\n var plaintext = coerceArray(ciphertext, true);\n\n var xorSegment;\n for (var i = 0; i < plaintext.length; i += this.segmentSize) {\n xorSegment = this._aes.encrypt(this._shiftRegister);\n\n for (var j = 0; j < this.segmentSize; j++) {\n plaintext[i + j] ^= xorSegment[j];\n }\n\n // Shift the register\n copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n }\n\n return plaintext;\n }\n\n /**\n * Mode Of Operation - Output Feedback (OFB)\n */\n var ModeOfOperationOFB = function (key, iv) {\n if (!(this instanceof ModeOfOperationOFB)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Output Feedback\";\n this.name = \"ofb\";\n\n if (!iv) {\n iv = createArray(16);\n\n } else if (iv.length != 16) {\n throw new Error('invalid initialation vector size (must be 16 bytes)');\n }\n\n this._lastPrecipher = coerceArray(iv, true);\n this._lastPrecipherIndex = 16;\n\n this._aes = new AES(key);\n }\n\n ModeOfOperationOFB.prototype.encrypt = function (plaintext) {\n var encrypted = coerceArray(plaintext, true);\n\n for (var i = 0; i < encrypted.length; i++) {\n if (this._lastPrecipherIndex === 16) {\n this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);\n this._lastPrecipherIndex = 0;\n }\n encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];\n }\n\n return encrypted;\n }\n\n // Decryption is symetric\n ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;\n\n\n /**\n * Counter object for CTR common mode of operation\n */\n var Counter = function (initialValue) {\n if (!(this instanceof Counter)) {\n throw Error('Counter must be instanitated with `new`');\n }\n\n // We allow 0, but anything false-ish uses the default 1\n if (initialValue !== 0 && !initialValue) {\n initialValue = 1;\n }\n\n if (typeof (initialValue) === 'number') {\n this._counter = createArray(16);\n this.setValue(initialValue);\n\n } else {\n this.setBytes(initialValue);\n }\n }\n\n Counter.prototype.setValue = function (value) {\n if (typeof (value) !== 'number' || parseInt(value) != value) {\n throw new Error('invalid counter value (must be an integer)');\n }\n\n for (var index = 15; index >= 0; --index) {\n this._counter[index] = value % 256;\n value = value >> 8;\n }\n }\n\n Counter.prototype.setBytes = function (bytes) {\n bytes = coerceArray(bytes, true);\n\n if (bytes.length != 16) {\n throw new Error('invalid counter bytes size (must be 16 bytes)');\n }\n\n this._counter = bytes;\n };\n\n Counter.prototype.increment = function () {\n for (var i = 15; i >= 0; i--) {\n if (this._counter[i] === 255) {\n this._counter[i] = 0;\n } else {\n this._counter[i]++;\n break;\n }\n }\n }\n\n\n /**\n * Mode Of Operation - Counter (CTR)\n */\n var ModeOfOperationCTR = function (key, counter) {\n if (!(this instanceof ModeOfOperationCTR)) {\n throw Error('AES must be instanitated with `new`');\n }\n\n this.description = \"Counter\";\n this.name = \"ctr\";\n\n if (!(counter instanceof Counter)) {\n counter = new Counter(counter)\n }\n\n this._counter = counter;\n\n this._remainingCounter = null;\n this._remainingCounterIndex = 16;\n\n this._aes = new AES(key);\n }\n\n ModeOfOperationCTR.prototype.encrypt = function (plaintext) {\n var encrypted = coerceArray(plaintext, true);\n\n for (var i = 0; i < encrypted.length; i++) {\n if (this._remainingCounterIndex === 16) {\n this._remainingCounter = this._aes.encrypt(this._counter._counter);\n this._remainingCounterIndex = 0;\n this._counter.increment();\n }\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\n }\n\n return encrypted;\n }\n\n // Decryption is symetric\n ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;\n\n\n ///////////////////////\n // Padding\n\n // See:https://tools.ietf.org/html/rfc2315\n function pkcs7pad(data) {\n data = coerceArray(data, true);\n var padder = 16 - (data.length % 16);\n var result = createArray(data.length + padder);\n copyArray(data, result);\n for (var i = data.length; i < result.length; i++) {\n result[i] = padder;\n }\n return result;\n }\n\n function pkcs7strip(data) {\n data = coerceArray(data, true);\n if (data.length < 16) {\n throw new Error('PKCS#7 invalid length');\n }\n\n var padder = data[data.length - 1];\n if (padder > 16) {\n throw new Error('PKCS#7 padding byte out of range');\n }\n\n var length = data.length - padder;\n for (var i = 0; i < padder; i++) {\n if (data[length + i] !== padder) {\n throw new Error('PKCS#7 invalid padding byte');\n }\n }\n\n var result = createArray(length);\n copyArray(data, result, 0, 0, length);\n return result;\n }\n\n ///////////////////////\n // Exporting\n\n\n // The block cipher\n var aesjs = {\n AES: AES,\n Counter: Counter,\n\n ModeOfOperation: {\n ecb: ModeOfOperationECB,\n cbc: ModeOfOperationCBC,\n cfb: ModeOfOperationCFB,\n ofb: ModeOfOperationOFB,\n ctr: ModeOfOperationCTR\n },\n\n utils: {\n hex: convertHex,\n utf8: convertUtf8\n },\n\n padding: {\n pkcs7: {\n pad: pkcs7pad,\n strip: pkcs7strip\n }\n },\n\n _arrayTest: {\n coerceArray: coerceArray,\n createArray: createArray,\n copyArray: copyArray,\n }\n };\n\n\n // node.js\n if (typeof exports !== 'undefined') {\n module.exports = aesjs\n\n // RequireJS/AMD\n // http://www.requirejs.org/docs/api.html\n // https://github.com/amdjs/amdjs-api/wiki/AMD\n } else if (typeof (define) === 'function' && define.amd) {\n define(aesjs);\n\n // Web Browsers\n } else {\n\n // If there was an existing library at \"aesjs\" make sure it's still available\n if (root.aesjs) {\n aesjs._aesjs = root.aesjs;\n }\n\n root.aesjs = aesjs;\n }\n\n\n})(this);","// ---------------- Hollow Knight Data Constant Objects ----------------- //\r\n/*\r\n This is the whole database for the tool, based on the .json save file data\r\n*/\r\n\r\nconst HK = {\r\n\r\n saveAnalyzed: false,\r\n\r\n sections: {\r\n\r\n /* ################ Intro ################### */\r\n\r\n intro: {\r\n h2: \"Game Status\",\r\n id: \"hk-intro\",\r\n\r\n percent: 0,\r\n maxPercent: 112,\r\n maxPercentDefault: 112,\r\n maxPercentBaseGame: 100,\r\n maxPercentGrimmTroupe: 106,\r\n maxPercentLifeblood: 107,\r\n\r\n extendedCompletionDone: 0,\r\n extendedCompletionTotal: 0,\r\n\r\n entries: {\r\n timePlayed: {\r\n id: \"timePlayed\",\r\n icon: \"clock\",\r\n name: \"Time Played:\",\r\n spoiler: \"0 h 00 min 00 sec\",\r\n timeH: 0,\r\n timeM: 0,\r\n timeS: 0,\r\n },\r\n gameCompletion: {\r\n id: \"gameCompletion\",\r\n icon: \"red\",\r\n name: \"Game Completion:\",\r\n spoiler: 0,\r\n spoilerAfter: \"(out of 112 %)\",\r\n spoilerAfterDefault: \"(out of 112 %)\",\r\n spoilerAfterBaseGame: \"(out of 100 %)\",\r\n spoilerAfterGrimmTroupe: \"(out of 106 %)\",\r\n spoilerAfterLifeblood: \"(out of 107 %)\",\r\n },\r\n gameCompletionExtended: {\r\n id: \"gameCompletionExtended\",\r\n icon: \"red\",\r\n name: \"True Completion:\",\r\n spoiler: 0,\r\n spoilerAfter: \" / 0 = 0.00 %\",\r\n spoilerAfterDefault: \" / 0 = 0.00 %\",\r\n },\r\n saveVersion: {\r\n id: \"saveVersion\",\r\n icon: \"none\",\r\n name: \"Save Version:\",\r\n spoiler: \"0.0.0.0\"\r\n },\r\n health: {\r\n id: \"health\",\r\n icon: \"none\",\r\n name: \"Health:\",\r\n spoiler: \"\",\r\n amountTotal: 5,\r\n permadeathMode: false,\r\n },\r\n soul: {\r\n id: \"soul\",\r\n icon: \"none\",\r\n name: \"Soul:\",\r\n spoiler: \"\",\r\n amountTotal: 99\r\n },\r\n notches: {\r\n id: \"notches\",\r\n icon: \"none\",\r\n name: \"Notches:\",\r\n spoiler: \"\",\r\n amountTotal: 3,\r\n amountFilled: 0,\r\n amountUnused: 3,\r\n amountOvercharmed: 0\r\n },\r\n geo: {\r\n id: \"geo\",\r\n icon: \"none\",\r\n name: \"Geo:\",\r\n spoiler: \"\",\r\n amount: 0,\r\n amountShade: 0,\r\n amountTotal: 0\r\n }\r\n },\r\n },\r\n\r\n /* ################ Hints ################### */\r\n\r\n hints: {\r\n h2: \"Elderbug once told me...\",\r\n id: \"hk-hints\",\r\n current: \"fireballLevel\",\r\n entries: {\r\n fireballLevel: {\r\n spoiler: \"A mysterious shaman is living in a dwelling, somewhere below the town of Dirtmouth.\"\r\n },\r\n hornet1Defeated: {\r\n spoiler: \"A skilled protector is guarding old ruins in a lush green forest.\"\r\n },\r\n hasDash: {\r\n spoiler: \"An old cloak is lying on a green path near a broken shell.\"\r\n },\r\n hasWalljump: {\r\n spoiler: \"A sharp claw is lying forgotten, somewhere amidst the insect village.\"\r\n },\r\n Crossroads_04: {\r\n spoiler: \"A mother is sleeping peacefully, somewhere below the town of Dirtmouth.\"\r\n },\r\n slyRescued: {\r\n spoiler: \"Our fellow town bug seems to be lost, somewhere in the crossroads.\"\r\n },\r\n hasLantern: {\r\n spoiler: \"Did you know? A bright little crystal companion is able to light a way through the thickest dark places.\"\r\n },\r\n hasSuperDash: {\r\n spoiler: \"There is some powerful crystal beating somewhere deep inside the mines.\"\r\n },\r\n hasDreamNail: {\r\n spoiler: \"A weapon from a dream world can only be found, where the souls can peacefully rest.\"\r\n },\r\n /* \r\n Either:\r\n - used the elevator in Resting Grounds to City of Tears\r\n - opened the Fungal Wastes city gate\r\n */\r\n killedInfectedKnight: {\r\n spoiler: \"A shattered corpse forgotten in a windy cave is lying somewhere in the ancient depths below the rainy city.\"\r\n },\r\n hasDoubleJump: {\r\n spoiler: \"Something incredibly light was dropped by a monarchfly in the ancient depths below the rainy city.\"\r\n },\r\n dungDefenderOrHornet2: {\r\n spoiler: \"There are two skilled combatants. One is living at the heart of the sewers. One is watching over a shell amidst ash falling from the sky.\"\r\n },\r\n ismaTearOrShadeCloak: {\r\n spoiler: \"There are two precious items. One in a grove accessed from the waterways. One guarded by a massive royal door behind the darkness.\"\r\n },\r\n defeatedMegaJelly: {\r\n spoiler: \"An intelligent being is floating inside hidden archives, behind the fog.\"\r\n },\r\n monomonDefeated: {\r\n spoiler: \"A dreamer is sleeping somewhere, hidden in a foggy area.\"\r\n },\r\n hegemolDefeated: {\r\n spoiler: \"A dreamer is sleeping near a spider nest area.\"\r\n },\r\n killedBlackKnight: {\r\n spoiler: \"Discarded shells of black guards can be seen lying on the floor of a high spire.\"\r\n },\r\n lurienDefeated: {\r\n spoiler: \"A dreamer is sleeping somewhere, at the top of a high spire.\"\r\n },\r\n killedHollowKnight: {\r\n spoiler: \"He heard a disturbance from inside a black temple. Maybe it's worth investigating.\"\r\n },\r\n endOfHints: {\r\n spoiler: `The Knight still explores the world of Hallownest patiently, in constant search of its remaining secrets. [this is the end of the hint system (for the moment). The rest is up to you]`\r\n },\r\n },\r\n },\r\n\r\n /* ################### Bosses ################### */\r\n\r\n bosses: {\r\n h2: \"Bosses\",\r\n id: \"hk-bosses\",\r\n description: `Each boss from this list provides 1% Game Completion.
\r\n Note: There are many other bosses in the game. Only about ~half of the total bosses count directly towards % Game Completion stat.
\r\n P1-4 = difficulty level and which Pantheon a given boss unlocks.`,\r\n percent: 0,\r\n maxPercent: 14,\r\n entries: {\r\n // killedBigFly\r\n bossGruzMother: {\r\n name: \"P1 Gruz Mother\",\r\n spoiler: \"Forgotten Crossroads, lower right area\",\r\n id: \"Battle Scene\",\r\n sceneName: \"Crossroads_04\",\r\n wiki: \"Gruz_Mother\"\r\n },\r\n falseKnightDefeated: {\r\n name: \"P1 False Knight\",\r\n spoiler: \"Forgotten Crossroads, middle area map symbol\",\r\n wiki: \"False_Knight\"\r\n }, // \"Battle Scene\" - \"Crossroads_10\" ?\r\n hornet1Defeated: {\r\n name: \"P1 Hornet Protector\",\r\n spoiler: \"Greenpath, above Stag Station\",\r\n wiki: \"Hornet_Protector\"\r\n },\r\n defeatedDungDefender: {\r\n name: \"P1 Dung Defender\",\r\n spoiler: \"Royal Waterways, right area\",\r\n wiki: \"Dung_Defender\"\r\n },\r\n // killedMawlek\r\n bossBroodingMawlek: {\r\n name: \"P1 Brooding Mawlek\",\r\n spoiler: \"Forgotten Crossroads, use Mantis Claw\",\r\n id: \"Battle Scene\",\r\n sceneName: \"Crossroads_09\",\r\n wiki: \"Brooding_Mawlek\"\r\n },\r\n mageLordDefeated: {\r\n name: \"P2 Soul Master\",\r\n spoiler: \"City of Tears: Soul Sanctum\",\r\n wiki: \"Soul_Master\"\r\n },\r\n defeatedMantisLords: {\r\n name: \"P2 Mantis Lords\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n wiki: \"Mantis_Lords\"\r\n },\r\n // \"Battle Scene\" - \"Deepnest_32\" ?\r\n killedMimicSpider: {\r\n name: \"P2 Nosk\",\r\n spoiler: \"Deepnest, use Crystal Heart, left of Hot Spring\",\r\n wiki: \"Nosk\"\r\n },\r\n killedInfectedKnight: {\r\n name: \"P2 Broken Vessel\",\r\n spoiler: \"Ancient Basin, lower left, use Crystal Heart\",\r\n wiki: \"Broken_Vessel\"\r\n },\r\n collectorDefeated: {\r\n name: \"P3 The Collector\",\r\n spoiler: \"City of Tears: Tower of Love\",\r\n wiki: \"Collector\"\r\n },\r\n defeatedMegaJelly: {\r\n name: \"P3 Uumuu\",\r\n spoiler: \"Fog Canyon: Teacher's Archives\",\r\n wiki: \"Uumuu\"\r\n },\r\n hornetOutskirtsDefeated: {\r\n name: \"P3 Hornet Sentinel\",\r\n spoiler: \"Kingdom's Edge, requires Monarch Wings\",\r\n wiki: \"Hornet_Sentinel\"\r\n },\r\n // \"Battle Scene\" - \"Fungus3_23\" ?\r\n killedTraitorLord: {\r\n name: \"P4 Traitor Lord\",\r\n spoiler: \"Queen's Gardens, requires Shade Cloak\",\r\n wiki: \"Traitor_Lord\"\r\n },\r\n killedBlackKnight: {\r\n name: \"P4 Watcher Knights\",\r\n spoiler: \"City of Tears: Watcher's Spire\",\r\n wiki: \"Watcher_Knight\"\r\n }\r\n },\r\n },\r\n\r\n /* #################### Charms ################### */\r\n\r\n charms: {\r\n h2: \"Charms\",\r\n id: \"hk-charms\",\r\n description: `Each Charm found in the game provides 1% Game Completion.
\r\n Note: 4 new Charms were added to the game in patch version 1.2.1.0. They are part of the Grimm Troupe Content Pack section below.`,\r\n percent: 0,\r\n maxPercent: 36,\r\n // reference: https://radiance.host/apidocs/Charms.html\r\n entries: {\r\n gotCharm_1: {\r\n name: \"#1 Gathering Swarm\",\r\n spoiler: \"Sly: 300 Geo\",\r\n wiki: \"Gathering_Swarm\"\r\n }, // 1\r\n gotCharm_2: {\r\n name: \"#2 Wayward Compass\",\r\n spoiler: \"Iselda: 220 Geo\",\r\n wiki: \"Wayward_Compass\"\r\n }, // 1\r\n gotCharm_3: {\r\n name: \"#3 Grubsong\",\r\n spoiler: \"Grubfather: 10 Grubs rescued\",\r\n wiki: \"Grubsong\"\r\n }, // 1\r\n gotCharm_4: {\r\n name: \"#4 Stalwart Shell\",\r\n spoiler: \"Sly: 200 Geo\",\r\n wiki: \"Stalwart_Shell\"\r\n }, // 2\r\n gotCharm_5: {\r\n name: \"#5 Baldur Shell\",\r\n spoiler: \"Howling Cliffs, bottom, near Greenpath\",\r\n wiki: \"Baldur_Shell\"\r\n }, // 2\r\n gotCharm_6: {\r\n name: \"#6 Fury of the Fallen\",\r\n spoiler: \"King's Pass, nail-bounce spikes\",\r\n wiki: \"Fury_of_the_Fallen\"\r\n }, // 2\r\n gotCharm_7: {\r\n name: \"#7 Quick Focus\",\r\n spoiler: \"Salubra: 800 Geo\",\r\n wiki: \"Quick_Focus\"\r\n }, // 3\r\n gotCharm_8: {\r\n name: \"#8 Lifeblood Heart\",\r\n spoiler: \"Salubra: 250 Geo\",\r\n wiki: \"Lifeblood_Heart\"\r\n }, // 2\r\n gotCharm_9: {\r\n name: \"#9 Lifeblood Core\",\r\n spoiler: \"The Abyss: 15 Lifeblood masks\",\r\n wiki: \"Lifeblood_Core\"\r\n }, // 3\r\n gotCharm_10: {\r\n name: \"#10 Defender's Crest\",\r\n spoiler: \"Royal Waterways, defeat Dung Defender\",\r\n wiki: \"Defender's_Crest\"\r\n }, // 1\r\n gotCharm_11: {\r\n name: \"#11 Flukenest\",\r\n spoiler: \"Royal Waterways, defeat Flukemarm\",\r\n wiki: \"Flukenest\"\r\n }, // 3\r\n gotCharm_12: {\r\n name: \"#12 Thorns of Agony\",\r\n spoiler: \"Greenpath, requires Mothwing Cloak\",\r\n wiki: \"Thorns_of_Agony\"\r\n }, // 1\r\n gotCharm_13: {\r\n name: \"#13 Mark of Pride\",\r\n spoiler: \"Mantis Village, defeat Mantis Lords\",\r\n wiki: \"Mark_of_Pride\"\r\n }, // 3\r\n gotCharm_14: {\r\n name: \"#14 Steady Body\",\r\n spoiler: \"Salubra: 120 Geo\",\r\n wiki: \"Steady_Body\"\r\n }, // 1\r\n gotCharm_15: {\r\n name: \"#15 Heavy Blow\",\r\n spoiler: \"Sly: 350 Geo + Shopkeeper's Key\",\r\n wiki: \"Heavy_Blow\"\r\n }, // 2\r\n gotCharm_16: {\r\n name: \"#16 Sharp Shadow\",\r\n spoiler: \"Deepnest, requires Shade Cloak\",\r\n wiki: \"Sharp_Shadow\"\r\n }, // 2\r\n gotCharm_17: {\r\n name: \"#17 Spore Shroom\",\r\n spoiler: \"Fungal Wastes, near Queen's Gardens\",\r\n wiki: \"Spore_Shroom\"\r\n }, // 1\r\n gotCharm_18: {\r\n name: \"#18 Longnail\",\r\n spoiler: \"Salubra: 300 Geo\",\r\n wiki: \"Longnail\"\r\n }, // 2\r\n gotCharm_19: {\r\n name: \"#19 Shaman Stone\",\r\n spoiler: \"Salubra: 220 Geo\",\r\n wiki: \"Shaman_Stone\"\r\n }, // 3\r\n gotCharm_20: {\r\n name: \"#20 Soul Catcher\",\r\n spoiler: \"Forgotten Crossroads: Ancestral Mound\",\r\n wiki: \"Soul_Catcher\"\r\n }, // 2\r\n gotCharm_21: {\r\n name: \"#21 Soul Eater\",\r\n spoiler: \"Resting Grounds, requires Desolate Dive\",\r\n wiki: \"Soul_Eater\"\r\n }, // 4\r\n gotCharm_22: {\r\n name: \"#22 Glowing Womb\",\r\n spoiler: \"Forgotten Crossroads, requires Crystal Heart\",\r\n wiki: \"Glowing_Womb\"\r\n }, // 2\r\n gotCharm_23: {\r\n name: \"#23 Fragile Heart\",\r\n spoiler: \"Leg Eater: 350 Geo (280 with Defender's Crest)\",\r\n wiki: \"Fragile_Heart\"\r\n }, // 2\r\n gotCharm_24: {\r\n name: \"#24 Fragile Greed\",\r\n spoiler: \"Leg Eater: 250 Geo (200 with Defender's Crest)\",\r\n wiki: \"Fragile_Greed\"\r\n }, // 2\r\n gotCharm_25: {\r\n name: \"#25 Fragile Strength\",\r\n spoiler: \"Leg Eater: 600 Geo (480 with Defender's Crest)\",\r\n wiki: \"Fragile_Strength\"\r\n }, // 3\r\n gotCharm_26: {\r\n name: \"#26 Nailmaster’s Glory\",\r\n spoiler: \"Sly: Learn all Nail Arts\",\r\n wiki: \"Nailmaster's_Glory\"\r\n }, // 1\r\n gotCharm_27: {\r\n name: \"#27 Joni’s Blessing\",\r\n spoiler: \"Howling Cliffs: Joni's Repose\",\r\n wiki: \"Joni's_Blessing\"\r\n }, // 4\r\n gotCharm_28: {\r\n name: \"#28 Shape of Unn\",\r\n spoiler: \"Greenpath: Lake of Unn, requires Isma's Tear\",\r\n wiki: \"Shape_of_Unn\"\r\n }, // 2\r\n gotCharm_29: {\r\n name: \"#29 Hiveblood\",\r\n spoiler: \"The Hive, defeat Hive Knight\",\r\n wiki: \"Hiveblood\"\r\n }, // 4\r\n gotCharm_30: {\r\n name: \"#30 Dream Wielder\",\r\n spoiler: \"Seer: 500 Essence\",\r\n wiki: \"Dream_Wielder\"\r\n }, // 1\r\n gotCharm_31: {\r\n name: \"#31 Dashmaster\",\r\n spoiler: \"Fungal Wastes, below bench, near Bretta\",\r\n wiki: \"Dashmaster\"\r\n /* \r\n \"id\": \"Shiny Item Stand\",\r\n \"sceneName\": \"Fungus2_23\",\r\n */\r\n }, // 2\r\n gotCharm_32: {\r\n name: \"#32 Quick Slash\",\r\n spoiler: \"Kingdom's Edge, requires Desolate Dive\",\r\n wiki: \"Quick_Slash\"\r\n }, // 3\r\n gotCharm_33: {\r\n name: \"#33 Spell Twister\",\r\n spoiler: \"City of Tears: Soul Sanctum\",\r\n wiki: \"Spell_Twister\"\r\n }, // 2\r\n gotCharm_34: {\r\n name: \"#34 Deep Focus\",\r\n spoiler: \"Crystal Peak, requires Crystal Heart\",\r\n wiki: \"Deep_Focus\"\r\n }, // 4\r\n gotCharm_35: {\r\n name: \"#35 Grubberfly’s Elegy\",\r\n spoiler: \"Grubfather: All 46 Grubs rescued\",\r\n wiki: \"Grubberfly's_Elegy\"\r\n }, // 3\r\n gotCharm_36: {\r\n name: \"#36 Kingsoul\",\r\n spoiler: \"Queen's Gardens (Shade Cloak) + White Palace (Awoken Dream Nail)\",\r\n wiki: \"Kingsoul\"\r\n }, // 5\r\n },\r\n },\r\n\r\n /* ################ Equipment ################### */\r\n\r\n equipment: {\r\n h2: \"Equipment\",\r\n id: \"hk-equipment\",\r\n description: \"Also known as Abilities. Each piece of equipment collected provides 2% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 14,\r\n entries: {\r\n hasDash: {\r\n name: \"Mothwing Cloak\",\r\n spoiler: \"Greenpath: Dash ability\",\r\n wiki: \"Mothwing_Cloak\"\r\n },\r\n hasWalljump: {\r\n name: \"Mantis Claw\",\r\n spoiler: \"Mantis Village: Wall Jump ability\",\r\n wiki: \"Mantis_Claw\"\r\n },\r\n hasSuperDash: {\r\n name: \"Crystal Heart\",\r\n spoiler: \"Crystal Peak: Super Dash ability\",\r\n wiki: \"Crystal_Heart\"\r\n },\r\n hasDoubleJump: {\r\n name: \"Monarch Wings\",\r\n spoiler: \"Ancient Basin: Double Jump ability\",\r\n wiki: \"Monarch_Wings\"\r\n },\r\n hasAcidArmour: {\r\n name: \"Isma's Tear\",\r\n spoiler: \"Royal Waterways: Acid Armour ability\",\r\n wiki: \"Isma's_Tear\"\r\n },\r\n hasKingsBrand: {\r\n name: \"King's Brand\",\r\n spoiler: \"Kingdom's Edge, defeat Hornet Sentinel\",\r\n wiki: \"King's_Brand\"\r\n },\r\n hasShadowDash: {\r\n name: \"Shade Cloak\",\r\n spoiler: \"The Abyss: Shadow Dash ability\",\r\n wiki: \"Shade_Cloak\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Nail Upgrades ################### */\r\n\r\n nailUpgrades: {\r\n h2: \"Nail Upgrades\",\r\n id: \"hk-nailupgrades\",\r\n description: \"Upgrades to the Knight's main weapon damage. Each upgrade provides 1% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 4,\r\n entries: {\r\n oldNail: {\r\n name: \"#0 Old Nail\",\r\n spoiler: \"Starting Weapon\",\r\n wiki: \"Nail\"\r\n },\r\n sharpenedNail: {\r\n name: \"#1 Sharpened Nail\",\r\n spoiler: \"Nailsmith: 250 Geo\",\r\n wiki: \"Nail#Nail_Upgrades\"\r\n },\r\n channeledNail: {\r\n name: \"#2 Channeled Nail\",\r\n spoiler: \"Nailsmith: 800 Geo + 1 Pale Ore\",\r\n wiki: \"Nail#Nail_Upgrades\"\r\n },\r\n coiledNail: {\r\n name: \"#3 Coiled Nail\",\r\n spoiler: \"Nailsmith: 2000 Geo + 2 Pale Ore\",\r\n wiki: \"Nail#Nail_Upgrades\"\r\n },\r\n pureNail: {\r\n name: \"#4 Pure Nail\",\r\n spoiler: \"Nailsmith: 4000 Geo + 3 Pale Ore\",\r\n wiki: \"Nail#Nail_Upgrades\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Nail Arts ################### */\r\n\r\n nailArts: {\r\n h2: \"Nail Arts\",\r\n id: \"hk-nailarts\",\r\n description: \"Advanced weapon combat techniques. Each new technique learned provides 1% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 3,\r\n entries: {\r\n /* this is correct - somehow Team Cherry switched the names here */\r\n hasDashSlash: {\r\n name: \"Great Slash\",\r\n spoiler: \"Nailmaster Sheo: Greenpath\",\r\n wiki: \"Great_Slash\"\r\n },\r\n /* this is correct - somehow Team Cherry switched the names here */\r\n hasUpwardSlash: {\r\n name: \"Dash Slash\",\r\n spoiler: \"Nailmaster Oro: Kingdom's Edge, 800 Geo\",\r\n wiki: \"Dash_Slash\"\r\n },\r\n hasCyclone: {\r\n name: \"Cyclone Slash\",\r\n spoiler: \"Nailmaster Mato: Howling Cliffs\",\r\n wiki: \"Cyclone_Slash\"\r\n },\r\n },\r\n },\r\n\r\n /* ################ Spells ################### */\r\n\r\n spells: {\r\n h2: \"Spells\",\r\n id: \"hk-spells\",\r\n description: \"Skills that consume Soul. Each new spell learned or upgraded provides 1% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 6,\r\n entries: {\r\n vengefulSpirit: {\r\n fireballLevel: 1,\r\n name: \"Vengeful Spirit\",\r\n spoiler: \"Forgotten Crossroads: Ancestral Mound\",\r\n wiki: \"Vengeful_Spirit\"\r\n },\r\n shadeSoul: {\r\n fireballLevel: 2,\r\n name: \"Shade Soul\",\r\n spoiler: \"City of Tears: Soul Sanctum + Elegant Key\",\r\n wiki: \"Shade_Soul\"\r\n },\r\n desolateDive: {\r\n quakeLevel: 1,\r\n name: \"Desolate Dive\",\r\n spoiler: \"City of Tears: Soul Sanctum\",\r\n wiki: \"Desolate_Dive\"\r\n },\r\n descendingDark: {\r\n quakeLevel: 2,\r\n name: \"Descending Dark\",\r\n spoiler: \"Crystal Peak: Crystallised Mound\",\r\n wiki: \"Descending_Dark\"\r\n },\r\n howlingWraiths: {\r\n screamLevel: 1,\r\n name: \"Howling Wraiths\",\r\n spoiler: \"Fog Canyon: Overgrown Mound\",\r\n wiki: \"Howling_Wraiths\"\r\n },\r\n abyssShriek: {\r\n screamLevel: 2,\r\n name: \"Abyss Shriek\",\r\n spoiler: \"The Abyss, use Howling Wraiths on podium\",\r\n wiki: \"Abyss_Shriek\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Mask Shards ################### */\r\n\r\n maskShards: {\r\n h2: \"Mask Shards\",\r\n id: \"hk-maskshards\",\r\n description: \"Fragments for increasing max health. Each 4 Mask Fragments collected (a full Mask) provide 1% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 4,\r\n entries: {\r\n slyShellFrag1: {\r\n name: \"Mask Shard #1\",\r\n spoiler: \"Sly: 150 Geo\",\r\n wiki: \"Mask_Shard\"\r\n },\r\n slyShellFrag2: {\r\n name: \"Mask Shard #2\",\r\n spoiler: \"Sly: 500 Geo\",\r\n wiki: \"Mask_Shard\"\r\n },\r\n slyShellFrag3: {\r\n name: \"Mask Shard #3\",\r\n spoiler: \"Sly: 800 Geo + Shopkeeper's Key\",\r\n wiki: \"Mask_Shard\"\r\n },\r\n slyShellFrag4: {\r\n name: \"Mask Shard #4\",\r\n spoiler: \"Sly: 1500 Geo + Shopkeeper's Key\",\r\n wiki: \"Mask_Shard\"\r\n },\r\n dreamReward7: {\r\n name: \"Mask Shard #5\",\r\n spoiler: \"Seer: 1500 Essence\",\r\n wiki: \"Mask_Shard\"\r\n },\r\n /* ########## Mask Shards World ########## */\r\n /* \"Heart Piece\" sceneData.persistentBoolItems.id */\r\n maskShardCrossroadsSprings: {\r\n name: \"Mask Shard #6\",\r\n spoiler: \"Forgotten Crossroads: below Hot Springs\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Crossroads_13\"\r\n },\r\n maskShardCrossroadsMawlek: {\r\n name: \"Mask Shard #7\",\r\n spoiler: \"Forgotten Crossroads: defeat Brooding Mawlek\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Crossroads_09\"\r\n },\r\n maskShardGrubfather: {\r\n name: \"Mask Shard #8\",\r\n spoiler: \"Grubfather: 5 Grubs rescued\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Crossroads_38\"\r\n },\r\n maskShardBretta: {\r\n name: \"Mask Shard #9\",\r\n spoiler: \"Dirtmouth: Bretta's Room, rescue Bretta\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Room_Bretta\"\r\n },\r\n maskShardQueensStation: {\r\n name: \"Mask Shard #10\",\r\n spoiler: \"Queen's Station: requires Mantis Claw\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Fungus2_01\"\r\n },\r\n maskShardWaterways: {\r\n name: \"Mask Shard #11\",\r\n spoiler: \"Royal Waterways: top left area, swim left\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Waterways_04b\"\r\n },\r\n maskShardStoneSanctuary: {\r\n name: \"Mask Shard #12\",\r\n spoiler: \"Greenpath: Stone Sanctuary, Lumafly Lantern\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Fungus1_36\"\r\n },\r\n maskShardCrystalPeak: {\r\n name: \"Mask Shard #13\",\r\n spoiler: \"Crystal Peak: defeat Enraged Guardian\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Mines_32\"\r\n },\r\n maskShardDeepnest: {\r\n name: \"Mask Shard #14\",\r\n spoiler: \"Deepnest: from Fungal Core (Monarch Wings)\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Fungus2_25\"\r\n },\r\n maskShardHive: {\r\n name: \"Mask Shard #15\",\r\n spoiler: \"The Hive: use Hive Guardian to break wall\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Hive_04\"\r\n },\r\n maskShardDelicateFlower: {\r\n name: \"Mask Shard #16\",\r\n spoiler: \"Resting Grounds: Delicate Flower (Grey Mourner)\",\r\n wiki: \"Mask_Shard\",\r\n id: \"Heart Piece\",\r\n sceneName: \"Room_Mansion\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Vessel Fragments ################### */\r\n\r\n vesselFragments: {\r\n h2: \"Vessel Fragments\",\r\n id: \"hk-vesselfragments\",\r\n description: \"Fragments for increasing max soul. Each 3 Vessel Fragments collected (a full Soul Vessel) provide 1% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 3,\r\n entries: {\r\n slyVesselFrag1: {\r\n name: \"Vessel Fragment #1\",\r\n spoiler: \"Sly: 550 Geo\",\r\n wiki: \"Vessel_Fragment\"\r\n },\r\n slyVesselFrag2: {\r\n name: \"Vessel Fragment #2\",\r\n spoiler: \"Sly: 900 Geo + Shopkeeper's Key\",\r\n wiki: \"Vessel_Fragment\"\r\n },\r\n dreamReward5: {\r\n name: \"Vessel Fragment #3\",\r\n spoiler: \"Seer: 700 Essence\",\r\n wiki: \"Vessel_Fragment\"\r\n },\r\n vesselFragStagNest: {\r\n name: \"Vessel Fragment #4\",\r\n spoiler: \"Stag Nest\",\r\n wiki: \"Vessel_Fragment\"\r\n },\r\n /* ########## Vessel Fragments World ############ */\r\n /* \"Vessel Fragment\" sceneData.persistentBoolItems.id */\r\n vesselFragmentGreenpath: {\r\n name: \"Vessel Fragment #5\",\r\n spoiler: \"Greenpath: near Queen's Gardens exit\",\r\n wiki: \"Vessel_Fragment\",\r\n id: \"Vessel Fragment\",\r\n sceneName: \"Fungus1_13\"\r\n },\r\n vesselFragmentCrossroads: {\r\n name: \"Vessel Fragment #6\",\r\n spoiler: \"Forgotten Crossroads: unlock City of Tears lift\",\r\n wiki: \"Vessel_Fragment\",\r\n id: \"Vessel Fragment\",\r\n sceneName: \"Crossroads_37\"\r\n },\r\n vesselFragmentCityOfTears: {\r\n name: \"Vessel Fragment #7\",\r\n spoiler: \"City of Tears: above King's Station\",\r\n wiki: \"Vessel_Fragment\",\r\n id: \"Vessel Fragment\",\r\n sceneName: \"Ruins2_09\"\r\n },\r\n vesselFragmentDeepnest: {\r\n name: \"Vessel Fragment #8\",\r\n spoiler: \"Deepnest: Goam platforming challenge\",\r\n wiki: \"Vessel_Fragment\",\r\n id: \"Vessel Fragment\",\r\n sceneName: \"Deepnest_38\"\r\n },\r\n vesselFragmentFountain: {\r\n name: \"Vessel Fragment #9\",\r\n spoiler: \"Ancient Basin Fountain: 3000 Geo\",\r\n wiki: \"Vessel_Fragment\",\r\n id: \"Vessel Fragment\",\r\n sceneName: \"Abyss_04\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Dream Nail and Essence ################### */\r\n\r\n dreamNail: {\r\n h2: \"Dream Nail and Essence\",\r\n id: \"hk-dreamnail\",\r\n description: \"A special dream Ability. Can collect Essence and enter dreams. Each milestone here will provide 1% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 3,\r\n entries: {\r\n hasDreamNail: {\r\n name: \"Dream Nail Acquired\",\r\n spoiler: \"Resting Grounds\",\r\n wiki: \"Dream_Nail\"\r\n },\r\n dreamNailUpgraded: {\r\n name: \"Awoken Dream Nail\",\r\n spoiler: \"Seer: 1800 Essence\",\r\n wiki: \"Dream_Nail#Awoken_Dream_Nail\"\r\n },\r\n mothDeparted: {\r\n name: \"Hear the Seer's Final Words\",\r\n spoiler: \"Seer: 2400 Essence\",\r\n wiki: \"Seer\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Warrior Dreams ################### */\r\n\r\n warriorDreams: {\r\n h2: \"Warrior Dreams\",\r\n id: \"hk-warriordreams\",\r\n description: `Special kind of bosses in Hollow Knight, which provide Essence and 1% Game Completion after defeat.
\r\n Note: The Essence must be collected before each boss will provide 1% Game Completion. Uncollected Essence will be marked as not completed.`,\r\n percent: 0,\r\n maxPercent: 7,\r\n entries: {\r\n aladarSlugDefeated: {\r\n name: \"P1 Gorb\",\r\n spoiler: \"Howling Cliffs, top middle area\",\r\n wiki: \"Gorb\"\r\n },\r\n xeroDefeated: {\r\n name: \"P2 Xero\",\r\n spoiler: \"Resting Grounds, below Crystal Peak drop\",\r\n wiki: \"Xero\"\r\n },\r\n mumCaterpillarDefeated: {\r\n name: \"P2 Marmu\",\r\n spoiler: \"Queen's Gardens, left of Stag Station\",\r\n wiki: \"Marmu\"\r\n },\r\n elderHuDefeated: {\r\n name: \"P3 Elder Hu\",\r\n spoiler: \"Fungal Wastes, above acid bridge\",\r\n wiki: \"Elder_Hu\"\r\n },\r\n galienDefeated: {\r\n name: \"P3 Galien\",\r\n spoiler: \"Deepnest, below Failed Tramway\",\r\n wiki: \"Galien\"\r\n },\r\n noEyesDefeated: {\r\n name: \"P4 No Eyes\",\r\n spoiler: \"Greenpath: Stone Sanctuary, requires Lumafly Lantern\",\r\n wiki: \"No_Eyes\"\r\n },\r\n markothDefeated: {\r\n name: \"P4 Markoth\",\r\n spoiler: \"Kingdom's Edge, requires Shade Cloak\",\r\n wiki: \"Markoth\"\r\n },\r\n },\r\n },\r\n\r\n /* ################ Dreamers ################### */\r\n\r\n dreamers: {\r\n h2: \"Dreamers\",\r\n id: \"hk-dreamers\",\r\n description: \"Each Dreamer will provide 1% Game Completion.\",\r\n percent: 0,\r\n maxPercent: 3,\r\n entries: {\r\n lurienDefeated: {\r\n name: \"Lurien the Watcher\",\r\n spoiler: \"City of Tears: Watcher's Spire\",\r\n wiki: \"Lurien\"\r\n },\r\n monomonDefeated: {\r\n name: \"Monomon the Teacher\",\r\n spoiler: \"Fog Canyon: Teacher's Archives\",\r\n wiki: \"Monomon\"\r\n },\r\n hegemolDefeated: {\r\n name: \"Herrah the Beast\",\r\n spoiler: \"Deepnest: Distant Village\",\r\n wiki: \"Herrah\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Colosseum of Fools ################### */\r\n\r\n colosseum: {\r\n h2: \"Colosseum of Fools\",\r\n id: \"hk-colosseum\",\r\n description: \"Completing each Trial in the Colosseum provides 1% Game Completion. This section sums up the original 100% Game Completion Percentage from Hollow Knight in 2017 (without Content Packs).\",\r\n percent: 0,\r\n maxPercent: 3,\r\n entries: {\r\n colosseumBronzeCompleted: {\r\n name: \"Trial of the Warrior\",\r\n spoiler: \"Kingdom's Edge: top area, Little Fool: 100 Geo\",\r\n wiki: \"Trial_of_the_Warrior\"\r\n },\r\n colosseumSilverCompleted: {\r\n name: \"Trial of the Conqueror\",\r\n spoiler: \"Little Fool: 450 Geo + Warrior completed\",\r\n wiki: \"Trial_of_the_Conqueror\"\r\n },\r\n colosseumGoldCompleted: {\r\n name: \"Trial of the Fool\",\r\n spoiler: \"Little Fool: 800 Geo + Conqueror completed\",\r\n wiki: \"Trial_of_the_Fool\"\r\n },\r\n },\r\n },\r\n\r\n /* ################ Grimm Troupe Content Pack ################### */\r\n\r\n grimmTroupe: {\r\n h2: \"Grimm Troupe Content Pack\",\r\n id: \"hk-grimmtroupe\",\r\n description: `The first Content Pack. Released October 26th, 2017 (1.2.1.0 Game Update). It added additional +6% to max Game Completion Percentage.
\r\n Note: It requires making a choice, but no matter what you will choose, you will still get the same +1%.`,\r\n percent: 0,\r\n maxPercent: 6,\r\n entries: {\r\n gotCharm_37: {\r\n name: \"Charm #37 Sprintmaster\",\r\n spoiler: \"Sly: 400 Geo + Shopkeeper's Key\",\r\n wiki: \"Sprintmaster\"\r\n },\r\n gotCharm_38: {\r\n name: \"Charm #38 Dreamshield\",\r\n spoiler: \"Resting Grounds, go left below Seer\",\r\n wiki: \"Dreamshield\"\r\n },\r\n gotCharm_39: {\r\n name: \"Charm #39 Weaversong\",\r\n spoiler: \"Deepnest: Weaver's Den\",\r\n wiki: \"Weaversong\"\r\n },\r\n gotCharm_40: {\r\n name: \"Charm #40 Grimmchild or Carefree Melody\",\r\n nameDefault: \"Charm #40 Grimmchild or Carefree Melody\",\r\n nameGrimmchildP1: \"Charm #40: Grimmchild (Phase 1)\",\r\n nameGrimmchildP2: \"Charm #40: Grimmchild (Phase 2)\",\r\n nameGrimmchildP3: \"Charm #40: Grimmchild (Phase 3)\",\r\n nameGrimmchildP4: \"Charm #40: Grimmchild (Phase 4)\",\r\n nameCarefreeMelody: \"Charm #40: Carefree Melody\",\r\n spoiler: \"Dirtmouth\",\r\n spoilerDefault: \"Dirtmouth\",\r\n spoilerGrimmchildP1: \"Collect 3 flames\",\r\n spoilerGrimmchildP2: \"Collect 3 flames\",\r\n spoilerGrimmchildP3: \"Collect 3 flames\",\r\n spoilerGrimmchildP4: \"Completed the Ritual\",\r\n spoilerCarefreeMelody: \"Banished Grimm Troupe\",\r\n wiki: \"Grimmchild\",\r\n wikiDefault: \"Grimmchild\",\r\n wikiGrimmchild: \"Grimmchild\",\r\n wikiCarefreeMelody: \"Carefree_Melody\"\r\n },\r\n killedGrimm: {\r\n name: \"P3 Troupe Master Grimm\",\r\n spoiler: \"Dirtmouth, collect 6 flames\",\r\n wiki: \"Grimm\"\r\n },\r\n grimmChildLevel: {\r\n name: \"Complete Ritual or Banish Troupe\",\r\n nameDefault: \"Complete Ritual or Banish Troupe\",\r\n nameNightmareKing: \"Grimm Troupe Choice: Nightmare King\",\r\n nameBanishment: \"Grimm Troupe Choice: Banishment\",\r\n spoiler: \"One choice per save file: Dirtmouth or Howling Cliffs\",\r\n spoilerDefault: \"One choice per save file: Dirtmouth or Howling Cliffs\",\r\n spoilerNightmareKing: \"Completed the Ritual\",\r\n spoilerBanishment: \"Banished Grimm Troupe\",\r\n wiki: \"Grimm_Troupe_(Quest)\",\r\n wikiDefault: \"Grimm_Troupe_(Quest)\",\r\n wikiNightmareKing: \"Nightmare_King_Grimm\",\r\n wikiBanishment: \"Nymm\",\r\n }\r\n },\r\n },\r\n\r\n /* ################ Lifeblood Content Pack ################### */\r\n\r\n lifeblood: {\r\n h2: \"Lifeblood Content Pack\",\r\n id: \"hk-lifeblood\",\r\n description: `The second Content Pack. Released April 20th, 2018 (1.3.1.5 Game Update). Among many quality changes, it added one new boss, which increased the max Game Completion Percentage by +1%.`,\r\n percent: 0,\r\n maxPercent: 1,\r\n entries: {\r\n killedHiveKnight: {\r\n name: \"P3 Hive Knight\",\r\n spoiler: \"The Hive, guards Hiveblood charm\",\r\n wiki: \"Hive_Knight\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Godmaster Content Pack ################### */\r\n\r\n godmaster: {\r\n h2: \"Godmaster Content Pack\",\r\n id: \"hk-godmaster\",\r\n description: `The third Content Pack. Released August 23rd, 2018 (1.4.2.4 Game Update). It added additional +5% to max Game Completion Percentage (up to a total of 112%).`,\r\n percent: 0,\r\n maxPercent: 5,\r\n entries: {\r\n hasGodfinder: {\r\n name: \"Godtuner\",\r\n spoiler: \"Royal Waterways: Junk Pit, requires Simple Key\",\r\n wiki: \"Godtuner\"\r\n },\r\n /* ########## Godmaster doors ########## */\r\n pantheonMaster: {\r\n name: \"P1 Pantheon of the Master\",\r\n spoiler: \"Godhome: defeat P1 bosses\",\r\n wiki: \"Pantheon_of_the_Master\",\r\n property: \"bossDoorStateTier1\"\r\n },\r\n pantheonArtist: {\r\n name: \"P2 Pantheon of the Artist\",\r\n spoiler: \"Godhome: defeat P2 bosses\",\r\n wiki: \"Pantheon_of_the_Artist\",\r\n property: \"bossDoorStateTier2\"\r\n },\r\n pantheonSage: {\r\n name: \"P3 Pantheon of the Sage\",\r\n spoiler: \"Godhome: defeat P3 bosses\",\r\n wiki: \"Pantheon_of_the_Sage\",\r\n property: \"bossDoorStateTier3\"\r\n },\r\n pantheonKnight: {\r\n name: \"P4 Pantheon of the Knight\",\r\n spoiler: \"Godhome: complete P1, P2 and P3\",\r\n wiki: \"Pantheon_of_the_Knight\",\r\n property: \"bossDoorStateTier4\"\r\n }\r\n },\r\n },\r\n\r\n /* ################ Game Completion Essentials ################### */\r\n\r\n essential: {\r\n h2: \"Game Completion Essentials\",\r\n id: \"hk-essential\",\r\n description: \"All things that don't count directly towards 112% Game Completion, but are required to achieve a large part of 112% points.\",\r\n entries: {\r\n /* \r\n Soul Warrior 2 (Shade Soul)\r\n Absolute Radiance (for P5, achievements)\r\n Sisters of Battle (for P5, achievements)\r\n Winged Nosk (for P5, achievements)\r\n */\r\n grubsCollected: {\r\n name: \"Grubs Rescued\",\r\n spoiler: \"46 Grubs total\",\r\n max: 46,\r\n maxDefault: 46,\r\n wiki: \"Grub\"\r\n },\r\n grubRewards: {\r\n name: \"Grubfather Rewards Awarded\",\r\n spoiler: \"46 Rewards total\",\r\n max: 46,\r\n maxDefault: 46,\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n charmsOwned: {\r\n name: \"Charms Owned\",\r\n spoiler: \"40 Charms total, useful for Salubra Notches\",\r\n max: 40,\r\n maxDefault: 40,\r\n wiki: \"Category:Charms#List_of_Charms\"\r\n },\r\n dreamOrbs: {\r\n name: \"Essence Collected\",\r\n spoiler: \"Dream Nail (2400 for completion)\",\r\n max: 2400,\r\n maxDefault: 2400,\r\n wiki: \"Dream_Nail#Essence\"\r\n },\r\n fountainGeo: {\r\n name: \"Geo in Fountain\",\r\n spoiler: \"Ancient Basin: 3000 Geo maximum\",\r\n max: 3000,\r\n maxDefault: 3000,\r\n wiki: \"Ancient_Basin#Description\"\r\n },\r\n openedTownBuilding: {\r\n name: \"Stag Station: Dirtmouth\",\r\n spoiler: \"Opened from inside after travelling\",\r\n wiki: \"Dirtmouth\"\r\n },\r\n openedCrossroads: {\r\n name: \"Stag Station: Forgotten Crossroads\",\r\n spoiler: \"50 Geo: Right middle-bottom area\",\r\n wiki: \"Forgotten_Crossroads\"\r\n },\r\n openedGreenpath: {\r\n name: \"Stag Station: Greenpath\",\r\n spoiler: \"140 Geo: Top middle area, below Hornet\",\r\n wiki: \"Greenpath\"\r\n },\r\n openedFungalWastes: {\r\n name: \"Stag Station: Queen's Station\",\r\n spoiler: \"120 Geo: Fungal Wastes, near Fog Canyon\",\r\n wiki: \"Fungal_Wastes#Sub-area:_Queen.27s_Station\"\r\n },\r\n openedRuins1: {\r\n name: \"Stag Station: City Storerooms\",\r\n spoiler: \"200 Geo: City of Tears, top left area\",\r\n wiki: \"City_of_Tears#City_Storerooms\"\r\n },\r\n openedRestingGrounds: {\r\n name: \"Stag Station: Resting Grounds\",\r\n spoiler: \"0 Geo: Right middle area, near Seer\",\r\n wiki: \"Resting_Grounds\"\r\n },\r\n openedRuins2: {\r\n name: \"Stag Station: King's Station\",\r\n spoiler: \"300 Geo: City of Tears, far right area\",\r\n wiki: \"City_of_Tears#Sub-area:_King.27s_Station\"\r\n },\r\n openedRoyalGardens: {\r\n name: \"Stag Station: Queen's Gardens\",\r\n spoiler: \"200 Geo: Middle area, near Traitor's Grave\",\r\n wiki: \"Queen's_Gardens\"\r\n },\r\n openedDeepnest: {\r\n name: \"Stag Station: Distant Village\",\r\n spoiler: \"250 Geo: Deepnest, far left area\",\r\n wiki: \"Deepnest#Sub-area:_Distant_Village\"\r\n },\r\n openedHiddenStation: {\r\n name: \"Stag Station: Hidden Station\",\r\n spoiler: \"300 Geo: Ancient Basin: Palace Grounds\",\r\n wiki: \"Ancient_Basin#Sub-Area:_Palace_Grounds\"\r\n },\r\n openedStagNest: {\r\n name: \"Stag Station: Stag Nest\",\r\n spoiler: \"Open all stations: Howling Cliffs, top area\",\r\n wiki: \"Howling_Cliffs#Sub-area:_Stag_Nest\"\r\n },\r\n stagStationsOpened: {\r\n name: \"Stag Stations Opened\",\r\n spoiler: \"11 Stag Stations total including Dirtmouth\",\r\n max: 11,\r\n maxDefault: 11,\r\n wiki: \"Fast_Travel_(Hollow_Knight)#Locations_and_Prices\"\r\n },\r\n slyRescued: {\r\n name: \"Sly Rescued\",\r\n spoiler: \"Forgotten Crossroads, near Gruz Mother\",\r\n wiki: \"Sly\"\r\n },\r\n brettaRescued: {\r\n name: \"Bretta Rescued\",\r\n spoiler: \"Fungal Wastes, near Dashmaster charm statue\",\r\n wiki: \"Bretta\"\r\n },\r\n mantisVillageFloorLever: {\r\n name: \"Mantis Village Floor Lever\",\r\n spoiler: \"Fungal Wastes, right of Mantis Claw\",\r\n id: \"Mantis Lever (1)\",\r\n sceneName: \"Fungus2_14\",\r\n wiki: \"Fungal_Wastes#Sub-area:_Mantis_Village\"\r\n },\r\n hasLantern: {\r\n name: \"Lumafly Lantern\",\r\n spoiler: \"Sly: 1800 Geo\",\r\n wiki: \"Lumafly_Lantern\"\r\n },\r\n shopkeeperKey: {\r\n name: \"Shopkeeper's Key\",\r\n spoiler: \"Crystal Peak, below Quirrel location\",\r\n wiki: \"Shopkeeper's_Key\"\r\n },\r\n elegantKey: {\r\n name: \"Elegant Key\",\r\n spoiler: \"Sly: 800 Geo + Shopkeeper's Key\",\r\n wiki: \"Elegant_Key\"\r\n },\r\n loveKey: {\r\n name: \"Love Key\",\r\n spoiler: \"Queen's Gardens, near Fungal Wastes\",\r\n wiki: \"Love_Key\"\r\n },\r\n slySimpleKey: {\r\n name: \"Simple Key #1\",\r\n spoiler: \"Sly: 950 Geo\",\r\n wiki: \"Simple_Key\"\r\n },\r\n simpleKeyCityOfTears: {\r\n name: \"Simple Key #2\",\r\n spoiler: \"City of Tears, below left Stag Station\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins1_17\",\r\n wiki: \"Simple_Key#How_to_Acquire\"\r\n },\r\n simpleKeyAncientBasin: {\r\n name: \"Simple Key #3\",\r\n spoiler: \"Ancient Basin, below Broken Vessel\",\r\n id: \"Shiny Item Stand\",\r\n sceneName: \"Abyss_20\",\r\n wiki: \"Simple_Key#How_to_Acquire\"\r\n },\r\n gotLurkerKey: {\r\n name: \"Simple Key #4\",\r\n spoiler: \"Colosseum of Fools: Pale Lurker's Retreat\",\r\n wiki: \"Simple_Key#How_to_Acquire\"\r\n },\r\n paleOreAncientBasin: {\r\n name: \"Pale Ore #1\",\r\n spoiler: \"Ancient Basin, left of Tram Station\",\r\n id: \"Battle Scene Ore\",\r\n sceneName: \"Abyss_17\",\r\n wiki: \"Pale_Ore\"\r\n },\r\n paleOreSeer: {\r\n name: \"Pale Ore #2\",\r\n spoiler: \"Seer: 300 Essence\",\r\n wiki: \"Pale_Ore#How_to_Acquire\"\r\n },\r\n paleOreCrystalPeak: {\r\n name: \"Pale Ore #3\",\r\n spoiler: \"Top of Crystal Peak, use Monarch Wings\",\r\n id: \"Shiny Item Stand\",\r\n sceneName: \"Mines_34\",\r\n wiki: \"Pale_Ore#How_to_Acquire\"\r\n },\r\n paleOreDeepnest: {\r\n name: \"Pale Ore #4\",\r\n spoiler: \"Deepnest, Nosk reward\",\r\n id: \"Shiny Item Stand\",\r\n sceneName: \"Deepnest_32\",\r\n wiki: \"Pale_Ore#How_to_Acquire\"\r\n },\r\n paleOreGrubfather: {\r\n name: \"Pale Ore #5\",\r\n spoiler: \"Grubfather: 31 Grubs rescued\",\r\n id: \"Shiny Item Ore\",\r\n sceneName: \"Crossroads_38\",\r\n wiki: \"Pale_Ore#How_to_Acquire\"\r\n },\r\n paleOreColosseum: {\r\n name: \"Pale Ore #6\",\r\n spoiler: \"Colosseum of Fools: Trial of the Conqueror\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Room_Colosseum_Silver\",\r\n wiki: \"Pale_Ore#How_to_Acquire\"\r\n },\r\n waterwaysAcidDrained: {\r\n name: \"Acid Drained\",\r\n spoiler: \"Royal Waterways, lever after Dung Defender\",\r\n wiki: \"Royal_Waterways#Sub-area:_Isma.27s_Grove\"\r\n },\r\n /* \r\n \"abyssGateOpened\": false,\r\n */\r\n hasTramPass: {\r\n name: \"Tram Pass\",\r\n spoiler: \"Deepnest: Failed Tramway\",\r\n wiki: \"Tram_Pass\"\r\n },\r\n gotQueenFragment: {\r\n name: \"White Fragment: Queen\",\r\n spoiler: \"White Lady: Queen's Gardens\",\r\n wiki: \"Kingsoul#How_to_Acquire\"\r\n },\r\n gotKingFragment: {\r\n name: \"White Fragment: King\",\r\n spoiler: \"Pale King: White Palace\",\r\n wiki: \"Kingsoul#How_to_Acquire\"\r\n },\r\n nightmareLanternLit: {\r\n name: \"Nightmare Lantern Lit\",\r\n spoiler: \"Howling Cliffs, corpse of a large bug\",\r\n wiki: \"Howling_Cliffs#Nightmare_Lantern_Chamber\"\r\n },\r\n killedMegaMossCharger: {\r\n name: \"P1 Massive Moss Charger\",\r\n spoiler: \"Greenpath, near Fog Canyon\",\r\n wiki: \"Massive_Moss_Charger\"\r\n },\r\n pantheonSoulWarrior: {\r\n name: \"P1 Soul Warrior\",\r\n spoiler: \"City of Tears: Soul Sanctum\",\r\n id: \"Battle Scene v2\",\r\n sceneName: \"Ruins1_23\",\r\n wiki: \"Soul_Warrior\"\r\n },\r\n pantheonCrystalGuardian: {\r\n name: \"P2 Crystal Guardian\",\r\n spoiler: \"Crystal Peak, guards Central Bench\",\r\n id: \"Mega Zombie Beam Miner (1)\",\r\n sceneName: \"Mines_18\",\r\n wiki: \"Crystal_Guardian\"\r\n },\r\n killedBigBuzzer: {\r\n name: \"Vengefly King\",\r\n spoiler: \"Colosseum of Fools: Trial of the Warrior, Greenpath\",\r\n wiki: \"Vengefly_King\"\r\n },\r\n killedOblobble: {\r\n name: \"P2 Oblobble\",\r\n spoiler: \"Colosseum of Fools: Trial of the Conqueror\",\r\n wiki: \"Oblobbles\"\r\n },\r\n killedLobsterLancer: {\r\n name: \"God Tamer\",\r\n spoiler: \"Colosseum of Fools: Trial of the Fool\",\r\n wiki: \"God_Tamer\"\r\n },\r\n killedFlukeMother: {\r\n name: \"P2 Flukemarm\",\r\n spoiler: \"Royal Waterways, requires Desolate Dive\",\r\n wiki: \"Flukemarm\"\r\n },\r\n pantheonEnragedGuardian: {\r\n name: \"P4 Enraged Guardian\",\r\n spoiler: \"Crystal Peak, requires Monarch Wings\",\r\n id: \"Zombie Beam Miner Rematch\",\r\n sceneName: \"Mines_32\",\r\n wiki: \"Enraged_Guardian\"\r\n },\r\n killedNailBros: {\r\n name: \"Nailmasters Oro & Mato\",\r\n spoiler: \"Godhome: Pantheon of the Master\",\r\n wiki: \"Brothers_Oro_%26_Mato\"\r\n },\r\n killedPaintmaster: {\r\n name: \"Paintmaster Sheo\",\r\n spoiler: \"Godhome: Pantheon of the Artist\",\r\n wiki: \"Paintmaster_Sheo\"\r\n },\r\n killedNailsage: {\r\n name: \"Great Nailsage Sly\",\r\n spoiler: \"Godhome: Pantheon of the Sage\",\r\n wiki: \"Great_Nailsage_Sly\"\r\n },\r\n killedHollowKnightPrime: {\r\n name: \"Pure Vessel\",\r\n spoiler: \"Godhome: Pantheon of the Knight\",\r\n wiki: \"Pure_Vessel\"\r\n },\r\n },\r\n grubsList: [\"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\", \"Ruins2_11\", \"Ruins2_11\", \"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\"],\r\n },\r\n\r\n /* ################ Achievements Essentials ################### */\r\n\r\n achievements: {\r\n h2: \"Achievements Essentials\",\r\n id: \"hk-achievements\",\r\n description: `All the completely optional things that matter for achievements. Things here don't count or matter towards 112% Game Completion. This section includes Zote and Nailsmith choices that you've made on your save file.`,\r\n entries: {\r\n hasMap: {\r\n name: \"Inventory Map\",\r\n spoiler: \"First map bought from Cornifer or Iselda\",\r\n wiki: \"Map_and_Quill\"\r\n },\r\n mapCrossroads: {\r\n name: \"Map: Forgotten Crossroads\",\r\n spoiler: \"30/40 Geo: below Gruzzer area\",\r\n wiki: \"Forgotten_Crossroads\"\r\n },\r\n mapGreenpath: {\r\n name: \"Map: Greenpath\",\r\n spoiler: \"60/80 Geo: just below Greenpath entrance\",\r\n wiki: \"Greenpath\"\r\n },\r\n mapFungalWastes: {\r\n name: \"Map: Fungal Wastes\",\r\n spoiler: \"75/100 Geo: right of Queen's Station\",\r\n wiki: \"Fungal_Wastes\"\r\n },\r\n mapCliffs: {\r\n name: \"Map: Howling Cliffs\",\r\n spoiler: \"75/100 Geo: left middle area, near Journal\",\r\n wiki: \"Howling_Cliffs\"\r\n },\r\n mapCity: {\r\n name: \"Map: City of Tears\",\r\n spoiler: \"90/120 Geo: left of Soul Sanctum\",\r\n wiki: \"City_of_Tears\"\r\n },\r\n mapMines: {\r\n name: \"Map: Crystal Peak\",\r\n spoiler: \"120/150 Geo: top left area\",\r\n wiki: \"Crystal_Peak\"\r\n },\r\n mapWaterways: {\r\n name: \"Map: Royal Waterways\",\r\n spoiler: \"75/100 Geo: far left area, near Fungal\",\r\n wiki: \"Royal_Waterways\"\r\n },\r\n mapRestingGrounds: {\r\n name: \"Map: Resting Grounds\",\r\n spoiler: \"75 Geo: Iselda's Shop\",\r\n wiki: \"Resting_Grounds\"\r\n },\r\n mapAbyss: {\r\n name: \"Map: Ancient Basin\",\r\n spoiler: \"112/150 Geo: center area, near fountain\",\r\n wiki: \"Ancient_Basin\"\r\n },\r\n mapOutskirts: {\r\n name: \"Map: Kingdom's Edge\",\r\n spoiler: \"112/150 Geo: left bottom area, inside pipe\",\r\n wiki: \"Kingdom's_Edge\"\r\n },\r\n mapFogCanyon: {\r\n name: \"Map: Fog Canyon\",\r\n spoiler: \"150/200 Geo: above Teacher's Archives\",\r\n wiki: \"Fog_Canyon\"\r\n },\r\n mapRoyalGardens: {\r\n name: \"Map: Queen's Gardens\",\r\n spoiler: \"150/200 Geo: below Fog Canyon entrance\",\r\n wiki: \"Queen's_Gardens\"\r\n },\r\n mapDeepnest: {\r\n name: \"Map: Deepnest\",\r\n spoiler: \"38/50 Geo: near both Fungal Wastes entrances\",\r\n wiki: \"Deepnest\"\r\n },\r\n areaMaps: {\r\n name: \"Area Maps\",\r\n spoiler: \"Cornifer and Iselda, 13 Area Maps total\",\r\n max: 13,\r\n maxDefault: 13,\r\n wiki: \"Map_and_Quill#Maps\"\r\n },\r\n hasJournal: {\r\n name: \"Hunter's Journal\",\r\n spoiler: \"Greenpath: Hunter, above Stone Sanctuary\",\r\n wiki: \"Hunter's_Journal\"\r\n },\r\n hasHuntersMark: {\r\n name: \"Hunter's Mark\",\r\n spoiler: \"Greenpath: Hunter, complete base 146 Hunter Notes\",\r\n wiki: \"Hunter's_Mark\"\r\n },\r\n killsBigBuzzer: {\r\n name: \"Vengefly King Journal Note\",\r\n spoiler: \"Colosseum: Trial of the Warrior\",\r\n wiki: \"Vengefly_King\"\r\n },\r\n falseKnightDreamDefeated: {\r\n name: \"Failed Champion\",\r\n spoiler: \"Forgotten Crossroads, near False Knight\",\r\n wiki: \"Failed_Champion\"\r\n },\r\n mageLordDreamDefeated: {\r\n name: \"Soul Tyrant\",\r\n spoiler: \"City of Tears: Soul Sanctum, near Soul Master\",\r\n wiki: \"Soul_Tyrant\"\r\n },\r\n infectedKnightDreamDefeated: {\r\n name: \"Lost Kin\",\r\n spoiler: \"Ancient Basin, Broken Vessel location\",\r\n wiki: \"Lost_Kin\"\r\n },\r\n whiteDefenderDefeated: {\r\n name: \"White Defender\",\r\n spoiler: \"Royal Waterways, Dung Defender, use Desolate Dive\",\r\n wiki: \"White_Defender\"\r\n },\r\n greyPrinceDefeated: {\r\n name: \"Grey Prince Zote\",\r\n spoiler: \"Dirtmouth: Bretta's Room (per save choice)\",\r\n wiki: \"Grey_Prince_Zote\"\r\n },\r\n killedHollowKnight: {\r\n name: \"Hollow Knight\",\r\n spoiler: \"Forgotten Crossroads: Black Egg Temple\",\r\n wiki: \"Hollow_Knight\"\r\n },\r\n salubraBlessing: {\r\n name: \"Salubra's Blessing\",\r\n spoiler: \"Salubra: 800 Geo + all 40 Charms Owned\",\r\n wiki: \"Salubra's_Blessing\"\r\n },\r\n quirrelEpilogueCompleted: {\r\n name: \"Quirrel: Witness\",\r\n spoiler: \"Blue Lake: after defeating Monomon the Teacher\",\r\n wiki: \"Quirrel\"\r\n },\r\n xunRewardGiven: {\r\n name: \"Grey Mourner: Solace\",\r\n spoiler: \"Resting Grounds: Complete Delicate Flower quest\",\r\n wiki: \"Grey_Mourner\"\r\n },\r\n zoteStatus: {\r\n id: \"zoteStatus\",\r\n name: \"Zote Status\",\r\n nameDefault: \"Zote Status\",\r\n nameNeglect: \"Zote Choice: Neglect\",\r\n nameRivalry: \"Zote Choice: Rivalry\",\r\n nameTrappedVengefly: \"Zote Status: Vengefly\",\r\n nameNotRescuedVengefly: \"Zote Status: Greenpath\",\r\n nameTrappedDeepnest: \"Zote Status: Deepnest\",\r\n nameColosseum: \"Zote Status: Colosseum of Fools\",\r\n spoiler: \"One achievement per save file\",\r\n spoilerDefault: \"One achievement per save file\",\r\n spoilerNeglect: \"Left Zote to die\",\r\n spoilerRivalry: \"Defeated Zote in the Colosseum of Fools\",\r\n spoilerTrappedVengefly: \"Greenpath, defeat Vengefly King\",\r\n spoilerNotRescuedVengefly: \"Check what happened with Zote\",\r\n spoilerTrappedDeepnest: \"Deepnest, free from cobwebs\",\r\n spoilerColosseum: \"Trial of the Warrior\",\r\n wiki: \"Zote\"\r\n },\r\n nailsmithStatus: {\r\n id: \"nailsmithStatus\",\r\n name: \"Nailsmith Status\",\r\n nameDefault: \"Nailsmith Status\",\r\n nameHappyCouple: \"Nailsmith Choice: Happy Couple\",\r\n namePurity: \"Nailsmith Choice: Purity\",\r\n nameSheoHutWaiting: \"Nailsmith Status: Sheo\",\r\n nameUpgradeNail: \"Nailsmith Status: Waiting\",\r\n spoiler: \"One achievement per save file\",\r\n spoilerDefault: \"One achievement per save file\",\r\n spoilerHappyCouple: \"Found a new calling\",\r\n spoilerPurity: \"Slain with Pure Nail\",\r\n spoilerSheoHutWaiting: \"Waiting at Sheo's Hut\",\r\n spoilerUpgradeNail: \"Upgrade Nail to Pure Nail\",\r\n wiki: \"Nailsmith\"\r\n },\r\n gotShadeCharm: {\r\n name: \"Void Heart\",\r\n spoiler: \"Equip Kingsoul Charm and find Birthplace\",\r\n wiki: \"Void_Heart\"\r\n },\r\n killedFinalBoss: {\r\n name: \"The Radiance\",\r\n spoiler: \"Requires Void Heart & Dream Nail Hollow Knight\",\r\n wiki: \"Radiance\"\r\n },\r\n mrMushroomState1: {\r\n name: \"Mr Mushroom #1\",\r\n spoiler: \"Fungal Wastes, near Cornifer\",\r\n wiki: \"Mister_Mushroom\",\r\n state: 2\r\n },\r\n mrMushroomState2: {\r\n name: \"Mr Mushroom #2\",\r\n spoiler: \"Kingdom's Edge, near Isma's Grove\",\r\n wiki: \"Mister_Mushroom\",\r\n state: 3\r\n },\r\n mrMushroomState3: {\r\n name: \"Mr Mushroom #3\",\r\n spoiler: \"Deepnest, near Galien\",\r\n wiki: \"Mister_Mushroom\",\r\n state: 4\r\n },\r\n mrMushroomState4: {\r\n name: \"Mr Mushroom #4\",\r\n spoiler: \"Howling Cliffs, near Nailmaster Mato\",\r\n wiki: \"Mister_Mushroom\",\r\n state: 5\r\n },\r\n mrMushroomState5: {\r\n name: \"Mr Mushroom #5\",\r\n spoiler: \"Ancient Basin, near Monarch Wings\",\r\n wiki: \"Mister_Mushroom\",\r\n state: 6\r\n },\r\n mrMushroomState6: {\r\n name: \"Mr Mushroom #6\",\r\n spoiler: \"Fog Canyon, near Overgrown Mound\",\r\n wiki: \"Mister_Mushroom\",\r\n state: 7\r\n },\r\n mrMushroomState7: {\r\n name: \"Mr Mushroom #7\",\r\n spoiler: \"King's Pass, game starting location\",\r\n wiki: \"Mister_Mushroom\",\r\n state: 8\r\n },\r\n pantheonHallownest: {\r\n name: \"P5 Embrace the Void\",\r\n spoiler: \"Godhome: Pantheon of Hallownest\",\r\n wiki: \"Pantheon_of_Hallownest\"\r\n },\r\n /* \r\n Mr Mushroom data\r\n case SplitName.MrMushroom1: shouldSplit = mem.PlayerData(Offset.mrMushroomState) == 2; break;\r\n case SplitName.MrMushroom2: shouldSplit = mem.PlayerData(Offset.mrMushroomState) == 3; break;\r\n case SplitName.MrMushroom3: shouldSplit = mem.PlayerData(Offset.mrMushroomState) == 4; break;\r\n case SplitName.MrMushroom4: shouldSplit = mem.PlayerData(Offset.mrMushroomState) == 5; break;\r\n case SplitName.MrMushroom5: shouldSplit = mem.PlayerData(Offset.mrMushroomState) == 6; break;\r\n case SplitName.MrMushroom6: shouldSplit = mem.PlayerData(Offset.mrMushroomState) == 7; break;\r\n case SplitName.MrMushroom7: shouldSplit = mem.PlayerData(Offset.mrMushroomState) == 8; break;\r\n \r\n \"mrMushroomState\": 4, < this is the current location of Mr Mushroom (Howling Cliffs)\r\n \r\n 1. Spawn of self, their minds unite, (Fungal Wastes)\r\n 2. Aside the source of acid blight, (Kingdom's Edge, near Isma's Grove)\r\n 3. Aglow in darkest, winding depths, (Deepnest, near Galien)\r\n 4. Winds all howl above fossilstone steps, (Howling Cliffs)\r\n 5. Monarchflys in air set still, (Ancient Basin, near the Monarch Wings location)\r\n 6. To Root's domain and snail once shrill, (Fog Canyon, near Overgrown Mound)\r\n 7. Path of Wyrm, at new lands entered, (King's Pass)\r\n 8. There journeys end. The kingdom ventured.\r\n */\r\n },\r\n },\r\n\r\n /* ################ Hunter's Journal ################### */\r\n\r\n huntersJournal: {\r\n h2: \"Hunter's Journal\",\r\n id: \"hk-journal\",\r\n description: `All base Hunter's Journal entries that are required for Hunter's Mark and Keen Hunter/True Hunter achievements. The most commonly missed enemies are right at the top of this list.
\r\n = note completed.
\r\n = entry discovered, but note not completed.
\r\n = entry not yet discovered.
\r\n (no.) = amount left to complete note.`,\r\n percent: 0,\r\n maxPercent: 146,\r\n entries: {\r\n PrayerSlug: {\r\n name: \"Maggot (2)\",\r\n nameDefault: \"Maggot\",\r\n spoiler: \"Forgotten Crossroads: False Knight secret room\",\r\n wiki: \"Maggot\"\r\n },\r\n OrangeScuttler: {\r\n name: \"Lightseed (20)\",\r\n nameDefault: \"Lightseed\",\r\n spoiler: \"Infected Crossroads\",\r\n wiki: \"Lightseed\"\r\n },\r\n Pigeon: {\r\n name: \"Maskfly (15)\",\r\n nameDefault: \"Maskfly\",\r\n spoiler: \"Greenpath, Queen's Gardens\",\r\n wiki: \"Maskfly\"\r\n },\r\n LazyFlyer: {\r\n name: \"Aluba (1)\",\r\n nameDefault: \"Aluba\",\r\n spoiler: \"Lake of Unn, Queen's Gardens (near White Lady)\",\r\n wiki: \"Aluba\"\r\n },\r\n AcidFlyer: {\r\n name: \"Duranda (8)\",\r\n nameDefault: \"Duranda\",\r\n spoiler: \"Greenpath: Nailmaster Sheo's tent path\",\r\n wiki: \"Duranda\"\r\n },\r\n AcidWalker: {\r\n name: \"Durandoo (8)\",\r\n nameDefault: \"Durandoo\",\r\n spoiler: \"Greenpath, Queen's Gardens\",\r\n wiki: \"Durandoo\"\r\n },\r\n PlantShooter: {\r\n name: \"Gulka (15)\",\r\n nameDefault: \"Gulka\",\r\n spoiler: \"Greenpath: left of Stone Sanctuary\",\r\n wiki: \"Gulka\"\r\n },\r\n MushroomTurret: {\r\n name: \"Sporg (20)\",\r\n nameDefault: \"Sporg\",\r\n spoiler: \"Fungal Wastes\",\r\n wiki: \"Sporg\"\r\n },\r\n ZapBug: {\r\n name: \"Charged Lumafly (1)\",\r\n nameDefault: \"Charged Lumafly\",\r\n spoiler: \"Fog Canyon: Teacher's Archives (tank)\",\r\n wiki: \"Charged_Lumafly\"\r\n },\r\n LaserBug: {\r\n name: \"Crystal Crawler (15)\",\r\n nameDefault: \"Crystal Crawler\",\r\n spoiler: \"Crystal Peak: try to use spells\",\r\n wiki: \"Crystal_Crawler\"\r\n },\r\n GorgeousHusk: {\r\n name: \"Gorgeous Husk (1)\",\r\n nameDefault: \"Gorgeous Husk\",\r\n spoiler: \"City of Tears: secret room\",\r\n wiki: \"Gorgeous_Husk\"\r\n },\r\n Worm: {\r\n name: \"Goam (10)\",\r\n nameDefault: \"Goam\",\r\n spoiler: \"Infected Crossroads: near Fungal Wastes entrance\",\r\n wiki: \"Goam\"\r\n },\r\n BigCentipede: {\r\n name: \"Garpede (10)\",\r\n nameDefault: \"Garpede\",\r\n spoiler: \"Deepnest: right of Hot Spring\",\r\n wiki: \"Garpede\"\r\n },\r\n AbyssTendril: {\r\n name: \"Void Tendrils (10)\",\r\n nameDefault: \"Void Tendrils\",\r\n spoiler: \"The Abyss: secret room near Shade Cloak\",\r\n wiki: \"Void_Tendrils\"\r\n },\r\n LobsterLancer: {\r\n name: \"God Tamer (1)\",\r\n nameDefault: \"God Tamer\",\r\n spoiler: \"Colosseum of Fools: Trial of the Fool boss\",\r\n wiki: \"God_Tamer\"\r\n },\r\n FatFluke: {\r\n name: \"Flukemunga (8)\",\r\n nameDefault: \"Flukemunga\",\r\n spoiler: \"Royal Waterways: secret area, left of bench\",\r\n wiki: \"Flukemunga\"\r\n },\r\n PaleLurker: {\r\n name: \"Pale Lurker (1)\",\r\n nameDefault: \"Pale Lurker\",\r\n spoiler: \"Colosseum of Fools: top right breakable wall\",\r\n wiki: \"Pale_Lurker\"\r\n },\r\n Crawler: {\r\n name: \"Crawlid (0)\",\r\n nameDefault: \"Crawlid\",\r\n spoiler: \"King's Pass, Forgotten Crossroads, Greenpath\",\r\n wiki: \"Crawlid\"\r\n },\r\n Buzzer: {\r\n name: \"Vengefly (45)\",\r\n nameDefault: \"Vengefly\",\r\n spoiler: \"Howling Cliffs, Forgotten Crossroads, City of Tears\",\r\n wiki: \"Vengefly\"\r\n },\r\n Bouncer: {\r\n name: \"Gruzzer (25)\",\r\n nameDefault: \"Gruzzer\",\r\n spoiler: \"Forgotten Crossroads\",\r\n wiki: \"Gruzzer\"\r\n },\r\n Climber: {\r\n name: \"Tiktik (30)\",\r\n nameDefault: \"Tiktik\",\r\n spoiler: \"Forgotten Crossroads, Howling Cliffs, Greenpath\",\r\n wiki: \"Tiktik\"\r\n },\r\n Hopper: {\r\n name: \"Hopper (25)\",\r\n nameDefault: \"Hopper\",\r\n spoiler: \"Kingdom's Edge\",\r\n wiki: \"Hopper\"\r\n },\r\n Spitter: {\r\n name: \"Aspid Hunter (20)\",\r\n nameDefault: \"Aspid Hunter\",\r\n spoiler: \"Forgotten Crossroads, Ancient Basin, The Collector\",\r\n wiki: \"Aspid_Hunter\"\r\n },\r\n Hatcher: {\r\n name: \"Aspid Mother (15)\",\r\n nameDefault: \"Aspid Mother\",\r\n spoiler: \"Forgotten Crossroads, mainly next to the Tram station\",\r\n wiki: \"Aspid_Mother\"\r\n },\r\n Hatchling: {\r\n name: \"Aspid Hatchling (30)\",\r\n nameDefault: \"Aspid Hatchling\",\r\n spoiler: \"Forgotten Crossroads, summoned by Aspid Mother\",\r\n wiki: \"Aspid_Hatchling\"\r\n },\r\n ZombieRunner: {\r\n name: \"Wandering Husk (35)\",\r\n nameDefault: \"Wandering Husk\",\r\n spoiler: \"Forgotten Crossroads, City of Tears, Deepnest\",\r\n wiki: \"Wandering_Husk\"\r\n },\r\n ZombieHornhead: {\r\n name: \"Husk Hornhead (35)\",\r\n nameDefault: \"Husk Hornhead\",\r\n spoiler: \"Forgotten Crossroads, City of Tears, Deepnest\",\r\n wiki: \"Husk_Hornhead\"\r\n },\r\n ZombieLeaper: {\r\n name: \"Leaping Husk (35)\",\r\n nameDefault: \"Leaping Husk\",\r\n spoiler: \"Forgotten Crossroads, City of Tears, Howling Cliffs\",\r\n wiki: \"Leaping_Husk\"\r\n },\r\n ZombieBarger: {\r\n name: \"Husk Bully (35)\",\r\n nameDefault: \"Husk Bully\",\r\n spoiler: \"Forgotten Crossroads, City of Tears, Howling Cliffs\",\r\n wiki: \"Husk_Bully\"\r\n },\r\n ZombieShield: {\r\n name: \"Husk Warrior (10)\",\r\n nameDefault: \"Husk Warrior\",\r\n spoiler: \"Forgotten Crossroads: right of the Stag Station\",\r\n wiki: \"Husk_Warrior\"\r\n },\r\n ZombieGuard: {\r\n name: \"Husk Guard (6)\",\r\n nameDefault: \"Husk Guard\",\r\n spoiler: \"Forgotten Crossroads: upper right area\",\r\n wiki: \"Husk_Guard\"\r\n },\r\n BigBuzzer: {\r\n name: \"Vengefly King (2)\",\r\n nameDefault: \"Vengefly King\",\r\n spoiler: \"Greenpath, Colosseum: Trial of the Warrior\",\r\n wiki: \"Vengefly_King\"\r\n },\r\n BigFly: {\r\n name: \"Gruz Mother (3)\",\r\n nameDefault: \"Gruz Mother\",\r\n spoiler: \"Forgotten Crossroads: lower right area\",\r\n wiki: \"Gruz_Mother\"\r\n },\r\n Mawlek: {\r\n name: \"Brooding Mawlek (1)\",\r\n nameDefault: \"Brooding Mawlek\",\r\n spoiler: \"Forgotten Crossroads: down from Grubfather\",\r\n wiki: \"Brooding_Mawlek\"\r\n },\r\n FalseKnight: {\r\n name: \"False Knight (1)\",\r\n nameDefault: \"False Knight\",\r\n spoiler: \"Forgotten Crossroads: middle area map symbol\",\r\n wiki: \"False_Knight\"\r\n },\r\n Roller: {\r\n name: \"Baldur (20)\",\r\n nameDefault: \"Baldur\",\r\n spoiler: \"Ancestral Mound, Crystallised Mound, Howling Cliffs\",\r\n wiki: \"Baldur\"\r\n },\r\n Blocker: {\r\n name: \"Elder Baldur (1)\",\r\n nameDefault: \"Elder Baldur\",\r\n spoiler: \"Ancestral Mound, Greenpath, Howling Cliffs\",\r\n wiki: \"Elder_Baldur\"\r\n },\r\n MossmanRunner: {\r\n name: \"Mosskin (25)\",\r\n nameDefault: \"Mosskin\",\r\n spoiler: \"Greenpath: usually near a Volatile Mosskin\",\r\n wiki: \"Mosskin\"\r\n },\r\n MossmanShaker: {\r\n name: \"Volatile Mosskin (25)\",\r\n nameDefault: \"Volatile Mosskin\",\r\n spoiler: \"Greenpath\",\r\n wiki: \"Volatile_Mosskin\"\r\n },\r\n Mosquito: {\r\n name: \"Squit (25)\",\r\n nameDefault: \"Squit\",\r\n spoiler: \"Greenpath and the Overgrown Mound\",\r\n wiki: \"Squit\"\r\n },\r\n BlobFlyer: {\r\n name: \"Obble (20)\",\r\n nameDefault: \"Obble\",\r\n spoiler: \"Greenpath: top left of Stone Sanctuary\",\r\n wiki: \"Obble\"\r\n },\r\n FungifiedZombie: {\r\n name: \"Fungified Husk (10)\",\r\n nameDefault: \"Fungified Husk\",\r\n spoiler: \"Found only in Fungal Wastes\",\r\n wiki: \"Fungified_Husk\"\r\n },\r\n MossCharger: {\r\n name: \"Moss Charger (15)\",\r\n nameDefault: \"Moss Charger\",\r\n spoiler: \"Found only in Greenpath\",\r\n wiki: \"Moss_Charger\"\r\n },\r\n MegaMossCharger: {\r\n name: \"Massive Moss Charger (1)\",\r\n nameDefault: \"Massive Moss Charger\",\r\n spoiler: \"Greenpath: bottom left near Fog Canyon\",\r\n wiki: \"Massive_Moss_Charger\"\r\n },\r\n SnapperTrap: {\r\n name: \"Fool Eater (15)\",\r\n nameDefault: \"Fool Eater\",\r\n spoiler: \"Greenpath and Queen's Gardens\",\r\n wiki: \"Fool_Eater\"\r\n },\r\n MossKnight: {\r\n name: \"Moss Knight (8)\",\r\n nameDefault: \"Moss Knight\",\r\n spoiler: \"Found only in Greenpath\",\r\n wiki: \"Moss_Knight\"\r\n },\r\n GrassHopper: {\r\n name: \"Loodle (15)\",\r\n nameDefault: \"Loodle\",\r\n spoiler: \"Found only in Queen's Gardens\",\r\n wiki: \"Loodle\"\r\n },\r\n MossFlyer: {\r\n name: \"Mossfly (25)\",\r\n nameDefault: \"Mossfly\",\r\n spoiler: \"Queen's Gardens, Overgrown Mound\",\r\n wiki: \"Mossfly\"\r\n },\r\n MossKnightFat: {\r\n name: \"Mossy Vagabond (10)\",\r\n nameDefault: \"Mossy Vagabond\",\r\n spoiler: \"Queen's Gardens: near exit to Fungal Wastes\",\r\n wiki: \"Mossy_Vagabond\"\r\n },\r\n MossWalker: {\r\n name: \"Mosscreep (30)\",\r\n nameDefault: \"Mosscreep\",\r\n spoiler: \"Greenpath and Queen's Gardens\",\r\n wiki: \"Mosscreep\"\r\n },\r\n InfectedKnight: {\r\n name: \"Broken Vessel (1)\",\r\n nameDefault: \"Broken Vessel\",\r\n spoiler: \"Ancient Basin: far left, needs Crystal Heart\",\r\n wiki: \"Broken_Vessel\"\r\n },\r\n Jellyfish: {\r\n name: \"Ooma (12)\",\r\n nameDefault: \"Ooma\",\r\n spoiler: \"Fog Canyon: almost everywhere\",\r\n wiki: \"Ooma\"\r\n },\r\n JellyCrawler: {\r\n name: \"Uoma (20)\",\r\n nameDefault: \"Uoma\",\r\n spoiler: \"Fog Canyon: almost everywhere\",\r\n wiki: \"Uoma\"\r\n },\r\n MegaJellyfish: {\r\n name: \"Uumuu (1)\",\r\n nameDefault: \"Uumuu\",\r\n spoiler: \"Fog Canyon: inside Teacher's Archives\",\r\n wiki: \"Uumuu\"\r\n },\r\n FungoonBaby: {\r\n name: \"Fungling (30)\",\r\n nameDefault: \"Fungling\",\r\n spoiler: \"Fungal Wastes, Fungal Core, Junk Pit\",\r\n wiki: \"Fungling\"\r\n },\r\n Mantis: {\r\n name: \"Mantis Warrior (25)\",\r\n nameDefault: \"Mantis Warrior\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n wiki: \"Mantis_Warrior\"\r\n },\r\n MushroomRoller: {\r\n name: \"Shrumal Warrior (20)\",\r\n nameDefault: \"Shrumal Warrior\",\r\n spoiler: \"Fungal Wastes, Fungal Core\",\r\n wiki: \"Shrumal_Warrior\"\r\n },\r\n MushroomBrawler: {\r\n name: \"Shrumal Ogre (8)\",\r\n nameDefault: \"Shrumal Ogre\",\r\n spoiler: \"Fungal Wastes, bottom of Fungal Core\",\r\n wiki: \"Shrumal_Ogre\"\r\n },\r\n MushroomBaby: {\r\n name: \"Shrumeling (20)\",\r\n nameDefault: \"Shrumeling\",\r\n spoiler: \"Fungal Wastes, near Shrumal Warriors\",\r\n wiki: \"Shrumeling\"\r\n },\r\n MantisFlyerChild: {\r\n name: \"Mantis Youth (25)\",\r\n nameDefault: \"Mantis Youth\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n wiki: \"Mantis_Youth\"\r\n },\r\n FungusFlyer: {\r\n name: \"Fungoon (20)\",\r\n nameDefault: \"Fungoon\",\r\n spoiler: \"Found only in Fungal Wastes\",\r\n wiki: \"Fungoon\"\r\n },\r\n FungCrawler: {\r\n name: \"Ambloom (15)\",\r\n nameDefault: \"Ambloom\",\r\n spoiler: \"Fungal Wastes, Fungal Core\",\r\n wiki: \"Ambloom\"\r\n },\r\n MantisLord: {\r\n name: \"Mantis Lords (1)\",\r\n nameDefault: \"Mantis Lords\",\r\n spoiler: \"Fungal Wastes: Mantis Village, switch lever\",\r\n wiki: \"Mantis_Lords\"\r\n },\r\n BlackKnight: {\r\n name: \"Watcher Knight (10)\",\r\n nameDefault: \"Watcher Knight\",\r\n spoiler: \"City of Tears: Watcher's Spire, Monarch Wings\",\r\n wiki: \"Watcher_Knight\"\r\n },\r\n ElectricMage: {\r\n name: \"Volt Twister (6)\",\r\n nameDefault: \"Volt Twister\",\r\n spoiler: \"Colosseum of Fools: Trial of the Fool\",\r\n wiki: \"Volt_Twister\"\r\n },\r\n Mage: {\r\n name: \"Soul Twister (20)\",\r\n nameDefault: \"Soul Twister\",\r\n spoiler: \"City of Tears: Soul Sanctum, Trial of the Fool\",\r\n wiki: \"Soul_Twister\"\r\n },\r\n MageKnight: {\r\n name: \"Soul Warrior (2)\",\r\n nameDefault: \"Soul Warrior\",\r\n spoiler: \"City of Tears: Soul Sanctum, Trial of the Fool\",\r\n wiki: \"Soul_Warrior\"\r\n },\r\n RoyalDandy: {\r\n name: \"Husk Dandy (25)\",\r\n nameDefault: \"Husk Dandy\",\r\n spoiler: \"City of Tears: right section\",\r\n wiki: \"Husk_Dandy\"\r\n },\r\n RoyalCoward: {\r\n name: \"Cowardly Husk (25)\",\r\n nameDefault: \"Cowardly Husk\",\r\n spoiler: \"City of Tears: right section\",\r\n wiki: \"Cowardly_Husk\"\r\n },\r\n RoyalPlumper: {\r\n name: \"Gluttonous Husk (25)\",\r\n nameDefault: \"Gluttonous Husk\",\r\n spoiler: \"City of Tears: right section\",\r\n wiki: \"Gluttonous_Husk\"\r\n },\r\n FlyingSentrySword: {\r\n name: \"Winged Sentry (30)\",\r\n nameDefault: \"Winged Sentry\",\r\n spoiler: \"City of Tears, Royal Waterways, Ancient Basin\",\r\n wiki: \"Winged_Sentry\"\r\n },\r\n FlyingSentryJavelin: {\r\n name: \"Lance Sentry (25)\",\r\n nameDefault: \"Lance Sentry\",\r\n spoiler: \"City of Tears, Royal Waterways, Ancient Basin\",\r\n wiki: \"Lance_Sentry\"\r\n },\r\n Sentry: {\r\n name: \"Husk Sentry (25)\",\r\n nameDefault: \"Husk Sentry\",\r\n spoiler: \"City of Tears, Royal Waterways, Isma's Grove\",\r\n wiki: \"Husk_Sentry\"\r\n },\r\n SentryFat: {\r\n name: \"Heavy Sentry (20)\",\r\n nameDefault: \"Heavy Sentry\",\r\n spoiler: \"Found only in City of Tears\",\r\n wiki: \"Heavy_Sentry\"\r\n },\r\n MageBlob: {\r\n name: \"Mistake (25)\",\r\n nameDefault: \"Mistake\",\r\n spoiler: \"City of Tears: Soul Sanctum, Trial of the Fool\",\r\n wiki: \"Mistake\"\r\n },\r\n GreatShieldZombie: {\r\n name: \"Great Husk Sentry (10)\",\r\n nameDefault: \"Great Husk Sentry\",\r\n spoiler: \"City of Tears, Watcher's Spire\",\r\n wiki: \"Great_Husk_Sentry\"\r\n },\r\n JarCollector: {\r\n name: \"The Collector (1)\",\r\n nameDefault: \"The Collector\",\r\n spoiler: \"City of Tears: Tower of Love, Love Key\",\r\n wiki: \"The_Collector\"\r\n },\r\n MageBalloon: {\r\n name: \"Folly (15)\",\r\n nameDefault: \"Folly\",\r\n spoiler: \"City of Tears: Soul Sanctum, Trial of the Fool\",\r\n wiki: \"Folly\"\r\n },\r\n MageLord: {\r\n name: \"Soul Master (1)\",\r\n nameDefault: \"Soul Master\",\r\n spoiler: \"City of Tears: Soul Sanctum\",\r\n wiki: \"Soul_Master\"\r\n },\r\n FlipHopper: {\r\n name: \"Pilflip (20)\",\r\n nameDefault: \"Pilflip\",\r\n spoiler: \"Royal Waterways: central part\",\r\n wiki: \"Pilflip\"\r\n },\r\n Flukeman: {\r\n name: \"Flukemon (20)\",\r\n nameDefault: \"Flukemon\",\r\n spoiler: \"Royal Waterways: central part\",\r\n wiki: \"Flukemon\"\r\n },\r\n Inflater: {\r\n name: \"Hwurmp (20)\",\r\n nameDefault: \"Hwurmp\",\r\n spoiler: \"Royal Waterways, Isma's Grove\",\r\n wiki: \"Hwurmp\"\r\n },\r\n Flukefly: {\r\n name: \"Flukefey (15)\",\r\n nameDefault: \"Flukefey\",\r\n spoiler: \"Found only in Royal Waterways\",\r\n wiki: \"Flukefey\"\r\n },\r\n FlukeMother: {\r\n name: \"Flukemarm (1)\",\r\n nameDefault: \"Flukemarm\",\r\n spoiler: \"Royal Waterways: bottom, Desolate Dive\",\r\n wiki: \"Flukemarm\"\r\n },\r\n DungDefender: {\r\n name: \"Dung Defender (1)\",\r\n nameDefault: \"Dung Defender\",\r\n spoiler: \"Royal Waterways: right area\",\r\n wiki: \"Dung_Defender\"\r\n },\r\n CrystalCrawler: {\r\n name: \"Glimback (15)\",\r\n nameDefault: \"Glimback\",\r\n spoiler: \"Crystal Peak, Forgotten Crossroads toll booth\",\r\n wiki: \"Glimback\"\r\n },\r\n CrystalFlyer: {\r\n name: \"Crystal Hunter (20)\",\r\n nameDefault: \"Crystal Hunter\",\r\n spoiler: \"Crystal Peak, Crystallized Mound\",\r\n wiki: \"Crystal_Hunter\"\r\n },\r\n BeamMiner: {\r\n name: \"Crystallised Husk (15)\",\r\n nameDefault: \"Crystallised Husk\",\r\n spoiler: \"Crystal Peak: top right areas\",\r\n wiki: \"Crystallised_Husk\"\r\n },\r\n ZombieMiner: {\r\n name: \"Husk Miner (20)\",\r\n nameDefault: \"Husk Miner\",\r\n spoiler: \"Found only in Crystal Peak\",\r\n wiki: \"Husk_Miner\"\r\n },\r\n MegaBeamMiner: {\r\n name: \"Crystal Guardian (2)\",\r\n nameDefault: \"Crystal Guardian\",\r\n spoiler: \"Crystal Peak: center bench area\",\r\n wiki: \"Crystal_Guardian\"\r\n },\r\n MinesCrawler: {\r\n name: \"Shardmite (15)\",\r\n nameDefault: \"Shardmite\",\r\n spoiler: \"Found only in Crystal Peak\",\r\n wiki: \"Shardmite\"\r\n },\r\n AngryBuzzer: {\r\n name: \"Furious Vengefly (15)\",\r\n nameDefault: \"Furious Vengefly\",\r\n spoiler: \"Infected Crossroads, Trial of the Fool\",\r\n wiki: \"Furious_Vengefly\"\r\n },\r\n BurstingBouncer: {\r\n name: \"Volatile Gruzzer (15)\",\r\n nameDefault: \"Volatile Gruzzer\",\r\n spoiler: \"Infected Crossroads, Colosseum Trials\",\r\n wiki: \"Volatile_Gruzzer\"\r\n },\r\n BurstingZombie: {\r\n name: \"Violent Husk (15)\",\r\n nameDefault: \"Violent Husk\",\r\n spoiler: \"Found only in Infected Crossroads\",\r\n wiki: \"Violent_Husk\"\r\n },\r\n SpittingZombie: {\r\n name: \"Slobbering Husk (15)\",\r\n nameDefault: \"Slobbering Husk\",\r\n spoiler: \"Found only in Infected Crossroads\",\r\n wiki: \"Slobbering_Husk\"\r\n },\r\n BabyCentipede: {\r\n name: \"Dirtcarver (35)\",\r\n nameDefault: \"Dirtcarver\",\r\n spoiler: \"Deepnest, Carver Hatcher\",\r\n wiki: \"Dirtcarver\"\r\n },\r\n CentipedeHatcher: {\r\n name: \"Carver Hatcher (15)\",\r\n nameDefault: \"Carver Hatcher\",\r\n spoiler: \"Deepnest: top area Failed Tramway\",\r\n wiki: \"Carver_Hatcher\"\r\n },\r\n LesserMawlek: {\r\n name: \"Lesser Mawlek (10)\",\r\n nameDefault: \"Lesser Mawlek\",\r\n spoiler: \"Ancient Basin: left of tram, Trial of the Fool\",\r\n wiki: \"Lesser_Mawlek\"\r\n },\r\n SlashSpider: {\r\n name: \"Stalking Devout (15)\",\r\n nameDefault: \"Stalking Devout\",\r\n spoiler: \"Deepnest: left area, Distant Village\",\r\n wiki: \"Stalking_Devout\"\r\n },\r\n SpiderCorpse: {\r\n name: \"Corpse Creeper (15)\",\r\n nameDefault: \"Corpse Creeper\",\r\n spoiler: \"Found only in Deepnest: middle area\",\r\n wiki: \"Corpse_Creeper\"\r\n },\r\n ShootSpider: {\r\n name: \"Deephunter (20)\",\r\n nameDefault: \"Deephunter\",\r\n spoiler: \"Found only in Deepnest\",\r\n wiki: \"Deephunter\"\r\n },\r\n MiniSpider: {\r\n name: \"Deepling (25)\",\r\n nameDefault: \"Deepling\",\r\n spoiler: \"Deepnest: left areas\",\r\n wiki: \"Deepling\"\r\n },\r\n SpiderFlyer: {\r\n name: \"Little Weaver (20)\",\r\n nameDefault: \"Little Weaver\",\r\n spoiler: \"Deepnest: left areas\",\r\n wiki: \"Little_Weaver\"\r\n },\r\n MimicSpider: {\r\n name: \"Nosk (1)\",\r\n nameDefault: \"Nosk\",\r\n spoiler: \"Deepnest: left of Hot Spring, use Crystal Heart\",\r\n wiki: \"Nosk\"\r\n },\r\n BeeHatchling: {\r\n name: \"Hiveling (30)\",\r\n nameDefault: \"Hiveling\",\r\n spoiler: \"The Hive, Kingdom's Edge\",\r\n wiki: \"Hiveling\"\r\n },\r\n BeeStinger: {\r\n name: \"Hive Soldier (15)\",\r\n nameDefault: \"Hive Soldier\",\r\n spoiler: \"Found only in the Hive\",\r\n wiki: \"Hive_Soldier\"\r\n },\r\n BigBee: {\r\n name: \"Hive Guardian (12)\",\r\n nameDefault: \"Hive Guardian\",\r\n spoiler: \"Found only in the Hive\",\r\n wiki: \"Hive_Guardian\"\r\n },\r\n HiveKnight: {\r\n name: \"Hive Knight (1)\",\r\n nameDefault: \"Hive Knight\",\r\n spoiler: \"The Hive: right area\",\r\n wiki: \"Hive_Knight\"\r\n },\r\n BlowFly: {\r\n name: \"Boofly (20)\",\r\n nameDefault: \"Boofly\",\r\n spoiler: \"Found only in Kingdom's Edge\",\r\n wiki: \"Boofly\"\r\n },\r\n CeilingDropper: {\r\n name: \"Belfly (15)\",\r\n nameDefault: \"Belfly\",\r\n spoiler: \"City of Tears, Royal Waterways, Kingdom's Edge\",\r\n wiki: \"Belfly\"\r\n },\r\n GiantHopper: {\r\n name: \"Great Hopper (10)\",\r\n nameDefault: \"Great Hopper\",\r\n spoiler: \"Kingdom's Edge, Trial of the Conqueror\",\r\n wiki: \"Great_Hopper\"\r\n },\r\n GrubMimic: {\r\n name: \"Grub Mimic (5)\",\r\n nameDefault: \"Grub Mimic\",\r\n spoiler: \"Crystal Peak, Deepnest, Trial of the Conqueror\",\r\n wiki: \"Grub_Mimic\"\r\n },\r\n MawlekTurret: {\r\n name: \"Mawlurk (10)\",\r\n nameDefault: \"Mawlurk\",\r\n spoiler: \"Ancient Basin: left area\",\r\n wiki: \"Mawlurk\"\r\n },\r\n HealthScuttler: {\r\n name: \"Lifeseed (10)\",\r\n nameDefault: \"Lifeseed\",\r\n spoiler: \"Hallownest: inside Lifeblood Cocoons\",\r\n wiki: \"Lifeseed\"\r\n },\r\n ZombieHive: {\r\n name: \"Husk Hive (10)\",\r\n nameDefault: \"Husk Hive\",\r\n spoiler: \"found only in the Hive\",\r\n wiki: \"Husk_Hive\"\r\n },\r\n Hornet: {\r\n name: \"Hornet (2)\",\r\n nameDefault: \"Hornet\",\r\n spoiler: \"Greenpath, Kingdom's Edge, Godhome\",\r\n wiki: \"Hornet\"\r\n },\r\n AbyssCrawler: {\r\n name: \"Shadow Creeper (20)\",\r\n nameDefault: \"Shadow Creeper\",\r\n spoiler: \"Ancient Basin, the Abyss\",\r\n wiki: \"Shadow_Creeper\"\r\n },\r\n SuperSpitter: {\r\n name: \"Primal Aspid (25)\",\r\n nameDefault: \"Primal Aspid\",\r\n spoiler: \"Kingdom's Edge, Colosseum of Fools Trials\",\r\n wiki: \"Primal_Aspid\"\r\n },\r\n Sibling: {\r\n name: \"Sibling (25)\",\r\n nameDefault: \"Sibling\",\r\n spoiler: \"The Abyss, lighthouse, Birthplace\",\r\n wiki: \"Sibling\"\r\n },\r\n PalaceFly: {\r\n name: \"Wingmould (10)\",\r\n nameDefault: \"Wingmould\",\r\n spoiler: \"Found only in the White Palace\",\r\n wiki: \"Wingmould\"\r\n },\r\n EggSac: {\r\n name: \"Bluggsac (5)\",\r\n nameDefault: \"Bluggsac\",\r\n spoiler: \"Royal Waterways, Crystal Peak, Deepnest, Hallownest\",\r\n wiki: \"Bluggsac\"\r\n },\r\n Mummy: {\r\n name: \"Entombed Husk (10)\",\r\n nameDefault: \"Entombed Husk\",\r\n spoiler: \"Resting Grounds: bottom area tombs\",\r\n wiki: \"Entombed_Husk\"\r\n },\r\n OrangeBalloon: {\r\n name: \"Infected Balloon (10)\",\r\n nameDefault: \"Infected Balloon\",\r\n spoiler: \"Ancient Basin: left areas\",\r\n wiki: \"Infected_Balloon\"\r\n },\r\n HeavyMantis: {\r\n name: \"Mantis Traitor (15)\",\r\n nameDefault: \"Mantis Traitor\",\r\n spoiler: \"Queen's Gardens, Trial of the Fool\",\r\n wiki: \"Mantis_Traitor\"\r\n },\r\n TraitorLord: {\r\n name: \"Traitor Lord (1)\",\r\n nameDefault: \"Traitor Lord\",\r\n spoiler: \"Queen's Gardens: upper left, Shade Cloak\",\r\n wiki: \"Traitor_Lord\"\r\n },\r\n MantisHeavyFlyer: {\r\n name: \"Mantis Petra (16)\",\r\n nameDefault: \"Mantis Petra\",\r\n spoiler: \"Queen's Gardens, Trial of the Fool\",\r\n wiki: \"Mantis_Petra\"\r\n },\r\n GardenZombie: {\r\n name: \"Spiny Husk (20)\",\r\n nameDefault: \"Spiny Husk\",\r\n spoiler: \"Found only in Queen's Gardens\",\r\n wiki: \"Spiny_Husk\"\r\n },\r\n RoyalGuard: {\r\n name: \"Kingsmould (2)\",\r\n nameDefault: \"Kingsmould\",\r\n spoiler: \"Found only in the White Palace\",\r\n wiki: \"Kingsmould\"\r\n },\r\n WhiteRoyal: {\r\n name: \"Royal Retainer (10)\",\r\n nameDefault: \"Royal Retainer\",\r\n spoiler: \"Found only in the White Palace\",\r\n wiki: \"Royal_Retainer\"\r\n },\r\n Oblobble: {\r\n name: \"Oblobble (3)\",\r\n nameDefault: \"Oblobble\",\r\n spoiler: \"Trial of the Conqueror, Godhome\",\r\n wiki: \"Oblobbles\"\r\n },\r\n Blobble: {\r\n name: \"Battle Obble (15)\",\r\n nameDefault: \"Battle Obble\",\r\n spoiler: \"Colosseum of Fools: Trials #2 and #3\",\r\n wiki: \"Battle_Obble\"\r\n },\r\n ColMosquito: {\r\n name: \"Armoured Squit (15)\",\r\n nameDefault: \"Armoured Squit\",\r\n spoiler: \"Colosseum of Fools: Trials #2 and #3\",\r\n wiki: \"Armoured_Squit\"\r\n },\r\n ColRoller: {\r\n name: \"Sharp Baldur (20)\",\r\n nameDefault: \"Sharp Baldur\",\r\n spoiler: \"Colosseum of Fools: Trials #1 and #3\",\r\n wiki: \"Sharp_Baldur\"\r\n },\r\n ColFlyingSentry: {\r\n name: \"Winged Fool (25)\",\r\n nameDefault: \"Winged Fool\",\r\n spoiler: \"Colosseum of Fools: Trials #2 and #3\",\r\n wiki: \"Winged_Fool\"\r\n },\r\n ColMiner: {\r\n name: \"Sturdy Fool (25)\",\r\n nameDefault: \"Sturdy Fool\",\r\n spoiler: \"Colosseum of Fools: Trials #1 and #3\",\r\n wiki: \"Sturdy_Fool\"\r\n },\r\n ColShield: {\r\n name: \"Shielded Fool (25)\",\r\n nameDefault: \"Shielded Fool\",\r\n spoiler: \"Colosseum of Fools: All Trials\",\r\n wiki: \"Shielded_Fool\"\r\n },\r\n ColWorm: {\r\n name: \"Heavy Fool (20)\",\r\n nameDefault: \"Heavy Fool\",\r\n spoiler: \"Colosseum of Fools: Trials #2 and #3\",\r\n wiki: \"Heavy_Fool\"\r\n },\r\n ColHopper: {\r\n name: \"Death Loodle (15)\",\r\n nameDefault: \"Death Loodle\",\r\n spoiler: \"Colosseum of Fools: Trial of the Fool\",\r\n wiki: \"Death_Loodle\"\r\n },\r\n GhostAladar: {\r\n name: \"Gorb (1)\",\r\n nameDefault: \"Gorb\",\r\n spoiler: \"Howling Cliffs: top area\",\r\n wiki: \"Gorb\"\r\n },\r\n GhostXero: {\r\n name: \"Xero (1)\",\r\n nameDefault: \"Xero\",\r\n spoiler: \"Resting Grounds: left area\",\r\n wiki: \"Xero\"\r\n },\r\n GhostHu: {\r\n name: \"Elder Hu (1)\",\r\n nameDefault: \"Elder Hu\",\r\n spoiler: \"Fungal Wastes: above acid bridge\",\r\n wiki: \"Elder_Hu\"\r\n },\r\n GhostMarmu: {\r\n name: \"Marmu (1)\",\r\n nameDefault: \"Marmu\",\r\n spoiler: \"Queen's Gardens: left of Stag Station\",\r\n wiki: \"Marmu\"\r\n },\r\n GhostNoEyes: {\r\n name: \"No Eyes (1)\",\r\n nameDefault: \"No Eyes\",\r\n spoiler: \"Greenpath: Stone Sanctuary, requires Lumafly Lantern\",\r\n wiki: \"No_Eyes\"\r\n },\r\n GhostMarkoth: {\r\n name: \"Markoth (1)\",\r\n nameDefault: \"Markoth\",\r\n spoiler: \"Kingdom's Edge, requires Shade Cloak\",\r\n wiki: \"Markoth\"\r\n },\r\n GhostGalien: {\r\n name: \"Galien (1)\",\r\n nameDefault: \"Galien\",\r\n spoiler: \"Deepnest: below Failed Tramway\",\r\n wiki: \"Galien\"\r\n },\r\n ShadeJournal: {\r\n name: \"Shade (0)\",\r\n nameDefault: \"Shade\",\r\n spoiler: \"Unlocked automatically after getting the Journal\",\r\n wiki: \"Shade\"\r\n },\r\n },\r\n },\r\n\r\n /* ################ Optional Journal Entries ################### */\r\n\r\n huntersJournalOptional: {\r\n h2: \"Optional Journal Entries\",\r\n id: \"hk-journal-optional\",\r\n description: \"The remaining Hunter's Journal entries which don't count for Hunter's Mark and Keen/True Hunter achievements. Note: 6 entries can be permanently unobtainable, depending on your choices in the save file (Grey Prince Zote, all 3 Zotelings, Grimmkin Nightmare and Nightmare King).\",\r\n entries: {\r\n HunterMark: {\r\n name: \"Hunter's Mark (1)\",\r\n nameDefault: \"Hunter's Mark\",\r\n spoiler: \"Greenpath: Hunter, complete base 146 Hunter Notes\",\r\n wiki: \"Hunter's_Mark\"\r\n },\r\n MenderBug: {\r\n name: \"Menderbug (1)\",\r\n nameDefault: \"Menderbug\",\r\n spoiler: \"Forgotten Crossroads: destroy sign\",\r\n wiki: \"Menderbug\"\r\n },\r\n Zote: {\r\n name: \"Zote (1)\",\r\n nameDefault: \"Zote\",\r\n spoiler: \"Colosseum: Trial of the Warrior or The Eternal Ordeal\",\r\n wiki: \"Zote\"\r\n },\r\n HollowKnight: {\r\n name: \"Hollow Knight (1)\",\r\n nameDefault: \"Hollow Knight\",\r\n spoiler: \"Forgotten Crossroads: Black Egg Temple\",\r\n wiki: \"Hollow_Knight\"\r\n },\r\n FinalBoss: {\r\n name: \"The Radiance (1)\",\r\n nameDefault: \"The Radiance\",\r\n spoiler: \"Requires Void Heart & Dream Nail Hollow Knight\",\r\n wiki: \"Radiance\"\r\n },\r\n WhiteDefender: {\r\n name: \"White Defender (1)\",\r\n nameDefault: \"White Defender\",\r\n spoiler: \"Royal Waterways: Dung Defender, Desolate Dive\",\r\n wiki: \"White_Defender\"\r\n },\r\n GreyPrince: {\r\n name: \"Grey Prince Zote (1)\",\r\n nameDefault: \"Grey Prince Zote\",\r\n spoiler: \"Dirtmouth: Bretta's Room (per save choice)\",\r\n wiki: \"Grey_Prince_Zote\"\r\n },\r\n ZotelingBalloon: {\r\n name: \"Volatile Zoteling (1)\",\r\n nameDefault: \"Volatile Zoteling\",\r\n spoiler: \"Only from Grey Prince Zote, Battle 3+\",\r\n wiki: \"Volatile_Zoteling\"\r\n },\r\n ZotelingHopper: {\r\n name: \"Hopping Zoteling (1)\",\r\n nameDefault: \"Hopping Zoteling\",\r\n spoiler: \"Only from Grey Prince Zote, Battle 2+\",\r\n wiki: \"Hopping_Zoteling\"\r\n },\r\n ZotelingBuzzer: {\r\n name: \"Winged Zoteling (1)\",\r\n nameDefault: \"Winged Zoteling\",\r\n spoiler: \"Only from Grey Prince Zote, Battle 1+\",\r\n wiki: \"Winged_Zoteling\"\r\n },\r\n FlameBearerSmall: {\r\n name: \"Grimmkin Novice (3)\",\r\n nameDefault: \"Grimmkin Novice\",\r\n spoiler: \"Greenpath, Crystal Peak, City of Tears\",\r\n wiki: \"Grimmkin_Novice\"\r\n },\r\n FlameBearerMed: {\r\n name: \"Grimmkin Master (4)\",\r\n nameDefault: \"Grimmkin Master\",\r\n spoiler: \"King's Pass, Resting Grounds, Kingdom's Edge\",\r\n wiki: \"Grimmkin_Master\"\r\n },\r\n FlameBearerLarge: {\r\n name: \"Grimmkin Nightmare (5)\",\r\n nameDefault: \"Grimmkin Nightmare\",\r\n spoiler: \"Fungal Core, Royal Waterways, Hive\",\r\n wiki: \"Grimmkin_Nightmare\"\r\n },\r\n Grimm: {\r\n name: \"Troupe Master Grimm (1)\",\r\n nameDefault: \"Troupe Master Grimm\",\r\n spoiler: \"Dirtmouth: collect 6 flames\",\r\n wiki: \"Grimm\"\r\n },\r\n NightmareGrimm: {\r\n name: \"Nightmare King (1)\",\r\n nameDefault: \"Nightmare King\",\r\n spoiler: \"Dirtmouth: collect 9 flames\",\r\n wiki: \"Nightmare_King\"\r\n },\r\n BindingSeal: {\r\n name: \"Seal of Binding (1)\",\r\n nameDefault: \"Seal of Binding\",\r\n spoiler: \"White Palace: Path of Pain completion\",\r\n wiki: \"Seal_of_Binding\"\r\n },\r\n NailBros: {\r\n name: \"Nailmasters Oro & Mato (1)\",\r\n nameDefault: \"Nailmasters Oro & Mato\",\r\n spoiler: \"Godhome: Pantheon of the Master\",\r\n wiki: \"Brothers_Oro_%26_Mato\"\r\n },\r\n Paintmaster: {\r\n name: \"Paintmaster Sheo (1)\",\r\n nameDefault: \"Paintmaster Sheo\",\r\n spoiler: \"Godhome: Pantheon of the Artist\",\r\n wiki: \"Paintmaster_Sheo\"\r\n },\r\n Nailsage: {\r\n name: \"Great Nailsage Sly (1)\",\r\n nameDefault: \"Great Nailsage Sly\",\r\n spoiler: \"Godhome: Pantheon of the Sage\",\r\n wiki: \"Great_Nailsage_Sly\"\r\n },\r\n HollowKnightPrime: {\r\n name: \"Pure Vessel (1)\",\r\n nameDefault: \"Pure Vessel\",\r\n spoiler: \"Godhome: Pantheon of the Knight\",\r\n wiki: \"Pure_Vessel\"\r\n },\r\n GodseekerMask: {\r\n name: \"Weathered Mask (1)\",\r\n nameDefault: \"Weathered Mask\",\r\n spoiler: \"Land of Storms: All Pantheons & Bindings\",\r\n wiki: \"Weathered_Mask\"\r\n },\r\n VoidIdol_1: {\r\n name: \"Void Idol Attuned (1)\",\r\n nameDefault: \"Void Idol Attuned\",\r\n spoiler: \"Hall of Gods: Defeat All (Attuned)\",\r\n wiki: \"Void_Idol\"\r\n },\r\n VoidIdol_2: {\r\n name: \"Void Idol Ascended (1)\",\r\n nameDefault: \"Void Idol Ascended\",\r\n spoiler: \"Hall of Gods: Defeat All (Ascended)\",\r\n wiki: \"Void_Idol\"\r\n },\r\n VoidIdol_3: {\r\n name: \"Void Idol Radiant (1)\",\r\n nameDefault: \"Void Idol Radiant\",\r\n spoiler: \"Hall of Gods: Defeat All (Radiant)\",\r\n wiki: \"Void_Idol\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Charm Notches ############################################## */\r\n\r\n charmNotches: {\r\n h2: \"Charm Notches\",\r\n id: \"hk-charm-notches\",\r\n description: `Charm Notches are required to equip Charms. They can be found in the game world, bought from Salubra or won from certain challenges.`,\r\n percent: 0,\r\n maxPercent: 8,\r\n entries: {\r\n notchShroomOgres: {\r\n name: \"Charm Notch #1\",\r\n spoiler: \"Fungal Wastes: Shroom Ogres room\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n salubraNotch1: {\r\n name: \"Charm Notch #2\",\r\n spoiler: \"Salubra: 120 Geo + 5 Charms found\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n salubraNotch2: {\r\n name: \"Charm Notch #3\",\r\n spoiler: \"Salubra: 500 Geo + 10 Charms found\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n salubraNotch3: {\r\n name: \"Charm Notch #4\",\r\n spoiler: \"Salubra: 900 Geo + 18 Charms found\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n salubraNotch4: {\r\n name: \"Charm Notch #5\",\r\n spoiler: \"Salubra: 1400 Geo + 25 Charms found\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n colosseumBronzeCompleted: {\r\n name: \"Charm Notch #6\",\r\n spoiler: \"Colosseum of Fools: Trial of the Warrior\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n notchFogCanyon: {\r\n name: \"Charm Notch #7\",\r\n spoiler: \"Fog Canyon: explosive eggs room\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n gotGrimmNotch: {\r\n name: \"Charm Notch #8\",\r\n spoiler: \"Dirtmouth: Troupe Leader Grimm\",\r\n wiki: \"Category:Charms#Notches\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Grubs ############################################## */\r\n\r\n grubs: {\r\n h2: \"Grubs\",\r\n id: \"hk-grubs\",\r\n description: `Creatures found trapped in glass jars throughout Hallownest. They can be freed from their jar after which the Grubfather grants a reward for each Grub that is saved.
\r\n Note: Due to a bug in recent versions of Hollow Knight, Grubs #33 and #34 (The Collector/Tower of Love) are not marked as released correctly in the save file. As a workaround for this bug, when Grub #32 is detected as released, #33 and #34 are automatically marked as released too in this app.`,\r\n percent: 0,\r\n maxPercent: 46,\r\n entries: {\r\n grub1: {\r\n name: \"Grub #1\",\r\n spoiler: \"Forgotten Crossroads: Acid Corridor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Crossroads_35\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub2: {\r\n name: \"Grub #2\",\r\n spoiler: \"Forgotten Crossroads: Left of Dark Corridor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Crossroads_03\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub3: {\r\n name: \"Grub #3\",\r\n spoiler: \"Forgotten Crossroads: Above Ancestral Mound\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Crossroads_05\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub4: {\r\n name: \"Grub #4\",\r\n spoiler: \"Forgotten Crossroads: Husk Guard Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Crossroads_48\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub5: {\r\n name: \"Grub #5\",\r\n spoiler: \"Forgotten Crossroads: Spikes Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Crossroads_31\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub6: {\r\n name: \"Grub #6\",\r\n spoiler: \"Greenpath: Cornifer Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus1_06\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub7: {\r\n name: \"Grub #7\",\r\n spoiler: \"Greenpath: Outside Hunter\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus1_07\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub8: {\r\n name: \"Grub #8\",\r\n spoiler: \"Greenpath: Outside Hornet\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus1_21\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub9: {\r\n name: \"Grub #9\",\r\n spoiler: \"Howling Cliffs: Baldur's Shell Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus1_28\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub10: {\r\n name: \"Grub #10\",\r\n spoiler: \"Fungal Wastes: Cornifer Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus2_18\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub11: {\r\n name: \"Grub #11\",\r\n spoiler: \"City of Tears: Above Lemm\",\r\n id: \"Grub Bottle (1)\",\r\n sceneName: \"Ruins1_05\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub12: {\r\n name: \"Grub #12\",\r\n spoiler: \"Crystal Peak: Left of Dark Corridor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Mines_04\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub13: {\r\n name: \"Grub #13\",\r\n spoiler: \"Crystal Peak: Spiked Conveyor Belts\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Mines_03\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub14: {\r\n name: \"Grub #14\",\r\n spoiler: \"Crystal Peak: Crystal Heart Gauntlet\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Mines_31\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub15: {\r\n name: \"Grub #15\",\r\n spoiler: \"Crystal Peak: Crushers Below Top Bench\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Mines_19\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub16: {\r\n name: \"Grub #16\",\r\n spoiler: \"City of Tears: Soul Master Rewards Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Ruins1_32\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub17: {\r\n name: \"Grub #17\",\r\n spoiler: \"Resting Grounds: Crypts\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"RestingGrounds_10\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub18: {\r\n name: \"Grub #18\",\r\n spoiler: \"City of Tears: Guarded House Room in Main Hub\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Ruins_House_01\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub19: {\r\n name: \"Grub #19\",\r\n spoiler: \"Crystal Peak: Crystallized Mound\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Mines_35\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub20: {\r\n name: \"Grub #20\",\r\n spoiler: \"Crystal Peak: Down from Dirtmouth entrance\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Mines_16\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub21: {\r\n name: \"Grub #21\",\r\n spoiler: \"Royal Waterways: Top Left Corridor Above Bench\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Waterways_04\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub22: {\r\n name: \"Grub #22\",\r\n spoiler: \"Royal Waterways: Isma's Grove\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Waterways_13\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub23: {\r\n name: \"Grub #23\",\r\n spoiler: \"Ancient Basin: Broken Vessel Top Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Abyss_19\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub24: {\r\n name: \"Grub #24\",\r\n spoiler: \"Ancient Basin: Cloth/Pale Ore Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Abyss_17\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub25: {\r\n name: \"Grub #25\",\r\n spoiler: \"Crystal Peak: Hallownest Crown Corridor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Mines_24\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub26: {\r\n name: \"Grub #26\",\r\n spoiler: \"Greenpath: Whispering Root Corridor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus1_13\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub27: {\r\n name: \"Grub #27\",\r\n spoiler: \"Fog Canyon: Teacher's Archives Entrance\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus3_47\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub28: {\r\n name: \"Grub #28\",\r\n spoiler: \"Queen's Gardens: Main Arena Above Left Bench\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus3_10\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub29: {\r\n name: \"Grub #29\",\r\n spoiler: \"Queen's Gardens: Near White Lady\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus3_48\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub30: {\r\n name: \"Grub #30\",\r\n spoiler: \"Queen's Gardens: Upper Room near Greenpath\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus3_22\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub31: {\r\n name: \"Grub #31\",\r\n spoiler: \"City of Tears: Below King's Station\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Ruins2_07\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub32: {\r\n name: \"Grub #32\",\r\n spoiler: \"City of Tears: The Collector Arena\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Ruins2_11\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub33: {\r\n name: \"Grub #33\",\r\n spoiler: \"City of Tears: The Collector Arena\",\r\n id: \"Grub Bottle (1)\",\r\n sceneName: \"Ruins2_11\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub34: {\r\n name: \"Grub #34\",\r\n spoiler: \"City of Tears: The Collector Arena\",\r\n id: \"Grub Bottle (2)\",\r\n sceneName: \"Ruins2_11\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub35: {\r\n name: \"Grub #35\",\r\n spoiler: \"Kingdom's Edge: Below Camp Bench\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Deepnest_East_11\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub36: {\r\n name: \"Grub #36\",\r\n spoiler: \"Kingdom's Edge: Below Nailmaster Oro\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Deepnest_East_14\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub37: {\r\n name: \"Grub #37\",\r\n spoiler: \"Fungal Wastes: Spore Shroom Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Fungus2_20\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub38: {\r\n name: \"Grub #38\",\r\n spoiler: \"City of Tears: Watcher's Spire Fourth Floor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Ruins2_03\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub39: {\r\n name: \"Grub #39\",\r\n spoiler: \"Deepnest: Right of Fungal Wastes Drop\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Deepnest_36\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub40: {\r\n name: \"Grub #40\",\r\n spoiler: \"Deepnest: Left of Hot Spring\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Deepnest_03\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub41: {\r\n name: \"Grub #41\",\r\n spoiler: \"Deepnest: Nosk Corridor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Deepnest_31\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub42: {\r\n name: \"Grub #42\",\r\n spoiler: \"Deepnest: Whispering Root Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Deepnest_39\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub43: {\r\n name: \"Grub #43\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub44: {\r\n name: \"Grub #44\",\r\n spoiler: \"Royal Waterways: Kingdom's Edge Acid Corridor\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Waterways_14\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub45: {\r\n name: \"Grub #45\",\r\n spoiler: \"The Hive: Kingdom's Edge Secret\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Hive_03\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n grub46: {\r\n name: \"Grub #46\",\r\n spoiler: \"The Hive: Mask Shard Room\",\r\n id: \"Grub Bottle\",\r\n sceneName: \"Hive_04\",\r\n wiki: \"Grub#Rewards_and_locations\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Whispering Roots ############################################## */\r\n\r\n whisperingRoots: {\r\n h2: \"Whispering Roots\",\r\n id: \"hk-whispering-roots\",\r\n description: `There are 15 Whispering Roots in the game, containing a total of 482 Essence. Whispering Root Pin from Iselda reveals the locations of every Whispering Root in an area after that area's Map has been purchased.`,\r\n percent: 0,\r\n maxPercent: 15,\r\n entries: {\r\n whisperingRoot1: {\r\n name: \"Whispering Root #1: 29 Orbs\",\r\n spoiler: \"Forgotten Crossroads: Right of Grubfather\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Crossroads_07\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot2: {\r\n name: \"Whispering Root #2: 42 Orbs\",\r\n spoiler: \"Forgotten Crossroads: Ancestral Mound\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Crossroads_ShamanTemple\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot3: {\r\n name: \"Whispering Root #3: 18 Orbs\",\r\n spoiler: \"Fungal Wastes: Above Mantis Village\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Fungus2_17\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot4: {\r\n name: \"Whispering Root #4: 28 Orbs\",\r\n spoiler: \"City of Tears: Below Stag Station\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Ruins1_17\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot5: {\r\n name: \"Whispering Root #5: 46 Orbs\",\r\n spoiler: \"Howling Cliffs: Big Main Area\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Cliffs_01\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot6: {\r\n name: \"Whispering Root #6: 21 Orbs\",\r\n spoiler: \"Crystal Peak: Hallownest Crown Big Area\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Mines_23\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot7: {\r\n name: \"Whispering Root #7: 20 Orbs\",\r\n spoiler: \"Resting Grounds: Right of Seer, Main Area\",\r\n id: \"Dream Plant\",\r\n sceneName: \"RestingGrounds_05\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot8: {\r\n name: \"Whispering Root #8: 34 Orbs\",\r\n spoiler: \"Resting Grounds: Spirit's Glade\",\r\n id: \"Dream Plant\",\r\n sceneName: \"RestingGrounds_08\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot9: {\r\n name: \"Whispering Root #9: 35 Orbs\",\r\n spoiler: \"City of Tears: Broken Elevator\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Abyss_01\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot10: {\r\n name: \"Whispering Root #10: 44 Orbs\",\r\n spoiler: \"Greenpath: Right of Queen's Gardens\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Fungus1_13\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot11: {\r\n name: \"Whispering Root #11: 20 Orbs\",\r\n spoiler: \"Fungal Wastes: Left of Leg Eater\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Fungus2_33\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot12: {\r\n name: \"Whispering Root #12: 29 Orbs\",\r\n spoiler: \"Queen's Gardens: Below Right Bench\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Fungus3_11\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot13: {\r\n name: \"Whispering Root #13: 51 Orbs\",\r\n spoiler: \"Kingdom's Edge: Right of Tower of Love\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Deepnest_East_07\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot14: {\r\n name: \"Whispering Root #14: 45 Orbs\",\r\n spoiler: \"Deepnest: Below Queen's Gardens\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Deepnest_39\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n whisperingRoot15: {\r\n name: \"Whispering Root #15: 20 Orbs\",\r\n spoiler: \"The Hive: Right of Bench\",\r\n id: \"Dream Plant\",\r\n sceneName: \"Hive_02\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Relics - Wanderer's Journal ############################################## */\r\n\r\n relicsWanderersJournal: {\r\n h2: \"Relics - Wanderer's Journal\",\r\n id: \"hk-relics-journal\",\r\n description: `Tablets found commonly throughout Hallownest. They are always found next to corpses that are assumed to be the authors of the journal. Can be sold to Relic Seeker Lemm for 200 Geo.
\r\n 14 x 200 = 2800 Geo Total.`,\r\n percent: 0,\r\n maxPercent: 14,\r\n entries: {\r\n wanderersJournal1: {\r\n name: \"Wanderer's Journal #1\",\r\n spoiler: \"Greenpath: Room Above Fog Canyon\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus1_11\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal2: {\r\n name: \"Wanderer's Journal #2\",\r\n spoiler: \"Greenpath: Right of Stag Station\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus1_22\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal3: {\r\n name: \"Wanderer's Journal #3\",\r\n spoiler: \"Fungal Wastes: Below Shrumal Ogres\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus2_04\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal4: {\r\n name: \"Wanderer's Journal #4\",\r\n spoiler: \"Fungal Wastes: Room Above Mantis Village\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus2_17\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal5: {\r\n name: \"Wanderer's Journal #5\",\r\n spoiler: \"City of Tears: City Storerooms\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins1_28\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal6: {\r\n name: \"Wanderer's Journal #6\",\r\n spoiler: \"Howling Cliffs: Main Open Air Area\",\r\n id: \"Shiny Item (1)\",\r\n sceneName: \"Cliffs_01\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal7: {\r\n name: \"Wanderer's Journal #7\",\r\n spoiler: \"Crystal Peak: Right Tall Room\",\r\n id: \"Shiny Item (1)\",\r\n sceneName: \"Mines_20\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal8: {\r\n name: \"Wanderer's Journal #8\",\r\n spoiler: \"Resting Grounds: Crypts\",\r\n id: \"Shiny Item\",\r\n sceneName: \"RestingGrounds_10\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal9: {\r\n name: \"Wanderer's Journal #9\",\r\n spoiler: \"City of Tears: Room Above King's Station\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins2_05\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal10: {\r\n name: \"Wanderer's Journal #10\",\r\n spoiler: \"Ancient Basin: Broken Bridge\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Abyss_02\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal11: {\r\n name: \"Wanderer's Journal #11\",\r\n spoiler: \"City of Tears: Pleasure House Elevator\",\r\n id: \"Shiny Item (1)\",\r\n sceneName: \"Ruins_Elevator\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal12: {\r\n name: \"Wanderer's Journal #12\",\r\n spoiler: \"Kingdom's Edge: Whispering Root Area\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_East_07\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal13: {\r\n name: \"Wanderer's Journal #13\",\r\n spoiler: \"Kingdom's Edge: Camp Bench\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_East_13\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n wanderersJournal14: {\r\n name: \"Wanderer's Journal #14\",\r\n spoiler: \"Kingdom's Edge: Left of Markoth\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_East_18\",\r\n wiki: \"Wanderer%27s_Journal\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Relics - Hallownest Seal ############################################## */\r\n\r\n relicsHallownestSeal: {\r\n h2: \"Relics - Hallownest Seal\",\r\n id: \"hk-relics-seal\",\r\n description: `Official symbols of the Pale King and the Five Great Knights. The seals can be found in various locations throughout the world. Can be sold to Relic Seeker Lemm for 450 Geo. Seal #16 is missable when a player enters the Beast's Den through the secret path without being trapped by using the bench.
\r\n 17 x 450 = 7650 Geo Total.`,\r\n percent: 0,\r\n maxPercent: 17,\r\n entries: {\r\n hallownestSeal1: {\r\n name: \"Hallownest Seal #1\",\r\n spoiler: \"Forgotten Crossroads: Room Inside Well\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Crossroads_01\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal2: {\r\n name: \"Hallownest Seal #2\",\r\n spoiler: \"Greenpath: Stone Sanctuary Entrance\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus2_34\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal3: {\r\n name: \"Hallownest Seal #3\",\r\n spoiler: \"Greenpath: Acid Bridge\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus1_10\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal4: {\r\n name: \"Hallownest Seal #4\",\r\n spoiler: \"Fungal Wastes: Right of Queen's Station\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus2_03\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal5: {\r\n name: \"Hallownest Seal #5\",\r\n spoiler: \"City of Tears: Open Air Rafters\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins1_03\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal6: {\r\n name: \"Hallownest Seal #6\",\r\n spoiler: \"City of Tears: Soul Master Rewards Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins1_32\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal7: {\r\n name: \"Hallownest Seal #7\",\r\n spoiler: \"Resting Grounds: Crypts\",\r\n id: \"Shiny Item (1)\",\r\n sceneName: \"RestingGrounds_10\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal8: {\r\n name: \"Hallownest Seal #8\",\r\n spoiler: \"City of Tears: King's Station Stag Station\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins2_08\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal9: {\r\n name: \"Hallownest Seal #9\",\r\n spoiler: \"Grubfather: 23 Grubs rescued\",\r\n id: \"Shiny Item Relic2\",\r\n sceneName: \"Crossroads_38\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal10: {\r\n name: \"Hallownest Seal #10\",\r\n spoiler: \"Fog Canyon: Right Tall Area\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus3_26\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal11: {\r\n name: \"Hallownest Seal #11\",\r\n spoiler: \"Fog Canyon: Lifeblood Cocoon Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus3_30\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal12: {\r\n name: \"Hallownest Seal #12\",\r\n spoiler: \"Queen's Gardens: Outside White Lady\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus3_48\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal13: {\r\n name: \"Hallownest Seal #13\",\r\n spoiler: \"Fungal Wastes: Mantis Lords Reward Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus2_31\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal14: {\r\n name: \"Hallownest Seal #14\",\r\n spoiler: \"City of Tears: Watcher's Spire Fourth Floor\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins2_03\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal15: {\r\n name: \"Hallownest Seal #15\",\r\n spoiler: \"Deepnest: Room Above Lower Cornifer\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_16\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal16: {\r\n name: \"Hallownest Seal #16 (missable)\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n hallownestSeal17: {\r\n name: \"Hallownest Seal #17\",\r\n spoiler: \"Seer: 100 Essence collected\",\r\n id: \"dreamReward1\",\r\n sceneName: \"\",\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Relics - King's Idol ############################################## */\r\n\r\n relicsKingsIdol: {\r\n h2: \"Relics - King's Idol\",\r\n id: \"hk-relics-idol\",\r\n description: `Idols made of a mysterious white metal that depict the Pale King. They are found in various locations throughout Hallownest. Can be sold to Relic Seeker Lemm for 800 Geo.
\r\n 8 x 800 = 6400 Geo Total.`,\r\n percent: 0,\r\n maxPercent: 8,\r\n entries: {\r\n kingsIdol1: {\r\n name: \"King's Idol #1\",\r\n spoiler: \"Howling Cliffs: Main Open Air Area\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Cliffs_01\",\r\n wiki: \"King%27s_Idol\"\r\n }, \r\n kingsIdol2: {\r\n name: \"King's Idol #2\",\r\n spoiler: \"Crystal Peak: Cornifer Room, use Monarch Wings\",\r\n id: \"Shiny Item Stand\",\r\n sceneName: \"Mines_30\",\r\n wiki: \"King%27s_Idol\"\r\n }, \r\n kingsIdol3: {\r\n name: \"King's Idol #3\",\r\n spoiler: \"Resting Grounds: Spirit's Glade, Waterfall\",\r\n id: \"Shiny Item\",\r\n sceneName: \"RestingGrounds_08\",\r\n wiki: \"King%27s_Idol\"\r\n }, \r\n kingsIdol4: {\r\n name: \"King's Idol #4\",\r\n spoiler: \"Royal Waterways: Dung Defender's Cave\",\r\n id: \"Shiny Item Stand\",\r\n sceneName: \"Waterways_15\",\r\n wiki: \"King%27s_Idol\"\r\n },\r\n kingsIdol5: {\r\n name: \"King's Idol #5\",\r\n spoiler: \"Kingdom's Edge: Great Hopper Below Colosseum Entrance\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_East_08\",\r\n wiki: \"King%27s_Idol\"\r\n },\r\n kingsIdol6: {\r\n name: \"King's Idol #6\",\r\n spoiler: \"Deepnest: Zote Arena Left Side\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_33\",\r\n wiki: \"King%27s_Idol\"\r\n },\r\n kingsIdol7: {\r\n name: \"King's Idol #7\",\r\n spoiler: \"Grubfather: 38 Grubs rescued\",\r\n id: \"Shiny Item Relic3\",\r\n sceneName: \"Crossroads_38\",\r\n wiki: \"King%27s_Idol\"\r\n },\r\n kingsIdol8: {\r\n name: \"King's Idol #8\",\r\n spoiler: \"Kingdom's Edge: Pale Lurker Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"GG_Lurker\",\r\n wiki: \"King%27s_Idol\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Relics - Arcane Egg ############################################## */\r\n\r\n relicsArcaneEgg: {\r\n h2: \"Relics - Arcane Egg\",\r\n id: \"hk-relics-egg\",\r\n description: `Jet black stone eggs originating from a civilisation that existed before the Kingdom of Hallownest was founded. Egg #4 is missable when the player will go right instead of left in the Lifeblood Core room in the Abyss and will touch the Charm. Can be sold to Relic Seeker Lemm for 1200 Geo.
\r\n 4 x 1200 = 4800 Geo Total.`,\r\n percent: 0,\r\n maxPercent: 4,\r\n entries: {\r\n arcaneEgg1: {\r\n name: \"Arcane Egg #1\",\r\n spoiler: \"The Abyss: Shade Cloak Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Abyss_10\",\r\n wiki: \"Arcane_Egg\"\r\n },\r\n arcaneEgg2: {\r\n name: \"Arcane Egg #2\",\r\n spoiler: \"Seer: 1200 Essence\",\r\n id: \"dreamReward6\",\r\n sceneName: \"\",\r\n wiki: \"Arcane_Egg\"\r\n },\r\n arcaneEgg3: {\r\n name: \"Arcane Egg #3\",\r\n spoiler: \"The Abyss: Birthplace, requires Kingsoul\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Abyss_15\",\r\n wiki: \"Arcane_Egg\"\r\n },\r\n arcaneEgg4: {\r\n name: \"Arcane Egg #4 (missable)\",\r\n spoiler: \"The Abyss: Lifeblood Core Room\",\r\n id: \"Shiny Item (1)\",\r\n sceneName: \"Abyss_08\",\r\n wiki: \"Abyss#Lifeblood_Chamber\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Rancid Eggs ############################################## */\r\n\r\n rancidEggs: {\r\n h2: \"Rancid Eggs\",\r\n id: \"hk-rancid-eggs\",\r\n description: `A collectable item recovered from the corpses of Bluggsacs. Either an already-dead Bluggsac has to be found or a living one has to be killed to make it drop a Rancid Egg. A certain NPC in the game may be very interested in these... Egg #16 is missable when a player enters the Beast's Den through the secret path without being trapped by using the bench.`,\r\n percent: 0,\r\n maxPercent: 21,\r\n entries: {\r\n rancidEgg1: {\r\n name: \"Rancid Egg #1\",\r\n spoiler: \"Fungal Wastes: Fungal Core Upper Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus2_29\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg2: {\r\n name: \"Rancid Egg #2\",\r\n spoiler: \"City of Tears: Room Above Lemm\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins1_05\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg3: {\r\n name: \"Rancid Egg #3\",\r\n spoiler: \"Crystal Peak: Dark Bench Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Mines_29\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg4: {\r\n name: \"Rancid Egg #4\",\r\n spoiler: \"Resting Grounds: Blue Lake\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Crossroads_50\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg5: {\r\n name: \"Rancid Egg #5\",\r\n spoiler: \"Crystal Peak: Desolate Dive Entrance\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Mines_01\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg6: {\r\n name: \"Rancid Egg #6\",\r\n spoiler: \"Royal Waterways: Mask Shard Room\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Waterways_04b\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg7: {\r\n name: \"Rancid Egg #7\",\r\n spoiler: \"Royal Waterways: Hidden Grub Room\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Waterways_04\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg8: {\r\n name: \"Rancid Egg #8\",\r\n spoiler: \"Royal Waterways: Left of Isma's Grove\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Waterways_07\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg9: {\r\n name: \"Rancid Egg #9\",\r\n spoiler: \"Greenpath: Outside Sheo's Hut\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Fungus1_15\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg10: {\r\n name: \"Rancid Egg #10\",\r\n spoiler: \"Grubfather: 16 Grubs rescued\",\r\n id: \"Shiny Item Rancid Egg\",\r\n sceneName: \"Crossroads_38\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg11: {\r\n name: \"Rancid Egg #11\",\r\n spoiler: \"Queen's Gardens: Entrance from Fog Canyon\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Fungus3_34\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg12: {\r\n name: \"Rancid Egg #12\",\r\n spoiler: \"City of Tears: Pleasure House Elevator\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Ruins_Elevator\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg13: {\r\n name: \"Rancid Egg #13\",\r\n spoiler: \"Kingdom's Edge: Whispering Root Area\",\r\n id: \"Shiny Item (1)\",\r\n sceneName: \"Deepnest_East_07\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg14: {\r\n name: \"Rancid Egg #14\",\r\n spoiler: \"Deepnest: Weaver's Den\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Deepnest_45_v02\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg15: {\r\n name: \"Rancid Egg #15\",\r\n spoiler: \"Deepnest: Whispering Root Big Area Left Side\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Deepnest_39\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg16: {\r\n name: \"Rancid Egg #16 (missable)\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg17: {\r\n name: \"Rancid Egg #17\",\r\n spoiler: \"Crystal Peak: Right Tall Room\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Mines_20\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg18: {\r\n name: \"Rancid Egg #18\",\r\n spoiler: \"Royal Waterways: Main Bench Area\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Waterways_02\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg19: {\r\n name: \"Rancid Egg #19\",\r\n spoiler: \"Kingdom's Edge: Below Nailmaster Oro\",\r\n id: \"Shiny Item(Clone)\",\r\n sceneName: \"Deepnest_East_14\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg20: {\r\n name: \"Rancid Egg #20\",\r\n spoiler: \"Sly: 60 Geo\",\r\n id: \"slyRancidEgg\",\r\n sceneName: \"\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n rancidEgg21: {\r\n name: \"Rancid Egg #21\",\r\n spoiler: \"Royal Waterways: Tuk's free Egg\",\r\n spoilerNormal: \"Royal Waterways: Tuk, with Defender's Crest\",\r\n spoilerSteelSoul: \"Royal Waterways: Inspect Tuk\",\r\n idPlayerData: \"tukDungEgg\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Waterways_03\",\r\n wiki: \"Tuk\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Collectibles -> Items ############################################## */\r\n\r\n items: {\r\n h2: \"Items\",\r\n id: \"hk-items\",\r\n description: `Certain acquirable items, map markers or collectibles in the game that won't fit any specific category. Using custom map pins to mark interesting locations on the map is very useful while playing Hollow Knight. 1440 Geo is needed to buy all map pins from Iselda.`,\r\n percent: 0,\r\n maxPercent: 21,\r\n entries: {\r\n hasQuill: {\r\n name: \"Quill\",\r\n spoiler: \"120 Geo: Iselda's Shop, updates map with explored areas\",\r\n wiki: \"Map_and_Quill#Mapping_Tools\"\r\n },\r\n hasPinBench: {\r\n name: \"Map Pin: Bench\",\r\n spoiler: \"100 Geo: Iselda's Shop\",\r\n wiki: \"Bench_(Hollow_Knight)\"\r\n },\r\n hasPinShop: {\r\n name: \"Map Pin: Vendor\",\r\n spoiler: \"100 Geo: Iselda's Shop\",\r\n wiki: \"Category:NPCs_(Hollow_Knight)#Merchants\"\r\n },\r\n hasPinCocoon: {\r\n name: \"Map Pin: Lifeblood Cocoon\",\r\n spoiler: \"100 Geo: Iselda's Shop\",\r\n wiki: \"Lifeblood_Cocoon\"\r\n },\r\n hasPinSpa: {\r\n name: \"Map Pin: Hot Springs\",\r\n spoiler: \"100 Geo: Iselda's Shop\",\r\n wiki: \"Hot_Springs\"\r\n },\r\n hasPinStag: {\r\n name: \"Map Pin: Stag Station\",\r\n spoiler: \"100 Geo: Iselda's Shop, unlock first Station\",\r\n wiki: \"Stag_Station\"\r\n },\r\n hasPinGhost: {\r\n name: \"Map Pin: Warrior's Grave\",\r\n spoiler: \"180 Geo: Iselda's Shop, acquire Dream Nail\",\r\n wiki: \"Warrior_Dreams\"\r\n },\r\n hasPinDreamPlant: {\r\n name: \"Map Pin: Whispering Root\",\r\n spoiler: \"150 Geo: Iselda's Shop, acquire Dream Nail\",\r\n wiki: \"Whispering_Root\"\r\n },\r\n hasPinTram: {\r\n name: \"Map Pin: Tram\",\r\n spoiler: \"100 Geo: Iselda's Shop, acquire Tram Pass\",\r\n wiki: \"Tram\"\r\n },\r\n hasMarker_r: {\r\n name: \"Map Pin: Shell Marker\",\r\n spoiler: \"100 Geo: Iselda's Shop\",\r\n wiki: \"Iselda#Map_Pins\"\r\n },\r\n hasMarker_b: {\r\n name: \"Map Pin: Scarab Marker\",\r\n spoiler: \"100 Geo: Iselda's Shop\",\r\n wiki: \"Iselda#Map_Pins\"\r\n },\r\n hasMarker_y: {\r\n name: \"Map Pin: Token Marker\",\r\n spoiler: \"100 Geo: Iselda's Shop, acquire Mothwing Cloak\",\r\n wiki: \"Iselda#Map_Pins\"\r\n },\r\n hasMarker_w: {\r\n name: \"Map Pin: Gleaming Marker\",\r\n spoiler: \"210 Geo: Iselda, acquire Mothwing Cloak\",\r\n wiki: \"Iselda#Map_Pins\"\r\n },\r\n hasPinGuardian: {\r\n name: \"Map Pin: Dreamers\",\r\n spoiler: \"Resting Grounds: Inspect the shrine\",\r\n wiki: \"Dreamers\"\r\n },\r\n hasPinBlackEgg: {\r\n name: \"Map Pin: Temple of the Black Egg\",\r\n spoiler: \"City of Tears: Inspect fountain\",\r\n wiki: \"Temple_of_the_Black_Egg\"\r\n },\r\n hasPinGrub: {\r\n name: \"Collector's Map\",\r\n spoiler: \"Kingdom's Edge: Tower of Love, Love Key\",\r\n wiki: \"Map_and_Quill#The_Collector's_Map\"\r\n },\r\n cityCrest: {\r\n name: \"City Crest\",\r\n spoiler: \"Forgotten Crossroads: False Knight Reward\",\r\n id: \"Shiny Item\",\r\n sceneName: \"Crossroads_10\",\r\n wiki: \"City_Crest\"\r\n },\r\n hasDreamGate: {\r\n name: \"Dreamgate\",\r\n spoiler: \"Seer: 900 Essence\",\r\n wiki: \"Dreamgate\"\r\n },\r\n fragileGreed_unbreakable: {\r\n name: \"Unbreakable Greed\",\r\n spoiler: \"Divine: Fragile Greed + 9000 Geo\",\r\n wiki: \"Divine#Unbreakable_Charms\"\r\n },\r\n fragileHealth_unbreakable: {\r\n name: \"Unbreakable Heart\",\r\n spoiler: \"Divine: Fragile Heart + 12000 Geo\",\r\n wiki: \"Divine#Unbreakable_Charms\"\r\n },\r\n fragileStrength_unbreakable: {\r\n name: \"Unbreakable Strength\",\r\n spoiler: \"Divine: Fragile Strength + 15000 Geo\",\r\n wiki: \"Divine#Unbreakable_Charms\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Geo Caches -> Geo Chests ############################################## */\r\n\r\n geoChests: {\r\n h2: \"Geo Chests\",\r\n id: \"hk-geo-chests\",\r\n description: `All Geo Chests in the game, including one empty one and one with 1 Geo. A total of 2380 Geo can be collected from Geo Chests. Equipping the Fragile Greed Charm won't increase the amount of Geo found inside Geo Chests.`,\r\n percent: 0,\r\n maxPercent: 14,\r\n entries: {\r\n chest1: {\r\n name: \"Chest #1: 200 Geo\",\r\n spoiler: \"Forgotten Crossroads: False Knight Reward\",\r\n id: \"Chest\",\r\n sceneName: \"Crossroads_10\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest2: {\r\n name: \"Chest #2: 1 Geo\",\r\n spoiler: \"Howling Cliffs: Baldur's Shell Room\",\r\n id: \"Chest\",\r\n sceneName: \"Fungus1_28\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest3: {\r\n name: \"Chest #3: 78 Geo\",\r\n spoiler: \"Crystal Peak: Crushers Room\",\r\n id: \"Chest\",\r\n sceneName: \"Mines_37\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest4: {\r\n name: \"Chest #4: 380 Geo\",\r\n spoiler: \"City of Tears: Soul Master Reward\",\r\n id: \"Chest\",\r\n sceneName: \"Ruins1_32\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest5: {\r\n name: \"Chest #5: 150 Geo\",\r\n spoiler: \"Resting Grounds: Crypts\",\r\n id: \"Chest\",\r\n sceneName: \"RestingGrounds_10\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest6: {\r\n name: \"Chest #6: 85 Geo\",\r\n spoiler: \"Greenpath: Whispering Root Room\",\r\n id: \"Chest\",\r\n sceneName: \"Fungus1_13\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest7: {\r\n name: \"Chest #7: 620 Geo\",\r\n spoiler: \"Fungal Wastes: Mantis Lords Reward\",\r\n id: \"Mantis Chest (2)\",\r\n sceneName: \"Fungus2_31\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest8: {\r\n name: \"Chest #8: 655 Geo\",\r\n spoiler: \"City of Tears: Watcher Knight Reward\",\r\n id: \"Chest\",\r\n sceneName: \"Ruins2_03\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest9: {\r\n name: \"Chest #9: 160 Geo\",\r\n spoiler: \"Deepnest: Weaver's Den, Secret Room\",\r\n id: \"Chest\",\r\n sceneName: \"Deepnest_45_v02\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest10: {\r\n name: \"Chest #10: 8 Geo\",\r\n spoiler: \"Royal Waterways: Junk Pit\",\r\n id: \"Chest\",\r\n sceneName: \"GG_Waterways\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest11: {\r\n name: \"Chest #11: 8 Geo\",\r\n spoiler: \"Royal Waterways: Junk Pit\",\r\n id: \"Chest (1)\",\r\n sceneName: \"GG_Waterways\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest12: {\r\n name: \"Chest #12: 25 Geo\",\r\n spoiler: \"Royal Waterways: Junk Pit\",\r\n id: \"Chest (2)\",\r\n sceneName: \"GG_Waterways\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest13: {\r\n name: \"Chest #13: 0 Geo\",\r\n spoiler: \"Royal Waterways: Junk Pit\",\r\n id: \"Chest (3)\",\r\n sceneName: \"GG_Waterways\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n chest14: {\r\n name: \"Chest #14: 10 Geo\",\r\n spoiler: \"Royal Waterways: Junk Pit\",\r\n id: \"Chest (4)\",\r\n sceneName: \"GG_Waterways\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Geo Caches -> Geo Rocks ############################################## */\r\n\r\n geoRocks: {\r\n h2: \"Geo Rocks\",\r\n id: \"hk-geo-rocks\",\r\n description: `All Geo Rocks that can be found in the game. Only fully destroyed Geo Rocks are counted. Partially hit Geo Rocks won't be counted. Equipping the Fragile Greed Charm won't increase the amount of Geo found inside Geo Rocks. I have no idea how much Geo can be collected from all Geo Rocks. If you know, let me know, and you will be featured here.`,\r\n percent: 0,\r\n maxPercent: 205,\r\n entries: {\r\n geoRock1: {\r\n name: \"Geo Rock #1\",\r\n spoiler: \"King's Pass\",\r\n id: \"Geo Rock 4\",\r\n sceneName: \"Tutorial_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock2: {\r\n name: \"Geo Rock #2\",\r\n spoiler: \"King's Pass\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Tutorial_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock3: {\r\n name: \"Geo Rock #3\",\r\n spoiler: \"King's Pass\",\r\n id: \"Geo Rock 3\",\r\n sceneName: \"Tutorial_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock4: {\r\n name: \"Geo Rock #4\",\r\n spoiler: \"King's Pass\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Tutorial_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock5: {\r\n name: \"Geo Rock #5\",\r\n spoiler: \"King's Pass\",\r\n id: \"Geo Rock 5\",\r\n sceneName: \"Tutorial_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock6: {\r\n name: \"Geo Rock #6\",\r\n spoiler: \"Forgotten Crossroads: Well\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock7: {\r\n name: \"Geo Rock #7\",\r\n spoiler: \"Forgotten Crossroads: Gruzzer Vertical Room\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_07\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock8: {\r\n name: \"Geo Rock #8\",\r\n spoiler: \"Forgotten Crossroads: Gruzzer Vertical Room\",\r\n id: \"Geo Rock 1 (2)\",\r\n sceneName: \"Crossroads_07\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock9: {\r\n name: \"Geo Rock #9\",\r\n spoiler: \"Forgotten Crossroads: Gruzzer Vertical Room\",\r\n id: \"Geo Rock 1 (1)\",\r\n sceneName: \"Crossroads_07\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock10: {\r\n name: \"Geo Rock #10\",\r\n spoiler: \"Forgotten Crossroads: Corridor to Acid Grub\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_12\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock11: {\r\n name: \"Geo Rock #11\",\r\n spoiler: \"Forgotten Crossroads: Aspid Arena\",\r\n id: \"Geo Rock 1 (3)\",\r\n sceneName: \"Crossroads_08\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock12: {\r\n name: \"Geo Rock #12\",\r\n spoiler: \"Forgotten Crossroads: Aspid Arena\",\r\n id: \"Geo Rock 1 (2)\",\r\n sceneName: \"Crossroads_08\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock13: {\r\n name: \"Geo Rock #13\",\r\n spoiler: \"Forgotten Crossroads: Aspid Arena\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_08\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock14: {\r\n name: \"Geo Rock #14\",\r\n spoiler: \"Forgotten Crossroads: Aspid Arena\",\r\n id: \"Geo Rock 1 (1)\",\r\n sceneName: \"Crossroads_08\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock15: {\r\n name: \"Geo Rock #15\",\r\n spoiler: \"Forgotten Crossroads: Fungal Wastes Entrance\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock16: {\r\n name: \"Geo Rock #16\",\r\n spoiler: \"Forgotten Crossroads: Fungal Wastes Entrance\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock17: {\r\n name: \"Geo Rock #17\",\r\n spoiler: \"Forgotten Crossroads: Fungal Wastes Entrance\",\r\n id: \"Geo Rock 3\",\r\n sceneName: \"Crossroads_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock18: {\r\n name: \"Geo Rock #18\",\r\n spoiler: \"Forgotten Crossroads: Goam Mask Shard\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_13\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock19: {\r\n name: \"Geo Rock #19\",\r\n spoiler: \"Forgotten Crossroads: Goam Mask Shard\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_13\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock20: {\r\n name: \"Geo Rock #20\",\r\n spoiler: \"Forgotten Crossroads: Right of Mask Shard\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_42\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock21: {\r\n name: \"Geo Rock #21\",\r\n spoiler: \"Forgotten Crossroads: Right of Mask Shard\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_42\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock22: {\r\n name: \"Geo Rock #22\",\r\n spoiler: \"Forgotten Crossroads: Before Gruz Mother\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_19\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock23: {\r\n name: \"Geo Rock #23\",\r\n spoiler: \"Forgotten Crossroads: Outside False Knight\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_21\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock24: {\r\n name: \"Geo Rock #24\",\r\n spoiler: \"Forgotten Crossroads: Crystal Peak Dark Toll\",\r\n id: \"Geo Rock 2 (1)\",\r\n sceneName: \"Mines_33\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock25: {\r\n name: \"Geo Rock #25\",\r\n spoiler: \"Forgotten Crossroads: Crystal Peak Dark Toll\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Mines_33\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock26: {\r\n name: \"Geo Rock #26\",\r\n spoiler: \"Forgotten Crossroads: Crystal Peak Dark Toll\",\r\n id: \"Geo Rock 2 (2)\",\r\n sceneName: \"Mines_33\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock27: {\r\n name: \"Geo Rock #27\",\r\n spoiler: \"Forgotten Crossroads: Above Lever\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_16\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock28: {\r\n name: \"Geo Rock #28\",\r\n spoiler: \"Forgotten Crossroads: Central Grub\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_05\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock29: {\r\n name: \"Geo Rock #29\",\r\n spoiler: \"Forgotten Crossroads: Outside Tram\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_27\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock30: {\r\n name: \"Geo Rock #30\",\r\n spoiler: \"Forgotten Crossroads: Tram\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_46\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock31: {\r\n name: \"Geo Rock #31\",\r\n spoiler: \"Forgotten Crossroads: False Knight Arena\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_10\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock32: {\r\n name: \"Geo Rock #32\",\r\n spoiler: \"Forgotten Crossroads: Ancestral Mound\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_ShamanTemple\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock33: {\r\n name: \"Geo Rock #33\",\r\n spoiler: \"Forgotten Crossroads: Ancestral Mound\",\r\n id: \"Geo Rock 2 (1)\",\r\n sceneName: \"Crossroads_ShamanTemple\",\r\n hitsLeft: \"5\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock34: {\r\n name: \"Geo Rock #34\",\r\n spoiler: \"Forgotten Crossroads: Ancestral Mound\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_ShamanTemple\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock35: {\r\n name: \"Geo Rock #35\",\r\n spoiler: \"Greenpath: Entrance\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock36: {\r\n name: \"Geo Rock #36\",\r\n spoiler: \"Greenpath: Waterfall Bench\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_01b\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock37: {\r\n name: \"Geo Rock #37\",\r\n spoiler: \"Greenpath: First Hornet Sighting\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock38: {\r\n name: \"Geo Rock #38\",\r\n spoiler: \"Greenpath: First Hornet Sighting\",\r\n id: \"Geo Rock Green Path 01 (1)\",\r\n sceneName: \"Fungus1_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock39: {\r\n name: \"Geo Rock #39\",\r\n spoiler: \"Greenpath: Outside Hunter\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_07\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock40: {\r\n name: \"Geo Rock #40\",\r\n spoiler: \"Greenpath: Above Sanctuary Bench\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_19\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock41: {\r\n name: \"Geo Rock #41\",\r\n spoiler: \"Greenpath: Acid Bridge\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_10\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock42: {\r\n name: \"Geo Rock #42\",\r\n spoiler: \"Greenpath: Outside Stag Station\",\r\n id: \"Geo Rock Green Path 01 (1)\",\r\n sceneName: \"Fungus1_22\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock43: {\r\n name: \"Geo Rock #43\",\r\n spoiler: \"Greenpath: Outside Stag Station\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_22\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock44: {\r\n name: \"Geo Rock #44\",\r\n spoiler: \"Greenpath: Toll\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_31\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock45: {\r\n name: \"Geo Rock #45\",\r\n spoiler: \"Greenpath: Toll\",\r\n id: \"Geo Rock 1 (1)\",\r\n sceneName: \"Fungus1_31\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock46: {\r\n name: \"Geo Rock #46\",\r\n spoiler: \"Greenpath: Toll\",\r\n id: \"Geo Rock 2 (1)\",\r\n sceneName: \"Fungus1_31\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock47: {\r\n name: \"Geo Rock #47\",\r\n spoiler: \"Greenpath: Storerooms\",\r\n id: \"Geo Rock Green Path 01 (2)\",\r\n sceneName: \"Fungus1_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock48: {\r\n name: \"Geo Rock #48\",\r\n spoiler: \"Greenpath: Storerooms\",\r\n id: \"Geo Rock Green Path 01 (1)\",\r\n sceneName: \"Fungus1_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock49: {\r\n name: \"Geo Rock #49\",\r\n spoiler: \"Greenpath: Storerooms\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock50: {\r\n name: \"Geo Rock #50\",\r\n spoiler: \"Greenpath: Outside Thorns\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Fungus1_05\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock51: {\r\n name: \"Geo Rock #51\",\r\n spoiler: \"Howling Cliffs: Baldur's Shell\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Fungus1_28\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock52: {\r\n name: \"Geo Rock #52\",\r\n spoiler: \"Howling Cliffs: Baldur's Shell\",\r\n id: \"Geo Rock 1 (2)\",\r\n sceneName: \"Fungus1_28\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock53: {\r\n name: \"Geo Rock #53\",\r\n spoiler: \"Greenpath: Outside Hornet\",\r\n id: \"Geo Rock Green Path 02\",\r\n sceneName: \"Fungus1_21\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock54: {\r\n name: \"Geo Rock #54\",\r\n spoiler: \"Greenpath: Outside Hornet\",\r\n id: \"Geo Rock Green Path 02 (1)\",\r\n sceneName: \"Fungus1_21\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock55: {\r\n name: \"Geo Rock #55\",\r\n spoiler: \"Greenpath: Outside Hornet\",\r\n id: \"Geo Rock Green Path 02 (2)\",\r\n sceneName: \"Fungus1_21\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock56: {\r\n name: \"Geo Rock #56\",\r\n spoiler: \"Greenpath: Hornet\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_04\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock57: {\r\n name: \"Geo Rock #57\",\r\n spoiler: \"Greenpath: Massive Moss Charger\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_29\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock58: {\r\n name: \"Geo Rock #58\",\r\n spoiler: \"Greenpath: Massive Moss Charger Corridor\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus1_12\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock59: {\r\n name: \"Geo Rock #59\",\r\n spoiler: \"Greenpath: Massive Moss Charger Corridor\",\r\n id: \"Geo Rock Green Path 01 (1)\",\r\n sceneName: \"Fungus1_12\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock60: {\r\n name: \"Geo Rock #60\",\r\n spoiler: \"Greenpath: Massive Moss Charger Corridor\",\r\n id: \"Geo Rock Green Path 02\",\r\n sceneName: \"Fungus1_12\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock61: {\r\n name: \"Geo Rock #61\",\r\n spoiler: \"Fog Canyon: Queen's Gardens Acid Entrance\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus3_03\",\r\n hitsLeft: \"5\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock62: {\r\n name: \"Geo Rock #62\",\r\n spoiler: \"Fungal Wastes: Below Shrumal Ogres\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_04\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock63: {\r\n name: \"Geo Rock #63\",\r\n spoiler: \"Fungal Wastes: Cornifer\",\r\n id: \"Geo Rock Fung 01 (1)\",\r\n sceneName: \"Fungus2_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock64: {\r\n name: \"Geo Rock #64\",\r\n spoiler: \"Fungal Wastes: Cornifer\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock65: {\r\n name: \"Geo Rock #65\",\r\n spoiler: \"Fungal Wastes: Cornifer\",\r\n id: \"Geo Rock Fung 02 (1)\",\r\n sceneName: \"Fungus2_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock66: {\r\n name: \"Geo Rock #66\",\r\n spoiler: \"Fungal Wastes: Cornifer\",\r\n id: \"Geo Rock Fung 02 (2)\",\r\n sceneName: \"Fungus2_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock67: {\r\n name: \"Geo Rock #67\",\r\n spoiler: \"Forgotten Crossroads: Goam Journal\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_52\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock68: {\r\n name: \"Geo Rock #68\",\r\n spoiler: \"Forgotten Crossroads: Goam Journal\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_52\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock69: {\r\n name: \"Geo Rock #69\",\r\n spoiler: \"Fungal Wastes: Outside Elder Hu\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_08\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock70: {\r\n name: \"Geo Rock #70\",\r\n spoiler: \"Fungal Wastes: Left Of Pilgrim's Way\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_10\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock71: {\r\n name: \"Geo Rock #71\",\r\n spoiler: \"Fungal Wastes: Right of Bouncy Mushroom Grub\",\r\n id: \"Geo Rock Fung 02\",\r\n sceneName: \"Fungus2_11\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock72: {\r\n name: \"Geo Rock #72\",\r\n spoiler: \"Fungal Wastes: Right of Bouncy Mushroom Grub\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_11\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock73: {\r\n name: \"Geo Rock #73\",\r\n spoiler: \"Fungal Wastes: Bretta Bench\",\r\n id: \"Geo Rock Fung 01 (1)\",\r\n sceneName: \"Fungus2_13\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock74: {\r\n name: \"Geo Rock #74\",\r\n spoiler: \"Fungal Wastes: Bretta Bench\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_13\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock75: {\r\n name: \"Geo Rock #75\",\r\n spoiler: \"Fungal Wastes: Bretta Bench\",\r\n id: \"Geo Rock Fung 02\",\r\n sceneName: \"Fungus2_13\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock76: {\r\n name: \"Geo Rock #76\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n id: \"Geo Rock 2 (2)\",\r\n sceneName: \"Fungus2_14\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock77: {\r\n name: \"Geo Rock #77\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Fungus2_14\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock78: {\r\n name: \"Geo Rock #78\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n id: \"Geo Rock 2 (3)\",\r\n sceneName: \"Fungus2_14\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock79: {\r\n name: \"Geo Rock #79\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n id: \"Geo Rock 2 (1)\",\r\n sceneName: \"Fungus2_14\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock80: {\r\n name: \"Geo Rock #80\",\r\n spoiler: \"Fungal Wastes: Mantis Village\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Fungus2_14\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock81: {\r\n name: \"Geo Rock #81\",\r\n spoiler: \"Fungal Wastes: Mantis Lords\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Fungus2_15\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock82: {\r\n name: \"Geo Rock #82\",\r\n spoiler: \"Fungal Wastes: Mantis Lords\",\r\n id: \"Geo Rock 1 (1)\",\r\n sceneName: \"Fungus2_15\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock83: {\r\n name: \"Geo Rock #83\",\r\n spoiler: \"Fungal Wastes: Fungal Core Upper\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_29\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock84: {\r\n name: \"Geo Rock #84\",\r\n spoiler: \"Fungal Wastes: Pilgrim's Way\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Fungus2_21\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock85: {\r\n name: \"Geo Rock #85\",\r\n spoiler: \"City of Tears: Rafters\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Ruins1_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock86: {\r\n name: \"Geo Rock #86\",\r\n spoiler: \"City of Tears: Lemm Room\",\r\n id: \"Geo Rock City 1 (1)\",\r\n sceneName: \"Ruins1_05b\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock87: {\r\n name: \"Geo Rock #87\",\r\n spoiler: \"City of Tears: Rancid Egg Above Lemm\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Ruins1_05c\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock88: {\r\n name: \"Geo Rock #88\",\r\n spoiler: \"Forgotten Crossroads: Vessel Fragment\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Crossroads_37\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock89: {\r\n name: \"Geo Rock #89\",\r\n spoiler: \"Forgotten Crossroads: Brooding Mawlek Middle\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Crossroads_36\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock90: {\r\n name: \"Geo Rock #90\",\r\n spoiler: \"Howling Cliffs: Gorb\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Cliffs_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock91: {\r\n name: \"Geo Rock #91\",\r\n spoiler: \"Howling Cliffs: Gorb\",\r\n id: \"Geo Rock 1 (1)\",\r\n sceneName: \"Cliffs_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock92: {\r\n name: \"Geo Rock #92\",\r\n spoiler: \"Howling Cliffs: Main\",\r\n id: \"Geo Rock 2 (2)\",\r\n sceneName: \"Cliffs_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock93: {\r\n name: \"Geo Rock #93\",\r\n spoiler: \"Howling Cliffs: Main\",\r\n id: \"Geo Rock 2 (1)\",\r\n sceneName: \"Cliffs_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock94: {\r\n name: \"Geo Rock #94\",\r\n spoiler: \"Howling Cliffs: Main\",\r\n id: \"Geo Rock 2 (4)\",\r\n sceneName: \"Cliffs_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock95: {\r\n name: \"Geo Rock #95\",\r\n spoiler: \"Howling Cliffs: Main\",\r\n id: \"Geo Rock 2 (3)\",\r\n sceneName: \"Cliffs_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock96: {\r\n name: \"Geo Rock #96\",\r\n spoiler: \"Crystal Peak: Dark Entrance\",\r\n id: \"Geo Rock Mine\",\r\n sceneName: \"Mines_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock97: {\r\n name: \"Geo Rock #97\",\r\n spoiler: \"Crystal Peak: Dark Entrance\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Mines_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock98: {\r\n name: \"Geo Rock #98\",\r\n spoiler: \"Crystal Peak: Dark Entrance\",\r\n id: \"Geo Rock Mine (1)\",\r\n sceneName: \"Mines_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock99: {\r\n name: \"Geo Rock #99\",\r\n spoiler: \"Crystal Peak: Conveyor Belts Entrance\",\r\n id: \"Geo Rock Mine (1)\",\r\n sceneName: \"Mines_04\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock100: {\r\n name: \"Geo Rock #100\",\r\n spoiler: \"Crystal Peak: Conveyor Belts Entrance\",\r\n id: \"Geo Rock Mine\",\r\n sceneName: \"Mines_04\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock101: {\r\n name: \"Geo Rock #101\",\r\n spoiler: \"Crystal Peak: Above Spike Grub\",\r\n id: \"Geo Rock Mine\",\r\n sceneName: \"Mines_05\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock102: {\r\n name: \"Geo Rock #102\",\r\n spoiler: \"Crystal Peak: East Tall\",\r\n id: \"Geo Rock Mine (4)\",\r\n sceneName: \"Mines_20\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock103: {\r\n name: \"Geo Rock #103\",\r\n spoiler: \"Crystal Peak: East Tall\",\r\n id: \"Geo Rock Mine (3)\",\r\n sceneName: \"Mines_20\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock104: {\r\n name: \"Geo Rock #104\",\r\n spoiler: \"Crystal Peak: East Tall\",\r\n id: \"Geo Rock Mine (2)\",\r\n sceneName: \"Mines_20\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock105: {\r\n name: \"Geo Rock #105\",\r\n spoiler: \"Crystal Peak: Chest Crushers\",\r\n id: \"Geo Rock Mine\",\r\n sceneName: \"Mines_37\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock106: {\r\n name: \"Geo Rock #106\",\r\n spoiler: \"Crystal Peak: Chest Crushers\",\r\n id: \"Geo Rock Mine (1)\",\r\n sceneName: \"Mines_37\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock107: {\r\n name: \"Geo Rock #107\",\r\n spoiler: \"Royal Waterways: Entrance\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Waterways_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock108: {\r\n name: \"Geo Rock #108\",\r\n spoiler: \"Royal Waterways: Entrance\",\r\n id: \"Geo Rock City 1 (1)\",\r\n sceneName: \"Waterways_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock109: {\r\n name: \"Geo Rock #109\",\r\n spoiler: \"Royal Waterways: Mask Shard Room\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Waterways_04b\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock110: {\r\n name: \"Geo Rock #110\",\r\n spoiler: \"City of Tears: Broken Elevator\",\r\n id: \"Geo Rock 2 (1)\",\r\n sceneName: \"Abyss_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock111: {\r\n name: \"Geo Rock #111\",\r\n spoiler: \"City of Tears: Broken Elevator\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Abyss_01\",\r\n hitsLeft: \"5\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock112: {\r\n name: \"Geo Rock #112\",\r\n spoiler: \"City of Tears: Broken Elevator\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Abyss_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock113: {\r\n name: \"Geo Rock #113\",\r\n spoiler: \"Ancient Basin: Broken Bridge\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Abyss_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock114: {\r\n name: \"Geo Rock #114\",\r\n spoiler: \"Ancient Basin: Broken Bridge\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Abyss_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock115: {\r\n name: \"Geo Rock #115\",\r\n spoiler: \"Ancient Basin: Broken Bridge\",\r\n id: \"Geo Rock Deepnest (2)\",\r\n sceneName: \"Abyss_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock116: {\r\n name: \"Geo Rock #116\",\r\n spoiler: \"City of Tears: King's Station\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Ruins2_06\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock117: {\r\n name: \"Geo Rock #117\",\r\n spoiler: \"City of Tears: Above King's Station\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Ruins2_05\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock118: {\r\n name: \"Geo Rock #118\",\r\n spoiler: \"Kingdom's Edge: Whispering Root\",\r\n id: \"Geo Rock Outskirts\",\r\n sceneName: \"Deepnest_East_07\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock119: {\r\n name: \"Geo Rock #119\",\r\n spoiler: \"Kingdom's Edge: Whispering Root\",\r\n id: \"Geo Rock Outskirts (1)\",\r\n sceneName: \"Deepnest_East_07\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock120: {\r\n name: \"Geo Rock #120\",\r\n spoiler: \"Kingdom's Edge: Outside Nailmaster Oro\",\r\n id: \"Geo Rock Outskirts\",\r\n sceneName: \"Deepnest_East_06\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock121: {\r\n name: \"Geo Rock #121\",\r\n spoiler: \"Kingdom's Edge: Outside Nailmaster Oro\",\r\n id: \"Geo Rock Outskirts (1)\",\r\n sceneName: \"Deepnest_East_06\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock122: {\r\n name: \"Geo Rock #122\",\r\n spoiler: \"Kingdom's Edge: Bardoon\",\r\n id: \"Geo Rock Outskirts\",\r\n sceneName: \"Deepnest_East_04\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock123: {\r\n name: \"Geo Rock #123\",\r\n spoiler: \"Kingdom's Edge: Great Hopper King's Idol\",\r\n id: \"Geo Rock Outskirts\",\r\n sceneName: \"Deepnest_East_08\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock124: {\r\n name: \"Geo Rock #124\",\r\n spoiler: \"Kingdom's Edge: Pale Lurker Arena\",\r\n id: \"Geo Rock Outskirts\",\r\n sceneName: \"GG_Lurker\",\r\n hitsLeft: \"5\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock125: {\r\n name: \"Geo Rock #125\",\r\n spoiler: \"Fog Canyon: Overgrown Mound\",\r\n id: \"Geo Rock Green Path 02\",\r\n sceneName: \"Room_Fungus_Shaman\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock126: {\r\n name: \"Geo Rock #126\",\r\n spoiler: \"City of Tears: Soul Master Rewards Room\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Ruins1_32\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock127: {\r\n name: \"Geo Rock #127\",\r\n spoiler: \"Royal Waterways: Outside Flukemarm\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Waterways_08\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock128: {\r\n name: \"Geo Rock #128\",\r\n spoiler: \"Royal Waterways: Flukemunga Corridor\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"GG_Pipeway\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock129: {\r\n name: \"Geo Rock #129\",\r\n spoiler: \"Royal Waterways: Fluke Hermit Room\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Room_GG_Shortcut\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock130: {\r\n name: \"Geo Rock #130\",\r\n spoiler: \"Royal Waterways: Fluke Hermit Room\",\r\n id: \"Geo Rock Fung 02 (1)\",\r\n sceneName: \"Room_GG_Shortcut\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock131: {\r\n name: \"Geo Rock #131\",\r\n spoiler: \"Resting Grounds: Crypts\",\r\n id: \"Geo Rock Grave 02 (1)\",\r\n sceneName: \"RestingGrounds_10\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock132: {\r\n name: \"Geo Rock #132\",\r\n spoiler: \"Resting Grounds: Crypts\",\r\n id: \"Geo Rock Grave 02\",\r\n sceneName: \"RestingGrounds_10\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock133: {\r\n name: \"Geo Rock #133\",\r\n spoiler: \"Resting Grounds: Crypts\",\r\n id: \"Geo Rock Grave 01\",\r\n sceneName: \"RestingGrounds_10\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock134: {\r\n name: \"Geo Rock #134\",\r\n spoiler: \"Crystal Peak: Crystal Heart Gauntlet\",\r\n id: \"Geo Rock Mine\",\r\n sceneName: \"Mines_31\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock135: {\r\n name: \"Geo Rock #135\",\r\n spoiler: \"Crystal Peak: Grub Mimic\",\r\n id: \"Geo Rock Mine\",\r\n sceneName: \"Mines_16\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock136: {\r\n name: \"Geo Rock #136\",\r\n spoiler: \"Ancient Basin: Corridor to Broken Vessel\",\r\n id: \"Geo Rock Abyss\",\r\n sceneName: \"Abyss_18\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock137: {\r\n name: \"Geo Rock #137\",\r\n spoiler: \"The Abyss: Main/Core Area\",\r\n id: \"Geo Rock Abyss (1)\",\r\n sceneName: \"Abyss_06_Core\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock138: {\r\n name: \"Geo Rock #138\",\r\n spoiler: \"The Abyss: Main/Core Area\",\r\n id: \"Geo Rock Abyss\",\r\n sceneName: \"Abyss_06_Core\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock139: {\r\n name: \"Geo Rock #139\",\r\n spoiler: \"Ancient Basin: Broken Vessel Grub\",\r\n id: \"Geo Rock Abyss (1)\",\r\n sceneName: \"Abyss_19\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock140: {\r\n name: \"Geo Rock #140\",\r\n spoiler: \"Ancient Basin: Broken Vessel Grub\",\r\n id: \"Geo Rock Abyss\",\r\n sceneName: \"Abyss_19\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock141: {\r\n name: \"Geo Rock #141\",\r\n spoiler: \"Crystal Peak: Hallownest Crown Climb\",\r\n id: \"Geo Rock Mine\",\r\n sceneName: \"Mines_25\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock142: {\r\n name: \"Geo Rock #142\",\r\n spoiler: \"Crystal Peak: Hallownest Crown Climb\",\r\n id: \"Geo Rock Mine (4)\",\r\n sceneName: \"Mines_25\",\r\n hitsLeft: \"4\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock143: {\r\n name: \"Geo Rock #143\",\r\n spoiler: \"Crystal Peak: Hallownest Crown Climb\",\r\n id: \"Geo Rock Mine (2)\",\r\n sceneName: \"Mines_25\",\r\n hitsLeft: \"4\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock144: {\r\n name: \"Geo Rock #144\",\r\n spoiler: \"Crystal Peak: Hallownest Crown Climb\",\r\n id: \"Geo Rock Mine (1)\",\r\n sceneName: \"Mines_25\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock145: {\r\n name: \"Geo Rock #145\",\r\n spoiler: \"Crystal Peak: Hallownest Crown Climb\",\r\n id: \"Geo Rock Mine (3)\",\r\n sceneName: \"Mines_25\",\r\n hitsLeft: \"4\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock146: {\r\n name: \"Geo Rock #146\",\r\n spoiler: \"City of Tears: Watcher's Spire Second Floor\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Ruins2_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock147: {\r\n name: \"Geo Rock #147\",\r\n spoiler: \"Fog Canyon: East Tall\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus3_26\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock148: {\r\n name: \"Geo Rock #148\",\r\n spoiler: \"Queen's Gardens: Main Arena\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus3_10\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock149: {\r\n name: \"Geo Rock #149\",\r\n spoiler: \"Queen's Gardens: Outside White Lady\",\r\n id: \"Geo Rock Green Path 02\",\r\n sceneName: \"Fungus3_48\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock150: {\r\n name: \"Geo Rock #150\",\r\n spoiler: \"Queen's Gardens: Moss Prophet Room\",\r\n id: \"Geo Rock Green Path 01 (1)\",\r\n sceneName: \"Fungus3_39\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock151: {\r\n name: \"Geo Rock #151\",\r\n spoiler: \"Queen's Gardens: Moss Prophet Room\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Fungus3_39\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock152: {\r\n name: \"Geo Rock #152\",\r\n spoiler: \"Fungal Wastes: Deepnest Fall\",\r\n id: \"Geo Rock 1\",\r\n sceneName: \"Deepnest_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock153: {\r\n name: \"Geo Rock #153\",\r\n spoiler: \"Fungal Wastes: Deepnest Fall\",\r\n id: \"Geo Rock 2\",\r\n sceneName: \"Deepnest_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock154: {\r\n name: \"Geo Rock #154\",\r\n spoiler: \"Queen's Gardens: Corridor To Deepnest\",\r\n id: \"Geo Rock Green Path 01 (1)\",\r\n sceneName: \"Deepnest_43\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock155: {\r\n name: \"Geo Rock #155\",\r\n spoiler: \"Queen's Gardens: Corridor To Deepnest\",\r\n id: \"Geo Rock Green Path 01\",\r\n sceneName: \"Deepnest_43\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock156: {\r\n name: \"Geo Rock #156\",\r\n spoiler: \"Fungal Wastes: Fungal Core Lower\",\r\n id: \"Geo Rock Fung 01\",\r\n sceneName: \"Fungus2_30\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock157: {\r\n name: \"Geo Rock #157\",\r\n spoiler: \"Fungal Wastes: Fungal Core Lower\",\r\n id: \"Geo Rock Fung 01 (1)\",\r\n sceneName: \"Fungus2_30\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock158: {\r\n name: \"Geo Rock #158\",\r\n spoiler: \"Deepnest: Lower Cornifer\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Fungus2_25\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock159: {\r\n name: \"Geo Rock #159\",\r\n spoiler: \"Deepnest: Lower Cornifer\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Fungus2_25\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock160: {\r\n name: \"Geo Rock #160\",\r\n spoiler: \"Deepnest: Lower Cornifer\",\r\n id: \"Geo Rock Deepnest (2)\",\r\n sceneName: \"Fungus2_25\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock161: {\r\n name: \"Geo Rock #161\",\r\n spoiler: \"Deepnest: Top of Lower Cornifer\",\r\n id: \"Geo Rock Deepnest (4)\",\r\n sceneName: \"Deepnest_16\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock162: {\r\n name: \"Geo Rock #162\",\r\n spoiler: \"Deepnest: Top of Lower Cornifer\",\r\n id: \"Geo Rock Deepnest (3)\",\r\n sceneName: \"Deepnest_16\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock163: {\r\n name: \"Geo Rock #163\",\r\n spoiler: \"Deepnest: Top of Lower Cornifer\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_16\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock164: {\r\n name: \"Geo Rock #164\",\r\n spoiler: \"Deepnest: Top of Lower Cornifer\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_16\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock165: {\r\n name: \"Geo Rock #165\",\r\n spoiler: \"Deepnest: Top of Lower Cornifer\",\r\n id: \"Geo Rock Deepnest (2)\",\r\n sceneName: \"Deepnest_16\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock166: {\r\n name: \"Geo Rock #166\",\r\n spoiler: \"Deepnest: Outside Grub Mimics\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_02\",\r\n hitsLeft: \"3\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock167: {\r\n name: \"Geo Rock #167\",\r\n spoiler: \"Deepnest: Outside Grub Mimics\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_02\",\r\n hitsLeft: \"3\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock168: {\r\n name: \"Geo Rock #168\",\r\n spoiler: \"Deepnest: Whispering Root\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_39\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock169: {\r\n name: \"Geo Rock #169\",\r\n spoiler: \"Deepnest: Whispering Root\",\r\n id: \"Geo Rock Deepnest (2)\",\r\n sceneName: \"Deepnest_39\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock170: {\r\n name: \"Geo Rock #170\",\r\n spoiler: \"Deepnest: Whispering Root\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_39\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock171: {\r\n name: \"Geo Rock #171\",\r\n spoiler: \"Deepnest: Left of Hot Spring\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_03\",\r\n hitsLeft: \"3\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock172: {\r\n name: \"Geo Rock #172\",\r\n spoiler: \"Deepnest: Left of Hot Spring\",\r\n id: \"Geo Rock Deepnest (2)\",\r\n sceneName: \"Deepnest_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock173: {\r\n name: \"Geo Rock #173\",\r\n spoiler: \"Deepnest: Left of Hot Spring\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_03\",\r\n hitsLeft: \"3\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock174: {\r\n name: \"Geo Rock #174\",\r\n spoiler: \"Deepnest: Outside Galien\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_35\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock175: {\r\n name: \"Geo Rock #175\",\r\n spoiler: \"Deepnest: Outside Galien\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_35\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock176: {\r\n name: \"Geo Rock #176\",\r\n spoiler: \"Deepnest: Corridor to Tram\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_37\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock177: {\r\n name: \"Geo Rock #177\",\r\n spoiler: \"Deepnest: Corridor to Tram\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_37\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock178: {\r\n name: \"Geo Rock #178\",\r\n spoiler: \"Kingdom's Edge: Left of The Hive\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_East_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock179: {\r\n name: \"Geo Rock #179\",\r\n spoiler: \"Kingdom's Edge: Left of The Hive\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_East_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock180: {\r\n name: \"Geo Rock #180\",\r\n spoiler: \"Kingdom's Edge: Above The Hive\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_East_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock181: {\r\n name: \"Geo Rock #181\",\r\n spoiler: \"Kingdom's Edge: Above The Hive\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_East_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock182: {\r\n name: \"Geo Rock #182\",\r\n spoiler: \"Royal Waterways: Left of Isma's Grove\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Waterways_07\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock183: {\r\n name: \"Geo Rock #183\",\r\n spoiler: \"The Hive: Outside Grub\",\r\n id: \"Geo Rock Hive (2)\",\r\n sceneName: \"Hive_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock184: {\r\n name: \"Geo Rock #184\",\r\n spoiler: \"The Hive: Outside Grub\",\r\n id: \"Geo Rock Hive\",\r\n sceneName: \"Hive_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock185: {\r\n name: \"Geo Rock #185\",\r\n spoiler: \"The Hive: Outside Grub\",\r\n id: \"Geo Rock Hive (1)\",\r\n sceneName: \"Hive_03\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock186: {\r\n name: \"Geo Rock #186\",\r\n spoiler: \"The Hive: Entrance\",\r\n id: \"Geo Rock Hive\",\r\n sceneName: \"Hive_01\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock187: {\r\n name: \"Geo Rock #187\",\r\n spoiler: \"The Hive: Whispering Root\",\r\n id: \"Geo Rock Hive\",\r\n sceneName: \"Hive_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock188: {\r\n name: \"Geo Rock #188\",\r\n spoiler: \"The Hive: Whispering Root\",\r\n id: \"Geo Rock Hive (2)\",\r\n sceneName: \"Hive_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock189: {\r\n name: \"Geo Rock #189\",\r\n spoiler: \"The Hive: Whispering Root\",\r\n id: \"Geo Rock Hive (1)\",\r\n sceneName: \"Hive_02\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock190: {\r\n name: \"Geo Rock #190\",\r\n spoiler: \"The Hive: Mask Shard Room\",\r\n id: \"Geo Rock Hive\",\r\n sceneName: \"Hive_04\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock191: {\r\n name: \"Geo Rock #191\",\r\n spoiler: \"The Hive: Mask Shard Room\",\r\n id: \"Geo Rock Hive (1)\",\r\n sceneName: \"Hive_04\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock192: {\r\n name: \"Geo Rock #192\",\r\n spoiler: \"Deepnest: Nosk Corridor\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_31\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock193: {\r\n name: \"Geo Rock #193\",\r\n spoiler: \"Deepnest: Nosk Corridor\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_31\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock194: {\r\n name: \"Geo Rock #194\",\r\n spoiler: \"Deepnest: Nosk Corridor\",\r\n id: \"Geo Rock Deepnest (2)\",\r\n sceneName: \"Deepnest_31\",\r\n hitsLeft: \"3\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock195: {\r\n name: \"Geo Rock #195\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest (3)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock196: {\r\n name: \"Geo Rock #196\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest (4)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock197: {\r\n name: \"Geo Rock #197\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest (5)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock198: {\r\n name: \"Geo Rock #198\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock199: {\r\n name: \"Geo Rock #199\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest (1)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock200: {\r\n name: \"Geo Rock #200\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest (7)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock201: {\r\n name: \"Geo Rock #201\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest (2)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock202: {\r\n name: \"Geo Rock #202\",\r\n spoiler: \"Deepnest: Beast's Den\",\r\n id: \"Geo Rock Deepnest (6)\",\r\n sceneName: \"Deepnest_Spider_Town\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock203: {\r\n name: \"Geo Rock #203\",\r\n spoiler: \"City of Tears: Pleasure House Elevator\",\r\n id: \"Geo Rock City 1\",\r\n sceneName: \"Ruins_Elevator\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock204: {\r\n name: \"Geo Rock #204\",\r\n spoiler: \"Kingdom's Edge: near 420 Geo Rock\",\r\n id: \"Geo Rock Outskirts\",\r\n sceneName: \"Deepnest_East_17\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n geoRock205: {\r\n name: \"Geo Rock #205 (420 Geo)\",\r\n spoiler: \"Kingdom's Edge\",\r\n id: \"Giant Geo Egg\",\r\n sceneName: \"Deepnest_East_17\",\r\n hitsLeft: \"0\",\r\n wiki: \"Geo#How_to_Acquire\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Secrets -> World Interactions ############################################## */\r\n\r\n worldInteractions: {\r\n h2: \"World Interactions\",\r\n id: \"hk-world-interactions\",\r\n description: `Certain interactions the player can make with NPCs in the game or world objects. All these here don't count towards either 112% Game Completion or Achievements.`,\r\n entries: {\r\n unlockedCompletionRate: {\r\n name: \"World Sense Ability\",\r\n spoiler: \"Temple of the Black Egg: Lore Tablet\",\r\n wiki: \"World_Sense\"\r\n },\r\n bankerAccountPurchased: {\r\n name: \"Opened Bank Account\",\r\n spoiler: \"100 Geo: Fog Canyon: Millibelle the Banker\",\r\n wiki: \"Millibelle\"\r\n },\r\n millibelleLeft: {\r\n name: \"Banker Disappeared\",\r\n spoiler: \"Fog Canyon: Millibelle the Banker\",\r\n wiki: \"Millibelle\"\r\n },\r\n millibelleCheckedStand: {\r\n name: \"Investigated Banker Stand\",\r\n spoiler: \"Fog Canyon: Millibelle the Banker\",\r\n wiki: \"Millibelle\"\r\n },\r\n bankerSpaMet: {\r\n name: \"Found & Talked to Millibelle\",\r\n spoiler: \"City of Tears: Hot Springs, Simple Key\",\r\n wiki: \"Millibelle\"\r\n },\r\n millibelleReclaimedAllGeo: {\r\n name: \"Reclaimed All Geo\",\r\n spoiler: \"City of Tears: Hot Springs, Millibelle the Thief\",\r\n wiki: \"Millibelle\"\r\n },\r\n stagEggInspected: {\r\n name: \"Inspected Stag Nest Egg\",\r\n spoiler: \"Howling Cliffs: Top of Stag Nest\",\r\n wiki: \"Howling_Cliffs#Sub-area:_Stag_Nest\"\r\n },\r\n elderbugGaveFlower: {\r\n name: \"Delicate Flower: Elderbug\",\r\n spoiler: \"Deliver from Traitor's Child Grave\",\r\n wiki: \"Delicate_Flower#List_of_Possible_Recipients\"\r\n },\r\n givenGodseekerFlower: {\r\n name: \"Delicate Flower: Godseeker\",\r\n spoiler: \"Possible after completing 2 Pantheons\",\r\n wiki: \"Delicate_Flower#List_of_Possible_Recipients\"\r\n },\r\n givenOroFlower: {\r\n name: \"Delicate Flower: Nailmaster Oro\",\r\n spoiler: \"D. from Traitor's Child Grave\",\r\n wiki: \"Delicate_Flower#List_of_Possible_Recipients\"\r\n },\r\n givenWhiteLadyFlower: {\r\n name: \"Delicate Flower: White Lady\",\r\n spoiler: \"Deliver from Traitor's Child Grave\",\r\n wiki: \"Delicate_Flower#List_of_Possible_Recipients\"\r\n },\r\n givenEmilitiaFlower: {\r\n name: \"Delicate Flower: Emilitia\",\r\n spoiler: \"Deliver from Traitor's Child Grave\",\r\n wiki: \"Delicate_Flower#List_of_Possible_Recipients\"\r\n },\r\n },\r\n },\r\n\r\n /* ###################################### Secrets -> Secret Rooms ############################################## */\r\n\r\n secretRooms: {\r\n h2: \"Secret Rooms\",\r\n id: \"hk-secret-rooms\",\r\n description: `Certain Secret Rooms in the game. Grimm's Tent Secret is missable when the player will Banish the Troupe or complete the Ritual.`,\r\n entries: {\r\n grimmTentSecretRoom: {\r\n name: \"Grimm's Tent: Secret Room (missable)\",\r\n spoiler: \"Dirtmouth: inside Grimm's Tent\",\r\n id: \"Secret Mask\",\r\n sceneName: \"Grimm_Main_Tent\",\r\n wiki: \"Dirtmouth#The_Grimm_Troupe.27s_Tents\"\r\n },\r\n towerOfLoveSecretRoom: {\r\n name: \"Tower of Love: Secret Room\",\r\n spoiler: \"City of Tears: near The Collector's Map\",\r\n id: \"secret sound_grub room\",\r\n sceneName: \"Ruins2_11\",\r\n wiki: \"Collector#Trivia\"\r\n },\r\n weaversDenSecretRoom1: {\r\n name: \"Weaver's Den: Secret Room #1\",\r\n spoiler: \"Deepnest: inside Weaver's Den\",\r\n id: \"Breakable Wall\",\r\n sceneName: \"Deepnest_45_v02\",\r\n wiki: \"Deepnest#Sub-area:_Weavers.27_Den\"\r\n },\r\n weaversDenSecretRoom2: {\r\n name: \"Weaver's Den: Secret Room #2\",\r\n spoiler: \"Deepnest: inside Weaver's Den\",\r\n id: \"Breakable Wall Waterways\",\r\n sceneName: \"Deepnest_45_v02\",\r\n wiki: \"Deepnest#Sub-area:_Weavers.27_Den\"\r\n },\r\n pathOfPainEntrance: {\r\n name: \"White Palace: Path of Pain Entrance\",\r\n spoiler: \"Break left wall above lift area\",\r\n id: \"Breakable Wall Ruin Lift\",\r\n sceneName: \"White_Palace_06\",\r\n wiki: \"White_Palace#Sub-area:_Path_of_Pain\"\r\n },\r\n killsBindingSeal: {\r\n name: \"White Palace: Path of Pain\",\r\n spoiler: \"Main Secret Area, After Middle Lift\",\r\n wiki: \"White_Palace#Sub-area:_Path_of_Pain\"\r\n },\r\n whitePalaceSecretRoomVisited: {\r\n name: \"White Palace: Secret Room #1\",\r\n spoiler: \"The Pale King's Workshop\",\r\n wiki: \"White_Palace#The_Pale_King.27s_workshop\"\r\n },\r\n whiteLadyRoom: {\r\n name: \"White Palace: Secret Room #2\",\r\n spoiler: \"White Lady's Room, break floor\",\r\n id: \"Quake Floor\",\r\n sceneName: \"White_Palace_09\",\r\n wiki: \"White_Palace#White_Lady.27s_room\"\r\n },\r\n throneRoomLoreTablet: {\r\n name: \"White Palace: Secret Room #3\",\r\n spoiler: \"Throne Room, break right wall\",\r\n id: \"Breakable Wall Waterways\",\r\n sceneName: \"White_Palace_09\",\r\n wiki: \"White_Palace#Throne_room_Lore_Tablet\"\r\n },\r\n /* \r\n #52 Quake Floor 🗺️ Palace Caged Lever ⌨️ White_Palace_15\r\n #53 Breakable Wall Waterways 🗺️ Palace Spike Drop ⌨️ White_Palace_12\r\n #54 Break Floor 1 🗺️ Palace Spike Drop ⌨️ White_Palace_12\r\n */\r\n },\r\n },\r\n\r\n /* ################ Game Statistics ################### */\r\n\r\n statistics: {\r\n h2: \"Game Statistics\",\r\n id: \"hk-statistics\",\r\n description: \"Dedicated to numbers and stats fans. Everything what the game may not always tell you directly, but what can be read from a save file.\",\r\n entries: {\r\n journalEntriesCompleted: {\r\n name: \"Creatures Encountered\",\r\n spoiler: \"Hunter's Journal (158-164 max)\",\r\n spoilerDefault: \"Hunter's Journal\",\r\n max: 164,\r\n maxDefault: 164,\r\n wiki: \"Category:Enemies_(Hollow_Knight)#Compendium\"\r\n },\r\n /* \r\n Add 4 remaining to Hunter Notes max\r\n */\r\n journalNotesCompleted: {\r\n name: \"Hunter Notes Completed\",\r\n spoiler: \"Hunter's Journal (158-164 max)\",\r\n spoilerDefault: \"Hunter's Journal\",\r\n max: 164,\r\n maxDefault: 164,\r\n wiki: \"Category:Enemies_(Hollow_Knight)#Compendium\"\r\n },\r\n nailDamage: {\r\n name: \"Base Nail Damage\",\r\n spoiler: \"Nailsmith upgrades, City of Tears\",\r\n max: 21,\r\n maxDefault: 21,\r\n wiki: \"Nail#Nail_Upgrades\"\r\n },\r\n /*\r\n whisperingRoots: {\r\n name: \"Whispering Roots Completed\",\r\n spoiler: \"Dream Nail (15 Roots total)\",\r\n max: 15,\r\n maxDefault: 15,\r\n wiki: \"Whispering_Root\"\r\n },\r\n relicsWandererJournal: {\r\n name: \"Relic #1 Found Total\",\r\n nameHeld: \"trinket1\",\r\n nameSold: \"soldTrinket1\",\r\n spoiler: \"Wanderer's Journal (14 Journals total)\",\r\n max: 14,\r\n maxDefault: 14,\r\n wiki: \"Wanderer's_Journal\"\r\n },\r\n relicsHallownestSeal: {\r\n name: \"Relic #2 Found Total\",\r\n nameHeld: \"trinket2\",\r\n nameSold: \"soldTrinket2\",\r\n spoiler: \"Hallownest Seal (17 Seals total)\",\r\n max: 17,\r\n maxDefault: 17,\r\n wiki: \"Hallownest_Seal\"\r\n },\r\n relicsKingsIdol: {\r\n name: \"Relic #3 Found Total\",\r\n nameHeld: \"trinket3\",\r\n nameSold: \"soldTrinket3\",\r\n spoiler: \"King's Idol (8 Idols total)\",\r\n max: 8,\r\n maxDefault: 8,\r\n wiki: \"King's_Idol\"\r\n },\r\n relicsArcaneEgg: {\r\n name: \"Relic #4 Found Total\",\r\n nameHeld: \"trinket4\",\r\n nameSold: \"soldTrinket4\",\r\n spoiler: \"Arcane Egg (4 Eggs max, 1 missable)\",\r\n max: 3,\r\n maxDefault: 3,\r\n wiki: \"Arcane_Egg\"\r\n },\r\n */\r\n // not ghostCoins\r\n geoPool: {\r\n name: \"Shade Geo\",\r\n spoiler: \"Amount of Geo the Shade is currently holding\",\r\n min: 0,\r\n wiki: \"Shade\"\r\n },\r\n rancidEggs: {\r\n name: \"Rancid Eggs\",\r\n spoiler: \"Find: Hallownest, Buy: Sly, Tuk\",\r\n wiki: \"Rancid_Egg\"\r\n },\r\n jinnEggsSold: {\r\n name: \"Rancid Eggs Sold\",\r\n spoiler: \"Dirtmouth: Jinn, Steel Soul Mode only\",\r\n wiki: \"Jinn\"\r\n },\r\n xunFlowerBrokeTimes: {\r\n name: \"Delicate Flowers Destroyed\",\r\n spoiler: \"Grey Mourner, Traitor's Child Grave\",\r\n wiki: \"Delicate_Flower\"\r\n },\r\n /* \r\n geoRocks: {\r\n id: \"geoRocks\",\r\n name: \"Geo Rocks\",\r\n spoiler: \"Unbroken | Broken | Discovered\",\r\n wiki: \"Geo#How_to_Acquire\",\r\n notActivated: 0,\r\n activated: 0,\r\n discoveredTotal: 0,\r\n max: 205,\r\n maxDefault: 205,\r\n },\r\n */\r\n itemsDiscovered: {\r\n id: \"itemsDiscovered\",\r\n name: \"Interactables\",\r\n spoiler: \"Not A. | Activated | Discovered\",\r\n wiki: \"Category:Exploration_(Hollow_Knight)\",\r\n notActivated: 0,\r\n activated: 0,\r\n discoveredTotal: 0\r\n },\r\n bankerBalance: {\r\n name: \"Bank Account Balance\",\r\n spoiler: \"Fog Canyon: Millibelle the Banker\",\r\n wiki: \"Millibelle\"\r\n },\r\n whiteDefenderDefeats: {\r\n name: \"White Defender Times Defeated\",\r\n spoiler: \"Royal Waterways (5 max)\",\r\n max: 5,\r\n maxDefault: 5,\r\n wiki: \"White_Defender\"\r\n },\r\n greyPrinceDefeats: {\r\n name: \"Grey Prince Zote Times Defeated\",\r\n spoiler: \"Dirtmouth (10 max)\",\r\n max: 10,\r\n maxDefault: 10,\r\n wiki: \"Grey_Prince_Zote\"\r\n }\r\n },\r\n },\r\n\r\n /* ################################################# Godhome Statistics ############################################## */\r\n\r\n godhomeStatistics: {\r\n h2: \"Godhome Statistics\",\r\n id: \"hk-godhome-statistics\",\r\n description: \"Everything in Godhome, that didn't fit any other category.\",\r\n entries: {\r\n seenGGWastes: {\r\n name: \"Tuner Memory\",\r\n spoiler: \"Requires completing 3 Pantheons, 2% chance\",\r\n wiki: \"Godhome#Tuner_Memory\"\r\n },\r\n blueRoomDoorUnlocked: {\r\n name: \"Lifeblood Door Open\",\r\n spoiler: \"Complete any 8 Pantheon bindings total\",\r\n wiki: \"Godhome#Locked_Lifeblood_Room\"\r\n },\r\n killedVoidIdol_1: {\r\n name: \"Journal: Void Idol Attuned\",\r\n spoiler: \"Hall of Gods: Defeat All (Attuned)\",\r\n wiki: \"Void_Idol\"\r\n },\r\n killedVoidIdol_2: {\r\n name: \"Journal: Void Idol Ascended\",\r\n spoiler: \"Hall of Gods: Defeat All (Ascended)\",\r\n wiki: \"Void_Idol\"\r\n },\r\n killedVoidIdol_3: {\r\n name: \"Journal: Void Idol Radiant\",\r\n spoiler: \"Hall of Gods: Defeat All (Radiant)\",\r\n wiki: \"Void_Idol\"\r\n },\r\n killedGodseekerMask: {\r\n name: \"Journal: Weathered Mask\",\r\n spoiler: \"Land of Storms: All Pantheons & Bindings\",\r\n wiki: \"Weathered_Mask\"\r\n },\r\n zoteStatueWallBroken: {\r\n name: \"Intruder Discovered\",\r\n spoiler: \"Hall of Gods: Zote Statue (upper right)\",\r\n wiki: \"Hall_of_Gods#Zote\"\r\n },\r\n ordealAchieved: {\r\n name: \"The Eternal Ordeal\",\r\n spoiler: \"Reach 57 Zotelings defeated\",\r\n wiki: \"Eternal_Ordeal\"\r\n }\r\n },\r\n },\r\n\r\n /* ################################################### Pantheon of the Master #################################################### */\r\n\r\n pantheonOfTheMaster: {\r\n h2: \"P1 – Pantheon of the Master\",\r\n id: \"hk-pantheon-master\",\r\n property: \"bossDoorStateTier1\",\r\n description: \"Seek the Gods of Nail and Shell\",\r\n entries: {\r\n unlocked: {\r\n name: \"P1 Unlocked\",\r\n spoiler: \"Defeat P1 bosses in the game world to unlock\",\r\n wiki: \"Pantheon_of_the_Master\"\r\n },\r\n completed: {\r\n name: \"P1 Completed\",\r\n spoiler: \"Defeat all bosses in a row to complete\",\r\n wiki: \"Pantheon_of_the_Master\"\r\n },\r\n boundNail: {\r\n name: \"P1 Binding: Nail\",\r\n spoiler: \"Complete with the Nail binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundShell: {\r\n name: \"P1 Binding: Shell\",\r\n spoiler: \"Complete with the Shell binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundCharms: {\r\n name: \"P1 Binding: Charms\",\r\n spoiler: \"Complete with the Charm binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundSoul: {\r\n name: \"P1 Binding: Soul\",\r\n spoiler: \"Complete with the Soul binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n allBindings: {\r\n name: \"P1 All Bindings\",\r\n spoiler: \"Complete with all bindings active at once\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n noHits: {\r\n name: \"P1 No Damage\",\r\n spoiler: \"Complete without taking a single hit\",\r\n wiki: \"Pantheons\"\r\n },\r\n },\r\n },\r\n\r\n /* ################################################### Pantheon of the Artist #################################################### */\r\n\r\n pantheonOfTheArtist: {\r\n h2: \"P2 – Pantheon of the Artist\",\r\n id: \"hk-pantheon-artist\",\r\n property: \"bossDoorStateTier2\",\r\n description: \"Seek the God Inspired\",\r\n entries: {\r\n unlocked: {\r\n name: \"P2 Unlocked\",\r\n spoiler: \"Defeat P2 bosses in the game world to unlock\",\r\n wiki: \"Pantheon_of_the_Artist\"\r\n },\r\n completed: {\r\n name: \"P2 Completed\",\r\n spoiler: \"Defeat all bosses in a row to complete\",\r\n wiki: \"Pantheon_of_the_Artist\"\r\n },\r\n boundNail: {\r\n name: \"P2 Binding: Nail\",\r\n spoiler: \"Complete with the Nail binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundShell: {\r\n name: \"P2 Binding: Shell\",\r\n spoiler: \"Complete with the Shell binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundCharms: {\r\n name: \"P2 Binding: Charms\",\r\n spoiler: \"Complete with the Charm binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundSoul: {\r\n name: \"P2 Binding: Soul\",\r\n spoiler: \"Complete with the Soul binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n allBindings: {\r\n name: \"P2 All Bindings\",\r\n spoiler: \"Complete with all bindings active at once\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n noHits: {\r\n name: \"P2 No Damage\",\r\n spoiler: \"Complete without taking a single hit\",\r\n wiki: \"Pantheons\"\r\n },\r\n },\r\n },\r\n\r\n /* ################################################### Pantheon of the Sage #################################################### */\r\n\r\n pantheonOfTheSage: {\r\n h2: \"P3 – Pantheon of the Sage\",\r\n id: \"hk-pantheon-sage\",\r\n property: \"bossDoorStateTier3\",\r\n description: \"Seek the God of Wealth and Power\",\r\n entries: {\r\n unlocked: {\r\n name: \"P3 Unlocked\",\r\n spoiler: \"Defeat P3 bosses in the game world to unlock\",\r\n wiki: \"Pantheon_of_the_Sage\"\r\n },\r\n completed: {\r\n name: \"P3 Completed\",\r\n spoiler: \"Defeat all bosses in a row to complete\",\r\n wiki: \"Pantheon_of_the_Sage\"\r\n },\r\n boundNail: {\r\n name: \"P3 Binding: Nail\",\r\n spoiler: \"Complete with the Nail binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundShell: {\r\n name: \"P3 Binding: Shell\",\r\n spoiler: \"Complete with the Shell binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundCharms: {\r\n name: \"P3 Binding: Charms\",\r\n spoiler: \"Complete with the Charm binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundSoul: {\r\n name: \"P3 Binding: Soul\",\r\n spoiler: \"Complete with the Soul binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n allBindings: {\r\n name: \"P3 All Bindings\",\r\n spoiler: \"Complete with all bindings active at once\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n noHits: {\r\n name: \"P3 No Damage\",\r\n spoiler: \"Complete without taking a single hit\",\r\n wiki: \"Pantheons\"\r\n },\r\n },\r\n },\r\n\r\n /* ################################################### Pantheon of the Knight #################################################### */\r\n\r\n pantheonOfTheKnight: {\r\n h2: \"P4 – Pantheon of the Knight\",\r\n id: \"hk-pantheon-knight\",\r\n property: \"bossDoorStateTier4\",\r\n description: \"Seek the Pure God\",\r\n entries: {\r\n unlocked: {\r\n name: \"P4 Unlocked\",\r\n spoiler: \"Complete 3 previous Pantheons to unlock\",\r\n wiki: \"Pantheon_of_the_Knight\"\r\n },\r\n completed: {\r\n name: \"P4 Completed\",\r\n spoiler: \"Defeat all bosses in a row to complete\",\r\n wiki: \"Pantheon_of_the_Knight\"\r\n },\r\n boundNail: {\r\n name: \"P4 Binding: Nail\",\r\n spoiler: \"Complete with the Nail binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundShell: {\r\n name: \"P4 Binding: Shell\",\r\n spoiler: \"Complete with the Shell binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundCharms: {\r\n name: \"P4 Binding: Charms\",\r\n spoiler: \"Complete with the Charm binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundSoul: {\r\n name: \"P4 Binding: Soul\",\r\n spoiler: \"Complete with the Soul binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n allBindings: {\r\n name: \"P4 All Bindings\",\r\n spoiler: \"Complete with all bindings active at once\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n noHits: {\r\n name: \"P4 No Damage\",\r\n spoiler: \"Complete without taking a single hit\",\r\n wiki: \"Pantheons\"\r\n },\r\n },\r\n },\r\n\r\n /* ################################################### Pantheon of Hallownest #################################################### */\r\n\r\n pantheonOfHallownest: {\r\n h2: \"P5 – Pantheon of Hallownest\",\r\n id: \"hk-pantheon-hallownest\",\r\n property: \"bossDoorStateTier5\",\r\n description: \"Seek the Kingdom's Forgotten Light\",\r\n entries: {\r\n unlocked: {\r\n name: \"P5 Unlocked\",\r\n spoiler: \"Complete 4 previous Pantheons to unlock\",\r\n wiki: \"Pantheon_of_Hallownest\"\r\n },\r\n completed: {\r\n name: \"P5 Completed\",\r\n spoiler: \"Defeat all bosses in a row to complete\",\r\n wiki: \"Pantheon_of_Hallownest\"\r\n },\r\n boundNail: {\r\n name: \"P5 Binding: Nail\",\r\n spoiler: \"Complete with the Nail binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundShell: {\r\n name: \"P5 Binding: Shell\",\r\n spoiler: \"Complete with the Shell binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundCharms: {\r\n name: \"P5 Binding: Charms\",\r\n spoiler: \"Complete with the Charm binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n boundSoul: {\r\n name: \"P5 Binding: Soul\",\r\n spoiler: \"Complete with the Soul binding active\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n allBindings: {\r\n name: \"P5 All Bindings\",\r\n spoiler: \"Complete with all bindings active at once\",\r\n wiki: \"Pantheons#Bindings\"\r\n },\r\n noHits: {\r\n name: \"P5 No Damage\",\r\n spoiler: \"Complete without taking a single hit\",\r\n wiki: \"Pantheons\"\r\n },\r\n },\r\n },\r\n\r\n /* ################################################### Hall of Gods ############################################################# */\r\n\r\n hallOfGods: {\r\n h2: \"Hall of Gods\",\r\n id: \"hk-hall-of-gods\",\r\n property: \"statueState\",\r\n description: \"Bottom of Godhome. Detecting what bosses have been unlocked and defeated on all three difficulty levels: Attuned, Ascended and Radiant.\",\r\n entries: {\r\n GruzMotherUnlocked: {\r\n name: \"Gruz Mother: Unlocked\",\r\n spoiler: \"I sleep amongst winding roads\",\r\n id: \"GruzMother\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Gruz_Mother\"\r\n },\r\n GruzMotherAttuned: {\r\n name: \"Gruz Mother: Attuned\",\r\n spoiler: \"Slumbering god of fertility\",\r\n id: \"GruzMother\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Gruz_Mother\"\r\n },\r\n GruzMotherAscended: {\r\n name: \"Gruz Mother: Ascended\",\r\n spoiler: \"Slumbering god of fertility\",\r\n id: \"GruzMother\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Gruz_Mother\"\r\n },\r\n GruzMotherRadiant: {\r\n name: \"Gruz Mother: Radiant\",\r\n spoiler: \"Slumbering god of fertility\",\r\n id: \"GruzMother\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Gruz_Mother\"\r\n },\r\n VengeflyUnlocked: {\r\n name: \"Vengefly King: Unlocked\",\r\n spoiler: \"I keep guard above a verdant land\",\r\n id: \"Vengefly\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Vengefly_King\"\r\n },\r\n VengeflyAttuned: {\r\n name: \"Vengefly King: Attuned\",\r\n spoiler: \"Vicious god of territories\",\r\n id: \"Vengefly\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Vengefly_King\"\r\n },\r\n VengeflyAscended: {\r\n name: \"Vengefly King: Ascended\",\r\n spoiler: \"Vicious god of territories\",\r\n id: \"Vengefly\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Vengefly_King\"\r\n },\r\n VengeflyRadiant: {\r\n name: \"Vengefly King: Radiant\",\r\n spoiler: \"Vicious god of territories\",\r\n id: \"Vengefly\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Vengefly_King\"\r\n },\r\n BroodingMawlekUnlocked: {\r\n name: \"Brooding Mawlek: Unlocked\",\r\n spoiler: \"I call out to no one...\",\r\n id: \"BroodingMawlek\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Brooding_Mawlek\"\r\n },\r\n BroodingMawlekAttuned: {\r\n name: \"Brooding Mawlek: Attuned\",\r\n spoiler: \"...hidden by roads and highways\",\r\n id: \"BroodingMawlek\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Brooding_Mawlek\"\r\n },\r\n BroodingMawlekAscended: {\r\n name: \"Brooding Mawlek: Ascended\",\r\n spoiler: \"Lonely god of the nest\",\r\n id: \"BroodingMawlek\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Brooding_Mawlek\"\r\n },\r\n BroodingMawlekRadiant: {\r\n name: \"Brooding Mawlek: Radiant\",\r\n spoiler: \"Lonely god of the nest\",\r\n id: \"BroodingMawlek\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Brooding_Mawlek\"\r\n },\r\n FalseKnightUnlocked: {\r\n name: \"False Knight: Unlocked\",\r\n spoiler: \"I protect the weak in...\",\r\n id: \"FalseKnight\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#False_Knight\"\r\n },\r\n FalseKnightAttuned: {\r\n name: \"False Knight: Attuned\",\r\n spoiler: \"...the heart of the crossroads\",\r\n id: \"FalseKnight\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#False_Knight\"\r\n },\r\n FalseKnightAscended: {\r\n name: \"False Knight: Ascended\",\r\n spoiler: \"Angry god of the downtrodden\",\r\n id: \"FalseKnight\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#False_Knight\"\r\n },\r\n FalseKnightRadiant: {\r\n name: \"False Knight: Radiant\",\r\n spoiler: \"Angry god of the downtrodden\",\r\n id: \"FalseKnight\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#False_Knight\"\r\n },\r\n FailedChampionUnlocked: {\r\n name: \"Failed Champion: Unlocked\",\r\n spoiler: \"Baleful god of regrets\",\r\n id: \"FailedChampion\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Failed_Champion\"\r\n },\r\n FailedChampionAttuned: {\r\n name: \"Failed Champion: Attuned\",\r\n spoiler: \"Baleful god of regrets\",\r\n id: \"FailedChampion\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Failed_Champion\"\r\n },\r\n FailedChampionAscended: {\r\n name: \"Failed Champion: Ascended\",\r\n spoiler: \"Baleful god of regrets\",\r\n id: \"FailedChampion\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Failed_Champion\"\r\n },\r\n FailedChampionRadiant: {\r\n name: \"Failed Champion: Radiant\",\r\n spoiler: \"Baleful god of regrets\",\r\n id: \"FailedChampion\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Failed_Champion\"\r\n },\r\n Hornet1Unlocked: {\r\n name: \"Hornet Protector: Unlocked\",\r\n spoiler: \"I watch over lush pathways...\",\r\n id: \"Hornet1\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Hornet_Protector\"\r\n },\r\n Hornet1Attuned: {\r\n name: \"Hornet Protector: Attuned\",\r\n spoiler: \"...and distant ash-swept graves\",\r\n id: \"Hornet1\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Hornet_Protector\"\r\n },\r\n Hornet1Ascended: {\r\n name: \"Hornet Protector: Ascended\",\r\n spoiler: \"God protector of a fading land\",\r\n id: \"Hornet1\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Hornet_Protector\"\r\n },\r\n Hornet1Radiant: {\r\n name: \"Hornet Protector: Radiant\",\r\n spoiler: \"God protector of a fading land\",\r\n id: \"Hornet1\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Hornet_Protector\"\r\n },\r\n Hornet2Unlocked: {\r\n name: \"Hornet Sentinel: Unlocked\",\r\n spoiler: \"God protector of a fading land\",\r\n id: \"Hornet2\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Hornet_Sentinel\"\r\n },\r\n Hornet2Attuned: {\r\n name: \"Hornet Sentinel: Attuned\",\r\n spoiler: \"God protector of a fading land\",\r\n id: \"Hornet2\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Hornet_Sentinel\"\r\n },\r\n Hornet2Ascended: {\r\n name: \"Hornet Sentinel: Ascended\",\r\n spoiler: \"God protector of a fading land\",\r\n id: \"Hornet2\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Hornet_Sentinel\"\r\n },\r\n Hornet2Radiant: {\r\n name: \"Hornet Sentinel: Radiant\",\r\n spoiler: \"God protector of a fading land\",\r\n id: \"Hornet2\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Hornet_Sentinel\"\r\n },\r\n MegaMossChargerUnlocked: {\r\n name: \"Massive Moss Charger: Unlocked\",\r\n spoiler: \"Together we hunt in paths...\",\r\n id: \"MegaMossCharger\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Massive_Moss_Charger\"\r\n },\r\n MegaMossChargerAttuned: {\r\n name: \"Massive Moss Charger: Attuned\",\r\n spoiler: \"...overgrown with green\",\r\n id: \"MegaMossCharger\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Massive_Moss_Charger\"\r\n },\r\n MegaMossChargerAscended: {\r\n name: \"Massive Moss Charger: Ascended\",\r\n spoiler: \"Restless god of those...\",\r\n id: \"MegaMossCharger\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Massive_Moss_Charger\"\r\n },\r\n MegaMossChargerRadiant: {\r\n name: \"Massive Moss Charger: Radiant\",\r\n spoiler: \"...who band together\",\r\n id: \"MegaMossCharger\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Massive_Moss_Charger\"\r\n },\r\n FlukemarmUnlocked: {\r\n name: \"Flukemarm: Unlocked\",\r\n spoiler: \"I lie within a maze of pipes\",\r\n id: \"Flukemarm\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Flukemarm\"\r\n },\r\n FlukemarmAttuned: {\r\n name: \"Flukemarm: Attuned\",\r\n spoiler: \"Alluring god of motherhood\",\r\n id: \"Flukemarm\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Flukemarm\"\r\n },\r\n FlukemarmAscended: {\r\n name: \"Flukemarm: Ascended\",\r\n spoiler: \"Alluring god of motherhood\",\r\n id: \"Flukemarm\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Flukemarm\"\r\n },\r\n FlukemarmRadiant: {\r\n name: \"Flukemarm: Radiant\",\r\n spoiler: \"Alluring god of motherhood\",\r\n id: \"Flukemarm\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Flukemarm\"\r\n },\r\n MantisLordsUnlocked: {\r\n name: \"Mantis Lords: Unlocked\",\r\n spoiler: \"We watch over a village of warriors\",\r\n id: \"MantisLords\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Mantis_Lords\"\r\n },\r\n MantisLordsAttuned: {\r\n name: \"Mantis Lords: Attuned\",\r\n spoiler: \"Noble sister gods of combat\",\r\n id: \"MantisLords\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Mantis_Lords\"\r\n },\r\n MantisLordsAscended: {\r\n name: \"Mantis Lords: Ascended\",\r\n spoiler: \"Noble sister gods of combat\",\r\n id: \"MantisLords\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Mantis_Lords\"\r\n },\r\n MantisLordsRadiant: {\r\n name: \"Mantis Lords: Radiant\",\r\n spoiler: \"Noble sister gods of combat\",\r\n id: \"MantisLords\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Mantis_Lords\"\r\n },\r\n MantisLordsExtraUnlocked: {\r\n name: \"Sisters of Battle: Unlocked\",\r\n spoiler: \"Revered gods of a proud tribe\",\r\n id: \"MantisLordsExtra\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Sisters_of_Battle\"\r\n },\r\n MantisLordsExtraAttuned: {\r\n name: \"Sisters of Battle: Attuned\",\r\n spoiler: \"Revered gods of a proud tribe\",\r\n id: \"MantisLordsExtra\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Sisters_of_Battle\"\r\n },\r\n MantisLordsExtraAscended: {\r\n name: \"Sisters of Battle: Ascended\",\r\n spoiler: \"Revered gods of a proud tribe\",\r\n id: \"MantisLordsExtra\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Sisters_of_Battle\"\r\n },\r\n MantisLordsExtraRadiant: {\r\n name: \"Sisters of Battle: Radiant\",\r\n spoiler: \"Revered gods of a proud tribe\",\r\n id: \"MantisLordsExtra\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Sisters_of_Battle\"\r\n },\r\n OblobblesUnlocked: {\r\n name: \"Oblobbles: Unlocked\",\r\n spoiler: \"Together we are chained in a strange colosseum\",\r\n id: \"Oblobbles\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Oblobbles\"\r\n },\r\n OblobblesAttuned: {\r\n name: \"Oblobbles: Attuned\",\r\n spoiler: \"Lover gods of faith and devotion\",\r\n id: \"Oblobbles\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Oblobbles\"\r\n },\r\n OblobblesAscended: {\r\n name: \"Oblobbles: Ascended\",\r\n spoiler: \"Lover gods of faith and devotion\",\r\n id: \"Oblobbles\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Oblobbles\"\r\n },\r\n OblobblesRadiant: {\r\n name: \"Oblobbles: Radiant\",\r\n spoiler: \"Lover gods of faith and devotion\",\r\n id: \"Oblobbles\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Oblobbles\"\r\n },\r\n HiveKnightUnlocked: {\r\n name: \"Hive Knight: Unlocked\",\r\n spoiler: \"I guard the heart of the hive for my Queen\",\r\n id: \"HiveKnight\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Hive_Knight\"\r\n },\r\n HiveKnightAttuned: {\r\n name: \"Hive Knight: Attuned\",\r\n spoiler: \"Watchful god of duty\",\r\n id: \"HiveKnight\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Hive_Knight\"\r\n },\r\n HiveKnightAscended: {\r\n name: \"Hive Knight: Ascended\",\r\n spoiler: \"Watchful god of duty\",\r\n id: \"HiveKnight\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Hive_Knight\"\r\n },\r\n HiveKnightRadiant: {\r\n name: \"Hive Knight: Radiant\",\r\n spoiler: \"Watchful god of duty\",\r\n id: \"HiveKnight\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Hive_Knight\"\r\n },\r\n BrokenVesselUnlocked: {\r\n name: \"Broken Vessel: Unlocked\",\r\n spoiler: \"I sleep in the deep caves below the world\",\r\n id: \"BrokenVessel\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Broken_Vessel\"\r\n },\r\n BrokenVesselAttuned: {\r\n name: \"Broken Vessel: Attuned\",\r\n spoiler: \"Broken shell of an empty god\",\r\n id: \"BrokenVessel\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Broken_Vessel\"\r\n },\r\n BrokenVesselAscended: {\r\n name: \"Broken Vessel: Ascended\",\r\n spoiler: \"Broken shell of an empty god\",\r\n id: \"BrokenVessel\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Broken_Vessel\"\r\n },\r\n BrokenVesselRadiant: {\r\n name: \"Broken Vessel: Radiant\",\r\n spoiler: \"Broken shell of an empty god\",\r\n id: \"BrokenVessel\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Broken_Vessel\"\r\n },\r\n LostKinUnlocked: {\r\n name: \"Lost Kin: Unlocked\",\r\n spoiler: \"Lost god of the Abyss\",\r\n id: \"LostKin\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Lost_Kin\"\r\n },\r\n LostKinAttuned: {\r\n name: \"Lost Kin: Attuned\",\r\n spoiler: \"Lost god of the Abyss\",\r\n id: \"LostKin\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Lost_Kin\"\r\n },\r\n LostKinAscended: {\r\n name: \"Lost Kin: Ascended\",\r\n spoiler: \"Lost god of the Abyss\",\r\n id: \"LostKin\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Lost_Kin\"\r\n },\r\n LostKinRadiant: {\r\n name: \"Lost Kin: Radiant\",\r\n spoiler: \"Lost god of the Abyss\",\r\n id: \"LostKin\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Lost_Kin\"\r\n },\r\n NoskUnlocked: {\r\n name: \"Nosk: Unlocked\",\r\n spoiler: \"I wait patiently in a dark nest of predators\",\r\n id: \"Nosk\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Nosk\"\r\n },\r\n NoskAttuned: {\r\n name: \"Nosk: Attuned\",\r\n spoiler: \"Everchanging god of the faceless\",\r\n id: \"Nosk\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Nosk\"\r\n },\r\n NoskAscended: {\r\n name: \"Nosk: Ascended\",\r\n spoiler: \"Everchanging god of the faceless\",\r\n id: \"Nosk\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Nosk\"\r\n },\r\n NoskRadiant: {\r\n name: \"Nosk: Radiant\",\r\n spoiler: \"Everchanging god of the faceless\",\r\n id: \"Nosk\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Nosk\"\r\n },\r\n NoskHornetUnlocked: {\r\n name: \"Winged Nosk: Unlocked\",\r\n spoiler: \"Deceptive god assuming a protector's form\",\r\n id: \"NoskHornet\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Winged_Nosk\"\r\n },\r\n NoskHornetAttuned: {\r\n name: \"Winged Nosk: Attuned\",\r\n spoiler: \"Deceptive god assuming a protector's form\",\r\n id: \"NoskHornet\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Winged_Nosk\"\r\n },\r\n NoskHornetAscended: {\r\n name: \"Winged Nosk: Ascended\",\r\n spoiler: \"Deceptive god assuming a protector's form\",\r\n id: \"NoskHornet\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Winged_Nosk\"\r\n },\r\n NoskHornetRadiant: {\r\n name: \"Winged Nosk: Radiant\",\r\n spoiler: \"Deceptive god assuming a protector's form\",\r\n id: \"NoskHornet\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Winged_Nosk\"\r\n },\r\n CollectorUnlocked: {\r\n name: \"The Collector: Unlocked\",\r\n spoiler: \"I lurk at the peak of a forsaken tower\",\r\n id: \"Collector\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#The_Collector\"\r\n },\r\n CollectorAttuned: {\r\n name: \"The Collector: Attuned\",\r\n spoiler: \"Joyful god of protection\",\r\n id: \"Collector\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#The_Collector\"\r\n },\r\n CollectorAscended: {\r\n name: \"The Collector: Ascended\",\r\n spoiler: \"Joyful god of protection\",\r\n id: \"Collector\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#The_Collector\"\r\n },\r\n CollectorRadiant: {\r\n name: \"The Collector: Radiant\",\r\n spoiler: \"Joyful god of protection\",\r\n id: \"Collector\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#The_Collector\"\r\n },\r\n GodTamerUnlocked: {\r\n name: \"God Tamer: Unlocked\",\r\n spoiler: \"I wait, weapon in hand, within the colosseum\",\r\n id: \"GodTamer\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#God_Tamer\"\r\n },\r\n GodTamerAttuned: {\r\n name: \"God Tamer: Attuned\",\r\n spoiler: \"Gallant god of the arena\",\r\n id: \"GodTamer\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#God_Tamer\"\r\n },\r\n GodTamerAscended: {\r\n name: \"God Tamer: Ascended\",\r\n spoiler: \"Gallant god of the arena\",\r\n id: \"GodTamer\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#God_Tamer\"\r\n },\r\n GodTamerRadiant: {\r\n name: \"God Tamer: Radiant\",\r\n spoiler: \"Gallant god of the arena\",\r\n id: \"GodTamer\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#God_Tamer\"\r\n },\r\n CrystalGuardian1Unlocked: {\r\n name: \"Crystal Guardian: Unlocked\",\r\n spoiler: \"I rest amongst crystals...\",\r\n id: \"CrystalGuardian1\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Crystal_Guardian\"\r\n },\r\n CrystalGuardian1Attuned: {\r\n name: \"Crystal Guardian: Attuned\",\r\n spoiler: \"...and strange machinery\",\r\n id: \"CrystalGuardian1\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Crystal_Guardian\"\r\n },\r\n CrystalGuardian1Ascended: {\r\n name: \"Crystal Guardian: Ascended\",\r\n spoiler: \"Shining god of greed\",\r\n id: \"CrystalGuardian1\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Crystal_Guardian\"\r\n },\r\n CrystalGuardian1Radiant: {\r\n name: \"Crystal Guardian: Radiant\",\r\n spoiler: \"Shining god of greed\",\r\n id: \"CrystalGuardian1\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Crystal_Guardian\"\r\n },\r\n CrystalGuardian2Unlocked: {\r\n name: \"Enraged Guardian: Unlocked\",\r\n spoiler: \"Shining god of greed\",\r\n id: \"CrystalGuardian2\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Enraged_Guardian\"\r\n },\r\n CrystalGuardian2Attuned: {\r\n name: \"Enraged Guardian: Attuned\",\r\n spoiler: \"Shining god of greed\",\r\n id: \"CrystalGuardian2\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Enraged_Guardian\"\r\n },\r\n CrystalGuardian2Ascended: {\r\n name: \"Enraged Guardian: Ascended\",\r\n spoiler: \"Shining god of greed\",\r\n id: \"CrystalGuardian2\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Enraged_Guardian\"\r\n },\r\n CrystalGuardian2Radiant: {\r\n name: \"Enraged Guardian: Radiant\",\r\n spoiler: \"Shining god of greed\",\r\n id: \"CrystalGuardian2\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Enraged_Guardian\"\r\n },\r\n UumuuUnlocked: {\r\n name: \"Uumuu: Unlocked\",\r\n spoiler: \"I sleep submerged in the depths of the archive\",\r\n id: \"Uumuu\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Uumuu\"\r\n },\r\n UumuuAttuned: {\r\n name: \"Uumuu: Attuned\",\r\n spoiler: \"Uncanny god of knowledge\",\r\n id: \"Uumuu\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Uumuu\"\r\n },\r\n UumuuAscended: {\r\n name: \"Uumuu: Ascended\",\r\n spoiler: \"Uncanny god of knowledge\",\r\n id: \"Uumuu\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Uumuu\"\r\n },\r\n UumuuRadiant: {\r\n name: \"Uumuu: Radiant\",\r\n spoiler: \"Uncanny god of knowledge\",\r\n id: \"Uumuu\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Uumuu\"\r\n },\r\n TraitorLordUnlocked: {\r\n name: \"Traitor Lord: Unlocked\",\r\n spoiler: \"I defile the gardens of false royalty\",\r\n id: \"TraitorLord\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Traitor_Lord\"\r\n },\r\n TraitorLordAttuned: {\r\n name: \"Traitor Lord: Attuned\",\r\n spoiler: \"Treacherous god of anger\",\r\n id: \"TraitorLord\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Traitor_Lord\"\r\n },\r\n TraitorLordAscended: {\r\n name: \"Traitor Lord: Ascended\",\r\n spoiler: \"Treacherous god of anger\",\r\n id: \"TraitorLord\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Traitor_Lord\"\r\n },\r\n TraitorLordRadiant: {\r\n name: \"Traitor Lord: Radiant\",\r\n spoiler: \"Treacherous god of anger\",\r\n id: \"TraitorLord\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Traitor_Lord\"\r\n },\r\n GreyPrinceUnlocked: {\r\n name: \"Grey Prince Zote: Unlocked\",\r\n spoiler: \"I serve my Queen inside her dreams\",\r\n id: \"GreyPrince\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Grey_Prince_Zote\"\r\n },\r\n GreyPrinceAttuned: {\r\n name: \"Grey Prince Zote: Attuned\",\r\n spoiler: \"False god conjured by the lonely\",\r\n id: \"GreyPrince\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Grey_Prince_Zote\"\r\n },\r\n GreyPrinceAscended: {\r\n name: \"Grey Prince Zote: Ascended\",\r\n spoiler: \"False god conjured by the lonely\",\r\n id: \"GreyPrince\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Grey_Prince_Zote\"\r\n },\r\n GreyPrinceRadiant: {\r\n name: \"Grey Prince Zote: Radiant\",\r\n spoiler: \"False god conjured by the lonely\",\r\n id: \"GreyPrince\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Grey_Prince_Zote\"\r\n },\r\n MageKnightUnlocked: {\r\n name: \"Soul Warrior: Unlocked\",\r\n spoiler: \"I haunt the halls of a sanctum\",\r\n id: \"MageKnight\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Soul_Warrior\"\r\n },\r\n MageKnightAttuned: {\r\n name: \"Soul Warrior: Attuned\",\r\n spoiler: \"Haunted god of the sanctum\",\r\n id: \"MageKnight\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Soul_Warrior\"\r\n },\r\n MageKnightAscended: {\r\n name: \"Soul Warrior: Ascended\",\r\n spoiler: \"Haunted god of the sanctum\",\r\n id: \"MageKnight\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Soul_Warrior\"\r\n },\r\n MageKnightRadiant: {\r\n name: \"Soul Warrior: Radiant\",\r\n spoiler: \"Haunted god of the sanctum\",\r\n id: \"MageKnight\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Soul_Warrior\"\r\n },\r\n SoulMasterUnlocked: {\r\n name: \"Soul Master: Unlocked\",\r\n spoiler: \"Immortal, I rule the Sanctum\",\r\n id: \"SoulMaster\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Soul_Master\"\r\n },\r\n SoulMasterAttuned: {\r\n name: \"Soul Master: Attuned\",\r\n spoiler: \"Covetous god of soul\",\r\n id: \"SoulMaster\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Soul_Master\"\r\n },\r\n SoulMasterAscended: {\r\n name: \"Soul Master: Ascended\",\r\n spoiler: \"Covetous god of soul\",\r\n id: \"SoulMaster\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Soul_Master\"\r\n },\r\n SoulMasterRadiant: {\r\n name: \"Soul Master: Radiant\",\r\n spoiler: \"Covetous god of soul\",\r\n id: \"SoulMaster\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Soul_Master\"\r\n },\r\n SoulTyrantUnlocked: {\r\n name: \"Soul Tyrant: Unlocked\",\r\n spoiler: \"Frenzied god of mortality\",\r\n id: \"SoulTyrant\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Soul_Tyrant\"\r\n },\r\n SoulTyrantAttuned: {\r\n name: \"Soul Tyrant: Attuned\",\r\n spoiler: \"Frenzied god of mortality\",\r\n id: \"SoulTyrant\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Soul_Tyrant\"\r\n },\r\n SoulTyrantAscended: {\r\n name: \"Soul Tyrant: Ascended\",\r\n spoiler: \"Frenzied god of mortality\",\r\n id: \"SoulTyrant\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Soul_Tyrant\"\r\n },\r\n SoulTyrantRadiant: {\r\n name: \"Soul Tyrant: Radiant\",\r\n spoiler: \"Frenzied god of mortality\",\r\n id: \"SoulTyrant\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Soul_Tyrant\"\r\n },\r\n DungDefenderUnlocked: {\r\n name: \"Dung Defender: Unlocked\",\r\n spoiler: \"I protect the pipeways of the kingdom\",\r\n id: \"DungDefender\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Dung_Defender\"\r\n },\r\n DungDefenderAttuned: {\r\n name: \"Dung Defender: Attuned\",\r\n spoiler: \"Kindly god of bravery and honour\",\r\n id: \"DungDefender\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Dung_Defender\"\r\n },\r\n DungDefenderAscended: {\r\n name: \"Dung Defender: Ascended\",\r\n spoiler: \"Kindly god of bravery and honour\",\r\n id: \"DungDefender\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Dung_Defender\"\r\n },\r\n DungDefenderRadiant: {\r\n name: \"Dung Defender: Radiant\",\r\n spoiler: \"Kindly god of bravery and honour\",\r\n id: \"DungDefender\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Dung_Defender\"\r\n },\r\n WhiteDefenderUnlocked: {\r\n name: \"White Defender: Unlocked\",\r\n spoiler: \"Kindly god of bravery and honour\",\r\n id: \"WhiteDefender\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#White_Defender\"\r\n },\r\n WhiteDefenderAttuned: {\r\n name: \"White Defender: Attuned\",\r\n spoiler: \"Kindly god of bravery and honour\",\r\n id: \"WhiteDefender\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#White_Defender\"\r\n },\r\n WhiteDefenderAscended: {\r\n name: \"White Defender: Ascended\",\r\n spoiler: \"Kindly god of bravery and honour\",\r\n id: \"WhiteDefender\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#White_Defender\"\r\n },\r\n WhiteDefenderRadiant: {\r\n name: \"White Defender: Radiant\",\r\n spoiler: \"Kindly god of bravery and honour\",\r\n id: \"WhiteDefender\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#White_Defender\"\r\n },\r\n WatcherKnightsUnlocked: {\r\n name: \"Watcher Knight: Unlocked\",\r\n spoiler: \"We lie dormant, guarding the Spire's peak\",\r\n id: \"WatcherKnights\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Watcher_Knight\"\r\n },\r\n WatcherKnightsAttuned: {\r\n name: \"Watcher Knight: Attuned\",\r\n spoiler: \"Sentinel gods of the spire\",\r\n id: \"WatcherKnights\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Watcher_Knight\"\r\n },\r\n WatcherKnightsAscended: {\r\n name: \"Watcher Knight: Ascended\",\r\n spoiler: \"Sentinel gods of the spire\",\r\n id: \"WatcherKnights\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Watcher_Knight\"\r\n },\r\n WatcherKnightsRadiant: {\r\n name: \"Watcher Knight: Radiant\",\r\n spoiler: \"Sentinel gods of the spire\",\r\n id: \"WatcherKnights\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Watcher_Knight\"\r\n },\r\n NoEyesUnlocked: {\r\n name: \"No Eyes: Unlocked\",\r\n spoiler: \"I lie dreaming in a silent sanctuary\",\r\n id: \"NoEyes\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#No_Eyes\"\r\n },\r\n NoEyesAttuned: {\r\n name: \"No Eyes: Attuned\",\r\n spoiler: \"Dreamborn god of fear and relief\",\r\n id: \"NoEyes\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#No_Eyes\"\r\n },\r\n NoEyesAscended: {\r\n name: \"No Eyes: Ascended\",\r\n spoiler: \"Dreamborn god of fear and relief\",\r\n id: \"NoEyes\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#No_Eyes\"\r\n },\r\n NoEyesRadiant: {\r\n name: \"No Eyes: Radiant\",\r\n spoiler: \"Dreamborn god of fear and relief\",\r\n id: \"NoEyes\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#No_Eyes\"\r\n },\r\n MarmuUnlocked: {\r\n name: \"Marmu: Unlocked\",\r\n spoiler: \"I lie dreaming patiently in a garden\",\r\n id: \"Marmu\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Marmu\"\r\n },\r\n MarmuAttuned: {\r\n name: \"Marmu: Attuned\",\r\n spoiler: \"Dreamborn god of gardens\",\r\n id: \"Marmu\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Marmu\"\r\n },\r\n MarmuAscended: {\r\n name: \"Marmu: Ascended\",\r\n spoiler: \"Dreamborn god of gardens\",\r\n id: \"Marmu\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Marmu\"\r\n },\r\n MarmuRadiant: {\r\n name: \"Marmu: Radiant\",\r\n spoiler: \"Dreamborn god of gardens\",\r\n id: \"Marmu\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Marmu\"\r\n },\r\n GalienUnlocked: {\r\n name: \"Galien: Unlocked\",\r\n spoiler: \"I lie dreaming in darkness, surrounded by predators\",\r\n id: \"Galien\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Galien\"\r\n },\r\n GalienAttuned: {\r\n name: \"Galien: Attuned\",\r\n spoiler: \"Dreamborn god of heroic hearts\",\r\n id: \"Galien\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Galien\"\r\n },\r\n GalienAscended: {\r\n name: \"Galien: Ascended\",\r\n spoiler: \"Dreamborn god of heroic hearts\",\r\n id: \"Galien\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Galien\"\r\n },\r\n GalienRadiant: {\r\n name: \"Galien: Radiant\",\r\n spoiler: \"Dreamborn god of heroic hearts\",\r\n id: \"Galien\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Galien\"\r\n },\r\n MarkothUnlocked: {\r\n name: \"Markoth: Unlocked\",\r\n spoiler: \"I lie dreaming at the edge of the world\",\r\n id: \"Markoth\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Markoth\"\r\n },\r\n MarkothAttuned: {\r\n name: \"Markoth: Attuned\",\r\n spoiler: \"Dreamborn god of meditation and isolation\",\r\n id: \"Markoth\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Markoth\"\r\n },\r\n MarkothAscended: {\r\n name: \"Markoth: Ascended\",\r\n spoiler: \"Dreamborn god of meditation and isolation\",\r\n id: \"Markoth\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Markoth\"\r\n },\r\n MarkothRadiant: {\r\n name: \"Markoth: Radiant\",\r\n spoiler: \"Dreamborn god of meditation and isolation\",\r\n id: \"Markoth\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Markoth\"\r\n },\r\n XeroUnlocked: {\r\n name: \"Xero: Unlocked\",\r\n spoiler: \"I lie dreaming amongst peaceful graves\",\r\n id: \"Xero\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Xero\"\r\n },\r\n XeroAttuned: {\r\n name: \"Xero: Attuned\",\r\n spoiler: \"Dreamborn god of faith and betrayal\",\r\n id: \"Xero\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Xero\"\r\n },\r\n XeroAscended: {\r\n name: \"Xero: Ascended\",\r\n spoiler: \"Dreamborn god of faith and betrayal\",\r\n id: \"Xero\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Xero\"\r\n },\r\n XeroRadiant: {\r\n name: \"Xero: Radiant\",\r\n spoiler: \"Dreamborn god of faith and betrayal\",\r\n id: \"Xero\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Xero\"\r\n },\r\n GorbUnlocked: {\r\n name: \"Gorb: Unlocked\",\r\n spoiler: \"I lie dreaming at a wind-blasted peak\",\r\n id: \"Gorb\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Gorb\"\r\n },\r\n GorbAttuned: {\r\n name: \"Gorb: Attuned\",\r\n spoiler: \"Dreamborn god of the beyond\",\r\n id: \"Gorb\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Gorb\"\r\n },\r\n GorbAscended: {\r\n name: \"Gorb: Ascended\",\r\n spoiler: \"Dreamborn god of the beyond\",\r\n id: \"Gorb\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Gorb\"\r\n },\r\n GorbRadiant: {\r\n name: \"Gorb: Radiant\",\r\n spoiler: \"Dreamborn god of the beyond\",\r\n id: \"Gorb\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Gorb\"\r\n },\r\n ElderHuUnlocked: {\r\n name: \"Elder Hu: Unlocked\",\r\n spoiler: \"I lie dreaming in the wastes\",\r\n id: \"ElderHu\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Elder_Hu\"\r\n },\r\n ElderHuAttuned: {\r\n name: \"Elder Hu: Attuned\",\r\n spoiler: \"Dreamborn god of travellers and sages\",\r\n id: \"ElderHu\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Elder_Hu\"\r\n },\r\n ElderHuAscended: {\r\n name: \"Elder Hu: Ascended\",\r\n spoiler: \"Dreamborn god of travellers and sages\",\r\n id: \"ElderHu\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Elder_Hu\"\r\n },\r\n ElderHuRadiant: {\r\n name: \"Elder Hu: Radiant\",\r\n spoiler: \"Dreamborn god of travellers and sages\",\r\n id: \"ElderHu\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Elder_Hu\"\r\n },\r\n NailmastersUnlocked: {\r\n name: \"Oro & Mato: Unlocked\",\r\n spoiler: \"Together, we stand at a Pantheon's peak\",\r\n id: \"Nailmasters\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Oro_.26_Mato\"\r\n },\r\n NailmastersAttuned: {\r\n name: \"Oro & Mato: Attuned\",\r\n spoiler: \"Loyal brother gods of the nail\",\r\n id: \"Nailmasters\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Oro_.26_Mato\"\r\n },\r\n NailmastersAscended: {\r\n name: \"Oro & Mato: Ascended\",\r\n spoiler: \"Loyal brother gods of the nail\",\r\n id: \"Nailmasters\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Oro_.26_Mato\"\r\n },\r\n NailmastersRadiant: {\r\n name: \"Oro & Mato: Radiant\",\r\n spoiler: \"Loyal brother gods of the nail\",\r\n id: \"Nailmasters\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Oro_.26_Mato\"\r\n },\r\n PaintmasterUnlocked: {\r\n name: \"Paintmaster Sheo: Unlocked\",\r\n spoiler: \"I hone my craft at a Pantheon's peak\",\r\n id: \"Paintmaster\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Paintmaster_Sheo\"\r\n },\r\n PaintmasterAttuned: {\r\n name: \"Paintmaster Sheo: Attuned\",\r\n spoiler: \"Talented god of artists and creators\",\r\n id: \"Paintmaster\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Paintmaster_Sheo\"\r\n },\r\n PaintmasterAscended: {\r\n name: \"Paintmaster Sheo: Ascended\",\r\n spoiler: \"Talented god of artists and creators\",\r\n id: \"Paintmaster\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Paintmaster_Sheo\"\r\n },\r\n PaintmasterRadiant: {\r\n name: \"Paintmaster Sheo: Radiant\",\r\n spoiler: \"Talented god of artists and creators\",\r\n id: \"Paintmaster\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Paintmaster_Sheo\"\r\n },\r\n SlyUnlocked: {\r\n name: \"Nailsage Sly: Unlocked\",\r\n spoiler: \"I await you at a Pantheon's peak\",\r\n id: \"Sly\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Nailsage_Sly\"\r\n },\r\n SlyAttuned: {\r\n name: \"Nailsage Sly: Attuned\",\r\n spoiler: \"Cunning god of opportunity\",\r\n id: \"Sly\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Nailsage_Sly\"\r\n },\r\n SlyAscended: {\r\n name: \"Nailsage Sly: Ascended\",\r\n spoiler: \"Cunning god of opportunity\",\r\n id: \"Sly\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Nailsage_Sly\"\r\n },\r\n SlyRadiant: {\r\n name: \"Nailsage Sly: Radiant\",\r\n spoiler: \"Cunning god of opportunity\",\r\n id: \"Sly\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Nailsage_Sly\"\r\n },\r\n HollowKnightUnlocked: {\r\n name: \"Pure Vessel: Unlocked\",\r\n spoiler: \"This empty god stands at a Pantheon's peak\",\r\n id: \"HollowKnight\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Pure_Vessel\"\r\n },\r\n HollowKnightAttuned: {\r\n name: \"Pure Vessel: Attuned\",\r\n spoiler: \"Mighty god of nothingness\",\r\n id: \"HollowKnight\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Pure_Vessel\"\r\n },\r\n HollowKnightAscended: {\r\n name: \"Pure Vessel: Ascended\",\r\n spoiler: \"Mighty god of nothingness\",\r\n id: \"HollowKnight\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Pure_Vessel\"\r\n },\r\n HollowKnightRadiant: {\r\n name: \"Pure Vessel: Radiant\",\r\n spoiler: \"Mighty god of nothingness\",\r\n id: \"HollowKnight\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Pure_Vessel\"\r\n },\r\n GrimmUnlocked: {\r\n name: \"Grimm: Unlocked\",\r\n spoiler: \"I await the lighting of the lantern\",\r\n id: \"Grimm\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Grimm\"\r\n },\r\n GrimmAttuned: {\r\n name: \"Grimm: Attuned\",\r\n spoiler: \"Travelling god of the troupe\",\r\n id: \"Grimm\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Grimm\"\r\n },\r\n GrimmAscended: {\r\n name: \"Grimm: Ascended\",\r\n spoiler: \"Travelling god of the troupe\",\r\n id: \"Grimm\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Grimm\"\r\n },\r\n GrimmRadiant: {\r\n name: \"Grimm: Radiant\",\r\n spoiler: \"Travelling god of the troupe\",\r\n id: \"Grimm\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Grimm\"\r\n },\r\n NightmareGrimmUnlocked: {\r\n name: \"Nightmare King: Unlocked\",\r\n spoiler: \"God of nightmares\",\r\n id: \"NightmareGrimm\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Nightmare_King\"\r\n },\r\n NightmareGrimmAttuned: {\r\n name: \"Nightmare King: Attuned\",\r\n spoiler: \"God of nightmares\",\r\n id: \"NightmareGrimm\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Nightmare_King\"\r\n },\r\n NightmareGrimmAscended: {\r\n name: \"Nightmare King: Ascended\",\r\n spoiler: \"God of nightmares\",\r\n id: \"NightmareGrimm\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Nightmare_King\"\r\n },\r\n NightmareGrimmRadiant: {\r\n name: \"Nightmare King: Radiant\",\r\n spoiler: \"God of nightmares\",\r\n id: \"NightmareGrimm\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Nightmare_King\"\r\n },\r\n RadianceUnlocked: {\r\n name: \"Radiance: Unlocked\",\r\n spoiler: \"Forgotten god of light\",\r\n id: \"Radiance\",\r\n check: \"isUnlocked\",\r\n wiki: \"Hall_of_Gods#Radiance\"\r\n },\r\n RadianceAttuned: {\r\n name: \"Radiance: Attuned\",\r\n spoiler: \"Forgotten god of light\",\r\n id: \"Radiance\",\r\n check: \"completedTier1\",\r\n wiki: \"Hall_of_Gods#Radiance\"\r\n },\r\n RadianceAscended: {\r\n name: \"Radiance: Ascended\",\r\n spoiler: \"Forgotten god of light\",\r\n id: \"Radiance\",\r\n check: \"completedTier2\",\r\n wiki: \"Hall_of_Gods#Radiance\"\r\n },\r\n RadianceRadiant: {\r\n name: \"Radiance: Radiant\",\r\n spoiler: \"Forgotten god of light\",\r\n id: \"Radiance\",\r\n check: \"completedTier3\",\r\n wiki: \"Hall_of_Gods#Radiance\"\r\n },\r\n },\r\n }\r\n\r\n\r\n },\r\n};\r\n\r\nexport default HK;","/* Huge thanks to ManicJamie for his HKTranslator: https://github.com/ManicJamie/HKTranslator */\r\n\r\nconst MAP = {\r\n \"Tutorial_01\": \"King's Pass\",\r\n \"Town\": \"Dirtmouth\",\r\n \"Room_shop\": \"Dirtmouth: Sly's Shop\",\r\n \"Room_Sly_Storeroom\": \"Dirtmouth: Sly's Shop Basement\",\r\n \"Room_Town_Stag_Station\": \"Dirtmouth: Stag Station\",\r\n \"Room_mapper\": \"Dirtmouth: Iselda's Shop\",\r\n \"Room_Bretta\": \"Dirtmouth: Bretta's Room\",\r\n \"Room_Bretta_Basement\": \"Dirtmouth: Bretta's Room Basement\",\r\n \"Room_Ouiji\": \"Dirtmouth: Jiji's Hut\",\r\n \"Room_Jinn\": \"Dirtmouth: Jinn's Hut\",\r\n \"Room_Tram_RG\": \"Upper Tram\",\r\n \"Room_Tram\": \"Lower Tram\",\r\n \"Crossroads_01\": \"Forgotten Crossroads: Well\",\r\n \"Crossroads_02\": \"Forgotten Crossroads: Outside Temple of the Black Egg\",\r\n \"Crossroads_03\": \"Forgotten Crossroads: Outside Stag Station\",\r\n \"Crossroads_04\": \"Forgotten Crossroads: Gruz Mother\",\r\n \"Crossroads_05\": \"Forgotten Crossroads: Central Grub\",\r\n \"Crossroads_06\": \"Forgotten Crossroads: Outside Ancestral Mound\",\r\n \"Crossroads_07\": \"Forgotten Crossroads: Gruzzer Vertical Room\",\r\n \"Crossroads_08\": \"Forgotten Crossroads: Aspid Arena\",\r\n \"Crossroads_09\": \"Forgotten Crossroads: Brooding Mawlek Boss\",\r\n \"Crossroads_10\": \"Forgotten Crossroads: False Knight Arena\",\r\n \"Crossroads_11_alt\": \"Forgotten Crossroads: Greenpath Entrance\",\r\n \"Crossroads_12\": \"Forgotten Crossroads: Corridor to Acid Grub\",\r\n \"Crossroads_13\": \"Forgotten Crossroads: Goam Mask Shard\",\r\n \"Crossroads_14\": \"Forgotten Crossroads: Outside Myla\",\r\n \"Crossroads_15\": \"Forgotten Crossroads: Corridor to Tram\",\r\n \"Crossroads_16\": \"Forgotten Crossroads: Above Lever\",\r\n \"Crossroads_18\": \"Forgotten Crossroads: Fungal Wastes Entrance\",\r\n \"Crossroads_19\": \"Forgotten Crossroads: Before Gruz Mother\",\r\n \"Crossroads_21\": \"Forgotten Crossroads: Outside False Knight\",\r\n \"Crossroads_22\": \"Forgotten Crossroads: Glowing Womb Arena\",\r\n \"Crossroads_25\": \"Forgotten Crossroads: Brooding Mawlek Entrance\",\r\n \"Crossroads_27\": \"Forgotten Crossroads: Outside Tram\",\r\n \"Crossroads_30\": \"Forgotten Crossroads: Hot Spring\",\r\n \"Crossroads_31\": \"Forgotten Crossroads: Spike Grub\",\r\n \"Crossroads_33\": \"Forgotten Crossroads: Cornifer\",\r\n \"Crossroads_35\": \"Forgotten Crossroads: Acid Grub\",\r\n \"Crossroads_36\": \"Forgotten Crossroads: Brooding Mawlek Middle\",\r\n \"Crossroads_37\": \"Forgotten Crossroads: Vessel Fragment\",\r\n \"Crossroads_38\": \"Forgotten Crossroads: Grubfather\",\r\n \"Crossroads_39\": \"Forgotten Crossroads: Corridor Right of Temple of the Black Egg\",\r\n \"Crossroads_40\": \"Forgotten Crossroads: Corridor Right of Central Grub\",\r\n \"Crossroads_42\": \"Forgotten Crossroads: Right of Mask Shard\",\r\n \"Crossroads_43\": \"Forgotten Crossroads: Corridor to Elevator\",\r\n \"Crossroads_45\": \"Forgotten Crossroads: Myla\",\r\n \"Crossroads_46\": \"Forgotten Crossroads: Tram\",\r\n \"Crossroads_47\": \"Forgotten Crossroads: Stag Station\",\r\n \"Crossroads_48\": \"Forgotten Crossroads: Husk Guard Grub\",\r\n \"Crossroads_49\": \"Forgotten Crossroads: Elevator\",\r\n \"Crossroads_52\": \"Forgotten Crossroads: Goam Journal\",\r\n \"Crossroads_ShamanTemple\": \"Forgotten Crossroads: Ancestral Mound\",\r\n \"Room_Mender_House\": \"Forgotten Crossroads: Menderbug House\",\r\n \"Room_Charm_Shop\": \"Forgotten Crossroads: Salubra's Shop\",\r\n \"Room_ruinhouse\": \"Forgotten Crossroads: Rescue Sly Hut\",\r\n \"Room_temple\": \"Forgotten Crossroads: Inside Temple of the Black Egg\",\r\n \"Fungus1_01\": \"Greenpath: Entrance\",\r\n \"Fungus1_01b\": \"Greenpath: Waterfall Bench\",\r\n \"Fungus1_02\": \"Greenpath: First Hornet Sighting\",\r\n \"Fungus1_03\": \"Greenpath: Storerooms\",\r\n \"Fungus1_04\": \"Greenpath: Hornet\",\r\n \"Fungus1_05\": \"Greenpath: Outside Thorns\",\r\n \"Fungus1_06\": \"Greenpath: Cornifer\",\r\n \"Fungus1_07\": \"Greenpath: Outside Hunter\",\r\n \"Fungus1_08\": \"Greenpath: Hunter\",\r\n \"Fungus1_09\": \"Greenpath: Sheo Gauntlet\",\r\n \"Fungus1_10\": \"Greenpath: Acid Bridge\",\r\n \"Fungus1_11\": \"Greenpath: Above Fog Canyon\",\r\n \"Fungus1_12\": \"Greenpath: Massive Moss Charger Corridor\",\r\n \"Fungus1_13\": \"Greenpath: Whispering Root\",\r\n \"Fungus1_14\": \"Greenpath: Thorns of Agony\",\r\n \"Fungus1_15\": \"Greenpath: Outside Sheo\",\r\n \"Fungus1_16_alt\": \"Greenpath: Stag Station\",\r\n \"Fungus1_17\": \"Greenpath: Moss Charger Corridor\",\r\n \"Fungus1_19\": \"Greenpath: Above Sanctuary Bench\",\r\n \"Fungus1_20_v02\": \"Greenpath: Vengefly King\",\r\n \"Fungus1_21\": \"Greenpath: Outside Hornet\",\r\n \"Fungus1_22\": \"Greenpath: Outside Stag Station\",\r\n \"Fungus1_25\": \"Greenpath: Corridor to Lake of Unn\",\r\n \"Fungus1_26\": \"Greenpath: Lake Of Unn\",\r\n \"Fungus1_29\": \"Greenpath: Massive Moss Charger\",\r\n \"Fungus1_30\": \"Greenpath: Below Toll Bench\",\r\n \"Fungus1_31\": \"Greenpath: Toll\",\r\n \"Fungus1_32\": \"Greenpath: Moss Knight Arena\",\r\n \"Fungus1_34\": \"Greenpath: Stone Sanctuary Entrance\",\r\n \"Fungus1_35\": \"Greenpath: Stone Sanctuary\",\r\n \"Fungus1_36\": \"Greenpath: Stone Sanctuary Mask Shard\",\r\n \"Fungus1_37\": \"Greenpath: Stone Sanctuary Bench\",\r\n \"Fungus1_Slug\": \"Greenpath: Unn\",\r\n \"Room_nailmaster_02\": \"Greenpath: Sheo\",\r\n \"Room_Slug_Shrine\": \"Greenpath: Lake of Unn Bench\",\r\n \"Deepnest_01\": \"Fungal Wastes: Deepnest Fall\",\r\n \"Fungus2_01\": \"Fungal Wastes: Queen's Station\",\r\n \"Fungus2_02\": \"Fungal Wastes: Queen's Station Stag\",\r\n \"Fungus2_03\": \"Fungal Wastes: Outside Queen's Station\",\r\n \"Fungus2_04\": \"Fungal Wastes: Below Shrumal Ogres\",\r\n \"Fungus2_05\": \"Fungal Wastes: Shrumal Ogres\",\r\n \"Fungus2_06\": \"Fungal Wastes: Outside Leg Eater\",\r\n \"Fungus2_07\": \"Fungal Wastes: Shrumal Warrior Acid Bridge\",\r\n \"Fungus2_08\": \"Fungal Wastes: Outside Elder Hu\",\r\n \"Fungus2_09\": \"Fungal Wastes: Cloth Corridor\",\r\n \"Fungus2_10\": \"Fungal Wastes: Left Of Pilgrim's Way\",\r\n \"Fungus2_11\": \"Fungal Wastes: Right of Bouncy Mushroom Grub\",\r\n \"Fungus2_12\": \"Fungal Wastes: Mantis Corridor\",\r\n \"Fungus2_13\": \"Fungal Wastes: Bretta Bench\",\r\n \"Fungus2_14\": \"Fungal Wastes: Mantis Village\",\r\n \"Fungus2_15\": \"Fungal Wastes: Mantis Lords\",\r\n \"Fungus2_17\": \"Fungal Wastes: Above Mantis Village\",\r\n \"Fungus2_18\": \"Fungal Wastes: Cornifer\",\r\n \"Fungus2_19\": \"Fungal Wastes: Right Of Spore Shroom\",\r\n \"Fungus2_20\": \"Fungal Wastes: Spore Shroom\",\r\n \"Fungus2_21\": \"Fungal Wastes: Pilgrim's Way\",\r\n \"Fungus2_23\": \"Fungal Wastes: Dashmaster\",\r\n \"Fungus2_26\": \"Fungal Wastes: Leg Eater\",\r\n \"Fungus2_28\": \"Fungal Wastes: Shrumal Warrior Loop\",\r\n \"Fungus2_29\": \"Fungal Wastes: Fungal Core Upper\",\r\n \"Fungus2_30\": \"Fungal Wastes: Fungal Core Lower\",\r\n \"Fungus2_31\": \"Fungal Wastes: Mantis Lords Rewards\",\r\n \"Fungus2_32\": \"Fungal Wastes: Elder Hu\",\r\n \"Fungus2_33\": \"Fungal Wastes: Whispering Root near Fog Canyon\",\r\n \"Fungus2_34\": \"Fungal Wastes: Willoh\",\r\n \"Fungus3_01\": \"Fog Canyon: Upper West Tall\",\r\n \"Fungus3_02\": \"Fog Canyon: Lower West Tall\",\r\n \"Fungus3_03\": \"Fog Canyon: Queen's Gardens Acid Entrance\",\r\n \"Fungus3_24\": \"Fog Canyon: Corridor to Overgrown Mound\",\r\n \"Fungus3_25\": \"Fog Canyon: Cornifer\",\r\n \"Fungus3_25b\": \"Fog Canyon: Corridor to Cornifer\",\r\n \"Fungus3_26\": \"Fog Canyon: Right Tall Area\",\r\n \"Fungus3_27\": \"Fog Canyon: Corridor to Archives\",\r\n \"Fungus3_28\": \"Fog Canyon: Charm Notch\",\r\n \"Fungus3_30\": \"Fog Canyon: Lifeblood Cocoon Room\",\r\n \"Fungus3_35\": \"Fog Canyon: Millibelle\",\r\n \"Fungus3_44\": \"Fog Canyon: Overgrown Mound Entrance\",\r\n \"Fungus3_47\": \"Fog Canyon: Teacher's Archives Entrance\",\r\n \"Fungus3_archive\": \"Fog Canyon: Teacher's Archives Bench\",\r\n \"Fungus3_archive_02\": \"Fog Canyon: Uumuu Arena\",\r\n \"Room_Fungus_Shaman\": \"Fog Canyon: Overgrown Mound\",\r\n \"Cliffs_01\": \"Howling Cliffs: Main\",\r\n \"Cliffs_02\": \"Howling Cliffs: Gorb\",\r\n \"Cliffs_03\": \"Howling Cliffs: Stag Nest\",\r\n \"Cliffs_04\": \"Howling Cliffs: Joni's Dark Passage\",\r\n \"Cliffs_05\": \"Howling Cliffs: Joni's Charm Room\",\r\n \"Cliffs_06\": \"Howling Cliffs: Grimm Lantern\",\r\n \"Fungus1_28\": \"Howling Cliffs: Baldur's Shell\",\r\n \"Room_nailmaster\": \"Howling Cliffs: Nailmaster Mato\",\r\n \"Mines_01\": \"Crystal Peak: Desolate Dive Entrance\",\r\n \"Mines_02\": \"Crystal Peak: Dark Entrance\",\r\n \"Mines_03\": \"Crystal Peak: Spike Grub\",\r\n \"Mines_04\": \"Crystal Peak: Conveyor Belts Entrance\",\r\n \"Mines_05\": \"Crystal Peak: Above Spike Grub\",\r\n \"Mines_06\": \"Crystal Peak: Deep Focus Gauntlet\",\r\n \"Mines_07\": \"Crystal Peak: Platform Dark Room to Resting Grounds\",\r\n \"Mines_10\": \"Crystal Peak: Dirtmouth Elevator Exit\",\r\n \"Mines_11\": \"Crystal Peak: Left Of Crystal Guardian\",\r\n \"Mines_13\": \"Crystal Peak: Top Corridor\",\r\n \"Mines_16\": \"Crystal Peak: Grub Mimic\",\r\n \"Mines_17\": \"Crystal Peak: Corridor to Spike Grub\",\r\n \"Mines_18\": \"Crystal Peak: Crystal Guardian Bench\",\r\n \"Mines_19\": \"Crystal Peak: Grub Crushers\",\r\n \"Mines_20\": \"Crystal Peak: Right Tall Room\",\r\n \"Mines_23\": \"Crystal Peak: Hallownest Crown Whispering Root\",\r\n \"Mines_24\": \"Crystal Peak: Hallownest Crown Grub\",\r\n \"Mines_25\": \"Crystal Peak: Hallownest Crown Climb\",\r\n \"Mines_28\": \"Crystal Peak: Outside Crystallized Mound\",\r\n \"Mines_29\": \"Crystal Peak: Dark Bench Room\",\r\n \"Mines_30\": \"Crystal Peak: Cornifer\",\r\n \"Mines_31\": \"Crystal Peak: Crystal Heart Gauntlet\",\r\n \"Mines_32\": \"Crystal Peak: Enraged Guardian Arena\",\r\n \"Mines_33\": \"Forgotten Crossroads: Crystal Peak Dark Toll\",\r\n \"Mines_34\": \"Crystal Peak: Hallownest Crown Peak\",\r\n \"Mines_35\": \"Crystal Peak: Crystallized Mound\",\r\n \"Mines_36\": \"Crystal Peak: Deep Focus Room\",\r\n \"Mines_37\": \"Crystal Peak: Chest Crushers\",\r\n \"Abyss_02\": \"Ancient Basin: Broken Bridge\",\r\n \"Abyss_03\": \"Ancient Basin: Tram\",\r\n \"Abyss_04\": \"Ancient Basin: Fountain\",\r\n \"Abyss_05\": \"Ancient Basin: Palace Grounds\",\r\n \"Abyss_17\": \"Ancient Basin: Cloth\",\r\n \"Abyss_18\": \"Ancient Basin: Corridor to Broken Vessel\",\r\n \"Abyss_19\": \"Ancient Basin: Broken Vessel Grub\",\r\n \"Abyss_20\": \"Ancient Basin: Simple Key\",\r\n \"Abyss_21\": \"Ancient Basin: Monarch Wings\",\r\n \"Abyss_22\": \"Ancient Basin: Hidden Station\",\r\n \"Abyss_06_Core\": \"The Abyss: Main/Core Area\",\r\n \"Abyss_08\": \"The Abyss: Lifeblood Core Room\",\r\n \"Abyss_09\": \"The Abyss: Lighthouse Climb\",\r\n \"Abyss_10\": \"The Abyss: Shade Cloak\",\r\n \"Abyss_12\": \"The Abyss: Abyss Shriek Room\",\r\n \"Abyss_15\": \"The Abyss: Birthplace\",\r\n \"Abyss_16\": \"The Abyss: Corridor to Lighthouse\",\r\n \"Abyss_Lighthouse_room\": \"The Abyss: Inside Lighthouse\",\r\n \"Crossroads_46b\": \"Resting Grounds: Tram\",\r\n \"Crossroads_50\": \"Resting Grounds: Blue Lake\",\r\n \"RestingGrounds_02\": \"Resting Grounds: Xero\",\r\n \"RestingGrounds_04\": \"Resting Grounds: Dream Nail Entrance\",\r\n \"RestingGrounds_05\": \"Resting Grounds: Whispering Root\",\r\n \"RestingGrounds_06\": \"Resting Grounds: Corridor Below Xero\",\r\n \"RestingGrounds_07\": \"Resting Grounds: Seer\",\r\n \"RestingGrounds_08\": \"Resting Grounds: Spirit's Glade\",\r\n \"RestingGrounds_09\": \"Resting Grounds: Stag Station\",\r\n \"RestingGrounds_10\": \"Resting Grounds: Crypts\",\r\n \"RestingGrounds_12\": \"Resting Grounds: Grey Mourner Bench\",\r\n \"RestingGrounds_17\": \"Resting Grounds: Dreamshield Room\",\r\n \"Room_Mansion\": \"Resting Grounds: Grey Mourner Room\",\r\n \"Ruins2_10\": \"Resting Grounds: Elevator\",\r\n \"Abyss_03_c\": \"Kingdom's Edge: Tram\",\r\n \"Deepnest_East_01\": \"Kingdom's Edge: Left of The Hive\",\r\n \"Deepnest_East_02\": \"Kingdom's Edge: Above The Hive\",\r\n \"Deepnest_East_03\": \"Kingdom's Edge: Entrance\",\r\n \"Deepnest_East_04\": \"Kingdom's Edge: Bardoon\",\r\n \"Deepnest_East_06\": \"Kingdom's Edge: Outside Nailmaster Oro\",\r\n \"Deepnest_East_07\": \"Kingdom's Edge: Whispering Root\",\r\n \"Deepnest_East_08\": \"Kingdom's Edge: Great Hopper King's Idol\",\r\n \"Deepnest_East_09\": \"Kingdom's Edge: Corridor Outside Colosseum of Fools\",\r\n \"Deepnest_East_10\": \"Kingdom's Edge: Markoth Arena\",\r\n \"Deepnest_East_11\": \"Kingdom's Edge: Below Camp Bench\",\r\n \"Deepnest_East_12\": \"Kingdom's Edge: Hornet Sentinel Corridor\",\r\n \"Deepnest_East_13\": \"Kingdom's Edge: Camp Bench\",\r\n \"Deepnest_East_14\": \"Kingdom's Edge: Below Nailmaster Oro\",\r\n \"Deepnest_East_14b\": \"Kingdom's Edge: Quick Slash Room\",\r\n \"Deepnest_East_15\": \"Kingdom's Edge: Lifeblood Room\",\r\n \"Deepnest_East_16\": \"Kingdom's Edge: Nailmaster Oro Scarecrow\",\r\n \"Deepnest_East_17\": \"Kingdom's Edge: 420 Geo Rock\",\r\n \"Deepnest_East_18\": \"Kingdom's Edge: Left of Markoth\",\r\n \"Deepnest_East_Hornet\": \"Kingdom's Edge: Hornet Sentinel Arena\",\r\n \"GG_Lurker\": \"Kingdom's Edge: Pale Lurker Arena\",\r\n \"Room_Colosseum_01\": \"Kingdom's Edge: Colosseum of Fools Entrance\",\r\n \"Room_Colosseum_02\": \"Kingdom's Edge: Colosseum of Fools Bench\",\r\n \"Room_Colosseum_Bronze\": \"Colosseum of Fools: Trial of the Warrior Arena\",\r\n \"Room_Colosseum_Gold\": \"Colosseum of Fools: Trial of the Fool Arena\",\r\n \"Room_Colosseum_Silver\": \"Colosseum of Fools: Trial of the Conqueror Arena\",\r\n \"Room_Colosseum_Spectate\": \"Kingdom's Edge: Colosseum Spectators\",\r\n \"Room_nailmaster_03\": \"Kingdom's Edge: Nailmaster Oro Room\",\r\n \"Room_Wyrm\": \"Kingdom's Edge: Cast-Off Shell\",\r\n \"Abyss_01\": \"City of Tears: Broken Elevator\",\r\n \"Crossroads_49b\": \"City of Tears: Elevator to Forgotten Crossroads\",\r\n \"Room_nailsmith\": \"City of Tears: Nailsmith\",\r\n \"Ruins_Bathhouse\": \"City of Tears: Pleasure House Bench\",\r\n \"Ruins_Elevator\": \"City of Tears: Pleasure House Elevator\",\r\n \"Ruins_House_01\": \"City of Tears: Guarded Grub Room\",\r\n \"Ruins_House_02\": \"City of Tears: Gorgeous Husk Room\",\r\n \"Ruins_House_03\": \"City of Tears: Emilitia Room\",\r\n \"Ruins1_01\": \"City of Tears: Pilgrim's Way Entrance\",\r\n \"Ruins1_02\": \"City of Tears: Quirrel Bench\",\r\n \"Ruins1_03\": \"City of Tears: Rafters\",\r\n \"Ruins1_04\": \"City of Tears: Outside Nailsmith\",\r\n \"Ruins1_05\": \"City of Tears: Grub Above Lemm\",\r\n \"Ruins1_05b\": \"City of Tears: Lemm Room\",\r\n \"Ruins1_05c\": \"City of Tears: Rancid Egg Above Lemm\",\r\n \"Ruins1_06\": \"City of Tears: Corridor to City Storerooms\",\r\n \"Ruins1_09\": \"City of Tears: Soul Twister Arena\",\r\n \"Ruins1_17\": \"City of Tears: Whispering Root\",\r\n \"Ruins1_18\": \"City of Tears: Corridor to Watcher's Spire\",\r\n \"Ruins1_23\": \"City of Tears: Soul Sanctum Entrance\",\r\n \"Ruins1_24\": \"City of Tears: Soul Master Arena\",\r\n \"Ruins1_25\": \"City of Tears: Soul Sanctum Right Elevators\",\r\n \"Ruins1_27\": \"City of Tears: Hollow Knight Fountain\",\r\n \"Ruins1_28\": \"City of Tears: City Storerooms\",\r\n \"Ruins1_29\": \"City of Tears: City Storerooms Stag Station\",\r\n \"Ruins1_30\": \"City of Tears: Soul Sanctum Spell Twister Room\",\r\n \"Ruins1_31\": \"City of Tears: Toll Bench Cornifer\",\r\n \"Ruins1_31b\": \"City of Tears: Shade Soul Arena\",\r\n \"Ruins1_32\": \"City of Tears: Soul Master Rewards Room\",\r\n \"Ruins2_01\": \"City of Tears: Watcher's Spire Second Floor\",\r\n \"Ruins2_01_b\": \"City of Tears: Watcher's Spire First Floor\",\r\n \"Ruins2_03\": \"City of Tears: Watcher's Spire Fourth Floor\",\r\n \"Ruins2_03b\": \"City of Tears: Watcher's Spire Third Floor\",\r\n \"Ruins2_04\": \"City of Tears: Right Hub\",\r\n \"Ruins2_05\": \"City of Tears: Above King's Station\",\r\n \"Ruins2_06\": \"City of Tears: King's Station\",\r\n \"Ruins2_07\": \"City of Tears: Grub Below King's Station\",\r\n \"Ruins2_08\": \"City of Tears: King's Station Stag Station\",\r\n \"Ruins2_09\": \"City of Tears: King's Station Vessel Fragment\",\r\n \"Ruins2_10b\": \"City of Tears: Right Elevator\",\r\n \"Ruins2_11\": \"City of Tears: The Collector Arena\",\r\n \"Ruins2_11_b\": \"City of Tears: Tower of Love\",\r\n \"Ruins2_Watcher_Room\": \"City of Tears: Lurien Elevator\",\r\n \"Hive_01\": \"The Hive: Entrance\",\r\n \"Hive_02\": \"The Hive: Whispering Root\",\r\n \"Hive_03\": \"The Hive: Outside Grub\",\r\n \"Hive_03_c\": \"The Hive: Outside Shortcut\",\r\n \"Hive_04\": \"The Hive: Mask Shard Room\",\r\n \"Hive_05\": \"The Hive: Hive Knight Arena\",\r\n \"GG_Pipeway\": \"Royal Waterways: Flukemunga Corridor\",\r\n \"GG_Waterways\": \"Royal Waterways: Junk Pit\",\r\n \"Room_GG_Shortcut\": \"Royal Waterways: Fluke Hermit Room\",\r\n \"Waterways_01\": \"Royal Waterways: Entrance\",\r\n \"Waterways_02\": \"Royal Waterways: Main Bench\",\r\n \"Waterways_03\": \"Royal Waterways: Tuk Room\",\r\n \"Waterways_04\": \"Royal Waterways: Hidden Grub Room\",\r\n \"Waterways_04b\": \"Royal Waterways: Mask Shard Room\",\r\n \"Waterways_05\": \"Royal Waterways: Dung Defender Arena\",\r\n \"Waterways_06\": \"Royal Waterways: Corridor to Broken Elevator\",\r\n \"Waterways_07\": \"Royal Waterways: Left of Isma's Grove\",\r\n \"Waterways_08\": \"Royal Waterways: Outside Flukemarm\",\r\n \"Waterways_09\": \"Royal Waterways: Cornifer\",\r\n \"Waterways_12\": \"Royal Waterways: Flukemarm Arena\",\r\n \"Waterways_13\": \"Royal Waterways: Isma's Grove\",\r\n \"Waterways_14\": \"Royal Waterways: Kingdom's Edge Acid Corridor\",\r\n \"Waterways_15\": \"Royal Waterways: Dung Defender's Cave\",\r\n \"Abyss_03_b\": \"Deepnest: Tram\",\r\n \"Deepnest_01b\": \"Deepnest: Upper Cornifer\",\r\n \"Deepnest_02\": \"Deepnest: Outside Grub Mimics\",\r\n \"Deepnest_03\": \"Deepnest: Left of Hot Spring\",\r\n \"Deepnest_09\": \"Deepnest: Distant Village Stag Station\",\r\n \"Deepnest_10\": \"Deepnest: Distant Village\",\r\n \"Deepnest_14\": \"Deepnest: Failed Tramway Bench\",\r\n \"Deepnest_16\": \"Deepnest: Room Above Lower Cornifer\",\r\n \"Deepnest_17\": \"Deepnest: Garpede Corridor Below Cornifer\",\r\n \"Deepnest_26\": \"Deepnest: Failed Tramway Lifeblood\",\r\n \"Deepnest_26b\": \"Deepnest: Tram Pass Room\",\r\n \"Deepnest_30\": \"Deepnest: Hot Spring\",\r\n \"Deepnest_31\": \"Deepnest: Nosk Corridor\",\r\n \"Deepnest_32\": \"Deepnest: Nosk Arena\",\r\n \"Deepnest_33\": \"Deepnest: Zote Arena\",\r\n \"Deepnest_34\": \"Deepnest: First Devout\",\r\n \"Deepnest_35\": \"Deepnest: Outside Galien\",\r\n \"Deepnest_36\": \"Deepnest: Grub Mimics\",\r\n \"Deepnest_37\": \"Deepnest: Corridor to Tram\",\r\n \"Deepnest_38\": \"Deepnest: Vessel Fragment Challenge Room\",\r\n \"Deepnest_39\": \"Deepnest: Whispering Root\",\r\n \"Deepnest_40\": \"Deepnest: Galien Arena\",\r\n \"Deepnest_41\": \"Deepnest: Midwife Room\",\r\n \"Deepnest_42\": \"Deepnest: Outside Mask Maker\",\r\n \"Deepnest_44\": \"Deepnest: Sharp Shadow Room\",\r\n \"Deepnest_45_v02\": \"Deepnest: Weaver's Den\",\r\n \"Deepnest_Spider_Town\": \"Deepnest: Beast's Den\",\r\n \"Fungus2_25\": \"Deepnest: Lower Cornifer\",\r\n \"Room_Mask_Maker\": \"Deepnest: Mask Maker Room\",\r\n \"Room_spider_small\": \"Deepnest: Brumm Room\",\r\n \"Deepnest_43\": \"Queen's Gardens: Corridor To Deepnest\",\r\n \"Fungus1_23\": \"Queen's Gardens: First Loodle Corridor\",\r\n \"Fungus1_24\": \"Queen's Gardens: Cornifer Room\",\r\n \"Fungus3_04\": \"Queen's Gardens: Before Petra Arena\",\r\n \"Fungus3_05\": \"Queen's Gardens: Petra Arena\",\r\n \"Fungus3_08\": \"Queen's Gardens: Lower Petra Corridor\",\r\n \"Fungus3_10\": \"Queen's Gardens: Main Arena\",\r\n \"Fungus3_11\": \"Queen's Gardens: Whispering Root\",\r\n \"Fungus3_13\": \"Queen's Gardens: Outside Stag Station\",\r\n \"Fungus3_21\": \"Queen's Gardens: Corridor to Traitor Lord\",\r\n \"Fungus3_22\": \"Queen's Gardens: Upper Grub Room\",\r\n \"Fungus3_23\": \"Queen's Gardens: Traitor Lord Arena\",\r\n \"Fungus3_34\": \"Queen's Gardens: Entrance from Fog Canyon\",\r\n \"Fungus3_39\": \"Queen's Gardens: Moss Prophet Room\",\r\n \"Fungus3_49\": \"Queen's Gardens: Traitor's Child Grave\",\r\n \"Fungus3_40\": \"Queen's Gardens: Stag Station\",\r\n \"Fungus3_48\": \"Queen's Gardens: Outside White Lady\",\r\n \"Fungus3_50\": \"Queen's Gardens: Toll Bench\",\r\n \"Room_Queen\": \"Queen's Gardens: White Lady Room\",\r\n \"White_Palace_01\": \"White Palace: Entrance\",\r\n \"White_Palace_02\": \"White Palace: First Kingsmould\",\r\n \"White_Palace_03_hub\": \"White Palace: Main Hub\",\r\n \"White_Palace_04\": \"White Palace: Left of Main Hub\",\r\n \"White_Palace_05\": \"White Palace: Saw Room\",\r\n \"White_Palace_06\": \"White Palace: Balcony\",\r\n \"White_Palace_07\": \"White Palace: Lamp Pogo Room\",\r\n \"White_Palace_08\": \"White Palace: Pale King's Workshop\",\r\n \"White_Palace_09\": \"White Palace: Throne Room\",\r\n \"White_Palace_11\": \"White Palace: Outside\",\r\n \"White_Palace_12\": \"White Palace: Spike Drop Room\",\r\n \"White_Palace_13\": \"White Palace: Thorn Jump Room\",\r\n \"White_Palace_14\": \"White Palace: Hell Corridor\",\r\n \"White_Palace_15\": \"White Palace: Caged Lever Room\",\r\n \"White_Palace_16\": \"White Palace: Saw Climb Room\",\r\n \"White_Palace_17\": \"White Palace: Path of Pain, Lever\",\r\n \"White_Palace_18\": \"White Palace: Path of Pain, Entrance\",\r\n \"White_Palace_19\": \"White Palace: Path of Pain, Vertical\",\r\n \"White_Palace_20\": \"White Palace: Path of Pain, Final\",\r\n \"Dream_Final_Boss\": \"Temple of the Black Egg: Radiance Room\",\r\n \"Room_Final_Boss_Atrium\": \"Temple of the Black Egg: Bench Room\",\r\n \"Room_Final_Boss_Core\": \"Temple of the Black Egg: Hollow Knight Room\",\r\n \"Grimm_Divine\": \"Dirtmouth: Divine's Tent\",\r\n \"Grimm_Main_Tent\": \"Dirtmouth: Grimm's Tent\",\r\n \"Grimm_Nightmare\": \"Dream: Nightmare King Room\",\r\n \"Dream_01_False_Knight\": \"Dream: Failed Champion Room\",\r\n \"Dream_02_Mage_Lord\": \"Dream: Soul Tyrant Room\",\r\n \"Dream_03_Infected_Knight\": \"Dream: Lost Kin Room\",\r\n \"Dream_04_White_Defender\": \"Dream: White Defender Room\",\r\n \"Dream_Abyss\": \"Dream: Abyss\",\r\n \"Dream_Backer_Shrine\": \"Dream: Outside Shrine of Believers\",\r\n \"Dream_Guardian_Hegemol\": \"Dream: Herrah Room\",\r\n \"Dream_Guardian_Lurien\": \"Dream: Lurien Room\",\r\n \"Dream_Guardian_Monomon\": \"Dream: Monomon Room\",\r\n \"Dream_Mighty_Zote\": \"Dream: Grey Prince Zote Room\",\r\n \"Dream_Nailcollection\": \"Dream: Dreamnail Room\",\r\n \"Dream_Room_Believer_Shrine\": \"Dream: Shrine of Believers\",\r\n \"GG_Atrium\": \"Godhome: Atrium\",\r\n \"GG_Atrium_Roof\": \"Godhome: Roof\",\r\n \"GG_Blue_Room\": \"Godhome: Lifeblood Room\",\r\n \"GG_Land_Of_Storms\": \"Godhome: Land of Storms\",\r\n \"GG_Mighty_Zote\": \"Godhome: Zote Eternal Ordeal\",\r\n \"GG_Unlock_Wastes\": \"Godhome: Godtuner Room\",\r\n \"GG_Workshop\": \"Godhome: Hall of Gods\"\r\n};\r\n\r\nexport default MAP;","/* ---------------- Load main Hollow Knight database files ----------------- */\r\n\r\nimport MAP from \"./hk-dictionary.js\";\r\n\r\n/* -------------------------- Functions ----------------------------- */\r\n\r\n/**\r\n * Switches global variable to a \"completed\" symbol. Adds +1 or +2 to percent property.\r\n */\r\n function SetIconGreen(section = {}, entry = \"\") {\r\n\r\n /* Increase section percentage except the Game Status and Hints sections */\r\n switch (section.id) {\r\n\r\n case \"hk-intro\":\r\n case \"hk-hints\":\r\n break;\r\n\r\n case \"hk-equipment\":\r\n\r\n // double % for equipment\r\n section.percent += 2;\r\n break;\r\n\r\n default:\r\n section.percent++;\r\n }\r\n\r\n section.entries[entry].icon = \"green\";\r\n}\r\n\r\n/**\r\n * Switches global variable to a \"partially completed\" symbol (prevents blurring the textPrefix).\r\n */\r\nfunction SetIconPartial(section = {}, entry = \"\") {\r\n\r\n section.entries[entry].icon = \"partial\";\r\n}\r\n\r\n/**\r\n * Switches global variable to a \"partially completed\" symbol (prevents blurring whole entry).\r\n */\r\nfunction SetIconPartialJournal(section = {}, entry = \"\") {\r\n\r\n section.entries[entry].icon = \"partialJournal\";\r\n}\r\n\r\n/**\r\n * Switches global variable to a \"not completed\" symbol\r\n */\r\nfunction SetIconRed(section = {}, entry = \"\") {\r\n\r\n section.entries[entry].icon = \"red\";\r\n}\r\n\r\n/**\r\n * Switches global variable to no symbol (span with left padding)\r\n */\r\nfunction SetIconNone(section = {}, entry = \"\") {\r\n\r\n section.entries[entry].icon = \"none\";\r\n}\r\n\r\n/**\r\n * Switches global variable to a chosen symbol\r\n */\r\n function SetIcon(section = {}, entry = \"\", icon = \"\") {\r\n\r\n section.entries[entry].icon = icon;\r\n}\r\n\r\n/**\r\n * Checks the length of a JavaScript Object like Array.length\r\n * @param {object} object JavaScript Object\r\n * @return {number} length of the Object\r\n */\r\nfunction ObjectLength(object) {\r\n let length = 0;\r\n for (let key in object) {\r\n if (object.hasOwnProperty(key)) {\r\n ++length;\r\n }\r\n }\r\n return length;\r\n}\r\n\r\n/**\r\n * Returns a translated map location name string.\r\n * @param {string} mapCode Code of the Hollow Knight map location the game developers use\r\n * @param {object} dictionary Main data source for translation\r\n */\r\nfunction TranslateMapName(mapCode, dictionary = MAP) {\r\n\r\n let translation = mapCode;\r\n if (dictionary.hasOwnProperty(mapCode)) translation = dictionary[mapCode];\r\n\r\n return translation;\r\n}\r\n\r\n/**\r\n * Generates database entries text. Provides an easy filling solution.\r\n * @param {array} objectArray \r\n * @param {string} searchText \r\n * @param {string} entryName \r\n * @param {string} entryDB \r\n * @param {string} wiki \r\n */\r\nfunction GenerateDatabaseEntries(objectArray, searchText = \"\", entryName = \"\", entryDB = \"\", wiki = \"\") {\r\n\r\n let fillText = \"\";\r\n let count = 0;\r\n\r\n for (let i = 0, ln = objectArray.length; i < ln; i++) {\r\n\r\n if (objectArray[i].id.includes(searchText)) {\r\n\r\n count++;\r\n\r\n fillText += `\r\n ${entryDB}${count}: {\r\n name: \"${entryName} #${count}\",\r\n spoiler: \"${TranslateMapName(objectArray[i].sceneName)}\",\r\n id: \"${objectArray[i].id}\",\r\n sceneName: \"${objectArray[i].sceneName}\",\r\n hitsLeft: \"${objectArray[i].hitsLeft}\",\r\n wiki: \"${wiki}\"\r\n },`;\r\n }\r\n }\r\n\r\n return fillText;\r\n}\r\n\r\n/* ------------------------- Exports ------------------------------- */\r\n\r\nexport {\r\n SetIconGreen,\r\n SetIconPartial,\r\n SetIconPartialJournal,\r\n SetIconRed,\r\n SetIconNone,\r\n SetIcon,\r\n ObjectLength,\r\n TranslateMapName,\r\n GenerateDatabaseEntries\r\n};","import {\r\n LoadSaveFile\r\n} from \"./LoadSaveFile.js\";\r\n\r\n/* ------------------------ Load image files (necessary for Webpack) ---------------------------------------------------------- */\r\n\r\nimport HEALTH_MASK_IMAGE from \"../img/health-mask.png\";\r\nimport HEALTH_MASK_STEEL_IMAGE from \"../img/health-mask-steel.png\";\r\nimport SOUL_ORB_IMAGE from \"../img/soul-orb.png\";\r\nimport NOTCH_IMAGE from \"../img/notch.png\";\r\nimport NOTCH_FILLED_IMAGE from \"../img/notch-filled.png\";\r\nimport NOTCH_OVERCHARMED_IMAGE from \"../img/notch-overcharmed.png\";\r\nimport GEO_IMAGE from \"../img/geo.png\";\r\nimport GEO_SHADE_IMAGE from \"../img/geo-shade.png\";\r\n\r\n/* ------------------------- Constants ---------------------------------------------------------------------------------------- */\r\n\r\n// const DATA_UNKNOWN = \"Data unknown\";\r\nconst SYMBOL_FALSE = \"\"; // \"❌ \"\r\nconst SYMBOL_TRUE = \"\"; // \"✅ \"\r\nconst SYMBOL_PARTIAL = \"\"; // \"✔ \"\r\nconst SYMBOL_CLOCK = \"\"; // \"🕑 \"\r\nconst SYMBOL_FILE = \"\"; // \"📁\"\r\nconst SYMBOL_BINDING_NAIL = \"\"; // Nail Binding\r\nconst SYMBOL_BINDING_SHELL = \"\"; // Shell Binding\r\nconst SYMBOL_BINDING_CHARMS = \"\"; // Charm Binding\r\nconst SYMBOL_BINDING_SOUL = \"\"; // Soul Binding\r\nconst SYMBOL_BINDING_ALL = \"\"; // All Bindings\r\nconst SYMBOL_ATTUNED = \"\"; // Attuned\r\nconst SYMBOL_ASCENDED = \"\"; // Ascended\r\nconst SYMBOL_RADIANT = \"\"; // Radiant\r\nconst SYMBOL_EMPTY = \"\"; // No symbol\r\nconst FLEUR_DIVIDE = \"\";\r\nconst WIKI_LINK = \"https://hollowknight.fandom.com/wiki/\";\r\n\r\nconst ROOT = document.documentElement;\r\nconst SCROLL_BUTTON = document.querySelector(\".scroll-up-button\");\r\n\r\n/* -------------------------- Variables --------------------------------------------------------------------------------------- */\r\n\r\nlet benchmarkTimes = {\r\n LoadSaveFile: {\r\n name: \"LoadSaveFile()\",\r\n timeStart: 0,\r\n timeEnd: 0\r\n },\r\n CheckCompletion: {\r\n name: \"HKCheckCompletion()\",\r\n timeStart: 0,\r\n timeEnd: 0\r\n },\r\n GenerateInnerHTML: {\r\n name: \"GenerateInnerHTML()\",\r\n timeStart: 0,\r\n timeEnd: 0\r\n },\r\n HKReadTextArea: {\r\n name: \"HKReadTextArea()\",\r\n timeStart: 0,\r\n timeEnd: 0\r\n },\r\n Total: {\r\n name: \"Total\",\r\n timeStart: 0,\r\n timeEnd: 0\r\n }\r\n};\r\n\r\n\r\n/* ######################################################################################### */\r\n\r\nfunction Benchmark(bench) {\r\n\r\n let result = 0;\r\n\r\n for (let time in bench) {\r\n\r\n if (bench[time].timeStart !== 0 && bench[time].timeEnd !== 0) {\r\n\r\n result = bench[time].timeEnd - bench[time].timeStart;\r\n console.info(`${bench[time].name} time (ms) = %c${result.toFixed(2)}`, `color: #008cdc; font-weight: 700;`);\r\n }\r\n bench[time].timeStart = 0;\r\n bench[time].timeEnd = 0;\r\n }\r\n}\r\n\r\nfunction ScrollToElement(element) {\r\n\r\n /* Scroll to the element top */\r\n element.scrollTo({\r\n top: 0,\r\n behavior: \"smooth\"\r\n });\r\n}\r\n\r\nfunction ShowElement(element) {\r\n\r\n element.classList.add(\"visible-block\");\r\n element.classList.add(\"opacity-full\");\r\n element.classList.remove(\"hidden\");\r\n}\r\n\r\nfunction HideElement(element) {\r\n\r\n element.classList.remove(\"visible-block\");\r\n element.classList.remove(\"opacity-full\");\r\n element.classList.add(\"hidden\");\r\n}\r\n\r\nfunction TogglePageScrollElement(root, element, ratio) {\r\n\r\n /* Maximum number of pixels that can be scrolled by the user */\r\n let scrollTotal = root.scrollHeight - root.clientHeight;\r\n\r\n if ((root.scrollTop / scrollTotal) > ratio) {\r\n /* Show button */\r\n ShowElement(element);\r\n } else {\r\n /* Hide button */\r\n HideElement(element);\r\n }\r\n}\r\n\r\n/**\r\n * Replaces the h2 titles with a current percent/max percent values as read from the save file\r\n * @param {object} jsObj Object with HTML data to fill\r\n * @param {number} hkGameCompletion Total completion percentage in a save file\r\n */\r\n/* function CompletionHTML(jsObj, hkGameCompletion) {\r\n\r\n let h2 = \"\";\r\n let h2id = \"\";\r\n let cl = \"\";\r\n let clGreen = \"box-green\";\r\n let clRed = \"box-red\";\r\n let cp = 0; // current Percent\r\n let mp = 0; // max Percent\r\n let fillText = \"\";\r\n\r\n for (let i in jsObj) {\r\n h2 = jsObj[i].h2;\r\n h2id = \"h2-\" + jsObj[i].id;\r\n\r\n (jsObj[i].hasOwnProperty(\"percent\")) ? cp = jsObj[i].percent: cp = 0;\r\n if (i === \"intro\") cp = hkGameCompletion;\r\n\r\n // Don't use percent-box for Essentials, Achievements, Statistics\r\n if (!jsObj[i].hasOwnProperty(\"maxPercent\")) {\r\n fillText = \"\";\r\n }\r\n // otherwise use percent-box with values cp/mp%\r\n else {\r\n\r\n mp = jsObj[i].maxPercent;\r\n\r\n if (i === \"maskShards\") {\r\n let perc = jsObj[i].percent;\r\n (perc % 4) ? cp = Math.floor(perc / 4): cp = perc / 4;\r\n } else if (i === \"vesselFragments\") {\r\n let perc = jsObj[i].percent;\r\n (perc % 3) ? cp = Math.floor(perc / 3): cp = perc / 3;\r\n }\r\n\r\n // switches the box to red when a section (h2) is 0\r\n if (cp === 0) {\r\n cl = ` ${clRed}`;\r\n }\r\n // switches the box to green when a section (h2) is completed\r\n else if (cp === mp) {\r\n cl = ` ${clGreen}`;\r\n }\r\n // default is blue (partially completed and starting value)\r\n else cl = \"\";\r\n\r\n // needed for Game Status to show percentage properly (adds a slash for all boxes except the Game Status one)\r\n if (jsObj[i].id != \"hk-intro\") cp += \"/\";\r\n\r\n fillText = `${(i === \"intro\") ? cp: cp + jsObj[i].maxPercent}%
`;\r\n }\r\n }\r\n} */\r\n\r\n\r\n/* ################################### Optimized Functions ########################################################################## */\r\n\r\n\r\nfunction GenerateInnerHTML(db) {\r\n\r\n // start benchmarking\r\n benchmarkTimes.GenerateInnerHTML.timeStart = performance.now();\r\n\r\n let sections = db.sections;\r\n\r\n /* console.log(sections); */\r\n\r\n let entries = {};\r\n let obj = {\r\n icon: \"\",\r\n iconClass: \"\",\r\n textPrefix: \"\",\r\n textSuffix: \"\",\r\n wiki: \"\",\r\n div: ``,\r\n b: [\"
\", \"\"],\r\n p: \"
\",\r\n span: [\"\", \"\"],\r\n spoiler: [\"\", \"\"],\r\n spoilerAfter: \"\",\r\n };\r\n\r\n let finalHTMLFill = \"\";\r\n let textFill = \"\";\r\n\r\n let Img = \"\";\r\n let maskNormal = `

`;\r\n let maskSteel = `

`;\r\n let soulNormal = `

`;\r\n let notchNormalImage = `

`;\r\n let notchFilledImage = `

`;\r\n let notchOvercharmedImage = `

`;\r\n let geoNormalImage = `

`;\r\n let geoShadeImage = `

`;\r\n let div = `