Compare commits

..

19 Commits

Author SHA1 Message Date
github-actions[bot]
01d80e9458 chore: Auto update by pre-commit hooks
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/28622519749
[skip changelog]
2026-07-02 21:26:20 +00:00
uye
6d0c3e1661 perf: 优化取色逻辑 (#17243)
* feat: 优化取色逻辑

* chore: review

* perf: 亮度锚点抽取为具名常量,有效背景亮度计算提取为独立方法
2026-07-03 01:55:13 +08:00
Aliothmoon
7897839948 fix: DBNet UnClip 用 MaaDeps polyclipping 替换近似偏移 (#17227)
* fix: ncnn DBNet UnClip 对齐 fastdeploy 多边形偏移

* chore: use maadeps polyclipping

* chore: bump MaaDeps version
2026-07-03 01:09:07 +08:00
github-actions[bot]
6799816529 chore: Auto Update Game Resources - 2026-07-02
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/28601750165

[skip changelog]
2026-07-02 15:27:58 +00:00
uye
2f445be837 feat: 莫奈取色 (#17242)
* refactor: 移动关卡配置字段到 FightTask

UseAlternateStage / HideUnavailableStage / CustomStageCode 已迁移至
FightTask.cs,从 GUI 全局配置中移除冗余定义

* feat: 莫奈取色 — 配置与本地化

新增 BackgroundMonetEnabled / BackgroundMonetMode / BackgroundMonetCustomColor
配置字段,以及 MonetModeType 枚举(Auto / Custom)。
添加 zh-cn / zh-tw / en-us / ja-jp / ko-kr 五语本地化字符串

* feat: 莫奈取色 — 调色板生成与应用逻辑

- MonetPaletteHelper: 基于 HSL 线性计算生成主题色板,主色 / 文字 /
  背景角色各自有独立的饱和度与明度策略;明度随背景图不透明度连续
  自适应,保证前景与有效背景之间始终有足够对比度
- ColorExtractorHelper: 从背景图 BitmapSource 提取主色
- ThemeHelper: ApplyMonetPalette / RevertMonetPalette / ReapplyMonet,
  计算放后台线程、资源写入在 UI 线程;修正 AccentColor 覆盖顺序、
  主题切换时清除遮蔽资源以恢复正确主题色

* feat: 莫奈取色 — 设置界面与 ViewModel

- BackgroundSettings.xaml: 新增莫奈取色开关、取色模式选择、自定义颜色
  色块预览与 ColorPicker 按钮
- BackgroundSettingsUserControlModel: UpdateMonet / ScheduleMonetUpdate
  防抖逻辑,不透明度滑块拖动时后台计算 + UI 线程写入
- SettingsViewModel: 主题初始化完成后恢复莫奈调色板

* chore: review

* chore: 调整间距
2026-07-02 22:40:32 +08:00
uye
b65b3d3d16 feat: 新增检测 MuMu 后台保活 (#17241)
* feat: 新增检测 MuMu 后台保活

* chore: review
2026-07-02 22:27:53 +08:00
uye
a49bca5844 feat: 增加当前模拟器设置帧率检测与提示 (#17219) 2026-07-02 14:53:52 +08:00
Drest
252e3aa954 fix: 修复 MuMu 模拟器下第 32 个及以后多开模拟器的编号计算错误 (#17112)
* fix: 修复 MuMu 模拟器下第 32 个及以后多开模拟器的编号计算错误

* perf: 优化编号计算代码

* chore: 修改注释

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2026-07-02 14:37:44 +08:00
github-actions[bot]
c3787681a5 feat: Update Submodules MAAUnified, MaaMacGui, maa-cli
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/28551322947
[skip changelog]
2026-07-01 22:16:20 +00:00
MistEO
6ceabc3cfc ci: optimize MAAUnified build by reusing MaaCore artifacts (#17233)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 13:31:46 +08:00
MistEO
b1f017dcc9 ci: bot agent use secret 2026-06-30 22:28:56 +08:00
MistEO
b9fa7ca008 ci: bot agent use secrets 2026-06-30 22:28:14 +08:00
github-actions[bot]
d41c370110 chore: Auto Update Game Resources - 2026-06-30
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/28439907321

[skip changelog]
2026-06-30 11:10:47 +00:00
uye
7311dab428 fix: 修复未开启系统通知时进行系统通知检查 2026-06-30 12:58:47 +08:00
github-actions[bot]
55668face3 chore: Auto Update Game Resources - 2026-06-29
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/28395806977

[skip changelog]
2026-06-29 19:02:38 +00:00
uye
031e99c295 feat: 增加自动下载更新包提示文本 2026-06-29 14:46:42 +08:00
uye
84b560d3cd feat: 新增隐藏更新进度提示框选项 2026-06-29 14:37:02 +08:00
MistEO
ac9dbff483 ci: 强调要读skills 2026-06-29 12:15:19 +08:00
Constrat
b926a838c2 chore: revert discord notification embed color 2026-06-28 16:56:53 +02:00
43 changed files with 2021 additions and 420 deletions

View File

@@ -1,108 +1,52 @@
name: Build MAAUnified (Avalonia + MaaCore Runtime)
name: MAAUnified Quick Tests
on:
workflow_dispatch:
pull_request:
paths:
- ".github/workflows/ci-avalonia.yml"
- "3rdparty/include/**"
- "cmake/**"
- "src/MAAUnified"
- "src/MAAUnified/**"
- "src/MaaCore/**"
- "src/MaaUtils/**"
- "include/**"
- "tools/maadeps-download.py"
- "CMakeLists.txt"
- "CMakePresets.json"
- "!**/*.md"
push:
branches:
- dev-v2
paths:
- ".github/workflows/ci-avalonia.yml"
- "3rdparty/include/**"
- "cmake/**"
- "src/MAAUnified"
- "src/MAAUnified/**"
- "src/MaaCore/**"
- "src/MaaUtils/**"
- "include/**"
- "tools/maadeps-download.py"
- "CMakeLists.txt"
- "CMakePresets.json"
- "!**/*.md"
jobs:
meta:
name: Resolve version tag
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.out.outputs.tag }}
checkout_sha: ${{ steps.out.outputs.checkout_sha }}
steps:
- id: out
env:
CHECKOUT_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
run: |
echo "checkout_sha=${CHECKOUT_SHA}" >> "$GITHUB_OUTPUT"
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
else
echo "tag=preview-${CHECKOUT_SHA::7}" >> "$GITHUB_OUTPUT"
fi
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
build:
name: Build ${{ matrix.name }}
needs: meta
jobs:
test:
name: .NET Tests (${{ matrix.name }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: windows-x64
os: windows-2025-vs2026
rid: win-x64
self_contained: true
cmake_preset: windows-publish-x64
maadeps_triplet: x64-windows
- name: linux-x64
os: ubuntu-latest
rid: linux-x64
self_contained: true
cmake_preset: linux-publish-x64
maadeps_triplet: x64-linux
- name: macos-x64
os: macos-latest
rid: osx-x64
self_contained: true
cmake_preset: macos-publish-x64
maadeps_triplet: x64-osx
- name: windows-x64
os: windows-2025-vs2026
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.meta.outputs.checkout_sha }}
show-progress: false
- name: Fetch required submodules
shell: bash
run: bash ./.github/scripts/sync-optional-submodules.sh --init --depth 1 src/MAAUnified src/MaaUtils
run: bash ./.github/scripts/sync-optional-submodules.sh --init --depth 1 src/MAAUnified
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: "10.0.x"
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.x"
- name: Restore app
run: dotnet restore src/MAAUnified/App/MAAUnified.App.csproj
- name: Restore tests
if: matrix.name != 'macos-x64'
run: dotnet restore src/MAAUnified/Tests/MAAUnified.Tests.csproj
- name: Run Linux baseline consistency gate
@@ -137,65 +81,9 @@ jobs:
--filter "FullyQualifiedName~PlatformWindowsNativeSmokeTests"
- name: Upload test result artifacts on failure
if: failure() && matrix.name != 'macos-x64'
if: failure()
uses: actions/upload-artifact@v7
with:
name: MAAUnified-TestResults-${{ matrix.name }}
path: TestResults/${{ matrix.name }}/*.trx
if-no-files-found: ignore
- name: Bootstrap MaaDeps
run: python tools/maadeps-download.py ${{ matrix.maadeps_triplet }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build MaaCore runtime
run: |
cmake --preset ${{ matrix.cmake_preset }} -DINSTALL_PYTHON=OFF -DMAA_HASH_VERSION='${{ needs.meta.outputs.tag }}'
cmake --build --preset ${{ matrix.cmake_preset }}
cmake --install build --config RelWithDebInfo
- name: Publish MAAUnified app
run: dotnet publish src/MAAUnified/App/MAAUnified.App.csproj -c Release -r ${{ matrix.rid }} --self-contained ${{ matrix.self_contained }} -o publish
- name: Merge MaaCore runtime (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
Copy-Item install\* publish\ -Recurse -Force
if (!(Test-Path "publish\MaaCore.dll")) { throw "MaaCore.dll not found in publish output." }
if (!(Test-Path "publish\resource")) { throw "resource directory not found in publish output." }
- name: Merge MaaCore runtime (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
cp -a install/. publish/
if [[ "$RUNNER_OS" == "Linux" ]]; then
test -f publish/libMaaCore.so
else
test -f publish/libMaaCore.dylib
fi
test -d publish/resource
- name: Package (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Path release -Force | Out-Null
$name = "MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
Compress-Archive -Path publish\* -DestinationPath "release\$name.zip"
- name: Package (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
mkdir -p release
name="MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
tar -czf "release/${name}.tar.gz" -C publish .
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: MAAUnified-${{ matrix.name }}
path: release/*

View File

@@ -152,6 +152,16 @@ jobs:
cp MaaFramework-temp/bin/*Win32ControlUnit* install/
cp MaaFramework-temp/bin/*AdbControlUnit* install/
- name: Upload MaaCore runtime for downstream jobs
uses: actions/upload-artifact@v7
with:
name: MAARuntime-win-${{ matrix.arch }}
path: |
install/
!install/*.h
!install/*.pdb
!install/msvc-debug/
- name: Generate global.json
shell: bash
run: |
@@ -289,6 +299,12 @@ jobs:
run: |
cp MaaFramework-temp/bin/*AdbControlUnit* install/
- name: Upload MaaCore runtime for downstream jobs
uses: actions/upload-artifact@v7
with:
name: MAARuntime-linux-${{ matrix.arch }}
path: install/
- name: Setup cross compile toolchains for CLI
uses: ./src/maa-cli/.github/actions/setup
with:
@@ -489,6 +505,12 @@ jobs:
name: MAACore-macos-${{ matrix.arch }}
path: "install/*.dylib"
- name: Upload MaaCore runtime for downstream jobs
uses: actions/upload-artifact@v7
with:
name: MAARuntime-macos-${{ matrix.arch }}
path: install/
macOS-GUI:
name: Build GUI for macOS
needs: [meta, macOS-Core]
@@ -651,6 +673,139 @@ jobs:
name: MAA-macos-universal
path: ${{ startsWith(github.ref, 'refs/tags/v') && 'release/MAA*' || 'src/MaaMacGui/MAA.xcarchive/**' }}
avalonia:
name: Build MAAUnified (Avalonia) ${{ matrix.name }}
needs: [meta, windows, ubuntu, macOS-Core]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: win-x64
os: windows-2025-vs2026
rid: win-x64
runtime_artifact: MAARuntime-win-x64
- name: linux-x64
os: ubuntu-latest
rid: linux-x64
runtime_artifact: MAARuntime-linux-x86_64
- name: macos-x64
os: macos-latest
rid: osx-x64
runtime_artifact: MAARuntime-macos-x86_64
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
show-progress: false
- name: Fetch required submodules
shell: bash
run: bash ./.github/scripts/sync-optional-submodules.sh --init --depth 1 src/MAAUnified
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: "10.0.x"
- name: Restore app
run: dotnet restore src/MAAUnified/App/MAAUnified.App.csproj
- name: Restore tests
if: matrix.name != 'macos-x64'
run: dotnet restore src/MAAUnified/Tests/MAAUnified.Tests.csproj
- name: Run Linux baseline consistency gate
if: matrix.name == 'linux-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=baseline-consistency.trx"
--filter "FullyQualifiedName~BaselineContractTests|FullyQualifiedName~BaselineCoverageTests|FullyQualifiedName~BaselineRenderSyncTests|FullyQualifiedName~ParityMatrixSyncTests"
- name: Run Linux full MAAUnified test gate
if: matrix.name == 'linux-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=full-maaunified-tests.trx"
- name: Run Windows platform capability contract gate
if: matrix.name == 'win-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=platform-capability-contract.trx"
--filter "FullyQualifiedName~PlatformCapabilityContractTests"
- name: Run Windows native capability smoke gate
if: matrix.name == 'win-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=platform-windows-native-smoke.trx"
--filter "FullyQualifiedName~PlatformWindowsNativeSmokeTests"
- name: Upload test result artifacts on failure
if: failure() && matrix.name != 'macos-x64'
uses: actions/upload-artifact@v7
with:
name: MAAUnified-TestResults-${{ matrix.name }}
path: TestResults/${{ matrix.name }}/*.trx
if-no-files-found: ignore
- name: Download MaaCore runtime
uses: actions/download-artifact@v8
with:
name: ${{ matrix.runtime_artifact }}
path: install
- name: Publish MAAUnified app
run: dotnet publish src/MAAUnified/App/MAAUnified.App.csproj -c Release -r ${{ matrix.rid }} --self-contained true -o publish
- name: Merge MaaCore runtime (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
Copy-Item install\* publish\ -Recurse -Force
if (!(Test-Path "publish\MaaCore.dll")) { throw "MaaCore.dll not found in publish output." }
if (!(Test-Path "publish\resource")) { throw "resource directory not found in publish output." }
- name: Merge MaaCore runtime (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
cp -a install/. publish/
if [[ "$RUNNER_OS" == "Linux" ]]; then
test -f publish/libMaaCore.so
else
test -f publish/libMaaCore.dylib
fi
test -d publish/resource
- name: Package (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Path release -Force | Out-Null
$name = "MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
Compress-Archive -Path publish\* -DestinationPath "release\$name.zip"
- name: Package (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
mkdir -p release
name="MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
tar -czf "release/${name}.tar.gz" -C publish .
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: MAAUnified-${{ matrix.name }}
path: release/*
release:
name: Publish Release
if: startsWith(github.ref, 'refs/tags/v')
@@ -666,6 +821,8 @@ jobs:
run: |
mv -vf assets/changelog/* .
rm -rf assets/MAACore-macos-*
rm -rf assets/MAARuntime-*
rm -rf assets/MAAUnified-*
cd assets
# find . -type f | xargs mv -fvt .
find . -type f | while read f; do mv -fvt . $f; done

View File

@@ -62,7 +62,7 @@ jobs:
embeds: [{
title: ("🎉 New MAA Release: " + $tag),
description: $description,
color: 15844367,
color: 10246582,
fields: [
{ name: "Windows", value: ("[x64](" + $win64_url + ") ❘ [ARM](" + $winarm_url + ")"), inline: true },
{ name: "macOS", value: ("[Universal](" + $mac_url + ")"), inline: true },

View File

@@ -34,7 +34,7 @@ jobs:
continue-on-error: true
uses: MistEO/ai-issue-analysis@main
with:
agent: claude
agent: ${{ secrets.BOT_AI_AGENT }}
api-key: ${{ secrets.BOT_AI_API_KEY }}
api-base-url: ${{ secrets.BOT_AI_API_BASE_URL }}
model: ${{ secrets.BOT_AI_MODEL }}
@@ -45,7 +45,7 @@ jobs:
感谢您的反馈AI 正在自动分析该问题,预计耗时约 10 分钟。
prompt-template: |
分析 GitHub Issue {{issue_number}}。把最终结论写到 {{answer_file}}。
严格按照 .claude/skills/maa-issue-log-analysis/SKILL.md 中的规则,分析 GitHub Issue {{issue_number}}。把最终结论写到 {{answer_file}}。
extra-comment-content: |
<!-- Skip all labels -->

View File

@@ -52,7 +52,7 @@ jobs:
continue-on-error: true
uses: MistEO/ai-issue-analysis@main
with:
agent: claude
agent: ${{ secrets.BOT_AI_AGENT }}
api-key: ${{ secrets.BOT_AI_API_KEY }}
api-base-url: ${{ secrets.BOT_AI_API_BASE_URL }}
model: ${{ secrets.BOT_AI_MODEL }}

View File

@@ -76,7 +76,8 @@
"stop": "[Adb] -s [AdbSerial] shell am force-stop [PackageName]",
"back_to_home": "[Adb] -s [AdbSerial] shell input keyevent HOME",
"release": "[Adb] kill-server",
"pressEsc": "[Adb] -s [AdbSerial] shell input keyevent 111"
"pressEsc": "[Adb] -s [AdbSerial] shell input keyevent 111",
"fps": "[Adb] -s [AdbSerial] shell \"dumpsys SurfaceFlinger --latency | head -n 1\""
},
{
"configName": "CapWithShell",

View File

@@ -4,8 +4,8 @@
"time": 1782129600
},
"gacha": {
"pool": "Quester in Frozen Moments",
"time": 1782129600
"pool": " Celebration - Kernel",
"time": 1782817200
},
"last_updated": "2026-06-22 12:38:44.000"
"last_updated": "2026-06-30 11:10:47.000"
}

View File

@@ -4,8 +4,8 @@
"time": 1782093600
},
"gacha": {
"pool": "止まった時の中で",
"time": 1782093600
"pool": "ロドスの道のり・期待",
"time": 1783004400
},
"last_updated": "2026-06-22 06:11:46.000"
"last_updated": "2026-07-02 15:27:58.000"
}

View File

@@ -4,8 +4,8 @@
"time": 1782093600
},
"gacha": {
"pool": "얼어붙은 시간 속에서의 탐색",
"time": 1782093600
"pool": "셀레브레이션 희망",
"time": 1783004400
},
"last_updated": "2026-06-22 06:11:46.000"
"last_updated": "2026-07-02 15:27:58.000"
}

View File

@@ -34,9 +34,11 @@ target_include_directories(MaaCore PUBLIC ${PROJECT_SOURCE_DIR}/include PRIVATE
add_dependencies(MaaCore MaaUtils)
if(ANDROID)
find_package(ncnn REQUIRED)
find_package(polyclipping CONFIG REQUIRED)
target_link_libraries(MaaCore
HeaderOnlyLibraries MaaUtils ${OpenCV_LIBS}
ncnn
polyclipping::polyclipping
ONNXRuntime::ONNXRuntime ZLIB::ZLIB Boost::system)
set_property(TARGET MaaCore PROPERTY NO_SYSTEM_FROM_IMPORTED TRUE)
else()

View File

@@ -87,6 +87,7 @@ bool asst::GeneralConfig::parse(const json::value& json)
adb.call_maatouch = cfg_json.get("callMaatouch", base_cfg.call_maatouch);
adb.event_id = cfg_json.get("eventId", base_cfg.event_id);
adb.back_to_home = cfg_json.get("back_to_home", base_cfg.back_to_home);
adb.fps = cfg_json.get("fps", base_cfg.fps);
}
return true;

View File

@@ -87,6 +87,7 @@ struct AdbCfg
std::string call_maatouch;
std::string event_id;
std::string back_to_home;
std::string fps; // 获取模拟器刷新率SurfaceFlinger 帧间隔,单位纳秒)
json::object extras;
};

View File

@@ -156,6 +156,8 @@ bool OcrPack::check_and_load()
#include <ncnn/net.h>
#include <polyclipping/clipper.hpp>
namespace
{
constexpr int kDetLimitSideLen = 960;
@@ -437,7 +439,31 @@ std::vector<asst::OcrPackNcnn::DetBox> asst::OcrPackNcnn::detect(const cv::Mat&
}
const float dist = area * kDetUnclipRatio / length;
cv::RotatedRect rr2(rr.center, cv::Size2f(rr.size.width + 2.f * dist, rr.size.height + 2.f * dist), rr.angle);
// 对齐 fastdeploy PostProcessor::UnClip对 box 多边形做 jtRound 偏移再取 minAreaRect。
// 之前的近似RotatedRect 宽高各 +2*dist在小字上框偏紧约 0.5~1px叠加 det 的各向异性回缩后
// 会切掉笔画导致 rec 误识(实测 1080P 缩放后「丰饶灌木林」被读成「丰烧濯木林」,破坏 ocrReplace 锚点;
// 改用 Clipper 后框高 14→15px、rec 置信度 0.83→0.94,与桌面 fastdeploy / 720P 表现一致)。
ClipperLib::Path poly;
for (int pi = 0; pi < 4; ++pi) {
poly << ClipperLib::IntPoint(static_cast<int>(box[pi].x), static_cast<int>(box[pi].y));
}
ClipperLib::ClipperOffset offset;
offset.AddPath(poly, ClipperLib::jtRound, ClipperLib::etClosedPolygon);
ClipperLib::Paths solution;
offset.Execute(solution, dist);
if (solution.empty()) {
continue;
}
std::vector<cv::Point2f> expanded;
for (const auto& sub : solution) {
for (const auto& pt : sub) {
expanded.emplace_back(static_cast<float>(pt.X), static_cast<float>(pt.Y));
}
}
if (expanded.empty()) {
continue;
}
cv::RotatedRect rr2 = cv::minAreaRect(expanded);
if (std::max(rr2.size.width, rr2.size.height) < kDetMinSize + 2) {
continue;
}

View File

@@ -3,6 +3,7 @@
#include "Assistant.h"
#include "Controller.h"
#include "MaaUtils/NoWarningCV.hpp"
#include <cmath>
#include <cstdint>
#include <numeric>
@@ -213,7 +214,17 @@ int asst::AdbController::get_mumu_index(const std::string& address)
int port = std::stoi(port_str);
int mumu_index = 0;
if (port >= 16384) {
mumu_index = (port - 16384) / 32;
// port = 16384 + (index % 32) * 32 + ((offset + floor(index/32) * 4) % 32)
// 设 i = (index % 32) 是 0~31
// 不考虑 index 超过 256 的情况,设 j = floor(index/32),只能是 0~7
// 于是 j * 4 的取值范围是 0, 4, 8, ..., 28全部小于 32所以取模后就是它本身
// offset 的取整为 0~31但只有端口被占用时才会增加所以不影响正常情况下的连续性
// 所以公式简化为:
// port = 16384 + (index % 32) * 32 + floor(index/32) * 4 = 16384 + i * 32 + j * 4
// 设 k = (port - 16384) / 4则 k = i * 8 + j
// index = j * 32 + i = (k & 7) * 32 + (k >> 3) = ((k & 7) << 5) + (k >> 3)
int k = (port - 16384) / 4;
mumu_index = ((k & 7) << 5) | (k >> 3);
}
else if (port == 7555) {
mumu_index = 0;
@@ -342,6 +353,7 @@ void asst::AdbController::clear_info() noexcept
m_width = 0;
m_height = 0;
m_screen_size = { 0, 0 };
m_last_fps_check_time = {}; // 重置帧率检测计时,重连后立即检测一次
}
bool asst::AdbController::inited() const noexcept
@@ -777,6 +789,10 @@ bool asst::AdbController::screencap(cv::Mat& image_payload, bool allow_reconnect
}
callback(AsstMsg::ConnectionInfo, info);
}
// 每 1 分钟检测一次模拟器帧率
check_fps();
return screencap_ret;
}
}
@@ -1146,6 +1162,7 @@ bool asst::AdbController::connect(const std::string& adb_path, const std::string
m_adb.start = m_conn_ctx.replace_cmd(adb_cfg.start);
m_adb.stop = m_conn_ctx.replace_cmd(adb_cfg.stop);
m_adb.back_to_home = m_conn_ctx.replace_cmd(adb_cfg.back_to_home);
m_adb.fps = m_conn_ctx.replace_cmd(adb_cfg.fps);
if (m_support_socket && !m_server_started) {
std::string bind_address;
@@ -1204,6 +1221,73 @@ void asst::AdbController::clear_lf_info()
m_adb.screencap_end_of_line = AdbProperty::ScreencapEndOfLine::UnknownYet;
}
void asst::AdbController::check_fps()
{
// 命令未配置或尚未连接,跳过
if (m_adb.fps.empty()) {
return;
}
// 每 1 分钟检测一次
constexpr auto FpsCheckInterval = std::chrono::minutes(1);
auto now = std::chrono::steady_clock::now();
if (m_last_fps_check_time.time_since_epoch().count() != 0 && now - m_last_fps_check_time < FpsCheckInterval) {
return;
}
m_last_fps_check_time = now;
auto ret = call_command(m_adb.fps, 100, false /* 帧率检测不触发重连,避免拖慢截图流程 */);
if (!ret || ret.value().empty()) {
Log.warn("fps command failed or empty");
return;
}
// SurfaceFlinger --latency 第一行是每帧刷新周期(纳秒),例如 16666666 表示 60 FPS
// 注意:这里检测的是模拟器/系统的设置刷新率,而非游戏实际运行帧率。
// 游戏原生帧率上限为 60 FPS高于 60 通常为模拟器插帧,不作为异常处理。
auto& output = ret.value();
convert_lf(output);
auto newline_pos = output.find('\n');
std::string first_line = newline_pos == std::string::npos ? output : output.substr(0, newline_pos);
// 去掉空白和非数字字符
std::erase_if(first_line, [](char c) { return !std::isdigit(static_cast<unsigned char>(c)); });
if (first_line.empty()) {
Log.warn("fps output is empty after sanitize");
return;
}
long long refresh_period_ns = 0;
try {
refresh_period_ns = std::stoll(first_line);
}
catch (...) {
Log.warn("fps output parse failed:", first_line);
return;
}
if (refresh_period_ns <= 0) {
Log.warn("invalid refresh period:", refresh_period_ns);
return;
}
// ns -> FPS
double fps = 1000000000.0 / static_cast<double>(refresh_period_ns);
int fps_int = static_cast<int>(std::round(fps));
json::value info = json::object {
{ "uuid", m_uuid },
{ "what", "EmulatorFPS" },
{ "details",
json::object {
{ "fps", fps_int },
{ "refresh_period_ns", refresh_period_ns },
} },
};
callback(AsstMsg::ConnectionInfo, info);
}
void asst::AdbController::back_to_home() noexcept
{
call_command(m_adb.back_to_home);

View File

@@ -2,6 +2,7 @@
#include "ControllerAPI.h"
#include <chrono>
#include <deque>
#include <random>
@@ -147,6 +148,9 @@ protected:
// 导致解码错误,所以这里转一下回来(点名批评 mumu 和雷电)
static bool convert_lf(std::string& data);
// 每 1 分钟检测一次模拟器帧率,回调给 UI 用于低帧率提示
void check_fps();
AdbConnectionContext m_conn_ctx;
AsstCallback m_callback;
@@ -180,6 +184,8 @@ protected:
std::string back_to_home;
std::string fps; // 获取模拟器刷新率的命令
/* properties */
enum class ScreencapEndOfLine
{
@@ -213,9 +219,10 @@ protected:
bool m_server_started = false;
bool m_inited = false;
bool m_kill_adb_on_exit = false;
long long m_last_command_duration = 0; // 上次命令执行用时
std::deque<long long> m_screencap_cost; // 截图用时
int m_screencap_times = 0; // 截图次数
long long m_last_command_duration = 0; // 上次命令执行用时
std::deque<long long> m_screencap_cost; // 截图用时
int m_screencap_times = 0; // 截图次数
std::chrono::steady_clock::time_point m_last_fps_check_time; // 上次帧率检测时间
#if ASST_WITH_EMULATOR_EXTRAS
MumuExtras m_mumu_extras;

View File

@@ -6,7 +6,7 @@
// MAA.Updater.exe <ParentProcessId> <RootDir> <ExtractDir> <BackupDir>
// <PackagePath> <SuccessStatusFile> <FailureStatusFile>
// <RelaunchExecutablePath> <PlanFile>
// [--mutex-name <name>] [--show-console]
// [--mutex-name <name>] [--show-console] [--no-progress-ui]
//
// Plan file format (UTF-8 JSON):
// { "packageType": "full|ota", "removeList": ["rel/path", ...], "moveList": ["rel/path", ...] }
@@ -134,6 +134,8 @@ struct ProgressUiTheme
static std::wstring g_logFile;
static bool g_writeConsoleLog = false;
// 用户可通过 --no-progress-ui 显式关闭更新进度窗口
static bool g_suppressProgressUi = false;
static UpdateProgressUi g_progressUi;
static ProgressUiTheme g_progressUiTheme;
@@ -340,7 +342,8 @@ static bool EnsureProgressWindowClassRegistered()
static bool ShouldShowProgressUi()
{
return !g_writeConsoleLog && GetConsoleWindow() == nullptr;
// 控制台输出和进度窗口是两个独立选项,可同时显示;用户可通过 --no-progress-ui 显式关闭进度窗口
return !g_suppressProgressUi;
}
static void PumpProgressUiMessages()
@@ -1800,6 +1803,7 @@ int wmain(int argc, wchar_t* argv[])
std::wstring relaunchExecutable = argv[8];
std::wstring planFile = argv[9];
g_writeConsoleLog = HasArgument(argc, argv, L"--show-console");
g_suppressProgressUi = HasArgument(argc, argv, L"--no-progress-ui");
std::wstring mutexName;
for (int i = 1; i < argc - 1; ++i) {

View File

@@ -43,12 +43,6 @@ public class GUI : INotifyPropertyChanged
public bool SaveWindowPlacement { get; set; } = true;
public bool UseAlternateStage { get; set; } = false;
public bool HideUnavailableStage { get; set; } = true;
public bool CustomStageCode { get; set; } = false;
public InverseClearType InverseClearMode { get; set; } = InverseClearType.Clear;
public string WindowTitlePrefix { get; set; } = string.Empty;
@@ -85,6 +79,13 @@ public class GUI : INotifyPropertyChanged
public bool ExpanderAboutUs { get; set; } = true;
// ===== 背景设置(莫奈取色) =====
public bool BackgroundMonetEnabled { get; set; } = false;
public MonetModeType BackgroundMonetMode { get; set; } = MonetModeType.Auto;
public string BackgroundMonetCustomColor { get; set; } = "#326CF3";
[UsedImplicitly]
public void OnPropertyChanged(string propertyName, object before, object after)
{
@@ -129,4 +130,20 @@ public class GUI : INotifyPropertyChanged
/// </summary>
ClearInverse,
}
/// <summary>
/// 莫奈取色的模式。
/// </summary>
public enum MonetModeType
{
/// <summary>
/// 从背景图自动提取主色。
/// </summary>
Auto = 0,
/// <summary>
/// 用户手动选择颜色。
/// </summary>
Custom,
}
}

View File

@@ -44,6 +44,8 @@ public class VersionUpdate : INotifyPropertyChanged
public bool ShowUpdaterConsole { get; set; } = false;
public bool ShowUpdaterProgress { get; set; } = true;
public void OnPropertyChanged(string propertyName, object before, object after)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventDetailArgs(propertyName, before, after));

View File

@@ -248,6 +248,7 @@ public static class ConfigurationKeys
public const string AutoDownloadUpdatePackage = "VersionUpdate.AutoDownloadUpdatePackage";
public const string AutoInstallUpdatePackage = "VersionUpdate.AutoInstallUpdatePackage";
public const string ShowUpdaterConsole = "VersionUpdate.ShowUpdaterConsole";
public const string ShowUpdaterProgress = "VersionUpdate.ShowUpdaterProgress";
public const string PenguinId = "Penguin.Id";
public const string IsDrGrandet = "Penguin.IsDrGrandet"; // 已迁移

View File

@@ -691,7 +691,7 @@ public class AchievementTrackerHelper : PropertyChangedBase
FeatureExploration(id: AchievementIds.Pioneer2, group: AchievementIds.PioneerGroup, isHidden: true, groupIndex: 2), // 将 MAA 更新至内测版(隐藏)
FeatureExploration(id: AchievementIds.Pioneer3, group: AchievementIds.PioneerGroup, isHidden: true, groupIndex: 3), // 使用未发布版本的 MAA隐藏
FeatureExploration(id: AchievementIds.MosquitoLeg, target: 5), // 使用借助战打 OF-1功能超过 5 次
FeatureExploration(id: AchievementIds.MosquitoLeg, target: 5), // 使用借助战打 OF-1功能超过 5 次
FeatureExploration(id: AchievementIds.RealGacha, isHidden: true), // 真正的抽卡
FeatureExploration(id: AchievementIds.PeekScreen, isHidden: true), // 窥屏
FeatureExploration(id: AchievementIds.CustomizationMaster, isHidden: true), // 自定义背景

View File

@@ -0,0 +1,192 @@
// <copyright file="ColorExtractorHelper.cs" company="MaaAssistantArknights">
// Part of the MaaWpfGui project, maintained by the MaaAssistantArknights team (Maa Team)
// Copyright (C) 2021-2025 MaaAssistantArknights Contributors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License v3.0 only as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace MaaWpfGui.Helper;
/// <summary>
/// 从图片中提取主色dominant color的工具类。
/// 采用降采样 + 颜色量化桶统计的方式,性能优于完整的 k-means。
/// </summary>
public static class ColorExtractorHelper
{
/// <summary>
/// 量化桶步长,将 RGB 空间按每 <see cref="BucketSize"/> 为一格分桶。
/// </summary>
private const int BucketSize = 16;
/// <summary>
/// 降采样后的最大边长(像素),用于加速取色。
/// </summary>
private const int SampleSize = 32;
/// <summary>
/// 从 BitmapImage 中提取出现频率最高的颜色。
/// </summary>
/// <param name="image">源图片。必须已调用过EndInit并完成解码。</param>
/// <returns>提取到的主色;若图片无效则返回白色。</returns>
public static Color ExtractDominantColor(BitmapSource image)
{
if (image == null)
{
return Colors.White;
}
// 降采样到 ~32×32 以加速
var scaledWidth = Math.Min(SampleSize, image.PixelWidth);
var scaledHeight = Math.Min(SampleSize, image.PixelHeight);
var converted = new FormatConvertedBitmap(image, PixelFormats.Bgra32, null, 0);
var resized = new TransformedBitmap(converted, new ScaleTransform(
(double)scaledWidth / image.PixelWidth,
(double)scaledHeight / image.PixelHeight));
var pixels = new byte[scaledWidth * scaledHeight * 4];
resized.CopyPixels(pixels, scaledWidth * 4, 0);
// 量化到桶,统计频率
var buckets = new Dictionary<long, (long Count, long R, long G, long B)>();
for (var i = 0; i < pixels.Length; i += 4)
{
var a = pixels[i + 3];
if (a < 128)
{
// 跳过近透明像素
continue;
}
var r = pixels[i + 2]; // BGRA
var g = pixels[i + 1];
var b = pixels[i];
var bucketR = r / BucketSize;
var bucketG = g / BucketSize;
var bucketB = b / BucketSize;
var key = (((bucketR * 256L) + bucketG) * 256L) + bucketB;
if (buckets.TryGetValue(key, out var entry))
{
buckets[key] = (entry.Count + 1, entry.R + r, entry.G + g, entry.B + b);
}
else
{
buckets[key] = (1, r, g, b);
}
}
if (buckets.Count == 0)
{
return Colors.White;
}
// 对每个桶计算「频率 × 鲜艳度」的综合得分,优先选高占比且鲜艳的颜色
Color bestColor = Colors.White;
var bestScore = -1.0;
foreach (var (_, value) in buckets)
{
long count = value.Count;
var avgR = (byte)(value.R / count);
var avgG = (byte)(value.G / count);
var avgB = (byte)(value.B / count);
var avgColor = Color.FromRgb(avgR, avgG, avgB);
var (_, sat, _) = RgbToHsl(avgColor);
// 频率占比 × 饱和度²,饱和度平方确保鲜艳颜色优先
var frequencyRatio = (double)count / (scaledWidth * scaledHeight);
var score = frequencyRatio * sat * sat;
if (score > bestScore)
{
bestScore = score;
bestColor = avgColor;
}
}
return bestColor;
}
/// <summary>
/// 异步版本的取色方法,将计算放到后台线程。
/// </summary>
/// <param name="image">源图片。</param>
/// <returns>提取到的主色。</returns>
public static Task<Color> ExtractDominantColorAsync(BitmapSource image)
{
if (image == null)
{
return Task.FromResult(Colors.White);
}
// BitmapImage 必须 Freeze 后才能跨线程访问像素
if (!image.IsFrozen)
{
image.Freeze();
}
return Task.Run(() => ExtractDominantColor(image));
}
/// <summary>
/// RGB → HSL 转换。
/// </summary>
private static (double H, double S, double L) RgbToHsl(Color color)
{
var r = color.R / 255.0;
var g = color.G / 255.0;
var b = color.B / 255.0;
var max = Math.Max(r, Math.Max(g, b));
var min = Math.Min(r, Math.Min(g, b));
var delta = max - min;
var l = (max + min) / 2.0;
if (delta == 0)
{
return (0, 0, l);
}
var s = delta / (1 - Math.Abs((2 * l) - 1));
double h;
if (max == r)
{
h = ((g - b) / delta) % 6;
}
else if (max == g)
{
h = ((b - r) / delta) + 2;
}
else
{
h = ((r - g) / delta) + 4;
}
h *= 60;
if (h < 0)
{
h += 360;
}
return (h, s, l);
}
}

View File

@@ -16,6 +16,7 @@ using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text.Json;
using System.Text.RegularExpressions;
using MaaWpfGui.Constants;
using MaaWpfGui.ViewModels.UI;
@@ -60,6 +61,82 @@ public class EmulatorHelper
}
}
/// <summary>
/// 记录无效端口日志并返回 null。
/// </summary>
/// <param name="port">无效的端口号。</param>
/// <returns>始终返回 null。</returns>
private static int? InvalidMuMuPort(int port)
{
_logger.Error("Port {Port} is not valid for MuMu emulator", port);
return null;
}
/// <summary>
/// 将 MuMu 端口号转换为实例索引。
/// MuMu 端口分配公式port = 16384 + (index % 32) * 32 + floor(index/32) * 4
/// 简化后 index = ((k & 7) << 5) | (k >> 3),其中 k = (port - 16384) / 4。
/// 参见 https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17112
/// </summary>
/// <param name="port">MuMu ADB 端口号。</param>
/// <returns>实例索引。</returns>
private static int MuMuPortToIndex(int port)
{
int k = (port - 16384) / 4;
return ((k & 7) << 5) | (k >> 3);
}
/// <summary>
/// 从连接地址或 MuMu Bridge 连接配置推导 MuMu 模拟器实例索引。
/// </summary>
/// <param name="address">连接地址,如 127.0.0.1:16384。</param>
/// <returns>推导出的实例索引;无法推导时返回 null。</returns>
private static int? GetMuMuIndex(string address)
{
if (address == "127.0.0.1:16384")
{
return 0;
}
if (SettingsViewModel.ConnectSettings.MuMuEmulatorExtras.MuMuBridgeConnection)
{
return int.TryParse(SettingsViewModel.ConnectSettings.MuMuEmulatorExtras.Index, out var indexParse) ? indexParse : 0;
}
if (address.Contains(':'))
{
string portStr = address.Split(':')[1];
if (!int.TryParse(portStr, out int port))
{
_logger.Error("Failed to parse port from address {Address}", address);
return null;
}
return port switch
{
>= 16384 => MuMuPortToIndex(port),
7555 => 0,
>= 5555 => (port - 5555) / 2,
_ => InvalidMuMuPort(port),
};
}
if (address.StartsWith("emulator-", StringComparison.OrdinalIgnoreCase))
{
string[] parts = address.Split('-');
if (parts.Length >= 2 && int.TryParse(parts[1], out int port))
{
return (port - 5554) / 2;
}
_logger.Error("Failed to parse port from emulator style address {Address}", address);
return null;
}
_logger.Error("Unsupported address format: {Address}", address);
return null;
}
/// <summary>
/// 一个用于调用 MuMu 模拟器控制台关闭 MuMu 的方法
/// </summary>
@@ -67,62 +144,14 @@ public class EmulatorHelper
private static bool KillEmulatorMuMuEmulator()
{
string address = SettingsViewModel.ConnectSettings.ConnectAddress;
int emuIndex;
if (address == "127.0.0.1:16384")
int? emuIndexOpt = GetMuMuIndex(address);
if (emuIndexOpt is null)
{
emuIndex = 0;
}
else if (SettingsViewModel.ConnectSettings.MuMuEmulatorExtras.MuMuBridgeConnection)
{
emuIndex = int.TryParse(SettingsViewModel.ConnectSettings.MuMuEmulatorExtras.Index, out var indexParse) ? indexParse : 0;
}
else if (address.Contains(':'))
{
string portStr = address.Split(':')[1];
if (int.TryParse(portStr, out int port))
{
switch (port)
{
case >= 16384:
emuIndex = (port - 16384) / 32;
break;
case 7555:
emuIndex = 0;
_logger.Warning("Port 7555 is deprecated for MuMu6, please use 16384 or above.");
break;
case >= 5555:
emuIndex = (port - 5555) / 2;
break;
default:
_logger.Error("Port {Port} is not valid for MuMu emulator", port);
return false;
}
}
else
{
_logger.Error("Failed to parse port from address {Address}", address);
return false;
}
}
else if (address.StartsWith("emulator-", StringComparison.OrdinalIgnoreCase))
{
string[] parts = address.Split('-');
if (parts.Length >= 2 && int.TryParse(parts[1], out int port))
{
emuIndex = (port - 5554) / 2;
}
else
{
_logger.Error("Failed to parse port from emulator style address {Address}", address);
return false;
}
}
else
{
_logger.Error("Unsupported address format: {Address}", address);
return false;
}
int emuIndex = emuIndexOpt.Value;
// 尝试找到正在运行的模拟器进程
Process[] processes = Process.GetProcessesByName("MuMuNxDevice"); // 新版
if (processes.Length == 0)
@@ -553,6 +582,156 @@ public class EmulatorHelper
return KillEmulator();
}
/// <summary>
/// 检测 MuMu 模拟器的后台保活是否开启。
/// 通过 MuMuManager.exe 读取 app_keptlive 配置项。
/// </summary>
/// <returns>true 表示保活已开启可能导致截图和操作异常false 表示未开启或检测失败。</returns>
public static bool CheckMuMuKeepAlive()
{
try
{
// 从连接地址推导实例索引
string address = SettingsViewModel.ConnectSettings.ConnectAddress;
int? emuIndexOpt = GetMuMuIndex(address);
if (emuIndexOpt is null)
{
_logger.Information("Cannot determine MuMu index for keep alive check, address: {Address}", address);
return false;
}
int emuIndex = emuIndexOpt.Value;
// 查找 MuMuManager.exe 路径
string? consolePath = FindMuMuManagerPath();
if (consolePath == null)
{
_logger.Information("MuMuManager.exe not found, skip keep alive check");
return false;
}
// 调用 MuMuManager.exe setting -v {emuIndex} -k app_keptlive
// 返回 JSON 格式: { "app_keptlive": "true" }
var startInfo = new ProcessStartInfo(consolePath)
{
Arguments = $"setting -v {emuIndex} -k app_keptlive",
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true,
};
using var process = Process.Start(startInfo);
if (process == null || !process.WaitForExit(5000))
{
_logger.Warning("MuMuManager.exe did not exit within timeout, killing it");
try
{
process?.Kill();
}
catch (Exception ex)
{
_logger.Warning("Failed to kill MuMuManager.exe: {ExMessage}", ex.Message);
}
return false;
}
string output = process.StandardOutput.ReadToEnd().Trim();
_logger.Information("MuMuManager app_keptlive output: {Output}", output);
if (string.IsNullOrEmpty(output))
{
return false;
}
// 解析 JSON 输出,兼容字符串和布尔两种格式
using var doc = JsonDocument.Parse(output);
if (doc.RootElement.TryGetProperty("app_keptlive", out var value))
{
return value.ValueKind switch
{
JsonValueKind.True => true,
JsonValueKind.False => false,
JsonValueKind.String => string.Equals(value.GetString(), "true", StringComparison.OrdinalIgnoreCase),
_ => false,
};
}
return false;
}
catch (Exception e)
{
_logger.Warning("Failed to check MuMu keep alive: {EMessage}", e.Message);
return false;
}
}
/// <summary>
/// 查找 MuMuManager.exe 的路径,优先从运行中的 MuMu 进程获取,回退到用户配置的安装路径。
/// </summary>
/// <returns>MuMuManager.exe 的完整路径,找不到则返回 null。</returns>
private static string? FindMuMuManagerPath()
{
// 优先从运行中的模拟器进程获取安装目录
Process[] processes = Process.GetProcessesByName("MuMuNxDevice");
if (processes.Length == 0)
{
processes = Process.GetProcessesByName("MuMuPlayer");
}
if (processes.Length > 0)
{
try
{
string? emulatorExePath = processes[0].MainModule?.FileName;
if (emulatorExePath != null)
{
// 新版: nx_device\12.0\shell\MuMuNxDevice.exe → 上三级 = 安装目录
// 旧版: shell\MuMuPlayer.exe → 上一级 = 安装目录
var installPath = Path.GetFullPath(
Path.GetFileName(emulatorExePath).Equals("MuMuNxDevice.exe", StringComparison.OrdinalIgnoreCase)
? Path.Combine(Path.GetDirectoryName(emulatorExePath)!, @"..\..\..")
: Path.Combine(Path.GetDirectoryName(emulatorExePath)!, ".."));
string newConsolePath = Path.Combine(installPath, @"nx_main\MuMuManager.exe");
if (File.Exists(newConsolePath))
{
return newConsolePath;
}
string oldConsolePath = Path.Combine(installPath, @"shell\MuMuManager.exe");
if (File.Exists(oldConsolePath))
{
return oldConsolePath;
}
}
}
catch (Exception e)
{
_logger.Warning("Failed to get MuMu process module path: {EMessage}", e.Message);
}
}
// 回退:从用户配置的 MuMu 安装路径查找
string? configuredPath = SettingsViewModel.ConnectSettings.MuMuEmulatorExtras.EmulatorPath;
if (!string.IsNullOrEmpty(configuredPath) && Directory.Exists(configuredPath))
{
string newConsolePath = Path.Combine(configuredPath, @"nx_main\MuMuManager.exe");
if (File.Exists(newConsolePath))
{
return newConsolePath;
}
string oldConsolePath = Path.Combine(configuredPath, @"shell\MuMuManager.exe");
if (File.Exists(oldConsolePath))
{
return oldConsolePath;
}
}
return null;
}
/// <summary>
/// Kills emulator.
/// </summary>

View File

@@ -44,6 +44,8 @@ public static class Instances
public static bool HasPrintedScreencapWarning { get; set; } = false;
public static bool HasPrintedFpsHighTip { get; set; } = false;
public static int RecruitConfirmTime { get; set; } = 0;
public static void ClearCache()
@@ -54,6 +56,7 @@ public static class Instances
StoneUsedTimes = 0;
RecruitConfirmTime = 0;
HasPrintedScreencapWarning = false;
HasPrintedFpsHighTip = false;
}
}

