Grimmchild/Carefree Melody detection

This commit is contained in:
ReznoRMichael 2021-07-12 00:29:09 +02:00
parent 30e48c4ee8
commit 3d556c1bc8
4 changed files with 192 additions and 26 deletions

View file

@ -60,16 +60,42 @@ var divStartCenter = ["<div class='flex-container align-center'>"].join("\n");
var divEnd = ["</div>"].join("\n"); var divEnd = ["</div>"].join("\n");
var pSpan = "<span class='p-left-small'></span>"; var pSpan = "<span class='p-left-small'></span>";
var benchHKCCBegin, benchHKCCEnd; var benchHKCCBegin, benchHKCCEnd;
var benchmark = {
loadSaveFile: {
name: "LoadSaveFile()",
timeStart: 0,
timeEnd: 0
},
checkCompletion: {
name: "HKCheckCompletion()",
timeStart: 0,
timeEnd: 0
},
total: {
name: "Total",
timeStart: 0,
timeEnd: 0
}
};
/* -------------------------- Functions ----------------------------- */ /* -------------------------- Functions ----------------------------- */
function Benchmark(bench) {
for (var time in bench) {
console.info("".concat(bench[time].name, " time (ms) ="), bench[time].timeEnd - bench[time].timeStart);
bench[time].timeStart = 0;
bench[time].timeEnd = 0;
}
}
/** /**
* Main Function. Checks Hollow Knight game completion by analyzing the save file * Main Function. Checks Hollow Knight game completion by analyzing the save file
* @param {object} jsonObject Decoded save data in JavaScript Object Notation form (JSON) * @param {object} jsonObject Decoded save data in JavaScript Object Notation form (JSON)
*/ */
function HKCheckCompletion(jsonObject) { function HKCheckCompletion(jsonObject) {
// start benchmark // start benchmark
benchHKCCBegin = new Date(); benchHKCCBegin = new Date();
benchmark.checkCompletion.timeStart = new Date();
var HKPlayerData; var HKPlayerData;
var HKWorldItems; var HKWorldItems;
var HKSceneData; var HKSceneData;
@ -178,7 +204,9 @@ function HKCheckCompletion(jsonObject) {
// finish and show benchmark // finish and show benchmark
benchHKCCEnd = new Date(); benchHKCCEnd = new Date();
benchmark.checkCompletion.timeEnd = new Date();
console.info("HKCheckCompletion() time (ms) =", benchHKCCEnd - benchHKCCBegin); console.info("HKCheckCompletion() time (ms) =", benchHKCCEnd - benchHKCCBegin);
Benchmark(benchmark);
return true; return true;
} }
/** /**
@ -433,18 +461,19 @@ function CheckNotches(section) {
function CheckIfDataTrue(section, dataObject, playerData) { function CheckIfDataTrue(section, dataObject, playerData) {
var worldData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var worldData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
var _ref = "",
textPrefix = _ref.textPrefix, /* let {
textSuffix = _ref.textSuffix; textPrefix,
var sFillText = ""; textSuffix,
var wiki = ""; } = "";
let sFillText = "";
let wiki = ""; */
var checkText = ""; var checkText = "";
for (var i in dataObject) { for (var i in dataObject) {
textPrefix = dataObject[i].name; /* textPrefix = dataObject[i].name;
textSuffix = dataObject[i].spoiler; textSuffix = dataObject[i].spoiler;
dataObject[i].hasOwnProperty("wiki") ? wiki = dataObject[i].wiki : wiki = ""; (dataObject[i].hasOwnProperty("wiki")) ? wiki = dataObject[i].wiki: wiki = ""; */
switch (i) { switch (i) {
case "gotCharm_36": case "gotCharm_36":
// prevents green checkbox and adding 1% when only got one white fragment // prevents green checkbox and adding 1% when only got one white fragment
@ -463,15 +492,57 @@ function CheckIfDataTrue(section, dataObject, playerData) {
if (playerData.hasOwnProperty(i) === false) { if (playerData.hasOwnProperty(i) === false) {
CurrentDataBlank(section, i); CurrentDataBlank(section, i);
dataObject[i].disabled = true; dataObject[i].disabled = true;
textPrefix = "<del>".concat(textPrefix, "</del>"); /* textPrefix = `<del>${textPrefix}</del>`; */
break; break;
} } // Checks for Nightmare King (4) or Banishment (5)
if (i === "grimmChildLevel") { if (i === "grimmChildLevel") {
playerData.grimmChildLevel >= 4 ? CurrentDataTrue(section, i) : CurrentDataFalse(section, i); playerData.grimmChildLevel >= 4 ? CurrentDataTrue(section, i) : CurrentDataFalse(section, i);
break; break;
} }
if (i === "gotCharm_40") {
CurrentDataFalse(section, i);
dataObject[i].name = dataObject[i].nameDefault;
switch (playerData.grimmChildLevel) {
case 1:
if (playerData[i] === true) {
dataObject[i].name = dataObject[i].nameGrimmchildP1;
CurrentDataTrue(section, i);
}
break;
case 2:
dataObject[i].name = dataObject[i].nameGrimmchildP2;
CurrentDataTrue(section, i);
break;
case 3:
dataObject[i].name = dataObject[i].nameGrimmchildP3;
CurrentDataTrue(section, i);
break;
case 4:
dataObject[i].name = dataObject[i].nameGrimmchildP4;
CurrentDataTrue(section, i);
break;
case 5:
dataObject[i].name = dataObject[i].nameCarefreeMelody;
CurrentDataTrue(section, i);
break;
default:
dataObject[i].name = dataObject[i].nameDefault;
}
break;
}
playerData[i] === true ? CurrentDataTrue(section, i) : CurrentDataFalse(section, i); playerData[i] === true ? CurrentDataTrue(section, i) : CurrentDataFalse(section, i);
break; break;
@ -505,7 +576,8 @@ function CheckIfDataTrue(section, dataObject, playerData) {
if (checkText === "PropertyNotFound") { if (checkText === "PropertyNotFound") {
CurrentDataBlank(section, i); CurrentDataBlank(section, i);
dataObject[i].disabled = true; dataObject[i].disabled = true;
textPrefix = "<del>".concat(textPrefix, "</del>"); /* textPrefix = `<del>${textPrefix}</del>`; */
break; break;
} else if (checkText === "PantheonCompleted") { } else if (checkText === "PantheonCompleted") {
CurrentDataTrue(section, i); CurrentDataTrue(section, i);
@ -519,8 +591,8 @@ function CheckIfDataTrue(section, dataObject, playerData) {
default: default:
playerData[i] === true ? CurrentDataTrue(section, i) : CurrentDataFalse(section, i); playerData[i] === true ? CurrentDataTrue(section, i) : CurrentDataFalse(section, i);
} }
/* sFillText += PrepareHTMLString(section, textPrefix, textSuffix, wiki); */
sFillText += PrepareHTMLString(section, textPrefix, textSuffix, wiki);
} // AppendHTML(section, sFillText); } // AppendHTML(section, sFillText);
} }
@ -686,10 +758,10 @@ function WorldDataActivated(idText, sceneNameText, worldData) {
function CheckAdditionalThings(section, dataObject, playerData, worldData, sceneData) { function CheckAdditionalThings(section, dataObject, playerData, worldData, sceneData) {
var _ref2 = "", var _ref = "",
textPrefix = _ref2.textPrefix, textPrefix = _ref.textPrefix,
textSuffix = _ref2.textSuffix, textSuffix = _ref.textSuffix,
wiki = _ref2.wiki; wiki = _ref.wiki;
var sFillText = ""; // Start main loop var sFillText = ""; // Start main loop
for (var i in dataObject) { for (var i in dataObject) {
@ -3533,8 +3605,16 @@ var HK = {
}, },
gotCharm_40: { gotCharm_40: {
name: "Charm #40 Grimmchild or Carefree Melody", name: "Charm #40 Grimmchild or Carefree Melody",
nameDefault: "Charm #40 Grimmchild or Carefree Melody",
nameGrimmchildP1: "Charm #40: Grimmchild (Phase 1)",
nameGrimmchildP2: "Charm #40: Grimmchild (Phase 2)",
nameGrimmchildP3: "Charm #40: Grimmchild (Phase 3)",
nameGrimmchildP4: "Charm #40: Grimmchild (Phase 4)",
nameCarefreeMelody: "Charm #40: Carefree Melody",
spoiler: "Dirtmouth", spoiler: "Dirtmouth",
wiki: "Grimmchild" wiki: "Grimmchild",
wikiGrimmchild: "Grimmchild",
wikiCarefreeMelody: "Carefree_Melody"
}, },
killedGrimm: { killedGrimm: {
name: "P3 Troupe Master Grimm", name: "P3 Troupe Master Grimm",

File diff suppressed because one or more lines are too long

View file

@ -62,8 +62,35 @@ let pSpan = "<span class='p-left-small'></span>";
let benchHKCCBegin, benchHKCCEnd; let benchHKCCBegin, benchHKCCEnd;
let benchmark = {
loadSaveFile: {
name: "LoadSaveFile()",
timeStart: 0,
timeEnd: 0
},
checkCompletion: {
name: "HKCheckCompletion()",
timeStart: 0,
timeEnd: 0
},
total: {
name: "Total",
timeStart: 0,
timeEnd: 0
}
}
/* -------------------------- Functions ----------------------------- */ /* -------------------------- Functions ----------------------------- */
function Benchmark(bench) {
for (let time in bench) {
console.info(`${bench[time].name} time (ms) =`, bench[time].timeEnd - bench[time].timeStart);
bench[time].timeStart = 0;
bench[time].timeEnd = 0;
}
}
/** /**
* Main Function. Checks Hollow Knight game completion by analyzing the save file * Main Function. Checks Hollow Knight game completion by analyzing the save file
* @param {object} jsonObject Decoded save data in JavaScript Object Notation form (JSON) * @param {object} jsonObject Decoded save data in JavaScript Object Notation form (JSON)
@ -72,6 +99,7 @@ function HKCheckCompletion(jsonObject) {
// start benchmark // start benchmark
benchHKCCBegin = new Date(); benchHKCCBegin = new Date();
benchmark.checkCompletion.timeStart = new Date();
let HKPlayerData; let HKPlayerData;
let HKWorldItems; let HKWorldItems;
@ -250,8 +278,11 @@ function HKCheckCompletion(jsonObject) {
// finish and show benchmark // finish and show benchmark
benchHKCCEnd = new Date(); benchHKCCEnd = new Date();
benchmark.checkCompletion.timeEnd = new Date();
console.info("HKCheckCompletion() time (ms) =", benchHKCCEnd - benchHKCCBegin); console.info("HKCheckCompletion() time (ms) =", benchHKCCEnd - benchHKCCBegin);
Benchmark(benchmark);
return true; return true;
} }
@ -529,19 +560,19 @@ function CheckNotches(section, notchesTotal = 3, notchesFilled = 0) {
*/ */
function CheckIfDataTrue(section, dataObject, playerData, worldData = []) { function CheckIfDataTrue(section, dataObject, playerData, worldData = []) {
let { /* let {
textPrefix, textPrefix,
textSuffix, textSuffix,
} = ""; } = "";
let sFillText = ""; let sFillText = "";
let wiki = ""; let wiki = ""; */
let checkText = ""; let checkText = "";
for (let i in dataObject) { for (let i in dataObject) {
textPrefix = dataObject[i].name; /* textPrefix = dataObject[i].name;
textSuffix = dataObject[i].spoiler; textSuffix = dataObject[i].spoiler;
(dataObject[i].hasOwnProperty("wiki")) ? wiki = dataObject[i].wiki: wiki = ""; (dataObject[i].hasOwnProperty("wiki")) ? wiki = dataObject[i].wiki: wiki = ""; */
switch (i) { switch (i) {
case "gotCharm_36": case "gotCharm_36":
@ -557,18 +588,65 @@ function CheckIfDataTrue(section, dataObject, playerData, worldData = []) {
case "grimmChildLevel": case "grimmChildLevel":
case "killedHiveKnight": case "killedHiveKnight":
case "hasGodfinder": case "hasGodfinder":
// fades out the entries if save file is from older game versions // fades out the entries if save file is from older game versions
if (playerData.hasOwnProperty(i) === false) { if (playerData.hasOwnProperty(i) === false) {
CurrentDataBlank(section, i); CurrentDataBlank(section, i);
dataObject[i].disabled = true; dataObject[i].disabled = true;
textPrefix = `<del>${textPrefix}</del>`; /* textPrefix = `<del>${textPrefix}</del>`; */
break; break;
} }
// Checks for Nightmare King (4) or Banishment (5)
if (i === "grimmChildLevel") { if (i === "grimmChildLevel") {
(playerData.grimmChildLevel >= 4) ? CurrentDataTrue(section, i): CurrentDataFalse(section, i); (playerData.grimmChildLevel >= 4) ? CurrentDataTrue(section, i): CurrentDataFalse(section, i);
break; break;
} }
if (i === "gotCharm_40") {
CurrentDataFalse(section, i);
dataObject[i].name = dataObject[i].nameDefault;
switch (playerData.grimmChildLevel) {
case 1:
if (playerData[i] === true) {
dataObject[i].name = dataObject[i].nameGrimmchildP1;
CurrentDataTrue(section, i);
}
break;
case 2:
dataObject[i].name = dataObject[i].nameGrimmchildP2;
CurrentDataTrue(section, i);
break;
case 3:
dataObject[i].name = dataObject[i].nameGrimmchildP3;
CurrentDataTrue(section, i);
break;
case 4:
dataObject[i].name = dataObject[i].nameGrimmchildP4;
CurrentDataTrue(section, i);
break;
case 5:
dataObject[i].name = dataObject[i].nameCarefreeMelody;
CurrentDataTrue(section, i);
break;
default:
dataObject[i].name = dataObject[i].nameDefault;
}
break;
}
(playerData[i] === true) ? CurrentDataTrue(section, i): CurrentDataFalse(section, i); (playerData[i] === true) ? CurrentDataTrue(section, i): CurrentDataFalse(section, i);
break; break;
case "bossGruzMother": case "bossGruzMother":
@ -600,7 +678,7 @@ function CheckIfDataTrue(section, dataObject, playerData, worldData = []) {
if (checkText === "PropertyNotFound") { if (checkText === "PropertyNotFound") {
CurrentDataBlank(section, i); CurrentDataBlank(section, i);
dataObject[i].disabled = true; dataObject[i].disabled = true;
textPrefix = `<del>${textPrefix}</del>`; /* textPrefix = `<del>${textPrefix}</del>`; */
break; break;
} else if (checkText === "PantheonCompleted") { } else if (checkText === "PantheonCompleted") {
CurrentDataTrue(section, i); CurrentDataTrue(section, i);
@ -614,7 +692,7 @@ function CheckIfDataTrue(section, dataObject, playerData, worldData = []) {
(playerData[i] === true) ? CurrentDataTrue(section, i): CurrentDataFalse(section, i); (playerData[i] === true) ? CurrentDataTrue(section, i): CurrentDataFalse(section, i);
} }
sFillText += PrepareHTMLString(section, textPrefix, textSuffix, wiki); /* sFillText += PrepareHTMLString(section, textPrefix, textSuffix, wiki); */
} }
// AppendHTML(section, sFillText); // AppendHTML(section, sFillText);

View file

@ -925,8 +925,16 @@ const HK = {
}, },
gotCharm_40: { gotCharm_40: {
name: "Charm #40 Grimmchild or Carefree Melody", name: "Charm #40 Grimmchild or Carefree Melody",
nameDefault: "Charm #40 Grimmchild or Carefree Melody",
nameGrimmchildP1: "Charm #40: Grimmchild (Phase 1)",
nameGrimmchildP2: "Charm #40: Grimmchild (Phase 2)",
nameGrimmchildP3: "Charm #40: Grimmchild (Phase 3)",
nameGrimmchildP4: "Charm #40: Grimmchild (Phase 4)",
nameCarefreeMelody: "Charm #40: Carefree Melody",
spoiler: "Dirtmouth", spoiler: "Dirtmouth",
wiki: "Grimmchild" wiki: "Grimmchild",
wikiGrimmchild: "Grimmchild",
wikiCarefreeMelody: "Carefree_Melody"
}, },
killedGrimm: { killedGrimm: {
name: "P3 Troupe Master Grimm", name: "P3 Troupe Master Grimm",