From 4fd8c4c3a1490d25c8ac73d93b648abd63e11dff Mon Sep 17 00:00:00 2001 From: Bryce Allen Date: Wed, 12 Aug 2015 01:50:10 -0500 Subject: [PATCH] outfitters: add defense, components, etc - add defense column, with mouse overs for max def, and defense up skill calculation for total max in mouseover - add armor components to row mouse over, with totals in total row mouse over - add row to resist table for resist skills, and include in totals - refactor updating of skill totals and other number dicts --- web/js/common.js | 32 +++++++ web/outfitters.html | 161 ++++++++++++++++++++++++++--------- web/templates/resistance.ejs | 4 + 3 files changed, 157 insertions(+), 40 deletions(-) diff --git a/web/js/common.js b/web/js/common.js index f7f5336..b0f6402 100644 --- a/web/js/common.js +++ b/web/js/common.js @@ -251,6 +251,38 @@ function set_horn_melodies_title(weapon_data) { } +function get_object_as_text(obj) { + /* + var max_len = 0; + $.each(obj, function(k, v) { + if (k.length > max_len) + max_len = k.length + }); + */ + var keys = Object.keys(obj); + keys.sort(); + var lines = []; + $.each(keys, function(i, key) { + //var space = Array(2 + max_len - key.length).join(" "); + lines.push(key + " " + obj[key]); + }); + return lines.join(", "); +} + + +function object_add_values(dst_obj, src_obj) { + // update dst_obj with values from src_obj, adding them together if + // the key is already in dst_obj + $.each(src_obj, function(k, v) { + if (k in dst_obj) { + dst_obj[k] += v; + } else { + dst_obj[k] = v; + } + }); +} + + function get_calculating_palico_setup(weapon_data) { // NB: load_calculating_palico_data must be called first var name = weapon_data["name"]; diff --git a/web/outfitters.html b/web/outfitters.html index bfbb434..8d3965d 100644 --- a/web/outfitters.html +++ b/web/outfitters.html @@ -471,6 +471,8 @@ _reset_slots(type, 0); delete armors[type]; $("#" + type + "_skills").html(""); + $("#" + type + "_row").attr("title", ""); + $("#" + type + "_def").html(""); if (nodisplay == undefined) { save_armors(); save_decorations(); @@ -578,6 +580,11 @@ var element_resist = {}; var slots = 0; var slots_free = 0; + var total_defense = 0; + var total_max_defense = 0; + + // map of component name to count + var components = {}; $.each(GEAR, function(i, type) { var gear_decorations = {}; @@ -585,6 +592,16 @@ var armor = armors[type]; if (armor == undefined) { armor = { "skills": [], "num_slots": 0 }; + } else if (type != "Weapon" && type != "Talisman") { + total_defense += armor["defense"]; + total_max_defense += armor["max_defense"]; + $("#" + type + "_def").html("" + armor["defense"]); + $("#" + type + "_def").attr("title", "Max:" + + armor["max_defense"]); + + var comps_txt = get_object_as_text(armor["create_components"]); + $("#" + type + "_row").attr("title", comps_txt); + object_add_values(components, armor["create_components"]); } if (decorations[type] == undefined) { decorations[type] = []; @@ -603,36 +620,16 @@ armor_skills = armor["skills"]; gear_decorations = decorations[type]; } - $.each(armor_skills, function(skill_name, skill_value) { - if (! (skill_name in skills)) { - skills[skill_name] = 0; - } - skills[skill_name] += skill_value; - - if (! (skill_name in tskills_by_type[type])) { - tskills_by_type[type][skill_name] = 0; - } - tskills_by_type[type][skill_name] += skill_value; - }); - $.each(gear_decorations, function(i, decoration) { - $.each(decoration["skills"], - function(skill_name, skill_value) { - if (! (skill_name in skills)) { - skills[skill_name] = 0; - } - skills[skill_name] += skill_value; - if (! (skill_name in dskills_by_type[type])) { - dskills_by_type[type][skill_name] = 0; - } - dskills_by_type[type][skill_name] += skill_value; + // add armor skills + object_add_values(skills, armor_skills); + object_add_values(tskills_by_type[type], armor_skills); - if (! (skill_name in tskills_by_type[type])) { - tskills_by_type[type][skill_name] = 0; - } - tskills_by_type[type][skill_name] += skill_value; - } - ); + // add decoration skills + $.each(gear_decorations, function(i, decoration) { + object_add_values(skills, decoration["skills"]); + object_add_values(dskills_by_type[type], decoration["skills"]); + object_add_values(tskills_by_type[type], decoration["skills"]); }); $.each(ELEMENTS, function(i, element) { key = element + "_res"; @@ -651,6 +648,11 @@ }); $("#Total_slots").html((slots - slots_free) + " used / " + slots + " slots"); + $("#Total_def").html("" + total_defense); + $("#Total_def").prop("title", "Max:" + total_max_defense); + + var comps_txt = get_object_as_text(components); + $("#Total_row").attr("title", comps_txt); var skill_names = Object.keys(skills); skill_names.sort(function(a, b) { @@ -660,24 +662,46 @@ }); var active_skills = {} - $.each(skills, function(skill_name, total_points) { - var skill_tree_id = skill_trees[skill_name]["id"]; + var skill_res = {} + $.each(skills, function(tree_name, total_points) { + var skill_tree_id = skill_trees[tree_name]["id"]; var current_tree_skills = tree_skills[skill_tree_id] || []; + var found = 0; // 1 or -1 for plus/minus for (i=0; i 0) { if (total_points >= required_points && required_points > 0) { - active_skills[skill_name] = skill; + active_skills[tree_name] = skill; + found = 1; break; } } else if (total_points < 0) { if (total_points <= required_points && required_points < 0) { - active_skills[skill_name] = skill; + active_skills[tree_name] = skill; + found = -1; break; } } } + if (found != 0) { + var element_res = parse_element_res_skill(skill["name"]); + if (element_res) { + skill_res[element_res[0]] = element_res[1]; + element_resist[element] += element_res[1]; + } + var defense_skill = parse_defense_skill(skill["name"]); + if (defense_skill && defense_skill[0] == "Up") { + total_defense2 = get_defense_up(total_defense, + defense_skill[1]); + total_max_defense2 = get_defense_up(total_max_defense, + defense_skill[1]); + $("#Total_def").prop("title", + "Max:" + total_max_defense + + " (" + total_max_defense2 + + " with armor skill)"); + } + } }); var skills_table = template_skills.render( @@ -694,55 +718,110 @@ { TYPES: TYPES, ELEMENTS: ELEMENTS, armors: armors, + skill_res: skill_res, element_resist: element_resist }); $("#resist_div").html(resist_table); } + + function parse_element_res_skill(skill_name) { + parts = skill_name.split(" "); + //console.log("skill parts: " + JSON.stringify(parts)); + if (parts.length != 3) { + return null; + } + if (parts[1] != "Res") { + return null; + } + element = parts[0].toLowerCase(); + amount = parseInt(parts[2]); + return [element, amount]; + } + + function parse_defense_skill(skill_name) { + // Return [Up|Down, (S, M, L, or XL)] if defense skill, null otherwise + parts = skill_name.split(" "); + //console.log("skill parts: " + JSON.stringify(parts)); + if (parts.length != 3) { + return null; + } + if (parts[0] != "Defense") { + return null; + } + level = parts[2].substring(1, parts[2].length - 1); + console.log("defense skill: " + parts[1] + " " + level); + return [parts[1], level]; + } + + function get_defense_up(defense, skill_level) { + switch (skill_level) { + case "S": + defense = defense + 15; + break; + case "M": + defense = Math.floor(defense * 1.03) + 20; + break; + case "L": + defense = Math.floor(defense * 1.05) + 25; + break; + case "XL": + defense = Math.floor(defense * 1.08) + 30; + break; + } + return defense; + } + - + + - + + - + + - + + - + + - + + - + + - + +
slots     
    
    
    
    
    
@@ -755,12 +834,14 @@ slots     
    0   
diff --git a/web/templates/resistance.ejs b/web/templates/resistance.ejs index 2dd4822..516c80c 100644 --- a/web/templates/resistance.ejs +++ b/web/templates/resistance.ejs @@ -7,6 +7,7 @@ Arms Waist Legs + Skills <% for(var i=0; i @@ -17,5 +18,8 @@ <%= armors[TYPES[j]] ? armors[TYPES[j]][ELEMENTS[i] + "_res"] : " " %> <% } %> + + <%= skill_res[ELEMENTS[i]] + ? skill_res[ELEMENTS[i]] : " " %> <% } %>