convert to python3

main
Bryce Allen 5 years ago
parent e9c710ca99
commit 6b57d498b6

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Set PYTHONPATH in lighttpd or other server config. # Set PYTHONPATH in lighttpd or other server config.

@ -1,10 +1,10 @@
#!/usr/bin/env python2 #!/usr/bin/env python3
""" """
Script to generate static rewards files for all items. Script to generate static rewards files for all items.
""" """
import codecs import codecs
import urllib import urllib.request, urllib.parse, urllib.error
import os.path import os.path
import _pathfix import _pathfix
@ -27,7 +27,7 @@ if __name__ == '__main__':
elif len(sys.argv) == 2: elif len(sys.argv) == 2:
outdir = sys.argv[1] outdir = sys.argv[1]
else: else:
print("Usage: %s [outdir]" % sys.argv[0]) print(("Usage: %s [outdir]" % sys.argv[0]))
sys.exit(os.EX_USAGE) sys.exit(os.EX_USAGE)
err_out = get_utf8_writer(sys.stderr) err_out = get_utf8_writer(sys.stderr)
@ -46,7 +46,7 @@ if __name__ == '__main__':
# write all names json to /items.json # write all names json to /items.json
items_file = os.path.join(outdir, "items.json") items_file = os.path.join(outdir, "items.json")
print "Writing", items_file print("Writing", items_file)
with open(items_file, "w") as f: with open(items_file, "w") as f:
out = get_utf8_writer(f) out = get_utf8_writer(f)
out.write("[") out.write("[")
@ -66,7 +66,7 @@ if __name__ == '__main__':
item_id = item.id item_id = item.id
encoded_name = name.encode("utf8") encoded_name = name.encode("utf8")
item_file = os.path.join(outdir, encoded_name + ".txt") item_file = os.path.join(outdir, encoded_name + ".txt")
print "Writing", item_id, item_file print("Writing", item_id, item_file)
with open(item_file, "w") as f: with open(item_file, "w") as f:
out = get_utf8_writer(f) out = get_utf8_writer(f)
item_row = rewards.find_item(db, name, err_out) item_row = rewards.find_item(db, name, err_out)

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import sys import sys
import argparse import argparse
@ -57,7 +57,7 @@ def find_armors(args):
matches = difflib.get_close_matches(skill_name, skill_tree_names, matches = difflib.get_close_matches(skill_name, skill_tree_names,
1, 0.5) 1, 0.5)
if matches: if matches:
print "Fuzzy Match:", matches[0] print("Fuzzy Match:", matches[0])
sid = skill_tree_id_map.get(matches[0]) sid = skill_tree_id_map.get(matches[0])
skill_name = matches[0] skill_name = matches[0]
args.skills[i] = skill_name args.skills[i] = skill_name
@ -71,8 +71,8 @@ def find_armors(args):
d.set_skills(db.get_item_skills(d.id)) d.set_skills(db.get_item_skills(d.id))
decoration_values = get_decoration_values(sid, ds)[1] decoration_values = get_decoration_values(sid, ds)[1]
decorations[sid] = (ds, decoration_values) decorations[sid] = (ds, decoration_values)
print "%s[%s]:" % (skill_name, sid), ", ".join(d.name for d in ds), \ print("%s[%s]:" % (skill_name, sid), ", ".join(d.name for d in ds), \
decoration_values decoration_values)
htype = "Gunner" if args.gunner else "Blade" htype = "Gunner" if args.gunner else "Blade"
@ -82,7 +82,7 @@ def find_armors(args):
for a in armors: for a in armors:
skills = db.get_item_skills(a.id) skills = db.get_item_skills(a.id)
if not skills: if not skills:
print "Error getting skills for '%s' (%d)" % (a.name, a.id) print("Error getting skills for '%s' (%d)" % (a.name, a.id))
sys.exit(1) sys.exit(1)
a.set_skills(skills) a.set_skills(skills)
# calculate total using decorations for first skill only. This # calculate total using decorations for first skill only. This
@ -113,12 +113,12 @@ def find_armors(args):
if args.type and a.slot != args.type: if args.type and a.slot != args.type:
continue continue
total = skill_totals[a.id] total = skill_totals[a.id]
print skill_totals[a.id], a.one_line_u(), print(skill_totals[a.id], a.one_line_u(), end=' ')
if args.resist: if args.resist:
print args.resist.title(), a[args.resist + "_res"] print(args.resist.title(), a[args.resist + "_res"])
else: else:
print print()
print " ", a.one_line_skills_u(args.skills) print(" ", a.one_line_skills_u(args.skills))
def str_lower(x): def str_lower(x):

