예제 #1
0
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])
예제 #2
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
예제 #3
0
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)