Compare commits

...

2 Commits

15 changed files with 79 additions and 44 deletions

View File

@ -2,7 +2,6 @@ name = "Air Pirate"
[[world]] [[world]]
name = "Neverland" name = "Neverland"
room = ""
[[drops]] [[drops]]
name = "Hi-Potion" name = "Hi-Potion"

View File

@ -1,8 +1,7 @@
name = "Air Soldier" name = "Air Soldier"
[[world]] [[world]]
name = "" name = "Wonderland"
room = ""
[[drops]] [[drops]]
name = "Potion" name = "Potion"

View File

@ -2,6 +2,7 @@ name = "Bandit"
[[world]] [[world]]
name = "Agrabah" name = "Agrabah"
room = ["Desert: Cave", "Treasure Room", "Lamp Chamber"]
[[world]] [[world]]
name = "Monstro" name = "Monstro"

View File

@ -3,6 +3,10 @@ name = "Bouncywild"
[[world]] [[world]]
name = "Deep Jungle" name = "Deep Jungle"
[[world]]
name = "Monstro"
room = ["Bowels", "Stomach"]
[[world]] [[world]]
name = "End of the World" name = "End of the World"

View File

@ -2,6 +2,11 @@ name = "Darkball"
[[world]] [[world]]
name = "Traverse Town" name = "Traverse Town"
room = ["3rd District", "Gizmo Shop"]
[[world]]
name = "Agrabah"
room = ["Bazaar", "Palace Gates"]
[[world]] [[world]]
name = "Hollow Bastion" name = "Hollow Bastion"
@ -9,6 +14,10 @@ name = "Hollow Bastion"
[[world]] [[world]]
name = "End of the World" name = "End of the World"
[[world]]
name = "Neverland"
room = ["Ship: Freezer", "Captain's Cabin"]
[[drops]] [[drops]]
name = "Hi-Potion" name = "Hi-Potion"
kind = "item" kind = "item"

View File

@ -2,6 +2,7 @@ name = "Defender"
[[world]] [[world]]
name = "Traverse Town" name = "Traverse Town"
room = ["3rd District", "Hotel Hallway", "Gizmo Shop"]
[[world]] [[world]]
name = "Hollow Bastion" name = "Hollow Bastion"

View File

@ -11,6 +11,7 @@ name = "Monstro"
[[world]] [[world]]
name = "Deep Jungle" name = "Deep Jungle"
room = ["Jungle: Cliff"]
[[world]] [[world]]
name = "Hollow Bastion" name = "Hollow Bastion"

View File

@ -2,6 +2,7 @@ name = "Pirate"
[[world]] [[world]]
name = "Neverland" name = "Neverland"
room = ["Captain's Cabin"]
[[world]] [[world]]
name = "Monstro" name = "Monstro"

View File

@ -5,6 +5,7 @@ name = "Deep Jungle"
[[world]] [[world]]
name = "Monstro" name = "Monstro"
room = ["Chamber 5", "Chamber 6"]
[[world]] [[world]]
name = "End of the World" name = "End of the World"

View File

@ -1,19 +1,8 @@
name = "Red Nocturne" name = "Red Nocturne"
[[world]]
name = "Traverse Town"
[[world]]
name = "Wonderland"
[[world]]
name = "Agrabah"
[[world]]
name = "Hollow Bastion"
[[world]] [[world]]
name = "Monstro" name = "Monstro"
room = ["Chamber 6"]
[[world]] [[world]]
name = "End of the World" name = "End of the World"

View File

@ -1,8 +1,11 @@
name = "Shadow" name = "Shadow"
[[world]] [[world]]
name = "Traverse Town" name = "Wonderland"
room = ""
[[world]]
name = "Neverland"
room = ["Ship: Freezer"]
[[drops]] [[drops]]
name = "Potion" name = "Potion"

View File

@ -1,8 +1,8 @@
name = "Soldier" name = "Soldier"
[[world]] [[world]]
name = "Traverse Town" name = "Agrabah"
room = "" room = ["Main Street"]
[[drops]] [[drops]]
name = "Spirit Shard" name = "Spirit Shard"

View File

@ -0,0 +1,8 @@
Array.prototype.remove = function (element) {
this.forEach((item, index) => {
if (item === element) {
this.splice(index, 1);
}
});
return this;
};

View File

@ -1,29 +1,37 @@
import "../common/prototypes.js";
let markedNeededMaterials = [];
document.addEventListener("DOMContentLoaded", (event) => { document.addEventListener("DOMContentLoaded", (event) => {
const recipes = document.querySelectorAll(".recipe"); const recipes = document.querySelectorAll(".recipe");
for (const recipe of recipes) { for (const recipe of recipes) {
recipe.checked = recipe.checked =
localStorage.getItem("kh1-synth-" + recipe.id) === "true" ?? false; localStorage.getItem("kh1-synth-" + recipe.id) === "true" ?? false;
update_synth_completions(recipe); updateSynthRecipeState(recipe);
recipe.addEventListener("input", function () { recipe.addEventListener("input", function () {
localStorage.setItem("kh1-synth-" + this.id, this.checked); localStorage.setItem("kh1-synth-" + this.id, this.checked);
update_synth_completions(this); updateSynthRecipeState(this);
calc_total_ingredients(); calcNeededMats();
}); });
} }
const recipes_labels = document.querySelectorAll(".recipe-wrapper > label"); const recipesLabels = document.querySelectorAll(".recipe-wrapper > label");
for (const label of recipes_labels) { for (const label of recipesLabels) {
label.addEventListener("mouseenter", function () { label.addEventListener("mouseenter", function () {
highlight_ingredients(this); highlightNeededMats(this);
}); });
} }
calc_total_ingredients(); markedNeededMaterials = Array(
localStorage.getItem("kh1-synth-needed-mats") ?? [],
);
calcNeededMats();
}); });
function update_synth_completions(recipe) { function updateSynthRecipeState(recipe) {
if (recipe.checked) { if (recipe.checked) {
recipe.parentElement.classList.add("complete"); recipe.parentElement.classList.add("complete");
} else { } else {
@ -31,25 +39,17 @@ function update_synth_completions(recipe) {
} }
} }
function highlight_ingredients(label) { function highlightNeededMats(label) {
let mats = []; let mats = [];
const ingredients = label.querySelectorAll("ul li"); const ingredients = label.querySelectorAll("ul li");
const checkbox = label.parentElement.querySelectorAll(".recipe")[0]; const checkbox = label.parentElement.querySelectorAll(".recipe")[0];
const elems = document.querySelectorAll("#mats ul li");
if (checkbox.checked) {
for (const elem of elems) {
elem.style.color = "#fff";
}
return;
}
for (const ingredient of ingredients) { for (const ingredient of ingredients) {
const name = ingredient.dataset["synthItemName"]; const name = ingredient.dataset["synthItemName"];
mats.push(name); mats.push(name);
} }
const elems = document.querySelectorAll("#mats ul li");
for (const elem of elems) { for (const elem of elems) {
const isCrossed = elem.style.textDecoration === "line-through"; const isCrossed = elem.style.textDecoration === "line-through";
if (isCrossed) { if (isCrossed) {
@ -64,7 +64,7 @@ function highlight_ingredients(label) {
} }
} }
function calc_total_ingredients() { function calcNeededMats() {
const needed = new Map(); const needed = new Map();
const recipes = document.querySelectorAll(".recipe"); const recipes = document.querySelectorAll(".recipe");
@ -81,8 +81,8 @@ function calc_total_ingredients() {
let amount = Number(ingredient.dataset["synthItemAmount"]); let amount = Number(ingredient.dataset["synthItemAmount"]);
if (needed.has(name)) { if (needed.has(name)) {
let new_amount = Number(needed.get(name)) + amount; let newAmount = Number(needed.get(name)) + amount;
needed.set(name, new_amount); needed.set(name, newAmount);
} else { } else {
needed.set(name, amount); needed.set(name, amount);
} }
@ -99,12 +99,30 @@ function calc_total_ingredients() {
const liElem = document.createElement("li"); const liElem = document.createElement("li");
liElem.innerHTML = entry[0] + " x" + entry[1]; liElem.innerHTML = entry[0] + " x" + entry[1];
liElem.addEventListener("click", function () { liElem.addEventListener("click", function () {
const isCrossed = this.style.textDecoration === "line-through"; updateMarkedNeededMats(entry[0]);
this.style.textDecoration = isCrossed ? "none" : "line-through"; markNeededMat(this);
this.style.color = isCrossed ? "#fff" : "#f00";
}); });
if (markedNeededMaterials.includes(entry[0])) {
markNeededMat(liElem);
}
uiList.appendChild(liElem); uiList.appendChild(liElem);
} }
matsList.appendChild(uiList); matsList.appendChild(uiList);
} }
function updateMarkedNeededMats(ingredient) {
if (markedNeededMaterials.includes(ingredient)) {
markedNeededMaterials.remove(ingredient);
} else {
markedNeededMaterials.push(ingredient);
}
localStorage.setItem("kh1-synth-needed-mats", markedNeededMaterials);
}
function markNeededMat(mat) {
const isCrossed = mat.style.textDecoration === "line-through";
mat.style.textDecoration = isCrossed ? "none" : "line-through";
mat.style.color = isCrossed ? "#fff" : "#f00";
}

View File

@ -87,5 +87,6 @@ impl Display for EnemyDropChance {
#[derive(Debug, Deserialize, PartialEq, Eq)] #[derive(Debug, Deserialize, PartialEq, Eq)]
pub struct SpawnLocation { pub struct SpawnLocation {
pub name: String, pub name: String,
pub room: Option<String>, #[serde(default)]
pub rooms: Vec<String>,
} }