@ -1,4 +1,4 @@
#!/usr/bin/env python2 #!/usr/bin/env python3
import sys import sys
import argparse import argparse
@ -54,7 +54,7 @@ def _make_db_sharpness_string(level_string):
level_value = SharpnessLevel.__dict__[level_string.upper()] level_value = SharpnessLevel.__dict__[level_string.upper()]
#print "level value", level_value #print "level value", level_value
values = [] values = []
for i in xrange(SharpnessLevel.PURPLE+1): for i in range(SharpnessLevel.PURPLE+1):
if i <= level_value: if i <= level_value:
values.append("1") values.append("1")
else: else:
@ -67,7 +67,7 @@ def weapon_stats_tuple(arg):
parts = arg.split(",") parts = arg.split(",")
#print "parts %r" % parts #print "parts %r" % parts
if len(parts) < 4: if len(parts) < 4:
print "not enough parts" print("not enough parts")
raise ValueError("Bad arg, use 'name,weapon_type,sharpness,raw'") raise ValueError("Bad arg, use 'name,weapon_type,sharpness,raw'")
weapon = {} weapon = {}
weapon["name"] = parts[0] weapon["name"] = parts[0]
@ -154,13 +154,13 @@ def _add_skill_args(parser):
default=False, default=False,
help="add Awaken (FreeElemnt), default off") help="add Awaken (FreeElemnt), default off")
parser.add_argument("-a", "--attack-up", parser.add_argument("-a", "--attack-up",
type=int, choices=range(0, 5), default=0, type=int, choices=list(range(0, 5)), default=0,
help="1-4 for AuS, M, L, XL") help="1-4 for AuS, M, L, XL")
parser.add_argument("-c", "--critical-eye", parser.add_argument("-c", "--critical-eye",
type=int, choices=range(0, 5), default=0, type=int, choices=list(range(0, 5)), default=0,
help="1-4 for CE+1, +2, +3 and Critical God") help="1-4 for CE+1, +2, +3 and Critical God")
parser.add_argument("-e", "--element-up", parser.add_argument("-e", "--element-up",
type=int, choices=range(0, 5), default=0, type=int, choices=list(range(0, 5)), default=0,
help="1-4 for (element) Atk +1, +2, +3 and" help="1-4 for (element) Atk +1, +2, +3 and"
" Element Attack Up") " Element Attack Up")
parser.add_argument("-t", "--artillery", parser.add_argument("-t", "--artillery",
@ -253,24 +253,24 @@ def print_sorted_phial_damage(names, damage_map_base, weapon_damage_map, parts,
_print_headers(parts, damage_map_base) _print_headers(parts, damage_map_base)
for name in names_sorted: for name in names_sorted:
print "%-20s:" % name, print("%-20s:" % name, end=' ')
damage_map = weapon_damage_map[name] damage_map = weapon_damage_map[name]
print "%0.2f" % avg_phial(damage_map, level=level), print("%0.2f" % avg_phial(damage_map, level=level), end=' ')
for part in parts: for part in parts:
part_damage = damage_map[part] part_damage = damage_map[part]
#print "%0.2f" % sum(damage_map.cb_phial_damage[part][level]), #print "%0.2f" % sum(damage_map.cb_phial_damage[part][level]),
print "%0.2f:%0.2f:%0.2f" % damage_map.cb_phial_damage[part][level], print("%0.2f:%0.2f:%0.2f" % damage_map.cb_phial_damage[part][level], end=' ')
print print()
def _print_headers(parts, damage_map_base): def _print_headers(parts, damage_map_base):
print print()
avg_hitbox = (sum(damage_map_base[part].hitbox for part in parts) avg_hitbox = (sum(damage_map_base[part].hitbox for part in parts)
/ float(len(parts))) / float(len(parts)))
cols = ["%s (%d)" % (part, damage_map_base[part].hitbox) cols = ["%s (%d)" % (part, damage_map_base[part].hitbox)
for part in parts] for part in parts]
cols = ["%s (%d)" % ("Avg", avg_hitbox)] + cols cols = ["%s (%d)" % ("Avg", avg_hitbox)] + cols
print " | ".join(cols) print(" | ".join(cols))
def print_sorted_damage(names, damage_map_base, weapon_damage_map, parts): def print_sorted_damage(names, damage_map_base, weapon_damage_map, parts):
@ -288,22 +288,22 @@ def print_sorted_damage(names, damage_map_base, weapon_damage_map, parts):
# for part in parts]) # for part in parts])
for name in names_sorted: for name in names_sorted:
print "%-20s:" % name, print("%-20s:" % name, end=' ')
damage_map = weapon_damage_map[name] damage_map = weapon_damage_map[name]
print "%0.2f" % damage_map.averages["uniform"], print("%0.2f" % damage_map.averages["uniform"], end=' ')
for part in parts: for part in parts:
part_damage = damage_map[part] part_damage = damage_map[part]
print "% 2d" % part_damage.average(), print("% 2d" % part_damage.average(), end=' ')
print print()
if len(names) > 1: if len(names) > 1:
w1 = weapon_damage_map[names_sorted[0]] w1 = weapon_damage_map[names_sorted[0]]
w2 = weapon_damage_map[names_sorted[1]] w2 = weapon_damage_map[names_sorted[1]]
m, ratio = w1.compare_break_even(w2) m, ratio = w1.compare_break_even(w2)
print print()
print "Comparison of '%s' and '%s'" % ( print("Comparison of '%s' and '%s'" % (
names_sorted[0], names_sorted[1]) names_sorted[0], names_sorted[1]))
print "Hitbox ratio:", m, "%0.2f" % ratio print("Hitbox ratio:", m, "%0.2f" % ratio)
if w1.etype: if w1.etype:
re_ratios = w1.get_raw_element_ratios() re_ratios = w1.get_raw_element_ratios()
@ -316,7 +316,7 @@ def print_sorted_damage(names, damage_map_base, weapon_damage_map, parts):
else: else:
line.append(names_sorted[1]) line.append(names_sorted[1])
# (part, raw, element, ratio) # (part, raw, element, ratio)
print "%-22s %02d %02d %0.2f %s" % tuple(line) print("%-22s %02d %02d %0.2f %s" % tuple(line))
def print_damage_percent_diff(names, damage_map_base, weapon_damage_map, parts): def print_damage_percent_diff(names, damage_map_base, weapon_damage_map, parts):
@ -340,7 +340,7 @@ def print_damage_percent_diff(names, damage_map_base, weapon_damage_map, parts):
ediff_s = ",".join("%+0.1f%%" % i for i in ediffs) ediff_s = ",".join("%+0.1f%%" % i for i in ediffs)
bdiff_s = ",".join("%+0.1f%%" % i for i in bdiffs) bdiff_s = ",".join("%+0.1f%%" % i for i in bdiffs)
damage = damage_map_base[part] damage = damage_map_base[part]
print "%22s%s h%02d %0.2f (%s) h%02d %0.2f (%s) %+0.2f (%s)" \ print("%22s%s h%02d %0.2f (%s) h%02d %0.2f (%s) %+0.2f (%s)" \
% (part, "*" if damage.is_breakable() else " ", % (part, "*" if damage.is_breakable() else " ",
damage.hitbox, damage.hitbox,
damage.total, damage.total,
@ -349,17 +349,17 @@ def print_damage_percent_diff(names, damage_map_base, weapon_damage_map, parts):
damage.element, damage.element,
ediff_s, ediff_s,
damage.break_diff(), damage.break_diff(),
bdiff_s) bdiff_s))
if weapon_type == "Charge Blade": if weapon_type == "Charge Blade":
for level in (0, 1, 2, 3, 5): for level in (0, 1, 2, 3, 5):
print " " * 20, level, print(" " * 20, level, end=' ')
for wname in names: for wname in names:
wd = weapon_damage_map[wname] wd = weapon_damage_map[wname]
damage = wd.cb_phial_damage[part][level] damage = wd.cb_phial_damage[part][level]
print "(%0.f, %0.f, %0.f);" % damage, print("(%0.f, %0.f, %0.f);" % damage, end=' ')
print print()
print " --------------------" print(" --------------------")
for avg_type in "uniform raw weakpart_raw element weakpart_element break_raw break_element break_only".split(): for avg_type in "uniform raw weakpart_raw element weakpart_element break_raw break_element break_only".split():
base = damage_map_base.averages[avg_type] base = damage_map_base.averages[avg_type]
@ -371,7 +371,7 @@ def print_damage_percent_diff(names, damage_map_base, weapon_damage_map, parts):
diff_s = ",".join("%+0.1f%%" % i for i in diffs) diff_s = ",".join("%+0.1f%%" % i for i in diffs)
print "%22s %0.2f (%s)" % (avg_type, base, diff_s) print("%22s %0.2f (%s)" % (avg_type, base, diff_s))
def match_quest_level(match_level, weapon_level): def match_quest_level(match_level, weapon_level):
@ -451,7 +451,7 @@ def main():
weapons.extend(args.weapon_custom) weapons.extend(args.weapon_custom)
if not weapons: if not weapons:
print "Err: no matching weapons" print("Err: no matching weapons")
sys.exit(1) sys.exit(1)
names = [w.name for w in weapons] names = [w.name for w in weapons]
@ -459,17 +459,17 @@ def main():
monster_breaks = db.get_monster_breaks(monster.id) monster_breaks = db.get_monster_breaks(monster.id)
weapon_type = weapons[0]["wtype"] weapon_type = weapons[0]["wtype"]
if args.phial and weapon_type != "Charge Blade": if args.phial and weapon_type != "Charge Blade":
print "ERROR: phial option is only supported for Charge Blade" print("ERROR: phial option is only supported for Charge Blade")
sys.exit(1) sys.exit(1)
motion = motiondb[weapon_type].average motion = motiondb[weapon_type].average
print "Weapon Type: %s" % weapon_type print("Weapon Type: %s" % weapon_type)
print "Average Motion: %0.1f" % motion print("Average Motion: %0.1f" % motion)
if args.motion: if args.motion:
motion = args.motion motion = args.motion
print "Specified Motion: %0.1f" % motion print("Specified Motion: %0.1f" % motion)
print "Monster Breaks: %s" % ", ".join(monster_breaks) print("Monster Breaks: %s" % ", ".join(monster_breaks))
skill_names = get_skill_names(args) skill_names = get_skill_names(args)
print "Common Skills:", ", ".join(skill for skill in skill_names if skill) print("Common Skills:", ", ".join(skill for skill in skill_names if skill))
if args.parts: if args.parts:
limit_parts = args.parts.split(",") limit_parts = args.parts.split(",")
@ -479,7 +479,7 @@ def main():
if args.quest_level: if args.quest_level:
item_stars = ItemStars(db) item_stars = ItemStars(db)
village, guild, permit, arena = args.quest_level village, guild, permit, arena = args.quest_level
print "Filter by Quest Levels:", args.quest_level print("Filter by Quest Levels:", args.quest_level)
weapons2 = dict() weapons2 = dict()
for w in weapons: for w in weapons:
if "village_stars" in w: if "village_stars" in w:
@ -498,10 +498,10 @@ def main():
continue continue
weapons2[w.id] = w weapons2[w.id] = w
parent_ids = set(w.parent_id for w in weapons2.values()) parent_ids = set(w.parent_id for w in weapons2.values())
for wid in weapons2.keys(): for wid in list(weapons2.keys()):
if wid in parent_ids: if wid in parent_ids:
del weapons2[wid] del weapons2[wid]
weapons = weapons2.values() weapons = list(weapons2.values())
names = [w.name for w in weapons] names = [w.name for w in weapons]
weapon_damage_map = dict() weapon_damage_map = dict()
@ -527,23 +527,23 @@ def main():
frenzy_bonus=skill_args.frenzy, frenzy_bonus=skill_args.frenzy,
is_true_attack=game_uses_true_raw, is_true_attack=game_uses_true_raw,
blunt_power=skill_args.blunt_power) blunt_power=skill_args.blunt_power)
print "%-20s: %4.0f %2.0f%%" % (name, wd.attack, wd.affinity), print("%-20s: %4.0f %2.0f%%" % (name, wd.attack, wd.affinity), end=' ')
if wd.etype: if wd.etype:
if wd.etype2: if wd.etype2:
print "(%4.0f %s, %4.0f %s)" \ print("(%4.0f %s, %4.0f %s)" \
% (wd.eattack, wd.etype, wd.eattack2, wd.etype2), % (wd.eattack, wd.etype, wd.eattack2, wd.etype2), end=' ')
else: else:
print "(%4.0f %s)" % (wd.eattack, wd.etype), print("(%4.0f %s)" % (wd.eattack, wd.etype), end=' ')
print SharpnessLevel.name(wd.sharpness), print(SharpnessLevel.name(wd.sharpness), end=' ')
if skill_args != args: if skill_args != args:
print "{%s}" % ",".join(sn print("{%s}" % ",".join(sn
for sn in get_skill_names(skill_args) for sn in get_skill_names(skill_args)
if sn) if sn))
else: else:
print print()
weapon_damage_map[name] = wd weapon_damage_map[name] = wd
except ValueError as e: except ValueError as e:
print str(e) print(str(e))
sys.exit(1) sys.exit(1)
damage_map_base = weapon_damage_map[names[0]] damage_map_base = weapon_damage_map[names[0]]

@ -1,10 +1,10 @@
#!/usr/bin/env python #!/usr/bin/env python3
""" """
Script to find the most lucrative monster parts to farm for money. Script to find the most lucrative monster parts to farm for money.
""" """
import codecs import codecs
import urllib import urllib.request, urllib.parse, urllib.error
import os.path import os.path
import sys import sys
@ -55,8 +55,8 @@ def print_top_items(db, rank="G"):
value = item_value(item) value = item_value(item)
if value < min_value: if value < min_value:
break break
print " %-20s % 7.f % 6d (% 5.f)" % \ print(" %-20s % 7.f % 6d (% 5.f)" % \
(item.name, value, int(item.sell), ev[item.id]) (item.name, value, int(item.sell), ev[item.id]))
if __name__ == '__main__': if __name__ == '__main__':

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
""" """
Calculate probability of getting at least one of a monster part from one Calculate probability of getting at least one of a monster part from one
@ -71,22 +71,22 @@ if __name__ == '__main__':
max_rewards = 8 - fixed_rewards max_rewards = 8 - fixed_rewards
if min_rewards < 0: if min_rewards < 0:
print "Error: fixed_rewards (%d) must be less than or equal to " \ print("Error: fixed_rewards (%d) must be less than or equal to " \
"guaranteeed_rewards (%d)" % (fixed_rewards, guarenteed_rewards) "guaranteeed_rewards (%d)" % (fixed_rewards, guarenteed_rewards))
sys.exit(1) sys.exit(1)
total_p = 0.0 total_p = 0.0
expected_attempts = 0.0 expected_attempts = 0.0
for reward_count in xrange(min_rewards, max_rewards + 1): for reward_count in range(min_rewards, max_rewards + 1):
p = stats._reward_count_p(reward_count, min_rewards, max_rewards, p = stats._reward_count_p(reward_count, min_rewards, max_rewards,
extend_percent) extend_percent)
expected_attempts += p * reward_count expected_attempts += p * reward_count
# probability of getting @reward_count rewards that could be the # probability of getting @reward_count rewards that could be the
# desired item # desired item
print "P(C = %d) = %0.4f" % (reward_count, p) print("P(C = %d) = %0.4f" % (reward_count, p))
total_p += p total_p += p
# expected value for number of rewards that could be the desired item # expected value for number of rewards that could be the desired item
print "E(C) = %0.2f" % expected_attempts print("E(C) = %0.2f" % expected_attempts)
# math check, make sure all possibilities add up to 1, allowing for # math check, make sure all possibilities add up to 1, allowing for
# some floating point precision loss. # some floating point precision loss.
@ -96,5 +96,5 @@ if __name__ == '__main__':
max_rewards, extend_percent) max_rewards, extend_percent)
expected = expected_attempts * reward_percent / 100.0 expected = expected_attempts * reward_percent / 100.0
print "P(N > 0) = %0.2f%%" % p_at_least_one print("P(N > 0) = %0.2f%%" % p_at_least_one)
print "E(N) = %0.4f" % expected print("E(N) = %0.4f" % expected)

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import _pathfix import _pathfix
@ -75,7 +75,7 @@ if __name__ == '__main__':
import os.path import os.path
if len(sys.argv) != 2: if len(sys.argv) != 2:
print("Usage: %s 'item name'" % sys.argv[0]) print(("Usage: %s 'item name'" % sys.argv[0]))
sys.exit(os.EX_USAGE) sys.exit(os.EX_USAGE)
item_name = canonical_item_name(sys.argv[1]) item_name = canonical_item_name(sys.argv[1])

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import sys import sys
import argparse import argparse
@ -40,8 +40,8 @@ if __name__ == '__main__':
else: else:
for cost in costs: for cost in costs:
components = cost["components"] components = cost["components"]
print "=", ", ".join([w.name for w in cost["path"]]) print("=", ", ".join([w.name for w in cost["path"]]))
print " Zenny", cost["zenny"] print(" Zenny", cost["zenny"])
for item_name in sorted(components.iterkeys()): for item_name in sorted(components.keys()):
print "%20s %2d" % (item_name, components[item_name]) print("%20s %2d" % (item_name, components[item_name]))
print print()

