refactor: OCR on ONNX Runtime, WebUI on FastAPI, desktop shell on Tauri 2 - #5885
Open
Joxos wants to merge 139 commits into
Open
refactor: OCR on ONNX Runtime, WebUI on FastAPI, desktop shell on Tauri 2#5885Joxos wants to merge 139 commits into
Joxos wants to merge 139 commits into
Conversation
- Convert 5 self-trained densenet-lite-gru models to ONNX (weights preserved) - Rewrite AlOcr as an onnxruntime backend, API and inference behavior unchanged - Replace zerorpc/gevent OCR RPC with plain socket + pickle - Adapt module/base/utils.py to opencv 4.11 API changes - Add dev_tools/ocr_convert: model builder and mxnet/onnx comparison tools
- Add pyproject.toml with uv-managed dependencies and ruff config - Generate uv.lock and requirements.txt via uv - Add fastapi, upgrade starlette/uvicorn/websockets for the new web stack - Drop mxnet/cnocr/gluoncv/zerorpc/gevent and pywebio/alas-webapp deps
- Add module/webui/api: status/schema/config/i18n/theme/run/stop/instance/update/remote endpoints plus /ws push - Move startup/shutdown logic into the FastAPI lifespan - Extract TaskHandler from the pywebio utils into module/webui/tasks - Remove pywebio pages (app/base/pin/widgets/fastapi/fake_pil/patch/translate/utils) - Add module/config/output stub and drop residual pywebio imports from config
- Add webapp-tauri: Tauri 2 shell (Rust) that spawns the python backend, frameless window, tray, single instance and window control commands - Add Vue 3 SPA (Vite 8 / TypeScript 6 / Biome): overview with scheduler queue and log stream, schema-driven settings forms, dev tools page - Port pywebio bootstrap themes and alas custom CSS for the same look - Remove the Electron 15 webapp
- Develop page (Home button): sub menu with HomePage/Update/Remote/Utils,
language and theme pickers, open source note, updater commit comparison
and history
- Manage page: config file management (list, add, import, export alas.json)
- Overview page: collapsible menu groups folded by default
- Settings forms: title column with help text + 13rem control column,
skip the Storage (task state) group
- Tool tasks: scheduler/log bar on top, form in the middle, log at bottom
- Aside navigation: Home -> develop, instance -> overview, Manage -> manage
- Remove hardcoded panel colors so the active theme applies
- API: /update/history, /configs, /config/{name}/export endpoints
…pdowns - Read lang.LANG dynamically in the API so language changes take effect - i18n frontend follows status.language instead of hardcoded zh-CN - Add alas-ui.css: themed scrollbars, adaptive button/control colors that stay visible on both light and dark themes - Replace btn-outline-light with the adaptive button class - Widen the language/theme dropdowns in the aside bottom bar
…rop aside dropdowns - Port the original pywebio CSS (alas.css / alas-pc.css) to alas-shell.css with selectors translated to Vue class names: btn-aside/btn-menu padding and border highlight, hr-group separators, form-control underline style, monospace log font, overview task rows, group card typography - Language switch is now reactive (no reload): update store then reload the i18n dict; bootstrap waits for /status so the persisted language applies - Remove the language/theme dropdowns from the aside (not in the original) - Bootstrap default font stack for the shell
…ht-alas.css - Translate pywebio scope backgrounds to Vue classes: aside #202225, menu #2f3136, content #36393f, header #202225, group cards and scheduler/log blocks with themed borders - Scheduler buttons use the original btn-on/btn-off (purple #7a77bb in dark, #4e4c97 in light) instead of bootstrap success/danger - Theme links load dark-alas-shell.css / light-alas-shell.css
- Load develop/run/setting svg icons in the aside buttons via CSS mask so they follow the text color in both themes - Adjust btn-aside padding for the inline icon layout
- Remove leftover dark background on the develop sub menu (light theme) - Translate aside button labels via i18n - Raise menu/aside button selector specificity over bootstrap .btn so the hover border bar renders; selected entries show the left accent bar - Use relative icon paths for the CSS mask icons - Fix Settings v-if/v-else-if chain: the h4 title broke the chain so settings forms were never rendered - Header shows icon + Alas + running state + centered page title
- Embed the alas.svg so the header icon shows at 42px without clipping - Develop sub page sets the centered header title (HomePage/Update/Remote/Utils) - Unify the selected left accent bar color to light blue across all menus - Remove hardcoded light text colors from the develop menu scoped styles so the light theme renders dark text (shared theme css only) - Share the menu collapse state across pages so entering settings does not fold all groups - Overview grid uses the original minmax(25rem, 5fr) 2fr columns and gap - Remove the bootstrap blue focus ring on controls - Add the right-hand group navigator to the settings page
- Rewrite all components and views in Svelte 5 (runes): App, Header, Aside, Menu, DynamicForm, Home, Develop, Manage, Settings - Replace vue-router with a minimal hash router (router.svelte.ts) - Rework store/i18n as .svelte.ts modules with \; shared collapse state and the develop page title keep working across navigation - All theme CSS (bootstrap + alas shell styles) is reused unchanged - Bundle size drops from 281 kB to 69 kB (gzip 24 kB) - svelte-check passes with 0 errors; DOM regression checks all green
- Replace the details/summary collapse with a plain button toggle to stop the open-attribute feedback loop that made groups flap on their own - Add the original green-round favicon (base64 png from the pywebio page) - Navigator: content-sized width (min-content, max 15rem) so it stops stealing the settings form space; themed border/background restored - Header height 50px to match the original (icon no longer overflows) - Overview grid keeps a 20rem floor for the log column - Aside: absolute icon paths, larger button spacing, drop the status dot from the alas instance button
- Aside icons use the original theme fill colors (dark #c9d1d9, light #2c2c2c) instead of currentColor which rendered invisible against the dark panels - Regenerate the whole Tauri icon set from the original Alas icon (webapp/buildResources/icon.png) replacing the default Tauri icons
- Center aside button labels (inherit the bootstrap center alignment) - Menu collapse: add the rotating triangle arrow and indent the expanded task list by 0.625rem - Drop the task-name h4 from the settings page so group titles sit at the very top like the original - Widen the settings navigator (max-content with a 7rem floor) - State/lock fields render with a bordered box (top/left/right, no bottom line) - Overview columns use the original 2fr/3fr ratio (wider logs)
Bare <button> elements keep the UA black color because buttons do not
inherit from body. Add a single global button { color: inherit } rule
instead of per-widget colors, and drop the redundant form-control color
overrides that duplicated the bootstrap theme.
…with the original - Hover/active accent back to the original purple (#7a77bb dark, #4e4c97 light) for both text and the left bar - Overview: schedulers column minmax(16rem,20rem), logs minmax(24rem,1fr); running/pending/waiting heights follow the original 7.75rem rows - Tool page: 1fr minmax(25rem,6fr) 1fr centered column layout - Auto-scroll button uses the original btn-on/btn-off switch styles - Updater buttons use the original info/success colors with i18n state text and a checking spinner - Header icon rounded (border-radius 1.5rem)
- Drop btn-sm from scheduler/scroll/task buttons (15px, 6px 12px like the original); task Setting buttons use the btn-off solid style - Collapse titles keep the original 8px padding on all sides - Menu buttons match the original 12px/10px left/right padding - Header icon no longer clipped (remove border-radius crop) - Tool page upper bar gets the themed background
…ariable - Page roots (.home/.develop-wrap/.manage-wrap/.settings-wrap) take the content background so no body color shows through beside the nav bars - Header icon uses the extracted alas.png (256px) scaled to 42px instead of the embedded-base64 svg that only showed its top-left corner - Required state/lock fields show the translated label (e.g. 已启用) instead of the raw boolean true - Accent color is defined once per theme as --alas-accent and reused by buttons, borders, checkboxes and focus styles (no copied literals); menu hover no longer overrides the theme text color - form-control border-width wins over the later bootstrap theme
…ority - Log view inherits the theme body color (bootstrap pre defaults to dark text) - Running section keeps the original 7.75rem row without flex shrinking so exactly one overview-task fits - Menu buttons get the original 8px vertical gap - Theme shell hover rules use compound selectors so they win over the alas-shell currentColor/inherit fallbacks and the accent applies
# Conflicts: # .gitignore
Replace the pywebio/alas-webapp/zerorpc stack in requirements-in.txt with fastapi/starlette/uvicorn/websockets to match pyproject.toml, and regenerate requirements.txt via 'uv export' plus the docker/headless artifacts so fresh deployments no longer fail on 'import fastapi'.
The generator regex only split on '=' or space, turning 'numpy>=1.24' into the invalid 'numpy>==1.24'. Accept '>' and '<' as separators so >=-style requirements generate valid pinned artifacts.
…i/uvicorn bump, uv 0.12)
OCR now runs in-process via onnxruntime, so the unused RPC layer is gone: module/ocr/rpc.py (TCP/pickle server, dynamic batching, watchdog), its smoke test and dead verification scripts, the OCR_MODEL proxy switch in module/ocr/ocr.py, UseOcrServer branches in resource.py and the webui startup/shutdown, and the Ocr deploy-config section. After the uv migration, drop the pip-era surface: PythonExecutable field and toolkit paths (git/adb fall back to PATH), dead RequirementsFile presets (AidLux/headless dirs no longer exist), the arm64 conda/mxnet build, zope workaround, legacy alas2.bat installer, and requirements-in.txt. The docker requirements generator now derives deploy/docker/requirements.txt from the uv export artifact (66 pinned packages, opencv-python -> headless preserved), and the Tauri shell python resolution drops the toolkit fallback branch. Verified: py_compile, smoke_import_all (423/423), DeployConfig load, cargo check, docker requirements regeneration.
…Path login legacy
Per UNOCSS-REWRITE.md: rebuild the UI on UnoCSS idioms instead of the 1:1 legacy-CSS port. - theme.css v2: two-layer semantic tokens (raw palette + surface/line/ text/accent roles); hover/active shades derived with color-mix() (~40 fewer tokens); drop the bootswatch min-width:992px quirk - uno.config.ts: theme.color mapping (bg-surface-panel, border-line-*, bg-primary hover:bg-primary-hover, ...); only four genuine composites remain as shortcuts (btn, btn-sm, panel, table); safelist reduced to dynamic classes - components: utility-first markup; legacy class names (btn-off/btn-on/ btn-menu-active/arg-container/hr-group/...) removed; conditional classes expressed as class: directives or computed class strings - base.css: minimal platform normalization (box-sizing, form font longhands, button cursor, scrollbars, keyframes); h4/p margins moved to usage sites; no !important anywhere Verification (visual-equivalence register in UNOCSS-REWRITE.md §5): pixel diff vs the pre-migration baseline at 1280x800, 4 routes x 5 themes: develop 0.37-1.51%, home 0.67-2.63%, manage 0.73-1.91%, settings 5.15-6.97% (registered exemption LmeSzinc#7: sub-pixel form-control positioning). CSS bundle 31.0KB -> 20.8KB. svelte-check 0 errors, 8/8 tests, biome errors 15 -> 8.
The migration/rewrite design documents live with the other local planning notes under .qoder/doc (gitignored); keep only the code-side pointer in theme.css.
…s dep; move plan docs to .qoder - module/device/connection.py: restore the may_mumu12_family cached_property (removed as dead code in 56580ed but still used by detect_device in 5 places) - device detection crashed with AttributeError on startup - module/logger.py: make the console sink synchronous (enqueue=False). With enqueue=True loguru serializes the record for the worker and the unpicklable traceback arrives frame-less, so the terminal only showed the final exception line while the webui func sink (already synchronous) showed the full call chain + locals. Both sinks now render the same rich traceback. - pyproject/requirements/uv.lock: restore setuptools>=65,<81 - adbutils imports pkg_resources at runtime and the uv migration had dropped setuptools, so fresh installs crashed on import. Pin below 81 because pkg_resources was removed there. (packaging==20.9's distutils import stays broken on Python 3.13 - forced by uiautomator2's packaging<21 pin; works on 3.11/3.12 with the setuptools distutils shim.) - move cleanup_plan.md / codebase_audit_report.md / phase456_plan_and_pilots.md into .qoder/doc (local planning notes).
Follow-up to the may_mumu12_family fix: a full audit of the dead-code cleanup commits (790bfd0..56580ed, 172 definition removals, see .qoder/audit_dead_code.py) found three more removed-but-referenced symbols - all via string-based SelectedGrids lookups that the static rescan missed: - Commission.finish_time (module/commission/project.py): used by commission.run() via total.get('finish_time') - crashed the Reward task with AttributeError - GridInfo.is_accessible_2 / GridInfo.is_nearby (module/map_detection/ grid_info.py): used by module/map/map.py via grids.select(is_accessible_2=True, ...) / grids.select(is_nearby=True) - would crash map entry/route finding Everything else in the audit is a false positive (docstring/comment references, class-level defaults surviving in mixins, duplicate/generic names). Restored definitions are verbatim from git history; verified by AST and runtime import.
…task time 1. CJK log alignment: the browser's CJK font fallback renders wide glyphs at ~1em while two monospace cells are ~1.1em, drifting the rich traceback box borders by ~1px per character (measured 613.7 -> 608/605 on 6/8-CJK lines). ansi.ts now wraps each wide char in a fixed <span class=cjk> (2ch, base.css) pinning it to exactly two cells - re-measured in Edge: all lines align at 613.7px. 2. SSE log pre-push: on a fresh connection (page refresh) the backend sends the whole accumulated renderables buffer with reset=true so the log view fills immediately instead of appearing cleared; render_log reuses one shared Console instead of constructing one per renderable (hundreds of constructions made the initial dump lag). 3. Running-task time: the REST /scheduler response splits the running task out of pending while SSE snapshots keep it in - Home's bootstrap now merges res.running back into pending, so the running row's next_run survives navigating back from other pages.
…stutils shim - webui home (Develop.svelte) and README.md now present this fork's change focus and https://github.com/Joxos/AzurLaneAutoScript; the original README is preserved verbatim below a separator. - vite dev proxy for /status /schema /config /i18n /sse etc. to 127.0.0.1:22267 (ALAS_DEV_API_TARGET overridable): dev-mode SPA no longer renders raw i18n keys ('Gui.xxx') when the backend runs separately. - module.logger pins distutils (setuptools shim) at the root of every ALAS import chain so packaging==20.9 (uiautomator2 pin) can import on Python 3.12+; fixes device-stack imports (adbutils/uiautomator2) with the lock-constrained venv.
- stdin: hand the backend a real handle (Stdio::null()). The shell is a GUI binary with a NULL stdin slot, so CreatePipe reused handle 0 for the multiprocessing spawn handshake; CPython's spawn_main reads that handshake through sys.stdin, hit EOF on the misrouted pipe and killed the EnableReload child ~0.4s after start. The startup marker never arrived and the window stayed hidden forever (double-click symptom). - release builds pick a free port with a TCP-connect probe instead of a bind probe: on Windows a bind to 127.0.0.1:P succeeds even while another process listens on 0.0.0.0:P (SO_REUSEADDR hijack), so the old probe failed to notice a busy 22267 and the backend then died on uvicorn's own bind with Errno 10048. - PYTHONIOENCODING=utf-8 for the backend so rich/loguru output never trips GBK pipe encoding in error paths. - backend stderr is mirrored to <app_log_dir>/backend.log; on spawn failure, early exit, or a 60s startup timeout the window now shows an embedded error page (public/error.html) instead of an invisible tray-only process. CREATE_NO_WINDOW removes the empty console popup.
- capabilities: allow remote IPC for http://127.0.0.1/* and http://localhost/* (new Capability.remote model) so the SPA served by the backend can invoke window_min/window_max/window_close - the custom titlebar buttons were rendered but every invoke was rejected. - tray: set the icon (was blank), and only a LEFT click shows the window; the previous handler also fired on right-click and its show+focus stole focus from the context menu, which then vanished instantly. - CloseRequested now quits (kill backend + exit) instead of hiding to the tray: taskbar close / Alt+F4 / the titlebar X end the process and remove the tray icon instead of leaving a tray-only zombie. - backend process tree is pinned to a kill-on-close Windows Job Object: killing the direct child used to orphan the EnableReload grandchild (uvicorn kept listening on 22267 after the shell exited). Now TerminateJobObject reaps the whole tree on exit, and if the shell itself is force-killed the OS closes the handle and reaps the backend automatically.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
本次提交对 Alas 的技术栈进行了一次整体现代化迁移,在保持全部原有功能与视觉样式的前提下:
dev_tools/ocr_convert/)四部分改动相互依赖(Tauri 壳依赖标准 HTTP API;移除 pywebio 依赖新后端;uv 迁移为前端构建提供依赖管理),因此作为一次提交提出。
动机
改动明细
OCR(onnxruntime)
module/ocr/al_ocr.py:AlOcr改为 onnxruntimeInferenceSession,惰性加载 + 单例复用;GPU 可用时自动启用,失败回退 CPUmodule/ocr/rpc.py:OCR 服务端由 zerorpc 改为标准库 socket(移除 gevent 依赖),客户端接口不变,连接失败回退本地模型dev_tools/ocr_convert/(build_onnx.py、mxnet/onnx 输出对比、冒烟脚本)WebUI(FastAPI)
module/webui/api/:FastAPI 应用,REST 端点 + WebSocket 推送(日志/状态),schema 驱动的表单渲染桌面壳(Tauri 2 + Svelte 5)
webapp-tauri/:Tauri 2 壳 + Svelte 5 SPA,schema 驱动动态表单,主题 / i18n 支持工具链
uv export生成,保持 deploy / installer / Docker 兼容兼容性
测试情况
已知问题与后续计划
以下问题已确认,将在后续提交中完善:
module/webui/updater.py仍引用已删除的module.webui.app.clearup,更新成功后的重载会失败。修复方案已确定,将在下一个提交修复。--key/Password登录门禁尚未迁移到 FastAPI 后端。默认无密码行为与旧版一致,但设置了密码的用户暂不受保护,后续补齐。/schema目前固定按 cn 推导选项,非国服实例的选项过滤待实现(实现方式会先与维护者沟通)。提交规模说明
+122k 行中约 107k 为 5 个 ONNX 模型文件内容,其余手写代码约 +12k / -22k(净删除约 1 万行)。
ai使用说明
由于工程量巨大,所以在迁移时大量使用了ai进行辅助,但作者在本地使用自己的config跑了较长时间来验证基本功能正确。如有存在其他bug,可以进一步讨论修复。注意到作者近期正在开发Alasio,此pr愿意从原仓库向新基底进行渐进式修改。另外,后续还将有意愿继续对其他旧技术栈进行升级,即使不合并而是作为fork存在。
测试环境配置
测试使用的 alas.json(点击展开)
{ "Alas": { "Emulator": { "Serial": "127.0.0.1:16417", "PackageName": "com.bilibili.azurlane", "ServerName": "disabled", "ScreenshotMethod": "nemu_ipc", "ControlMethod": "MaaTouch", "ScreenshotDedithering": false, "AdbRestart": false }, "EmulatorInfo": { "Emulator": "MuMuPlayer12", "name": "MuMuPlayer-15.0-1", "path": "D:/Apps/MuMuPlayer/nx_main/MuMuNxMain.exe" }, "Error": { "HandleError": true, "SaveError": true, "OnePushConfig": "provider: null", "ScreenshotLength": 1 }, "Optimization": { "ScreenshotInterval": 0.3, "CombatScreenshotInterval": 1.0, "TaskHoardingDuration": 60, "WhenTaskQueueEmpty": "goto_main" }, "DropRecord": { "SaveFolder": "./screenshots", "AzurStatsID": "ry5tbehmia8pfu27w3lq06o4sxkjc1dn", "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": "do_not_keep" }, "Enhance": { "ShipToEnhance": "favourite", "Filter": null, "CheckPerCategory": 5 }, "OldRetire": { "N": true, "R": true, "SR": true, "SSR": false, "RetireAmount": "retire_all" }, "Storage": { "Storage": {} } }, "Restart": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "Restart", "SuccessInterval": 0, "FailureInterval": 0, "ServerUpdate": "00:00" }, "Storage": { "Storage": {} } }, "Main": { "Scheduler": { "Enable": false, "NextRun": "2025-10-26 00:00:00", "Command": "Main", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Campaign": { "Name": "12-4", "Event": "campaign_main", "Mode": "hard", "UseClearMode": false, "UseFleetLock": true, "UseAutoSearch": false, "Use2xBook": false, "AmbushEvade": true }, "StopCondition": { "OilLimit": 1000, "RunCount": 0, "MapAchievement": "map_3_stars", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "Fleet": { "Fleet1": 1, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 5, "Fleet2": 2, "Fleet2Formation": "line_ahead", "Fleet2Mode": "combat_auto", "Fleet2Step": 5, "FleetOrder": "fleet1_mob_fleet2_boss" }, "Submarine": { "Fleet": 1, "Mode": "hunt_only", "AutoSearchMode": "sub_standby", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { "Mode": "calculate_ignore", "Fleet1Value": 89, "Fleet1Record": "2025-11-04 19:48:59", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 117, "Fleet2Record": "2025-11-04 19:48:59", "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": {} } }, "Main2": { "Scheduler": { "Enable": false, "NextRun": "2025-11-04 19:42:35", "Command": "Main2", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Campaign": { "Name": "2-1", "Event": "campaign_main", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, "AmbushEvade": true }, "StopCondition": { "OilLimit": 6000, "RunCount": 0, "MapAchievement": "non_stop", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "Fleet": { "Fleet1": 3, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 4, "Fleet2Formation": "line_ahead", "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": "calculate_ignore", "Fleet1Value": 35, "Fleet1Record": "2025-11-03 22:55:05", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2025-11-03 22:55:05", "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": {} } }, "Main3": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 12:06:00", "Command": "Main3", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Campaign": { "Name": "12-4", "Event": "campaign_main", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, "AmbushEvade": true }, "StopCondition": { "OilLimit": 6000, "RunCount": 0, "MapAchievement": "non_stop", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "Fleet": { "Fleet1": 1, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 2, "Fleet2Formation": "line_ahead", "Fleet2Mode": "combat_auto", "Fleet2Step": 2, "FleetOrder": "fleet1_mob_fleet2_boss" }, "Submarine": { "Fleet": 1, "Mode": "do_not_use", "AutoSearchMode": "sub_auto_call", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { "Mode": "calculate_ignore", "Fleet1Value": 42, "Fleet1Record": "2026-08-14 11:45:47", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "dormitory_floor_1", "Fleet1Oath": false, "Fleet2Value": 113, "Fleet2Record": "2026-08-14 11:45:47", "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": {} } }, "GemsFarming": { "Scheduler": { "Enable": false, "NextRun": "2026-08-04 17:57:41", "Command": "GemsFarming", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "GemsFarming": { "ChangeFlagship": "ship", "CommonCV": "any", "ChangeVanguard": "ship", "CommonDD": "any", "CommissionLimit": true }, "EquipmentCode": { "ExportToConfig": true, "Config": "DD: null\nbogue: null\nhermes: null\nlangley: null\nranger: null" }, "Campaign": { "Name": "2-4", "Event": "event_20260813_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, "AmbushEvade": true }, "StopCondition": { "OilLimit": 6000, "RunCount": 0, "MapAchievement": "non_stop", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "Fleet": { "Fleet1": 1, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 5, "Fleet2": 2, "Fleet2Formation": "line_ahead", "Fleet2Mode": "combat_auto", "Fleet2Step": 5, "FleetOrder": "fleet1_all_fleet2_standby" }, "Submarine": { "Fleet": 0, "Mode": "do_not_use", "AutoSearchMode": "sub_standby", "DistanceToBoss": "use_open_ocean_support" }, "Emotion": { "Mode": "calculate_ignore", "Fleet1Value": 119, "Fleet1Record": "2020-01-01 00:00:00", "Fleet1Control": "prevent_red_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2020-01-01 00:00:00", "Fleet2Control": "prevent_red_face", "Fleet2Recover": "not_in_dormitory", "Fleet2Oath": false }, "Storage": { "Storage": {} } }, "EventGeneral": { "EventGeneral": { "PtLimit": 0, "TimeLimit": "2020-01-01 00:00:00" }, "TaskBalancer": { "Enable": true, "CoinLimit": 30000, "TaskCall": "Main3" }, "Storage": { "Storage": {} } }, "Event": { "Scheduler": { "Enable": false, "NextRun": "2026-07-08 22:48:13", "Command": "Event", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Campaign": { "Name": "HT3", "Event": "event_20260813_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": 5, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 2, "Fleet2": 6, "Fleet2Formation": "line_ahead", "Fleet2Mode": "combat_auto", "Fleet2Step": 2, "FleetOrder": "fleet1_all_fleet2_standby" }, "Submarine": { "Fleet": 1, "Mode": "hunt_only", "AutoSearchMode": "sub_standby", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { "Mode": "calculate", "Fleet1Value": 97, "Fleet1Record": "2026-07-08 19:58:02", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2026-07-08 19:58:02", "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": {} } }, "Event2": { "Scheduler": { "Enable": false, "NextRun": "2026-05-01 10:13:26", "Command": "Event2", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Campaign": { "Name": "VSP", "Event": "event_20260813_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": true, "AmbushEvade": true }, "StopCondition": { "OilLimit": 1000, "RunCount": 1, "MapAchievement": "non_stop", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "Fleet": { "Fleet1": 3, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 6, "Fleet2Formation": "line_ahead", "Fleet2Mode": "combat_auto", "Fleet2Step": 2, "FleetOrder": "fleet1_all_fleet2_standby" }, "Submarine": { "Fleet": 1, "Mode": "hunt_only", "AutoSearchMode": "sub_standby", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { "Mode": "calculate_ignore", "Fleet1Value": 119, "Fleet1Record": "2026-05-01 16:43:45", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2026-05-01 16:43:45", "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": {} } }, "Raid": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "Raid", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Raid": { "Mode": "hard", "UseTicket": false }, "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": 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 }, "Storage": { "Storage": {} } }, "Hospital": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "Hospital", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Hospital": { "UseRecommendFleet": true }, "StopCondition": { "OilLimit": 1000, "RunCount": 0, "MapAchievement": "non_stop", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "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 }, "Storage": { "Storage": {} } }, "Coalition": { "Scheduler": { "Enable": false, "NextRun": "2026-07-29 12:07:28", "Command": "Coalition", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Campaign": { "Name": "dynamic", "Event": "coalition_20260723", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, "UseAutoSearch": false, "Use2xBook": false, "AmbushEvade": true }, "Coalition": { "Mode": "hard", "Fleet": "multi" }, "StopCondition": { "OilLimit": 5000, "RunCount": 0, "MapAchievement": "non_stop", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "Emotion": { "Mode": "calculate", "Fleet1Value": 115, "Fleet1Record": "2026-07-29 13:23:20", "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": {} } }, "WarArchives": { "Scheduler": { "Enable": false, "NextRun": "2026-06-06 23:54:00", "Command": "WarArchives", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Campaign": { "Name": "C2", "Event": "war_archives_20190321_en", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, "UseAutoSearch": true, "Use2xBook": false, "AmbushEvade": true }, "StopCondition": { "OilLimit": 1000, "RunCount": 0, "MapAchievement": "100_percent_clear", "StageIncrease": true, "GetNewShip": false, "ReachLevel": 0 }, "Fleet": { "Fleet1": 4, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 6, "Fleet2Formation": "line_ahead", "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": "calculate", "Fleet1Value": 119, "Fleet1Record": "2026-07-20 17:27:55", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2026-07-20 17:27:55", "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": "2025-10-24 00:00:00", "Command": "EventA", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "EventDaily": { "StageFilter": "A1 > A2 > A3", "LastStage": "a3" }, "Campaign": { "Name": "dynamic", "Event": "event_20260813_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": 3, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 4, "Fleet2Formation": "line_ahead", "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": "calculate_ignore", "Fleet1Value": 93, "Fleet1Record": "2025-10-23 00:47:36", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2025-10-23 00:47:36", "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": "2025-10-24 00:00:00", "Command": "EventB", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "EventDaily": { "StageFilter": "B1 > B2 > B3", "LastStage": "b3" }, "Campaign": { "Name": "dynamic", "Event": "event_20260813_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": 3, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 4, "Fleet2Formation": "line_ahead", "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": "calculate_ignore", "Fleet1Value": 89, "Fleet1Record": "2025-10-23 01:00:46", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2025-10-23 01:00: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": "2026-06-26 00:00:00", "Command": "EventC", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "EventDaily": { "StageFilter": "C1 > C2 > C3", "LastStage": "c3" }, "Campaign": { "Name": "dynamic", "Event": "event_20260813_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": 3, "Fleet1Formation": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 4, "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": "calculate_ignore", "Fleet1Value": 91, "Fleet1Record": "2026-06-25 01:50:23", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2026-06-25 01:50:23", "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": "2026-06-26 00:00:00", "Command": "EventD", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "EventDaily": { "StageFilter": "D1 > D2 > D3", "LastStage": "d3" }, "Campaign": { "Name": "dynamic", "Event": "event_20260813_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": "calculate_ignore", "Fleet1Value": 85, "Fleet1Record": "2026-06-25 02:07:50", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2026-06-25 02:07:50", "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-07-10 00:00:00", "Command": "EventSp", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Campaign": { "Name": "sp", "Event": "event_20260813_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": "line_ahead", "Fleet1Mode": "combat_auto", "Fleet1Step": 3, "Fleet2": 2, "Fleet2Formation": "line_ahead", "Fleet2Mode": "combat_auto", "Fleet2Step": 2, "FleetOrder": "fleet1_all_fleet2_standby" }, "Submarine": { "Fleet": 1, "Mode": "hunt_only", "AutoSearchMode": "sub_standby", "DistanceToBoss": "2_grid_to_boss" }, "Emotion": { "Mode": "calculate_ignore", "Fleet1Value": 105, "Fleet1Record": "2026-07-09 00:51:08", "Fleet1Control": "prevent_yellow_face", "Fleet1Recover": "not_in_dormitory", "Fleet1Oath": false, "Fleet2Value": 119, "Fleet2Record": "2026-07-09 00:51:08", "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": {} } }, "RaidDaily": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "RaidDaily", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "RaidDaily": { "StageFilter": "hard > normal > easy" }, "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": 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 }, "Storage": { "Storage": {} } }, "CoalitionSp": { "Scheduler": { "Enable": false, "NextRun": "2026-08-05 00:00:00", "Command": "CoalitionSp", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Campaign": { "Name": "sp", "Event": "coalition_20260723", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, "UseAutoSearch": false, "Use2xBook": false, "AmbushEvade": true }, "Coalition": { "Mode": "sp", "Fleet": "multi" }, "StopCondition": { "OilLimit": 1000, "RunCount": 0, "MapAchievement": "non_stop", "StageIncrease": false, "GetNewShip": false, "ReachLevel": 0 }, "Emotion": { "Mode": "calculate_ignore", "Fleet1Value": 117, "Fleet1Record": "2026-08-04 11:44: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": {} } }, "Commission": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 12:36:03", "Command": "Commission", "SuccessInterval": "30-60", "FailureInterval": "30-60", "ServerUpdate": "00:00" }, "Commission": { "PresetFilter": "oil", "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-08-14 17:32:11", "Command": "Tactical", "SuccessInterval": "30-60", "FailureInterval": "120-240", "ServerUpdate": "00:00" }, "Tactical": { "TacticalFilter": "SameT4 > SameT3 > SameT2 > SameT1\n> BlueT2 > YellowT2 > RedT2\n> BlueT3 > YellowT3 > RedT3\n> BlueT4 > YellowT4 > RedT4\n> BlueT1 > YellowT1 > RedT1\n> first", "RapidTrainingSlot": "slot_1" }, "ControlExpOverflow": { "Enable": true, "T4Allow": 100, "T3Allow": 100, "T2Allow": 200, "T1Allow": 200 }, "AddNewStudent": { "Enable": false, "Favorite": false, "MinLevel": 50 }, "Storage": { "Storage": {} } }, "Research": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 14:02:26", "Command": "Research", "SuccessInterval": "30-60", "FailureInterval": "30-60", "ServerUpdate": "00:00" }, "Research": { "UseCube": "only_05_hour", "UseCoin": "always_use", "UsePart": "always_use", "AllowDelay": true, "PresetFilter": "series_9_blueprint_ta152", "CustomFilter": "S7-DR0.5 > S7-PRY0.5 > S7-Q0.5 > S7-H0.5 > Q0.5 > S7-DR2.5\n> S7-G1.5 > S7-Q1 > S7-DR5 > 0.5 > S7-G4 > S7-Q2 > S7-PRY2.5 > reset\n> S7-DR8 > Q1 > 1 > S7-E-315 > S7-G2.5 > G1.5 > 1.5 > S7-E-031\n> S7-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S7-PRY5\n> S7-PRY8 > Q4 > G4 > 4 > S7-C6 > DR5 > PRY5 > 5 > C6 > 6 > S7-C8\n> S7-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12" }, "Storage": { "Storage": {} } }, "Dorm": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 14:15:21", "Command": "Dorm", "SuccessInterval": 278, "FailureInterval": 278, "ServerUpdate": "00:00" }, "Dorm": { "Collect": true, "Feed": true, "FeedFilter": "20000 > 10000 > 5000 > 3000 > 2000 > 1000" }, "BuyFurniture": { "Enable": false, "BuyOption": "all", "LastRun": "2020-01-01 00:00:00" }, "Storage": { "Storage": {} } }, "Meowfficer": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "Meowfficer", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Meowfficer": { "BuyAmount": 2, "FortChoreMeowfficer": true, "OverflowCoins": -1 }, "MeowfficerTrain": { "Enable": false, "Mode": "seamlessly", "RetainTalentedGold": true, "RetainTalentedPurple": true, "EnhanceIndex": 12, "MaxFeedLevel": 5 }, "Storage": { "Storage": {} } }, "Guild": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 12:00:00", "Command": "Guild", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00, 06:00, 12:00, 18:00, 21:00" }, "GuildLogistics": { "Enable": true, "SelectNewMission": false, "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": false, "NewOperationMaxDate": 15, "JoinThreshold": 1, "AttackBoss": true, "BossFleetRecommend": false }, "Storage": { "Storage": {} } }, "Reward": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 13:00:14", "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-08-15 00:00:00", "Command": "Awaken", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Awaken": { "LevelCap": "level120", "Favourite": false }, "Storage": { "Storage": {} } }, "Daily": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "Daily", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Daily": { "UseDailySkip": true, "EscortMission": "second", "EscortMissionFleet": 1, "AdvanceMission": "first", "AdvanceMissionFleet": 1, "FierceAssault": "first", "FierceAssaultFleet": 1, "TacticalTraining": "second", "TacticalTrainingFleet": 1, "SupplyLineDisruption": "third", "ModuleDevelopment": "first", "ModuleDevelopmentFleet": 1, "EmergencyModuleDevelopment": "first", "EmergencyModuleDevelopmentFleet": 1 }, "Storage": { "Storage": {} } }, "Hard": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "Hard", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Hard": { "HardStage": "12-2", "HardFleet": 1 }, "Storage": { "Storage": {} } }, "Exercise": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 12:00:00", "Command": "Exercise", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00, 12:00, 18:00" }, "Exercise": { "OpponentChooseMode": "easiest_else_exp", "OpponentTrial": 1, "ExerciseStrategy": "aggressive", "LowHpThreshold": 0.4, "LowHpConfirmWait": 0.1, "OpponentRefreshValue": 0, "OpponentRefreshRecord": "2026-08-14 09:37:15" }, "Storage": { "Storage": {} } }, "ShopFrequent": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 12:00:00", "Command": "ShopFrequent", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00, 12:00, 18:00" }, "GeneralShop": { "UseGems": false, "Refresh": false, "BuySkinBox": false, "ConsumeCoins": false, "Filter": "BookRedT3 > BookRedT2 > BookYellowT3 > BookBlueT3\n> Cube\n> FoodT6 > FoodT5" }, "Storage": { "Storage": {} } }, "ShopOnce": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "ShopOnce", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "GuildShop": { "Refresh": true, "Filter": "PlateT4 > BookT3 > BookT2 > CatT3 > Food", "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": "plane", "PR1": "neptune", "PR2": "seattle", "PR3": "cheshire" }, "MedalShop2": { "Filter": "SpecializedCore > DR\n> BookRedT3 > BookYellowT3 > BookBlueT3\n> BookRedT2 > BookYellowT2 > BookBlueT2\n> FoodT6 > FoodT5", "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-08-15 04:00:00", "Command": "Shipyard", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "04:00" }, "ShipyardDr": { "ResearchSeries": 5, "ShipIndex": 1, "BuyAmount": 0, "LastRun": "2026-06-15 04:01:12" }, "Shipyard": { "ResearchSeries": 6, "ShipIndex": 3, "BuyAmount": 15, "LastRun": "2026-08-14 09:39:03" }, "Storage": { "Storage": {} } }, "Gacha": { "Scheduler": { "Enable": false, "NextRun": "2026-04-19 00:00:00", "Command": "Gacha", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "Gacha": { "Pool": "event", "Amount": 1, "UseTicket": true, "UseDrill": false }, "Storage": { "Storage": {} } }, "Freebies": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "Freebies", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "BattlePass": { "Collect": true }, "DataKey": { "Collect": true, "ForceCollect": false }, "Mail": { "ClaimMerit": true, "ClaimMaintenance": false, "ClaimTradeLicense": false, "DeleteCollected": true }, "SupplyPack": { "Collect": true, "DayOfWeek": 0 }, "Storage": { "Storage": {} } }, "Minigame": { "Scheduler": { "Enable": false, "NextRun": "2025-03-31 00:00:00", "Command": "Minigame", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "Storage": { "Storage": {} } }, "PrivateQuarters": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "PrivateQuarters", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "PrivateQuarters": { "BuyRoses": true, "BuyCake": false, "TargetInteract": true, "TargetShip": "anchorage" }, "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-08-14 12:02:43", "Command": "OpsiAshBeacon", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "OpsiAshBeacon": { "AttackMode": "current_dossier", "OneHitMode": true, "DossierAutoAttackMode": true, "RequestAssist": true, "EnsureFullyCollected": false }, "Storage": { "Storage": {} } }, "OpsiAshAssist": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "OpsiAshAssist", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "OpsiAshAssist": { "Tier": 15 }, "Storage": { "Storage": {} } }, "OpsiExplore": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 11:49:48", "Command": "OpsiExplore", "SuccessInterval": 0, "FailureInterval": 0, "ServerUpdate": "00:00" }, "OpsiExplore": { "SpecialRadar": false, "ForceRun": false, "LastZone": 82 }, "OpsiFleet": { "Fleet": 2, "Submarine": false }, "Storage": { "Storage": {} } }, "OpsiShop": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 11:49:48", "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-09-01 00:00:00", "Command": "OpsiVoucher", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "OpsiVoucher": { "Filter": "LoggerAbyssal > LoggerObscure > Book > Coin > Fragment" }, "Storage": { "Storage": {} } }, "OpsiDaily": { "Scheduler": { "Enable": true, "NextRun": "2026-08-15 00:00:00", "Command": "OpsiDaily", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "OpsiDaily": { "DoMission": true, "UseTuningSample": true }, "OpsiFleet": { "Fleet": 2, "Submarine": false }, "Storage": { "Storage": {} } }, "OpsiObscure": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 11:49:48", "Command": "OpsiObscure", "SuccessInterval": 60, "FailureInterval": 60, "ServerUpdate": "00:00" }, "OpsiObscure": { "ForceRun": false }, "OpsiFleet": { "Fleet": 2, "Submarine": false }, "Storage": { "Storage": {} } }, "OpsiAbyssal": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 11:49:48", "Command": "OpsiAbyssal", "SuccessInterval": 60, "FailureInterval": 60, "ServerUpdate": "00:00, 12:00" }, "OpsiAbyssal": { "ForceRun": false }, "OpsiFleetFilter": { "Filter": "Fleet-1 > Fleet-3 > Fleet-4 > Fleet-2" }, "Storage": { "Storage": {} } }, "OpsiArchive": { "Scheduler": { "Enable": false, "NextRun": "2026-08-14 11:49:48", "Command": "OpsiArchive", "SuccessInterval": 60, "FailureInterval": 60, "ServerUpdate": "00:00" }, "OpsiFleet": { "Fleet": 1, "Submarine": false }, "Storage": { "Storage": {} } }, "OpsiStronghold": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 11:49:48", "Command": "OpsiStronghold", "SuccessInterval": 60, "FailureInterval": 60, "ServerUpdate": "00:00" }, "OpsiStronghold": { "ForceRun": false }, "OpsiFleetFilter": { "Filter": "Fleet-2 > Fleet-1 > Fleet-3 > Fleet-4" }, "Storage": { "Storage": {} } }, "OpsiMonthBoss": { "Scheduler": { "Enable": true, "NextRun": "2026-08-14 11:49:48", "Command": "OpsiMonthBoss", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "OpsiMonthBoss": { "Mode": "normal_hard", "CheckAdaptability": true, "ForceRun": false }, "OpsiFleetFilter": { "Filter": "Fleet-2 > Fleet-3 > Fleet-1 > Fleet-4" }, "Storage": { "Storage": {} } }, "OpsiMeowfficerFarming": { "Scheduler": { "Enable": false, "NextRun": "2026-08-14 11:49:48", "Command": "OpsiMeowfficerFarming", "SuccessInterval": 30, "FailureInterval": 30, "ServerUpdate": "00:00" }, "OpsiMeowfficerFarming": { "ActionPointPreserve": 1000, "HazardLevel": 5, "TargetZone": 0 }, "OpsiFleet": { "Fleet": 2, "Submarine": false }, "Storage": { "Storage": {} } }, "OpsiHazard1Leveling": { "Scheduler": { "Enable": false, "NextRun": "2026-08-14 11:49:48", "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": {} } }, "IslandProduction": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "IslandProduction", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "IslandProduction": { "HardFloorItems": "{}", "ReserveItems": "{}", "DailyBufferItems": "{}", "IdleAccumulatingItems": "{}" }, "Storage": { "Storage": {} } }, "IslandOrder": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "IslandOrder", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "IslandOrder": { "StuckSeasonOrderId": 0 }, "Storage": { "Storage": {} } }, "IslandFreebie": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "IslandFreebie", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "IslandFreebie": { "Share": true }, "Storage": { "Storage": {} } }, "IslandCollect": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "IslandCollect", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "03:00, 18:00" }, "Storage": { "Storage": {} } }, "IslandSeasonTask": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "IslandSeasonTask", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "IslandSeasonTask": { "TaskTarget": "{}" }, "Storage": { "Storage": {} } }, "IslandBusiness": { "Scheduler": { "Enable": false, "NextRun": "2020-01-01 00:00:00", "Command": "IslandBusiness", "SuccessInterval": 0, "FailureInterval": 120, "ServerUpdate": "00:00" }, "IslandRestaurant": { "KoiGrade": "bronze", "KoiWaitress1": "any", "KoiWaitress2": "none", "KoiMenu": "{}", "BearGrade": "bronze", "BearWaitress1": "any", "BearWaitress2": "none", "BearMenu": "{}", "EateryGrade": "bronze", "EateryWaitress1": "any", "EateryWaitress2": "none", "EateryMenu": "{}", "GrillGrade": "bronze", "GrillWaitress1": "any", "GrillWaitress2": "none", "GrillMenu": "{}", "CafeGrade": "bronze", "CafeWaitress1": "any", "CafeWaitress2": "none", "CafeMenu": "{}" }, "Storage": { "Storage": {} } }, "Daemon": { "Daemon": { "EnterMap": false }, "Storage": { "Storage": {} } }, "OpsiDaemon": { "OpsiDaemon": { "RepairShip": true, "SelectEnemy": true }, "Storage": { "Storage": {} } }, "EventStory": { "EventStory": { "SkipBattle": true }, "Storage": { "Storage": {} } }, "IslandProductionPlanner": { "IslandProductionPlanner": { "RescanIslandTechnology": false, "DailyProfitLowerLimit": 50000, "DailyBufferSafetyMargin": 0, "FieldsEfficiency": 0, "OrchardEfficiency": 0, "NurseryEfficiency": 0 }, "Storage": { "Storage": {} } }, "Benchmark": { "Benchmark": { "DeviceType": "emulator", "TestScene": "screenshot_click" }, "Storage": { "Storage": {} } }, "AzurLaneUncensored": { "AzurLaneUncensored": { "Repository": "https://e.coding.net/llop18870/alas/AzurLaneUncensored.git" }, "Storage": { "Storage": {} } }, "GameManager": { "GameManager": { "AutoRestart": true }, "Storage": { "Storage": {} } } }