View File

@@ -0,0 +1,340 @@
// <copyright file="MonetPaletteHelper.cs" company="MaaAssistantArknights">
// Part of the MaaWpfGui project, maintained by the MaaAssistantArknights team (Maa Team)
// Copyright (C) 2021-2025 MaaAssistantArknights Contributors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License v3.0 only as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY
// </copyright>
using System;
using System.Collections.Generic;
using System.Windows.Media;
namespace MaaWpfGui.Helper;
/// <summary>
/// 根据提取到的主色,通过 HSL 线性计算生成 Material You 风格的主题色板。
/// <para>
/// 设计理念:从背景图提取一个主色后,以 5 组「色调(色相+饱和度)」为基准,
/// 在亮度 0~1 之间实时取色。文字与背景之间亮度差 ≥ TextContrastDistance (0.80)
/// 主色与背景之间亮度差 ≥ PrimaryContrastDistance (0.40)。
/// 深色模式与浅色模式只是亮度方向翻转:浅色模式背景亮(L高)、文字暗(L低)
/// 深色模式背景暗(L低)、文字亮(L高)。
/// </para>
/// <para>因为是实时计算的,所以不需要预生成 5×12 的离散调色盘,直接计算即可。</para>
/// </summary>
public static class MonetPaletteHelper
{
/// <summary>
/// 需要生成的主题资源 key 列表。
/// </summary>
public static readonly string[] PaletteKeys =
[
"PrimaryBrush",
"DarkPrimaryBrush",
"LightPrimaryBrush",
"TitleBrush",
"RegionBrush",
"SecondaryRegionBrush",
"RegionBrushOpacity10",
"RegionBrushOpacity25",
"RegionBrushOpacity50",
"RegionBrushOpacity75",
"MouseOverRegionBrush",
"MouseOverRegionBrushOpacity10",
"MouseOverRegionBrushOpacity25",
"MouseOverRegionBrushOpacity50",
"MouseOverRegionBrushOpacity75",
// 边框色:固定明度角色,跟随背景体系
"BorderBrush",
// 亮度依赖的文字色:随明暗模式翻转,需跟随 region 明度适配
"PrimaryTextBrush",
"ThirdlyTextBrush",
"TraceLogBrush",
"MessageLogBrush",
];
// 原 Dark.xaml / Light.xaml 的 Alpha 值,保持不变
private const byte Alpha10 = 0x19; // 10%
private const byte Alpha25 = 0x40; // 25%
private const byte Alpha50 = 0x7F; // 50%
private const byte Alpha75 = 0xBF; // 75%
// ── 5 组色调(饱和度)基准 ──
/// <summary>
/// 主色系固定饱和度,统一降饱和到 Material You 风格。
/// </summary>
private const double PrimarySaturation = 0.36;
/// <summary>
/// 背景体系Region / MouseOver / Border饱和度。
/// </summary>
private const double BackgroundSaturation = 0.16;
/// <summary>
/// 主要文字色饱和度占原始色饱和度的比例。
/// 文字色保持低饱和但不至于完全丢失主色调。
/// </summary>
private const double TextSatRatio = 0.20;
/// <summary>
/// 文字色饱和度上限,避免影响可读性。
/// </summary>
private const double TextSatMax = 0.18;
/// <summary>
/// 文字色饱和度下限,保证至少能感知到色调。
/// </summary>
private const double TextSatMin = 0.04;
// ── 对比距离 ──
/// <summary>
/// 文字与有效背景之间要求的最小亮度差。
/// 原版深色主题Text L=0.90 vs Region L=0.11,差 ≈ 0.80。
/// </summary>
private const double TextContrastDistance = 0.80;
/// <summary>
/// 主色与有效背景之间要求的最小亮度差。
/// 主色是强调色,不需要像文字那么高的对比度。
/// </summary>
private const double PrimaryContrastDistance = 0.40;
// ── 亮度锚点 ──
/// <summary>
/// 浅色模式背景基础亮度。
/// </summary>
private const double LightBgL = 0.95;
/// <summary>
/// 深色模式背景基础亮度。
/// </summary>
private const double DarkBgL = 0.10;
// 背景体系角色亮度(深色模式)
private const double DarkSecondaryRegionL = 0.15;
private const double DarkMouseOverL = 0.20;
private const double DarkBorderL = 0.25;
// 背景体系角色亮度(浅色模式)
private const double LightSecondaryRegionL = 0.90;
private const double LightMouseOverL = 0.80;
private const double LightBorderL = 0.80;
// 主色系辅助角色亮度
private const double DarkPrimaryVariantDelta = 0.15; // DarkPrimary 比 Primary 暗多少
private const double DarkLightPrimaryL = 0.10; // 深色模式 LightPrimary 亮度
private const double LightLightPrimaryL = 0.85; // 浅色模式 LightPrimary 亮度
// 文字色亮度物理边界
private const double TextMaxL = 0.95;
private const double TextMinL = 0.05;
private const double SecondaryTextMaxL = 0.85;
private const double SecondaryTextMinL = 0.15;
// 主色亮度物理边界
private const double PrimaryMaxL = 0.90;
private const double PrimaryMinL = 0.10;
/// <summary>
/// 背景图对文字层的有效穿透率。
/// <para>
/// UI 层次RegionBrush(固态) → Image(α) → RegionBrushOpacity25 → RegionBrushOpacity25 → 文字。
/// 每层 RegionBrushOpacity25 的 Alpha = 0x40/255 ≈ 0.251,透光率 = 0.749。
/// 两层叠加后背景图穿透率 = 0.749² ≈ 0.561。
/// </para>
/// <para>
/// 有效背景亮度 = regionL×(1 - 穿透率×α) + baseL×(穿透率×α)。
/// α=0 时为纯 Region 色,α=1 时为 Region×0.439 + BaseColor×0.561。
/// </para>
/// </summary>
private const double BgImageVisibility = 0.561;
/// <summary>
/// 计算有效背景亮度。
/// 背景图透过两层 25% 蒙版影响文字层,穿透率 = <see cref="BgImageVisibility"/>。
/// <para>
/// 有效背景 = Region×(1 - 穿透率×α) + BaseColor×(穿透率×α)。
/// </para>
/// </summary>
/// <param name="baseL">提取色的 HSL 亮度。</param>
/// <param name="isDark">当前是否为深色模式。</param>
/// <param name="backgroundOpacity">背景图不透明度 (0~100)。</param>
/// <returns>文字层实际感受到的背景亮度。</returns>
private static double ComputeEffectiveBgL(double baseL, bool isDark, int backgroundOpacity)
{
var bgAlpha = Math.Clamp(backgroundOpacity / 100.0, 0.0, 1.0);
var regionBaseL = isDark ? DarkBgL : LightBgL;
var bgInfluence = BgImageVisibility * bgAlpha;
return (regionBaseL * (1 - bgInfluence)) + (baseL * bgInfluence);
}
/// <summary>
/// 根据基础主色生成调色板。
/// </summary>
/// <param name="baseColor">提取或用户选定的主色。</param>
/// <param name="isDark">当前是否为深色模式。</param>
/// <param name="backgroundOpacity">背景图不透明度 (0~100),影响背景有效亮度。</param>
/// <returns>资源 key → 颜色的映射。</returns>
public static Dictionary<string, Color> Generate(Color baseColor, bool isDark, int backgroundOpacity = 50)
{
var (hue, sat, baseL) = RgbToHsl(baseColor);
// 5 组色调:主色饱和度固定为 0.36(统一降饱和到 Material You 风格)
var primarySat = PrimarySaturation;
// 计算有效背景亮度(背景图透过两层 25% 蒙版影响文字层)
var effectiveBgL = ComputeEffectiveBgL(baseL, isDark, backgroundOpacity);
// ── 从背景亮度推导各角色亮度 ──
var textL = isDark
? Math.Min(effectiveBgL + TextContrastDistance, TextMaxL)
: Math.Max(effectiveBgL - TextContrastDistance, TextMinL);
var secondaryTextL = isDark
? Math.Min(effectiveBgL + (TextContrastDistance * 0.7), SecondaryTextMaxL)
: Math.Max(effectiveBgL - (TextContrastDistance * 0.7), SecondaryTextMinL);
var primaryL = isDark
? Math.Min(effectiveBgL + PrimaryContrastDistance, PrimaryMaxL)
: Math.Max(effectiveBgL - PrimaryContrastDistance, PrimaryMinL);
// 背景体系亮度
var regionL = isDark ? DarkBgL : LightBgL;
var secondaryRegionL = isDark ? DarkSecondaryRegionL : LightSecondaryRegionL;
var mouseOverL = isDark ? DarkMouseOverL : LightMouseOverL;
var borderL = isDark ? DarkBorderL : LightBorderL;
// 文字色饱和度:按原始色饱和度等比缩放,保留微弱色调
var textSat = Math.Clamp(sat * TextSatRatio, TextSatMin, TextSatMax);
// ── 生成颜色 ──
var region = HslToRgb(hue, BackgroundSaturation, regionL);
var secondaryRegion = HslToRgb(hue, BackgroundSaturation, secondaryRegionL);
var mouseOver = HslToRgb(hue, BackgroundSaturation, mouseOverL);
var border = HslToRgb(hue, BackgroundSaturation, borderL);
var primary = HslToRgb(hue, primarySat, primaryL);
var darkPrimary = HslToRgb(hue, primarySat, Math.Max(primaryL - DarkPrimaryVariantDelta, PrimaryMinL));
var lightPrimary = HslToRgb(hue, primarySat, isDark ? DarkLightPrimaryL : LightLightPrimaryL);
var primaryText = HslToRgb(hue, textSat, textL);
var traceLog = HslToRgb(hue, Math.Clamp(sat * TextSatRatio * 1.25, TextSatMin * 1.5, TextSatMax * 1.5), secondaryTextL);
var palette = new Dictionary<string, Color>
{
["PrimaryBrush"] = primary,
["DarkPrimaryBrush"] = darkPrimary,
["LightPrimaryBrush"] = lightPrimary,
["TitleBrush"] = primary,
["RegionBrush"] = region,
["MouseOverRegionBrush"] = mouseOver,
["BorderBrush"] = border,
["PrimaryTextBrush"] = primaryText,
["SecondaryRegionBrush"] = secondaryRegion,
["ThirdlyTextBrush"] = Color.FromArgb(0x7F, primaryText.R, primaryText.G, primaryText.B),
["TraceLogBrush"] = traceLog,
["MessageLogBrush"] = primaryText,
};
// Opacity 系列
palette["RegionBrushOpacity10"] = Color.FromArgb(Alpha10, region.R, region.G, region.B);
palette["RegionBrushOpacity25"] = Color.FromArgb(Alpha25, region.R, region.G, region.B);
palette["RegionBrushOpacity50"] = Color.FromArgb(Alpha50, region.R, region.G, region.B);
palette["RegionBrushOpacity75"] = Color.FromArgb(Alpha75, region.R, region.G, region.B);
palette["MouseOverRegionBrushOpacity10"] = Color.FromArgb(Alpha10, mouseOver.R, mouseOver.G, mouseOver.B);
palette["MouseOverRegionBrushOpacity25"] = Color.FromArgb(Alpha25, mouseOver.R, mouseOver.G, mouseOver.B);
palette["MouseOverRegionBrushOpacity50"] = Color.FromArgb(Alpha50, mouseOver.R, mouseOver.G, mouseOver.B);
palette["MouseOverRegionBrushOpacity75"] = Color.FromArgb(Alpha75, mouseOver.R, mouseOver.G, mouseOver.B);
return palette;
}
/// <summary>
/// RGB → HSL 转换。
/// </summary>
private static (double H, double S, double L) RgbToHsl(Color color)
{
var r = color.R / 255.0;
var g = color.G / 255.0;
var b = color.B / 255.0;
var max = Math.Max(r, Math.Max(g, b));
var min = Math.Min(r, Math.Min(g, b));
var delta = max - min;
var l = (max + min) / 2.0;
if (delta == 0)
{
return (0, 0, l);
}
var s = delta / (1 - Math.Abs((2 * l) - 1));
double h;
if (max == r)
{
h = ((g - b) / delta) % 6;
}
else if (max == g)
{
h = ((b - r) / delta) + 2;
}
else
{
h = ((r - g) / delta) + 4;
}
h *= 60;
if (h < 0)
{
h += 360;
}
return (h, s, l);
}
/// <summary>
/// HSL → RGB 转换。
/// </summary>
private static Color HslToRgb(double h, double s, double l)
{
if (s == 0)
{
var gray = (byte)(l * 255);
return Color.FromRgb(gray, gray, gray);
}
var c = (1 - Math.Abs((2 * l) - 1)) * s;
var hp = h / 60.0;
var x = c * (1 - Math.Abs((hp % 2) - 1));
double r1, g1, b1;
switch ((int)hp)
{
case 0: r1 = c; g1 = x; b1 = 0; break;
case 1: r1 = x; g1 = c; b1 = 0; break;
case 2: r1 = 0; g1 = c; b1 = x; break;
case 3: r1 = 0; g1 = x; b1 = c; break;
case 4: r1 = x; g1 = 0; b1 = c; break;
default: r1 = c; g1 = 0; b1 = x; break;
}
var m = l - (c / 2.0);
return Color.FromRgb(
(byte)((r1 + m) * 255),
(byte)((g1 + m) * 255),
(byte)((b1 + m) * 255));
}
}

View File

