diff --git a/bin/fcgi_server.py b/bin/fcgi_server.py index 44e2568..530e09d 100755 --- a/bin/fcgi_server.py +++ b/bin/fcgi_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Set PYTHONPATH in lighttpd or other server config. diff --git a/bin/genrewards.py b/bin/genrewards.py index 2c88c46..5a349b2 100755 --- a/bin/genrewards.py +++ b/bin/genrewards.py @@ -1,10 +1,10 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ Script to generate static rewards files for all items. """ import codecs -import urllib +import urllib.request, urllib.parse, urllib.error import os.path import _pathfix @@ -27,7 +27,7 @@ if __name__ == '__main__': elif len(sys.argv) == 2: outdir = sys.argv[1] else: - print("Usage: %s [outdir]" % sys.argv[0]) + print(("Usage: %s [outdir]" % sys.argv[0])) sys.exit(os.EX_USAGE) err_out = get_utf8_writer(sys.stderr) @@ -46,7 +46,7 @@ if __name__ == '__main__': # write all names json to /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: out = get_utf8_writer(f) out.write("[") @@ -66,7 +66,7 @@ if __name__ == '__main__': item_id = item.id encoded_name = name.encode("utf8") 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: out = get_utf8_writer(f) item_row = rewards.find_item(db, name, err_out) diff --git a/bin/mharmor.py b/bin/mharmor.py index 6fd56e9..7a77362 100755 --- a/bin/mharmor.py +++ b/bin/mharmor.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys import argparse @@ -57,7 +57,7 @@ def find_armors(args): matches = difflib.get_close_matches(skill_name, skill_tree_names, 1, 0.5) if matches: - print "Fuzzy Match:", matches[0] + print("Fuzzy Match:", matches[0]) sid = skill_tree_id_map.get(matches[0]) skill_name = matches[0] args.skills[i] = skill_name @@ -71,8 +71,8 @@ def find_armors(args): d.set_skills(db.get_item_skills(d.id)) decoration_values = get_decoration_values(sid, ds)[1] decorations[sid] = (ds, decoration_values) - print "%s[%s]:" % (skill_name, sid), ", ".join(d.name for d in ds), \ - decoration_values + print("%s[%s]:" % (skill_name, sid), ", ".join(d.name for d in ds), \ + decoration_values) htype = "Gunner" if args.gunner else "Blade" @@ -82,7 +82,7 @@ def find_armors(args): for a in armors: skills = db.get_item_skills(a.id) 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) a.set_skills(skills) # 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: continue 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: - print args.resist.title(), a[args.resist + "_res"] + print(args.resist.title(), a[args.resist + "_res"]) else: - print - print " ", a.one_line_skills_u(args.skills) + print() + print(" ", a.one_line_skills_u(args.skills)) def str_lower(x): diff --git a/bin/mhdamage.py b/bin/mhdamage.py index 7217cb0..b3968f3 100755 --- a/bin/mhdamage.py +++ b/bin/mhdamage.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import sys import argparse @@ -54,7 +54,7 @@ def _make_db_sharpness_string(level_string): level_value = SharpnessLevel.__dict__[level_string.upper()] #print "level value", level_value values = [] - for i in xrange(SharpnessLevel.PURPLE+1): + for i in range(SharpnessLevel.PURPLE+1): if i <= level_value: values.append("1") else: @@ -67,7 +67,7 @@ def weapon_stats_tuple(arg): parts = arg.split(",") #print "parts %r" % parts if len(parts) < 4: - print "not enough parts" + print("not enough parts") raise ValueError("Bad arg, use 'name,weapon_type,sharpness,raw'") weapon = {} weapon["name"] = parts[0] @@ -154,13 +154,13 @@ def _add_skill_args(parser): default=False, help="add Awaken (FreeElemnt), default off") 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") 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") 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" " Element Attack Up") 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) for name in names_sorted: - print "%-20s:" % name, + print("%-20s:" % name, end=' ') 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: part_damage = damage_map[part] #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 + print("%0.2f:%0.2f:%0.2f" % damage_map.cb_phial_damage[part][level], end=' ') + print() def _print_headers(parts, damage_map_base): - print + print() avg_hitbox = (sum(damage_map_base[part].hitbox for part in parts) / float(len(parts))) cols = ["%s (%d)" % (part, damage_map_base[part].hitbox) for part in parts] 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): @@ -288,22 +288,22 @@ def print_sorted_damage(names, damage_map_base, weapon_damage_map, parts): # for part in parts]) for name in names_sorted: - print "%-20s:" % name, + print("%-20s:" % name, end=' ') 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: part_damage = damage_map[part] - print "% 2d" % part_damage.average(), - print + print("% 2d" % part_damage.average(), end=' ') + print() if len(names) > 1: w1 = weapon_damage_map[names_sorted[0]] w2 = weapon_damage_map[names_sorted[1]] m, ratio = w1.compare_break_even(w2) - print - print "Comparison of '%s' and '%s'" % ( - names_sorted[0], names_sorted[1]) - print "Hitbox ratio:", m, "%0.2f" % ratio + print() + print("Comparison of '%s' and '%s'" % ( + names_sorted[0], names_sorted[1])) + print("Hitbox ratio:", m, "%0.2f" % ratio) if w1.etype: re_ratios = w1.get_raw_element_ratios() @@ -316,7 +316,7 @@ def print_sorted_damage(names, damage_map_base, weapon_damage_map, parts): else: line.append(names_sorted[1]) # (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): @@ -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) bdiff_s = ",".join("%+0.1f%%" % i for i in bdiffs) 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 " ", damage.hitbox, damage.total, @@ -349,17 +349,17 @@ def print_damage_percent_diff(names, damage_map_base, weapon_damage_map, parts): damage.element, ediff_s, damage.break_diff(), - bdiff_s) + bdiff_s)) if weapon_type == "Charge Blade": for level in (0, 1, 2, 3, 5): - print " " * 20, level, + print(" " * 20, level, end=' ') for wname in names: wd = weapon_damage_map[wname] damage = wd.cb_phial_damage[part][level] - print "(%0.f, %0.f, %0.f);" % damage, - print + print("(%0.f, %0.f, %0.f);" % damage, end=' ') + print() - print " --------------------" + print(" --------------------") 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] @@ -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) - 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): @@ -451,7 +451,7 @@ def main(): weapons.extend(args.weapon_custom) if not weapons: - print "Err: no matching weapons" + print("Err: no matching weapons") sys.exit(1) names = [w.name for w in weapons] @@ -459,17 +459,17 @@ def main(): monster_breaks = db.get_monster_breaks(monster.id) weapon_type = weapons[0]["wtype"] 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) motion = motiondb[weapon_type].average - print "Weapon Type: %s" % weapon_type - print "Average Motion: %0.1f" % motion + print("Weapon Type: %s" % weapon_type) + print("Average Motion: %0.1f" % motion) if args.motion: motion = args.motion - print "Specified Motion: %0.1f" % motion - print "Monster Breaks: %s" % ", ".join(monster_breaks) + print("Specified Motion: %0.1f" % motion) + print("Monster Breaks: %s" % ", ".join(monster_breaks)) 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: limit_parts = args.parts.split(",") @@ -479,7 +479,7 @@ def main(): if args.quest_level: item_stars = ItemStars(db) 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() for w in weapons: if "village_stars" in w: @@ -498,10 +498,10 @@ def main(): continue weapons2[w.id] = w 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: del weapons2[wid] - weapons = weapons2.values() + weapons = list(weapons2.values()) names = [w.name for w in weapons] weapon_damage_map = dict() @@ -527,23 +527,23 @@ def main(): frenzy_bonus=skill_args.frenzy, is_true_attack=game_uses_true_raw, 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.etype2: - print "(%4.0f %s, %4.0f %s)" \ - % (wd.eattack, wd.etype, wd.eattack2, wd.etype2), + print("(%4.0f %s, %4.0f %s)" \ + % (wd.eattack, wd.etype, wd.eattack2, wd.etype2), end=' ') else: - print "(%4.0f %s)" % (wd.eattack, wd.etype), - print SharpnessLevel.name(wd.sharpness), + print("(%4.0f %s)" % (wd.eattack, wd.etype), end=' ') + print(SharpnessLevel.name(wd.sharpness), end=' ') if skill_args != args: - print "{%s}" % ",".join(sn + print("{%s}" % ",".join(sn for sn in get_skill_names(skill_args) - if sn) + if sn)) else: - print + print() weapon_damage_map[name] = wd except ValueError as e: - print str(e) + print(str(e)) sys.exit(1) damage_map_base = weapon_damage_map[names[0]] diff --git a/bin/mhmoney.py b/bin/mhmoney.py index e54be30..c2ec19b 100755 --- a/bin/mhmoney.py +++ b/bin/mhmoney.py @@ -1,10 +1,10 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Script to find the most lucrative monster parts to farm for money. """ import codecs -import urllib +import urllib.request, urllib.parse, urllib.error import os.path import sys @@ -55,8 +55,8 @@ def print_top_items(db, rank="G"): value = item_value(item) if value < min_value: break - print " %-20s % 7.f % 6d (% 5.f)" % \ - (item.name, value, int(item.sell), ev[item.id]) + print(" %-20s % 7.f % 6d (% 5.f)" % \ + (item.name, value, int(item.sell), ev[item.id])) if __name__ == '__main__': diff --git a/bin/mhprob.py b/bin/mhprob.py index 62c70ce..d3b1197 100755 --- a/bin/mhprob.py +++ b/bin/mhprob.py @@ -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 @@ -71,22 +71,22 @@ if __name__ == '__main__': max_rewards = 8 - fixed_rewards if min_rewards < 0: - print "Error: fixed_rewards (%d) must be less than or equal to " \ - "guaranteeed_rewards (%d)" % (fixed_rewards, guarenteed_rewards) + print("Error: fixed_rewards (%d) must be less than or equal to " \ + "guaranteeed_rewards (%d)" % (fixed_rewards, guarenteed_rewards)) sys.exit(1) total_p = 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, extend_percent) expected_attempts += p * reward_count # probability of getting @reward_count rewards that could be the # desired item - print "P(C = %d) = %0.4f" % (reward_count, p) + print("P(C = %d) = %0.4f" % (reward_count, p)) total_p += p # 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 # some floating point precision loss. @@ -96,5 +96,5 @@ if __name__ == '__main__': max_rewards, extend_percent) expected = expected_attempts * reward_percent / 100.0 - print "P(N > 0) = %0.2f%%" % p_at_least_one - print "E(N) = %0.4f" % expected + print("P(N > 0) = %0.2f%%" % p_at_least_one) + print("E(N) = %0.4f" % expected) diff --git a/bin/mhrewards.py b/bin/mhrewards.py index 6103885..0d10556 100755 --- a/bin/mhrewards.py +++ b/bin/mhrewards.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import _pathfix @@ -75,7 +75,7 @@ if __name__ == '__main__': import os.path 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) item_name = canonical_item_name(sys.argv[1]) diff --git a/bin/mhweaponbuild.py b/bin/mhweaponbuild.py index 36dad2b..57e6d45 100755 --- a/bin/mhweaponbuild.py +++ b/bin/mhweaponbuild.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys import argparse @@ -40,8 +40,8 @@ if __name__ == '__main__': else: for cost in costs: components = cost["components"] - print "=", ", ".join([w.name for w in cost["path"]]) - print " Zenny", cost["zenny"] - for item_name in sorted(components.iterkeys()): - print "%20s %2d" % (item_name, components[item_name]) - print + print("=", ", ".join([w.name for w in cost["path"]])) + print(" Zenny", cost["zenny"]) + for item_name in sorted(components.keys()): + print("%20s %2d" % (item_name, components[item_name])) + print() diff --git a/bin/mkjsonapi.py b/bin/mkjsonapi.py index eeaad47..912cae5 100755 --- a/bin/mkjsonapi.py +++ b/bin/mkjsonapi.py @@ -1,10 +1,10 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import os import json import sys import errno -import urllib +import urllib.request, urllib.parse, urllib.error import argparse import _pathfix @@ -42,7 +42,7 @@ SAFE_CHARS = " &'+\"" def file_path(path, model_object, alt_name_field=None): 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) else: key = str(model_object.id) @@ -57,7 +57,7 @@ def write_list_file(path, model_list): 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) with open(index_path, "w") as f: json.dump(data, f, cls=model.ModelJSONEncoder, indent=2) @@ -106,7 +106,7 @@ def armor_json(db, path): a.update_indexes(indexes) skills = db.get_item_skills(a.id) 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) all_data.append(a.as_data()) @@ -130,7 +130,7 @@ def decoration_json(db, path): a.update_indexes(indexes) skills = db.get_item_skills(a.id) 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) all_data.append(a.as_data()) @@ -254,7 +254,7 @@ def wyporium_json(db, path): if not k.startswith("wyporium"): continue trade_map[item.id][k] = all_data[k] - print trade_map + print(trade_map) mkdirs_p(path) write_map_file(path, trade_map) @@ -282,7 +282,7 @@ def main(): if args.entities: for entity in args.entities: if entity not in ENTITIES: - print "Unknown entity: %s" % entity + print("Unknown entity: %s" % entity) sys.exit(1) else: args.entities = ENTITIES diff --git a/bin/mkmobilelist.py b/bin/mkmobilelist.py index 4024673..cea0af7 100755 --- a/bin/mkmobilelist.py +++ b/bin/mkmobilelist.py @@ -12,11 +12,11 @@ from mhapi.util import get_utf8_writer def print_header_nav(title, pid): - print """ + print("""
Menu

%s

-""".strip() % title +""".strip() % title) alt_pid = None if pid.endswith("-en"): @@ -27,11 +27,11 @@ def print_header_nav(title, pid): alt_title = "en" if alt_pid is not None: - print """ + print(""" %s -""".strip() % (alt_pid, alt_title) +""".strip() % (alt_pid, alt_title)) - print "
" + print(" ") 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 (' -""" +""") stree_path = os.path.join(_pathfix.project_path, "db", "mhx_skill_tree_list.json") with open(stree_path) as f: stree_list = json.load(f) - print '
' + print('
') print_header_nav("Skill Trees (en)", "page-skilltrees-en") - print '
' + print('
') mk_html_list(stree_list, ("name", "name_jp"), ("name",)) - print '
' - print '
' + print('
') + print('
') - print '
' + print('
') print_header_nav("Skill Trees (jp)", "page-skilltrees-jp") - print '
' + print('
') mk_html_list(stree_list, ("name_jp", "name"), jplen_sort_fn, divider_fn=jplen_divider_fn) - print '
' - print '
' + print('
') + print('
') def item_divider_fn(d, prev_d): prefix = _icon_prefix(d) @@ -160,29 +160,29 @@ def _main(): if prefix != prev_prefix: return prefix return None - print '
' + print('
') print_header_nav("Items: Usable", "page-item-usable") - print '
' + print('
') mk_html_list(items, ("icon_name", "name", "name_jp"), ("icon_name", "name"), divider_fn=item_divider_fn) - print '
' - print '
' + print('
') + print('
') - print '
' + print('
') print_header_nav("Items: Gatherable", "page-item-gather") - print '
' + print('
') mk_html_list(gather_items, ("icon_name", "name", "name_jp"), ("icon_name", "name"), divider_fn=item_divider_fn) - print '
' - print '
' + print('
') + print('
') - print '
' + print('
') print_header_nav("Items: Carve", "page-item-carve") - print '
' + print('
') mk_html_list(carve_items, ("icon_name", "name", "name_jp"), ("icon_name", "name"), divider_fn=item_divider_fn) - print '
' - print '
' + print('
') + print('
') ha_path = os.path.join(_pathfix.project_path, "db", "hunter_arts.json") with open(ha_path) as f: @@ -194,21 +194,21 @@ def _main(): elif d["section"] != prev_d["section"]: return d["section"] return None - print '
' + print('
') print_header_nav("Hunter Arts (en)", "page-hunterarts-en") - print '
' + print('
') mk_html_list(ha_list, ("name", "name_jp", "description"), None, divider_fn=ha_divider_fn) - print '
' - print '
' + print('
') + print('
') - print '
' + print('
') print_header_nav("Hunter Arts (jp)", "page-hunterarts-jp") - print '
' + print('
') mk_html_list(ha_list, ("name_jp", "name", "section", "description"), jplen_sort_fn, divider_fn=jplen_divider_fn) - print '
' - print '
' + print('
') + print('
') monster_path = os.path.join(_pathfix.project_path, "db", @@ -216,35 +216,35 @@ def _main(): with open(monster_path) as f: monster_list = json.load(f) - print '
' + print('
') print_header_nav("Monsters (en)", "page-monsters-en") - print '
' + print('
') mk_html_list(monster_list, ("name", "name_jp", "title_jp"), ("name",)) - print '
' - print '
' + print('
') + print('
') - print '
' + print('
') print_header_nav("Monsters (jp)", "page-monsters-jp") - print '
' + print('
') mk_html_list(monster_list, ("name_jp", "name", "title_jp"), ("name_jp",)) - print '
' - print '
' + print('
') + print('
') titled_monster_list = [m for m in monster_list if m["title_jp"]] - print '
' + print('
') print_header_nav("Monster Titles", "page-monsters-title") - print '
' + print('
') mk_html_list(titled_monster_list, ("title_jp", "name"), ("title_jp",), divider_fn=None) - print '
' - print '
' + print('
') + print('
') - print """ + print(""" -""" +""") def _icon_prefix(d): if d is None: diff --git a/bin/mktranslatesite.py b/bin/mktranslatesite.py index fcd4f68..90b997f 100755 --- a/bin/mktranslatesite.py +++ b/bin/mktranslatesite.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys import json diff --git a/bin/parse-wikia-arts.py b/bin/parse-wikia-arts.py index 3c2fda2..fb0ec43 100755 --- a/bin/parse-wikia-arts.py +++ b/bin/parse-wikia-arts.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf8 -*- """ Parse hunter arts name, name_jp, and description from wikia: @@ -10,7 +10,7 @@ Returns list of dict, e.g.: "section": "Heavy Bowgun", "description": "", "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(): with open(sys.argv[1]) as f: data = parse_wikia_hunter_arts(f) - print json.dumps(data, indent=2) + print(json.dumps(data, indent=2)) if __name__ == '__main__': diff --git a/bin/parse-wikia-monsters.py b/bin/parse-wikia-monsters.py index 7b42b7d..0a2f324 100755 --- a/bin/parse-wikia-monsters.py +++ b/bin/parse-wikia-monsters.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf8 -*- """ Parse monster names and jp names for monster hunter X. @@ -55,7 +55,7 @@ def parse_wikia_monsters(f): m = SECTION_RE.match(line) if m: section = m.group(1) - print >>sys.stderr, "section", section + print("section", section, file=sys.stderr) continue if section not in ["Large Monsters", "Small Monsters"]: continue @@ -108,16 +108,16 @@ def _main(): name = m["name"] names = get_jp_names(m["href"]) if len(names) == 0: - print >>sys.stderr, "ERROR: no names for %s" % name + print("ERROR: no names for %s" % name, file=sys.stderr) names = ["", ""] 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("") m["name_jp"] = names[0] m["title_jp"] = names[1] if m["title_jp"] in ("None", "N/A", "(?)"): m["title_jp"] = "" - print json.dumps(monster_list, indent=2) + print(json.dumps(monster_list, indent=2)) if __name__ == '__main__': diff --git a/bin/parse-wikia-skills.py b/bin/parse-wikia-skills.py index 02022f0..eaa0510 100755 --- a/bin/parse-wikia-skills.py +++ b/bin/parse-wikia-skills.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf8 -*- """ Parse skill tree names and jp names for monster hunter X. @@ -81,7 +81,7 @@ def parse_wikia_skill_trees(f): def _main(): 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) with open(sys.argv[1]) as f: strees, skills = parse_wikia_skill_trees(f) diff --git a/bin/test_server.py b/bin/test_server.py index 4a89fc3..b0b18fe 100755 --- a/bin/test_server.py +++ b/bin/test_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import _pathfix @@ -15,4 +15,4 @@ if __name__ == '__main__': try: httpd.serve_forever() except KeyboardInterrupt: - print "^C" + print("^C") diff --git a/bin/weapon_level.py b/bin/weapon_level.py index 7639dd5..01e71fe 100755 --- a/bin/weapon_level.py +++ b/bin/weapon_level.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import sys import argparse @@ -21,7 +21,7 @@ def main(): if args.item: item = db.get_item_by_name(args.item) if item is None: - print "Item '%s' not found" % args.item + print("Item '%s' not found" % args.item) sys.exit(1) if item.type == "Materials": stars = item_stars.get_material_stars(item.id) @@ -30,15 +30,15 @@ def main(): elif args.weapon: weapon = db.get_weapon_by_name(args.weapon) if weapon is None: - print "Weapon '%s' not found" % args.weapon + print("Weapon '%s' not found" % args.weapon) sys.exit(1) stars = item_stars.get_weapon_stars(weapon) else: - print "Specify -w or -i" + print("Specify -w or -i") sys.exit(1) - for k, v in stars.iteritems(): - print k, v + for k, v in stars.items(): + print(k, v) if __name__ == '__main__': diff --git a/db/apply_quest_delta.py b/db/apply_quest_delta.py index da901f2..c6e7ef6 100755 --- a/db/apply_quest_delta.py +++ b/db/apply_quest_delta.py @@ -12,7 +12,7 @@ from mhapi.db import MHDB def apply_update(db, row): quest = db.get_quest(row["id"]) if quest.goal == row["goal"]: - print "quest", row["id"], row["name"], "already updated, skipping" + print("quest", row["id"], row["name"], "already updated, skipping") return cur = db.cursor() cur.execute("""UPDATE quests SET @@ -21,9 +21,9 @@ def apply_update(db, row): AND name=?""", (row["goal"], row["id"], row["name"])) 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: - print "ERROR", "quest", row["id"], row["name"], "update failed" + print("ERROR", "quest", row["id"], row["name"], "update failed") if __name__ == '__main__': diff --git a/db/check_quest_monsters.py b/db/check_quest_monsters.py index 6195f04..bdaeffb 100755 --- a/db/check_quest_monsters.py +++ b/db/check_quest_monsters.py @@ -123,8 +123,8 @@ def _parse_monster(name): name = rstrip(name, "'s") name = rstrip(name, "'") - name = rstrip(name, u"’") - name = rstrip(name, u"’s") + name = rstrip(name, "’") + name = rstrip(name, "’s") #print "=>", name @@ -202,7 +202,7 @@ def fuzzy_find(name): def check_hunts(db, quest): - print ">", quest.id, quest.name, + print(">", quest.id, quest.name, end=' ') monsters_match = False @@ -240,30 +240,30 @@ def check_hunts(db, quest): if monsters_match and not errors: # useful for doing grep -v on output - print " *OK*" + print(" *OK*") elif monsters_match: - print " *MISSPELLING*" - print " goal:", quest.goal - print " sub:", quest.sub_goal + print(" *MISSPELLING*") + print(" goal:", quest.goal) + print(" sub:", quest.sub_goal) for err in errors: - print " ", err + print(" ", err) else: - print " *MISMATCH*", + print(" *MISMATCH*", end=' ') if errors: - print " *MISSPELLING*", - print + print(" *MISSPELLING*", end=' ') + print() for err in errors: - print " ", err - print " goal:", quest.goal - print " sub:", quest.sub_goal - print " parsed:", goal_expected + print(" ", err) + print(" goal:", quest.goal) + print(" sub:", quest.sub_goal) + print(" parsed:", goal_expected) if sub_expected and not sub_expected < goal_expected: # print if sub monster looks like it's not one of the # main monsters. This will false positive when main quest # is hunt all large monsters. - print " sub prsd:", sub_expected - print " db:", db_expected - print " db unstb:", db_expected_unstable + print(" sub prsd:", sub_expected) + print(" db:", db_expected) + print(" db unstb:", db_expected_unstable) if __name__ == '__main__': diff --git a/db/fix_weapon_final.py b/db/fix_weapon_final.py index 5c9d62d..a164c3c 100755 --- a/db/fix_weapon_final.py +++ b/db/fix_weapon_final.py @@ -12,7 +12,7 @@ stdout = get_utf8_writer(sys.stdout) 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.execute("""UPDATE weapons SET final=? WHERE _id=?""", diff --git a/db/set_carve_counts.py b/db/set_carve_counts.py index 2ec216d..2e784f3 100755 --- a/db/set_carve_counts.py +++ b/db/set_carve_counts.py @@ -19,7 +19,7 @@ def set_carve_counts(db, monster_carves): for m in monsters: rewards = db.get_monster_rewards(m.id) mc = monster_carves.get(m.name) - print "===", m.name + print("===", m.name) for r in rewards: condition = r["condition"] if "Carve" not in condition: @@ -34,13 +34,13 @@ def set_carve_counts(db, monster_carves): elif condition == "Tail Carve": stack_size = 1 else: - print "WARN: unknown condition %s.%s" \ - % (m.name, condition) + print("WARN: unknown condition %s.%s" \ + % (m.name, condition)) else: assert False, "Unknown monster class: %s" % m["class"] if r["stack_size"] == stack_size: continue - print " ", condition, r["stack_size"], "=>", stack_size + print(" ", condition, r["stack_size"], "=>", stack_size) cur = db.cursor() cur.execute("""UPDATE hunting_rewards SET stack_size=? WHERE _id=?""", diff --git a/db/set_item_levels.py b/db/set_item_levels.py index 7b6e13e..ea57a7d 100755 --- a/db/set_item_levels.py +++ b/db/set_item_levels.py @@ -23,7 +23,7 @@ def _add_column(cursor, table, column_spec): def _set_stars(cursor, item_id, stars): - for k in stars.keys(): + for k in list(stars.keys()): col = k.lower() + "_stars" q = "UPDATE items SET %s=? WHERE _id=?" % col cursor.execute(q, (stars[k], item_id)) @@ -45,7 +45,7 @@ def main(): items = db.get_items(exclude_types=["", "Armor", "Palico Weapon", "Decoration"]) for item in items: - print item.id, item.type, item.name + print(item.id, item.type, item.name) if item.type == "Materials": stars = item_stars.get_material_stars(item.id) elif item.type == "Weapon": diff --git a/db/set_quest_ranks.py b/db/set_quest_ranks.py index ba594ed..a17cd7e 100755 --- a/db/set_quest_ranks.py +++ b/db/set_quest_ranks.py @@ -21,7 +21,7 @@ def set_quest_ranks(db): for quest in quests: if not quest["name"]: 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 set_quest_rank(db, quest) @@ -35,19 +35,19 @@ def set_quest_rank(db, quest): rewards = db.get_quest_rewards(quest_id) rank = guess_quest_rank_from_rewards(db, rewards) if rank is None: - print "WARN: quest '%s' has no flesh rewards, assuming lower rank"\ - % (quest.name.encode("utf8"),) + print("WARN: quest '%s' has no flesh rewards, assuming lower rank"\ + % (quest.name.encode("utf8"),)) rank = rank_stars_guess[0] elif rank not in rank_stars_guess: - print "ERROR: quest '%s' reward guess '%s' not in stars guess '%s'"\ - % (quest.name, rank, rank_stars_guess) + print("ERROR: quest '%s' reward guess '%s' not in stars guess '%s'"\ + % (quest.name, rank, rank_stars_guess)) else: rank = rank_stars_guess assert rank in "LR HR G".split() quest.rank = rank - print quest.one_line_u() + print(quest.one_line_u()) cur = db.cursor() cur.execute("UPDATE quests SET rank=? WHERE _id=?", (rank, quest_id)) diff --git a/db/set_weapon_buy.py b/db/set_weapon_buy.py index 84bb496..8375673 100755 --- a/db/set_weapon_buy.py +++ b/db/set_weapon_buy.py @@ -10,7 +10,7 @@ from mhapi.db import MHDB def set_buy(db, item_id, buy): - print "buy", item_id, buy + print("buy", item_id, buy) cur = db.cursor() cur.execute("""UPDATE items SET buy=? WHERE _id=?""", @@ -22,7 +22,7 @@ def set_buy_by_name(db, name, buy): buy=? WHERE name=?""", (buy, name)) rowid = cur.lastrowid - print "buy", rowid, name, buy + print("buy", rowid, name, buy) if __name__ == '__main__': db = MHDB(game="4u") diff --git a/db/set_weapon_costs.py b/db/set_weapon_costs.py index 98ee2bd..5d0ac58 100755 --- a/db/set_weapon_costs.py +++ b/db/set_weapon_costs.py @@ -10,7 +10,7 @@ from mhapi.db import MHDB 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.execute("""UPDATE weapons SET 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): - print "creation_cost", item_id, creation_cost + print("creation_cost", item_id, creation_cost) cur = db.cursor() cur.execute("""UPDATE weapons SET creation_cost=? WHERE _id=?""", diff --git a/mhapi/damage.py b/mhapi/damage.py index 2459057..c186b52 100644 --- a/mhapi/damage.py +++ b/mhapi/damage.py @@ -78,14 +78,14 @@ class WeaponTypeMotionValues(object): self.motion_values[name] = MotionValue(name, d["type"], d["power"]) self.average = (sum(mv.average - for mv in self.motion_values.itervalues()) + for mv in self.motion_values.values()) / len(self)) def __len__(self): return len(self.motion_values) def keys(self): - return self.motion_values.keys() + return list(self.motion_values.keys()) def __getitem__(self, key): return self.motion_values[key] @@ -109,7 +109,7 @@ class MotionValueDB(object): return self.motion_values_map[weapon_type] def keys(self): - return self.motion_values_map.keys() + return list(self.motion_values_map.keys()) def __len__(self): return len(self.motion_values_map) @@ -158,7 +158,7 @@ class WeaponType(object): @classmethod def all(cls): - return cls._multiplier.keys() + return list(cls._multiplier.keys()) @classmethod def damage_type(cls, weapon_type): @@ -230,7 +230,7 @@ class WeaponMonsterDamage(object): self.sharpness = self.weapon.sharpness.max #print "sharpness=", self.sharpness if self.weapon["affinity"]: - if (isinstance(self.weapon["affinity"], basestring) + if (isinstance(self.weapon["affinity"], str) and "/" in self.weapon["affinity"]): self.chaotic = True # Handle chaotic gore affinity, e.g. -35/10. This means that @@ -358,7 +358,7 @@ class WeaponMonsterDamage(object): part_damage.part = part if alt is None: 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)): part_damage.breakable = True if hitbox > self.max_raw_part[1]: @@ -366,15 +366,15 @@ class WeaponMonsterDamage(object): if ehitbox > self.max_element_part[1]: 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: #print "Failed to parse part:", 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(): self.break_count += 1 - self.parts = self.damage_map.keys() + self.parts = list(self.damage_map.keys()) self.averages["uniform"] = self.uniform() self.averages["raw"] = self.weighted_raw() self.averages["element"] = self.weighted_element() @@ -405,7 +405,7 @@ class WeaponMonsterDamage(object): def uniform(self): average = 0.0 - for part, damage in self.damage_map.iteritems(): + for part, damage in self.damage_map.items(): average += damage.average() return average / len(self.damage_map) @@ -417,7 +417,7 @@ class WeaponMonsterDamage(object): """ average = 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 total_hitbox += damage.hitbox if total_hitbox == 0: @@ -430,7 +430,7 @@ class WeaponMonsterDamage(object): """ average = 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 total_ehitbox += damage.ehitbox if total_ehitbox == 0: @@ -444,7 +444,7 @@ class WeaponMonsterDamage(object): else: other_weight = (1 - weak_weight) / (len(self.parts) - 1) 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]: weight = weak_weight else: @@ -459,7 +459,7 @@ class WeaponMonsterDamage(object): else: other_weight = (1 - weak_weight) / (len(self.parts) - 1) 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]: weight = weak_weight else: @@ -475,7 +475,7 @@ class WeaponMonsterDamage(object): return 0 average = 0.0 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]: average += damage.average() if damage.is_breakable(): @@ -494,7 +494,7 @@ class WeaponMonsterDamage(object): return 0 average = 0.0 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 weakpart is also a break, assume continue attacking # even after broken @@ -516,7 +516,7 @@ class WeaponMonsterDamage(object): if not self.break_count: return 0 average = 0.0 - for part, damage in self.damage_map.iteritems(): + for part, damage in self.damage_map.items(): if damage.is_breakable(): # attack until broken, then move to next break average += damage.total diff --git a/mhapi/db.py b/mhapi/db.py index 9d64953..5af63a3 100644 --- a/mhapi/db.py +++ b/mhapi/db.py @@ -662,13 +662,13 @@ class MHDBX(object): self._monsters_by_name[d["name"]] = model.Monster(d) with open(hitboxes_path) as 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 damage_rows = [] - for part, data in damage.iteritems(): + for part, data in damage.items(): if part.startswith("_"): 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["ko"] = 100 if part == "Head" else 0 row["_id"] = 0 diff --git a/mhapi/model.py b/mhapi/model.py index f132372..4905390 100644 --- a/mhapi/model.py +++ b/mhapi/model.py @@ -1,6 +1,6 @@ import string import json -import urllib +import urllib.request, urllib.parse, urllib.error import re import difflib @@ -57,7 +57,7 @@ class RowModel(ModelBase): return key in self._data def fields(self): - return self._data.keys() + return list(self._data.keys()) def as_data(self): return self._data @@ -69,7 +69,7 @@ class RowModel(ModelBase): return list_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: data[key_field] = {} self.update_index(key_field, value_fields, data[key_field]) @@ -86,7 +86,7 @@ class RowModel(ModelBase): def __str__(self): 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: name = str(self.id) return "%s '%s'" % (self.__class__.__name__, name) @@ -139,7 +139,7 @@ class SharpnessLevel(EnumBase): WHITE = 5 PURPLE = 6 - ALL = range(0, PURPLE + 1) + ALL = list(range(0, PURPLE + 1)) _names = { RED: "Red", @@ -203,7 +203,7 @@ class WeaponSharpness(ModelBase): def max(self): if self._max is None: self._max = SharpnessLevel.RED - for i in xrange(SharpnessLevel.PURPLE+1): + for i in range(SharpnessLevel.PURPLE+1): if self.value_list[i] == 0: break else: @@ -304,7 +304,7 @@ class Armor(ItemWithSkills): assert self.skills is not None total = self.skills.get(skill_id_or_name, 0) 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: break decoration_value = decoration_values[slots-1] @@ -529,7 +529,7 @@ class MonsterDamage(ModelBase): Set breakable flag on parts based on the breakable list from 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): #print "part %s is breakable [by rewards]" % name part_damage.breakable = True @@ -610,13 +610,13 @@ def get_costs(db, weapon): upgrade_cost = int(weapon.upgrade_cost) except ValueError: upgrade_cost = 0 - print "WARN: bad upgrade cost for '%s' (%s): '%s'" \ - % (weapon.name, weapon.id, weapon.upgrade_cost) + print("WARN: bad upgrade cost for '%s' (%s): '%s'" \ + % (weapon.name, weapon.id, weapon.upgrade_cost)) except UnicodeError: upgrade_cost = 0 - cost_display = urllib.quote(weapon.upgrade_cost) - print "WARN: bad upgrade cost for '%s' (%s): '%s'" \ - % (weapon.name, weapon.id, cost_display) + cost_display = urllib.parse.quote(weapon.upgrade_cost) + print("WARN: bad upgrade cost for '%s' (%s): '%s'" \ + % (weapon.name, weapon.id, cost_display)) parent_weapon = db.get_weapon(weapon.parent_id) costs = get_costs(db, parent_weapon) for cost in costs: @@ -632,8 +632,8 @@ def get_costs(db, weapon): try: zenny = int(weapon.creation_cost) except ValueError: - print "WARN: bad creation cost for '%s': '%s'" \ - % (weapon.name, weapon.creation_cost) + print("WARN: bad creation cost for '%s': '%s'" \ + % (weapon.name, weapon.creation_cost)) zenny = weapon.upgrade_cost or 0 create_cost = dict(zenny=zenny, path=[weapon], @@ -688,7 +688,7 @@ class ItemStars(object): if not c["components"]: continue 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: continue if stars[k] is None or v < stars[k]: @@ -743,7 +743,7 @@ class ItemStars(object): if "Scrap" in item.name: continue istars = self.get_item_stars(item.id) - for k, v in stars.items(): + for k, v in list(stars.items()): if istars[k] > v: stars[k] = istars[k] break @@ -774,7 +774,7 @@ class ItemStars(object): gather_locations = set() for gather in gathering: 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) quests.extend(gather_quests) @@ -782,7 +782,7 @@ class ItemStars(object): monster_ranks = set() for monster in monsters: 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) quests.extend(monster_quests) @@ -794,15 +794,15 @@ class ItemStars(object): if quest.stars == 0: # ignore training quests if "Training" not in quest.name: - print "Error: non training quest has 0 stars", \ - quest.id, quest.name + print("Error: non training quest has 0 stars", \ + quest.id, quest.name) continue if quest.hub in stars: current = stars[quest.hub] if current is None or quest.stars < current: stars[quest.hub] = quest.stars else: - print "Error: unknown hub", quest.hub + print("Error: unknown hub", quest.hub) # if available guild or village, then null out permit/arena values, # because they are more useful for filtering if limited to items diff --git a/mhapi/rewards.py b/mhapi/rewards.py index a5998b0..4187511 100644 --- a/mhapi/rewards.py +++ b/mhapi/rewards.py @@ -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. """ -from __future__ import print_function + from collections import OrderedDict from mhapi import stats @@ -105,7 +105,7 @@ class GatherLocation(object): for gr in self._rewards: gr.print(out, indent) - def __nonzero__(self): + def __bool__(self): return bool(len(self._rewards)) def __len__(self): @@ -146,7 +146,7 @@ class QuestReward(object): * (LuckSkill.AMAZING - LuckSkill.NONE + 1)) else: counts = [stats.quest_reward_expected_c(self.slot, skill) - for skill in xrange(LuckSkill.NONE, + for skill in range(LuckSkill.NONE, LuckSkill.AMAZING+1)] @@ -218,7 +218,7 @@ class QuestItemExpectedValue(object): # chances there are to get other rewards. fixed_seen = dict(A=set(), B=set(), Sub=set()) dups = dict() - for i in xrange(len(rewards)): + for i in range(len(rewards)): reward = rewards[i] slot = reward["reward_slot"] if reward["percentage"] == 100: @@ -251,7 +251,7 @@ class QuestItemExpectedValue(object): self.slot_rewards[reward.slot].append(reward) evs = reward.expected_values() - for i in xrange(len(evs)): + for i in range(len(evs)): self.total_expected_values[i] += evs[i] def print(self, out, indent=2): @@ -320,10 +320,10 @@ class HuntReward(object): shiny=self.shiny) kill_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)] = \ 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_skill=skill) @@ -357,7 +357,7 @@ class HuntReward(object): self.kill = False counts = [ stats.capture_reward_expected_c(skill) - for skill in xrange(CapSkill.NONE, + for skill in range(CapSkill.NONE, CapSkill.GOD+1) ] elif self.condition == "Virus Reward": @@ -393,7 +393,7 @@ class HuntReward(object): if self.skill == SKILL_CARVING: counts = [ self.stack_size + stats.carve_delta_expected_c(skill) - for skill in xrange(CarvingSkill.NONE, + for skill in range(CarvingSkill.NONE, CarvingSkill.GOD+1) ] @@ -624,7 +624,7 @@ class HuntItemExpectedValue(object): carving_skill=carving_skill) return ev - def __nonzero__(self): + def __bool__(self): return bool(len(self.matching_rewards)) def __len__(self): @@ -640,10 +640,10 @@ class HuntItemExpectedValue(object): rewards=[r.as_data() for r in self.matching_rewards]) kill_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)] = \ 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_skill=skill) @@ -737,8 +737,8 @@ class ItemRewards(object): key = (mid, rank) self._hunt_items[key] = hunt_item - for rank, skill_sets in self.rank_skill_sets.iteritems(): - for s in skill_sets.itervalues(): + for rank, skill_sets in self.rank_skill_sets.items(): + for s in skill_sets.values(): s.add_hunt_option(hunt_item) 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_location = self._gather_items.get(gather_key) - for rank, skill_sets in self.rank_skill_sets.iteritems(): - for s in skill_sets.itervalues(): + for rank, skill_sets in self.rank_skill_sets.items(): + for s in skill_sets.values(): s.add_quest_option(quest_item, hunt_items, gather_location) def print_gather_locations(self, out): if not self._gather_items: return - for gl in self._gather_items.itervalues(): + for gl in self._gather_items.values(): out.write("(GATHER) %s %s\n" % (gl.location_name, gl.rank)) gl.print(out, indent=2) @@ -798,7 +798,7 @@ class ItemRewards(object): if not self._hunt_items: return - for hunt_item in self._hunt_items.itervalues(): + for hunt_item in self._hunt_items.values(): out.write("(HUNT) %s %s\n" % (hunt_item.monster_name, hunt_item.monster_rank)) hunt_item.print(out, indent=2) @@ -826,13 +826,13 @@ class ItemRewards(object): def print_recommended_hunts(self, out): 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 if no_skill_best is None: # not available at this rank continue 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: # Don't print out a rank with no options continue @@ -850,8 +850,8 @@ class ItemRewards(object): 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. """ - for quest_item in self._quest_items.itervalues(): - out.write("(QUEST) " + unicode(quest_item.quest) + "\n") + for quest_item in self._quest_items.values(): + out.write("(QUEST) " + str(quest_item.quest) + "\n") out.write(" %20s" % "= Quest\n") quest_item.print(out, indent=2) @@ -921,7 +921,7 @@ class ItemRewards(object): item_name = self.item_row["name"] out.write("*** Wyporium trade for '%s'\n" % item_name) 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") self.print_recommended_hunts(out) diff --git a/mhapi/stats.py b/mhapi/stats.py index 66e6054..b931d93 100644 --- a/mhapi/stats.py +++ b/mhapi/stats.py @@ -42,7 +42,7 @@ def _reward_count_p(reward_count, min_rewards, max_rewards, extend_percent): p = 1.0 extend_p = extend_percent / 100.0 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 if reward_count < max_rewards: p *= stop_p @@ -56,7 +56,7 @@ def quest_reward_p(reward_percent, min_rewards, max_rewards, extend_percent=69): extra attempt. """ 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, extend_percent) * _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 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, extend_percent) expected_attempts += p * reward_count diff --git a/scrapers/mhxg-weapons.py b/scrapers/mhxg-weapons.py index 9ada91a..fa373df 100755 --- a/scrapers/mhxg-weapons.py +++ b/scrapers/mhxg-weapons.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # vim: set fileencoding=utf8 : -import urllib +import urllib.request, urllib.parse, urllib.error import os import json import sys @@ -34,74 +34,74 @@ _RANGED_TYPES = ["Bow", "Light Bowgun", "Heavy Bowgun"] _ELEMENT_MAP = { - u"火": "Fire", - u"水": "Water", - u"雷": "Thunder", - u"氷": "Ice", - u"龍": "Dragon", - u"毒": "Poison", - u"麻痺": "Paralysis", - u"睡眠": "Sleep", - u"爆破": "Blast", + "火": "Fire", + "水": "Water", + "雷": "Thunder", + "氷": "Ice", + "龍": "Dragon", + "毒": "Poison", + "麻痺": "Paralysis", + "睡眠": "Sleep", + "爆破": "Blast", } _GL_SHOT_TYPES = { - u"通常": "Normal", - u"放射": "Long", - u"拡散": "Wide", + "通常": "Normal", + "放射": "Long", + "拡散": "Wide", } _SA_PHIAL_TYPES = { - u"強撃ビン": "Power", - u"減気ビン": "Exhaust", - u"滅龍ビン": "Dragon", - u"強属性ビン": "Element", - u"毒ビン": "Poison", - u"麻痺ビン": "Paralysis", + "強撃ビン": "Power", + "減気ビン": "Exhaust", + "滅龍ビン": "Dragon", + "強属性ビン": "Element", + "毒ビン": "Poison", + "麻痺ビン": "Paralysis", } _CB_PHIAL_TYPES = { - u"榴弾ビン": "Impact", - u"強属性ビン": "Element", + "榴弾ビン": "Impact", + "強属性ビン": "Element", } _BUG_TYPES = { - u"切断": "Cutting", - u"打撃": "Impact", + "切断": "Cutting", + "打撃": "Impact", } _BOW_ARC_TYPES = { - u"集中型": "Focus", - u"放散型": "Wide", - u"爆裂型": "Blast", + "集中型": "Focus", + "放散型": "Wide", + "爆裂型": "Blast", } _BOW_SHOT_TYPES = { - u"連射": "Rapid", - u"拡散": "Spread", - u"貫通": "Pierce", - u"重射": "Heavy", + "連射": "Rapid", + "拡散": "Spread", + "貫通": "Pierce", + "重射": "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", + "強1": "Power 1", + "強2": "Power 2", + "属1": "Element 1", + "属2": "Element 2", + "接": "C. Range", + "ペ": "Paint", + "毒": "Poison", + "麻": "Paralysis", + "睡": "Sleep", + "減": "Exhaust", + "爆": "Blast", } @@ -195,8 +195,8 @@ def _add_phial_or_shot_data(data, td_element): elif data["wtype"] == "Bow": data["arc_type"] = _BOW_ARC_TYPES[text] else: - msg = u"Unexpected element for wtype '%s'" % data["wtype"] - print >>sys.stderr, msg, text + msg = "Unexpected element for wtype '%s'" % data["wtype"] + print(msg, text, file=sys.stderr) raise ValueError(msg) @@ -223,7 +223,7 @@ def _get_detailed_sharpness(name, href, parser): weapon_level = 1 tmp_path = os.path.join(_pathfix.project_path, "tmp") 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: tree = etree.parse(f, parser) data1 = tree.xpath('//*/div[@class="data1"]') @@ -252,7 +252,7 @@ def _get_detailed_sharpness(name, href, parser): heads = tr.xpath('./th') if heads: for j, th in enumerate(heads): - if u"斬れ味" in th.text: + if "斬れ味" in th.text: sharpness_col = j continue @@ -265,8 +265,8 @@ def _get_detailed_sharpness(name, href, parser): name = names[i] try: sharpness_levels = _parse_sharpness_td(sharpness_cell) - except KeyError, ValueError: - print >>sys.stderr, "bad sharpness:", href, name + except KeyError as ValueError: + print("bad sharpness:", href, name, file=sys.stderr) raise SHARPNESS[name] = sharpness_levels #print name, sharpness_levels @@ -322,11 +322,11 @@ def _parse_hh_attr_td(td_element): affinity = int(span.text.strip()) text_lines = td_element.text.strip().split("\n") for line in text_lines: - if line.startswith(u"防御+"): + if line.startswith("防御+"): defense = int(line[3:]) if td_element.tail: - slots = td_element.tail.count(u"◯") + slots = td_element.tail.count("◯") return attack, affinity, defense, elements, slots @@ -347,13 +347,13 @@ def _parse_elements_td(td_element): affinity = int(span.text.strip()) text_lines = td_element.text.strip().split("\n") for line in text_lines: - if line.startswith(u"防御+"): + if line.startswith("防御+"): defense = int(line[3:]) return affinity, defense, elements 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): if text.startswith(jp_element): value = int(text[len(jp_element):]) @@ -385,7 +385,7 @@ def _parse_name_td(td_element): def _parse_slots_td(td_element): text = td_element.text if text: - return text.count(u"◯") + return text.count("◯") return 0 @@ -406,9 +406,9 @@ def _parse_sharpness_td(td_element): if sub.text is None: continue current.append(sub.text.count(".")) - for level in xrange(3): + for level in range(3): sharpness = sharpness_levels[level] - for i in xrange(len(sharpness), 6): + for i in range(len(sharpness), 6): sharpness.append(0) return sharpness_levels @@ -422,27 +422,27 @@ def _main(): raise weapon_list = [] parser = etree.HTMLParser() - for wtype, urls in _WEAPON_URLS.iteritems(): + for wtype, urls in _WEAPON_URLS.items(): for i, url in enumerate(urls): 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: tree = etree.parse(f, parser) wlist = extract_weapon_list(wtype, tree, parser) weapon_list.extend(wlist) - print json.dumps(weapon_list, indent=2) + print(json.dumps(weapon_list, indent=2)) def _test_details(): parser = etree.HTMLParser() # final level has same name - _get_detailed_sharpness(u"ベルダーハンマー", + _get_detailed_sharpness("ベルダーハンマー", "http://wiki.mhxg.org/ida/219225.html", parser) # final level has different name - _get_detailed_sharpness(u"テッケン", + _get_detailed_sharpness("テッケン", "http://wiki.mhxg.org/ida/230575.html", parser) # final level >= 10 (two chars) - _get_detailed_sharpness(u"ウィルガシェルプレス", + _get_detailed_sharpness("ウィルガシェルプレス", "http://wiki.mhxg.org/ida/228545.html", parser) diff --git a/scrapers/wikia-items-carves.py b/scrapers/wikia-items-carves.py index c46e971..77ae729 100755 --- a/scrapers/wikia-items-carves.py +++ b/scrapers/wikia-items-carves.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # vim: set fileencoding=utf8 : -import urllib +import urllib.request, urllib.parse, urllib.error import os import json import sys @@ -17,7 +17,7 @@ _PAGES = { "items": "MHX:_Item_List", } -_CIRCLE = u"\u26ab" +_CIRCLE = "\u26ab" def extract_names_and_icons(tree): @@ -90,11 +90,11 @@ def _translate_icon_name(s): def _main(): tmp_path = os.path.join(_pathfix.project_path, "tmp") 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) opath = os.path.join(outdir, name.replace("-", "_") + ".json") parser = etree.HTMLParser() - urllib.urlretrieve(_BASE_URL + page, fpath) + urllib.request.urlretrieve(_BASE_URL + page, fpath) with open(fpath) as f: tree = etree.parse(f, parser) data = extract_names_and_icons(tree) diff --git a/scrapers/wikia-palico-skills.py b/scrapers/wikia-palico-skills.py index 7a58779..320373a 100755 --- a/scrapers/wikia-palico-skills.py +++ b/scrapers/wikia-palico-skills.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # vim: set fileencoding=utf8 : -import urllib +import urllib.request, urllib.parse, urllib.error import os import json import sys @@ -14,7 +14,7 @@ _BASE_URL = "http://monsterhunter.wikia.com/wiki/" _PAGE = "MHX:_Palico_Skills" -_CIRCLE = u"\u26ab" +_CIRCLE = "\u26ab" def extract_arts_and_skills(tree): @@ -29,7 +29,7 @@ def extract_arts_and_skills(tree): rows = list(table) for row in rows: cols, is_header = _get_column_cells_texts(row) - print is_header, cols + print(is_header, cols) continue if is_header: if len(cols) == 1: @@ -100,13 +100,13 @@ def _main(): tmp_path = os.path.join(_pathfix.project_path, "tmp") fpath = os.path.join(tmp_path, "wikia-palico-skills.html") parser = etree.HTMLParser() - urllib.urlretrieve(_BASE_URL + _PAGE, fpath) + urllib.request.urlretrieve(_BASE_URL + _PAGE, fpath) with open(fpath) as f: tree = etree.parse(f, parser) arts, skills = extract_arts_and_skills(tree) #print json.dumps(weapon_list, indent=2) - print json.dumps(arts, indent=2) - print json.dumps(skills, indent=2) + print(json.dumps(arts, indent=2)) + print(json.dumps(skills, indent=2)) if __name__ == '__main__':