From 90a6ca003afa3d0f6a9ca714b4d241feaf9625b2 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 10 Jun 2024 16:58:49 +0800 Subject: [PATCH 1/6] Fix: CloudRemainSeasonPass.value --- tasks/rogue/entry/entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/rogue/entry/entry.py b/tasks/rogue/entry/entry.py index 2e87c5e2c..2360c787e 100644 --- a/tasks/rogue/entry/entry.py +++ b/tasks/rogue/entry/entry.py @@ -377,7 +377,7 @@ class RogueEntry(RouteBase, RogueRewardHandler, RoguePathHandler, DungeonUI): 'Reached weekly point limit but still continue to farm materials') logger.attr( "Farming Counter", self.config.stored.SimulatedUniverseFarm.to_counter()) - if self.config.is_cloud_game and not self.config.stored.CloudRemainSeasonPass: + if self.config.is_cloud_game and not self.config.stored.CloudRemainSeasonPass.value: logger.warning('Running WeeklyFarming on cloud game without season pass may cause fee, skip') raise RogueReachedWeeklyPointLimit else: From f02d6ad3afa9617c6eae21008324755d54950ff2 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 11 Jun 2024 02:13:32 +0800 Subject: [PATCH 2/6] Add: Select item in synthesize list --- .../item/synthesize/SYNTHESIZE_INVENTORY.png | Bin 0 -> 6275 bytes tasks/item/assets/assets_item_synthesize.py | 10 + tasks/item/inventory.py | 320 ++++++++++++++++++ tasks/item/synthesize.py | 137 +++++++- 4 files changed, 463 insertions(+), 4 deletions(-) create mode 100644 assets/share/item/synthesize/SYNTHESIZE_INVENTORY.png create mode 100644 tasks/item/inventory.py diff --git a/assets/share/item/synthesize/SYNTHESIZE_INVENTORY.png b/assets/share/item/synthesize/SYNTHESIZE_INVENTORY.png new file mode 100644 index 0000000000000000000000000000000000000000..cd679e4ece489bef68233fff97cf7d2f240fec83 GIT binary patch literal 6275 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 GbLAg-oG{A( literal 0 HcmV?d00001 diff --git a/tasks/item/assets/assets_item_synthesize.py b/tasks/item/assets/assets_item_synthesize.py index 863e4ec0a..4a9a89ea5 100644 --- a/tasks/item/assets/assets_item_synthesize.py +++ b/tasks/item/assets/assets_item_synthesize.py @@ -53,6 +53,16 @@ SYNTHESIZE_AMOUNT = ButtonWrapper( button=(683, 548, 1034, 568), ), ) +SYNTHESIZE_INVENTORY = ButtonWrapper( + name='SYNTHESIZE_INVENTORY', + share=Button( + file='./assets/share/item/synthesize/SYNTHESIZE_INVENTORY.png', + area=(116, 71, 453, 634), + search=(96, 51, 473, 654), + color=(255, 255, 255), + button=(116, 71, 453, 634), + ), +) SYNTHESIZE_MINUS = ButtonWrapper( name='SYNTHESIZE_MINUS', share=Button( diff --git a/tasks/item/inventory.py b/tasks/item/inventory.py new file mode 100644 index 000000000..3744bfb41 --- /dev/null +++ b/tasks/item/inventory.py @@ -0,0 +1,320 @@ +import cv2 +import numpy as np +from scipy import signal + +from module.base.base import ModuleBase +from module.base.button import ButtonWrapper +from module.base.decorator import cached_property, del_cached_property +from module.base.timer import Timer +from module.base.utils import Lines, area_center, area_offset, color_similarity_2d +from module.exception import ScriptError +from module.logger import logger + + +def xywh2xyxy(area): + """ + Convert (x, y, width, height) to (x1, y1, x2, y2) + """ + x, y, w, h = area + return x, y, x + w, y + h + + +def xyxy2xywh(area): + """ + Convert (x1, y1, x2, y2) to (x, y, width, height) + """ + x1, y1, x2, y2 = area + return min(x1, x2), min(y1, y2), abs(x2 - x1), abs(y2 - y1) + + +class InventoryItem: + def __init__(self, main: ModuleBase, loca: tuple[int, int], point: tuple[int, int]): + self.main = main + self.loca = loca + self.point = point + + def __str__(self): + return f'Item({self.loca})' + + __repr__ = __str__ + + def crop(self, area, copy=False): + area = area_offset(area, offset=self.point) + return self.main.image_crop(area, copy=copy) + + @cached_property + def button(self): + area = area_offset((-40, -20, 40, 20), offset=self.point) + return area + + @cached_property + def is_selected(self): + image = self.crop((-60, -100, 60, 40)) + image = color_similarity_2d(image, (255, 255, 255)) + param = { + 'height': 160, + } + hori = cv2.reduce(image, 1, cv2.REDUCE_AVG).flatten() + peaks, _ = signal.find_peaks(hori, **param) + if len(peaks) != 2: + return False + vert = cv2.reduce(image, 0, cv2.REDUCE_AVG).flatten() + peaks, _ = signal.find_peaks(vert, **param) + if len(peaks) != 2: + return False + return True + + +class InventoryManager: + GRID_DELTA = (104, 124) + + ERROR_LINES_TOLERANCE = (-10, 10) + COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1. + + def __init__(self, main: ModuleBase, inventory: ButtonWrapper): + """ + max_count: expected max count of this inventory page + """ + self.main = main + self.inventory = inventory + self.items: dict[tuple[int, int], InventoryItem] = {} + self.selected: InventoryItem | None = None + + def mid_cleanse(self, mids, mid_diff_range, edge_range): + """ + Args: + mids: + mid_diff_range: + edge_range: + + Returns: + + """ + count = len(mids) + if count == 1: + return mids + elif count == 2: + return mids + # print(mids) + encourage = self.COINCIDENT_POINT_ENCOURAGE_DISTANCE ** 2 + + # Drawing lines + def iter_lines(): + for index, mid in enumerate(mids): + for n in range(self.ERROR_LINES_TOLERANCE[0], self.ERROR_LINES_TOLERANCE[1] + 1): + theta = np.arctan(index + n) + rho = mid * np.cos(theta) + yield [rho, theta] + + def coincident_point_value(point): + """Value that measures how close a point to the coincident point. The smaller the better. + Coincident point may be many. + Use an activation function to encourage a group of coincident lines and ignore wrong lines. + """ + x, y = point + # Do not use: + # distance = coincident.distance_to_point(point) + distance = np.abs(x - coincident.get_x(y)) + # print((distance * 1).astype(int).reshape(len(mids), np.diff(self.config.ERROR_LINES_TOLERANCE)[0]+1)) + + # Activation function + # distance = 1 / (1 + np.exp(16 / distance - distance)) + distance = 1 / (1 + np.exp(encourage / distance) / distance) + distance = np.sum(distance) + return distance + + # Fitting mid + coincident = Lines(np.vstack(list(iter_lines())), is_horizontal=False) + coincident_point_range = ( + ( + -abs(self.ERROR_LINES_TOLERANCE[0]) * mid_diff_range[1] + edge_range[0], + abs(self.ERROR_LINES_TOLERANCE[1]) * mid_diff_range[1] + edge_range[1] + ), + mid_diff_range + ) + from scipy import optimize + coincident_point = optimize.brute(coincident_point_value, coincident_point_range) + # print(coincident_point) + + # Filling mid + left, right = edge_range + mids = np.arange(-25, 25) * coincident_point[1] + coincident_point[0] + mids = mids[(mids > left) & (mids < right)] + # print(mids) + return mids + + def update(self): + image = self.main.image_crop(self.inventory, copy=False) + image = color_similarity_2d(image, color=(252, 200, 109)) + + # Search rarity stars + kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) + cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, dst=image) + # image_star = cv2.inRange(image, 221, 255) + # Close rarity stars as item + kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 3)) + cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel, dst=image) + image_item = cv2.inRange(image, 221, 255) + + # from PIL import Image + # Image.fromarray(image_star).show() + + def iter_area(im): + # Iter matched area from given image + contours, _ = cv2.findContours(im, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + for cont in contours: + rect = cv2.boundingRect(cv2.convexHull(cont).astype(np.float32)) + # width < 5stars and height < 1star + if not (65 > rect[2] >= 5 and 10 > rect[3]): + continue + rect = xywh2xyxy(rect) + rect = area_center(rect) + yield rect + + area_item = list(iter_area(image_item)) + + # Re-generate a correct xy array + points = np.array(area_item) + points += self.inventory.area[:2] + area = self.inventory.area + x_list = np.unique(np.sort(points[:, 0])) + y_list = np.unique(np.sort(points[:, 1])) + x_list = self.mid_cleanse( + x_list, + mid_diff_range=(self.GRID_DELTA[0] - 3, self.GRID_DELTA[0] + 3), + edge_range=(area[0], area[2]) + ) + y_list = self.mid_cleanse( + y_list, + mid_diff_range=(self.GRID_DELTA[1] - 3, self.GRID_DELTA[1] + 3), + edge_range=(area[1], area[3]) + ) + + def is_near_existing(p): + diff = np.linalg.norm(points - p, axis=1) + return np.any(diff < 3) + + def iter_items(): + y_max = -1 + for y in y_list: + for x in x_list: + if is_near_existing((x, y)): + y_max = y + break + for yi, y in enumerate(y_list): + if y < y_max: + # Fill items + for xi, x in enumerate(x_list): + yield InventoryItem(main=self.main, loca=(xi, yi), point=(int(x), int(y))) + elif y == y_max: + # Fill until the last item + for xi, x in enumerate(x_list): + if is_near_existing((x, y)): + yield InventoryItem(main=self.main, loca=(xi, yi), point=(int(x), int(y))) + else: + break + + # Re-generate items + self.items = {} + selected = [] + for item in iter_items(): + self.items[item.loca] = item + if item.is_selected: + selected.append(item) + + # Check selected + self.selected = None + count = len(selected) + if count == 0: + # logger.warning('Inventory has no item selected') + pass + elif count > 1: + logger.warning(f'Inventory has multiple items selected: {selected}') + self.selected = selected[0] + else: + self.selected = selected[0] + + logger.info(f'Inventory: {len(self.items)} items, selected {self.selected}') + + def get_row_first(self, row=1, first=0) -> InventoryItem | None: + """ + Get the first item of the next row + + Args: + row: 1 for next row, -1 for prev row + first: 0 for the first_item + """ + if self.selected == None: + return None + loca = self.selected.loca + loca = (first, loca[1] + row) + try: + return self.items[loca] + except KeyError: + return None + + def get_right(self) -> InventoryItem | None: + """ + Get the right item of the selected + """ + if self.selected == None: + return None + loca = self.selected.loca + loca = (loca[0] + 1, loca[1]) + try: + return self.items[loca] + except KeyError: + return None + + def get_first(self) -> InventoryItem | None: + """ + Get the first item of inventory + """ + try: + return self.items[(0, 0)] + except KeyError: + return None + + def select(self, item, skip_first_screenshot=True): + logger.info(f'Inventory select {item}') + if isinstance(item, InventoryItem): + pass + else: + try: + item = self.items[item] + except KeyError: + raise ScriptError(f'Inventory select {item} but is not in current items') + + interval = Timer(2, count=6) + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.main.device.screenshot() + + # End + del_cached_property(item, 'is_selected') + if item.is_selected: + logger.info('Inventory item selected') + break + # Click + if interval.reached(): + self.main.device.click(item) + interval.reset() + + self.update() + + def wait_selected(self, skip_first_screenshot=True): + timeout = Timer(2, count=6).start() + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.main.device.screenshot() + + self.update() + if self.selected is not None: + break + if timeout.reached(): + logger.warning('Wait inventory selected timeout') + break diff --git a/tasks/item/synthesize.py b/tasks/item/synthesize.py index fc15f9256..168f44642 100644 --- a/tasks/item/synthesize.py +++ b/tasks/item/synthesize.py @@ -1,14 +1,18 @@ import cv2 import numpy as np +from module.base.decorator import cached_property from module.base.timer import Timer -from module.base.utils import color_similarity_2d, crop, image_size +from module.base.utils import SelectedGrids, color_similarity_2d, crop, image_size +from module.exception import ScriptError from module.logger import logger from module.ocr.ocr import Ocr from tasks.base.page import page_synthesize from tasks.combat.obtain import CombatObtain from tasks.item.assets.assets_item_synthesize import * -from tasks.planner.keywords import ITEM_CLASSES +from tasks.item.inventory import InventoryManager +from tasks.planner.keywords import ITEM_CLASSES, ItemCalyx, ItemTrace +from tasks.planner.keywords.classes import ItemBase from tasks.planner.model import ObtainedAmmount from tasks.planner.scan import OcrItemName @@ -44,6 +48,44 @@ class SynthesizeItemName(OcrItemName, WhiteStrip): pass +class SynthesizeInventoryManager(InventoryManager): + @cached_property + def dic_item_index(self): + """ + Index of items in synthesize inventory. + Basically ItemTrace then ItemCalyx, but high rarity items first + + Returns: + dict: Key: item name, Value: index starting from 1 + """ + data = {} + index = 0 + items = SelectedGrids(ItemBase.instances.values()).select(is_ItemTrace=True) + items.create_index('item_group') + for item_group in items.indexes.values(): + for item in item_group[::-1]: + index += 1 + data[item.name] = index + items = SelectedGrids(ItemBase.instances.values()).select(is_ItemCalyx=True) + items.create_index('item_group') + for item_group in items.indexes.values(): + for item in item_group[::-1]: + index += 1 + data[item.name] = index + return data + + def is_item_below(self, item1: ItemBase, item2: ItemBase) -> bool: + """ + If item2 is on the right or below item1 + """ + try: + id1 = self.dic_item_index[item1.name] + id2 = self.dic_item_index[item2.name] + except KeyError: + raise ScriptError(f'is_item_below: {item1} {item2} not in SynthesizeInventoryManager') + return id2 > id1 + + class Synthesize(CombatObtain): def item_get_rarity(self, button) -> str | None: """ @@ -135,7 +177,7 @@ class Synthesize(CombatObtain): Returns: bool: If success """ - + logger.hr('synthesize rarity reset') current = self.item_get_rarity_retry(ENTRY_ITEM_FROM) if current == 'blue': r1, r2 = 'green', 'blue' @@ -195,7 +237,7 @@ class Synthesize(CombatObtain): self.planner_write() return items - def synthesize_get_item(self): + def synthesize_get_item(self) -> ItemBase | None: ocr = SynthesizeItemName(ITEM_NAME) item = ocr.matched_single_line(self.device.image, keyword_classes=ITEM_CLASSES) if item is None: @@ -204,6 +246,93 @@ class Synthesize(CombatObtain): return item + @cached_property + def synthesize_inventory(self): + return SynthesizeInventoryManager(main=self, inventory=SYNTHESIZE_INVENTORY) + + def synthesize_inventory_select(self, item: ItemTrace | ItemCalyx | str): + """ + Select item from inventory list. + Inventory list must be at top be fore selecting. + + This method is kind of a magic to lower maintenance cost + by doing OCR on item names instead of matching item templates. + + - Iter first item of each row + - If current item index > target item index, switch back to prev row and iter prev row + - If item matches or item group matches, stop + """ + logger.hr('Synthesize select', level=1) + logger.info(f'Synthesize select {item}') + if isinstance(item, str): + item = ItemBase.find(item) + if not isinstance(item, (ItemTrace, ItemCalyx)): + raise ScriptError(f'synthesize_inventory_select: ' + f'Trying to select item {item} but it is not an ItemTrace or ItemCalyx object') + + inv = self.synthesize_inventory + inv.update() + first = inv.get_first() + if first.is_selected: + logger.info('first item selected') + else: + inv.select(first) + + logger.hr('Synthesize select view', level=2) + switch_row = True + while 1: + # End + current = self.synthesize_get_item() + if current == item: + logger.info('Selected at target item') + return True + if current.item_group == item.item_group: + logger.info('Selected at target item group') + return True + # Switch rows + if switch_row and inv.is_item_below(current, item): + # Reached end, reset rarity to set current item at top + next_row = inv.get_row_first(row=1) + if next_row is None: + if inv.selected.loca[1] >= 3: + logger.info('Reached inventory view end, reset view') + self.synthesize_rarity_reset() + inv.wait_selected() + logger.hr('Synthesize select view', level=2) + continue + else: + logger.info('Reached inventory list end, no more rows') + switch_row = False + logger.hr('Synthesize select row', level=2) + else: + logger.info('Item below current, select next row') + inv.select(next_row) + continue + # Over switched, target item is at prev row + elif switch_row: + logger.info('Item above current, stop switch_row') + switch_row = False + logger.hr('Synthesize select row', level=2) + prev2 = inv.get_row_first(row=-1, first=1) + if prev2 is None: + logger.error(f'Current selected item {inv.selected} has not prev2') + else: + inv.select(prev2) + continue + # switch_row = False + if not switch_row: + right = inv.get_right() + if right is None: + logger.error('No target item, inventory ended') + return False + else: + inv.select(right) + continue + else: + logger.error(f'Unexpected switch_row={switch_row} during loop') + return False + + if __name__ == '__main__': self = Synthesize('src') From 0a1c0e3dbd2456dd63f53da9e82714c359d1bb9c Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 11 Jun 2024 12:44:26 +0800 Subject: [PATCH 3/6] Fix: [ALAS] Handle psutil.NoSuchProcess --- deploy/Windows/utils.py | 6 +++++- module/device/platform/emulator_windows.py | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/deploy/Windows/utils.py b/deploy/Windows/utils.py index 6b27a3ace..b45b273aa 100644 --- a/deploy/Windows/utils.py +++ b/deploy/Windows/utils.py @@ -121,7 +121,10 @@ class DataProcessInfo: @cached_property def name(self): - name = self.proc.name() + try: + name = self.proc.name() + except: + name = '' return name @cached_property @@ -130,6 +133,7 @@ class DataProcessInfo: cmdline = self.proc.cmdline() except: # psutil.AccessDenied + # # NoSuchProcess: process no longer exists (pid=xxx) cmdline = [] cmdline = ' '.join(cmdline).replace(r'\\', '/').replace('\\', '/') return cmdline diff --git a/module/device/platform/emulator_windows.py b/module/device/platform/emulator_windows.py index f7a5e54bc..d4d5477fb 100644 --- a/module/device/platform/emulator_windows.py +++ b/module/device/platform/emulator_windows.py @@ -471,8 +471,9 @@ class EmulatorManager(EmulatorManagerBase): try: exe = proc.cmdline() exe = exe[0].replace(r'\\', '/').replace('\\', '/') - except (psutil.AccessDenied, IndexError): + except (psutil.AccessDenied, psutil.NoSuchProcess, IndexError): # psutil.AccessDenied + # NoSuchProcess: process no longer exists (pid=xxx) continue if Emulator.is_emulator(exe): From 02d8eb978f62452fbfdcf1c549a477d82fcc91dc Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 11 Jun 2024 19:25:11 +0800 Subject: [PATCH 4/6] Fix: Enharge MAY_OBTAIN.SEARCH to fit the level too low notice --- assets/cn/combat/obtain/MAY_OBTAIN.SEARCH.png | Bin 11353 -> 25315 bytes assets/en/combat/obtain/MAY_OBTAIN.SEARCH.png | Bin 11628 -> 22901 bytes tasks/combat/assets/assets_combat_obtain.py | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/cn/combat/obtain/MAY_OBTAIN.SEARCH.png b/assets/cn/combat/obtain/MAY_OBTAIN.SEARCH.png index dee97cbe346f292aad3c08aa9d9df18c41730cd4..9a91ca8cbf862a25888a80e8768eaa1bc3850555 100644 GIT binary patch literal 25315 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 Gum1%Lyv!E> literal 11353 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 UhHLp`@wNR`-{@qn?#18!9}Pq8EdT%j diff --git a/assets/en/combat/obtain/MAY_OBTAIN.SEARCH.png b/assets/en/combat/obtain/MAY_OBTAIN.SEARCH.png index d06b424e6c9fccdf87a85335607124dd968287cc..2f6d2936a636bec4f2f9b88824f6111674d0d690 100644 GIT binary patch literal 22901 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 ZBddG2n{VAZ#@%^fCwphR+Ot3Y{9p5uKji=b literal 11628 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 diff --git a/tasks/combat/assets/assets_combat_obtain.py b/tasks/combat/assets/assets_combat_obtain.py index 10b0259a2..fd15fe6aa 100644 --- a/tasks/combat/assets/assets_combat_obtain.py +++ b/tasks/combat/assets/assets_combat_obtain.py @@ -38,14 +38,14 @@ MAY_OBTAIN = ButtonWrapper( cn=Button( file='./assets/cn/combat/obtain/MAY_OBTAIN.png', area=(813, 379, 893, 397), - search=(812, 373, 895, 468), + search=(812, 330, 895, 468), color=(63, 71, 87), button=(813, 379, 893, 397), ), en=Button( file='./assets/en/combat/obtain/MAY_OBTAIN.png', area=(813, 379, 922, 397), - search=(813, 373, 923, 468), + search=(812, 330, 922, 468), color=(53, 61, 78), button=(813, 379, 922, 397), ), From c8acd75eda4d2a6821dea993cf384b49b137feb6 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 11 Jun 2024 21:32:40 +0800 Subject: [PATCH 5/6] Upd: Add support character TrailblazerHarmony --- module/config/argument/args.json | 2 ++ module/config/config_updater.py | 2 +- module/config/i18n/en-US.json | 1 + module/config/i18n/es-ES.json | 1 + module/config/i18n/ja-JP.json | 1 + module/config/i18n/zh-CN.json | 1 + module/config/i18n/zh-TW.json | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 2c5674313..915b789f2 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -695,6 +695,7 @@ "Tingyun", "TopazNumby", "TrailblazerDestruction", + "TrailblazerHarmony", "TrailblazerPreservation", "Welt", "Xueyi", @@ -1613,6 +1614,7 @@ "Tingyun", "TopazNumby", "TrailblazerDestruction", + "TrailblazerHarmony", "TrailblazerPreservation", "Welt", "Xueyi", diff --git a/module/config/config_updater.py b/module/config/config_updater.py index e01a00e8b..f3013c75e 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -97,7 +97,7 @@ class ConfigGenerator: options=[dungeon.name for dungeon in DungeonList.instances.values() if dungeon.is_Echo_of_War]) # Insert characters from tasks.character.keywords import CharacterList - unsupported_characters = ["TrailblazerHarmony"] + unsupported_characters = [] characters = [character.name for character in CharacterList.instances.values() if character.name not in unsupported_characters] option_add(keys='DungeonSupport.Character.option', options=characters) diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 6d2172aa3..9cbfe44ed 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -416,6 +416,7 @@ "Tingyun": "Tingyun", "TopazNumby": "Topaz & Numby", "TrailblazerDestruction": "Trailblazer Destruction", + "TrailblazerHarmony": "Trailblazer Harmony", "TrailblazerPreservation": "Trailblazer Preservation", "Welt": "Welt", "Xueyi": "Xueyi", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 53bc53762..6c3adc54b 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -416,6 +416,7 @@ "Tingyun": "Tingyun", "TopazNumby": "Topaz y Conti", "TrailblazerDestruction": "Trailblazer de Destrucción", + "TrailblazerHarmony": "Trailblazer de Armonía", "TrailblazerPreservation": "Trailblazer de Conservación", "Welt": "Welt", "Xueyi": "Xueyi", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 1e6d902f9..18b1e8332 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -416,6 +416,7 @@ "Tingyun": "停雲", "TopazNumby": "トパーズ&カブ", "TrailblazerDestruction": "開拓者・壊滅", + "TrailblazerHarmony": "開拓者・調和", "TrailblazerPreservation": "開拓者・存護", "Welt": "ヴェルト", "Xueyi": "雪衣", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index f756646e8..5d3a738e1 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -416,6 +416,7 @@ "Tingyun": "停云", "TopazNumby": "托帕&账账", "TrailblazerDestruction": "开拓者•毁灭", + "TrailblazerHarmony": "开拓者•同谐", "TrailblazerPreservation": "开拓者•存护", "Welt": "瓦尔特", "Xueyi": "雪衣", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 6106a7d21..05c28888c 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -416,6 +416,7 @@ "Tingyun": "停雲", "TopazNumby": "托帕&帳帳", "TrailblazerDestruction": "開拓者•毀滅", + "TrailblazerHarmony": "開拓者•同諧", "TrailblazerPreservation": "開拓者•存護", "Welt": "瓦爾特", "Xueyi": "雪衣", From 41b6894d0db3f51e9ef2eba842bccc39e74e4afa Mon Sep 17 00:00:00 2001 From: Schwarze-Katze <68176965+Schwarze-Katze@users.noreply.github.com> Date: Tue, 11 Jun 2024 21:37:09 +0800 Subject: [PATCH 6/6] Change `Alas` to `Src` in notify push to avoid confusing (#504) Co-authored-by: LmeSzinc --- module/alas.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/module/alas.py b/module/alas.py index 2768f7e6a..cd6cfbc03 100644 --- a/module/alas.py +++ b/module/alas.py @@ -88,14 +88,14 @@ class AzurLaneAutoScript: logger.error(e) self.save_error_log() logger.warning(f'Game stuck, {self.device.package} will be restarted in 10 seconds') - logger.warning('If you are playing by hand, please stop Alas') + logger.warning('If you are playing by hand, please stop Src') self.config.task_call('Restart') self.device.sleep(10) return False except GameBugError as e: logger.warning(e) self.save_error_log() - logger.warning('An error has occurred in Azur Lane game client, Alas is unable to handle') + logger.warning('An error has occurred in Star Rail game client, Src is unable to handle') logger.warning(f'Restarting {self.device.package} to fix it') self.config.task_call('Restart') self.device.sleep(10) @@ -108,7 +108,7 @@ class AzurLaneAutoScript: self.save_error_log() handle_notify( self.config.Error_OnePushConfig, - title=f"Alas <{self.config_name}> crashed", + title=f"Src <{self.config_name}> crashed", content=f"<{self.config_name}> GamePageUnknownError", ) exit(1) @@ -123,7 +123,7 @@ class AzurLaneAutoScript: logger.critical('This is likely to be a mistake of developers, but sometimes just random issues') handle_notify( self.config.Error_OnePushConfig, - title=f"Alas <{self.config_name}> crashed", + title=f"Src <{self.config_name}> crashed", content=f"<{self.config_name}> ScriptError", ) exit(1) @@ -131,7 +131,7 @@ class AzurLaneAutoScript: logger.critical('Request human takeover') handle_notify( self.config.Error_OnePushConfig, - title=f"Alas <{self.config_name}> crashed", + title=f"Src <{self.config_name}> crashed", content=f"<{self.config_name}> RequestHumanTakeover", ) exit(1) @@ -140,7 +140,7 @@ class AzurLaneAutoScript: self.save_error_log() handle_notify( self.config.Error_OnePushConfig, - title=f"Alas <{self.config_name}> crashed", + title=f"Src <{self.config_name}> crashed", content=f"<{self.config_name}> Exception occured", ) exit(1) @@ -242,7 +242,7 @@ class AzurLaneAutoScript: if self.stop_event is not None: if self.stop_event.is_set(): logger.info("Update event detected") - logger.info(f"Alas [{self.config_name}] exited.") + logger.info(f"[{self.config_name}] exited.") break # Check game server maintenance self.checker.wait_until_available() @@ -287,7 +287,7 @@ class AzurLaneAutoScript: logger.critical('Request human takeover') handle_notify( self.config.Error_OnePushConfig, - title=f"Alas <{self.config_name}> crashed", + title=f"Src <{self.config_name}> crashed", content=f"<{self.config_name}> RequestHumanTakeover\nTask `{task}` failed 3 or more times.", ) exit(1)