diff --git a/assets/cn/rogue/ui/CURIO_FIXED.png b/assets/cn/rogue/ui/CURIO_FIXED.png new file mode 100644 index 000000000..8d6adc00d Binary files /dev/null and b/assets/cn/rogue/ui/CURIO_FIXED.png differ diff --git a/assets/share/assignment/dispatch/CHARACTER_1.png b/assets/share/assignment/dispatch/CHARACTER_1.png index a64234004..91d01ca2b 100644 Binary files a/assets/share/assignment/dispatch/CHARACTER_1.png and b/assets/share/assignment/dispatch/CHARACTER_1.png differ diff --git a/assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png b/assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png index 2cf101dc3..954517450 100644 Binary files a/assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png and b/assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png differ diff --git a/assets/share/assignment/dispatch/CHARACTER_2.png b/assets/share/assignment/dispatch/CHARACTER_2.png index 96ca4fe2a..c68a4daa4 100644 Binary files a/assets/share/assignment/dispatch/CHARACTER_2.png and b/assets/share/assignment/dispatch/CHARACTER_2.png differ diff --git a/assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png b/assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png index 0980134cc..1bfd1964a 100644 Binary files a/assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png and b/assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png differ diff --git a/assets/share/base/page/MAP_EXIT.2.png b/assets/share/base/page/MAP_EXIT.2.png new file mode 100644 index 000000000..6a4dcb099 Binary files /dev/null and b/assets/share/base/page/MAP_EXIT.2.png differ diff --git a/assets/share/combat/support/COMBAT_SUPPORT_SELECTED.png b/assets/share/combat/support/COMBAT_SUPPORT_SELECTED.png deleted file mode 100644 index 5ea0ab7bc..000000000 Binary files a/assets/share/combat/support/COMBAT_SUPPORT_SELECTED.png and /dev/null differ diff --git a/dev_tools/keywords/assignment.py b/dev_tools/keywords/assignment.py index 30dadcb25..25d53a3e3 100644 --- a/dev_tools/keywords/assignment.py +++ b/dev_tools/keywords/assignment.py @@ -5,6 +5,22 @@ from dev_tools.keywords.base import UI_LANGUAGES, GenerateKeyword from module.config.utils import deep_get +def resort(dic: dict): + # Poor assigment sort for 2.2 + order = [ + 1008, 1007, 1006, 1005, 1004, 1003, 1002, 1001, + 3001, 2001, 4001, + 5008, 5006, 5005, 5003, 5002, 5007, 5004, 5001, + ] + out = {} + for index in order: + value = dic.pop(index) + out[index] = value + for k, v, in dic.items(): + out[k] = v + return out + + @cache def get_assignment_entry_data(): """ @@ -16,6 +32,9 @@ def get_assignment_entry_data(): deep_get(expedition, 'Name.Hash'): deep_get(expedition, 'ExpeditionID') for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionData.json').values() } + rev = {v: k for k, v in expedition_namehash_to_id.items()} + rev = resort(rev) + expedition_namehash_to_id = {v: k for k, v in rev.items()} expedition_id_to_reward_id = { deep_get(expedition, '4.2.ExpeditionID'): deep_get(expedition, '4.2.RewardID') for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionReward.json').values() @@ -119,5 +138,6 @@ class GenerateAssignmentEventEntry(GenerateKeyword): if __name__ == "__main__": from dev_tools.keywords.base import TextMap + TextMap.DATA_FOLDER = '../StarRailData' GenerateAssignment()() diff --git a/module/base/button.py b/module/base/button.py index cae5fc18e..153df61df 100644 --- a/module/base/button.py +++ b/module/base/button.py @@ -55,8 +55,13 @@ class Button(Resource): def image(self): return load_image(self.file, self.area) + @cached_property + def image_binary(self): + return rgb2gray(self.image) + def resource_release(self): del_cached_property(self, 'image') + del_cached_property(self, 'image_binary') self.clear_offset() def __str__(self): @@ -113,6 +118,29 @@ class Button(Resource): self._button_offset = np.array(point) + self.search[:2] - self.area[:2] return sim > similarity + def match_template_binary(self, image, similarity=0.85, direct_match=False) -> bool: + """ + Detects assets by template matching. + + To Some buttons, its location may not be static, `_button_offset` will be set. + + Args: + image: Screenshot. + similarity (float): 0-1. + direct_match: True to ignore `self.search` + + Returns: + bool. + """ + if not direct_match: + image = crop(image, self.search, copy=False) + image = rgb2gray(image) + res = cv2.matchTemplate(self.image_binary, image, cv2.TM_CCOEFF_NORMED) + _, sim, _, point = cv2.minMaxLoc(res) + + self._button_offset = np.array(point) + self.search[:2] - self.area[:2] + return sim > similarity + def match_multi_template(self, image, similarity=0.85, direct_match=False): """ Detects assets by template matching, return multiple reults @@ -225,6 +253,13 @@ class ButtonWrapper(Resource): return True return False + def match_template_binary(self, image, similarity=0.85, direct_match=False) -> bool: + for assets in self.buttons: + if assets.match_template_binary(image, similarity=similarity, direct_match=direct_match): + self._matched_button = assets + return True + return False + def match_multi_template(self, image, similarity=0.85, threshold=5, direct_match=False): """ Detects assets by template matching, return multiple results diff --git a/module/config/argument/args.json b/module/config/argument/args.json index b37292f5e..64f0ee68d 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1076,100 +1076,100 @@ "type": "select", "value": "Nameless_Land_Nameless_People", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Name_2": { "type": "select", "value": "Akashic_Records", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Name_3": { "type": "select", "value": "The_Invisible_Hand", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Name_4": { "type": "select", "value": "Nine_Billion_Names", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Duration": { diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 798eff74a..efb301bda 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -119,10 +119,10 @@ class GeneratedConfig: BattlePassStorage_BattlePassQuestTrailblazePower = {} # Group `Assignment` - Assignment_Name_1 = 'Nameless_Land_Nameless_People' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver - Assignment_Name_2 = 'Akashic_Records' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver - Assignment_Name_3 = 'The_Invisible_Hand' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver - Assignment_Name_4 = 'Nine_Billion_Names' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver + Assignment_Name_1 = 'Nameless_Land_Nameless_People' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted + Assignment_Name_2 = 'Akashic_Records' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted + Assignment_Name_3 = 'The_Invisible_Hand' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted + Assignment_Name_4 = 'Nine_Billion_Names' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted Assignment_Duration = 20 # 4, 8, 12, 20 Assignment_Event = True Assignment_Assignment = {} diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index a01b95725..2c6f0adc4 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -809,94 +809,94 @@ "Name_1": { "name": "Assignment 1 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Name_2": { "name": "Assignment 2 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Name_3": { "name": "Assignment 3 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Name_4": { "name": "Assignment 4 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Duration": { "name": "Dispatch Duration", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 66c665879..058d97844 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -809,94 +809,94 @@ "Name_1": { "name": "Preferencia de Encargo 1", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Name_2": { "name": "Preferencia de Encargo 2", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Name_3": { "name": "Preferencia de Encargo 3", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Name_4": { "name": "Preferencia de Encargo 4", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Duration": { "name": "Duración del encargo", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 82f69b042..436e36592 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -809,94 +809,94 @@ "Name_1": { "name": "依頼 1", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Name_2": { "name": "依頼 2", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Name_3": { "name": "依頼 3", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Name_4": { "name": "依頼 4", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Duration": { "name": "派遣時間", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 37b6e7e84..a0a857a7a 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -809,94 +809,94 @@ "Name_1": { "name": "第1个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Name_2": { "name": "第2个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Name_3": { "name": "第3个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Name_4": { "name": "第4个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Duration": { "name": "派遣时长", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index b7e6c08ca..f3eb18c55 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -809,94 +809,94 @@ "Name_1": { "name": "第1個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Name_2": { "name": "第2個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Name_3": { "name": "第3個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Name_4": { "name": "第4個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Duration": { "name": "派遣時間", diff --git a/module/ocr/keyword.py b/module/ocr/keyword.py index 82fcdf369..31bb8cdc3 100644 --- a/module/ocr/keyword.py +++ b/module/ocr/keyword.py @@ -7,7 +7,7 @@ import module.config.server as server from module.exception import ScriptError # ord('.') = 65294 -REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•●〇°*※\-—–-/\\\n\t()\[\]()「」『』【】《》[]]') +REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•●〇°*※\-—–-/\\|丨\n\t()\[\]()「」『』【】《》[]]') def parse_name(n): diff --git a/module/ocr/ocr.py b/module/ocr/ocr.py index f22d2ff72..3c5b86e64 100644 --- a/module/ocr/ocr.py +++ b/module/ocr/ocr.py @@ -422,9 +422,12 @@ class Duration(Ocr): class OcrWhiteLetterOnComplexBackground(Ocr): + white_preprocess = True + def pre_process(self, image): - image = extract_white_letters(image, threshold=255) - image = cv2.merge([image, image, image]) + if self.white_preprocess: + image = extract_white_letters(image, threshold=255) + image = cv2.merge([image, image, image]) return image def detect_and_ocr(self, *args, **kwargs): diff --git a/route/rogue/Combat/Herta_SupplyZone_F2.py b/route/rogue/Combat/Herta_SupplyZone_F2.py index 95a9e606e..46357df1f 100644 --- a/route/rogue/Combat/Herta_SupplyZone_F2.py +++ b/route/rogue/Combat/Herta_SupplyZone_F2.py @@ -15,6 +15,7 @@ class Route(RouteBase): | enemy1 | Waypoint((46.2, 328.2)), | 12.6 | 8 | | item2 | Waypoint((42.4, 299.0)), | 352.8 | 348 | | door2 | Waypoint((46.4, 284.5)), | 4.2 | 1 | + | door2end | Waypoint((47.2, 274.8)), | 11.1 | 4 | | enemy2left | Waypoint((31.2, 248.8)), | 183.8 | 84 | | enemy2right | Waypoint((55.2, 247.2)), | 96.7 | 91 | | item3 | Waypoint((68.5, 226.5)), | 30.2 | 29 | @@ -32,6 +33,7 @@ class Route(RouteBase): enemy1 = Waypoint((46.2, 328.2)) item2 = Waypoint((42.4, 299.0)) door2 = Waypoint((46.4, 284.5)) + door2end = Waypoint((47.2, 274.8)) enemy2left = Waypoint((31.2, 248.8)) enemy2right = Waypoint((55.2, 247.2)) item3 = Waypoint((68.5, 226.5)) @@ -47,6 +49,7 @@ class Route(RouteBase): # self.clear_item(item2) self.clear_enemy( door2.set_threshold(3), + door2end.set_threshold(3), # Go through door enemy2left, enemy2right.straight_run(), @@ -58,6 +61,7 @@ class Route(RouteBase): self.clear_enemy( enemy3.straight_run(), ) + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.243, (57.2, 351.6)) def Herta_SupplyZone_F2_X397Y233(self): """ diff --git a/route/rogue/Combat/Jarilo_BackwaterPass_F1.py b/route/rogue/Combat/Jarilo_BackwaterPass_F1.py index 12db93cf2..a3af0a87d 100644 --- a/route/rogue/Combat/Jarilo_BackwaterPass_F1.py +++ b/route/rogue/Combat/Jarilo_BackwaterPass_F1.py @@ -63,7 +63,7 @@ class Route(RouteBase): ) # 2 self.clear_enemy( - node2, + node2.set_threshold(3), enemy2.straight_run(), ) # 3 @@ -116,6 +116,43 @@ class Route(RouteBase): self.clear_enemy(enemy2left.straight_run()) self.clear_enemy(enemy3.straight_run()) + def Jarilo_BackwaterPass_F1_X503Y736(self): + """ + | Waypoint | Position | Direction | Rotation | + | ---------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((507.2, 733.7)), | 6.7 | 4 | + | enemy1 | Waypoint((507.0, 644.0)), | 12.6 | 6 | + | enemy2left | Waypoint((536.0, 630.5)), | 48.1 | 43 | + | enemy3 | Waypoint((557.0, 585.2)), | 114.1 | 6 | + | exit_ | Waypoint((557.0, 585.2)), | 114.1 | 6 | + | exit1 | Waypoint((549.5, 575.4)), | 356.2 | 354 | + | exit2 | Waypoint((565.4, 575.6)), | 4.1 | 359 | + """ + self.map_init(plane=Jarilo_BackwaterPass, floor="F1", position=(503.2, 736.9)) + self.register_domain_exit( + Waypoint((557.0, 585.2)), end_rotation=6, + left_door=Waypoint((549.5, 575.4)), right_door=Waypoint((565.4, 575.6))) + enemy1 = Waypoint((507.0, 644.0)) + enemy2left = Waypoint((536.0, 630.5)) + enemy3 = Waypoint((557.0, 585.2)) + # ===== End of generated waypoints ===== + + self.clear_enemy(enemy1) + self.clear_enemy(enemy2left.straight_run()) + self.clear_enemy(enemy3.straight_run()) + + """ + Notes + Herta_SupplyZone_F2_X397Y239 is the same as Herta_SupplyZone_F2_X397Y233 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Combat_Jarilo_BackwaterPass_F1_X507Y733', 0.26, (503.2, 736.9)), + # ('Combat_Luofu_ArtisanshipCommission_F1_X41Y640', 0.18, (50.7, 644.4)), + # ('Combat_Luofu_DivinationCommission_F1_X737Y372', 0.174, (717.2, 355.4)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.168, (46.5, 370.0)) + # ] + def Jarilo_BackwaterPass_F1_X555Y643(self): """ | Waypoint | Position | Direction | Rotation | diff --git a/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py b/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py index 004217fb9..080668a9e 100644 --- a/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py +++ b/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py @@ -31,6 +31,7 @@ class Route(RouteBase): | ----------- | -------------------------- | --------- | -------- | | spawn | Waypoint((201.2, 1071.4)), | 6.7 | 4 | | enemy1right | Waypoint((200.3, 1032.4)), | 342.0 | 343 | + | node1 | Waypoint((194.6, 1023.4)), | 109.3 | 294 | | enemy1left | Waypoint((168.6, 1022.3)), | 279.8 | 89 | | node2 | Waypoint((118.4, 1019.0)), | 282.9 | 285 | | enemy2left | Waypoint((105.2, 1012.0)), | 317.9 | 315 | @@ -46,6 +47,7 @@ class Route(RouteBase): Waypoint((103.4, 919.2)), end_rotation=4, left_door=Waypoint((98.8, 908.9)), right_door=Waypoint((111.4, 909.8))) enemy1right = Waypoint((200.3, 1032.4)) + node1 = Waypoint((194.6, 1023.4)) enemy1left = Waypoint((168.6, 1022.3)) node2 = Waypoint((118.4, 1019.0)) enemy2left = Waypoint((105.2, 1012.0)) @@ -57,20 +59,22 @@ class Route(RouteBase): # 1 self.rotation_set(315) self.clear_enemy( - enemy1right.set_threshold(5), - enemy1left.set_threshold(5), + enemy1right.set_threshold(3), + node1.set_threshold(3), + enemy1left.set_threshold(3), ) # 2 self.clear_enemy( - enemy1left.set_threshold(5), + enemy1left.set_threshold(3), node2.set_threshold(5), enemy2left, enemy2right, ) # 3 + self.rotation_set(0) self.clear_enemy( - node3.set_threshold(5), - enemy3.straight_run(), + node3.set_threshold(3), + enemy3, ) def Jarilo_CorridorofFadingEchoes_F1_X266Y457(self): diff --git a/route/rogue/Combat/Luofu_Cloudford_F1.py b/route/rogue/Combat/Luofu_Cloudford_F1.py index a8c5fde6e..e320e3973 100644 --- a/route/rogue/Combat/Luofu_Cloudford_F1.py +++ b/route/rogue/Combat/Luofu_Cloudford_F1.py @@ -256,3 +256,58 @@ class Route(RouteBase): ) self.clear_item(item4) self.clear_enemy(enemy4) + + def Luofu_Cloudford_F1_X432Y685(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((435.4, 669.2)), | 6.7 | 4 | + | item1 | Waypoint((432.2, 628.3)), | 2.7 | 357 | + | enemy1 | Waypoint((428.6, 598.8)), | 8.0 | 177 | + | node2 | Waypoint((421.2, 590.8)), | 44.2 | 285 | + | node3 | Waypoint((366.6, 588.2)), | 274.2 | 274 | + | enemy3 | Waypoint((344.9, 590.4)), | 191.8 | 357 | + | item4 | Waypoint((309.6, 580.2)), | 290.1 | 281 | + | enemy4 | Waypoint((271.3, 585.5)), | 285.0 | 274 | + | exit_ | Waypoint((271.3, 585.5)), | 285.0 | 274 | + | exit1 | Waypoint((267.9, 592.3)), | 275.9 | 274 | + | exit2 | Waypoint((267.8, 580.0)), | 275.8 | 274 | + """ + self.map_init(plane=Luofu_Cloudford, floor="F1", position=(432.8, 685.1)) + self.register_domain_exit( + Waypoint((271.3, 585.5)), end_rotation=274, + left_door=Waypoint((267.9, 592.3)), right_door=Waypoint((267.8, 580.0))) + item1 = Waypoint((432.2, 628.3)) + enemy1 = Waypoint((428.6, 598.8)) + node2 = Waypoint((421.2, 590.8)) + node3 = Waypoint((366.6, 588.2)) + enemy3 = Waypoint((344.9, 590.4)) + item4 = Waypoint((309.6, 580.2)) + enemy4 = Waypoint((271.3, 585.5)) + # ===== End of generated waypoints ===== + + self.clear_item(item1) + self.clear_enemy(enemy1) + # Go through bridges + self.rotation_set(270) + self.minimap.lock_rotation(270) + self.clear_enemy( + node2.set_threshold(3), + node3.set_threshold(3), + enemy3, + ) + self.clear_item(item4) + self.clear_enemy(enemy4) + + """ + Notes + Luofu_Cloudford_F1_X435Y685 is the same as Luofu_Cloudford_F1_X435Y669 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Combat_Luofu_Cloudford_F1_X433Y617', 0.195, (432.8, 668.4)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.18, (24.2, 372.2)), + # ('Combat_Luofu_Cloudford_F1_X435Y669', 0.18, (432.8, 685.1)) + # ] + # (432.9, 684.9) + # ('Combat_Luofu_Cloudford_F1_X435Y669', 0.172, (432.8, 685.0)) diff --git a/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py b/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py index db8fb74cc..9438b33b1 100644 --- a/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py +++ b/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py @@ -30,6 +30,36 @@ class Route(RouteBase): but for wrong spawn point detected """ + def Jarilo_CorridorofFadingEchoes_F1_X415Y953(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((415.5, 947.9)), | 96.7 | 91 | + | enemy | Waypoint((464.0, 953.0)), | 96.8 | 94 | + | reward | Waypoint((472.7, 958.5)), | 214.6 | 114 | + | exit_ | Waypoint((480.0, 944.0)), | 92.7 | 84 | + """ + self.map_init(plane=Jarilo_CorridorofFadingEchoes, floor="F1", position=(415.4, 953.3)) + enemy = Waypoint((464.0, 953.0)) + reward = Waypoint((472.7, 958.5)) + exit_ = Waypoint((480.0, 944.0)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Jarilo_CorridorofFadingEchoes_F1_X415Y953 is the same as Jarilo_CorridorofFadingEchoes_F1_X415Y947 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y933', 0.169, (415.4, 953.3)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y947', 0.169, (415.4, 953.3)), + # ('Elite_Herta_SupplyZone_F2_X680Y247', 0.162, (738.4, 252.2)) + # ] + def Jarilo_CorridorofFadingEchoes_F1_X415Y947(self): """ | Waypoint | Position | Direction | Rotation | diff --git a/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py b/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py index c563530d0..d376ff325 100644 --- a/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py +++ b/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py @@ -24,6 +24,36 @@ class Route(RouteBase): self.domain_single_exit(exit_) # ===== End of generated waypoints ===== + def Luofu_ArtisanshipCommission_F1_X391Y493(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((385.2, 494.6)), | 94.2 | 91 | + | enemy | Waypoint((444.2, 490.5)), | 94.2 | 91 | + | reward | Waypoint((448.6, 497.2)), | 149.7 | 91 | + | exit_ | Waypoint((458.0, 483.7)), | 94.2 | 91 | + """ + self.map_init(plane=Luofu_ArtisanshipCommission, floor="F1", position=(391.1, 493.2)) + enemy = Waypoint((444.2, 490.5)) + reward = Waypoint((448.6, 497.2)) + exit_ = Waypoint((458.0, 483.7)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Luofu_ArtisanshipCommission_F1_X391Y493 is the same as Luofu_ArtisanshipCommission_F1_X385Y494 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Luofu_ArtisanshipCommission_F1_X385Y494', 0.182, (391.1, 493.2)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y933', 0.157, (364.0, 951.0)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y947', 0.157, (364.0, 951.0)) + # ] + def Luofu_ArtisanshipCommission_F1_X504Y493(self): """ | Waypoint | Position | Direction | Rotation | diff --git a/route/rogue/Elite/Luofu_Cloudford_F1.py b/route/rogue/Elite/Luofu_Cloudford_F1.py index 2ade4c4ab..6d9c7d26a 100644 --- a/route/rogue/Elite/Luofu_Cloudford_F1.py +++ b/route/rogue/Elite/Luofu_Cloudford_F1.py @@ -25,3 +25,34 @@ class Route(RouteBase): self.domain_reward(reward) self.domain_single_exit(exit_) # ===== End of generated waypoints ===== + + @locked_rotation(0) + def Luofu_Cloudford_F1_X342Y1003(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | -------------------------- | --------- | -------- | + | spawn | Waypoint((337.3, 1003.4)), | 6.7 | 4 | + | enemy | Waypoint((336.2, 962.2)), | 6.7 | 4 | + | reward | Waypoint((342.9, 950.8)), | 44.2 | 31 | + | exit_ | Waypoint((328.8, 942.8)), | 316.1 | 331 | + """ + self.map_init(plane=Luofu_Cloudford, floor="F1", position=(342.3, 1003.4)) + enemy = Waypoint((336.2, 962.2)) + reward = Waypoint((342.9, 950.8)) + exit_ = Waypoint((328.8, 942.8)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Luofu_Cloudford_F1_X342Y1003 is the same as Luofu_Cloudford_F1_X337Y1003 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Luofu_Cloudford_F1_X337Y1003', 0.169, (342.3, 1002.7)), + # ('Elite_Luofu_ArtisanshipCommission_F1_X504Y493', 0.106, (519.3, 452.7)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y933', 0.104, (433.8, 982.0)) + # ] diff --git a/route/rogue/Elite/Luofu_StargazerNavalia_F1.py b/route/rogue/Elite/Luofu_StargazerNavalia_F1.py index ca696d3aa..cc1d221f7 100644 --- a/route/rogue/Elite/Luofu_StargazerNavalia_F1.py +++ b/route/rogue/Elite/Luofu_StargazerNavalia_F1.py @@ -25,3 +25,34 @@ class Route(RouteBase): self.domain_reward(reward) self.domain_single_exit(exit_) # ===== End of generated waypoints ===== + + @locked_rotation(90) + def Luofu_StargazerNavalia_F1_X617Y511(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((617.5, 511.5)), | 96.7 | 91 | + | enemy | Waypoint((664.6, 512.6)), | 96.8 | 94 | + | reward | Waypoint((677.1, 521.2)), | 212.8 | 108 | + | exit_ | Waypoint((684.6, 505.0)), | 91.3 | 82 | + """ + self.map_init(plane=Luofu_StargazerNavalia, floor="F1", position=(617.5, 511.5)) + enemy = Waypoint((664.6, 512.6)) + reward = Waypoint((677.1, 521.2)) + exit_ = Waypoint((684.6, 505.0)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Herta_SupplyZone_F2_X397Y239 is the same as Herta_SupplyZone_F2_X397Y233 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Luofu_StargazerNavalia_F1_X617Y511', 0.338, (621.0, 507.0)), + # ('Elite_Luofu_ArtisanshipCommission_F1_X385Y494', 0.203, (329.2, 492.8)), + # ('Elite_Jarilo_SilvermaneGuardRestrictedZone_F1_X225Y425', 0.181, (224.8, 423.2)) + # ] diff --git a/route/rogue/route.json b/route/rogue/route.json index 2987b3112..6f78834c5 100644 --- a/route/rogue/route.json +++ b/route/rogue/route.json @@ -241,6 +241,17 @@ ], "domain": "Combat" }, + { + "name": "Combat_Jarilo_BackwaterPass_F1_X503Y736", + "route": "route.rogue.Combat.Jarilo_BackwaterPass_F1:Jarilo_BackwaterPass_F1_X503Y736", + "plane": "Jarilo_BackwaterPass", + "floor": "F1", + "position": [ + 503.2, + 736.9 + ], + "domain": "Combat" + }, { "name": "Combat_Jarilo_BackwaterPass_F1_X555Y643", "route": "route.rogue.Combat.Jarilo_BackwaterPass_F1:Jarilo_BackwaterPass_F1_X555Y643", @@ -901,6 +912,17 @@ ], "domain": "Combat" }, + { + "name": "Combat_Luofu_Cloudford_F1_X432Y685", + "route": "route.rogue.Combat.Luofu_Cloudford_F1:Luofu_Cloudford_F1_X432Y685", + "plane": "Luofu_Cloudford", + "floor": "F1", + "position": [ + 432.8, + 685.1 + ], + "domain": "Combat" + }, { "name": "Combat_Luofu_Cloudford_F1Rogue_X59Y405", "route": "route.rogue.Combat.Luofu_Cloudford_F1Rogue:Luofu_Cloudford_F1Rogue_X59Y405", @@ -1286,6 +1308,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y953", + "route": "route.rogue.Elite.Jarilo_CorridorofFadingEchoes_F1:Jarilo_CorridorofFadingEchoes_F1_X415Y953", + "plane": "Jarilo_CorridorofFadingEchoes", + "floor": "F1", + "position": [ + 415.4, + 953.3 + ], + "domain": "Elite" + }, { "name": "Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y947", "route": "route.rogue.Elite.Jarilo_CorridorofFadingEchoes_F1:Jarilo_CorridorofFadingEchoes_F1_X415Y947", @@ -1385,6 +1418,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Luofu_ArtisanshipCommission_F1_X391Y493", + "route": "route.rogue.Elite.Luofu_ArtisanshipCommission_F1:Luofu_ArtisanshipCommission_F1_X391Y493", + "plane": "Luofu_ArtisanshipCommission", + "floor": "F1", + "position": [ + 391.1, + 493.2 + ], + "domain": "Elite" + }, { "name": "Elite_Luofu_ArtisanshipCommission_F1_X504Y493", "route": "route.rogue.Elite.Luofu_ArtisanshipCommission_F1:Luofu_ArtisanshipCommission_F1_X504Y493", @@ -1407,6 +1451,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Luofu_Cloudford_F1_X342Y1003", + "route": "route.rogue.Elite.Luofu_Cloudford_F1:Luofu_Cloudford_F1_X342Y1003", + "plane": "Luofu_Cloudford", + "floor": "F1", + "position": [ + 342.3, + 1003.4 + ], + "domain": "Elite" + }, { "name": "Elite_Luofu_DivinationCommission_F2_X338Y345", "route": "route.rogue.Elite.Luofu_DivinationCommission_F2:Luofu_DivinationCommission_F2_X338Y345", @@ -1440,6 +1495,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Luofu_StargazerNavalia_F1_X617Y511", + "route": "route.rogue.Elite.Luofu_StargazerNavalia_F1:Luofu_StargazerNavalia_F1_X617Y511", + "plane": "Luofu_StargazerNavalia", + "floor": "F1", + "position": [ + 617.5, + 511.5 + ], + "domain": "Elite" + }, { "name": "Occurrence_Herta_StorageZone_F1_X273Y93", "route": "route.rogue.Occurrence.Herta_StorageZone_F1:Herta_StorageZone_F1_X273Y93", diff --git a/tasks/assignment/assets/assets_assignment_dispatch.py b/tasks/assignment/assets/assets_assignment_dispatch.py index 25758c969..c1965a3f3 100644 --- a/tasks/assignment/assets/assets_assignment_dispatch.py +++ b/tasks/assignment/assets/assets_assignment_dispatch.py @@ -34,40 +34,40 @@ CHARACTER_1 = ButtonWrapper( name='CHARACTER_1', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_1.png', - area=(110, 202, 202, 309), - search=(90, 182, 222, 329), + area=(96, 200, 188, 307), + search=(76, 180, 208, 327), color=(153, 141, 159), - button=(110, 202, 202, 309), + button=(96, 200, 188, 307), ), ) CHARACTER_1_SELECTED = ButtonWrapper( name='CHARACTER_1_SELECTED', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png', - area=(107, 199, 126, 217), - search=(87, 179, 146, 237), + area=(93, 197, 112, 215), + search=(73, 177, 132, 235), color=(217, 218, 216), - button=(107, 199, 126, 217), + button=(93, 197, 112, 215), ), ) CHARACTER_2 = ButtonWrapper( name='CHARACTER_2', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_2.png', - area=(222, 202, 314, 309), - search=(202, 182, 334, 329), + area=(208, 200, 300, 307), + search=(188, 180, 320, 327), color=(120, 120, 138), - button=(222, 202, 314, 309), + button=(208, 200, 300, 307), ), ) CHARACTER_2_SELECTED = ButtonWrapper( name='CHARACTER_2_SELECTED', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png', - area=(219, 199, 238, 217), - search=(199, 179, 258, 237), + area=(205, 197, 224, 215), + search=(185, 177, 244, 235), color=(206, 207, 204), - button=(219, 199, 238, 217), + button=(205, 197, 224, 215), ), ) CHARACTER_LIST = ButtonWrapper( diff --git a/tasks/assignment/keywords/entry.py b/tasks/assignment/keywords/entry.py index cab71c000..49fc7f34b 100644 --- a/tasks/assignment/keywords/entry.py +++ b/tasks/assignment/keywords/entry.py @@ -3,71 +3,8 @@ from .classes import AssignmentEntry # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.keyword_extract ``` -Nine_Billion_Names = AssignmentEntry( - id=1, - name='Nine_Billion_Names', - cn='九十亿个名字', - cht='九十億個名字', - en='Nine Billion Names', - jp='九十億の御名', - es='Nueve mil millones de nombres', -) -Destruction_of_the_Destroyer = AssignmentEntry( - id=2, - name='Destruction_of_the_Destroyer', - cn='毁灭者的覆灭', - cht='毀滅者的覆滅', - en='Destruction of the Destroyer', - jp='壊滅者の覆没', - es='La destrucción del destructor', -) -Winter_Soldiers = AssignmentEntry( - id=3, - name='Winter_Soldiers', - cn='寒冬的战士们', - cht='寒冬的戰士們', - en='Winter Soldiers', - jp='寒冬の戦士たち', - es='Los guerreros del invierno', -) -Born_to_Obey = AssignmentEntry( - id=4, - name='Born_to_Obey', - cn='生而服从', - cht='生而服從', - en='Born to Obey', - jp='生まれながらに服従する', - es='Creados para obedecer', -) -Root_Out_the_Turpitude = AssignmentEntry( - id=5, - name='Root_Out_the_Turpitude', - cn='根除恶孽', - cht='根除惡孽', - en='Root Out the Turpitude', - jp='悪孽を根絶やしに', - es='La raíz del mal', -) -Fire_Lord_Inflames_Blades_of_War = AssignmentEntry( - id=6, - name='Fire_Lord_Inflames_Blades_of_War', - cn='火帝动炉销剑戟', - cht='火帝動爐銷劍戟', - en='Fire Lord Inflames Blades of War', - jp='剣戟を焼却する火帝炉', - es='Prendan los fuelles, fundan las armas', -) -A_Startling_Night_Terror = AssignmentEntry( - id=7, - name='A_Startling_Night_Terror', - cn='劫梦惊魂', - cht='劫夢驚魂', - en='A Startling Night Terror', - jp='魂震える悪夢', - es='Pesadilla aterradora', -) Tranquility_of_Vimala_bhumi = AssignmentEntry( - id=8, + id=1, name='Tranquility_of_Vimala_bhumi', cn='离垢清净', cht='離垢清淨', @@ -75,17 +12,71 @@ Tranquility_of_Vimala_bhumi = AssignmentEntry( jp='離垢清浄', es='Limpieza y purificación', ) -Nameless_Land_Nameless_People = AssignmentEntry( - id=9, - name='Nameless_Land_Nameless_People', - cn='无名之地,无名之人', - cht='無名之地,無名之人', - en='Nameless Land, Nameless People', - jp='無名の地、無名の人', - es='Lugar anónimo, personas anónimas', +A_Startling_Night_Terror = AssignmentEntry( + id=2, + name='A_Startling_Night_Terror', + cn='劫梦惊魂', + cht='劫夢驚魂', + en='A Startling Night Terror', + jp='魂震える悪夢', + es='Pesadilla aterradora', +) +Fire_Lord_Inflames_Blades_of_War = AssignmentEntry( + id=3, + name='Fire_Lord_Inflames_Blades_of_War', + cn='火帝动炉销剑戟', + cht='火帝動爐銷劍戟', + en='Fire Lord Inflames Blades of War', + jp='剣戟を焼却する火帝炉', + es='Prendan los fuelles, fundan las armas', +) +Root_Out_the_Turpitude = AssignmentEntry( + id=4, + name='Root_Out_the_Turpitude', + cn='根除恶孽', + cht='根除惡孽', + en='Root Out the Turpitude', + jp='悪孽を根絶やしに', + es='La raíz del mal', +) +Born_to_Obey = AssignmentEntry( + id=5, + name='Born_to_Obey', + cn='生而服从', + cht='生而服從', + en='Born to Obey', + jp='生まれながらに服従する', + es='Creados para obedecer', +) +Winter_Soldiers = AssignmentEntry( + id=6, + name='Winter_Soldiers', + cn='寒冬的战士们', + cht='寒冬的戰士們', + en='Winter Soldiers', + jp='寒冬の戦士たち', + es='Los guerreros del invierno', +) +Destruction_of_the_Destroyer = AssignmentEntry( + id=7, + name='Destruction_of_the_Destroyer', + cn='毁灭者的覆灭', + cht='毀滅者的覆滅', + en='Destruction of the Destroyer', + jp='壊滅者の覆没', + es='La destrucción del destructor', +) +Nine_Billion_Names = AssignmentEntry( + id=8, + name='Nine_Billion_Names', + cn='九十亿个名字', + cht='九十億個名字', + en='Nine Billion Names', + jp='九十億の御名', + es='Nueve mil millones de nombres', ) Akashic_Records = AssignmentEntry( - id=10, + id=9, name='Akashic_Records', cn='阿卡夏记录', cht='阿卡夏紀錄', @@ -93,6 +84,15 @@ Akashic_Records = AssignmentEntry( jp='アーカーシャの記録', es='Los Registros de Akasha', ) +Nameless_Land_Nameless_People = AssignmentEntry( + id=10, + name='Nameless_Land_Nameless_People', + cn='无名之地,无名之人', + cht='無名之地,無名之人', + en='Nameless Land, Nameless People', + jp='無名の地、無名の人', + es='Lugar anónimo, personas anónimas', +) The_Invisible_Hand = AssignmentEntry( id=11, name='The_Invisible_Hand', @@ -102,71 +102,8 @@ The_Invisible_Hand = AssignmentEntry( jp='見えざる手', es='La mano invisible', ) -Abandoned_and_Insulted = AssignmentEntry( - id=12, - name='Abandoned_and_Insulted', - cn='被废弃与损害的', - cht='被廢棄與損害的', - en='Abandoned and Insulted', - jp='捨てられしものと傷つけられしもの', - es='Abandonado e insultado', -) -Spring_of_Life = AssignmentEntry( - id=13, - name='Spring_of_Life', - cn='生命之泉', - cht='生命之泉', - en='Spring of Life', - jp='生命の泉', - es='La fuente de la vida', -) -The_Land_of_Gold = AssignmentEntry( - id=14, - name='The_Land_of_Gold', - cn='黄金大地', - cht='黃金大地', - en='The Land of Gold', - jp='黄金の大地', - es='Tierra de oportunidades', -) -The_Blossom_in_the_Storm = AssignmentEntry( - id=15, - name='The_Blossom_in_the_Storm', - cn='风暴中怒放的花', - cht='風暴中怒放的花', - en='The Blossom in the Storm', - jp='嵐の中で咲き誇る花', - es='Flores en la tormenta', -) -Legend_of_the_Puppet_Master = AssignmentEntry( - id=16, - name='Legend_of_the_Puppet_Master', - cn='偃师传说', - cht='偃師傳說', - en='Legend of the Puppet Master', - jp='傀儡師伝説', - es='La leyenda del titiritero', -) -The_Wages_of_Humanity = AssignmentEntry( - id=17, - name='The_Wages_of_Humanity', - cn='赡养人类', - cht='贍養人類', - en='The Wages of Humanity', - jp='人類扶養', - es='La paga de la humanidad', -) -Fragments_of_Illusory_Dreams = AssignmentEntry( - id=18, - name='Fragments_of_Illusory_Dreams', - cn='幻梦的残片', - cht='幻夢的殘片', - en='Fragments of Illusory Dreams', - jp='幻夢の残片', - es='Fragmentos de sueños ilusorios', -) Scalpel_and_Screwdriver = AssignmentEntry( - id=19, + id=12, name='Scalpel_and_Screwdriver', cn='手术刀与螺丝刀', cht='手術刀與螺絲起子', @@ -174,3 +111,66 @@ Scalpel_and_Screwdriver = AssignmentEntry( jp='メスとスクリュードライバー', es='Bisturí y destornillador', ) +The_Wages_of_Humanity = AssignmentEntry( + id=13, + name='The_Wages_of_Humanity', + cn='赡养人类', + cht='贍養人類', + en='The Wages of Humanity', + jp='人類扶養', + es='La paga de la humanidad', +) +Legend_of_the_Puppet_Master = AssignmentEntry( + id=14, + name='Legend_of_the_Puppet_Master', + cn='偃师传说', + cht='偃師傳說', + en='Legend of the Puppet Master', + jp='傀儡師伝説', + es='La leyenda del titiritero', +) +The_Land_of_Gold = AssignmentEntry( + id=15, + name='The_Land_of_Gold', + cn='黄金大地', + cht='黃金大地', + en='The Land of Gold', + jp='黄金の大地', + es='Tierra de oportunidades', +) +Spring_of_Life = AssignmentEntry( + id=16, + name='Spring_of_Life', + cn='生命之泉', + cht='生命之泉', + en='Spring of Life', + jp='生命の泉', + es='La fuente de la vida', +) +Fragments_of_Illusory_Dreams = AssignmentEntry( + id=17, + name='Fragments_of_Illusory_Dreams', + cn='幻梦的残片', + cht='幻夢的殘片', + en='Fragments of Illusory Dreams', + jp='幻夢の残片', + es='Fragmentos de sueños ilusorios', +) +The_Blossom_in_the_Storm = AssignmentEntry( + id=18, + name='The_Blossom_in_the_Storm', + cn='风暴中怒放的花', + cht='風暴中怒放的花', + en='The Blossom in the Storm', + jp='嵐の中で咲き誇る花', + es='Flores en la tormenta', +) +Abandoned_and_Insulted = AssignmentEntry( + id=19, + name='Abandoned_and_Insulted', + cn='被废弃与损害的', + cht='被廢棄與損害的', + en='Abandoned and Insulted', + jp='捨てられしものと傷つけられしもの', + es='Abandonado e insultado', +) diff --git a/tasks/assignment/keywords/entry_detailed.py b/tasks/assignment/keywords/entry_detailed.py index 418e8f578..f295f67e7 100644 --- a/tasks/assignment/keywords/entry_detailed.py +++ b/tasks/assignment/keywords/entry_detailed.py @@ -3,71 +3,8 @@ from .classes import AssignmentEntryDetailed # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.keyword_extract ``` -Nine_Billion_Names = AssignmentEntryDetailed( - id=1, - name='Nine_Billion_Names', - cn='熄灭原核(九十亿个名字)', - cht='熄滅原核(九十億個名字)', - en='Extinguished Core (Nine Billion Names)', - jp='消滅した原核(九十億の御名)', - es='Núcleo apagado (Nueve mil millones de nombres)', -) -Destruction_of_the_Destroyer = AssignmentEntryDetailed( - id=2, - name='Destruction_of_the_Destroyer', - cn='掠夺的本能(毁灭者的覆灭)', - cht='掠奪的本能(毀滅者的覆滅)', - en="Thief's Instinct (Destruction of the Destroyer)", - jp='略奪の本能(壊滅者の覆没)', - es='Instinto del ladrón (La destrucción del destructor)', -) -Winter_Soldiers = AssignmentEntryDetailed( - id=3, - name='Winter_Soldiers', - cn='铁卫扣饰(寒冬的战士们)', - cht='鐵衛扣飾(寒冬的戰士們)', - en='Silvermane Badge (Winter Soldiers)', - jp='シルバーメインの釦(寒冬の戦士たち)', - es='Pin del guardia (Los guerreros del invierno)', -) -Born_to_Obey = AssignmentEntryDetailed( - id=4, - name='Born_to_Obey', - cn='古代零件(生而服从)', - cht='古代零件(生而服從)', - en='Ancient Part (Born to Obey)', - jp='古代パーツ(生まれながらに服従する)', - es='Componente antiguo (Creados para obedecer)', -) -Root_Out_the_Turpitude = AssignmentEntryDetailed( - id=5, - name='Root_Out_the_Turpitude', - cn='永寿幼芽(根除恶孽)', - cht='永壽幼芽(根除惡孽)', - en='Immortal Scionette (Root Out the Turpitude)', - jp='永寿の萌芽(悪孽を根絶やしに)', - es='Brote verde inmortal (La raíz del mal)', -) -Fire_Lord_Inflames_Blades_of_War = AssignmentEntryDetailed( - id=6, - name='Fire_Lord_Inflames_Blades_of_War', - cn='工造机杼(火帝动炉销剑戟)', - cht='工造機杼(火帝動爐銷劍戟)', - en="Artifex's Module (Fire Lord Inflames Blades of War)", - jp='工造機関(剣戟を焼却する火帝炉)', - es='Componente artificial mecánico (Prendan los fuelles, fundan las armas)', -) -A_Startling_Night_Terror = AssignmentEntryDetailed( - id=7, - name='A_Startling_Night_Terror', - cn='蓄梦元件(劫梦惊魂)', - cht='蓄夢元件(劫夢驚魂)', - en='Dream Collection Component (A Startling Night Terror)', - jp='ドリームコレクションパーツ(魂震える悪夢)', - es='Componente del acumulador de sueños (Pesadilla aterradora)', -) Tranquility_of_Vimala_bhumi = AssignmentEntryDetailed( - id=8, + id=1, name='Tranquility_of_Vimala_bhumi', cn='思绪末屑(离垢清净)', cht='思緒末屑(離垢清淨)', @@ -75,17 +12,71 @@ Tranquility_of_Vimala_bhumi = AssignmentEntryDetailed( jp='思考の粉末(離垢清浄)', es='Jirones de pensamientos (Limpieza y purificación)', ) -Nameless_Land_Nameless_People = AssignmentEntryDetailed( - id=9, - name='Nameless_Land_Nameless_People', - cn='角色经验材料(无名之地,无名之人)', - cht='角色經驗素材(無名之地,無名之人)', - en='Character EXP Material (Nameless Land, Nameless People)', - jp='キャラクター経験値素材(無名の地、無名の人)', - es='Material de EXP de personaje (Lugar anónimo, personas anónimas)', +A_Startling_Night_Terror = AssignmentEntryDetailed( + id=2, + name='A_Startling_Night_Terror', + cn='蓄梦元件(劫梦惊魂)', + cht='蓄夢元件(劫夢驚魂)', + en='Dream Collection Component (A Startling Night Terror)', + jp='ドリームコレクションパーツ(魂震える悪夢)', + es='Componente del acumulador de sueños (Pesadilla aterradora)', +) +Fire_Lord_Inflames_Blades_of_War = AssignmentEntryDetailed( + id=3, + name='Fire_Lord_Inflames_Blades_of_War', + cn='工造机杼(火帝动炉销剑戟)', + cht='工造機杼(火帝動爐銷劍戟)', + en="Artifex's Module (Fire Lord Inflames Blades of War)", + jp='工造機関(剣戟を焼却する火帝炉)', + es='Componente artificial mecánico (Prendan los fuelles, fundan las armas)', +) +Root_Out_the_Turpitude = AssignmentEntryDetailed( + id=4, + name='Root_Out_the_Turpitude', + cn='永寿幼芽(根除恶孽)', + cht='永壽幼芽(根除惡孽)', + en='Immortal Scionette (Root Out the Turpitude)', + jp='永寿の萌芽(悪孽を根絶やしに)', + es='Brote verde inmortal (La raíz del mal)', +) +Born_to_Obey = AssignmentEntryDetailed( + id=5, + name='Born_to_Obey', + cn='古代零件(生而服从)', + cht='古代零件(生而服從)', + en='Ancient Part (Born to Obey)', + jp='古代パーツ(生まれながらに服従する)', + es='Componente antiguo (Creados para obedecer)', +) +Winter_Soldiers = AssignmentEntryDetailed( + id=6, + name='Winter_Soldiers', + cn='铁卫扣饰(寒冬的战士们)', + cht='鐵衛扣飾(寒冬的戰士們)', + en='Silvermane Badge (Winter Soldiers)', + jp='シルバーメインの釦(寒冬の戦士たち)', + es='Pin del guardia (Los guerreros del invierno)', +) +Destruction_of_the_Destroyer = AssignmentEntryDetailed( + id=7, + name='Destruction_of_the_Destroyer', + cn='掠夺的本能(毁灭者的覆灭)', + cht='掠奪的本能(毀滅者的覆滅)', + en="Thief's Instinct (Destruction of the Destroyer)", + jp='略奪の本能(壊滅者の覆没)', + es='Instinto del ladrón (La destrucción del destructor)', +) +Nine_Billion_Names = AssignmentEntryDetailed( + id=8, + name='Nine_Billion_Names', + cn='熄灭原核(九十亿个名字)', + cht='熄滅原核(九十億個名字)', + en='Extinguished Core (Nine Billion Names)', + jp='消滅した原核(九十億の御名)', + es='Núcleo apagado (Nueve mil millones de nombres)', ) Akashic_Records = AssignmentEntryDetailed( - id=10, + id=9, name='Akashic_Records', cn='光锥经验材料(阿卡夏记录)', cht='光錐經驗素材(阿卡夏紀錄)', @@ -93,6 +84,15 @@ Akashic_Records = AssignmentEntryDetailed( jp='光円錐経験値素材(アーカーシャの記録)', es='Material de EXP de conos de luz (Los Registros de Akasha)', ) +Nameless_Land_Nameless_People = AssignmentEntryDetailed( + id=10, + name='Nameless_Land_Nameless_People', + cn='角色经验材料(无名之地,无名之人)', + cht='角色經驗素材(無名之地,無名之人)', + en='Character EXP Material (Nameless Land, Nameless People)', + jp='キャラクター経験値素材(無名の地、無名の人)', + es='Material de EXP de personaje (Lugar anónimo, personas anónimas)', +) The_Invisible_Hand = AssignmentEntryDetailed( id=11, name='The_Invisible_Hand', @@ -102,71 +102,8 @@ The_Invisible_Hand = AssignmentEntryDetailed( jp='信用ポイント(見えざる手)', es='Crédito (La mano invisible)', ) -Abandoned_and_Insulted = AssignmentEntryDetailed( - id=12, - name='Abandoned_and_Insulted', - cn='燃素 & 金属(被废弃与损害的)', - cht='燃素 & 金屬(被廢棄與損害的)', - en='Phlogiston & Metal (Abandoned and Insulted)', - jp='燃素 & 金属(捨てられしものと傷つけられしもの)', - es='Flogisto & Metal (Abandonado e insultado)', -) -Spring_of_Life = AssignmentEntryDetailed( - id=13, - name='Spring_of_Life', - cn='固态净水 & 虚粒子(生命之泉)', - cht='固態淨水 & 虛粒子(生命之泉)', - en='Solid Water & Virtual Particle (Spring of Life)', - jp='固形純水 & 仮想粒子(生命の泉)', - es='Agua sólida & Partícula virtual (La fuente de la vida)', -) -The_Land_of_Gold = AssignmentEntryDetailed( - id=14, - name='The_Land_of_Gold', - cn='基本食材 & 蛋白米(黄金大地)', - cht='基本食材 & 蛋白米(黃金大地)', - en='Basic Ingredients & Protein Rice (The Land of Gold)', - jp='基本食材 & タンパク米(黄金の大地)', - es='Ingredientes básicos & Arroz proteico (Tierra de oportunidades)', -) -The_Blossom_in_the_Storm = AssignmentEntryDetailed( - id=15, - name='The_Blossom_in_the_Storm', - cn='气态流体 & 种子(风暴中怒放的花)', - cht='氣態流體 & 種子(風暴中怒放的花)', - en='Gaseous Liquid & Seed (The Blossom in the Storm)', - jp='気態流体 & 種子(嵐の中で咲き誇る花)', - es='Líquido gaseoso & Semilla (Flores en la tormenta)', -) -Legend_of_the_Puppet_Master = AssignmentEntryDetailed( - id=16, - name='Legend_of_the_Puppet_Master', - cn='废弃机巧零件 & 玉兆单元(偃师传说)', - cht='廢棄機巧零件 & 玉兆單元(偃師傳說)', - en='Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)', - jp='廃棄された機巧部品 & 玉兆単元(傀儡師伝説)', - es='Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)', -) -The_Wages_of_Humanity = AssignmentEntryDetailed( - id=17, - name='The_Wages_of_Humanity', - cn='一人嘉禾 & 药草提取物(赡养人类)', - cht='一人嘉禾 & 藥草萃取物(贍養人類)', - en='Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)', - jp='一人稲 & 薬草抽出物(人類扶養)', - es='Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)', -) -Fragments_of_Illusory_Dreams = AssignmentEntryDetailed( - id=18, - name='Fragments_of_Illusory_Dreams', - cn='安逸 & 碎梦(幻梦的残片)', - cht='安逸 & 碎夢(幻夢的殘片)', - en='Tranquility & Broken Dreams (Fragments of Illusory Dreams)', - jp='安逸 & 砕けた夢(幻夢の残片)', - es='Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)', -) Scalpel_and_Screwdriver = AssignmentEntryDetailed( - id=19, + id=12, name='Scalpel_and_Screwdriver', cn='锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)', cht='鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)', @@ -174,3 +111,66 @@ Scalpel_and_Screwdriver = AssignmentEntryDetailed( jp='錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)', es='Engranaje oxidado & Muela vieja (Bisturí y destornillador)', ) +The_Wages_of_Humanity = AssignmentEntryDetailed( + id=13, + name='The_Wages_of_Humanity', + cn='一人嘉禾 & 药草提取物(赡养人类)', + cht='一人嘉禾 & 藥草萃取物(贍養人類)', + en='Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)', + jp='一人稲 & 薬草抽出物(人類扶養)', + es='Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)', +) +Legend_of_the_Puppet_Master = AssignmentEntryDetailed( + id=14, + name='Legend_of_the_Puppet_Master', + cn='废弃机巧零件 & 玉兆单元(偃师传说)', + cht='廢棄機巧零件 & 玉兆單元(偃師傳說)', + en='Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)', + jp='廃棄された機巧部品 & 玉兆単元(傀儡師伝説)', + es='Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)', +) +The_Land_of_Gold = AssignmentEntryDetailed( + id=15, + name='The_Land_of_Gold', + cn='基本食材 & 蛋白米(黄金大地)', + cht='基本食材 & 蛋白米(黃金大地)', + en='Basic Ingredients & Protein Rice (The Land of Gold)', + jp='基本食材 & タンパク米(黄金の大地)', + es='Ingredientes básicos & Arroz proteico (Tierra de oportunidades)', +) +Spring_of_Life = AssignmentEntryDetailed( + id=16, + name='Spring_of_Life', + cn='固态净水 & 虚粒子(生命之泉)', + cht='固態淨水 & 虛粒子(生命之泉)', + en='Solid Water & Virtual Particle (Spring of Life)', + jp='固形純水 & 仮想粒子(生命の泉)', + es='Agua sólida & Partícula virtual (La fuente de la vida)', +) +Fragments_of_Illusory_Dreams = AssignmentEntryDetailed( + id=17, + name='Fragments_of_Illusory_Dreams', + cn='安逸 & 碎梦(幻梦的残片)', + cht='安逸 & 碎夢(幻夢的殘片)', + en='Tranquility & Broken Dreams (Fragments of Illusory Dreams)', + jp='安逸 & 砕けた夢(幻夢の残片)', + es='Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)', +) +The_Blossom_in_the_Storm = AssignmentEntryDetailed( + id=18, + name='The_Blossom_in_the_Storm', + cn='气态流体 & 种子(风暴中怒放的花)', + cht='氣態流體 & 種子(風暴中怒放的花)', + en='Gaseous Liquid & Seed (The Blossom in the Storm)', + jp='気態流体 & 種子(嵐の中で咲き誇る花)', + es='Líquido gaseoso & Semilla (Flores en la tormenta)', +) +Abandoned_and_Insulted = AssignmentEntryDetailed( + id=19, + name='Abandoned_and_Insulted', + cn='燃素 & 金属(被废弃与损害的)', + cht='燃素 & 金屬(被廢棄與損害的)', + en='Phlogiston & Metal (Abandoned and Insulted)', + jp='燃素 & 金属(捨てられしものと傷つけられしもの)', + es='Flogisto & Metal (Abandonado e insultado)', +) diff --git a/tasks/base/assets/assets_base_page.py b/tasks/base/assets/assets_base_page.py index 0bb0d9dde..c43a575ae 100644 --- a/tasks/base/assets/assets_base_page.py +++ b/tasks/base/assets/assets_base_page.py @@ -280,13 +280,22 @@ MAP_CHECK = ButtonWrapper( ) MAP_EXIT = ButtonWrapper( name='MAP_EXIT', - share=Button( - file='./assets/share/base/page/MAP_EXIT.png', - area=(27, 46, 44, 74), - search=(7, 26, 64, 94), - color=(142, 144, 148), - button=(27, 46, 44, 74), - ), + share=[ + Button( + file='./assets/share/base/page/MAP_EXIT.png', + area=(27, 46, 44, 74), + search=(7, 26, 64, 94), + color=(142, 144, 148), + button=(27, 46, 44, 74), + ), + Button( + file='./assets/share/base/page/MAP_EXIT.2.png', + area=(27, 46, 44, 74), + search=(7, 26, 64, 94), + color=(160, 187, 206), + button=(27, 46, 44, 74), + ), + ], ) MAP_GOTO_WORLD = ButtonWrapper( name='MAP_GOTO_WORLD', diff --git a/tasks/base/main_page.py b/tasks/base/main_page.py index acd41fdcd..1238ee9ed 100644 --- a/tasks/base/main_page.py +++ b/tasks/base/main_page.py @@ -5,11 +5,9 @@ from module.config.server import VALID_LANG from module.exception import RequestHumanTakeover, ScriptError from module.logger import logger from module.ocr.ocr import OcrWhiteLetterOnComplexBackground -from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME, ROGUE_LEAVE_FOR_NOW -from tasks.base.assets.assets_base_page import CLOSE, MAP_EXIT -from tasks.base.page import Page, page_gacha, page_main +from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME +from tasks.base.page import Page, page_main from tasks.base.popup import PopupHandler -from tasks.daily.assets.assets_daily_trial import START_TRIAL from tasks.map.keywords import KEYWORDS_MAP_PLANE, MapPlane @@ -39,9 +37,11 @@ class OcrPlaneName(OcrWhiteLetterOnComplexBackground): # 区域-战 result = re.sub(r'区域.*战$', '区域战斗', result) # 区域-事 - result = re.sub(r'区域.*事$', '区域事件', result) + result = re.sub(r'区域.*[事件]$', '区域事件', result) # 区域-战 result = re.sub(r'区域.*交$', '区域交易', result) + # 区域-战 + result = re.sub(r'区域.*[精英]$', '区域精英', result) # 区域-事伴, 区域-事祥 result = re.sub(r'事[伴祥]', '事件', result) # 医域-战斗 @@ -158,49 +158,3 @@ class MainPage(PopupHandler): self.handle_lang_check(page=page_main) return True - - def ui_leave_special(self): - """ - Leave from: - - Rogue domains - - Character trials - - Returns: - bool: If left a special plane - - Pages: - in: Any - out: page_main - """ - if not self.appear(MAP_EXIT): - return False - - logger.info('UI leave special') - skip_first_screenshot = True - clicked = False - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - # End - if clicked: - if self.appear(page_main.check_button): - logger.info(f'Leave to {page_main}') - break - - if self.appear_then_click(MAP_EXIT, interval=2): - continue - if self.handle_popup_confirm(): - continue - if self.match_template_color(START_TRIAL, interval=2): - logger.info(f'{START_TRIAL} -> {CLOSE}') - self.device.click(CLOSE) - clicked = True - continue - if self.handle_ui_close(page_gacha.check_button, interval=2): - continue - if self.appear_then_click(ROGUE_LEAVE_FOR_NOW, interval=2): - clicked = True - continue diff --git a/tasks/base/ui.py b/tasks/base/ui.py index 09d18db42..0c159cce3 100644 --- a/tasks/base/ui.py +++ b/tasks/base/ui.py @@ -4,13 +4,14 @@ from module.base.timer import Timer from module.exception import GameNotRunningError, GamePageUnknownError from module.logger import logger from module.ocr.ocr import Ocr -from tasks.base.assets.assets_base_page import MAP_EXIT +from tasks.base.assets.assets_base_main_page import ROGUE_LEAVE_FOR_NOW +from tasks.base.assets.assets_base_page import CLOSE, MAIN_GOTO_CHARACTER, MAP_EXIT from tasks.base.main_page import MainPage -from tasks.base.page import Page, page_main +from tasks.base.page import Page, page_gacha, page_main from tasks.combat.assets.assets_combat_finish import COMBAT_EXIT from tasks.combat.assets.assets_combat_interact import MAP_LOADING from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE -from tasks.daily.assets.assets_daily_trial import INFO_CLOSE +from tasks.daily.assets.assets_daily_trial import INFO_CLOSE, START_TRIAL from tasks.login.assets.assets_login import LOGIN_CONFIRM @@ -24,6 +25,8 @@ class UI(MainPage): page (Page): interval: """ + if page == page_main: + return self.is_in_main(interval=interval) return self.appear(page.check_button, interval=interval) def ui_get_current_page(self, skip_first_screenshot=True): @@ -139,7 +142,7 @@ class UI(MainPage): for page in Page.iter_pages(): if page.parent is None or page.check_button is None: continue - if self.appear(page.check_button, interval=5): + if self.ui_page_appear(page, interval=5): logger.info(f'Page switch: {page} -> {page.parent}') self.handle_lang_check(page) if self.ui_page_confirm(page): @@ -297,14 +300,41 @@ class UI(MainPage): if additional(): continue - def is_in_main(self): - if self.appear(page_main.check_button): - if self.image_color_count(page_main.check_button, color=(235, 235, 235), threshold=234, count=400): - return True - if self.appear(MAP_EXIT): + def is_in_main(self, interval=0): + self.device.stuck_record_add(MAIN_GOTO_CHARACTER) + + if interval and not self.interval_is_reached(MAIN_GOTO_CHARACTER, interval=interval): + return False + + appear = False + if MAIN_GOTO_CHARACTER.match_template_binary(self.device.image): + if self.image_color_count(MAIN_GOTO_CHARACTER, color=(235, 235, 235), threshold=234, count=400): + appear = True + if not appear: + if MAP_EXIT.match_template_binary(self.device.image): + if self.image_color_count(MAP_EXIT, color=(235, 235, 235), threshold=221, count=50): + appear = True + + if appear and interval: + self.interval_reset(MAIN_GOTO_CHARACTER, interval=interval) + + return appear + + def is_in_map_exit(self, interval=0): + self.device.stuck_record_add(MAP_EXIT) + + if interval and not self.interval_is_reached(MAP_EXIT, interval=interval): + return False + + appear = False + if MAP_EXIT.match_template_binary(self.device.image): if self.image_color_count(MAP_EXIT, color=(235, 235, 235), threshold=221, count=50): - return True - return False + appear = True + + if appear and interval: + self.interval_reset(MAP_EXIT, interval=interval) + + return appear def ui_goto_main(self): return self.ui_ensure(destination=page_main) @@ -380,3 +410,50 @@ class UI(MainPage): button (Button): """ pass + + def ui_leave_special(self): + """ + Leave from: + - Rogue domains + - Character trials + + Returns: + bool: If left a special plane + + Pages: + in: Any + out: page_main + """ + if not self.is_in_map_exit(): + return False + + logger.info('UI leave special') + skip_first_screenshot = True + clicked = False + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if clicked: + if self.is_in_main(): + logger.info(f'Leave to {page_main}') + break + + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) + continue + if self.handle_popup_confirm(): + continue + if self.match_template_color(START_TRIAL, interval=2): + logger.info(f'{START_TRIAL} -> {CLOSE}') + self.device.click(CLOSE) + clicked = True + continue + if self.handle_ui_close(page_gacha.check_button, interval=2): + continue + if self.appear_then_click(ROGUE_LEAVE_FOR_NOW, interval=2): + clicked = True + continue diff --git a/tasks/battle_pass/battle_pass.py b/tasks/battle_pass/battle_pass.py index a7e172b41..4386dd136 100644 --- a/tasks/battle_pass/battle_pass.py +++ b/tasks/battle_pass/battle_pass.py @@ -96,6 +96,10 @@ class BattlePassUI(UI): MAX_LEVEL = 70 def _battle_pass_wait_rewards_loaded(self, skip_first_screenshot=True): + """ + Returns: + bool: If load success + """ timeout = Timer(2, count=4).start() while 1: if skip_first_screenshot: @@ -105,12 +109,16 @@ class BattlePassUI(UI): if timeout.reached(): logger.warning('Wait rewards tab loaded timeout') - break + return False if self.appear(REWARDS_LOADED): logger.info('Rewards tab loaded') - break + return True def _battle_pass_wait_missions_loaded(self, skip_first_screenshot=True): + """ + Returns: + bool: If load success + """ timeout = Timer(2, count=4).start() while 1: if skip_first_screenshot: @@ -120,14 +128,14 @@ class BattlePassUI(UI): if timeout.reached(): logger.warning('Wait missions tab loaded timeout') - break + return False # Has scroll and last mission loaded if self.appear(MISSION_PAGE_SCROLL): color = get_color(self.device.image, MISSIONS_LOADED.area) if np.mean(color) > 128: logger.info('Missions tab loaded') - break + return True def battle_pass_goto(self, state: KEYWORDS_BATTLE_PASS_TAB): """ diff --git a/tasks/character/switch.py b/tasks/character/switch.py index 7b36b6806..a30e25796 100644 --- a/tasks/character/switch.py +++ b/tasks/character/switch.py @@ -16,7 +16,7 @@ from tasks.character.keywords import CharacterList, DICT_SORTED_RANGES, KEYWORDS class OcrCharacterName(OcrWhiteLetterOnComplexBackground): merge_thres_x = 20 - merge_thres_y = 20 + merge_thres_y = 10 def after_process(self, result): result = result.replace('蛆', '妲') diff --git a/tasks/combat/assets/assets_combat_support.py b/tasks/combat/assets/assets_combat_support.py index 0eb09775a..982f5eaeb 100644 --- a/tasks/combat/assets/assets_combat_support.py +++ b/tasks/combat/assets/assets_combat_support.py @@ -43,16 +43,6 @@ COMBAT_SUPPORT_LIST_SCROLL = ButtonWrapper( button=(472, 162, 476, 598), ), ) -COMBAT_SUPPORT_SELECTED = ButtonWrapper( - name='COMBAT_SUPPORT_SELECTED', - share=Button( - file='./assets/share/combat/support/COMBAT_SUPPORT_SELECTED.png', - area=(69, 114, 91, 116), - search=(49, 94, 111, 136), - color=(254, 254, 254), - button=(69, 114, 91, 116), - ), -) SUPPORT_SELECTED = ButtonWrapper( name='SUPPORT_SELECTED', share=[ diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index 9767615cd..c460b1f77 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -82,14 +82,11 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo logger.hr('Combat prepare') skip_first_screenshot = True if support_character: - # To set team before support set - pre_set_team = True # Block COMBAT_TEAM_PREPARE before support set support_set = False else: - pre_set_team = False support_set = True - logger.info([support_character, pre_set_team, support_set]) + logger.info([support_character, support_set]) trial = 0 while 1: if skip_first_screenshot: @@ -107,18 +104,17 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo raise RequestHumanTakeover # Click - if support_character and self.appear(COMBAT_TEAM_SUPPORT): - if pre_set_team: - self.team_set(team) - pre_set_team = False - continue + if support_character and self.appear(COMBAT_TEAM_SUPPORT, interval=2): + self.team_set(team) self.support_set(support_character) + self.interval_reset(COMBAT_TEAM_SUPPORT) support_set = True continue if support_set and self.appear(COMBAT_TEAM_PREPARE, interval=2): self.team_set(team) self.device.click(COMBAT_TEAM_PREPARE) self.interval_reset(COMBAT_TEAM_PREPARE) + self.interval_reset(COMBAT_TEAM_SUPPORT) continue if self.appear(COMBAT_TEAM_PREPARE): self.interval_reset(COMBAT_PREPARE) @@ -131,6 +127,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo trial += 1 continue if self.handle_combat_interact(): + self.map_A_timer.reset() continue if self.handle_ascension_dungeon_prepare(): continue @@ -160,7 +157,8 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo if callable(expected_end) and expected_end(): logger.info(f'Combat execute ended at {expected_end.__name__}') break - if self.appear(COMBAT_AGAIN): + if (self.appear(COMBAT_AGAIN) and + self.image_color_count(COMBAT_AGAIN, color=(227, 227, 228), threshold=221, count=50)): logger.info(f'Combat execute ended at {COMBAT_AGAIN}') break if self.is_in_main(): @@ -177,6 +175,9 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo is_executing = False if self.handle_combat_state(): continue + # Battle pass popup appears just after combat finished and before blessings + if self.handle_battle_pass_notification(): + continue def _combat_can_again(self) -> bool: """ @@ -215,6 +216,9 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo Returns: bool: True to re-enter combat and run with another wave settings """ + if self.config.stored.TrailblazePower.value < self.combat_wave_cost: + logger.info('Current trailblaze power is not enough for next run') + return False # Wave limit if self.combat_wave_limit: if self.combat_wave_done < self.combat_wave_limit: @@ -227,6 +231,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo if self.config.stored.TrailblazePower.value >= self.combat_wave_cost: logger.info('Still having some trailblaze power run with less waves to empty it') return True + return False def combat_finish(self) -> bool: """ diff --git a/tasks/combat/support.py b/tasks/combat/support.py index 568b74b68..d53548248 100644 --- a/tasks/combat/support.py +++ b/tasks/combat/support.py @@ -9,7 +9,7 @@ from module.ui.scroll import AdaptiveScroll from tasks.base.assets.assets_base_popup import POPUP_CANCEL from tasks.base.ui import UI from tasks.combat.assets.assets_combat_support import COMBAT_SUPPORT_ADD, COMBAT_SUPPORT_LIST, \ - COMBAT_SUPPORT_LIST_GRID, COMBAT_SUPPORT_LIST_SCROLL, COMBAT_SUPPORT_SELECTED, SUPPORT_SELECTED + COMBAT_SUPPORT_LIST_GRID, COMBAT_SUPPORT_LIST_SCROLL, SUPPORT_SELECTED from tasks.combat.assets.assets_combat_team import COMBAT_TEAM_DISMISSSUPPORT, COMBAT_TEAM_SUPPORT @@ -79,8 +79,8 @@ class SupportCharacter: Returns: tuple: (x1, y1, x2, y2) of selected icon search area """ - return ( - self.button[0], self.button[1] - 5, self.button[0] + 30, self.button[1]) if self.button else None + # Check the left of character avatar + return 0, self.button[1], self.button[0], self.button[3] class NextSupportCharacter: @@ -130,6 +130,7 @@ class CombatSupport(UI): out: COMBAT_PREPARE """ logger.hr("Combat support") + self.interval_clear(COMBAT_TEAM_SUPPORT) skip_first_screenshot = True selected_support = False while 1: @@ -143,7 +144,7 @@ class CombatSupport(UI): return True # Click - if self.appear(COMBAT_TEAM_SUPPORT, interval=1): + if self.appear(COMBAT_TEAM_SUPPORT, interval=2): self.device.click(COMBAT_TEAM_SUPPORT) self.interval_reset(COMBAT_TEAM_SUPPORT) continue @@ -154,15 +155,30 @@ class CombatSupport(UI): self._select_next_support() self.interval_reset(POPUP_CANCEL) continue - if self.appear(COMBAT_SUPPORT_LIST, interval=1): + if self.appear(COMBAT_SUPPORT_LIST, interval=2): + scroll = AdaptiveScroll(area=COMBAT_SUPPORT_LIST_SCROLL.area, + name=COMBAT_SUPPORT_LIST_SCROLL.name) + if not scroll.appear(main=self): + self.interval_clear(COMBAT_SUPPORT_LIST) + continue if not selected_support and support_character_name != "FirstCharacter": - self._search_support( - support_character_name) # Search support + self._search_support(support_character_name) # Search support selected_support = True self.device.click(COMBAT_SUPPORT_ADD) self.interval_reset(COMBAT_SUPPORT_LIST) continue + def _get_character(self, support_character_name: str) -> SupportCharacter: + if support_character_name.startswith("Trailblazer"): + character = SupportCharacter(f"Stelle{support_character_name[11:]}", self.device.image) + if character: + return character + character = SupportCharacter(f"Caelum{support_character_name[11:]}", self.device.image) + # Should return something + return character + else: + return SupportCharacter(support_character_name, self.device.image) + def _search_support(self, support_character_name: str = "JingYuan"): """ Args: @@ -176,6 +192,14 @@ class CombatSupport(UI): out: COMBAT_SUPPORT_LIST """ logger.hr("Combat support search") + # Search prioritize characters + character = self._get_character(support_character_name) + if character: + logger.info("Support found in first page") + if self._select_support(character): + return True + + # Search in the following pages scroll = AdaptiveScroll(area=COMBAT_SUPPORT_LIST_SCROLL.area, name=COMBAT_SUPPORT_LIST_SCROLL.name) if scroll.appear(main=self): @@ -186,37 +210,30 @@ class CombatSupport(UI): scroll.drag_threshold = backup scroll.set_top(main=self) - logger.info("Searching support") - skip_first_screenshot = False - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + logger.info("Searching support") + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() - if not support_character_name.startswith("Trailblazer"): - character = SupportCharacter( - support_character_name, self.device.image) + character = self._get_character(support_character_name) + if character: + logger.info("Support found") + if self._select_support(character): + return True else: - character = SupportCharacter(f"Stelle{support_character_name[11:]}", - self.device.image) or SupportCharacter( - f"Caelum{support_character_name[11:]}", self.device.image) - - if character: - logger.info("Support found") - if self._select_support(character): - return True - else: - logger.warning("Support not selected") - return False - - if not scroll.at_bottom(main=self): - scroll.next_page(main=self) - continue - else: - logger.info("Support not found") + logger.warning("Support not selected") return False + if not scroll.at_bottom(main=self): + scroll.next_page(main=self) + continue + else: + logger.info("Support not found") + return False + def _select_support(self, character: SupportCharacter): """ Args: @@ -227,7 +244,7 @@ class CombatSupport(UI): out: COMBAT_SUPPORT_LIST """ logger.hr("Combat support select") - COMBAT_SUPPORT_SELECTED.matched_button.search = character.selected_icon_search() + logger.info(f'Select: {character}') skip_first_screenshot = False interval = Timer(2) while 1: @@ -237,7 +254,10 @@ class CombatSupport(UI): self.device.screenshot() # End - if self.appear(COMBAT_SUPPORT_SELECTED, similarity=0.75): + area = character.selected_icon_search() + image = self.image_crop(area, copy=False) + if SUPPORT_SELECTED.match_template(image, similarity=0.75, direct_match=True): + logger.info('Character support selected') return True if interval.reached(): @@ -274,6 +294,7 @@ class CombatSupport(UI): in: COMBAT_SUPPORT_LIST out: COMBAT_SUPPORT_LIST """ + logger.hr("Next support select") skip_first_screenshot = True scroll = AdaptiveScroll(area=COMBAT_SUPPORT_LIST_SCROLL.area, name=COMBAT_SUPPORT_LIST_SCROLL.name) @@ -288,6 +309,7 @@ class CombatSupport(UI): # End if next_support is not None and next_support.is_next_support_character_selected(self.device.image): + logger.info('Next support selected') return if interval.reached(): diff --git a/tasks/combat/team.py b/tasks/combat/team.py index 2282c178c..e2535b3ab 100644 --- a/tasks/combat/team.py +++ b/tasks/combat/team.py @@ -60,12 +60,13 @@ class CombatTeam(UI): logger.warning('Wait current team timeout') break current = self._get_team() - if current == index: - logger.attr('Team', current) - logger.info(f'Already selected to the correct team') - return False - else: - break + if current: + if current == index: + logger.attr('Team', current) + logger.info(f'Already selected to the correct team') + return False + else: + break # Set team retry = Timer(2, count=10) diff --git a/tasks/daily/trail.py b/tasks/daily/trail.py index f911b1491..a07459f8f 100644 --- a/tasks/daily/trail.py +++ b/tasks/daily/trail.py @@ -90,7 +90,8 @@ class CharacterTrial(UI): if self.match_template_color(START_TRIAL): break - if self.appear_then_click(MAP_EXIT): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue diff --git a/tasks/dungeon/weekly.py b/tasks/dungeon/weekly.py index 846104f47..facf25d01 100644 --- a/tasks/dungeon/weekly.py +++ b/tasks/dungeon/weekly.py @@ -21,6 +21,10 @@ class WeeklyDungeon(Dungeon): dungeon=dungeon, team=team, wave_limit=wave_limit, support_character=support_character, skip_ui_switch=skip_ui_switch) + def handle_ascension_dungeon_prepare(self): + # combat_wave_cost==30 in weekly, but no handle_ascension_dungeon_prepare required + return False + def get_weekly_remain(self) -> int: """ Pages: diff --git a/tasks/forgotten_hall/ui.py b/tasks/forgotten_hall/ui.py index a07c08753..14e9c3d59 100644 --- a/tasks/forgotten_hall/ui.py +++ b/tasks/forgotten_hall/ui.py @@ -210,7 +210,8 @@ class ForgottenHallUI(DungeonUI, ForgottenHallTeam): logger.info("Forgotten hall dungeon exited") break - if self.appear_then_click(MAP_EXIT): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue diff --git a/tasks/map/control/control.py b/tasks/map/control/control.py index 90d752fa3..bf99c8302 100644 --- a/tasks/map/control/control.py +++ b/tasks/map/control/control.py @@ -133,6 +133,7 @@ class MapControl(Combat, AimDetectorMixin): """ logger.hr('Goto', level=2) logger.info(f'Goto {waypoint}') + self.screenshot_tracking_add() self.waypoint = waypoint self.device.stuck_record_clear() self.device.click_record_clear() @@ -353,7 +354,6 @@ class MapControl(Combat, AimDetectorMixin): list[str]: A list of walk result """ logger.hr('Goto', level=1) - self.screenshot_tracking_add() self.map_A_timer.clear() self.map_E_timer.clear() self.map_run_2x_timer.clear() diff --git a/tasks/rogue/assets/assets_rogue_ui.py b/tasks/rogue/assets/assets_rogue_ui.py index 0b7972b28..da1687c7b 100644 --- a/tasks/rogue/assets/assets_rogue_ui.py +++ b/tasks/rogue/assets/assets_rogue_ui.py @@ -77,6 +77,17 @@ COSMIC_FRAGMENT = ButtonWrapper( button=(1146, 19, 1181, 55), ), ) +CURIO_FIXED = ButtonWrapper( + name='CURIO_FIXED', + cn=Button( + file='./assets/cn/rogue/ui/CURIO_FIXED.png', + area=(558, 54, 626, 75), + search=(538, 34, 646, 95), + color=(126, 123, 122), + button=(558, 54, 626, 75), + ), + en=None, +) CURIO_OBTAINED = ButtonWrapper( name='CURIO_OBTAINED', cn=[ diff --git a/tasks/rogue/blessing/ui.py b/tasks/rogue/blessing/ui.py index db9970726..ad267fe04 100644 --- a/tasks/rogue/blessing/ui.py +++ b/tasks/rogue/blessing/ui.py @@ -80,4 +80,9 @@ class RogueUI(UI): logger.info(f'{CURIO_OBTAINED} -> {BLESSING_CONFIRM}') self.device.click(BLESSING_CONFIRM) return True + # Fixed a curio from occurrence + if self.appear(CURIO_FIXED, interval=2): + logger.info(f'{CURIO_FIXED} -> {BLESSING_CONFIRM}') + self.device.click(BLESSING_CONFIRM) + return True return False diff --git a/tasks/rogue/entry/entry.py b/tasks/rogue/entry/entry.py index 35b647919..448e33888 100644 --- a/tasks/rogue/entry/entry.py +++ b/tasks/rogue/entry/entry.py @@ -292,7 +292,8 @@ class RogueEntry(RouteBase, RogueRewardHandler, RoguePathHandler, DungeonUI): if self.handle_ui_back(self._is_page_rogue_path): continue # From ui_leave_special() - if self.appear_then_click(MAP_EXIT, interval=2): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue diff --git a/tasks/rogue/event/event.py b/tasks/rogue/event/event.py index 97daf9ccc..d6aad912a 100644 --- a/tasks/rogue/event/event.py +++ b/tasks/rogue/event/event.py @@ -188,7 +188,11 @@ class RogueEvent(RogueUI): # Only one option, click directly if count == 1: if self.interval_is_reached(CHOOSE_OPTION, interval=2): - self.device.click(self.valid_options[0].prefix_icon) + button = self.valid_options[0].prefix_icon + # Option at bottom + if button.area[1] > 500 and SCROLL_OPTION.appear(main=self): + SCROLL_OPTION.set_bottom(main=self) + self.device.click(button) self.interval_reset(CHOOSE_OPTION, interval=2) return True diff --git a/tasks/rogue/route/exit.py b/tasks/rogue/route/exit.py index d3fc611c4..cf7c21bc8 100644 --- a/tasks/rogue/route/exit.py +++ b/tasks/rogue/route/exit.py @@ -235,6 +235,10 @@ class RogueExit(CombatInteract): ocr = OcrDomainExit(OCR_DOMAIN_EXIT) results = ocr.matched_ocr(image, keyword_classes=MapPlane) + # Try without preprocess + if not len(results): + ocr.white_preprocess = False + results = ocr.matched_ocr(image, keyword_classes=MapPlane) centers = [area_center(result.area) for result in results] logger.info(f'DomainDoor: {centers}') directions = [self.screen2direction(center) for center in centers] @@ -249,8 +253,17 @@ class RogueExit(CombatInteract): else: return None, results[0].matched_keyword else: - results = [r for d, r in sorted(zip(directions, results))] - return results[0].matched_keyword, results[-1].matched_keyword + left = [r for d, r in sorted(zip(directions, results)) if d < 0] + right = [r for d, r in sorted(zip(directions, results)) if d >= 0] + if len(left): + left = left[0].matched_keyword + else: + left = None + if len(right): + right = right[-1].matched_keyword + else: + right = None + return left, right def choose_door(self, left_door: MapPlane | None, right_door: MapPlane | None) -> str | None: """ diff --git a/tasks/rogue/route/loader.py b/tasks/rogue/route/loader.py index 7fa9e4f86..ecf78455c 100644 --- a/tasks/rogue/route/loader.py +++ b/tasks/rogue/route/loader.py @@ -177,6 +177,10 @@ class RouteLoader(RogueUI, MinimapWrapper, RouteLoader_, CharacterSwitch): return True # Before Combat_Luofu_Cloudford_F1_X281Y873 if route.name in [ + # ('Combat_Jarilo_BackwaterPass_F1_X507Y733', 0.26, (503.2, 736.9)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.168, (46.5, 370.0)) + 'Jarilo_BackwaterPass_F1_X507Y733', + 'Jarilo_BackwaterPass_F1_X555Y643', 'Occurrence_Jarilo_BackwaterPass_F1_X553Y643', 'Combat_Jarilo_GreatMine_F1_X545Y513', 'Combat_Herta_SupplyZone_F2_X45Y369', @@ -188,6 +192,15 @@ class RouteLoader(RogueUI, MinimapWrapper, RouteLoader_, CharacterSwitch): # ('Occurrence_Luofu_DivinationCommission_F2_X149Y659', 0.237, (148.9, 658.8)), # ('Occurrence_Luofu_DivinationCommission_F2_X425Y791', 0.11, (425.2, 793.8)) 'Occurrence_Luofu_DivinationCommission_F2_X149Y659', + # ('Combat_Luofu_DivinationCommission_F1_X97Y457', 0.222, (97.8, 456.9)), + # ('Combat_Luofu_ScalegorgeWaterscape_F1_X415Y261', 0.112, (371.8, 289.4)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.104, (11.7, 367.6)) + 'Combat_Luofu_DivinationCommission_F1_X97Y457', + # ('Occurrence_Jarilo_BackwaterPass_F1_X613Y755', 0.206, (611.3, 759.0)), + # ('Occurrence_Jarilo_BackwaterPass_F1_X611Y761', 0.206, (611.3, 759.0)), + # ('Occurrence_Luofu_DivinationCommission_F2_X425Y791', 0.105, (429.7, 791.6)) + 'Occurrence_Jarilo_BackwaterPass_F1_X613Y755', + 'Occurrence_Jarilo_BackwaterPass_F1_X611Y761', ] and similarity > 0.15: return True if route.name in [