def load(): macros.clear() macro_pairing.clear() for file in macro_dir.glob("*.macro"): with open(file, encoding='utf-8') as f: macro_str = f.read() tags = { gp[0]: gp[1] for gp in macro_craft_tag_regex.findall(macro_str) } tags['_file'] = file.stem macro = Macro(macro_str) runner = macro.get_runner() count = 0 size = 0 try: while True: try: cmd, arg, wait_time = runner.next(default_params) count += wait_time size += 1 if size >= macro_max_size: _logger.warning( 'a macro with size overload at file "%s" (max size:%s)' % (file, macro_max_size)) raise MacroOversize() except MacroFinish: break _logger.debug('load macro [%s]' % (tags['Name'] if 'Name' in tags else tags['_file'])) macros.append((count, macro, tags)) except MacroOversize: continue macros.sort(key=lambda x: x[0])
def __init__(self, macro_str, file_name): self.tags = {gp[0]: gp[1] for gp in macro_craft_tag_regex.findall(macro_str)} self.tags['_file'] = file_name self.macro = Macro(macro_str) self.name = self.tags['Name'] if 'Name' in self.tags else self.tags['_file'] self.step_safe_check = int(self.tags["StepSafeCheck"]) if "StepSafeCheck" in self.tags else 100 self.time = int(self.tags["UsedTime"]) if "UsedTime" in self.tags else -1 self.recipe_id = list(map(int, self.tags["RecipeID"].split(","))) if "RecipeID" in self.tags else [] self.recipe_name = list(self.tags["RecipeName"].split(",")) if "RecipeName" in self.tags else [] self.min_craft, self.min_control, self.min_cp = map(int, (self.tags["MinAttr"] if "MinAttr" in self.tags else "0/0/0").split('/')) self.max_craft = int(self.tags["MaxCraft"]) if "MaxCraft" in self.tags else -1 self.ignore_quality = "IgnoreQuality" in self.tags
class MacroContainer(object): def __init__(self, macro_str, file_name): self.tags = { gp[0]: gp[1] for gp in macro_craft_tag_regex.findall(macro_str) } self.tags['_file'] = file_name self.macro = Macro(macro_str) self.name = self.tags['Name'] if 'Name' in self.tags else self.tags[ '_file'] self.step_safe_check = int(self.tags["StepSafeCheck"] ) if "StepSafeCheck" in self.tags else 100 self.time = int( self.tags["UsedTime"]) if "UsedTime" in self.tags else -1 self.recipe_id = list(map(int, self.tags["RecipeID"].split( ","))) if "RecipeID" in self.tags else [] self.recipe_name = list(self.tags["RecipeName"].split( ",")) if "RecipeName" in self.tags else [] self.min_craft, self.min_control, self.min_cp = map( int, (self.tags["MinAttr"] if "MinAttr" in self.tags else "0/0/0").split('/')) self.max_craft = int( self.tags["MaxCraft"]) if "MaxCraft" in self.tags else -1 self.ignore_quality = "IgnoreQuality" in self.tags def attr_pair(self, player): if 0 < self.max_craft < player.craft or player.craft < self.min_craft: return False if player.control < self.min_control or player.max_cp < self.min_cp: return False return True def pair(self, craft): if not self.attr_pair(craft.player): return "attr not pair" if self.step_safe_check < 0: return size = 0 t_craft = craft.clone() runner = self.macro.get_runner() arg = None while True: try: param = get_params(t_craft, arg) cmd, arg, wait_time = runner.next(param) while cmd != "ac": cmd, arg, wait = runner.next(param) arg = arg.strip('"') size += 1 if size >= self.step_safe_check: raise MacroOversize() t_craft.use_skill(arg, check_mode=True) if t_craft.is_finished(): return None if t_craft.current_quality >= t_craft.recipe.max_quality or self.ignore_quality else "quality not enough" except MacroFinish: return "craft not finish" except MacroOversize: return "macro over size" except CheckUnpass: return "[%s](%s) cant be used" % (arg, runner.current_line - 1)