@ -1,10 +1,10 @@
#!/usr/bin/env python2 #!/usr/bin/env python3
import os import os
import json import json
import sys import sys
import errno import errno
import urllib import urllib.request, urllib.parse, urllib.error
import argparse import argparse
import _pathfix import _pathfix
@ -42,7 +42,7 @@ SAFE_CHARS = " &'+\""
def file_path(path, model_object, alt_name_field=None): def file_path(path, model_object, alt_name_field=None):
if alt_name_field: if alt_name_field:
key = urllib.quote(model_object[alt_name_field].encode("utf8"), key = urllib.parse.quote(model_object[alt_name_field].encode("utf8"),
SAFE_CHARS) SAFE_CHARS)
else: else:
key = str(model_object.id) key = str(model_object.id)
@ -57,7 +57,7 @@ def write_list_file(path, model_list):
def write_index_file(path, indexes): def write_index_file(path, indexes):
for key, data in indexes.iteritems(): for key, data in indexes.items():
index_path = os.path.join(path, "_index_%s.json" % key) index_path = os.path.join(path, "_index_%s.json" % key)
with open(index_path, "w") as f: with open(index_path, "w") as f:
json.dump(data, f, cls=model.ModelJSONEncoder, indent=2) json.dump(data, f, cls=model.ModelJSONEncoder, indent=2)
@ -106,7 +106,7 @@ def armor_json(db, path):
a.update_indexes(indexes) a.update_indexes(indexes)
skills = db.get_item_skills(a.id) skills = db.get_item_skills(a.id)
if not skills: if not skills:
print "WARN: armor '%s' (%d) has no skills" % (a.name, a.id) print("WARN: armor '%s' (%d) has no skills" % (a.name, a.id))
a.set_skills(skills) a.set_skills(skills)
all_data.append(a.as_data()) all_data.append(a.as_data())
@ -130,7 +130,7 @@ def decoration_json(db, path):
a.update_indexes(indexes) a.update_indexes(indexes)
skills = db.get_item_skills(a.id) skills = db.get_item_skills(a.id)
if not skills: if not skills:
print "WARN: decoration '%s' (%d) has no skills" % (a.name, a.id) print("WARN: decoration '%s' (%d) has no skills" % (a.name, a.id))
a.set_skills(skills) a.set_skills(skills)
all_data.append(a.as_data()) all_data.append(a.as_data())
@ -254,7 +254,7 @@ def wyporium_json(db, path):
if not k.startswith("wyporium"): if not k.startswith("wyporium"):
continue continue
trade_map[item.id][k] = all_data[k] trade_map[item.id][k] = all_data[k]
print trade_map print(trade_map)
mkdirs_p(path) mkdirs_p(path)
write_map_file(path, trade_map) write_map_file(path, trade_map)
@ -282,7 +282,7 @@ def main():
if args.entities: if args.entities:
for entity in args.entities: for entity in args.entities:
if entity not in ENTITIES: if entity not in ENTITIES:
print "Unknown entity: %s" % entity print("Unknown entity: %s" % entity)
sys.exit(1) sys.exit(1)
else: else:
args.entities = ENTITIES args.entities = ENTITIES

@ -12,11 +12,11 @@ from mhapi.util import get_utf8_writer
def print_header_nav(title, pid): def print_header_nav(title, pid):
print """ print("""
<div data-role="header" data-position="fixed"> <div data-role="header" data-position="fixed">
<a href="#page-menu" class="ui-btn-left ui-btn ui-btn-inline ui-mini ui-corner-all ui-btn-icon-left ui-icon-bars">Menu</a> <a href="#page-menu" class="ui-btn-left ui-btn ui-btn-inline ui-mini ui-corner-all ui-btn-icon-left ui-icon-bars">Menu</a>
<h1>%s</h1> <h1>%s</h1>
""".strip() % title """.strip() % title)
alt_pid = None alt_pid = None
if pid.endswith("-en"): if pid.endswith("-en"):
@ -27,11 +27,11 @@ def print_header_nav(title, pid):
alt_title = "en" alt_title = "en"
if alt_pid is not None: if alt_pid is not None:
print """ print("""
<a href="#%s" class="ui-btn-right ui-btn ui-btn-inline ui-mini">%s</a> <a href="#%s" class="ui-btn-right ui-btn ui-btn-inline ui-mini">%s</a>
""".strip() % (alt_pid, alt_title) """.strip() % (alt_pid, alt_title))
print " </div>" print(" </div>")
def mk_html_list(dict_list, keys, sort_keys, divider_fn="auto"): def mk_html_list(dict_list, keys, sort_keys, divider_fn="auto"):
@ -39,7 +39,7 @@ def mk_html_list(dict_list, keys, sort_keys, divider_fn="auto"):
print ('<ul data-role="listview" data-filter="true"' print ('<ul data-role="listview" data-filter="true"'
' data-autodividers="true">') ' data-autodividers="true">')
else: else:
print '<ul data-role="listview" data-filter="true">' print('<ul data-role="listview" data-filter="true">')
if isinstance(sort_keys, types.FunctionType): if isinstance(sort_keys, types.FunctionType):
sort_fn = sort_keys sort_fn = sort_keys
@ -55,26 +55,26 @@ def mk_html_list(dict_list, keys, sort_keys, divider_fn="auto"):
if divider_fn not in (None, "auto"): if divider_fn not in (None, "auto"):
divider_text = divider_fn(d, prev_d) divider_text = divider_fn(d, prev_d)
if divider_text is not None: if divider_text is not None:
print ' <li data-role="list-divider">%s</li>' % divider_text print(' <li data-role="list-divider">%s</li>' % divider_text)
print " <li>" print(" <li>")
for i, k in enumerate(keys): for i, k in enumerate(keys):
value = d[k] value = d[k]
if k in ("section", "description"): if k in ("section", "description"):
if value: if value:
print ' <p class="ui-li-desc">%s</p>' % value print(' <p class="ui-li-desc">%s</p>' % value)
continue continue
elif k == "title_jp" and i != 0: elif k == "title_jp" and i != 0:
# NB: for monster by title we want it to be a normal column # NB: for monster by title we want it to be a normal column
if value: if value:
print ' <p class="ui-li-desc">Title: %s</p>' % value print(' <p class="ui-li-desc">Title: %s</p>' % value)
continue continue
if value.endswith(".png"): if value.endswith(".png"):
value = ('<img class="icon" src="../img/icons_items/%s" />' value = ('<img class="icon" src="../img/icons_items/%s" />'
% value) % value)
print ' <span class="%s">%s</span>' % (k, value) print(' <span class="%s">%s</span>' % (k, value))
print " </li>" print(" </li>")
prev_d = d prev_d = d
print '</ul>' print('</ul>')
def _main(): def _main():
@ -87,7 +87,7 @@ def _main():
carve_items = db.get_items(item_types=("Flesh",)) carve_items = db.get_items(item_types=("Flesh",))
print """<!DOCTYPE html> print("""<!DOCTYPE html>
<html> <html>
<head> <head>
<title>Poogie Translate</title> <title>Poogie Translate</title>
@ -133,26 +133,26 @@ def _main():
</ul> </ul>
</div> </div>
</div> </div>
""" """)
stree_path = os.path.join(_pathfix.project_path, "db", stree_path = os.path.join(_pathfix.project_path, "db",
"mhx_skill_tree_list.json") "mhx_skill_tree_list.json")
with open(stree_path) as f: with open(stree_path) as f:
stree_list = json.load(f) stree_list = json.load(f)
print '<div data-role="page" id="page-skilltrees-en">' print('<div data-role="page" id="page-skilltrees-en">')
print_header_nav("Skill Trees (en)", "page-skilltrees-en") print_header_nav("Skill Trees (en)", "page-skilltrees-en")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(stree_list, ("name", "name_jp"), ("name",)) mk_html_list(stree_list, ("name", "name_jp"), ("name",))
print '</div>' print('</div>')
print '</div>' print('</div>')
print '<div data-role="page" id="page-skilltrees-jp">' print('<div data-role="page" id="page-skilltrees-jp">')
print_header_nav("Skill Trees (jp)", "page-skilltrees-jp") print_header_nav("Skill Trees (jp)", "page-skilltrees-jp")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(stree_list, ("name_jp", "name"), jplen_sort_fn, mk_html_list(stree_list, ("name_jp", "name"), jplen_sort_fn,
divider_fn=jplen_divider_fn) divider_fn=jplen_divider_fn)
print '</div>' print('</div>')
print '</div>' print('</div>')
def item_divider_fn(d, prev_d): def item_divider_fn(d, prev_d):
prefix = _icon_prefix(d) prefix = _icon_prefix(d)
@ -160,29 +160,29 @@ def _main():
if prefix != prev_prefix: if prefix != prev_prefix:
return prefix return prefix
return None return None
print '<div data-role="page" id="page-item-usable">' print('<div data-role="page" id="page-item-usable">')
print_header_nav("Items: Usable", "page-item-usable") print_header_nav("Items: Usable", "page-item-usable")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(items, ("icon_name", "name", "name_jp"), mk_html_list(items, ("icon_name", "name", "name_jp"),
("icon_name", "name"), divider_fn=item_divider_fn) ("icon_name", "name"), divider_fn=item_divider_fn)
print '</div>' print('</div>')
print '</div>' print('</div>')
print '<div data-role="page" id="page-item-gather">' print('<div data-role="page" id="page-item-gather">')
print_header_nav("Items: Gatherable", "page-item-gather") print_header_nav("Items: Gatherable", "page-item-gather")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(gather_items, ("icon_name", "name", "name_jp"), mk_html_list(gather_items, ("icon_name", "name", "name_jp"),
("icon_name", "name"), divider_fn=item_divider_fn) ("icon_name", "name"), divider_fn=item_divider_fn)
print '</div>' print('</div>')
print '</div>' print('</div>')
print '<div data-role="page" id="page-item-carve">' print('<div data-role="page" id="page-item-carve">')
print_header_nav("Items: Carve", "page-item-carve") print_header_nav("Items: Carve", "page-item-carve")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(carve_items, ("icon_name", "name", "name_jp"), mk_html_list(carve_items, ("icon_name", "name", "name_jp"),
("icon_name", "name"), divider_fn=item_divider_fn) ("icon_name", "name"), divider_fn=item_divider_fn)
print '</div>' print('</div>')
print '</div>' print('</div>')
ha_path = os.path.join(_pathfix.project_path, "db", "hunter_arts.json") ha_path = os.path.join(_pathfix.project_path, "db", "hunter_arts.json")
with open(ha_path) as f: with open(ha_path) as f:
@ -194,21 +194,21 @@ def _main():
elif d["section"] != prev_d["section"]: elif d["section"] != prev_d["section"]:
return d["section"] return d["section"]
return None return None
print '<div data-role="page" id="page-hunterarts-en">' print('<div data-role="page" id="page-hunterarts-en">')
print_header_nav("Hunter Arts (en)", "page-hunterarts-en") print_header_nav("Hunter Arts (en)", "page-hunterarts-en")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(ha_list, ("name", "name_jp", "description"), None, mk_html_list(ha_list, ("name", "name_jp", "description"), None,
divider_fn=ha_divider_fn) divider_fn=ha_divider_fn)
print '</div>' print('</div>')
print '</div>' print('</div>')
print '<div data-role="page" id="page-hunterarts-jp">' print('<div data-role="page" id="page-hunterarts-jp">')
print_header_nav("Hunter Arts (jp)", "page-hunterarts-jp") print_header_nav("Hunter Arts (jp)", "page-hunterarts-jp")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(ha_list, ("name_jp", "name", "section", "description"), mk_html_list(ha_list, ("name_jp", "name", "section", "description"),
jplen_sort_fn, divider_fn=jplen_divider_fn) jplen_sort_fn, divider_fn=jplen_divider_fn)
print '</div>' print('</div>')
print '</div>' print('</div>')
monster_path = os.path.join(_pathfix.project_path, "db", monster_path = os.path.join(_pathfix.project_path, "db",
@ -216,35 +216,35 @@ def _main():
with open(monster_path) as f: with open(monster_path) as f:
monster_list = json.load(f) monster_list = json.load(f)
print '<div data-role="page" id="page-monsters-en">' print('<div data-role="page" id="page-monsters-en">')
print_header_nav("Monsters (en)", "page-monsters-en") print_header_nav("Monsters (en)", "page-monsters-en")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(monster_list, ("name", "name_jp", "title_jp"), ("name",)) mk_html_list(monster_list, ("name", "name_jp", "title_jp"), ("name",))
print '</div>' print('</div>')
print '</div>' print('</div>')
print '<div data-role="page" id="page-monsters-jp">' print('<div data-role="page" id="page-monsters-jp">')
print_header_nav("Monsters (jp)", "page-monsters-jp") print_header_nav("Monsters (jp)", "page-monsters-jp")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(monster_list, ("name_jp", "name", "title_jp"), ("name_jp",)) mk_html_list(monster_list, ("name_jp", "name", "title_jp"), ("name_jp",))
print '</div>' print('</div>')
print '</div>' print('</div>')
titled_monster_list = [m for m in monster_list if m["title_jp"]] titled_monster_list = [m for m in monster_list if m["title_jp"]]
print '<div data-role="page" id="page-monsters-title">' print('<div data-role="page" id="page-monsters-title">')
print_header_nav("Monster Titles", "page-monsters-title") print_header_nav("Monster Titles", "page-monsters-title")
print '<div data-role="main" class="ui-content">' print('<div data-role="main" class="ui-content">')
mk_html_list(titled_monster_list, ("title_jp", "name"), ("title_jp",), mk_html_list(titled_monster_list, ("title_jp", "name"), ("title_jp",),
divider_fn=None) divider_fn=None)
print '</div>' print('</div>')
print '</div>' print('</div>')
print """ print("""
</body> </body>
""" """)
def _icon_prefix(d): def _icon_prefix(d):
if d is None: if d is None:

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import sys import sys
import json import json

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
""" """
Parse hunter arts name, name_jp, and description from wikia: Parse hunter arts name, name_jp, and description from wikia:
@ -10,7 +10,7 @@ Returns list of dict, e.g.:
"section": "Heavy Bowgun", "section": "Heavy Bowgun",
"description": "", "description": "",
"name": "Acceleration Shower I", "name": "Acceleration Shower I",
"name_jp": "\u30a2\u30af\u30bb\u30eb\u30b7\u30e3\u30ef\u30fc I" "name_jp": "\\u30a2\\u30af\\u30bb\\u30eb\\u30b7\\u30e3\\u30ef\\u30fc I"
}, },
... ...
] ]
@ -62,7 +62,7 @@ def parse_wikia_hunter_arts(f):
def _main(): def _main():
with open(sys.argv[1]) as f: with open(sys.argv[1]) as f:
data = parse_wikia_hunter_arts(f) data = parse_wikia_hunter_arts(f)
print json.dumps(data, indent=2) print(json.dumps(data, indent=2))
if __name__ == '__main__': if __name__ == '__main__':

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
""" """
Parse monster names and jp names for monster hunter X. Parse monster names and jp names for monster hunter X.
@ -55,7 +55,7 @@ def parse_wikia_monsters(f):
m = SECTION_RE.match(line) m = SECTION_RE.match(line)
if m: if m:
section = m.group(1) section = m.group(1)
print >>sys.stderr, "section", section print("section", section, file=sys.stderr)
continue continue
if section not in ["Large Monsters", "Small Monsters"]: if section not in ["Large Monsters", "Small Monsters"]:
continue continue
@ -108,16 +108,16 @@ def _main():
name = m["name"] name = m["name"]
names = get_jp_names(m["href"]) names = get_jp_names(m["href"])
if len(names) == 0: if len(names) == 0:
print >>sys.stderr, "ERROR: no names for %s" % name print("ERROR: no names for %s" % name, file=sys.stderr)
names = ["", ""] names = ["", ""]
if len(names) == 1: if len(names) == 1:
print >>sys.stderr, "ERROR: no title for %s" % name print("ERROR: no title for %s" % name, file=sys.stderr)
names.append("") names.append("")
m["name_jp"] = names[0] m["name_jp"] = names[0]
m["title_jp"] = names[1] m["title_jp"] = names[1]
if m["title_jp"] in ("None", "N/A", "(?)"): if m["title_jp"] in ("None", "N/A", "(?)"):
m["title_jp"] = "" m["title_jp"] = ""
print json.dumps(monster_list, indent=2) print(json.dumps(monster_list, indent=2))
if __name__ == '__main__': if __name__ == '__main__':

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
""" """
Parse skill tree names and jp names for monster hunter X. Parse skill tree names and jp names for monster hunter X.
@ -81,7 +81,7 @@ def parse_wikia_skill_trees(f):
def _main(): def _main():
if len(sys.argv) != 4: if len(sys.argv) != 4:
print "Usage: %s infile out_strees.json out_skills.json" % sys.argv[0] print("Usage: %s infile out_strees.json out_skills.json" % sys.argv[0])
sys.exit(1) sys.exit(1)
with open(sys.argv[1]) as f: with open(sys.argv[1]) as f:
strees, skills = parse_wikia_skill_trees(f) strees, skills = parse_wikia_skill_trees(f)

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import _pathfix import _pathfix
@ -15,4 +15,4 @@ if __name__ == '__main__':
try: try:
httpd.serve_forever() httpd.serve_forever()
except KeyboardInterrupt: except KeyboardInterrupt:
print "^C" print("^C")

