You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
5.6 KiB

#!/usr/bin/env python
import sys
import argparse
import _pathfix
from mhapi.db import MHDB
from mhapi.damage import MotionValueDB, WeaponMonsterDamage
from mhapi.model import SharpnessLevel
from mhapi import skills
def percent_change(a, b):
if a == 0:
return b
return (100.0 * (b-a) / a)
def parse_args(argv):
parser = argparse.ArgumentParser(
"Calculate damage to monster from different weapons of the"
" same class"
)
parser.add_argument("-s", "--sharpness-plus-one", action="store_true",
default=False,
help="add Sharpness +1 skill, default off")
parser.add_argument("-f", "--awaken", action="store_true",
default=False,
help="add Awaken (FreeElement), default off")
parser.add_argument("-a", "--attack-up",
type=int, choices=xrange(0, 5), default=0,
help="1-4 for AuS, M, L, XL")
parser.add_argument("-c", "--critical-eye",
type=int, choices=xrange(0, 5), default=0,
help="1-4 for CE+1, +2, +3 and Critical God")
parser.add_argument("-e", "--element-up",
type=int, choices=xrange(0, 5), default=0,
help="1-4 for (element) Atk +1, +2, +3 and"
" Element Attack Up")
parser.add_argument("monster",
help="Full name of monster")
parser.add_argument("weapon", nargs="+",
help="One or more weapons of same class to compare,"
" full names")
return parser.parse_args(argv)
if __name__ == '__main__':
args = parse_args(None)
db = MHDB(_pathfix.db_path)
motiondb = MotionValueDB(_pathfix.motion_values_path)
monster = db.get_monster_by_name(args.monster)
if not monster:
raise ValueError("Monster '%s' not found" % args.monster)
monster_damage = db.get_monster_damage(monster.id)
weapons = []
for name in args.weapon:
weapon = db.get_weapon_by_name(name)
if not weapon:
raise ValueError("Weapon '%s' not found" % name)
weapons.append(weapon)
monster_breaks = db.get_monster_breaks(monster.id)
weapon_type = weapons[0]["wtype"]
motion = motiondb[weapon_type].average
print "Weapon Type: %s" % weapon_type
print "Average Motion: %0.1f" % motion
print "Monster Breaks: %s" % ", ".join(monster_breaks)
skill_names = ["Sharpness +1" if args.sharpness_plus_one else "",
"Awaken" if args.awaken else "",
skills.AttackUp.name(args.attack_up),
skills.CriticalEye.name(args.critical_eye),
skills.ElementAttackUp.name(args.element_up)]
print "Skills:", ", ".join(skill for skill in skill_names if skill)
weapon_damage_map = dict()
for name, row in zip(args.weapon, weapons):
row_type = row["wtype"]
if row_type != weapon_type:
raise ValueError("Weapon '%s' is different type" % name)
try:
wd = WeaponMonsterDamage(row,
monster, monster_damage,
motion, args.sharpness_plus_one,
monster_breaks,
attack_skill=args.attack_up,
critical_eye_skill=args.critical_eye,
element_skill=args.element_up,
awaken=args.awaken)
print "%-20s: %4.0f %2.0f%%" % (name, wd.attack, wd.affinity),
if wd.etype:
print "(%4.0f %s)" % (wd.eattack, wd.etype),
print SharpnessLevel.name(wd.sharpness)
weapon_damage_map[name] = wd
except ValueError as e:
print str(e)
sys.exit(1)
damage_map_base = weapon_damage_map[args.weapon[0]]
parts = damage_map_base.parts
for part in parts:
tdiffs = [percent_change(
damage_map_base[part].total,
weapon_damage_map[w][part].total
)
for w in args.weapon[1:]]
ediffs = [percent_change(
damage_map_base[part].element,
weapon_damage_map[w][part].element
)
for w in args.weapon[1:]]
bdiffs = [percent_change(
damage_map_base[part].break_diff(),
weapon_damage_map[w][part].break_diff()
)
for w in args.weapon[1:]]
tdiff_s = ",".join("%+0.1f%%" % i for i in tdiffs)
ediff_s = ",".join("%+0.1f%%" % i for i in ediffs)
bdiff_s = ",".join("%+0.1f%%" % i for i in bdiffs)
damage = damage_map_base[part]
print "%22s%s h%02d %0.2f (%s) h%02d %0.2f (%s) %+0.2f (%s)" \
% (part, "*" if damage.is_breakable() else " ",
damage.hitbox,
damage.total,
tdiff_s,
damage.ehitbox,
damage.element,
ediff_s,
damage.break_diff(),
bdiff_s)
print " --------------------"
for avg_type in "uniform raw weakpart_raw element weakpart_element break_raw break_element break_only".split():
base = damage_map_base.averages[avg_type]
diffs = [percent_change(
base,
weapon_damage_map[w].averages[avg_type]
)
for w in args.weapon[1:]]
diff_s = ",".join("%+0.1f%%" % i for i in diffs)
print "%22s %0.2f (%s)" % (avg_type, base, diff_s)