format files

This commit is contained in:
ReznoRMichael 2021-07-20 23:22:20 +02:00
parent 23d1ad5100
commit d14f1a7cc3
7 changed files with 3100 additions and 3100 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,21 +2,21 @@
// save file names list in the save/ folder // save file names list in the save/ folder
var fileName = [ var fileName = [
"reznor0", // 0 "reznor0", // 0
"reznor1beforegruz", // 1 "reznor1beforegruz", // 1
"reznor2aftergruz", // 2 "reznor2aftergruz", // 2
"reznor5hornet", // 3 "reznor5hornet", // 3
"reznor29ss", // 4 "reznor29ss", // 4
"ext48", // 5 "ext48", // 5
"reznor88banish", // 6 "reznor88banish", // 6
"reznor99whitefragment", // 7 "reznor99whitefragment", // 7
"reznor100", // 8 "reznor100", // 8
"reznor103ss", // 9 "reznor103ss", // 9
"reznor107", // 10 "reznor107", // 10
"reznor112grimm", // 11 "reznor112grimm", // 11
"PoP/kanna", // 12 "PoP/kanna", // 12
"PoP/Reaper4578", // 13 "PoP/Reaper4578", // 13
"PoP/tintingaroo", // 14 "PoP/tintingaroo", // 14
]; ];
/** /**
@ -25,40 +25,40 @@ var fileName = [
* @param callback Function to be called when the request completes * @param callback Function to be called when the request completes
*/ */
function LoadJSON(filename) { function LoadJSON(filename) {
// new Http request object (asynchronous), both the web page and the XML file it tries to load, must be located on the same server. // new Http request object (asynchronous), both the web page and the XML file it tries to load, must be located on the same server.
var xobj = new XMLHttpRequest(); var xobj = new XMLHttpRequest();
xobj.overrideMimeType("application/json"); xobj.overrideMimeType("application/json");
// Specifies the request // Specifies the request
/* method: the request type GET or POST /* method: the request type GET or POST
url: the file location url: the file location
async: true (asynchronous) or false (synchronous) async: true (asynchronous) or false (synchronous)
user: optional user name user: optional user name
psw: optional password */ psw: optional password */
xobj.open('GET', filename, true); // Path to the file xobj.open('GET', filename, true); // Path to the file
// Sends the request to the server - Used for GET requests // Sends the request to the server - Used for GET requests
xobj.send(null); xobj.send(null);
// Defines a function to be called when the readyState property changes // Defines a function to be called when the readyState property changes
/* xobj.onreadystatechange = function GetResponseText() { /* xobj.onreadystatechange = function GetResponseText() {
if (xobj.readyState == 4 && xobj.status == "200") { if (xobj.readyState == 4 && xobj.status == "200") {
// Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode
// Returns the response data as a string // Returns the response data as a string
return callback(xobj.responseText); return callback(xobj.responseText);
} else return false; } else return false;
}; */ }; */
// Sends the request to the server - Used for GET requests // Sends the request to the server - Used for GET requests
// xobj.send(null); // xobj.send(null);
xobj.onload = function JSONparse() { xobj.onload = function JSONparse() {
// Parse JSON string into object // Parse JSON string into object
const jsonObject = JSON.parse(xobj.responseText); const jsonObject = JSON.parse(xobj.responseText);
document.getElementById("save-area").value = JSON.stringify(jsonObject); document.getElementById("save-area").value = JSON.stringify(jsonObject);
return jsonObject; return jsonObject;
// console.log(jsonObj); // console.log(jsonObj);
}; };
} }
/* function JSONparse(response) { /* function JSONparse(response) {
@ -77,37 +77,37 @@ LoadJSON("../save/" + fileName[11] + ".json");
* @param {string} filename Path and .xml file name to be loaded * @param {string} filename Path and .xml file name to be loaded
*/ */
function XMLtoJSON(filename) { function XMLtoJSON(filename) {
var request = new XMLHttpRequest();
request.open('GET', filename, true); // Path to the file var request = new XMLHttpRequest();
request.send(); request.open('GET', filename, true); // Path to the file
request.onload = function XMLparse() { request.send();
const xml = request.responseXML; request.onload = function XMLparse() {
// console.log(xml); const xml = request.responseXML;
let dictionary = xml.getElementsByTagName("Entry"); // console.log(xml);
let oldName = "";
let newName = "";
let dictionaryObject = new Object();
for (let i = 0, length = dictionary.length; i < length; i++) { let dictionary = xml.getElementsByTagName("Entry");
oldName = dictionary[i].getElementsByTagName("oldName")[0].childNodes[0].nodeValue;
newName = dictionary[i].getElementsByTagName("newName")[0].childNodes[0].nodeValue;
dictionaryObject[oldName] = newName; let oldName = "";
} let newName = "";
let dictionaryObject = new Object();
// console.log(JSON.stringify(dictionaryObject)); for (let i = 0, length = dictionary.length; i < length; i++) {
return dictionaryObject; oldName = dictionary[i].getElementsByTagName("oldName")[0].childNodes[0].nodeValue;
}; newName = dictionary[i].getElementsByTagName("newName")[0].childNodes[0].nodeValue;
dictionaryObject[oldName] = newName;
}
// console.log(JSON.stringify(dictionaryObject));
return dictionaryObject;
};
} }
// XMLtoJSON("../files/TranslatorDictionary.xml"); // XMLtoJSON("../files/TranslatorDictionary.xml");

View file

