Make encoding method backwards compatible and export the lowest version encoding possible (up to 4)

This commit is contained in:
hppeng 2022-05-21 11:33:28 -07:00
parent f8d90b347e
commit ac636c9498
3 changed files with 80 additions and 179 deletions

View file

@ -221,11 +221,8 @@ function init_maps() {
["accessory", "bracelet", "No Bracelet"], ["accessory", "bracelet", "No Bracelet"],
["accessory", "necklace", "No Necklace"], ["accessory", "necklace", "No Necklace"],
["weapon", "dagger", "No Weapon"], ["weapon", "dagger", "No Weapon"],
["tome", "weaponTome", "No Weapon Tome"],
["tome", "armorTome", "No Armour Tome"],
["tome", "guildTome", "No Guild Tome"]
]; ];
for (let i = 0; i < 12; i++) { for (let i = 0; i < noneItems.length; i++) {
let item = Object(); let item = Object();
item.slots = 0; item.slots = 0;
item.category = noneItems[i][0]; item.category = noneItems[i][0];

View file

@ -339,7 +339,7 @@ class Build{
} else { } else {
try { try {
let weaponTome1 = getCustomFromHash(tomes[0]) ? getCustomFromHash(tomes[0]) : undefined; let weaponTome1 = getCustomFromHash(tomes[0]) ? getCustomFromHash(tomes[0]) : undefined;
if (weaponTome1.statMap.get("type") !== "weaponTome1") { if (weaponTome1.statMap.get("type") !== "weaponTome") {
throw new Error("Not a Weapon Tome"); throw new Error("Not a Weapon Tome");
} }
if (this.weaponTome1.get("custom")) { if (this.weaponTome1.get("custom")) {
@ -358,7 +358,7 @@ class Build{
} else { } else {
try { try {
let weaponTome2 = getCustomFromHash(tomes[1]) ? getCustomFromHash(tomes[1]) : undefined; let weaponTome2 = getCustomFromHash(tomes[1]) ? getCustomFromHash(tomes[1]) : undefined;
if (weaponTome2.statMap.get("type") !== "weaponTome2") { if (weaponTome2.statMap.get("type") !== "weaponTome") {
throw new Error("Not a Weapon Tome"); throw new Error("Not a Weapon Tome");
} }
if (this.weaponTome2.get("custom")) { if (this.weaponTome2.get("custom")) {
@ -377,7 +377,7 @@ class Build{
} else { } else {
try { try {
let armorTome1 = getCustomFromHash(tomes[2]) ? getCustomFromHash(tomes[2]) : undefined; let armorTome1 = getCustomFromHash(tomes[2]) ? getCustomFromHash(tomes[2]) : undefined;
if (armorTome1.statMap.get("type") !== "armorTome1") { if (armorTome1.statMap.get("type") !== "armorTome") {
throw new Error("Not an Armor Tome"); throw new Error("Not an Armor Tome");
} }
if (this.armorTome1.get("custom")) { if (this.armorTome1.get("custom")) {
@ -396,7 +396,7 @@ class Build{
} else { } else {
try { try {
let armorTome2 = getCustomFromHash(tomes[3]) ? getCustomFromHash(tomes[3]) : undefined; let armorTome2 = getCustomFromHash(tomes[3]) ? getCustomFromHash(tomes[3]) : undefined;
if (armorTome2.statMap.get("type") !== "armorTome2") { if (armorTome2.statMap.get("type") !== "armorTome") {
throw new Error("Not an Armor Tome"); throw new Error("Not an Armor Tome");
} }
if (this.armorTome2.get("custom")) { if (this.armorTome2.get("custom")) {
@ -415,7 +415,7 @@ class Build{
} else { } else {
try { try {
let armorTome3 = getCustomFromHash(tomes[4]) ? getCustomFromHash(tomes[4]) : undefined; let armorTome3 = getCustomFromHash(tomes[4]) ? getCustomFromHash(tomes[4]) : undefined;
if (armorTome3.statMap.get("type") !== "armorTome3") { if (armorTome3.statMap.get("type") !== "armorTome") {
throw new Error("Not an Armor Tome"); throw new Error("Not an Armor Tome");
} }
if (this.armorTome3.get("custom")) { if (this.armorTome3.get("custom")) {
@ -434,7 +434,7 @@ class Build{
} else { } else {
try { try {
let armorTome4 = getCustomFromHash(tomes[5]) ? getCustomFromHash(tomes[5]) : undefined; let armorTome4 = getCustomFromHash(tomes[5]) ? getCustomFromHash(tomes[5]) : undefined;
if (armorTome4.statMap.get("type") !== "armorTome4") { if (armorTome4.statMap.get("type") !== "armorTome") {
throw new Error("Not an Armor Tome"); throw new Error("Not an Armor Tome");
} }
if (this.armorTome4.get("custom")) { if (this.armorTome4.get("custom")) {

View file

@ -137,7 +137,7 @@ function parsePowdering(powder_info) {
} }
powdering[i] = powders; powdering[i] = powders;
} }
return powdering; return [powdering, powder_info];
} }
/* /*
@ -155,8 +155,10 @@ function decodeBuild(url_tag) {
let skillpoints = [0, 0, 0, 0, 0]; let skillpoints = [0, 0, 0, 0, 0];
let level = 106; let level = 106;
version_number = parseInt(version)
//equipment (items) //equipment (items)
if (version === "0" || version === "1" || version === "2" || version === "3") { // TODO: use filters
if (version_number < 4) {
let equipments = info[1]; let equipments = info[1];
for (let i = 0; i < 9; ++i ) { for (let i = 0; i < 9; ++i ) {
let equipment_str = equipments.slice(i*3,i*3+3); let equipment_str = equipments.slice(i*3,i*3+3);
@ -164,7 +166,7 @@ function decodeBuild(url_tag) {
} }
info[1] = equipments.slice(27); info[1] = equipments.slice(27);
} }
if (version === "4") { else if (version_number == 4) {
let info_str = info[1]; let info_str = info[1];
let start_idx = 0; let start_idx = 0;
for (let i = 0; i < 9; ++i ) { for (let i = 0; i < 9; ++i ) {
@ -180,7 +182,7 @@ function decodeBuild(url_tag) {
} }
info[1] = info_str.slice(start_idx); info[1] = info_str.slice(start_idx);
} }
if (version === "5") { else if (version_number <= 6) {
let info_str = info[1]; let info_str = info[1];
let start_idx = 0; let start_idx = 0;
for (let i = 0; i < 9; ++i ) { for (let i = 0; i < 9; ++i ) {
@ -199,46 +201,17 @@ function decodeBuild(url_tag) {
} }
info[1] = info_str.slice(start_idx); info[1] = info_str.slice(start_idx);
} }
if (version === "6") {
let info_str = info[1];
let start_idx = 0;
for (let i = 0; i < 9; ++i ) {
if (info_str.slice(start_idx,start_idx+3) === "CR-") {
equipment[i] = info_str.slice(start_idx, start_idx+20);
start_idx += 20;
} else if (info_str.slice(start_idx+3,start_idx+6) === "CI-") {
let len = Base64.toInt(info_str.slice(start_idx,start_idx+3));
equipment[i] = info_str.slice(start_idx+3,start_idx+3+len);
start_idx += (3+len);
} else {
let equipment_str = info_str.slice(start_idx, start_idx+3);
equipment[i] = getItemNameFromID(Base64.toInt(equipment_str));
start_idx += 3;
}
}
//tomes!
for (let i = 0; i < 7; ++i) {
let tome_str = info_str.charAt(start_idx);
tomes[i] = getTomeNameFromID(Base64.toInt(tome_str));
start_idx += 1;
}
info[1] = info_str.slice(start_idx);
//tome values do not appear in anything before v6.
for (let i in tomes) {
setValue(tomeInputs[i], tomes[i]);
}
}
//constant in all versions //constant in all versions
for (let i in equipment) { for (let i in equipment) {
setValue(equipmentInputs[i], equipment[i]); setValue(equipmentInputs[i], equipment[i]);
} }
//level, skill point assignments, and powdering //level, skill point assignments, and powdering
if (version === "1") { if (version_number == 1) {
let powder_info = info[1]; let powder_info = info[1];
powdering = parsePowdering(powder_info); let res = parsePowdering(powder_info);
} else if (version === "2") { powdering = res[0];
} else if (version_number == 2) {
save_skp = true; save_skp = true;
let skillpoint_info = info[1].slice(0, 10); let skillpoint_info = info[1].slice(0, 10);
for (let i = 0; i < 5; ++i ) { for (let i = 0; i < 5; ++i ) {
@ -246,8 +219,9 @@ function decodeBuild(url_tag) {
} }
let powder_info = info[1].slice(10); let powder_info = info[1].slice(10);
powdering = parsePowdering(powder_info); let res = parsePowdering(powder_info);
} else if (version === "3" || version === "4" || version === "5" || version === "6"){ powdering = res[0];
} else if (version_number <= 6){
level = Base64.toInt(info[1].slice(10,12)); level = Base64.toInt(info[1].slice(10,12));
setValue("level-choice",level); setValue("level-choice",level);
save_skp = true; save_skp = true;
@ -258,8 +232,22 @@ function decodeBuild(url_tag) {
let powder_info = info[1].slice(12); let powder_info = info[1].slice(12);
powdering = parsePowdering(powder_info); let res = parsePowdering(powder_info);
powdering = res[0];
info[1] = res[1];
} }
// Tomes.
if (version == 6) {
//tome values do not appear in anything before v6.
for (let i = 0; i < 7; ++i) {
let tome_str = info[1].charAt(i);
for (let i in tomes) {
setValue(tomeInputs[i], getTomeNameFromID(Base64.toInt(tome_str)));
}
}
info[1] = info[1].slice(7);
}
for (let i in powderInputs) { for (let i in powderInputs) {
setValue(powderInputs[i], powdering[i]); setValue(powderInputs[i], powdering[i]);
} }
@ -276,141 +264,57 @@ function encodeBuild() {
let build_string; let build_string;
//V6 encoding - Tomes //V6 encoding - Tomes
if (player_build.items.length == 16 && player_build.tomes) { build_version = 4;
build_string = "6_"; build_string = "";
tome_string = "";
let crafted_idx = 0; let crafted_idx = 0;
let custom_idx = 0; let custom_idx = 0;
for (const item of player_build.items) { for (const item of player_build.items) {
if (item.get("custom")) { if (item.get("custom")) {
let custom = "CI-"+encodeCustom(player_build.customItems[custom_idx],true); let custom = "CI-"+encodeCustom(player_build.customItems[custom_idx],true);
build_string += Base64.fromIntN(custom.length, 3) + custom; build_string += Base64.fromIntN(custom.length, 3) + custom;
custom_idx += 1; custom_idx += 1;
} else if (item.get("crafted")) { build_version = Math.max(build_version, 5);
build_string += "CR-"+encodeCraft(player_build.craftedItems[crafted_idx]); } else if (item.get("crafted")) {
crafted_idx += 1; build_string += "CR-"+encodeCraft(player_build.craftedItems[crafted_idx]);
} else if (item.get("category") === "tome") { crafted_idx += 1;
build_string += Base64.fromIntN(item.get("id"), 1); } else if (item.get("category") === "tome") {
} else { let tome_id = item.get("id");
build_string += Base64.fromIntN(item.get("id"), 3); if (tome_id <= 60) {
} // valid normal tome. ID 61-63 is for NONE tomes.
} build_version = Math.max(build_version, 6);
for (const skp of skp_order) {
build_string += Base64.fromIntN(getValue(skp + "-skp"), 2); // Maximum skillpoints: 2048
}
build_string += Base64.fromIntN(player_build.level, 2);
for (const _powderset of player_build.powders) {
let n_bits = Math.ceil(_powderset.length / 6);
build_string += Base64.fromIntN(n_bits, 1); // Hard cap of 378 powders.
// Slice copy.
let powderset = _powderset.slice();
while (powderset.length != 0) {
let firstSix = powderset.slice(0,6).reverse();
let powder_hash = 0;
for (const powder of firstSix) {
powder_hash = (powder_hash << 5) + 1 + powder; // LSB will be extracted first.
}
build_string += Base64.fromIntN(powder_hash, 5);
powderset = powderset.slice(6);
} }
tome_string += Base64.fromIntN(tome_id, 1);
} else {
build_string += Base64.fromIntN(item.get("id"), 3);
} }
} }
return build_string; for (const skp of skp_order) {
build_string += Base64.fromIntN(getValue(skp + "-skp"), 2); // Maximum skillpoints: 2048
}
build_string += Base64.fromIntN(player_build.level, 2);
for (const _powderset of player_build.powders) {
let n_bits = Math.ceil(_powderset.length / 6);
build_string += Base64.fromIntN(n_bits, 1); // Hard cap of 378 powders.
// Slice copy.
let powderset = _powderset.slice();
while (powderset.length != 0) {
let firstSix = powderset.slice(0,6).reverse();
let powder_hash = 0;
for (const powder of firstSix) {
powder_hash = (powder_hash << 5) + 1 + powder; // LSB will be extracted first.
}
build_string += Base64.fromIntN(powder_hash, 5);
powderset = powderset.slice(6);
}
}
build_string += tome_string;
return build_version.toString() + "_" + build_string;
} }
/* For reference in development - V5 and V4 encoding schemes */
// //V5 encoding - Custom Items
// if (player_build.customItems.length > 0) {
// build_string = "5_";
// let crafted_idx = 0;
// let custom_idx = 0;
// for (const item of player_build.items) {
// //skip tomes (do we skip them?)
// if (item.category === "tome") {
// continue;
// }
// if (item.get("custom")) {
// let custom = "CI-"+encodeCustom(player_build.customItems[custom_idx],true);
// build_string += Base64.fromIntN(custom.length, 3) + custom;
// custom_idx += 1;
// } else if (item.get("crafted")) {
// build_string += "CR-"+encodeCraft(player_build.craftedItems[crafted_idx]);
// crafted_idx += 1;
// } else {
// build_string += Base64.fromIntN(item.get("id"), 3);
// }
// }
// for (const skp of skp_order) {
// build_string += Base64.fromIntN(getValue(skp + "-skp"), 2); // Maximum skillpoints: 2048
// }
// build_string += Base64.fromIntN(player_build.level, 2);
// for (const _powderset of player_build.powders) {
// let n_bits = Math.ceil(_powderset.length / 6);
// build_string += Base64.fromIntN(n_bits, 1); // Hard cap of 378 powders.
// // Slice copy.
// let powderset = _powderset.slice();
// while (powderset.length != 0) {
// let firstSix = powderset.slice(0,6).reverse();
// let powder_hash = 0;
// for (const powder of firstSix) {
// powder_hash = (powder_hash << 5) + 1 + powder; // LSB will be extracted first.
// }
// build_string += Base64.fromIntN(powder_hash, 5);
// powderset = powderset.slice(6);
// }
// }
// } else { //v4 encoding
// build_string = "4_";
// let crafted_idx = 0;
// for (const item of player_build.items) {
// //skip tomes for now
// if (item.get("category") === "tome") {
// continue;
// }
// if (item.get("crafted")) {
// build_string += "-"+encodeCraft(player_build.craftedItems[crafted_idx]);
// crafted_idx += 1;
// } else {
// build_string += Base64.fromIntN(item.get("id"), 3);
// }
// }
// for (const skp of skp_order) {
// build_string += Base64.fromIntN(getValue(skp + "-skp"), 2); // Maximum skillpoints: 2048
// }
// build_string += Base64.fromIntN(player_build.level, 2);
// for (const _powderset of player_build.powders) {
// let n_bits = Math.ceil(_powderset.length / 6);
// build_string += Base64.fromIntN(n_bits, 1); // Hard cap of 378 powders.
// // Slice copy.
// let powderset = _powderset.slice();
// while (powderset.length != 0) {
// let firstSix = powderset.slice(0,6).reverse();
// let powder_hash = 0;
// for (const powder of firstSix) {
// powder_hash = (powder_hash << 5) + 1 + powder; // LSB will be extracted first.
// }
// build_string += Base64.fromIntN(powder_hash, 5);
// powderset = powderset.slice(6);
// }
// }
// }
// this.equipment = [ this.helmet, this.chestplate, this.leggings, this.boots, this.ring1, this.ring2, this.bracelet, this.necklace ];
// let build_string = "3_" + Base64.fromIntN(player_build.helmet.get("id"), 3) +
// Base64.fromIntN(player_build.chestplate.get("id"), 3) +
// Base64.fromIntN(player_build.leggings.get("id"), 3) +
// Base64.fromIntN(player_build.boots.get("id"), 3) +
// Base64.fromIntN(player_build.ring1.get("id"), 3) +
// Base64.fromIntN(player_build.ring2.get("id"), 3) +
// Base64.fromIntN(player_build.bracelet.get("id"), 3) +
// Base64.fromIntN(player_build.necklace.get("id"), 3) +
// Base64.fromIntN(player_build.weapon.get("id"), 3);
return "";
} }
function calculateBuild(save_skp, skp){ function calculateBuild(save_skp, skp){