model and db refactor, damage improvements
This commit is contained in:
@@ -1,12 +1,14 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import os
|
||||
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):
|
||||
@@ -15,50 +17,89 @@ def percent_change(a, b):
|
||||
return (100.0 * (b-a) / a)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 4:
|
||||
print "Usage: %s 'monster name' 'weapon name'+" % sys.argv[0]
|
||||
sys.exit(os.EX_USAGE)
|
||||
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")
|
||||
|
||||
sharp_plus = bool(int(sys.argv[1]))
|
||||
monster_name = sys.argv[2]
|
||||
weapon_names = sys.argv[3:]
|
||||
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(monster_name)
|
||||
monster = db.get_monster_by_name(args.monster)
|
||||
if not monster:
|
||||
raise ValueError("Monster '%s' not found" % monster_name)
|
||||
monster_damage = db.get_monster_damage(monster["_id"])
|
||||
raise ValueError("Monster '%s' not found" % args.monster)
|
||||
monster_damage = db.get_monster_damage(monster.id)
|
||||
weapons = []
|
||||
for name in weapon_names:
|
||||
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"])
|
||||
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(weapon_names, weapons):
|
||||
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:
|
||||
weapon_damage_map[name] = WeaponMonsterDamage(row,
|
||||
monster, monster_damage,
|
||||
motion, sharp_plus,
|
||||
monster_breaks)
|
||||
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[weapon_names[0]]
|
||||
damage_map_base = weapon_damage_map[args.weapon[0]]
|
||||
parts = damage_map_base.parts
|
||||
|
||||
for part in parts:
|
||||
@@ -66,17 +107,17 @@ if __name__ == '__main__':
|
||||
damage_map_base[part].total,
|
||||
weapon_damage_map[w][part].total
|
||||
)
|
||||
for w in weapon_names[1:]]
|
||||
for w in args.weapon[1:]]
|
||||
ediffs = [percent_change(
|
||||
damage_map_base[part].element,
|
||||
weapon_damage_map[w][part].element
|
||||
)
|
||||
for w in weapon_names[1:]]
|
||||
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 weapon_names[1:]]
|
||||
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)
|
||||
@@ -100,7 +141,7 @@ if __name__ == '__main__':
|
||||
base,
|
||||
weapon_damage_map[w].averages[avg_type]
|
||||
)
|
||||
for w in weapon_names[1:]]
|
||||
for w in args.weapon[1:]]
|
||||
|
||||
diff_s = ",".join("%+0.1f%%" % i for i in diffs)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user