convert to python3
This commit is contained in:
@@ -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__':
|
||||||
|
|||||||
Reference in New Issue
Block a user