itemLists is now an object
also some test code for scc
This commit is contained in:
parent
efad0b5fdd
commit
6c7c274f81
3 changed files with 52 additions and 9 deletions
|
@ -164,7 +164,7 @@ function init_autocomplete() {
|
||||||
let item_arr = [];
|
let item_arr = [];
|
||||||
if (eq == 'weapon') {
|
if (eq == 'weapon') {
|
||||||
for (const weaponType of weapon_keys) {
|
for (const weaponType of weapon_keys) {
|
||||||
for (const weapon of itemLists.get(weaponType)) {
|
for (const weapon of itemLists[weaponType]) {
|
||||||
let item_obj = itemMap.get(weapon);
|
let item_obj = itemMap.get(weapon);
|
||||||
if (item_obj["restrict"] && item_obj["restrict"] === "DEPRECATED") {
|
if (item_obj["restrict"] && item_obj["restrict"] === "DEPRECATED") {
|
||||||
continue;
|
continue;
|
||||||
|
@ -176,7 +176,7 @@ function init_autocomplete() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (const item of itemLists.get(eq.replace(/[0-9]/g, ''))) {
|
for (const item of itemLists[eq.replace(/[0-9]/g, '')]) {
|
||||||
let item_obj = itemMap.get(item);
|
let item_obj = itemMap.get(item);
|
||||||
if (item_obj["restrict"] && item_obj["restrict"] === "DEPRECATED") {
|
if (item_obj["restrict"] && item_obj["restrict"] === "DEPRECATED") {
|
||||||
continue;
|
continue;
|
||||||
|
|
14
js/load.js
14
js/load.js
|
@ -10,7 +10,12 @@ let sets = new Map();
|
||||||
let itemMap;
|
let itemMap;
|
||||||
let idMap;
|
let idMap;
|
||||||
let redirectMap;
|
let redirectMap;
|
||||||
let itemLists = new Map();
|
let itemLists = {};
|
||||||
|
// List of 'raw' "none" items (No Helmet, etc), in order helmet, chestplate... ring1, ring2, brace, neck, weapon.
|
||||||
|
for (const it of itemTypes) {
|
||||||
|
itemLists[it] = [];
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load item set from local DB. Calls init() on success.
|
* Load item set from local DB. Calls init() on success.
|
||||||
*/
|
*/
|
||||||
|
@ -189,11 +194,6 @@ async function load_init() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of 'raw' "none" items (No Helmet, etc), in order helmet, chestplate... ring1, ring2, brace, neck, weapon.
|
|
||||||
for (const it of itemTypes) {
|
|
||||||
itemLists.set(it, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
let none_items = [
|
let none_items = [
|
||||||
["armor", "helmet", "No Helmet"],
|
["armor", "helmet", "No Helmet"],
|
||||||
["armor", "chestplate", "No Chestplate"],
|
["armor", "chestplate", "No Chestplate"],
|
||||||
|
@ -241,7 +241,7 @@ function init_maps() {
|
||||||
//console.log(items);
|
//console.log(items);
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
if (item.remapID === undefined) {
|
if (item.remapID === undefined) {
|
||||||
itemLists.get(item.type).push(item.displayName);
|
itemLists[item.type].push(item.displayName);
|
||||||
itemMap.set(item.displayName, item);
|
itemMap.set(item.displayName, item);
|
||||||
if (none_items.includes(item)) {
|
if (none_items.includes(item)) {
|
||||||
idMap.set(item.id, "");
|
idMap.set(item.id, "");
|
||||||
|
|
|
@ -117,6 +117,7 @@ function calculate_skillpoints(equipment, weapon) {
|
||||||
let allFalse = [0, 0, 0, 0, 0];
|
let allFalse = [0, 0, 0, 0, 0];
|
||||||
if (consider.length > 0 || noboost.length > 0 || crafted.length > 0) {
|
if (consider.length > 0 || noboost.length > 0 || crafted.length > 0) {
|
||||||
// Try every combination and pick the best one.
|
// Try every combination and pick the best one.
|
||||||
|
construct_scc_graph(consider);
|
||||||
for (let permutation of perm(consider)) {
|
for (let permutation of perm(consider)) {
|
||||||
let activeSetCounts = new Map(static_activeSetCounts);
|
let activeSetCounts = new Map(static_activeSetCounts);
|
||||||
let has_skillpoint = allFalse.slice();
|
let has_skillpoint = allFalse.slice();
|
||||||
|
@ -216,3 +217,45 @@ function calculate_skillpoints(equipment, weapon) {
|
||||||
document.getElementById('stack-box').textContent = output_msg;
|
document.getElementById('stack-box').textContent = output_msg;
|
||||||
return [equip_order, best_skillpoints, final_skillpoints, best_total, best_activeSetCounts];
|
return [equip_order, best_skillpoints, final_skillpoints, best_total, best_activeSetCounts];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function construct_scc_graph(items_to_consider) {
|
||||||
|
let nodes = [];
|
||||||
|
for (const item of items_to_consider) {
|
||||||
|
nodes.push({item: item, children: [], parents: [], visited: false});
|
||||||
|
}
|
||||||
|
let root_node = {
|
||||||
|
children: nodes,
|
||||||
|
parents: [],
|
||||||
|
visited: false
|
||||||
|
};
|
||||||
|
// Dependency graph construction.
|
||||||
|
for (const node_a of nodes) {
|
||||||
|
const {item: a, children: a_children} = node_a;
|
||||||
|
for (const node_b of nodes) {
|
||||||
|
const {item: b, parents: b_parents} = node_b;
|
||||||
|
for (let i = 0; i < 5; ++i) {
|
||||||
|
if (b.reqs[i] < a.reqs[i] && b.skillpoints[i]) {
|
||||||
|
a_children.push(node_b);
|
||||||
|
b_parents.push(node_a);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const res = []
|
||||||
|
/*
|
||||||
|
* SCC graph construction.
|
||||||
|
* https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm
|
||||||
|
*/
|
||||||
|
function visit(u, res) {
|
||||||
|
if (u.visited) { return; }
|
||||||
|
u.visited = true;
|
||||||
|
for (const child of u.children) {
|
||||||
|
if (!child.visited) { visit(child, res); }
|
||||||
|
}
|
||||||
|
res.push(u);
|
||||||
|
}
|
||||||
|
visit(root_node, res);
|
||||||
|
res.reverse();
|
||||||
|
console.log(res);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue