216 lines
7.1 KiB
JavaScript
216 lines
7.1 KiB
JavaScript
const ING_DB_VERSION = 5;
|
|
|
|
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.js
|
|
|
|
let idb;
|
|
let ireload = false;
|
|
let ings;
|
|
let recipes;
|
|
|
|
let ingMap = new Map();
|
|
let ingList = [];
|
|
|
|
let recipeMap = new Map();
|
|
let recipeList = [];
|
|
|
|
let ingIDMap = new Map();
|
|
let recipeIDMap = new Map();
|
|
|
|
/*
|
|
* Load item set from local DB. Calls init() on success.
|
|
*/
|
|
async function ing_load_local(init_func) {
|
|
let get_tx = idb.transaction(['ing_db', 'recipe_db'], 'readonly');
|
|
let ings_store = get_tx.objectStore('ing_db');
|
|
let recipes_store = get_tx.objectStore('recipe_db');
|
|
let request3 = ings_store.getAll();
|
|
request3.onerror = function(event) {
|
|
console.log("Could not read local ingredient db...");
|
|
}
|
|
request3.onsuccess = function(event) {
|
|
console.log("Successfully read local ingredient db.");
|
|
ings = request3.result;
|
|
}
|
|
let request4 = recipes_store.getAll();
|
|
request4.onerror = function(event) {
|
|
console.log("Could not read local recipe db...");
|
|
}
|
|
request4.onsuccess = function(event) {
|
|
console.log("Successfully read local recipe db.");
|
|
recipes = request4.result;
|
|
init_ing_maps();
|
|
init_func();
|
|
}
|
|
await get_tx.complete;
|
|
idb.close();
|
|
}
|
|
|
|
function clean_ing(ing) {
|
|
if (ing.remapID === undefined) {
|
|
if (ing.displayName === undefined) {
|
|
ing.displayName = ing.name;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Load item set from remote DB (aka a big json file). Calls init() on success.
|
|
*/
|
|
async function load_ings(init_func) {
|
|
|
|
let getUrl = window.location;
|
|
let baseUrl = getUrl.protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];
|
|
let url = baseUrl + "/ingreds_compress.json";
|
|
url = url.replace(/\w+.html/, "") ;
|
|
let result = await (await fetch(url)).json();
|
|
|
|
result = await (await fetch(url)).json();
|
|
ings = result.ingredients;
|
|
|
|
url = url.replace("/ingreds_compress.json", "/recipes_compress.json");
|
|
result = await (await fetch(url)).json();
|
|
recipes = result.recipes;
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/clear
|
|
/*let clear_tx2 = db.transaction(['ing_db'], 'readwrite');
|
|
let clear_ings = clear_tx2.objectStore('ing_db');
|
|
let clear_tx3 = db.transaction(['recipe_db'], 'readwrite');
|
|
let clear_recipes = clear_tx3.objectStore('recipe_db');
|
|
await clear_ings.clear();
|
|
await clear_recipes.clear();
|
|
await clear_tx2.complete;
|
|
await clear_tx3.complete;*/
|
|
let add_promises = [];
|
|
let add_tx2 = idb.transaction(['ing_db'], 'readwrite');
|
|
let ings_store = add_tx2.objectStore('ing_db');
|
|
for (const id in ings) {
|
|
clean_ing(ings[id]);
|
|
add_promises.push(ings_store.add(ings[id], id));
|
|
}
|
|
let add_tx3 = idb.transaction(['recipe_db'], 'readwrite');
|
|
let recipes_store = add_tx3.objectStore('recipe_db');
|
|
for (const recipe in recipes) {
|
|
add_promises.push(recipes_store.add(recipes[recipe], recipe));
|
|
}
|
|
add_promises.push(add_tx2.complete);
|
|
add_promises.push(add_tx3.complete);
|
|
Promise.all(add_promises).then((values) => {
|
|
init_ing_maps();
|
|
init_func();
|
|
});
|
|
// DB not closed? idfk man
|
|
}
|
|
|
|
function load_ing_init(init_func) {
|
|
if (idb) {
|
|
console.log("Ingredient db already loaded, skipping load sequence");
|
|
return;
|
|
}
|
|
let request = window.indexedDB.open("ing_db", ING_DB_VERSION)
|
|
request.onerror = function() {
|
|
console.log("DB failed to open...");
|
|
}
|
|
|
|
request.onsuccess = function() {
|
|
idb = request.result;
|
|
if (!ireload) {
|
|
console.log("Using stored data...")
|
|
ing_load_local(init_func);
|
|
}
|
|
else {
|
|
console.log("Using new data...")
|
|
load_ings(init_func);
|
|
}
|
|
}
|
|
|
|
request.onupgradeneeded = function(e) {
|
|
ireload = true;
|
|
|
|
let idb = e.target.result;
|
|
|
|
try {
|
|
idb.deleteObjectStore('ing_db');
|
|
}
|
|
catch (error) {
|
|
console.log("Could not delete ingredient DB. This is probably fine");
|
|
}
|
|
try {
|
|
idb.deleteObjectStore('recipe_db');
|
|
}
|
|
catch (error) {
|
|
console.log("Could not delete recipe DB. This is probably fine");
|
|
}
|
|
idb.createObjectStore('ing_db');
|
|
idb.createObjectStore('recipe_db');
|
|
|
|
console.log("DB setup complete...");
|
|
}
|
|
}
|
|
|
|
function init_ing_maps() {
|
|
let ing = Object();
|
|
ing.name = "No Ingredient";
|
|
ing.displayName = "No Ingredient";
|
|
ing.tier = 0;
|
|
ing.lvl = 0;
|
|
ing.skills = ["ARMOURING", "TAILORING", "WEAPONSMITHING", "WOODWORKING", "JEWELING", "COOKING", "ALCHEMISM", "SCRIBING"];
|
|
ing.ids= {};
|
|
ing.itemIDs = {"dura": 0, "strReq": 0, "dexReq": 0,"intReq": 0,"defReq": 0,"agiReq": 0,};
|
|
ing.consumableIDs = {"dura": 0, "charges": 0};
|
|
ing.posMods = {"left": 0, "right": 0, "above": 0, "under": 0, "touching": 0, "notTouching": 0};
|
|
ing.id = 4000;
|
|
ingMap.set(ing["displayName"], ing);
|
|
ingList.push(ing["displayName"]);
|
|
ingIDMap.set(ing["id"], ing["displayName"]);
|
|
let numerals = new Map([[1, "I"], [2, "II"], [3, "III"], [4, "IV"], [5, "V"], [6, "VI"]]);
|
|
for (let i = 0; i < 5; i ++) {
|
|
for (const powderIng of powderIngreds) {
|
|
let ing = Object();
|
|
ing.name = "" + damageClasses[i+1] + " Powder " + numerals.get(powderIngreds.indexOf(powderIng) + 1);
|
|
ing.displayName = ing.name
|
|
ing.tier = 0;
|
|
ing.lvl = 0;
|
|
ing.skills = ["ARMOURING", "TAILORING", "WEAPONSMITHING", "WOODWORKING"];
|
|
ing.ids = {};
|
|
ing.isPowder = true;
|
|
ing.pid = 6*i + powderIngreds.indexOf(powderIng);
|
|
ing.id = 4001 + ing.pid;
|
|
ing.itemIDs = {"dura": powderIng["durability"], "strReq": 0, "dexReq": 0,"intReq": 0,"defReq": 0,"agiReq": 0,};
|
|
switch(i) {
|
|
case 0:
|
|
ing.itemIDs["strReq"] = powderIng["skpReq"];
|
|
break;
|
|
case 1:
|
|
ing.itemIDs["dexReq"] = powderIng["skpReq"];
|
|
break;
|
|
case 2:
|
|
ing.itemIDs["intReq"] = powderIng["skpReq"];
|
|
break;
|
|
case 3:
|
|
ing.itemIDs["defReq"] = powderIng["skpReq"];
|
|
break;
|
|
case 4:
|
|
ing.itemIDs["agiReq"] = powderIng["skpReq"];
|
|
break;
|
|
}
|
|
ing.consumableIDs = {"dura": 0, "charges": 0};
|
|
ing.posMods = {"left": 0, "right": 0, "above": 0, "under": 0, "touching": 0, "notTouching": 0};
|
|
ingMap.set(ing["displayName"],ing);
|
|
ingList.push(ing["displayName"]);
|
|
ingIDMap.set(ing["id"], ing["displayName"]);
|
|
}
|
|
}
|
|
|
|
|
|
for (const ing of ings) {
|
|
ingMap.set(ing["displayName"], ing);
|
|
ingList.push(ing["displayName"]);
|
|
ingIDMap.set(ing["id"], ing["displayName"]);
|
|
}
|
|
for (const recipe of recipes) {
|
|
recipeMap.set(recipe["name"], recipe);
|
|
recipeList.push(recipe["name"]);
|
|
recipeIDMap.set(recipe["id"],recipe["name"]);
|
|
}
|
|
}
|