@ -1,4 +1,4 @@
#!/usr/bin/env python2 #!/usr/bin/env python3
import sys import sys
import argparse import argparse
@ -21,7 +21,7 @@ def main():
if args.item: if args.item:
item = db.get_item_by_name(args.item) item = db.get_item_by_name(args.item)
if item is None: if item is None:
print "Item '%s' not found" % args.item print("Item '%s' not found" % args.item)
sys.exit(1) sys.exit(1)
if item.type == "Materials": if item.type == "Materials":
stars = item_stars.get_material_stars(item.id) stars = item_stars.get_material_stars(item.id)
@ -30,15 +30,15 @@ def main():
elif args.weapon: elif args.weapon:
weapon = db.get_weapon_by_name(args.weapon) weapon = db.get_weapon_by_name(args.weapon)
if weapon is None: if weapon is None:
print "Weapon '%s' not found" % args.weapon print("Weapon '%s' not found" % args.weapon)
sys.exit(1) sys.exit(1)
stars = item_stars.get_weapon_stars(weapon) stars = item_stars.get_weapon_stars(weapon)
else: else:
print "Specify -w or -i" print("Specify -w or -i")
sys.exit(1) sys.exit(1)
for k, v in stars.iteritems(): for k, v in stars.items():
print k, v print(k, v)
if __name__ == '__main__': if __name__ == '__main__':

@ -12,7 +12,7 @@ from mhapi.db import MHDB
def apply_update(db, row): def apply_update(db, row):
quest = db.get_quest(row["id"]) quest = db.get_quest(row["id"])
if quest.goal == row["goal"]: if quest.goal == row["goal"]:
print "quest", row["id"], row["name"], "already updated, skipping" print("quest", row["id"], row["name"], "already updated, skipping")
return return
cur = db.cursor() cur = db.cursor()
cur.execute("""UPDATE quests SET cur.execute("""UPDATE quests SET
@ -21,9 +21,9 @@ def apply_update(db, row):
AND name=?""", AND name=?""",
(row["goal"], row["id"], row["name"])) (row["goal"], row["id"], row["name"]))
if cur.rowcount == 1: if cur.rowcount == 1:
print "quest", row["id"], row["name"], "goal updated:", row["goal"] print("quest", row["id"], row["name"], "goal updated:", row["goal"])
else: else:
print "ERROR", "quest", row["id"], row["name"], "update failed" print("ERROR", "quest", row["id"], row["name"], "update failed")
if __name__ == '__main__': if __name__ == '__main__':

@ -123,8 +123,8 @@ def _parse_monster(name):
name = rstrip(name, "'s") name = rstrip(name, "'s")
name = rstrip(name, "'") name = rstrip(name, "'")
name = rstrip(name, u"") name = rstrip(name, "")
name = rstrip(name, u"s") name = rstrip(name, "s")
#print "=>", name #print "=>", name
@ -202,7 +202,7 @@ def fuzzy_find(name):
def check_hunts(db, quest): def check_hunts(db, quest):
print ">", quest.id, quest.name, print(">", quest.id, quest.name, end=' ')
monsters_match = False monsters_match = False
@ -240,30 +240,30 @@ def check_hunts(db, quest):
if monsters_match and not errors: if monsters_match and not errors:
# useful for doing grep -v on output # useful for doing grep -v on output
print " *OK*" print(" *OK*")
elif monsters_match: elif monsters_match:
print " *MISSPELLING*" print(" *MISSPELLING*")
print " goal:", quest.goal print(" goal:", quest.goal)
print " sub:", quest.sub_goal print(" sub:", quest.sub_goal)
for err in errors: for err in errors:
print " ", err print(" ", err)
else: else:
print " *MISMATCH*", print(" *MISMATCH*", end=' ')
if errors: if errors:
print " *MISSPELLING*", print(" *MISSPELLING*", end=' ')
print print()
for err in errors: for err in errors:
print " ", err print(" ", err)
print " goal:", quest.goal print(" goal:", quest.goal)
print " sub:", quest.sub_goal print(" sub:", quest.sub_goal)
print " parsed:", goal_expected print(" parsed:", goal_expected)
if sub_expected and not sub_expected < goal_expected: if sub_expected and not sub_expected < goal_expected:
# print if sub monster looks like it's not one of the # print if sub monster looks like it's not one of the
# main monsters. This will false positive when main quest # main monsters. This will false positive when main quest
# is hunt all large monsters. # is hunt all large monsters.
print " sub prsd:", sub_expected print(" sub prsd:", sub_expected)
print " db:", db_expected print(" db:", db_expected)
print " db unstb:", db_expected_unstable print(" db unstb:", db_expected_unstable)
if __name__ == '__main__': if __name__ == '__main__':

@ -12,7 +12,7 @@ stdout = get_utf8_writer(sys.stdout)
def set_weapon_final(db, weapon, value): def set_weapon_final(db, weapon, value):
print >>stdout, "weapon_final", weapon.id, weapon.name, value print("weapon_final", weapon.id, weapon.name, value, file=stdout)
cur = db.cursor() cur = db.cursor()
cur.execute("""UPDATE weapons SET cur.execute("""UPDATE weapons SET
final=? WHERE _id=?""", final=? WHERE _id=?""",

@ -19,7 +19,7 @@ def set_carve_counts(db, monster_carves):
for m in monsters: for m in monsters:
rewards = db.get_monster_rewards(m.id) rewards = db.get_monster_rewards(m.id)
mc = monster_carves.get(m.name) mc = monster_carves.get(m.name)
print "===", m.name print("===", m.name)
for r in rewards: for r in rewards:
condition = r["condition"] condition = r["condition"]
if "Carve" not in condition: if "Carve" not in condition:
@ -34,13 +34,13 @@ def set_carve_counts(db, monster_carves):
elif condition == "Tail Carve": elif condition == "Tail Carve":
stack_size = 1 stack_size = 1
else: else:
print "WARN: unknown condition %s.%s" \ print("WARN: unknown condition %s.%s" \
% (m.name, condition) % (m.name, condition))
else: else:
assert False, "Unknown monster class: %s" % m["class"] assert False, "Unknown monster class: %s" % m["class"]
if r["stack_size"] == stack_size: if r["stack_size"] == stack_size:
continue continue
print " ", condition, r["stack_size"], "=>", stack_size print(" ", condition, r["stack_size"], "=>", stack_size)
cur = db.cursor() cur = db.cursor()
cur.execute("""UPDATE hunting_rewards cur.execute("""UPDATE hunting_rewards
SET stack_size=? WHERE _id=?""", SET stack_size=? WHERE _id=?""",

@ -23,7 +23,7 @@ def _add_column(cursor, table, column_spec):
def _set_stars(cursor, item_id, stars): def _set_stars(cursor, item_id, stars):
for k in stars.keys(): for k in list(stars.keys()):
col = k.lower() + "_stars" col = k.lower() + "_stars"
q = "UPDATE items SET %s=? WHERE _id=?" % col q = "UPDATE items SET %s=? WHERE _id=?" % col
cursor.execute(q, (stars[k], item_id)) cursor.execute(q, (stars[k], item_id))
@ -45,7 +45,7 @@ def main():
items = db.get_items(exclude_types=["", "Armor", "Palico Weapon", items = db.get_items(exclude_types=["", "Armor", "Palico Weapon",
"Decoration"]) "Decoration"])
for item in items: for item in items:
print item.id, item.type, item.name print(item.id, item.type, item.name)
if item.type == "Materials": if item.type == "Materials":
stars = item_stars.get_material_stars(item.id) stars = item_stars.get_material_stars(item.id)
elif item.type == "Weapon": elif item.type == "Weapon":

@ -21,7 +21,7 @@ def set_quest_ranks(db):
for quest in quests: for quest in quests:
if not quest["name"]: if not quest["name"]:
assert quest["hub"] == "Event" assert quest["hub"] == "Event"
print "WARN: skipping non localized event quest: %d" % quest.id print("WARN: skipping non localized event quest: %d" % quest.id)
continue continue
set_quest_rank(db, quest) set_quest_rank(db, quest)
@ -35,19 +35,19 @@ def set_quest_rank(db, quest):
rewards = db.get_quest_rewards(quest_id) rewards = db.get_quest_rewards(quest_id)
rank = guess_quest_rank_from_rewards(db, rewards) rank = guess_quest_rank_from_rewards(db, rewards)
if rank is None: if rank is None:
print "WARN: quest '%s' has no flesh rewards, assuming lower rank"\ print("WARN: quest '%s' has no flesh rewards, assuming lower rank"\
% (quest.name.encode("utf8"),) % (quest.name.encode("utf8"),))
rank = rank_stars_guess[0] rank = rank_stars_guess[0]
elif rank not in rank_stars_guess: elif rank not in rank_stars_guess:
print "ERROR: quest '%s' reward guess '%s' not in stars guess '%s'"\ print("ERROR: quest '%s' reward guess '%s' not in stars guess '%s'"\
% (quest.name, rank, rank_stars_guess) % (quest.name, rank, rank_stars_guess))
else: else:
rank = rank_stars_guess rank = rank_stars_guess
assert rank in "LR HR G".split() assert rank in "LR HR G".split()
quest.rank = rank quest.rank = rank
print quest.one_line_u() print(quest.one_line_u())
cur = db.cursor() cur = db.cursor()
cur.execute("UPDATE quests SET rank=? WHERE _id=?", (rank, quest_id)) cur.execute("UPDATE quests SET rank=? WHERE _id=?", (rank, quest_id))

@ -10,7 +10,7 @@ from mhapi.db import MHDB
def set_buy(db, item_id, buy): def set_buy(db, item_id, buy):
print "buy", item_id, buy print("buy", item_id, buy)
cur = db.cursor() cur = db.cursor()
cur.execute("""UPDATE items SET cur.execute("""UPDATE items SET
buy=? WHERE _id=?""", buy=? WHERE _id=?""",
@ -22,7 +22,7 @@ def set_buy_by_name(db, name, buy):
buy=? WHERE name=?""", buy=? WHERE name=?""",
(buy, name)) (buy, name))
rowid = cur.lastrowid rowid = cur.lastrowid
print "buy", rowid, name, buy print("buy", rowid, name, buy)
if __name__ == '__main__': if __name__ == '__main__':
db = MHDB(game="4u") db = MHDB(game="4u")

@ -10,7 +10,7 @@ from mhapi.db import MHDB
def set_upgrade_cost(db, item_id, upgrade_cost): def set_upgrade_cost(db, item_id, upgrade_cost):
print "upgrade_cost", item_id, upgrade_cost print("upgrade_cost", item_id, upgrade_cost)
cur = db.cursor() cur = db.cursor()
cur.execute("""UPDATE weapons SET cur.execute("""UPDATE weapons SET
upgrade_cost=? WHERE _id=?""", upgrade_cost=? WHERE _id=?""",
@ -18,7 +18,7 @@ def set_upgrade_cost(db, item_id, upgrade_cost):
def set_creation_cost(db, item_id, creation_cost): def set_creation_cost(db, item_id, creation_cost):
print "creation_cost", item_id, creation_cost print("creation_cost", item_id, creation_cost)
cur = db.cursor() cur = db.cursor()
cur.execute("""UPDATE weapons SET cur.execute("""UPDATE weapons SET
creation_cost=? WHERE _id=?""", creation_cost=? WHERE _id=?""",

@ -78,14 +78,14 @@ class WeaponTypeMotionValues(object):
self.motion_values[name] = MotionValue(name, d["type"], d["power"]) self.motion_values[name] = MotionValue(name, d["type"], d["power"])
self.average = (sum(mv.average self.average = (sum(mv.average
for mv in self.motion_values.itervalues()) for mv in self.motion_values.values())
/ len(self)) / len(self))
def __len__(self): def __len__(self):
return len(self.motion_values) return len(self.motion_values)
def keys(self): def keys(self):
return self.motion_values.keys() return list(self.motion_values.keys())
def __getitem__(self, key): def __getitem__(self, key):
return self.motion_values[key] return self.motion_values[key]
@ -109,7 +109,7 @@ class MotionValueDB(object):
return self.motion_values_map[weapon_type] return self.motion_values_map[weapon_type]
def keys(self): def keys(self):
return self.motion_values_map.keys() return list(self.motion_values_map.keys())
def __len__(self): def __len__(self):
return len(self.motion_values_map) return len(self.motion_values_map)
@ -158,7 +158,7 @@ class WeaponType(object):
@classmethod @classmethod
def all(cls): def all(cls):
return cls._multiplier.keys() return list(cls._multiplier.keys())
@classmethod @classmethod
def damage_type(cls, weapon_type): def damage_type(cls, weapon_type):
@ -230,7 +230,7 @@ class WeaponMonsterDamage(object):
self.sharpness = self.weapon.sharpness.max self.sharpness = self.weapon.sharpness.max
#print "sharpness=", self.sharpness #print "sharpness=", self.sharpness
if self.weapon["affinity"]: if self.weapon["affinity"]:
if (isinstance(self.weapon["affinity"], basestring) if (isinstance(self.weapon["affinity"], str)
and "/" in self.weapon["affinity"]): and "/" in self.weapon["affinity"]):
self.chaotic = True self.chaotic = True
# Handle chaotic gore affinity, e.g. -35/10. This means that # Handle chaotic gore affinity, e.g. -35/10. This means that
@ -358,7 +358,7 @@ class WeaponMonsterDamage(object):
part_damage.part = part part_damage.part = part
if alt is None: if alt is None:
if (self.breakable_parts if (self.breakable_parts
and _break_find(part, self.monster_damage.parts.keys(), and _break_find(part, list(self.monster_damage.parts.keys()),
self.breakable_parts)): self.breakable_parts)):
part_damage.breakable = True part_damage.breakable = True
if hitbox > self.max_raw_part[1]: if hitbox > self.max_raw_part[1]:
@ -366,15 +366,15 @@ class WeaponMonsterDamage(object):
if ehitbox > self.max_element_part[1]: if ehitbox > self.max_element_part[1]:
self.max_element_part = (part, ehitbox) self.max_element_part = (part, ehitbox)
for part in self.damage_map.keys(): for part in list(self.damage_map.keys()):
if None not in self.damage_map[part].states: if None not in self.damage_map[part].states:
#print "Failed to parse part:", part #print "Failed to parse part:", part
del self.damage_map[part] del self.damage_map[part]
for part, d in self.damage_map.iteritems(): for part, d in self.damage_map.items():
if d.is_breakable(): if d.is_breakable():
self.break_count += 1 self.break_count += 1
self.parts = self.damage_map.keys() self.parts = list(self.damage_map.keys())
self.averages["uniform"] = self.uniform() self.averages["uniform"] = self.uniform()
self.averages["raw"] = self.weighted_raw() self.averages["raw"] = self.weighted_raw()
self.averages["element"] = self.weighted_element() self.averages["element"] = self.weighted_element()
@ -405,7 +405,7 @@ class WeaponMonsterDamage(object):
def uniform(self): def uniform(self):
average = 0.0 average = 0.0
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
average += damage.average() average += damage.average()
return average / len(self.damage_map) return average / len(self.damage_map)
@ -417,7 +417,7 @@ class WeaponMonsterDamage(object):
""" """
average = 0.0 average = 0.0
total_hitbox = 0.0 total_hitbox = 0.0
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
average += damage.average() * damage.hitbox average += damage.average() * damage.hitbox
total_hitbox += damage.hitbox total_hitbox += damage.hitbox
if total_hitbox == 0: if total_hitbox == 0:
@ -430,7 +430,7 @@ class WeaponMonsterDamage(object):
""" """
average = 0.0 average = 0.0
total_ehitbox = 0.0 total_ehitbox = 0.0
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
average += damage.average() * damage.ehitbox average += damage.average() * damage.ehitbox
total_ehitbox += damage.ehitbox total_ehitbox += damage.ehitbox
if total_ehitbox == 0: if total_ehitbox == 0:
@ -444,7 +444,7 @@ class WeaponMonsterDamage(object):
else: else:
other_weight = (1 - weak_weight) / (len(self.parts) - 1) other_weight = (1 - weak_weight) / (len(self.parts) - 1)
average = 0 average = 0
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
if part == self.max_raw_part[0]: if part == self.max_raw_part[0]:
weight = weak_weight weight = weak_weight
else: else:
@ -459,7 +459,7 @@ class WeaponMonsterDamage(object):
else: else:
other_weight = (1 - weak_weight) / (len(self.parts) - 1) other_weight = (1 - weak_weight) / (len(self.parts) - 1)
average = 0 average = 0
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
if part == self.max_element_part[0]: if part == self.max_element_part[0]:
weight = weak_weight weight = weak_weight
else: else:
@ -475,7 +475,7 @@ class WeaponMonsterDamage(object):
return 0 return 0
average = 0.0 average = 0.0
count = self.break_count + 1 count = self.break_count + 1
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
if part == self.max_raw_part[0]: if part == self.max_raw_part[0]:
average += damage.average() average += damage.average()
if damage.is_breakable(): if damage.is_breakable():
@ -494,7 +494,7 @@ class WeaponMonsterDamage(object):
return 0 return 0
average = 0.0 average = 0.0
count = self.break_count + 1 count = self.break_count + 1
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
if part == self.max_element_part[0]: if part == self.max_element_part[0]:
# If weakpart is also a break, assume continue attacking # If weakpart is also a break, assume continue attacking
# even after broken # even after broken
@ -516,7 +516,7 @@ class WeaponMonsterDamage(object):
if not self.break_count: if not self.break_count:
return 0 return 0
average = 0.0 average = 0.0
for part, damage in self.damage_map.iteritems(): for part, damage in self.damage_map.items():
if damage.is_breakable(): if damage.is_breakable():
# attack until broken, then move to next break # attack until broken, then move to next break
average += damage.total average += damage.total

@ -662,13 +662,13 @@ class MHDBX(object):
self._monsters_by_name[d["name"]] = model.Monster(d) self._monsters_by_name[d["name"]] = model.Monster(d)
with open(hitboxes_path) as f: with open(hitboxes_path) as f:
damage_map = json.load(f) damage_map = json.load(f)
for name, damage in damage_map.iteritems(): for name, damage in damage_map.items():
mid = self._monsters_by_name[name].id mid = self._monsters_by_name[name].id
damage_rows = [] damage_rows = []
for part, data in damage.iteritems(): for part, data in damage.items():
if part.startswith("_"): if part.startswith("_"):
continue continue
row = dict((k.lower(), v) for k, v in data.iteritems()) row = dict((k.lower(), v) for k, v in data.items())
row["body_part"] = part row["body_part"] = part
row["ko"] = 100 if part == "Head" else 0 row["ko"] = 100 if part == "Head" else 0
row["_id"] = 0 row["_id"] = 0

@ -1,6 +1,6 @@
import string import string
import json import json
import urllib import urllib.request, urllib.parse, urllib.error
import re import re
import difflib import difflib
@ -57,7 +57,7 @@ class RowModel(ModelBase):
return key in self._data return key in self._data
def fields(self): def fields(self):
return self._data.keys() return list(self._data.keys())
def as_data(self): def as_data(self):
return self._data return self._data
@ -69,7 +69,7 @@ class RowModel(ModelBase):
return list_data return list_data
def update_indexes(self, data): def update_indexes(self, data):
for key_field, value_fields in self._indexes.iteritems(): for key_field, value_fields in self._indexes.items():
if key_field not in data: if key_field not in data:
data[key_field] = {} data[key_field] = {}
self.update_index(key_field, value_fields, data[key_field]) self.update_index(key_field, value_fields, data[key_field])
@ -86,7 +86,7 @@ class RowModel(ModelBase):
def __str__(self): def __str__(self):
if "name" in self._data and self.name is not None: if "name" in self._data and self.name is not None:
name = urllib.quote(self.name, safe=" ") name = urllib.parse.quote(self.name, safe=" ")
else: else:
name = str(self.id) name = str(self.id)
return "%s '%s'" % (self.__class__.__name__, name) return "%s '%s'" % (self.__class__.__name__, name)
@ -139,7 +139,7 @@ class SharpnessLevel(EnumBase):
WHITE = 5 WHITE = 5
PURPLE = 6 PURPLE = 6
ALL = range(0, PURPLE + 1) ALL = list(range(0, PURPLE + 1))
_names = { _names = {
RED: "Red", RED: "Red",
@ -203,7 +203,7 @@ class WeaponSharpness(ModelBase):
def max(self): def max(self):
if self._max is None: if self._max is None:
self._max = SharpnessLevel.RED self._max = SharpnessLevel.RED
for i in xrange(SharpnessLevel.PURPLE+1): for i in range(SharpnessLevel.PURPLE+1):
if self.value_list[i] == 0: if self.value_list[i] == 0:
break break
else: else:
@ -304,7 +304,7 @@ class Armor(ItemWithSkills):
assert self.skills is not None assert self.skills is not None
total = self.skills.get(skill_id_or_name, 0) total = self.skills.get(skill_id_or_name, 0)
slots_left = self.num_slots slots_left = self.num_slots
for slots in xrange(len(decoration_values), 0, -1): for slots in range(len(decoration_values), 0, -1):
if slots_left == 0: if slots_left == 0:
break break
decoration_value = decoration_values[slots-1] decoration_value = decoration_values[slots-1]
@ -529,7 +529,7 @@ class MonsterDamage(ModelBase):
Set breakable flag on parts based on the breakable list from Set breakable flag on parts based on the breakable list from
rewards (use MHDB.get_monster_breaks). rewards (use MHDB.get_monster_breaks).
""" """
for name, part_damage in self.parts.iteritems(): for name, part_damage in self.parts.items():
if _break_find(name, self.parts, breakable_list): if _break_find(name, self.parts, breakable_list):
#print "part %s is breakable [by rewards]" % name #print "part %s is breakable [by rewards]" % name
part_damage.breakable = True part_damage.breakable = True
@ -610,13 +610,13 @@ def get_costs(db, weapon):
upgrade_cost = int(weapon.upgrade_cost) upgrade_cost = int(weapon.upgrade_cost)
except ValueError: except ValueError:
upgrade_cost = 0 upgrade_cost = 0
print "WARN: bad upgrade cost for '%s' (%s): '%s'" \ print("WARN: bad upgrade cost for '%s' (%s): '%s'" \
% (weapon.name, weapon.id, weapon.upgrade_cost) % (weapon.name, weapon.id, weapon.upgrade_cost))
except UnicodeError: except UnicodeError:
upgrade_cost = 0 upgrade_cost = 0
cost_display = urllib.quote(weapon.upgrade_cost) cost_display = urllib.parse.quote(weapon.upgrade_cost)
print "WARN: bad upgrade cost for '%s' (%s): '%s'" \ print("WARN: bad upgrade cost for '%s' (%s): '%s'" \
% (weapon.name, weapon.id, cost_display) % (weapon.name, weapon.id, cost_display))
parent_weapon = db.get_weapon(weapon.parent_id) parent_weapon = db.get_weapon(weapon.parent_id)
costs = get_costs(db, parent_weapon) costs = get_costs(db, parent_weapon)
for cost in costs: for cost in costs:
@ -632,8 +632,8 @@ def get_costs(db, weapon):
try: try:
zenny = int(weapon.creation_cost) zenny = int(weapon.creation_cost)
except ValueError: except ValueError:
print "WARN: bad creation cost for '%s': '%s'" \ print("WARN: bad creation cost for '%s': '%s'" \
% (weapon.name, weapon.creation_cost) % (weapon.name, weapon.creation_cost))
zenny = weapon.upgrade_cost or 0 zenny = weapon.upgrade_cost or 0
create_cost = dict(zenny=zenny, create_cost = dict(zenny=zenny,
path=[weapon], path=[weapon],
@ -688,7 +688,7 @@ class ItemStars(object):
if not c["components"]: if not c["components"]:
continue continue
current_stars = self._get_component_stars(c) current_stars = self._get_component_stars(c)
for k, v in current_stars.iteritems(): for k, v in current_stars.items():
if v is None: if v is None:
continue continue
if stars[k] is None or v < stars[k]: if stars[k] is None or v < stars[k]:
@ -743,7 +743,7 @@ class ItemStars(object):
if "Scrap" in item.name: if "Scrap" in item.name:
continue continue
istars = self.get_item_stars(item.id) istars = self.get_item_stars(item.id)
for k, v in stars.items(): for k, v in list(stars.items()):
if istars[k] > v: if istars[k] > v:
stars[k] = istars[k] stars[k] = istars[k]
break break
@ -774,7 +774,7 @@ class ItemStars(object):
gather_locations = set() gather_locations = set()
for gather in gathering: for gather in gathering:
gather_locations.add((gather["location_id"], gather["rank"])) gather_locations.add((gather["location_id"], gather["rank"]))
for location_id, rank in list(gather_locations): for location_id, rank in gather_locations:
gather_quests = self.db.get_location_quests(location_id, rank) gather_quests = self.db.get_location_quests(location_id, rank)
quests.extend(gather_quests) quests.extend(gather_quests)
@ -782,7 +782,7 @@ class ItemStars(object):
monster_ranks = set() monster_ranks = set()
for monster in monsters: for monster in monsters:
monster_ranks.add((monster["monster_id"], monster["rank"])) monster_ranks.add((monster["monster_id"], monster["rank"]))
for monster_id, rank in list(monster_ranks): for monster_id, rank in monster_ranks:
monster_quests = self.db.get_monster_quests(monster_id, rank) monster_quests = self.db.get_monster_quests(monster_id, rank)
quests.extend(monster_quests) quests.extend(monster_quests)
@ -794,15 +794,15 @@ class ItemStars(object):
if quest.stars == 0: if quest.stars == 0:
# ignore training quests # ignore training quests
if "Training" not in quest.name: if "Training" not in quest.name:
print "Error: non training quest has 0 stars", \ print("Error: non training quest has 0 stars", \
quest.id, quest.name quest.id, quest.name)
continue continue
if quest.hub in stars: if quest.hub in stars:
current = stars[quest.hub] current = stars[quest.hub]
if current is None or quest.stars < current: if current is None or quest.stars < current:
stars[quest.hub] = quest.stars stars[quest.hub] = quest.stars
else: else:
print "Error: unknown hub", quest.hub print("Error: unknown hub", quest.hub)
# if available guild or village, then null out permit/arena values, # if available guild or village, then null out permit/arena values,
# because they are more useful for filtering if limited to items # because they are more useful for filtering if limited to items

@ -3,7 +3,7 @@ Calculate expected values for monster hunter items and find the best quests
and hunts for getting an item with specified skills. and hunts for getting an item with specified skills.
""" """
from __future__ import print_function
from collections import OrderedDict from collections import OrderedDict
from mhapi import stats from mhapi import stats
@ -105,7 +105,7 @@ class GatherLocation(object):
for gr in self._rewards: for gr in self._rewards:
gr.print(out, indent) gr.print(out, indent)
def __nonzero__(self): def __bool__(self):
return bool(len(self._rewards)) return bool(len(self._rewards))
def __len__(self): def __len__(self):
@ -146,7 +146,7 @@ class QuestReward(object):
* (LuckSkill.AMAZING - LuckSkill.NONE + 1)) * (LuckSkill.AMAZING - LuckSkill.NONE + 1))
else: else:
counts = [stats.quest_reward_expected_c(self.slot, skill) counts = [stats.quest_reward_expected_c(self.slot, skill)
for skill in xrange(LuckSkill.NONE, for skill in range(LuckSkill.NONE,
LuckSkill.AMAZING+1)] LuckSkill.AMAZING+1)]
@ -218,7 +218,7 @@ class QuestItemExpectedValue(object):
# chances there are to get other rewards. # chances there are to get other rewards.
fixed_seen = dict(A=set(), B=set(), Sub=set()) fixed_seen = dict(A=set(), B=set(), Sub=set())
dups = dict() dups = dict()
for i in xrange(len(rewards)): for i in range(len(rewards)):
reward = rewards[i] reward = rewards[i]
slot = reward["reward_slot"] slot = reward["reward_slot"]
if reward["percentage"] == 100: if reward["percentage"] == 100:
@ -251,7 +251,7 @@ class QuestItemExpectedValue(object):
self.slot_rewards[reward.slot].append(reward) self.slot_rewards[reward.slot].append(reward)
evs = reward.expected_values() evs = reward.expected_values()
for i in xrange(len(evs)): for i in range(len(evs)):
self.total_expected_values[i] += evs[i] self.total_expected_values[i] += evs[i]
def print(self, out, indent=2): def print(self, out, indent=2):
@ -320,10 +320,10 @@ class HuntReward(object):
shiny=self.shiny) shiny=self.shiny)
kill_ev = dict() kill_ev = dict()
cap_ev = dict() cap_ev = dict()
for skill in xrange(CarvingSkill.NONE, CarvingSkill.GOD+1): for skill in range(CarvingSkill.NONE, CarvingSkill.GOD+1):
kill_ev[CarvingSkill.name(skill)] = \ kill_ev[CarvingSkill.name(skill)] = \
self.expected_value(STRAT_CAP, carving_skill=skill) self.expected_value(STRAT_CAP, carving_skill=skill)
for skill in xrange(CapSkill.NONE, CapSkill.GOD+1): for skill in range(CapSkill.NONE, CapSkill.GOD+1):
cap_ev[CapSkill.name(skill)] = self.expected_value(STRAT_CAP, cap_ev[CapSkill.name(skill)] = self.expected_value(STRAT_CAP,
cap_skill=skill) cap_skill=skill)
@ -357,7 +357,7 @@ class HuntReward(object):
self.kill = False self.kill = False
counts = [ counts = [
stats.capture_reward_expected_c(skill) stats.capture_reward_expected_c(skill)
for skill in xrange(CapSkill.NONE, for skill in range(CapSkill.NONE,
CapSkill.GOD+1) CapSkill.GOD+1)
] ]
elif self.condition == "Virus Reward": elif self.condition == "Virus Reward":
@ -393,7 +393,7 @@ class HuntReward(object):
if self.skill == SKILL_CARVING: if self.skill == SKILL_CARVING:
counts = [ counts = [
self.stack_size + stats.carve_delta_expected_c(skill) self.stack_size + stats.carve_delta_expected_c(skill)
for skill in xrange(CarvingSkill.NONE, for skill in range(CarvingSkill.NONE,
CarvingSkill.GOD+1) CarvingSkill.GOD+1)
] ]
@ -624,7 +624,7 @@ class HuntItemExpectedValue(object):
carving_skill=carving_skill) carving_skill=carving_skill)
return ev return ev
def __nonzero__(self): def __bool__(self):
return bool(len(self.matching_rewards)) return bool(len(self.matching_rewards))
def __len__(self): def __len__(self):
@ -640,10 +640,10 @@ class HuntItemExpectedValue(object):
rewards=[r.as_data() for r in self.matching_rewards]) rewards=[r.as_data() for r in self.matching_rewards])
kill_ev = dict() kill_ev = dict()
cap_ev = dict() cap_ev = dict()
for skill in xrange(CarvingSkill.NONE, CarvingSkill.GOD+1): for skill in range(CarvingSkill.NONE, CarvingSkill.GOD+1):
kill_ev[CarvingSkill.name(skill)] = \ kill_ev[CarvingSkill.name(skill)] = \
self.expected_value(STRAT_CAP, carving_skill=skill) self.expected_value(STRAT_CAP, carving_skill=skill)
for skill in xrange(CapSkill.NONE, CapSkill.GOD+1): for skill in range(CapSkill.NONE, CapSkill.GOD+1):
cap_ev[CapSkill.name(skill)] = self.expected_value(STRAT_CAP, cap_ev[CapSkill.name(skill)] = self.expected_value(STRAT_CAP,
cap_skill=skill) cap_skill=skill)
@ -737,8 +737,8 @@ class ItemRewards(object):
key = (mid, rank) key = (mid, rank)
self._hunt_items[key] = hunt_item self._hunt_items[key] = hunt_item
for rank, skill_sets in self.rank_skill_sets.iteritems(): for rank, skill_sets in self.rank_skill_sets.items():
for s in skill_sets.itervalues(): for s in skill_sets.values():
s.add_hunt_option(hunt_item) s.add_hunt_option(hunt_item)
def get_hunt_item(self, monster_id, monster_rank): def get_hunt_item(self, monster_id, monster_rank):
@ -777,15 +777,15 @@ class ItemRewards(object):
gather_key = (quest_item.quest.location_id, quest_item.quest.rank) gather_key = (quest_item.quest.location_id, quest_item.quest.rank)
gather_location = self._gather_items.get(gather_key) gather_location = self._gather_items.get(gather_key)
for rank, skill_sets in self.rank_skill_sets.iteritems(): for rank, skill_sets in self.rank_skill_sets.items():
for s in skill_sets.itervalues(): for s in skill_sets.values():
s.add_quest_option(quest_item, hunt_items, gather_location) s.add_quest_option(quest_item, hunt_items, gather_location)
def print_gather_locations(self, out): def print_gather_locations(self, out):
if not self._gather_items: if not self._gather_items:
return return
for gl in self._gather_items.itervalues(): for gl in self._gather_items.values():
out.write("(GATHER) %s %s\n" out.write("(GATHER) %s %s\n"
% (gl.location_name, gl.rank)) % (gl.location_name, gl.rank))
gl.print(out, indent=2) gl.print(out, indent=2)
@ -798,7 +798,7 @@ class ItemRewards(object):
if not self._hunt_items: if not self._hunt_items:
return return
for hunt_item in self._hunt_items.itervalues(): for hunt_item in self._hunt_items.values():
out.write("(HUNT) %s %s\n" out.write("(HUNT) %s %s\n"
% (hunt_item.monster_name, hunt_item.monster_rank)) % (hunt_item.monster_name, hunt_item.monster_rank))
hunt_item.print(out, indent=2) hunt_item.print(out, indent=2)
@ -826,13 +826,13 @@ class ItemRewards(object):
def print_recommended_hunts(self, out): def print_recommended_hunts(self, out):
out.write("*** Poogie Recommends ***\n") out.write("*** Poogie Recommends ***\n")
for rank, skill_sets in self.rank_skill_sets.iteritems(): for rank, skill_sets in self.rank_skill_sets.items():
no_skill_best = skill_sets["No skills"].best no_skill_best = skill_sets["No skills"].best
if no_skill_best is None: if no_skill_best is None:
# not available at this rank # not available at this rank
continue continue
out.write("> " + rank + "\n") out.write("> " + rank + "\n")
for name, skill_set in skill_sets.iteritems(): for name, skill_set in skill_sets.items():
if skill_set.best is None: if skill_set.best is None:
# Don't print out a rank with no options # Don't print out a rank with no options
continue continue
@ -850,8 +850,8 @@ class ItemRewards(object):
Get a list of the quests for acquiring a given item and the probability Get a list of the quests for acquiring a given item and the probability
of getting the item, depending on cap or kill and luck skills. of getting the item, depending on cap or kill and luck skills.
""" """
for quest_item in self._quest_items.itervalues(): for quest_item in self._quest_items.values():
out.write("(QUEST) " + unicode(quest_item.quest) + "\n") out.write("(QUEST) " + str(quest_item.quest) + "\n")
out.write(" %20s" % "= Quest\n") out.write(" %20s" % "= Quest\n")
quest_item.print(out, indent=2) quest_item.print(out, indent=2)
@ -921,7 +921,7 @@ class ItemRewards(object):
item_name = self.item_row["name"] item_name = self.item_row["name"]
out.write("*** Wyporium trade for '%s'\n" % item_name) out.write("*** Wyporium trade for '%s'\n" % item_name)
out.write(" Unlocked by quest '%s'\n" out.write(" Unlocked by quest '%s'\n"
% unicode(self.trade_unlock_quest).split("\n")[0]) % str(self.trade_unlock_quest).split("\n")[0])
out.write("\n") out.write("\n")
self.print_recommended_hunts(out) self.print_recommended_hunts(out)

@ -42,7 +42,7 @@ def _reward_count_p(reward_count, min_rewards, max_rewards, extend_percent):
p = 1.0 p = 1.0
extend_p = extend_percent / 100.0 extend_p = extend_percent / 100.0
stop_p = 1.0 - extend_p stop_p = 1.0 - extend_p
for i in xrange(min_rewards+1, reward_count+1): for i in range(min_rewards+1, reward_count+1):
p *= extend_p p *= extend_p
if reward_count < max_rewards: if reward_count < max_rewards:
p *= stop_p p *= stop_p
@ -56,7 +56,7 @@ def quest_reward_p(reward_percent, min_rewards, max_rewards, extend_percent=69):
extra attempt. extra attempt.
""" """
p = 0.0 p = 0.0
for reward_count in xrange(min_rewards, max_rewards + 1): for reward_count in range(min_rewards, max_rewards + 1):
p += (_reward_count_p(reward_count, min_rewards, max_rewards, p += (_reward_count_p(reward_count, min_rewards, max_rewards,
extend_percent) extend_percent)
* _quest_reward_p(reward_percent, reward_count)) * _quest_reward_p(reward_percent, reward_count))
@ -71,7 +71,7 @@ def reward_expected_c(min_rewards, max_rewards, extend_percent):
""" """
total_p = 0.0 total_p = 0.0
expected_attempts = 0.0 expected_attempts = 0.0
for reward_count in xrange(min_rewards, max_rewards + 1): for reward_count in range(min_rewards, max_rewards + 1):
p = _reward_count_p(reward_count, min_rewards, max_rewards, p = _reward_count_p(reward_count, min_rewards, max_rewards,
extend_percent) extend_percent)
expected_attempts += p * reward_count expected_attempts += p * reward_count

