add quest level filter to weapon list for mhgen

This commit is contained in:
Bryce Allen
2016-07-30 20:25:11 -05:00
parent 78c7240a83
commit a80d8740b3
6 changed files with 409 additions and 88 deletions

106
web/mhgen/recommends.html Normal file
View File

@@ -0,0 +1,106 @@
<html>
<head>
<title>Poogie Recommends</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/smoothness/jquery-ui.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js"></script>
<script src="/js/common.js"></script>
<style>
.flex {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
label {
font-weight: bold;
font-family: sans, sans-serif;
}
#output { flex: 99 1 auto; }
</style>
<script type="text/javascript">
var DATA_PATH = get_base_path() + "/rewards/";
$(document).ready(function(){
$("#search").click(update_search);
$("#item").keypress(function(e) {
if (e.which == 13) { update_search(); }
});
setup_item_autocomplete("#item");
var item_name = $.QueryString["item"];
if (item_name) {
console.log("qs item: " + item_name);
if (history.state && history.state["item_name"]) {
item_name = history.state["item_name"];
console.log("override qs with state item: " + item_name);
}
var normalized_name = normalize_name(item_name);
var encoded_name = encodeURIComponent(normalized_name);
display_item(normalized_name);
console.log("replaceState: " + normalized_name);
window.history.replaceState({ "item_name": normalized_name }, "",
"/recommends.html?item="
+ encoded_name );
}
$(window).on("popstate", function(e) {
var oe = e.originalEvent;
if (oe.state !== null) {
console.log("popState:" + JSON.stringify(oe.state));
display_item(oe.state["item_name"]);
}
});
});
function update_search() {
// update the item search based on the text field, and also push
// the state to history
var item_name = $.trim($("#item").val());
var normalized_name = normalize_name(item_name);
if (window.history.state
&& window.history.state["item_name"] == normalized_name) {
console.log("item not changed, skipping update");
return;
}
var encoded_name = encodeURIComponent(normalized_name);
display_item(normalized_name);
console.log("pushState: " + normalized_name);
window.history.pushState({ "item_name": normalized_name }, "",
"/recommends.html?item=" + encoded_name );
}
function display_item(normalized_name) {
// display the exact item name if available; does not push state
$("#item").val(normalized_name);
var encoded_name = encodeURIComponent(normalized_name);
$.get(DATA_PATH + encoded_name + ".txt",
function(data) {
$("#output").text(data);
}).fail(
function() {
$("#output").text("Error: item '"
+ normalized_name + "' not found");
});
}
</script>
</head>
<body>
<div class="flex">
<div>
<label for="item">Item:</label>
<input id="item" type="text" size="20" />
<button id="search">Ask Poogie</button>
<a href="https://github.com/bd4/monster-hunter-scripts/blob/master/RECOMMENDATIONS.adoc">Understanding Results</a>
(<a href="https://github.com/bd4/monster-hunter-scripts">source</a>)
</div>
<br />
<textarea readonly="true" rows="10" cols="80" id="output"></textarea>
</div>
</body>

View File

@@ -170,14 +170,27 @@
return { "weapon_type": $("#weapon_type").val(),
"weapon_element": $("#weapon_element").val(),
"weapon_final": $("#weapon_final").is(":checked"),
"weapon_name_text": $("#weapon_name_text").val() };
"weapon_name_text": $("#weapon_name_text").val(),
"village_stars": $("#village_stars").val(),
"guild_stars": $("#guild_stars").val(),
"permit_stars": $("#permit_stars").val(),
"arena_stars": $("#arena_stars").val() };
}
function load_state(state) {
$("#weapon_type").val(state["weapon_type"]);
$("#weapon_element").val(state["weapon_element"]);
final = state["weapon_final"];
if (typeof final == "string") {
final = final.toLowerCase();
state["weapon_final"] = (final == "true" || final == "1");
}
$("#weapon_final").prop("checked", state["weapon_final"]);
$("#weapon_name_text").val(state["weapon_name_text"]);
$("#village_stars").val(state["village_stars"]);
$("#guild_stars").val(state["guild_stars"]);
$("#permit_stars").val(state["permit_stars"]);
$("#arena_stars").val(state["arena_stars"]);
}
function save_state(state, replace) {
@@ -189,11 +202,55 @@
}
}
function match_stars(match_value, weapon_value) {
// NOTE: a null weapon_value can be not available, or no data
// available (should probably fix this)
if (match_value == "Any") {
return true;
}
if (match_value == "None") {
// for None, allow null values, because null can be no requirements
// or no data available
if (weapon_value != null) {
return false;
}
return true;
}
// if matching a specific value, require a non-null weapon value
if (weapon_value == null) {
return false;
}
match_value = parseInt(match_value);
if (weapon_value > match_value) {
return false;
}
return true;
}
function weapon_predicate(state, weapon_data) {
var weapon_type = state["weapon_type"];
var weapon_element = state["weapon_element"];
var final_only = state["weapon_final"];
var weapon_names = state["weapon_name_text"].split("|");
var village_stars = state["village_stars"];
var guild_stars = state["guild_stars"];
var permit_stars = state["permit_stars"];
var arena_stars = state["arena_stars"];
// allow satisfying quest filter with village or guild, since they
// involve essentially the same quests, rewards, and mosnters,
// but if permit or arena filters are set, they must be satisfied
// independently
if (! match_stars(village_stars, weapon_data["village_stars"])
&& ! match_stars(guild_stars, weapon_data["guild_stars"])) {
return false;
}
if (! match_stars(permit_stars, weapon_data["permit_stars"])) {
return false;
}
if (! match_stars(village_stars, weapon_data["village_stars"])) {
return false;
}
if (final_only && weapon_data["final"] != 1) {
return false;
@@ -321,6 +378,55 @@
<td><input id="weapon_final" type="checkbox" /></td>
<td><button id="search">Search</button></td>
</tr>
<tr>
<td colspan="7">
<label>Quest Level:</label>
<select id="village_stars">
<option value="Any">Village Any</option>
<option value="1">Village 1*</option>
<option value="2">Village 2*</option>
<option value="3">Village 3*</option>
<option value="4">Village 4*</option>
<option value="5">Village 5*</option>
<option value="6">Village 6*</option>
</select>
<select id="guild_stars">
<option value="Any">Guild Any</option>
<option value="1">Guild 1*</option>
<option value="2">Guild 2*</option>
<option value="3">Guild 3*</option>
<option value="4">Guild 4*</option>
<option value="5">Guild 5*</option>
<option value="6">Guild 6*</option>
<option value="7">Guild 7*</option>
</select>
<select id="permit_stars">
<option value="Any">Permit Any</option>
<option value="None">Permit None</option>
<option value="1">Permit 1*</option>
<option value="2">Permit 2*</option>
<option value="3">Permit 3*</option>
<option value="4">Permit 4*</option>
<option value="5">Permit 5*</option>
<option value="6">Permit 6*</option>
<option value="7">Permit 7*</option>
<option value="8">Permit 8*</option>
<option value="9">Permit 9*</option>
<option value="10">Permit 10*</option>
</select>
<select id="arena_stars">
<option value="Any">Arena Any</option>
<option value="None">Arena None</option>
<option value="1">Arena 1*</option>
<option value="2">Arena 2*</option>
<option value="3">Arena 3*</option>
<option value="4">Arena 4*</option>
<option value="5">Arena 5*</option>
<option value="6">Arena 6*</option>
<option value="7">Arena 7*</option>
</select>
</td>
</tr>
<tr>
<td colspan="7">
<label for="weapon_name_text"