from .base import BaseDB def get_dbs_by_lang(language=None): databases = { "QuestMst": "Quest", "QuestSceneMst": "QuestScene", "QuestPartMst": "QuestPart", "ResourceEntry": "ResourceEntry", } for key in list(databases): if not language: databases[key + ".db"] = databases.pop(key) else: databases[key + "_" + language + ".db"] = databases.pop(key) return databases class QuestDB(BaseDB): def __init__(self, path, language=None): super().__init__(path, get_dbs_by_lang(language)) def get_quests(self): self.cursor.execute( """ SELECT q.questMstId, q.name, group_concat(DISTINCT qp.questSceneMstId) AS scenes FROM Quest.QuestMstRecord q INNER JOIN QuestScene.QuestSceneMstRecord qs ON q.questMstId = qs.questMstId INNER JOIN QuestPart.QuestPartMstRecord qp ON qs.questSceneMstId = qp.questSceneMstId WHERE q.baseQuestMstId = 0 AND (qp.beforeTalkName != "" OR qp.afterTalkName != "") GROUP BY q.questMstId """ ) res = self.cursor.fetchall() quests = {} for quest_id, name, scenes in res: quests[str(quest_id)] = {} quests[str(quest_id)]["Name"] = name quests[str(quest_id)]["Scenes"] = scenes.split(",") return quests def get_scenes(self): self.cursor.execute( """ SELECT questSceneMstId, name, summaryText, group_concat(partIds) as parts FROM ( SELECT qs.questSceneMstId, qs.name, qs.summaryText, CASE WHEN qp.afterTalkName == '' AND qp.beforeTalkName == '' THEN NULL WHEN qp.afterTalkName == '' AND qp.beforeTalkName != '' THEN qp.beforeTalkName WHEN qp.afterTalkName != '' AND qp.beforeTalkName == '' THEN qp.afterTalkName ELSE qp.beforeTalkName || ',' || qp.afterTalkName END AS partIds FROM QuestScene.QuestSceneMstRecord qs INNER JOIN QuestPart.QuestPartMstRecord qp ON qs.questSceneMstId = qp.questSceneMstId WHERE (qp.beforeTalkName != "" OR qp.afterTalkName != "") ) GROUP BY questSceneMstId """ ) res = self.cursor.fetchall() scenes = {} for scene_id, name, summary, parts in res: scenes[str(scene_id)] = {} scenes[str(scene_id)]["Name"] = name scenes[str(scene_id)]["SummaryText"] = summary scenes[str(scene_id)]["Parts"] = parts.split(",") return scenes