add armor search, damage fixes

This commit is contained in:
Bryce Allen
2015-04-27 03:21:02 -05:00
parent 5e3552728f
commit 784299dd53
6 changed files with 307 additions and 8 deletions

View File

@@ -199,6 +199,11 @@ class WeaponMonsterDamage(object):
self.etype = self.weapon.awaken
self.eattack = self.weapon.awaken_attack
if self.eattack:
self.eattack = int(self.eattack)
else:
self.eattack = 0
self.true_raw = skills.AttackUp.modified(attack_skill,
self.true_raw)
self.affinity = skills.CriticalEye.modified(critical_eye_skill,

View File

@@ -102,12 +102,12 @@ class MHDB(object):
"""
List of unicode strings.
"""
item_types.sort()
args = sorted(item_types)
placeholders = ", ".join(["?"] * len(item_types))
return self._query_all("item_names", """
SELECT _id, name FROM items
WHERE type IN (%s)
""" % placeholders, tuple(item_types), model_cls=field_model("name"))
""" % placeholders, tuple(args), model_cls=field_model("name"))
def get_items(self, item_types=None):
"""
@@ -115,7 +115,7 @@ class MHDB(object):
"""
q = "SELECT * FROM items"
if item_types:
item_types.sort()
item_types = sorted(item_types)
placeholders = ", ".join(["?"] * len(item_types))
q += "\nWHERE type IN (%s)" % placeholders
item_types = tuple(item_types)
@@ -304,6 +304,104 @@ class MHDB(object):
WHERE items.name=?
""", (name,), model_cls=model.Weapon)
def get_armors(self):
return self._query_all("armors", """
SELECT * FROM armor
LEFT JOIN items ON armor._id = items._id
""", model_cls=model.Armor)
def get_armor(self, armor_id):
return self._query_one("armor", """
SELECT * FROM armor
LEFT JOIN items ON armor._id = items._id
WHERE armor._id=?
""", (armor_id,), model_cls=model.Armor)
def get_armor_by_name(self, name):
return self._query_one("armor", """
SELECT * FROM armor
LEFT JOIN items ON armor._id = items._id
WHERE items.name=?
""", (name,), model_cls=model.Armor)
def get_item_skills(self, item_id):
return self._query_all("item_skills", """
SELECT item_to_skill_tree.*, skill_trees.name
FROM item_to_skill_tree
LEFT JOIN skill_trees
ON item_to_skill_tree.skill_tree_id = skill_trees._id
WHERE item_to_skill_tree.item_id=?
""", (item_id,), model_cls=model.ItemSkill)
def get_decorations(self):
return self._query_all("decorations", """
SELECT *
FROM decorations
INNER JOIN items
ON items._id = decorations._id
""", model_cls=model.Decoration)
def get_decoration(self, decoration_id):
return self._query_one("decoration", """
SELECT *
FROM decorations
INNER JOIN items
ON items._id = decorations._id
WHERE decorations._id = ?
""", (decoration_id,), model_cls=model.Decoration)
def get_decoration_by_name(self, name):
return self._query_all("decoration", """
SELECT *
FROM decorations
INNER JOIN items
ON items._id = decorations._id
WHERE items.name = ?
""", (name,), model_cls=model.Decoration)
def get_skill_tree_id(self, skill_tree_name):
result = self._query_one("skill", """
SELECT _id FROM skill_trees
WHERE name=?
""", (skill_tree_name,))
if result:
return result["_id"]
return None
def get_decorations_by_skills(self, skill_tree_ids):
args = sorted(skill_tree_ids)
placeholders = ", ".join(["?"] * len(skill_tree_ids))
return self._query_all("decorations", """
SELECT items.*, decorations.*
FROM item_to_skill_tree
LEFT JOIN items
ON items._id = item_to_skill_tree.item_id
LEFT JOIN decorations
ON decorations._id = item_to_skill_tree.item_id
WHERE items.type = 'Decoration'
AND item_to_skill_tree.skill_tree_id IN (%s)
AND item_to_skill_tree.point_value > 0
GROUP BY item_to_skill_tree.item_id
""" % placeholders, tuple(args), model_cls=model.Decoration)
def get_armors_by_skills(self, skill_tree_ids, hunter_type):
args = sorted(skill_tree_ids)
placeholders = ", ".join(["?"] * len(skill_tree_ids))
args += [hunter_type]
return self._query_all("decorations", """
SELECT items.*, armor.*
FROM item_to_skill_tree
LEFT JOIN items
ON items._id = item_to_skill_tree.item_id
LEFT JOIN armor
ON armor._id = item_to_skill_tree.item_id
WHERE items.type = 'Armor'
AND item_to_skill_tree.skill_tree_id IN (%s)
AND item_to_skill_tree.point_value > 0
AND armor.hunter_type IN ('Both', ?)
GROUP BY item_to_skill_tree.item_id
""" % placeholders, tuple(args), model_cls=model.Armor)
def get_monster_breaks(self, monster_id):
"""
List of strings.

View File

@@ -54,6 +54,9 @@ class RowModel(ModelBase):
def __getitem__(self, key):
return self._data[key]
def __contains__(self, key):
return key in self._data
def fields(self):
return self._data.keys()
@@ -190,6 +193,76 @@ class WeaponSharpness(ModelBase):
return self.value_list
class ItemWithSkills(RowModel):
def __init__(self, item_row):
super(ItemWithSkills, self).__init__(item_row)
self.skills = None
self.skill_ids = []
self.skill_names = []
def set_skills(self, item_skills):
self.skills = {}
for s in item_skills:
self.skills[s.skill_tree_id] = s.point_value
self.skills[s.name] = s.point_value
self.skill_ids.append(s.skill_tree_id)
self.skill_names.append(s.name)
def skill(self, skill_id_or_name):
return self.skills.get(skill_id_or_name, 0)
def one_line_skills_u(self, skill_names=None):
if skill_names is None:
skill_names = sorted(self.skill_names)
return ", ".join("%s %d" % (name, self.skills[name])
for name in skill_names
if name in self.skills)
class Armor(ItemWithSkills):
_indexes = { "name": ["id"],
"slot": ["id", "name"] }
_one_line_template = string.Template(
"$name ($slot) Def $defense-$max_defense Slot $num_slots"
)
def __init__(self, armor_item_row):
super(Armor, self).__init__(armor_item_row)
def one_line_u(self):
return self._one_line_template.substitute(self.as_data())
def skill(self, skill_id_or_name, decoration_values=()):
"""
decoration_values should be a list of points from the given
number of slots, e.g. [1, 3] means that one slot gets 1 point
and two slots get 3 points, [1, 0, 4] means that one slot gets 1 point,
there is no two slot gem, and three slots gets 4 points.
"""
assert self.skills is not None
total = self.skills.get(skill_id_or_name, 0)
slots_left = self.num_slots
for slots in xrange(len(decoration_values), 0, -1):
if slots_left == 0:
break
decoration_value = decoration_values[slots-1]
if not decoration_value:
continue
if slots <= slots_left:
total += decoration_value
slots_left -= slots
return total
class Decoration(ItemWithSkills):
pass
class ItemSkill(RowModel):
pass
class Weapon(RowModel):
_list_fields = ["id", "wtype", "name"]
_indexes = { "name": ["id"],