@@ -11,6 +11,9 @@
// but WITHOUT ANY WARRANTY
// </copyright>
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using HandyControl.Themes;
@@ -36,6 +39,9 @@ public static class ThemeHelper
}
Application.Current.Resources["TitleBrush"] = ThemeManager.Current.AccentColor;
// 系统主题切换后,莫奈调色板需要按新的明暗模式重新生成
ReapplyMonet();
}
public static void SwitchToLightMode()
@@ -44,6 +50,7 @@ public static class ThemeHelper
ThemeManager.Current.UsingWindowsAppTheme = false;
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Light;
Application.Current.Resources["TitleBrush"] = ThemeManager.Current.AccentColor;
ReapplyMonet();
}
public static void SwitchToDarkMode()
@@ -52,6 +59,7 @@ public static class ThemeHelper
ThemeManager.Current.UsingWindowsAppTheme = false;
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Dark;
Application.Current.Resources["TitleBrush"] = ThemeManager.Current.AccentColor;
ReapplyMonet();
}
public static void SwitchToSyncWithOsMode()
@@ -67,10 +75,188 @@ public static class ThemeHelper
}
Application.Current.Resources["TitleBrush"] = ThemeManager.Current.AccentColor;
ReapplyMonet();
}
#endregion Swith Theme
#region Monet
/// <summary>
/// 缓存的莫奈调色板的生成参数,用于明暗切换后重新生成。
/// 为 null 表示莫奈取色未启用。
/// </summary>
private static Color? _monetBaseColor;
/// <summary>
/// 缓存的背景图不透明度,用于 ReapplyMonet 时重新生成文字色。
/// </summary>
private static int _monetBackgroundOpacity = 50;
/// <summary>
/// 保存被莫奈覆盖前的原始 brush用于关闭莫奈时恢复。
/// </summary>
private static readonly Dictionary<string, SolidColorBrush> _monetOriginalBrushes = [];
/// <summary>
/// 莫奈取色是否已启用(即是否已调用过 ApplyMonetPalette 且未 Revert
/// </summary>
public static bool IsMonetActive => _monetBaseColor != null;
/// <summary>
/// 获取当前是否处于深色模式。
/// </summary>
/// <returns>深色模式返回 true。</returns>
public static bool IsDarkMode()
{
return ThemeManager.Current.ApplicationTheme == ApplicationTheme.Dark;
}
/// <summary>
/// 应用莫奈调色板,覆盖主题资源中的主色系和背景色系。
/// 首次调用时会保存原始值以供回退。
/// </summary>
/// <param name="baseColor">提取或用户选定的主色。</param>
/// <param name="backgroundOpacity">背景图不透明度 (0~100),影响文字色的明度选取。</param>
public static void ApplyMonetPalette(Color baseColor, int backgroundOpacity = 50)
{
var isDark = IsDarkMode();
_monetBaseColor = baseColor;
_monetBackgroundOpacity = backgroundOpacity;
// 调色板计算可在任意线程完成,无需占用 UI 线程
var palette = MonetPaletteHelper.Generate(baseColor, isDark, backgroundOpacity);
// 只有实际写入 WPF 资源才需要在 UI 线程执行
Application.Current?.Dispatcher.Invoke(() =>
{
ApplyPaletteToResources(palette, baseColor);
});
}
/// <summary>
/// 异步应用莫奈调色板:计算在后台线程,资源写入在 UI 线程。
/// 适用于滑块拖动等高频调用场景,避免阻塞 UI。
/// </summary>
/// <param name="baseColor">提取或用户选定的主色。</param>
/// <param name="backgroundOpacity">背景图不透明度 (0~100),影响文字色的明度选取。</param>
/// <param name="cancellationToken">取消令牌,用于防抖时取消过期的调色板计算。</param>
/// <returns>表示异步操作的任务。</returns>
public static async Task ApplyMonetPaletteAsync(Color baseColor, int backgroundOpacity = 50, CancellationToken cancellationToken = default)
{
var isDark = IsDarkMode();
_monetBaseColor = baseColor;
_monetBackgroundOpacity = backgroundOpacity;
// 在后台线程计算调色板
var palette = await Task.Run(() => MonetPaletteHelper.Generate(baseColor, isDark, backgroundOpacity), cancellationToken)
.ConfigureAwait(true);
// 在 UI 线程写入资源
Application.Current?.Dispatcher.Invoke(() =>
{
ApplyPaletteToResources(palette, baseColor);
});
}
/// <summary>
/// 将已计算好的调色板写入 WPF 资源(必须在 UI 线程调用)。
/// </summary>
private static void ApplyPaletteToResources(Dictionary<string, Color> palette, Color baseColor)
{
// 首次应用时保存原始值
SaveOriginalsIfNeeded(MonetPaletteHelper.PaletteKeys);
// 先设置 AccentColorHandyControl 的 ThemeManager 会根据它重新生成
// PrimaryBrush / DarkPrimaryBrush / TitleBrush 等内部资源,
// 因此必须在 AccentColor 之后再覆盖为莫奈调色板的值,否则会被覆盖回去
ThemeManager.Current.AccentColor = new SolidColorBrush(baseColor);
foreach (var (key, color) in palette)
{
Application.Current.Resources[key] = new SolidColorBrush(color);
}
}
/// <summary>
/// 回退莫奈调色板,恢复所有被覆盖的 brush 到原始值。
/// </summary>
public static void RevertMonetPalette()
{
if (_monetBaseColor == null)
{
return;
}
_monetBaseColor = null;
// 只有资源写入需要在 UI 线程
Application.Current?.Dispatcher.Invoke(() =>
{
// 先恢复 AccentColor 到系统值(同样会重写 HandyControl 内部 brush
if (!WineRuntimeInformation.IsRunningUnderWine)
{
ThemeManager.Current.AccentColor = ThemeManager.Current.GetAccentColorFromSystem();
}
// 在 AccentColor 之后再恢复原始 brush避免被 HandyControl 覆盖
foreach (var (key, brush) in _monetOriginalBrushes)
{
Application.Current.Resources[key] = brush;
}
_monetOriginalBrushes.Clear();
Application.Current.Resources["TitleBrush"] = ThemeManager.Current.AccentColor;
});
}
/// <summary>
/// 当莫奈取色启用时,使用缓存的 baseColor 重新生成调色板。
/// 用于明暗模式切换后同步更新。
/// </summary>
public static void ReapplyMonet()
{
if (_monetBaseColor is Color color)
{
// 明暗模式切换后HandyControl 会通过 ThemeResources 切换底层主题字典,
// 但莫奈之前直接写入 Application.Current.Resources 的值会遮蔽新主题的值。
// 需要先移除这些直接覆盖项,让底层新主题值透出,再重新保存和生成。
Application.Current?.Dispatcher.Invoke(() =>
{
foreach (var key in MonetPaletteHelper.PaletteKeys)
{
Application.Current.Resources.Remove(key);
}
});
_monetOriginalBrushes.Clear();
ApplyMonetPalette(color, _monetBackgroundOpacity);
}
}
/// <summary>
/// 首次覆盖前保存原始 brush 值。
/// </summary>
private static void SaveOriginalsIfNeeded(IEnumerable<string> keys)
{
if (_monetOriginalBrushes.Count > 0)
{
return;
}
foreach (var key in keys)
{
if (Application.Current?.Resources[key] is SolidColorBrush brush)
{
// 冻结副本,避免引用被修改
_monetOriginalBrushes[key] = brush.Clone();
}
}
}
#endregion Monet
#region Check UiLogColor
// In official version, using ResourceHelper.GetSkin

View File

@@ -788,6 +788,19 @@ public class AsstProxy
_connectedAddress = details["details"]!["address"]!.ToString();
SettingsViewModel.ConnectSettings.ConnectAddress = _connectedAddress;
_lastConnectionError = string.Empty;
// 检测 MuMu 后台保活是否开启(异步执行,避免阻塞 UI 线程)
if (SettingsViewModel.ConnectSettings.ConnectConfig == "MuMuEmulator12")
{
_ = Task.Run(() =>
{
if (EmulatorHelper.CheckMuMuKeepAlive())
{
Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetString("MuMuEmulator12KeepAliveOn"), UiLogColor.Warning);
}
});
}
break;
case "UnsupportedResolution":
@@ -1003,6 +1016,37 @@ public class AsstProxy
}
}
break;
case "EmulatorFPS":
var fpsValue = details["details"]?["fps"]?.ToString() ?? "???";
if (!int.TryParse(fpsValue, out var fpsInt))
{
break;
}
if (fpsInt <= 0)
{
break;
}
if (fpsInt < 30)
{
Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetStringFormat("EmulatorFpsErrorTip", fpsInt), UiLogColor.Error);
Instances.CopilotViewModel.AddLog(LocalizationHelper.GetStringFormat("EmulatorFpsErrorTip", fpsInt), UiLogColor.Error, showTime: false);
}
else if (fpsInt < 60)
{
Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetStringFormat("EmulatorFpsWarningTip", fpsInt), UiLogColor.Warning);
Instances.CopilotViewModel.AddLog(LocalizationHelper.GetStringFormat("EmulatorFpsWarningTip", fpsInt), UiLogColor.Warning, showTime: false);
}
else if (fpsInt > 60 && !HasPrintedFpsHighTip)
{
Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetStringFormat("EmulatorFpsHighTip", fpsInt), UiLogColor.Warning);
Instances.CopilotViewModel.AddLog(LocalizationHelper.GetStringFormat("EmulatorFpsHighTip", fpsInt), UiLogColor.Warning, showTime: false);
HasPrintedFpsHighTip = true;
}
break;
}
}

View File

@@ -149,7 +149,7 @@ public class PostActionSetting : PropertyChangedBase
private bool _exitEmulator;
/// <summary>
/// Gets a value indicating whether PC 端(窗口绑定)无模拟器进程,完成后不可选择退出模拟器
/// Gets a value indicating whether PC 端(窗口绑定)无模拟器进程,完成后不可选择退出模拟器
/// </summary>
public bool ExitEmulatorOptionEnabled => !ConnectSettingsUserControlModel.Instance.UseAttachWindow;

View File

@@ -23,6 +23,12 @@
<system:String x:Key="BackgroundImageStretchModeFill">Fill</system:String>
<system:String x:Key="BackgroundImageStretchModeUniform">Uniform (Fit)</system:String>
<system:String x:Key="BackgroundImageStretchModeUniformToFill">Uniform to Fill (Cover)</system:String>
<system:String x:Key="BackgroundMonet">Monet Color</system:String>
<system:String x:Key="BackgroundMonetMode">Color Mode</system:String>
<system:String x:Key="BackgroundMonetAuto">Auto Extract</system:String>
<system:String x:Key="BackgroundMonetCustom">Custom Color</system:String>
<system:String x:Key="BackgroundMonetSelectColor">Select Color</system:String>
<system:String x:Key="BackgroundMonetAutoTip">Extract dominant color from background image to generate theme palette</system:String>
<system:String x:Key="UiTheme">UI Theme</system:String>
<system:String x:Key="HotKeySettings">HotKeys</system:String>
<system:String x:Key="UpdateSettings">Update</system:String>
@@ -348,8 +354,20 @@ To customize rotation schedules, please use 「{key=InfrastModeCustom}」.</syst
<system:String x:Key="UpdateAutoCheck">Scheduled Update Check</system:String>
<system:String x:Key="UpdateAutoCheckTip">In-game 00:00 / 18:00 (Server local time 04:00 / 22:00)</system:String>
<system:String x:Key="UpdateAutoDownload">Auto Download Update</system:String>
<system:String x:Key="UpdateAutoDownloadTip" xml:space="preserve">When disabled, detected updates (including manually triggered 「{key=UpdateCheckNow}」) will no longer download automatically. Instead, a system notification with a download link will be shown, allowing you to download the package and drag it into MAA manually.
If system notifications are turned off, an in-app notification will be used instead, though it does not provide an interactive download button.</system:String>
<system:String x:Key="AutoInstallUpdatePackage">Auto Install Update</system:String>
<system:String x:Key="ShowUpdaterConsole">Show MAA.Updater console output during update</system:String>
<system:String x:Key="ShowUpdaterConsole">Show updater console output during update</system:String>
<system:String x:Key="ShowUpdaterProgress">Show updater progress window</system:String>
<system:String x:Key="ShowUpdaterProgressTip" xml:space="preserve">Shows a standalone progress window from the updater during the update, displaying the current status and file processing progress.
When disabled, you won't be able to see the update progress visually. Do not launch MAA again while an update is in progress, as this may interrupt the update or corrupt files.</system:String>
<system:String x:Key="ShowUpdaterProgressWarning" xml:space="preserve">After disabling the update progress window, no progress will be shown during updates.
Please note:
1. Do not launch MAA again while an update is in progress, otherwise file locks may cause the update to fail or files to become corrupted.
2. If both the progress window and console output are disabled, the update will run with no UI feedback at all, making it hard to tell if it is stuck or has failed.
Are you sure you want to disable the update progress window?</system:String>
<system:String x:Key="UpdateCheckStable">Stable Release</system:String>
<system:String x:Key="UpdateCheckBeta">Beta Release</system:String>
<system:String x:Key="UpdateCheckNightly">Nightly Release</system:String>
@@ -702,6 +720,7 @@ Note:
<system:String x:Key="MuMu12Index">Instance Number</system:String>
<system:String x:Key="MuMu12Display">Display Number</system:String>
<system:String x:Key="MuMuExtrasNotEnabledMessage">Mumu screenshot enhancement not enabled, please check related settings</system:String>
<system:String x:Key="MuMuEmulator12KeepAliveOn">MuMu emulator background keep-alive is enabled, which may cause screenshot failures and abnormal operations. Please disable "background keep-alive" (or "app keep-alive", etc.) in MuMu settings</system:String>
<system:String x:Key="LdExtrasEnabled">Enable LD's screenshot enhancement mode</system:String>
<system:String x:Key="LdPlayerEmulatorPathNotFound">LDPlayer emulator path not found.</system:String>
<system:String x:Key="LdPlayerOpenglMissing">ldopengl64.dll was not found in the selected LDPlayer path. Please verify the installation directory.</system:String>
@@ -1202,6 +1221,9 @@ Right-click to clear inactive jobs</system:String>
<system:String x:Key="FastestWayToScreencap">Screenshot test tasks: {0}ms ({1})</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">Screencap takes a long time (avg: {0}ms) which may cause some abnormal behaviors using automatic combat functions (e.g. Auto I. S.). If using MuMu or LDPlayer, please try enabling screenshot enhancement</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">Screencap takes too long (avg: {0}ms), so automatic combat functions (e.g. Auto I. S.) may not run properly. It is recommended to try restarting or changing the emulator! If using MuMu or LDPlayer, please try enabling screenshot enhancement</system:String>
<system:String x:Key="EmulatorFpsWarningTip">Emulator refresh rate is set to {0} FPS, below the game's native frame rate (60 FPS). Background frame rate reduction may be enabled or the rate is set too low. It is recommended to set the emulator frame rate to 60 FPS</system:String>
<system:String x:Key="EmulatorFpsErrorTip">Emulator refresh rate is set too low ({0} FPS), which may cause tasks to malfunction. Please turn off background frame rate reduction and set the frame rate to 60 FPS</system:String>
<system:String x:Key="EmulatorFpsHighTip">Emulator refresh rate is set to {0} FPS, above the game's native frame rate cap (60 FPS). This may be the emulator's frame interpolation feature, which can cause visual artifacts or unstable recognition. It is recommended to disable frame interpolation and set the frame rate to 60 FPS</system:String>
<system:String x:Key="IdentifyTheMistakes">Recognition error</system:String>
<system:String x:Key="TaskError" xml:space="preserve">Task error:&#160;</system:String>
<system:String x:Key="CombatError">Combat error</system:String>

View File

@@ -23,6 +23,12 @@
<system:String x:Key="BackgroundImageStretchModeFill">引き伸ばし(フィル)</system:String>
<system:String x:Key="BackgroundImageStretchModeUniform">アスペクト比保持(フィット)</system:String>
<system:String x:Key="BackgroundImageStretchModeUniformToFill">アスペクト比保持(トリミング)</system:String>
<system:String x:Key="BackgroundMonet">モネ採色</system:String>
<system:String x:Key="BackgroundMonetMode">採色モード</system:String>
<system:String x:Key="BackgroundMonetAuto">自動採色</system:String>
<system:String x:Key="BackgroundMonetCustom">カスタムカラー</system:String>
<system:String x:Key="BackgroundMonetSelectColor">色を選択</system:String>
<system:String x:Key="BackgroundMonetAutoTip">背景画像からメインカラーを自動抽出してテーマ配色を生成します</system:String>
<system:String x:Key="UiTheme">UI主題</system:String>
<system:String x:Key="HotKeySettings">ホットキー設定</system:String>
<system:String x:Key="UpdateSettings">アップデート設定</system:String>
@@ -36,7 +42,7 @@
<system:String x:Key="ResourceVersion">リソースバーション</system:String>
<system:String x:Key="ResourceDateTime">リソース日付</system:String>
<system:String x:Key="Off">シャットダウン</system:String>
<system:String x:Key="ExternalNotificationTips">注:外部通知機能は現在、すべてのタスクが完了しましたという通知のみを送信します。</system:String>
<system:String x:Key="ExternalNotificationTips">注:外部通知機能は現在、すべてのタスクが完了しましたという通知のみを送信します。</system:String>
<system:String x:Key="ExternalNotificationSettings">外部通知</system:String>
<system:String x:Key="ExternalNotificationEnabled">通知構成の有効化</system:String>
<system:String x:Key="ExternalNotificationEnableDetails">詳細情報を出力</system:String>
@@ -86,8 +92,8 @@
<system:String x:Key="UseGpuForInferenceTip">GPU 推論を利用することで、ごくわずかな GPU 使用率で CPU の負荷を大幅に軽減できます</system:String>
<system:String x:Key="GpuOptionDisable">使用しない</system:String>
<system:String x:Key="GpuOptionSystemDefault">システムデフォルトGPU</system:String>
<system:String x:Key="GpuDeprecatedMessage">現在選択されている推論加速 GPU{0})には互換性の問題があり、認識ミスやずれ、その他の予期しない不具合が発生する可能性があります。\n\n{key=Settings} - {key=PerformanceSettings}で別の GPU に変更することをおすすめします。</system:String>
<system:String x:Key="GpuDriverOutdatedMessage">現在選択されている推論加速 GPU{0})のドライバーバージョン({1}、リリース日:{2}は2年以上経過しており、互換性の問題が発生する可能性があります。\n\nグラフィックスドライバーを更新するか、{key=Settings} - {key=PerformanceSettings}で別の GPU に変更することをおすすめします。</system:String>
<system:String x:Key="GpuDeprecatedMessage">現在選択されている推論加速 GPU{0})には互換性の問題があり、認識ミスやずれ、その他の予期しない不具合が発生する可能性があります。\n\n{key=Settings} - {key=PerformanceSettings}で別の GPU に変更することをおすすめします。</system:String>
<system:String x:Key="GpuDriverOutdatedMessage">現在選択されている推論加速 GPU{0})のドライバーバージョン({1}、リリース日:{2}は2年以上経過しており、互換性の問題が発生する可能性があります。\n\nグラフィックスドライバーを更新するか、{key=Settings} - {key=PerformanceSettings}で別の GPU に変更することをおすすめします。</system:String>
<system:String x:Key="GpuAllowDeprecated">非推奨 GPU の使用を許可する</system:String>
<system:String x:Key="Copy">コピー</system:String>
<!-- Toast 不可用 -->
@@ -117,15 +123,15 @@
↓ 歯車を右クリックで操作一覧</system:String>
<system:String x:Key="UserGuide">使用ガイド</system:String>
<system:String x:Key="GuideDocumentationTitle">📖 公式サイトとドキュメント</system:String>
<system:String x:Key="GuideDocumentationPath">MAA の公式サイトと完全なドキュメントは{key=Settings} - {key=AboutUs} - {key=Website}でご覧いただけます。</system:String>
<system:String x:Key="GuideDocumentationPath">MAA の公式サイトと完全なドキュメントは{key=Settings} - {key=AboutUs} - {key=Website}でご覧いただけます。</system:String>
<system:String x:Key="GuideIssueReportSubtitle">🔧 問題が発生した場合</system:String>
<system:String x:Key="GuideViewLog">{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}にアクセスしてログを確認し、エラーの具体的な原因を把握できます。</system:String>
<system:String x:Key="GuideGenerateReport">{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}を使用してエラーレポートを生成し、青い{key=Issue}リンクをクリックしてフィードバックを送信してください。</system:String>
<system:String x:Key="GuideViewLog">{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}にアクセスしてログを確認し、エラーの具体的な原因を把握できます。</system:String>
<system:String x:Key="GuideGenerateReport">{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}を使用してエラーレポートを生成し、青い{key=Issue}リンクをクリックしてフィードバックを送信してください。</system:String>
<system:String x:Key="GuideGitHubIssueTitle">⚠️ フィードバックガイドライン</system:String>
<system:String x:Key="GuideGitHubIssueDescription">MAA Team は、Issue テンプレートの仕様に従って GitHub プラットフォームを通じてユーザーから提出されたフィードバックのみを受け付け、すべてのフィードバックの処理に関する決定権を留保します。</system:String>
<system:String x:Key="GuideOpenSourceTitle">💡 オープンソースへの参加</system:String>
<system:String x:Key="GuideOpenSourceDescription">オープンソースプロジェクトとして、ユーザーは AGPL-3.0 ライセンスの下で GitHub プラットフォーム上で MAA の開発に参加できます。MAA Team は、問題報告の代わりに価値あるコード貢献をすることを推奨しています。</system:String>
<system:String x:Key="GuideUserAgreement">MAA を使用することにより、利用規約に同意したものとみなされます。完全な規約は、公式サイトの下部のリンクからご覧いただけます。</system:String>
<system:String x:Key="GuideUserAgreement">MAA を使用することにより、利用規約に同意したものとみなされます。完全な規約は、公式サイトの下部のリンクからご覧いただけます。</system:String>
<system:String x:Key="RestartGuide">設定ガイドを再表示</system:String>
<system:String x:Key="RestartGuidePrompt">設定ガイドはメイン画面に表示されます。今すぐアプリケーションを再起動しますか?</system:String>
<!-- !設定ガイド -->
@@ -163,9 +169,9 @@
<system:String x:Key="InfrastModeNormal">通常モード</system:String>
<system:String x:Key="InfrastModeRotation">一括シフト休暇</system:String>
<system:String x:Key="InfrastModeRotationTip">一括シフト休暇を使用する前に、ゲーム内で{key=Operator}のシフト編成を手動で設定してください</system:String>
<system:String x:Key="InfrastModeRotationToolTip" xml:space="preserve">{key=InfrastModeRotation}の交代ロジックは、ゲーム内の基地右下にある{key=InfrastModeRotation}と全く同じです。
<system:String x:Key="InfrastModeRotationToolTip" xml:space="preserve">{key=InfrastModeRotation}の交代ロジックは、ゲーム内の基地右下にある{key=InfrastModeRotation}と全く同じです。
現在の班にいるオペレーターの中で、いずれかの士気が0になると、班全体が次の班に交代します。
交代スケジュールをカスタマイズする場合は{key=InfrastModeCustom}をご利用ください。</system:String>
交代スケジュールをカスタマイズする場合は{key=InfrastModeCustom}をご利用ください。</system:String>
<system:String x:Key="InfrastModeCustom">カスタムされた基地構成</system:String>
<system:String x:Key="DefaultInfrast">標準設定</system:String>
<system:String x:Key="UserDefined">ユーザー定義</system:String>
@@ -221,17 +227,17 @@
<system:String x:Key="StartingCoreChar">最初の{key=Operator}</system:String>
<system:String x:Key="StartingCoreCharTip">記入がない場合はデフォルトの方針を使用します。</system:String>
<system:String x:Key="RoguelikeStartingCoreCharNotFound">この{key=Operator}がbattle_dataにありません。</system:String>
<system:String x:Key="RoguelikeStartWithEliteTwo">{key=StartingCoreChar}直接昇進</system:String>
<system:String x:Key="RoguelikeOnlyStartWithEliteTwo">{key=StartingCoreChar}の昇進招集までリセマラし、戦闘を行わない</system:String>
<system:String x:Key="RoguelikeStartWithEliteTwo">{key=StartingCoreChar}直接昇進</system:String>
<system:String x:Key="RoguelikeOnlyStartWithEliteTwo">{key=StartingCoreChar}の昇進招集までリセマラし、戦闘を行わない</system:String>
<system:String x:Key="Roguelike3FirstFloorFoldartal">第一層遠見で指定された啓示板を取得し、戦闘を行わない</system:String>
<system:String x:Key="Roguelike3NewSquad2StartingFoldartal">生活重視分隊で開始、指定された啓示板を取得する</system:String>
<system:String x:Key="Roguelike3NewSquad2StartingFoldartalTip">最大3つ書き込み、半角セミコロン;で区切る</system:String>
<system:String x:Key="RoguelikeCollapseList">崩壊パラダイムリスト</system:String>
<system:String x:Key="RoguelikeCollapseListTip">英語のセミコロン「;」で区切る、空白のままにするとデフォルトリストが使用されます。</system:String>
<system:String x:Key="RoguelikeUseSupportUnit">{key=StartingCoreChar}をサポートから選択</system:String>
<system:String x:Key="RoguelikeRequireStartingCoreChar">まず{key=StartingCoreChar}を入力してください</system:String>
<system:String x:Key="RoguelikeCollapseListTip">英語のセミコロン 「;」 で区切る、空白のままにするとデフォルトリストが使用されます。</system:String>
<system:String x:Key="RoguelikeUseSupportUnit">{key=StartingCoreChar}をサポートから選択</system:String>
<system:String x:Key="RoguelikeRequireStartingCoreChar">まず{key=StartingCoreChar}を入力してください</system:String>
<system:String x:Key="RoguelikeUseNonFriendSupport">戦友以外のサポートの使用を許可</system:String>
<system:String x:Key="RoguelikeDelayAbortUntilCombatComplete">自動ローグ 戦闘終了まえに{key=Stop}を遅らせる</system:String>
<system:String x:Key="RoguelikeDelayAbortUntilCombatComplete">自動ローグ 戦闘終了まえに{key=Stop}を遅らせる</system:String>
<system:String x:Key="RoguelikeStopAtFinalBoss">第5階層のボスの手前で一時停止する</system:String>
<system:String x:Key="RoguelikeStopAtMaxLevel">最大レベル達成時に停止</system:String>
<system:String x:Key="RoguelikeStartWithSeed">シードから始める</system:String>
@@ -348,8 +354,20 @@
<system:String x:Key="UpdateAutoCheck">定期的な更新チェック</system:String>
<system:String x:Key="UpdateAutoCheckTip">ゲーム内 00:00 / 18:00サーバー現地時間 04:00 / 22:00</system:String>
<system:String x:Key="UpdateAutoDownload">自動アップデート</system:String>
<system:String x:Key="UpdateAutoDownloadTip" xml:space="preserve">オフの場合、更新の検出時(手動で 「{key=UpdateCheckNow}」 を実行した場合を含むに自動ダウンロードは行われず、ダウンロードリンク付きのシステム通知のみが表示されます。リンク先から更新パッケージをダウンロードし、MAA にドラッグして手動更新できます。
システム通知が無効な場合はアプリ内通知に切り替わりますが、アプリ内通知には操作可能なダウンロードボタンは提供されません。</system:String>
<system:String x:Key="AutoInstallUpdatePackage">自動インストール更新</system:String>
<system:String x:Key="ShowUpdaterConsole">更新中に MAA.Updater のコンソール出力を表示</system:String>
<system:String x:Key="ShowUpdaterConsole">更新中にアップデーターのコンソール出力を表示</system:String>
<system:String x:Key="ShowUpdaterProgress">アップデーターの進行状況ウィンドウを表示</system:String>
<system:String x:Key="ShowUpdaterProgressTip" xml:space="preserve">更新時にアップデーターが独立した進行状況ウィンドウを表示し、現在のステータスとファイル処理の進捗を示します。
オフにすると更新の進行状況が視覚的に分からなくなります。更新中は MAA を再度起動しないでください。更新が中断されたり、ファイルが破損する可能性があります。</system:String>
<system:String x:Key="ShowUpdaterProgressWarning" xml:space="preserve">更新進行状況ウィンドウをオフにすると、更新中に進行状況が表示されなくなります。
ご注意ください:
1. 更新中は MAA を再度起動しないでください。ファイルの占有により更新が失敗したり、ファイルが破損する可能性があります。
2. 進行状況ウィンドウとコンソール出力の両方をオフにすると、更新中に UI のフィードバックが一切なくなり、停止や失敗の判断が困難になります。
更新進行状況ウィンドウをオフにしてもよろしいですか?</system:String>
<system:String x:Key="UpdateCheckStable">安定版</system:String>
<system:String x:Key="UpdateCheckBeta">ベータ版</system:String>
<system:String x:Key="UpdateCheckNightly">内部テスト版</system:String>
@@ -362,7 +380,7 @@
3. 内部テスト版の問題をユーザーグループやコメントセクションなどの他の場所で議論しないでください。これにより公共のリソースが占有され、迅速なフィードバックと解決が妨げられます。
4. 内部テスト版の更新方法を非開発ユーザーに共有しないでください。不要な混乱とリスクを避けるためです。
{key=Settings} - {key=IssueReport}のリンクをクリックして、このポップアップをキャンセルできます。ご理解とご協力をお願いいたします!</system:String>
{key=Settings} - {key=IssueReport}のリンクをクリックして、このポップアップをキャンセルできます。ご理解とご協力をお願いいたします!</system:String>
<system:String x:Key="UpdateCheck">更新チャネル</system:String>
<system:String x:Key="UpdateCheckTip" xml:space="preserve">• {key=UpdateCheckBeta}: いくつかの小さなバグが含まれる可能性がありますが、新しい機能やテーマはより早くサポートされます。
• {key=UpdateCheckStable}: バグは少なくなりますが、新機能や新しいテーマのサポートは遅くなります。新機能のサポートには数週間かかる場合があります。</system:String>
@@ -376,7 +394,7 @@
<system:String x:Key="UpdateSourceTip" xml:space="preserve">
🌏 {key=GlobalSource}を使用:
• {key=UpdateCheckNow}MAA Team による更新確認で、GitHub から更新パッケージを取得します。中国国内向けに直通ミラーも提供されています(ピーク時は帯域制限の可能性あり)
• {key=ResourceUpdate}{key=MirrorChyan} による無料の更新確認が可能。設定画面で{key=ResourceUpdate}をクリックして GitHub から手動ダウンロード可能
• {key=ResourceUpdate}{key=MirrorChyan} による無料の更新確認が可能。設定画面で{key=ResourceUpdate}をクリックして GitHub から手動ダウンロード可能
🔑 {key=MirrorChyan}を使用:
• CDK を入力すると、ソフトウェアとリソースの自動更新が有効になります
@@ -389,14 +407,14 @@
📄 更新内容:
• {key=UpdateCheckNow}UI や機能のアップデートを含みます。すべての画面変更や新機能は{key=UpdateCheckNow}経由で提供されます
• {key=ResourceUpdate}:自動戦闘用の新ステージ、ドロップ認識用アイコン、公募タグなどの素材データを含みます
• ナビホットパッチ:自動でトリガーされ、ホーム画面のヒントやイベントステージ入口を更新します。成功すると右上に{key=ApiUpdateSuccess}と表示されます
• ナビホットパッチ:自動でトリガーされ、ホーム画面のヒントやイベントステージ入口を更新します。成功すると右上に{key=ApiUpdateSuccess}と表示されます
</system:String>
<system:String x:Key="GlobalSource">グローバルソース</system:String>
<system:String x:Key="ForceGithubGlobalSource">GitHub を強制使用</system:String>
<system:String x:Key="ForceGithubGlobalSourceTip">更新を検出後、Githubから強制的に更新パッケージをダウンロード</system:String>
<system:String x:Key="MirrorChyan">MirrorChyan</system:String>
<system:String x:Key="MirrorChyanSelectedButNoCdk">{key=Settings} - {key=UpdateSettings}に移動して MirrorChyan CDK を設定するか、グローバル ソースに切り替えてください。</system:String>
<system:String x:Key="MirrorChyanResourceUpdateTip">リソース更新 {0} が検出されました。{key=Settings} - {key=UpdateSettings} - {key=ResourceUpdate}に移動して手動で更新するか、MirrorChayn CDK を入力して自動的に更新してください。</system:String>
<system:String x:Key="MirrorChyanSelectedButNoCdk">{key=Settings} - {key=UpdateSettings}に移動して MirrorChyan CDK を設定するか、グローバル ソースに切り替えてください。</system:String>
<system:String x:Key="MirrorChyanResourceUpdateTip">リソース更新 {0} が検出されました。{key=Settings} - {key=UpdateSettings} - {key=ResourceUpdate}に移動して手動で更新するか、MirrorChayn CDK を入力して自動的に更新してください。</system:String>
<system:String x:Key="MirrorChyanResourceUpdateShortTip">リソース更新 {0} が検出されました</system:String>
<system:String x:Key="MirrorChyanCdkExpired">CDK の有効期限が切れました。新しい CDK を使用して認証してください。</system:String>
<system:String x:Key="MirrorChyanCdkInvalid">CDK が無効です。入力が正しいか確認してください。</system:String>
@@ -406,8 +424,8 @@
<system:String x:Key="MirrorChyanCdkRemainingDays">CDK の有効期限は残り {0} 日です。</system:String>
<system:String x:Key="MirrorChyanCdkFetchFailed">CDK 情報の取得に失敗しました。前回正常に取得した結果を表示しています。</system:String>
<system:String x:Key="NewVersionFoundTitle">新しいバージョンが見つかりました</system:String>
<system:String x:Key="NewVersionFoundDescDownloadingWithGlobalSource">{key=GlobalSource}からダウンロード中...</system:String>
<system:String x:Key="NewVersionFoundDescDownloadingWithMirrorChyan">{key=MirrorChyan}からダウンロード中...</system:String>
<system:String x:Key="NewVersionFoundDescDownloadingWithGlobalSource">{key=GlobalSource}からダウンロード中...</system:String>
<system:String x:Key="NewVersionFoundDescDownloadingWithMirrorChyan">{key=MirrorChyan}からダウンロード中...</system:String>
<system:String x:Key="NewVersionFoundDescId" xml:space="preserve">バージョン: </system:String>
<system:String x:Key="NewVersionFoundDescInfo" xml:space="preserve">内容: </system:String>
<system:String x:Key="NewVersionFoundButtonGoWebpage">Webサイトで確認</system:String>
@@ -474,7 +492,7 @@ MAA は非インストール型のアプリケーションであり、レジス
レジストリの残留が気になる場合は、削除前にこのオプションを無効にしてください。
</system:String>
<system:String x:Key="LaunchOnSystemStartupAdminPrompt">
管理者権限での起動は、起動時の自動実行をサポートしていません。MAAを長時間管理者権限で実行することはお勧めしません。\n必要な場合は、コントロールパネル &gt; Windowsツール &gt; タスクスケジューラに移動してカスタムタスクを作成してください。トリガーを設定する際に、最も高い特権で実行を必ず選択してください。
管理者権限での起動は、起動時の自動実行をサポートしていません。MAAを長時間管理者権限で実行することはお勧めしません。\n必要な場合は、コントロールパネル &gt; Windowsツール &gt; タスクスケジューラに移動してカスタムタスクを作成してください。トリガーを設定する際に、最も高い特権で実行を必ず選択してください。
</system:String>
<system:String x:Key="RunTaskAfterLaunch">アプリの起動時に自動的に実行</system:String>
<system:String x:Key="MinimizeAfterLaunch">アプリの起動時に自動的に最小化</system:String>
@@ -488,12 +506,12 @@ MAA は非インストール型のアプリケーションであり、レジス
<system:String x:Key="WaitForEmulator">エミュレータを待つ時間(秒)</system:String>
<system:String x:Key="WaitForEmulatorFinish">待ち時間は終わりました</system:String>
<system:String x:Key="EmulatorPath">エミュレータパス</system:String>
<system:String x:Key="SelectShortcutTip" xml:space="preserve">エミュレーター本体を選択({key=AdditionCommand}起動パラメータでインスタンス指定可能)、または直接エミュレーター/ゲームのショートカットを選択できます。&#10;{key=WakeUp}タスクがエミュレーター起動遅延で失敗する場合、ゲームショートカットを使用し{key=WaitForEmulator}を延長することを推奨します。</system:String>
<system:String x:Key="SelectShortcutTip" xml:space="preserve">エミュレーター本体を選択({key=AdditionCommand}起動パラメータでインスタンス指定可能)、または直接エミュレーター/ゲームのショートカットを選択できます。&#10;{key=WakeUp}タスクがエミュレーター起動遅延で失敗する場合、ゲームショートカットを使用し{key=WaitForEmulator}を延長することを推奨します。</system:String>
<system:String x:Key="EmulatorPathSelectionErrorPrompt">バーでバーを注文したいですか?</system:String>
<system:String x:Key="EmulatorPathSelectionErrorImSure">確かに間違って選択していないと思います</system:String>
<system:String x:Key="EmulatorPathSelectionErrorSelectAgain">はい、もう一度選択します</system:String>
<system:String x:Key="EmulatorPathNotExist">エミュレータのパスが存在しません</system:String>
<system:String x:Key="EmulatorPathEmptyWarning">エミュレータのパスが空です。{key=RetryOnDisconnected}」と「{key=OpenEmulatorAfterLaunch}のチェック状態がリセットされました</system:String>
<system:String x:Key="EmulatorPathEmptyWarning">エミュレータのパスが空です。{key=RetryOnDisconnected}」 と 「{key=OpenEmulatorAfterLaunch}のチェック状態がリセットされました</system:String>
<system:String x:Key="Select">選択</system:String>
<system:String x:Key="Test">テスト</system:String>
<system:String x:Key="ForcedReplaceAdb">ADB強制置き換え</system:String>
@@ -505,7 +523,7 @@ MAA は非インストール型のアプリケーションであり、レジス
<system:String x:Key="MaaFwAdbTouchMode">MaaFramework (実験機能)</system:String>
<system:String x:Key="TouchModeTip" xml:space="preserve">ADB Input は、OS バージョンが古く Minitouch や MaaTouch を使用できない物理デバイス用です。他の2モードが使える場合は、ADB Input を選択しないでください。&#10;ADB Input のスワイプはズレやすいため、スワイプ速度が非常に遅く設定され、スワイプ距離も他の2モードと異なります。正確な座標制御が必要な場面では使用できません。</system:String>
<system:String x:Key="AdditionCommand">追加コマンド</system:String>
<system:String x:Key="AdditionCommandTip" xml:space="preserve">エミュレーター起動パラメータの追加コマンド(例:--instance 1は 1 番インスタンス)。&#10;コマンド形式はエミュレーターにより異なり、通常はインスタンス番号やウィンドウモードなどを含みます。</system:String>
<system:String x:Key="AdditionCommandTip" xml:space="preserve">エミュレーター起動パラメータの追加コマンド(例:--instance 1は 1 番インスタンス)。&#10;コマンド形式はエミュレーターにより異なり、通常はインスタンス番号やウィンドウモードなどを含みます。</system:String>
<system:String x:Key="StartsWithScript">スクリプトを使用して始めます</system:String>
<system:String x:Key="EndsWithScript">終了時にスクリプトを使用します</system:String>
<system:String x:Key="CopilotWithScript">自動戦闘時に上記のスクリプトを有効にする</system:String>
@@ -548,7 +566,7 @@ MAA は非インストール型のアプリケーションであり、レジス
{key=StartingCoreChar}: ウィシャデル
1. 「{key=IS4NewSquad3}」:完全回避戦術を採用し、攻略を狙わない高速レベリングに適します
2. 「{key=IS4NewSquad6}」を使用すると源石錐稼ぎ効率が向上しますが、戦略を源石錐稼ぎに設定する必要があります
2. 「{key=IS4NewSquad6}」を使用すると源石錐稼ぎ効率が向上しますが、戦略を源石錐稼ぎに設定する必要があります
3. 最高難易度がN15以上の場合、6★オペレーターの希望消費が+1になり、一部の分隊では開始時に6★オペレーターを招集できず、エラーや失敗を招く可能性があります</system:String>
<system:String x:Key="RoguelikeThemeTipJieGarden" xml:space="preserve">{key=RoguelikeThemeJieGarden}推奨構成:
@@ -556,14 +574,14 @@ MAA は非インストール型のアプリケーションであり、レジス
{key=StartingRoles}: {key=SlowAndSteadyWinsTheRace}
{key=StartingCoreChar}: ウィシャデル
1. 戦略を源石錐稼ぎにし、難易度を N3 以上またはMAXに設定し、{key=StartingSquad}を「{key=LeaderSquad}」にすると指揮回避戦闘戦術が有効になります
2. 指揮回避戦闘戦術を使うと源石錐稼ぎ効率が大幅に向上し、高速レベリング(攻略を狙わない)にも使用できますが、戦略を源石錐稼ぎに設定する必要があります
1. 戦略を源石錐稼ぎにし、難易度を N3 以上またはMAXに設定し、{key=StartingSquad}を「{key=LeaderSquad}」にすると指揮回避戦闘戦術が有効になります
2. 指揮回避戦闘戦術を使うと源石錐稼ぎ効率が大幅に向上し、高速レベリング(攻略を狙わない)にも使用できますが、戦略を源石錐稼ぎに設定する必要があります
3. 解放済みの最高難易度が N3 未満、または関連知識を解放していない場合は指揮回避戦闘戦術を使用しないでください。エラーの原因になります
4. 最高難易度が N15 以上の場合、6★オペレーターの希望消費が+1になり、一部の分隊では開始時に6★オペレーターを招集できず、エラーや失敗を招く可能性があります</system:String>
<system:String x:Key="RoguelikeDifficulty">難易度</system:String>
<system:String x:Key="RoguelikeJieGardenDifficultyTip" xml:space="preserve">「{key=RoguelikeThemeJieGarden}」に関連する知識を解放すると、{key=LeaderSquad}で N3 以上の難易度を探索する際に時の果てを追加で携帯し、一戦一跳の貯蓄戦術を行えます。
まだ解放していない場合は、N3 以上の難易度(MAXを含む)を選択しないでください。
この機能を有効にするには、難易度を N3 以上に設定してください({key=NotSwitch} (-1)を除く)。</system:String>
<system:String x:Key="RoguelikeJieGardenDifficultyTip" xml:space="preserve">「{key=RoguelikeThemeJieGarden}」に関連する知識を解放すると、{key=LeaderSquad}で N3 以上の難易度を探索する際に時の果てを追加で携帯し、一戦一跳の貯蓄戦術を行えます。
まだ解放していない場合は、N3 以上の難易度(MAXを含む)を選択しないでください。
この機能を有効にするには、難易度を N3 以上に設定してください({key=NotSwitch} (-1)を除く)。</system:String>
<system:String x:Key="Strategy">ストラテジー</system:String>
<system:String x:Key="StartTimesLimit">冒険をN回始めた後に停止する</system:String>
<system:String x:Key="GoldTimesLimit">N回投資した後に停止する</system:String>
@@ -591,9 +609,9 @@ MAA は非インストール型のアプリケーションであり、レジス
<system:String x:Key="OnlyOnceADay">一日一回だけ</system:String>
<system:String x:Key="CreditFight">サポートを借りて戦闘を行いポイントを獲得します</system:String>
<system:String x:Key="CreditFightTip" xml:space="preserve">基地訪問後、OF-1でサポートを使用すると、30FP獲得できます。
この機能は、ステージを{key=DefaultStage}に選択している場合は無効です。
この機能は、ステージを{key=DefaultStage}に選択している場合は無効です。
ステージOF-1がアンロックされていない場合は、チェックしないでください。</system:String>
<system:String x:Key="CreditFightWhenOF-1Warning">{key=Fight}タスクのステージリストに{key=DefaultStage}が存在するし、{key=Mall}タスクはOF-1での戦友サポート借用の戦闘をスキップします。タスク名: {0} (シーケンス番号 {1})、レベル シーケンス番号 {2}</system:String>
<system:String x:Key="CreditFightWhenOF-1Warning">{key=Fight}タスクのステージリストに{key=DefaultStage}が存在するし、{key=Mall}タスクはOF-1での戦友サポート借用の戦闘をスキップします。タスク名: {0} (シーケンス番号 {1})、レベル シーケンス番号 {2}</system:String>
<system:String x:Key="HighPriority">優先購入(セミコロンで区切)</system:String>
<system:String x:Key="Blacklist">ブラックリスト(セミコロンで区切)</system:String>
<system:String x:Key="HighPriorityDefault">求人票</system:String>
@@ -609,7 +627,7 @@ MAA は非インストール型のアプリケーションであり、レジス
<system:String x:Key="ReceiveMail">すべてのメール報酬を受取</system:String>
<system:String x:Key="ReceiveFreeGacha">リミテッドスカウトから毎日無料スカウトを行う</system:String>
<system:String x:Key="ReceiveFreeGachaTip">無料スカウトがない場合はスカウトしない</system:String>
<system:String x:Key="GachaWarning">これは危険な機能であり、誤用につながる可能性があります\n{key=Confirm}ボタンを押すことで、起こりうる危険を理解し、それを引き受ける意思があるとみなされます</system:String>
<system:String x:Key="GachaWarning">これは危険な機能であり、誤用につながる可能性があります\n{key=Confirm}ボタンを押すことで、起こりうる危険を理解し、それを引き受ける意思があるとみなされます</system:String>
<system:String x:Key="ReceiveOrundum">ラッキーウォールから毎日合成玉の報酬を受け取る</system:String>
<system:String x:Key="ReceiveMining">期間限定の採掘許可で毎日合成玉の報酬を受け取る</system:String>
<system:String x:Key="ReceiveSpecialAccess">スペシャルアクセス特典を集める</system:String>
@@ -625,7 +643,7 @@ MAA は非インストール型のポータブルソフトウェアで、通知
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings
該当するパスのキーを削除してください。
</system:String>
<system:String x:Key="HideCloseButton">閉じるボタンを隠す</system:String>
<system:String x:Key="HideCloseButton">閉じるボタンを隠す</system:String>
<system:String x:Key="WindowTitleScrollable">タイトルのスクロール機能</system:String>
<system:String x:Key="MainTasksNullFunctionality">メインタスクの右クリック効果を反転</system:String>
<system:String x:Key="MainTasksNullFunctionalityTip">デフォルト1回のみ有効、チェック後1回のみスキップ</system:String>
@@ -633,14 +651,14 @@ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Notifications\Settin
<system:String x:Key="UseCardLog">カードスタイルのログを使用</system:String>
<system:String x:Key="MaxNumberOfLogThumbnails">ログサムネイルの最大数</system:String>
<system:String x:Key="TitleBarDisplayContent">タイトルバー表示コンテンツ</system:String>
<system:String x:Key="CustomBackgroundTip">backgroundフォルダを手動で作成し、background.png を配置すると背景画像をカスタマイズできます</system:String>
<system:String x:Key="CustomBackgroundTip">backgroundフォルダを手動で作成し、background.png を配置すると背景画像をカスタマイズできます</system:String>
<system:String x:Key="UseLogItemDateFormat">カスタムログ日付形式</system:String>
<system:String x:Key="LogItemDateFormatString">日付書式文字列</system:String>
<system:String x:Key="PromptRestartForSettingsChange">変更を適用するためにすぐに再起動しますか?</system:String>
<system:String x:Key="SwitchResolutionTip">エミュレータの解像度を1920x1080に変更!</system:String>
<system:String x:Key="ResolutionInfoYoStarEN">エミュレータが1920x1080に設定されていることを確認してください</system:String>
<system:String x:Key="AllowUseStoneSave">源石の数を割る保存状態を許可</system:String>
<system:String x:Key="AllowUseStoneSaveWarning">この機能は危険な機能と見なされます。{key=Confirm}ボタンを押すと、リスクを理解し、受け入れることに同意したと見なされます。</system:String>
<system:String x:Key="AllowUseStoneSaveWarning">この機能は危険な機能と見なされます。{key=Confirm}ボタンを押すと、リスクを理解し、受け入れることに同意したと見なされます。</system:String>
<system:String x:Key="UseAlternateStage">代替ステージを選択可能にする</system:String>
<system:String x:Key="UseExpiringMedicine">N時間以内に期限が切れる回復剤を無制限に使用</system:String>
<system:String x:Key="UseExpireMedicineForActivity">今週中に期限切れとなる正気回復ポーションは、アクティビティ終了の48時間以内に使用してください。</system:String>
@@ -652,8 +670,8 @@ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Notifications\Settin
<system:String x:Key="StagePlanTip">最初の開放したステージを実行します。すべてのステージが未開放の場合は、現在のタスクはスキップされます。\n現在実行中: {0}</system:String>
<system:String x:Key="CustomStageCode">ステージ名を入力する</system:String>
<system:String x:Key="CustomStageCodeTip" xml:space="preserve">(テスト機能)ステージ名と番号(例: 4-10、AP-5、H10-1-Hardなど
の両方がサポートされています。ステージの最後にNormal/Hardを入力すると難易度を切り替えできます10〜14章は標準/厄難、15章以降は通常/険地)</system:String>
<!--ワンタイム代理SS一般パスとしてSSReopen-XXを入力できます</system:String>-->
の両方がサポートされています。ステージの最後にNormal/Hardを入力すると難易度を切り替えできます10〜14章は標準/厄難、15章以降は通常/険地)</system:String>
<!--ワンタイム代理SS一般パスとしてSSReopen-XXを入力できます</system:String>-->
<system:String x:Key="AutoDetectConnection">接続自動認識</system:String>
<system:String x:Key="AutoDetectConnectionNotSupported">この接続構成では自動接続検出はサポートされていません。手動でポート番号を入力してみてください</system:String>
<system:String x:Key="AutoDetectConnectionTip" xml:space="preserve">このチェックボックスは、検出が完了するたびに自動的にチェックが外れますが、再検出が必要な場合は再度チェックを入れることができます。
@@ -666,8 +684,8 @@ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Notifications\Settin
<system:String x:Key="AccountSwitch">アカウントの切り替え</system:String>
<system:String x:Key="AccountSwitchManualRun">今すぐ切り替える</system:String>
<system:String x:Key="AccountSwitchTip" xml:space="preserve">切り替える必要があるアカウントを入力し、空白のままにしてアカウントの切り替えを停止します。
ログインインターフェイスに表示される内容を入力します(123****4567など)。123****4567」、「4567または23****45を入力できます。
繁体字中国語サーバーのアカウントはEメール形式ですab****01@gmail.comなど)。アスタリスクを含まない明文部分(01@gmailなど)の入力を推奨します。
ログインインターフェイスに表示される内容を入力します(123****4567など)。123****4567」 、 「4567または23****45を入力できます。
繁体字中国語サーバーのアカウントはEメール形式ですab****01@gmail.comなど)。アスタリスクを含まない明文部分(01@gmailなど)の入力を推奨します。
公式(CN)、Bilibili、繁体字中国語サーバーのみをサポートします。サードパーティのログイン方式はサポートされていません。</system:String>
<system:String x:Key="AdbPath">ADBパス</system:String>
<system:String x:Key="AdbPathFileSelectionErrorPrompt">選択されたファイル名にADBが含まれていません。誤ったファイルを選択していないか、エミュレータ自体を選択していないか確認してください。</system:String>
@@ -703,6 +721,7 @@ C:\\Program Files\\Netease\\MuMuPlayer を入力してください。\n
<system:String x:Key="MuMu12Index">インスタンス番号</system:String>
<system:String x:Key="MuMu12Display">表示番号</system:String>
<system:String x:Key="MuMuExtrasNotEnabledMessage">MuMu スクリーンショットの強化 が有効になっていません。関連する設定を確認してください</system:String>
<system:String x:Key="MuMuEmulator12KeepAliveOn">MuMu エミュレータのバックグラウンド常駐が有効になっています。スクリーンショットの失敗や操作異常が発生する可能性があります。MuMuの設定で 「バックグラウンド常駐」 (または 「アプリ常駐」 など)をオフにしてください</system:String>
<system:String x:Key="LdExtrasEnabled">LD のスクリーンショット拡張モードを有効にする</system:String>
<system:String x:Key="LdPlayerEmulatorPathNotFound">LDPlayer のインストールパスが見つかりません。</system:String>
<system:String x:Key="LdPlayerOpenglMissing">選択した LDPlayer パスに ldopengl64.dll が見つかりません。インストールディレクトリを確認してください。</system:String>
@@ -720,12 +739,12 @@ C:\\leidian\\LDPlayer9
縦画面状態でゲームを起動した後、横画面に切り替えると、画面の乱れ(ティアリング)などの問題が発生する可能性があります。
</system:String>
<system:String x:Key="LdEmulatorPath">LD エミュレータパス</system:String>
<system:String x:Key="LdManualSetIndex">{key=LdIndex}を手動で入力</system:String>
<system:String x:Key="LdManualSetIndex">{key=LdIndex}を手動で入力</system:String>
<system:String x:Key="LdIndex">インスタンス番号</system:String>
<system:String x:Key="LdExtrasNotEnabledMessage">LD スクリーンショットの強化 が有効になっていません。関連する設定を確認してください</system:String>
<system:String x:Key="RetryOnDisconnected">ADB接続が失敗した場合、エミュレータの起動を試みる</system:String>
<system:String x:Key="RetryOnDisconnectedTip">再接続に失敗した後、エミュレータを再起動してみてください,バックグラウンドのタイムドタスクを使用し、終了時にエミュレータを終了させるタスクを設定する場合は、必ずチェックを入れること</system:String>
<system:String x:Key="RetryOnDisconnectedEmulatorPathEmptyError">エミュレータのパスが空です!{key=Settings} - {key=StartupSettings} - {key=EmulatorPath}を入力してから再度選択してください。</system:String>
<system:String x:Key="RetryOnDisconnectedEmulatorPathEmptyError">エミュレータのパスが空です!{key=Settings} - {key=StartupSettings} - {key=EmulatorPath}を入力してから再度選択してください。</system:String>
<system:String x:Key="AllowAdbRestart">接続失敗後にADBサーバーの再起動を試みる</system:String>
<system:String x:Key="AllowAdbHardRestart">接続失敗後にADBプロセスの再起動を試みる</system:String>
<!-- !設定 -->
@@ -832,7 +851,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="DaysLeftOpen" xml:space="preserve">公開日まで: </system:String>
<system:String x:Key="Inventory">在庫</system:String>
<system:String x:Key="InventoryUpdateTip">在庫データは 「{key=Toolbox}-{key=DepotRecognition}」 で更新できます</system:String>
<system:String x:Key="SpecifiedDropsInventoryUnavailable">タスク{0}では {key=TargetInventory} が有効ですが、利用可能な在庫データがないためスキップされました。「{key=Toolbox}-{key=DepotRecognition}」 で在庫を更新してください。</system:String>
<system:String x:Key="SpecifiedDropsInventoryUnavailable">タスク{0}では {key=TargetInventory} が有効ですが、利用可能な在庫データがないためスキップされました。「{key=Toolbox}-{key=DepotRecognition}」 で在庫を更新してください。</system:String>
<system:String x:Key="LessThanOneDay">1日以内</system:String>
<system:String x:Key="1-7">1-7</system:String>
<system:String x:Key="CE-6">龍門幣-6(CE-6)</system:String>
@@ -877,7 +896,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="Running">動作中……</system:String>
<system:String x:Key="TaskAppend.Skip">{0}: {1} タスクをスキップしました</system:String>
<system:String x:Key="TaskAppend.Error">{0}: {1} タスクの追加に失敗しました</system:String>
<system:String x:Key="AdbReplacementTips">タスクが応答なしになる場合は、{key=Settings} - {key=ConnectionSettings} - {key=ForcedReplaceAdb}、もしくは ADB Input タッチモード をチェックしてください(お勧めしない)。</system:String>
<system:String x:Key="AdbReplacementTips">タスクが応答なしになる場合は、{key=Settings} - {key=ConnectionSettings} - {key=ForcedReplaceAdb}、もしくは ADB Input タッチモード をチェックしてください(お勧めしない)。</system:String>
<system:String x:Key="Waiting">ミッション終了を待っています……</system:String>
<system:String x:Key="Stopping">動作停止中……</system:String>
<system:String x:Key="Stopped">動作停止</system:String>
@@ -908,7 +927,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="RecruitmentRecognitionTip">ヒント: スタート画面の公開求人とは、別々の機能になっています。使用する前にゲームの公開求人を手動で開いてください</system:String>
<system:String x:Key="AutoSettingTime">募集期間を自動的に設定する</system:String>
<system:String x:Key="RecruitmentShowPotential">潜在数を表示する4/5/6★ Tags</system:String>
<system:String x:Key="RecruitmentShowPotentialTips">情報を取得するために{key=OperBoxRecognition}を使用してください。</system:String>
<system:String x:Key="RecruitmentShowPotentialTips">情報を取得するために{key=OperBoxRecognition}を使用してください。</system:String>
<system:String x:Key="AutoSelectLevel3Tags">星3タグを自動的に選択する</system:String>
<system:String x:Key="AutoSelectLevel4Tags">星4タグを自動的に選択する</system:String>
<system:String x:Key="AutoSelectLevel5Tags">星5タグを自動的に選択する</system:String>
@@ -933,7 +952,7 @@ C:\\leidian\\LDPlayer9
<!-- Operator Recognition -->
<system:String x:Key="OperBoxRecognition">{key=Operator}</system:String>
<system:String x:Key="OperBox">{key=OperBoxRecognition}</system:String>
<system:String x:Key="OperBoxRecognitionTip">戦術要員は、{key=Operator}識別の正確性に影響します。戦術要員の{key=Operator}の識別が誤っている場合は、自己判断してください。</system:String>
<system:String x:Key="OperBoxRecognitionTip">戦術要員は、{key=Operator}識別の正確性に影響します。戦術要員の{key=Operator}の識別が誤っている場合は、自己判断してください。</system:String>
<system:String x:Key="OperBoxHaveList">所有している: {0}</system:String>
<system:String x:Key="OperBoxNotHaveList">所有していない: {0}</system:String>
<system:String x:Key="StartToOperBoxRecognition">認識開始</system:String>
@@ -954,7 +973,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="VideoRecognition">映像</system:String>
<system:String x:Key="StartToVideoRecognition">認識を始める</system:String>
<system:String x:Key="OpenVideoRecognitionResult">ディレクトリを開く</system:String>
<system:String x:Key="VideoRecognitionTips" xml:space="preserve">映像認識のために、{key=Copilot}ページを開き、映像をドラッグしてください。
<system:String x:Key="VideoRecognitionTips" xml:space="preserve">映像認識のために、{key=Copilot}ページを開き、映像をドラッグしてください。
映像の解像度は16: 9である必要があり、黒枠、エミュレータ枠、特殊な形状、画面効果などが無いことを確認してください。</system:String>
<!-- VideoRecognition -->
<!-- Gacha Recognition -->
@@ -997,14 +1016,14 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="MiniGame@PV">PV-花火実行委員会</system:String>
<system:String x:Key="MiniGame@PVTip">選択したステージから自動でクリアします。最初のステージを選んだ場合は、イベントページの最左側から開始してください。その他のステージを選んだ場合は、位置を校正するために前のステージに一度入ってから戻ってください。</system:String>
<system:String x:Key="MiniGame@SPA">堅守協定:盟約</system:String>
<system:String x:Key="MiniGame@SPATip" xml:space="preserve">イベントメイン画面(単独演算の場所)からタスクを開始
<system:String x:Key="MiniGame@SPATip" xml:space="preserve">イベントメイン画面(単独演算の場所)からタスクを開始
セーブデータがある場合は、まず手動で破棄する必要があります
逆境シミュレーションまでテスト済み
より高い難易度をクリア済みで逆境シミュレーションまたは標準シミュレーションが表示されない場合、\n逆境シミュレーション難易度を手動で一度選択してください
標準シミュレーションを手動でクリアすると、より早くスコアを稼げます
レベル報酬のみ取得可能。功績勲章を入手するには全ての主要目標をクリアする必要があります</system:String>
逆境シミュレーションまでテスト済み
より高い難易度をクリア済みで逆境シミュレーションまたは標準シミュレーションが表示されない場合、\n逆境シミュレーション難易度を手動で一度選択してください
標準シミュレーションを手動でクリアすると、より早くスコアを稼げます
レベル報酬のみ取得可能。功績勲章を入手するには全ての主要目標をクリアする必要があります</system:String>
<system:String x:Key="MiniGame@OS">OS-カランド貿易 研究開発部</system:String>
<system:String x:Key="MiniGame@OSTip">イベントメイン画面(右下に再建開始がある場所)でタスクを開始します。</system:String>
<system:String x:Key="MiniGame@OSTip">イベントメイン画面(右下に再建開始がある場所)でタスクを開始します。</system:String>
<system:String x:Key="MiniGame@RM-TR-1">再建画策 RM-TR-1</system:String>
<system:String x:Key="MiniGame@RM-TR-1Tip" xml:space="preserve">チュートリアル終了後、前哨基地に入り、画面を一番左までスワイプしてください。</system:String>
<system:String x:Key="MiniGame@RM-1">再建画策 RM-1</system:String>
@@ -1012,7 +1031,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="MiniGame@AT@ConversationRoom">AT - 相談室</system:String>
<system:String x:Key="MiniGame@AT@ConversationRoomTip" xml:space="preserve">イベント画面(右下角に 「営業開始」 ボタンがあります)でタスクを開始します。</system:String>
<system:String x:Key="MiniGame@ALL@GreenGrass">デュエルチャンネル:グリーングラスシティ</system:String>
<system:String x:Key="MiniGame@ALL@GreenGrassTip" xml:space="preserve">手動でチュートリアルの会話をスキップし、直接退出することができます。&#10;イベント画面(右下角に試合観戦ボタンがあります)でタスクを開始します。&#10;&#10;ダック卿の選択をフォローする。</system:String>
<system:String x:Key="MiniGame@ALL@GreenGrassTip" xml:space="preserve">手動でチュートリアルの会話をスキップし、直接退出することができます。&#10;イベント画面(右下角に試合観戦ボタンがあります)でタスクを開始します。&#10;&#10;ダック卿の選択をフォローする。</system:String>
<system:String x:Key="MiniGame@ALL@HoneyFruit">デュエルチャンネル:ハニーデューシティ</system:String>
<system:String x:Key="MiniGame@ALL@HoneyFruitTip" xml:space="preserve">{key=MiniGame@ALL@GreenGrassTip}</system:String>
<system:String x:Key="MiniGame@ALL@IvyVine">デュエルチャンネル:アイヴィヴァインシティ</system:String>
@@ -1023,7 +1042,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="MiniGame@SecretFront@Event2">遊侠</system:String>
<system:String x:Key="MiniGame@SecretFront@Event3">揺蕩う影</system:String>
<system:String x:Key="MiniGame@SecretFront">隠密戦線</system:String>
<system:String x:Key="MiniGame@SecretFrontTip">小隊選択画面で開始します。セーブデータがある場合は手動で削除する必要があります。ゲーム内の前の小隊からのデータを引き継ぐにチェックすることを推奨します。</system:String>
<system:String x:Key="MiniGame@SecretFrontTip">小隊選択画面で開始します。セーブデータがある場合は手動で削除する必要があります。ゲーム内の前の小隊からのデータを引き継ぐにチェックすることを推奨します。</system:String>
<system:String x:Key="MiniGameNameGreenTicketStore">緑チケット商店</system:String>
<system:String x:Key="MiniGameNameGreenTicketStoreTip" xml:space="preserve">1階は全部購入。&#10;2階はスカウト券と求人票を購入のみ。</system:String>
<system:String x:Key="MiniGameNameYellowTicketStore">黄チケット商店</system:String>
@@ -1054,7 +1073,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="FailedToLikeWebJson">エラーが発生しました、いいねに失敗しました。 : &lt;</system:String>
<system:String x:Key="ThanksForLikeWebJson">感謝と評価!\nウェブページには既にコメント欄が開放されており、あなたのコメントを心待ちにしています</system:String>
<system:String x:Key="AutoSquad">自動編成</system:String>
<system:String x:Key="AutoSquadTip">自動編成では、一時的に戦術要員{key=Operator}を認識できません</system:String>
<system:String x:Key="AutoSquadTip">自動編成では、一時的に戦術要員{key=Operator}を認識できません</system:String>
<system:String x:Key="SupportUnitUsage">戦友サポート借用</system:String>
<system:String x:Key="SupportUnitUsage.Tip">1つ足りないくらいならまだ使えますが、2つ以上欠けている場合は別の攻略に替えたほうがいいでしょう。</system:String>
<system:String x:Key="SupportUnitUsage.None">借用しない</system:String>
@@ -1066,7 +1085,7 @@ C:\\leidian\\LDPlayer9
この項目を選択するとこれらのチェックをスキップしますが、タスクが正常に動作しなくなる可能性があります。
オペレーターのエリートレベルはスキップできません。いずれかの条件をスキップした場合、戦闘後にオペレーションは自動的に評価されなくなります。</system:String>
<system:String x:Key="AddUserAdditional">カスタム{key=Operator}追加</system:String>
<system:String x:Key="AddUserAdditionalTip">「;」はセパレータ、「,」で{key=Operator}の名前とスキルを区切ります。例: Surtr, 3; Eyjafjalla, 1</system:String>
<system:String x:Key="AddUserAdditionalTip"> 「;」 はセパレータ、 「,」 で{key=Operator}の名前とスキルを区切ります。例: Surtr, 3; Eyjafjalla, 1</system:String>
<system:String x:Key="UserAdditional.OperatorName">{key=Operator}名</system:String>
<system:String x:Key="UserAdditional.Skill">スキル</system:String>
<system:String x:Key="UserAdditional.Action">操作</system:String>
@@ -1081,7 +1100,7 @@ C:\\leidian\\LDPlayer9
4. {key=ParadoxSimulation}: {key=Operator}リストから起動
対応する画面から開始してください。章間のナビゲーションはサポートされていません。
{key=UseCopilotList}を有効にすると、個々のジョブが自動的に{key=CopilotList}に追加されます。</system:String>
{key=UseCopilotList}を有効にすると、個々のジョブが自動的に{key=CopilotList}に追加されます。</system:String>
<system:String x:Key="CopilotTaskRaidStage">(強襲)</system:String>
<system:String x:Key="CopilotAddTask" xml:space="preserve">左クリックで通常難易度を追加
右クリックしてレイドの難易度を追加します</system:String>
@@ -1119,10 +1138,10 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="CopilotTip">
ヒント: \n\n
1. この機能を使用前に、攻略ファイルと選択したステージタイプが一致していることを確認してください。\n\n
2. {key=MainStage}、{key=StoryCollection}、{key=SideStory}: 右下の行動開始ボタン画面で開始してください。\n\n
3. {key=SSS}: resource/copilot フォルダー内に複数の課題があります。まず手動で編成を行い、右下の配置開始ボタン画面で開始してください。{key=LoopTimes}と連携することもできます。\n\n
4. {key=ParadoxSimulation}: スキルを選択した後、スキル選択画面に演算開始ボタンが表示され、1/2 星{key=Operator}(スキルなし)が右下に演算開始ボタンを表示されて開始します。{key=UseCopilotList}を使用する場合、{key=Operator}リストの「レベル/レアリティ」タブから開始してください。\n\n
5. 戦術要員機能を有効にすると、{key=AutoSquad}の{key=Operator}選択に影響を与える可能性があります。{key=AutoSquad}を 使用する際は戦術要員をオフにするか、不足している{key=Operator}を手動で補充して編成を完成させることをお勧めします。\n\n
2. {key=MainStage}、{key=StoryCollection}、{key=SideStory}: 右下の行動開始ボタン画面で開始してください。\n\n
3. {key=SSS}: resource/copilot フォルダー内に複数の課題があります。まず手動で編成を行い、右下の配置開始ボタン画面で開始してください。{key=LoopTimes}と連携することもできます。\n\n
4. {key=ParadoxSimulation}: スキルを選択した後、スキル選択画面に演算開始ボタンが表示され、1/2 星{key=Operator}(スキルなし)が右下に演算開始ボタンを表示されて開始します。{key=UseCopilotList}を使用する場合、{key=Operator}リストの「レベル/レアリティ」タブから開始してください。\n\n
5. 戦術要員機能を有効にすると、{key=AutoSquad}の{key=Operator}選択に影響を与える可能性があります。{key=AutoSquad}を 使用する際は戦術要員をオフにするか、不足している{key=Operator}を手動で補充して編成を完成させることをお勧めします。\n\n
6. Copilot作業ステーションでは、入力欄の右側にある貼り付けボタンをクリックして、謎のコードを貼り付けることができます\n
• 2番目のボタンをクリック = 割り当てを追加。\n
• 3番目のボタンをクリック = 割り当てセットを追加。\n\n
@@ -1148,9 +1167,9 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="CopilotTaskTypeMismatch">選択した作業が現在のタブと一致しません</system:String>
<system:String x:Key="CopilotTasksWithEmptyName">ステージ名が空の作業があります</system:String>
<system:String x:Key="CopilotCouldNotSaveFile" xml:space="preserve">コパイロットタスクをファイルに保存できませんでした: </system:String>
<system:String x:Key="CopilotStartWithEmptyList">タスクなしで{key=UseCopilotList}を使用した</system:String>
<system:String x:Key="CopilotSingleTaskWarning">{key=UseCopilotList}を使用して単一ジョブを実行しています。これは推奨されません。単一ジョブを直接実行してください。</system:String>
<system:String x:Key="CopilotTaskListMixedModeNotAllowed">{key=UseCopilotList}を使用中ですが、異なるジョブタイプの混在はサポートされていません。</system:String>
<system:String x:Key="CopilotStartWithEmptyList">タスクなしで{key=UseCopilotList}を使用した</system:String>
<system:String x:Key="CopilotSingleTaskWarning">{key=UseCopilotList}を使用して単一ジョブを実行しています。これは推奨されません。単一ジョブを直接実行してください。</system:String>
<system:String x:Key="CopilotTaskListMixedModeNotAllowed">{key=UseCopilotList}を使用中ですが、異なるジョブタイプの混在はサポートされていません。</system:String>
<system:String x:Key="CopilotTaskTypeParseFailedSkipCheck">一部のジョブタイプの解析に失敗しました。タイプチェックをスキップします。</system:String>
<system:String x:Key="CopilotIllegalOperName">オペレーター名が不正です: {0}</system:String>
<!-- !Logs -->
@@ -1162,7 +1181,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="ErrorDetails">詳細情報</system:String>
<system:String x:Key="ErrorSolution">解決策</system:String>
<system:String x:Key="ErrorSolutionMoveMaaExeOutOfFolder">MAA.exe ファイルを単独で移動しないでください。ソフトウェアの場所を変更する必要がある場合は、フォルダー全体を移動するか、このフォルダーに MAA.exe のショートカットを作成してから、ショートカットを別の場所にドラッグしてください。</system:String>
<system:String x:Key="ErrorSolutionCrash">ドキュメントよくある問題 - クラッシュを参照してください。</system:String>
<system:String x:Key="ErrorSolutionCrash">ドキュメントよくある問題 - クラッシュを参照してください。</system:String>
<system:String x:Key="ErrorSolutionUpdatePackageExtractionFailed">アップデートパッケージの解凍に失敗しました。まずは MAA.exe の再起動をお試しください。問題が解決しない場合は、PC を再起動して再度お試しください。必要なファイルの削除が行われない可能性があるため、手動で解凍しないでください。</system:String>
<system:String x:Key="ErrorSolutionReplaceAdb">エミュレータとADBを閉じるか、コンピューターを再起動してから、管理者権限でMAAを開いて操作してください。</system:String>
<system:String x:Key="ErrorSolutionFailedToMove">ファイルが占有されています。コンピュータを再起動して再試行してください。</system:String>
@@ -1172,8 +1191,8 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="ErrorFeedbackLinkText">GitHub issueを作成する</system:String>
<system:String x:Key="ErrorQqGroupLinkText">QQグループに入ります</system:String>
<system:String x:Key="ErrorCrashMessageHeader">上記の問題により、プログラムが異常終了しました。</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}に移動してログを確認し、エラーが発生した具体的な原因を確認できます。</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}を使用してエラーレポートを生成し、青色の 「{key=Issue}」 リンクをクリックしてフィードバックを送信してください。</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}に移動してログを確認し、エラーが発生した具体的な原因を確認できます。</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}を使用してエラーレポートを生成し、青色の 「{key=Issue}」 リンクをクリックしてフィードバックを送信してください。</system:String>
<system:String x:Key="ErrorCrashMessageHelpTip">他人に助けを求める場合は、このウィンドウのスクリーンショット、画面録画、写真、撮影した動画、手描きの図、写し書きした内容ではなく、生成されたエラーレポートファイルを送信してください。</system:String>
<system:String x:Key="ErrorCrashDialogTitle">前回のクラッシュ原因</system:String>
<system:String x:Key="CopyErrorMessage">エラー情報をコピーする</system:String>
@@ -1198,11 +1217,14 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="TryToReconnect">エミュレータが切断、再接続を行います</system:String>
<system:String x:Key="ReconnectSuccess">再接続に成功、タスクを続行します</system:String>
<system:String x:Key="ReconnectFailed">再接続に失敗、切断されました!</system:String>
<system:String x:Key="TouchModeNotAvailable">タッチモードは利用できません。{key=Settings} - {key=ConnectionSettings}に入って、他のタッチモードに変更してください。</system:String>
<system:String x:Key="TouchModeNotAvailable">タッチモードは利用できません。{key=Settings} - {key=ConnectionSettings}に入って、他のタッチモードに変更してください。</system:String>
<system:String x:Key="ScreencapFailed">スクリーンキャプチャに失敗しました。繰り返し発生する場合は、エミュレータの再起動または変更をお試しください!</system:String>
<system:String x:Key="FastestWayToScreencap">スクリーンショット テストには: {0}ms ({1})</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">スクリーンキャップには時間がかかるため(平均: {0}ms)、自動戦闘機能 (Auto I.S. など) を使用すると異常な動作が発生する可能性があります。MuMuやLDPlayerを使用している場合は、スクリーンショット拡張を試してください。</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">スクリーンキャップに時間がかかりすぎるため(平均: {0}ms)、自動戦闘機能 (Auto I.S. など) が適切に動作しない可能性があります、シミュレータの再起動や交換をお勧めしますMuMuやLDPlayerを使用している場合は、スクリーンショット拡張を試してください。</system:String>
<system:String x:Key="EmulatorFpsWarningTip">エミュレータの設定フレームレートが {0} FPS で、ゲームのネイティブフレームレート60 FPSを下回っています。バックグラウンドのフレームレート低下が有効になっているか、フレームレートの設定が低すぎる可能性があります。エミュレータのフレームレートを 60 FPS に設定することを推奨します</system:String>
<system:String x:Key="EmulatorFpsErrorTip">エミュレータの設定フレームレートが低すぎます({0} FPS。タスクが異常になる可能性があります。エミュレータの設定でバックグラウンドのフレームレート低下をオフにし、フレームレートを 60 FPS に設定してください</system:String>
<system:String x:Key="EmulatorFpsHighTip">エミュレータの設定フレームレートが {0} FPS で、ゲームのネイティブフレームレート上限60 FPSを上回っています。これはエミュレータのフレーム補間機能の可能性があり、画面の異常や認識の不安定化を招くことがあります。フレーム補間を無効にし、フレームレートを 60 FPS に設定することを推奨します</system:String>
<system:String x:Key="IdentifyTheMistakes">認識エラー</system:String>
<system:String x:Key="TaskError" xml:space="preserve">タスクエラー: </system:String>
<system:String x:Key="CombatError">戦闘エラー</system:String>
@@ -1275,7 +1297,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="BoskyDoubts">スポット: 雑疑</system:String>
<system:String x:Key="BoskyDisaster">スポット: 禍乱</system:String>
<system:String x:Key="RoguelikeCoppersExchange">通宝交換: {0} → {1}</system:String>
<system:String x:Key="RoguelikeCoppersRecognitionError">通宝認識失敗: {0}</system:String>
<system:String x:Key="RoguelikeCoppersRecognitionError">通宝認識失敗: {0}</system:String>
<system:String x:Key="RoguelikeEvent">イベント:</system:String>
<system:String x:Key="RoguelikeEncounterOptions">{0} 件の選択肢を検出しました:</system:String>
<system:String x:Key="RoguelikeEncounterEnabledOption">選択可能な選択肢: {0}</system:String>
@@ -1347,7 +1369,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="MoveCamera">カメラ移動</system:String>
<system:String x:Key="DrawCard">オペレーター配分</system:String>
<system:String x:Key="CheckIfStartOver">再開確認</system:String>
<system:String x:Key="UnsupportedLevel">サポートされていないステージです。ステージ名を確認するか、{key=Settings} - {key=UpdateSettings} - {key=ResourceUpdate}に移動してリソースバージョンを更新してみてください!</system:String>
<system:String x:Key="UnsupportedLevel">サポートされていないステージです。ステージ名を確認するか、{key=Settings} - {key=UpdateSettings} - {key=ResourceUpdate}に移動してリソースバージョンを更新してみてください!</system:String>
<system:String x:Key="UnsupportedSkill">{0} のスキル {1} はサポートされないので、スキルを選択されなくなります。</system:String>
<system:String x:Key="RecruitTagsDetected" xml:space="preserve">認識結果: </system:String>
<system:String x:Key="ConnectFailed">接続失敗</system:String>
@@ -1355,7 +1377,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="TryToStartEmulator">エミュレータを起動しようとしています</system:String>
<system:String x:Key="RestartAdb">ADBサーバーの再起動を試みています</system:String>
<system:String x:Key="HardRestartAdb">ADBプロセスの再起動を試みています</system:String>
<system:String x:Key="CheckSettings">接続設定を確認」→「エミュレーターとADBを再起動してみる」→「コンピュータを再起動してください</system:String>
<system:String x:Key="CheckSettings">接続設定を確認」 → 「エミュレーターとADBを再起動してみる」 → 「コンピュータを再起動してください</system:String>
<system:String x:Key="AttachWindowNotFound">ウィンドウ "{0}" が見つかりません。ゲームが起動していることを確認してください</system:String>
<system:String x:Key="AttachWindowMultipleFound">{0} 個の "{1}" ウィンドウが見つかりました。最初のものを使用します</system:String>
<system:String x:Key="AttachWindowFound">ウィンドウ "{0}" が見つかりました</system:String>
@@ -1441,7 +1463,7 @@ DEBUGディレクトリに保存される画像には数量制限があり、超
<system:String x:Key="PreserveTagsTip">選択したタグのいずれかを認識した場合、その募集をスキップして枠を残します。未選択の場合は何も保留しません。</system:String>
<!-- !自動募集設定 -->
<!-- EasterEggs -->
<system:String x:Key="BuyWineOnAprilFoolsDay">尊敬なるドクター、クロージャ様のお店で「酒」の新しいリストがあると聞いたことがありませんか?一緒に確認しませんか?</system:String>
<system:String x:Key="BuyWineOnAprilFoolsDay">尊敬なるドクター、クロージャ様のお店で 「酒」 の新しいリストがあると聞いたことがありませんか?一緒に確認しませんか?</system:String>
<system:String x:Key="Burping">うぅ……オエッ</system:String>
<system:String x:Key="DrunkAndStaggering">あれ、ドクター。どうしてそんなフラフラと歩いておられるのですか?</system:String>
<system:String x:Key="Hangover">つ、次は飲みすぎないようにしないと……</system:String>
@@ -1449,10 +1471,10 @@ DEBUGディレクトリに保存される画像には数量制限があり、超
<system:String x:Key="EasterEggsRules" xml:space="preserve">1. MAA の正式版にはデバッグモードはありません。実行中にデバッグオプションが表示された場合は、すぐにソフトウェアを閉じ、それをクリックせず、最寄りの MAA 開発者に連絡してください。\n
2. インフラのシフト変更は自動です。{key=Operator}が 72 時間以上連続して働いている場合は、手動でシフトを調整し、システム時間が正しいか確認してください。\n
3. 公開募集のタグは変更されません。カウントダウンが終了する前にタグが変更された場合は、募集を続けず、MAA を再起動してから操作してください。\n
4. MAA はフレンドリクエストを送信しません。MAA_Systemからフレンドリクエストを受け取った場合は、承認せず、そのアカウントを削除してください。\n
4. MAA はフレンドリクエストを送信しません。MAA_Systemからフレンドリクエストを受け取った場合は、承認せず、そのアカウントを削除してください。\n
5. ローグライクの支援は提案のみを提供します。ゲームが存在しないオプションを自動的に選択した場合は、強制終了してクライアントを再起動してください。\n
6. MAA のログファイルに文字化けが含まれているべきではありません。ERROR: データ解析に失敗しました以外のエラー情報がログに表示された場合は、ログを削除してソフトウェアを再インストールしてください。\n
7. ナイトモードは安全です。ただし、MAA が午前 3 時 33 分に自動的に起動して不明なタスクを実行した場合は、電源を抜き、日の出まで待ってから使用してください。\n
6. MAA のログファイルに文字化けが含まれているべきではありません。ERROR: データ解析に失敗しました以外のエラー情報がログに表示された場合は、ログを削除してソフトウェアを再インストールしてください。\n
7. ナイトモードは安全です。ただし、MAA が午前 3 時 33 分に自動的に起動して不明なタスクを実行した場合は、電源を抜き、日の出まで待ってから使用してください。\n
8. 最後のルールは存在しません。このルールを見た場合は、それを忘れて、通常どおり MAA を使用してください。\n
9. MAA 内で炒...锟斤拷拷拷拷喜报拷拷拷饭 をクリックしないでください。\n
10. MirrorChyan親切です。少しの代償を払うだけで、彼女の保護を受けることができます。\n
@@ -1478,7 +1500,7 @@ DEBUGディレクトリに保存される画像には数量制限があり、超
<system:String x:Key="ApiUpdateFailed">ホットアップデートデータの取得に失敗しました</system:String>
<system:String x:Key="ApiCacheLoaded">ローカルキャッシュデータを使用しています</system:String>
<system:String x:Key="GameResourceUpdating">ゲームリソースが更新中です。</system:String>
<system:String x:Key="GameResourceUpdatingMirrorChyan">{key=MirrorChyan}からリソース {0} を更新しています...</system:String>
<system:String x:Key="GameResourceUpdatingMirrorChyan">{key=MirrorChyan}からリソース {0} を更新しています...</system:String>
<system:String x:Key="GameResourceUpdatePreparing">索引の作成中</system:String>
<system:String x:Key="GameResourceNotModified">ゲームリソースが更新されました。</system:String>
<system:String x:Key="GameResourceUpdated">ゲームリソースが更新されました。</system:String>
@@ -1527,9 +1549,9 @@ DEBUGディレクトリに保存される画像には数量制限があり、超
前提条件メインストーリーでRA-1をクリア済み
マップでRA-1を開き、右下に建設開始が表示されたらタスクを開始すると自動でループします
マップでRA-1を開き、右下に建設開始が表示されたらタスクを開始すると自動でループします
注意:初期追加携帯アイテムに関連するテクノロジーをアンロックしている場合、基地内で初期追加携帯アイテムの原因となる施設(食品供給所、飲料供給所、獣舎など)を解体してください
注意:初期追加携帯アイテムに関連するテクノロジーをアンロックしている場合、基地内で初期追加携帯アイテムの原因となる施設(食品供給所、飲料供給所、獣舎など)を解体してください
タスクの流れ:精耕細作、建設、資源納入、決済を自動実行
</system:String>
@@ -1540,15 +1562,15 @@ DEBUGディレクトリに保存される画像には数量制限があり、超
前提条件:
1. メインストーリーを進めてRA-4をクリア済みの状態にする
2. 計画経営をアンロックする
3. 自分でヴィシャデルを持っている場合、手動でステージを開いて一度編成を行う。ヴィシャデルよりもコストが低い任意の5人のオペレーターヴィシャデルとし、ヴィシャデルを6番目最後に選択する枠に配置する。その後、勧誘を確定し、今回の建設を中止して建設開始から開始する。
4. サポートのヴィシャデルを使用する場合、ヴィシャデルがスナイパーサポートのトップページに表示されていることを確認するフレンドを考慮。手動でステージを開き、ヴィシャデルよりもコストが低い任意の5人のオペレーターを編成し、6番目にサポートのヴィシャデルを選択して勧誘を確定する。その後、今回の建設を中止して建設開始から開始する先頭5枠にオペレーターがおり、6番目が空いていることを確認する
2. 計画経営をアンロックする
3. 自分でヴィシャデルを持っている場合、手動でステージを開いて一度編成を行う。ヴィシャデルよりもコストが低い任意の5人のオペレーターヴィシャデルとし、ヴィシャデルを6番目最後に選択する枠に配置する。その後、勧誘を確定し、今回の建設を中止して建設開始から開始する。
4. サポートのヴィシャデルを使用する場合、ヴィシャデルがスナイパーサポートのトップページに表示されていることを確認するフレンドを考慮。手動でステージを開き、ヴィシャデルよりもコストが低い任意の5人のオペレーターを編成し、6番目にサポートのヴィシャデルを選択して勧誘を確定する。その後、今回の建設を中止して建設開始から開始する先頭5枠にオペレーターがおり、6番目が空いていることを確認する
マップでRA-4を開き、右下に建設開始が表示されたらタスクを開始すると自動でループします
マップでRA-4を開き、右下に建設開始が表示されたらタスクを開始すると自動でループします
注意:初期追加携帯アイテムに関連するテクノロジーをアンロックしている場合、基地内で初期追加携帯アイテムの原因となる施設(食品供給所、飲料供給所、獣舎など)を解体してください
注意:初期追加携帯アイテムに関連するテクノロジーをアンロックしている場合、基地内で初期追加携帯アイテムの原因となる施設(食品供給所、飲料供給所、獣舎など)を解体してください
タスクの流れ:計画経営で得た赤金を使ってエリアを解放し、ヴィシャデルでボス討伐を完了する
タスクの流れ:計画経営で得た赤金を使ってエリアを解放し、ヴィシャデルでボス討伐を完了する
</system:String>
<system:String x:Key="ReclamationTipRelaunchAnchorRA15" xml:space="preserve">
報酬目安1回あたり約 500 トークン+統括ポイント、所要時間約 3 分
@@ -1560,9 +1582,9 @@ DEBUGディレクトリに保存される画像には数量制限があり、超
2. 聖聆初雪を所持している場合、手動で RA-15 を開いて一度編成する。先鋒5体育成不要聖聆初雪を最後に選択し、編成を保存してステージを退出する
3. サポートの聖聆初雪を使う場合、聖聆初雪が術師サポート一覧の先頭ページにいることを確認する(友達登録を推奨)
マップでRA-15を開き、右下に建設開始が表示されたらタスクを開始すると自動でループします
マップでRA-15を開き、右下に建設開始が表示されたらタスクを開始すると自動でループします
注意: 初期追加携帯アイテムに関連するテクノロジーをアンロックしている場合、基地内で初期追加携帯アイテムの原因となる施設(食品供給所、飲料供給所、獣舎など)を解体してください
注意: 初期追加携帯アイテムに関連するテクノロジーをアンロックしている場合、基地内で初期追加携帯アイテムの原因となる施設(食品供給所、飲料供給所、獣舎など)を解体してください
タスクの流れ: サポートオペレーターを使用して 60 キルミッションを自動実行
</system:String>
@@ -1571,7 +1593,7 @@ DEBUGディレクトリに保存される画像には数量制限があり、超
生息演算のサポートはまだ初期段階にありますので、ご利用の際は以下の点にご注意ください:
初期設定でポイントを稼ぐ:(既存のセーブデータが削除されることに注意してください)
0.ポイントがいっぱいになるとタスク完了が出力され、タスクは自動的に停止します
0.ポイントがいっぱいになるとタスク完了が出力され、タスクは自動的に停止します
1. 理論的には、タスクは、セーブデータの有無に関係なく、ポイント獲得のためのどの時点からでもタスクを開始できる。
2. 生息演算の編成に{key=Operator}を入れることができるが、テストしていないのでお勧めしない。
3. ナビゲーションがまだ書かれていないので、生息演算の画面以外の場所からタスクを開始することはできない。
@@ -1597,7 +1619,7 @@ MAA を新しい独立したフォルダーに解凍するか、MAA に属さな
• その他のシステム依存関係が不足している
まず、アーカイブが完全に解凍されているかご確認ください。
{key=Confirm}をクリックすると VC++ ランタイムのインストール/更新を試みて MAA を終了します(他の原因の場合は無効)。{key=Cancel}をクリックすると直接終了します。
{key=Confirm}をクリックすると VC++ ランタイムのインストール/更新を試みて MAA を終了します(他の原因の場合は無効)。{key=Cancel}をクリックすると直接終了します。
</system:String>
<system:String x:Key="MultiInstanceUnderSamePath" xml:space="preserve">同じパスの下で起動できるのは1つのインスタンスのみ
MAA を複数開くには、新しい MAA を他のフォルダにコピーし、異なる MAA、同じ adb、異なるシミュレータアドレスを使用して複数の操作を行うように設定します。
@@ -1648,7 +1670,7 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.SanitySpender3.Conditions">自動作戦を 1000 回達成する</system:String>
<system:String x:Key="Achievement.QuickCloser.Title">YOLO!</system:String>
<system:String x:Key="Achievement.QuickCloser.Description">私は自分がやっていることを知っている。――あるユーザーがクリックする前に。</system:String>
<system:String x:Key="Achievement.QuickCloser.Description">私は自分がやっていることを知っている。――あるユーザーがクリックする前に。</system:String>
<system:String x:Key="Achievement.QuickCloser.Conditions">1秒以内にポップアップを閉じるおそらく見ていなかったのでしょう</system:String>
<system:String x:Key="Achievement.TacticalRetreat.Title">臨陣脱逃</system:String>
@@ -1684,7 +1706,7 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.Martian.Conditions">リソースまたはバージョンの時間が3ヶ月以上経過している</system:String>
<system:String x:Key="Achievement.Martian.ConditionsTip">リソースまたはバージョンの時間が{0}ヶ月以上経過している</system:String>
<system:String x:Key="ConfigurationRecoveredNotification">対象の設定{0}が見つからないため、現在の設定から複製しました。すべての設定をご確認ください</system:String>
<system:String x:Key="ConfigurationRecoveredNotification">対象の設定{0}が見つからないため、現在の設定から複製しました。すべての設定をご確認ください</system:String>
<system:String x:Key="ConfigurationBrokenCaption">設定破損</system:String>
<system:String x:Key="Achievement.AnnouncementStubbornClick.Title">頑固者</system:String>
@@ -1721,11 +1743,11 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.SanityExpire.Title">もうすぐ期限切れ</system:String>
<system:String x:Key="Achievement.SanityExpire.Description">急いで!!!</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">{key=UseExpiringMedicine}を使用し、1回のタスクで 8 本以上の期限切れ理性回復剤を使用する</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">{key=UseExpiringMedicine}を使用し、1回のタスクで 8 本以上の期限切れ理性回復剤を使用する</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Title">限界を超える代理</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Description">大道を磨り減らすような代理タスクを実行しました。</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Conditions">1回の{key=Combat}タスクで 100 回以上自動作戦を行う。</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Conditions">1回の{key=Combat}タスクで 100 回以上自動作戦を行う。</system:String>
<system:String x:Key="Achievement.MirrorChyanFirstUse.Title">Mirror☆</system:String>
<system:String x:Key="Achievement.MirrorChyanFirstUse.Description">{key=MirrorChyan}です!これで私たちは助かります!</system:String>
@@ -1741,31 +1763,31 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.MapOutdated.Title">せっかち者</system:String>
<system:String x:Key="Achievement.MapOutdated.Description">急いでいることは分かっていますが、少しお待ちください。</system:String>
<system:String x:Key="Achievement.MapOutdated.Conditions">リソースを更新せずに{key=Copilot}を使用する</system:String>
<system:String x:Key="Achievement.MapOutdated.Conditions">リソースを更新せずに{key=Copilot}を使用する</system:String>
<system:String x:Key="Achievement.UseCopilot1.Title">課題をコピー</system:String>
<system:String x:Key="Achievement.UseCopilot1.Description">本当に放置してクリアしました。</system:String>
<system:String x:Key="Achievement.UseCopilot1.Conditions">{key=Copilot}機能で 1 回クリアする</system:String>
<system:String x:Key="Achievement.UseCopilot1.Conditions">{key=Copilot}機能で 1 回クリアする</system:String>
<system:String x:Key="Achievement.UseCopilot2.Title">ずっと放置</system:String>
<system:String x:Key="Achievement.UseCopilot2.Description">イベントを全部MAAに任せました。</system:String>
<system:String x:Key="Achievement.UseCopilot2.Conditions">{key=Copilot}機能で 10 回クリアする</system:String>
<system:String x:Key="Achievement.UseCopilot2.Conditions">{key=Copilot}機能で 10 回クリアする</system:String>
<system:String x:Key="Achievement.UseCopilot3.Title">次回の調査も非常に簡単</system:String>
<system:String x:Key="Achievement.UseCopilot3.Description">最後までボスの仕組みが分かりませんでした。</system:String>
<system:String x:Key="Achievement.UseCopilot3.Conditions">{key=Copilot}機能で 100 回クリアする</system:String>
<system:String x:Key="Achievement.UseCopilot3.Conditions">{key=Copilot}機能で 100 回クリアする</system:String>
<system:String x:Key="Achievement.RecruitNoSixStar.Title">玄学無効</system:String>
<system:String x:Key="Achievement.RecruitNoSixStar.Description">事はここまでです、まずは寝ましょう。</system:String>
<system:String x:Key="Achievement.RecruitNoSixStar.Conditions">{key=Recruiting}中に6星のタグが 500 回出なかった</system:String>
<system:String x:Key="Achievement.RecruitNoSixStar.Conditions">{key=Recruiting}中に6星のタグが 500 回出なかった</system:String>
<system:String x:Key="Achievement.RecruitNoSixStarStreak.Title">MAAがやったに違いない</system:String>
<system:String x:Key="Achievement.RecruitNoSixStarStreak.Description">乆乆乆乆乆乆乆乆乆乆!</system:String>
<system:String x:Key="Achievement.RecruitNoSixStarStreak.Conditions">{key=Recruiting}中に6星のタグが 500 回連続で出なかった</system:String>
<system:String x:Key="Achievement.RecruitNoSixStarStreak.Conditions">{key=Recruiting}中に6星のタグが 500 回連続で出なかった</system:String>
<system:String x:Key="Achievement.MosquitoLeg.Title">少しずつ積み上げていく</system:String>
<system:String x:Key="Achievement.MosquitoLeg.Description">あなたは少しずつ積み上げていくことの大切さを深く理解しています。</system:String>
<system:String x:Key="Achievement.MosquitoLeg.Conditions">{key=CreditFight}機能を5回以上使用する</system:String>
<system:String x:Key="Achievement.MosquitoLeg.Conditions">{key=CreditFight}機能を5回以上使用する</system:String>
<system:String x:Key="Achievement.Pioneer1.Title">テストパイオニア</system:String>
<system:String x:Key="Achievement.Pioneer1.Description">あなたはテスト中のバージョンを先行体験しました。</system:String>
@@ -1781,10 +1803,10 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.Irreplaceable.Title">替代不可</system:String>
<system:String x:Key="Achievement.Irreplaceable.Description">たぶん、別の作業を変更すべきですか?</system:String>
<system:String x:Key="Achievement.Irreplaceable.Conditions">{key=Copilot} - {key=AutoSquad}使用時、少なくとも2名の{key=Operator}が不足している。</system:String>
<system:String x:Key="Achievement.Irreplaceable.Conditions">{key=Copilot} - {key=AutoSquad}使用時、少なくとも2名の{key=Operator}が不足している。</system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Title">高遅延危機</system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Description">kale</system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Description">kale</system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Conditions">平均スクリーンショット時間が 800ms を超えている</system:String>
<system:String x:Key="Achievement.SnapshotChallenge2.Title">少し遅くないですか?</system:String>
@@ -1825,35 +1847,35 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.RoguelikeGamePass1.Title">初めて終点に到達</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass1.Description">その場所を……辿り着くできるならば……</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass1.Conditions">MAAで{key=AutoRoguelike}を 1 回クリアする</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass1.Conditions">MAAで{key=AutoRoguelike}を 1 回クリアする</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass2.Title">再び終点に到達</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass2.Description">この道はもう何度も通りました。</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass2.Conditions">MAAで{key=AutoRoguelike}を 5 回クリアする</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass2.Conditions">MAAで{key=AutoRoguelike}を 5 回クリアする</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass3.Title">終点常連</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass3.Description">目を閉じても歩けます。</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass3.Conditions">MAAで{key=AutoRoguelike}を 10 回クリアする</system:String>
<system:String x:Key="Achievement.RoguelikeGamePass3.Conditions">MAAで{key=AutoRoguelike}を 10 回クリアする</system:String>
<system:String x:Key="Achievement.RoguelikeRetreat.Title">失敗は成功の母である</system:String>
<system:String x:Key="Achievement.RoguelikeRetreat.Description">いつか成功の岸に到達するために、失敗は成功の階段です。</system:String>
<system:String x:Key="Achievement.RoguelikeRetreat.Conditions">MAAで{key=AutoRoguelike}を 100 回放棄する</system:String>
<system:String x:Key="Achievement.RoguelikeRetreat.Conditions">MAAで{key=AutoRoguelike}を 100 回放棄する</system:String>
<system:String x:Key="Achievement.RoguelikeGoldMax.Title">満杯した</system:String>
<system:String x:Key="Achievement.RoguelikeGoldMax.Description">カノット、あなたの店で一番高いものを出して!</system:String>
<system:String x:Key="Achievement.RoguelikeGoldMax.Conditions">ローグライクで、源石錐投資が999に到達する</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven1.Title">励ましの一言</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven1.Description">Likeは作者への最大の励ましです!</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven1.Conditions">作業に 1 回Likeを付ける</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven1.Description">Likeは作者への最大の励ましです!</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven1.Conditions">作業に 1 回Likeを付ける</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven2.Title">積極的な交流</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven2.Description">Likeを10回付けて、コミュニティに積極的に参加しています。</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven2.Conditions">作業に累計 10 回Likeを付ける</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven2.Description">Likeを10回付けて、コミュニティに積極的に参加しています。</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven2.Conditions">作業に累計 10 回Likeを付ける</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven3.Title">いいね達人</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven3.Description">Likeを50回付けたあなたは、すでにLikeの達人です!</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven3.Conditions">作業に累計 50 回Likeを付ける</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven3.Description">Likeを50回付けたあなたは、すでにLikeの達人です!</system:String>
<system:String x:Key="Achievement.CopilotLikeGiven3.Conditions">作業に累計 50 回Likeを付ける</system:String>
<system:String x:Key="Achievement.TaskStartCancel.Title">まさにジジジジジ</system:String>
<system:String x:Key="Achievement.TaskStartCancel.Description">ああ、合っている、合っていない、ああ、合っている、合っていない…</system:String>
@@ -1861,7 +1883,7 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.CopilotError.Title">あらら</system:String>
<system:String x:Key="Achievement.CopilotError.Description">事故が起きました…</system:String>
<system:String x:Key="Achievement.CopilotError.Conditions">{key=Copilot}中にエラーが発生</system:String>
<system:String x:Key="Achievement.CopilotError.Conditions">{key=Copilot}中にエラーが発生</system:String>
<system:String x:Key="Achievement.LongTaskTimeout.Title">長いタスク</system:String>
<system:String x:Key="Achievement.LongTaskTimeout.Description">少し待ってみませんか?</system:String>
@@ -1897,19 +1919,19 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.RoguelikeN04.Title">簡単なこと</system:String>
<system:String x:Key="Achievement.RoguelikeN04.Description">この難易度は私を困らせることはできない。</system:String>
<system:String x:Key="Achievement.RoguelikeN04.Conditions">{key=AutoRoguelike}で、任意のテーマで N4 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.RoguelikeN04.Conditions">{key=AutoRoguelike}で、任意のテーマで N4 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.RoguelikeN08.Title">困難に挑戦する</system:String>
<system:String x:Key="Achievement.RoguelikeN08.Description">困難を恐れない。</system:String>
<system:String x:Key="Achievement.RoguelikeN08.Conditions">{key=AutoRoguelike}で、任意のテーマで N8 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.RoguelikeN08.Conditions">{key=AutoRoguelike}で、任意のテーマで N8 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.RoguelikeN12.Title">人間を超越</system:String>
<system:String x:Key="Achievement.RoguelikeN12.Description">普通の人よりも上手くプレイしています。</system:String>
<system:String x:Key="Achievement.RoguelikeN12.Conditions">{key=AutoRoguelike}で、任意のテーマで N12 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.RoguelikeN12.Conditions">{key=AutoRoguelike}で、任意のテーマで N12 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.RoguelikeN15.Title">仙術杯選手</system:String>
<system:String x:Key="Achievement.RoguelikeN15.Description">本物の仙術だなあ。</system:String>
<system:String x:Key="Achievement.RoguelikeN15.Conditions">{key=AutoRoguelike}で、任意のテーマで N15 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.RoguelikeN15.Conditions">{key=AutoRoguelike}で、任意のテーマで N15 難易度以上をクリアする</system:String>
<system:String x:Key="Achievement.LogSupervisor.Title">スーパーバイザー</system:String>
<system:String x:Key="Achievement.LogSupervisor.Description">MAAのログを見つめていると、自動戦闘の成功率が上がるらしい。</system:String>
@@ -1969,7 +1991,7 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.WarehouseKeeper.Title">私は倉庫管理員!</system:String>
<system:String x:Key="Achievement.WarehouseKeeper.Description">MAAがMAAを見つけた</system:String>
<system:String x:Key="Achievement.WarehouseKeeper.Conditions">オペレーター認識にオペレーターパラスが含まれる</system:String>
<system:String x:Key="Achievement.WarehouseKeeper.Conditions">オペレーター認識にオペレーターパラスが含まれる</system:String>
<system:String x:Key="Achievement.NotFound404.Title">404</system:String>
<system:String x:Key="Achievement.NotFound404.Description">このタスクは見つからないようです。</system:String>
@@ -1993,31 +2015,31 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.PallasStarter.Title">パラス推し</system:String>
<system:String x:Key="Achievement.PallasStarter.Description">偉大なる戦士たちよ、私はあなたたちのそばにいて、ともに勇んで戦おう。</system:String>
<system:String x:Key="Achievement.PallasStarter.Conditions">ローグライクでパラスを{key=StartingCoreChar}にする</system:String>
<system:String x:Key="Achievement.PallasStarter.Conditions">ローグライクでパラスを{key=StartingCoreChar}にする</system:String>
<system:String x:Key="Achievement.PallasCheers.Title">パラスに一杯</system:String>
<system:String x:Key="Achievement.PallasCheers.Description">次はもう飲みすぎちゃだめだよ。。。</system:String>
<system:String x:Key="Achievement.PallasCheers.Conditions">{key=AchievementSettings}でパラスのアイコンをクリックする</system:String>
<system:String x:Key="Achievement.PallasCheers.Conditions">{key=AchievementSettings}でパラスのアイコンをクリックする</system:String>
<system:String x:Key="Achievement.SortingMaster.Title">並べ替えマスター</system:String>
<system:String x:Key="Achievement.SortingMaster.Description">これもドラッグできるの?</system:String>
<system:String x:Key="Achievement.SortingMaster.Conditions">マウスで{key=Farming}のタスクまたは設定項目の順序をドラッグして変更する</system:String>
<system:String x:Key="Achievement.SortingMaster.Conditions">マウスで{key=Farming}のタスクまたは設定項目の順序をドラッグして変更する</system:String>
<system:String x:Key="Achievement.TimeManagementMaster.Title">時間管理マスター</system:String>
<system:String x:Key="Achievement.TimeManagementMaster.Description">わずかな時間も無駄にしない。</system:String>
<system:String x:Key="Achievement.TimeManagementMaster.Conditions">{key=ScheduleSettings}のすべてのタイマーをチェックする</system:String>
<system:String x:Key="Achievement.TimeManagementMaster.Conditions">{key=ScheduleSettings}のすべてのタイマーをチェックする</system:String>
<system:String x:Key="Achievement.DoubleSync.Title">人も物もきっちり</system:String>
<system:String x:Key="Achievement.DoubleSync.Description">人員も把握して、物資も数え終えた。</system:String>
<system:String x:Key="Achievement.DoubleSync.Conditions">1回の{key=UserDataUpdate}でオペレーターと倉庫を同時に同期する</system:String>
<system:String x:Key="Achievement.DoubleSync.Conditions">1回の{key=UserDataUpdate}でオペレーターと倉庫を同時に同期する</system:String>
<system:String x:Key="Achievement.ResumeRecord.Title">記録再開</system:String>
<system:String x:Key="Achievement.ResumeRecord.Description">こんなに間が空いたけど、ようやく記録をつなげられた。</system:String>
<system:String x:Key="Achievement.ResumeRecord.Conditions">少なくとも7日間同期していない状態から、再び{key=UserDataUpdate}を1回完了する</system:String>
<system:String x:Key="Achievement.ResumeRecord.Conditions">少なくとも7日間同期していない状態から、再び{key=UserDataUpdate}を1回完了する</system:String>
<system:String x:Key="Achievement.ChangelogReader.Title">まず更新内容を確認</system:String>
<system:String x:Key="Achievement.ChangelogReader.Description">新バージョンは急いで入れなくてもいいが、何が変わったかは見ておきたい。</system:String>
<system:String x:Key="Achievement.ChangelogReader.Conditions">{key=ShowChangelog}を手動で1回開く</system:String>
<system:String x:Key="Achievement.ChangelogReader.Conditions">{key=ShowChangelog}を手動で1回開く</system:String>
<system:String x:Key="Achievement.LatestVersionInspector.Title">空振りチェッカー</system:String>
<system:String x:Key="Achievement.LatestVersionInspector.Description">空振りだったけど、少なくとも安心はできた。</system:String>
@@ -2033,31 +2055,31 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.AchievementObserver.Title">実績観測者</system:String>
<system:String x:Key="Achievement.AchievementObserver.Description">自分が何をしてきたか見てみよう。</system:String>
<system:String x:Key="Achievement.AchievementObserver.Conditions">{key=AchievementList}を1回開く</system:String>
<system:String x:Key="Achievement.AchievementObserver.Conditions">{key=AchievementList}を1回開く</system:String>
<system:String x:Key="Achievement.DisappearTrick.Title">消失トリック</system:String>
<system:String x:Key="Achievement.DisappearTrick.Description">見えなければ、気にもならない。</system:String>
<system:String x:Key="Achievement.DisappearTrick.Conditions">{key=MinimizeToTray}を有効にする</system:String>
<system:String x:Key="Achievement.DisappearTrick.Conditions">{key=MinimizeToTray}を有効にする</system:String>
<system:String x:Key="Achievement.TitleTweaker.Title">タイトルいじり</system:String>
<system:String x:Key="Achievement.TitleTweaker.Description">このタイトルは、自分の思いどおりにしたい。</system:String>
<system:String x:Key="Achievement.TitleTweaker.Conditions">{key=TitleBarDisplayContent}を1回変更する</system:String>
<system:String x:Key="Achievement.TitleTweaker.Conditions">{key=TitleBarDisplayContent}を1回変更する</system:String>
<system:String x:Key="Achievement.AllChannelBroadcast.Title">全チャンネル放送</system:String>
<system:String x:Key="Achievement.AllChannelBroadcast.Description">これでもう誰も見逃せない。</system:String>
<system:String x:Key="Achievement.AllChannelBroadcast.Conditions">{key=ExternalNotificationSettings}ですべてのプラットフォームを同時に有効にする</system:String>
<system:String x:Key="Achievement.AllChannelBroadcast.Conditions">{key=ExternalNotificationSettings}ですべてのプラットフォームを同時に有効にする</system:String>
<system:String x:Key="Achievement.BackstageExplorer.Title">バックヤード探検家</system:String>
<system:String x:Key="Achievement.BackstageExplorer.Description">裏で何が記録されているか見てみよう。</system:String>
<system:String x:Key="Achievement.BackstageExplorer.Conditions">{key=OpenDebugFolder}を1回使う</system:String>
<system:String x:Key="Achievement.BackstageExplorer.Conditions">{key=OpenDebugFolder}を1回使う</system:String>
<system:String x:Key="Achievement.ConnectionTester.Title">接続テスター</system:String>
<system:String x:Key="Achievement.ConnectionTester.Description">先に一度見ておかないと、どうも落ち着かない。</system:String>
<system:String x:Key="Achievement.ConnectionTester.Conditions">{key=ScreenshotTest}を1回成功させ、スクリーンショットを表示する</system:String>
<system:String x:Key="Achievement.ConnectionTester.Conditions">{key=ScreenshotTest}を1回成功させ、スクリーンショットを表示する</system:String>
<system:String x:Key="Achievement.OneMoreLook.Title">もう一度見る</system:String>
<system:String x:Key="Achievement.OneMoreLook.Description">せっかく見たんだから、もう1枚更新しよう。</system:String>
<system:String x:Key="Achievement.OneMoreLook.Conditions">{key=ScreenshotTest}のプレビュー画像でもう一度クリックして、スクリーンショットを更新する</system:String>
<system:String x:Key="Achievement.OneMoreLook.Conditions">{key=ScreenshotTest}のプレビュー画像でもう一度クリックして、スクリーンショットを更新する</system:String>
<system:String x:Key="Achievement.QueueExpansion.Title">隊列拡張</system:String>
<system:String x:Key="Achievement.QueueExpansion.Description">まずはフローを組み上げよう。</system:String>
@@ -2073,7 +2095,7 @@ MAA を複数開くには、新しい MAA を他のフォルダにコピーし
<system:String x:Key="Achievement.PrivateDormManager.Title">プライベート宿舎管理人</system:String>
<system:String x:Key="Achievement.PrivateDormManager.Description">シフト表はもちろん自分のものを使う。</system:String>
<system:String x:Key="Achievement.PrivateDormManager.Conditions">{key=InfrastModeCustom}を1回正常に読み込む</system:String>
<system:String x:Key="Achievement.PrivateDormManager.Conditions">{key=InfrastModeCustom}を1回正常に読み込む</system:String>
<system:String x:Key="Achievement.OperatorRoster.Title">名簿</system:String>
<system:String x:Key="Achievement.OperatorRoster.Description">この一覧、先に1部保存しておこう。</system:String>

View File

@@ -24,6 +24,12 @@
<system:String x:Key="BackgroundImageStretchModeFill">늘려 채움</system:String>
<system:String x:Key="BackgroundImageStretchModeUniform">비율 유지 (맞춤)</system:String>
<system:String x:Key="BackgroundImageStretchModeUniformToFill">비율 유지 (자르기)</system:String>
<system:String x:Key="BackgroundMonet">모네 색상</system:String>
<system:String x:Key="BackgroundMonetMode">색상 모드</system:String>
<system:String x:Key="BackgroundMonetAuto">자동 추출</system:String>
<system:String x:Key="BackgroundMonetCustom">사용자 지정 색상</system:String>
<system:String x:Key="BackgroundMonetSelectColor">색상 선택</system:String>
<system:String x:Key="BackgroundMonetAutoTip">배경 이미지에서 주요 색상을 추출하여 테마 색상을 생성합니다</system:String>
<system:String x:Key="HotKeySettings">단축키 설정</system:String>
<system:String x:Key="UpdateSettings">업데이트</system:String>
<system:String x:Key="AchievementSettings">도전과제</system:String>
@@ -348,8 +354,20 @@
<system:String x:Key="UpdateAutoCheck">일정 시간마다 업데이트 확인</system:String>
<system:String x:Key="UpdateAutoCheckTip">게임 내 00:00 / 18:00 (서버 현지 시간 04:00 / 22:00)</system:String>
<system:String x:Key="UpdateAutoDownload">업데이트 자동 다운로드</system:String>
<system:String x:Key="UpdateAutoDownloadTip" xml:space="preserve">체크 해제 시, 업데이트 감지 시(수동으로 「{key=UpdateCheckNow}」 실행 포함)자동 다운로드가 중지되고 다운로드 링크가 포함된 시스템 알림만 표시됩니다. 링크에서 업데이트 패키지를 직접 다운로드한 후 MAA에 끌어다 놓아 수동으로 업데이트할 수 있습니다.
시스템 알림이 꺼져 있는 경우 앱 내 알림으로 전환되지만, 앱 내 알림에는 조작 가능한 다운로드 버튼이 제공되지 않습니다.</system:String>
<system:String x:Key="AutoInstallUpdatePackage">업데이트 패키지 자동 설치</system:String>
<system:String x:Key="ShowUpdaterConsole">업데이트 중 MAA.Updater 콘솔 출력 표시</system:String>
<system:String x:Key="ShowUpdaterConsole">업데이트 중 업데이터 콘솔 출력 표시</system:String>
<system:String x:Key="ShowUpdaterProgress">업데이터 진행 창 표시</system:String>
<system:String x:Key="ShowUpdaterProgressTip" xml:space="preserve">업데이트 시 업데이터가 별도의 진행 창을 표시하여 현재 상태와 파일 처리 진행률을 보여줍니다.
끄면 업데이트 진행 상황을 직관적으로 확인할 수 없습니다. 업데이트 중에는 MAA를 다시 실행하지 마세요. 업데이트가 중단되거나 파일이 손상될 수 있습니다.</system:String>
<system:String x:Key="ShowUpdaterProgressWarning" xml:space="preserve">업데이트 진행 창을 끄면 업데이트 중에 진행 상황이 표시되지 않습니다.
주의 사항:
1. 업데이트 중에는 MAA를 다시 실행하지 마세요. 파일 점유로 인해 업데이트가 실패하거나 파일이 손상될 수 있습니다.
2. 진행 창과 콘솔 출력을 모두 끄면 업데이트 중에 UI 피드백이 전혀 표시되지 않아 중단 또는 실패 여부를 판단하기 어렵습니다.
업데이트 진행 창을 끄시겠습니까?</system:String>
<system:String x:Key="UpdateCheckStable">안정 버전</system:String>
<system:String x:Key="UpdateCheckBeta">베타 버전</system:String>
<system:String x:Key="UpdateCheckNightly">개발 버전</system:String>
@@ -703,6 +721,7 @@ C:\\Program Files\\Netease\\MuMuPlayer으로 입력해야 합니다.\n
<system:String x:Key="MuMu12Index">인스턴스 번호</system:String>
<system:String x:Key="MuMu12Display">표시 번호</system:String>
<system:String x:Key="MuMuExtrasNotEnabledMessage">MuMu 스크린샷 강화 기능이 활성화되지 않았습니다. 관련 설정을 확인하세요</system:String>
<system:String x:Key="MuMuEmulator12KeepAliveOn">MuMu 에뮬레이터 백그라운드 유지가 활성화되어 있습니다. 스크린샷 실패 및 작동 오류가 발생할 수 있습니다. MuMu 설정에서 "백그라운드 유지"(또는 "앱 유지" 등)를 비활성화하세요</system:String>
<system:String x:Key="LdExtrasEnabled">LD 스크린샷 강화 기능 활성화</system:String>
<system:String x:Key="LdPlayerEmulatorPathNotFound">LDPlayer 에뮬레이터 경로를 찾을 수 없습니다.</system:String>
<system:String x:Key="LdPlayerOpenglMissing">선택한 LDPlayer 경로에서 ldopengl64.dll을 찾을 수 없습니다. 설치 디렉터리를 확인하세요.</system:String>
@@ -1024,7 +1043,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="MiniGame@SecretFront@Event2">레인저</system:String>
<system:String x:Key="MiniGame@SecretFront@Event3">수상한 그림자</system:String>
<system:String x:Key="MiniGame@SecretFront">비밀 전선</system:String>
<system:String x:Key="MiniGame@SecretFrontTip">소대 선택 화면에서 시작합니다. 기존 세이브 데이터가 있으면 수동으로 삭제해야 합니다.\n게임 내 이전 소대의 데이터 전승받기 옵션을 체크하는 것을 권장합니다.</system:String>
<system:String x:Key="MiniGame@SecretFrontTip">소대 선택 화면에서 시작합니다. 기존 세이브 데이터가 있으면 수동으로 삭제해야 합니다.\n게임 내 이전 소대의 데이터 전승받기 옵션을 체크하는 것을 권장합니다.</system:String>
<system:String x:Key="MiniGameNameGreenTicketStore">자격증명서 상점</system:String>
<system:String x:Key="MiniGameNameGreenTicketStoreTip" xml:space="preserve">1단계는 전부 구매하고&#10;2단계는 헤드헌팅 허가증과 모집 허가증을 구매해요</system:String>
<system:String x:Key="MiniGameNameYellowTicketStore">고급증명서 상점</system:String>
@@ -1149,7 +1168,7 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="CopilotTaskTypeMismatch">선택한 작업이 현재 탭과 일치하지 않습니다</system:String>
<system:String x:Key="CopilotTasksWithEmptyName">스테이지 이름이 비어 있는 작업이 있습니다</system:String>
<system:String x:Key="CopilotCouldNotSaveFile" xml:space="preserve">부조종사 작업을 파일에 저장할 수 없습니다.: </system:String>
<system:String x:Key="CopilotStartWithEmptyList">작업 없이 「{key=UseCopilotList}를 사용 중입니다.</system:String>
<system:String x:Key="CopilotStartWithEmptyList">작업 없이 「{key=UseCopilotList}를 사용 중입니다.</system:String>
<system:String x:Key="CopilotSingleTaskWarning">「{key=UseCopilotList}」를 사용하여 단일 작업을 실행하는 것은 권장되지 않습니다. 단일 작업은 직접 실행해 주세요.</system:String>
<system:String x:Key="CopilotTaskListMixedModeNotAllowed">현재 「{key=UseCopilotList}」를 사용 중입니다. 서로 다른 작업 유형을 혼합하는 것은 지원되지 않습니다.</system:String>
<system:String x:Key="CopilotTaskTypeParseFailedSkipCheck">일부 작업 유형을 해석하지 못했습니다. 유형 검사를 건너뜁니다.</system:String>
@@ -1173,8 +1192,8 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="ErrorFeedbackLinkText">GitHub에 issue 생성</system:String>
<system:String x:Key="ErrorQqGroupLinkText">QQ 그룹 가입</system:String>
<system:String x:Key="ErrorCrashMessageHeader">위 문제로 인해 프로그램이 비정상 종료되었습니다.</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}로 로그를 확인하고 오류가 발생한 구체적인 원인을 확인할 수 있습니다.</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}을 사용하여 오류 보고서를 생성한 후, 파란색 「{key=Issue}」 링크를 클릭하여 피드백을 제출해 주세요.</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}로 로그를 확인하고 오류가 발생한 구체적인 원인을 확인할 수 있습니다.</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}을 사용하여 오류 보고서를 생성한 후, 파란색 「{key=Issue}」 링크를 클릭하여 피드백을 제출해 주세요.</system:String>
<system:String x:Key="ErrorCrashMessageHelpTip">다른 사람에게 도움을 요청할 경우, 이 창의 스크린샷, 화면 녹화, 화면 사진, 촬영한 영상, 손그림, 옮겨 적은 내용이 아니라 생성된 오류 보고서 파일을 보내 주세요.</system:String>
<system:String x:Key="ErrorCrashDialogTitle">마지막 충돌 원인</system:String>
<system:String x:Key="CopyErrorMessage">오류 메시지 복사</system:String>
@@ -1204,6 +1223,9 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="FastestWayToScreencap">스크린샷 캡처 속도: {0}ms ({1})</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">스크린샷 캡처 속도가 느려서 (평균: {0}ms) Copilot 기능에서 일부 비정상적인 동작이 발생할 수 있습니다. MuMu 또는 LDPlayer를 사용하는 경우 스크린샷 향상 기능을 활성화해 보세요.</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">스크린샷 캡처 속도가 너무 느려서 (평균: {0}ms) Copliot 기능이 제대로 실행되지 않을 수 있습니다. 에뮬레이터를 재시작하거나 변경하는 것을 권장합니다! MuMu 또는 LDPlayer를 사용하는 경우 스크린샷 향상 기능을 활성화해 보세요.</system:String>
<system:String x:Key="EmulatorFpsWarningTip">에뮬레이터 설정 주사율이 {0} FPS로 게임의 기본 프레임 속도(60 FPS)보다 낮습니다. 백그라운드 프레임 저하가 활성화되어 있거나 주사율이 너무 낮게 설정되어 있을 수 있습니다. 에뮬레이터 프레임 속도를 60 FPS로 설정하는 것을 권장합니다</system:String>
<system:String x:Key="EmulatorFpsErrorTip">에뮬레이터 설정 주사율이 너무 낮습니다 ({0} FPS). 작업에 문제가 발생할 수 있습니다. 에뮬레이터 설정에서 백그라운드 프레임 저하를 끄고 프레임 속도를 60 FPS로 설정해 주세요</system:String>
<system:String x:Key="EmulatorFpsHighTip">에뮬레이터 설정 주사율이 {0} FPS로 게임의 기본 프레임 속도 상한(60 FPS)을 초과합니다. 이는 에뮬레이터의 프레임 보간 기능일 수 있으며, 화면 왜곡이나 인식 불안정을 유발할 수 있습니다. 프레임 보간을 비활성화하고 프레임 속도를 60 FPS로 설정하는 것을 권장합니다</system:String>
<system:String x:Key="IdentifyTheMistakes">인식 오류</system:String>
<system:String x:Key="TaskError" xml:space="preserve">작업 오류: </system:String>
<system:String x:Key="CombatError">작전 오류</system:String>
@@ -1721,7 +1743,7 @@ MAA를 독립된 새 폴더에 압축 해제하거나, MAA에 속하지 않는 D
<system:String x:Key="Achievement.SanityExpire.Title">배신자!</system:String>
<system:String x:Key="Achievement.SanityExpire.Description">유통기한이 다 될 때까지 뭐 하셨어요? 너무해요!</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">{key=UseExpiringMedicine} 기능으로 한 번에 8개 이상의 이성 회복제 사용</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">{key=UseExpiringMedicine} 기능으로 한 번에 8개 이상의 이성 회복제 사용</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Title">스테이지 파괴자</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Description">이제 여기는 눈감고도 돌 수 있겠어요</system:String>