@ -10,9 +10,9 @@
const aesjs = require("./aes-js.js"); const aesjs = require("./aes-js.js");
// For reading the text area after save decoding // For reading the text area after save decoding
import { import {
HKCheckCompletion, HKCheckCompletion,
benchmarkTimes, benchmarkTimes,
Benchmark Benchmark
} from "./HKCheckCompletion.js"; } from "./HKCheckCompletion.js";
const 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 const 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
@ -37,31 +37,31 @@ const ECB_STREAM_CIPHER = new aesjs.ModeOfOperation.ecb(AES_KEY); // create a ne
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
function LoadSaveFile(input, time) { function LoadSaveFile(input, time) {
const inputFileList = input.files; const inputFileList = input.files;
// console.info("Input length: " + input.files.length) // console.info("Input length: " + input.files.length)
// Cease further processing if user canceled the file input dialog // Cease further processing if user canceled the file input dialog
if (inputFileList.length < 1) return false; if (inputFileList.length < 1) return false;
// start benchmark // start benchmark
benchmarkTimes.LoadSaveFile.timeStart = time; benchmarkTimes.LoadSaveFile.timeStart = time;
benchmarkTimes.Total.timeStart = time; benchmarkTimes.Total.timeStart = time;
// Prepares a File object from the first file of the input files for reading as an Array Buffer // Prepares a File object from the first file of the input files for reading as an Array Buffer
let inputFileObject = inputFileList[0]; let inputFileObject = inputFileList[0];
// Cleans the file list to avoid problems after subsequent use // Cleans the file list to avoid problems after subsequent use
// document.getElementById("save-area-file").value = ""; // document.getElementById("save-area-file").value = "";
// 1. read file // 1. read file
// The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer. // The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer.
// It is an array of bytes, often referred to in other languages as a "byte array". // It is an array of bytes, often referred to in other languages as a "byte array".
// new FileReader() // new FileReader()
let inputReader = new FileReader(); let inputReader = new FileReader();
// readAsArrayBuffer(file) // readAsArrayBuffer(file)
inputReader.readAsArrayBuffer(inputFileObject); inputReader.readAsArrayBuffer(inputFileObject);
// addEventListener("load", function) - to decode the file when loaded // addEventListener("load", function) - to decode the file when loaded
inputReader.addEventListener("load", ProcessFileObject); inputReader.addEventListener("load", ProcessFileObject);
} }
/** /**
@ -69,62 +69,62 @@ function LoadSaveFile(input, time) {
* Launches the HKReadTextArea() function automatically after pasting the string to text area * Launches the HKReadTextArea() function automatically after pasting the string to text area
*/ */
function ProcessFileObject() { function ProcessFileObject() {
let inputArrayBuffer = this.result; let inputArrayBuffer = this.result;
let decodedString; let decodedString;
// 2. Decode file // 2. Decode file
try {
// Uint8Array(ArrayBuffer) uint8_t equivalent in C
inputArrayBuffer = new Uint8Array(inputArrayBuffer);
// ArrayBuffer.slice()
// The slice() method copies up to, but not including, the byte indicated by the end parameter.
inputArrayBuffer.slice();
// remove C# header and LengthPrefixedString header (ArrayBuffer)
inputArrayBuffer = RemoveHeaders(inputArrayBuffer);
// base64 Decoding (ArrayBuffer)
inputArrayBuffer = Base64Decode(inputArrayBuffer);
// AES decryption (ECB) removes pkcs7 padding (ArrayBuffer)
inputArrayBuffer = AESDecryption(inputArrayBuffer);
// Convert ArrayBuffer to string/text TextDecoder().decode(ArrayBuffer)
decodedString = new TextDecoder().decode(inputArrayBuffer);
// finish and show benchmark
/* benchLSFEnd = new Date(); */
benchmarkTimes.LoadSaveFile.timeEnd = new Date();
/* console.info("LoadSaveFile() time (ms) =", benchLSFEnd - benchLSFBegin); */
// 4. Analyze the decoded string immediately
try { try {
// Uint8Array(ArrayBuffer) uint8_t equivalent in C HKCheckCompletion(JSON.parse(decodedString));
inputArrayBuffer = new Uint8Array(inputArrayBuffer);
// ArrayBuffer.slice()
// The slice() method copies up to, but not including, the byte indicated by the end parameter.
inputArrayBuffer.slice();
// remove C# header and LengthPrefixedString header (ArrayBuffer)
inputArrayBuffer = RemoveHeaders(inputArrayBuffer);
// base64 Decoding (ArrayBuffer)
inputArrayBuffer = Base64Decode(inputArrayBuffer);
// AES decryption (ECB) removes pkcs7 padding (ArrayBuffer)
inputArrayBuffer = AESDecryption(inputArrayBuffer);
// Convert ArrayBuffer to string/text TextDecoder().decode(ArrayBuffer)
decodedString = new TextDecoder().decode(inputArrayBuffer);
// finish and show benchmark
/* benchLSFEnd = new Date(); */
benchmarkTimes.LoadSaveFile.timeEnd = new Date();
/* console.info("LoadSaveFile() time (ms) =", benchLSFEnd - benchLSFBegin); */
// 4. Analyze the decoded string immediately
try {
HKCheckCompletion(JSON.parse(decodedString));
} catch (error) {
alert(`This seems like not a valid Hollow Knight save. ${error}`);
console.info(`This seems like not a valid Hollow Knight save. ${error}`);
}
// 5. Paste decoded string file to text area
(async () => {
document.getElementById("save-area").value = "";
document.getElementById("save-area").value = await decodedString;
})();
// finish total and show benchmark
benchmarkTimes.Total.timeEnd = new Date();
Benchmark(benchmarkTimes);
/* console.info("Total time (ms) =", benchTotal - benchLSFBegin); */
// alert(`Decoded String: ${decodedString}`);
// alert(`Array Buffer: ${inputArrayBuffer}`);
} catch (error) { } catch (error) {
alert(`The file cannot be decoded. ${error}`); alert(`This seems like not a valid Hollow Knight save. ${error}`);
console.info(`The file cannot be decoded. ${error}`); console.info(`This seems like not a valid Hollow Knight save. ${error}`);
} }
// 5. Paste decoded string file to text area
(async () => {
document.getElementById("save-area").value = "";
document.getElementById("save-area").value = await decodedString;
})();
// finish total and show benchmark
benchmarkTimes.Total.timeEnd = new Date();
Benchmark(benchmarkTimes);
/* console.info("Total time (ms) =", benchTotal - benchLSFBegin); */
// alert(`Decoded String: ${decodedString}`);
// alert(`Array Buffer: ${inputArrayBuffer}`);
} catch (error) {
alert(`The file cannot be decoded. ${error}`);
console.info(`The file cannot be decoded. ${error}`);
}
} }
/** /**
@ -134,19 +134,19 @@ function ProcessFileObject() {
* @returns {Uint8Array} * @returns {Uint8Array}
*/ */
function RemoveHeaders(buffer, csHeader = CSHARP_HEADER) { function RemoveHeaders(buffer, csHeader = CSHARP_HEADER) {
// Remove the fixed C# header and byte 11 at the end. // Remove the fixed C# header and byte 11 at the end.
buffer = buffer.subarray(csHeader.length, buffer.length - 1); buffer = buffer.subarray(csHeader.length, buffer.length - 1);
// Remove LengthPrefixedString header // Remove LengthPrefixedString header
let lengthCount = 0; let lengthCount = 0;
for (let i = 0; i < 5; i++) { for (let i = 0; i < 5; i++) {
lengthCount++; lengthCount++;
if ((buffer[i] & 0x80) == 0) { if ((buffer[i] & 0x80) == 0) {
break; break;
}
} }
}
return buffer.subarray(lengthCount); return buffer.subarray(lengthCount);
} }
/** /**
@ -155,39 +155,39 @@ function RemoveHeaders(buffer, csHeader = CSHARP_HEADER) {
* @returns {Uint8Array} * @returns {Uint8Array}
*/ */
function Base64Decode(buffer) { function Base64Decode(buffer) {
buffer = new Uint8Array(buffer).slice(); buffer = new Uint8Array(buffer).slice();
buffer = buffer.map(v => BASE64_DECODE_TABLE.get(v)); buffer = buffer.map(v => BASE64_DECODE_TABLE.get(v));
// 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. // 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.
let p = buffer.indexOf(64); let p = buffer.indexOf(64);
let end; let end;
if (p != -1) { if (p != -1) {
end = p; end = p;
} else { } else {
end = buffer.length; end = buffer.length;
}
buffer = buffer.subarray(0, end);
let output = new Uint8Array(3 * buffer.length / 4);
let continuous = Math.floor(buffer.length / 4) * 4;
for (let i = 0; i < continuous; i += 4) {
let k = 3 * i / 4;
output[k] = buffer[i] << 2 | buffer[i + 1] >> 4;
output[k + 1] = (buffer[i + 1] & 0x0F) << 4 | buffer[i + 2] >> 2;
output[k + 2] = (buffer[i + 2] & 0x03) << 6 | buffer[i + 3];
}
if (buffer[continuous] != undefined) {
let k = 3 * continuous / 4;
output[k] = buffer[continuous] << 2 | buffer[continuous + 1] >> 4;
if (buffer[continuous + 2] != undefined) {
output[k + 1] = (buffer[continuous + 1] & 0x0F) << 4 | buffer[continuous + 2] >> 2;
} }
}
buffer = buffer.subarray(0, end); return output;
let output = new Uint8Array(3 * buffer.length / 4);
let continuous = Math.floor(buffer.length / 4) * 4;
for (let i = 0; i < continuous; i += 4) {
let k = 3 * i / 4;
output[k] = buffer[i] << 2 | buffer[i + 1] >> 4;
output[k + 1] = (buffer[i + 1] & 0x0F) << 4 | buffer[i + 2] >> 2;
output[k + 2] = (buffer[i + 2] & 0x03) << 6 | buffer[i + 3];
}
if (buffer[continuous] != undefined) {
let k = 3 * continuous / 4;
output[k] = buffer[continuous] << 2 | buffer[continuous + 1] >> 4;
if (buffer[continuous + 2] != undefined) {
output[k + 1] = (buffer[continuous + 1] & 0x0F) << 4 | buffer[continuous + 2] >> 2;
}
}
return output;
} }
/** /**
@ -196,18 +196,18 @@ function Base64Decode(buffer) {
* @returns {Uint8Array} * @returns {Uint8Array}
*/ */
function AESDecryption(buffer, cipherObject = ECB_STREAM_CIPHER) { function AESDecryption(buffer, cipherObject = ECB_STREAM_CIPHER) {
let output = cipherObject.decrypt(buffer); let output = cipherObject.decrypt(buffer);
return output.subarray(0, -output[output.length - 1]); return output.subarray(0, -output[output.length - 1]);
} }
// Assign actions (functions) to launch when a specific element is used // Assign actions (functions) to launch when a specific element is used
document.getElementById("save-area-file").addEventListener("change", (event) => { document.getElementById("save-area-file").addEventListener("change", (event) => {
LoadSaveFile(event.target, new Date()); LoadSaveFile(event.target, new Date());
}); });
document.getElementById("save-area-file").addEventListener("click", (mouseEvent) => { document.getElementById("save-area-file").addEventListener("click", (mouseEvent) => {
mouseEvent.target.value = ""; mouseEvent.target.value = "";
}); });
export { export {
LoadSaveFile LoadSaveFile
}; };

