From f2fb1f9e1ddc051799cb0ea7f7b40e9dcb2709d2 Mon Sep 17 00:00:00 2001 From: ReznoRMichael Date: Sun, 13 Sep 2020 15:44:03 +0200 Subject: [PATCH] CheckHintsTrue() optimize algorithm, add favicon --- HKCheckCompletion.js | 104 ++++++++++++++++--------------------------- favicon.png | Bin 0 -> 2571 bytes index.html | 11 +++-- loadJson.js | 2 +- style.css | 17 +++++-- 5 files changed, 58 insertions(+), 76 deletions(-) create mode 100644 favicon.png diff --git a/HKCheckCompletion.js b/HKCheckCompletion.js index c576a4f..d7360cb 100644 --- a/HKCheckCompletion.js +++ b/HKCheckCompletion.js @@ -209,13 +209,13 @@ const HK_DREAMNAIL = { }; const HK_EQUIPMENT = { - hasDash: ["Mothwing Cloak", "Greenpath; Dash ability"], - hasWalljump: ["Mantis Claw", "Mantis Village; Wall Jump ability"], - hasSuperDash: ["Crystal Heart", "Crystal Peak; Super Dash ability"], - hasAcidArmour: ["Isma's Tear", "Royal Waterways; Acid Armour ability"], - hasDoubleJump: ["Monarch Wings", "Ancient Basin; Double Jump ability"], + hasDash: ["Mothwing Cloak", "Greenpath: Dash ability"], + hasWalljump: ["Mantis Claw", "Mantis Village: Wall Jump ability"], + hasSuperDash: ["Crystal Heart", "Crystal Peak: Super Dash ability"], + hasDoubleJump: ["Monarch Wings", "Ancient Basin: Double Jump ability"], + hasAcidArmour: ["Isma's Tear", "Royal Waterways: Acid Armour ability"], hasKingsBrand: ["King's Brand", "Kingdom's Edge"], - hasShadowDash: ["Shade Cloak", "The Abyss; Shadow Dash ability"] + hasShadowDash: ["Shade Cloak", "The Abyss: Shadow Dash ability"] }; const HK_MASKSHARDS = { @@ -321,7 +321,7 @@ const HK_GODMASTER_DOORS = [ /** * Checks Hollow Knight game completion by analyzing the save file - * @param {object} jsonObject Save data in JavaScript Object form + * @param {object} jsonObject Decoded save data in JavaScript Object Notation form (JSON) */ function HKCheckCompletion(jsonObject) { @@ -332,7 +332,7 @@ function HKCheckCompletion(jsonObject) { CheckboxHintsToggle("hide"); CheckboxLocationsToggle("hide"); - // Pre-Cleaning and filling initial data + // Pre-Cleaning and filling initial data (h2, id) needed for FillHTML() PrefillHTML(DIV_ID); // Shallow Clone const objects (used for destructive functions) @@ -558,14 +558,14 @@ function CheckPlayTime(divId, playTime) { * @param {object} playerData Reference/pointer to specific data where to search */ function CheckCompletionPercent(divId, playerData) { - + let textFill = ""; CurrentDataFalse(); for (let i in playerData) { if (i === "completionPercentage") { if (playerData[i] >= 112) CurrentDataTrue(); - + textFill = "Game Completion: " + playerData[i] + " % (out of " + divId.maxPercent + " %)"; document.getElementById(divId.id).innerHTML += divStart + completionSymbol + textFill + divEnd; } @@ -656,92 +656,66 @@ function CheckWorldDataTrue(divId, idText, dataObject, worldData) { * @param {object} worldData object containing HK World Data to look in */ function CheckHintsTrue(divId, dataObject, playerData, worldData) { - let hollowKnightDefeated = false; for (let i in dataObject) { - CurrentDataFalse(); - if (playerData[i] === true) { if (i === "killedHollowKnight") { - hollowKnightDefeated = true; + // a text to show when player already finished their first playthrough (killed Hollow Knight first time) + FillHTML(divId, "", "...a successful Knight who doesn't need hints anymore"); break; } - CurrentDataTrue(); continue; } else if (i === "fireballLevel") { if (playerData[i] >= 1) { - CurrentDataTrue(); continue; } else { - CurrentDataFalse(); FillHTML(divId, dataObject[i][0], dataObject[i][1]); break; } } else if (i === "Crossroads_04") { + let GruzMotherDefeated = false; + for (let k = 0, length = worldData.length; k < length; k++) { if (worldData[k].id === "Battle Scene" && worldData[k].sceneName === "Crossroads_04" && worldData[k].activated === true) { - CurrentDataTrue(); + GruzMotherDefeated = true; break; } } - if (completionSymbol === SYMBOL_FALSE) { + if (GruzMotherDefeated) { + continue; // next dataObject (i) + } else { FillHTML(divId, dataObject[i][0], dataObject[i][1]); + break; } } else if (i === "dungDefenderOrHornet2") { - for (let k in playerData) { - if (k === "defeatedDungDefender" && playerData[k] === true) { - CurrentDataTrue(); - break; - } else if (k === "hornetOutskirtsDefeated" && playerData[k] === true) { - CurrentDataTrue(); - break; - } else if ((k === "defeatedDungDefender" && playerData[k] === false) && - (k === "hornetOutskirtsDefeated" && playerData[k] === false)) { - CurrentDataFalse(); + if (playerData.defeatedDungDefender === true) { + continue; + } else if (playerData.hornetOutskirtsDefeated === true) { + continue; + } else { // if no Dung Defender or Hornet 2 + FillHTML(divId, dataObject[i][0], dataObject[i][1]); + break; + } + } else if (i === "ismaTearOrShadeCloak") { + if (playerData.hasAcidArmour === true) { + continue; + } else if (playerData.hasKingsBrand === true) { + if (playerData.hasShadowDash === true) { + continue; + } else { // if Kings Brand but no Shade Cloak FillHTML(divId, dataObject[i][0], dataObject[i][1]); break; } + } else { // if no Isma's Tear or Kings Brand + FillHTML(divId, dataObject[i][0], dataObject[i][1]); + break; } - } else if (i === "ismaTearOrShadeCloak") { - for (let k in playerData) { - if (k === "hasAcidArmour") { - if (playerData[k] === true) { - CurrentDataTrue(); - break; - } - } else if (k === "hasKingsBrand") { - if (playerData[k] === true) { - for (let l in playerData) { - if (l === "hasShadowDash") { - if (playerData[l] === true) { - CurrentDataTrue(); - break; - } else { - CurrentDataFalse(); - FillHTML(divId, dataObject[i][0], dataObject[i][1]); - break; - } - } - } - } else { - CurrentDataFalse(); - FillHTML(divId, dataObject[i][0], dataObject[i][1]); - break; - } - } - } - } else { - CurrentDataFalse(); + } else { // if anything from the hints list is not done FillHTML(divId, dataObject[i][0], dataObject[i][1]); break; } } // end: for (let i in dataObject) - - // prevents showing hints when player already has seen the credits - if (hollowKnightDefeated) { - FillHTML(divId, "", "...a successful Knight who doesn't need hints anymore"); - } -} +} // function CheckHintsTrue() /** * Pre-Cleans HTML. Reads contents inside text area and parses it to a JavaScript object. If not empty, runs HKCheckCompletion() to check data. diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebf7d6e6a74b749099806224dcd5267a7d64e02 GIT binary patch literal 2571 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 307024e..e5b6ccf 100644 --- a/index.html +++ b/index.html @@ -4,21 +4,21 @@ - + - Hollow Knight Completion Check Tool + Hollow Knight: Analyze Save Completion - + - + @@ -28,12 +28,11 @@ - Calculate all % in all categories from save data - Single Pale Ore locations? (required for completion) - Single Keys/Pass locations? (required for completion) - - CheckHintsTrue optimize algorithm -->
-

Hollow Knight Completion % Check

+

Hollow Knight Analyze Save Completion

Check what you have left for completion. Hints for first playthrough.
Use bloodorca's amazing [ Online Hollow Knight Save Editor ] to decode your save file.
diff --git a/loadJson.js b/loadJson.js index 468482c..c348dbb 100644 --- a/loadJson.js +++ b/loadJson.js @@ -44,7 +44,7 @@ function loadJSON(filename, callback) { xobj.send(null); } -loadJSON("save/" + fileName[5], +loadJSON("save/" + fileName[9], function JSONparse(response) { // Parse JSON string into object jsonObj = JSON.parse(response); diff --git a/style.css b/style.css index 0f1fa37..7e793d9 100644 --- a/style.css +++ b/style.css @@ -31,6 +31,7 @@ body { } b { font-weight: 500; + color: #1e406c; } strong { font-weight: 700; @@ -40,7 +41,8 @@ strong { margin: 0 auto; } h1 { - font-size: 1.9rem; + font-size: 1.7rem; + color: #1e406c; margin: 0.6rem 0; } #h1-title { @@ -82,7 +84,7 @@ h1 { } h2 { margin: 0.6rem 0; - color: #737373; + color: #6f7583; } p { margin-top: 0.6rem; @@ -110,12 +112,13 @@ p { a, a:active, a:visited { - color: black; + color: #1e406c; font-weight: 700; text-decoration: none; } a:hover { - text-decoration: underline; + color: #529dff; + text-decoration: none; } .icon-cancel { color: #f03a17; @@ -194,6 +197,12 @@ input[type="radio"] background-color: #1e406c; background-color: var(--rt-main); } +/* When the checkbox is checked change background color on hover */ +.radio-label:hover input:checked ~ .radiomark, +.checkbox-label:hover input:checked ~ .checkmark +{ + background-color: #285188; +} /* Create the checkmark/indicator (hidden when not checked) */ .radiomark:after, .checkmark:after