View File

@@ -23,6 +23,12 @@
<system:String x:Key="BackgroundImageStretchModeFill">拉伸填充</system:String>
<system:String x:Key="BackgroundImageStretchModeUniform">等比适应</system:String>
<system:String x:Key="BackgroundImageStretchModeUniformToFill">等比填充(裁剪)</system:String>
<system:String x:Key="BackgroundMonet">莫奈取色</system:String>
<system:String x:Key="BackgroundMonetMode">取色模式</system:String>
<system:String x:Key="BackgroundMonetAuto">自动取色</system:String>
<system:String x:Key="BackgroundMonetCustom">自定义颜色</system:String>
<system:String x:Key="BackgroundMonetSelectColor">选择颜色</system:String>
<system:String x:Key="BackgroundMonetAutoTip">将从背景图自动提取主色生成主题配色</system:String>
<system:String x:Key="UiTheme">界面主题</system:String>
<system:String x:Key="HotKeySettings">热键设置</system:String>
<system:String x:Key="UpdateSettings">更新设置</system:String>
@@ -117,15 +123,15 @@
↓ 右键齿轮显示更多操作</system:String>
<system:String x:Key="UserGuide">使用指引</system:String>
<system:String x:Key="GuideDocumentationTitle">📖 官网与文档</system:String>
<system:String x:Key="GuideDocumentationPath">您可以在{key=Settings} - {key=AboutUs} - {key=Website}找到 MAA 的官方网站和完整文档。</system:String>
<system:String x:Key="GuideDocumentationPath">您可以在{key=Settings} - {key=AboutUs} - {key=Website}找到 MAA 的官方网站和完整文档。</system:String>
<system:String x:Key="GuideIssueReportSubtitle">🔧 遇到问题时</system:String>
<system:String x:Key="GuideViewLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日志,了解错误发生的具体原因。</system:String>
<system:String x:Key="GuideGenerateReport">请使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}生成错误报告,并点击蓝色的{key=Issue}链接提交反馈。</system:String>
<system:String x:Key="GuideViewLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日志,了解错误发生的具体原因。</system:String>
<system:String x:Key="GuideGenerateReport">请使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}生成错误报告,并点击蓝色的{key=Issue}链接提交反馈。</system:String>
<system:String x:Key="GuideGitHubIssueTitle">⚠️ 反馈规范</system:String>
<system:String x:Key="GuideGitHubIssueDescription">MAA Team 仅受理用户通过 GitHub 平台依照 Issue 模板规范提交的反馈,并保留对所有反馈的处理决定权。</system:String>
<system:String x:Key="GuideOpenSourceTitle">💡 参与开源</system:String>
<system:String x:Key="GuideOpenSourceDescription">作为开源项目,用户可依据 AGPL-3.0 许可证在 GitHub 平台参与 MAA 的开发。MAA Team 鼓励用户通过更有价值的代码贡献代替问题反馈。</system:String>
<system:String x:Key="GuideUserAgreement">使用 MAA 即表示您同意遵守用户协议,完整协议内容可在官网底部的链接中查看。</system:String>
<system:String x:Key="GuideUserAgreement">使用 MAA 即表示您同意遵守用户协议,完整协议内容可在官网底部的链接中查看。</system:String>
<system:String x:Key="RestartGuide">重看设置指引</system:String>
<system:String x:Key="RestartGuidePrompt">设置指引将在主界面显示,是否立即重启应用?</system:String>
<!-- !设置指引 -->
@@ -163,9 +169,9 @@
<system:String x:Key="InfrastModeNormal">常规模式</system:String>
<system:String x:Key="InfrastModeRotation">队列轮换</system:String>
<system:String x:Key="InfrastModeRotationTip">使用队列轮换需提前在游戏中设置好队列</system:String>
<system:String x:Key="InfrastModeRotationToolTip" xml:space="preserve">「{key=InfrastModeRotation}」 的换班逻辑与游戏内基建右下角的{key=InfrastModeRotation}完全一致:
<system:String x:Key="InfrastModeRotationToolTip" xml:space="preserve">「{key=InfrastModeRotation}」 的换班逻辑与游戏内基建右下角的{key=InfrastModeRotation}完全一致:
当当前班次中任意干员心情值为 0 时,会整队替换为下一班干员。
若需自定义轮换班次,请使用{key=InfrastModeCustom}。</system:String>
若需自定义轮换班次,请使用{key=InfrastModeCustom}。</system:String>
<system:String x:Key="InfrastModeCustom">自定义基建配置</system:String>
<system:String x:Key="DefaultInfrast">内置配置</system:String>
<system:String x:Key="UserDefined">自定义</system:String>
@@ -348,8 +354,20 @@
<system:String x:Key="UpdateAutoCheck">定时检查更新</system:String>
<system:String x:Key="UpdateAutoCheckTip">游戏内 00:00 / 18:00对应服务器当地时间 04:00 / 22:00</system:String>
<system:String x:Key="UpdateAutoDownload">自动下载更新包</system:String>
<system:String x:Key="UpdateAutoDownloadTip" xml:space="preserve">取消勾选后,检测到新版本时(包括手动触发 「{key=UpdateCheckNow}」)将不再自动下载,仅通过系统通知提示并附带下载链接,可自行下载更新包后拖入 MAA 完成更新。
若系统通知已关闭,则改为软件内通知,但软件内通知不提供可交互的下载按钮。</system:String>
<system:String x:Key="AutoInstallUpdatePackage">自动安装更新包</system:String>
<system:String x:Key="ShowUpdaterConsole">显示 MAA.Updater 控制台输出</system:String>
<system:String x:Key="ShowUpdaterConsole">显示更新程序控制台输出</system:String>
<system:String x:Key="ShowUpdaterProgress">显示更新程序进度窗口</system:String>
<system:String x:Key="ShowUpdaterProgressTip" xml:space="preserve">更新时由更新程序显示一个独立的进度窗口,展示当前更新状态与文件处理进度。
关闭后将无法直观看到更新进展,更新过程中也不要重复启动 MAA否则可能导致更新中断或文件损坏。</system:String>
<system:String x:Key="ShowUpdaterProgressWarning" xml:space="preserve">关闭更新进度窗口后,更新过程中将不再显示进度提示。
请注意:
1. 更新期间请勿重复启动 MAA否则可能因文件占用导致更新失败或文件损坏。
2. 若同时关闭了进度窗口和控制台输出,更新过程将完全无界面提示,难以判断是否卡住或失败。
确定要关闭更新进度窗口吗?</system:String>
<system:String x:Key="UpdateCheckStable">正式版</system:String>
<system:String x:Key="UpdateCheckBeta">公测版</system:String>
<system:String x:Key="UpdateCheckNightly">内测版</system:String>
@@ -389,7 +407,7 @@
📄 更新说明:
• {key=UpdateCheckNow}:包含界面与功能更新。界面改动、新功能需通过{key=UpdateCheckNow}获得
• {key=ResourceUpdate}:包含自动战斗新关卡、掉落识别图标、公招干员标签等素材数据
• 导航热更:自动触发,用于更新主界面提示与活动关卡入口。成功后右上角会显示{key=ApiUpdateSuccess}
• 导航热更:自动触发,用于更新主界面提示与活动关卡入口。成功后右上角会显示{key=ApiUpdateSuccess}
</system:String>
<system:String x:Key="GlobalSource">海外源</system:String>
<system:String x:Key="ForceGithubGlobalSource">强制使用 GitHub</system:String>
@@ -703,6 +721,7 @@ C:\\Program Files\\Netease\\MuMuPlayer。\n
<system:String x:Key="MuMu12Index">实例编号</system:String>
<system:String x:Key="MuMu12Display">屏幕编号</system:String>
<system:String x:Key="MuMuExtrasNotEnabledMessage">Mumu 截图增强未生效,请检查相关设置</system:String>
<system:String x:Key="MuMuEmulator12KeepAliveOn">检测到 MuMu 模拟器开启了后台保活,可能导致截图失败和操作异常,请在 MuMu 设置中关闭 「后台保活」(或 「应用保活」 「后台挂机时保活运行」 等)</system:String>
<system:String x:Key="LdExtrasEnabled">启用 LD 截图增强模式</system:String>
<system:String x:Key="LdPlayerEmulatorPathNotFound">未找到 LDPlayer 模拟器路径。</system:String>
<system:String x:Key="LdPlayerOpenglMissing">在所选 LDPlayer 路径中未找到 ldopengl64.dll请确认安装目录。</system:String>
@@ -832,7 +851,7 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="DaysLeftOpen" xml:space="preserve">剩余天数: </system:String>
<system:String x:Key="Inventory">库存</system:String>
<system:String x:Key="InventoryUpdateTip">可通过 「{key=Toolbox}-{key=DepotRecognition}」 更新库存数据</system:String>
<system:String x:Key="SpecifiedDropsInventoryUnavailable">任务{0}启用了 {key=TargetInventory},但当前没有可用的库存数据,已跳过。可通过 「{key=Toolbox}-{key=DepotRecognition}」 更新库存。</system:String>
<system:String x:Key="SpecifiedDropsInventoryUnavailable">任务{0}启用了 {key=TargetInventory},但当前没有可用的库存数据,已跳过。可通过 「{key=Toolbox}-{key=DepotRecognition}」 更新库存。</system:String>
<system:String x:Key="LessThanOneDay">不到 1 天</system:String>
<system:String x:Key="1-7">1-7</system:String>
<system:String x:Key="CE-6">龙门币-6/5</system:String>
@@ -1172,8 +1191,8 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="ErrorFeedbackLinkText">创建 GitHub issue</system:String>
<system:String x:Key="ErrorQqGroupLinkText">加入 QQ 群</system:String>
<system:String x:Key="ErrorCrashMessageHeader">以上问题导致程序异常退出。</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日志,了解错误发生的具体原因。</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">请使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}生成错误报告,并点击蓝色的 「{key=Issue}」 链接提交反馈。</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日志,了解错误发生的具体原因。</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">请使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}生成错误报告,并点击蓝色的 「{key=Issue}」 链接提交反馈。</system:String>
<system:String x:Key="ErrorCrashMessageHelpTip">如果向他人寻求帮助,请发送生成的错误报告文件,而不是发送此窗口的截图、录屏视频、屏幕照片、拍摄的视频、手绘图片或誊抄的画面内容。</system:String>
<system:String x:Key="ErrorCrashDialogTitle">上次程序崩溃原因</system:String>
<system:String x:Key="CopyErrorMessage">复制错误信息</system:String>
@@ -1203,6 +1222,9 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="FastestWayToScreencap">最快截图耗时: {0}ms ({1})</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">截图用时较长(平均: {0}ms),自动战斗类功能(如自动肉鸽)可能表现异常。如使用 MuMu、雷电模拟器请尝试开启截图增强</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">截图用时过长(平均: {0}ms),自动战斗类功能(如自动肉鸽)很可能无法正常运行,建议尝试重启或更换模拟器!如使用 MuMu、雷电模拟器请尝试开启截图增强</system:String>
<system:String x:Key="EmulatorFpsWarningTip">检测到模拟器设置帧率为 {0} FPS低于游戏原生帧率60 FPS可能开启了后台降帧或帧率设置过低建议将模拟器帧率设置为 60 FPS</system:String>
<system:String x:Key="EmulatorFpsErrorTip">检测到模拟器设置帧率过低({0} FPS可能导致任务异常请关闭模拟器后台降帧并将帧率设置为 60 FPS</system:String>
<system:String x:Key="EmulatorFpsHighTip">检测到模拟器设置帧率为 {0} FPS高于游戏原生帧率上限60 FPS可能是模拟器插帧功能可能导致画面异常或识别不稳定建议关闭插帧并将帧率设置为 60 FPS</system:String>
<system:String x:Key="IdentifyTheMistakes">识别错误</system:String>
<system:String x:Key="TaskError" xml:space="preserve">任务出错: </system:String>
<system:String x:Key="CombatError">战斗出错</system:String>
@@ -1721,7 +1743,7 @@ DEBUG 目录下保存的图片有数量限制,超出后会自动清理旧图
<system:String x:Key="Achievement.SanityExpire.Title">要过期了</system:String>
<system:String x:Key="Achievement.SanityExpire.Description">赶紧冲哇!!!</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">使用{key=UseExpiringMedicine},单次任务使用 8 瓶及以上临期理智药</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">使用{key=UseExpiringMedicine},单次任务使用 8 瓶及以上临期理智药</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Title">超限代理</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Description">你进行了一次能将大道磨灭的代理任务。</system:String>

View File

@@ -23,6 +23,12 @@
<system:String x:Key="BackgroundImageStretchModeFill">非等比例填滿</system:String>
<system:String x:Key="BackgroundImageStretchModeUniform">等比例縮放</system:String>
<system:String x:Key="BackgroundImageStretchModeUniformToFill">等比例填滿(裁剪)</system:String>
<system:String x:Key="BackgroundMonet">莫奈取色</system:String>
<system:String x:Key="BackgroundMonetMode">取色模式</system:String>
<system:String x:Key="BackgroundMonetAuto">自動取色</system:String>
<system:String x:Key="BackgroundMonetCustom">自訂顏色</system:String>
<system:String x:Key="BackgroundMonetSelectColor">選擇顏色</system:String>
<system:String x:Key="BackgroundMonetAutoTip">將從背景圖自動提取主色產生主題配色</system:String>
<system:String x:Key="UiTheme">介面主題</system:String>
<system:String x:Key="HotKeySettings">熱鍵設定</system:String>
<system:String x:Key="UpdateSettings">更新設定</system:String>
@@ -117,15 +123,15 @@
↓ 右鍵齒輪顯示更多操作</system:String>
<system:String x:Key="UserGuide">使用指引</system:String>
<system:String x:Key="GuideDocumentationTitle">📖 官網與文件</system:String>
<system:String x:Key="GuideDocumentationPath">您可以在{key=Settings} - {key=AboutUs} - {key=Website}找到 MAA 的官方網站和完整文件。</system:String>
<system:String x:Key="GuideDocumentationPath">您可以在{key=Settings} - {key=AboutUs} - {key=Website}找到 MAA 的官方網站和完整文件。</system:String>
<system:String x:Key="GuideIssueReportSubtitle">🔧 遇到問題時</system:String>
<system:String x:Key="GuideViewLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日誌,了解錯誤發生的具體原因。</system:String>
<system:String x:Key="GuideGenerateReport">請使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}生成錯誤報告,並點擊藍色的{key=Issue}連結提交回饋。</system:String>
<system:String x:Key="GuideViewLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日誌,了解錯誤發生的具體原因。</system:String>
<system:String x:Key="GuideGenerateReport">請使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}生成錯誤報告,並點擊藍色的{key=Issue}連結提交回饋。</system:String>
<system:String x:Key="GuideGitHubIssueTitle">⚠️ 回饋規範</system:String>
<system:String x:Key="GuideGitHubIssueDescription">MAA Team 僅受理使用者透過 GitHub 平台依照 Issue 範本規範提交的回饋,並保留對所有回饋的處理決定權。</system:String>
<system:String x:Key="GuideOpenSourceTitle">💡 參與開源</system:String>
<system:String x:Key="GuideOpenSourceDescription">作為開源專案,使用者可依據 AGPL-3.0 許可證在 GitHub 平台參與 MAA 的開發。MAA Team 鼓勵使用者透過更有價值的程式碼貢獻代替問題回饋。</system:String>
<system:String x:Key="GuideUserAgreement">使用 MAA 即表示您同意遵守用戶協議,完整協議內容可在官網底部的連結中查看。</system:String>
<system:String x:Key="GuideUserAgreement">使用 MAA 即表示您同意遵守用戶協議,完整協議內容可在官網底部的連結中查看。</system:String>
<system:String x:Key="RestartGuide">重看設定指引</system:String>
<system:String x:Key="RestartGuidePrompt">設定指引將在主介面顯示,是否立即重啟應用程式?</system:String>
<!-- !設定指引 -->
@@ -163,9 +169,9 @@
<system:String x:Key="InfrastModeNormal">一般模式</system:String>
<system:String x:Key="InfrastModeRotation">隊列輪換</system:String>
<system:String x:Key="InfrastModeRotationTip">使用隊列輪換需提前在遊戲中設定好隊列</system:String>
<system:String x:Key="InfrastModeRotationToolTip" xml:space="preserve">{key=InfrastModeRotation}的換班邏輯與遊戲內基建右下角的{key=InfrastModeRotation}完全一致:
<system:String x:Key="InfrastModeRotationToolTip" xml:space="preserve">{key=InfrastModeRotation}的換班邏輯與遊戲內基建右下角的{key=InfrastModeRotation}完全一致:
當目前班次中任意幹員心情值為 0 時,會整隊替換為下一班幹員。
若需自定義輪換班次,請使用{key=InfrastModeCustom}。</system:String>
若需自定義輪換班次,請使用{key=InfrastModeCustom}。</system:String>
<system:String x:Key="InfrastModeCustom">自定義基建配置</system:String>
<system:String x:Key="DefaultInfrast">內建配置</system:String>
<system:String x:Key="UserDefined">自定義</system:String>
@@ -348,8 +354,20 @@
<system:String x:Key="UpdateAutoCheck">定時檢查更新</system:String>
<system:String x:Key="UpdateAutoCheckTip">遊戲內 00:00 / 18:00對應伺服器當地時間 04:00 / 22:00</system:String>
<system:String x:Key="UpdateAutoDownload">自動下載更新檔</system:String>
<system:String x:Key="UpdateAutoDownloadTip" xml:space="preserve">取消勾選後,偵測到新版本時(包含手動觸發 「{key=UpdateCheckNow}」)將不再自動下載,僅透過系統通知提示並附上下載連結,可自行下載更新檔後拖入 MAA 完成更新。
若系統通知已關閉,則改為軟體內通知,但軟體內通知不提供可互動的下載按鈕。</system:String>
<system:String x:Key="AutoInstallUpdatePackage">自動安裝更新檔</system:String>
<system:String x:Key="ShowUpdaterConsole">顯示 MAA.Updater 主控台輸出</system:String>
<system:String x:Key="ShowUpdaterConsole">顯示更新程式主控台輸出</system:String>
<system:String x:Key="ShowUpdaterProgress">顯示更新程式進度視窗</system:String>
<system:String x:Key="ShowUpdaterProgressTip" xml:space="preserve">更新時由更新程式顯示一個獨立的進度視窗,展示目前更新狀態與檔案處理進度。
關閉後將無法直觀看到更新進展,更新過程中也不要重複啟動 MAA否則可能導致更新中斷或檔案損壞。</system:String>
<system:String x:Key="ShowUpdaterProgressWarning" xml:space="preserve">關閉更新進度視窗後,更新過程中將不再顯示進度提示。
請注意:
1. 更新期間請勿重複啟動 MAA否則可能因檔案佔用導致更新失敗或檔案損壞。
2. 若同時關閉了進度視窗和主控台輸出,更新過程將完全無介面提示,難以判斷是否卡住或失敗。
確定要關閉更新進度視窗嗎?</system:String>
<system:String x:Key="UpdateCheckStable">穩定版</system:String>
<system:String x:Key="UpdateCheckBeta">公測版</system:String>
<system:String x:Key="UpdateCheckNightly">內測版</system:String>
@@ -376,7 +394,7 @@
<system:String x:Key="UpdateSourceTip" xml:space="preserve">
🌏 使用 {key=GlobalSource}
• {key=UpdateCheckNow}:由 MAA Team 提供更新偵測,從 GitHub 下載更新壓縮檔案,中國國內同步提供直連鏡像站(頻寬有限,高峰時段可能受限)
• {key=ResourceUpdate}:由 {key=MirrorChyan} 提供免費的更新偵測,可手動在設定中點擊{key=ResourceUpdate}從 GitHub 下載
• {key=ResourceUpdate}:由 {key=MirrorChyan} 提供免費的更新偵測,可手動在設定中點擊{key=ResourceUpdate}從 GitHub 下載
🔑 使用 {key=MirrorChyan}
• 填寫 CDK 後,支援軟體與資源的自動更新
@@ -389,7 +407,7 @@
📄 更新說明:
• {key=UpdateCheckNow}:包含介面與功能更新。介面改動、新功能需透過 {key=UpdateCheckNow} 取得
• {key=ResourceUpdate}:包含自動作戰新關卡、掉落辨識圖示、公招幹員標籤等素材資料
• 導航熱更新:自動觸發,用於更新主介面提示與活動關卡入口。成功後右上角會顯示{key=ApiUpdateSuccess}
• 導航熱更新:自動觸發,用於更新主介面提示與活動關卡入口。成功後右上角會顯示{key=ApiUpdateSuccess}
</system:String>
<system:String x:Key="GlobalSource">全域來源</system:String>
<system:String x:Key="ForceGithubGlobalSource">強制使用 GitHub</system:String>
@@ -593,7 +611,7 @@ D:\
<system:String x:Key="CreditFightTip" xml:space="preserve">訪問好友後借助戰打一把 OF-1 賺 30 信用。
關卡選擇為 「{key=DefaultStage}」 時此功能無效。
別傳 「火藍之心」 關卡 OF-1 未解鎖時請勿勾選。</system:String>
<system:String x:Key="CreditFightWhenOF-1Warning">當{key=Fight}任務關卡清單中已包含{key=DefaultStage}」時,「{key=Mall}任務將不再借助戰打一把 OF-1。任務名稱: {0} (序號{1}), 關卡序號 {2}</system:String>
<system:String x:Key="CreditFightWhenOF-1Warning">當{key=Fight}任務關卡清單中已包含{key=DefaultStage}」 時, 「{key=Mall}任務將不再借助戰打一把 OF-1。任務名稱: {0} (序號{1}), 關卡序號 {2}</system:String>
<system:String x:Key="HighPriority">優先購買(子字串即可,分號分隔)</system:String>
<system:String x:Key="Blacklist">黑名單(子字串即可,分號分隔)</system:String>
<system:String x:Key="HighPriorityDefault">招聘許可</system:String>
@@ -703,6 +721,7 @@ C:\\Program Files\\Netease\\MuMuPlayer\n
<system:String x:Key="MuMu12Index">實例編號</system:String>
<system:String x:Key="MuMu12Display">螢幕編號</system:String>
<system:String x:Key="MuMuExtrasNotEnabledMessage">Mumu 截圖增強未生效,請檢查相關設定</system:String>
<system:String x:Key="MuMuEmulator12KeepAliveOn">偵測到 MuMu 模擬器開啟了背景保活,可能導致截圖失敗和操作異常,請在 MuMu 設定中關閉 「背景保活」(或 「應用保活」 「背景掛機時保活運行」 等)</system:String>
<system:String x:Key="LdExtrasEnabled">啟用 LD 截圖增強模式</system:String>
<system:String x:Key="LdPlayerEmulatorPathNotFound">找不到 LDPlayer 模擬器路徑。</system:String>
<system:String x:Key="LdPlayerOpenglMissing">在所選 LDPlayer 路徑中未找到 ldopengl64.dll請確認安裝目錄。</system:String>
@@ -832,7 +851,7 @@ C:\\leidian\\LDPlayer9\n
<system:String x:Key="DaysLeftOpen" xml:space="preserve">剩餘天數: </system:String>
<system:String x:Key="Inventory">庫存</system:String>
<system:String x:Key="InventoryUpdateTip">可透過 「{key=Toolbox}-{key=DepotRecognition}」 更新庫存數據</system:String>
<system:String x:Key="SpecifiedDropsInventoryUnavailable">任務{0}啟用了 {key=TargetInventory},但目前沒有可用的庫存資料,已跳過。可透過 「{key=Toolbox}-{key=DepotRecognition}」 更新庫存。</system:String>
<system:String x:Key="SpecifiedDropsInventoryUnavailable">任務{0}啟用了 {key=TargetInventory},但目前沒有可用的庫存資料,已跳過。可透過 「{key=Toolbox}-{key=DepotRecognition}」 更新庫存。</system:String>
<system:String x:Key="LessThanOneDay">不到 1 天</system:String>
<system:String x:Key="1-7">1-7</system:String>
<system:String x:Key="CE-6">龍門幣-6/5</system:String>
@@ -997,22 +1016,22 @@ C:\\leidian\\LDPlayer9\n
<system:String x:Key="MiniGame@PV">PV-煙花籌委會</system:String>
<system:String x:Key="MiniGame@PVTip">從所選關卡開始並自動通關。若選擇第一關,則從活動頁面最左側開始;若選擇其他關卡,請先進入上一關再返回以校準位置。</system:String>
<system:String x:Key="MiniGame@SPA">衛戍協議:盟約</system:String>
<system:String x:Key="MiniGame@SPATip" xml:space="preserve">在活動主介面(有獨立模擬處)開始任務。
<system:String x:Key="MiniGame@SPATip" xml:space="preserve">在活動主介面(有獨立模擬處)開始任務。
在有存檔時需要先手動放棄
最高只測試過險境模擬
如果已通關更高難度導致看不到險境模擬」或「標準模擬,需手動選擇一次險境模擬難度
手動通關標準模擬可以更快刷分。
只能刷等級獎勵,拿蝕刻章得打完所有的關鍵目標。</system:String>
最高只測試過險境模擬
如果已通關更高難度導致看不到險境模擬」 或 「標準模擬,需手動選擇一次險境模擬難度
手動通關標準模擬可以更快刷分。
只能刷等級獎勵,拿蝕刻章得打完所有的關鍵目標。</system:String>
<system:String x:Key="MiniGame@OS">OS-喀蘭貿易技術研發部</system:String>
<system:String x:Key="MiniGame@OSTip">在活動主介面(右下角有 「開始重建」 處)開始任務。</system:String>
<system:String x:Key="MiniGame@RM-TR-1">次生方案 RM-TR-1</system:String>
<system:String x:Key="MiniGame@RM-TR-1Tip" xml:space="preserve">完成新手教學後進入前哨支點,滑動到介面最左側。</system:String>
<system:String x:Key="MiniGame@RM-1">次生方案 RM-1</system:String>
<system:String x:Key="MiniGame@RM-1Tip" xml:space="preserve">刷 RM-TR-1 大約 3 小時,營造策略中,將石材開採線點到底;&#10;特約任命指定維什戴爾,然後盡量精二專三,攜帶 1 技能;&#10;帶滿 12 個幹員,其餘 11 個的費用需要低於維什戴爾;&#10;生產模組各帶 1 個,手動進入關卡並退出;&#10;讓 RM-1 位於螢幕中央,執行 MAA。</system:String>
<system:String x:Key="MiniGame@RM-1Tip" xml:space="preserve">刷 RM-TR-1 大約 3 小時,營造策略中,將石材開採線點到底;&#10;特約任命指定維什戴爾,然後盡量精二專三,攜帶 1 技能;&#10;帶滿 12 個幹員,其餘 11 個的費用需要低於維什戴爾;&#10;生產模組各帶 1 個,手動進入關卡並退出;&#10;讓 RM-1 位於螢幕中央,執行 MAA。</system:String>
<system:String x:Key="MiniGame@AT@ConversationRoom">AT-相談室</system:String>
<system:String x:Key="MiniGame@AT@ConversationRoomTip" xml:space="preserve">在活動主介面(右下角有開始營業處)開始任務。</system:String>
<system:String x:Key="MiniGame@AT@ConversationRoomTip" xml:space="preserve">在活動主介面(右下角有開始營業處)開始任務。</system:String>
<system:String x:Key="MiniGame@ALL@GreenGrass">爭鋒頻道:青草城</system:String>
<system:String x:Key="MiniGame@ALL@GreenGrassTip" xml:space="preserve">手動跳過教學對話,然後可以直接退出。&#10;在活動主介面(右下角有加入賽事處)開始任務。&#10;&#10;跟著鴨總喝口湯。</system:String>
<system:String x:Key="MiniGame@ALL@GreenGrassTip" xml:space="preserve">手動跳過教學對話,然後可以直接退出。&#10;在活動主介面(右下角有加入賽事處)開始任務。&#10;&#10;跟著鴨總喝口湯。</system:String>
<system:String x:Key="MiniGame@ALL@HoneyFruit">爭鋒頻道:蜜果城</system:String>
<system:String x:Key="MiniGame@ALL@HoneyFruitTip" xml:space="preserve">{key=MiniGame@ALL@GreenGrassTip}</system:String>
<system:String x:Key="MiniGame@ALL@IvyVine">爭鋒頻道:綠藤城</system:String>
@@ -1023,9 +1042,9 @@ C:\\leidian\\LDPlayer9\n
<system:String x:Key="MiniGame@SecretFront@Event2">遊俠</system:String>
<system:String x:Key="MiniGame@SecretFront@Event3">詭影迷蹤</system:String>
<system:String x:Key="MiniGame@SecretFront">隱秘戰線</system:String>
<system:String x:Key="MiniGame@SecretFrontTip">在選擇小隊介面開始,如有存檔須手動刪除。&#10;第一次打請先看完教學後關閉。&#10;推薦勾選遊戲內繼承上一支隊伍發回的資料。</system:String>
<system:String x:Key="MiniGame@SecretFrontTip">在選擇小隊介面開始,如有存檔須手動刪除。&#10;第一次打請先看完教學後關閉。&#10;推薦勾選遊戲內繼承上一支隊伍發回的資料。</system:String>
<system:String x:Key="MiniGameNameGreenTicketStore">綠票商店</system:String>
<system:String x:Key="MiniGameNameGreenTicketStoreTip" xml:space="preserve">第 1 層全買。&#10;第 2 層買尋訪憑證」和「招聘許可。</system:String>
<system:String x:Key="MiniGameNameGreenTicketStoreTip" xml:space="preserve">第 1 層全買。&#10;第 2 層買尋訪憑證」 和 「招聘許可。</system:String>
<system:String x:Key="MiniGameNameYellowTicketStore">黃票商店</system:String>
<system:String x:Key="MiniGameNameYellowTicketStoreTip" xml:space="preserve">請確保自己至少有 258 張黃票。</system:String>
<system:String x:Key="MiniGameNameSsStore">活動商店</system:String>
@@ -1121,7 +1140,7 @@ C:\\leidian\\LDPlayer9\n
1. 使用前請確認作業與所選擇的關卡類型一致。\n\n
2. {key=MainStage}、{key=StoryCollection}、{key=SideStory}:請在關卡介面右下角顯示 「開始行動」 按鈕的畫面啟動。\n\n
3. {key=SSS}resource/copilot 資料夾內建多份作業。請先手動編隊,在右下角顯示 「開始部署」 按鈕的介面啟動,可配合 「{key=LoopTimes}」。\n\n
4. {key=ParadoxSimulation}:選好技能後,在技能選擇介面顯示 「開始模擬」 按鈕的畫面啟動1/2★ {key=Operator}(無技能)在右下角顯示 「開始模擬」 按鈕的介面啟動。若使用 「{key=UseCopilotList}」,請從{key=Operator}列表的等級 / 稀有度標籤頁啟動。\n\n
4. {key=ParadoxSimulation}:選好技能後,在技能選擇介面顯示 「開始模擬」 按鈕的畫面啟動1/2★ {key=Operator}(無技能)在右下角顯示 「開始模擬」 按鈕的介面啟動。若使用 「{key=UseCopilotList}」,請從{key=Operator}列表的等級 / 稀有度標籤頁啟動。\n\n
5. {key=Operator}若被標記為 「特別關注」,可能影響 「{key=AutoSquad}」 的辨識與選擇。建議使用 「{key=AutoSquad}」 時移除特別關注,或在報錯後關閉 「{key=AutoSquad}」,並依據提示手動補充缺少的{key=Operator}。\n\n
6. Copilot 作業站的神秘代碼可透過輸入框右側的貼上按鈕貼上:\n
• 點選第 2 個按鈕 = 新增作業。\n
@@ -1172,9 +1191,9 @@ C:\\leidian\\LDPlayer9\n
<system:String x:Key="ErrorFeedbackLinkText">建立 GitHub Issue</system:String>
<system:String x:Key="ErrorQqGroupLinkText">加入 QQ 群</system:String>
<system:String x:Key="ErrorCrashMessageHeader">以上問題導致程式異常關閉。</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日誌,了解錯誤發生的具體原因。</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">請使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}產生錯誤報告,並點擊藍色的 「{key=Issue}」 連結提交回報。</system:String>
<system:String x:Key="ErrorCrashMessageHelpTip">若要尋求協助,請直接傳送產生的 錯誤報告檔案;請勿傳送此視窗的截圖、錄影、螢幕照片、翻拍影片、手繪圖片或抄寫的內容。</system:String>
<system:String x:Key="ErrorCrashMessageOpenLog">您可以前往{key=Settings} - {key=IssueReport} - {key=OpenDebugFolder}查看日誌,了解錯誤發生的具體原因。</system:String>
<system:String x:Key="ErrorCrashMessageGenerateReport">請使用{key=Settings} - {key=IssueReport} - {key=GenerateSupportPayload}產生錯誤報告,並點擊藍色的 「{key=Issue}」 連結提交回報。</system:String>
<system:String x:Key="ErrorCrashMessageHelpTip">若要尋求協助,請直接傳送產生的 錯誤報告檔案;請勿傳送此視窗的截圖、錄影、螢幕照片、翻拍影片、手繪圖片或抄寫的內容。</system:String>
<system:String x:Key="ErrorCrashDialogTitle">上次程式崩潰原因</system:String>
<system:String x:Key="CopyErrorMessage">複製錯誤資訊</system:String>
<!-- !ErrorView -->
@@ -1203,6 +1222,9 @@ C:\\leidian\\LDPlayer9\n
<system:String x:Key="FastestWayToScreencap">最快截圖用時: {0}ms ({1})</system:String>
<system:String x:Key="FastestWayToScreencapWarningTip">截圖用時較長 (平均: {0}ms),執行自動戰鬥類功能(如自動肉鴿)時可能表現異常。若使用 MuMu、雷電模擬器請嘗試開啟截圖增強</system:String>
<system:String x:Key="FastestWayToScreencapErrorTip">截圖用時過長 (平均: {0}ms),自動戰鬥類功能(如自動肉鴿)很可能無法正常執行,建議嘗試重啟或更換模擬器!若使用 MuMu、雷電模擬器請嘗試開啟截圖增強</system:String>
<system:String x:Key="EmulatorFpsWarningTip">偵測到模擬器設定幀率為 {0} FPS低於遊戲原生幀率60 FPS可能開啟了背景降幀或幀率設定過低建議將模擬器幀率設定為 60 FPS</system:String>
<system:String x:Key="EmulatorFpsErrorTip">偵測到模擬器設定幀率過低({0} FPS可能導致任務異常請關閉模擬器背景降幀並將幀率設定為 60 FPS</system:String>
<system:String x:Key="EmulatorFpsHighTip">偵測到模擬器設定幀率為 {0} FPS高於遊戲原生幀率上限60 FPS可能是模擬器插幀功能可能導致畫面異常或辨識不穩定建議關閉插幀並將幀率設定為 60 FPS</system:String>
<system:String x:Key="IdentifyTheMistakes">辨識錯誤</system:String>
<system:String x:Key="TaskError" xml:space="preserve">任務出錯: </system:String>
<system:String x:Key="CombatError">戰鬥出錯</system:String>
@@ -1527,7 +1549,7 @@ DEBUG 目錄下儲存的圖片有數量限制,超出後會自動清理舊圖
前置條件:主線已通關 RA-1
在大地圖打開 RA-1右下角出現開啟建設時啟動任務即可自動循環
在大地圖打開 RA-1右下角出現開啟建設時啟動任務即可自動循環
注意:如果已解鎖開局額外攜帶物品的相關科技,請將基地內會導致開局額外攜帶物品的設施拆除,如食品供給站、飲品供給站、獸欄等
@@ -1544,7 +1566,7 @@ DEBUG 目錄下儲存的圖片有數量限制,超出後會自動清理舊圖
3. 如果自己有維什戴爾,請手動打開關卡並配隊一次,保證為任意 5 個費用比維什戴爾低的幹員+ 維什戴爾,且維什戴爾位於六號位即最後一個選的人,然後確認招募,放棄本次建設並在開始建設處開始
4. 如果使用助戰維什戴爾,請保證維什戴爾在狙擊助戰首頁(考慮摯友),請手動打開關卡編入任意 5 個費用比維什戴爾低的幹員,六號位選擇維什戴爾助戰後確認招募,放棄本次建設並在開始建設處開始(保證隊伍前五位有人且六號位為空)
在大地圖打開 RA-4右下角出現開啟建設時啟動任務即可自動循環
在大地圖打開 RA-4右下角出現開啟建設時啟動任務即可自動循環
注意:如果已解鎖開局額外攜帶物品的相關科技,請將基地內會導致開局額外攜帶物品的設施拆除,如食品供給站、飲品供給站、獸欄等
@@ -1560,7 +1582,7 @@ DEBUG 目錄下儲存的圖片有數量限制,超出後會自動清理舊圖
2. 如果自己有聖聆初雪,請手動打開 RA-15 並配隊一次。選擇五先鋒(無練度要求)+ 聖聆初雪,且初雪位於最後一位,儲存配隊後退出關卡
3. 如果使用助戰聖聆初雪,請確認聖聆初雪位於術士助戰首頁(考慮摯友)
在大地圖打開 RA-15右下角出現開啟建設時啟動任務即可自動循環
在大地圖打開 RA-15右下角出現開啟建設時啟動任務即可自動循環
注意: 如果已解鎖開局額外攜帶物品的相關科技,請將基地內會導致開局額外攜帶物品的設施拆除,如食品供給站、飲品供給站、獸欄等
@@ -1648,7 +1670,7 @@ DEBUG 目錄下儲存的圖片有數量限制,超出後會自動清理舊圖
<system:String x:Key="Achievement.SanitySpender3.Conditions">完成 1000 次代理通關</system:String>
<system:String x:Key="Achievement.QuickCloser.Title">YOLO!</system:String>
<system:String x:Key="Achievement.QuickCloser.Description">我知道我在做什麼。—— 某使用者在點擊之前。</system:String>
<system:String x:Key="Achievement.QuickCloser.Description">我知道我在做什麼。—— 某使用者在點擊之前。</system:String>
<system:String x:Key="Achievement.QuickCloser.Conditions">1 秒內關閉彈出視窗(你大概根本沒看吧)</system:String>
<system:String x:Key="Achievement.TacticalRetreat.Title">臨陣脫逃</system:String>
@@ -1721,7 +1743,7 @@ DEBUG 目錄下儲存的圖片有數量限制,超出後會自動清理舊圖
<system:String x:Key="Achievement.SanityExpire.Title">要過期了</system:String>
<system:String x:Key="Achievement.SanityExpire.Description">趕緊衝哇!!</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">使用{key=UseExpiringMedicine},單次任務使用 8 瓶及以上即期理智藥</system:String>
<system:String x:Key="Achievement.SanityExpire.Conditions">使用{key=UseExpiringMedicine},單次任務使用 8 瓶及以上即期理智藥</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Title">超限代理</system:String>
<system:String x:Key="Achievement.OverLimitAgent.Description">你進行了一次能將大道磨滅的代理任務。</system:String>
@@ -1784,7 +1806,7 @@ DEBUG 目錄下儲存的圖片有數量限制,超出後會自動清理舊圖
<system:String x:Key="Achievement.Irreplaceable.Conditions">使用 「{key=Copilot} - {key=AutoSquad}」 時,缺少至少兩名{key=Operator}</system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Title">高 ping 戰士</system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Description">「卡了」</system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Description"> 「卡了」 </system:String>
<system:String x:Key="Achievement.SnapshotChallenge1.Conditions">平均截圖用時超過 800ms</system:String>
<system:String x:Key="Achievement.SnapshotChallenge2.Title">是不是有點太慢了</system:String>
@@ -1969,7 +1991,7 @@ DEBUG 目錄下儲存的圖片有數量限制,超出後會自動清理舊圖
<system:String x:Key="Achievement.WarehouseKeeper.Title">我是倉管!</system:String>
<system:String x:Key="Achievement.WarehouseKeeper.Description">牛牛找到了牛牛!</system:String>
<system:String x:Key="Achievement.WarehouseKeeper.Conditions">幹員辨識中包含幹員帕拉斯</system:String>
<system:String x:Key="Achievement.WarehouseKeeper.Conditions">幹員辨識中包含幹員帕拉斯</system:String>
<system:String x:Key="Achievement.NotFound404.Title">404</system:String>
<system:String x:Key="Achievement.NotFound404.Description">這個任務似乎找不到了</system:String>

View File

@@ -10,7 +10,7 @@
<!-- 文字颜色 -->
<SolidColorBrush x:Key="PrimaryTextBrush" Color="#E6E6E6" />
<SolidColorBrush x:Key="ThirdlyTextBrush" Color="#7FE6E6E6" />
<!-- 文字颜色 -->
<!-- 勾选框勾的颜色 -->
<SolidColorBrush x:Key="TextIconBrush" Color="#E6E6E6" />
<!-- 背景颜色 -->

View File

@@ -445,6 +445,7 @@ internal static partial class PendingUpdateApplier
IReadOnlyList<string> moveEntries)
{
bool showUpdaterConsole = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.ShowUpdaterConsole, false);
bool showUpdaterProgress = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.ShowUpdaterProgress, true);
string planPath = Path.Combine(context.RootDir, $"maa-pending-update-{Guid.NewGuid():N}.json");
string updaterExecutablePath = PrepareDelegatedUpdaterExecutable(context);
string relaunchExecutablePath = Path.Combine(context.RootDir, "MAA.exe");
@@ -462,7 +463,7 @@ internal static partial class PendingUpdateApplier
// Args: <ParentPid> <RootDir> <ExtractDir> <BackupDir>
// <PackagePath> <SuccessStatusFile> <FailureStatusFile>
// <RelaunchExecutablePath> <PlanFile>
// [--mutex-name <name>] [--show-console]
// [--mutex-name <name>] [--show-console] [--no-progress-ui]
startInfo.ArgumentList.Add(Environment.ProcessId.ToString());
startInfo.ArgumentList.Add(context.RootDir);
startInfo.ArgumentList.Add(context.ExtractDir);
@@ -479,13 +480,19 @@ internal static partial class PendingUpdateApplier
startInfo.ArgumentList.Add("--show-console");
}
if (!showUpdaterProgress)
{
startInfo.ArgumentList.Add("--no-progress-ui");
}
_logger.Information(
"Delegating pending update apply to external updater: packageType={PackageType}, rootDir={RootDir}, extractDir={ExtractDir}, packagePath={PackagePath}, showUpdaterConsole={ShowUpdaterConsole}",
"Delegating pending update apply to external updater: packageType={PackageType}, rootDir={RootDir}, extractDir={ExtractDir}, packagePath={PackagePath}, showUpdaterConsole={ShowUpdaterConsole}, showUpdaterProgress={ShowUpdaterProgress}",
packageType,
context.RootDir,
context.ExtractDir,
context.PackagePath,
showUpdaterConsole);
showUpdaterConsole,
showUpdaterProgress);
if (!File.Exists(updaterExecutablePath))
{

View File

@@ -279,7 +279,7 @@ public class StageManager
{
return new()
{
// 当前/上次关卡导航
// 当前/上次关卡导航
{ string.Empty, new() { Display = LocalizationHelper.GetString("DefaultStage"), Value = string.Empty } },
// 周一和周日的关卡提示

View File

@@ -97,6 +97,11 @@ public class RootViewModel : Conductor<Screen>.Collection.OneActive
private static void ToastNotificationCheck()
{
if (!SettingsViewModel.GuiSettings.UseNotify)
{
return;
}
var (isAvailable, detail) = ToastNotification.ToastNotificationCheck();
if (!isAvailable)
{

View File

@@ -359,6 +359,9 @@ public class SettingsViewModel : Screen
GuiSettings.LanguageList = languageList;
GuiSettings.SwitchDarkMode();
// 主题初始化完成后,若莫奈取色已开启,恢复调色板(必须在主题切换之后执行)
BackgroundSettings.UpdateMonet();
}
private void InitConnectConfig()

View File

@@ -13,27 +13,53 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using HandyControl.Controls;
using HandyControl.Tools;
using MaaWpfGui.Configuration.Factory;
using MaaWpfGui.Constants;
using MaaWpfGui.Helper;
using MaaWpfGui.Utilities;
using MaaWpfGui.Utilities.ValueType;
using Microsoft.Win32;
using Serilog;
using Stylet;
using MonetModeType = MaaWpfGui.Configuration.Global.GUI.MonetModeType;
namespace MaaWpfGui.ViewModels.UserControl.Settings;
public class BackgroundSettingsUserControlModel : PropertyChangedBase
{
private static readonly ILogger _logger = Log.ForContext<BackgroundSettingsUserControlModel>();
/// <summary>
/// 莫奈取色更新的防抖延迟(毫秒)。
/// </summary>
private const int MonetDebounceMs = 150;
static BackgroundSettingsUserControlModel()
{
Instance = new();
}
private BackgroundSettingsUserControlModel()
{
PropertyDependsOnUtility.InitializePropertyDependencies(this);
LocalizationHelper.LanguageChanged += RefreshLocalization;
}
public void RefreshLocalization()
{
BackgroundImageStretchModeList.RefreshLocalization();
BackgroundMonetModeList.RefreshLocalization();
}
public static BackgroundSettingsUserControlModel Instance { get; }
private static string _backgroundImagePath = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.BackgroundImagePath, "background/background.png");
@@ -46,6 +72,9 @@ public class BackgroundSettingsUserControlModel : PropertyChangedBase
ConfigurationHelper.SetGlobalValue(ConfigurationKeys.BackgroundImagePath, value);
BackgroundImage = RefreshBackgroundImage(value);
// 背景图变更后,若莫奈自动取色开启,重新提取主色
UpdateMonet();
AchievementTrackerHelper.Instance.Unlock(AchievementIds.CustomizationMaster);
}
}
@@ -83,13 +112,11 @@ public class BackgroundSettingsUserControlModel : PropertyChangedBase
}
}
public static List<CombinedData> BackgroundImageStretchModeList { get; } =
[
new() { Display = LocalizationHelper.GetString("BackgroundImageStretchModeNone"), Value = Stretch.None.ToString() },
new() { Display = LocalizationHelper.GetString("BackgroundImageStretchModeFill"), Value = Stretch.Fill.ToString() },
new() { Display = LocalizationHelper.GetString("BackgroundImageStretchModeUniform"), Value = Stretch.Uniform.ToString() },
new() { Display = LocalizationHelper.GetString("BackgroundImageStretchModeUniformToFill"), Value = Stretch.UniformToFill.ToString() },
];
public LocalizedObservableList<Stretch> BackgroundImageStretchModeList { get; } = new(
(Stretch.None, "BackgroundImageStretchModeNone"),
(Stretch.Fill, "BackgroundImageStretchModeFill"),
(Stretch.Uniform, "BackgroundImageStretchModeUniform"),
(Stretch.UniformToFill, "BackgroundImageStretchModeUniformToFill"));
private static BitmapImage? RefreshBackgroundImage(string imagePath)
{
@@ -124,6 +151,13 @@ public class BackgroundSettingsUserControlModel : PropertyChangedBase
get => _backgroundOpacity;
set {
SetAndNotify(ref _backgroundOpacity, value);
// 透明度变化后,若莫奈取色开启,重新生成调色板(文字色需根据新的有效背景明度选取)
// 滑块拖动会高频触发,使用防抖避免阻塞 UI
if (BackgroundMonetEnabled)
{
ScheduleMonetUpdate();
}
}
}
@@ -147,4 +181,209 @@ public class BackgroundSettingsUserControlModel : PropertyChangedBase
ConfigurationHelper.SetGlobalValue(ConfigurationKeys.BackgroundOpacity, BackgroundOpacity.ToString(CultureInfo.InvariantCulture));
ConfigurationHelper.SetGlobalValue(ConfigurationKeys.BackgroundBlurEffectRadius, BackgroundBlurEffectRadius.ToString(CultureInfo.InvariantCulture));
}
#region Monet Color
/// <summary>
/// 莫奈取色是否启用。
/// </summary>
public bool BackgroundMonetEnabled
{
get => ConfigFactory.Root.GUI.BackgroundMonetEnabled;
set {
ConfigFactory.Root.GUI.BackgroundMonetEnabled = value;
NotifyOfPropertyChange();
UpdateMonet();
}
}
/// <summary>
/// 莫奈取色模式Auto / Custom
/// </summary>
public MonetModeType BackgroundMonetMode
{
get => ConfigFactory.Root.GUI.BackgroundMonetMode;
set {
ConfigFactory.Root.GUI.BackgroundMonetMode = value;
NotifyOfPropertyChange();
UpdateMonet();
}
}
[PropertyDependsOn(nameof(BackgroundMonetMode))]
public bool IsBackgroundMonetAuto => BackgroundMonetMode == MonetModeType.Auto;
[PropertyDependsOn(nameof(BackgroundMonetMode))]
public bool IsBackgroundMonetCustom => BackgroundMonetMode == MonetModeType.Custom;
/// <summary>
/// 莫奈取色模式下拉列表。
/// </summary>
public LocalizedObservableList<MonetModeType> BackgroundMonetModeList { get; } = new(
(MonetModeType.Auto, "BackgroundMonetAuto"),
(MonetModeType.Custom, "BackgroundMonetCustom"));
/// <summary>
/// 用户自定义颜色HEX 字符串)。
/// </summary>
public string BackgroundMonetCustomColor
{
get => ConfigFactory.Root.GUI.BackgroundMonetCustomColor;
set {
ConfigFactory.Root.GUI.BackgroundMonetCustomColor = value;
NotifyOfPropertyChange();
NotifyOfPropertyChange(nameof(CurrentMonetColor));
}
}
/// <summary>
/// 当前生效的莫奈主色,用于色块预览。
/// </summary>
public Color CurrentMonetColor
{
get {
if (!BackgroundMonetEnabled)
{
// 关闭时显示默认主色
return ThemeHelper.String2Color("#326CF3");
}
return IsBackgroundMonetCustom
? ThemeHelper.String2Color(BackgroundMonetCustomColor)
: _lastExtractedColor ?? ThemeHelper.String2Color("#326CF3");
}
}
/// <summary>
/// 上次自动提取到的颜色(缓存)。
/// </summary>
private Color? _lastExtractedColor;
/// <summary>
/// 打开 HandyControl ColorPicker 弹窗让用户选择自定义颜色。
/// </summary>
public void SelectMonetColor()
{
var picker = SingleOpenHelper.CreateControl<ColorPicker>();
// 初始化 ColorPicker 为当前颜色
var current = ThemeHelper.String2Color(BackgroundMonetCustomColor);
picker.SelectedBrush = new SolidColorBrush(current);
var dialog = Dialog.Show(picker, nameof(Views.UI.RootView));
picker.Confirmed += (_, e) => {
var color = e.Info;
BackgroundMonetCustomColor = ThemeHelper.Color2HexString(color);
UpdateMonet();
dialog.Close();
};
picker.Canceled += (_, _) => dialog.Close();
}
/// <summary>
/// 防抖取消令牌源,避免滑块拖动时高频重新计算调色板。
/// </summary>
private CancellationTokenSource? _monetUpdateCts;
/// <summary>
/// 调度一次莫奈取色更新(防抖 150ms
/// 滑块拖动等高频场景调用此方法,而非直接 <see cref="UpdateMonet"/>。
/// </summary>
private void ScheduleMonetUpdate()
{
_monetUpdateCts?.Cancel();
_monetUpdateCts = new CancellationTokenSource();
_ = UpdateMonetAsync(_monetUpdateCts.Token);
}
/// <summary>
/// 根据当前配置执行莫奈取色逻辑。
/// 自动 / 自定义模式都会将计算放到后台线程,仅资源写入在 UI 线程。
/// </summary>
public void UpdateMonet()
{
_monetUpdateCts?.Cancel();
_ = UpdateMonetAsync(CancellationToken.None);
}
/// <summary>
/// 异步执行莫奈取色,支持取消(用于防抖)。
/// 所有异常均在方法内部捕获并记录,避免 fire-and-forget 调用产生未观察异常。
/// </summary>
/// <param name="cancellationToken">取消令牌。</param>
private async Task UpdateMonetAsync(CancellationToken cancellationToken)
{
// 防抖延迟:等待 150ms期间若被取消则直接返回
try
{
await Task.Delay(MonetDebounceMs, cancellationToken).ConfigureAwait(true);
}
catch (OperationCanceledException)
{
return;
}
try
{
if (!BackgroundMonetEnabled)
{
ThemeHelper.RevertMonetPalette();
NotifyOfPropertyChange(nameof(CurrentMonetColor));
return;
}
if (BackgroundMonetMode == MonetModeType.Custom)
{
// 自定义模式:直接用用户选定的颜色,计算放后台线程
var color = ThemeHelper.String2Color(BackgroundMonetCustomColor);
await ThemeHelper.ApplyMonetPaletteAsync(color, BackgroundOpacity, cancellationToken);
NotifyOfPropertyChange(nameof(CurrentMonetColor));
}
else
{
// 自动模式:从背景图提取主色(本身就是异步的)
await UpdateMonetAutoAsync(cancellationToken);
}
}
catch (OperationCanceledException)
{
// 正常的防抖取消,静默忽略
}
catch (Exception ex)
{
// 兜底fire-and-forget 调用中的异常不能逃逸,记录后忽略
_logger.Error(ex, "Failed to update Monet palette.");
}
}
/// <summary>
/// 异步执行自动取色:提取主色 → 应用调色板。
/// 颜色提取和调色板计算在后台线程,资源写入在 UI 线程。
/// </summary>
/// <param name="cancellationToken">取消令牌。</param>
private async Task UpdateMonetAutoAsync(CancellationToken cancellationToken)
{
var image = BackgroundImage;
if (image == null)
{
// 没有背景图时,取色无意义,先回退
ThemeHelper.RevertMonetPalette();
NotifyOfPropertyChange(nameof(CurrentMonetColor));
return;
}
var rawColor = await ColorExtractorHelper.ExtractDominantColorAsync(image).ConfigureAwait(true);
cancellationToken.ThrowIfCancellationRequested();
// 直接使用提取到的原始主色生成调色板
_lastExtractedColor = rawColor;
await ThemeHelper.ApplyMonetPaletteAsync(rawColor, BackgroundOpacity, cancellationToken);
NotifyOfPropertyChange(nameof(CurrentMonetColor));
}
#endregion Monet Color
}

