parent
							
								
									1be52d7a1e
								
							
						
					
					
						commit
						9fa9f8e2a9
					
				@ -0,0 +1,11 @@
 | 
				
			||||
"""
 | 
				
			||||
Hack to get scripts to run from source checkout without having to set
 | 
				
			||||
PYTHONPATH.
 | 
				
			||||
"""
 | 
				
			||||
 | 
				
			||||
import sys
 | 
				
			||||
from os.path import dirname, join, abspath
 | 
				
			||||
 | 
				
			||||
db_path = dirname(__file__)
 | 
				
			||||
project_path = abspath(join(db_path, ".."))
 | 
				
			||||
sys.path.insert(0, project_path)
 | 
				
			||||
											
												Binary file not shown.
											
										
									
								@ -0,0 +1 @@
 | 
				
			||||
ALTER TABLE quests ADD COLUMN rank text;
 | 
				
			||||
@ -0,0 +1,111 @@
 | 
				
			||||
#!/usr/bin/env python
 | 
				
			||||
 | 
				
			||||
import os.path
 | 
				
			||||
import codecs
 | 
				
			||||
 | 
				
			||||
import _pathfix
 | 
				
			||||
 | 
				
			||||
from mhapi.db import MHDB, Quest
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
RANK_NUM = dict(LR=0, HR=1, G=2)
 | 
				
			||||
RANK_NAME = ["LR", "HR", "G"]
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
def get_utf8_writer(writer):
 | 
				
			||||
    return codecs.getwriter("utf8")(writer)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
def set_quest_ranks(db):
 | 
				
			||||
    quests = db.get_quests()
 | 
				
			||||
    for quest in quests:
 | 
				
			||||
        if not quest["name"]:
 | 
				
			||||
            assert quest["hub"] == "Event"
 | 
				
			||||
            print "WARN: skipping non localized event quest: %d" % quest["_id"]
 | 
				
			||||
            continue
 | 
				
			||||
        set_quest_rank(db, quest)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
def set_quest_rank(db, quest_row):
 | 
				
			||||
    quest_id = quest_row["_id"]
 | 
				
			||||
    hub = quest_row["hub"]
 | 
				
			||||
    stars = quest_row["stars"]
 | 
				
			||||
    rank_stars_guess = guess_rank(hub, stars)
 | 
				
			||||
    if isinstance(rank_stars_guess, tuple):
 | 
				
			||||
        rewards = db.get_quest_rewards(quest_id)
 | 
				
			||||
        rank = guess_quest_rank_from_rewards(db, rewards)
 | 
				
			||||
        if rank is None:
 | 
				
			||||
            print "WARN: quest '%s' has no flesh rewards, assuming lower rank"\
 | 
				
			||||
                % (quest_row["name"].encode("utf8"),)
 | 
				
			||||
            rank = rank_stars_guess[0]
 | 
				
			||||
        elif rank not in rank_stars_guess:
 | 
				
			||||
            print "ERROR: quest '%s' reward guess '%s' not in stars guess '%s'"\
 | 
				
			||||
             % (quest_row["name"], rank, rank_stars_guess)
 | 
				
			||||
    else:
 | 
				
			||||
        rank = rank_stars_guess
 | 
				
			||||
 | 
				
			||||
    assert rank in "LR HR G".split()
 | 
				
			||||
 | 
				
			||||
    quest = Quest(quest_row)
 | 
				
			||||
    quest.rank = rank
 | 
				
			||||
    print quest.one_line_u()
 | 
				
			||||
    cur = db.cursor()
 | 
				
			||||
    cur.execute("UPDATE quests SET rank=? WHERE _id=?", (rank, quest_id))
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
def guess_rank(hub, stars):
 | 
				
			||||
    if hub == "Caravan":
 | 
				
			||||
        # 6 * is actually a mix of LR and HR,
 | 
				
			||||
        # and 10 * is mix of HR and G
 | 
				
			||||
        if stars < 6:
 | 
				
			||||
            return "LR"
 | 
				
			||||
        elif stars == 6:
 | 
				
			||||
            return ("LR", "HR")
 | 
				
			||||
        elif stars == 10:
 | 
				
			||||
            return ("HR", "G")
 | 
				
			||||
        return "HR"
 | 
				
			||||
    if hub in ("Guild", "Event"):
 | 
				
			||||
        if stars < 4:
 | 
				
			||||
            return "LR"
 | 
				
			||||
        elif stars < 8:
 | 
				
			||||
            return "HR"
 | 
				
			||||
        return "G"
 | 
				
			||||
    else:
 | 
				
			||||
        raise ValueError("Unknown hub '%s'" % hub)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
def guess_quest_rank_from_rewards(db, rewards_rows):
 | 
				
			||||
    max_min_rank = RANK_NUM["LR"]
 | 
				
			||||
    has_flesh_rewards = False
 | 
				
			||||
    for reward in rewards_rows:
 | 
				
			||||
        # for each flesh quest reward, see if it's only available from
 | 
				
			||||
        # HR or G monsters
 | 
				
			||||
        item = db.get_item(reward["item_id"])
 | 
				
			||||
        if item["type"] not in ("Flesh", "Sac/Fluid"):
 | 
				
			||||
            continue
 | 
				
			||||
        has_flesh_rewards = True
 | 
				
			||||
        monsters = db.get_item_monsters(reward["item_id"])
 | 
				
			||||
        min_rank = 3
 | 
				
			||||
        for m in monsters:
 | 
				
			||||
            rank = m["rank"]
 | 
				
			||||
            if RANK_NUM[rank] < min_rank:
 | 
				
			||||
                min_rank = RANK_NUM[rank]
 | 
				
			||||
        if min_rank > max_min_rank and min_rank != 3:
 | 
				
			||||
            max_min_rank = min_rank
 | 
				
			||||
    if not has_flesh_rewards:
 | 
				
			||||
        # Can't make useful guess from the rewards
 | 
				
			||||
        return None
 | 
				
			||||
    return RANK_NAME[max_min_rank]
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
if __name__ == '__main__':
 | 
				
			||||
    from _pathfix import db_path
 | 
				
			||||
    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)
 | 
				
			||||
    set_quest_ranks(db)
 | 
				
			||||
    db.commit()
 | 
				
			||||
    db.close()
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue