From 6febc14a418f3e8e5d435409a3b58eeb6b551d67 Mon Sep 17 00:00:00 2001 From: fro0116 Date: Mon, 8 Apr 2024 21:48:28 -0700 Subject: [PATCH 01/19] Wake before screenshot Ensure interactivity wake Ensure interactivity on login too w c --- module/device/connection.py | 7 +++++++ module/device/device.py | 1 + 2 files changed, 8 insertions(+) diff --git a/module/device/connection.py b/module/device/connection.py index f806be4211..5a6d926fb3 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -1004,6 +1004,13 @@ def get_orientation(self): logger.attr('Device Orientation', f'{o} ({Connection._orientation_description.get(o, "Unknown")})') return o + @retry + def wake(self): + """ + Attempts to wake device by pressing power button + """ + self.adb_shell(['input', 'keyevent', 'KEYCODE_WAKEUP']) + @retry def list_device(self): """ diff --git a/module/device/device.py b/module/device/device.py index a1519df472..736f528d6e 100644 --- a/module/device/device.py +++ b/module/device/device.py @@ -188,6 +188,7 @@ def screenshot(self): self.stuck_record_check() try: + super().wake() super().screenshot() except RequestHumanTakeover: if not self.ascreencap_available: From b17640a9bc132d8ecd6e5ab4ac3b6a32d6e4620a Mon Sep 17 00:00:00 2001 From: fro0116 Date: Wed, 22 May 2024 13:24:51 -0700 Subject: [PATCH 02/19] Create noop.yml --- .github/workflows/noop.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .github/workflows/noop.yml diff --git a/.github/workflows/noop.yml b/.github/workflows/noop.yml new file mode 100644 index 0000000000..28f8b607dc --- /dev/null +++ b/.github/workflows/noop.yml @@ -0,0 +1,9 @@ +name: noop +run-name: noop🚀 +on: [push] +jobs: + noop: + runs-on: ubuntu-latest + steps: + - run: echo "done" + From f9f393b2033fc41602e5ca2724ede7e47af118f9 Mon Sep 17 00:00:00 2001 From: fro0116 <18626656+fro0116@users.noreply.github.com> Date: Fri, 18 Oct 2024 01:41:48 +0900 Subject: [PATCH 03/19] Fix guild event --- module/guild/logistics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/guild/logistics.py b/module/guild/logistics.py index 81edbd85d6..464c08f671 100644 --- a/module/guild/logistics.py +++ b/module/guild/logistics.py @@ -144,7 +144,7 @@ def _guild_logistics_mission_available(self): logger.info('Guild mission has finished this week') self._guild_logistics_mission_finished = True return False - elif self.image_color_count(GUILD_MISSION, color=(255, 255, 255), threshold=254, count=50): + elif self.image_color_count(GUILD_MISSION, color=(255, 255, 255), threshold=230, count=20): # 0/300 in JP is (255, 255, 255) logger.info('Guild mission button inactive') return False From a159a564d88cb5db171a2c2e378c87c3650799bf Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Fri, 12 Jun 2026 10:36:37 -0700 Subject: [PATCH 04/19] Revert "Fix guild event" This reverts commit 942bad80304a4d50bf5edfee7122b322a4f0007a. --- module/guild/logistics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/guild/logistics.py b/module/guild/logistics.py index 464c08f671..81edbd85d6 100644 --- a/module/guild/logistics.py +++ b/module/guild/logistics.py @@ -144,7 +144,7 @@ def _guild_logistics_mission_available(self): logger.info('Guild mission has finished this week') self._guild_logistics_mission_finished = True return False - elif self.image_color_count(GUILD_MISSION, color=(255, 255, 255), threshold=230, count=20): + elif self.image_color_count(GUILD_MISSION, color=(255, 255, 255), threshold=254, count=50): # 0/300 in JP is (255, 255, 255) logger.info('Guild mission button inactive') return False From 88d0853222545af654387844c1049d94513337b6 Mon Sep 17 00:00:00 2001 From: fro0116 <18626656+fro0116@users.noreply.github.com> Date: Fri, 8 Nov 2024 04:40:48 +0900 Subject: [PATCH 05/19] Add max screenshot interval --- module/device/screenshot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/device/screenshot.py b/module/device/screenshot.py index 9940ee0556..f42d82d598 100644 --- a/module/device/screenshot.py +++ b/module/device/screenshot.py @@ -173,7 +173,7 @@ def screenshot_interval_set(self, interval=None): interval = limit_in(origin, 0.1, 0.2) elif interval == 'combat': origin = self.config.Optimization_CombatScreenshotInterval - interval = limit_in(origin, 0.3, 1.0) + interval = limit_in(origin, 0.3, 6.0) if interval != origin: logger.warning(f'Optimization.CombatScreenshotInterval {origin} is revised to {interval}') self.config.Optimization_CombatScreenshotInterval = interval From 64764aae55e1ece127286aa3645d0adc1b8fa931 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Fri, 12 Jun 2026 10:36:45 -0700 Subject: [PATCH 06/19] Revert "Add max screenshot interval" This reverts commit 143810c16efb0d5601dd4edac0e89aba7e66d37e. --- module/device/screenshot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/device/screenshot.py b/module/device/screenshot.py index f42d82d598..9940ee0556 100644 --- a/module/device/screenshot.py +++ b/module/device/screenshot.py @@ -173,7 +173,7 @@ def screenshot_interval_set(self, interval=None): interval = limit_in(origin, 0.1, 0.2) elif interval == 'combat': origin = self.config.Optimization_CombatScreenshotInterval - interval = limit_in(origin, 0.3, 6.0) + interval = limit_in(origin, 0.3, 1.0) if interval != origin: logger.warning(f'Optimization.CombatScreenshotInterval {origin} is revised to {interval}') self.config.Optimization_CombatScreenshotInterval = interval From 3e19880683d7d8332d8c6531c888d6915eac2d13 Mon Sep 17 00:00:00 2001 From: fro0116 <18626656+fro0116@users.noreply.github.com> Date: Sat, 28 Dec 2024 15:33:41 -0800 Subject: [PATCH 07/19] Add reconnection attempts w --- module/device/connection.py | 3 ++- module/device/method/utils.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/device/connection.py b/module/device/connection.py index 5a6d926fb3..de765bde0f 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -1054,7 +1054,7 @@ def brute_force_connect(): manager = EmulatorManager() manager.brute_force_connect() - for _ in range(2): + for _ in range(RETRY_TRIES): logger.info('Here are the available devices, ' 'copy to Alas.Emulator.Serial to use it or set Alas.Emulator.Serial="auto"') devices = self.list_device() @@ -1072,6 +1072,7 @@ def brute_force_connect(): logger.info('Here are the devices detected but unavailable') for device in unavailable: logger.info(f'{device.serial} ({device.status})') + time.sleep(retry_sleep(_)) # brute_force_connect if self.config.Emulator_Serial == 'auto' and available.count == 0: diff --git a/module/device/method/utils.py b/module/device/method/utils.py index d17a287e92..e965509228 100644 --- a/module/device/method/utils.py +++ b/module/device/method/utils.py @@ -52,7 +52,7 @@ def shell(self, from module.base.decorator import cached_property from module.logger import logger -RETRY_TRIES = 5 +RETRY_TRIES = 64 RETRY_DELAY = 3 # Patch uiautomator2 appdir From 67a7c49f3dd1c164424dce13b5be2c3f4e31e1b5 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Fri, 12 Jun 2026 10:36:51 -0700 Subject: [PATCH 08/19] Revert "Add reconnection attempts" This reverts commit 23bb8f0d1b48e76b487f42d43ca0fb6cfb348d71. --- module/device/connection.py | 3 +-- module/device/method/utils.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/module/device/connection.py b/module/device/connection.py index de765bde0f..5a6d926fb3 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -1054,7 +1054,7 @@ def brute_force_connect(): manager = EmulatorManager() manager.brute_force_connect() - for _ in range(RETRY_TRIES): + for _ in range(2): logger.info('Here are the available devices, ' 'copy to Alas.Emulator.Serial to use it or set Alas.Emulator.Serial="auto"') devices = self.list_device() @@ -1072,7 +1072,6 @@ def brute_force_connect(): logger.info('Here are the devices detected but unavailable') for device in unavailable: logger.info(f'{device.serial} ({device.status})') - time.sleep(retry_sleep(_)) # brute_force_connect if self.config.Emulator_Serial == 'auto' and available.count == 0: diff --git a/module/device/method/utils.py b/module/device/method/utils.py index e965509228..d17a287e92 100644 --- a/module/device/method/utils.py +++ b/module/device/method/utils.py @@ -52,7 +52,7 @@ def shell(self, from module.base.decorator import cached_property from module.logger import logger -RETRY_TRIES = 64 +RETRY_TRIES = 5 RETRY_DELAY = 3 # Patch uiautomator2 appdir From 20a178470e42abd5af0962016d28a9c64a201b07 Mon Sep 17 00:00:00 2001 From: fro0116 <18626656+fro0116@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:06:08 -0800 Subject: [PATCH 09/19] Handle success pages Revert "Handle success pages" This reverts commit d54c99bcda5e875068df93696e4a539a416faeca. Reapply "Handle success pages" This reverts commit 26ebcc7f7e048209e8263bdeb7722bc188a7f21f. w --- module/ui/page.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/module/ui/page.py b/module/ui/page.py index 2705a53a43..df4553fbbe 100644 --- a/module/ui/page.py +++ b/module/ui/page.py @@ -6,6 +6,7 @@ from module.raid.assets import * from module.retire.assets import DOCK_CHECK from module.ui.assets import * +from module.combat.assets import * from module.ui_white.assets import * @@ -354,3 +355,11 @@ def link(self, button, destination): page_hospital = Page(HOSIPITAL_CHECK) page_hospital.link(button=GOTO_MAIN_WHITE, destination=page_main) page_campaign_menu.link(button=CAMPAIGN_MENU_GOTO_EVENT, destination=page_hospital) + +# Combat +# page_battle_status_s = Page(BATTLE_STATUS_S) +# page_get_items_1 = Page(GET_ITEMS_1) +# page_battle_status_s.link(button=BATTLE_STATUS_S, destination=page_get_items_1) +# page_exp_info_s = Page(EXP_INFO_S) +# page_get_items_1.link(button=GET_ITEMS_1, destination=page_exp_info_s) +# page_exp_info_s.link(button=EXP_INFO_S, destination=page_unknown) \ No newline at end of file From 5df676775e4c1d0ec1fc87fc0159958533ac56f7 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Fri, 12 Jun 2026 10:36:55 -0700 Subject: [PATCH 10/19] Revert "Handle success pages" This reverts commit 729c731efdab6f104403c775919a2802b57a2dd7. --- module/ui/page.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/module/ui/page.py b/module/ui/page.py index df4553fbbe..2705a53a43 100644 --- a/module/ui/page.py +++ b/module/ui/page.py @@ -6,7 +6,6 @@ from module.raid.assets import * from module.retire.assets import DOCK_CHECK from module.ui.assets import * -from module.combat.assets import * from module.ui_white.assets import * @@ -355,11 +354,3 @@ def link(self, button, destination): page_hospital = Page(HOSIPITAL_CHECK) page_hospital.link(button=GOTO_MAIN_WHITE, destination=page_main) page_campaign_menu.link(button=CAMPAIGN_MENU_GOTO_EVENT, destination=page_hospital) - -# Combat -# page_battle_status_s = Page(BATTLE_STATUS_S) -# page_get_items_1 = Page(GET_ITEMS_1) -# page_battle_status_s.link(button=BATTLE_STATUS_S, destination=page_get_items_1) -# page_exp_info_s = Page(EXP_INFO_S) -# page_get_items_1.link(button=GET_ITEMS_1, destination=page_exp_info_s) -# page_exp_info_s.link(button=EXP_INFO_S, destination=page_unknown) \ No newline at end of file From 7fa452388ef618e211427216b5e77fb4241fcd75 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Fri, 14 Mar 2025 20:44:25 -0700 Subject: [PATCH 11/19] python version --- .gitignore | 2 +- .python-version | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 .python-version diff --git a/.gitignore b/.gitignore index 73ce58daea..7d3b10e98d 100644 --- a/.gitignore +++ b/.gitignore @@ -178,7 +178,7 @@ profile_default/ ipython_config.py # pyenv -.python-version +# .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. diff --git a/.python-version b/.python-version new file mode 100644 index 0000000000..7560320b40 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.7.9 \ No newline at end of file From 981ff2b7c5a5bdd0e0bd24fbb7545c8268ba4e47 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Mon, 21 Apr 2025 22:58:32 -0700 Subject: [PATCH 12/19] macos conda setup --- .python-version | 2 +- conda.yml | 218 ++++++++++++++++++++++++++++++++++++++++++++++++ setup.sh | 3 + start.sh | 18 ++++ 4 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 conda.yml create mode 100644 setup.sh create mode 100755 start.sh diff --git a/.python-version b/.python-version index 7560320b40..168da0f593 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.7.9 \ No newline at end of file +3.8.20 \ No newline at end of file diff --git a/conda.yml b/conda.yml new file mode 100644 index 0000000000..4c7547f28e --- /dev/null +++ b/conda.yml @@ -0,0 +1,218 @@ +name: alas +channels: + - anaconda + - conda-forge +dependencies: + - _mutex_mxnet=0.0.50=openblas + - aiofiles=22.1.0=py38hca03da5_0 + - anyio=1.3.1=py_0 + - aom=3.5.0=h7ea286d_0 + - asgiref=3.5.2=py38hca03da5_0 + - async_generator=1.10=pyhd3eb1b0_0 + - attrs=23.1.0=py38hca03da5_0 + - av=10.0.0=py38h846960b_3 + - blas=1.0=openblas + - brotli-python=1.0.9=py38hc377ac9_7 + - bzip2=1.0.8=h93a5062_5 + - c-ares=1.19.1=h80987f9_0 + - ca-certificates=2024.2.2=hf0a4a13_0 + - cairo=1.16.0=h302bd0f_5 + - certifi=2024.2.2=pyhd8ed1ab_0 + - cffi=1.16.0=py38h80987f9_0 + - charset-normalizer=2.0.4=pyhd3eb1b0_0 + - click=8.1.7=py38hca03da5_0 + - colorama=0.4.6=py38hca03da5_0 + - commonmark=0.9.1=pyhd3eb1b0_0 + - cryptography=41.0.3=py38hd4332d6_0 + - curio=1.4=pyhd3eb1b0_0 + - cyrus-sasl=2.1.28=h9131b1a_1 + - dataclasses=0.8=pyh6d0b6a4_7 + - eigen=3.3.7=h525c30c_1 + - exceptiongroup=1.0.4=py38hca03da5_0 + - expat=2.5.0=h313beb8_0 + - ffmpeg=5.1.2=gpl_hf318d42_106 + - font-ttf-dejavu-sans-mono=2.37=hd3eb1b0_0 + - font-ttf-inconsolata=2.001=hcb22688_0 + - font-ttf-source-code-pro=2.030=hd3eb1b0_0 + - font-ttf-ubuntu=0.83=h8b1ccd4_0 + - fontconfig=2.14.1=hee714a5_2 + - fonts-anaconda=1=h8fa9717_0 + - fonts-conda-ecosystem=1=hd3eb1b0_0 + - freetype=2.12.1=h1192e45_0 + - future=0.18.3=py38hca03da5_0 + - gettext=0.22.5=h8fbad5d_2 + - gettext-tools=0.22.5=h8fbad5d_2 + - giflib=5.2.1=h80987f9_3 + - glib=2.69.1=h514c7bf_2 + - gmp=6.2.1=hc377ac9_3 + - gnutls=3.7.9=hd26332c_0 + - graphite2=1.3.14=hc377ac9_1 + - gst-plugins-base=1.14.1=h313beb8_1 + - gstreamer=1.14.1=h80987f9_1 + - h11=0.12.0=pyhd3eb1b0_0 + - harfbuzz=4.3.0=he9eebac_1 + - hdf5=1.12.1=h05c076b_3 + - icu=68.1=hc377ac9_0 + - idna=3.4=py38hca03da5_0 + - imageio=2.27.0=pyh24c5eb1_0 + - importlib-metadata=6.0.0=py38hca03da5_0 + - inflection=0.5.1=py38hca03da5_0 + - jellyfish=0.11.2=py38hd0c8013_0 + - jpeg=9e=h80987f9_1 + - krb5=1.20.1=hf3e1bf2_1 + - lame=3.100=h1a28f6b_0 + - lcms2=2.12=hba8e193_0 + - lerc=3.0=hc377ac9_0 + - libasprintf=0.22.5=h8fbad5d_2 + - libasprintf-devel=0.22.5=h8fbad5d_2 + - libblas=3.9.0=1_h2ec9a88_netlib + - libcblas=3.9.0=5_h880f123_netlib + - libclang=14.0.6=default_h1b80db6_1 + - libclang13=14.0.6=default_h24352ff_1 + - libcurl=7.88.1=h3e2b118_2 + - libcxx=16.0.6=h4653b0c_0 + - libdeflate=1.17=h80987f9_1 + - libedit=3.1.20221030=h80987f9_0 + - libev=4.33=h1a28f6b_1 + - libffi=3.4.2=h3422bc3_5 + - libgettextpo=0.22.5=h8fbad5d_2 + - libgettextpo-devel=0.22.5=h8fbad5d_2 + - libgfortran=5.0.0=12_2_0_hd922786_32 + - libgfortran5=12.2.0=h0eea778_32 + - libiconv=1.17=h0d3ecfb_2 + - libidn2=2.3.4=h80987f9_0 + - libintl=0.22.5=h8fbad5d_2 + - libintl-devel=0.22.5=h8fbad5d_2 + - liblapack=3.9.0=5_h880f123_netlib + - libllvm14=14.0.6=h7ec7a93_3 + - libmxnet=1.5.1=openblas_h34268ac_0 + - libnghttp2=1.57.0=h62f6fdd_0 + - libopenblas=0.3.23=openmp_hc731615_0 + - libopus=1.3.1=h27ca646_1 + - libpng=1.6.39=h80987f9_0 + - libpq=12.15=h02f6b3c_1 + - libsodium=1.0.18=h1a28f6b_0 + - libsqlite=3.45.2=h091b4b1_0 + - libssh2=1.10.0=h02f6b3c_2 + - libtasn1=4.19.0=h80987f9_0 + - libtiff=4.5.1=h313beb8_0 + - libunistring=0.9.10=h1a28f6b_0 + - libvpx=1.11.0=hc377ac9_0 + - libwebp=1.3.2=ha3663a8_0 + - libwebp-base=1.3.2=h80987f9_0 + - libxml2=2.10.4=h372ba2a_0 + - libxslt=1.1.37=habca612_0 + - libzlib=1.2.13=h53f4e23_5 + - llvm-openmp=20.1.2=hdb05f8b_0 + - lxml=4.9.2=py38h43d3e64_0 + - lz4=4.3.2=py38h80987f9_0 + - lz4-c=1.9.4=h313beb8_0 + - mxnet=1.5.1=hca03da5_0 + - mysql=5.7.24=ha71a6ea_2 + - ncurses=6.4.20240210=h078ce10_0 + - nettle=3.9.1=h40ed0f5_0 + - numpy=1.24.4=py38ha84db1f_0 + - openblas=0.3.23=openmp_hf78f355_0 + - opencv=4.6.0=py38h8794c10_2 + - openh264=2.3.1=hb7217d7_2 + - openjpeg=2.3.0=h7a6adac_2 + - openssl=3.2.1=h0d3ecfb_1 + - outcome=1.1.0=pyhd3eb1b0_0 + - p11-kit=0.24.1=h29577a5_0 + - packaging=24.1=py38hca03da5_0 + - pcre=8.45=hc377ac9_0 + - pillow=10.0.1=py38h3b245a6_0 + - pip=24.0=pyhd8ed1ab_0 + - pixman=0.40.0=h1a28f6b_0 + - platformdirs=3.10.0=py38hca03da5_0 + - pooch=1.7.0=py38hca03da5_0 + - prettytable=2.2.1=pyhd8ed1ab_0 + - psutil=5.9.3=py38hb991d35_1 + - py-mxnet=1.5.1=py38h3f2eb1c_0 + - pycparser=2.21=pyhd3eb1b0_0 + - pydantic=1.10.12=py38h80987f9_1 + - pygments=2.15.1=py38hca03da5_1 + - pyopenssl=23.2.0=py38hca03da5_0 + - pysocks=1.7.1=py38hca03da5_0 + - python=3.8.19=h2469fbe_0_cpython + - python_abi=3.8=4_cp38 + - pyyaml=6.0.1=py38h80987f9_0 + - pyzmq=22.3.0=py38hc377ac9_2 + - qt-main=5.15.2=h9b4df51_9 + - qt-webengine=5.15.9=h2903aaf_7 + - qtwebkit=5.212=h19f419d_5 + - readline=8.2=h92ec313_1 + - requests=2.31.0=py38hca03da5_0 + - retrying=1.3.3=pyhd3eb1b0_2 + - rich=11.2.0=pyhd8ed1ab_0 + - scipy=1.10.1=py38h9d039d2_1 + - setuptools=69.2.0=pyhd8ed1ab_0 + - six=1.16.0=pyhd3eb1b0_1 + - sniffio=1.2.0=py38hca03da5_1 + - sortedcontainers=2.4.0=pyhd3eb1b0_0 + - sqlite=3.41.2=h80987f9_0 + - starlette=0.14.2=pyhd8ed1ab_0 + - svt-av1=1.4.1=h7ea286d_0 + - tk=8.6.13=h5083fa2_1 + - tqdm=4.65.0=py38h86d0a89_0 + - trio=0.22.0=py38hca03da5_0 + - typing-extensions=4.7.1=py38hca03da5_0 + - typing_extensions=4.7.1=py38hca03da5_0 + - urllib3=1.26.18=py38hca03da5_0 + - uvicorn=0.17.6=py38h10201cd_1 + - wcwidth=0.2.5=pyhd3eb1b0_0 + - websockets=12.0=py38h336bac9_0 + - wheel=0.43.0=pyhd8ed1ab_1 + - wrapt=1.13.1=py38hea4295b_0 + - x264=1!164.3095=h57fd34a_2 + - x265=3.5=hbc6ce65_3 + - xz=5.4.2=h80987f9_0 + - yaml=0.2.5=h1a28f6b_0 + - zeromq=4.3.4=hc377ac9_0 + - zipp=3.11.0=py38hca03da5_0 + - zlib=1.2.13=h53f4e23_5 + - zstd=1.5.5=hd90d995_0 + - pip: + - Deprecated==1.2.14 + - adbutils==0.11.0 + - alas-webapp==0.3.7.0 + - apkutils2==1.0.0 + - cached-property==1.5.2 + - cigam==0.0.3 + - cnocr==1.2.3 + - contourpy==1.1.1 + - cycler==0.12.1 + - decorator==5.1.1 + - deprecation==2.1.0 + - filelock==3.13.4 + - fonttools==4.51.0 + - gevent==24.2.1 + - gluoncv==0.6.0 + - greenlet==3.0.3 + - importlib_resources==6.4.0 + - kiwisolver==1.4.5 + - logzero==1.7.0 + - matplotlib==3.7.5 + - msgpack==1.0.8 + - onepush==1.3.0 + - packaging==20.9 + - portalocker==2.8.2 + - progress==1.6 + - py==1.11.0 + - pycryptodome==3.20.0 + - pyelftools==0.31 + - pyparsing==3.1.2 + - pypresence==4.2.1 + - python-dateutil==2.9.0.post0 + - pywebio==1.6.2 + - retry==0.9.2 + - tornado==6.4 + - ua-parser==0.18.0 + - uiautomator2==2.16.17 + - uiautomator2cache==0.3.0.1 + - user-agents==2.2.0 + - whichcraft==0.6.1 + - xmltodict==0.13.0 + - zerorpc==0.6.3 + - zope.event==5.0 + - zope.interface==6.2 \ No newline at end of file diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000000..7295fbca6e --- /dev/null +++ b/setup.sh @@ -0,0 +1,3 @@ +conda create --name alas +conda activate alas +conda env update --file conda.yml --prune \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100755 index 0000000000..aee29934da --- /dev/null +++ b/start.sh @@ -0,0 +1,18 @@ +# >>> conda initialize >>> +# !! Contents within this block are managed by 'conda init' !! +__conda_setup="$('/opt/homebrew/Caskroom/miniforge/base/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)" +if [ $? -eq 0 ]; then + eval "$__conda_setup" +else + if [ -f "/opt/homebrew/Caskroom/miniforge/base/etc/profile.d/conda.sh" ]; then + . "/opt/homebrew/Caskroom/miniforge/base/etc/profile.d/conda.sh" + else + export PATH="/opt/homebrew/Caskroom/miniforge/base/bin:$PATH" + fi +fi +unset __conda_setup +# <<< conda initialize <<< + +conda activate alas +python gui.py + From 2f24b18a6da1518007982c82dbe975e824054e17 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Tue, 22 Apr 2025 00:26:38 -0700 Subject: [PATCH 13/19] start script --- start.ps1 | 4 ++++ start.sh | 21 +++------------------ 2 files changed, 7 insertions(+), 18 deletions(-) create mode 100644 start.ps1 diff --git a/start.ps1 b/start.ps1 new file mode 100644 index 0000000000..0a8fb32cd3 --- /dev/null +++ b/start.ps1 @@ -0,0 +1,4 @@ +tailscale serve --https=20012 --bg http://localhost:22212 +adb connect 10.0.0.114:5555 +. .venv\Scripts\activate.ps1 +python gui.py --run alas --port 22212 \ No newline at end of file diff --git a/start.sh b/start.sh index aee29934da..8594039c41 100755 --- a/start.sh +++ b/start.sh @@ -1,18 +1,3 @@ -# >>> conda initialize >>> -# !! Contents within this block are managed by 'conda init' !! -__conda_setup="$('/opt/homebrew/Caskroom/miniforge/base/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)" -if [ $? -eq 0 ]; then - eval "$__conda_setup" -else - if [ -f "/opt/homebrew/Caskroom/miniforge/base/etc/profile.d/conda.sh" ]; then - . "/opt/homebrew/Caskroom/miniforge/base/etc/profile.d/conda.sh" - else - export PATH="/opt/homebrew/Caskroom/miniforge/base/bin:$PATH" - fi -fi -unset __conda_setup -# <<< conda initialize <<< - -conda activate alas -python gui.py - +tailscale serve --https=20012 --bg http://localhost:22212 +adb connect 10.0.0.114:5555 +docker compose up --build From 9e3c190e3e715733cecf62deb101ef599502b743 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Wed, 23 Apr 2025 20:58:05 -0700 Subject: [PATCH 14/19] Go home during wait w --- alas.py | 16 +++++++++------- module/device/app_control.py | 4 ++++ module/device/device.py | 9 +++++++++ module/device/method/adb.py | 7 +++++++ 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/alas.py b/alas.py index 6268c638a7..2af37ccebc 100644 --- a/alas.py +++ b/alas.py @@ -72,7 +72,7 @@ def run(self, command, skip_first_screenshot=False): return True except GameNotRunningError as e: logger.warning(e) - self.config.task_call('Restart') + self.start() return False except (GameStuckError, GameTooManyClickError) as e: logger.error(e) @@ -476,17 +476,19 @@ def get_next_task(self): self.is_first_task = False method = self.config.Optimization_WhenTaskQueueEmpty if method == 'close_game': - logger.info('Close game during wait') - self.device.app_stop() + logger.info('Go home during wait') + time.sleep(5) + self.run('goto_main') + self.device.go_home() release_resources() self.device.release_during_wait() if not self.wait_until(task.next_run): del_cached_property(self, 'config') continue - if task.command != 'Restart': - self.config.task_call('Restart') - del_cached_property(self, 'config') - continue + # if task.command != 'Restart': + # self.config.task_call('Restart') + # del_cached_property(self, 'config') + # continue elif method == 'goto_main': logger.info('Goto main page during wait') self.run('goto_main') diff --git a/module/device/app_control.py b/module/device/app_control.py index 8a681aa6a0..b8f369a8c4 100644 --- a/module/device/app_control.py +++ b/module/device/app_control.py @@ -48,6 +48,10 @@ def app_stop(self): else: self.app_stop_adb() + def go_home(self): + logger.info(f'Go home: {self.package}') + self.go_home_adb() + def hierarchy_timer_set(self, interval=None): if interval is None: interval = 0.1 diff --git a/module/device/device.py b/module/device/device.py index 736f528d6e..b1c71c1066 100644 --- a/module/device/device.py +++ b/module/device/device.py @@ -338,3 +338,12 @@ def app_stop(self): super().app_stop() self.stuck_record_clear() self.click_record_clear() + + def go_home(self): + if not self.config.Error_HandleError: + logger.critical('No app stop/start, because HandleError disabled') + logger.critical('Please enable Alas.Error.HandleError or manually login to AzurLane') + raise RequestHumanTakeover + super().go_home() + self.stuck_record_clear() + self.click_record_clear() diff --git a/module/device/method/adb.py b/module/device/method/adb.py index c4f7499f95..36aad7778b 100644 --- a/module/device/method/adb.py +++ b/module/device/method/adb.py @@ -388,6 +388,13 @@ def app_stop_adb(self, package_name=None): package_name = self.package self.adb_shell(['am', 'force-stop', package_name]) + @retry + def go_home_adb(self, package_name=None): + """ Stop one application: am force-stop""" + if not package_name: + package_name = self.package + self.adb_shell(['input', 'keyevent', 'KEYCODE_HOME']) + @retry def dump_hierarchy_adb(self, temp: str = '/data/local/tmp/hierarchy.xml') -> etree._Element: """ From 8c3b6da4904536105a51bb30464efb479a2576b2 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Mon, 5 May 2025 23:28:25 -0700 Subject: [PATCH 15/19] single task script --- run_single_task.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 run_single_task.py diff --git a/run_single_task.py b/run_single_task.py new file mode 100644 index 0000000000..5a91aa40e0 --- /dev/null +++ b/run_single_task.py @@ -0,0 +1,4 @@ +from alas import AzurLaneAutoScript + +alas = AzurLaneAutoScript() +alas.research() # or any other task like commission(), tactical(), dorm(), etc. \ No newline at end of file From 6639cab7064c824b27d846e5227381690a2bfc58 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Fri, 12 Jun 2026 21:33:13 -0700 Subject: [PATCH 16/19] Fix dockerfile on mac --- deploy/docker/Dockerfile | 102 +++++++++++++++++++++++++++++++++------ 1 file changed, 87 insertions(+), 15 deletions(-) diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile index 66d09ad073..dbd9a1f06a 100644 --- a/deploy/docker/Dockerfile +++ b/deploy/docker/Dockerfile @@ -1,23 +1,95 @@ +# syntax=docker/dockerfile:1.4 # docker build -t hgjazhgj/alas:latest . -# docker run -v ${PWD}:/app/AzurLaneAutoScript -p 22267:22267 --name alas -it --rm hgjazhgj/alas +# docker run -v ${PWD}:/app/AzurLaneAutoScript -p 22212:22212 --name alas -it --rm hgjazhgj/alas -FROM python:3.7-slim-bullseye +# Native arm64 needs source builds for some old scientific packages, so keep +# expensive steps split into cacheable layers. +ARG ALAS_DOCKER_PLATFORM=linux/arm64 +FROM --platform=${ALAS_DOCKER_PLATFORM} python:3.7-slim-bullseye +ARG WATCHEXEC_VERSION=2.5.1 WORKDIR /app/AzurLaneAutoScript COPY requirements.txt /tmp/requirements.txt # Initial download of UiAutomator2 is slow outside of China using appetizer mirror, switch to GitHub -RUN apt update \ - && apt install -y git adb libgomp1 openssh-client \ - && apt install -y build-essential pkg-config \ - && apt install -y libavformat-dev libavcodec-dev libavdevice-dev \ - && apt install -y libavutil-dev libswscale-dev libswresample-dev libavfilter-dev \ - && git config --global --add safe.directory '*' \ - && pip install Cython==0.29.37 \ - && pip install av==10.0.0 --no-build-isolation \ - && pip install -r /tmp/requirements.txt \ - && rm /tmp/requirements.txt \ - && rm -r ~/.cache/pip - -CMD python gui.py +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + adb \ + build-essential \ + ca-certificates \ + curl \ + gfortran \ + git \ + libavcodec-dev \ + libavdevice-dev \ + libavfilter-dev \ + libavformat-dev \ + libavutil-dev \ + libgomp1 \ + liblapack-dev \ + libopenblas-dev \ + libswresample-dev \ + libswscale-dev \ + openssh-client \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +RUN git config --global --add safe.directory '*' + +RUN set -eux; \ + arch="$(dpkg --print-architecture)"; \ + case "${arch}" in \ + amd64) watchexec_arch="x86_64-unknown-linux-musl" ;; \ + arm64) watchexec_arch="aarch64-unknown-linux-musl" ;; \ + *) echo "Unsupported architecture for watchexec: ${arch}" >&2; exit 1 ;; \ + esac; \ + curl -fsSL -o /tmp/watchexec.deb \ + "https://github.com/watchexec/watchexec/releases/download/v${WATCHEXEC_VERSION}/watchexec-${WATCHEXEC_VERSION}-${watchexec_arch}.deb"; \ + apt-get update; \ + apt-get install -y --no-install-recommends /tmp/watchexec.deb; \ + rm -f /tmp/watchexec.deb; \ + rm -rf /var/lib/apt/lists/* + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install Cython==0.29.37 + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install av==10.0.0 --no-build-isolation + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install numpy==1.16.6 + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install pybind11==2.4.3 + +ENV FFLAGS="-fallow-argument-mismatch" \ + FCFLAGS="-fallow-argument-mismatch" + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install scipy==1.4.1 --no-build-isolation + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install -r /tmp/requirements.txt \ + && rm /tmp/requirements.txt + +# PyPI mxnet 1.6.0 has no usable arm64 libmxnet.so. +RUN --mount=type=cache,target=/root/.cache/pip \ + case "$(uname -m)" in \ + aarch64|arm64) \ + pip uninstall -y mxnet \ + && pip install https://raw.githubusercontent.com/binss/python-wheel/main/mxnet-1.9.1-py3-none-any.whl \ + ;; \ + esac + +# Runtime libs required by the custom arm64 MXNet wheel. +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + libatlas3-base \ + libopencv-imgcodecs4.5 \ + && rm -rf /var/lib/apt/lists/* + +ENV LD_LIBRARY_PATH=/usr/local/mxnet \ + MXNET_LIBRARY_PATH=/usr/local/mxnet/libmxnet.so + +CMD ["watchexec", "--restart", "--poll", "2s", "--debounce", "1s", "--exts", "py,json,yaml,yml,toml,txt,html,css,js,ts,vue,png,jpg,jpeg,gif", "--watch", "alas.py", "--watch", "gui.py", "--watch", "module", "--watch", "campaign", "--watch", "assets", "--watch", "webapp", "--ignore", "**/.git/**", "--ignore", "**/__pycache__/**", "--ignore", "**/.pytest_cache/**", "--ignore", "**/.mypy_cache/**", "--ignore", "**/.ruff_cache/**", "--ignore", "**/.cache/**", "--ignore", "log/**", "--ignore", "logs/**", "--ignore", "tmp/**", "--ignore", "temp/**", "--", "python", "gui.py", "--host", "127.0.0.1", "--port", "22212"] From 527a039bc350159c5ff488381c916a07b517430e Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Sat, 13 Jun 2026 16:13:41 -0700 Subject: [PATCH 17/19] Add control api --- module/webui/app.py | 127 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/module/webui/app.py b/module/webui/app.py index 09fd070ac9..3e35dc95b1 100644 --- a/module/webui/app.py +++ b/module/webui/app.py @@ -1,5 +1,6 @@ import argparse import json +import os import queue import threading import time @@ -38,6 +39,9 @@ ) from pywebio.pin import pin, pin_on_change from pywebio.session import download, go_app, info, local, register_thread, run_js, set_env +from rich.console import Console +from starlette.responses import JSONResponse +from starlette.routing import Route import module.webui.lang as lang from module.config.config import AzurLaneConfig, Function @@ -97,6 +101,125 @@ task_handler = TaskHandler() +def _renderable_to_text(renderable) -> str: + console = Console(no_color=True, width=180) + with console.capture() as capture: + console.print(renderable) + return capture.get().strip() + + +def _is_error_line(line: str) -> bool: + lowered = line.lower() + return any( + needle in lowered + for needle in ( + "traceback", + "exception", + "critical", + "error", + "failed", + "crashed", + "request human takeover", + ) + ) + + +def _process_status(config_name: str): + manager = ProcessManager.get_manager(config_name) + logs = [_renderable_to_text(item) for item in manager.renderables[-160:]] + logs = [line for line in logs if line] + error_logs = [line for line in logs if _is_error_line(line)][-16:] + state = manager.state + if state == 1: + state_label = "running" + elif state == 2: + state_label = "stopped" + elif state == 3: + state_label = "error" + elif state == 4: + state_label = "update" + else: + state_label = "unknown" + last_log = logs[-1] if logs else None + last_error = error_logs[-1] if error_logs else (last_log if state == 3 else None) + return { + "config": config_name, + "alive": manager.alive, + "state": state, + "stateLabel": state_label, + "lastError": last_error, + "lastExitReason": last_log if not manager.alive else None, + "recentLogs": logs[-120:], + "recentErrors": [ + { + "time": datetime.now().isoformat(), + "message": line, + } + for line in error_logs + ], + } + + +async def _read_control_request(request): + config_name = request.query_params.get("config") or "alas" + try: + body = await request.json() + except Exception: + body = {} + if isinstance(body, dict) and body.get("config"): + config_name = str(body["config"]) + return config_name + + +def _authorize_control_request(request): + token = os.environ.get("ALAS_CONTROL_TOKEN") + if token and request.headers.get("x-alas-control-token") != token: + return JSONResponse({"error": "unauthorized"}, status_code=401) + client_host = request.client.host if request.client else "" + if client_host not in ("127.0.0.1", "::1", "localhost"): + return JSONResponse({"error": "forbidden"}, status_code=403) + return None + + +async def control_status(request): + denied = _authorize_control_request(request) + if denied: + return denied + config_name = await _read_control_request(request) + return JSONResponse(_process_status(config_name)) + + +async def control_start(request): + denied = _authorize_control_request(request) + if denied: + return denied + config_name = await _read_control_request(request) + manager = ProcessManager.get_manager(config_name) + manager.start(None, updater.event) + return JSONResponse(_process_status(config_name)) + + +async def control_stop(request): + denied = _authorize_control_request(request) + if denied: + return denied + config_name = await _read_control_request(request) + manager = ProcessManager.get_manager(config_name) + manager.stop() + return JSONResponse(_process_status(config_name)) + + +async def control_restart(request): + denied = _authorize_control_request(request) + if denied: + return denied + config_name = await _read_control_request(request) + manager = ProcessManager.get_manager(config_name) + manager.stop() + manager.start(None, updater.event) + return JSONResponse(_process_status(config_name)) + + class AlasGUI(Frame): ALAS_MENU: Dict[str, Dict[str, List[str]]] ALAS_ARGS: Dict[str, Dict[str, Dict[str, Dict[str, str]]]] @@ -1545,5 +1668,9 @@ def manage(): ], on_shutdown=[clearup], ) + app.routes.insert(0, Route("/api/control/status", control_status, methods=["GET"])) + app.routes.insert(0, Route("/api/control/start", control_start, methods=["POST"])) + app.routes.insert(0, Route("/api/control/stop", control_stop, methods=["POST"])) + app.routes.insert(0, Route("/api/control/restart", control_restart, methods=["POST"])) return app From 1dbc510bdfcf4ab355435ccabfe10acbe2ff85a0 Mon Sep 17 00:00:00 2001 From: Fred Owens Date: Thu, 18 Jun 2026 16:00:07 -0700 Subject: [PATCH 18/19] Fix build finish Update assets w t --- assets/jp/gacha/BUILD_FINISH_RESULTS.png | Bin 24182 -> 18431 bytes module/gacha/assets.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/jp/gacha/BUILD_FINISH_RESULTS.png b/assets/jp/gacha/BUILD_FINISH_RESULTS.png index a719ec55a89d1b2d570866a72f5005dbb451c483..6c88e5be917c978ea377617a283a168bb0eb03ff 100644 GIT binary patch literal 18431 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 NKvNr&CgZzF{{s=A8&m)Q literal 24182 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 diff --git a/module/gacha/assets.py b/module/gacha/assets.py index efb61b91db..5f88e13162 100644 --- a/module/gacha/assets.py +++ b/module/gacha/assets.py @@ -6,7 +6,7 @@ BUILD_CUBE_COUNT = Button(area={'cn': (853, 104, 938, 138), 'en': (872, 106, 925, 137), 'jp': (861, 108, 936, 134), 'tw': (872, 106, 925, 137)}, color={'cn': (59, 62, 73), 'en': (82, 84, 95), 'jp': (83, 86, 96), 'tw': (82, 84, 95)}, button={'cn': (853, 104, 938, 138), 'en': (872, 106, 925, 137), 'jp': (861, 108, 936, 134), 'tw': (872, 106, 925, 137)}, file={'cn': './assets/cn/gacha/BUILD_CUBE_COUNT.png', 'en': './assets/en/gacha/BUILD_CUBE_COUNT.png', 'jp': './assets/jp/gacha/BUILD_CUBE_COUNT.png', 'tw': './assets/tw/gacha/BUILD_CUBE_COUNT.png'}) BUILD_FINISH_ORDERS = Button(area={'cn': (1117, 95, 1265, 146), 'en': (1122, 99, 1261, 140), 'jp': (1141, 109, 1244, 134), 'tw': (1117, 95, 1265, 145)}, color={'cn': (182, 142, 84), 'en': (175, 132, 76), 'jp': (211, 167, 105), 'tw': (180, 140, 83)}, button={'cn': (1117, 95, 1265, 146), 'en': (1122, 99, 1261, 140), 'jp': (1141, 109, 1244, 134), 'tw': (1117, 95, 1265, 145)}, file={'cn': './assets/cn/gacha/BUILD_FINISH_ORDERS.png', 'en': './assets/en/gacha/BUILD_FINISH_ORDERS.png', 'jp': './assets/jp/gacha/BUILD_FINISH_ORDERS.png', 'tw': './assets/tw/gacha/BUILD_FINISH_ORDERS.png'}) -BUILD_FINISH_RESULTS = Button(area={'cn': (540, 193, 740, 229), 'en': (550, 187, 737, 219), 'jp': (550, 193, 738, 229), 'tw': (561, 193, 726, 230)}, color={'cn': (163, 193, 248), 'en': (158, 187, 234), 'jp': (159, 194, 248), 'tw': (157, 188, 241)}, button={'cn': (540, 193, 740, 229), 'en': (550, 187, 737, 219), 'jp': (550, 193, 738, 229), 'tw': (561, 193, 726, 230)}, file={'cn': './assets/cn/gacha/BUILD_FINISH_RESULTS.png', 'en': './assets/en/gacha/BUILD_FINISH_RESULTS.png', 'jp': './assets/jp/gacha/BUILD_FINISH_RESULTS.png', 'tw': './assets/tw/gacha/BUILD_FINISH_RESULTS.png'}) +BUILD_FINISH_RESULTS = Button(area={'cn': (540, 193, 740, 229), 'en': (550, 187, 737, 219), 'jp': (550, 193, 738, 229), 'tw': (561, 193, 726, 230)}, color={'cn': (163, 193, 248), 'en': (158, 187, 234), 'jp': (158, 193, 247), 'tw': (157, 188, 241)}, button={'cn': (540, 193, 740, 229), 'en': (550, 187, 737, 219), 'jp': (550, 193, 738, 229), 'tw': (561, 193, 726, 230)}, file={'cn': './assets/cn/gacha/BUILD_FINISH_RESULTS.png', 'en': './assets/en/gacha/BUILD_FINISH_RESULTS.png', 'jp': './assets/jp/gacha/BUILD_FINISH_RESULTS.png', 'tw': './assets/tw/gacha/BUILD_FINISH_RESULTS.png'}) BUILD_MINUS = Button(area={'cn': (569, 253, 613, 295), 'en': (525, 255, 565, 293), 'jp': (571, 255, 611, 293), 'tw': (569, 253, 613, 295)}, color={'cn': (80, 131, 200), 'en': (81, 132, 200), 'jp': (81, 132, 201), 'tw': (80, 131, 200)}, button={'cn': (569, 253, 613, 295), 'en': (525, 255, 565, 293), 'jp': (571, 255, 611, 293), 'tw': (569, 253, 613, 295)}, file={'cn': './assets/cn/gacha/BUILD_MINUS.png', 'en': './assets/en/gacha/BUILD_MINUS.png', 'jp': './assets/jp/gacha/BUILD_MINUS.png', 'tw': './assets/tw/gacha/BUILD_MINUS.png'}) BUILD_PLUS = Button(area={'cn': (748, 253, 792, 295), 'en': (704, 255, 744, 293), 'jp': (750, 255, 790, 293), 'tw': (748, 253, 792, 295)}, color={'cn': (85, 135, 203), 'en': (86, 135, 204), 'jp': (87, 136, 204), 'tw': (85, 135, 203)}, button={'cn': (748, 253, 792, 295), 'en': (704, 255, 744, 293), 'jp': (750, 255, 790, 293), 'tw': (748, 253, 792, 295)}, file={'cn': './assets/cn/gacha/BUILD_PLUS.png', 'en': './assets/en/gacha/BUILD_PLUS.png', 'jp': './assets/jp/gacha/BUILD_PLUS.png', 'tw': './assets/tw/gacha/BUILD_PLUS.png'}) BUILD_QUEUE_EMPTY = Button(area={'cn': (639, 362, 700, 409), 'en': (639, 362, 700, 409), 'jp': (639, 362, 700, 409), 'tw': (639, 362, 700, 409)}, color={'cn': (157, 151, 152), 'en': (157, 151, 152), 'jp': (157, 151, 152), 'tw': (157, 151, 152)}, button={'cn': (639, 362, 700, 409), 'en': (639, 362, 700, 409), 'jp': (639, 362, 700, 409), 'tw': (639, 362, 700, 409)}, file={'cn': './assets/cn/gacha/BUILD_QUEUE_EMPTY.png', 'en': './assets/en/gacha/BUILD_QUEUE_EMPTY.png', 'jp': './assets/jp/gacha/BUILD_QUEUE_EMPTY.png', 'tw': './assets/tw/gacha/BUILD_QUEUE_EMPTY.png'}) From c8ad0f62055bfaeb51b54900292f9ad3e9e0e703 Mon Sep 17 00:00:00 2001 From: fro0116 <18626656+fro0116@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:51:41 +0900 Subject: [PATCH 19/19] Add config Update alas.json Update alas.json Update alas.json w Update alas.json Update alas.json Update alas.json Update alas.json Update alas.json Update alas.json --- .gitignore | 3 + config/alas.json | 1960 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1963 insertions(+) create mode 100644 config/alas.json diff --git a/.gitignore b/.gitignore index 7d3b10e98d..2a63ff51fc 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,9 @@ config/reloadalas test.py test/ +!config/alas.json +.DS_Store + # Created by .ignore support plugin (hsz.mobi) ### JetBrains template diff --git a/config/alas.json b/config/alas.json new file mode 100644 index 0000000000..397c1f4030 --- /dev/null +++ b/config/alas.json @@ -0,0 +1,1960 @@ +{ + "Alas": { + "Emulator": { + "Serial": "10.0.0.114:5555", + "PackageName": "com.YoStarJP.AzurLane", + "ServerName": "jp-14", + "ScreenshotMethod": "ADB", + "ControlMethod": "MaaTouch", + "ScreenshotDedithering": false, + "AdbRestart": false + }, + "EmulatorInfo": { + "Emulator": "BlueStacks5", + "name": "Rvc64", + "path": "C:/Program Files/BlueStacks_nxt/HD-Player.exe" + }, + "Error": { + "HandleError": true, + "SaveError": true, + "OnePushConfig": "provider: null", + "ScreenshotLength": 32 + }, + "Optimization": { + "ScreenshotInterval": 0.3, + "CombatScreenshotInterval": 1.0, + "TaskHoardingDuration": 0, + "WhenTaskQueueEmpty": "close_game" + }, + "DropRecord": { + "SaveFolder": "./screenshots", + "AzurStatsID": "p7sbjtzau9w4ym6k12035elhqirncfx8", + "API": "default", + "ResearchRecord": "do_not", + "CommissionRecord": "do_not", + "CombatRecord": "do_not", + "OpsiRecord": "do_not", + "MeowfficerBuy": "do_not", + "MeowfficerTalent": "do_not" + }, + "Storage": { + "Storage": {} + } + }, + "General": { + "Retirement": { + "RetireMode": "enhance" + }, + "OneClickRetire": { + "KeepLimitBreak": "keep_limit_break" + }, + "Enhance": { + "ShipToEnhance": "all", + "Filter": null, + "CheckPerCategory": 5 + }, + "OldRetire": { + "N": true, + "R": true, + "SR": false, + "SSR": false, + "RetireAmount": "retire_all" + }, + "Storage": { + "Storage": {} + } + }, + "Restart": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Restart", + "SuccessInterval": 0, + "FailureInterval": 0, + "ServerUpdate": "00:00" + }, + "Storage": { + "Storage": {} + } + }, + "Main": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-15 19:22:08", + "Command": "Main", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "10-4", + "Event": "campaign_main", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 4000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 3, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 4, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_mob_fleet2_boss" + }, + "Submarine": { + "Fleet": 1, + "Mode": "every_combat", + "AutoSearchMode": "sub_auto_call", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 43, + "Fleet1Record": "2026-06-14 21:14:24", + "Fleet1Control": "prevent_green_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 117, + "Fleet2Record": "2026-06-14 21:14:24", + "Fleet2Control": "prevent_green_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": true, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.5 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "Main2": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-24 21:12:55", + "Command": "Main2", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "4-1", + "Event": "campaign_main", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_all_fleet2_standby" + }, + "Submarine": { + "Fleet": 0, + "Mode": "do_not_use", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "ignore", + "Fleet1Value": 36, + "Fleet1Record": "2024-11-23 05:14:04", + "Fleet1Control": "prevent_red_face", + "Fleet1Recover": "dormitory_floor_1", + "Fleet1Oath": false, + "Fleet2Value": 150, + "Fleet2Record": "2024-11-23 05:14:04", + "Fleet2Control": "prevent_green_face", + "Fleet2Recover": "dormitory_floor_2", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": false, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "Main3": { + "Scheduler": { + "Enable": false, + "NextRun": "2020-01-01 00:00:00", + "Command": "Main3", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "12-4", + "Event": "campaign_main", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": false, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 3, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 4, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_mob_fleet2_boss" + }, + "Submarine": { + "Fleet": 1, + "Mode": "every_combat", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 111, + "Fleet1Record": "2025-03-03 01:40:20", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2025-03-03 01:40:20", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": true, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "GemsFarming": { + "Scheduler": { + "Enable": false, + "NextRun": "2024-03-23 18:12:03", + "Command": "GemsFarming", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "GemsFarming": { + "CommonCV": "any", + "ChangeVanguard": "ship", + "CommonDD": "any", + "CommissionLimit": false + }, + "Campaign": { + "Name": "4-1", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 10000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_all_fleet2_standby" + }, + "Storage": { + "Storage": {} + } + }, + "EventGeneral": { + "EventGeneral": { + "PtLimit": 0, + "TimeLimit": "2020-01-01 00:00:00" + }, + "TaskBalancer": { + "Enable": false, + "CoinLimit": 10000, + "TaskCall": "Main" + }, + "Storage": { + "Storage": {} + } + }, + "Event": { + "Scheduler": { + "Enable": false, + "NextRun": "2025-11-05 18:39:22", + "Command": "Event", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "D3", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 2000, + "RunCount": 0, + "MapAchievement": "map_3_stars", + "StageIncrease": true, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 2, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_mob_fleet2_boss" + }, + "Submarine": { + "Fleet": 1, + "Mode": "hunt_and_boss", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 138, + "Fleet1Record": "2026-06-04 18:25:57", + "Fleet1Control": "prevent_green_face", + "Fleet1Recover": "dormitory_floor_1", + "Fleet1Oath": false, + "Fleet2Value": 148, + "Fleet2Record": "2026-06-04 18:25:57", + "Fleet2Control": "prevent_green_face", + "Fleet2Recover": "dormitory_floor_1", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": false, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "Event2": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-21 08:26:38", + "Command": "Event2", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "B3", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_all_fleet2_standby" + }, + "Submarine": { + "Fleet": 1, + "Mode": "do_not_use", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "ignore", + "Fleet1Value": 56, + "Fleet1Record": "2026-06-19 01:07:00", + "Fleet1Control": "prevent_green_face", + "Fleet1Recover": "dormitory_floor_1", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2026-06-19 01:07:00", + "Fleet2Control": "prevent_green_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": true, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "Raid": { + "Scheduler": { + "Enable": false, + "NextRun": "2024-03-29 15:42:00", + "Command": "Raid", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Raid": { + "Mode": "easy", + "UseTicket": false + }, + "Campaign": { + "Name": "dynamic", + "Event": "raid_20260212", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": false, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 9000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 150, + "Fleet1Record": "2024-03-31 03:24:23", + "Fleet1Control": "keep_exp_bonus", + "Fleet1Recover": "dormitory_floor_2", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2020-01-01 00:00:00", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "Storage": { + "Storage": {} + } + }, + "Hospital": { + "Scheduler": { + "Enable": false, + "NextRun": "2025-04-10 08:00:00", + "Command": "Hospital", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Hospital": { + "UseRecommendFleet": false + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 111, + "Fleet1Record": "2025-03-29 17:59:18", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2020-01-01 00:00:00", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "Storage": { + "Storage": {} + } + }, + "Coalition": { + "Scheduler": { + "Enable": false, + "NextRun": "2025-07-01 07:53:58", + "Command": "Coalition", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "dynamic", + "Event": "coalition_20260122", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": false, + "Use2xBook": false, + "AmbushEvade": true + }, + "Coalition": { + "Mode": "normal", + "Fleet": "single" + }, + "StopCondition": { + "OilLimit": 4000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 61, + "Fleet1Record": "2025-07-02 23:38:12", + "Fleet1Control": "prevent_green_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2020-01-01 00:00:00", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "Storage": { + "Storage": {} + } + }, + "MaritimeEscort": { + "Scheduler": { + "Enable": false, + "NextRun": "2020-01-01 00:00:00", + "Command": "MaritimeEscort", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "MaritimeEscort": { + "Enable": true + }, + "Storage": { + "Storage": {} + } + }, + "WarArchives": { + "Scheduler": { + "Enable": false, + "NextRun": "2020-01-01 00:00:00", + "Command": "WarArchives", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "D3", + "Event": "war_archives_20210225_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_mob_fleet2_boss" + }, + "Submarine": { + "Fleet": 0, + "Mode": "do_not_use", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 119, + "Fleet1Record": "2020-01-01 00:00:00", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2020-01-01 00:00:00", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": false, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "EventA": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-25 08:00:00", + "Command": "EventA", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "EventDaily": { + "StageFilter": "A1 > A2 > A3", + "LastStage": "a3" + }, + "Campaign": { + "Name": "dynamic", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_all_fleet2_standby" + }, + "Submarine": { + "Fleet": 0, + "Mode": "do_not_use", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "ignore", + "Fleet1Value": 105, + "Fleet1Record": "2024-11-21 01:18:21", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 117, + "Fleet2Record": "2024-11-21 01:18:21", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": false, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "EventB": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-25 08:00:00", + "Command": "EventB", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "EventDaily": { + "StageFilter": "B1 > B2 > B3", + "LastStage": "b3" + }, + "Campaign": { + "Name": "dynamic", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_all_fleet2_standby" + }, + "Submarine": { + "Fleet": 0, + "Mode": "do_not_use", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "ignore", + "Fleet1Value": 99, + "Fleet1Record": "2024-11-21 01:40:46", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 117, + "Fleet2Record": "2024-11-21 01:40:46", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": false, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "EventC": { + "Scheduler": { + "Enable": false, + "NextRun": "2024-05-31 00:00:00", + "Command": "EventC", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "EventDaily": { + "StageFilter": "C1 > C2 > C3", + "LastStage": "c3" + }, + "Campaign": { + "Name": "dynamic", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 5, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_mob_fleet2_boss" + }, + "Submarine": { + "Fleet": 1, + "Mode": "hunt_and_boss", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 99, + "Fleet1Record": "2024-05-30 05:01:03", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 117, + "Fleet2Record": "2024-05-30 05:01:03", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": false, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "EventD": { + "Scheduler": { + "Enable": false, + "NextRun": "2024-05-31 00:00:00", + "Command": "EventD", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "EventDaily": { + "StageFilter": "D1 > D2 > D3", + "LastStage": "d3" + }, + "Campaign": { + "Name": "dynamic", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 3, + "Fleet2": 5, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_mob_fleet2_boss" + }, + "Submarine": { + "Fleet": 1, + "Mode": "hunt_and_boss", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 95, + "Fleet1Record": "2024-05-30 05:31:09", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 117, + "Fleet2Record": "2024-05-30 05:31:09", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": false, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "EventSp": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-25 08:00:00", + "Command": "EventSp", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "sp", + "Event": "event_20240521_cn", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": true, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Fleet": { + "Fleet1": 1, + "Fleet1Formation": "double_line", + "Fleet1Mode": "combat_auto", + "Fleet1Step": 2, + "Fleet2": 2, + "Fleet2Formation": "double_line", + "Fleet2Mode": "combat_auto", + "Fleet2Step": 2, + "FleetOrder": "fleet1_mob_fleet2_boss" + }, + "Submarine": { + "Fleet": 1, + "Mode": "every_combat", + "AutoSearchMode": "sub_standby", + "DistanceToBoss": "2_grid_to_boss" + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 107, + "Fleet1Record": "2026-06-24 08:50:14", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 117, + "Fleet2Record": "2026-06-24 08:50:14", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "HpControl": { + "UseHpBalance": true, + "UseEmergencyRepair": false, + "UseLowHpRetreat": false, + "HpBalanceThreshold": 0.2, + "HpBalanceWeight": "1000, 1000, 1000", + "RepairUseSingleThreshold": 0.3, + "RepairUseMultiThreshold": 0.6, + "LowHpRetreatThreshold": 0.3 + }, + "EnemyPriority": { + "EnemyScaleBalanceWeight": "default_mode" + }, + "Storage": { + "Storage": {} + } + }, + "RaidDaily": { + "Scheduler": { + "Enable": false, + "NextRun": "2025-02-06 07:00:00", + "Command": "RaidDaily", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "RaidDaily": { + "StageFilter": "easy > ex" + }, + "Campaign": { + "Name": "dynamic", + "Event": "raid_20260212", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": false, + "Use2xBook": false, + "AmbushEvade": true + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 87, + "Fleet1Record": "2025-02-05 08:15:52", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2020-01-01 00:00:00", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "Storage": { + "Storage": {} + } + }, + "CoalitionSp": { + "Scheduler": { + "Enable": false, + "NextRun": "2025-07-10 08:00:00", + "Command": "CoalitionSp", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "sp", + "Event": "coalition_20260122", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": false, + "Use2xBook": false, + "AmbushEvade": true + }, + "Coalition": { + "Mode": "sp", + "Fleet": "single" + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 117, + "Fleet1Record": "2025-07-09 08:33:47", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2020-01-01 00:00:00", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "Storage": { + "Storage": {} + } + }, + "Commission": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 13:51:56", + "Command": "Commission", + "SuccessInterval": "30-60", + "FailureInterval": "30-60", + "ServerUpdate": "00:00" + }, + "Commission": { + "PresetFilter": "cube_24h", + "CustomFilter": "DailyEvent > Gem-4 > Gem-2 > Gem-8 > ExtraCube-0:30\n> UrgentCube-1:30 > UrgentCube-1:45 > UrgentCube-3\n> ExtraDrill-5:20 > ExtraDrill-2 > ExtraDrill-3:20\n> UrgentCube-2:15 > UrgentCube-4\n> ExtraDrill-1 > UrgentCube-6 > ExtraCube-1:30\n> ExtraDrill-2:40 > ExtraDrill-0:20\n> Major > DailyChip > DailyResource\n> ExtraPart-0:30 > ExtraOil-1 > UrgentBox-6\n> ExtraCube-3 > ExtraPart-1 > UrgentBox-3\n> ExtraCube-4 > ExtraPart-1:30 > ExtraOil-4\n> UrgentBox-1 > ExtraCube-5 > UrgentBox-1\n> ExtraCube-8 > ExtraOil-8\n> UrgentDrill-4 > UrgentDrill-2:40 > UrgentDrill-2\n> UrgentDrill-1 > UrgentDrill-1:30 > UrgentDrill-1:10\n> Extra-0:20 > Extra-0:30 > Extra-1:00 > Extra-1:30 > Extra-2:00\n> shortest", + "DoMajorCommission": false + }, + "Storage": { + "Storage": {} + } + }, + "Tactical": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 13:48:41", + "Command": "Tactical", + "SuccessInterval": "30-60", + "FailureInterval": "120-240", + "ServerUpdate": "00:00" + }, + "Tactical": { + "TacticalFilter": "SameT1 > BlueT1 > YellowT1 > RedT1 > SameT2 > BlueT2 > YellowT2 > RedT2 > SameT3 > BlueT3 > YellowT3 > RedT3\n> SameT3 > SameT2 > SameT1\n> BlueT3 > YellowT3 > RedT3\n> BlueT4 > YellowT4 > RedT4\n> BlueT1 > YellowT1 > RedT1\n> first", + "RapidTrainingSlot": "do_not_use" + }, + "ControlExpOverflow": { + "Enable": true, + "T4Allow": 100, + "T3Allow": 100, + "T2Allow": 200, + "T1Allow": 200 + }, + "AddNewStudent": { + "Enable": true, + "Favorite": false, + "MinLevel": 50 + }, + "Storage": { + "Storage": {} + } + }, + "Research": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 13:13:58", + "Command": "Research", + "SuccessInterval": "30-60", + "FailureInterval": "30-60", + "ServerUpdate": "00:00" + }, + "Research": { + "UseCube": "only_05_hour", + "UseCoin": "only_05_hour", + "UsePart": "always_use", + "AllowDelay": true, + "PresetFilter": "series_8_blueprint_305", + "CustomFilter": "Q0.5 > H0.5 > H1 > H2 > H4 > Q1 > Q2 > Q4 > reset > G1.5 > G2.5 > cheapest\n> S5-Q1 > S5-DR5 > S5-DR8 > S5-G4 > S5-PRY2.5 > 1 > S5-Q2 > reset\n> S5-G2.5 > S5-PRY5 > S5-PRY8 > 1.5 > 2 > S5-Q4 > 2.5 > 3\n> Q4 > G4 > 4 > 5 > S5-C6 > C6 > 6 > S5-C8 > 8\n> S5-C12 > 12" + }, + "Storage": { + "Storage": {} + } + }, + "Dorm": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 13:39:43", + "Command": "Dorm", + "SuccessInterval": 278, + "FailureInterval": 278, + "ServerUpdate": "00:00" + }, + "Dorm": { + "Collect": true, + "Feed": true, + "FeedFilter": "20000 > 10000 > 5000 > 3000 > 2000 > 1000" + }, + "BuyFurniture": { + "Enable": true, + "BuyOption": "all", + "LastRun": "2026-06-21 23:42:55" + }, + "Storage": { + "Storage": {} + } + }, + "Meowfficer": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Meowfficer", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Meowfficer": { + "BuyAmount": 1, + "FortChoreMeowfficer": true + }, + "MeowfficerTrain": { + "Enable": false, + "Mode": "seamlessly", + "RetainTalentedGold": false, + "RetainTalentedPurple": true, + "EnhanceIndex": 12, + "MaxFeedLevel": 5 + }, + "Storage": { + "Storage": {} + } + }, + "Guild": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 14:00:00", + "Command": "Guild", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00, 06:00, 12:00, 18:00, 21:00" + }, + "GuildLogistics": { + "Enable": true, + "SelectNewMission": true, + "ExchangeFilter": "PlateTorpedoT1 > PlateAntiAirT1 > PlatePlaneT1 > PlateGunT1 > PlateGeneralT1\n> PlateTorpedoT2 > PlateAntiAirT2 > PlatePlaneT2 > PlateGunT2 > PlateGeneralT2\n> PlateTorpedoT3 > PlateAntiAirT3 > PlatePlaneT3 > PlateGunT3 > PlateGeneralT3\n> OxyCola > Coolant > Merit > Coin > Oil" + }, + "GuildOperation": { + "Enable": true, + "SelectNewOperation": true, + "NewOperationMaxDate": 15, + "JoinThreshold": 1, + "AttackBoss": true, + "BossFleetRecommend": true + }, + "Storage": { + "Storage": {} + } + }, + "Reward": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 15:31:52", + "Command": "Reward", + "SuccessInterval": "120-240", + "FailureInterval": "120-240", + "ServerUpdate": "00:00" + }, + "Reward": { + "CollectOil": true, + "CollectCoin": true, + "CollectExp": true, + "CollectMission": true, + "CollectWeeklyMission": true + }, + "Storage": { + "Storage": {} + } + }, + "Awaken": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Awaken", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Awaken": { + "LevelCap": "level120", + "Favourite": false + }, + "Storage": { + "Storage": {} + } + }, + "Daily": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Daily", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Daily": { + "UseDailySkip": true, + "EscortMission": "first", + "EscortMissionFleet": 1, + "AdvanceMission": "first", + "AdvanceMissionFleet": 1, + "FierceAssault": "first", + "FierceAssaultFleet": 1, + "TacticalTraining": "second", + "TacticalTrainingFleet": 1, + "SupplyLineDisruption": "second", + "ModuleDevelopment": "first", + "ModuleDevelopmentFleet": 1, + "EmergencyModuleDevelopment": "first", + "EmergencyModuleDevelopmentFleet": 1 + }, + "Storage": { + "Storage": {} + } + }, + "Hard": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Hard", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Hard": { + "HardStage": "13-4", + "HardFleet": 2 + }, + "Storage": { + "Storage": {} + } + }, + "Exercise": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 20:00:00", + "Command": "Exercise", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00, 12:00, 18:00" + }, + "Exercise": { + "OpponentChooseMode": "max_exp", + "OpponentTrial": 1, + "ExerciseStrategy": "aggressive", + "LowHpThreshold": 0, + "LowHpConfirmWait": 3, + "OpponentRefreshValue": 0, + "OpponentRefreshRecord": "2026-06-25 08:32:39" + }, + "Storage": { + "Storage": {} + } + }, + "ShopFrequent": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 20:00:00", + "Command": "ShopFrequent", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00, 12:00, 18:00" + }, + "GeneralShop": { + "UseGems": false, + "Refresh": false, + "BuySkinBox": true, + "ConsumeCoins": true, + "Filter": "BookT3 > BookT2 > BookT1 > PlateT4 > PlateRandomT4 > FoodT6 > FoodT5 > Chip > PlateT3\n> Cube\n> FoodT6 > FoodT5" + }, + "Storage": { + "Storage": {} + } + }, + "ShopOnce": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "ShopOnce", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "GuildShop": { + "Refresh": true, + "Filter": "PlateT4 > BookT3 > PR > CatT3 > Chip > BookT2 > Retrofit > FoodT6 > FoodT5 > CatT2 > BoxT4 > PlateT3 > PlateT2", + "BOX_T3": "ironblood", + "BOX_T4": "ironblood", + "BOOK_T2": "red", + "BOOK_T3": "red", + "RETROFIT_T2": "cl", + "RETROFIT_T3": "cl", + "PLATE_T2": "general", + "PLATE_T3": "general", + "PLATE_T4": "general", + "PR1": "neptune", + "PR2": "seattle", + "PR3": "cheshire" + }, + "MedalShop2": { + "Filter": "DR > PR\n> BookRedT3 > BookYellowT3 > BookBlueT3\n> BookRedT2 > BookYellowT2 > BookBlueT2\n> RetrofitT3\n> FoodT6 > FoodT5\n> PlateGeneralT3 > PlateWildT3", + "RETROFIT_T1": "cl", + "RETROFIT_T2": "cl", + "RETROFIT_T3": "cl", + "PLATE_T1": "general", + "PLATE_T2": "general", + "PLATE_T3": "general" + }, + "MeritShop": { + "Refresh": false, + "Filter": "Cube" + }, + "CoreShop": { + "Filter": "Array" + }, + "Storage": { + "Storage": {} + } + }, + "Shipyard": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 12:00:00", + "Command": "Shipyard", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "04:00" + }, + "ShipyardDr": { + "ResearchSeries": 5, + "ShipIndex": 1, + "BuyAmount": 2, + "LastRun": "2020-01-01 00:00:00" + }, + "Shipyard": { + "ResearchSeries": 6, + "ShipIndex": 1, + "BuyAmount": 2, + "LastRun": "2020-01-01 00:00:00" + }, + "Storage": { + "Storage": {} + } + }, + "Gacha": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Gacha", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Gacha": { + "Pool": "event", + "Amount": 3, + "UseTicket": true, + "UseDrill": true + }, + "Storage": { + "Storage": {} + } + }, + "Freebies": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Freebies", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "BattlePass": { + "Collect": true + }, + "DataKey": { + "Collect": true, + "ForceCollect": false + }, + "Mail": { + "ClaimMerit": true, + "ClaimMaintenance": true, + "ClaimTradeLicense": true, + "DeleteCollected": true + }, + "SupplyPack": { + "Collect": true, + "DayOfWeek": 0 + }, + "Storage": { + "Storage": {} + } + }, + "Minigame": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "Minigame", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Storage": { + "Storage": {} + } + }, + "PrivateQuarters": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "PrivateQuarters", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "PrivateQuarters": { + "BuyRoses": true, + "BuyCake": false, + "TargetInteract": true, + "TargetShip": "aegir" + }, + "Storage": { + "Storage": {} + } + }, + "OpsiGeneral": { + "OpsiGeneral": { + "UseLogger": true, + "BuyActionPointLimit": 0, + "OilLimit": 1000, + "RepairThreshold": 0.4, + "DoRandomMapEvent": true, + "AkashiShopFilter": "ActionPoint > PurpleCoins" + }, + "Storage": { + "Storage": {} + } + }, + "OpsiAshBeacon": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "OpsiAshBeacon", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "OpsiAshBeacon": { + "AttackMode": "current", + "OneHitMode": true, + "DossierAutoAttackMode": true, + "RequestAssist": true, + "EnsureFullyCollected": true + }, + "Storage": { + "Storage": {} + } + }, + "OpsiAshAssist": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "OpsiAshAssist", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "OpsiAshAssist": { + "Tier": 15 + }, + "Storage": { + "Storage": {} + } + }, + "OpsiExplore": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-30 08:00:00", + "Command": "OpsiExplore", + "SuccessInterval": 0, + "FailureInterval": 0, + "ServerUpdate": "00:00" + }, + "OpsiExplore": { + "SpecialRadar": false, + "ForceRun": false, + "LastZone": 0 + }, + "OpsiFleet": { + "Fleet": 1, + "Submarine": false + }, + "Storage": { + "Storage": {} + } + }, + "OpsiShop": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-29 08:00:00", + "Command": "OpsiShop", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "OpsiShop": { + "PresetFilter": "all", + "CustomFilter": "LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins\n> GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart\n> OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1\n> METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator" + }, + "Storage": { + "Storage": {} + } + }, + "OpsiVoucher": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-30 08:00:00", + "Command": "OpsiVoucher", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "OpsiVoucher": { + "Filter": "LoggerAbyssal > LoggerObscure > Book > Fragment" + }, + "Storage": { + "Storage": {} + } + }, + "OpsiDaily": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "OpsiDaily", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "OpsiDaily": { + "DoMission": true, + "UseTuningSample": true + }, + "OpsiFleet": { + "Fleet": 1, + "Submarine": false + }, + "Storage": { + "Storage": {} + } + }, + "OpsiObscure": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "OpsiObscure", + "SuccessInterval": 60, + "FailureInterval": 60, + "ServerUpdate": "00:00" + }, + "OpsiObscure": { + "ForceRun": false + }, + "OpsiFleet": { + "Fleet": 1, + "Submarine": true + }, + "Storage": { + "Storage": {} + } + }, + "OpsiAbyssal": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-25 20:00:00", + "Command": "OpsiAbyssal", + "SuccessInterval": 60, + "FailureInterval": 60, + "ServerUpdate": "00:00, 12:00" + }, + "OpsiAbyssal": { + "ForceRun": false + }, + "OpsiFleetFilter": { + "Filter": "Fleet-2 > CallSubmarine > Fleet-3 > Fleet-4 > Fleet-1" + }, + "Storage": { + "Storage": {} + } + }, + "OpsiArchive": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-30 08:00:00", + "Command": "OpsiArchive", + "SuccessInterval": 60, + "FailureInterval": 60, + "ServerUpdate": "00:00" + }, + "OpsiFleet": { + "Fleet": 1, + "Submarine": false + }, + "Storage": { + "Storage": {} + } + }, + "OpsiStronghold": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-26 08:00:00", + "Command": "OpsiStronghold", + "SuccessInterval": 60, + "FailureInterval": 60, + "ServerUpdate": "00:00" + }, + "OpsiStronghold": { + "ForceRun": false + }, + "OpsiFleetFilter": { + "Filter": "Fleet-2 > CallSubmarine > Fleet-3 > Fleet-4 > Fleet-1" + }, + "Storage": { + "Storage": {} + } + }, + "OpsiMonthBoss": { + "Scheduler": { + "Enable": true, + "NextRun": "2026-06-30 08:00:00", + "Command": "OpsiMonthBoss", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "OpsiMonthBoss": { + "Mode": "normal_hard", + "CheckAdaptability": true, + "ForceRun": false + }, + "OpsiFleetFilter": { + "Filter": "Fleet-4 > CallSubmarine > Fleet-2 > Fleet-3 > Fleet-1" + }, + "Storage": { + "Storage": {} + } + }, + "OpsiMeowfficerFarming": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-07 17:20:14", + "Command": "OpsiMeowfficerFarming", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "OpsiMeowfficerFarming": { + "ActionPointPreserve": 1000, + "HazardLevel": 5, + "TargetZone": 0 + }, + "OpsiFleet": { + "Fleet": 1, + "Submarine": false + }, + "Storage": { + "Storage": {} + } + }, + "OpsiHazard1Leveling": { + "Scheduler": { + "Enable": false, + "NextRun": "2026-06-07 17:20:14", + "Command": "OpsiHazard1Leveling", + "SuccessInterval": 30, + "FailureInterval": 60, + "ServerUpdate": "00:00, 12:00" + }, + "OpsiHazard1Leveling": { + "TargetZone": 0 + }, + "OpsiFleet": { + "Fleet": 1, + "Submarine": false + }, + "Storage": { + "Storage": {} + } + }, + "OpsiCrossMonth": { + "Scheduler": { + "Enable": false, + "NextRun": "2020-01-01 00:00:00", + "Command": "OpsiCrossMonth", + "SuccessInterval": 0, + "FailureInterval": 120, + "ServerUpdate": "00:00" + }, + "Storage": { + "Storage": {} + } + }, + "Daemon": { + "Daemon": { + "EnterMap": true + }, + "Storage": { + "Storage": {} + } + }, + "OpsiDaemon": { + "OpsiDaemon": { + "RepairShip": true, + "SelectEnemy": true + }, + "Storage": { + "Storage": {} + } + }, + "EventStory": { + "EventStory": { + "SkipBattle": true + }, + "Storage": { + "Storage": {} + } + }, + "Benchmark": { + "Benchmark": { + "DeviceType": "android_phone", + "TestScene": "screenshot_click" + }, + "Storage": { + "Storage": {} + } + }, + "AzurLaneUncensored": { + "AzurLaneUncensored": { + "Repository": "https://gitee.com/LmeSzinc/AzurLaneUncensored" + }, + "Storage": { + "Storage": {} + } + }, + "GameManager": { + "GameManager": { + "AutoRestart": false + }, + "Storage": { + "Storage": {} + } + } +} \ No newline at end of file