View File

@@ -513,6 +513,36 @@ public class VersionUpdateSettingsUserControlModel : PropertyChangedBase
}
}
private bool _showUpdaterProgress = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.ShowUpdaterProgress, true);
/// <summary>
/// Gets or sets a value indicating whether to show the updater progress window.
/// </summary>
public bool ShowUpdaterProgress
{
get => _showUpdaterProgress;
set {
// 关闭进度窗口属于有风险的操作,需要二次确认
if (!value)
{
var result = MessageBoxHelper.Show(
LocalizationHelper.GetString("ShowUpdaterProgressWarning"),
LocalizationHelper.GetString("Warning"),
MessageBoxButton.YesNo,
MessageBoxImage.Warning,
yes: LocalizationHelper.GetString("Confirm"),
no: LocalizationHelper.GetString("Cancel"));
if (result != MessageBoxResult.Yes)
{
return;
}
}
SetAndNotify(ref _showUpdaterProgress, value);
ConfigurationHelper.SetGlobalValue(ConfigurationKeys.ShowUpdaterProgress, value.ToString());
}
}
/// <summary>
/// Updates manually.
/// </summary>

View File

@@ -12,12 +12,12 @@
xmlns:settings_vms="clr-namespace:MaaWpfGui.ViewModels.UserControl.Settings"
d:Background="White"
d:DataContext="{d:DesignInstance {x:Type settings_vms:BackgroundSettingsUserControlModel}}"
d:DesignHeight="300"
d:DesignHeight="350"
d:DesignWidth="550"
s:View.ActionTarget="{Binding}"
mc:Ignorable="d">
<StackPanel>
<StackPanel Margin="10">
<StackPanel Margin="5">
<controls:TextBlock
Margin="0,0,0,5"
HorizontalAlignment="Center"
@@ -40,7 +40,7 @@
</Grid>
</StackPanel>
<StackPanel
Margin="10"
Margin="5"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<controls:TextBlock
@@ -60,7 +60,7 @@
</hc:PreviewSlider>
</StackPanel>
<StackPanel
Margin="10"
Margin="5"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<controls:TextBlock
@@ -80,7 +80,7 @@
</hc:PreviewSlider>
</StackPanel>
<StackPanel
Margin="10"
Margin="5"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<controls:TextBlock
@@ -93,9 +93,67 @@
DisplayMemberPath="Display"
IsEditable="True"
IsEnabled="True"
ItemsSource="{c:Binding BackgroundImageStretchModeList}"
SelectedValue="{c:Binding BackgroundImageStretchMode}"
ItemsSource="{Binding BackgroundImageStretchModeList}"
SelectedValue="{Binding BackgroundImageStretchMode}"
SelectedValuePath="Value" />
</StackPanel>
<StackPanel HorizontalAlignment="Center">
<CheckBox
Margin="5"
HorizontalAlignment="Center"
Content="{DynamicResource BackgroundMonet}"
IsChecked="{Binding BackgroundMonetEnabled}" />
<StackPanel
Margin="5"
IsEnabled="{Binding BackgroundMonetEnabled}"
Visibility="{c:Binding BackgroundMonetEnabled}">
<!-- 取色模式选择 -->
<controls:TextBlock
Margin="0,0,0,5"
HorizontalAlignment="Center"
Text="{DynamicResource BackgroundMonetMode}" />
<hc:ComboBox
Width="200"
Margin="0,0,0,5"
HorizontalContentAlignment="Stretch"
DisplayMemberPath="Display"
ItemsSource="{Binding BackgroundMonetModeList}"
SelectedValue="{Binding BackgroundMonetMode}"
SelectedValuePath="Value" />
<!-- 自动模式提示 -->
<controls:TextBlock
HorizontalAlignment="Center"
FontSize="11"
Opacity="0.6"
Text="{DynamicResource BackgroundMonetAutoTip}"
TextWrapping="Wrap"
Visibility="{c:Binding IsBackgroundMonetAuto}" />
<!-- 自定义颜色选择 -->
<StackPanel
HorizontalAlignment="Center"
Orientation="Horizontal"
Visibility="{c:Binding IsBackgroundMonetCustom}">
<!-- 色块预览 -->
<Rectangle
Width="32"
Height="32"
Margin="0,0,10,0"
VerticalAlignment="Center"
RadiusX="4"
RadiusY="4"
Stroke="{DynamicResource RegionBrushOpacity50}">
<Rectangle.Fill>
<SolidColorBrush d:Color="{DynamicResource PrimaryColor}" Color="{Binding CurrentMonetColor}" />
</Rectangle.Fill>
</Rectangle>
<Button
hc:BorderElement.CornerRadius="4"
Command="{s:Action SelectMonetColor}"
Content="{DynamicResource BackgroundMonetSelectColor}" />
</StackPanel>
</StackPanel>
</StackPanel>
</StackPanel>
</UserControl>

