mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-07 05:10:30 +08:00
Compare commits
228 Commits
docs/task-
...
feat/HolyL
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b179c673c | ||
|
|
e48cb49e4a | ||
|
|
7f7b124bc7 | ||
|
|
2c656db087 | ||
|
|
63420e9808 | ||
|
|
d8207fb5b5 | ||
|
|
cb9bc0f87f | ||
|
|
f863a6f4b6 | ||
|
|
2651b1bc01 | ||
|
|
99b4e75567 | ||
|
|
904a8f3d4c | ||
|
|
7c710fcee5 | ||
|
|
a6a3451217 | ||
|
|
93a0e2d4a1 | ||
|
|
7f6622e51d | ||
|
|
0b533468d1 | ||
|
|
6d26ccace1 | ||
|
|
c101f9cea6 | ||
|
|
f5921c7293 | ||
|
|
880bdea7d3 | ||
|
|
9c53ea10c6 | ||
|
|
9ea6057145 | ||
|
|
05b377981a | ||
|
|
465c2bcf62 | ||
|
|
3294b29f54 | ||
|
|
f967903a4b | ||
|
|
7622cff5b4 | ||
|
|
4e36c78691 | ||
|
|
afb0f8f647 | ||
|
|
35e437d372 | ||
|
|
3d9732a930 | ||
|
|
d12588f62b | ||
|
|
e3d48ae65d | ||
|
|
2a2e360f3e | ||
|
|
df5af18b93 | ||
|
|
55b3cdafaa | ||
|
|
538760dbbe | ||
|
|
979e0c4b1b | ||
|
|
d9eb1e50d9 | ||
|
|
7e9f862f62 | ||
|
|
20c86b0fff | ||
|
|
072a98dd41 | ||
|
|
a053e6547d | ||
|
|
bfcb02104c | ||
|
|
1e9ae031ea | ||
|
|
d70d939947 | ||
|
|
37ad3a2f35 | ||
|
|
7d233513ff | ||
|
|
b93d39b77e | ||
|
|
c91c1ff279 | ||
|
|
d7524a4f9e | ||
|
|
fff05d45b5 | ||
|
|
201c856594 | ||
|
|
97756b1200 | ||
|
|
79bea9b98d | ||
|
|
f94a79a1a3 | ||
|
|
eb90a19e8b | ||
|
|
957b486c53 | ||
|
|
87a892ad7a | ||
|
|
363c4dbb47 | ||
|
|
b639fd3a62 | ||
|
|
8bbd104ea6 | ||
|
|
b63bd4b6eb | ||
|
|
7264f26b14 | ||
|
|
e3be737a3c | ||
|
|
e5a823d476 | ||
|
|
25513ab692 | ||
|
|
26acc07463 | ||
|
|
38a801a8c1 | ||
|
|
1edd006982 | ||
|
|
45025dd168 | ||
|
|
3b10c1518a | ||
|
|
5efdab7fbf | ||
|
|
930de73324 | ||
|
|
527ebee6af | ||
|
|
c24baee8ff | ||
|
|
11f9d6e0a4 | ||
|
|
6733f49d8b | ||
|
|
e7f909c807 | ||
|
|
147cf766c1 | ||
|
|
b9edba6cf5 | ||
|
|
39326e177b | ||
|
|
e6cfa25f81 | ||
|
|
2c247bbeda | ||
|
|
af69b6172c | ||
|
|
5626880d19 | ||
|
|
445ce5352f | ||
|
|
dce6fbfbce | ||
|
|
724130da50 | ||
|
|
12315868c7 | ||
|
|
230b3b9169 | ||
|
|
3c61b10de5 | ||
|
|
5456428eb7 | ||
|
|
1ca780ef0d | ||
|
|
8f3ff813a1 | ||
|
|
a4688ebeed | ||
|
|
7d028cdbd5 | ||
|
|
ef187657ba | ||
|
|
403f3c5644 | ||
|
|
369add1890 | ||
|
|
0ae21436c8 | ||
|
|
a322706241 | ||
|
|
ec2b92002b | ||
|
|
36dd631606 | ||
|
|
a201b3da65 | ||
|
|
7421100998 | ||
|
|
e98ff0ee35 | ||
|
|
d7acdfda36 | ||
|
|
6dfffdc45b | ||
|
|
6834ee1abe | ||
|
|
a571e974b6 | ||
|
|
2440f365c9 | ||
|
|
f182d36014 | ||
|
|
cd6a3efc4e | ||
|
|
3ee20cee2e | ||
|
|
d9aa14333e | ||
|
|
a1cc9df6bd | ||
|
|
9313a606f2 | ||
|
|
3c6c7624dd | ||
|
|
0e00b05128 | ||
|
|
fbf8b5636d | ||
|
|
c535cbdf6d | ||
|
|
a872c08a32 | ||
|
|
ff457fbd21 | ||
|
|
b4fcf37b35 | ||
|
|
b5ba39174d | ||
|
|
319ee8876a | ||
|
|
2a8b0f7f01 | ||
|
|
a7dc1f791f | ||
|
|
16a160f3a5 | ||
|
|
7676b7235b | ||
|
|
e100cc68e2 | ||
|
|
5923efe988 | ||
|
|
6b91bd8106 | ||
|
|
24df42e14a | ||
|
|
6fc5800e02 | ||
|
|
eb91fc34a6 | ||
|
|
03f71f02cb | ||
|
|
966c7a251a | ||
|
|
3b74c1c4c9 | ||
|
|
295e7742f1 | ||
|
|
bfdd20f6ff | ||
|
|
63cce9811f | ||
|
|
0bed1d777a | ||
|
|
8ec0974d1b | ||
|
|
6d9a6e5a4b | ||
|
|
7079975bd2 | ||
|
|
f06030ac44 | ||
|
|
b56d60aa8f | ||
|
|
d7f936cb3c | ||
|
|
b7b80ebbea | ||
|
|
daa4eab296 | ||
|
|
fad643985e | ||
|
|
b562b6b231 | ||
|
|
aa89062bdf | ||
|
|
374e9ed1f2 | ||
|
|
959063b34c | ||
|
|
fbf16d00c1 | ||
|
|
bacc34531e | ||
|
|
6507ac0072 | ||
|
|
965b6f69ce | ||
|
|
eb924b816d | ||
|
|
72bc6d8ace | ||
|
|
df1a16aca3 | ||
|
|
87f4440209 | ||
|
|
76252d42e3 | ||
|
|
cca22c1493 | ||
|
|
b0ddb9e28e | ||
|
|
3195129fa7 | ||
|
|
42bd5ceaf0 | ||
|
|
aae1faef41 | ||
|
|
baf3bc69ca | ||
|
|
fde7e7dfa4 | ||
|
|
0af9034bad | ||
|
|
516d47bb9d | ||
|
|
afc16cf6e6 | ||
|
|
e52f573a7f | ||
|
|
04206e7e5e | ||
|
|
8c71f709db | ||
|
|
7f6b490d00 | ||
|
|
a0bd928f75 | ||
|
|
fc7c823b9f | ||
|
|
488b16e8e7 | ||
|
|
fcc146ad2a | ||
|
|
64ec655631 | ||
|
|
35cf87547c | ||
|
|
4db7a06f01 | ||
|
|
24bb443e08 | ||
|
|
02133548c4 | ||
|
|
eff2818404 | ||
|
|
8017430308 | ||
|
|
9b10bb6e02 | ||
|
|
b89777ec07 | ||
|
|
e72b6d5e24 | ||
|
|
fb0bf0a510 | ||
|
|
a24c772880 | ||
|
|
7a3484dc52 | ||
|
|
2aa2e87fd6 | ||
|
|
2ef25416f9 | ||
|
|
435e17867e | ||
|
|
707d31bb30 | ||
|
|
de08a33db1 | ||
|
|
d724b8ff9c | ||
|
|
1bb7828255 | ||
|
|
d2a81987b2 | ||
|
|
ed7ee78952 | ||
|
|
2973ebbbdb | ||
|
|
e461208bf9 | ||
|
|
22faefe71a | ||
|
|
7d080de077 | ||
|
|
cc65a68384 | ||
|
|
0bb19a7376 | ||
|
|
ea6540cf6b | ||
|
|
df75025dc5 | ||
|
|
7ab8994ed8 | ||
|
|
a263b62e63 | ||
|
|
bf7b2e633b | ||
|
|
65b84f5dbd | ||
|
|
347f1e191e | ||
|
|
7905eb9fed | ||
|
|
3a6c49de0c | ||
|
|
0be1253334 | ||
|
|
a10ab607b0 | ||
|
|
45649de131 | ||
|
|
c3ebfce07b | ||
|
|
a57e5cf98a | ||
|
|
78ff33d6f0 | ||
|
|
a64bfc5ba3 |
@@ -17,11 +17,12 @@ RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -
|
||||
|
||||
# Configure conda environment
|
||||
RUN eval "$(conda shell.bash hook)" \
|
||||
&& conda create -n maa python=$PYTHON_VERSION -y \
|
||||
&& conda create -n maa \
|
||||
&& conda activate maa \
|
||||
&& conda install -y conda-forge::nodejs=$NODEJS_VERSION \
|
||||
&& pip install pre-commit black \
|
||||
&& npm install -g pnpm
|
||||
&& conda install -y \
|
||||
python=$PYTHON_VERSION \
|
||||
conda-forge::nodejs=$NODEJS_VERSION \
|
||||
&& pip install pre-commit black isort
|
||||
|
||||
# Finalize conda setup
|
||||
RUN conda init \
|
||||
64
.devcontainer/0/devcontainer.json
Normal file
64
.devcontainer/0/devcontainer.json
Normal file
@@ -0,0 +1,64 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node
|
||||
{
|
||||
"name": "MAA Docs Env (Light)",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
// "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile"
|
||||
},
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [3001],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
"postCreateCommand": "bash .devcontainer/0/post-create.sh",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"nekosu.maa-support",
|
||||
"ms-python.python",
|
||||
"ms-python.black-formatter",
|
||||
"ms-python.isort",
|
||||
"esbenp.prettier-vscode",
|
||||
"DavidAnson.vscode-markdownlint",
|
||||
"yzhang.markdown-all-in-one",
|
||||
"vue.volar",
|
||||
"mkxml.vscode-filesize"
|
||||
],
|
||||
"settings": {
|
||||
// Editor formatting
|
||||
"editor.formatOnSave": true,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
|
||||
// Language-specific formatting
|
||||
"[python]": {
|
||||
"editor.defaultFormatter": "ms-python.black-formatter",
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit"
|
||||
}
|
||||
},
|
||||
|
||||
// Python formatting and linting
|
||||
"isort.args": ["--profile", "black"],
|
||||
|
||||
// Python runtime
|
||||
"python.terminal.launchArgs": ["-u"],
|
||||
"python.defaultInterpreterPath": "/home/vscode/miniconda/envs/maa/bin/python",
|
||||
"python.terminal.activateEnvironment": false,
|
||||
|
||||
// Performance optimizations
|
||||
"search.exclude": {
|
||||
"**/node_modules": true,
|
||||
"**/3rdparty": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
||||
@@ -4,18 +4,13 @@ WORKSPACE=$(pwd)
|
||||
# conda activate maa
|
||||
|
||||
echo "===================="
|
||||
echo "Setting up git safe.directory for $WORKSPACE and its submodules..."
|
||||
cd "$WORKSPACE"
|
||||
echo "Setting up git safe.directory for $WORKSPACE and its submodules..."
|
||||
git config --global --add safe.directory "$WORKSPACE"
|
||||
git submodule foreach --recursive 'git config --global --add safe.directory "$toplevel/$path"'
|
||||
|
||||
echo "===================="
|
||||
cd "$WORKSPACE"
|
||||
echo "Installing dependencies for python..."
|
||||
# pip install -r tools/.../requirements.txt
|
||||
# pip install -r tools/.../requirements-dev.txt
|
||||
|
||||
echo "===================="
|
||||
echo "Installing dependencies for nodejs..."
|
||||
cd "$WORKSPACE"/docs
|
||||
echo "Installing node modules..."
|
||||
npm install -g pnpm
|
||||
pnpm install --frozen-lockfile
|
||||
39
.devcontainer/1/Dockerfile
Normal file
39
.devcontainer/1/Dockerfile
Normal file
@@ -0,0 +1,39 @@
|
||||
FROM mcr.microsoft.com/devcontainers/base:ubuntu
|
||||
|
||||
USER vscode
|
||||
|
||||
ENV CONDA_DIR=/home/vscode/miniconda
|
||||
ENV PATH="$CONDA_DIR/bin:$PATH"
|
||||
|
||||
ARG CLANGD_VERSION=20
|
||||
ARG PYTHON_VERSION=3.12
|
||||
ARG NODEJS_VERSION=24
|
||||
|
||||
# Install system dependencies
|
||||
RUN sudo apt update \
|
||||
&& sudo apt upgrade -y \
|
||||
&& sudo apt install -y \
|
||||
cmake clangd-${CLANGD_VERSION}
|
||||
|
||||
RUN sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-${CLANGD_VERSION} 100
|
||||
|
||||
# Install Miniconda
|
||||
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh \
|
||||
&& bash ~/miniconda.sh -b -p ${CONDA_DIR} \
|
||||
&& rm ~/miniconda.sh \
|
||||
&& conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main \
|
||||
&& conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
|
||||
|
||||
# Configure conda environment
|
||||
RUN eval "$(conda shell.bash hook)" \
|
||||
&& conda create -n maa \
|
||||
&& conda activate maa \
|
||||
&& conda install -y \
|
||||
python=${PYTHON_VERSION} \
|
||||
conda-forge::nodejs=${NODEJS_VERSION} \
|
||||
&& pip install pre-commit black isort
|
||||
|
||||
# Finalize conda setup
|
||||
RUN conda init \
|
||||
&& conda config --set auto_activate false \
|
||||
&& echo "conda activate maa" >> ~/.bashrc
|
||||
83
.devcontainer/1/devcontainer.json
Normal file
83
.devcontainer/1/devcontainer.json
Normal file
@@ -0,0 +1,83 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node
|
||||
{
|
||||
"name": "MAA Core Env (Full)",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
// "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile"
|
||||
},
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [3001],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
"postCreateCommand": "bash .devcontainer/1/post-create.sh",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"nekosu.maa-support",
|
||||
"ms-vscode.cmake-tools",
|
||||
"xaver.clang-format",
|
||||
"llvm-vs-code-extensions.vscode-clangd",
|
||||
"ms-python.python",
|
||||
"ms-python.black-formatter",
|
||||
"ms-python.isort",
|
||||
"esbenp.prettier-vscode",
|
||||
"DavidAnson.vscode-markdownlint",
|
||||
"yzhang.markdown-all-in-one",
|
||||
"vue.volar",
|
||||
"mkxml.vscode-filesize"
|
||||
],
|
||||
"settings": {
|
||||
// Editor formatting
|
||||
"editor.formatOnSave": true,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
|
||||
// Language-specific formatting
|
||||
"[python]": {
|
||||
"editor.defaultFormatter": "ms-python.black-formatter",
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit"
|
||||
}
|
||||
},
|
||||
"[cpp]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
"[c]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
|
||||
// Python formatting and linting
|
||||
"isort.args": ["--profile", "black"],
|
||||
|
||||
// Python runtime
|
||||
"python.terminal.launchArgs": ["-u"],
|
||||
"python.defaultInterpreterPath": "/home/vscode/miniconda/envs/maa/bin/python",
|
||||
"python.terminal.activateEnvironment": false,
|
||||
|
||||
// CMake settings
|
||||
"cmake.configureSettings": {
|
||||
"BUILD_DEBUG_DEMO": "ON",
|
||||
"CMAKE_TOOLCHAIN_FILE": "MaaDeps/cmake/maa-x64-linux-toolchain.cmake"
|
||||
},
|
||||
"cmake.configureOnOpen": false,
|
||||
|
||||
// Performance optimizations
|
||||
"search.exclude": {
|
||||
"**/node_modules": true,
|
||||
"**/build": true,
|
||||
"**/install": true,
|
||||
"**/MaaDeps": true,
|
||||
"**/3rdparty": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
||||
42
.devcontainer/1/post-create.sh
Normal file
42
.devcontainer/1/post-create.sh
Normal file
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
WORKSPACE=$(pwd)
|
||||
|
||||
# conda activate maa
|
||||
|
||||
echo "===================="
|
||||
cd "$WORKSPACE"
|
||||
echo "Setting up git safe.directory for $WORKSPACE and its submodules..."
|
||||
git config --global --add safe.directory "$WORKSPACE"
|
||||
git submodule foreach --recursive 'git config --global --add safe.directory "$toplevel/$path"'
|
||||
|
||||
echo "===================="
|
||||
cd "$WORKSPACE"/docs
|
||||
echo "Installing node modules..."
|
||||
npm install -g pnpm
|
||||
pnpm install --frozen-lockfile
|
||||
|
||||
echo "===================="
|
||||
cd "$WORKSPACE"
|
||||
echo "Installing Python dependencies..."
|
||||
# Install Python dependencies from all tools
|
||||
for req_file in tools/*/requirements.txt; do
|
||||
if [ -f "$req_file" ]; then
|
||||
echo "Installing from $req_file"
|
||||
pip install -r "$req_file"
|
||||
fi
|
||||
done
|
||||
|
||||
for req_file in tools/*/requirements-dev.txt; do
|
||||
if [ -f "$req_file" ]; then
|
||||
echo "Installing from $req_file"
|
||||
pip install -r "$req_file"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "===================="
|
||||
cd "$WORKSPACE"
|
||||
echo "Installing MaaDeps..."
|
||||
python tools/maadeps-download.py
|
||||
# Link clang-format & clangd to /usr/local/bin for easy access
|
||||
sudo ln -s $WORKSPACE/MaaDeps/x-tools/llvm/bin/clang-format /usr/local/bin/clang-format
|
||||
# sudo ln -s $WORKSPACE/MaaDeps/x-tools/llvm/bin/clangd /usr/local/bin/clangd
|
||||
@@ -1,50 +1,5 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node
|
||||
{
|
||||
"name": "MAA",
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
// "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile"
|
||||
},
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [3001],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
"postCreateCommand": "bash .devcontainer/post-create.sh",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"mkxml.vscode-filesize",
|
||||
"nekosu.maa-support",
|
||||
"DavidAnson.vscode-markdownlint",
|
||||
"esbenp.prettier-vscode",
|
||||
"vue.volar",
|
||||
"ms-python.python",
|
||||
"ms-python.black-formatter"
|
||||
],
|
||||
"settings": {
|
||||
// format
|
||||
"editor.formatOnSave": true,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"[markdown]": {
|
||||
"editor.defaultFormatter": "DavidAnson.vscode-markdownlint"
|
||||
},
|
||||
"[python]": {
|
||||
"editor.defaultFormatter": "ms-python.black-formatter"
|
||||
},
|
||||
// python
|
||||
"python.terminal.launchArgs": ["-u"],
|
||||
"python.defaultInterpreterPath": "/home/vscode/miniconda/envs/maa/bin/python",
|
||||
"python.terminal.activateEnvironment": false
|
||||
}
|
||||
}
|
||||
}
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
"name": "Plain Env (Nothing Installed)",
|
||||
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
|
||||
"postCreateCommand": "git config --global --add safe.directory \"$(pwd)\" && git submodule foreach --recursive 'git config --global --add safe.directory \"$toplevel/$path\"'"
|
||||
}
|
||||
|
||||
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -10,3 +10,5 @@
|
||||
*.md text eol=lf
|
||||
*.yml text eol=lf
|
||||
*.yaml text eol=lf
|
||||
|
||||
*.sh text eol=lf
|
||||
|
||||
5
.github/workflows/blame-ignore.yml
vendored
5
.github/workflows/blame-ignore.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Git Blame Ignore
|
||||
name: Blame Ignore Update
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -7,6 +7,7 @@ on:
|
||||
|
||||
jobs:
|
||||
blame-ignore:
|
||||
name: Update Git Blame Ignore Revs
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -26,7 +27,7 @@ jobs:
|
||||
|
||||
git diff --quiet .git-blame-ignore-revs
|
||||
|
||||
- name: Commit and Push changes
|
||||
- name: Commit changes
|
||||
if: ${{ steps.check_changes.outcome == 'failure' }}
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
|
||||
5
.github/workflows/cache-delete.yml
vendored
5
.github/workflows/cache-delete.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Delete Cache
|
||||
name: Cache Cleanup
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -11,13 +11,14 @@ on:
|
||||
|
||||
jobs:
|
||||
cache-delete:
|
||||
name: Delete PR Cache
|
||||
# Run only on organization branches with PRs
|
||||
if: github.event_name == 'workflow_dispatch' ||
|
||||
github.event.pull_request.head.repo.full_name ==
|
||||
github.event.pull_request.base.repo.full_name
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Delete cache on PR merged
|
||||
- name: Delete PR cache
|
||||
run: |
|
||||
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
|
||||
PR_NUMBER=${{ github.event.inputs.pr_number }}
|
||||
|
||||
145
.github/workflows/ci.yml
vendored
145
.github/workflows/ci.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: ci
|
||||
name: Release Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -7,25 +7,26 @@ on:
|
||||
branches-ignore:
|
||||
- "master"
|
||||
paths:
|
||||
- ".github/workflows/ci.yml"
|
||||
- "3rdparty/include/**"
|
||||
- "include/**"
|
||||
- "src/**"
|
||||
- "cmake/**"
|
||||
- "CMakeLists.txt"
|
||||
- ".github/workflows/ci.yml"
|
||||
- "!**/*.md"
|
||||
- "include/**"
|
||||
- "src/**"
|
||||
- "tools/maadeps-download.py"
|
||||
- "!**/*.md"
|
||||
pull_request:
|
||||
branches:
|
||||
- "dev"
|
||||
paths:
|
||||
- ".github/workflows/ci.yml"
|
||||
- "3rdparty/include/**"
|
||||
- "include/**"
|
||||
- "src/**"
|
||||
- "cmake/**"
|
||||
- "CMakeLists.txt"
|
||||
- "!**/*.md"
|
||||
- "include/**"
|
||||
- "src/**"
|
||||
- "tools/maadeps-download.py"
|
||||
- "!**/*.md"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
@@ -34,6 +35,7 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
meta:
|
||||
name: Gather Meta Information
|
||||
# Prevent duplicate runs on organization branches with PRs
|
||||
if: github.event_name != 'pull_request' ||
|
||||
github.event.pull_request.head.repo.full_name !=
|
||||
@@ -44,42 +46,36 @@ jobs:
|
||||
tag: ${{ steps.set_tag.outputs.tag }}
|
||||
prerelease: ${{ steps.set_pre.outputs.prerelease }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
path: temp
|
||||
fetch-depth: 0
|
||||
show-progress: false
|
||||
|
||||
- name: Fetch history
|
||||
if: ${{ !startsWith(github.ref, 'refs/pull/') }}
|
||||
run: |
|
||||
git init
|
||||
cp $GITHUB_WORKSPACE/temp/.git/config ./.git
|
||||
rm -rf $GITHUB_WORKSPACE/temp
|
||||
# git config remote.origin.fetch '+refs/*:refs/*'
|
||||
git fetch --filter=tree:0 # --update-head-ok
|
||||
git reset --hard origin/$(git branch --show-current) || true
|
||||
git checkout ${{ github.ref_name }}
|
||||
|
||||
- name: Set tag
|
||||
id: set_tag
|
||||
run: |
|
||||
${{ startsWith(github.ref, 'refs/pull/') && 'cd temp' || '' }}
|
||||
echo tag=$(git describe --tags --match "v*" ${{ github.ref }} || git rev-parse --short HEAD) | tee -a $GITHUB_OUTPUT
|
||||
exit ${PIPESTATUS[0]}
|
||||
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
|
||||
# For tag pushes, use the tag name
|
||||
tag="${{ github.ref_name }}"
|
||||
else
|
||||
# For PRs and branch pushes, use git describe or fallback
|
||||
tag=$(git describe --tags --match "v*" HEAD 2>/dev/null || echo "v0.0.1-$(git rev-parse --short HEAD)")
|
||||
fi
|
||||
echo "tag=${tag}" | tee -a $GITHUB_OUTPUT
|
||||
|
||||
- name: Judge pre-release
|
||||
- name: Check if it is a pre-release
|
||||
id: set_pre
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
if [[ '${{ steps.set_tag.outputs.tag }}' =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echo prerelease=false | tee -a $GITHUB_OUTPUT
|
||||
echo "prerelease=false" | tee -a $GITHUB_OUTPUT
|
||||
else
|
||||
echo prerelease=true | tee -a $GITHUB_OUTPUT
|
||||
echo "prerelease=true" | tee -a $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Generate changelog
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
|
||||
- name: Finalize changelog
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
this_tag=${{ steps.set_tag.outputs.tag }}
|
||||
if [[ '${{ steps.set_pre.outputs.prerelease }}' != 'false' ]]; then
|
||||
@@ -92,14 +88,15 @@ jobs:
|
||||
echo >> CHANGELOG.md
|
||||
echo "[已有 Mirror酱 CDK?前往 Mirror酱 高速下载](https://mirrorchyan.com/zh/projects?rid=MAA&source=maagh-release)" >> CHANGELOG.md
|
||||
|
||||
- name: Upload changelog to Github
|
||||
- name: Upload changelog to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/v') }}
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
with:
|
||||
name: changelog
|
||||
path: CHANGELOG.md
|
||||
|
||||
windows:
|
||||
name: Build for Windows
|
||||
# Prevent duplicate runs on organization branches with PRs
|
||||
if: github.event_name != 'pull_request' ||
|
||||
github.event.pull_request.head.repo.full_name !=
|
||||
@@ -113,7 +110,7 @@ jobs:
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
@@ -164,7 +161,7 @@ jobs:
|
||||
if: steps.cache-nuget.outputs.cache-hit != 'true'
|
||||
run: dotnet restore src/MaaWpfGui/MaaWpfGui.csproj
|
||||
|
||||
- name: Taggify Version for csproj
|
||||
- name: Taggify version for csproj
|
||||
run: |
|
||||
$csprojPath = "src/MaaWpfGui/MaaWpfGui.csproj"
|
||||
$csprojPath = Resolve-Path -Path $csprojPath
|
||||
@@ -187,7 +184,7 @@ jobs:
|
||||
run: |
|
||||
dotnet publish src/MaaWpfGui/MaaWpfGui.csproj -c Release -o install
|
||||
|
||||
- name: Organize Install Files
|
||||
- name: Organize install files
|
||||
shell: bash
|
||||
run: |
|
||||
rm -rf install/*.pdb
|
||||
@@ -201,13 +198,14 @@ jobs:
|
||||
cd install
|
||||
Compress-Archive -Destination MAA-${{ needs.meta.outputs.tag }}-win-${{ matrix.arch }}.zip -Path ./*
|
||||
|
||||
- name: Upload MAA to Github
|
||||
- name: Upload MAA to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MAA-win-${{ matrix.arch }}
|
||||
path: install/*.zip
|
||||
|
||||
ubuntu:
|
||||
name: Build for Ubuntu
|
||||
# Prevent duplicate runs on organization branches with PRs
|
||||
if: github.event_name != 'pull_request' ||
|
||||
github.event.pull_request.head.repo.full_name !=
|
||||
@@ -220,7 +218,7 @@ jobs:
|
||||
arch: [aarch64, x86_64]
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
@@ -266,7 +264,7 @@ jobs:
|
||||
mkdir -p install
|
||||
cmake --install build --prefix install --config Release
|
||||
|
||||
- name: Setup Cross Compile Toolchains for CLI
|
||||
- name: Setup cross compile toolchains for CLI
|
||||
uses: ./src/maa-cli/.github/actions/setup
|
||||
with:
|
||||
os: ubuntu-latest
|
||||
@@ -323,7 +321,7 @@ jobs:
|
||||
cd install
|
||||
tar czvf $GITHUB_WORKSPACE/release/MAA-${{ needs.meta.outputs.tag }}-linux-${{ matrix.arch }}.tar.gz .
|
||||
|
||||
- name: Upload MAA to Github
|
||||
- name: Upload MAA to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MAA-linux-${{ matrix.arch }}
|
||||
@@ -332,25 +330,26 @@ jobs:
|
||||
release/*.tar.gz
|
||||
|
||||
macOS-Core:
|
||||
name: Build Core for macOS
|
||||
# Prevent duplicate runs on organization branches with PRs
|
||||
if: github.event_name != 'pull_request' ||
|
||||
github.event.pull_request.head.repo.full_name !=
|
||||
github.event.pull_request.base.repo.full_name
|
||||
|
||||
needs: meta
|
||||
runs-on: macos-latest
|
||||
runs-on: macos-26
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [arm64, x86_64]
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
# ninja 1.13.1 is already installed and up-to-date.
|
||||
# - name: Install Dependencies
|
||||
# - name: Install dependencies
|
||||
# run: |
|
||||
# brew install ninja
|
||||
|
||||
@@ -383,27 +382,28 @@ jobs:
|
||||
run: |
|
||||
cmake --install build --prefix install --config Release
|
||||
|
||||
- name: Upload MAA to Github
|
||||
- name: Upload MAA to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MAACore-macos-${{ matrix.arch }}
|
||||
path: "install/*.dylib"
|
||||
|
||||
macOS-GUI:
|
||||
name: Build GUI for macOS
|
||||
# Prevent duplicate runs on organization branches with PRs
|
||||
if: github.event_name != 'pull_request' ||
|
||||
github.event.pull_request.head.repo.full_name !=
|
||||
github.event.pull_request.base.repo.full_name
|
||||
|
||||
needs: [meta, macOS-Core]
|
||||
runs-on: macos-latest
|
||||
runs-on: macos-26
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Install Dependencies
|
||||
- name: Install dependencies
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
brew install graphicsmagick imagemagick
|
||||
@@ -413,26 +413,26 @@ jobs:
|
||||
run: |
|
||||
git submodule update --init --depth 1 src/MaaMacGui
|
||||
|
||||
- name: Download Arm64 MAA from Github
|
||||
- name: Download MAA (arm64) from GitHub
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: MAACore-macos-arm64
|
||||
path: install-arm64
|
||||
|
||||
- name: Download x64 MAA from Github
|
||||
- name: Download MAA (x64) from GitHub
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: MAACore-macos-x86_64
|
||||
path: install-x86_64
|
||||
|
||||
- name: Install Developer ID Certificate
|
||||
- name: Install Developer ID certificate
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
uses: apple-actions/import-codesign-certs@v5
|
||||
with:
|
||||
p12-file-base64: ${{ secrets.HGUANDL_SIGN_CERT_P12 }}
|
||||
p12-password: ${{ secrets.HGUANDL_SIGN_CERT_PASSWD }}
|
||||
|
||||
- name: Download Provisioning Profiles
|
||||
- name: Download provisioning profiles
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
uses: apple-actions/download-provisioning-profiles@v4
|
||||
with:
|
||||
@@ -441,19 +441,19 @@ jobs:
|
||||
api-key-id: ${{ secrets.HGUANDL_APPSTORE_KEYID }}
|
||||
api-private-key: ${{ secrets.HGUANDL_APPSTORE_KEY }}
|
||||
|
||||
- name: Setup Xcode Toolchain
|
||||
if: true
|
||||
- name: Setup Xcode toolchain
|
||||
if: false
|
||||
run: |
|
||||
sudo xcode-select -s /Applications/Xcode_16.1.app/Contents/Developer
|
||||
|
||||
- name: Build Universal Binaries
|
||||
- name: Build universal binaries
|
||||
run: |
|
||||
mkdir build
|
||||
for LIB_NAME in $(ls install-arm64); do
|
||||
lipo -create install-arm64/$LIB_NAME install-x86_64/$LIB_NAME -output build/$LIB_NAME
|
||||
done
|
||||
|
||||
- name: Archive Runtime Files
|
||||
- name: Archive runtime files
|
||||
run: |
|
||||
mkdir runtime && cd runtime
|
||||
name='MAA-${{ needs.meta.outputs.tag }}-macos-runtime-universal'
|
||||
@@ -465,7 +465,7 @@ jobs:
|
||||
cd .. || exit 1
|
||||
zip -yrX9 "$name.zip" "$name"
|
||||
|
||||
- name: Upload MAA runtime to Github
|
||||
- name: Upload MAA runtime to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MAA-macos-runtime-universal
|
||||
@@ -479,7 +479,7 @@ jobs:
|
||||
xcodebuild -create-xcframework -library libopencv*.dylib -output OpenCV.xcframework
|
||||
working-directory: build
|
||||
|
||||
- name: Setup GUI Version
|
||||
- name: Setup GUI version
|
||||
run: |
|
||||
RELEASE_COUNT=$(git ls-remote --tags origin | grep refs/tags/v | awk 'END{print NR}')
|
||||
echo 'MARKETING_VERSION = ${{ needs.meta.outputs.tag }}' | tee src/MaaMacGui/Version.xcconfig
|
||||
@@ -500,20 +500,20 @@ jobs:
|
||||
xcodebuild -exportArchive -archivePath MAA.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath Export
|
||||
working-directory: src/MaaMacGui
|
||||
|
||||
- name: Create Disk Image
|
||||
- name: Create disk image
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
create-dmg Export/MAA.app
|
||||
mv MAA*.dmg MAA.dmg
|
||||
working-directory: src/MaaMacGui
|
||||
|
||||
- name: Archive Debug Symbols
|
||||
- name: Archive debug symbols
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
ditto -c -k --keepParent MAA.app.dSYM MAA.app.dSYM.zip
|
||||
working-directory: src/MaaMacGui/MAA.xcarchive/dSYMs
|
||||
|
||||
- name: Place Packages
|
||||
- name: Place packages
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
GIT_TAG=${{ needs.meta.outputs.tag }}
|
||||
@@ -523,7 +523,7 @@ jobs:
|
||||
mv src/MaaMacGui/MAA.dmg release/${APP_DMG}
|
||||
mv src/MaaMacGui/MAA.xcarchive/dSYMs/MAA.app.dSYM.zip release/${APP_SYM}
|
||||
|
||||
- name: Notarize Image
|
||||
- name: Notarize image
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
uses: nick-fields/retry@v3
|
||||
with:
|
||||
@@ -539,20 +539,21 @@ jobs:
|
||||
APPSTORE_KEY: ${{ secrets.HGUANDL_APPSTORE_KEY }}
|
||||
ISSUER_ID: ${{ secrets.HGUANDL_APPSTORE_ISSUER }}
|
||||
|
||||
- name: Attach Notarization Tickets
|
||||
- name: Attach notarization tickets
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
dmg="MAA-${{ needs.meta.outputs.tag }}-macos-universal.dmg"
|
||||
xcrun stapler staple ${dmg}
|
||||
working-directory: release
|
||||
|
||||
- name: Upload MAA to Github
|
||||
- name: Upload MAA to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MAA-macos-universal
|
||||
path: ${{ startsWith(github.ref, 'refs/tags/v') && 'release/MAA*' || 'src/MaaMacGui/MAA.xcarchive/**' }}
|
||||
|
||||
release:
|
||||
name: Publish Release
|
||||
# Prevent duplicate runs on organization branches with PRs
|
||||
if: (github.event_name != 'pull_request' ||
|
||||
github.event.pull_request.head.repo.full_name !=
|
||||
@@ -561,12 +562,12 @@ jobs:
|
||||
needs: [meta, windows, ubuntu, macOS-Core, macOS-GUI]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download MAA from Github
|
||||
- name: Download MAA from GitHub
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
path: assets
|
||||
|
||||
- name: Cleanup files
|
||||
- name: Clean up files
|
||||
run: |
|
||||
mv -vf assets/changelog/* .
|
||||
rm -rf assets/MAACore-macos-*
|
||||
@@ -574,24 +575,24 @@ jobs:
|
||||
# find . -type f | xargs mv -fvt .
|
||||
find . -type f | while read f; do mv -fvt . $f; done
|
||||
|
||||
- name: Release to Github
|
||||
uses: softprops/action-gh-release@v2.3.3
|
||||
- name: Publish release to GitHub
|
||||
uses: softprops/action-gh-release@v2.4.1
|
||||
with:
|
||||
body_path: CHANGELOG.md
|
||||
files: |
|
||||
assets/*
|
||||
prerelease: ${{ needs.meta.outputs.prerelease != 'false' }}
|
||||
|
||||
- name: Trigger MirrorChyan
|
||||
- name: Trigger MirrorChyan-related workflows
|
||||
run: |
|
||||
gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan
|
||||
gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan_release_note
|
||||
gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan.yml
|
||||
gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan_release_note.yml
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Trigger secondary workflows # ref: https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow
|
||||
- name: Trigger OTA release workflow # ref: https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow
|
||||
run: |
|
||||
gh workflow run --repo $GITHUB_REPOSITORY release-ota
|
||||
gh workflow run --repo $GITHUB_REPOSITORY release-ota.yml
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}
|
||||
|
||||
@@ -600,6 +601,6 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3
|
||||
with:
|
||||
actions: "create-issue"
|
||||
title: "Failed Release"
|
||||
title: "Errors occured during release ${{ needs.meta.outputs.tag }}"
|
||||
body: |
|
||||
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
15
.github/workflows/codeql-core.yml
vendored
15
.github/workflows/codeql-core.yml
vendored
@@ -1,15 +1,15 @@
|
||||
name: "CodeQL MaaCore and MaaWpfGui Analysis"
|
||||
name: CodeQL Code Analysis
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: ["dev"]
|
||||
paths:
|
||||
- ".github/workflows/codeql-core.yml"
|
||||
- "3rdparty/include/**"
|
||||
- "include/**"
|
||||
- "src/**"
|
||||
- "cmake/**"
|
||||
- "CMakeLists.txt"
|
||||
- ".github/workflows/codeql-core.yml"
|
||||
- "include/**"
|
||||
- "src/**"
|
||||
- "!**/*.md"
|
||||
- "!**/*.xaml"
|
||||
schedule:
|
||||
@@ -25,6 +25,7 @@ permissions:
|
||||
jobs:
|
||||
analyze-manual:
|
||||
name: Analyze MaaCore and MaaWpfGui
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -33,15 +34,13 @@ jobs:
|
||||
show-progress: false
|
||||
|
||||
- name: Setup CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
uses: github/codeql-action/init@v4
|
||||
with:
|
||||
languages: c-cpp,csharp
|
||||
build-mode: manual
|
||||
|
||||
- name: Run CodeQL
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:multi-manual"
|
||||
uses: github/codeql-action/analyze@v4
|
||||
|
||||
- name: Delete old caches
|
||||
shell: pwsh
|
||||
|
||||
7
.github/workflows/codeql-wf.yml
vendored
7
.github/workflows/codeql-wf.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: "CodeQL Workflows Analysis"
|
||||
name: CodeQL Workflow Analysis
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -17,6 +17,7 @@ permissions:
|
||||
jobs:
|
||||
analyze-workflows:
|
||||
name: Analyze GitHub Workflows
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -25,12 +26,12 @@ jobs:
|
||||
show-progress: false
|
||||
|
||||
- name: Setup CodeQL for GitHub Actions
|
||||
uses: github/codeql-action/init@v3
|
||||
uses: github/codeql-action/init@v4
|
||||
with:
|
||||
languages: actions
|
||||
build-mode: none
|
||||
|
||||
- name: Run CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
uses: github/codeql-action/analyze@v4
|
||||
with:
|
||||
category: "/language:multi-none"
|
||||
|
||||
17
.github/workflows/gen-changelog.yml
vendored
17
.github/workflows/gen-changelog.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: gen-changelog
|
||||
name: Changelog Generation
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -10,17 +10,18 @@ on:
|
||||
|
||||
jobs:
|
||||
gen:
|
||||
name: Generate Changelog
|
||||
# startsWith 表达式不区分大小写
|
||||
if: github.event.pull_request.draft == false && startsWith(github.event.pull_request.title, 'Release v')
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
show-progress: false
|
||||
|
||||
- name: Extract tag name
|
||||
- name: Extract release information
|
||||
id: extract_tag
|
||||
env:
|
||||
PR_BODY: ${{ format('{0}/{1}', runner.temp, 'output' ) }}
|
||||
@@ -50,7 +51,7 @@ jobs:
|
||||
|
||||
echo 'Target PR: ${{ github.event.pull_request.html_url }}' >> $PR_BODY
|
||||
echo '' >> $PR_BODY
|
||||
echo '<details><summary>Debug info</summary>' >> $PR_BODY
|
||||
echo '<details><summary>Debug information</summary>' >> $PR_BODY
|
||||
echo '' >> $PR_BODY
|
||||
echo '```' >> $PR_BODY
|
||||
sed 's/=/: /1' $GITHUB_OUTPUT >> $PR_BODY
|
||||
@@ -60,14 +61,14 @@ jobs:
|
||||
|
||||
cat $PR_BODY
|
||||
|
||||
- name: Generate Changelog
|
||||
- name: Generate changelog
|
||||
run: |
|
||||
git switch dev
|
||||
python3 tools/ChangelogGenerator/changelog_generator.py --tag "${{ steps.extract_tag.outputs.tag_name }}" --latest "${{ steps.extract_tag.outputs.latest }}"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Add files to git
|
||||
- name: Commit changes
|
||||
run: |
|
||||
git status
|
||||
|
||||
@@ -78,7 +79,7 @@ jobs:
|
||||
commit_msg="docs: Auto Generate Changelog of Release ""${{ steps.extract_tag.outputs.tag_name }}"
|
||||
git commit -m "$commit_msg"
|
||||
|
||||
- name: Create PR
|
||||
- name: Create changelog PR
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
sign-commits: true
|
||||
@@ -93,7 +94,7 @@ jobs:
|
||||
assignees: |
|
||||
AnnAngela
|
||||
|
||||
- name: Add reviewers to release PR
|
||||
- name: Assign reviewers to release PR
|
||||
uses: kentaro-m/auto-assign-action@v2.0.0
|
||||
with:
|
||||
configuration-path: ".github/release_reviewers.yaml"
|
||||
|
||||
7
.github/workflows/issue-checkbox-checker.yml
vendored
7
.github/workflows/issue-checkbox-checker.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Auto Close not reading issues or Fold checkboxes
|
||||
name: Issue Review
|
||||
|
||||
on:
|
||||
issues:
|
||||
@@ -6,6 +6,7 @@ on:
|
||||
|
||||
jobs:
|
||||
check-then-close-or-fold:
|
||||
name: Review and Modify Issues
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
@@ -63,7 +64,7 @@ jobs:
|
||||
}
|
||||
}
|
||||
|
||||
- name: Check checkbox status
|
||||
- name: Check for issue checkboxes
|
||||
id: unread-checkbox-check
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
@@ -86,7 +87,7 @@ jobs:
|
||||
'I have checked all the options without carefully reading the content and believe this will not affect issue resolution.'];
|
||||
return texts.some(text => new RegExp(`- \\[x\\]\\s*${text}`).test(context.payload.issue.body));
|
||||
|
||||
- name: Close and lock issue
|
||||
- name: Close low-quality issue
|
||||
if: steps.unread-checkbox-check.outputs.result == 'true'
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
|
||||
6
.github/workflows/issue-checker.yml
vendored
6
.github/workflows/issue-checker.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: "Issue Checker"
|
||||
name: Issue Triage
|
||||
|
||||
on:
|
||||
issues:
|
||||
@@ -15,9 +15,11 @@ permissions:
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
name: Triage Issues and PRs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: MaaAssistantArknights/issue-checker@v1.14
|
||||
- name: Label issues and PRs Automatically
|
||||
uses: MaaAssistantArknights/issue-checker@v1.14
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
configuration-path: .github/issue-checker.yml
|
||||
|
||||
19
.github/workflows/markdown-checker.yml
vendored
19
.github/workflows/markdown-checker.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Check Dead Links
|
||||
name: Markdown Link Check
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -7,22 +7,22 @@ on:
|
||||
branches:
|
||||
- dev
|
||||
paths:
|
||||
- "**/*.md"
|
||||
- "docs/**"
|
||||
- ".github/workflows/markdown-checker.yml"
|
||||
- "docs/**"
|
||||
- "**/*.md"
|
||||
pull_request:
|
||||
branches:
|
||||
- dev
|
||||
paths:
|
||||
- "**/*.md"
|
||||
- "docs/**"
|
||||
- ".github/workflows/markdown-checker.yml"
|
||||
- "docs/**"
|
||||
- "**/*.md"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
check-links:
|
||||
if: github.repository_owner == 'MaaAssistantArknights' && github.event.head_commit.author.email != '41898282+github-actions[bot]@users.noreply.github.com'
|
||||
name: Check Dead Links
|
||||
if: github.repository_owner == 'MaaAssistantArknights' && github.event.head_commit.author.email != '41898282+github-actions[bot]@users.noreply.github.com'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
@@ -30,19 +30,18 @@ jobs:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
steps:
|
||||
- name: Check out code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Cache Primes
|
||||
id: cache-primes
|
||||
- name: Cache lychee responses
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .lycheecache
|
||||
key: lychee-cache
|
||||
|
||||
- name: Check dead links
|
||||
- name: Check dead internal links
|
||||
uses: lycheeverse/lychee-action@v2
|
||||
with:
|
||||
# 仅检查内部链接,排除所有外部链接
|
||||
|
||||
3
.github/workflows/mirrorchyan.yml
vendored
3
.github/workflows/mirrorchyan.yml
vendored
@@ -1,10 +1,11 @@
|
||||
name: mirrorchyan
|
||||
name: Release Package Distribution
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
mirrorchyan:
|
||||
name: Upload to MirrorChyan
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
name: mirrorchyan_release_note
|
||||
|
||||
name: Release Note Distribution
|
||||
on:
|
||||
workflow_dispatch:
|
||||
release:
|
||||
@@ -7,10 +6,11 @@ on:
|
||||
|
||||
jobs:
|
||||
mirrorchyan:
|
||||
name: Upload to MirrorChyan
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- name: Release Note for MAA
|
||||
- name: Upload release notes to MirrorChyan
|
||||
uses: MirrorChyan/release-note-action@v1
|
||||
with:
|
||||
mirrorchyan_rid: MAA
|
||||
|
||||
11
.github/workflows/optimize-templates.yml
vendored
11
.github/workflows/optimize-templates.yml
vendored
@@ -1,14 +1,12 @@
|
||||
name: Optimize PNG Templates
|
||||
name: PNG Image Optimization
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "dev"
|
||||
paths:
|
||||
- "resource/**/*.png"
|
||||
- "docs/.vuepress/public/images/**"
|
||||
- "website/apps/web/public/**"
|
||||
- "website/apps/web/src/assets/links/**"
|
||||
- "resource/**/*.png"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
commit_message:
|
||||
@@ -18,12 +16,13 @@ on:
|
||||
|
||||
jobs:
|
||||
optimize-png:
|
||||
name: Optimize PNG Images
|
||||
# Skip workflow to prevent double consecutive runs
|
||||
# Skip workflow on PR merges
|
||||
if: github.repository_owner == 'MaaAssistantArknights' && ${{ github.event.head_commit.author.email != '41898282+github-actions[bot]@users.noreply.github.com' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check for direct push
|
||||
- name: Check if it is a direct push
|
||||
id: check_push
|
||||
run: |
|
||||
if [[ "${{ github.event_name }}" != "workflow_dispatch" ]]; then
|
||||
@@ -75,7 +74,7 @@ jobs:
|
||||
with:
|
||||
crate: oxipng
|
||||
|
||||
- name: Run optimize_templates
|
||||
- name: Optimize png images
|
||||
if: steps.check_push.outputs.is_pr != 'True'
|
||||
run: |
|
||||
python3 tools/OptimizeTemplates/optimize_templates.py
|
||||
|
||||
13
.github/workflows/pr-auto-tag.yml
vendored
13
.github/workflows/pr-auto-tag.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Auto Tag Release PR
|
||||
name: Release Version Tagging
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -15,22 +15,23 @@ on:
|
||||
|
||||
jobs:
|
||||
auto_tag_release:
|
||||
name: Tag Release
|
||||
if: github.event.pull_request.merged == true && (startsWith(github.event.pull_request.title, 'Release v') || startsWith(github.event.pull_request.title, 'release v')) || github.event_name == 'workflow_dispatch'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.MAARELEASE_RELEASE }}
|
||||
|
||||
- name: Git config
|
||||
- name: Configure git
|
||||
run: |
|
||||
git config user.name "$GITHUB_ACTOR"
|
||||
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||
|
||||
- name: Extract tag name
|
||||
- name: Determine tag name
|
||||
id: extract_tag
|
||||
run: |
|
||||
if ${{ github.event_name != 'workflow_dispatch' }}; then
|
||||
@@ -40,12 +41,12 @@ jobs:
|
||||
echo "tag_name=${{ inputs.tag }}" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Create release tag and push
|
||||
- name: Create and push release tag
|
||||
run: |
|
||||
git tag -a "${{ steps.extract_tag.outputs.tag_name }}" -m "${{ steps.extract_tag.outputs.tag_name }}" -f
|
||||
git push origin "${{ steps.extract_tag.outputs.tag_name }}"
|
||||
|
||||
- name: Merge into dev and push
|
||||
- name: Merge tag into dev and push
|
||||
run: |
|
||||
git switch dev
|
||||
git merge "${{ steps.extract_tag.outputs.tag_name }}"
|
||||
|
||||
7
.github/workflows/pr-checker.yml
vendored
7
.github/workflows/pr-checker.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: PR Checker
|
||||
name: PR Commit Check
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
@@ -6,10 +6,11 @@ on:
|
||||
|
||||
jobs:
|
||||
check_commit_name_in_pr:
|
||||
name: Check Commits in PR
|
||||
if: ${{ !github.event.pull_request.merged && github.base_ref != 'master' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cleanup Previous Comment
|
||||
- name: Clean up previous comment
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
@@ -27,7 +28,7 @@ jobs:
|
||||
comment_id: previousComment.id
|
||||
});
|
||||
}
|
||||
- name: Check Commits
|
||||
- name: Check commits
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
|
||||
28
.github/workflows/release-nightly-ota.yml
vendored
28
.github/workflows/release-nightly-ota.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: release-nightly-ota
|
||||
name: Release Pipeline (Nightly OTA)
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -26,6 +26,7 @@ on:
|
||||
|
||||
jobs:
|
||||
build-win-nightly:
|
||||
name: Build Nightly for Windows
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
@@ -38,7 +39,8 @@ jobs:
|
||||
main_tag_name: ${{ steps.push_main_tag.outputs.main_tag_name }}
|
||||
changelog: ${{ steps.read_changelog.outputs.content }}
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
# repository: 'MaaAssistantArknights/MaaAssistantArknights'
|
||||
#ref: ${{ inputs.ref }}
|
||||
@@ -138,7 +140,7 @@ jobs:
|
||||
|
||||
gh run watch ${{ github.run_id }}
|
||||
|
||||
- name: Generate Changelog
|
||||
- name: Generate changelog
|
||||
id: generate_changelog
|
||||
run: |
|
||||
python3 tools/ChangelogGenerator/changelog_generator.py --latest "${{ steps.set_tag.outputs.latest_tag }}" --tag "${{ steps.set_tag.outputs.tag }}"
|
||||
@@ -160,7 +162,7 @@ jobs:
|
||||
|
||||
gh run watch ${{ github.run_id }}
|
||||
|
||||
- name: Read Changelog to variable
|
||||
- name: Read changelog to variable
|
||||
id: read_changelog
|
||||
uses: juliangruber/read-file-action@v1
|
||||
with:
|
||||
@@ -208,7 +210,7 @@ jobs:
|
||||
if: steps.cache-nuget.outputs.cache-hit != 'true'
|
||||
run: dotnet restore src/MaaWpfGui/MaaWpfGui.csproj
|
||||
|
||||
- name: Taggify Version for csproj
|
||||
- name: Taggify version for csproj
|
||||
run: |
|
||||
$csprojPath = "src/MaaWpfGui/MaaWpfGui.csproj"
|
||||
$csprojPath = Resolve-Path -Path $csprojPath
|
||||
@@ -230,7 +232,7 @@ jobs:
|
||||
run: |
|
||||
dotnet publish src/MaaWpfGui/MaaWpfGui.csproj -c Release -o install
|
||||
|
||||
- name: Organize Install Files
|
||||
- name: Organize install files
|
||||
shell: bash
|
||||
run: |
|
||||
rm -rf install/*.pdb
|
||||
@@ -239,7 +241,7 @@ jobs:
|
||||
|
||||
cp tools/DependencySetup_依赖库安装.bat install
|
||||
|
||||
- name: Upload MAA to Github
|
||||
- name: Upload MAA to GitHub
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MAA-win-${{ matrix.arch }}
|
||||
@@ -257,11 +259,12 @@ jobs:
|
||||
echo "main_tag_name=$main_tag_name" >> $env:GITHUB_OUTPUT
|
||||
|
||||
push-tag:
|
||||
name: Push Tag to MaaRelease
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
needs: build-win-nightly
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Fetch MaaRelease
|
||||
- name: Checkout MaaRelease
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: ${{ format('{0}/{1}', github.repository_owner, 'MaaRelease') }}
|
||||
@@ -280,6 +283,7 @@ jobs:
|
||||
git push --tags origin HEAD:refs/tags/${{ needs.build-win-nightly.outputs.tag }}
|
||||
|
||||
make-ota:
|
||||
name: Build and Upload Nightly OTA for Windows
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
needs: [build-win-nightly, push-tag]
|
||||
strategy:
|
||||
@@ -287,24 +291,24 @@ jobs:
|
||||
target: [x64]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Echo tag version
|
||||
- name: Show tag version
|
||||
run: |
|
||||
echo ${{ needs.build-win-nightly.outputs.tag }}
|
||||
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
path: MaaAssistantArknights
|
||||
token: ${{ secrets.MAARELEASE_RELEASE }}
|
||||
show-progress: false
|
||||
|
||||
- name: Download MAA from Github
|
||||
- name: Download MAA from GitHub
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: MAA-win-${{ matrix.target }}
|
||||
path: ${{ format('{0}/{1}', 'build-ota', needs.build-win-nightly.outputs.tag) }}
|
||||
|
||||
- name: Fetch release info
|
||||
- name: Fetch release information
|
||||
run: |
|
||||
mkdir -pv build-ota && cd build-ota
|
||||
|
||||
|
||||
26
.github/workflows/release-ota.yml
vendored
26
.github/workflows/release-ota.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: release-ota
|
||||
name: Release Pipeline (OTA)
|
||||
|
||||
on:
|
||||
release:
|
||||
@@ -22,9 +22,10 @@ env:
|
||||
|
||||
jobs:
|
||||
create-tag:
|
||||
name: Create OTA Release Tag in MaaRelease
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Fetch MaaRelease
|
||||
- name: Checkout MaaRelease
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
@@ -33,7 +34,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.MAARELEASE_RELEASE }}
|
||||
|
||||
- name: Fetch release info
|
||||
- name: Fetch release information
|
||||
id: fetchReleaseInfo
|
||||
run: |
|
||||
mkdir -pv build-ota && cd build-ota
|
||||
@@ -86,6 +87,7 @@ jobs:
|
||||
release_tag: ${{ steps.fetchReleaseInfo.outputs.release_tag }}
|
||||
|
||||
make-ota:
|
||||
name: Build and Upload OTA for Windows
|
||||
needs: create-tag
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
@@ -99,7 +101,7 @@ jobs:
|
||||
name: MaaReleaseConfig
|
||||
path: ./MaaReleaseConfig
|
||||
|
||||
- name: Fetch MaaRelease
|
||||
- name: Checkout MaaRelease
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
@@ -108,7 +110,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.MAARELEASE_RELEASE }}
|
||||
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
@@ -142,15 +144,16 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3
|
||||
with:
|
||||
actions: "create-issue"
|
||||
title: "Failed make release OTA for Windows"
|
||||
title: "Failed to make OTA release for Windows"
|
||||
body: |
|
||||
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
make-ota-mac:
|
||||
name: Build and Upload OTA for macOS
|
||||
needs: create-tag
|
||||
runs-on: macos-14
|
||||
steps:
|
||||
- name: Fetch release info
|
||||
- name: Fetch release information
|
||||
run: gh release list --repo 'MaaAssistantArknights/MaaAssistantArknights' --limit ${{ inputs.limit || 31 }} | tee ./release_maa.txt
|
||||
|
||||
- name: Download release packages
|
||||
@@ -166,7 +169,7 @@ jobs:
|
||||
run: |
|
||||
gh release download --repo 'sparkle-project/Sparkle' --clobber -O - -p 'Sparkle-*.tar.xz' | tar xf -
|
||||
|
||||
- name: Generate Update Packages
|
||||
- name: Generate update packages
|
||||
run: |
|
||||
if [ $(head -n 1 release_maa.txt | awk '{ print $2 }') = 'Pre-release' ]; then
|
||||
echo ${{ secrets.SPARKLE_PRIV_KEY }} | ./bin/generate_appcast --channel beta --ed-key-file - ./packages
|
||||
@@ -174,7 +177,7 @@ jobs:
|
||||
echo ${{ secrets.SPARKLE_PRIV_KEY }} | ./bin/generate_appcast --ed-key-file - ./packages
|
||||
fi
|
||||
|
||||
- name: Cleanup files
|
||||
- name: Clean up files
|
||||
run: |
|
||||
find ./packages -type f ! \( -name 'MAA-${{ needs.create-tag.outputs.release_tag }}-macos-universal.dmg' -o -name '*.delta' -o -name '*.xml' \) -print -delete
|
||||
|
||||
@@ -194,11 +197,12 @@ jobs:
|
||||
uses: actions-cool/issues-helper@v3
|
||||
with:
|
||||
actions: "create-issue"
|
||||
title: "Failed make release OTA for macos"
|
||||
title: "Failed to make OTA release for macOS"
|
||||
body: |
|
||||
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
|
||||
release:
|
||||
name: Publish to Release Mirrors
|
||||
needs:
|
||||
- make-ota
|
||||
- make-ota-mac
|
||||
|
||||
63
.github/workflows/res-update-game.yml
vendored
63
.github/workflows/res-update-game.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Resource Updater
|
||||
name: Game Resource Update
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -12,6 +12,7 @@ on:
|
||||
|
||||
jobs:
|
||||
clone-resources-official:
|
||||
name: Download Official Resources
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -35,7 +36,7 @@ jobs:
|
||||
/gamedata/excel/roguelike_topic_table.json
|
||||
/gamedata/excel/activity_table.json
|
||||
|
||||
- name: Upload Official
|
||||
- name: Upload Official resources
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: official
|
||||
@@ -43,6 +44,7 @@ jobs:
|
||||
compression-level: 0
|
||||
|
||||
clone-resources-overseas:
|
||||
name: Download Overseas Resources
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -77,7 +79,7 @@ jobs:
|
||||
/kr/gamedata/excel/roguelike_topic_table.json
|
||||
/kr/gamedata/excel/activity_table.json
|
||||
|
||||
- name: Upload Official
|
||||
- name: Upload Overseas resources
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: overseas
|
||||
@@ -85,6 +87,7 @@ jobs:
|
||||
compression-level: 0
|
||||
|
||||
clone-resources-txwy:
|
||||
name: Download Taiwan Resources
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -117,7 +120,7 @@ jobs:
|
||||
done
|
||||
wait
|
||||
|
||||
- name: Upload Official
|
||||
- name: Upload Taiwan resources
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: txwy
|
||||
@@ -125,13 +128,14 @@ jobs:
|
||||
compression-level: 0
|
||||
|
||||
update-game-resources:
|
||||
name: Update Game Resources
|
||||
# In case of rate limitations on the runners/instances, add dependency, by removing the comment
|
||||
|
||||
# needs: [clone-resources-official, clone-resources-overseas, clone-resources-txwy]
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- name: Checkout MAA
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
# TL;DR https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/9872#issuecomment-2251378371
|
||||
@@ -202,10 +206,10 @@ jobs:
|
||||
name: txwy
|
||||
path: ./tools/ResourceUpdater/Overseas/tw/gamedata/excel
|
||||
|
||||
- name: Delay txwy
|
||||
- name: Delay for txwy
|
||||
if: steps.download-txwy.outcome == 'failure'
|
||||
run: |
|
||||
sleep 10
|
||||
sleep 30
|
||||
|
||||
- name: Re-download txwy
|
||||
if: steps.download-txwy.outcome == 'failure'
|
||||
@@ -222,10 +226,10 @@ jobs:
|
||||
name: overseas
|
||||
path: ./tools/ResourceUpdater/Overseas
|
||||
|
||||
- name: Delay Overseas
|
||||
- name: Delay for Overseas
|
||||
if: steps.download-overseas.outcome == 'failure'
|
||||
run: |
|
||||
sleep 10
|
||||
sleep 30
|
||||
|
||||
- name: Re-download Overseas
|
||||
if: steps.download-overseas.outcome == 'failure'
|
||||
@@ -242,10 +246,10 @@ jobs:
|
||||
name: official
|
||||
path: ./tools/ResourceUpdater/Official
|
||||
|
||||
- name: Delay Official
|
||||
- name: Delay for Official
|
||||
if: steps.download-official.outcome == 'failure'
|
||||
run: |
|
||||
sleep 10
|
||||
sleep 30
|
||||
|
||||
- name: Re-download Official
|
||||
if: steps.download-official.outcome == 'failure'
|
||||
@@ -254,11 +258,11 @@ jobs:
|
||||
name: official
|
||||
path: ./tools/ResourceUpdater/Official
|
||||
|
||||
- name: Run Resource Updater
|
||||
- name: Update resources
|
||||
run: |
|
||||
./tools/ResourceUpdater/res_updater
|
||||
|
||||
- name: Task Sorting
|
||||
- name: Sort tasks
|
||||
id: task_sorting
|
||||
run: |
|
||||
python3 tools/TaskSorter/TaskSorter.py
|
||||
@@ -272,7 +276,7 @@ jobs:
|
||||
- name: Update version.json date if necessary
|
||||
id: update_version
|
||||
run: |
|
||||
./tools/ResourceUpdater/version.zsh
|
||||
sh ./tools/ResourceUpdater/version.sh
|
||||
|
||||
- name: Setup python
|
||||
if: steps.update_version.outputs.contains_png == 'True'
|
||||
@@ -280,7 +284,7 @@ jobs:
|
||||
with:
|
||||
python-version: "3.11"
|
||||
|
||||
- name: Cache Python packages
|
||||
- name: Cache python packages
|
||||
if: always() && steps.update_version.outputs.contains_png == 'True'
|
||||
id: cache_python
|
||||
uses: actions/cache@v4
|
||||
@@ -299,12 +303,12 @@ jobs:
|
||||
with:
|
||||
crate: oxipng
|
||||
|
||||
- name: Run optimize_templates
|
||||
- name: Optimize png images
|
||||
if: steps.update_version.outputs.contains_png == 'True'
|
||||
run: |
|
||||
python3 tools/OptimizeTemplates/optimize_templates.py -p resource/template/items/ resource/template/infrast/
|
||||
|
||||
- name: Add files to git
|
||||
- name: Commit changes
|
||||
if: steps.update_version.outputs.changes == 'True'
|
||||
id: add_files
|
||||
run: |
|
||||
@@ -349,4 +353,27 @@ jobs:
|
||||
# - name: Release # ref: https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow
|
||||
# if: steps.add_files.outputs.have_commits == 'True'
|
||||
# run: |
|
||||
# gh workflow run release-nightly-ota -f release_body="Auto Release of Resource Updates"
|
||||
# gh workflow run release-nightly-ota.yml -f release_body="Auto Release of Resource Updates"
|
||||
|
||||
- name: Comment on issue if failed
|
||||
if: failure() && github.ref == 'refs/heads/dev'
|
||||
run: |
|
||||
# Minimize old failure comments
|
||||
comments=$(gh api repos/${{ github.repository }}/issues/14493/comments --jq '.[] | select(.user.login == "github-actions[bot]") | select(.body | contains("${{ github.server_url }}/${{ github.repository }}/actions/runs/")) | .node_id')
|
||||
for node_id in $comments; do
|
||||
gh api graphql -f query='
|
||||
mutation {
|
||||
minimizeComment(input: {subjectId: "'"$node_id"'", classifier: OUTDATED}) {
|
||||
minimizedComment {
|
||||
isMinimized
|
||||
}
|
||||
}
|
||||
}'
|
||||
done
|
||||
|
||||
# Add new failure comment
|
||||
gh issue comment 14493 -R ${{ github.repository }} --body "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
||||
@MistEO @ABA2396 @Constrat"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
35
.github/workflows/smoke-testing.yml
vendored
35
.github/workflows/smoke-testing.yml
vendored
@@ -1,41 +1,44 @@
|
||||
name: smoke-testing
|
||||
name: Smoke Test
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- ".github/workflows/smoke-testing.yml"
|
||||
- "3rdparty/include/**"
|
||||
- "include/**"
|
||||
- "src/Cpp/**"
|
||||
- "src/MaaCore/**"
|
||||
- "resource/**"
|
||||
- "!**/*.md"
|
||||
- "cmake/**"
|
||||
- "CMakeLists.txt"
|
||||
- "include/**"
|
||||
- "resource/**"
|
||||
- "src/Cpp/**"
|
||||
- "src/MaaCore/**"
|
||||
- "tools/maadeps-download.py"
|
||||
- "tools/SmokeTesting/**"
|
||||
- "!**/*.md"
|
||||
pull_request:
|
||||
paths:
|
||||
- ".github/workflows/smoke-testing.yml"
|
||||
- "3rdparty/include/**"
|
||||
- "include/**"
|
||||
- "src/Cpp/**"
|
||||
- "src/MaaCore/**"
|
||||
- "resource/**"
|
||||
- "!**/*.md"
|
||||
- "cmake/**"
|
||||
- "CMakeLists.txt"
|
||||
- "include/**"
|
||||
- "resource/**"
|
||||
- "src/Cpp/**"
|
||||
- "src/MaaCore/**"
|
||||
- "tools/maadeps-download.py"
|
||||
- "tools/SmokeTesting/**"
|
||||
- "!**/*.md"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
smoke-testing:
|
||||
name: Run Smoke Test
|
||||
# Prevent duplicate runs on organization branches with PRs
|
||||
if: github.event_name != 'pull_request' ||
|
||||
github.event.pull_request.head.repo.full_name !=
|
||||
github.event.pull_request.base.repo.full_name
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
@@ -45,7 +48,7 @@ jobs:
|
||||
run: |
|
||||
echo "key=Smoke-testing-${{ hashFiles('src/Cpp/**', 'src/MaaCore/**', '3rdparty/include/**', 'include/**', 'cmake/**', 'CMakeLists.txt', 'tools/maadeps-download.py', 'tools/linux-toolchain-download.py') }}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Restore cache smoke-testing
|
||||
- name: Restore cache for Smoke Test
|
||||
id: smoke-cache
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
@@ -99,16 +102,16 @@ jobs:
|
||||
mkdir -p install
|
||||
cmake --install build --prefix install --config Debug
|
||||
|
||||
- name: Make link for cache smoke-testing
|
||||
- name: Make link to Smoke Test cache
|
||||
if: steps.smoke-cache.outputs.cache-hit == 'true'
|
||||
run: |
|
||||
ln -s "$(pwd)/resource" install/resource
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
./tools/SmokeTesting/run_tests.zsh
|
||||
sh ./tools/SmokeTesting/run_tests.sh
|
||||
|
||||
- name: Save cache smoke-testing (only in dev)
|
||||
- name: Save cache for Smoke Test (only in dev)
|
||||
if: steps.smoke-cache.outputs.cache-hit != 'true' && github.ref == 'refs/heads/dev'
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
|
||||
5
.github/workflows/stale.yml
vendored
5
.github/workflows/stale.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: "Inactive Issues Closer"
|
||||
name: Issue Staleness Management
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -11,6 +11,7 @@ env: # config
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
name: Handle Stale Issues
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@@ -20,7 +21,7 @@ jobs:
|
||||
pull-requests: none
|
||||
contents: none
|
||||
steps:
|
||||
- name: Close inactive issues
|
||||
- name: Handle stale issues
|
||||
uses: actions/stale@v10
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
9
.github/workflows/sync-resource.yml
vendored
9
.github/workflows/sync-resource.yml
vendored
@@ -1,26 +1,27 @@
|
||||
name: sync-resource
|
||||
name: Resource Sync
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
paths:
|
||||
- "resource/**"
|
||||
- ".github/workflows/sync-resource.yml"
|
||||
- "resource/**"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
sync-resource:
|
||||
name: Sync Resource to MaaResource
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout MaaAssistantArknights
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Setup Git
|
||||
- name: Configure git
|
||||
run: |
|
||||
git config --global user.name 'github-actions[bot]'
|
||||
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
|
||||
|
||||
14
.github/workflows/website-workflow.yml
vendored
14
.github/workflows/website-workflow.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: MaaWebsite Workflow
|
||||
name: Documentation Site
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -26,15 +26,17 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build and Deploy Documentation Site
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- name: Checkout
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Setup Pages
|
||||
if: github.repository_owner == 'MaaAssistantArknights'
|
||||
uses: actions/configure-pages@v5
|
||||
|
||||
- name: Install pnpm
|
||||
@@ -44,7 +46,7 @@ jobs:
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js environment
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 24
|
||||
cache: pnpm
|
||||
@@ -54,18 +56,18 @@ jobs:
|
||||
run: pnpm install --frozen-lockfile
|
||||
working-directory: "./docs"
|
||||
|
||||
- name: Build documentation
|
||||
- name: Build documentation site
|
||||
run: pnpm run build
|
||||
working-directory: "./docs"
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
uses: actions/upload-pages-artifact@v4
|
||||
with:
|
||||
path: "./docs/.vuepress/dist"
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
if: ${{ inputs.deploy-to-prod == true || github.ref == 'refs/heads/master' }}
|
||||
if: github.repository_owner == 'MaaAssistantArknights' && (inputs.deploy-to-prod == true || github.ref == 'refs/heads/master')
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: "./docs/.vuepress/dist"
|
||||
|
||||
@@ -4,36 +4,47 @@ ci:
|
||||
autofix_prs: true
|
||||
repos:
|
||||
- repo: https://github.com/shssoichiro/oxipng
|
||||
rev: v9.1.4
|
||||
rev: v9.1.5
|
||||
hooks:
|
||||
- id: oxipng
|
||||
name: PNG Image Compression
|
||||
args: ["-q", "-o", "2", "-s", "--ng"]
|
||||
- repo: https://github.com/pre-commit/mirrors-clang-format
|
||||
rev: v20.1.0
|
||||
rev: v21.1.1
|
||||
hooks:
|
||||
- id: clang-format
|
||||
name: Clang-Format (MaaCore)
|
||||
files: ^src/MaaCore/.*
|
||||
args: ["--assume-filename", ".clang-format"]
|
||||
- repo: https://github.com/rbubley/mirrors-prettier
|
||||
rev: v3.5.3
|
||||
rev: v3.6.2
|
||||
hooks:
|
||||
- id: prettier
|
||||
name: prettier (config files)
|
||||
name: Prettier (Config Files)
|
||||
files: ^((\.github/ISSUE_TEMPLATE|resource|src|tools)/.*|\.pre-commit-config\.yaml|package-definition\.json)
|
||||
types_or:
|
||||
- yaml
|
||||
- json
|
||||
- repo: https://github.com/rbubley/mirrors-prettier
|
||||
rev: v3.5.3
|
||||
hooks:
|
||||
- id: prettier
|
||||
name: prettier (docs)
|
||||
name: Prettier (Documentation)
|
||||
files: ^docs/.*
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 25.9.0
|
||||
hooks:
|
||||
- id: black
|
||||
name: Black Formatter (Python)
|
||||
- repo: https://github.com/pycqa/isort
|
||||
rev: 6.0.1
|
||||
hooks:
|
||||
- id: isort
|
||||
name: Isort (Python)
|
||||
args: ["--profile", "black", "--filter-files"]
|
||||
- repo: https://github.com/DavidAnson/markdownlint-cli2
|
||||
rev: v0.17.2
|
||||
rev: v0.18.1
|
||||
hooks:
|
||||
- id: markdownlint-cli2
|
||||
name: MarkdownLint (Documentation)
|
||||
files: ^docs/.*|^README\.md$
|
||||
types:
|
||||
- markdown
|
||||
args: ["--fix", "--config", "docs/.markdownlint.yaml", "#**/node_modules"]
|
||||
args: ["--fix", "--config", "docs/.markdownlint.yaml"]
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
**/node_modules/
|
||||
**/pnpm-lock.yaml
|
||||
docs/**/*.md
|
||||
|
||||
MaaDeps/
|
||||
3rdparty/
|
||||
src/maa-cli
|
||||
src/MaaMacGui
|
||||
|
||||
# website/
|
||||
# docs/
|
||||
|
||||
resource/Arknights-Tile-Pos/
|
||||
tools/OptimizeTemplates/optimize_templates.json
|
||||
|
||||
CITATION.cff
|
||||
CHANGELOG.md
|
||||
## FUCK FUCK
|
||||
109
CHANGELOG.md
109
CHANGELOG.md
@@ -1,49 +1,84 @@
|
||||
## v5.26.0-beta.1
|
||||
## v5.27.0-beta.1
|
||||
|
||||
### 新增 | New
|
||||
|
||||
* 次生预案十里坡剑神 @ABA2396
|
||||
* 设置指引添加更新设置 @ABA2396
|
||||
* 设置指引添加性能设置 @ABA2396
|
||||
* 界面主题「齐聚」 @SherkeyXD
|
||||
* 资源更新完成后等待空闲时再加载 @ABA2396
|
||||
* 界园 DLC 新关卡战斗逻辑 @Saratoga-Official
|
||||
* 不是我认识的主题,直接切换 @ABA2396
|
||||
* 界园 dlc2 通宝数据更新 @SherkeyXD
|
||||
* 支持剿灭关卡名识别 @ABA2396
|
||||
* 跳过使用未准备好的技能 && 全局计时器 (#13913) @Alan-Charred
|
||||
* 本次更新的公告右上角添加红点 @ABA2396
|
||||
* 添加刷常乐节点策略 (#13868) @travellerse
|
||||
|
||||
### 改进 | Improved
|
||||
|
||||
* GetImageFromRoi 工具优化 @SherkeyXD
|
||||
* 进入新任务后重置任务超时计时器, 以避免非单任务卡阻的误报 @status102
|
||||
* 繁中服主線、肉鴿導航 UI 更新 (#14433) @momomochi987
|
||||
* ProcSubTask static @status102
|
||||
|
||||
### 修复 | Fix
|
||||
|
||||
* 文档首页语言选择按钮的宽度定义方式 (#14199) @lucienshawls
|
||||
* 傀影肉鸽无法识别四结局 (#14193) @Saratoga-Official
|
||||
* GamePassSkip2 识别到错误的跳过 @Saratoga-Official
|
||||
* 萨米肉鸽不期而遇避战 @Saratoga-Official
|
||||
* Google Play Games Developer shutdown @Constrat
|
||||
* manual set resource version time @MistEO
|
||||
* prettier @Constrat
|
||||
* 降低萨米肉鸽进入 “诡秘的预感” 所需模版匹配分数阈值 (#14521) @Alan-Charred
|
||||
* 公招按钮 roi 错误 @Saratoga-Official
|
||||
* 掉落识别修复 (#14508) @Alan-Charred
|
||||
* 变更弃用的参数 @ABA2396
|
||||
* 开始唤醒会回到主界面 @ABA2396
|
||||
* 尝试为活动商店小游戏适配新的时装购买动画 (#14490) @Alan-Charred
|
||||
* 无人机协助点击无效时增加自动重试机制 @ABA2396
|
||||
* 每日任务领取延迟载荷移位 @SherkeyXD
|
||||
* 每日任务领取因为延迟卡住 @SherkeyXD
|
||||
* 繁中服無法進入資源收藏關卡 (#14469) @momomochi987
|
||||
* 为界园放弃探索任务添加备用模版 (#14466) @Alan-Charred
|
||||
* 肉鸽跳一战打一战刷钱 (#14450) @Alan-Charred
|
||||
* 傀影不期而遇选项 @Saratoga-Official
|
||||
* 界园 dlc 背景无法放弃探索 (#14425) @Alan-Charred
|
||||
* 界园狭路相逢选项 @Saratoga-Official
|
||||
* Award模板阈值还是小了 @Saratoga-Official
|
||||
* 掉落识别增加越界检查 (#14312) @MistEO @Alan-Charred
|
||||
* 界园杂疑选项 @Saratoga-Official
|
||||
* 修复 "设置-外部通知" 存在多个通知渠道时只会发送到第一个成功的渠道问题 (#14380) @Jim-Happy
|
||||
* 界园肉鸽选项 @Saratoga-Official
|
||||
* 给 ClickToStartPoint 加点延迟 @Saratoga-Official
|
||||
* 萨卡兹去伪存真弹窗有延迟无法退出 @Saratoga-Official
|
||||
* JP Task.png (#14516) @Daydreamer114
|
||||
* precommit maacore @Constrat
|
||||
* change default issue + remove always as not necessary @Constrat
|
||||
* add always() @Constrat
|
||||
* YostarKR RoguelikeCustom-HijackSquad squad recognition @HX3N
|
||||
* cleanup ifdef + fix AsstDestroy missed calls + lldb @Constrat
|
||||
|
||||
|
||||
|
||||
### 文档 | Docs
|
||||
|
||||
* 补充vsc插件繁中文档 @Rbqwow
|
||||
* 修复文档站 readme 盾换行 @Rbqwow
|
||||
* 调整文档站的标题和尾注文本显示 (#14213) @lucienshawls
|
||||
* 更新网页开发相关文档 (#14167) @Rbqwow @Manicsteiner
|
||||
* 完善任务流程协议文档 (#13232) @zzyyyl
|
||||
* 回调消息协议文档视觉更新 @SherkeyXD
|
||||
* 集成文档视觉更新 @SherkeyXD
|
||||
* 文档启用 b 站视频播放功能 @SherkeyXD
|
||||
* 文档添加字段容器功能 @SherkeyXD
|
||||
* 文档添加功能 @SherkeyXD
|
||||
* 更新文档编写指南 @SherkeyXD
|
||||
* 标题 MAA 统一采用缩写 @MistEO
|
||||
* 再次调整文档站标题( @MistEO
|
||||
* 调整文档站标题 @MistEO
|
||||
* Update JP(#14227) @wallsman
|
||||
* markdown pre-commit @zzyyyl
|
||||
* add extension's evaluating feature @neko-para
|
||||
* add telegram icon @SherkeyXD
|
||||
* 补充模拟器相关文档和协议文档 (#14478) @Alan-Charred
|
||||
* 添加关于实体设备上账号切换问题的说明 (#14468) @Initial-heart-1 @lucienshawls @HX3N @Constrat @Manicsteiner @momomochi987
|
||||
* 在不支持列表中添加腾讯应用宝 (#14477) @JasonHuang79
|
||||
* 增加换行以提升文档在 GitHub 的阅读体验 (#14338) @status102
|
||||
* vscode 插件文档视觉优化 @SherkeyXD
|
||||
* 利用 tabs 优化视觉表现 @SherkeyXD
|
||||
* 利用步骤容器优化视觉效果 @SherkeyXD
|
||||
* 更新 algolia 配置 @SherkeyXD
|
||||
|
||||
### 其他 | Other
|
||||
|
||||
* 统一显示效果 @ABA2396
|
||||
* 水月萨米肉鸽不期而遇避战 @Saratoga-Official
|
||||
* 重写完成后动作仅一次的 ui 字符串 (#14196) @Rbqwow
|
||||
* 贸易站没其他好用的人再用锏 @ABA2396
|
||||
* YostarJP Sarkaz roguelike StageEncounter (#14223) @Manicsteiner
|
||||
* YostarJP sami roguelike 720p (#14210) @Manicsteiner
|
||||
* YostarJP Mizuki StageEncounter (#14206) @Manicsteiner
|
||||
* devcontainer.json (#14169) @Rbqwow @lucienshawls
|
||||
* 将 Copilot ActionType::ResetTimer 更改为更适合的 ResetStopwatch (#14507) @Alan-Charred
|
||||
* 调整截图 @ABA2396
|
||||
* 文件路径错误 @ABA2396
|
||||
* 我是铸币 @SherkeyXD
|
||||
* ALL~ the Announcements 中新公告标题中加 * @ABA2396
|
||||
* 拆出界园岁兽残识地图导航 (#14432) @Alan-Charred
|
||||
* 繁中服「輓歌燃燒殆盡」活動導航 (#14434) @momomochi987
|
||||
* remove global templates for 3294b29f54dadc4198a40538e85b71902c79c875 @Constrat
|
||||
* txwy add SwitchTheme@ConfirmThemeChange.png (#14511) @momomochi987
|
||||
* YostarJP SwitchTheme@ConfirmThemeChang @Manicsteiner
|
||||
* YostarKR add SwitchTheme@ConfirmThemeChang @HX3N
|
||||
* add SwitchTheme@ConfirmThemeChange.png @Constrat
|
||||
* remove cancelled() and add mentions @Constrat
|
||||
* YostarKR SSS#8 SSSBuffChoose @HX3N
|
||||
* update SSS#8 buff choose ocr for EN @Constrat
|
||||
* SSS#8 global changes (add acahuallan, remove dossoles and barrenbeasts) @Constrat
|
||||
* translate ElapsedTime ref: 1edd00698200b7c2a14406d7a29f51689f6871d1 @Constrat
|
||||
|
||||
24
README.md
24
README.md
@@ -98,11 +98,9 @@ MAA 支持命令行界面(CLI)操作,支持 Linux,macOS 和 Windows,
|
||||
|
||||
### 主要关联项目
|
||||
|
||||
**目前项目组非常缺前端大佬,若您有相关经验,欢迎加入我们!**
|
||||
|
||||
- 全新框架:[MaaFramework](https://github.com/MaaXYZ/MaaFramework)
|
||||
- [作业站](https://prts.plus) 前端:[maa-copilot-frontend](https://github.com/MaaAssistantArknights/maa-copilot-frontend)
|
||||
- [作业站](https://prts.plus) 后端:[MaaBackendCenter](https://github.com/MaaAssistantArknights/MaaBackendCenter)
|
||||
- [作业站](https://prts.plus) 前端:[zoot-plus-frontend](https://github.com/ZOOT-Plus/zoot-plus-frontend)
|
||||
- [作业站](https://prts.plus) 后端:[ZootPlusBackend](https://github.com/ZOOT-Plus/ZootPlusBackend)
|
||||
- [官网](https://maa.plus):[前端](https://github.com/MaaAssistantArknights/maa-website)
|
||||
- 深度学习:[MaaAI](https://github.com/MaaAssistantArknights/MaaAI)
|
||||
|
||||
@@ -144,6 +142,24 @@ MAA 以中文(简体)为第一语言,翻译词条均以中文(简体)
|
||||
|
||||
[GitHub Pull Request 流程简述](https://docs.maa.plus/zh-cn/develop/development.html#github-pull-request-流程简述)
|
||||
|
||||
#### 想参与开发,但面对庞大的项目仓库望而却步?
|
||||
|
||||
请使用 GitHub Codespaces 在线开发环境,尽情尝试!
|
||||
|
||||
我们预置了多种不同的开发环境以供选择:
|
||||
|
||||
- 空白环境,裸 Linux 容器(默认)
|
||||
|
||||
[](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2Fdevcontainer.json)
|
||||
|
||||
- 轻量环境,适合文档站前端开发
|
||||
|
||||
[](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2F0%2Fdevcontainer.json)
|
||||
|
||||
- 全量环境,适合 MAA Core 相关开发
|
||||
|
||||
[](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2F1%2Fdevcontainer.json)
|
||||
|
||||
#### Issue bot
|
||||
|
||||
请参阅 [Issue Bot 使用方法](https://docs.maa.plus/zh-cn/develop/issue-bot-usage.html)
|
||||
|
||||
@@ -37,7 +37,7 @@ function(get_osx_architecture)
|
||||
endfunction()
|
||||
|
||||
if(APPLE)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 13.3) # for to_chars
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 13.4) # for to_chars
|
||||
get_osx_architecture()
|
||||
endif(APPLE)
|
||||
|
||||
@@ -70,4 +70,4 @@ function(create_resource_link TARGET_NAME OUTPUT_DIR)
|
||||
COMMENT "Creating symlink for resource directory for ${TARGET_NAME}"
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
endfunction()
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
**/pnpm-lock.yaml
|
||||
**/*.md
|
||||
|
||||
@@ -11,12 +11,6 @@ module.exports = {
|
||||
arrowParens: 'always',
|
||||
|
||||
overrides: [
|
||||
{
|
||||
files: ['**/*.ts'],
|
||||
options: {
|
||||
semi: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['**/*.*css'],
|
||||
options: {
|
||||
@@ -36,5 +30,11 @@ module.exports = {
|
||||
tabWidth: 4,
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['**/*.md'],
|
||||
options: {
|
||||
embeddedLanguageFormatting: 'off',
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -1,11 +1,21 @@
|
||||
import { defineClientConfig } from 'vuepress/client';
|
||||
import { defineClientConfig } from 'vuepress/client'
|
||||
|
||||
import ImageGrid from './components/ImageGrid.vue';
|
||||
import { getAsciiArt } from './plugins/asciiArt.mts'
|
||||
|
||||
import './styles/index.scss';
|
||||
import AsciiArt from './components/AsciiArt.vue'
|
||||
import ImageGrid from './components/ImageGrid.vue'
|
||||
import Redirect from './components/Redirect.vue'
|
||||
|
||||
import './styles/index.scss'
|
||||
|
||||
export default defineClientConfig({
|
||||
enhance: ({ app }) => {
|
||||
app.component('ImageGrid', ImageGrid);
|
||||
app.component('AsciiArt', AsciiArt)
|
||||
app.component('ImageGrid', ImageGrid)
|
||||
app.component('Redirect', Redirect)
|
||||
|
||||
// 输出一个随机的字符画
|
||||
const asciiArtData = getAsciiArt(undefined, 'auto', 'console')
|
||||
console.log('%c' + asciiArtData.text, 'white-space: pre;')
|
||||
},
|
||||
});
|
||||
})
|
||||
|
||||
106
docs/.vuepress/components/AsciiArt.vue
Normal file
106
docs/.vuepress/components/AsciiArt.vue
Normal file
@@ -0,0 +1,106 @@
|
||||
<template>
|
||||
<div ref="asciiArtWrapperElement" class="ascii-art-wrapper">
|
||||
<pre ref="asciiArtContentElement" class="ascii-art-content">{{ asciiArtText }}</pre>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, onBeforeUnmount } from 'vue'
|
||||
import { getAsciiArt, ThemeType, AsciiArtScope } from '../plugins/asciiArt.mts'
|
||||
|
||||
// -------- Props --------
|
||||
interface AsciiArtProps {
|
||||
name?: string
|
||||
theme?: ThemeType
|
||||
scope?: AsciiArtScope
|
||||
}
|
||||
const props = defineProps<AsciiArtProps>()
|
||||
|
||||
// -------- Refs --------
|
||||
const asciiArtWrapperElement = ref<HTMLElement>()
|
||||
const asciiArtContentElement = ref<HTMLElement>()
|
||||
|
||||
// -------- Data --------
|
||||
let asciiArtNameInUse = props.name
|
||||
const asciiArtText = ref('')
|
||||
|
||||
let layoutObserver: ResizeObserver
|
||||
let themeObserver: MutationObserver
|
||||
|
||||
let isScaleUpLocked = false
|
||||
let lastScaleRatio = 1
|
||||
|
||||
function refreshAsciiArt() {
|
||||
const asciiArtData = getAsciiArt(asciiArtNameInUse, props.theme, props.scope)
|
||||
asciiArtNameInUse = asciiArtData.name
|
||||
asciiArtText.value = asciiArtData.text
|
||||
}
|
||||
|
||||
function scaleAsciiArt() {
|
||||
if (!asciiArtWrapperElement.value || !asciiArtContentElement.value) return
|
||||
|
||||
// 原始高度和宽度(无视scale)
|
||||
const contentWidth = asciiArtContentElement.value.scrollWidth
|
||||
const contentHeight = asciiArtContentElement.value.scrollHeight
|
||||
if (contentWidth === 0 || contentHeight === 0) return
|
||||
|
||||
const targetWidth = asciiArtWrapperElement.value.clientWidth
|
||||
const targetHeight = window.innerHeight
|
||||
|
||||
const scaleRatio = Math.min(targetWidth / contentWidth, targetHeight / contentHeight)
|
||||
// 锁定状态不允许放大
|
||||
if (scaleRatio > lastScaleRatio && isScaleUpLocked) return
|
||||
|
||||
lastScaleRatio = scaleRatio
|
||||
isScaleUpLocked = true
|
||||
|
||||
asciiArtContentElement.value.style.transform = `scale(${scaleRatio})`
|
||||
asciiArtWrapperElement.value.style.height = `${contentHeight * scaleRatio}px`
|
||||
}
|
||||
|
||||
function forceScaleAsciiArt() {
|
||||
isScaleUpLocked = false
|
||||
scaleAsciiArt()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
if (!asciiArtWrapperElement.value || !asciiArtContentElement.value) return
|
||||
|
||||
layoutObserver = new ResizeObserver(scaleAsciiArt)
|
||||
layoutObserver.observe(asciiArtContentElement.value)
|
||||
layoutObserver.observe(asciiArtWrapperElement.value)
|
||||
|
||||
themeObserver = new MutationObserver(refreshAsciiArt)
|
||||
themeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] })
|
||||
|
||||
window.addEventListener('resize', forceScaleAsciiArt)
|
||||
|
||||
refreshAsciiArt()
|
||||
})
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
if (layoutObserver) {
|
||||
layoutObserver.disconnect()
|
||||
}
|
||||
if (themeObserver) {
|
||||
themeObserver.disconnect()
|
||||
}
|
||||
window.removeEventListener('resize', forceScaleAsciiArt)
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.ascii-art-wrapper {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.ascii-art-content {
|
||||
display: block;
|
||||
white-space: pre;
|
||||
margin: 0 auto;
|
||||
transform-origin: top;
|
||||
line-height: 1;
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
}
|
||||
</style>
|
||||
25
docs/.vuepress/components/Redirect.vue
Normal file
25
docs/.vuepress/components/Redirect.vue
Normal file
@@ -0,0 +1,25 @@
|
||||
<template />
|
||||
|
||||
<script setup lang="ts">
|
||||
import { onMounted } from 'vue'
|
||||
import { useRouter, useRoute } from 'vuepress/client'
|
||||
|
||||
interface Props {
|
||||
to?: string
|
||||
}
|
||||
const props = defineProps<Props>()
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
|
||||
function resolvePath(to: string) {
|
||||
const target = new URL(to, 'http://example.com' + route.path) // 使用一个虚拟的基础 URL
|
||||
return target.pathname
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
if (!props.to) return
|
||||
const targetPath = resolvePath(props.to)
|
||||
router.replace(targetPath)
|
||||
})
|
||||
</script>
|
||||
@@ -1,11 +1,13 @@
|
||||
import { viteBundler } from '@vuepress/bundler-vite';
|
||||
import { defineUserConfig } from 'vuepress';
|
||||
import { googleAnalyticsPlugin } from '@vuepress/plugin-google-analytics';
|
||||
import { plumeTheme } from 'vuepress-theme-plume';
|
||||
import { viteBundler } from '@vuepress/bundler-vite'
|
||||
import { defineUserConfig } from 'vuepress'
|
||||
import { googleAnalyticsPlugin } from '@vuepress/plugin-google-analytics'
|
||||
import { plumeTheme } from 'vuepress-theme-plume'
|
||||
|
||||
import DocSearchConfig from './plugins/search';
|
||||
import { genSiteLocales } from './navigation/genLocales'
|
||||
|
||||
const isProd = process.env.NODE_ENV === 'production';
|
||||
import DocSearchConfig from './plugins/search'
|
||||
|
||||
const isProd = process.env.NODE_ENV === 'production'
|
||||
|
||||
export default defineUserConfig({
|
||||
base: '/',
|
||||
@@ -15,33 +17,7 @@ export default defineUserConfig({
|
||||
host: '0.0.0.0',
|
||||
port: 3001,
|
||||
|
||||
locales: {
|
||||
'/zh-cn/': {
|
||||
lang: 'zh-CN',
|
||||
title: 'MAA 文档站',
|
||||
description: '文档',
|
||||
},
|
||||
'/zh-tw/': {
|
||||
lang: 'zh-TW',
|
||||
title: 'MAA 文件站',
|
||||
description: '文件',
|
||||
},
|
||||
'/en-us/': {
|
||||
lang: 'en-US',
|
||||
title: 'MAA Documentation Site',
|
||||
description: 'Documentation',
|
||||
},
|
||||
'/ja-jp/': {
|
||||
lang: 'ja-JP',
|
||||
title: 'MAA ドキュメントサイト',
|
||||
description: 'ドキュメント',
|
||||
},
|
||||
'/ko-kr/': {
|
||||
lang: 'ko-KR',
|
||||
title: 'MAA 문서 사이트',
|
||||
description: '문서',
|
||||
},
|
||||
},
|
||||
locales: genSiteLocales(),
|
||||
|
||||
head: [
|
||||
['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }],
|
||||
@@ -88,17 +64,16 @@ export default defineUserConfig({
|
||||
contributors: false,
|
||||
changelog: false,
|
||||
|
||||
blog: false,
|
||||
|
||||
cache: 'filesystem',
|
||||
|
||||
search: DocSearchConfig,
|
||||
|
||||
codeHighlighter: {
|
||||
themes: { light: 'one-light', dark: 'one-dark-pro' },
|
||||
themes: { light: 'snazzy-light', dark: 'night-owl' },
|
||||
},
|
||||
|
||||
markdown: {
|
||||
annotation: true,
|
||||
image: {
|
||||
lazyload: true,
|
||||
mark: true,
|
||||
@@ -132,4 +107,4 @@ export default defineUserConfig({
|
||||
id: 'G-FJQDKG394Z',
|
||||
}),
|
||||
],
|
||||
});
|
||||
})
|
||||
|
||||
8
docs/.vuepress/env.d.ts
vendored
8
docs/.vuepress/env.d.ts
vendored
@@ -1,5 +1,7 @@
|
||||
/// <reference types="vite/client" />
|
||||
|
||||
declare module '*.vue' {
|
||||
import { DefineComponent } from 'vue';
|
||||
const component: DefineComponent<{}, {}, any>;
|
||||
export default component;
|
||||
import { DefineComponent } from 'vue'
|
||||
const component: DefineComponent<{}, {}, any>
|
||||
export default component
|
||||
}
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
import { defineNavbarConfig } from 'vuepress-theme-plume';
|
||||
|
||||
export const enusNavbar = defineNavbarConfig([
|
||||
{
|
||||
text: 'User Manual',
|
||||
icon: 'mdi:user',
|
||||
link: '/en-us/manual/newbie.html',
|
||||
},
|
||||
{
|
||||
text: 'Development Docs',
|
||||
icon: 'ph:code-bold',
|
||||
link: '/en-us/develop/development.html',
|
||||
},
|
||||
{
|
||||
text: 'Protocol Docs',
|
||||
icon: 'basil:document-solid',
|
||||
link: '/en-us/protocol/integration.html',
|
||||
},
|
||||
]);
|
||||
@@ -1,5 +0,0 @@
|
||||
export * from './zh-cn';
|
||||
export * from './zh-tw';
|
||||
export * from './en-us';
|
||||
export * from './ja-jp';
|
||||
export * from './ko-kr';
|
||||
@@ -1,19 +0,0 @@
|
||||
import { defineNavbarConfig } from 'vuepress-theme-plume';
|
||||
|
||||
export const jajpNavbar = defineNavbarConfig([
|
||||
{
|
||||
text: '使用説明',
|
||||
icon: 'mdi:user',
|
||||
link: '/ja-jp/manual/newbie.html',
|
||||
},
|
||||
{
|
||||
text: '開発関連',
|
||||
icon: 'ph:code-bold',
|
||||
link: '/ja-jp/develop/development.html',
|
||||
},
|
||||
{
|
||||
text: 'プロトコルドキュメント',
|
||||
icon: 'basil:document-solid',
|
||||
link: '/ja-jp/protocol/integration.html',
|
||||
},
|
||||
]);
|
||||
@@ -1,19 +0,0 @@
|
||||
import { defineNavbarConfig } from 'vuepress-theme-plume';
|
||||
|
||||
export const kokrNavbar = defineNavbarConfig([
|
||||
{
|
||||
text: '사용자 설명서',
|
||||
icon: 'mdi:user',
|
||||
link: '/ko-kr/manual/newbie.html',
|
||||
},
|
||||
{
|
||||
text: '개발 문서',
|
||||
icon: 'ph:code-bold',
|
||||
link: '/ko-kr/develop/development.html',
|
||||
},
|
||||
{
|
||||
text: '프로토콜 문서',
|
||||
icon: 'basil:document-solid',
|
||||
link: '/ko-kr/protocol/integration.html',
|
||||
},
|
||||
]);
|
||||
@@ -1,19 +0,0 @@
|
||||
import { defineNavbarConfig } from 'vuepress-theme-plume';
|
||||
|
||||
export const zhcnNavbar = defineNavbarConfig([
|
||||
{
|
||||
text: '用户手册',
|
||||
icon: 'mdi:user',
|
||||
link: '/zh-cn/manual/newbie.html',
|
||||
},
|
||||
{
|
||||
text: '开发文档',
|
||||
icon: 'ph:code-bold',
|
||||
link: '/zh-cn/develop/development.html',
|
||||
},
|
||||
{
|
||||
text: '协议文档',
|
||||
icon: 'basil:document-solid',
|
||||
link: '/zh-cn/protocol/integration.html',
|
||||
},
|
||||
]);
|
||||
@@ -1,19 +0,0 @@
|
||||
import { defineNavbarConfig } from 'vuepress-theme-plume';
|
||||
|
||||
export const zhtwNavbar = defineNavbarConfig([
|
||||
{
|
||||
text: '用戶說明書',
|
||||
icon: 'mdi:user',
|
||||
link: '/zh-tw/manual/newbie.html',
|
||||
},
|
||||
{
|
||||
text: '開發文件',
|
||||
icon: 'ph:code-bold',
|
||||
link: '/zh-tw/develop/development.html',
|
||||
},
|
||||
{
|
||||
text: '協議文件',
|
||||
icon: 'basil:document-solid',
|
||||
link: '/zh-tw/protocol/integration.html',
|
||||
},
|
||||
]);
|
||||
29
docs/.vuepress/navigation/genLocales.ts
Normal file
29
docs/.vuepress/navigation/genLocales.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { SiteLocaleConfig, LocaleConfig } from 'vuepress'
|
||||
import { ThemeLocaleData } from 'vuepress-theme-plume'
|
||||
|
||||
import { locales } from './i18n'
|
||||
import { genNavigationComponents } from './genNavigationComponents'
|
||||
|
||||
export function genSiteLocales(): SiteLocaleConfig {
|
||||
const siteLocales: SiteLocaleConfig = {}
|
||||
for (const locale of locales) {
|
||||
siteLocales[`/${locale.name}/`] = {
|
||||
lang: locale.htmlLang,
|
||||
title: locale.siteTitle,
|
||||
description: locale.siteDescription,
|
||||
}
|
||||
}
|
||||
return siteLocales
|
||||
}
|
||||
|
||||
export function genThemeLocales(): LocaleConfig<ThemeLocaleData> {
|
||||
const themeLocales: LocaleConfig<ThemeLocaleData> = {}
|
||||
for (const locale of locales) {
|
||||
const navigationComponents = genNavigationComponents(locale)
|
||||
themeLocales[`/${locale.name}/`] = {
|
||||
navbar: navigationComponents.navbar,
|
||||
collections: navigationComponents.collections,
|
||||
}
|
||||
}
|
||||
return themeLocales
|
||||
}
|
||||
161
docs/.vuepress/navigation/genNavigationComponents.ts
Normal file
161
docs/.vuepress/navigation/genNavigationComponents.ts
Normal file
@@ -0,0 +1,161 @@
|
||||
import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
import { default as matter } from 'gray-matter'
|
||||
import { ThemeCollectionItem, ThemeNavItem, ThemeSidebarItem } from 'vuepress-theme-plume'
|
||||
|
||||
import { Locale } from './i18n'
|
||||
|
||||
interface MetaData {
|
||||
baseName: string
|
||||
order: number
|
||||
title: string
|
||||
icon: string
|
||||
index: boolean
|
||||
}
|
||||
|
||||
interface NavigationComponents {
|
||||
navbar: ThemeNavItem[]
|
||||
collections: ThemeCollectionItem[]
|
||||
}
|
||||
|
||||
type SidebarItem = ThemeSidebarItem | string
|
||||
|
||||
function getMetaData(dir: string, entry: fs.Dirent): MetaData | null {
|
||||
const currentPath = path.join(dir, entry.name)
|
||||
if (!fs.existsSync(currentPath)) {
|
||||
return null
|
||||
}
|
||||
|
||||
let mdFilePath = ''
|
||||
if (entry.isDirectory()) {
|
||||
mdFilePath = path.join(currentPath, 'README.md')
|
||||
} else if (entry.isFile() && entry.name.endsWith('.md') && entry.name.toLowerCase() !== 'readme.md') {
|
||||
mdFilePath = currentPath
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
|
||||
if (!fs.existsSync(mdFilePath)) {
|
||||
return null
|
||||
}
|
||||
|
||||
const fileContent = fs.readFileSync(mdFilePath, 'utf-8')
|
||||
const meta = matter(fileContent).data ?? {}
|
||||
|
||||
// 文件名,不含扩展名
|
||||
const baseName = path.parse(entry.name).name
|
||||
// 获取顺序,目录的order在meta.dir.order里,文件的order在meta.order里,默认值为一个大数
|
||||
const order = Number((entry.isDirectory() ? meta?.dir?.order : meta?.order) ?? Number.MAX_SAFE_INTEGER)
|
||||
// 获取标题,先从matter里找title,再用正则获取一级标题,最后fallback到文件名(不含扩展名)
|
||||
const title = String(meta?.title ?? RegExp('# (.+)').exec(fileContent)?.[1] ?? baseName)
|
||||
// 获取图标
|
||||
const icon = String(meta?.icon ?? '')
|
||||
// 是否添加到索引,文件永远为true,目录则看meta.index,默认true
|
||||
const index = entry.isDirectory() ? (Boolean(meta?.index) ?? true) : true
|
||||
|
||||
return {
|
||||
baseName: baseName,
|
||||
order: order,
|
||||
title: title,
|
||||
icon: icon,
|
||||
index: index,
|
||||
}
|
||||
}
|
||||
|
||||
function getSidebarItems(dir: string): SidebarItem[] {
|
||||
interface WrappedSidebarItem {
|
||||
sidebarItem: SidebarItem
|
||||
order: number
|
||||
}
|
||||
|
||||
const entries = fs.readdirSync(dir, { withFileTypes: true }).filter((e) => !e.name.startsWith('.'))
|
||||
|
||||
const sidebarItemsWithOrder: WrappedSidebarItem[] = []
|
||||
for (const entry of entries) {
|
||||
let sidebarItem: SidebarItem
|
||||
|
||||
const metaData = getMetaData(dir, entry)
|
||||
if (!metaData) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (entry.isDirectory()) {
|
||||
const children = getSidebarItems(path.join(dir, entry.name))
|
||||
// 可折叠的子目录
|
||||
sidebarItem = {
|
||||
text: metaData.title,
|
||||
// 只有当目录设置了index: true时,才生成链接,否则点击时不跳转、只切换折叠状态
|
||||
link: metaData.index ? `${metaData.baseName}/` : undefined,
|
||||
icon: metaData.icon,
|
||||
// 目前没有文档使用了badge这个特性,故不处理
|
||||
// badge: undefined,
|
||||
collapsed: true,
|
||||
// 前面不能加斜杠,必须用相对路径
|
||||
prefix: `${metaData.baseName}/`,
|
||||
items: children,
|
||||
}
|
||||
} else if (entry.isFile() && entry.name.endsWith('.md') && entry.name.toLowerCase() !== 'readme.md') {
|
||||
// 普通文件,取完整文件名作为链接
|
||||
sidebarItem = entry.name
|
||||
}
|
||||
|
||||
sidebarItemsWithOrder.push({ sidebarItem: sidebarItem, order: metaData.order })
|
||||
}
|
||||
sidebarItemsWithOrder.sort((a, b) => a.order - b.order)
|
||||
return sidebarItemsWithOrder.map((i) => i.sidebarItem)
|
||||
}
|
||||
|
||||
export function genNavigationComponents(
|
||||
locale: Locale,
|
||||
baseDir = path.resolve(__dirname, '../../'),
|
||||
): NavigationComponents {
|
||||
interface WrappedNavigationComponent {
|
||||
navItem: ThemeNavItem
|
||||
collectionItem: ThemeCollectionItem
|
||||
order: number
|
||||
}
|
||||
|
||||
const navigationComponentsWithOrder: WrappedNavigationComponent[] = []
|
||||
|
||||
// 进入指定语言目录,即docs/<i18n>/
|
||||
const langDir = path.join(baseDir, locale.name)
|
||||
|
||||
// 获取所有非隐藏文件和目录
|
||||
const entries = fs.readdirSync(langDir, { withFileTypes: true }).filter((e) => !e.name.startsWith('.'))
|
||||
|
||||
for (const entry of entries) {
|
||||
if (!entry.isDirectory()) continue
|
||||
|
||||
const metaData = getMetaData(langDir, entry)
|
||||
if (!metaData) {
|
||||
continue
|
||||
}
|
||||
|
||||
const navbarItem: ThemeNavItem = {
|
||||
text: metaData.title,
|
||||
icon: metaData.icon,
|
||||
link: `/${locale.name}/${metaData.baseName}/`,
|
||||
}
|
||||
|
||||
const collectionItem: ThemeCollectionItem = {
|
||||
type: 'doc',
|
||||
title: metaData.title,
|
||||
dir: metaData.baseName,
|
||||
linkPrefix: `/${metaData.baseName}/`,
|
||||
sidebar: getSidebarItems(path.join(langDir, entry.name)),
|
||||
}
|
||||
|
||||
navigationComponentsWithOrder.push({
|
||||
navItem: navbarItem,
|
||||
collectionItem: collectionItem,
|
||||
order: metaData.order,
|
||||
})
|
||||
}
|
||||
|
||||
navigationComponentsWithOrder.sort((a, b) => a.order - b.order)
|
||||
|
||||
return {
|
||||
navbar: navigationComponentsWithOrder.map((i) => i.navItem),
|
||||
collections: navigationComponentsWithOrder.map((i) => i.collectionItem),
|
||||
}
|
||||
}
|
||||
45
docs/.vuepress/navigation/i18n.ts
Normal file
45
docs/.vuepress/navigation/i18n.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
export interface Locale {
|
||||
name: string
|
||||
// displayName: string
|
||||
htmlLang: string
|
||||
siteTitle: string
|
||||
siteDescription: string
|
||||
}
|
||||
|
||||
export const locales: Locale[] = [
|
||||
{
|
||||
name: 'zh-cn',
|
||||
// displayName: '简体中文',
|
||||
htmlLang: 'zh-CN',
|
||||
siteTitle: 'MAA 文档站',
|
||||
siteDescription: '文档',
|
||||
},
|
||||
{
|
||||
name: 'zh-tw',
|
||||
// displayName: '繁體中文',
|
||||
htmlLang: 'zh-TW',
|
||||
siteTitle: 'MAA 文件站',
|
||||
siteDescription: '文件',
|
||||
},
|
||||
{
|
||||
name: 'en-us',
|
||||
// displayName: 'English',
|
||||
htmlLang: 'en-US',
|
||||
siteTitle: 'MAA Documentation Site',
|
||||
siteDescription: 'Documentation',
|
||||
},
|
||||
{
|
||||
name: 'ja-jp',
|
||||
// displayName: '日本語',
|
||||
htmlLang: 'ja-JP',
|
||||
siteTitle: 'MAA ドキュメントサイト',
|
||||
siteDescription: 'ドキュメント',
|
||||
},
|
||||
{
|
||||
name: 'ko-kr',
|
||||
// displayName: '한국어',
|
||||
htmlLang: 'ko-KR',
|
||||
siteTitle: 'MAA 문서 사이트',
|
||||
siteDescription: '문서',
|
||||
},
|
||||
]
|
||||
@@ -1,8 +0,0 @@
|
||||
import { defineNotesConfig } from 'vuepress-theme-plume';
|
||||
import { genNotes } from './genSidebar';
|
||||
|
||||
export const enusNotes = defineNotesConfig({
|
||||
dir: 'en-us',
|
||||
link: '/en-us/',
|
||||
notes: genNotes('en-us'),
|
||||
});
|
||||
@@ -1,119 +0,0 @@
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as matterModule from 'gray-matter';
|
||||
import { defineNoteConfig, ThemeNote, ThemeSidebarItem } from 'vuepress-theme-plume';
|
||||
|
||||
const matter = (matterModule as any).default;
|
||||
|
||||
interface MetaData {
|
||||
baseName: string;
|
||||
order: number;
|
||||
title: string;
|
||||
icon: string;
|
||||
index: boolean;
|
||||
}
|
||||
|
||||
function getMetaData(dir: string, entry: fs.Dirent): MetaData | null {
|
||||
const currentPath = path.join(dir, entry.name);
|
||||
if (!fs.existsSync(currentPath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let mdFilePath = '';
|
||||
if (entry.isDirectory()) {
|
||||
mdFilePath = path.join(currentPath, 'README.md');
|
||||
} else if (entry.isFile() && entry.name.endsWith('.md') && entry.name.toLowerCase() !== 'readme.md') {
|
||||
mdFilePath = currentPath;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!fs.existsSync(mdFilePath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const fileContent = fs.readFileSync(mdFilePath, 'utf-8');
|
||||
const meta = matter(fileContent).data ?? {};
|
||||
|
||||
const baseName = path.parse(entry.name).name;
|
||||
// 获取顺序,目录的order在meta.dir.order里,文件的order在meta.order里,默认值为一个大数
|
||||
const order = Number((entry.isDirectory() ? meta?.dir?.order : meta?.order) ?? Number.MAX_SAFE_INTEGER);
|
||||
// 获取标题,先从matter里找title,再用正则获取一级标题,最后fallback到文件名(不含扩展名)
|
||||
const title = String(meta?.title ?? RegExp('# (.+)').exec(fileContent)?.[1] ?? baseName);
|
||||
// 获取图标
|
||||
const icon = String(meta?.icon ?? '');
|
||||
// 是否作为索引页,文件永远为true,目录则看meta.index,默认true
|
||||
const index = entry.isDirectory() ? (Boolean(meta?.index) ?? true) : true;
|
||||
|
||||
return {
|
||||
baseName: baseName,
|
||||
order: order,
|
||||
title: title,
|
||||
icon: icon,
|
||||
index: index,
|
||||
};
|
||||
}
|
||||
|
||||
export function genNotes(lang: string, baseDir = path.resolve(__dirname, '../../')): ThemeNote[] {
|
||||
// 进入指定语言目录,即docs/<i18n>/
|
||||
const langDir = path.join(baseDir, lang);
|
||||
|
||||
// 递归获取目录和文件
|
||||
function getItems(dir: string, isRoot: boolean): any[] {
|
||||
// 将内容与对应顺序进行包装
|
||||
interface Wrapped {
|
||||
content: ThemeNote | ThemeSidebarItem | string;
|
||||
order: number;
|
||||
}
|
||||
let itemsWithOrder: Wrapped[] = [];
|
||||
|
||||
// 获取所有非隐藏文件和目录
|
||||
const entries = fs.readdirSync(dir, { withFileTypes: true }).filter((e) => !e.name.startsWith('.'));
|
||||
|
||||
for (const entry of entries) {
|
||||
const metaData = getMetaData(dir, entry);
|
||||
if (!metaData) {
|
||||
continue;
|
||||
}
|
||||
if (entry.isDirectory()) {
|
||||
// 递归获取子目录内容
|
||||
const children = getItems(path.join(dir, entry.name), false);
|
||||
|
||||
if (isRoot) {
|
||||
// 一级目录,作为“专题”
|
||||
const item = defineNoteConfig({
|
||||
dir: metaData.baseName,
|
||||
link: `/${metaData.baseName}/`,
|
||||
text: metaData.title,
|
||||
sidebar: children,
|
||||
});
|
||||
itemsWithOrder.push({ content: item, order: metaData.order });
|
||||
} else {
|
||||
// 非一级目录,作为可折叠的子目录
|
||||
const item: ThemeSidebarItem = {
|
||||
text: metaData.title,
|
||||
// 只有当目录设置了index: true时,才生成链接,否则点击时不跳转、只切换折叠状态
|
||||
link: metaData.index ? `${metaData.baseName}/` : undefined,
|
||||
icon: metaData.icon,
|
||||
// 目前没有文档使用了这个特性,故不处理
|
||||
// badge: undefined,
|
||||
collapsed: true,
|
||||
// 前面不能加斜杠,必须用相对路径
|
||||
prefix: `${metaData.baseName}/`,
|
||||
items: children,
|
||||
};
|
||||
itemsWithOrder.push({ content: item, order: metaData.order });
|
||||
}
|
||||
} else if (entry.isFile() && entry.name.endsWith('.md') && entry.name.toLowerCase() !== 'readme.md') {
|
||||
// 普通文件,取完整文件名作为链接
|
||||
const item = entry.name;
|
||||
itemsWithOrder.push({ content: item, order: metaData.order });
|
||||
}
|
||||
}
|
||||
// 当前dir的内容读取完毕,进行排序并返回,返回时丢弃order
|
||||
itemsWithOrder.sort((a, b) => a.order - b.order);
|
||||
return itemsWithOrder.map((i) => i.content);
|
||||
}
|
||||
// 递归起点,只有这里是一级目录,isRoot传true
|
||||
return getItems(langDir, true);
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
export * from './zh-cn';
|
||||
export * from './zh-tw';
|
||||
export * from './en-us';
|
||||
export * from './ja-jp';
|
||||
export * from './ko-kr';
|
||||
@@ -1,8 +0,0 @@
|
||||
import { defineNotesConfig } from 'vuepress-theme-plume';
|
||||
import { genNotes } from './genSidebar';
|
||||
|
||||
export const jajpNotes = defineNotesConfig({
|
||||
dir: 'ja-jp',
|
||||
link: '/ja-jp/',
|
||||
notes: genNotes('ja-jp'),
|
||||
});
|
||||
@@ -1,8 +0,0 @@
|
||||
import { defineNotesConfig } from 'vuepress-theme-plume';
|
||||
import { genNotes } from './genSidebar';
|
||||
|
||||
export const kokrNotes = defineNotesConfig({
|
||||
dir: 'ko-kr',
|
||||
link: '/ko-kr/',
|
||||
notes: genNotes('ko-kr'),
|
||||
});
|
||||
@@ -1,8 +0,0 @@
|
||||
import { defineNotesConfig } from 'vuepress-theme-plume';
|
||||
import { genNotes } from './genSidebar';
|
||||
|
||||
export const zhcnNotes = defineNotesConfig({
|
||||
dir: 'zh-cn',
|
||||
link: '/zh-cn/',
|
||||
notes: genNotes('zh-cn'),
|
||||
});
|
||||
@@ -1,8 +0,0 @@
|
||||
import { defineNotesConfig } from 'vuepress-theme-plume';
|
||||
import { genNotes } from './genSidebar';
|
||||
|
||||
export const zhtwNotes = defineNotesConfig({
|
||||
dir: 'zh-tw',
|
||||
link: '/zh-tw/',
|
||||
notes: genNotes('zh-tw'),
|
||||
});
|
||||
90
docs/.vuepress/plugins/asciiArt.mts
Normal file
90
docs/.vuepress/plugins/asciiArt.mts
Normal file
@@ -0,0 +1,90 @@
|
||||
const modules = import.meta.glob<string>('../../asciiArts/*.txt', { query: '?raw', import: 'default', eager: true })
|
||||
|
||||
const asciiArts: Record<string, string> = {}
|
||||
for (const path in modules) {
|
||||
const name = path
|
||||
.split('/')
|
||||
.pop()
|
||||
?.replace(/\.txt$/, '')!
|
||||
asciiArts[name] = modules[path]
|
||||
}
|
||||
|
||||
export type ThemeType = 'auto' | 'disable' | string
|
||||
export type AsciiArtScope = 'web' | 'console'
|
||||
interface AsciiArtData {
|
||||
name: string | null
|
||||
text: string
|
||||
}
|
||||
|
||||
function pickAsciiArt(
|
||||
arts: Record<string, string>,
|
||||
artFilter?: (key: string) => boolean,
|
||||
keyToName?: (key: string) => string,
|
||||
): AsciiArtData {
|
||||
const keys = artFilter ? Object.keys(arts).filter(artFilter) : Object.keys(arts)
|
||||
|
||||
let asciiArtKey: string | null
|
||||
let asciiArtText: string
|
||||
|
||||
if (keys.length === 0) {
|
||||
asciiArtKey = null
|
||||
asciiArtText = ''
|
||||
} else if (keys.length === 1) {
|
||||
asciiArtKey = keys[0]
|
||||
asciiArtText = arts[keys[0]]
|
||||
} else {
|
||||
const randomKey = keys[Math.floor(Math.random() * keys.length)]
|
||||
asciiArtKey = randomKey
|
||||
asciiArtText = arts[randomKey]
|
||||
}
|
||||
if (!asciiArtKey || !keyToName) {
|
||||
return { name: asciiArtKey, text: asciiArtText }
|
||||
} else {
|
||||
return { name: keyToName(asciiArtKey), text: asciiArtText }
|
||||
}
|
||||
}
|
||||
|
||||
export function getAsciiArt(name?: string, theme: ThemeType = 'auto', scope: AsciiArtScope = 'web'): AsciiArtData {
|
||||
let resolvedTheme: ThemeType = theme
|
||||
|
||||
// auto 模式
|
||||
if (theme === 'auto') {
|
||||
let currentTheme: string | null = null
|
||||
if (scope === 'web' && typeof document !== 'undefined') {
|
||||
// 浏览器中读取 HTML data-theme
|
||||
currentTheme = document?.documentElement?.getAttribute('data-theme')
|
||||
} else if (scope === 'console' && typeof window !== 'undefined' && window.matchMedia) {
|
||||
// fallback: 检查系统首选主题
|
||||
currentTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
|
||||
}
|
||||
resolvedTheme = currentTheme ? currentTheme : 'disable'
|
||||
}
|
||||
|
||||
if (resolvedTheme !== 'disable') {
|
||||
// light/dark/... 模式
|
||||
return name
|
||||
? pickAsciiArt(
|
||||
asciiArts,
|
||||
(k) => k === name + '.' + resolvedTheme,
|
||||
() => name,
|
||||
)
|
||||
: pickAsciiArt(
|
||||
asciiArts,
|
||||
(k) => k.endsWith('.' + resolvedTheme),
|
||||
(k) => k.replace(new RegExp('\\.' + resolvedTheme + '$'), ''),
|
||||
)
|
||||
} else {
|
||||
// disable 模式
|
||||
return name
|
||||
? pickAsciiArt(
|
||||
asciiArts,
|
||||
(k) => k === name || k.startsWith(name + '.'),
|
||||
() => name,
|
||||
)
|
||||
: pickAsciiArt(
|
||||
asciiArts,
|
||||
() => true,
|
||||
(k) => k,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
export default {
|
||||
provider: 'algolia' as const,
|
||||
appId: '99JM20SIFG',
|
||||
apiKey: '7596a5a8c95cd64d4cf3050c9a4f878e',
|
||||
appId: '9ARM1N4899',
|
||||
apiKey: 'f42bf1d18c786d5a46da30eccac5cb34',
|
||||
indexName: 'maa',
|
||||
locales: {
|
||||
'/zh-cn/': {
|
||||
@@ -81,4 +81,4 @@ export default {
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { defineThemeConfig } from 'vuepress-theme-plume';
|
||||
import { zhcnNavbar, zhtwNavbar, enusNavbar, jajpNavbar, kokrNavbar } from './navbar';
|
||||
import { zhcnNotes, zhtwNotes, enusNotes, jajpNotes, kokrNotes } from './notes';
|
||||
import { defineThemeConfig } from 'vuepress-theme-plume'
|
||||
import { genThemeLocales } from './navigation/genLocales'
|
||||
|
||||
export default defineThemeConfig({
|
||||
logo: '/images/maa-logo_512x512.png',
|
||||
@@ -25,28 +24,7 @@ export default defineThemeConfig({
|
||||
|
||||
footer: false,
|
||||
|
||||
locales: {
|
||||
'/zh-cn/': {
|
||||
navbar: zhcnNavbar,
|
||||
notes: zhcnNotes,
|
||||
},
|
||||
'/zh-tw/': {
|
||||
navbar: zhtwNavbar,
|
||||
notes: zhtwNotes,
|
||||
},
|
||||
'/en-us/': {
|
||||
navbar: enusNavbar,
|
||||
notes: enusNotes,
|
||||
},
|
||||
'/ja-jp/': {
|
||||
navbar: jajpNavbar,
|
||||
notes: jajpNotes,
|
||||
},
|
||||
'/ko-kr/': {
|
||||
navbar: kokrNavbar,
|
||||
notes: kokrNotes,
|
||||
},
|
||||
},
|
||||
locales: genThemeLocales(),
|
||||
|
||||
autoFrontmatter: false,
|
||||
|
||||
@@ -126,4 +104,4 @@ export default defineThemeConfig({
|
||||
// },
|
||||
// ],
|
||||
//},
|
||||
});
|
||||
})
|
||||
|
||||
@@ -1,74 +1,14 @@
|
||||
---
|
||||
home: true
|
||||
pageInfo: false
|
||||
breadcrumb: false
|
||||
pageLayout: home
|
||||
navbar: false
|
||||
sidebar: false
|
||||
index: false
|
||||
lastUpdated: false
|
||||
editLink: false
|
||||
contributors: false
|
||||
prev: false
|
||||
next: false
|
||||
config:
|
||||
- type: custom
|
||||
---
|
||||
|
||||
|
||||
!: .7:~!.
|
||||
:. :?55 ?5~::~J?:
|
||||
:P5YY?7~: .!JYYJG. 7P! .7Y!.
|
||||
^5JJJY55PPG5!. .?JYYJYG. ~P?. ~YJ: :PY~.
|
||||
^5YYYYYYY5PPPPYJ??7!!~^!?YYYYY5 :5Y. :J5!. :G^
|
||||
~PY5555555PPPGGPPPPPPPPJ5YJYPP???5?57::.. !5J: Y&##P:
|
||||
^YPP5JJY5555PPGG55PP555PGPPPGGPPP555555555YYYJJ?77!~^::...~5P^:. P####7
|
||||
!GPPJ?JYYYYY5P5PPG57:...:!5GG?~!?JJY55PPPPPPPPPPP555555555YJYPYY57!~^::... .#####!
|
||||
.?PY?YYYYYYY5PP5G?..:!??JYYPYY7. .....:^~!?JJYY5PPPPPPPP555555555555YYYJJ?77!!B####P
|
||||
.5Y5YYYYYY555PGY.!?JYJJYJ5P:.?5^...:.::^~^^:::... ....::::~!!7?J5P55PPPPPPPP5P55PPGG###P
|
||||
.:~?P5555PPPPGY:J77YYJY55Y: ..Y5?Y5PPGGBBBBGGGGP555J!^. ^~...^!77YY5G5::~:.:!5#G
|
||||
^5555PPPG5?.~5JYYYYY7: :~?5PPG5BBBBB########BBB####BGY7~~^:..:: .:^!~^~?Y7~. ~J7Y
|
||||
P55PPPGY~...?5?~^:...:75PPGP5PG#####BGBBBBBBBBBB######BGGP5YJ???7!7JY?!!?YYYJYJ^^GJ..
|
||||
.!?P5YPB^ ....... :!J5PGB#######BBGY7~!!7?PYJJ7!5GB#######BBGPYYYYYJJYYYYY55GB##5^...
|
||||
75YYPG... .::::JPGB####BGPP55J5?^~~~~~~~~~~!!!?PGGBBBB#####GGBBBBBB##########&G^^~
|
||||
Y5YYGY... ..:^7PBB#####GPJ!~~~^~?!~~~~~~~~~~~~!!J7!7?JPG###&###############&&&~
|
||||
.PYY5B!... ..^YBBBB####GPJ~~~~~~~?J!~~~^^~~^^~~^^~!!::^75GB####&&&&&&&&&&&&&&##BG5
|
||||
^PYY5G:... .^^PB#B###GP5JJ7~~~~~~~!7?~~~^..^:^~~~!~~~!~^~~5JJ555G##&&&&&&&#BBBGGPB!
|
||||
?5YYPP......:Y######G?!~!!~~~~~~~~~~!7^^^^:^~~~~~~!7~~!~^~~~~~!7?YGB###P77!:JGGGGB:
|
||||
5YYYGJ..... 7#B####GP!^~!~~~~~~^::!~~!~^^~~~~!~~~~~!J!~7!^~~~~~~!?Y5GPPPP5!^PGGGGP
|
||||
.7 .PYY5B^..:::^GBB####PP!^7!^^~~~^^:^7~~~!^~~~~~~7~!~~~?5J?J7:~~~~~~~!?YY5YY55PPPGGGP~^:
|
||||
^5 ~PYYPG...:.!PP#####G5J!:?!^^~~~~~~~!~~~~^~~~~~!J7!??!!J!!JY~^~~~~~~~7?Y5YY55PPGGGGGB#P
|
||||
^G J5YYGY ..:!5YB####G5!^~~?!~~~!~~~~~~~~~~~~~~~!!77..~7^7~ .:7^~~~~!!~JGPPGGGBGB#####GY^
|
||||
^&! 5YY5B! ^J5YGB###B5!^~~~?7~~~!7~~^??!~~~!~~~~~~!! :77!.::~!^~~~7!~!Y#########BBP.
|
||||
^&#~ :PYY5B:.!YYJG#####GG!~~~~7?~~~?J~7?P57~~~!7~~~!~7:..:~5PGBJ~^!^~~!J~~!7P##B###BGGG7
|
||||
^&##Y^. ?P5PGGJYYYYPB#####BG!~~~~~J!~!55?7?!~J?!!77!777?::JPBBGP5J~ .!~~7J!~~!7YGG5BBGGGGB:
|
||||
^&###BG555YYYY5GBBB#B#####GGJ~~~~^7775?J~!!. .~??J?7??J7..!:7?7YY~7.^!~?J!~~!!7JP55PBGGGGG
|
||||
^&######BBBBB##########&#B5?!~~~~^~55~.7!~ .:~!7Y?J?!!~. :!~^~~.:^.??!!!7??YP5PPBGGGGY
|
||||
^&###################&##PY7~~!~~~~:?~ ^7:.^?5GBG7?!:. ... .:.:J????JY?5P57^:^75B!
|
||||
.G&&&############&&&###GYJ?~~7~~~~~:!:.!YBBBGP5J^ :?JJJJJYGPG!. .. .5:
|
||||
!G#&&&&&&&&&&&&#B5?GGGY5?~~~~~~~~~^755^~Y??57~!. :!J55YYY55GGPY .. !.
|
||||
.~YBBBB#GYJ?77~7BBP55P7~7!~!77~~~~~~~^^^!~^~! .. ^?PGGGGGGG#BP7 !.
|
||||
^5YY5G^ ..!GP55555?YP5!~~!77!!7?J~. .^:. .. .^5#57GPBBBBBBP. ....:Y~
|
||||
J5YYPP:...:7GP55555GP5G#P!~~~~!!!7?!:^:...:^: .^J?5GP:.YPY7JJGB#Y .:~YGB.
|
||||
5YYYGJ:::^YGGY:?P5G#BB##B57!77777777???JJJYY: ..:~!!YP7YYP^ ??7~7?5BBBJ~!5GG5
|
||||
:PYY5B!:^JGGPGBJ5G#####PJGPPJ5Y????JJJJJYY5PY?YYY??JJJ?7~!~JBG: !??~!?YBBB#BGGGB7
|
||||
!5YYPG5GGGGB###?B###BB?!JG555PPYJ?77JYPP5GP57!J5G5YGGPY?!:~BP~^. .7J?~~?JBBB#5Y5GB:
|
||||
Y5YY5Y5P5555^!PJPJ^?GGJYGPPGG!. .!Y55Y5Y: ..:~7J555JPPY!P~.~YJ?~~7JG#BBYYYPG
|
||||
^7?JJYYYY5557:.^^:7PPY55YY5P7 :. !PPPBP^... .J!5B5BB57JYP7?~~!J5B#GYYYGY
|
||||
...^J!~^.^JG55PPPPPGJ... . ~BP55PYJJJ?7~~^?5PGBBBGGPGGJ!^^~JYBBPYY5B!
|
||||
^^^:.:::?. ...:^~~~~^^::~!.:PGGPPPP5555555555555555PPPGP??7?YYBB5YY5B.
|
||||
...::^~!7?JYY5PPPPPPPP55555YYY555555555YYPP
|
||||
...:^~!7??JY555PPPPP55555BJ
|
||||
...:^^~!7?Y^
|
||||
|
||||
|
||||
|
||||
. . . . .
|
||||
7^.::?7:^: :7?:...P:. :~~~7P~~~^. :Y ^~~G!~~. :J?:^.?^^5 !! Y^ :Y.. ~~~^~Y!^~~: :P. :^^^JY .7~!.!~::5.
|
||||
.:. ~^ 7? :YJ.77.P:~? Y~~7P~~J: ~7J^~!!P7!!.::JY?J:Y ?^ ^G..5~:P^!J .YJ Y7^Y Y^ :? 5 Y. P
|
||||
Y: :JY? .GY^?!.P.~? :!!~?P~~?7 .^? !?!!!7? .7YJ~~ Y ^7.~Y.!7!!!~7: :7!~Y.!!^ 5 ~7^^!G^^::? 5 7~^~?J
|
||||
Y^ ^~^.~! 7?!.::.P::: ~!!~?P!!J5. .J JJ!!~7P .57:^P Y: Y^ J.5 !7 PY 7~ :5 ^^ .YP: P :5~5:^^^^.P
|
||||
!!~7!^:::!~ ~! Y .~?7 .. .? ?^ .~!J ?7^~5 J::. J.7::^7^~! :5 .!: : :~J ^^!?
|
||||
.
|
||||
|
||||
|
||||
|
||||
# Ciallo~ (∠・ω< )⌒★
|
||||
|
||||
<!-- markdownlint-disable-file -->
|
||||
<!-- Use a Random Ascii Art -->
|
||||
<AsciiArt theme="auto" />
|
||||
|
||||
<!-- Use a specific Ascii Art -->
|
||||
<!-- <AsciiArt name="maa-logo-with-endorsement" theme="disable" /> -->
|
||||
|
||||
59
docs/asciiArts/maa-logo-with-endorsement.txt
Normal file
59
docs/asciiArts/maa-logo-with-endorsement.txt
Normal file
@@ -0,0 +1,59 @@
|
||||
|
||||
|
||||
!: .7:~!.
|
||||
:. :?55 ?5~::~J?:
|
||||
:P5YY?7~: .!JYYJG. 7P! .7Y!.
|
||||
^5JJJY55PPG5!. .?JYYJYG. ~P?. ~YJ: :PY~.
|
||||
^5YYYYYYY5PPPPYJ??7!!~^!?YYYYY5 :5Y. :J5!. :G^
|
||||
~PY5555555PPPGGPPPPPPPPJ5YJYPP???5?57::.. !5J: Y&##P:
|
||||
^YPP5JJY5555PPGG55PP555PGPPPGGPPP555555555YYYJJ?77!~^::...~5P^:. P####7
|
||||
!GPPJ?JYYYYY5P5PPG57:...:!5GG?~!?JJY55PPPPPPPPPPP555555555YJYPYY57!~^::... .#####!
|
||||
.?PY?YYYYYYY5PP5G?..:!??JYYPYY7. .....:^~!?JJYY5PPPPPPPP555555555555YYYJJ?77!!B####P
|
||||
.5Y5YYYYYY555PGY.!?JYJJYJ5P:.?5^...:.::^~^^:::... ....::::~!!7?J5P55PPPPPPPP5P55PPGG###P
|
||||
.:~?P5555PPPPGY:J77YYJY55Y: ..Y5?Y5PPGGBBBBGGGGP555J!^. ^~...^!77YY5G5::~:.:!5#G
|
||||
^5555PPPG5?.~5JYYYYY7: :~?5PPG5BBBBB########BBB####BGY7~~^:..:: .:^!~^~?Y7~. ~J7Y
|
||||
P55PPPGY~...?5?~^:...:75PPGP5PG#####BGBBBBBBBBBB######BGGP5YJ???7!7JY?!!?YYYJYJ^^GJ..
|
||||
.!?P5YPB^ ....... :!J5PGB#######BBGY7~!!7?PYJJ7!5GB#######BBGPYYYYYJJYYYYY55GB##5^...
|
||||
75YYPG... .::::JPGB####BGPP55J5?^~~~~~~~~~~!!!?PGGBBBB#####GGBBBBBB##########&G^^~
|
||||
Y5YYGY... ..:^7PBB#####GPJ!~~~^~?!~~~~~~~~~~~~!!J7!7?JPG###&###############&&&~
|
||||
.PYY5B!... ..^YBBBB####GPJ~~~~~~~?J!~~~^^~~^^~~^^~!!::^75GB####&&&&&&&&&&&&&&##BG5
|
||||
^PYY5G:... .^^PB#B###GP5JJ7~~~~~~~!7?~~~^..^:^~~~!~~~!~^~~5JJ555G##&&&&&&&#BBBGGPB!
|
||||
?5YYPP......:Y######G?!~!!~~~~~~~~~~!7^^^^:^~~~~~~!7~~!~^~~~~~!7?YGB###P77!:JGGGGB:
|
||||
5YYYGJ..... 7#B####GP!^~!~~~~~~^::!~~!~^^~~~~!~~~~~!J!~7!^~~~~~~!?Y5GPPPP5!^PGGGGP
|
||||
.7 .PYY5B^..:::^GBB####PP!^7!^^~~~^^:^7~~~!^~~~~~~7~!~~~?5J?J7:~~~~~~~!?YY5YY55PPPGGGP~^:
|
||||
^5 ~PYYPG...:.!PP#####G5J!:?!^^~~~~~~~!~~~~^~~~~~!J7!??!!J!!JY~^~~~~~~~7?Y5YY55PPGGGGGB#P
|
||||
^G J5YYGY ..:!5YB####G5!^~~?!~~~!~~~~~~~~~~~~~~~!!77..~7^7~ .:7^~~~~!!~JGPPGGGBGB#####GY^
|
||||
^&! 5YY5B! ^J5YGB###B5!^~~~?7~~~!7~~^??!~~~!~~~~~~!! :77!.::~!^~~~7!~!Y#########BBP.
|
||||
^&#~ :PYY5B:.!YYJG#####GG!~~~~7?~~~?J~7?P57~~~!7~~~!~7:..:~5PGBJ~^!^~~!J~~!7P##B###BGGG7
|
||||
^&##Y^. ?P5PGGJYYYYPB#####BG!~~~~~J!~!55?7?!~J?!!77!777?::JPBBGP5J~ .!~~7J!~~!7YGG5BBGGGGB:
|
||||
^&###BG555YYYY5GBBB#B#####GGJ~~~~^7775?J~!!. .~??J?7??J7..!:7?7YY~7.^!~?J!~~!!7JP55PBGGGGG
|
||||
^&######BBBBB##########&#B5?!~~~~^~55~.7!~ .:~!7Y?J?!!~. :!~^~~.:^.??!!!7??YP5PPBGGGGY
|
||||
^&###################&##PY7~~!~~~~:?~ ^7:.^?5GBG7?!:. ... .:.:J????JY?5P57^:^75B!
|
||||
.G&&&############&&&###GYJ?~~7~~~~~:!:.!YBBBGP5J^ :?JJJJJYGPG!. .. .5:
|
||||
!G#&&&&&&&&&&&&#B5?GGGY5?~~~~~~~~~^755^~Y??57~!. :!J55YYY55GGPY .. !.
|
||||
.~YBBBB#GYJ?77~7BBP55P7~7!~!77~~~~~~~^^^!~^~! .. ^?PGGGGGGG#BP7 !.
|
||||
^5YY5G^ ..!GP55555?YP5!~~!77!!7?J~. .^:. .. .^5#57GPBBBBBBP. ....:Y~
|
||||
J5YYPP:...:7GP55555GP5G#P!~~~~!!!7?!:^:...:^: .^J?5GP:.YPY7JJGB#Y .:~YGB.
|
||||
5YYYGJ:::^YGGY:?P5G#BB##B57!77777777???JJJYY: ..:~!!YP7YYP^ ??7~7?5BBBJ~!5GG5
|
||||
:PYY5B!:^JGGPGBJ5G#####PJGPPJ5Y????JJJJJYY5PY?YYY??JJJ?7~!~JBG: !??~!?YBBB#BGGGB7
|
||||
!5YYPG5GGGGB###?B###BB?!JG555PPYJ?77JYPP5GP57!J5G5YGGPY?!:~BP~^. .7J?~~?JBBB#5Y5GB:
|
||||
Y5YY5Y5P5555^!PJPJ^?GGJYGPPGG!. .!Y55Y5Y: ..:~7J555JPPY!P~.~YJ?~~7JG#BBYYYPG
|
||||
^7?JJYYYY5557:.^^:7PPY55YY5P7 :. !PPPBP^... .J!5B5BB57JYP7?~~!J5B#GYYYGY
|
||||
...^J!~^.^JG55PPPPPGJ... . ~BP55PYJJJ?7~~^?5PGBBBGGPGGJ!^^~JYBBPYY5B!
|
||||
^^^:.:::?. ...:^~~~~^^::~!.:PGGPPPP5555555555555555PPPGP??7?YYBB5YY5B.
|
||||
...::^~!7?JYY5PPPPPPPP55555YYY555555555YYPP
|
||||
...:^~!7??JY555PPPPP55555BJ
|
||||
...:^^~!7?Y^
|
||||
|
||||
|
||||
|
||||
. . . . .
|
||||
7^.::?7:^: :7?:...P:. :~~~7P~~~^. :Y ^~~G!~~. :J?:^.?^^5 !! Y^ :Y.. ~~~^~Y!^~~: :P. :^^^JY .7~!.!~::5.
|
||||
.:. ~^ 7? :YJ.77.P:~? Y~~7P~~J: ~7J^~!!P7!!.::JY?J:Y ?^ ^G..5~:P^!J .YJ Y7^Y Y^ :? 5 Y. P
|
||||
Y: :JY? .GY^?!.P.~? :!!~?P~~?7 .^? !?!!!7? .7YJ~~ Y ^7.~Y.!7!!!~7: :7!~Y.!!^ 5 ~7^^!G^^::? 5 7~^~?J
|
||||
Y^ ^~^.~! 7?!.::.P::: ~!!~?P!!J5. .J JJ!!~7P .57:^P Y: Y^ J.5 !7 PY 7~ :5 ^^ .YP: P :5~5:^^^^.P
|
||||
!!~7!^:::!~ ~! Y .~?7 .. .? ?^ .~!J ?7^~5 J::. J.7::^7^~! :5 .!: : :~J ^^!?
|
||||
.
|
||||
|
||||
|
||||
|
||||
72
docs/asciiArts/maa-logo.dark.txt
Normal file
72
docs/asciiArts/maa-logo.dark.txt
Normal file
@@ -0,0 +1,72 @@
|
||||
|
||||
. ,:.
|
||||
;, .,NNd'.
|
||||
. 'cl:. .' ..
|
||||
;;'... ,clllc. .' ..
|
||||
.,cll;::;,'. .loclllc. .'. '.
|
||||
.;lolllccc::;;,. .olccclcc. ., '. ...
|
||||
:ccccccccc:::;,.. locccllcc. '' .,. .....
|
||||
ccccccccccc:::;;::::;;,,'...xlccclcc: ''. '. .....
|
||||
.cccccc:::::::::,;;;;:::ccc:llc:clcc''....lkx. ,. ......
|
||||
';::;:cc:;::;;;;;,;::::;;;::,c::cc:,:ccccc::;;;,''.... ,. .......
|
||||
,:::;odlcccc::::;;';:::::;;::;,;:;;,;::cccccccccccccccc::;;;,''.... .'';. .......
|
||||
,:::;dlcccccccc:::;,;::;:d00Oxoc;,';;,,,,,;;;;;:::::cccccccccccccccc::;;;,'.',dx:. .......
|
||||
.:::;dolcccccccc:::::;,lONNNNNKOkl;;:kXXKOkkxdolc::;,,,,;;;:::::::ccccccccccccccc:::;;,''.... .......
|
||||
;;lolccccccccc:::::;kNNNOdlc:::cc;l;lXNNNNNNNNNXWWNXKOkxdoc:;;,,,,;;;;:::::ccccccccccccccccc:::;;,'......'.....
|
||||
:occccccccccc::::;:NKdl:llllcccc,KO;:O0KXXNNNNNWNNNWWWWWWNXNNXKOdollccc:;,,,,;;;;::::::ccccccccccccccc:.;.....
|
||||
,lcccccccccc:::::;;O0:odllllllll;lNNO;;0KKK000OkxooooddxxO0XNNNK0KXNNNNWWNX0Okxdoc;;;,,,,,;;;::::::;c:;;':.....
|
||||
.::ccccc:::::;;,xO:xxoccllllc;cXNNNk;okdlc:,,;;;;,;;;;,,',;:ldx0NNNNNMWNNNNNNNN0x0XXKkdlcl:;;;,,c0OOok0xl,...
|
||||
';::::;;;;;;;kKoloocllllc;:kNNNKkd,;,;:;;;;;,'''.'',,,;;;;;,'',:oxKNNNNKKXNNXkkKNNNKKkkxddxdo,XOOOXWNNNXd;.
|
||||
:ccc::::::::dNN;lllll:;:oONN0Oxc;:,:'c,,,,'''..........''...'...''':lddkOKXXX00XNNXNKKkxdxxxdccoxXNNNNKclO;
|
||||
'cc:::::;;;oK0X0;c::cod0XKXNKo;:c:;oolo'.......''....''........''..',;:cc:cclodxk0KNKOdodOKKOcc;:::oKN0;.;O0
|
||||
;c;;;;;,'oXXNXN0;lxKNNXXXKXd::c:;,,',,......',,c;,,;;;;;;,,;;''.....'''',;:clolc:::c:c:;clc::cloool:,o0cckXN
|
||||
.:ccc;'ONNNKXNNXXXXNX0Od::c;,''''.....''';;:dxxxdol:,::coxx;;,.......'''''',:ccloooooooooooollc:,...;K0XN0
|
||||
,cccc;'XXNNNNNN00XO0NOc;c;'.....',',,,,;;;okkkkkkkkxoxxdddkkc:;'........'...'::;;;;:::;;;,,,'........,0K0O
|
||||
;ccc:;;XXXNNNNNX00O0x;:;'......;';;::ccolckkkkkkkkkkkkkkkxodxo;;;;;,,,'......,,.......................;OO,
|
||||
:ccc:,lXKXXNNNXK0Oko,:'.'.....'c,odxxkkkkoxkkkkkkkkkkkkkkkkdodcoolc::;c'...............................o.
|
||||
.cccc;,xXKXXNNXKKOOl;,'''.....';;lxkkkkkkklldkkkkkkkkkkkkkkkk0xoxkOOkxo,:'............................''.
|
||||
'cccc;'0XXXXNNXKKOo,,.'''...'',:lkkkkkkkkkdoldkkkkkOkkkOkkkkkOOkddkKKOxo;:,..........................';,
|
||||
,cccc;,XXXXXNNKK0l''''''...';;::lxkkkkkkkkxoolkkkkOXKOkKKkkkkxkkkxdxO0kkx,;;;,,,,..................,;;;'
|
||||
;ccc:,cNXXXXNXxkd.,''...';::coxdxkkkkkkkkkkddodOkkO0XXOkOkkkkkdxkkkdxOkkklxxdlccc:''..........,:l';;;;;'
|
||||
:ccc:,xXXXXXNX0O;',..'...:ldkkddkkkkkkkkkkkkkxoOk0Ok0KOkkkkkkkkddkkkdk0kkkkkkkxoooc,'....,odxok0x';;;;;.
|
||||
.cccc;'0XXKKXNXXx''..'..',cdkkkxkkkkkkkkkOOxkkkxxOOOkkkkkkkkkkkkkooxkxox0kkkkkkkkxool;;;,'';loxX0l,;;;;,.
|
||||
'cccc;'XXXKKKNN0''''.'..'::xkkokkkkkkkkkkKKdxkkko0kOkkkkkkdkkkkkkkloxkdokOkkkkkkkkxocl:;::;;;,cxk:,;;;;,
|
||||
,ccc:;:XXKKK0XN:;'''...',:ckkklkkkkkkkk0OK0dxkkkdkOkkkkkkkoxkkkkkkx:lodolkOkkkkkkkkkdlcclcccccc:;,,,,,,'.
|
||||
. ;ccc:,dXXKKKkkx,,'''...':,;o0klkO0kkkkkkkkkdxkkkkx0kkkkkkkkoOddxdddcc:lllcKkkkkkkkkkkkdlc::ccc::::::::;;,,,,
|
||||
. .cccc:,ONXKKK0d'c'''...',c:dx0xlkkkkkkkkkkkkdkkkkkk0kkkkkkxdcddo:ddxd:kxccld0kkkkkkkkxxolc::ccc::;:,;;;;;,,,,
|
||||
. .cccc;'NNXKKK0;c:''...';;:kkkkxoxkkkkxkkkkkkxkkkkkkOkkkkkdoolkKXOlkkkcOXXko:0kkkkkkxkkd:cccc::::;;;'.........
|
||||
.. ,ccc:;;WNXK0k::l'''...,,ckkkkkdoxkkkkxkkkkkkxkkkkkkkkkkkkkkkdoXNN0ckkoxXNNN0xOkkkkkdxkxc',,;''''''........
|
||||
.. ;ccc:;lWNXKk;cl,''...',ldkkkkkdodkkkkxdkkkkxoxkkkkkxkkkkkkkkxoNNNNKlkoxNNNNNo0kkkkkoxkxd:''.........'''.
|
||||
... :ccc;,xNNXl;ll:'''...,,cdkkkkkxldkkkkdokkkkl:cxkkkkxxxxkxxkkd0NNNNN0lcllc::lc0kkkkxlkkxxd,.........';;;.
|
||||
.... .cccc;,ONk:colc,'.....';,xkkkkkkcdkkkklckkoc;:oxkkkxxdxxxxxxxoNK0K0xl,;'':kKNx0kkkkookxxxdc'......',;;;;
|
||||
...'. 'ccc:;'l:clll:;........;'xkkkkk0cdxkkx::dcoxckcldkxxxdxxxxddlOk0d:''',;:ccXWNxOkkkocxkxxxdl,':l';';;;;;,
|
||||
....',....';,,,,:lll:::;';.......:'kkkkkkOooxkxoc:lkkcOKOlcodxdddddddlxXX;'',;:::cdxOWWxkkkolokkxxxoo,:;:',';;;;;,
|
||||
.....',:ccccllllc:;,'''..'......'c':kkkkkkOodxo;ockkddXNNXOocooooooolc0WNdOXlodl:;xxxWXdkxlloxxxxxdoo;:::;,';;;;;'
|
||||
........',;;;;,''''.............:;ldkkkkkk0olc;x0ckxdNNNXK00xdccoollooco0WWWNkxxxOOkoNxdOKloxxxxddooo,::::;,;;;;;.
|
||||
............'.................',,dxxkkkkkk0d:;kXKoxoXNNNKKOxdkOlocoxxkOKNWWWWNkdkkdxKNXK0Nldddddooooo,c:::,,;;;;;
|
||||
..............................;clxxkxkkkkkkKckKXkoxNNXOo:''';l,lxKNWWWWWWWWWWWWX00KNNNdXK0cooooolllol;c;:xxkxl,;,
|
||||
.............................'lolxxxdxkkkkkOOdNNxONOl,''',,;OWOXWWWWWNNNNNNWWWWNNNNNNXXXXoollllllc,o::ckNNNNNN0:'
|
||||
...........................',locxxxxdkkkkkk0xdXNx:'',;;::colKWWWWWNNNNNNNNNWWNNNNNNNNNXdllllllll;;,,cXWWNX00NNK.
|
||||
......................'o:,;,ll:xkkkkkkkkkkkOko:,lk::cl::lxxkWWWWWNNNNNNNNWWWNNNNNNNKdccccccllc;;::,KWWNNNNXNNX.
|
||||
................':okc';,,cc:xkkxkxdkkkkkkklloNW0lxxdoOkkdWWWWWNNNNNNWWWWWWWWWN0o::::cccc:;;,',c:WWWNNNNNNNN:
|
||||
.'.....';clodkkkc'',:cc:lxkxxkkxldkkkkkkkxod0KkxxO0OdkWWWWWWNWWWWWNNWWWWWWWKdl:;;;;,,,:;''':lWWNNNNNNNNN,
|
||||
;cccc;:0NNNKOkkx';::::c;dxd:ckkkkoodxkkkkkxdckNOxdddONNWWWWWWWWWNOOXWWWWWWWWNx,',,':,'''',,;;NWNNNNNNNKd
|
||||
:ccc:,oKNNNNXXx,;::::c:;lc;:;oxkkkxxddddoc;xXNNNXXXNNNNNNNNWWWWWNNWWWWWWWWNk:'':kO,:,,,,'''''oNXNNNNX0:.
|
||||
.cccc;'kKNXXK0O,;;::::cc;;:c;''oxkxxkkkxxxxlckXK0XKXXXNX0NNNNWWWWWWWWWWWN0o:l;;'xK0;;:ldolc''''0XOOkd:;,
|
||||
'cccc;,kO0O0Ox,;;:o:::cc,':,'..,dxxxxxxxxdxxxolodxkkxdoloNNNWWWWWWWWWNKko,,x:l;:KXXcoodkool,'''kNNK0:,;,
|
||||
,cccc;;OO000x,;;,kNk;::'......',;ddddddddddddddddllccllcKWWWWWWWWN0kxddo,ckl;o,ONNNcoodkooo,''''oxkc,;;'
|
||||
:ccc:;c000Oc,;;;;;o::;.......;,;::docdddooooooolllllcc;dOOOOOOkoc:;::cddkkx,,:xNNNXooodkdoo;'''''';;;;;.
|
||||
.cccc:,oOko;,;;;,'.d,,......,ld;;::;c,:cloooolllccccc:;:;;'''';olcodkkkOxOd;;'oNNNNXxoodkxoo;''''.::;;;;.
|
||||
'cccc;,:,,;;;,,'..'d''...'':ddd':::::;c:,;cllc:cc::;;::lxxl:;';oc;',:ldk0Nc'':0kNNNKolodkkoo:''''.ccc;;;
|
||||
,cccc;::,,,,,,',,''d..';,:,odd:;:::,c:dOXNWWWN0x;,:l':c:OXXXK0xoc;'''';'.d:;lXX:oNN0llodkkool'''''cccc;,
|
||||
;cccccccccccccoNKd:o:o0Nd',;::,;;;,'cKWWWWWWWWWWXdc,lc:;;kXNNNNNXK0kxllld:;:':;,kKkocllxkkdol,.'',ccc:;'
|
||||
,;:::ccccccccckNN0dkWXd;;ccccccc::,KNNNNNNNNNNOKWNc:::;,:OXNXNNNNNNNdx0k,.;,';dxcd;:dckkkxol;'.';ccc:;'
|
||||
',:ONNKk:,;;:cccccccccNNNNNNNNNNNkKNWo,,;;,'oxOKKXXNNNNK:;;;,c,''';o;:;klkkkkolc,'.:ccc:;.
|
||||
,kOxkNNO:. .,,,;;;:;;0NNXXXNNNNNKNNWl;;ccccc::::cclodxdoo:,;',';;,;,;,olkkkkolc,,'cccc:,
|
||||
'XKl dXX: .:kKXXXXNK0NNK;;;ccccccccccccccccc::;;;;,;;;,,,,;xkkkkllc,,,cccc;,
|
||||
ox;,,,,;;;::::::ccccccccccccccccccc::;::ccc::;'',cccc;'
|
||||
.,,,,;;;;::::cccccccccccccccccccc::c:ccc;.
|
||||
.,,;;;::::::cccccccccc:cc:,
|
||||
.,,;;;:::::cc;,
|
||||
..,'
|
||||
|
||||
72
docs/asciiArts/maa-logo.light.txt
Normal file
72
docs/asciiArts/maa-logo.light.txt
Normal file
@@ -0,0 +1,72 @@
|
||||
|
||||
xX XkdKx
|
||||
kxk: cKk :kKd
|
||||
lXK .NOoldx .XO' xK0
|
||||
cxxO0KXN0 Okolllok l0x xK0
|
||||
kXkollxddxkOKk Klcolllok XOc OKO d'
|
||||
xxlcllloooddxxkKx Oclooolook ;Kk. OKO x0KNl
|
||||
.dooooooooodddxkKXNNNNXl. lcooollooc KOd ,kKx :000KK
|
||||
,ooooooooooodddxxddddxxkkO00K;looolood' .NOO: OKN O000Kx
|
||||
loooooodddddddddkxxxxdddooodllodolooOO0KKKl,;0d. 'k0O .00000X.
|
||||
cOxddxdoodxddxxxxxkxddddxxxddkoddoodkdoooooddxxxkOO0KXXNNWK; 'kKO l00000K'
|
||||
dkdddxc:looooddddxxOxdddddxxddxkxdxxkxddooooooooooooooooddxxxkOO0KXXNNWO' cOOxK; 0000000
|
||||
okdddx:loooooooodddxkxddxd:..';coxkOxxkkkkkxxxxxdddddooooooooooooooooddxxxkO0Ok:;d0Nd. c000000x
|
||||
;dddx:cloooooooodddddxkl' .',lxxd,...',,;:cloddxkkkkxxxdddddddooooooooooooooodddxxkOO00KXNNNWKc .0000000
|
||||
xxlclooooooooodddddx, ':lodddooxlxl. . ..',;:codxxkkkkxxxxdddddooooooooooooooooodddxxkO00KXK0O00000
|
||||
cdcoooooooooooddddxd .:ldllllooook.'xd'.... . ..':cllooodxkkkkxxxxddddddoooooooooooooood0x00000
|
||||
;kloooooooooodddddxx'.dc:llllllllxl 'xx.......',;cccc::;;'.. .... ..',;:coxxxkkkkkxxxddddddxodxxOd00000
|
||||
:ddooooodddddxxk;'d;;coolllloxo. ,xc,:lodkkxxxxkxxxxkkOkxdl:;. .;....,:loldxxxkko.''c,.;lk000
|
||||
Oxddddxxxxxxx,.clccolllloxd, .,:kxkxdxxxxxkOOO0OOkkkxxxxxkOOkdc;. ... .,,. ..,,;::;:ck.'''. .:x0
|
||||
ddooodddddddd: xllllldxdc' .';oxdkdOokkkkOOO0000000000OO000O000OOOdl::,'....... . ..,;:;;;:ooc;. .ol'x
|
||||
.Ooodddddxxxc....xoddoc:.... .cxdodxcclcO0000000OO0000OO00000000OO00Okxdoodoolc:;,.. .':c:'..'ooxdddc. .x0x'.
|
||||
,xoxxxxxkOc.. . .xl;. .....:ddodxkkOkk000000OkkoxkkxxxxxxkkxxOO00000OOOOkxdolclodddododxoloddolcccldkc.oo,.
|
||||
0doooxO' .. .... ..':ddoxkOOOO00000OOOxxd:;;;:cldkddoc;;xxk0000000OOOOOOkdoolccccccccccccllodk000x... .
|
||||
.kooooxO.. ...'. 'oxoxO00000OkOkkkkxxxc,,,,,,,,;c;;:::,,odxO00000000O000OddxxxxdddxxxkkkO00000000k...'
|
||||
;xooodxx... ...'.;xdxO000000xOxxddooclo,,,,,,,,,,,,,,,;c:;cxxxxxkkkO000000kk00000000000000000000000x'':
|
||||
ldooodkl.... ...',ckdO0O00000Ookc:;;,,,,c;,,,,,,,,,,,,,,,,:c:occloddxoO0000000000000000000000000KKKK00c'
|
||||
xooooxk;.... ...''lxkOOO00000Oxxl;,,,,,,,ll:,,,,,,,,,,,,,,,,.;c;,'',;ckdO000KKKKKK0000000000000KKKKK0OOx
|
||||
kooooxO..... ...'ckk0OOO000OOkdl,,,,,,,,,:cl:,,,,,',,,',,,,,'',::,..';cxdk00000KKKKKKKKKKKKKKKKKKKK0Oxkc
|
||||
.kooooxk..... ...lOOOOOO000Oxxddl;,,,,,,,,;ccl,,,,'..',..,,,,;,,,;:;'.,,;kxxxkkkk0KKKKKKKKKKKKKKKK0kxxxO'
|
||||
;xooodko .... .;,:0kOO000Oxddoc;:;,,,,,,,,,,::c:',,'...',',,,,,:;,,,:;',,,l;;:looodOO0KKKKKKKK0kdlOxxxxxO
|
||||
odooodk;..... ..'xOk00O000dl:,,::,,,,,,,,,,,,,;c',.',..',,,,,,,,::,,,:,.,,,,,,,;cccokO0000kc:;c,.;Oxxxxxk
|
||||
kooooxO...... ..;OO00O00Oko:,,,;,,,,,,,,,'';,,,;;''',,,,,,,,,,,,,cc;,;c;.,,,,,,,,;cclxxxkOOxlc;..lkxxxxkl
|
||||
OooooxO...... .OOOO0O00Odd;,,c,,,,,,,,,,..:;,,,c.,',,,,,,:,,,,,,,lc;,:c,',,,,,,,,;coldxddxxxko;,dkxxxxk;
|
||||
Nc 'kooodxd....... dxOOO000Okdo,,,l,,,,,,,,.'..:;,,,:,',,,,,,,c;,,,,,,;dlc:cl,',,,,,,,,,:looloooooodxkkkkkkOXNd.
|
||||
0' cxooodk:.....,,;kkOOO000Odkxc.,l,'.,,,,,,,,,:;,,,,;.,,,,,,,,c'::;:::oodlllo.,,,,,,,,,,,:loddoooddddddddxxkkkk
|
||||
0, xoooodk' .....:OoOOO000Okod:;.;l,,,,,,,,,,,,:,,,,,,.,,,,,,;:o::cd::;:d,;ool:.,,,,,,,,;;cloddoooddxdkxxxxxkkkk
|
||||
0c 0ooooxO .....xodOO000Oxxd,,,,;c;,,,,;,,,,,,;,,,,,,',,,,,:ccl,..'l,,,o'..,cd.,,,,,,;,,:dooooddddxxxO00000000l
|
||||
0k .kooodxx ...,ddlOOO000kko,,,,,:c;,,,,;,,,,,,;,,,,,,,,,,,,,,,:c. .o,,c;. .;',,,,,:;,;oOkkxOOOOOO0000000l
|
||||
00; ;xooodxl ..,xolkOO000Okl:,,,,,:c:,,,,;:,,,,;c;,,,,,;,,,,,,,,;c .l,c; c.,,,,,c;,;:dOO000000000OOOO
|
||||
00K. ddoooxk; .lxlldOOO000kko:,,,,,;l:,,,,:c,,,,ldo;,,,,;;;;,;;,,:. .lolloddlo.,,,,;l,,;;:k000000000Oxxxx
|
||||
000K, Oooooxk' ,doclokO00000Oxk;,,,,,,o:,,,,lo,,coxdc;,,,;;:;;;;;;;c ....;lkxOOd,. ;.,,,,cc,;;;:oO000000Okxxxxl
|
||||
000O0O OooodxOldollldx00000000xO;,,,,,.o:;,,;dd:oc;o,ol:,;;;:;;;;::l',.:dOOOkxdoo. ;',,,co;,;;;:lkOdlOxOxxxxxk;
|
||||
0000Ok0XXXOxkkkkdllldddxOx0000000dO,,,,,,'cc;,;codl,,o'.'loc:;:::::::l;..xOOkxdddo:;' ;,,,clc,,;;;cckdxdOkOxxxxxk.
|
||||
00000OkdoooollllodxkOOO00O000000OoOd,,,,,,'c:;cxco,,::. .'coccccccclo. :'.lc:ldx;;; .:,;llc;;;;;:ccxdddxkOxxxxxO
|
||||
00000000OkxxxxkOOOO000000000KK00dxl:,,,,,,.clox;.o,;: ....;:ooccllccoc. ,;;;'',c ;:'.lc;;;;::ccckddddxkxxxxxx
|
||||
000000000000O00000000000000KK0Okk:;;,,,,,,.:dx,..c;c. ..';:,'lcoc;;,'. ,:,,:;. ... l:::::ccccckodddkkxxxxxl
|
||||
K0000000000000000000000000KK00xol;;,;,,,,,,.o,..,c; .'cdOOOxlkl;. .... :...occccclllclxoxd;;,;lkxk,
|
||||
0KK000000000000000000000KKK00Olcl;;;:;,,,,,'': ;' 'lkOOOkkx' '. ....ccllllllokcddo, .dO.
|
||||
kKKKK00000000KK00000KKKKK00Oklco;;;;:,,,,,,.;:. ;dOOkxxddocl. .:llllllllxxkko. ... .x
|
||||
:0KKKKKKKKKKKKKKKKKKKKOcdkxklld;,,,,,,,,,,,',cdkl,ddolddl;;, .:oooooolloxxddk. . .o
|
||||
.00KKKKKKKKKKKKKKOdc,oOxkkood;,,;,;:,,,,,,,llc .l;;:c',,: .cddddoooodxxkOkod d
|
||||
.0O00000Oxolc:,,,oOOkdoodl;,;;,,;l:,,,,,,,;c:..,;;'.':, .:ldxxxxkkkdxOOOdl l
|
||||
;xooooxd. .',,;Oxddddox:;:do,,,,cc:;,,,,,;:o, ';:::' ''. ;kOkkOdkOOOOkkxx .:
|
||||
odooodkc. ..;kxddddodxloxdxc;,,,;;::::cox;. ... ,dOOd,'kdkkkkOOOOOc . ..dx
|
||||
OooooxO,. ....'kxxddddooxxdoxOOc;,;;,,,;;;;lo,........ .. .cdlxxO;..xxdl:cloOOOO..'',:dxkc
|
||||
Oooooxk,'.'.';kxxdcdddookOdkO00k:;;;;;;;;:;;;clc:;,,;:clc .,ckk;dlxd...occ:,cclkOOO, ..dkxk'
|
||||
,kooooxx''...;kxxk, ,xddO000000Okx::::::::::::::::lloollo. .,;::cko,lxck' occ:,ccckOOOOc;,okxxO
|
||||
cdooodxo...'okxxxxxcddx0000000xkxdd:co:::cccccccllllloox:'''''',codxddo::,,;kkd; .ccc:,:ccxOOOOOOxxxxxx
|
||||
koooodkc',cxkxxxkO0:kk000000kl:xxddxokdolcccclllooooodxdxxOOOOxcloc:,,,';':xxOc .;cc:,;ccxOOOO0ddxxxxo
|
||||
OooooxkdkkxxxkkO00O:OO000OOd:::Odddddxodkxollodooddxxddl;;ldxOxcoxOkdl:,. oOOd., .clc:,,ccdOOOO0oooxxx:
|
||||
.kooooxddkkkkkkOkkOO:00Oxkdkc::dxdddkod:'. .;xkdlOdod'.....;coxOOOOxO0:dxl..dc .llc:,,cclOOOOOooooxk'
|
||||
;xoooooooooooooc .:dcdc. :OkxddkxxxkOo. .:oklodxx,. ...,;lll:dxdOdxk,.,coll;,,:clk0OOkooodxO.
|
||||
.dxdddooooooooo, .:, .:xxoooooooddk. '. odddxkd'. . :;.,k0xkOx:;o:xd:o,,,;clxO0Oxooodxk
|
||||
.ckd' .,dkxxdooooooooo ,. ckkxxkOc;'.... .dxxxkokOOOxcxdx,l,,,,clokO0dooodxo
|
||||
'k,';, 'dc'dkkkxxxdxx. ... . lxxoooooddddoolc:;:ccdkxOkOxxkxkxkcl,,,,clokkOoooodk:
|
||||
.k..; ,..dc ,c,..... .. .xxxoooooooooooooooooddxxxxkxxxkkkkx;,,,,llokkkooooxk.
|
||||
,,lkkkkxxxddddddoooooooooooooooooooddxddoooddxOOkooooxO
|
||||
;xkkkxxxxddddooooooooooooooooooooddodoooxx
|
||||
.lkkxxxddddddoooooooooodoodkc
|
||||
.dkkxxxdddddooxk'
|
||||
;xkO.
|
||||
|
||||
54
docs/asciiArts/priestess.dark.txt
Normal file
54
docs/asciiArts/priestess.dark.txt
Normal file
@@ -0,0 +1,54 @@
|
||||
WWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWMMWWMMMMMMMMWKOdoxdxolc:::;;:::;;;;;:ccclc:c:lxNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMWWWWWWWWMMMMMMMMMMMMMMMMMMMMMMMW
|
||||
WWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWMMWMWMMMMMMWWKkxodxddl;;;;;;;;;;;;;;;,,;;:::;;;:l0NWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMMWWWMWWWMWWMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
WMMMMMWMMMMMMMMMMMMMMMMMMMMMMMMWWWMMMMMMMMWWWXOxdoddOk::;;:cllccc::::;;,,,,,;;;;;,;:xKWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMMWWWMWWWWWMMMMMMMMMMMMMMMMMMMMMM
|
||||
WWWWWMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWMMMMMWWWKOOoloOkdc::::::::::::;;:;::;,,,,,,;;,,,;cxKNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMMMMMMMMMMMMMMMMMMMMWMMM
|
||||
WWWWWWMMMMMMMMMMMMMWMMMMMMMMMMMWWWWWMMMMWWWXkOoclOXlccccc::::::cc:::;:;,::;,,';,;;,,,,:ok0NWWWWWWWWWWNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMMMMWMMMMMMMMMMMMMMMMMMMMWMMM
|
||||
WWWWWWWWWMWMWWWWMMMMMMMMMMMMWWWWWWWWWMMMWWWOxo:ckl:lcc:ccclooooldolc:::;;;:;;,';;;,,,,;;lkOKNWWWWWWWWWWWWWNNWWWWWWWWWWWWWWWWWWWWWWWWMMMMMMMMMMMMWWMMMMMMMWWMMMMM
|
||||
WWMWWWWWWWMWWWWMMMMMMMMWMWMMMWWWWWWWWWWWWMKxdc:ll::c;::lldxxdoolldddlllc:;;:;:;,;;,,,;;;;cxO0KWWWNWWWWWWNNWWWWWWWWWWWWWWWWWWWWWWWWWWMMMMMMMMMMMMWWWWMMMMMWWWWWWW
|
||||
WMMMMWWWWWWWWWWWWWWMWMWWMMMWMWWWWWWWWWWMNWkxlc::locc;ccollllclccc:looll:c:;:c::,;;,'',;,;;cxkO0XWNNNNNWWWWWNNWWWWWWWWWWWWWWWWWWWWWWWWWMWMMMMMMMMWMMMMMMMMMWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNWNW0Oco:;:llll:c:clccccllc:::c::::;:;,ccc;',,'',;;;,,:x00O0NWNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWWWWWWMMMMMMMMMWWMMMMMMMWWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNNXMxx:l;;:olo::;::clllolllc::::;;;;;;;oc;,,,',''';;;,,;l00OkNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWWWWWWMWMMMMMMMWMMMMMMMWMWWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXNNNNoo;c,::c:::c:;:clllllllcc:::;;;;,;;lko,,''''''':l:;;;;o00xXNNNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWWMMMMMMMMMWMWWWMMWWMWWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMWNNNWKX:c;c::;:;;:l;;;clllcccccc::;;;;;;;;c0kl'''.'..'.,::;;:;;oOkXNNNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWWWMMMMMMWMWWWMMMMWWWWMWMMW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNWNWOk;;;l;',;,:xlcc::ccccc:ccc:lc;;;;;,;c0xO;'''.'..',;,:,,::,;co0KNWWNWNNNNNNNWNNWWWWNWNWNWWWWWWWMWWMMWWMWWWWWWMMMWWWWMWWWW
|
||||
WWWWWWWWWNWWWWWWWWWWWWWWWWWWMWWWWWWNMXN0o;';c'',;,lOxlcooc:::cl::cldx::lco:,dOxOl,.'......',,:;,,:;;;:O00KXNWNNWWWNNNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWMWWWWWWWW
|
||||
WWWWWWWWWWNWWWWWWWWWWWWWWWWMWWWWWNXMNKNOl:';;'.',;lO0OdloxxddoollxxxxdxxxxxxOOOOx,.........',,:;;,,;;:oONNNXXNWWWWNNNNWWNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWMWWWWWWWNNXMKXXOc:'','..';okkxollodxkkkkkOOkxxolcccoxkOOx,..'.......,:;;:;;,;:clxKWWNNNWMMWWWWWNNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
|
||||
WWWWWWWWNWNWWNWWWWWWWWWWWWWWWWWWNXWW0NKO::'''.'..',';'.''.;x00000000x;',;,','',lo'..''.......,:;;:;;;,:cldOXWWNNNNNNWWWWWWNWWWWWWWWWWWWWWWMWWWWWWWWWWWWWWWWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWN0NNKNKkcc,,'.....:kxldkkdkO00OOOOOOOkoOOxoxOo:c'...',... .,'',;:;,,;;;,;cox0NNWNNNNXNNNWMWWNNWWWNNNWWWWWWMMWWWWWWWWWWWWWWWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNKO00KX00ll,,'.....ckOxxxxkOOOOOOOOOOOOkxdxdkkxkc....',,... .,,,;,;:,;;;;,,;clkKNNNWWWWWWNNNNWWWWWWWWNNNNNNNNWWWWWWWWWWWWWWWWWWWW
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXW0OOoXK0kol,''.....'xkkkkOOOOOOkkkOkkkkkkkkkkkko...:;',,... .';,;:;;;;:c:;;;;:cldOKKXXWWWWWWWWNNXXNWWWWWWWWWWNXXNNNNWWWWWNWWWWWWN
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWXNX0xdKKKodl,','.....,xkkkkkkkkkxxkkkkkkkkkkkkxo:;':l;','.... .';;;:::;,;ccllc:cclodxO00KKXNXXXXXXKKKK0OO00KKKXXXNWWNNNNNNNNNNNNNN
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWK0NNkxKKOo:o,',,.....;.okkkkkkkkkkkkkkkkkkkkkxdoo,clc,'.,.... .''::;:cc:,,:clloooddoloddxkOO0KXK0OOOOKKXNNNXXKKKKKKXXXXK0KXNNNNNNN
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWNKkKWNxKNxl::,,.''.':.;ocokkkkkkkkkkkkkkkkkkkxxxx;cl:,,''''......',:;;:ccl;',;:lloooddoldxxxxxkkkOOOKKKKKXKK0KNWWNNNNXNNXXNXKXNNNNN
|
||||
WWWWWWWWWWWWWWWWWWWNNWWWWWWWWNXdKNW0KOdl:;,,.....,cdoxoxkkkkxkkkkkkxxkkkkxxxx::c;,,,,'.... ...'';:;:ccccc;,;,;cldoodddxk0NNNNNNXNNNNWNNNNNXXXNNNNXXXNXXNNXNNXXNN
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWNXdKWOkOxoc:,,''.....':dxxxxxkkkxkkkkxxxxxxxxxxlccc::;;;'.'.......',;;;clcccl::cccclolodxkxOKNNWWWWNNNNNNNNNNNNXXNNNNNNNNNNNXXXXXXN
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWX00Kdxxdlc:'.,'.'....;coxxxxxxxxxxxxxxxxxxxxdodoooc:;:c:',,......';;,,clllccc;lloodddoddxkOOO0XNNNNNNNNNNNNNNNNNXXNNNXXXNNXNXXXXXX
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWN0xdoddoll',..'.......:llldxxxxxxxxxxxxxxxoooddddddoc::cl,;,......,;;;cooooolcolooodddxxkk0OOOO0KXXNNNNNNXNNXNNXNXXNWNXXNNXXXXXXXX
|
||||
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWNK0dcooolx,,,;.'........clllccdxxxxxxxxxo:oddddddxxdddddolo;;.......:::ccoooddod0xdodddxkOOKXK0OOXNXXXXKXNNNNXXXXNXXXXWXXXXNXXXXXXX
|
||||
NNNNWWWNWWWWNWWWNWWWWWWWWWWWWKKkccccldd',,:;,'.......'cloc,,:ldxxxoc;;;ddddddddxxxxxdxkxooc'...'.;cc:llloodddkWXOdxxxxkkO0XWX00XNNNNXKKXNNXXNNNXNXXXWXXNXXXXXXXK
|
||||
NNNNNWNNNNNNNNNNNWWNWWNNWWWWN0Kkc;loxO:;.,:;:.....,:''':oc;;,;;:c:;;,,,ddoooddddxxxxxxkkOokd;''',':lclodoooxxxxXWNKOkOk0KKXXNXKXKNWWNNNXXNNXNXXNXXXXNWNNNXXXKKKK
|
||||
NNNNNNNNNNNNNNNWWWWWWWWNNNNWKOXO:lxxOd',',:,:. :..,::'.'''',;;;;;;,,''.dddooooddddxxxxxkOkdOx,.,,,,;loddxxdokxxk0NWWK00OXNNNNNXNWXNNWNNNNXXXXNXXXXXXNMXXXXXXXKKK
|
||||
NNNNNNNNNWWNWNWWWWNNWWWWWNWKkKXkoKXOo',;;';;;..l. :o:,..'...':;;;;,,,,,,:ddddoodddddxxxxkkxxOx,'c:,,;oddOKxdkkx0K0KNWNX0KXNNNNNNNNXXXNNNNNNNNNXXXXXXNMXXNXXXXKKK
|
||||
NNNNNNNNNNNNWNWWNNXXWWWWWWNkxOKONW0::':l:,;:'..l. dloc:'..'.:c::::;:::cc:xxxxxddxddddddxxxkdxOx,;dlc;;coOWOxkkONX0XKXNW0NNKKXNWWNWKXXXWNXXXXXNNNNXXXWNXXXXXXXKXK
|
||||
XNNNNNNNNNNNNNNNNNNXXWWWWW0olx0WKd,:::ol:::;.,.l. lxdoc:....'::::cclllllcx0OOOOkkX0xdxOkxkkkdxOx,;dol;;coOkx0OKNNX0XKXXKNNXKXXXNWNXXXXXXXXXKNXXKXNXNNXXXXNXXXXKX
|
||||
NNNNNNNNNXXXNNNNNNNNXXXXNKxclxxo:;lxdcdoOkd,.'.. .xxdlcc.. ,'.;cllllllcc:,:oxkkO00NNKkk0XNNX0kxxkc;dddl:cllldx0XNNX0X0KXNNXXXXXXNXXXXXXXXXXKXXKKKKXKKXXXXXXXXXXK
|
||||
NNXNNNNNNNNNXNNNNNNNNWNX0OOdllllokkkxcxOW0d;;'' ;dxolc,. .;:;';cc:ccc::;::;:ccxOkk00XNXKKNWWNKkxkxcloddlcdxodxxOKXX0XKXXXKKXWNWWXXXXKXXXXXXXXXXXXKXKXXXXXXXXXXX
|
||||
NNNNXXXNNNNNNNNNNNNNNWWWXXKOd0kO0000OlxNXxcOco...c,;,'...;odxol:';:::;:clcll:ll:oxkxkxk0KXXXXXXN0kkkkxolooodXNK0OkxOOKXXNXXXXXNNXXXXXXXXXXXKKXXXXKXKKKXXXXNXXXXX
|
||||
NNNNNXNNNNNNNNNNNNNWWWWNNNXKk0XNKKKKXkx0okK0kl....;..l,,,dodxxxdo'.cccooooololoocoxxxxddxkkkkkkO0KKkO0KKxk0kxKNNNXKOOkO0XXXXXXXXXXXXXXXXXXXXKKKKXKKKXKXXXXXXXXXX
|
||||
XNNNXNNNNNNNNNNNNNNNWWWWWXXXXNNNXK0OOkolxxkkxxc:.....;l:xdlldxko;,;':clooooollooolodddddoodddxkO00KkKKXNXOOKkxO0KKXXK0OkxO0XXXXXXXXXXXXXXXXXXKKXXXXXXXKXXXXXXXXX
|
||||
NNNNNNNNNNNNNNNNNNNNWWWWWXXKKXXXXXXXXX0xdO0OO0ool:,..,:codoclc.'',,;'.'loooooooooocoddddddodxOOO0O0xKKXNNX0XNKk0KXXKKXXXK0kk0XXXXXXXXXXXXXXXXKXXXXXXXXXXXXXXKXXX
|
||||
NNNNNNNNNNNNNNNNNNNNWWWWWNKW0KXXXXXXXXK000OO00:dxxxc:,...',;,'.'.',,,'':ooooooolool:oodddxxxxxkkkk0x00NNNNNKXXXkK0XXXXXXXXX0kkKXXXXXXXXXXXXXXKXXXXXXXXXXXXXXXXXX
|
||||
NNNNNNNNNNNNNNNNNNNNNWWWWNWN0KKXXXXXK0KK00000dllodloxxkdc;,''..''..',cl,,loooolllolccddddxxxxxdddkOxOOKNNNNNXXNKkKKXXXXXXXXXK0O0XXXXXXXXXXKXKXXXXXXXXXKXXXXXXXXX
|
||||
XNNXNNNNNNNNNNNNNNNNNWWWWXW0k00KKXX0KXXK0000xkkxdloxOkkkkxdll:l:lllloooo:,cooollllll:oddddddxxxxddkxO00KXNNNNKXN0kX0XXXXXXXXXKXKOKXXXXXKKXXXKKXXXXXKXKKXXXXXXXXX
|
||||
XXXXNNNNNNNNNNNNNNNNNNNWXNXkdOO00K0XXXXKK00KOxxOxkOO00Okkkkdo::lldoooooooc::oooooooolcddddxxxxxxldxdx000XNNNNN0XNx00XXXXXXXXXXXXXOXXXXXXXXKXXKKXXXXXXKKXXXXXXXXX
|
||||
XXXXNNNNNNNNNNNNNNNNNNNNXN0OxkOOO0KKKKKK00KKX0xkOO0KK000OkOxkl:;cdxdoooooocclooooooooooddxxxxxxllodxxO0KNNNXXXX0KKx0XXXXXXXXKKKK0KXXXXXXXXXXXXXXXXXKXXKXXXXXXXXX
|
||||
XXXXXXNNNNNNNNNNNNNNNNNXWKOkxxkkk0KKKK0000KXKOxOO0KKK0000OOkkkl:clkxddoooodcooooooooooldxxxxxxl:clddkxO0XNNNNNXXKKkKXXXXXXXXXKXXXXXXXXXXXXXXXXXXXXXXXXKKKKXXXXXX
|
||||
KKXXXXXXXXXXXXXXNNNNNXXXWkkxxxkkxxO0K00000XX0xOOOKKKK000000kOOkxdxxxddoddddoddddooooooooxxxxko:cloookxk0KNXXXXXXXKkKXXXXXXKKXKKXXXXXXXXXXXXXXXXXXNNNXXXKXXXXXXXX
|
||||
KKXXXXXXXXXXXXXXXNNXXXKWKkxxxxxxxxxdk0000KXKOkOO0KKKK000000kOOkkxdkxddoxdddxddddddddooolxkkko:cdddolkxkO0XNXXXXXXXK0KKKKKXXKXKKKKKKXXXXKKKKXXXXXNXNNNXXXXXXXXXXX
|
||||
KKXXXXXXXXKXXXXXXXXXXKNWkxxxxxdxxxdolxxOKKXKOkO0KKKKK000000kkOOkxdkxddoxxxxdxxxxdddddoolokkd:lxxdxcokxkO0KNXXXXXXXXKK0KKKKKKKKKKKKKXKKKKKKKKKXXXXXXNXXXXXXXXNXXX
|
||||
0KKKKKKXXXKXXXXXXXNXKKKKxxxddxdxddlldxxdx0K0kOO0KKKKK000000kkkkkxdxxdodddxddxxxxxdddddoolxkooxxxxxlxkkkO00NNXXKXKKKKKK00KKKKKKKKKKKKKKKKKKKKKXXXXXXXXXXXXXXXNNXX
|
||||
000KKKKXKKKKKKXXXXNX0OOxkxddxxxd::;lxxxxdd0OkO00KK00000000OkxkkkxdxxdoddddddddxxxdddddooldOOkxxxdddxxdkOOOKNNXKXKKKKKKKKKKKKKKKKKKKKKKK0KKKKKXXXXXXXXXXXXXXXXXXX
|
||||
00KKKKKKKKKXXXXXXXXKO0OO0xddxxkd. .:kkxkO00OxO00000000000OOkxkkxxdxddodddddddddddddddooollk0000000OOklOOO00NNWNKKKK00K00K000000KKK00KKK0K00KKKKKKXKKKKKKKXXXXXXX
|
||||
OO00000KKKKKXXXXXX0kkOO0OOdoxxxl. .oxkkkO00kxOO000000000OOOkkkxxxdddooddddddddddddddoooolcdO0000000K0dO000OXNNWWK0KK00000000K000000000000000K000KKKKKKKKKKKKKKKK
|
||||
kkOOO00000KKKXXXKkO0000OOOOkxddOOcldxxxxkOOxxkkOOOOOOOOOOkkkxxxxddoooodooodoooddooooooollcok00000000kxOO00O0NNNWW00000OO00000OOOOOOOOOOOO000K00000KKKK000KK0K0KK
|
||||
54
docs/asciiArts/priestess.light.txt
Normal file
54
docs/asciiArts/priestess.light.txt
Normal file
@@ -0,0 +1,54 @@
|
||||
.':c;:;clodddxxdddxxxxxdooolododl;
|
||||
.,;c:;::lxxxxxxxxxxxxxxxkkxxdddxxxdl.
|
||||
.';:c::',ddxxdolloooddddxxkkkkkxxxxxkxd;.
|
||||
.''clc',:oddddddddddddxxdxddxkkkkkkxxkkkxo;.
|
||||
.,'col'.loooooddddddoodddxdxkddxkkOxkxxkkkkdc,.
|
||||
';cdo,ldloodooolccccl:clodddxxxdxxkOxxxkkkkxxl,'.
|
||||
.;:odllddoxddll:;;:ccll:::lllodxxdxdxkxxkkkxxxxo;'..
|
||||
,;loddlcooxoocllllolooodlcclldodxdoddkxxkOOkxkxxo;,'..
|
||||
.'ocdxdlllldodoloooollodddoddddxdxkoooxOkkOOkxxxkkd;..'.
|
||||
. ;;dlxxdclcddxddolllcllloddddxxxxxxxcoxkkkOkOOOxxxkkxl..',
|
||||
. ccxokddodddodxdollllllloodddxxxxkxxl,ckkOOOOOOOdldxxxxc..;.
|
||||
..doxoddxdxxdlxxxolllooooooddxxxxxxxxo.,lOOO0O00O0kddxxdxxc',.
|
||||
',xxxlxOkxkd;looddooooodooodloxxxxxkxo.;'xOOO0O00Okxkdkkddkxoc..
|
||||
. .cxOxoOOkxkl';loccodddolddol:;ddlocdk:';'lk0O000000Okkdxkkdxxxd'....
|
||||
. . 'ldOxxO0Okxl'.':lc;;::ccll;;;;:;;;;;;'''';k000K0KK00Okkdxxkkxxdc' ..
|
||||
. ...'odOOkO00Oxc,,;cllc:;,,,,,'',;;cloooc;,'';k0KO0KKX000kdxxdxxkxdol;.
|
||||
. . .'ddOOOKO00OkOxO0OO0x;........;xOkxkOkOOklcOXKOOKKXX000kdxxdxxxkdol:'.
|
||||
. . .,ookkO000K0d,;l:,,:,'..''''''',c'';c;'cdoOKX0Ok0KKNXkOOkxdxkkxxxkxoc;. .
|
||||
.'......llkkOKK0KKo,';;;;,'''''''''''',;:;:,,;,oKXK0OkkKKXN0kkkxkxdkxxxxkkxol,.
|
||||
. .''c...,clkOO0KKKKO;,,,,'''''',,,',,,,,,,,,,,,c0KXdxOkk0KXNXOxkxdxxxxdodxxxxdol:'.... .. ..
|
||||
. ..;:...c:lkOkOKXXKKk;,,,,,,,,,;;,,,,,,,,,,,,;cdxOdlxOkO0KKXN0Oxxxdddxkxoollodoolc:;'..... ...........''........
|
||||
.. ,;..'cdckOkk0X0XKx0c,,,,,,,,,,,,,,,,,,,,,;:cckolokO0k0KKKNXOOddxdoodkkdollccc::clc::;,''.....''''... ................
|
||||
.,. ;. ;lddkk0OOKOd0xcoc,,,,,,,,,,,,,,,,,,,;;;;xoldkkOOOOKXXXX0OkdxxdoolxOkxdllccc::cl:;;;;;,,,'''.......... . .. ...
|
||||
.:. ..':ldxkk00K0Kko:c;c;,,,,;,,,,,,;;,,,,;;;;ddoxkkkkO000XNXXKOOxdxdoooooxkxkxol:cc:::;,. . ... ... .. . ..
|
||||
.:. ',';codkkOO00XXXOd:;;;;;,,,;,,,,;;;;;;;;;;loooddxxxO0O0KXXXK0Okxxxolooolddoooolclc:;,;'. .. ......
|
||||
....:;;:lodOKkO0OKXXKxoc;;;;;;;;;;;;;;;;;;;;:c:cccodxdodOkkKKKXKKOxxkkollloooxllcc:::c::;,'''.. .. ... . ......
|
||||
.;:c::cllOk00O00KKXK0dlll:;;;;;;;;;;;;;;;ccc::::::coddolkxkKKKKKKkxxxocccccloclccc:::;;,,.''''.... . . . .. .. ........
|
||||
..:occcl;kkkx0O00KXKKK0ollloo:;;;;;;;;;cdc::::::;;:::::clcxx0KX00K0dddooccc::c:.;:c:::;,''....''. ...... .... .... .... .......
|
||||
..,ooool::OkkdxkOKXX00K0Oolcokkdl:;;;coxxx::::::::;;;;;:;,;ccoOKK0O0xoodlllcc:::, .':;;;;,,'.. .... .... .. . ... .. ........
|
||||
..,oxlc;'dx0kdxd0XKXKkdOOOdcoxxkxxdodxxkkk::ccc::::;;;;;;,,'c,:xOOOkOdlolc:ccc;;;;. .',',..... .... .. . .. .... .......
|
||||
.'.'dl;;':OkOkdkd0NdXXkddO0OOOOkxxxxxxkkOO0:::cccc::::;;;;;,',:';k0kkkkxlc::;;:c,;;,. ...'. . . .... ...... ..........
|
||||
.,..,c..'cOkxxOxxxXKlXNdcdk00O00KOdxxxxkkkkkkd::::cc:::::;;;;,,;;';kOodkkxc::'.;:,,;.... .... ... ...... .. .......
|
||||
.. ,;'.' .ddOdldkxdOKXl0N:lcodOK0OKdoddddxdddood;;;;;::;::::::;;;,:;';kx:loxxoc' ';,,' ..... . ... .... ..... ... ..........
|
||||
. .. .cl;. .:kdddcldddxXkXlKNl;:codKKK0Oddddoolllllo;.'''',,..;:;',;,,,:;';kx:clxxoc',;.'. ....... ..... .......... .... . .... ......
|
||||
... .... .;ol;;cdxl;:o:c',:kKOK0NX;;:loo0XNkO0xolllllloodkdc;,,'.. .,,.. ..,;;,ox:::ldolll:;.. ...... ...... ...............................
|
||||
. . ..'':llllc,,,;o;' .:xxOONNx:;clokKNKxdxOxoodoooddxddxdoo;',,... ... .,;,;olc::lo:;c:;;'............ ...............................
|
||||
... ...':.,'....'l; .;o'oc0KKokxkOXXKxc:;cldOxdddxdololldlldc;,;,;,........ .,,,,;clccc:. ..',;''... ..... .......................... .....
|
||||
. ..,.. .....,;.c,..,l0KXKxKXlkkk:c:;;;:cO0oooccccclclccoc;;;;::;,,,,,,'...,'...;,.,;. ..'','.........................................
|
||||
. . .... ...'',cl;;,,;;od0XXK0xld;:ll:;,cxkxOdolcccccllccclc:::::cc:::;,'...,... .''.,;'.......',;'......................................
|
||||
..............;:'.''.ccldkKKkdoc:colo0OOkkxO0Olccccccccccoc::::::c:;'''.'.;... ... .,...........,,....................................
|
||||
. ..............''..d:;;;odkKX0OkxkO0O0OkkkOOdccccccclccldcc:::;;;;;,,,,.;.. ....,............,,..................................
|
||||
.................:llc:lc;;,:oxkOO00OOK0Okolkklcccclllcloo::::;;;;;:::,';''. .. .,.............'.................................
|
||||
. . . .,...............;,,;:lc;',,,,;:lldldllllccccdkoccclllllldc::::::;;;;::,;'.... .. .,..............'...............................
|
||||
.... . .,:''.............';;';,''..',,,,:cddll:cccccccoddcccccccclo::::;;;;;;l:;:;.... .. ;...............'..............................
|
||||
.... . .';,'''.............;,''......',';,ldxo:;:ccccccoolcccccccccc::;;;;;;llc:;;'.. .......;.............................................
|
||||
...... . .',;;,,,............';''........'',,,ldol,;::cccc:occccccccccl:;;;;;;ldol::,;'.. ....,.............................................
|
||||
................ ... ,,;;;,,;;'..........;'''..........,'',;:;;;::c::::c::::cccccccc;;;;,cdolccc,;,.. ........,.............................. ............
|
||||
................. .... .,;;;;;;;;;:,.......',''...........,'',,;:,;::c;:::;::::::::cccl;,,,cdo:::cl,;,'.. ..................................... . ...........
|
||||
...................... ,;;;;;:;;;:cl;;'....','............,,'',;:,;::c;;;;:;;;;:::::cclc,,:dl;;:;oc,;,'.. ........................................ ........ ...
|
||||
.................. .....;;;::;:;::ll:;;:;...,''............,,,,,;:;;:c:::;::;;;;;:::::ccl;,cc;;;;;l;,,,'.. ................................................ ..
|
||||
.................. ..'';,;::;;;:ddxl;;;;::.','............',;,,,;:;;:c::::::::;;;:::::ccl:'',;;;:::;;:,'''. ...................................................
|
||||
....................'.''.;::;;,:KWKd,,;,'..';'...........'',;,,;;:;::c:::::::::::::::cccll,.......'',l'''.. .................................................
|
||||
''.................,,''.'':c;;;lKNKc;,,,'..,;''.........''',,,;;;:::cc::::::::::::::cccclo:'.........:'...'. ................................................
|
||||
,,'''............,'....'''',;::''ol:;;;;,'';;,,'''''''''',,,;;;;::cccc:ccc:ccc::ccccccclloc,........,;''..'. .....''.....''''''''''''.......................
|
||||
@@ -6,4 +6,4 @@ dir:
|
||||
order: 2
|
||||
---
|
||||
|
||||
<Catalog base='/en-us/develop/' />
|
||||
<Redirect to="development" />
|
||||
|
||||
@@ -15,15 +15,15 @@ You can quickly navigate to the section you want to see by searching for CI file
|
||||
|
||||
Workflow files are all stored under `.github/workflows`, and each file can be categorized into the following functional parts:
|
||||
|
||||
+ [Code Testing](#code-testing)
|
||||
+ [Code Building](#code-building)
|
||||
+ [Version Release](#version-release)
|
||||
+ [Resource Updates](#resource-updates)
|
||||
+ [Website Building](#website-building)
|
||||
+ [Issues Management](#issues-management)
|
||||
+ [Pull Requests Management](#pull-requests-management)
|
||||
+ [MirrorChyan Related](#mirrorchyan-related)
|
||||
+ [Others](#others)
|
||||
- [Code Testing](#code-testing)
|
||||
- [Code Building](#code-building)
|
||||
- [Version Release](#version-release)
|
||||
- [Resource Updates](#resource-updates)
|
||||
- [Website Building](#website-building)
|
||||
- [Issues Management](#issues-management)
|
||||
- [Pull Requests Management](#pull-requests-management)
|
||||
- [MirrorChyan Related](#mirrorchyan-related)
|
||||
- [Others](#others)
|
||||
|
||||
Additionally, we use [pre-commit.ci](https://pre-commit.ci/) to implement automatic code formatting and image resource optimization, which runs automatically after creating PRs and generally requires no special attention.
|
||||
|
||||
@@ -51,10 +51,10 @@ This workflow runs automatically on any new commit and PR. When triggered by a r
|
||||
|
||||
Version release is the necessary operation to publish updates to users, consisting of the following workflows:
|
||||
|
||||
+ `release-nightly-ota.yml` Release nightly builds
|
||||
+ `release-ota.yml` Release stable/beta versions
|
||||
+ `gen-changelog.yml` Generate changelog for stable/beta versions
|
||||
+ `pr-auto-tag.yml` Generate tags for stable/beta versions
|
||||
- `release-nightly-ota.yml` Release nightly builds
|
||||
- `release-ota.yml` Release stable/beta versions
|
||||
- `gen-changelog.yml` Generate changelog for stable/beta versions
|
||||
- `pr-auto-tag.yml` Generate tags for stable/beta versions
|
||||
|
||||
::: tip
|
||||
The "ota" in the above file names stands for Over-the-Air, which is what we commonly call "incremental update packages". Therefore, MAA's release process actually includes building OTA packages for past versions.
|
||||
@@ -82,9 +82,9 @@ The release process for these two channels is relatively more complex. We'll exp
|
||||
|
||||
This section of workflows is mainly responsible for MAA's resource updates and optimization, with the following specific workflows:
|
||||
|
||||
+ `res-update-game.yml` Executes periodically to pull game resources from specified repositories
|
||||
+ `sync-resource.yml` Syncs resources to the MaaResource repository for resource updates
|
||||
+ `optimize-templates.yml` Optimizes template image sizes
|
||||
- `res-update-game.yml` Executes periodically to pull game resources from specified repositories
|
||||
- `sync-resource.yml` Syncs resources to the MaaResource repository for resource updates
|
||||
- `optimize-templates.yml` Optimizes template image sizes
|
||||
|
||||
### Website Building
|
||||
|
||||
@@ -119,8 +119,8 @@ This workflow checks whether commit messages in PRs conform to [Conventional Com
|
||||
|
||||
MirrorChyan is a paid update mirror service, with the following related workflows:
|
||||
|
||||
+ `mirrorchyan.yml` Sync update packages to MirrorChyan
|
||||
+ `mirrorchyan_release_note.yml` Generate MirrorChyan Release Notes
|
||||
- `mirrorchyan.yml` Sync update packages to MirrorChyan
|
||||
- `mirrorchyan_release_note.yml` Generate MirrorChyan Release Notes
|
||||
|
||||
### Others
|
||||
|
||||
|
||||
@@ -21,42 +21,40 @@ Welcome to the [Web-based PR Tutorial](./pr-tutorial.md) that anyone can underst
|
||||
2. Visit the [MAA main repository](https://github.com/MaaAssistantArknights/MaaAssistantArknights), click `Fork`, then `Create fork`.
|
||||
3. Clone the dev branch of your repository with submodules:
|
||||
|
||||
```bash
|
||||
git clone --recurse-submodules <your repository link> -b dev
|
||||
```
|
||||
```bash
|
||||
git clone --recurse-submodules <your repository link> -b dev
|
||||
```
|
||||
|
||||
::: warning
|
||||
If using Git GUI clients like Visual Studio without `--recurse-submodules` support, run `git submodule update --init` after cloning to initialize submodules.
|
||||
:::
|
||||
::: warning
|
||||
If using Git GUI clients like Visual Studio without `--recurse-submodules` support, run `git submodule update --init` after cloning to initialize submodules.
|
||||
:::
|
||||
|
||||
4. Download prebuilt third-party libraries
|
||||
**Python environment required - search for Python installation tutorials if needed**
|
||||
_(tools/maadeps-download.py is located in the project root)_
|
||||
|
||||
```cmd
|
||||
python tools/maadeps-download.py
|
||||
```
|
||||
```cmd
|
||||
python tools/maadeps-download.py
|
||||
```
|
||||
|
||||
5. Configure development environment
|
||||
|
||||
- Download and install `Visual Studio 2022 Community`, selecting `Desktop development with C++` and `.NET Desktop Development` during installation.
|
||||
- Download and install `Visual Studio 2022 Community`, selecting `Desktop development with C++` and `.NET Desktop Development` during installation.
|
||||
|
||||
6. Double-click `MAA.sln` to open the project in Visual Studio.
|
||||
7. Configure Visual Studio settings
|
||||
|
||||
- Select `RelWithDebInfo` and `x64` in the top configuration bar (Skip for Release builds or ARM platforms)
|
||||
- Right-click `MaaWpfGui` → Properties → Debug → Enable native debugging (This enables breakpoints in C++ Core)
|
||||
- Select `RelWithDebInfo` and `x64` in the top configuration bar (Skip for Release builds or ARM platforms)
|
||||
- Right-click `MaaWpfGui` → Properties → Debug → Enable native debugging (This enables breakpoints in C++ Core)
|
||||
|
||||
8. Now you're ready to happily ~~mess around~~ start developing!
|
||||
9. Commit regularly with meaningful messages during development
|
||||
If you're not familiar with git usage, you might want to create a new branch for changes instead of committing directly to `dev`:
|
||||
|
||||
```bash
|
||||
git branch your_own_branch
|
||||
git checkout your_own_branch
|
||||
```
|
||||
```bash
|
||||
git branch your_own_branch
|
||||
git checkout your_own_branch
|
||||
```
|
||||
|
||||
This keeps your changes isolated from upstream `dev` updates.
|
||||
This keeps your changes isolated from upstream `dev` updates.
|
||||
|
||||
10. After development, push your local branch (e.g. `dev`) to your remote repository:
|
||||
|
||||
@@ -66,30 +64,29 @@ Welcome to the [Web-based PR Tutorial](./pr-tutorial.md) that anyone can underst
|
||||
|
||||
11. Submit a Pull Request at the [MAA main repository](https://github.com/MaaAssistantArknights/MaaAssistantArknights). Ensure your changes are based on the `dev` branch, not `master`.
|
||||
12. To sync upstream changes:
|
||||
|
||||
1. Add upstream repository:
|
||||
|
||||
```bash
|
||||
git remote add upstream https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
|
||||
```
|
||||
```bash
|
||||
git remote add upstream https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
|
||||
```
|
||||
|
||||
2. Fetch updates:
|
||||
|
||||
```bash
|
||||
git fetch upstream
|
||||
```
|
||||
```bash
|
||||
git fetch upstream
|
||||
```
|
||||
|
||||
3. Rebase (recommended) or merge:
|
||||
|
||||
```bash
|
||||
git rebase upstream/dev # rebase
|
||||
```
|
||||
```bash
|
||||
git rebase upstream/dev # rebase
|
||||
```
|
||||
|
||||
or
|
||||
or
|
||||
|
||||
```bash
|
||||
git merge # merge
|
||||
```
|
||||
```bash
|
||||
git merge # merge
|
||||
```
|
||||
|
||||
4. Repeat steps 7, 8, 9, 10.
|
||||
|
||||
@@ -105,11 +102,11 @@ Please ensure that it has been formatted before submission, or [enable Pre-commi
|
||||
|
||||
The currently enabled formatting tools are as follows:
|
||||
|
||||
| File Type | Format Tool |
|
||||
| --- | --- |
|
||||
| C++ | [clang-format](https://clang.llvm.org/docs/ClangFormat.html) |
|
||||
| Json/Yaml | [Prettier](https://prettier.io/) |
|
||||
| Markdown | [markdownlint](https://github.com/DavidAnson/markdownlint-cli2) |
|
||||
| File Type | Format Tool |
|
||||
| --------- | --------------------------------------------------------------- |
|
||||
| C++ | [clang-format](https://clang.llvm.org/docs/ClangFormat.html) |
|
||||
| Json/Yaml | [Prettier](https://prettier.io/) |
|
||||
| Markdown | [markdownlint](https://github.com/DavidAnson/markdownlint-cli2) |
|
||||
|
||||
### Use Pre-commit Hooks to Automatically Format Code
|
||||
|
||||
@@ -117,10 +114,10 @@ The currently enabled formatting tools are as follows:
|
||||
|
||||
2. Execute the following command in the root directory of the project:
|
||||
|
||||
```bash
|
||||
pip install pre-commit
|
||||
pre-commit install
|
||||
```
|
||||
```bash
|
||||
pip install pre-commit
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
If pre-commit still cannot be used after pip install, please check if the pip installation path has been added to the PATH.
|
||||
|
||||
@@ -130,9 +127,9 @@ The formatting tool will automatically run every time you submit to ensure that
|
||||
|
||||
1. Install clang-format version 20.1.0 or higher.
|
||||
|
||||
```bash
|
||||
python -m pip install clang-format
|
||||
```
|
||||
```bash
|
||||
python -m pip install clang-format
|
||||
```
|
||||
|
||||
2. Use tools like 'Everything' to locate the installation location of clang-format.exe. As a reference, if you are using Anaconda, clang-format.exe will be installed in YourAnacondaPath/Scripts/clang-format.exe.
|
||||
3. In Visual Studio, search for 'clang-format' in Tools-Options.
|
||||
@@ -150,6 +147,4 @@ You can also format with `tools\ClangFormatter\clang-formatter.py` directly, by
|
||||
|
||||
Create GitHub codespace with pre-configured C++ dev environments:
|
||||
|
||||
[](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights)
|
||||
|
||||
Then follow the instructions in vscode or [Linux tutorial](./linux-tutorial.md) to configure GCC 12 and the CMake project.
|
||||
[](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2F1%2Fdevcontainer.json)
|
||||
|
||||
@@ -16,8 +16,8 @@ Your pull request will be marked as `ambiguous` when you are not committing with
|
||||
### Auto Notification
|
||||
|
||||
- Adds labels to issues and pull requests, e.g., `module`, `Client`, `ambiguous`, `translation required`, etc.
|
||||
Issue Bot will add categories based on keywords.
|
||||
Please refer to the [configuration file](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/issue-checker.yml) for the keywords.
|
||||
Issue Bot will add categories based on keywords.
|
||||
Please refer to the [configuration file](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/issue-checker.yml) for the keywords.
|
||||
- Adds the `MAA Team` label to issues and pull requests for MAA public team members.
|
||||
|
||||
#### Issues and Their Comments
|
||||
|
||||
@@ -18,63 +18,60 @@ Mac can use the `tools/build_macos_universal.zsh` script for compilation. It's r
|
||||
## Compilation Process
|
||||
|
||||
1. Download compilation dependencies
|
||||
- Ubuntu/Debian
|
||||
|
||||
- Ubuntu/Debian
|
||||
```bash
|
||||
sudo apt install cmake
|
||||
```
|
||||
|
||||
```bash
|
||||
sudo apt install cmake
|
||||
```
|
||||
- Arch Linux
|
||||
|
||||
- Arch Linux
|
||||
|
||||
```bash
|
||||
sudo pacman -S --needed cmake
|
||||
```
|
||||
```bash
|
||||
sudo pacman -S --needed cmake
|
||||
```
|
||||
|
||||
2. Build third-party libraries
|
||||
|
||||
You can choose to download pre-built dependency libraries or compile from scratch
|
||||
You can choose to download pre-built dependency libraries or compile from scratch
|
||||
- Download pre-built third-party libraries (recommended)
|
||||
|
||||
- Download pre-built third-party libraries (recommended)
|
||||
> **Note**
|
||||
> ~~Contains dynamic libraries compiled on relatively new Linux distributions (Ubuntu 22.04). If your system's libstdc++ version is older, you may encounter ABI incompatibility issues.~~
|
||||
> After introducing cross compiling to lower the runtime requirement, only glibc 2.31 (aka. ubuntu 20.04) is required now.
|
||||
|
||||
> **Note**
|
||||
> ~~Contains dynamic libraries compiled on relatively new Linux distributions (Ubuntu 22.04). If your system's libstdc++ version is older, you may encounter ABI incompatibility issues.~~
|
||||
> After introducing cross compiling to lower the runtime requirement, only glibc 2.31 (aka. ubuntu 20.04) is required now.
|
||||
```bash
|
||||
python tools/maadeps-download.py
|
||||
```
|
||||
|
||||
```bash
|
||||
python tools/maadeps-download.py
|
||||
```
|
||||
If you find the libraries downloaded above cannot run on your system due to ABI version issues and you don't want to use container solutions, you can also try compiling from scratch
|
||||
- Build third-party libraries from scratch (will take considerable time)
|
||||
|
||||
If you find the libraries downloaded above cannot run on your system due to ABI version issues and you don't want to use container solutions, you can also try compiling from scratch
|
||||
|
||||
- Build third-party libraries from scratch (will take considerable time)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/MaaAssistantArknights/MaaDeps
|
||||
cd MaaDeps
|
||||
# If the system is too old to use our prebuilt llvm 20, please consider using local build enviroment instead of cross compiling.
|
||||
# The toolchain config under MaaDeps/cmake needs to be modified.
|
||||
python linux-toolchain-download.py
|
||||
python build.py
|
||||
```
|
||||
```bash
|
||||
git clone https://github.com/MaaAssistantArknights/MaaDeps
|
||||
cd MaaDeps
|
||||
# If the system is too old to use our prebuilt llvm 20, please consider using local build enviroment instead of cross compiling.
|
||||
# The toolchain config under MaaDeps/cmake needs to be modified.
|
||||
python linux-toolchain-download.py
|
||||
python build.py
|
||||
```
|
||||
|
||||
3. Compile MAA
|
||||
|
||||
```bash
|
||||
cmake -B build \
|
||||
-DINSTALL_RESOURCE=ON \
|
||||
-DINSTALL_PYTHON=ON \
|
||||
-DCMAKE_TOOLCHAIN_FILE=MaaDeps/cmake/maa-x64-linux-toolchain.cmake
|
||||
cmake --build build
|
||||
```
|
||||
```bash
|
||||
cmake -B build \
|
||||
-DINSTALL_RESOURCE=ON \
|
||||
-DINSTALL_PYTHON=ON \
|
||||
-DCMAKE_TOOLCHAIN_FILE=MaaDeps/cmake/maa-x64-linux-toolchain.cmake
|
||||
cmake --build build
|
||||
```
|
||||
|
||||
To install MAA to target location, note that MAA is recommended to run by specifying `LD_LIBRARY_PATH`, don't use administrator privileges to install MAA into `/usr`
|
||||
To install MAA to target location, note that MAA is recommended to run by specifying `LD_LIBRARY_PATH`, don't use administrator privileges to install MAA into `/usr`
|
||||
|
||||
> Now it shall be able to run without specifying `LD_LIBRARY_PATH`
|
||||
> Now it shall be able to run without specifying `LD_LIBRARY_PATH`
|
||||
|
||||
```bash
|
||||
cmake --install build --prefix <target_directory>
|
||||
```
|
||||
```bash
|
||||
cmake --install build --prefix <target_directory>
|
||||
```
|
||||
|
||||
## Integration Documentation
|
||||
|
||||
|
||||
@@ -72,21 +72,21 @@ Conflicts are somewhat troublesome to resolve. This section only explains the co
|
||||
|
||||
1. First, enter MAA's main repository and click the Fork button in the upper right corner to fork a copy of the code
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/fork-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/fork-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/fork-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/fork-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
2. Then directly click "Create Fork"
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-2-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-2-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-2-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-2-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
3. You'll arrive at your personal repository. You can see the title is "YourName/MaaAssistantArknights" with small text below saying "forked from MaaAssistantArknights/MaaAssistantArknights"
|
||||
|
||||
@@ -98,13 +98,13 @@ Conflicts are somewhat troublesome to resolve. This section only explains the co
|
||||
|
||||
7. After editing, click the button in the upper right corner to open the commit page and write what you changed
|
||||
|
||||
We have a simple commit title [naming format](https://www.conventionalcommits.org/en/v1.0.0/). It's best to follow it, but if you really can't understand it, you can write something simple first.
|
||||
We have a simple commit title [naming format](https://www.conventionalcommits.org/en/v1.0.0/). It's best to follow it, but if you really can't understand it, you can write something simple first.
|
||||
|
||||
8. Have a second file to modify? Discovered an error after finishing? No problem! Just repeat steps 4-7!
|
||||
|
||||
9. After all modifications are complete, make a PR! Click "Code" to return to your **personal repository's** homepage
|
||||
If there's a "Compare & Pull Request" button, that's great - click it directly!
|
||||
If not, don't worry - click the "Contribute" button below, then "Open Pull Request" - it's the same thing.
|
||||
If there's a "Compare & Pull Request" button, that's great - click it directly!
|
||||
If not, don't worry - click the "Contribute" button below, then "Open Pull Request" - it's the same thing.
|
||||
|
||||
10. You'll arrive at the main repository's PR page. Please verify that what you want to PR is what you intend to submit.
|
||||
As shown in the image, there's a leftward arrow in the middle, requesting to merge the right side's PersonalName/MAA dev branch into the main repository/MAA dev branch.
|
||||
|
||||
@@ -5,8 +5,8 @@ icon: iconoir:code-brackets
|
||||
|
||||
# Dedicated VSCode Extension Tutorial
|
||||
|
||||
* [Extension Store](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support)
|
||||
* [Repository](https://github.com/neko-para/maa-support-extension)
|
||||
- [Extension Store](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support)
|
||||
- [Repository](https://github.com/neko-para/maa-support-extension)
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -60,10 +60,10 @@ When enabling the `Maa` compatible mode, the extension will be able to recursive
|
||||
|
||||
The extension supports scheduled scanning and diagnosing all tasks.
|
||||
|
||||
* Check if contains task defs with same names.
|
||||
* Check if contains unknown task refs.
|
||||
* Check if contains unknown image refs.
|
||||
* Check if contains duplicated task refs in a single task.
|
||||
- Check if contains task defs with same names.
|
||||
- Check if contains unknown task refs.
|
||||
- Check if contains unknown image refs.
|
||||
- Check if contains duplicated task refs in a single task.
|
||||
|
||||
#### Multiple paths resource support
|
||||
|
||||
@@ -83,11 +83,11 @@ Searching and launching `Maa: open crop tool` inside VSCode command panel can op
|
||||
|
||||
> Use `Ctrl+Shift+P` (`Command+Shift+P` on MacOS) to open command panel
|
||||
|
||||
* After selecting and connecting to the controller, use `Screencap` button to obtain screenshots
|
||||
* Use `Upload` button to manually upload images.
|
||||
* Hold `Ctrl` key and select cropping area
|
||||
* Use wheels to zoom
|
||||
* After finishing cropping, use `Download` button to save the cropping result to the folder of the topest layer of the activated resource
|
||||
- After selecting and connecting to the controller, use `Screencap` button to obtain screenshots
|
||||
- Use `Upload` button to manually upload images.
|
||||
- Hold `Ctrl` key and select cropping area
|
||||
- Use wheels to zoom
|
||||
- After finishing cropping, use `Download` button to save the cropping result to the folder of the topest layer of the activated resource
|
||||
|
||||
### Bottom status bar
|
||||
|
||||
|
||||
@@ -6,4 +6,4 @@ dir:
|
||||
order: 1
|
||||
---
|
||||
|
||||
<Catalog base='/en-us/manual/' />
|
||||
<Redirect to="newbie" />
|
||||
|
||||
@@ -63,7 +63,6 @@ For other emulators, refer to [Zhao Qingqing's blog](https://www.cnblogs.com/zha
|
||||
::: details Alternative methods
|
||||
|
||||
- Method 1: Check emulator ports using ADB commands
|
||||
|
||||
1. Launch **one** emulator and ensure no other Android devices are connected to your computer.
|
||||
2. Open a terminal in the folder containing the ADB executable.
|
||||
3. Run the following command:
|
||||
@@ -86,7 +85,6 @@ For other emulators, refer to [Zhao Qingqing's blog](https://www.cnblogs.com/zha
|
||||
Use `127.0.0.1:<port>` or `emulator-<four digits>` as your connection address.
|
||||
|
||||
- Method 2: Find established ADB connections
|
||||
|
||||
1. Follow Method 1.
|
||||
2. Press `Windows key+S` to open search, type `Resource Monitor` and open it.
|
||||
3. Go to the `Network` tab and find the emulator process name in the `Listening Ports` name column, such as `HD-Player.exe`.
|
||||
@@ -131,7 +129,6 @@ MAA now attempts to read the `bluestacks.conf` storage location from the registr
|
||||
:::
|
||||
|
||||
1. Find the `bluestacks.conf` file in the BlueStacks data directory
|
||||
|
||||
- International version default: `C:\ProgramData\BlueStacks_nxt\bluestacks.conf`
|
||||
- Chinese version default: `C:\ProgramData\BlueStacks_nxt_cn\bluestacks.conf`
|
||||
|
||||
|
||||
@@ -6,4 +6,4 @@ dir:
|
||||
order: 5
|
||||
---
|
||||
|
||||
<Catalog base='/en-us/manual/device/' />
|
||||
<Redirect to="windows" />
|
||||
|
||||
@@ -17,6 +17,7 @@ This method involves ADB command-line usage, has lower stability, and still requ
|
||||
3. Since MAA only supports `16:9` aspect ratios, devices with non-`16:9` or `9:16` screen ratios (including most modern devices) need to have their resolution forcibly changed. If your device's native screen ratio is `16:9` or `9:16`, you can skip the `Change Resolution` section.
|
||||
4. Switch your device's navigation method to something other than `Full Screen Gestures`, such as `Classic Navigation Keys`, to avoid accidental operations.
|
||||
5. Please set the `Notched Screen UI Adaptation` option in the game settings to 0 to avoid task errors.
|
||||
|
||||
:::
|
||||
|
||||
::: tip
|
||||
@@ -36,7 +37,6 @@ Typical `16:9` resolutions include `3840x2160` (4K), `2560x1440` (2K), `1920x108
|
||||
```
|
||||
|
||||
- When executed successfully, it will show connected USB debugging devices.
|
||||
|
||||
- Example of a successful connection:
|
||||
|
||||
```bash
|
||||
@@ -95,6 +95,23 @@ Mobile screen resolution is specified as `short edge × long edge`, not `long ed
|
||||
Strongly recommended to restore the default resolution **before** restarting your device. Otherwise, depending on your device, unpredictable consequences may occur, ~~including layout chaos, touch misalignment, app crashes, inability to unlock, etc~~.
|
||||
:::
|
||||
|
||||
::: danger Warning
|
||||
|
||||
It is known that the `Account Switching` feature may not work properly on some physical devices. MAA primarily works in PC emulator environments, so there are no plans to fix this issue.
|
||||
|
||||
If you encounter this problem, you can modify the screen density (DPI) through any of the following methods (recommended value range: `[100-800]`):
|
||||
|
||||
- Use the command `adb shell wm density <DPI>` to directly modify the DPI
|
||||
- Adjust `Developer Options → Minimum Width` to indirectly modify the DPI by changing the `Minimum Width`
|
||||
|
||||
Note: `DPI` and `Minimum Width` are inversely proportional, with the conversion formula: `Minimum Width = Screen Width(px) / (DPI / 160)`
|
||||
|
||||
**Be aware that this operation carries risks and may cause the device to malfunction. Please ensure you know what you are doing. You are responsible for any device failures.**
|
||||
|
||||
It is strongly recommended to revert these changes **before the next device reboot**. If you forget the default values, regardless of which method was used to modify them, you can always use the command `adb shell wm density reset` to restore them.
|
||||
|
||||
:::
|
||||
|
||||
## Automate Resolution Changes
|
||||
|
||||
1. Create two text files in the MAA directory with the following content:
|
||||
@@ -118,7 +135,6 @@ Strongly recommended to restore the default resolution **before** restarting you
|
||||
```
|
||||
|
||||
2. Rename the first file to `startup.bat` and the second to `finish.bat`.
|
||||
|
||||
- If no confirmation dialog appears when changing the extension and the file icon doesn't change, search for "How to show file extensions in Windows."
|
||||
|
||||
3. In MAA's `Settings` - `Connection Settings`, set `Start Script` to `startup.bat` and `End Script` to `finish.bat`.
|
||||
@@ -149,7 +165,6 @@ Wired connections don't need IP addresses or ports - just the device serial numb
|
||||
```
|
||||
|
||||
2. Find your device's IP address:
|
||||
|
||||
- Go to your phone's `Settings` - `Wi-Fi`, tap the connected network to view the IP address.
|
||||
- The location varies by manufacturer - search for instructions if needed.
|
||||
|
||||
@@ -165,7 +180,6 @@ Wired connections don't need IP addresses or ports - just the device serial numb
|
||||
1. On your phone, go to Developer Options, tap `Wireless Debugging` and enable it. Tap `Pair device with pairing code` and keep the popup open until pairing completes.
|
||||
|
||||
2. Complete the pairing:
|
||||
|
||||
1. In the command prompt, type `adb pair <IP address and port shown in the device popup>` and press Enter.
|
||||
2. Enter the six-digit pairing code from the device popup and press Enter.
|
||||
3. When you see `Successfully paired to <IP:port>`, the device popup will close automatically, and your computer's name will appear in the paired devices list.
|
||||
|
||||
@@ -59,7 +59,6 @@ Place the `MaaDesktopIntegration.so` generated by MAA Wine Bridge in the same di
|
||||
#### 1. Installing MAA Dynamic Library
|
||||
|
||||
1. Download and extract the Linux dynamic library from the [MAA website](https://maa.plus/), or install from a software repository:
|
||||
|
||||
- AUR: [maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights), follow the post-installation instructions
|
||||
- Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)
|
||||
|
||||
@@ -75,7 +74,6 @@ You can refer to the [Linux Compilation Tutorial](../../develop/linux-tutorial.m
|
||||
1. Find the line [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/b4fc3528decd6777441a8aca684c22d35d2b2574/src/Python/sample.py#L62)
|
||||
|
||||
2. ADB Tool Configuration
|
||||
|
||||
- If using `Android Studio`'s `AVD` emulator, it comes with ADB. You can directly specify the ADB path to replace `adb.exe`, typically found in `$HOME/Android/Sdk/platform-tools/`, for example:
|
||||
|
||||
```python
|
||||
@@ -85,7 +83,6 @@ You can refer to the [Linux Compilation Tutorial](../../develop/linux-tutorial.m
|
||||
- For other emulators, first install ADB: `$ sudo apt install adb`, then either specify the path or simply use `adb` if it's in your `PATH` environment variable.
|
||||
|
||||
3. Getting the Emulator's ADB Address
|
||||
|
||||
- Use the ADB tool directly: `$ adb_path devices`, for example:
|
||||
|
||||
```shell
|
||||
|
||||
@@ -28,7 +28,7 @@ const fullySupport = shuffleArray([
|
||||
{
|
||||
name: 'MuMu Emulator',
|
||||
link: 'https://www.mumuglobal.com/',
|
||||
note: 'Fully compatible, with additional support for [Screenshot Enhanced Mode](../connection.html#mumu-screenshot-enhanced-mode). Known to be compatible with Hyper-V.\n\n- The "Exit emulator when done" function may occasionally have issues. If you encounter problems, please report them to MuMu\'s official support.\n- When running multiple instances, you need to check the port information of each instance through the ADB button in MuMu Multi-Instance Manager, then change the port number in MAA `Settings` - `Connection Settings` to match the corresponding port.',
|
||||
note: 'Fully compatible, with additional support for [Screenshot Enhanced Mode](../connection.html#mumu-screenshot-enhanced-mode). Known to be compatible with Hyper-V.\n\n- The "Exit emulator when done" function may occasionally have issues. If you encounter problems, please report them to MuMu\'s official support.\n- When running multiple instances, you need to check the port information of each instance through the ADB button in MuMu Multi-Instance Manager, then change the port number in MAA `Settings` - `Connection Settings` to match the corresponding port.\n- Do NOT set the `Graphics Memory Usage Policy` to `Lower Resource Consumption`.',
|
||||
},
|
||||
{
|
||||
name: 'LDPlayer',
|
||||
|
||||
@@ -22,6 +22,7 @@ Or manually download and install these <u>**two**</u> runtime libraries to solve
|
||||
|
||||
- [Visual C++ Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe)
|
||||
- [.NET Desktop Runtime 8](https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exe)
|
||||
|
||||
:::
|
||||
|
||||
## Software won't run/crashes/shows errors
|
||||
@@ -46,7 +47,7 @@ We cannot provide repair solutions other than reinstalling your system. Please a
|
||||
|
||||
#### Windows N/KN
|
||||
|
||||
For Windows N/KN (European/Korean versions), you also need to install the [Media Feature Pack](https://support.microsoft.com/zh-cn/topic/c1c6fffa-d052-8338-7a79-a4bb980a700a).
|
||||
For Windows N/KN (European/Korean versions), you also need to install the [Media Feature Pack](https://support.microsoft.com/en-us/topic/c1c6fffa-d052-8338-7a79-a4bb980a700a).
|
||||
|
||||
#### Windows 7
|
||||
|
||||
@@ -54,7 +55,7 @@ For Windows N/KN (European/Korean versions), you also need to install the [Media
|
||||
|
||||
For Windows 7, before installing the two runtime libraries mentioned above, check if these patches are installed:
|
||||
|
||||
1. [Windows 7 Service Pack 1](https://support.microsoft.com/zh-cn/windows/b3da2c0f-cdb6-0572-8596-bab972897f61)
|
||||
1. [Windows 7 Service Pack 1](https://support.microsoft.com/en-us/windows/b3da2c0f-cdb6-0572-8596-bab972897f61)
|
||||
2. SHA-2 code signing patches:
|
||||
- KB4474419: [Download link 1](https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2019/09/windows6.1-kb4474419-v3-x64_b5614c6cea5cb4e198717789633dca16308ef79c.msu), [Download link 2](http://download.windowsupdate.com/c/msdownload/update/software/secu/2019/09/windows6.1-kb4474419-v3-x64_b5614c6cea5cb4e198717789633dca16308ef79c.msu)
|
||||
- KB4490628: [Download link 1](https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2019/03/windows6.1-kb4490628-x64_d3de52d6987f7c8bdc2c015dca69eac96047c76e.msu), [Download link 2](http://download.windowsupdate.com/c/msdownload/update/software/secu/2019/03/windows6.1-kb4490628-x64_d3de52d6987f7c8bdc2c015dca69eac96047c76e.msu)
|
||||
@@ -112,6 +113,7 @@ Emulator updates may overwrite the ADB file. If the issue returns after an updat
|
||||
- If auto-combat frequently pauses without deploying operators, disable `Matchstick Mode` in `Settings` - `Operation Settings`.
|
||||
- If auto-squad formation can't recognize operators correctly, remove special focus from those operators.
|
||||
- `Adb Input` touch mode is naturally slow; try switching to other modes for functions like auto-combat.
|
||||
- When using MuMu Emulator, do NOT set the `Graphics Memory Usage Policy` to `Lower Resource Consumption`.
|
||||
|
||||
### "Screenshot takes too long" message
|
||||
|
||||
|
||||
@@ -6,4 +6,4 @@ dir:
|
||||
order: 4
|
||||
---
|
||||
|
||||
<Catalog base='/en-us/manual/introduction/' />
|
||||
<Redirect to="startup" />
|
||||
|
||||
@@ -8,7 +8,6 @@ icon: hugeicons:brain-02
|
||||
## General Settings
|
||||
|
||||
- The `Use Sanity Potion` + `Use Originium` and `Perform Battles`+ `Material` options work as OR conditions - the task will stop when any of these conditions is met.
|
||||
|
||||
- `Use Sanity Potion` specifies how many times to replenish sanity (may use multiple potions at once).
|
||||
- `Use Originium` specifies how many Originium to use (one at a time). Originium won't be used if sanity potions are available.
|
||||
- `Perform Battles` specifies the number of battles to complete (e.g., "stop after 15 runs").
|
||||
@@ -19,19 +18,19 @@ icon: hugeicons:brain-02
|
||||
|
||||
::: details Examples
|
||||
|
||||
| Use Sanity Potion | Use Originium | Perform Battles | Material | Result |
|
||||
| :---------------: | :-----------: | :-------------: | :------: | ------ |
|
||||
| | | | | Uses current sanity and stops. |
|
||||
| 2 | | | | Uses current sanity, then uses sanity potions up to 2 times, then stops. |
|
||||
| _999_ | 2 | | | Uses current sanity, then all sanity potions, then Originium up to 2 times, then stops. |
|
||||
| | | 2 | | Runs the selected stage 2 times, then stops. |
|
||||
| | | | 2 | Farms until 2 of the specified material are obtained, then stops. |
|
||||
| 2 | | 4 | | Runs the selected stage up to 4 times, using up to 2 sanity potions if needed, then stops. |
|
||||
| 2 | | | 4 | Farms until 4 of the specified material are obtained, using up to 2 sanity potions if needed, then stops. |
|
||||
| 2 | | 4 | 8 | Runs the selected stage up to 4 times, using up to 2 sanity potions if needed. Stops early if 8 of the specified material are obtained before reaching 4 runs. |
|
||||
| _999_ | 4 | 8 | 16 | Runs the selected stage up to 8 times, using all sanity potions and up to 4 Originium if needed. Stops early if 16 of the specified material are obtained before reaching 8 runs. |
|
||||
| | 2 | | | Uses current sanity, then stops if any sanity potions are available. If no potions, uses up to 2 Originium. _Not MAA GUI behavior_ |
|
||||
| 2 | 4 | | | Uses current sanity, then up to 2 sanity potions. If potions remain, stops; if no potions remain after using ≤2 potions, uses up to 4 Originium. _Not MAA GUI behavior_ |
|
||||
| Use Sanity Potion | Use Originium | Perform Battles | Material | Result |
|
||||
| :---------------: | :-----------: | :-------------: | :------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| | | | | Uses current sanity and stops. |
|
||||
| 2 | | | | Uses current sanity, then uses sanity potions up to 2 times, then stops. |
|
||||
| _999_ | 2 | | | Uses current sanity, then all sanity potions, then Originium up to 2 times, then stops. |
|
||||
| | | 2 | | Runs the selected stage 2 times, then stops. |
|
||||
| | | | 2 | Farms until 2 of the specified material are obtained, then stops. |
|
||||
| 2 | | 4 | | Runs the selected stage up to 4 times, using up to 2 sanity potions if needed, then stops. |
|
||||
| 2 | | | 4 | Farms until 4 of the specified material are obtained, using up to 2 sanity potions if needed, then stops. |
|
||||
| 2 | | 4 | 8 | Runs the selected stage up to 4 times, using up to 2 sanity potions if needed. Stops early if 8 of the specified material are obtained before reaching 4 runs. |
|
||||
| _999_ | 4 | 8 | 16 | Runs the selected stage up to 8 times, using all sanity potions and up to 4 Originium if needed. Stops early if 16 of the specified material are obtained before reaching 8 runs. |
|
||||
| | 2 | | | Uses current sanity, then stops if any sanity potions are available. If no potions, uses up to 2 Originium. _Not MAA GUI behavior_ |
|
||||
| 2 | 4 | | | Uses current sanity, then up to 2 sanity potions. If potions remain, stops; if no potions remain after using ≤2 potions, uses up to 4 Originium. _Not MAA GUI behavior_ |
|
||||
|
||||
:::
|
||||
|
||||
@@ -46,7 +45,6 @@ icon: hugeicons:brain-02
|
||||
- Skill summary, voucher, and carbon stages (level 5 only). Enter exact codes like `CA-5`, `AP-5`, or `SK-5`.
|
||||
- All chip stages. Enter complete stage codes like `PR-A-1`.
|
||||
- For Annihilation mode, use these specific values:
|
||||
|
||||
- Current annihilation: Annihilation
|
||||
- Chernobog: Chernobog@Annihilation
|
||||
- Lungmen Outskirts: LungmenOutskirts@Annihilation
|
||||
|
||||
@@ -8,7 +8,11 @@ icon: ph:sword-bold
|
||||
Welcome to use and share operation files on [prts.plus](https://prts.plus).
|
||||
|
||||
::: warning
|
||||
All features involving automatic combat require a stable game frame rate of at least 60 FPS, including but not limited to Auto Combat and Integrated Strategy.
|
||||
All features involving Copilot require the following prerequisites, including but not limited to Copilot and Auto I. S.
|
||||
|
||||
- At least 60 frames of **stable** framerate
|
||||
- Touch mode set to Minitouch or MaaTouch
|
||||
|
||||
:::
|
||||
|
||||
## Using Operations
|
||||
|
||||
@@ -8,7 +8,11 @@ icon: ri:game-fill
|
||||
MAA selects the latest theme by default, which can be changed in `Auto Integrated Strategy` - `Integrated Strategy Theme`.
|
||||
|
||||
::: warning
|
||||
All features involving automatic combat require a stable game frame rate of at least 60 FPS, including but not limited to Auto Combat and Integrated Strategy.
|
||||
All features involving Copilot require the following prerequisites, including but not limited to Copilot and Auto I. S.
|
||||
|
||||
- At least 60 frames of **stable** framerate
|
||||
- Touch mode set to Minitouch or MaaTouch
|
||||
|
||||
:::
|
||||
|
||||
- Please pin the corresponding Integrated Strategy theme at the terminal in-game. Although automatic navigation is currently possible, long-term functionality is not guaranteed.
|
||||
@@ -52,10 +56,10 @@ For details, see the [Integrated Strategy Protocol](../../protocol/integrated-st
|
||||
- Automatically recognizes operators and their levels, selecting optimal operators and skills.
|
||||
- Recognizes shop items and prioritizes purchasing more powerful collectibles.
|
||||
|
||||
## Exception Handling
|
||||
## Exception Detection
|
||||
|
||||
- Automatically reconnects and continues tasks after disconnections or the 4 AM server reset.
|
||||
- For battles exceeding 5 minutes, automatically retreats all ground units; after 6 minutes, abandons the battle to avoid time-consuming deadlocks.
|
||||
- If a task encounters problems, automatically abandons the current exploration and retries.
|
||||
- If a task encounters problems, it will automatically abandon the current exploration and retry.
|
||||
- If battle duration exceeds 5 minutes, all ground units will automatically retreat; if it exceeds 6 minutes, the current battle will be automatically abandoned to avoid time-consuming stalemates.
|
||||
- To automatically reconnect and continue tasks after intermittent disconnections or updates, please also enable the Start Wake-Up Task and set the corresponding time for forced scheduled start.
|
||||
|
||||
If the program repeatedly gets stuck at the same point, please submit an Issue with logs
|
||||
If the program gets stuck at the same location multiple times, please submit an Issue with logs and screenshots.
|
||||
|
||||
@@ -11,31 +11,31 @@ Quick start guide!
|
||||
|
||||
1. Confirm system version
|
||||
|
||||
MAA on Windows only supports Windows 10 and 11. For older Windows versions, please refer to the system issues section in [FAQ](./faq.md#system-issues).
|
||||
MAA on Windows only supports Windows 10 and 11. For older Windows versions, please refer to the system issues section in [FAQ](./faq.md#system-issues).
|
||||
|
||||
Non-Windows users, please refer to [Emulator and Device Support](./device/).
|
||||
Non-Windows users, please refer to [Emulator and Device Support](./device/).
|
||||
|
||||
2. Download the correct version
|
||||
|
||||
The [MAA official website](https://maa.plus/) will automatically select the correct architecture for most users reading this article, which should be Windows x64.
|
||||
The [MAA official website](https://maa.plus/) will automatically select the correct architecture for most users reading this article, which should be Windows x64.
|
||||
|
||||
3. Extract correctly
|
||||
|
||||
Ensure the extraction is complete, and make sure to extract MAA to a separate folder. Do not extract MAA to paths requiring UAC permissions such as `C:\` or `C:\Program Files\`.
|
||||
Ensure the extraction is complete, and make sure to extract MAA to a separate folder. Do not extract MAA to paths requiring UAC permissions such as `C:\` or `C:\Program Files\`.
|
||||
|
||||
4. Install runtime libraries
|
||||
|
||||
MAA requires VCRedist x64 and .NET 8. Please run `DependencySetup_依赖库安装.bat` in the MAA directory to install them.
|
||||
MAA requires VCRedist x64 and .NET 8. Please run `DependencySetup_依赖库安装.bat` in the MAA directory to install them.
|
||||
|
||||
For more information, please refer to the pinned section in [FAQ](./faq.md).
|
||||
For more information, please refer to the pinned section in [FAQ](./faq.md).
|
||||
|
||||
5. Confirm emulator support
|
||||
|
||||
Check [Emulator and Device Support](./device/) to verify the compatibility of your emulator.
|
||||
Check [Emulator and Device Support](./device/) to verify the compatibility of your emulator.
|
||||
|
||||
6. Set the correct emulator resolution
|
||||
|
||||
Emulator resolution should be landscape `1280x720` or `1920x1080`; for YostarEN players, it must be `1920x1080`.
|
||||
Emulator resolution should be landscape `1280x720` or `1920x1080`; for YostarEN players, it must be `1920x1080`.
|
||||
|
||||
## Initial Configuration
|
||||
|
||||
|
||||
@@ -6,4 +6,4 @@ dir:
|
||||
order: 3
|
||||
---
|
||||
|
||||
<Catalog base='/en-us/protocol/' />
|
||||
<Redirect to="integration" />
|
||||
|
||||
@@ -202,7 +202,7 @@ Todo
|
||||
|
||||
#### Common `subtask` Field Values
|
||||
|
||||
- `ProcessTask`
|
||||
- `ProcessTask`
|
||||
|
||||
```json
|
||||
// Corresponding details field example
|
||||
|
||||
@@ -61,8 +61,8 @@ Please note that JSON files do not support comments. The comments in this docume
|
||||
// Combat operations. Ordered, executes the next one only after completing the previous one. Required
|
||||
{
|
||||
"type": "部署", // Operation type, optional, default is "Deploy" ("部署" = "Deploy")
|
||||
// "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Output" | "SkillDaemon" | "MoveCamera"
|
||||
// "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" | "打印" | "摆完挂机" | "移动镜头"
|
||||
// "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Output" | "SkillDaemon" | "MoveCamera" | "ResetStopwatch"
|
||||
// "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" | "打印" | "摆完挂机" | "移动镜头" | "重置全局计时器"
|
||||
// Both English and Chinese are supported (e.g., "部署" for "Deploy")
|
||||
// For "Deploy", waits until enough DP is available (unless timeout)
|
||||
// For "Skill", waits until skill is ready (unless timeout)
|
||||
@@ -74,7 +74,8 @@ Please note that JSON files do not support comments. The comments in this docume
|
||||
// "Output" doesn't show this step in UI, used only to output doc content (for subtitles, etc.)
|
||||
// "SkillDaemon" only uses "use when ready" skills, does nothing else until battle ends
|
||||
// "MoveCamera" for Guide mode, requires the distance field
|
||||
// Currently the four conditions below use AND relationship
|
||||
// "ResetStopwatch" — Resets the global stopwatch. Please refer to the “time_elapsed” condition.
|
||||
// Currently the five conditions below use AND relationship
|
||||
"kills": 0, // Kill count condition, waits until reached. Optional, default is 0, executes immediately
|
||||
"costs": 50, // DP condition, waits until reached. Optional, default is 0, executes immediately
|
||||
// DP can be affected by potential, may not be entirely accurate, suitable for battles with loose timing requirements.
|
||||
@@ -85,6 +86,9 @@ Please note that JSON files do not support comments. The comments in this docume
|
||||
// Supports negative values (e.g., when operators like Jaye reduce DP)
|
||||
// Recognition is more accurate for two-digit DP; three-digit DP may be misrecognized, not recommended
|
||||
"cooling": 2, // Number of operators on cooldown condition, waits until reached. Optional, default is -1, no recognition
|
||||
"time_elapsed": 1000, // Global timing condition in milliseconds. If the specified time has not elapsed, the action will keep waiting. Optional, default is 0, executes immediately
|
||||
// Note: the time is measured from the last action with type: ResetStopwatch
|
||||
// You must execute an action with type: ResetStopwatch beforehand to reset the stopwatch; otherwise, it will get stuck.
|
||||
// TODO: Other conditions
|
||||
// TODO: "condition_type": 0, // Relationship between execution conditions, optional, default is 0
|
||||
// // 0 - AND; 1 - OR
|
||||
@@ -101,6 +105,7 @@ Please note that JSON files do not support comments. The comments in this docume
|
||||
// "Left" | "Right" | "Up" | "Down" | "None"
|
||||
// "左" | "右" | "上" | "下" | "无"
|
||||
// Both English and Chinese are supported (e.g., "左" for "Left")
|
||||
"skip_if_not_ready": false, // Only effective when type is "Skill". Allows skipping the current action if the skill is not ready, mainly used to disable unfinished ammo skills. Optional, defaults to false.
|
||||
"skill_usage": 1, // Change skill usage method. Required when type is "SkillUsage"
|
||||
// Example: Initially need Myrtle to help attack without using skill, later need auto skill activation
|
||||
// Can set to 1 at the appropriate time
|
||||
|
||||
@@ -51,12 +51,12 @@ The tools in `tools/RoguelikeRecruitmentTool` and `tools/RoguelikeOperSearch` ca
|
||||
"team_complete_condition": [ // Conditions for squad completness
|
||||
...
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Operator classification
|
||||
|
||||
Split operators in different ***groups*** according to your understanding of the game (Group concept references [Copilot Schema](./copilot-schema.md))
|
||||
Split operators in different **_groups_** according to your understanding of the game (Group concept references [Copilot Schema](./copilot-schema.md))
|
||||
|
||||
::: info
|
||||
|
||||
@@ -67,6 +67,7 @@ Split operators in different ***groups*** according to your understanding of the
|
||||
3. Please do not change the name of an existing group, as this may cause previous versions of the task to be unavailable when MAA is updated!
|
||||
|
||||
4. Please try not to add new groups, instead try to implement new operators added to the task into existing groups according to their usage
|
||||
|
||||
:::
|
||||
|
||||
::: tip
|
||||
@@ -75,7 +76,7 @@ By default, only E1 Level 55 operators will be recruited
|
||||
|
||||
```json
|
||||
{
|
||||
"theme": "Phantom",
|
||||
"theme": "Phantom",
|
||||
"priority": [ // Groups, in order
|
||||
{
|
||||
"name": "棘刺", // Group name ("棘刺" = "Thorns")
|
||||
@@ -91,7 +92,7 @@ By default, only E1 Level 55 operators will be recruited
|
||||
}
|
||||
]
|
||||
},
|
||||
"team_complete_condition": [
|
||||
"team_complete_condition": [
|
||||
...
|
||||
]
|
||||
]
|
||||
@@ -100,60 +101,60 @@ By default, only E1 Level 55 operators will be recruited
|
||||
|
||||
1. Introduction to existing groups
|
||||
|
||||
Taking Sami's I.S. as an example: operators are mainly divided into:
|
||||
Taking Sami's I.S. as an example: operators are mainly divided into:
|
||||
|
||||
| Group | Considerations | Class | Operators |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| ***地面阻挡*** (Ground Blocking) | Field presence and clearing enemies | Defenders, Guards | Healing defenders, cornerstones, Blacknight, Mountain, M3, Ling and Scene's summons, Spot, Defender reserve operators |
|
||||
| ***地面单切/处决者*** (Ground Single-Target/Executors) | Solo elite enemies | Executor specialists | SilverAsh, Yato the Elegy, Kirara R Yato, M3, Red |
|
||||
| ***高台C*** (Ranged Core) | Sustained and decisive output | Snipers, Casters | Weathered, Logos, Ch'en the Holungday, Chongyue |
|
||||
| ***高台输出*** (Ranged DPS) | Anti-air and sustained output | Snipers, Casters | Archetto, Exusiai, Kroos, Steward |
|
||||
| ***速狙*** (Fast Snipers) | Physical damage, standard range | Snipers | Eyjafjalla, Exusiai, Yeye, Kroos |
|
||||
| ***术师*** (Casters) | Arts damage, standard range | Single-target Casters | Eyjafjalla, Logos, Steward |
|
||||
| ***辅助*** (Supporters) | Can hit 1 tile behind | Supporters | Suzuran, Lily of the Valley, Yeye, Orchid |
|
||||
| ***狙击*** (Long-range Snipers) | Longer range high ground | Artilleryman, Spreadshooter | Weathered, Toddifons, Rosa |
|
||||
| ***奶*** (Healers) | Healing ability | Medics, Supporters | Kal'tsit, Skadi the Corrupting Heart, Hibiscus, Ansel |
|
||||
| ***单奶*** (Single-target Healers) | Attack range depth >= 4 | Medics | Kal'tsit, Reed the Flame Shadow, Ptilopsis, Perfumer, Hibiscus, Ansel |
|
||||
| ***群奶*** (AoE Healers) | Attack range depth < 4, can heal behind | Medics, Supporters | Nightingale, Ptilopsis, Skadi the Corrupting Heart |
|
||||
| ***回费*** (DP Recovery) | Cost recovery | Vanguards | Myrtle, Ines, Fang, Vanilla |
|
||||
| ***地刺*** (Ground Traps) | No blocking, provides DPS or slowing in front of defenders | Ambushers | Gladiia, Ascalon, Manticore |
|
||||
| ***地面远程*** (Ground Ranged) | Ground long-range, can output behind shields | Instructors, Lords | Horn, Pallas, Thorns, SilverAsh |
|
||||
| ***领主*** (Lords) | Ground attack range depth > 4, can target air | Fortress, Lord | Thorns, SilverAsh, Chouyu |
|
||||
| ***盾法*** (Shield Casters) | Short attack range, some tanking ability | Arts Fighter Casters | Lin, Carnelian |
|
||||
| ***炮灰*** (Fodder) | Absorb attacks, redeploy | Specialists, summons | M3, Red, Myrtle, reserve operators |
|
||||
| ***大龙*** (Big Dragon) | Tank in front of blockers, easy to combine | Summons | Ling's dragons, Jessica the Flame Purifier's shield |
|
||||
| ***补给站*** (Supply Stations) | Accelerate main DPS operator skill rotation | Summons | Support Supply Station, Artificer operator summons |
|
||||
| ***无人机*** (Drones) | Ignore height restrictions for healing summons | Summons | Skadi's Seaborn, Silence's Medical Drone |
|
||||
| ***支援陷阱*** (Support Traps) | Deployable ground explosives | Summons | Support Mist Generator, Support Rumble-Rumble |
|
||||
| ***障碍物*** (Obstacles) | Don't take deployment slots, attract aggro or block | Summons | Cage, obstacles |
|
||||
| ***其他地面*** (Other Ground) | Ground operators not preferred for priority use | Push/pull, block-1 vanguards, swordmasters | Bagpipe, Croissant |
|
||||
| ***高台预备/其他高台*** (High Ground Reserve/Other High Ground) | High ground operators not preferred for priority use | AoE casters, chain casters, tacticians | Orchid, reserve operators |
|
||||
| Group | Considerations | Class | Operators |
|
||||
| :-------------------------------------------------------------- | :--------------------------------------------------------- | :----------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- |
|
||||
| **_地面阻挡_** (Ground Blocking) | Field presence and clearing enemies | Defenders, Guards | Healing defenders, cornerstones, Blacknight, Mountain, M3, Ling and Scene's summons, Spot, Defender reserve operators |
|
||||
| **_地面单切/处决者_** (Ground Single-Target/Executors) | Solo elite enemies | Executor specialists | SilverAsh, Yato the Elegy, Kirara R Yato, M3, Red |
|
||||
| **_高台C_** (Ranged Core) | Sustained and decisive output | Snipers, Casters | Weathered, Logos, Ch'en the Holungday, Chongyue |
|
||||
| **_高台输出_** (Ranged DPS) | Anti-air and sustained output | Snipers, Casters | Archetto, Exusiai, Kroos, Steward |
|
||||
| **_速狙_** (Fast Snipers) | Physical damage, standard range | Snipers | Eyjafjalla, Exusiai, Yeye, Kroos |
|
||||
| **_术师_** (Casters) | Arts damage, standard range | Single-target Casters | Eyjafjalla, Logos, Steward |
|
||||
| **_辅助_** (Supporters) | Can hit 1 tile behind | Supporters | Suzuran, Lily of the Valley, Yeye, Orchid |
|
||||
| **_狙击_** (Long-range Snipers) | Longer range high ground | Artilleryman, Spreadshooter | Weathered, Toddifons, Rosa |
|
||||
| **_奶_** (Healers) | Healing ability | Medics, Supporters | Kal'tsit, Skadi the Corrupting Heart, Hibiscus, Ansel |
|
||||
| **_单奶_** (Single-target Healers) | Attack range depth >= 4 | Medics | Kal'tsit, Reed the Flame Shadow, Ptilopsis, Perfumer, Hibiscus, Ansel |
|
||||
| **_群奶_** (AoE Healers) | Attack range depth < 4, can heal behind | Medics, Supporters | Nightingale, Ptilopsis, Skadi the Corrupting Heart |
|
||||
| **_回费_** (DP Recovery) | Cost recovery | Vanguards | Myrtle, Ines, Fang, Vanilla |
|
||||
| **_地刺_** (Ground Traps) | No blocking, provides DPS or slowing in front of defenders | Ambushers | Gladiia, Ascalon, Manticore |
|
||||
| **_地面远程_** (Ground Ranged) | Ground long-range, can output behind shields | Instructors, Lords | Horn, Pallas, Thorns, SilverAsh |
|
||||
| **_领主_** (Lords) | Ground attack range depth > 4, can target air | Fortress, Lord | Thorns, SilverAsh, Chouyu |
|
||||
| **_盾法_** (Shield Casters) | Short attack range, some tanking ability | Arts Fighter Casters | Lin, Carnelian |
|
||||
| **_炮灰_** (Fodder) | Absorb attacks, redeploy | Specialists, summons | M3, Red, Myrtle, reserve operators |
|
||||
| **_大龙_** (Big Dragon) | Tank in front of blockers, easy to combine | Summons | Ling's dragons, Jessica the Flame Purifier's shield |
|
||||
| **_补给站_** (Supply Stations) | Accelerate main DPS operator skill rotation | Summons | Support Supply Station, Artificer operator summons |
|
||||
| **_无人机_** (Drones) | Ignore height restrictions for healing summons | Summons | Skadi's Seaborn, Silence's Medical Drone |
|
||||
| **_支援陷阱_** (Support Traps) | Deployable ground explosives | Summons | Support Mist Generator, Support Rumble-Rumble |
|
||||
| **_障碍物_** (Obstacles) | Don't take deployment slots, attract aggro or block | Summons | Cage, obstacles |
|
||||
| **_其他地面_** (Other Ground) | Ground operators not preferred for priority use | Push/pull, block-1 vanguards, swordmasters | Bagpipe, Croissant |
|
||||
| **_高台预备/其他高台_** (High Ground Reserve/Other High Ground) | High ground operators not preferred for priority use | AoE casters, chain casters, tacticians | Orchid, reserve operators |
|
||||
|
||||
::: tip
|
||||
"Ground Blocking" mainly considers an operator's overall defensive capabilities (sometimes killing everything is also a form of defense), including "Ground Ranged" and "Lord" groups.
|
||||
::: tip
|
||||
"Ground Blocking" mainly considers an operator's overall defensive capabilities (sometimes killing everything is also a form of defense), including "Ground Ranged" and "Lord" groups.
|
||||
|
||||
"Healers" mainly considers overall healing ability, including single-target and AoE healers. Consider attack range coverage when deciding whether to use single-target healers (healing 4 tiles) or AoE healers (healing behind).
|
||||
"Healers" mainly considers overall healing ability, including single-target and AoE healers. Consider attack range coverage when deciding whether to use single-target healers (healing 4 tiles) or AoE healers (healing behind).
|
||||
|
||||
"Ranged DPS" only considers output ability, mainly a mixed ordering of sniper and caster professions. Consider damage type, attack range and other restrictions when using specific groups like fast snipers, casters, supporters, or shield casters.
|
||||
"Ranged DPS" only considers output ability, mainly a mixed ordering of sniper and caster professions. Consider damage type, attack range and other restrictions when using specific groups like fast snipers, casters, supporters, or shield casters.
|
||||
|
||||
For trap-type summons, because there are many of them, don't put them in the support trap group. It works better to let MAA deploy them automatically.
|
||||
:::
|
||||
For trap-type summons, because there are many of them, don't put them in the support trap group. It works better to let MAA deploy them automatically.
|
||||
:::
|
||||
|
||||
2. Groups requiring special handling
|
||||
|
||||
In addition to those general groups, sometimes we need more custom tweaks for some operators or types such as
|
||||
In addition to those general groups, sometimes we need more custom tweaks for some operators or types such as
|
||||
|
||||
| Group | Operators | Features |
|
||||
| :--- | :--- | :--- |
|
||||
| 益达 (Weathered) | 维什戴尔 (Weathered) | High ground DPS, prioritizing deployment can reduce pressure |
|
||||
| 棘刺 (Thorns) | 棘刺 (Thorns), 号角 (Horn) | Ground ranged output, Phantom I.S. has some maps with very suitable positions |
|
||||
| 召唤类 (Summoners) | 凯尔希 (Kal'tsit), 令 (Ling), 稀音 (Scene) | Self-contained ground blocking, some maps need priority deployment, summons can be used as blockers or fodder |
|
||||
| 情报官 (Agents) | 晓歌 (Cantabile), 伊内丝 (Ines) | Can recover DP, provide side output, and can single cut |
|
||||
| 浊心斯卡蒂 (Skadi Alter) | 浊心斯卡蒂 (Skadi the Corrupting Heart) | Decent healing under low pressure, but special range, some maps have suitable positions |
|
||||
| 焰苇 (Reed Alter) | 焰影苇草 (Reed the Flame Shadow) | Commonly used opening operator in Sami I.S., combines healing and output, some maps have optimal positions |
|
||||
| 玛恩纳 (SilverAsh) | 玛恩纳 (Closure), 银灰 (SilverAsh) | Ground large-area decisive output, can be deployed against bosses |
|
||||
| 史尔特尔 (Surtr) | 史尔特尔 (Surtr) | Since Surtr always carries S3 at E2, field presence ability is almost zero, deployment priority is extremely low |
|
||||
| 骰子 (Dice) | 骰子 (Dice) | In Mizuki I.S. the dice needs to be operated separately |
|
||||
| Group | Operators | Features |
|
||||
| :----------------------- | :----------------------------------------- | :--------------------------------------------------------------------------------------------------------------- |
|
||||
| 益达 (Weathered) | 维什戴尔 (Weathered) | High ground DPS, prioritizing deployment can reduce pressure |
|
||||
| 棘刺 (Thorns) | 棘刺 (Thorns), 号角 (Horn) | Ground ranged output, Phantom I.S. has some maps with very suitable positions |
|
||||
| 召唤类 (Summoners) | 凯尔希 (Kal'tsit), 令 (Ling), 稀音 (Scene) | Self-contained ground blocking, some maps need priority deployment, summons can be used as blockers or fodder |
|
||||
| 情报官 (Agents) | 晓歌 (Cantabile), 伊内丝 (Ines) | Can recover DP, provide side output, and can single cut |
|
||||
| 浊心斯卡蒂 (Skadi Alter) | 浊心斯卡蒂 (Skadi the Corrupting Heart) | Decent healing under low pressure, but special range, some maps have suitable positions |
|
||||
| 焰苇 (Reed Alter) | 焰影苇草 (Reed the Flame Shadow) | Commonly used opening operator in Sami I.S., combines healing and output, some maps have optimal positions |
|
||||
| 玛恩纳 (SilverAsh) | 玛恩纳 (Closure), 银灰 (SilverAsh) | Ground large-area decisive output, can be deployed against bosses |
|
||||
| 史尔特尔 (Surtr) | 史尔特尔 (Surtr) | Since Surtr always carries S3 at E2, field presence ability is almost zero, deployment priority is extremely low |
|
||||
| 骰子 (Dice) | 骰子 (Dice) | In Mizuki I.S. the dice needs to be operated separately |
|
||||
|
||||
::: info
|
||||
Currently fixed to group unidentified ground crews behind the penultimate formation (other ground), and unidentified high-platform crews behind the penultimate formation (other high-platform)
|
||||
@@ -206,11 +207,11 @@ For beginner accounts: If 10 recruitments don't satisfy half the team's key oper
|
||||
"groups": [
|
||||
"奶" // ("奶" = "Healers") (This indicates a need for 1 healer)
|
||||
],
|
||||
"threshold": 1
|
||||
"threshold": 1
|
||||
}
|
||||
...
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
::: caution
|
||||
@@ -246,7 +247,7 @@ For example: Operator `焰影苇草` (Reed the Flame Shadow) may appear in both
|
||||
"skill_usage": 2, // Skill usage mode, refer to Combat Operation Protocol, difference is default is 1 if empty
|
||||
// (0 is don't use automatically, 1 is use when ready, 2 is use x times (x is set by "skill_times" field), 3 is not supported for now)
|
||||
"skill_times": 2, // Skill usage times, default is 1, effective when "skill_usage" field is 2
|
||||
"alternate_skill": 2, // Alternative skills used when there is no designated skill, usually 6-star operators who have not
|
||||
"alternate_skill": 2, // Alternative skills used when there is no designated skill, usually 6-star operators who have not
|
||||
// E2'd and use 3 skills after promotion
|
||||
// (in this case, use skill 2 when skill 3 is not available)
|
||||
"alternate_skill_usage": 1, // Skill use mode for alternative skills (this field has not yet been implemented)
|
||||
@@ -262,7 +263,7 @@ For example: Operator `焰影苇草` (Reed the Flame Shadow) may appear in both
|
||||
// If the lineup completeness test is not passed, only key and 0 hope are recruited, saving hope.
|
||||
"is_start": true, // If true, the operator is a starter. Default to false if empty. If there is no start player in the team,
|
||||
// only start players and 0 hope players will be recruited, and user-filled players will be recruited.
|
||||
"auto_retreat": 0, // Auto-retreat after a few full-seconds of deployment, takes effect when greater than 0, mainly used for specialists and vanguards,
|
||||
"auto_retreat": 0, // Auto-retreat after a few full-seconds of deployment, takes effect when greater than 0, mainly used for specialists and vanguards,
|
||||
// since I.S. usually starts at 2x speed, it is recommended to set it to skill duration divided by 2
|
||||
"recruit_priority_when_team_full": 850, // No need to set separately, recruitment priority when lineup completeness is met, default is recruitment priority -100
|
||||
"promote_priority_when_team_full": 850, // No need to set separately, promotion priority when lineup completeness is met, default is E2 priority +300
|
||||
@@ -299,7 +300,7 @@ For example: Operator `焰影苇草` (Reed the Flame Shadow) may appear in both
|
||||
|
||||
5. Add groups and operators as you see fit
|
||||
|
||||
When you add a new group, you can copy operators from existing groups. Refer to the ratings already given by the devs, and modify them on that basis.
|
||||
When you add a new group, you can copy operators from existing groups. Refer to the ratings already given by the devs, and modify them on that basis.
|
||||
|
||||
## Integrated Strategy Step 2: Battle Logic
|
||||
|
||||
@@ -310,93 +311,91 @@ For example: Operator `焰影苇草` (Reed the Flame Shadow) may appear in both
|
||||
(Effective when the combat logic file for the level name does not exist)
|
||||
|
||||
1. Perform basic combat operations based on the tile grid of the map
|
||||
- MAA performs basic combat operations based on whether the grid on the map is a blue or red box, whether it's a high platform or ground, and whether it can be deployed or not.
|
||||
|
||||
- MAA performs basic combat operations based on whether the grid on the map is a blue or red box, whether it's a high platform or ground, and whether it can be deployed or not.
|
||||
- MAA decides which job to use based on the name or number of the map only, and does not judge the map's **Standard**, **Emergency**, **Road Network**, **Foldartal Use**, etc.
|
||||
|
||||
- MAA decides which job to use based on the name or number of the map only, and does not judge the map's **Standard**, **Emergency**, **Road Network**, **Foldartal Use**, etc.
|
||||
|
||||
- MAA does not judge **in combat the situation of undefined squares on the map**, e.g. the position of the altar in the `Taming Hut`, the `follower effect` of monsters coming out of the left side or the right side.
|
||||
- MAA does not judge **in combat the situation of undefined squares on the map**, e.g. the position of the altar in the `Taming Hut`, the `follower effect` of monsters coming out of the left side or the right side.
|
||||
|
||||
So in the future, you need to try to design a set of combat logic that can cope with **all the different scenarios of a map name** (the above-mentioned scenarios), and be careful of being hung up on the issue that this map operates in Emergency Mode.
|
||||
|
||||
2. MAA's Basic Battle Strategy -- Blocking the Blue Entry Point
|
||||
1. Ground Crews are preferably deployed on (or around) the grid of the Blue Box (why the grid, scroll down), orientated towards the Red box (auto-calculated), and are not deployed on the Red box
|
||||
|
||||
1. Ground Crews are preferably deployed on (or around) the grid of the Blue Box (why the grid, scroll down), orientated towards the Red box (auto-calculated), and are not deployed on the Red box
|
||||
2. Prioritise the ground units before healers and ranged operators, in a circle from the blue box to the perimeter
|
||||
|
||||
2. Prioritise the ground units before healers and ranged operators, in a circle from the blue box to the perimeter
|
||||
|
||||
3. It will keep deploying things that can be deployed according to the logic above (operators, summons, support items, etc.)
|
||||
3. It will keep deploying things that can be deployed according to the logic above (operators, summons, support items, etc.)
|
||||
|
||||
### Optimise basic combat strategies
|
||||
|
||||
1. Blue box Alternative
|
||||
|
||||
It's obviously not smart to just pile up your operators in front of the blue box, some levels have tiles where you can't get through, and the defence is very efficient here
|
||||
It's obviously not smart to just pile up your operators in front of the blue box, some levels have tiles where you can't get through, and the defence is very efficient here
|
||||
|
||||
Or if there are levels with multiple blue boxes, and the MAA doesn't know which blue box corresponds to which red box, they may deploy randomly
|
||||
Or if there are levels with multiple blue boxes, and the MAA doesn't know which blue box corresponds to which red box, they may deploy randomly
|
||||
|
||||
At this point, you'll need to open the [map wiki](https://map.ark-nights.com/areas?coord_override=maa) while imagining the battle in your head
|
||||
At this point, you'll need to open the [map wiki](https://map.ark-nights.com/areas?coord_override=maa) while imagining the battle in your head
|
||||
|
||||
First switch the `Coordinate Display` to `MAA` in `Settings`
|
||||
First switch the `Coordinate Display` to `MAA` in `Settings`
|
||||
|
||||
Then, based on your experience, find the coordinates and orientation of the points that need to be prioritised for defence, and write them into the `replacement_home` of the json.
|
||||
Then, based on your experience, find the coordinates and orientation of the points that need to be prioritised for defence, and write them into the `replacement_home` of the json.
|
||||
|
||||
```json
|
||||
{
|
||||
"stage_name": "蓄水池", // Level name ("蓄水池" = "Cistern")
|
||||
"replacement_home": [ // Entry points (blue boxes replacement points),
|
||||
// at least 1 to be complete
|
||||
{
|
||||
"location": [ // Grid coordinates, obtained from the map wiki
|
||||
6,
|
||||
4
|
||||
],
|
||||
"direction_Doc1": "Preferred direction, it doesn't mean it's definitely in that direction (the algorithm makes its own judgement)",
|
||||
"direction_Doc2": "Default is none, i.e. there is no recommended direction, it is entirely up to the algorithm to decide",
|
||||
"direction_Doc3": "none / left / right / up / down / 无 / 上 / 下 / 左 / 右",
|
||||
"direction": "left" // (This indicates priority deployment of operators
|
||||
// to the grid at coordinates 6,4 to the left.)
|
||||
}
|
||||
],
|
||||
...
|
||||
```
|
||||
```json
|
||||
{
|
||||
"stage_name": "蓄水池", // Level name ("蓄水池" = "Cistern")
|
||||
"replacement_home": [ // Entry points (blue boxes replacement points),
|
||||
// at least 1 to be complete
|
||||
{
|
||||
"location": [ // Grid coordinates, obtained from the map wiki
|
||||
6,
|
||||
4
|
||||
],
|
||||
"direction_Doc1": "Preferred direction, it doesn't mean it's definitely in that direction (the algorithm makes its own judgement)",
|
||||
"direction_Doc2": "Default is none, i.e. there is no recommended direction, it is entirely up to the algorithm to decide",
|
||||
"direction_Doc3": "none / left / right / up / down / 无 / 上 / 下 / 左 / 右",
|
||||
"direction": "left" // (This indicates priority deployment of operators
|
||||
// to the grid at coordinates 6,4 to the left.)
|
||||
}
|
||||
],
|
||||
...
|
||||
```
|
||||
|
||||
::: tip
|
||||
The blue box alternative will take effect when all steps in `deploy_plan` are completed but there are still operators to deploy in the waiting area, following the same logic as the general combat strategy
|
||||
:::
|
||||
::: tip
|
||||
The blue box alternative will take effect when all steps in `deploy_plan` are completed but there are still operators to deploy in the waiting area, following the same logic as the general combat strategy
|
||||
:::
|
||||
|
||||
2. Deployment tile blacklist
|
||||
|
||||
There are points of priority for defence and points of priority for not deploying operators, such as where the fireball passes through, under the boss's feet, and some locations that are not good for output.
|
||||
There are points of priority for defence and points of priority for not deploying operators, such as where the fireball passes through, under the boss's feet, and some locations that are not good for output.
|
||||
|
||||
At this point, we introduce `blacklist_location` to blacklist the tiles that we don't want MAA to deploy operators on.
|
||||
::: info
|
||||
The tiles added here will not be used, even if they are included in the deployment strategy later on.
|
||||
:::
|
||||
At this point, we introduce `blacklist_location` to blacklist the tiles that we don't want MAA to deploy operators on.
|
||||
::: info
|
||||
The tiles added here will not be used, even if they are included in the deployment strategy later on.
|
||||
:::
|
||||
|
||||
```json
|
||||
...
|
||||
"blacklist_location_Doc": "This is an example of usage, not that the map 'Cistern' needs ban.",
|
||||
"blacklist_location": [ // Locations where the deployment of the operators is prohibited
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
1,
|
||||
1
|
||||
]
|
||||
],
|
||||
```
|
||||
```json
|
||||
...
|
||||
"blacklist_location_Doc": "This is an example of usage, not that the map 'Cistern' needs ban.",
|
||||
"blacklist_location": [ // Locations where the deployment of the operators is prohibited
|
||||
[
|
||||
0,
|
||||
0
|
||||
],
|
||||
[
|
||||
1,
|
||||
1
|
||||
]
|
||||
],
|
||||
```
|
||||
|
||||
3. Alternative map strategies
|
||||
|
||||
For example, if there is a monster in the blue box in Mizuki I.S. should we use the dice to ease the pressure of stacking monsters?
|
||||
For example, if there is a monster in the blue box in Mizuki I.S. should we use the dice to ease the pressure of stacking monsters?
|
||||
|
||||
```json
|
||||
"not_use_dice_Doc": "When the Blue box operator is retreated does MAA need to use the dice. Defaults to false if empty",
|
||||
"not_use_dice": false,
|
||||
```
|
||||
```json
|
||||
"not_use_dice_Doc": "When the Blue box operator is retreated does MAA need to use the dice. Defaults to false if empty",
|
||||
"not_use_dice": false,
|
||||
```
|
||||
|
||||
### Or is it an Emergency Operation? It's time to show your true white skills - customised combat strategies
|
||||
|
||||
@@ -408,69 +407,68 @@ There is no need to set up too many customised plans when there is a problem. It
|
||||
|
||||
1. Deployment of operators using groups
|
||||
|
||||
```json
|
||||
"deploy_plan": [ // Deployment logic: order from top-to-bottom, left-to-right
|
||||
// Tries to deploy the first operator it finds, or skips it if it doesn't.
|
||||
{
|
||||
"groups": ["百嘉", "基石", "地面C", "号角", "挡人先锋"], // Looks for operators from these groups
|
||||
// ("百嘉" = "Gavial Alter", "基石" = "Cornerstone", "地面C" = "Ground C", "号角" = "Horn", "挡人先锋" = "Blocking Vanguard")
|
||||
"location": [ 6, 4 ], // Deploys the first agent it finds to coordinates 6,4 and faces left.
|
||||
"direction": "left", // If it doesn't find it, proceed to the next deployment operation.
|
||||
},
|
||||
{
|
||||
"groups": [ "召唤" ], // ("召唤" = "Summoner")
|
||||
"location": [ 6, 3 ],
|
||||
"direction": "left"
|
||||
},
|
||||
{
|
||||
"groups": [ "单奶", "群奶" ], // ("单奶" = "Single-target Healer", "群奶" = "AoE Healer")
|
||||
"location": [ 6, 2 ],
|
||||
"direction": "down"
|
||||
}
|
||||
]
|
||||
```
|
||||
```json
|
||||
"deploy_plan": [ // Deployment logic: order from top-to-bottom, left-to-right
|
||||
// Tries to deploy the first operator it finds, or skips it if it doesn't.
|
||||
{
|
||||
"groups": ["百嘉", "基石", "地面C", "号角", "挡人先锋"], // Looks for operators from these groups
|
||||
// ("百嘉" = "Gavial Alter", "基石" = "Cornerstone", "地面C" = "Ground C", "号角" = "Horn", "挡人先锋" = "Blocking Vanguard")
|
||||
"location": [ 6, 4 ], // Deploys the first agent it finds to coordinates 6,4 and faces left.
|
||||
"direction": "left", // If it doesn't find it, proceed to the next deployment operation.
|
||||
},
|
||||
{
|
||||
"groups": [ "召唤" ], // ("召唤" = "Summoner")
|
||||
"location": [ 6, 3 ],
|
||||
"direction": "left"
|
||||
},
|
||||
{
|
||||
"groups": [ "单奶", "群奶" ], // ("单奶" = "Single-target Healer", "群奶" = "AoE Healer")
|
||||
"location": [ 6, 2 ],
|
||||
"direction": "down"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
::: info
|
||||
MAA flattens all deployment commands and then executes the highest-priority deployment operations
|
||||
Example: deploys [ "百嘉" (Gavial), "基石" (Cornerstone), "地面C" (Ground C)] on [6,4], deploys [ "基石" (Cornerstone), "地面C" (Ground C)] on [6,3], then MAA will flatten the deployment commands to [ "百嘉" (Gavial), "基石" (Cornerstone), "地面C" (Ground C), "基石" (Cornerstone), "地面C" (Ground C)]
|
||||
If a "百嘉" (Gavial) operator on [6,4] is retreated during battle, the "基石" (Cornerstone) operator in hand, if available, will be deployed on [6,4], instead of [6,3]
|
||||
::: info
|
||||
MAA flattens all deployment commands and then executes the highest-priority deployment operations
|
||||
Example: deploys [ "百嘉" (Gavial), "基石" (Cornerstone), "地面C" (Ground C)] on [6,4], deploys [ "基石" (Cornerstone), "地面C" (Ground C)] on [6,3], then MAA will flatten the deployment commands to [ "百嘉" (Gavial), "基石" (Cornerstone), "地面C" (Ground C), "基石" (Cornerstone), "地面C" (Ground C)]
|
||||
If a "百嘉" (Gavial) operator on [6,4] is retreated during battle, the "基石" (Cornerstone) operator in hand, if available, will be deployed on [6,4], instead of [6,3]
|
||||
|
||||
This means that from a macro perspective, after each deployment action is completed, it will start checking for executable strategies from the beginning (the current step's position has no already placed operators, and there are operators in the deployment area belonging to this step's operator group)
|
||||
:::
|
||||
This means that from a macro perspective, after each deployment action is completed, it will start checking for executable strategies from the beginning (the current step's position has no already placed operators, and there are operators in the deployment area belonging to this step's operator group)
|
||||
:::
|
||||
|
||||
::: tip
|
||||
Some commonly used operator group usages:
|
||||
::: tip
|
||||
Some commonly used operator group usages:
|
||||
1. In many operations, the main defensive point combination is [ "地面阻挡" (Ground Blocking), "处决者" (Executor), "其他地面" (Other Ground)], which means when the main tanking operator dies, it will try to use an executor to delay the CD; when there's too much survival pressure on this point, consider using [ "重装" (Heavy Defender), "地面阻挡" (Ground Blocking), "处决者" (Executor), "炮灰" (Fodder), "其他地面" (Other Ground)]; for positions behind defenders, prioritize [ "地面远程" (Ground Ranged), "地面阻挡" (Ground Blocking), "处决者" (Executor), "其他地面" (Other Ground)]; to purely attract aggro or sacrifice, use [ "炮灰" (Fodder), "障碍物" (Obstacles), "其他地面" (Other Ground)]
|
||||
|
||||
1. In many operations, the main defensive point combination is [ "地面阻挡" (Ground Blocking), "处决者" (Executor), "其他地面" (Other Ground)], which means when the main tanking operator dies, it will try to use an executor to delay the CD; when there's too much survival pressure on this point, consider using [ "重装" (Heavy Defender), "地面阻挡" (Ground Blocking), "处决者" (Executor), "炮灰" (Fodder), "其他地面" (Other Ground)]; for positions behind defenders, prioritize [ "地面远程" (Ground Ranged), "地面阻挡" (Ground Blocking), "处决者" (Executor), "其他地面" (Other Ground)]; to purely attract aggro or sacrifice, use [ "炮灰" (Fodder), "障碍物" (Obstacles), "其他地面" (Other Ground)]
|
||||
2. High ground position combinations commonly use [ "高台输出" (Ranged DPS), "其他高台" (Other High Ground)], if you want any high ground to be placed you can use [ "高台输出" (Ranged DPS), "狙击" (Sniper), "辅助" (Supporter), "盾法" (Shield Caster), "其他高台" (Other High Ground)]
|
||||
|
||||
2. High ground position combinations commonly use [ "高台输出" (Ranged DPS), "其他高台" (Other High Ground)], if you want any high ground to be placed you can use [ "高台输出" (Ranged DPS), "狙击" (Sniper), "辅助" (Supporter), "盾法" (Shield Caster), "其他高台" (Other High Ground)]
|
||||
|
||||
3. Some ground positions are suitable for both SilverAsh and ground trap operators [ "玛恩纳" (SilverAsh), "地刺" (Ground Traps)]
|
||||
:::
|
||||
3. Some ground positions are suitable for both SilverAsh and ground trap operators [ "玛恩纳" (SilverAsh), "地刺" (Ground Traps)]
|
||||
:::
|
||||
|
||||
2. Deployment of operators at a point in time
|
||||
::: tip
|
||||
Suitable for certain single-cutting operators or usage scenarios that require cannon fodder
|
||||
:::
|
||||
::: tip
|
||||
Suitable for certain single-cutting operators or usage scenarios that require cannon fodder
|
||||
:::
|
||||
|
||||
```json
|
||||
"deploy_plan": [
|
||||
{
|
||||
"groups": [ "异德", "刺客", "挡人先锋", "其他地面" ],
|
||||
// ("异德" = "Strange Virtue", "刺客" = "Assassin", "挡人先锋" = "Blocking Vanguard", "其他地面" = "Other Ground")
|
||||
"location": [ 5, 3 ],
|
||||
"direction": "left",
|
||||
"condition": [ 0, 3 ] // This operation is only performed when the number of kills is 0 - 3
|
||||
},
|
||||
{
|
||||
"groups": [ "异德", "刺客", "挡人先锋", "其他地面" ],
|
||||
"location": [ 5, 3 ],
|
||||
"direction": "left",
|
||||
"condition": [ 6, 10 ]
|
||||
},
|
||||
...
|
||||
]
|
||||
```
|
||||
```json
|
||||
"deploy_plan": [
|
||||
{
|
||||
"groups": [ "异德", "刺客", "挡人先锋", "其他地面" ],
|
||||
// ("异德" = "Strange Virtue", "刺客" = "Assassin", "挡人先锋" = "Blocking Vanguard", "其他地面" = "Other Ground")
|
||||
"location": [ 5, 3 ],
|
||||
"direction": "left",
|
||||
"condition": [ 0, 3 ] // This operation is only performed when the number of kills is 0 - 3
|
||||
},
|
||||
{
|
||||
"groups": [ "异德", "刺客", "挡人先锋", "其他地面" ],
|
||||
"location": [ 5, 3 ],
|
||||
"direction": "left",
|
||||
"condition": [ 6, 10 ]
|
||||
},
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
3. Retrieval of the operators at some point
|
||||
::: tip
|
||||
@@ -479,64 +477,64 @@ There is no need to set up too many customised plans when there is a problem. It
|
||||
Deployment and retreat commands for the same position should have non-overlapping condition numbers, otherwise it will instantly retreat after deploying
|
||||
:::
|
||||
|
||||
```json
|
||||
"retreat_plan": [ // Retrieval targets at specific points in time
|
||||
{
|
||||
"location": [ 4, 1 ],
|
||||
"condition": [ 7, 8 ] // At 7 - 8 kills, remove operator on [4,1], skip if there are none.
|
||||
}
|
||||
]
|
||||
```
|
||||
```json
|
||||
"retreat_plan": [ // Retrieval targets at specific points in time
|
||||
{
|
||||
"location": [ 4, 1 ],
|
||||
"condition": [ 7, 8 ] // At 7 - 8 kills, remove operator on [4,1], skip if there are none.
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
4. Disable a skill at a certain point in time (to do)
|
||||
|
||||
5. Additional fields (not recommended)
|
||||
|
||||
```json
|
||||
"role_order_Doc": "Operator type deployment order, the unspecified parts will be filled in with the order of Guard, Vanguard, Medic, Defender, Sniper, Caster, Supporter, Specialist, Summoner, and so on.",
|
||||
"role_order": [ // Not recommended, please configure the deploy_plan field.
|
||||
"warrior",
|
||||
"pioneer",
|
||||
"medic",
|
||||
"tank",
|
||||
"sniper",
|
||||
"caster",
|
||||
"support",
|
||||
"special",
|
||||
"drone"
|
||||
],
|
||||
"force_air_defense_when_deploy_blocking_num_Doc": "When there are 10000 blocking units on the field, it will start to force deploying a total of 1 pair of empty units (fill in or not will not affect the normal deployment logic), during this period, it does not prohibit the deployment of medical units (no default is false).",
|
||||
"force_air_defense_when_deploy_blocking_num": { // Not recommended, please configure the deploy_plan field.
|
||||
"melee_num": 10000,
|
||||
"air_defense_num": 1,
|
||||
"ban_medic": false
|
||||
},
|
||||
"force_deploy_direction_Doc": "These points force deployment directions for certain occupation",
|
||||
"force_deploy_direction": [ // Not recommended, please configure the deploy_plan field.
|
||||
{
|
||||
"location": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"role_Doc": "Application of mandatory orientation to the occupation entered",
|
||||
"role": [
|
||||
"warrior",
|
||||
"pioneer"
|
||||
],
|
||||
"direction": "up"
|
||||
},
|
||||
{
|
||||
"location": [
|
||||
3,
|
||||
1
|
||||
],
|
||||
"role": [
|
||||
"sniper"
|
||||
],
|
||||
"direction": "left"
|
||||
}
|
||||
],
|
||||
```
|
||||
```json
|
||||
"role_order_Doc": "Operator type deployment order, the unspecified parts will be filled in with the order of Guard, Vanguard, Medic, Defender, Sniper, Caster, Supporter, Specialist, Summoner, and so on.",
|
||||
"role_order": [ // Not recommended, please configure the deploy_plan field.
|
||||
"warrior",
|
||||
"pioneer",
|
||||
"medic",
|
||||
"tank",
|
||||
"sniper",
|
||||
"caster",
|
||||
"support",
|
||||
"special",
|
||||
"drone"
|
||||
],
|
||||
"force_air_defense_when_deploy_blocking_num_Doc": "When there are 10000 blocking units on the field, it will start to force deploying a total of 1 pair of empty units (fill in or not will not affect the normal deployment logic), during this period, it does not prohibit the deployment of medical units (no default is false).",
|
||||
"force_air_defense_when_deploy_blocking_num": { // Not recommended, please configure the deploy_plan field.
|
||||
"melee_num": 10000,
|
||||
"air_defense_num": 1,
|
||||
"ban_medic": false
|
||||
},
|
||||
"force_deploy_direction_Doc": "These points force deployment directions for certain occupation",
|
||||
"force_deploy_direction": [ // Not recommended, please configure the deploy_plan field.
|
||||
{
|
||||
"location": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"role_Doc": "Application of mandatory orientation to the occupation entered",
|
||||
"role": [
|
||||
"warrior",
|
||||
"pioneer"
|
||||
],
|
||||
"direction": "up"
|
||||
},
|
||||
{
|
||||
"location": [
|
||||
3,
|
||||
1
|
||||
],
|
||||
"role": [
|
||||
"sniper"
|
||||
],
|
||||
"direction": "left"
|
||||
}
|
||||
],
|
||||
```
|
||||
|
||||
::: info
|
||||
When MAA cannot find a customized combat strategy for the current level, it will automatically execute the general combat strategy.
|
||||
@@ -634,7 +632,7 @@ The Encounter options can be modified to guide MAA towards special endings
|
||||
// (does not affect the operation, useful for convenient sorting)
|
||||
"no": 167 // Collectible number (can be found in the wiki, does not affect the operation)
|
||||
},
|
||||
|
||||
|
||||
...
|
||||
{
|
||||
"name": "扩散之手", // ("扩散之手" = "Hand of Diffusion")
|
||||
@@ -643,7 +641,7 @@ The Encounter options can be modified to guide MAA towards special endings
|
||||
// you will try to buy the Hand of Diffusion when you encounter it)
|
||||
],
|
||||
"effect": "【扩散术师】、【链术师】和【轰击术师】每对一个单位造成伤害就回复2点技力值", // ("[Diffusion Artist], [Chain Artist], and [Blast Artist] regain 2 SP for each unit they deal damage to.")
|
||||
"no": 136
|
||||
"no": 136
|
||||
},
|
||||
...
|
||||
|
||||
@@ -654,7 +652,7 @@ The Encounter options can be modified to guide MAA towards special endings
|
||||
// you will try to buy a Halberd-Breaker when you encounter it)
|
||||
],
|
||||
"effect": "所有【近卫】干员的防御力-40%,但攻击力+40%,攻击速度+30", // ("All [Guard] Operators members have -40% Defence, but +40% Attack Power and +30% Attack Speed.")
|
||||
"no": 16
|
||||
"no": 16
|
||||
},
|
||||
...
|
||||
|
||||
@@ -761,7 +759,7 @@ Here is an example task configuration for farming hidden Collapsal Paradigms:
|
||||
"squad": "远程战术分队", // ("远程战术分队" = "Ranged Tactics Squad")
|
||||
"roles": "稳扎稳打", // ("稳扎稳打" = "Steady Approach")
|
||||
"core_char": "维什戴尔", // ("维什戴尔" = "Weathered")
|
||||
"expected_collapsal_paradigms": ["目空一些", "睁眼瞎", "图像损坏", "一抹黑"]
|
||||
"expected_collapsal_paradigms": ["目空一些", "睁眼瞎", "图像损坏", "一抹黑"]
|
||||
// ("目空一些" = "Blank Somewhat", "睁眼瞎" = "Blind Eye", "图像损坏" = "Image Distortion", "一抹黑" = "Pitch Black")
|
||||
}
|
||||
```
|
||||
|
||||
@@ -22,22 +22,22 @@ Appends a task.
|
||||
#### Return Value
|
||||
|
||||
- `TaskId`
|
||||
The task ID if the task is successfully appended, for the following configuration;
|
||||
0 if the task is not successfully appended.
|
||||
The task ID if the task is successfully appended, for the following configuration;
|
||||
0 if the task is not successfully appended.
|
||||
|
||||
#### Parameter Description
|
||||
|
||||
- `AsstHandle handle`
|
||||
Instance handle
|
||||
Instance handle
|
||||
- `const char* type`
|
||||
Task type
|
||||
Task type
|
||||
- `const char* params`
|
||||
Task parameters in JSON
|
||||
Task parameters in JSON
|
||||
|
||||
##### List of Task Types
|
||||
|
||||
- `StartUp`
|
||||
Start-up
|
||||
Start-up
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -54,7 +54,7 @@ Appends a task.
|
||||
```
|
||||
|
||||
- `CloseDown`
|
||||
Close Game Client
|
||||
Close Game Client
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -66,7 +66,7 @@ Appends a task.
|
||||
```
|
||||
|
||||
- `Fight`
|
||||
Operation
|
||||
Operation
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -105,7 +105,7 @@ Appends a task.
|
||||
Supports some of the special stages, please refer to [autoLocalization example](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/tools/AutoLocalization/example/en-us.xaml#L260).
|
||||
|
||||
- `Recruit`
|
||||
Recruitment
|
||||
Recruitment
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -149,7 +149,7 @@ Supports some of the special stages, please refer to [autoLocalization example](
|
||||
```
|
||||
|
||||
- `Infrast`
|
||||
Infrastructure shifting
|
||||
Infrastructure shifting
|
||||
|
||||
```json5
|
||||
{
|
||||
@@ -182,8 +182,8 @@ Supports some of the special stages, please refer to [autoLocalization example](
|
||||
```
|
||||
|
||||
- `Mall`
|
||||
Collecting Credits and auto-purchasing.
|
||||
Will buy items in order following `buy_first` list, buy other items from left to right ignoring items in `blacklist`, and buy other items from left to right ignoring the `blacklist` while credit overflows.
|
||||
Collecting Credits and auto-purchasing.
|
||||
Will buy items in order following `buy_first` list, buy other items from left to right ignoring items in `blacklist`, and buy other items from left to right ignoring the `blacklist` while credit overflows.
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -209,7 +209,7 @@ Supports some of the special stages, please refer to [autoLocalization example](
|
||||
```
|
||||
|
||||
- `Award`
|
||||
Collecting various rewards
|
||||
Collecting various rewards
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -225,7 +225,7 @@ Supports some of the special stages, please refer to [autoLocalization example](
|
||||
```
|
||||
|
||||
- `Roguelike`
|
||||
Integrated Strategies
|
||||
Integrated Strategies
|
||||
|
||||
```json5
|
||||
// Task parameters
|
||||
@@ -250,7 +250,7 @@ Supports some of the special stages, please refer to [autoLocalization example](
|
||||
// 7 - Deep Dive rewards farming, same as mode 0 except for specific mode adaptations
|
||||
"squad": string, // Starting squad name, optional, default is "指挥分队" (Command Squad);
|
||||
"roles": string, // Starting role group, optional, default is "取长补短" (Complementary Strength);
|
||||
"core_char": string, // Starting operator name, optional; supports only single operator **in Chinese**, regardless of server;
|
||||
"core_char": string, // Starting operator name, optional; supports only single operator **in Chinese**, regardless of server;
|
||||
// leave empty or set to "" to auto-select based on level
|
||||
"use_support": bool, // Whether the starting operator is a support operator, optional, default is false
|
||||
"use_nonfriend_support": bool, // Whether non-friend support operators are allowed, optional, default is false; only effective when `use_support` is true
|
||||
@@ -309,20 +309,48 @@ Supports some of the special stages, please refer to [autoLocalization example](
|
||||
For specific information about the Collapsal Paradigm farming feature, please refer to [Integrated Strategy Schema](./integrated-strategy-schema.md#sami-integrated-strategy-collapsal-paradigms)
|
||||
|
||||
- `Copilot`
|
||||
Auto combat feature
|
||||
Auto combat feature
|
||||
|
||||
```json5
|
||||
{
|
||||
"enable": bool, // Whether to enable this task, optional, by default true
|
||||
"filename": string, // Filename and path of the task JSON, supporting absolute/relative paths. Editing in run-time is not supported.
|
||||
"formation": bool // Whether to "quick build", optional, by default false. Editing in run-time is not supported.
|
||||
"enable": bool, // Whether to enable this task. Optional, default is true.
|
||||
"filename": string, // Path to a single job JSON file. Required (mutually exclusive with copilot_list). Both relative and absolute paths are supported.
|
||||
"copilot_list": [ // List of jobs. Required (mutually exclusive with filename). When both filename and copilot_list are present, copilot_list will be ignored.
|
||||
{
|
||||
"filename": string, // Path to the job JSON file. Both relative and absolute paths are supported.
|
||||
"stage_name": string, // Stage name. Refer to [PRTS.Map](https://map.ark-nights.com) for details.
|
||||
"is_raid": bool, // Whether to switch to Challenge Mode (Raid).
|
||||
"is_paradox": bool // Whether this is a Paradox Simulation stage.
|
||||
},
|
||||
...
|
||||
],
|
||||
"loop_times": int, // Number of loops. Optional, default is 1. Effective only in single job mode (i.e., when filename is specified).
|
||||
"use_sanity_potion": bool, // Whether to use sanity potions when sanity is insufficient. Optional, default is false.
|
||||
"formation": bool, // Whether to enable auto formation. Optional, default is false.
|
||||
"formation_index": int, // The index of the formation slot to use in auto formation. Optional, default is 0.
|
||||
// An integer between 0–4: 0 means the current formation, 1–4 refer to the 1st–4th formations.
|
||||
"user_additional": [ // Custom additional operators list. Optional, default is []. Effective only when formation is true.
|
||||
{
|
||||
"name": string, // Operator name. Optional, default is "". If left empty, this operator will be ignored.
|
||||
"skill": int // Skill to bring. Optional, default is 1. Must be an integer between 1–3; otherwise, follows the in-game default.
|
||||
},
|
||||
...
|
||||
],
|
||||
"add_trust": bool, // Whether to auto-fill empty slots by ascending trust value during auto formation. Optional, default is false. Effective only when formation is true.
|
||||
"ignore_requirements": bool, // Whether to ignore operator attribute requirements during auto formation. Optional, default is false. Effective only when formation is true.
|
||||
"support_unit_usage": int, // Support operator usage mode. Optional, default is 0. Integer between 0–3. Effective only when formation is true.
|
||||
// 0 - Do not use support operators.
|
||||
// 1 - Use support operator only if exactly one operator is missing; otherwise, do not use support.
|
||||
// 2 - Use support operator if one is missing; otherwise, use the specified support operator.
|
||||
// 3 - Use support operator if one is missing; otherwise, use a random support operator.
|
||||
"support_unit_name": string // Specified support operator name. Optional, default is "". Effective only when support_unit_usage = 2.
|
||||
}
|
||||
```
|
||||
|
||||
For more details about auto-combat JSON, please refer to [Combat Operation Protocol](./copilot-schema.md)
|
||||
|
||||
- `SSSCopilot`
|
||||
Auto combat feature for Stationary Security Service
|
||||
Auto combat feature for Stationary Security Service
|
||||
|
||||
```json5
|
||||
{
|
||||
@@ -335,7 +363,7 @@ For more details about auto-combat JSON, please refer to [Combat Operation Proto
|
||||
For more details about Stationary Security Service JSON, please refer to [SSS Schema](./sss-schema.md)
|
||||
|
||||
- `Depot`
|
||||
Depot recognition
|
||||
Depot recognition
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -345,7 +373,7 @@ For more details about Stationary Security Service JSON, please refer to [SSS Sc
|
||||
```
|
||||
|
||||
- `OperBox`
|
||||
Operator box recognition
|
||||
Operator box recognition
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
@@ -355,7 +383,7 @@ For more details about Stationary Security Service JSON, please refer to [SSS Sc
|
||||
```
|
||||
|
||||
- `Reclamation`
|
||||
Reclamation Algorithm
|
||||
Reclamation Algorithm
|
||||
|
||||
```json5
|
||||
{
|
||||
@@ -370,7 +398,7 @@ For more details about Stationary Security Service JSON, please refer to [SSS Sc
|
||||
"tools_to_craft": [
|
||||
string, // Automatically crafted items, optional, glow stick by default
|
||||
...
|
||||
]
|
||||
]
|
||||
// Suggested to fill in the substring
|
||||
"increment_mode": int, // Click type, optional. 0 by default
|
||||
// 0 - Rapid Click
|
||||
@@ -380,7 +408,7 @@ For more details about Stationary Security Service JSON, please refer to [SSS Sc
|
||||
```
|
||||
|
||||
- `Custom`
|
||||
Custom Task
|
||||
Custom Task
|
||||
|
||||
```json5
|
||||
{
|
||||
@@ -394,7 +422,7 @@ For more details about Stationary Security Service JSON, please refer to [SSS Sc
|
||||
```
|
||||
|
||||
- `SingleStep`
|
||||
Single-step task (currently only supports copilot)
|
||||
Single-step task (currently only supports copilot)
|
||||
|
||||
```json5
|
||||
{
|
||||
@@ -412,7 +440,7 @@ For more details about Stationary Security Service JSON, please refer to [SSS Sc
|
||||
```
|
||||
|
||||
- `VideoRecognition`
|
||||
Video recognition, currently only supports operation (combat) video
|
||||
Video recognition, currently only supports operation (combat) video
|
||||
|
||||
```json5
|
||||
{
|
||||
@@ -436,17 +464,17 @@ Set task parameters
|
||||
#### Return Value
|
||||
|
||||
- `bool`
|
||||
Whether the parameters are successfully set.
|
||||
Whether the parameters are successfully set.
|
||||
|
||||
#### Parameter Description
|
||||
|
||||
- `AsstHandle handle`
|
||||
Instance handle
|
||||
Instance handle
|
||||
- `TaskId task`
|
||||
Task ID, the return value of `AsstAppendTask`
|
||||
Task ID, the return value of `AsstAppendTask`
|
||||
- `const char* params`
|
||||
Task parameter in JSON, same as `AsstAppendTask`
|
||||
For those fields that do not mention "Editing in run-time is not supported" can be changed during run-time. Otherwise these changes will be ignored when the task is running.
|
||||
Task parameter in JSON, same as `AsstAppendTask`
|
||||
For those fields that do not mention "Editing in run-time is not supported" can be changed during run-time. Otherwise these changes will be ignored when the task is running.
|
||||
|
||||
### `AsstSetStaticOption`
|
||||
|
||||
@@ -463,14 +491,14 @@ Set process-level parameters
|
||||
#### Return Value
|
||||
|
||||
- `bool`
|
||||
Is the setup successful
|
||||
Is the setup successful
|
||||
|
||||
#### Parameter Description
|
||||
|
||||
- `AsstStaticOptionKey key`
|
||||
key
|
||||
key
|
||||
- `const char* value`
|
||||
value
|
||||
value
|
||||
|
||||
##### List of Key and value
|
||||
|
||||
@@ -491,16 +519,16 @@ Set instance-level parameters
|
||||
#### Return Value
|
||||
|
||||
- `bool`
|
||||
Is the setup successful
|
||||
Is the setup successful
|
||||
|
||||
#### Parameter Description
|
||||
|
||||
- `AsstHandle handle`
|
||||
handle
|
||||
handle
|
||||
- `AsstInstanceOptionKey key`
|
||||
key
|
||||
key
|
||||
- `const char* value`
|
||||
value
|
||||
value
|
||||
|
||||
##### List of Key and value
|
||||
|
||||
|
||||
@@ -88,6 +88,7 @@ The endpoint should be reentrant and repeatedly return tasks to execute, as MAA
|
||||
- Settings-[SettingsName] task types include Settings-ConnectionAddress, Settings-Stage1
|
||||
- Settings series tasks still execute sequentially rather than immediately, queuing behind previous tasks
|
||||
- Multiple immediate execution tasks also execute in issued order, though since these tasks execute quickly, their order generally doesn't matter
|
||||
|
||||
:::
|
||||
|
||||
## Task Reporting Endpoint
|
||||
|
||||
@@ -99,7 +99,7 @@ Please note that JSON files do not support comments. The comments in this docume
|
||||
"highResolutionSwipeFix": false, // Optional, whether to enable high-resolution swipe fix
|
||||
// Currently only needed for stage navigation which doesn't use unity swipe method
|
||||
// Default is false
|
||||
|
||||
|
||||
/* Fields below only valid when algorithm is MatchTemplate */
|
||||
|
||||
"template": "xxx.png", // Optional, image file to match, can be string or string list
|
||||
@@ -165,7 +165,7 @@ Please note that JSON files do not support comments. The comments in this docume
|
||||
/* Fields below only valid when algorithm is JustReturn and action is Input */
|
||||
|
||||
"inputText": "A string text.", // Required, text to input as string
|
||||
|
||||
|
||||
/* Fields below only valid when algorithm is FeatureMatch */
|
||||
|
||||
"template": "xxx.png", // Optional, image file to match, can be string or string list
|
||||
@@ -189,14 +189,14 @@ Please note that JSON files do not support comments. The comments in this docume
|
||||
|
||||
Task list type fields (`sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes`) support expression calculations.
|
||||
|
||||
| Symbol | Meaning | Example |
|
||||
| :---------: | :---------------------------------------------------------: | :---------------------------------------: |
|
||||
| `@` | `@`-type Task | `Fight@ReturnTo` |
|
||||
| `#` (unary) | Virtual task | `#self` |
|
||||
| `#` (binary)| Virtual task | `StartUpThemes#next` |
|
||||
| `*` | Repeat tasks | `(ClickCornerAfterPRTS+ClickCorner)*5` |
|
||||
| `+` | Task list merge (in next-type attributes, only first occurrence of same-name tasks kept) | `A+B` |
|
||||
| `^` | Task list difference (in first but not second, order preserved) | `(A+A+B+C)^(A+B+D)` (result is `C`) |
|
||||
| Symbol | Meaning | Example |
|
||||
| :----------: | :--------------------------------------------------------------------------------------: | :------------------------------------: |
|
||||
| `@` | `@`-type Task | `Fight@ReturnTo` |
|
||||
| `#` (unary) | Virtual task | `#self` |
|
||||
| `#` (binary) | Virtual task | `StartUpThemes#next` |
|
||||
| `*` | Repeat tasks | `(ClickCornerAfterPRTS+ClickCorner)*5` |
|
||||
| `+` | Task list merge (in next-type attributes, only first occurrence of same-name tasks kept) | `A+B` |
|
||||
| `^` | Task list difference (in first but not second, order preserved) | `(A+A+B+C)^(A+B+D)` (result is `C`) |
|
||||
|
||||
Operators `@`, `#`, `*`, `+`, `^` have precedence: `#` (unary) > `@` = `#` (binary) > `*` > `+` = `^`.
|
||||
|
||||
@@ -204,31 +204,31 @@ Operators `@`, `#`, `*`, `+`, `^` have precedence: `#` (unary) > `@` = `#` (bina
|
||||
|
||||
### Template Task
|
||||
|
||||
**Template tasks** include derived tasks and `@`-type tasks. The core of the template task can be understood as **modifying the default values of fields** based on the *base task*.
|
||||
**Template tasks** include derived tasks and `@`-type tasks. The core of the template task can be understood as **modifying the default values of fields** based on the _base task_.
|
||||
|
||||
#### Derived Task
|
||||
|
||||
Tasks with the `baseTask` field are derived tasks, and the task corresponding to the `baseTask` field is referred to as its *base task* of this derived task. For a derived task,
|
||||
Tasks with the `baseTask` field are derived tasks, and the task corresponding to the `baseTask` field is referred to as its _base task_ of this derived task. For a derived task,
|
||||
|
||||
1. If it is an template matching task, the default value for the `template` field remains `"TaskName.png"`;
|
||||
2. If the `algorithm` field differs from its *base task*, the derived class parameters are not inherited (only parameters defined in `TaskInfo` are inherited);
|
||||
3. The default values for all other fields are the corresponding fields of its *base task*.
|
||||
2. If the `algorithm` field differs from its _base task_, the derived class parameters are not inherited (only parameters defined in `TaskInfo` are inherited);
|
||||
3. The default values for all other fields are the corresponding fields of its _base task_.
|
||||
|
||||
#### Implicit `@`-type Task
|
||||
|
||||
If task `"A"` exists and there is not a task directly defined in any task file such as `"B@A"`, it is an implicit `@`-type task, and task `"A"` is called the *base task* of task `"B@A"`. For an implicit `@`-type task,
|
||||
If task `"A"` exists and there is not a task directly defined in any task file such as `"B@A"`, it is an implicit `@`-type task, and task `"A"` is called the _base task_ of task `"B@A"`. For an implicit `@`-type task,
|
||||
|
||||
1. The default values for task list type fields (`sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes`) are set to the base task's corresponding fields with the `B@` prefix directly appended (if the task name starts with `#`, the `B` prefix is appended);
|
||||
2. The default values for all other fields (including the `template` field) are the corresponding fields of its *base task*.
|
||||
2. The default values for all other fields (including the `template` field) are the corresponding fields of its _base task_.
|
||||
|
||||
#### Explicit `@`-type Task
|
||||
|
||||
If task `"A"` exists and there is a task directly defined in the task file such as `"B@A"`, it is an explicit `@`-type task, and task `"A"` is called the *base task* of task `"B@A"`. For an explicit `@`-type task,
|
||||
If task `"A"` exists and there is a task directly defined in the task file such as `"B@A"`, it is an explicit `@`-type task, and task `"A"` is called the _base task_ of task `"B@A"`. For an explicit `@`-type task,
|
||||
|
||||
1. The default values for task list type fields (`sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes`) are set to the base task's corresponding fields with the `B@` prefix directly appended (if the task name starts with `#`, the `B` prefix is appended);
|
||||
2. If it is an template matching task, the default value for the `template` field remains `"TaskName.png"`;
|
||||
3. If the `algorithm` field differs from its *base task*, the derived class parameters are not inherited (only parameters defined in `TaskInfo` are inherited);
|
||||
4. The default values for all other fields are the corresponding fields of its *base task*.
|
||||
3. If the `algorithm` field differs from its _base task_, the derived class parameters are not inherited (only parameters defined in `TaskInfo` are inherited);
|
||||
4. The default values for all other fields are the corresponding fields of its _base task_.
|
||||
|
||||
### Virtual Task (`#`-type Task)
|
||||
|
||||
@@ -236,18 +236,18 @@ Virtual tasks are tasks of the form `"#{sharp_type}"` or `"B#{sharp_type}"`, whe
|
||||
|
||||
Virtual tasks can be divided into **command virtual tasks** (`#none` / `#self` / `#back`) and **field virtual tasks** (`#next`, etc.).
|
||||
|
||||
| Virtual Task Type | Meaning | Simple example |
|
||||
|:---------:|:---:|:--------:|
|
||||
| none | Empty Task | Skip directly<sup>1</sup><br>`"A": {"next": ["#none", "T1"]}` is interpreted as `"A": {"next": ["T1"]}`<br>`"A#none + T1"` is interpreted as `"T1"` |
|
||||
| self | Current Task Name | `"A": {"next": "#self"}` in `"#self"` is interpreted as `"A"`<br>`"B": {"next": "A@B@C#self"}` in `"A@B@C#self"` is interpreted as `"B"`.<sup>2</sup> |
|
||||
| back | # Preceding task name | `"A@B#back"` is interpreted as `"A@B"`<br>`"#back"` will be skipped if it appears directly<sup>3</sup> |
|
||||
| next, sub, etc. | # The field corresponding to the previous task name | Take `next` for example:<br>`"A#next"` is interpreted as `Task.get("A")->next`<br>`"#next"` will be skipped if it appears directly |
|
||||
| Virtual Task Type | Meaning | Simple example |
|
||||
| :---------------: | :-------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------: |
|
||||
| none | Empty Task | Skip directly<sup>1</sup><br>`"A": {"next": ["#none", "T1"]}` is interpreted as `"A": {"next": ["T1"]}`<br>`"A#none + T1"` is interpreted as `"T1"` |
|
||||
| self | Current Task Name | `"A": {"next": "#self"}` in `"#self"` is interpreted as `"A"`<br>`"B": {"next": "A@B@C#self"}` in `"A@B@C#self"` is interpreted as `"B"`.<sup>2</sup> |
|
||||
| back | # Preceding task name | `"A@B#back"` is interpreted as `"A@B"`<br>`"#back"` will be skipped if it appears directly<sup>3</sup> |
|
||||
| next, sub, etc. | # The field corresponding to the previous task name | Take `next` for example:<br>`"A#next"` is interpreted as `Task.get("A")->next`<br>`"#next"` will be skipped if it appears directly |
|
||||
|
||||
*Note<sup>1</sup>: `"#none"` generally used in conjunction with the template task to add prefixes, or used in the `baseTask` field to avoid unnecessary fields in multi-file inheritance.*
|
||||
_Note<sup>1</sup>: `"#none"` generally used in conjunction with the template task to add prefixes, or used in the `baseTask` field to avoid unnecessary fields in multi-file inheritance._
|
||||
|
||||
*Note<sup>2</sup>: `"XXX#self"` has the same meaning as `"#self"`.*
|
||||
_Note<sup>2</sup>: `"XXX#self"` has the same meaning as `"#self"`._
|
||||
|
||||
*Note<sup>3</sup>: When several tasks have `"next": [ "#back" ]`, `"T1@T2@T3"` represents executing `T3`, `T2`, and `T1` in sequence.*
|
||||
_Note<sup>3</sup>: When several tasks have `"next": [ "#back" ]`, `"T1@T2@T3"` represents executing `T3`, `T2`, and `T1` in sequence._
|
||||
|
||||
### Multi-File Task
|
||||
|
||||
@@ -260,86 +260,86 @@ If a task defined in a later loaded task file (e.g. `tasks.json` for foreign ser
|
||||
|
||||
- Derived task example (field `baseTask`)
|
||||
|
||||
Assume the following two tasks are defined:
|
||||
Assume the following two tasks are defined:
|
||||
|
||||
```json
|
||||
"Return": {
|
||||
"action": "ClickSelf",
|
||||
"next": [ "Stop" ]
|
||||
},
|
||||
"Return2": {
|
||||
"baseTask": "Return"
|
||||
},
|
||||
```
|
||||
```json
|
||||
"Return": {
|
||||
"action": "ClickSelf",
|
||||
"next": [ "Stop" ]
|
||||
},
|
||||
"Return2": {
|
||||
"baseTask": "Return"
|
||||
},
|
||||
```
|
||||
|
||||
The parameters of the `"Return2"` task are directly inherited from the `"Return"` task, and actually include the following parameters:
|
||||
The parameters of the `"Return2"` task are directly inherited from the `"Return"` task, and actually include the following parameters:
|
||||
|
||||
```json
|
||||
"Return2": {
|
||||
"algorithm": "MatchTemplate", // Directly inherited
|
||||
"template": "Return2.png", // "TaskName.png"
|
||||
"action": "ClickSelf", // Directly inherited
|
||||
"next": [ "Stop" ] // Directly inherited, without any prefix compared to the Template Task
|
||||
}
|
||||
```
|
||||
```json
|
||||
"Return2": {
|
||||
"algorithm": "MatchTemplate", // Directly inherited
|
||||
"template": "Return2.png", // "TaskName.png"
|
||||
"action": "ClickSelf", // Directly inherited
|
||||
"next": [ "Stop" ] // Directly inherited, without any prefix compared to the Template Task
|
||||
}
|
||||
```
|
||||
|
||||
- `@`-type task example
|
||||
|
||||
Assume that a task `"A"` with the following parameters is defined:
|
||||
Assume that a task `"A"` with the following parameters is defined:
|
||||
|
||||
```json
|
||||
"A": {
|
||||
"template": "A.png",
|
||||
...,
|
||||
"next": [ "N1", "#back" ]
|
||||
},
|
||||
```
|
||||
```json
|
||||
"A": {
|
||||
"template": "A.png",
|
||||
...,
|
||||
"next": [ "N1", "#back" ]
|
||||
},
|
||||
```
|
||||
|
||||
If the task `"B@A"` is not directly defined, then the task `"B@A"` actually has the following parameters:
|
||||
If the task `"B@A"` is not directly defined, then the task `"B@A"` actually has the following parameters:
|
||||
|
||||
```json
|
||||
"B@A": {
|
||||
"template": "A.png",
|
||||
...,
|
||||
"next": [ "B@N1", "B#back" ]
|
||||
}
|
||||
```
|
||||
```json
|
||||
"B@A": {
|
||||
"template": "A.png",
|
||||
...,
|
||||
"next": [ "B@N1", "B#back" ]
|
||||
}
|
||||
```
|
||||
|
||||
If the task `"B@A"` is defined as `"B@A": {}`, then the task `"B@A"` actually has the following parameters:
|
||||
If the task `"B@A"` is defined as `"B@A": {}`, then the task `"B@A"` actually has the following parameters:
|
||||
|
||||
```json
|
||||
"B@A": {
|
||||
"template": "B@A.png",
|
||||
...,
|
||||
"next": [ "B@N1", "B#back" ]
|
||||
}
|
||||
```
|
||||
```json
|
||||
"B@A": {
|
||||
"template": "B@A.png",
|
||||
...,
|
||||
"next": [ "B@N1", "B#back" ]
|
||||
}
|
||||
```
|
||||
|
||||
- Virtual task example
|
||||
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["N1", "N2"] },
|
||||
"C": { "next": ["B@A#next"] },
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["N1", "N2"] },
|
||||
"C": { "next": ["B@A#next"] },
|
||||
|
||||
"Loading": {
|
||||
"next": ["#self", "#next", "#back"]
|
||||
},
|
||||
"B": {
|
||||
"next": ["Other", "B@Loading"]
|
||||
}
|
||||
}
|
||||
```
|
||||
"Loading": {
|
||||
"next": ["#self", "#next", "#back"]
|
||||
},
|
||||
"B": {
|
||||
"next": ["Other", "B@Loading"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Results in:
|
||||
Results in:
|
||||
|
||||
```cpp
|
||||
Task.get("C")->next = { "B@N1", "B@N2" };
|
||||
```cpp
|
||||
Task.get("C")->next = { "B@N1", "B@N2" };
|
||||
|
||||
Task.get("B@Loading")->next = { "B@Loading", "Other", "B" };
|
||||
Task.get("Loading")->next = { "Loading" };
|
||||
Task.get_raw("B@Loading")->next = { "B#self", "B#next", "B#back" };
|
||||
```
|
||||
Task.get("B@Loading")->next = { "B@Loading", "Other", "B" };
|
||||
Task.get("Loading")->next = { "Loading" };
|
||||
Task.get_raw("B@Loading")->next = { "B#self", "B#next", "B#back" };
|
||||
```
|
||||
|
||||
### Precautions
|
||||
|
||||
@@ -347,41 +347,41 @@ If the tasks defined in the task list type field (`next`, etc.) contain low-prio
|
||||
|
||||
1. Special cases caused by the order of operations between `@` and double `#`
|
||||
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["N0"] },
|
||||
"B": { "next": ["A#next"] },
|
||||
"C@A": { "next": ["N1"] }
|
||||
}
|
||||
```
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["N0"] },
|
||||
"B": { "next": ["A#next"] },
|
||||
"C@A": { "next": ["N1"] }
|
||||
}
|
||||
```
|
||||
|
||||
In the above case, `"C@B" -> next` (i.e., `C@A#next`) is `[ "N1" ]` rather than `[ "C@N0" ]`.
|
||||
In the above case, `"C@B" -> next` (i.e., `C@A#next`) is `[ "N1" ]` rather than `[ "C@N0" ]`.
|
||||
|
||||
2. Special cases caused by the order of operations between `@` and `+`
|
||||
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["#back + N0"] },
|
||||
"B@A": {}
|
||||
}
|
||||
```
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["#back + N0"] },
|
||||
"B@A": {}
|
||||
}
|
||||
```
|
||||
|
||||
In the above case,
|
||||
In the above case,
|
||||
|
||||
```cpp
|
||||
Task.get("A")->next = { "N0" };
|
||||
```cpp
|
||||
Task.get("A")->next = { "N0" };
|
||||
|
||||
Task.get_raw("B@A")->next = { "B#back + N0" };
|
||||
Task.get("B@A")->next = { "B", "N0" }; // Note that it is not [ "B", "B@N0" ]
|
||||
```
|
||||
Task.get_raw("B@A")->next = { "B#back + N0" };
|
||||
Task.get("B@A")->next = { "B", "N0" }; // Note that it is not [ "B", "B@N0" ]
|
||||
```
|
||||
|
||||
In fact, you can use this feature to avoid adding unnecessary prefixes by simply defining
|
||||
In fact, you can use this feature to avoid adding unnecessary prefixes by simply defining
|
||||
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["#none + N0"] }
|
||||
}
|
||||
```
|
||||
```json
|
||||
{
|
||||
"A": { "next": ["#none + N0"] }
|
||||
}
|
||||
```
|
||||
|
||||
## Runtime Task Modification
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ dir:
|
||||

|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
|
||||
# MAA
|
||||
|
||||

|
||||
@@ -25,7 +26,7 @@ An Arknights assistant
|
||||
|
||||
Based on image recognition technology, complete all daily tasks with one click!
|
||||
|
||||
Development actively in progress ✿✿ヽ(°▽°)ノ✿
|
||||
Development actively in progress ✿✿ヽ(°▽°)ノ✿
|
||||
|
||||
:::
|
||||
|
||||
@@ -90,11 +91,9 @@ MAA supports command-line interface (CLI) operation on Linux, macOS, and Windows
|
||||
|
||||
### Main Related Projects
|
||||
|
||||
**The project team is currently in great need of front-end developers. If you have relevant experience, we welcome you to join us!**
|
||||
|
||||
- New Framework: [MaaFramework](https://github.com/MaaXYZ/MaaFramework)
|
||||
- [Copilot Site](https://prts.plus) Frontend: [maa-copilot-frontend](https://github.com/MaaAssistantArknights/maa-copilot-frontend)
|
||||
- [Copilot Site](https://prts.plus) Backend: [MaaBackendCenter](https://github.com/MaaAssistantArknights/MaaBackendCenter)
|
||||
- [Copilot Site](https://prts.plus) Frontend: [zoot-plus-frontend](https://github.com/ZOOT-Plus/zoot-plus-frontend)
|
||||
- [Copilot Site](https://prts.plus) Backend: [ZootPlusBackend](https://github.com/ZOOT-Plus/ZootPlusBackend)
|
||||
- [Official Website](https://maa.plus): [Frontend](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/website)
|
||||
- Deep Learning: [MaaAI](https://github.com/MaaAssistantArknights/MaaAI)
|
||||
|
||||
@@ -194,9 +193,9 @@ User Exchange QQ Groups: [MAA Usage & Arknights Exchange QQ Group](https://api.m
|
||||
Discord Server: [Invite Link](https://discord.gg/23DfZ9uA4V)
|
||||
User Exchange Telegram Group: [Telegram Group](https://t.me/+Mgc2Zngr-hs3ZjU1)
|
||||
Auto-battle JSON strategy sharing: [prts.plus](https://prts.plus)
|
||||
Bilibili Live: [MrEO Live](https://live.bilibili.com/2808861) coding streams & [MAA-Official Live](https://live.bilibili.com/27548877) gaming/chat
|
||||
Bilibili Live: [MrEO Live](https://live.bilibili.com/2808861) coding streams & [MAA-Official Live](https://live.bilibili.com/27548877) gaming/chat
|
||||
|
||||
Technical Group (non-Arknights, no casual chat): [Internal Competition Hell! (QQ Group)](https://jq.qq.com/?_wv=1027&k=ypbzXcA2)
|
||||
Developer Group: [QQ Group](https://jq.qq.com/?_wv=1027&k=JM9oCk3C)
|
||||
Developer Group: [QQ Group](https://jq.qq.com/?_wv=1027&k=JM9oCk3C)
|
||||
|
||||
If you find the software helpful, please give us a Star! ~ (the small star at the top right of the webpage), that's the biggest support
|
||||
|
||||
@@ -6,4 +6,4 @@ dir:
|
||||
order: 2
|
||||
---
|
||||
|
||||
<Catalog base='/ja-jp/develop/' />
|
||||
<Redirect to="development" />
|
||||
|
||||
@@ -17,48 +17,46 @@ icon: iconoir:developer
|
||||
2. [MAA メインリポジトリ](https://github.com/MaaAssistantArknights/MaaAssistantArknights)を開き、`Fork` → `Create fork` をクリック
|
||||
3. 自身のリポジトリの dev ブランチをクローン(サブモジュール含む)
|
||||
|
||||
```bash
|
||||
git clone --recurse-submodules <リポジトリの git リンク> -b dev
|
||||
```
|
||||
```bash
|
||||
git clone --recurse-submodules <リポジトリの git リンク> -b dev
|
||||
```
|
||||
|
||||
::: warning
|
||||
Visual Studio など `--recurse-submodules` パラメータに対応していない Git GUI を使用する場合、クローン後に以下を実行:
|
||||
::: warning
|
||||
Visual Studio など `--recurse-submodules` パラメータに対応していない Git GUI を使用する場合、クローン後に以下を実行:
|
||||
|
||||
```bash
|
||||
git submodule update --init
|
||||
```
|
||||
```bash
|
||||
git submodule update --init
|
||||
```
|
||||
|
||||
:::
|
||||
:::
|
||||
|
||||
4. 事前ビルド済みサードパーティライブラリのダウンロード
|
||||
|
||||
**Python環境が必要(インストール方法は各自検索)**
|
||||
_(tools/maadeps-download.py はプロジェクトルートに配置)_
|
||||
**Python環境が必要(インストール方法は各自検索)**
|
||||
_(tools/maadeps-download.py はプロジェクトルートに配置)_
|
||||
|
||||
```cmd
|
||||
python tools/maadeps-download.py
|
||||
```
|
||||
```cmd
|
||||
python tools/maadeps-download.py
|
||||
```
|
||||
|
||||
5. 開発環境の設定
|
||||
|
||||
- `Visual Studio 2022 Community` をインストール時、`C++ によるデスクトップ開発` と `.NET デスクトップ開発` を選択必須
|
||||
- `Visual Studio 2022 Community` をインストール時、`C++ によるデスクトップ開発` と `.NET デスクトップ開発` を選択必須
|
||||
|
||||
6. `MAA.sln` をダブルクリックで開き、Visual Studio にプロジェクトを自動ロード
|
||||
7. VS の設定
|
||||
|
||||
- 上部設定バーで `RelWithDebInfo` `x64` を選択(Release ビルド/ARM プラットフォームの場合は不要)
|
||||
- `MaaWpfGui` 右クリック → プロパティ → デバッグ → ネイティブデバッグを有効化(C++ Core へのブレークポイント設定可能)
|
||||
- 上部設定バーで `RelWithDebInfo` `x64` を選択(Release ビルド/ARM プラットフォームの場合は不要)
|
||||
- `MaaWpfGui` 右クリック → プロパティ → デバッグ → ネイティブデバッグを有効化(C++ Core へのブレークポイント設定可能)
|
||||
|
||||
8. これで自由に ~~改造~~ 開発を始められます
|
||||
9. 一定量の変更ごにコミット(メッセージ記入必須)
|
||||
Git 未経験者は dev ブランチ直接変更ではなく新規ブランチ作成推奨:
|
||||
|
||||
```bash
|
||||
git branch your_own_branch
|
||||
git checkout your_own_branch
|
||||
```
|
||||
```bash
|
||||
git branch your_own_branch
|
||||
git checkout your_own_branch
|
||||
```
|
||||
|
||||
これで dev の更新影響を受けずに開発可能
|
||||
これで dev の更新影響を受けずに開発可能
|
||||
|
||||
10. 開発完了後、変更をリモートリポジトリへプッシュ:
|
||||
|
||||
@@ -68,30 +66,29 @@ icon: iconoir:developer
|
||||
|
||||
11. [MAA メインリポジトリ](https://github.com/MaaAssistantArknights/MaaAssistantArknights) で Pull Request を提出(master ではなく dev ブランチを指定)
|
||||
12. 上流リポジトリの更新を同期する場合:
|
||||
|
||||
1. 上流リポジトリを追加:
|
||||
|
||||
```bash
|
||||
git remote add upstream https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
|
||||
```
|
||||
```bash
|
||||
git remote add upstream https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
|
||||
```
|
||||
|
||||
2. 更新を取得:
|
||||
|
||||
```bash
|
||||
git fetch upstream
|
||||
```
|
||||
```bash
|
||||
git fetch upstream
|
||||
```
|
||||
|
||||
3. リベース(推奨)またはマージ:
|
||||
|
||||
```bash
|
||||
git rebase upstream/dev
|
||||
```
|
||||
```bash
|
||||
git rebase upstream/dev
|
||||
```
|
||||
|
||||
または
|
||||
または
|
||||
|
||||
```bash
|
||||
git merge
|
||||
```
|
||||
```bash
|
||||
git merge
|
||||
```
|
||||
|
||||
4. ステップ7、8、9、10 を繰り返し
|
||||
|
||||
@@ -103,9 +100,9 @@ Visual Studio 起動後、Git 操作は「Git 変更」画面からコマンド
|
||||
|
||||
1. clang-format バージョン20.1.0以上をインストールします。
|
||||
|
||||
```bash
|
||||
python -m pip install clang-format
|
||||
```
|
||||
```bash
|
||||
python -m pip install clang-format
|
||||
```
|
||||
|
||||
2. 'Everything'などのツールを使用して、clang-format.exeのインストール場所を見つけます。参考までに、Anacondaを使用している場合、clang-format.exeはYourAnacondaPath/Scripts/clang-format.exeにインストールされます。
|
||||
3. Visual Studioで、 Tools-Optionsで 'clang-format'を検索します。
|
||||
@@ -125,6 +122,4 @@ Visual Studio 起動後、Git 操作は「Git 変更」画面からコマンド
|
||||
|
||||
GitHub codespace を作成して C++ 開発環境を自動的に構成する
|
||||
|
||||
[](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights)
|
||||
|
||||
次に、 vscode または [Linuxチュートリアル](./linux-tutorial.md) のプロンプトに従って、 GCC 12 および CMake プロジェクトを構成します。
|
||||
[](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2F1%2Fdevcontainer.json)
|
||||
|
||||
@@ -14,7 +14,6 @@ MAAの構築方法はまだ議論されていますが、このチュートリ
|
||||
## コンパイルプロセス
|
||||
|
||||
1. コンパイルに必要な依存をダウンロードして
|
||||
|
||||
- Ubuntu/Debian
|
||||
|
||||
```bash
|
||||
@@ -24,7 +23,6 @@ MAAの構築方法はまだ議論されていますが、このチュートリ
|
||||
2. サードパーティ製ライブラリのコンパイル
|
||||
|
||||
構築済みの依存ライブラリをダウンロードするか、最初からコンパイルするかを選択できます
|
||||
|
||||
- 事前構築されたサードパーティ製ライブラリのダウンロード(推奨)
|
||||
|
||||
> **Note**
|
||||
@@ -35,7 +33,6 @@ MAAの構築方法はまだ議論されていますが、このチュートリ
|
||||
```
|
||||
|
||||
上記の方法でダウンロードしたライブラリがABIバージョンなどの理由でシステム上で実行できず、コンテナなどのスキームを使用したくないことがわかった場合は、最初からコンパイルしてみることもできます
|
||||
|
||||
- サードパーティ製ライブラリを直接にコンパイルする(時間がかかる)
|
||||
|
||||
```bash
|
||||
|
||||
@@ -43,7 +43,7 @@ icon: ri:earth-fill
|
||||
|
||||
例えば、切り取られた後の出力は次のようになる。
|
||||
|
||||
``` log
|
||||
```log
|
||||
src: Screenshot_xxx.png
|
||||
dst: Screenshot_xxx.png_426,272,177,201.png
|
||||
original roi: 476, 322, 77, 101,
|
||||
@@ -60,8 +60,8 @@ amplified roi: 426, 272, 177, 201
|
||||
|
||||
例
|
||||
|
||||
- ENクライアントのテンプレートイメージフォルダの場所は `MaaAssistantArknights\resource\global\YoStarEN\resource\template`.
|
||||
- 大陸版クライアントのテンプレートイメージフォルダの場所は `MaaAssistantArknights\resource\template`.
|
||||
- ENクライアントのテンプレートイメージフォルダの場所は `MaaAssistantArknights\resource\global\YoStarEN\resource\template`.
|
||||
- 大陸版クライアントのテンプレートイメージフォルダの場所は `MaaAssistantArknights\resource\template`.
|
||||
|
||||
task.json`ファイルに記載されているテンプレート画像を参照し、大陸版クライアントと海外クライアントのテンプレート画像を比較し、海外クライアントに不足しているテンプレートを特定します。
|
||||
|
||||
@@ -75,8 +75,8 @@ task.json`ファイルに記載されているテンプレート画像を参照
|
||||
|
||||
例
|
||||
|
||||
- ENクライアントの `task.json` の場所は `MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json`.
|
||||
- 大陸版クライアントの `task.json` の場所は `MaaAssistantArknights\resource\tasks.json`.
|
||||
- ENクライアントの `task.json` の場所は `MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json`.
|
||||
- 大陸版クライアントの `task.json` の場所は `MaaAssistantArknights\resource\tasks.json`.
|
||||
|
||||
テキストを変更するには、対応するタスクを探し、`text`フィールドを対応するサーバーに表示されている内容に変更します。特定された内容は、ゲーム内の完全な内容の部分文字列である可能性があることに留意してください。一般的には、純粋なASCII文字として認識されない限り、テキストを含む`text`はすべて置き換える必要があります。
|
||||
|
||||
@@ -108,7 +108,7 @@ ROIの範囲を変更するには
|
||||
|
||||
ログを解析することは、プログラムに関する問題を特定するのに役立ちます。以下はログの例
|
||||
|
||||
``` log
|
||||
```log
|
||||
[2022-12-18 17:43:17.535][INF][Px7ec][Tx15c8] {"taskchain":"Award","details":{"to_be_recognized":["Award@ReturnTo","Award","ReceiveAward","DailyTask","WeeklyTask","Award@CloseAnno","Award@CloseAnnoTexas","Award@TodaysSupplies","Award@FromStageSN"],"cur_retry":10,"retry_times":20},"first":["AwardBegin"],"taskid":2,"class":"asst::ProcessTask","subtask":"ProcessTask","pre_task":"AwardBegin"}
|
||||
[2022-12-18 17:43:18.398][INF][Px7ec][Tx15c8] Call ` C:\Program Files\BlueStacks_nxt\. \HD-Adb.exe -s 127.0.0.1:5555 exec-out "screencap | gzip -1" ` ret 0 , cost 862 ms , stdout size: 2074904 , socket size: 0
|
||||
[2022-12-18 17:43:18.541][TRC][Px7ec][Tx15c8] OcrPack::recognize | roi: [ 500, 50, 300, 150 ]
|
||||
@@ -130,6 +130,7 @@ ROIの範囲を変更するには
|
||||
- `"taskid"` はタスク番号です。
|
||||
- `"class"` と `subtask` はそれぞれ、タスクのクラスとサブタスクを表す。
|
||||
- `"pre_task"` は一つ前のタスクを表す。
|
||||
|
||||
さらに、コマンドの実行結果 (例: `Call`) と `OCR` の情報 (例: `OcrPack::recognize`) がログに記録されます。
|
||||
|
||||
例えば、このログの `"to_be_recognized"`,`"cur_retry":3, "retry_times":20` は、タスクの認識を10回試行し、最大回数は20回であることを意味しています。最大回数に達すると、そのタスクはスキップされ、エラーが報告され、次のタスクが実行されます。前のタスクで問題がない場合、ここで認識に問題がある可能性があります。この問題をトラブルシューティングするには、ログに記載されているタスクに対応するテンプレートファイルがあるか、対応するタスクの `text` フィールドが正しくないか、タスク認識のための `roi` 範囲が正しくないかを確認し、必要な修正を加えてください。
|
||||
|
||||
@@ -5,7 +5,7 @@ icon: mingcute:git-pull-request-fill
|
||||
|
||||
# 純WebサイトのPRチュートリアル
|
||||
|
||||
「パラスちゃん」も理解できるGitHubのPull Requestの使用ガイド (*´▽`)ノノ
|
||||
「パラスちゃん」も理解できるGitHubのPull Requestの使用ガイド (\*´▽`)ノノ
|
||||
|
||||
この文書は機械翻訳です。もし可能であれば、中国語の文書を読んでください。もし誤りや修正の提案があれば、大変ありがたく思います。
|
||||
|
||||
@@ -75,79 +75,79 @@ Conflictを解決するのは少し面倒ですが、ここでは概念につい
|
||||
|
||||
1. まず、MAAのメインリポジトリにアクセスして、コードをforkします。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/fork-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/fork-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/fork-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/fork-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
2. 「Copy the master branch only」オプションを外して、Create Forkをクリックします。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-2-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-2-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-2-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-2-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
3. 次に、あなたの個人リポジトリに移動し、「あなたの名前/ MaaAssistantArknights」というタイトルが表示され、下に「MAAメインリポジトリから複製されたMaaAssistantArknights/MaaAssistantArknights」という文言が表示されます。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-3-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-3-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-3-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-3-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
4. 変更するファイルを探します。 "Go to file" をクリックしてグローバル検索を行うか、下のフォルダーから直接検索することもできます(ファイルの場所を知っている場合)。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-4-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-4-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-4-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-4-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
5. ファイルを開いたら、ファイルの右上隅にある✏️をクリックして編集を開始します。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-5-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-5-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-5-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-5-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
6. 変更を加えます!(もちろん、リソースファイルなどの場合は、まずMAAフォルダー内で変更をテストし、問題がないことを確認してから、ウェブページに貼り付けて変更を行ってください)
|
||||
7. 変更が完了したら、一番下までスクロールして、変更内容を記述します。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-7-1-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-7-1-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-7-1-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-7-1-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-7-2-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-7-2-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-7-2-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-7-2-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
8. 変更するもう1つのファイルがある場合は、5-8を繰り返してください。
|
||||
9. 変更が完了したら、PRを行います!個人リポジトリのPull Requestタブをクリックします。
|
||||
「Compare & Pull Request」ボタンがある場合は、それをクリックしてください。ない場合は、「New Pull Request」をクリックしてください。
|
||||
「Compare & Pull Request」ボタンがある場合は、それをクリックしてください。ない場合は、「New Pull Request」をクリックしてください。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-9-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-9-dark.png'
|
||||
}
|
||||
]" />
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-9-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-9-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
10. これでメインリポジトリに移動します。PRする内容を確認してください。
|
||||
スクリーンショットのように、真ん中に左向きの矢印があり、右側の「個人名/MAA」のdevブランチを「メインリポジトリ/MAA」のdevブランチにマージすることを申請しています。
|
||||
スクリーンショットのように、真ん中に左向きの矢印があり、右側の「個人名/MAA」のdevブランチを「メインリポジトリ/MAA」のdevブランチにマージすることを申請しています。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
@@ -166,25 +166,25 @@ Conflictを解決するのは少し面倒ですが、ここでは概念につい
|
||||
]" />
|
||||
|
||||
11. MAAチームの大佬たちに承認していただきましょう!もちろん、意見を提供してくださることもあるかもしれません
|
||||
👇例えば(純粋に娯楽のために、本気にしないでください)
|
||||
👇例えば(純粋に娯楽のために、本気にしないでください)
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-11-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-11-dark.png'
|
||||
}
|
||||
]" />
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-11-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-11-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
12. 大佬たちがさらに小さな問題を修正するように言った場合、あなたの個人のリポジトリに戻って、以前のdevブランチに切り替え、手順3-9を繰り返すだけで大丈夫です!
|
||||
手順2(再度フォークする)を実行する必要はなく、手順10(再度プルリクエストする)を実行する必要もありません。現在のプルリクエストはまだ承認待ちの状態にあり、後続の変更はこのプルリクエストに直接反映されます。
|
||||
👇 以下は例です。最下部に「再度変更デモを変更」というメッセージが追加されたことがわかります。
|
||||
手順2(再度フォークする)を実行する必要はなく、手順10(再度プルリクエストする)を実行する必要もありません。現在のプルリクエストはまだ承認待ちの状態にあり、後続の変更はこのプルリクエストに直接反映されます。
|
||||
👇 以下は例です。最下部に「再度変更デモを変更」というメッセージが追加されたことがわかります。
|
||||
|
||||
<ImageGrid :imageList="[
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-12-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-12-dark.png'
|
||||
}
|
||||
]" />
|
||||
{
|
||||
light: 'images/zh-cn/pr-tutorial/pr-12-light.png',
|
||||
dark: 'images/zh-cn/pr-tutorial/pr-12-dark.png'
|
||||
}
|
||||
]" />
|
||||
|
||||
13. 大佬たちの承認を得たら、すべて完了です! バージョンがリリースされた後、あなたのGitHubプロフィールアイコンは自動的に貢献者リストに追加されます。皆様のご奉仕に深く感謝申し上げます!
|
||||
~~なんで全部二次元キャラなんだろう、あ、私も二次元好きだったわ。ま、いいか~~
|
||||
@@ -194,7 +194,7 @@ Conflictを解決するのは少し面倒ですが、ここでは概念につい
|
||||
[](https://github.com/MaaAssistantArknights/MaaAssistantArknights/graphs/contributors)
|
||||
:::
|
||||
|
||||
14. 次回別のPRを提出する場合は、まずdevブランチに切り替えて、以下の図のように直接操作してください。
|
||||
14. 次回別のPRを提出する場合は、まずdevブランチに切り替えて、以下の図のように直接操作してください。
|
||||
|
||||
::: warning
|
||||
この操作は、あなたの個人リポジトリをメインリポジトリとまったく同じ状態に強制的に同期するものであり、最も簡単で効果的な競合解消方法です。ただし、あなたの個人リポジトリにすでに追加されているものは削除されます!
|
||||
|
||||
@@ -5,8 +5,8 @@ icon: iconoir:code-brackets
|
||||
|
||||
# Dedicated VSCode Extension Tutorial
|
||||
|
||||
* [Extension Store](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support)
|
||||
* [Repository](https://github.com/neko-para/maa-support-extension)
|
||||
- [Extension Store](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support)
|
||||
- [Repository](https://github.com/neko-para/maa-support-extension)
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -60,10 +60,10 @@ When enabling the `Maa` compatible mode, the extension will be able to recursive
|
||||
|
||||
The extension supports scheduled scanning and diagnosing all tasks.
|
||||
|
||||
* Check if contains task defs with same names.
|
||||
* Check if contains unknown task refs.
|
||||
* Check if contains unknown image refs.
|
||||
* Check if contains duplicated task refs in a single task.
|
||||
- Check if contains task defs with same names.
|
||||
- Check if contains unknown task refs.
|
||||
- Check if contains unknown image refs.
|
||||
- Check if contains duplicated task refs in a single task.
|
||||
|
||||
#### Multiple paths resource support
|
||||
|
||||
@@ -83,11 +83,11 @@ Searching and launching `Maa: open crop tool` inside VSCode command panel can op
|
||||
|
||||
> Use `Ctrl+Shift+P` (`Command+Shift+P` on MacOS) to open command panel
|
||||
|
||||
* After selecting and connecting to the controller, use `Screencap` button to obtain screenshots
|
||||
* Use `Upload` button to manually upload images.
|
||||
* Hold `Ctrl` key and select cropping area
|
||||
* Use wheels to zoom
|
||||
* After finishing cropping, use `Download` button to save the cropping result to the folder of the topest layer of the activated resource
|
||||
- After selecting and connecting to the controller, use `Screencap` button to obtain screenshots
|
||||
- Use `Upload` button to manually upload images.
|
||||
- Hold `Ctrl` key and select cropping area
|
||||
- Use wheels to zoom
|
||||
- After finishing cropping, use `Download` button to save the cropping result to the folder of the topest layer of the activated resource
|
||||
|
||||
### Bottom status bar
|
||||
|
||||
|
||||
@@ -6,4 +6,4 @@ dir:
|
||||
order: 1
|
||||
---
|
||||
|
||||
<Catalog base='/ja-jp/manual/' />
|
||||
<Redirect to="newbie" />
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user