add bow data to weapon search

main
Bryce Allen 10 years ago
parent 018c9f840c
commit 472f9ec2be

File diff suppressed because it is too large Load Diff

@ -21,9 +21,13 @@ _WEAPON_URLS = {
"Switch Axe": ["/data/1908.html", "/data/2890.html"], "Switch Axe": ["/data/1908.html", "/data/2890.html"],
"Charge Blade": ["/data/1909.html"], "Charge Blade": ["/data/1909.html"],
"Insect Glaive": ["/data/1910.html"], "Insect Glaive": ["/data/1910.html"],
"Bow": ["/data/1911.html", "/data/2893.html"],
} }
_RANGED_TYPES = ["Bow", "Light Bowgun", "Heavy Bowgun"]
_ELEMENT_MAP = { _ELEMENT_MAP = {
u"": "Fire", u"": "Fire",
u"": "Water", u"": "Water",
@ -60,6 +64,36 @@ _CB_PHIAL_TYPES = {
} }
_BOW_ARC_TYPES = {
u"集中型": "Focus",
u"放散型": "Wide",
u"爆裂型": "Blast",
}
_BOW_SHOT_TYPES = {
u"連射": "Rapid",
u"拡散": "Spread",
u"貫通": "Pierce",
u"重射": "Heavy",
}
_BOW_COATINGS = {
u"強1": "Power 1",
u"強2": "Power 2",
u"属1": "Element 1",
u"属2": "Element 2",
u"": "C. Range",
u"": "Paint",
u"": "Poison",
u"": "Paralysis",
u"": "Sleep",
u"": "Exhaust",
u"": "Blast",
}
def extract_weapon_list(wtype, tree): def extract_weapon_list(wtype, tree):
weapons = [] weapons = []
rows = tree.xpath('//*[@id="sorter"]/tbody/tr') rows = tree.xpath('//*[@id="sorter"]/tbody/tr')
@ -72,7 +106,13 @@ def extract_weapon_list(wtype, tree):
name, href, final = _parse_name_td(cells[0]) name, href, final = _parse_name_td(cells[0])
attack = int(cells[1].text) attack = int(cells[1].text)
affinity, defense, element, element_attack = _parse_extra_td(cells[2]) affinity, defense, element, element_attack = _parse_extra_td(cells[2])
if wtype not in _RANGED_TYPES:
sharpness = _parse_sharpness_td(cells[-2]) sharpness = _parse_sharpness_td(cells[-2])
shots, ammo = None, None
else:
sharpness = [None, None]
if wtype == "Bow":
shots, ammo = _parse_bow_td(cells[-2])
slots = _parse_slots_td(cells[-1]) slots = _parse_slots_td(cells[-1])
data = dict(name_jp=name, name=name, wtype=wtype, final=final, data = dict(name_jp=name, name=name, wtype=wtype, final=final,
sharpness=sharpness[0], sharpness_plus=sharpness[1], sharpness=sharpness[0], sharpness_plus=sharpness[1],
@ -80,7 +120,8 @@ def extract_weapon_list(wtype, tree):
affinity=affinity, defense=defense, affinity=affinity, defense=defense,
element=element, element_attack=element_attack, element=element, element_attack=element_attack,
phial=None, shelling_type=None, horn_notes=None, phial=None, shelling_type=None, horn_notes=None,
awaken=None, element_2=None, element_2_attack=None) awaken=None, element_2=None, element_2_attack=None,
arc_type=None, ammo=ammo, shot_types=shots)
if len(cells) == 6: if len(cells) == 6:
_add_phial_or_shot_data(data, cells[-3]) _add_phial_or_shot_data(data, cells[-3])
if href is None or href == parent_href: if href is None or href == parent_href:
@ -105,10 +146,32 @@ def _add_phial_or_shot_data(data, td_element):
elif data["wtype"] == "Gunlance": elif data["wtype"] == "Gunlance":
shot_type = _GL_SHOT_TYPES[text[:2]] shot_type = _GL_SHOT_TYPES[text[:2]]
data["shelling_type"] = "%s %s" % (shot_type, text[2]) data["shelling_type"] = "%s %s" % (shot_type, text[2])
elif data["wtype"] == "Bow":
data["arc_type"] = _BOW_ARC_TYPES[text]
else: else:
raise ValueError("Unexpected element for wtype '%s'" % data["wtype"]) raise ValueError("Unexpected element for wtype '%s'" % data["wtype"])
def _parse_bow_td(td_element):
shots = []
coatings = []
shot_type_spans = td_element.xpath("./div/span")
for span in shot_type_spans:
shot = {}
if not span.text:
continue
text = span.text.strip()
shot["type"] = _BOW_SHOT_TYPES[text[:2]]
shot["level"] = text[2]
shot["requires_loading"] = (span.attrib.get("class") == "b")
shots.append(shot)
coatings_span = td_element.xpath("./p/span/span")
for span in coatings_span:
text = span.text.strip()
coatings.append(_BOW_COATINGS[text])
return shots, coatings
def _parse_extra_td(td_element): def _parse_extra_td(td_element):
# 会心<span class="c_r">-20</span>%<br> # 会心<span class="c_r">-20</span>%<br>
# 防御+5 # 防御+5

@ -236,6 +236,69 @@ function set_sharpness_titles(weapon_data) {
} }
function set_bow_values(weapon_data) {
if (weapon_data["wtype"] != "Bow") {
return;
}
// translate mh4u data to be consistant with mhx data
if (weapon_data["charges"]) {
var charges = weapon_data["charges"].split("|");
var parts;
var shot;
var shot_types = [];
$.each(charges, function(i, charge) {
shot = {};
parts = charge.split(" ");
shot["type"] = parts[0];
shot["level"] = parts[1][1];
shot["requires_loading"] = parts[1].endsWith("*");
shot_types.push(shot);
});
weapon_data["shot_types"] = shot_types;
var coatings = weapon_data["coatings"].split("|");
var parts;
var coating;
var ammo_list = [];
$.each(coatings, function(i, coating) {
if (coating != "-") {
ammo_list.push(coating);
}
});
weapon_data["ammo"] = ammo_list;
weapon_data["arc_type"] = weapon_data["recoil"];
}
var shots_text = [];
var shot_text;
$.each(weapon_data["shot_types"], function(i, shot) {
shot_text = shot["type"].substring(0, 1) + shot["level"];
if (shot["requires_loading"]) {
shot_text = "(" + shot_text + ")";
}
shots_text.push(shot_text);
});
weapon_data["bow_shots_text"] = shots_text.join(" ");
var coatings_text = [];
var coating_text;
$.each(weapon_data["ammo"], function(i, coating) {
if (coating.startsWith("Power ")) {
coating_text = "P" + coating.substring(6, 7);
} else if (coating.startsWith("Element ")) {
coating_text = "E" + coating.substring(8, 9);
} else {
coating_text = coating.substring(0, 3);
}
coatings_text.push(coating_text);
});
weapon_data["bow_coatings_text"] = coatings_text.join(" ");
}
function set_horn_melodies_title(weapon_data) { function set_horn_melodies_title(weapon_data) {
if (! weapon_data["horn_notes"]) { if (! weapon_data["horn_notes"]) {
weapon_data["horn_melodies_title"] = "" weapon_data["horn_melodies_title"] = ""
@ -310,3 +373,49 @@ function get_calculating_palico_uri(setups) {
var base = "http://minyoung.ch/calculatingpalico/?m=31&s="; var base = "http://minyoung.ch/calculatingpalico/?m=31&s=";
return base + encodeURIComponent(JSON.stringify(setups)); return base + encodeURIComponent(JSON.stringify(setups));
} }
function get_weapon_sort_values(weapon_data) {
// Note: javascript does string coersion when comparing lists,
// so this can't be used directly, see cmp_arrays.
var sharp_reverse;
if (weapon_data["sharpness"]) {
sharp_reverse = Array.prototype.slice.call(weapon_data["sharpness"]);
sharp_reverse.reverse();
} else {
sharp_reverse = null;
}
return [
weapon_data["attack"],
sharp_reverse,
weapon_data["element_attack"],
weapon_data["affinity"],
weapon_data["num_slots"],
weapon_data["defense"]
];
}
function cmp_arrays(alist, blist) {
var cmp;
for (var i=0; i<alist.length; i++) {
a = alist[i];
b = blist[i];
if (a == null && b == null) {
// ignore
} else if (typeof a == "object") {
cmp = cmp_arrays(a, b);
if (cmp != 0) {
return cmp;
}
} else {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
}
}
}
return 0;
}

@ -184,12 +184,6 @@
var final_only = state["weapon_final"]; var final_only = state["weapon_final"];
var weapon_names = state["weapon_name_text"].split("|"); var weapon_names = state["weapon_name_text"].split("|");
if (weapon_type == "Bow" || weapon_type == "Light Bowgun"
|| weapon_type == "Heavy Bowgun") {
// we only support blademaster weapons for now
return false;
}
if (final_only && weapon_data["final"] != 1) { if (final_only && weapon_data["final"] != 1) {
return false; return false;
} }
@ -235,13 +229,13 @@
function update_weapon_list(state) { function update_weapon_list(state) {
var match_count = 0; var match_count = 0;
console.log("updating weapon list: " + JSON.stringify(state)); console.log("updating weapon list: " + JSON.stringify(state));
$("#weapon_table").empty();
var results = []; var results = [];
$.each(WEAPON_LIST, function(i, weapon_data) { $.each(WEAPON_LIST, function(i, weapon_data) {
if (weapon_predicate(state, weapon_data)) { if (weapon_predicate(state, weapon_data)) {
weapon_data["id"] = i; weapon_data["id"] = i;
match_count += 1; match_count += 1;
set_sharpness_titles(weapon_data); set_sharpness_titles(weapon_data);
set_bow_values(weapon_data);
set_horn_melodies_title(weapon_data); set_horn_melodies_title(weapon_data);
weapon_data["wtype_short"] = weapon_data["wtype_short"] =
WEAPON_TYPE_ABBR[weapon_data["wtype"]]; WEAPON_TYPE_ABBR[weapon_data["wtype"]];
@ -251,36 +245,17 @@
} }
}); });
results.sort(function (a, b) { results.sort(function (a, b) {
avals = get_sort_values(a[0]); avals = get_weapon_sort_values(a[0]);
bvals = get_sort_values(b[0]); bvals = get_weapon_sort_values(b[0]);
if (avals > bvals) { return cmp_arrays(bvals, avals);
return -1;
}
if (avals < bvals) {
return 1;
}
return 0;
}); });
$("#weapon_table").empty();
$.each(results, function(i, pair) { $.each(results, function(i, pair) {
$("#weapon_table").append(pair[1]); $("#weapon_table").append(pair[1]);
}); });
console.log("match count: " + match_count); console.log("match count: " + match_count);
} }
function get_sort_values(weapon_data) {
var sharp_reverse = Array.prototype.slice.call(
weapon_data["sharpness"]);
sharp_reverse.reverse();
return [
weapon_data["attack"],
sharp_reverse,
weapon_data["element_attack"],
weapon_data["affinity"],
weapon_data["num_slots"],
weapon_data["defense"]
];
}
</script> </script>
</head> </head>
<body> <body>
@ -303,8 +278,8 @@
<option value="Switch Axe">Switch Axe</option> <option value="Switch Axe">Switch Axe</option>
<option value="Charge Blade">Charge Blade</option> <option value="Charge Blade">Charge Blade</option>
<option value="Insect Glaive">Insect Glaive</option> <option value="Insect Glaive">Insect Glaive</option>
<option value="Light Bowgun">Light Bowgun</option> <!--option value="Light Bowgun">Light Bowgun</option-->
<option value="Heavy Bowgun">Heavy Bowgun</option> <!--option value="Heavy Bowgun">Heavy Bowgun</option-->
<option value="Bow">Bow</option> <option value="Bow">Bow</option>
</select></td> </select></td>
<td><label for="weapon_element" <td><label for="weapon_element"

@ -65,6 +65,11 @@
<td><%= defense ? "+" + defense + " Def" : "" %></td> <td><%= defense ? "+" + defense + " Def" : "" %></td>
<td style="text-align:right"><%= phial %></td> <td style="text-align:right"><%= phial %></td>
<td style="text-align:right"><%= shelling_type %></td> <td style="text-align:right"><%= shelling_type %></td>
<% if (arc_type) { %>
<td style="text-align:right"><%= arc_type %></td>
<td style="font-family:mono"
title="<%= bow_coatings_text %>"><%= bow_shots_text %></td>
<% } %>
<td title="<%= horn_melodies_title %>" <td title="<%= horn_melodies_title %>"
style="text-align:right"><%= horn_notes %></td> style="text-align:right"><%= horn_notes %></td>
</tr> </tr>

@ -119,7 +119,7 @@
}); });
function init_page() { function init_page() {
load_qs(); var state = load_qs();
$(window).on("popstate", function(e) { $(window).on("popstate", function(e) {
var oe = e.originalEvent; var oe = e.originalEvent;
if (oe.state !== null) { if (oe.state !== null) {
@ -132,12 +132,18 @@
save_state(state); save_state(state);
update_weapon_list(state); update_weapon_list(state);
}); });
if (state) {
update_weapon_list(state);
}
} }
function load_qs() { function load_qs() {
if ($.QueryString["weapon_type"]) { if ($.QueryString["weapon_type"]) {
load_state($.QueryString); load_state($.QueryString);
return $.QueryString;
} }
return null;
} }
function get_ui_state() { function get_ui_state() {
@ -171,12 +177,6 @@
var final_only = state["weapon_final"]; var final_only = state["weapon_final"];
var weapon_names = state["weapon_name_text"].split("|"); var weapon_names = state["weapon_name_text"].split("|");
if (weapon_type == "Bow" || weapon_type == "Light Bowgun"
|| weapon_type == "Heavy Bowgun") {
// we only support blademaster weapons for now
return false;
}
if (final_only && weapon_data["final"] != 1) { if (final_only && weapon_data["final"] != 1) {
return false; return false;
} }
@ -223,42 +223,56 @@
var cp_setups = []; var cp_setups = [];
var comps = state["weapon_component_text"].split("|"); var comps = state["weapon_component_text"].split("|");
console.log("updating weapon list: " + JSON.stringify(state)); console.log("updating weapon list: " + JSON.stringify(state));
$("#weapon_table").empty(); var results = [];
$.each(WEAPON_ID_IDX, function(weapon_id, weapon_list) { $.each(WEAPON_ID_IDX, function(weapon_id, weapon_list) {
var weapon_data = weapon_list[0]; var weapon_data = weapon_list[0];
if (weapon_predicate(state, weapon_data)) { if (weapon_predicate(state, weapon_data)) {
match_count += 1; $.ajax({
$.getJSON(DATA_PATH + "weapon/" + weapon_id + ".json", url: DATA_PATH + "weapon/" + weapon_id + ".json",
function(data) { dataType: "json",
async: false,
success: function(data) {
if (comps if (comps
&& !list_match(comps, && !list_match(comps,
Object.keys(data["create_components"])) Object.keys(data["create_components"]))
&& !list_match(comps, && !list_match(comps,
Object.keys(data["upgrade_components"]))) Object.keys(data["upgrade_components"])))
{ {
console.log("skipping '" console.log("skipping '" + data["name"]
+ data["name"]
+ "', failed component match"); + "', failed component match");
return; return;
} }
match_count += 1;
set_sharpness_titles(data); set_sharpness_titles(data);
data["arc_type"] = null;
set_bow_values(data);
set_horn_melodies_title(data); set_horn_melodies_title(data);
data["wtype_short"] = data["wtype_short"] = WEAPON_TYPE_ABBR[data["wtype"]];
WEAPON_TYPE_ABBR[data["wtype"]];
data["ELEMENT_ABBR"] = ELEMENT_ABBR; data["ELEMENT_ABBR"] = ELEMENT_ABBR;
data["url"] = null; data["url"] = null;
var html = template_row.render(data); var html = template_row.render(data);
$("#weapon_table").append(html); results.push([data, html]);
var setup = get_calculating_palico_setup(data); var setup = get_calculating_palico_setup(data);
console.log("setup for " + weapon_id + ": " //console.log("setup for " + weapon_id + ": " + setup);
+ setup);
if (setup.length) { if (setup.length) {
cp_setups.push(setup); cp_setups.push(setup);
} }
update_cp_link(cp_setups); }
}); });
} }
}); });
console.log("results len " + results.length);
results.sort(function (a, b) {
avals = get_weapon_sort_values(a[0]);
bvals = get_weapon_sort_values(b[0]);
return cmp_arrays(bvals, avals);
});
$("#weapon_table").empty();
$.each(results, function(i, pair) {
$("#weapon_table").append(pair[1]);
});
update_cp_link(cp_setups);
console.log("match count: " + match_count); console.log("match count: " + match_count);
} }
@ -296,8 +310,8 @@
<option value="Switch Axe">Switch Axe</option> <option value="Switch Axe">Switch Axe</option>
<option value="Charge Blade">Charge Blade</option> <option value="Charge Blade">Charge Blade</option>
<option value="Insect Glaive">Insect Glaive</option> <option value="Insect Glaive">Insect Glaive</option>
<option value="Light Bowgun">Light Bowgun</option> <!--option value="Light Bowgun">Light Bowgun</option-->
<option value="Heavy Bowgun">Heavy Bowgun</option> <!--option value="Heavy Bowgun">Heavy Bowgun</option-->
<option value="Bow">Bow</option> <option value="Bow">Bow</option>
</select></td> </select></td>
<td><label for="weapon_element" <td><label for="weapon_element"

Loading…
Cancel
Save