View File

@@ -59,12 +59,14 @@
IsChecked="{Binding UpdateAutoCheck}" />
<controls:TooltipBlock TooltipText="{DynamicResource UpdateAutoCheckTip}" />
</StackPanel>
<CheckBox
Margin="8"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Content="{DynamicResource UpdateAutoDownload}"
IsChecked="{Binding AutoDownloadUpdatePackage}" />
<StackPanel Margin="8" Orientation="Horizontal">
<CheckBox
HorizontalAlignment="Left"
VerticalAlignment="Center"
Content="{DynamicResource UpdateAutoDownload}"
IsChecked="{Binding AutoDownloadUpdatePackage}" />
<controls:TooltipBlock TooltipText="{DynamicResource UpdateAutoDownloadTip}" />
</StackPanel>
<CheckBox
Margin="8"
HorizontalAlignment="Left"
@@ -79,6 +81,18 @@
IsChecked="{Binding ShowUpdaterConsole}">
<TextBlock Text="{DynamicResource ShowUpdaterConsole}" TextWrapping="Wrap" />
</CheckBox>
<StackPanel
Margin="8"
Orientation="Horizontal">
<CheckBox
MaxWidth="150"
HorizontalAlignment="Left"
VerticalAlignment="Center"
IsChecked="{Binding ShowUpdaterProgress}">
<TextBlock Text="{DynamicResource ShowUpdaterProgress}" TextWrapping="Wrap" />
</CheckBox>
<controls:TooltipBlock TooltipText="{DynamicResource ShowUpdaterProgressTip}" />
</StackPanel>
<StackPanel
Margin="8"
Orientation="Horizontal"

View File

@@ -10,7 +10,7 @@ from maadeps_download import detect_host_triplet
from maadeps_download import main as download_main
REPO = "MaaAssistantArknights/MaaDeps"
VERSION = "v2.13.1"
VERSION = "v2.14.0"
parser = argparse.ArgumentParser()
parser.add_argument("triplet", nargs="?")