def Quest(exd_manager): data = exd_manager.get_category('Quest').get_data() data_ln = data[list(data.keys())[0]] data_return = {} for id, v in data_ln.items(): data_return[id] = { 'name': string(data, id, 0), } # if quest data if v[981] != b'': quest_base_exd_name = v[981].decode('utf-8') quest_exd_name = 'quest/%s/%s' % (quest_base_exd_name[10:13], quest_base_exd_name) quest_exd_data = exd_manager.get_category(quest_exd_name).get_data() quest_exd_data_ln = quest_exd_data[list(quest_exd_data.keys())[0]] data_return[id].update({ 'text_data': { quest_exd_data_ln[quest_exd_id][0].decode('utf-8'): { 'enable_conditions': False, 'type': 'string', 'ln': { get_language_name(language): quest_exd_data[language][quest_exd_id][1] for language in quest_exd_data.keys() } } for quest_exd_id in sorted(quest_exd_data_ln.keys()) } }) return data_return
def _extract_data(self): header = self.get_header() self._data = {} for language in header.languages: if is_language_valid(language): language_name = get_language_name(language) if language_name != '': language_name = '_%s' % language_name self._data[language] = {} for exd_file in header.exds: language_name = get_language_name(language) if language_name != '': language_name = '_%s' % language_name self._data[language].update(extract_data( self._dat_manager.get_file(Category.EXD_NAME % (self._name, exd_file, language_name)), header))
def string(data, id, member_id, enable_conditions = False): return { 'enable_conditions': enable_conditions, 'type': 'string', 'ln': { get_language_name(language): data[language][id][member_id] for language in data.keys() } }
def extract_exd(args, conf): dat_manager = DatManager(conf.get('game', 'path')) exd_manager = ExdManager(dat_manager) output_path = path.join(conf.get('output', 'path'), 'exd') for category_name in exd_manager.get_categories(): data = exd_manager.get_category(category_name).get_csv() for language, csv in data.items(): output_file_path = path.join( output_path, 'exd/%s_%s.exd' % (category_name, get_language_name(language))) if not path.exists(path.dirname(output_file_path)): makedirs(path.dirname(output_file_path)) with open(output_file_path, 'w') as file_handle: for line in csv: file_handle.write(line) file_handle.write('\n')
def quests(exd_manager): print('quests') data = exd_manager.get_category('Quest').get_data() data_ln = data[list(data.keys())[0]] return_dict = {} param_grow_data = exd_manager.get_category('ParamGrow').get_data() param_grow_data_ln = param_grow_data[list(param_grow_data.keys())[0]] complete_journal_data = exd_manager.get_category('CompleteJournal').get_data() complete_journal_data_in = complete_journal_data[list(complete_journal_data.keys())[0]] complete_journal_search_dict = { cj_data[0]: cj_id for cj_id, cj_data in complete_journal_data_in.items() } for id, v in data_ln.items(): print('quests (loop)', id) return_dict[id] = { 'name': string(data, id, 0), 'vars': [[v[i].decode('utf-8'), v[i+1]] for i in range(1, 51, 2)], #'structs': [v[i:i+15] for i in range(116, 1048, 15)], 'gil_reward': v[917], 'main_rewards': [mat(v[i], v[i+24]) for i in range(918, 921)], 'optional_rewards': [mat(v[i], v[i+31]) for i in range(924, 929)], 'base_exp': v[932], 'prerequisit_quests': [ref('quests', v[i]) for i in range(982, 985)], 'start': v[990], 'end': v[991], 'banner': v[992], #'level': (v[985] if v[985] != 0xFFFF else 0) + v[993], 'level': v[995], 'class_job': ref('class_jobs', v[1022]), 'genre': v[1024], # 'name': string(data, id, 0), # # 'level': (v[1165] if v[1165] != 0xFFFF else 0) + v[1170], # # 'class': v[1176], # # 'chain_quests': [ref('quests', v[i]) for i in range(1157, 1160)], # # 'steps': quest_steps([v[i] for i in range(1, 100, 2)], [v[i] for i in range(2, 101, 2)]), # # 'base_exp': v[1124], # 'gil_reward': v[1109], # # 'main_rewards': [mat(v[i], v[i+3]) for i in range(1127, 1130)] # + [mat(v[i], v[i+23]) for i in range(1110, 1113)], # # 'optional_rewards': [mat(v[i], v[i+32]) for i in range(1113, 1118)], } # If exp_reward breaks, ensure the level and the base_exp are correct, # also some entries might have values which mean other things because # SE is stupid, so the below print will show values way to high, such # as a level being massively over 50. print("key", id); print("level", return_dict[id]['level']); print("base_exp", return_dict[id]['base_exp']); # If the level is above 50, we will just reset it.. if return_dict[id]['level'] > 50: return_dict[id].update({ 'level': 50 }) return_dict[id].update({ 'exp_reward': (return_dict[id]['base_exp'] * (param_grow_data_ln[return_dict[id]['level']][13] * (45 + 5 * return_dict[id]['level']))) // 100 }) # # #Lookup complete journal by name and extract genre id (v[4]) # if complete_journal_data_in[complete_journal_search_dict[v[0]]][2] <= 49: #TEMP FIX UNTIL SE FIXES THEIR SHIT # return_dict[id].update({ # 'quest_genre': ref('journal_genre', complete_journal_data_in[complete_journal_search_dict[v[0]]][2]) # }) # # #Check second class column if first one is empty SERIOUSLY SE FIX YOUR SHIT # if v[1176] == 0: # return_dict[id].update({ # 'class': v[1179] # }) # if v[981] != b'': quest_base_exd_name = v[981].decode('utf-8') quest_exd_name = 'quest/%s/%s' % (quest_base_exd_name[10:13], quest_base_exd_name) quest_exd_data = exd_manager.get_category(quest_exd_name).get_data() quest_exd_data_ln = quest_exd_data[list(quest_exd_data.keys())[0]] return_dict[id].update({ 'texts': { quest_exd_data_ln[quest_exd_id][0].decode('utf-8'): { 'enable_conditions': False, 'type': 'string', 'ln': { get_language_name(language): quest_exd_data[language][quest_exd_id][1] for language in quest_exd_data.keys() } } for quest_exd_id in sorted(quest_exd_data_ln.keys()) } }) return return_dict