267 lines
8.9 KiB
JavaScript
267 lines
8.9 KiB
JavaScript
|
|
|
|
const translate_mappings = {
|
|
//"Name": "name",
|
|
//"Display Name": "displayName",
|
|
//"tier"Tier": ",
|
|
//"Set": "set",
|
|
"Powder Slots": "slots",
|
|
//"Type": "type",
|
|
//"armorType", (deleted)
|
|
//"color", (deleted)
|
|
//"lore", (deleted)
|
|
//"material", (deleted)
|
|
"Drop type": "drop",
|
|
"Quest requirement": "quest",
|
|
"Restriction": "restrict",
|
|
//"Base Neutral Damage": "nDam",
|
|
//"Base Fire Damage": "fDam",
|
|
//"Base Water Damage": "wDam",
|
|
//"Base Air Damage": "aDam",
|
|
//"Base Thunder Damage": "tDam",
|
|
//"Base Earth Damage": "eDam",
|
|
//"Base Attack Speed": "atkSpd",
|
|
"Health": "hp",
|
|
"Raw Fire Defense": "fDef",
|
|
"Raw Water Defense": "wDef",
|
|
"Raw Air Defense": "aDef",
|
|
"Raw Thunder Defense": "tDef",
|
|
"Raw Earth Defense": "eDef",
|
|
"Combat Level": "lvl",
|
|
//"Class Requirement": "classReq",
|
|
"Req Strength": "strReq",
|
|
"Req Dexterity": "dexReq",
|
|
"Req Intelligence": "intReq",
|
|
"Req Agility": "agiReq",
|
|
"Req Defense": "defReq",
|
|
"% Health Regen": "hprPct",
|
|
"Mana Regen": "mr",
|
|
"% Spell Damage": "sdPct",
|
|
"% Melee Damage": "mdPct",
|
|
"Life Steal": "ls",
|
|
"Mana Steal": "ms",
|
|
"XP Bonus": "xpb",
|
|
"Loot Bonus": "lb",
|
|
"Reflection": "ref",
|
|
"Strength": "str",
|
|
"Dexterity": "dex",
|
|
"Intelligence": "int",
|
|
"Agility": "agi",
|
|
"Defense": "def",
|
|
"Thorns": "thorns",
|
|
"Exploding": "expd",
|
|
"Walk Speed": "spd",
|
|
"Attack Speed Bonus": "atkTier",
|
|
"Poison": "poison",
|
|
"Health Bonus": "hpBonus",
|
|
"Soul Point Regen": "spRegen",
|
|
"Stealing": "eSteal",
|
|
"Raw Health Regen": "hprRaw",
|
|
"Raw Spell": "sdRaw",
|
|
"Raw Melee": "mdRaw",
|
|
"% Fire Damage": "fDamPct",
|
|
"% Water Damage": "wDamPct",
|
|
"% Air Damage": "aDamPct",
|
|
"% Thunder Damage": "tDamPct",
|
|
"% Earth Damage": "eDamPct",
|
|
"% Fire Defense": "fDefPct",
|
|
"% Water Defense": "wDefPct",
|
|
"% Air Defense": "aDefPct",
|
|
"% Thunder Defense": "tDefPct",
|
|
"% Earth Defense": "eDefPct",
|
|
"Fixed IDs": "fixID",
|
|
"Custom Skin": "skin",
|
|
//"Item Category": "category",
|
|
|
|
"1st Spell Cost %": "spPct1",
|
|
"1st Spell Cost Raw": "spRaw1",
|
|
"2nd Spell Cost %": "spPct2",
|
|
"2nd Spell Cost Raw": "spRaw2",
|
|
"3rd Spell Cost %": "spPct3",
|
|
"3rd Spell Cost Raw": "spRaw3",
|
|
"4th Spell Cost %": "spPct4",
|
|
"4th Spell Cost Raw": "spRaw4",
|
|
|
|
"Rainbow Spell Damage": "rainbowRaw",
|
|
"Sprint": "sprint",
|
|
"Sprint Regen": "sprintReg",
|
|
"Jump Height": "jh",
|
|
"Loot Quality": "lq",
|
|
|
|
"Gather XP Bonus": "gXp",
|
|
"Gather Speed Bonus": "gSpd",
|
|
};
|
|
|
|
const special_mappings = {
|
|
"Sum (skill points)": new SumQuery(["str", "dex", "int", "def", "agi"]),
|
|
"Sum (Mana Sustain)": new SumQuery(["mr", "ms"]),
|
|
"Sum (Life Sustain)": new SumQuery(["hpr", "ls"]),
|
|
"Sum (Health + Health Bonus)": new SumQuery(["hp", "hpBonus"]),
|
|
"No Strength Req": new NegateQuery("strReq"),
|
|
"No Dexterity Req": new NegateQuery("dexReq"),
|
|
"No Intelligence Req": new NegateQuery("intReq"),
|
|
"No Agility Req": new NegateQuery("agiReq"),
|
|
"No Defense Req": new NegateQuery("defReq"),
|
|
};
|
|
|
|
let itemFilters = document.getElementById("filter-items");
|
|
for (let x in translate_mappings) {
|
|
let el = document.createElement("option");
|
|
el.value = x;
|
|
itemFilters.appendChild(el);
|
|
}
|
|
for (let x in special_mappings) {
|
|
let el = document.createElement("option");
|
|
el.value = x;
|
|
itemFilters.appendChild(el);
|
|
}
|
|
|
|
let itemCategories = [ "armor", "accessory", "weapon" ];
|
|
|
|
function applyQuery(items, query) {
|
|
return items.filter(query.filter, query).sort(query.compare);
|
|
}
|
|
|
|
function displayItems(items_copy) {
|
|
let items_parent = document.getElementById("main");
|
|
for (let i in items_copy) {
|
|
let item = items_copy[i];
|
|
let box = document.createElement("div");
|
|
box.classList.add("box");
|
|
box.id = "item"+i;
|
|
items_parent.appendChild(box);
|
|
displayExpandedItem(item, box.id);
|
|
}
|
|
}
|
|
|
|
let items_expanded;
|
|
|
|
// updates the current search state from the search query input boxes
|
|
function updateSearch() {
|
|
// compile query expressions, aborting if nothing has changed or either fails to compile
|
|
const changed = searchFilterField.compile() | searchSortField.compile();
|
|
if (!changed || searchFilterField.output === null || searchSortField.output === null) return;
|
|
|
|
// update url query string
|
|
const newUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}`
|
|
+ `?f=${encodeURIComponent(searchFilterField.value)}&s=${encodeURIComponent(searchSortField.value)}`;
|
|
window.history.pushState({ path: newUrl }, '', newUrl);
|
|
|
|
// hide old search results
|
|
itemListFooter.innerText = '';
|
|
for (const itemEntry of itemEntries) itemEntry.classList.remove('visible');
|
|
|
|
// index and sort search results
|
|
const searchResults = [];
|
|
try {
|
|
for (let i = 0; i < searchDb.length; i++) {
|
|
const item = searchDb[i][0], itemExp = searchDb[i][1];
|
|
if (checkBool(searchFilterField.output.resolve(item, itemExp))) {
|
|
searchResults.push({ item, itemExp, sortKeys: searchSortField.output.resolve(item, itemExp) });
|
|
}
|
|
}
|
|
} catch (e) {
|
|
searchFilterField.errorText.innerText = e.message;
|
|
return;
|
|
}
|
|
if (searchResults.length === 0) {
|
|
itemListFooter.innerText = 'No results!';
|
|
return;
|
|
}
|
|
try {
|
|
searchResults.sort((a, b) => {
|
|
try {
|
|
return compareLexico(a.item, a.sortKeys, b.item, b.sortKeys);
|
|
} catch (e) {
|
|
console.log(a.item, b.item);
|
|
throw e;
|
|
}
|
|
});
|
|
} catch (e) {
|
|
searchSortField.errorText.innerText = e.message;
|
|
return;
|
|
}
|
|
|
|
// display search results
|
|
const searchMax = Math.min(searchResults.length, ITEM_LIST_SIZE);
|
|
for (let i = 0; i < searchMax; i++) {
|
|
const result = searchResults[i];
|
|
itemEntries[i].classList.add('visible');
|
|
displayExpandedItem(result.itemExp, `item-entry-${i}`);
|
|
if (result.sortKeys.length > 0) {
|
|
const sortKeyListContainer = document.createElement('div');
|
|
sortKeyListContainer.classList.add('itemleft');
|
|
const sortKeyList = document.createElement('ul');
|
|
sortKeyList.classList.add('item-entry-sort-key', 'itemp', 'T0');
|
|
sortKeyListContainer.append(sortKeyList);
|
|
for (let j = 0; j < result.sortKeys.length; j++) {
|
|
const sortKeyElem = document.createElement('li');
|
|
sortKeyElem.innerText = stringify(result.sortKeys[j]);
|
|
sortKeyList.append(sortKeyElem);
|
|
}
|
|
itemEntries[i].append(sortKeyListContainer);
|
|
}
|
|
}
|
|
if (searchMax < searchResults.length) {
|
|
itemListFooter.innerText = `${searchResults.length - searchMax} more...`;
|
|
}
|
|
}
|
|
|
|
function doItemSearch() {
|
|
window.scrollTo(0, 0);
|
|
let queries = [];
|
|
queries.push(new NameQuery(document.getElementById("name-choice").value.trim()));
|
|
|
|
let categoryOrType = document.getElementById("category-choice").value;
|
|
if (itemTypes.includes(categoryOrType)) {
|
|
queries.push(new IdMatchQuery("type", categoryOrType));
|
|
}
|
|
else if (itemCategories.includes(categoryOrType)) {
|
|
queries.push(new IdMatchQuery("category", categoryOrType));
|
|
}
|
|
|
|
let rarity = document.getElementById("rarity-choice").value;
|
|
if (rarity) {
|
|
if (rarity === "ANY") {
|
|
|
|
}
|
|
else {
|
|
queries.push(new IdMatchQuery("tier", rarity));
|
|
}
|
|
}
|
|
|
|
let level_dat = document.getElementById("level-choice").value.split("-");
|
|
queries.push(new LevelRangeQuery(parseInt(level_dat[0]), parseInt(level_dat[1])));
|
|
|
|
for (let i = 1; i <= 4; ++i) {
|
|
let raw_dat = document.getElementById("filter"+i+"-choice").value;
|
|
let filter_dat = translate_mappings[raw_dat];
|
|
if (filter_dat !== undefined) {
|
|
queries.push(new IdQuery(filter_dat));
|
|
continue;
|
|
}
|
|
filter_dat = special_mappings[raw_dat];
|
|
if (filter_dat !== undefined) {
|
|
queries.push(filter_dat);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
let items_copy = items_expanded.slice();
|
|
document.getElementById("main").textContent = "";
|
|
for (const query of queries) {
|
|
console.log(items_copy.length);
|
|
console.log(query);
|
|
console.log(query.filter);
|
|
items_copy = applyQuery(items_copy, query);
|
|
console.log(items_copy.length);
|
|
}
|
|
document.getElementById("summary").textContent = items_copy.length + " results."
|
|
displayItems(items_copy);
|
|
}
|
|
|
|
function init_items() {
|
|
items_expanded = items.filter( (i) => !("remapID" in i) ).map( (i) => expandItem(i, []) );
|
|
}
|
|
|
|
load_init(init_items);
|