@ -1,7 +1,7 @@
#!/usr/bin/env python2 #!/usr/bin/env python2
# vim: set fileencoding=utf8 : # vim: set fileencoding=utf8 :
import urllib import urllib.request, urllib.parse, urllib.error
import os import os
import json import json
import sys import sys
@ -34,74 +34,74 @@ _RANGED_TYPES = ["Bow", "Light Bowgun", "Heavy Bowgun"]
_ELEMENT_MAP = { _ELEMENT_MAP = {
u"": "Fire", "": "Fire",
u"": "Water", "": "Water",
u"": "Thunder", "": "Thunder",
u"": "Ice", "": "Ice",
u"": "Dragon", "": "Dragon",
u"": "Poison", "": "Poison",
u"麻痺": "Paralysis", "麻痺": "Paralysis",
u"睡眠": "Sleep", "睡眠": "Sleep",
u"爆破": "Blast", "爆破": "Blast",
} }
_GL_SHOT_TYPES = { _GL_SHOT_TYPES = {
u"通常": "Normal", "通常": "Normal",
u"放射": "Long", "放射": "Long",
u"拡散": "Wide", "拡散": "Wide",
} }
_SA_PHIAL_TYPES = { _SA_PHIAL_TYPES = {
u"強撃ビン": "Power", "強撃ビン": "Power",
u"減気ビン": "Exhaust", "減気ビン": "Exhaust",
u"滅龍ビン": "Dragon", "滅龍ビン": "Dragon",
u"強属性ビン": "Element", "強属性ビン": "Element",
u"毒ビン": "Poison", "毒ビン": "Poison",
u"麻痺ビン": "Paralysis", "麻痺ビン": "Paralysis",
} }
_CB_PHIAL_TYPES = { _CB_PHIAL_TYPES = {
u"榴弾ビン": "Impact", "榴弾ビン": "Impact",
u"強属性ビン": "Element", "強属性ビン": "Element",
} }
_BUG_TYPES = { _BUG_TYPES = {
u"切断": "Cutting", "切断": "Cutting",
u"打撃": "Impact", "打撃": "Impact",
} }
_BOW_ARC_TYPES = { _BOW_ARC_TYPES = {
u"集中型": "Focus", "集中型": "Focus",
u"放散型": "Wide", "放散型": "Wide",
u"爆裂型": "Blast", "爆裂型": "Blast",
} }
_BOW_SHOT_TYPES = { _BOW_SHOT_TYPES = {
u"連射": "Rapid", "連射": "Rapid",
u"拡散": "Spread", "拡散": "Spread",
u"貫通": "Pierce", "貫通": "Pierce",
u"重射": "Heavy", "重射": "Heavy",
} }
_BOW_COATINGS = { _BOW_COATINGS = {
u"強1": "Power 1", "強1": "Power 1",
u"強2": "Power 2", "強2": "Power 2",
u"属1": "Element 1", "属1": "Element 1",
u"属2": "Element 2", "属2": "Element 2",
u"": "C. Range", "": "C. Range",
u"": "Paint", "": "Paint",
u"": "Poison", "": "Poison",
u"": "Paralysis", "": "Paralysis",
u"": "Sleep", "": "Sleep",
u"": "Exhaust", "": "Exhaust",
u"": "Blast", "": "Blast",
} }
@ -195,8 +195,8 @@ def _add_phial_or_shot_data(data, td_element):
elif data["wtype"] == "Bow": elif data["wtype"] == "Bow":
data["arc_type"] = _BOW_ARC_TYPES[text] data["arc_type"] = _BOW_ARC_TYPES[text]
else: else:
msg = u"Unexpected element for wtype '%s'" % data["wtype"] msg = "Unexpected element for wtype '%s'" % data["wtype"]
print >>sys.stderr, msg, text print(msg, text, file=sys.stderr)
raise ValueError(msg) raise ValueError(msg)
@ -223,7 +223,7 @@ def _get_detailed_sharpness(name, href, parser):
weapon_level = 1 weapon_level = 1
tmp_path = os.path.join(_pathfix.project_path, "tmp") tmp_path = os.path.join(_pathfix.project_path, "tmp")
fpath = os.path.join(tmp_path, "details-%s.html" % (base_name)) fpath = os.path.join(tmp_path, "details-%s.html" % (base_name))
urllib.urlretrieve(href, fpath) urllib.request.urlretrieve(href, fpath)
with open(fpath) as f: with open(fpath) as f:
tree = etree.parse(f, parser) tree = etree.parse(f, parser)
data1 = tree.xpath('//*/div[@class="data1"]') data1 = tree.xpath('//*/div[@class="data1"]')
@ -252,7 +252,7 @@ def _get_detailed_sharpness(name, href, parser):
heads = tr.xpath('./th') heads = tr.xpath('./th')
if heads: if heads:
for j, th in enumerate(heads): for j, th in enumerate(heads):
if u"斬れ味" in th.text: if "斬れ味" in th.text:
sharpness_col = j sharpness_col = j
continue continue
@ -265,8 +265,8 @@ def _get_detailed_sharpness(name, href, parser):
name = names[i] name = names[i]
try: try:
sharpness_levels = _parse_sharpness_td(sharpness_cell) sharpness_levels = _parse_sharpness_td(sharpness_cell)
except KeyError, ValueError: except KeyError as ValueError:
print >>sys.stderr, "bad sharpness:", href, name print("bad sharpness:", href, name, file=sys.stderr)
raise raise
SHARPNESS[name] = sharpness_levels SHARPNESS[name] = sharpness_levels
#print name, sharpness_levels #print name, sharpness_levels
@ -322,11 +322,11 @@ def _parse_hh_attr_td(td_element):
affinity = int(span.text.strip()) affinity = int(span.text.strip())
text_lines = td_element.text.strip().split("\n") text_lines = td_element.text.strip().split("\n")
for line in text_lines: for line in text_lines:
if line.startswith(u"防御+"): if line.startswith("防御+"):
defense = int(line[3:]) defense = int(line[3:])
if td_element.tail: if td_element.tail:
slots = td_element.tail.count(u"") slots = td_element.tail.count("")
return attack, affinity, defense, elements, slots return attack, affinity, defense, elements, slots
@ -347,13 +347,13 @@ def _parse_elements_td(td_element):
affinity = int(span.text.strip()) affinity = int(span.text.strip())
text_lines = td_element.text.strip().split("\n") text_lines = td_element.text.strip().split("\n")
for line in text_lines: for line in text_lines:
if line.startswith(u"防御+"): if line.startswith("防御+"):
defense = int(line[3:]) defense = int(line[3:])
return affinity, defense, elements return affinity, defense, elements
def _parse_element(text): def _parse_element(text):
for jp_element in sorted(_ELEMENT_MAP.keys(), key=lambda s: len(s), for jp_element in sorted(list(_ELEMENT_MAP.keys()), key=lambda s: len(s),
reverse=True): reverse=True):
if text.startswith(jp_element): if text.startswith(jp_element):
value = int(text[len(jp_element):]) value = int(text[len(jp_element):])
@ -385,7 +385,7 @@ def _parse_name_td(td_element):
def _parse_slots_td(td_element): def _parse_slots_td(td_element):
text = td_element.text text = td_element.text
if text: if text:
return text.count(u"") return text.count("")
return 0 return 0
@ -406,9 +406,9 @@ def _parse_sharpness_td(td_element):
if sub.text is None: if sub.text is None:
continue continue
current.append(sub.text.count(".")) current.append(sub.text.count("."))
for level in xrange(3): for level in range(3):
sharpness = sharpness_levels[level] sharpness = sharpness_levels[level]
for i in xrange(len(sharpness), 6): for i in range(len(sharpness), 6):
sharpness.append(0) sharpness.append(0)
return sharpness_levels return sharpness_levels
@ -422,27 +422,27 @@ def _main():
raise raise
weapon_list = [] weapon_list = []
parser = etree.HTMLParser() parser = etree.HTMLParser()
for wtype, urls in _WEAPON_URLS.iteritems(): for wtype, urls in _WEAPON_URLS.items():
for i, url in enumerate(urls): for i, url in enumerate(urls):
fpath = os.path.join(tmp_path, "%s-%d.html" % (wtype, i)) fpath = os.path.join(tmp_path, "%s-%d.html" % (wtype, i))
urllib.urlretrieve(_BASE_URL + url, fpath) urllib.request.urlretrieve(_BASE_URL + url, fpath)
with open(fpath) as f: with open(fpath) as f:
tree = etree.parse(f, parser) tree = etree.parse(f, parser)
wlist = extract_weapon_list(wtype, tree, parser) wlist = extract_weapon_list(wtype, tree, parser)
weapon_list.extend(wlist) weapon_list.extend(wlist)
print json.dumps(weapon_list, indent=2) print(json.dumps(weapon_list, indent=2))
def _test_details(): def _test_details():
parser = etree.HTMLParser() parser = etree.HTMLParser()
# final level has same name # final level has same name
_get_detailed_sharpness(u"ベルダーハンマー", _get_detailed_sharpness("ベルダーハンマー",
"http://wiki.mhxg.org/ida/219225.html", parser) "http://wiki.mhxg.org/ida/219225.html", parser)
# final level has different name # final level has different name
_get_detailed_sharpness(u"テッケン", _get_detailed_sharpness("テッケン",
"http://wiki.mhxg.org/ida/230575.html", parser) "http://wiki.mhxg.org/ida/230575.html", parser)
# final level >= 10 (two chars) # final level >= 10 (two chars)
_get_detailed_sharpness(u"ウィルガシェルプレス", _get_detailed_sharpness("ウィルガシェルプレス",
"http://wiki.mhxg.org/ida/228545.html", parser) "http://wiki.mhxg.org/ida/228545.html", parser)

