190 lines
6.8 KiB
JavaScript
190 lines
6.8 KiB
JavaScript
/*Turns the input amount of skill points into a float precision percentage.
|
|
* @param skp - the integer skillpoint count to be converted
|
|
*/
|
|
function skillPointsToPercentage(skp){
|
|
if (skp<=0){
|
|
return 0.0;
|
|
}else if(skp>=150){
|
|
return 0.808;
|
|
}else{
|
|
return(-0.0000000066695* Math.pow(Math.E, -0.00924033 * skp + 18.9) + 1.0771);
|
|
//return(-0.0000000066695* Math.pow(Math.E, -0.00924033 * skp + 18.9) + 1.0771).toFixed(3);
|
|
}
|
|
}
|
|
|
|
/*Turns the input amount of levels into skillpoints available.
|
|
*
|
|
* @param level - the integer level count te be converted
|
|
*/
|
|
function levelToSkillPoints(level){
|
|
if(level < 1){
|
|
return 0;
|
|
}else if(level >= 101){
|
|
return 200;
|
|
}else{
|
|
return (level - 1) * 2;
|
|
}
|
|
}
|
|
|
|
/*Turns the input amount of levels in to base HP.
|
|
* @param level - the integer level count to be converted
|
|
*/
|
|
function levelToHPBase(level){
|
|
if(level < 1){ //bad level
|
|
return this.levelToHPBase(1);
|
|
}else if (level > 106){ //also bad level
|
|
return this.levelToHPBase(106);
|
|
}else{ //good level
|
|
return 5*level + 5;
|
|
}
|
|
}
|
|
|
|
|
|
/*Class that represents a wynn player's build.
|
|
*/
|
|
class Build{
|
|
|
|
/*Construct a build.
|
|
*/
|
|
constructor(level,helmet,chestplate,leggings,boots,ring1,ring2,bracelet,necklace,weapon){
|
|
if(helmet.type.valueOf() != "helmet".valueOf()){
|
|
throw new TypeError("No such helmet named ", helmet.name);
|
|
}else{
|
|
this.helmet = helmet;
|
|
}
|
|
if(chestplate.type.valueOf() != "chestplate"){
|
|
throw new TypeError("No such chestplate named ", chestplate.name);
|
|
}else{
|
|
this.chestplate = chestplate;
|
|
}
|
|
if(leggings.type.valueOf() != "leggings"){
|
|
throw new TypeError("No such leggings named ", leggings.name);
|
|
}else{
|
|
this.leggings = leggings;
|
|
}
|
|
if(boots.type.valueOf() != "boots"){
|
|
throw new TypeError("No such boots named ", boots.name);
|
|
}else{
|
|
this.boots = boots;
|
|
}
|
|
if(ring1.type.valueOf() != "ring"){
|
|
throw new TypeError("No such ring named ", ring1.name);
|
|
}else{
|
|
this.ring1 = ring1;
|
|
}
|
|
if(ring2.type.valueOf() != "ring"){
|
|
throw new TypeError("No such ring named ", ring2.name);
|
|
}else{
|
|
this.ring2 = ring2;
|
|
}
|
|
if(bracelet.type.valueOf() != "bracelet"){
|
|
throw new TypeError("No such bracelet named ", bracelet.name);
|
|
}else{
|
|
this.bracelet = bracelet;
|
|
}
|
|
if(necklace.type.valueOf() != "necklace"){
|
|
throw new TypeError("No such necklace named ", necklace.name);
|
|
}else{
|
|
this.necklace = necklace;
|
|
}
|
|
if(weapon.type.valueOf() == "wand" || weapon.type.valueOf() == "bow" || weapon.type.valueOf() == "dagger" || weapon.type.valueOf() == "spear" || weapon.type.valueOf() == "relik"){
|
|
this.weapon = weapon;
|
|
}else{
|
|
throw new TypeError("No such weapon named ", weapon.name);
|
|
}
|
|
if(level < 1){ //Should these be constants?
|
|
this.level = 1;
|
|
}else if (level > 106){
|
|
this.level = 106;
|
|
}else{
|
|
this.level = level;
|
|
}
|
|
this.availableSkillpoints = levelToSkillPoints(this.level);
|
|
this.equipment = [ helmet, chestplate, leggings, boots, ring1, ring2, bracelet, necklace ];
|
|
this.items = [helmet, chestplate, leggings, boots, ring1, ring2, bracelet, necklace, weapon];
|
|
// return [equip_order, best_skillpoints, final_skillpoints, best_total];
|
|
let result = calculate_skillpoints(this.equipment, weapon);
|
|
console.log(result);
|
|
this.equip_order = result[0];
|
|
this.base_skillpoints = result[1];
|
|
this.total_skillpoints = result[2];
|
|
this.assigned_skillpoints = result[3];
|
|
}
|
|
|
|
/*Returns build in string format
|
|
*/
|
|
toString(){
|
|
return this.helmet.name + ", " + this.chestplate.name + ", " + this.leggings.name + ", " + this.boots.name + ", " + this.ring1.name + ", " + this.ring2.name + ", " + this.bracelet.name + ", " + this.necklace.name + ", " + this.weapon.name;
|
|
}
|
|
|
|
/* Getters */
|
|
|
|
/* Get total health for build.
|
|
*/
|
|
getHealth(){
|
|
health = parseInt(this.helmet.hp,10) + parseInt(this.helmet.hpBonus,10) + parseInt(this.chestplate.hp,10) + parseInt(this.chestplate.hpBonus,10) + parseInt(this.leggings.hp,10) + parseInt(this.leggings.hpBonus,10) + parseInt(this.boots.hp,10) + parseInt(this.boots.hpBonus,10) + parseInt(this.ring1.hp,10) + parseInt(this.ring1.hpBonus,10) + parseInt(this.ring2.hp,10) + parseInt(this.ring2.hpBonus,10) + parseInt(this.bracelet.hp,10) + parseInt(this.bracelet.hpBonus,10) + parseInt(this.necklace.hp,10) + parseInt(this.necklace.hpBonus,10) + parseInt(this.weapon.hp,10) + parseInt(this.weapon.hpBonus,10) + levelToHPBase(this.level);
|
|
if(health<5){
|
|
return 5;
|
|
}else{
|
|
return health;
|
|
}
|
|
}
|
|
/* Get total melee dps for build.
|
|
*/
|
|
getMeleeDPS(){
|
|
let meleeMult = {
|
|
"SUPER_SLOW":"0.51",
|
|
"VERY_SLOW":"0.83",
|
|
"SLOW":"1.5",
|
|
"NORMAL":"2.05",
|
|
"FAST":"2.5",
|
|
"VERY_FAST":"3.1",
|
|
"SUPER_FAST":"4.3",
|
|
}
|
|
let stats = this.getBuildStats();
|
|
let nDam = stats.get("nDam");
|
|
|
|
return [];
|
|
}
|
|
|
|
/* Get all stats for this build. Returns a map w/ sums of all IDs.
|
|
@dep test.js.item_fields
|
|
@dep test.js.rolledIDs
|
|
@dep test.js.nonRolledIDs
|
|
@dep test.js.expandItem()
|
|
@pre The build itself should be valid. No checking of validity of pieces is done here.
|
|
@post The map returned will contain non-stacking IDs w/ a value null.
|
|
*/
|
|
getBuildStats(){
|
|
//Create a map of this build's stats
|
|
//This is universal for every possible build, so it's possible to move this elsewhere.
|
|
let statMap = new Map();
|
|
for (const i in item_fields){
|
|
let id = item_fields[i];
|
|
if(stackingIDs.includes(id)){ //IDs stack - make it number
|
|
statMap.set(id,0);
|
|
}else if(standaloneIDs.includes(id)){ //IDs do not stack - string
|
|
statMap.set(id,"");
|
|
}
|
|
}
|
|
for (const i in this.items){
|
|
let item = expandItem(this.items[i]);
|
|
console.log(item,type(item));
|
|
if(item.has("fixID") && item.get("fixID")){//item has fixed IDs
|
|
for(const [key,value] in item.entries()){
|
|
console.log(key,value);
|
|
}
|
|
}else{//item does not have fixed IDs
|
|
for (const i in item) {
|
|
console.log(entry,": ",item.get(entry));
|
|
}
|
|
}
|
|
}
|
|
|
|
return statMap;
|
|
}
|
|
|
|
/* Setters */
|
|
|
|
|
|
}
|