From f4185450c4b490014f69c5834803bd064382d043 Mon Sep 17 00:00:00 2001 From: Bryce Allen Date: Fri, 3 Apr 2015 00:07:32 -0500 Subject: [PATCH] hack for mis-marked unstable monsters --- mhapi/db.py | 9 +++++++-- mhapi/rewards.py | 29 +++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/mhapi/db.py b/mhapi/db.py index 354c153..1856dce 100644 --- a/mhapi/db.py +++ b/mhapi/db.py @@ -29,6 +29,11 @@ class Quest(object): self.sub_goal = quest_row["sub_goal"] self.rank = quest_row["rank"] + def is_multi_monster(self): + return (" and " in self.goal + or "," in self.goal + or " all " in self.goal) + def one_line_u(self): return self._one_line_template.substitute(self.__dict__) @@ -170,8 +175,8 @@ class MHDB(object): def get_quest_monsters(self, quest_id): v = self._get_memoized("quest_monsters", """ - SELECT monster_id FROM monster_to_quest - WHERE quest_id=? AND unstable='no' + SELECT monster_id, unstable FROM monster_to_quest + WHERE quest_id=? """, quest_id) return v diff --git a/mhapi/rewards.py b/mhapi/rewards.py index c84ab63..5f5c0f5 100644 --- a/mhapi/rewards.py +++ b/mhapi/rewards.py @@ -160,7 +160,9 @@ class QuestItemExpectedValue(object): def _add_reward(self, r): mutable_r = dict(r) - mutable_r["percentage"] *= self.normalize_reward_p[r["reward_slot"]] + # don't adjust fixed rewards + if mutable_r["percentage"] != 100: + mutable_r["percentage"] *= self.normalize_reward_p[r["reward_slot"]] reward = QuestReward(mutable_r, self.fixed_rewards) self.slot_rewards[reward.slot].append(reward) @@ -417,9 +419,9 @@ class ItemStrategy(object): def add_hunt_item(self, hunt_item): self.hunt_items.append(hunt_item) - ev = self.hunt_item.expected_value(self.strat, - carving_skill=self.carving_skill, - cap_skill=self.cap_skill) + ev = hunt_item.expected_value(self.strat, + carving_skill=self.carving_skill, + cap_skill=self.cap_skill) self.hunt_ev += ev self.ev += ev @@ -501,6 +503,12 @@ class HuntItemExpectedValue(object): carving_skill=carving_skill) return ev + def __nonzero__(self): + return bool(len(self.matching_rewards)) + + def __len__(self): + return len(self.matching_rewards) + def print(self, out, indent=2): for hr in self.matching_rewards: hr.print(out, indent) @@ -509,6 +517,7 @@ class HuntItemExpectedValue(object): for reward in rewards: if reward["item_id"] != self.item_id: continue + # TODO: warn when percentage == 0 self._add_reward(reward) def _add_reward(self, r): @@ -570,6 +579,8 @@ class ItemRewards(object): reward_rows = self.db.get_monster_rewards(mid, rank) hunt_item = HuntItemExpectedValue(self.item_id, monster["name"], rank, reward_rows) + if not hunt_item: + continue key = (mid, rank) self._hunt_items[key] = hunt_item @@ -596,6 +607,16 @@ class ItemRewards(object): hunt_items = [] for m in quest_monsters: mid = m["monster_id"] + + # It looks like every monster other than the first is + # marked as stable. This looks like it's usually correct + # for single monster quests, but wrong for multi monster + # quests, so skip the unstable monsters for single monster + # quests. + unstable = (m["unstable"] == "yes") + if unstable and not q.is_multi_monster(): + continue + hunt_item = self.get_hunt_item(mid, quest_item.quest.rank) if hunt_item: hunt_items.append(hunt_item)