View file

@ -1,399 +1,399 @@
/* Huge thanks to ManicJamie for his HKTranslator: https://github.com/ManicJamie/HKTranslator */ /* Huge thanks to ManicJamie for his HKTranslator: https://github.com/ManicJamie/HKTranslator */
const MAP = { const MAP = {
"Tutorial_01": "King's Pass", "Tutorial_01": "King's Pass",
"Town": "Dirtmouth", "Town": "Dirtmouth",
"Room_shop": "Sly's Shop", "Room_shop": "Sly's Shop",
"Room_Sly_Storeroom": "Sly's Shop Basement", "Room_Sly_Storeroom": "Sly's Shop Basement",
"Room_Town_Stag_Station": "Dirtmouth Stag Station", "Room_Town_Stag_Station": "Dirtmouth Stag Station",
"Room_mapper": "Iselda's Shop", "Room_mapper": "Iselda's Shop",
"Room_Bretta": "Bretta's Room", "Room_Bretta": "Bretta's Room",
"Room_Bretta_Basement": "Bretta's Room Basement", "Room_Bretta_Basement": "Bretta's Room Basement",
"Room_Ouiji": "Jiji's Hut", "Room_Ouiji": "Jiji's Hut",
"Room_Jinn": "Jinn's Hut", "Room_Jinn": "Jinn's Hut",
"Room_Tram_RG": "Upper Tram", "Room_Tram_RG": "Upper Tram",
"Room_Tram": "Lower Tram", "Room_Tram": "Lower Tram",
"Crossroads_01": "Crossroads Well", "Crossroads_01": "Crossroads Well",
"Crossroads_02": "Crossroads Outside Temple", "Crossroads_02": "Crossroads Outside Temple",
"Crossroads_03": "Crossroads Outside Stag", "Crossroads_03": "Crossroads Outside Stag",
"Crossroads_04": "Crossroads Gruz Mother", "Crossroads_04": "Crossroads Gruz Mother",
"Crossroads_05": "Crossroads Central Grub", "Crossroads_05": "Crossroads Central Grub",
"Crossroads_06": "Crossroads Outside Mound", "Crossroads_06": "Crossroads Outside Mound",
"Crossroads_07": "Crossroads Gruzzer", "Crossroads_07": "Crossroads Gruzzer",
"Crossroads_08": "Crossroads Aspid Arena", "Crossroads_08": "Crossroads Aspid Arena",
"Crossroads_09": "Crossroads Mawlek Boss", "Crossroads_09": "Crossroads Mawlek Boss",
"Crossroads_10": "Crossroads False Knight Arena", "Crossroads_10": "Crossroads False Knight Arena",
"Crossroads_11_alt": "Crossroads Greenpath Entrance", "Crossroads_11_alt": "Crossroads Greenpath Entrance",
"Crossroads_12": "Crossroads Corridor to Acid Grub", "Crossroads_12": "Crossroads Corridor to Acid Grub",
"Crossroads_13": "Crossroads Goam Mask Shard", "Crossroads_13": "Crossroads Goam Mask Shard",
"Crossroads_14": "Crossroads Outside Myla", "Crossroads_14": "Crossroads Outside Myla",
"Crossroads_15": "Crossroads Corridor to Tram", "Crossroads_15": "Crossroads Corridor to Tram",
"Crossroads_16": "Crossroads Above Lever", "Crossroads_16": "Crossroads Above Lever",
"Crossroads_18": "Crossroads Fungal Entrance", "Crossroads_18": "Crossroads Fungal Entrance",
"Crossroads_19": "Crossroads Before Gruz Mother", "Crossroads_19": "Crossroads Before Gruz Mother",
"Crossroads_21": "Crossroads Outside False Knight", "Crossroads_21": "Crossroads Outside False Knight",
"Crossroads_22": "Crossroads Glowing Womb Arena", "Crossroads_22": "Crossroads Glowing Womb Arena",
"Crossroads_25": "Crossroads Mawlek Entrance", "Crossroads_25": "Crossroads Mawlek Entrance",
"Crossroads_27": "Crossroads Outside Tram", "Crossroads_27": "Crossroads Outside Tram",
"Crossroads_30": "Crossroads Hot Spring", "Crossroads_30": "Crossroads Hot Spring",
"Crossroads_31": "Crossroads Spike Grub", "Crossroads_31": "Crossroads Spike Grub",
"Crossroads_33": "Crossroads Cornifer", "Crossroads_33": "Crossroads Cornifer",
"Crossroads_35": "Crossroads Acid Grub", "Crossroads_35": "Crossroads Acid Grub",
"Crossroads_36": "Crossroads Mawlek Middle", "Crossroads_36": "Crossroads Mawlek Middle",
"Crossroads_37": "Crossroads Vessel Fragment", "Crossroads_37": "Crossroads Vessel Fragment",
"Crossroads_38": "Crossroads Grubfather", "Crossroads_38": "Crossroads Grubfather",
"Crossroads_39": "Crossroads Corridor Right of Temple", "Crossroads_39": "Crossroads Corridor Right of Temple",
"Crossroads_40": "Crossroads Corridor Right of Central Grub", "Crossroads_40": "Crossroads Corridor Right of Central Grub",
"Crossroads_42": "Crossroads Right Of Mask Shard", "Crossroads_42": "Crossroads Right Of Mask Shard",
"Crossroads_43": "Crossroads Corridor to Elevator", "Crossroads_43": "Crossroads Corridor to Elevator",
"Crossroads_45": "Crossroads Myla", "Crossroads_45": "Crossroads Myla",
"Crossroads_46": "Crossroads Tram", "Crossroads_46": "Crossroads Tram",
"Crossroads_47": "Crossroads Stag", "Crossroads_47": "Crossroads Stag",
"Crossroads_48": "Crossroads Guarded Grub", "Crossroads_48": "Crossroads Guarded Grub",
"Crossroads_49": "Crossroads Elevator", "Crossroads_49": "Crossroads Elevator",
"Crossroads_52": "Crossroads Goam Journal", "Crossroads_52": "Crossroads Goam Journal",
"Crossroads_ShamanTemple": "Crossroads Ancestral Mound", "Crossroads_ShamanTemple": "Crossroads Ancestral Mound",
"Room_Mender_House": "Crossroads Menderbug", "Room_Mender_House": "Crossroads Menderbug",
"Room_Charm_Shop": "Crossroads Salubra", "Room_Charm_Shop": "Crossroads Salubra",
"Room_ruinhouse": "Crossroads Rescue Sly", "Room_ruinhouse": "Crossroads Rescue Sly",
"Room_temple": "Crossroads Inside Temple", "Room_temple": "Crossroads Inside Temple",
"Fungus1_01": "Greenpath Entrance", "Fungus1_01": "Greenpath Entrance",
"Fungus1_01b": "Greenpath Waterfall Bench", "Fungus1_01b": "Greenpath Waterfall Bench",
"Fungus1_02": "Greenpath First Hornet Sighting", "Fungus1_02": "Greenpath First Hornet Sighting",
"Fungus1_03": "Greenpath Storerooms", "Fungus1_03": "Greenpath Storerooms",
"Fungus1_04": "Greenpath Hornet", "Fungus1_04": "Greenpath Hornet",
"Fungus1_05": "Greenpath Outside Thorns", "Fungus1_05": "Greenpath Outside Thorns",
"Fungus1_06": "Greenpath Cornifer", "Fungus1_06": "Greenpath Cornifer",
"Fungus1_07": "Greenpath Outside Hunter", "Fungus1_07": "Greenpath Outside Hunter",
"Fungus1_08": "Greenpath Hunter", "Fungus1_08": "Greenpath Hunter",
"Fungus1_09": "Greenpath Sheo Gauntlet", "Fungus1_09": "Greenpath Sheo Gauntlet",
"Fungus1_10": "Greenpath Acid Bridge", "Fungus1_10": "Greenpath Acid Bridge",
"Fungus1_11": "Greenpath Above Fog Canyon", "Fungus1_11": "Greenpath Above Fog Canyon",
"Fungus1_12": "Greenpath MMC Corridor", "Fungus1_12": "Greenpath MMC Corridor",
"Fungus1_13": "Greenpath Whispering Root", "Fungus1_13": "Greenpath Whispering Root",
"Fungus1_14": "Greenpath Thorns of Agony", "Fungus1_14": "Greenpath Thorns of Agony",
"Fungus1_15": "Greenpath Outside Sheo", "Fungus1_15": "Greenpath Outside Sheo",
"Fungus1_16_alt": "Greenpath Stag", "Fungus1_16_alt": "Greenpath Stag",
"Fungus1_17": "Greenpath Charger Corridor", "Fungus1_17": "Greenpath Charger Corridor",
"Fungus1_19": "Greenpath Above Sanctuary Bench", "Fungus1_19": "Greenpath Above Sanctuary Bench",
"Fungus1_20_v02": "Greenpath Vengefly King", "Fungus1_20_v02": "Greenpath Vengefly King",
"Fungus1_21": "Greenpath Outside Hornet", "Fungus1_21": "Greenpath Outside Hornet",
"Fungus1_22": "Greenpath Outside Stag", "Fungus1_22": "Greenpath Outside Stag",
"Fungus1_25": "Greenpath Corridor to Unn", "Fungus1_25": "Greenpath Corridor to Unn",
"Fungus1_26": "Greenpath Lake Of Unn", "Fungus1_26": "Greenpath Lake Of Unn",
"Fungus1_29": "Greenpath Massive Moss Charger", "Fungus1_29": "Greenpath Massive Moss Charger",
"Fungus1_30": "Greenpath Below Toll Bench", "Fungus1_30": "Greenpath Below Toll Bench",
"Fungus1_31": "Greenpath Toll", "Fungus1_31": "Greenpath Toll",
"Fungus1_32": "Greenpath Moss Knight Arena", "Fungus1_32": "Greenpath Moss Knight Arena",
"Fungus1_34": "Greenpath Stone Sanctuary Entrance", "Fungus1_34": "Greenpath Stone Sanctuary Entrance",
"Fungus1_35": "Greenpath Stone Sanctuary", "Fungus1_35": "Greenpath Stone Sanctuary",
"Fungus1_36": "Greenpath Stone Sanctuary Mask Shard", "Fungus1_36": "Greenpath Stone Sanctuary Mask Shard",
"Fungus1_37": "Greenpath Sanctuary Bench", "Fungus1_37": "Greenpath Sanctuary Bench",
"Fungus1_Slug": "Greenpath Unn", "Fungus1_Slug": "Greenpath Unn",
"Room_nailmaster_02": "Greenpath Sheo", "Room_nailmaster_02": "Greenpath Sheo",
"Room_Slug_Shrine": "Greenpath Unn Bench", "Room_Slug_Shrine": "Greenpath Unn Bench",
"Deepnest_01": "Fungal_Deepnest_Fall", "Deepnest_01": "Fungal_Deepnest_Fall",
"Fungus2_01": "Fungal_Queen's_Station", "Fungus2_01": "Fungal_Queen's_Station",
"Fungus2_02": "Fungal_Queen's_Stag", "Fungus2_02": "Fungal_Queen's_Stag",
"Fungus2_03": "Fungal_Outside_Queen's", "Fungus2_03": "Fungal_Outside_Queen's",
"Fungus2_04": "Fungal_Below_Ogres", "Fungus2_04": "Fungal_Below_Ogres",
"Fungus2_05": "Fungal_Shrumal_Ogres", "Fungus2_05": "Fungal_Shrumal_Ogres",
"Fungus2_06": "Fungal_Outside_Leg_Eater", "Fungus2_06": "Fungal_Outside_Leg_Eater",
"Fungus2_07": "Fungal_Shrumal_Warrior_Acid_Bridge", "Fungus2_07": "Fungal_Shrumal_Warrior_Acid_Bridge",
"Fungus2_08": "Fungal_Outside_Elder_Hu", "Fungus2_08": "Fungal_Outside_Elder_Hu",
"Fungus2_09": "Fungal_Cloth_Corridor", "Fungus2_09": "Fungal_Cloth_Corridor",
"Fungus2_10": "Fungal_Left_Of_Pilgrim's_Way", "Fungus2_10": "Fungal_Left_Of_Pilgrim's_Way",
"Fungus2_11": "Fungal_Right_of_Bouncy_Grub", "Fungus2_11": "Fungal_Right_of_Bouncy_Grub",
"Fungus2_12": "Fungal_Mantis_Corridor", "Fungus2_12": "Fungal_Mantis_Corridor",
"Fungus2_13": "Fungal_Bretta_Bench", "Fungus2_13": "Fungal_Bretta_Bench",
"Fungus2_14": "Fungal_Mantis_Village", "Fungus2_14": "Fungal_Mantis_Village",
"Fungus2_15": "Fungal_Mantis_Lords", "Fungus2_15": "Fungal_Mantis_Lords",
"Fungus2_17": "Fungal_Above_Mantis_Village", "Fungus2_17": "Fungal_Above_Mantis_Village",
"Fungus2_18": "Fungal_Cornifer", "Fungus2_18": "Fungal_Cornifer",
"Fungus2_19": "Fungal_Right_Of_Spore_Shroom", "Fungus2_19": "Fungal_Right_Of_Spore_Shroom",
"Fungus2_20": "Fungal_Spore_Shroom", "Fungus2_20": "Fungal_Spore_Shroom",
"Fungus2_21": "Fungal_Pilgrim's_Way", "Fungus2_21": "Fungal_Pilgrim's_Way",
"Fungus2_23": "Fungal_Dashmaster", "Fungus2_23": "Fungal_Dashmaster",
"Fungus2_26": "Fungal_Leg_Eater", "Fungus2_26": "Fungal_Leg_Eater",
"Fungus2_28": "Fungal_Shrumal_Warrior_Loop", "Fungus2_28": "Fungal_Shrumal_Warrior_Loop",
"Fungus2_29": "Fungal_Core_Upper", "Fungus2_29": "Fungal_Core_Upper",
"Fungus2_30": "Fungal_Core_Lower", "Fungus2_30": "Fungal_Core_Lower",
"Fungus2_31": "Fungal_Mantis_Rewards", "Fungus2_31": "Fungal_Mantis_Rewards",
"Fungus2_32": "Fungal_Elder_Hu", "Fungus2_32": "Fungal_Elder_Hu",
"Fungus2_33": "Fungal_Leg_Eater_Root", "Fungus2_33": "Fungal_Leg_Eater_Root",
"Fungus2_34": "Fungal_Willoh", "Fungus2_34": "Fungal_Willoh",
"Fungus3_01": "Fog_Upper_West_Tall", "Fungus3_01": "Fog_Upper_West_Tall",
"Fungus3_02": "Fog_Lower_West_Tall", "Fungus3_02": "Fog_Lower_West_Tall",
"Fungus3_03": "Fog_Queen's_Gardens_Acid_Entrance", "Fungus3_03": "Fog_Queen's_Gardens_Acid_Entrance",
"Fungus3_24": "Fog_Corridor_to_Overgrown_Mound", "Fungus3_24": "Fog_Corridor_to_Overgrown_Mound",
"Fungus3_25": "Fog_Cornifer", "Fungus3_25": "Fog_Cornifer",
"Fungus3_25b": "Fog_Corridor_to_Cornifer", "Fungus3_25b": "Fog_Corridor_to_Cornifer",
"Fungus3_26": "Fog_East_Tall", "Fungus3_26": "Fog_East_Tall",
"Fungus3_27": "Fog_Corridor_to_Archives", "Fungus3_27": "Fog_Corridor_to_Archives",
"Fungus3_28": "Fog_Charm_Notch", "Fungus3_28": "Fog_Charm_Notch",
"Fungus3_30": "Fog_Lifeblood", "Fungus3_30": "Fog_Lifeblood",
"Fungus3_35": "Fog_Millibelle", "Fungus3_35": "Fog_Millibelle",
"Fungus3_44": "Fog_Overgrown_Mound_Entrance", "Fungus3_44": "Fog_Overgrown_Mound_Entrance",
"Fungus3_47": "Fog_Archives_Entrance", "Fungus3_47": "Fog_Archives_Entrance",
"Fungus3_archive": "Fog_Archives_Bench", "Fungus3_archive": "Fog_Archives_Bench",
"Fungus3_archive_02": "Fog_Uumuu_Arena", "Fungus3_archive_02": "Fog_Uumuu_Arena",
"Room_Fungus_Shaman": "Fog_Overgrown_Mound", "Room_Fungus_Shaman": "Fog_Overgrown_Mound",
"Cliffs_01": "Cliffs_Main", "Cliffs_01": "Cliffs_Main",
"Cliffs_02": "Cliffs_Gorb", "Cliffs_02": "Cliffs_Gorb",
"Cliffs_03": "Cliffs_Stag_Nest", "Cliffs_03": "Cliffs_Stag_Nest",
"Cliffs_04": "Cliffs_Joni's_Dark", "Cliffs_04": "Cliffs_Joni's_Dark",
"Cliffs_05": "Cliffs_Joni's_Pickup", "Cliffs_05": "Cliffs_Joni's_Pickup",
"Cliffs_06": "Cliffs_Grimm_Lantern", "Cliffs_06": "Cliffs_Grimm_Lantern",
"Fungus1_28": "Cliffs_Baldur's_Shell", "Fungus1_28": "Cliffs_Baldur's_Shell",
"Room_nailmaster": "Cliffs_Mato", "Room_nailmaster": "Cliffs_Mato",
"Mines_01": "Crystal_Dive_Entrance", "Mines_01": "Crystal_Dive_Entrance",
"Mines_02": "Crystal_Dark_Entrance", "Mines_02": "Crystal_Dark_Entrance",
"Mines_03": "Crystal_Spike_Grub", "Mines_03": "Crystal_Spike_Grub",
"Mines_04": "Crystal_Entrance_Conveyors", "Mines_04": "Crystal_Entrance_Conveyors",
"Mines_05": "Crystal_Above_Spike_Grub", "Mines_05": "Crystal_Above_Spike_Grub",
"Mines_06": "Crystal_Deep_Focus_Gauntlet", "Mines_06": "Crystal_Deep_Focus_Gauntlet",
"Mines_07": "Crystal_Dark_Room", "Mines_07": "Crystal_Dark_Room",
"Mines_10": "Crystal_Elevator_Entrance", "Mines_10": "Crystal_Elevator_Entrance",
"Mines_11": "Crystal_Left_Of_Guardian", "Mines_11": "Crystal_Left_Of_Guardian",
"Mines_13": "Crystal_Top_Corridor", "Mines_13": "Crystal_Top_Corridor",
"Mines_16": "Crystal_Mimic", "Mines_16": "Crystal_Mimic",
"Mines_17": "Crystal_Corridor_to_Spike_Grub", "Mines_17": "Crystal_Corridor_to_Spike_Grub",
"Mines_18": "Crystal_Guardian_Bench", "Mines_18": "Crystal_Guardian_Bench",
"Mines_19": "Crystal_Grub_Crushers", "Mines_19": "Crystal_Grub_Crushers",
"Mines_20": "Crystal_East_Tall", "Mines_20": "Crystal_East_Tall",
"Mines_23": "Crystal_Crown_Whispering_Root", "Mines_23": "Crystal_Crown_Whispering_Root",
"Mines_24": "Crystal_Crown_Grub", "Mines_24": "Crystal_Crown_Grub",
"Mines_25": "Crystal_Crown_Climb", "Mines_25": "Crystal_Crown_Climb",
"Mines_28": "Crystal_Outside_Mound", "Mines_28": "Crystal_Outside_Mound",
"Mines_29": "Crystal_Dark_Bench", "Mines_29": "Crystal_Dark_Bench",
"Mines_30": "Crystal_Cornifer", "Mines_30": "Crystal_Cornifer",
"Mines_31": "Crystal_Crystal_Heart_Gauntlet", "Mines_31": "Crystal_Crystal_Heart_Gauntlet",
"Mines_32": "Crystal_Enraged_Guardian_Arena", "Mines_32": "Crystal_Enraged_Guardian_Arena",
"Mines_33": "Crossroads_Peak_Dark_Toll", "Mines_33": "Crossroads_Peak_Dark_Toll",
"Mines_34": "Crystal_Crown_Peak", "Mines_34": "Crystal_Crown_Peak",
"Mines_35": "Crystal_Mound", "Mines_35": "Crystal_Mound",
"Mines_36": "Crystal_Deep_Focus", "Mines_36": "Crystal_Deep_Focus",
"Mines_37": "Crystal_Chest_Crushers", "Mines_37": "Crystal_Chest_Crushers",
"Abyss_02": "Basin_Broken_Bridge", "Abyss_02": "Basin_Broken_Bridge",
"Abyss_03": "Basin_Tram", "Abyss_03": "Basin_Tram",
"Abyss_04": "Basin_Fountain", "Abyss_04": "Basin_Fountain",
"Abyss_05": "Basin_Palace_Grounds", "Abyss_05": "Basin_Palace_Grounds",
"Abyss_17": "Basin_Cloth", "Abyss_17": "Basin_Cloth",
"Abyss_18": "Basin_Corridor_to_Broken_Vessel", "Abyss_18": "Basin_Corridor_to_Broken_Vessel",
"Abyss_19": "Basin_Broken_Vessel_Grub", "Abyss_19": "Basin_Broken_Vessel_Grub",
"Abyss_20": "Basin_Simple_Key", "Abyss_20": "Basin_Simple_Key",
"Abyss_21": "Basin_Monarch_Wings", "Abyss_21": "Basin_Monarch_Wings",
"Abyss_22": "Basin_Hidden_Station", "Abyss_22": "Basin_Hidden_Station",
"Abyss_06_Core": "Abyss_Core", "Abyss_06_Core": "Abyss_Core",
"Abyss_08": "Abyss_Lifeblood_Core", "Abyss_08": "Abyss_Lifeblood_Core",
"Abyss_09": "Abyss_Lighthouse_Climb", "Abyss_09": "Abyss_Lighthouse_Climb",
"Abyss_10": "Abyss_Shade_Cloak", "Abyss_10": "Abyss_Shade_Cloak",
"Abyss_12": "Abyss_Shriek", "Abyss_12": "Abyss_Shriek",
"Abyss_15": "Abyss_Birthplace", "Abyss_15": "Abyss_Birthplace",
"Abyss_16": "Abyss_Corridor_to_Lighthouse", "Abyss_16": "Abyss_Corridor_to_Lighthouse",
"Abyss_Lighthouse_room": "Abyss_Lighthouse", "Abyss_Lighthouse_room": "Abyss_Lighthouse",
"Crossroads_46b": "Grounds_Tram", "Crossroads_46b": "Grounds_Tram",
"Crossroads_50": "Grounds_Blue_Lake", "Crossroads_50": "Grounds_Blue_Lake",
"RestingGrounds_02": "Grounds_Xero", "RestingGrounds_02": "Grounds_Xero",
"RestingGrounds_04": "Grounds_Dream_Nail_Entrance", "RestingGrounds_04": "Grounds_Dream_Nail_Entrance",
"RestingGrounds_05": "Grounds_Whispering_Root", "RestingGrounds_05": "Grounds_Whispering_Root",
"RestingGrounds_06": "Grounds_Corridor_Below_Xero", "RestingGrounds_06": "Grounds_Corridor_Below_Xero",
"RestingGrounds_07": "Grounds_Seer", "RestingGrounds_07": "Grounds_Seer",
"RestingGrounds_08": "Grounds_Spirit's_Glade", "RestingGrounds_08": "Grounds_Spirit's_Glade",
"RestingGrounds_09": "Grounds_Stag", "RestingGrounds_09": "Grounds_Stag",
"RestingGrounds_10": "Grounds_Crypts", "RestingGrounds_10": "Grounds_Crypts",
"RestingGrounds_12": "Grounds_Outside_Grey_Mourner", "RestingGrounds_12": "Grounds_Outside_Grey_Mourner",
"RestingGrounds_17": "Grounds_Dreamshield", "RestingGrounds_17": "Grounds_Dreamshield",
"Room_Mansion": "Grounds_Grey_Mourner", "Room_Mansion": "Grounds_Grey_Mourner",
"Ruins2_10": "Grounds_Elevator", "Ruins2_10": "Grounds_Elevator",
"Abyss_03_c": "Edge_Tram", "Abyss_03_c": "Edge_Tram",
"Deepnest_East_01": "Edge_Left_Of_Hive", "Deepnest_East_01": "Edge_Left_Of_Hive",
"Deepnest_East_02": "Edge_Above_Hive", "Deepnest_East_02": "Edge_Above_Hive",
"Deepnest_East_03": "Edge_Entrance", "Deepnest_East_03": "Edge_Entrance",
"Deepnest_East_04": "Edge_Bardoon", "Deepnest_East_04": "Edge_Bardoon",
"Deepnest_East_06": "Edge_Outside_Oro", "Deepnest_East_06": "Edge_Outside_Oro",
"Deepnest_East_07": "Edge_Whispering_Root", "Deepnest_East_07": "Edge_Whispering_Root",
"Deepnest_East_08": "Edge_Great_Hopper_Idol", "Deepnest_East_08": "Edge_Great_Hopper_Idol",
"Deepnest_East_09": "Edge_Corridor_Outside_Colosseum", "Deepnest_East_09": "Edge_Corridor_Outside_Colosseum",
"Deepnest_East_10": "Edge_Markoth_Arena", "Deepnest_East_10": "Edge_Markoth_Arena",
"Deepnest_East_11": "Edge_Below_Camp_Bench", "Deepnest_East_11": "Edge_Below_Camp_Bench",
"Deepnest_East_12": "Edge_Hornet_Sentinel_Corridor", "Deepnest_East_12": "Edge_Hornet_Sentinel_Corridor",
"Deepnest_East_13": "Edge_Camp_Bench", "Deepnest_East_13": "Edge_Camp_Bench",
"Deepnest_East_14": "Edge_Below_Oro", "Deepnest_East_14": "Edge_Below_Oro",
"Deepnest_East_14b": "Edge_Quick_Slash", "Deepnest_East_14b": "Edge_Quick_Slash",
"Deepnest_East_15": "Edge_Lifeblood", "Deepnest_East_15": "Edge_Lifeblood",
"Deepnest_East_16": "Edge_Oro_Scarecrow", "Deepnest_East_16": "Edge_Oro_Scarecrow",
"Deepnest_East_17": "Edge_420_Geo_Rock", "Deepnest_East_17": "Edge_420_Geo_Rock",
"Deepnest_East_18": "Edge_Outside_Markoth", "Deepnest_East_18": "Edge_Outside_Markoth",
"Deepnest_East_Hornet": "Edge_Hornet_Sentinel_Arena", "Deepnest_East_Hornet": "Edge_Hornet_Sentinel_Arena",
"GG_Lurker": "Edge_Pale_Lurker", "GG_Lurker": "Edge_Pale_Lurker",
"Room_Colosseum_01": "Edge_Colo_Entrance", "Room_Colosseum_01": "Edge_Colo_Entrance",
"Room_Colosseum_02": "Edge_Colo_Bench", "Room_Colosseum_02": "Edge_Colo_Bench",
"Room_Colosseum_Bronze": "Edge_Colo_1_Arena", "Room_Colosseum_Bronze": "Edge_Colo_1_Arena",
"Room_Colosseum_Gold": "Edge_Colo_3_Arena", "Room_Colosseum_Gold": "Edge_Colo_3_Arena",
"Room_Colosseum_Silver": "Edge_Colo_2_Arena", "Room_Colosseum_Silver": "Edge_Colo_2_Arena",
"Room_Colosseum_Spectate": "Edge_Colo_Spectate", "Room_Colosseum_Spectate": "Edge_Colo_Spectate",
"Room_nailmaster_03": "Edge_Oro", "Room_nailmaster_03": "Edge_Oro",
"Room_Wyrm": "Edge_Cast-Off_Shell", "Room_Wyrm": "Edge_Cast-Off_Shell",
"Abyss_01": "City_Broken_Elevator", "Abyss_01": "City_Broken_Elevator",
"Crossroads_49b": "City_Left_Elevator", "Crossroads_49b": "City_Left_Elevator",
"Room_nailsmith": "City_Nailsmith", "Room_nailsmith": "City_Nailsmith",
"Ruins_Bathhouse": "City_Pleasure_House_Bench", "Ruins_Bathhouse": "City_Pleasure_House_Bench",
"Ruins_Elevator": "City_Pleasure_House_Elevator", "Ruins_Elevator": "City_Pleasure_House_Elevator",
"Ruins_House_01": "City_Guarded_Grub", "Ruins_House_01": "City_Guarded_Grub",
"Ruins_House_02": "City_Gorgeous_Husk", "Ruins_House_02": "City_Gorgeous_Husk",
"Ruins_House_03": "City_Emilitia", "Ruins_House_03": "City_Emilitia",
"Ruins1_01": "City_Pilgrim's_Entrance", "Ruins1_01": "City_Pilgrim's_Entrance",
"Ruins1_02": "City_Quirrel_Bench", "Ruins1_02": "City_Quirrel_Bench",
"Ruins1_03": "City_Rafters", "Ruins1_03": "City_Rafters",
"Ruins1_04": "City_Outside_Nailsmith", "Ruins1_04": "City_Outside_Nailsmith",
"Ruins1_05": "City_Grub_Above_Lemm", "Ruins1_05": "City_Grub_Above_Lemm",
"Ruins1_05b": "City_Lemm", "Ruins1_05b": "City_Lemm",
"Ruins1_05c": "City_Egg_Above_Lemm", "Ruins1_05c": "City_Egg_Above_Lemm",
"Ruins1_06": "City_Corridor_to_Storerooms", "Ruins1_06": "City_Corridor_to_Storerooms",
"Ruins1_09": "City_Soul_Twister_Arena", "Ruins1_09": "City_Soul_Twister_Arena",
"Ruins1_17": "City_Whispering_Root", "Ruins1_17": "City_Whispering_Root",
"Ruins1_18": "City_Corridor_to_Spire", "Ruins1_18": "City_Corridor_to_Spire",
"Ruins1_23": "City_Sanctum_Entrance", "Ruins1_23": "City_Sanctum_Entrance",
"Ruins1_24": "City_Soul_Master_Arena", "Ruins1_24": "City_Soul_Master_Arena",
"Ruins1_25": "City_Sanctum_East_Elevators", "Ruins1_25": "City_Sanctum_East_Elevators",
"Ruins1_27": "City_Hollow_Knight_Fountain", "Ruins1_27": "City_Hollow_Knight_Fountain",
"Ruins1_28": "City_Storerooms", "Ruins1_28": "City_Storerooms",
"Ruins1_29": "City_Storerooms_Stag", "Ruins1_29": "City_Storerooms_Stag",
"Ruins1_30": "City_Sanctum_Spell_Twister", "Ruins1_30": "City_Sanctum_Spell_Twister",
"Ruins1_31": "City_Toll_Bench", "Ruins1_31": "City_Toll_Bench",
"Ruins1_31b": "City_Shade_Soul_Arena", "Ruins1_31b": "City_Shade_Soul_Arena",
"Ruins1_32": "City_Soul_Master_Rewards", "Ruins1_32": "City_Soul_Master_Rewards",
"Ruins2_01": "City_Spire_Second_Floor", "Ruins2_01": "City_Spire_Second_Floor",
"Ruins2_01_b": "City_Spire_First_Floor", "Ruins2_01_b": "City_Spire_First_Floor",
"Ruins2_03": "City_Spire_Fourth_Floor", "Ruins2_03": "City_Spire_Fourth_Floor",
"Ruins2_03b": "City_Spire_Third_Floor", "Ruins2_03b": "City_Spire_Third_Floor",
"Ruins2_04": "City_Right_Hub", "Ruins2_04": "City_Right_Hub",
"Ruins2_05": "City_Above_King's", "Ruins2_05": "City_Above_King's",
"Ruins2_06": "City_King's_Station", "Ruins2_06": "City_King's_Station",
"Ruins2_07": "City_Grub_Below_King's", "Ruins2_07": "City_Grub_Below_King's",
"Ruins2_08": "City_King's_Stag", "Ruins2_08": "City_King's_Stag",
"Ruins2_09": "City_King's_Vessel_Fragment", "Ruins2_09": "City_King's_Vessel_Fragment",
"Ruins2_10b": "City_Right_Elevator", "Ruins2_10b": "City_Right_Elevator",
"Ruins2_11": "City_Collector_Arena", "Ruins2_11": "City_Collector_Arena",
"Ruins2_11_b": "City_Tower_of_Love", "Ruins2_11_b": "City_Tower_of_Love",
"Ruins2_Watcher_Room": "City_Lurien_Elevator", "Ruins2_Watcher_Room": "City_Lurien_Elevator",
"Hive_01": "Hive_Entrance", "Hive_01": "Hive_Entrance",
"Hive_02": "Hive_Whispering_Root", "Hive_02": "Hive_Whispering_Root",
"Hive_03": "Hive_Outside_Grub", "Hive_03": "Hive_Outside_Grub",
"Hive_03_c": "Hive_Outside_Shortcut", "Hive_03_c": "Hive_Outside_Shortcut",
"Hive_04": "Hive_Mask_Shard", "Hive_04": "Hive_Mask_Shard",
"Hive_05": "Hive_Knight_Arena", "Hive_05": "Hive_Knight_Arena",
"GG_Pipeway": "Waterways_Flukemunga_Corridor", "GG_Pipeway": "Waterways_Flukemunga_Corridor",
"GG_Waterways": "Waterways_Junk_Pit", "GG_Waterways": "Waterways_Junk_Pit",
"Room_GG_Shortcut": "Waterways_Fluke_Hermit", "Room_GG_Shortcut": "Waterways_Fluke_Hermit",
"Waterways_01": "Waterways_Entrance", "Waterways_01": "Waterways_Entrance",
"Waterways_02": "Waterways_Main_Bench", "Waterways_02": "Waterways_Main_Bench",
"Waterways_03": "Waterways_Tuk", "Waterways_03": "Waterways_Tuk",
"Waterways_04": "Waterways_Hidden_Grub", "Waterways_04": "Waterways_Hidden_Grub",
"Waterways_04b": "Waterways_Mask_Shard", "Waterways_04b": "Waterways_Mask_Shard",
"Waterways_05": "Waterways_Dung_Defender_Arena", "Waterways_05": "Waterways_Dung_Defender_Arena",
"Waterways_06": "Waterways_Corridor_to_Broken_Elevator", "Waterways_06": "Waterways_Corridor_to_Broken_Elevator",
"Waterways_07": "Waterways_Left_Of_Isma's_Grove", "Waterways_07": "Waterways_Left_Of_Isma's_Grove",
"Waterways_08": "Waterways_Outside_Flukemarm", "Waterways_08": "Waterways_Outside_Flukemarm",
"Waterways_09": "Waterways_Cornifer", "Waterways_09": "Waterways_Cornifer",
"Waterways_12": "Waterways_Flukemarm_Arena", "Waterways_12": "Waterways_Flukemarm_Arena",
"Waterways_13": "Waterways_Isma's_Grove", "Waterways_13": "Waterways_Isma's_Grove",
"Waterways_14": "Waterways_Edge_Acid_Corridor", "Waterways_14": "Waterways_Edge_Acid_Corridor",
"Waterways_15": "Waterways_Dung_Defender's_Cave", "Waterways_15": "Waterways_Dung_Defender's_Cave",
"Abyss_03_b": "Deepnest_Tram", "Abyss_03_b": "Deepnest_Tram",
"Deepnest_01b": "Deepnest_Upper_Cornifer", "Deepnest_01b": "Deepnest_Upper_Cornifer",
"Deepnest_02": "Deepnest_Outside_Mimics", "Deepnest_02": "Deepnest_Outside_Mimics",
"Deepnest_03": "Deepnest_Left_Of_Hot_Spring", "Deepnest_03": "Deepnest_Left_Of_Hot_Spring",
"Deepnest_09": "Deepnest_Distant_Village_Stag", "Deepnest_09": "Deepnest_Distant_Village_Stag",
"Deepnest_10": "Deepnest_Distant_Village", "Deepnest_10": "Deepnest_Distant_Village",
"Deepnest_14": "Deepnest_Failed_Tramway_Bench", "Deepnest_14": "Deepnest_Failed_Tramway_Bench",
"Deepnest_16": "Deepnest_After_Lower_Cornifer", "Deepnest_16": "Deepnest_After_Lower_Cornifer",
"Deepnest_17": "Deepnest_Garpede_Corridor_Below_Cornifer", "Deepnest_17": "Deepnest_Garpede_Corridor_Below_Cornifer",
"Deepnest_26": "Deepnest_Failed_Tramway_Lifeblood", "Deepnest_26": "Deepnest_Failed_Tramway_Lifeblood",
"Deepnest_26b": "Deepnest_Tram_Pass", "Deepnest_26b": "Deepnest_Tram_Pass",
"Deepnest_30": "Deepnest_Hot_Spring", "Deepnest_30": "Deepnest_Hot_Spring",
"Deepnest_31": "Deepnest_Nosk_Corridor", "Deepnest_31": "Deepnest_Nosk_Corridor",
"Deepnest_32": "Deepnest_Nosk_Arena", "Deepnest_32": "Deepnest_Nosk_Arena",
"Deepnest_33": "Deepnest_Zote_Arena", "Deepnest_33": "Deepnest_Zote_Arena",
"Deepnest_34": "Deepnest_First_Devout", "Deepnest_34": "Deepnest_First_Devout",
"Deepnest_35": "Deepnest_Outside_Galien", "Deepnest_35": "Deepnest_Outside_Galien",
"Deepnest_36": "Deepnest_Mimics", "Deepnest_36": "Deepnest_Mimics",
"Deepnest_37": "Deepnest_Corridor_to_Tram", "Deepnest_37": "Deepnest_Corridor_to_Tram",
"Deepnest_38": "Deepnest_Vessel_Fragment", "Deepnest_38": "Deepnest_Vessel_Fragment",
"Deepnest_39": "Deepnest_Whispering_Root", "Deepnest_39": "Deepnest_Whispering_Root",
"Deepnest_40": "Deepnest_Galien_Arena", "Deepnest_40": "Deepnest_Galien_Arena",
"Deepnest_41": "Deepnest_Midwife", "Deepnest_41": "Deepnest_Midwife",
"Deepnest_42": "Deepnest_Outside_Mask_Maker", "Deepnest_42": "Deepnest_Outside_Mask_Maker",
"Deepnest_44": "Deepnest_Sharp_Shadow", "Deepnest_44": "Deepnest_Sharp_Shadow",
"Deepnest_45_v02": "Deepnest_Weaver's_Den", "Deepnest_45_v02": "Deepnest_Weaver's_Den",
"Deepnest_Spider_Town": "Deepnest_Beast's_Den", "Deepnest_Spider_Town": "Deepnest_Beast's_Den",
"Fungus2_25": "Deepnest_Lower_Cornifer", "Fungus2_25": "Deepnest_Lower_Cornifer",
"Room_Mask_Maker": "Deepnest_Mask_Maker", "Room_Mask_Maker": "Deepnest_Mask_Maker",
"Room_spider_small": "Deepnest_Brumm", "Room_spider_small": "Deepnest_Brumm",
"Deepnest_43": "Gardens_Corridor_To_Deepnest", "Deepnest_43": "Gardens_Corridor_To_Deepnest",
"Fungus1_23": "Gardens_First_Loodle_Corridor", "Fungus1_23": "Gardens_First_Loodle_Corridor",
"Fungus1_24": "Gardens_Cornifer", "Fungus1_24": "Gardens_Cornifer",
"Fungus3_04": "Gardens_Before_Petra_Arena", "Fungus3_04": "Gardens_Before_Petra_Arena",
"Fungus3_05": "Gardens_Petra_Arena", "Fungus3_05": "Gardens_Petra_Arena",
"Fungus3_08": "Gardens_Lower_Petra_Corridor", "Fungus3_08": "Gardens_Lower_Petra_Corridor",
"Fungus3_10": "Gardens_Main_Arena", "Fungus3_10": "Gardens_Main_Arena",
"Fungus3_11": "Gardens_Whispering_Root", "Fungus3_11": "Gardens_Whispering_Root",
"Fungus3_13": "Gardens_Outside_Stag", "Fungus3_13": "Gardens_Outside_Stag",
"Fungus3_21": "Gardens_Corridor_to_Traitor_Lord", "Fungus3_21": "Gardens_Corridor_to_Traitor_Lord",
"Fungus3_22": "Gardens_Upper_Grub", "Fungus3_22": "Gardens_Upper_Grub",
"Fungus3_23": "Gardens_Traitor_Lord_Arena", "Fungus3_23": "Gardens_Traitor_Lord_Arena",
"Fungus3_34": "Gardens_Entrance", "Fungus3_34": "Gardens_Entrance",
"Fungus3_39": "Gardens_Moss_Prophet", "Fungus3_39": "Gardens_Moss_Prophet",
"Fungus3_49": "Gardens_Traitor's_Child's_Grave", "Fungus3_49": "Gardens_Traitor's_Child's_Grave",
"Fungus3_40": "Gardens_Gardens_Stag", "Fungus3_40": "Gardens_Gardens_Stag",
"Fungus3_48": "Gardens_Outside_White_Lady", "Fungus3_48": "Gardens_Outside_White_Lady",
"Fungus3_50": "Gardens_Toll_Bench", "Fungus3_50": "Gardens_Toll_Bench",
"Room_Queen": "Gardens_White_Lady", "Room_Queen": "Gardens_White_Lady",
"White_Palace_01": "Palace_Entrance", "White_Palace_01": "Palace_Entrance",
"White_Palace_02": "Palace_First_Mold", "White_Palace_02": "Palace_First_Mold",
"White_Palace_03_hub": "Palace_Hub", "White_Palace_03_hub": "Palace_Hub",
"White_Palace_04": "Palace_Left_Of_Hub", "White_Palace_04": "Palace_Left_Of_Hub",
"White_Palace_05": "Palace_Saw_Room", "White_Palace_05": "Palace_Saw_Room",
"White_Palace_06": "Palace_Balcony", "White_Palace_06": "Palace_Balcony",
"White_Palace_07": "Palace_Lamp_Pogo", "White_Palace_07": "Palace_Lamp_Pogo",
"White_Palace_08": "Palace_Workshop", "White_Palace_08": "Palace_Workshop",
"White_Palace_09": "Palace_Throne", "White_Palace_09": "Palace_Throne",
"White_Palace_11": "Palace_Outside", "White_Palace_11": "Palace_Outside",
"White_Palace_12": "Palace_Spike_Drop", "White_Palace_12": "Palace_Spike_Drop",
"White_Palace_13": "Palace_Thorn_Jump", "White_Palace_13": "Palace_Thorn_Jump",
"White_Palace_14": "Palace_Hell_Corridor", "White_Palace_14": "Palace_Hell_Corridor",
"White_Palace_15": "Palace_Caged_Lever", "White_Palace_15": "Palace_Caged_Lever",
"White_Palace_16": "Palace_Saw_Climb", "White_Palace_16": "Palace_Saw_Climb",
"White_Palace_17": "POP_Lever", "White_Palace_17": "POP_Lever",
"White_Palace_18": "POP_Entrance", "White_Palace_18": "POP_Entrance",
"White_Palace_19": "POP_Vertical", "White_Palace_19": "POP_Vertical",
"White_Palace_20": "POP_Final", "White_Palace_20": "POP_Final",
"Dream_Final_Boss": "Egg_Radiance", "Dream_Final_Boss": "Egg_Radiance",
"Room_Final_Boss_Atrium": "Egg_Bench", "Room_Final_Boss_Atrium": "Egg_Bench",
"Room_Final_Boss_Core": "Egg_Hollow_Knight", "Room_Final_Boss_Core": "Egg_Hollow_Knight",
"Grimm_Divine": "Grimm_Divine", "Grimm_Divine": "Grimm_Divine",
"Grimm_Main_Tent": "Grimm_Tent", "Grimm_Main_Tent": "Grimm_Tent",
"Grimm_Nightmare": "Grimm_NKG", "Grimm_Nightmare": "Grimm_NKG",
"Dream_01_False_Knight": "Dream_Failed_Champion", "Dream_01_False_Knight": "Dream_Failed_Champion",
"Dream_02_Mage_Lord": "Dream_Soul_Tyrant", "Dream_02_Mage_Lord": "Dream_Soul_Tyrant",
"Dream_03_Infected_Knight": "Dream_Lost_Kin", "Dream_03_Infected_Knight": "Dream_Lost_Kin",
"Dream_04_White_Defender": "Dream_White_Defender", "Dream_04_White_Defender": "Dream_White_Defender",
"Dream_Abyss": "Dream_Abyss", "Dream_Abyss": "Dream_Abyss",
"Dream_Backer_Shrine": "Dream_Outside_Shrine", "Dream_Backer_Shrine": "Dream_Outside_Shrine",
"Dream_Guardian_Hegemol": "Dream_Herrah", "Dream_Guardian_Hegemol": "Dream_Herrah",
"Dream_Guardian_Lurien": "Dream_Lurien", "Dream_Guardian_Lurien": "Dream_Lurien",
"Dream_Guardian_Monomon": "Dream_Monomon", "Dream_Guardian_Monomon": "Dream_Monomon",
"Dream_Mighty_Zote": "Dream_Grey_Prince_Zote", "Dream_Mighty_Zote": "Dream_Grey_Prince_Zote",
"Dream_Nailcollection": "Dream_Nail", "Dream_Nailcollection": "Dream_Nail",
"Dream_Room_Believer_Shrine": "Dream_Shrine_of_Believers", "Dream_Room_Believer_Shrine": "Dream_Shrine_of_Believers",
"GG_Atrium": "Godhome_Atrium", "GG_Atrium": "Godhome_Atrium",
"GG_Atrium_Roof": "Godhome_Roof", "GG_Atrium_Roof": "Godhome_Roof",
"GG_Blue_Room": "Godhome_Lifeblood", "GG_Blue_Room": "Godhome_Lifeblood",
"GG_Land_Of_Storms": "Godhome_Land_Of_Storms", "GG_Land_Of_Storms": "Godhome_Land_Of_Storms",
"GG_Mighty_Zote": "GG_Enchanting_Vigorous_Diligent_Overwhelming_Gorgeous_Passionate_Terrifying_Beautiful_Zote", "GG_Mighty_Zote": "GG_Enchanting_Vigorous_Diligent_Overwhelming_Gorgeous_Passionate_Terrifying_Beautiful_Zote",
"GG_Unlock_Wastes": "Godhome_Godtuner", "GG_Unlock_Wastes": "Godhome_Godtuner",
"GG_Workshop": "Godhome_Hall_Of_Gods" "GG_Workshop": "Godhome_Hall_Of_Gods"
}; };
export default MAP; export default MAP;

View file

@ -10,13 +10,13 @@ import MAP from "./hk-dictionary.js";
* @return {number} length of the Object * @return {number} length of the Object
*/ */
function ObjectLength(object) { function ObjectLength(object) {
let length = 0; let length = 0;
for (let key in object) { for (let key in object) {
if (object.hasOwnProperty(key)) { if (object.hasOwnProperty(key)) {
++length; ++length;
}
} }
return length; }
return length;
} }
/** /**
@ -26,15 +26,15 @@ function ObjectLength(object) {
*/ */
function TranslateMapName(mapCode, dictionary = MAP) { function TranslateMapName(mapCode, dictionary = MAP) {
let translation = mapCode; let translation = mapCode;
if (dictionary.hasOwnProperty(mapCode)) translation = dictionary[mapCode]; if (dictionary.hasOwnProperty(mapCode)) translation = dictionary[mapCode];
return translation; return translation;
} }
/* ------------------------- Exports ------------------------------- */ /* ------------------------- Exports ------------------------------- */
export { export {
ObjectLength, ObjectLength,
TranslateMapName TranslateMapName
}; };

File diff suppressed because it is too large Load diff