add irregular carve counts

main
Bryce Allen 11 years ago
parent a62f60195e
commit 9bad89b0af

@ -0,0 +1,74 @@
[
{
"carves": {
"Body Carve": 4,
"Tail Carve": 2
},
"monsters": [
"Gravios", "Apex Gravios", "Black Gravios",
"Deviljho", "Apex Deviljho", "Savage Deviljho",
"Akantor", "Ukanlos",
"Monoblos", "White Monoblos"
]
},
{
"carves": {
"Body Carve": 4,
"Tail Carve": 1
},
"monsters": [
"Teostra", "Chameleos", "Raging Brachydios",
"Kushala Daora", "Rusted Kushala Daora"
]
},
{
"monsters": ["Dah'ren Mohran"],
"carves": {
"Body Carve": 8,
"Mouth Carve": 2
}
},
{
"monsters": ["Dalamadur", "Shah Dalamadur"],
"carves": {
"Upper Body Carve": 4,
"Lower Body Carve": 4,
"Head Carve": 2,
"Tail Carve": 1
}
},
{
"monsters": ["Gogmazios"],
"carves": {
"Body Carve": 6,
"Tail Carve": 2
}
},
{
"monsters": ["Fatalis", "Crimson Fatalis", "White Fatalis"],
"carves": {
"Body Carve": 9
}
},
{
"carves": {
"Body Carve": 2
},
"monsters": ["Aptonoth", "Apceros", "Popo", "Rhenoplos", "Slagtoth",
"Jaggia"]
},
{
"monsters": ["Kelbi"],
"carves": {
"Body Carve": 1,
"Body Carve (KO)": 1,
"Body Carve (KO Large Kelbi)": 1
}
},
{
"monsters": ["Gypceros", "Purple Gypceros"],
"carves": {
"Body Carve (Apparent Death)": 1
}
}
]

Binary file not shown.

@ -0,0 +1,71 @@
#!/usr/bin/env python
import os.path
import codecs
import json
import _pathfix
from _pathfix import db_path
from mhapi.db import MHDB
def get_utf8_writer(writer):
return codecs.getwriter("utf8")(writer)
def set_carve_counts(db, monster_carves):
monsters = db.get_monsters()
for m in monsters:
rewards = db.get_monster_rewards(m.id)
mc = monster_carves.get(m.name)
print "===", m.name
for r in rewards:
condition = r["condition"]
if "Carve" not in condition:
continue
if mc and condition in mc:
stack_size = mc[condition]
elif m["class"] == "Minion":
stack_size = 1
elif m["class"] == "Boss":
if condition == "Body Carve":
stack_size = 3
elif condition == "Tail Carve":
stack_size = 1
else:
print "WARN: unknown condition %s.%s" \
% (m.name, condition)
else:
assert False, "Unknown monster class: %s" % m["class"]
if r["stack_size"] == stack_size:
continue
print " ", condition, r["stack_size"], "=>", stack_size
cur = db.cursor()
cur.execute("""UPDATE hunting_rewards
SET stack_size=? WHERE _id=?""",
(stack_size, r["_id"]))
def load_carves_json():
carves_json_path = os.path.join(db_path, "carves.json")
with open(carves_json_path) as f:
carves_list = json.load(f)
monster_carves = {}
for carves in carves_list:
for monster_name in carves["monsters"]:
monster_carves[monster_name] = carves["carves"]
return monster_carves
if __name__ == '__main__':
db_file = os.path.join(db_path, "mh4u.db")
db = MHDB(db_file)
import sys
sys.stdout = get_utf8_writer(sys.stdout)
sys.stderr = get_utf8_writer(sys.stderr)
monster_carves = load_carves_json()
set_carve_counts(db, monster_carves)
db.commit()
db.close()

@ -7,7 +7,6 @@ from __future__ import print_function
from collections import OrderedDict from collections import OrderedDict
from mhapi import stats from mhapi import stats
from mhapi.model import Quest
from mhapi.skills import LuckSkill, CapSkill, CarvingSkill from mhapi.skills import LuckSkill, CapSkill, CarvingSkill
SKILL_CARVING = "carving" SKILL_CARVING = "carving"
@ -315,56 +314,25 @@ class HuntReward(object):
return d return d
def _calculate_evs(self): def _calculate_evs(self):
counts = [self.stack_size]
if self.condition == "Tail Carve": if self.condition == "Tail Carve":
self.skill = SKILL_CARVING self.skill = SKILL_CARVING
self.cap = True self.cap = True
self.kill = True self.kill = True
counts = [
1 + stats.carve_delta_expected_c(skill)
for skill in xrange(CarvingSkill.PRO,
CarvingSkill.GOD+1)
]
elif self.condition == "Body Carve (Apparent Death)": elif self.condition == "Body Carve (Apparent Death)":
# Gypceros fake death. Assume one carve, it's dangerous to try # Gypceros fake death
# for two.
counts = [1]
self.cap = True self.cap = True
self.kill = True self.kill = True
elif self.condition == "Body Carve": elif "Body Carve" in self.condition:
# TODO: some monsters have 4 body carves
self.skill = SKILL_CARVING self.skill = SKILL_CARVING
self.cap = False self.cap = False
self.kill = True self.kill = True
counts = [
3 + stats.carve_delta_expected_c(skill)
for skill in xrange(CarvingSkill.PRO,
CarvingSkill.GOD+1)
]
elif self.condition.startswith("Body Carve (KO"):
# Kelbi
self.skill = SKILL_CARVING
self.cap = True
self.kill = True
counts = [
1 + stats.carve_delta_expected_c(skill)
for skill in xrange(CarvingSkill.PRO,
CarvingSkill.GOD+1)
]
elif "Carve" in self.condition: elif "Carve" in self.condition:
# other live carves:
# Mouth Carve: Dah'ren Mohran # Mouth Carve: Dah'ren Mohran
# Upper Body Carve: Dalamadur
# Lower Body Carve: Dalamadur
# Head Carve: Dalamadur # Head Carve: Dalamadur
# TODO: separate these out, some have >3 carves, not sure self.cap = True
# about others
self.skill = SKILL_CARVING
self.cap = False
self.kill = True self.kill = True
counts = [
3 + stats.carve_delta_expected_c(skill)
for skill in xrange(CarvingSkill.PRO,
CarvingSkill.GOD+1)
]
elif self.condition == "Capture": elif self.condition == "Capture":
self.skill = SKILL_CAP self.skill = SKILL_CAP
self.cap = True self.cap = True
@ -383,9 +351,7 @@ class HuntReward(object):
# give more rewards or just higher rarity crystals? # give more rewards or just higher rarity crystals?
self.cap = True self.cap = True
self.kill = True self.kill = True
counts = [1]
else: else:
counts = [1]
if self.condition.startswith("Shiny"): if self.condition.startswith("Shiny"):
# don't include shiny in total, makes it easier to # don't include shiny in total, makes it easier to
# calculate separately since shinys are variable by # calculate separately since shinys are variable by
@ -406,7 +372,15 @@ class HuntReward(object):
raise ValueError("Unknown condition: '%s'" raise ValueError("Unknown condition: '%s'"
% self.condition) % self.condition)
evs = [(i * self.stack_size * self.percentage) for i in counts] if self.skill == SKILL_CARVING:
counts = [
self.stack_size + stats.carve_delta_expected_c(skill)
for skill in xrange(CarvingSkill.NONE,
CarvingSkill.GOD+1)
]
evs = [(i * self.percentage) for i in counts]
return evs return evs

Loading…
Cancel
Save