@ -1,7 +1,7 @@
#!/usr/bin/env python2 #!/usr/bin/env python2
# vim: set fileencoding=utf8 : # vim: set fileencoding=utf8 :
import urllib import urllib.request, urllib.parse, urllib.error
import os import os
import json import json
import sys import sys
@ -17,7 +17,7 @@ _PAGES = {
"items": "MHX:_Item_List", "items": "MHX:_Item_List",
} }
_CIRCLE = u"\u26ab" _CIRCLE = "\u26ab"
def extract_names_and_icons(tree): def extract_names_and_icons(tree):
@ -90,11 +90,11 @@ def _translate_icon_name(s):
def _main(): def _main():
tmp_path = os.path.join(_pathfix.project_path, "tmp") tmp_path = os.path.join(_pathfix.project_path, "tmp")
outdir = os.path.join(_pathfix.project_path, "db", "mhx") outdir = os.path.join(_pathfix.project_path, "db", "mhx")
for name, page in _PAGES.iteritems(): for name, page in _PAGES.items():
fpath = os.path.join(tmp_path, "wikia-%s.html" % name) fpath = os.path.join(tmp_path, "wikia-%s.html" % name)
opath = os.path.join(outdir, name.replace("-", "_") + ".json") opath = os.path.join(outdir, name.replace("-", "_") + ".json")
parser = etree.HTMLParser() parser = etree.HTMLParser()
urllib.urlretrieve(_BASE_URL + page, fpath) urllib.request.urlretrieve(_BASE_URL + page, fpath)
with open(fpath) as f: with open(fpath) as f:
tree = etree.parse(f, parser) tree = etree.parse(f, parser)
data = extract_names_and_icons(tree) data = extract_names_and_icons(tree)

@ -1,7 +1,7 @@
#!/usr/bin/env python2 #!/usr/bin/env python2
# vim: set fileencoding=utf8 : # vim: set fileencoding=utf8 :
import urllib import urllib.request, urllib.parse, urllib.error
import os import os
import json import json
import sys import sys
@ -14,7 +14,7 @@ _BASE_URL = "http://monsterhunter.wikia.com/wiki/"
_PAGE = "MHX:_Palico_Skills" _PAGE = "MHX:_Palico_Skills"
_CIRCLE = u"\u26ab" _CIRCLE = "\u26ab"
def extract_arts_and_skills(tree): def extract_arts_and_skills(tree):
@ -29,7 +29,7 @@ def extract_arts_and_skills(tree):
rows = list(table) rows = list(table)
for row in rows: for row in rows:
cols, is_header = _get_column_cells_texts(row) cols, is_header = _get_column_cells_texts(row)
print is_header, cols print(is_header, cols)
continue continue
if is_header: if is_header:
if len(cols) == 1: if len(cols) == 1:
@ -100,13 +100,13 @@ def _main():
tmp_path = os.path.join(_pathfix.project_path, "tmp") tmp_path = os.path.join(_pathfix.project_path, "tmp")
fpath = os.path.join(tmp_path, "wikia-palico-skills.html") fpath = os.path.join(tmp_path, "wikia-palico-skills.html")
parser = etree.HTMLParser() parser = etree.HTMLParser()
urllib.urlretrieve(_BASE_URL + _PAGE, fpath) urllib.request.urlretrieve(_BASE_URL + _PAGE, fpath)
with open(fpath) as f: with open(fpath) as f:
tree = etree.parse(f, parser) tree = etree.parse(f, parser)
arts, skills = extract_arts_and_skills(tree) arts, skills = extract_arts_and_skills(tree)
#print json.dumps(weapon_list, indent=2) #print json.dumps(weapon_list, indent=2)
print json.dumps(arts, indent=2) print(json.dumps(arts, indent=2))
print json.dumps(skills, indent=2) print(json.dumps(skills, indent=2))
if __name__ == '__main__': if __name__ == '__main__':

Loading…
Cancel
Save