diff --git a/docs/ko-kr/develop/development.md b/docs/ko-kr/develop/development.md index 978b79c994..e4a732a19f 100644 --- a/docs/ko-kr/develop/development.md +++ b/docs/ko-kr/develop/development.md @@ -23,15 +23,15 @@ icon: iconoir:developer 다음과 같은 다양한 개발 환경을 사전에 설정했습니다: -- 빈 환경(벌거숭이 Linux 컨테이너)(기본값) +- 빈 환경 (순수 Linux 컨테이너) (기본값) [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2Fdevcontainer.json) -- 경량 환경,문서 사이트 프론트엔드 개발에 적합 +- 경량 환경, 문서 사이트 프론트엔드 개발에 적합 [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2F0%2Fdevcontainer.json) -- 전체 환경,MAA Core 관련 개발에 적합(사용 권장하지 않음,로컬 개발 권장,관련 환경을 완전히 설정,다음 섹션 참조) +- 전체 환경, MAA Core 관련 개발에 적합 (사용 권장하지 않음, 로컬 개발 권장, 관련 환경을 완전히 설정, 다음 섹션 참조) [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MaaAssistantArknights/MaaAssistantArknights?devcontainer_path=.devcontainer%2F1%2Fdevcontainer.json) @@ -65,30 +65,37 @@ icon: iconoir:developer 5. 개발 환경 구성 - Visual Studio 2026 Community 설치 시 `C++ 데스크톱 개발` 및 `.NET 데스크톱 개발` 필수 선택 -6. MAA.sln 파일 더블클릭 → Visual Studio에서 프로젝트 자동 로드 -7. VS 설정 +6. cmake 프로젝트 구성 실행 + + ```cmd + mkdir -p build + cmake -G "Visual Studio 18 2026" -B build -DBUILD_WPF_GUI=ON -DBUILD_DEBUG_DEMO=ON + ``` + +7. `build/MAA.sln` 파일을 더블 클릭하여 엽니다. Visual Studio가 자동으로 전체 프로젝트를 로드합니다. +8. VS 설정 - 상단 구성에서 RelWithDebInfo x64 선택 (릴리스 빌드/ARM 플랫폼 시 생략) - MaaWpfGui 우클릭 → 속성 → 디버그 → 네이티브 디버깅 활성화 (C++ 코어 중단점 사용 가능) -8. 이제 자유롭게 ~~개조~~ 개발 시작! -9. 주기적 커밋 (메시지 필수 작성) - Git 초보자는 dev 브랜치 대신 새 브랜치 생성 권장: +9. 이제 자유롭게 ~~개조~~ 개발 시작! +10. 주기적 커밋 (메시지 필수 작성) + 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. 개발 완료 후 변경사항 원격 저장소로 푸시: +11. 개발 완료 후 변경사항 원격 저장소로 푸시: ```bash git push origin dev ``` -11. [MAA 메인 저장소](https://github.com/MaaAssistantArknights/MaaAssistantArknights)에서 Pull Request 제출 (master 대신 dev 브랜치 지정 필수) -12. 업스트림 저장소 변경사항 동기화 방법: +12. [MAA 메인 저장소](https://github.com/MaaAssistantArknights/MaaAssistantArknights)에서 Pull Request 제출 (master 대신 dev 브랜치 지정 필수) +13. 업스트림 저장소 변경사항 동기화 방법: 1. 업스트림 저장소 추가: ```bash @@ -148,7 +155,7 @@ pip 설치 후에도 Pre-commit을 실행할 수 없다면, PIP 설치 경로가 이제, 매번 커밋할 때마다 포매팅 도구가 자동으로 실행되어 코드 형식이 규칙에 맞는지 확인합니다. -## Visual Studio에서 clang-format 사용 설정 +### Visual Studio에서 clang-format 사용 설정 1. clang-format 20.1.0 또는 그 이상 버전을 설치합니다. diff --git a/docs/ko-kr/develop/documentation-guidelines.md b/docs/ko-kr/develop/documentation-guidelines.md index 4b7605ee2f..32279034d5 100644 --- a/docs/ko-kr/develop/documentation-guidelines.md +++ b/docs/ko-kr/develop/documentation-guidelines.md @@ -6,20 +6,18 @@ icon: jam:write-f # 문서 작성 가이드 ::: tip -이 문서의 목적은 문서 작성자가 주제가 제공하는 기능을 더 잘 활용하여 더 읽기 쉬운 효과를 얻는 데 도움을 주는 것입니다. +이 문서의 목적은 문서 작성자가 테마가 제공하는 기능을 더 잘 활용하여 더 읽기 쉬운 효과를 얻는 데 도움을 주는 것입니다. ::: -우리의 문서는 [vuepress](https://github.com/vuejs/vuepress)로 작성되었으며, [vuepress-theme-plume](https://github.com/pengzhanbo/vuepress-theme-plume) 테마를 사용하고 있습니다. 더 자세한 설명은 [공식 문서](https://theme-plume.vuejs.press/)를 참조할 수 있으며, 여기서는 일부 일반적인 기능에 대해서만 소개하겠습니다. +우리의 문서는 [vuepress](https://github.com/vuejs/vuepress)로 구축되었으며, [vuepress-theme-plume](https://github.com/pengzhanbo/vuepress-theme-plume) 테마를 사용하고 있습니다. 더 자세한 설명은 [공식 문서](https://theme-plume.vuejs.press/)를 참조할 수 있으며, 여기서는 일부 일반적인 기능이나 커스텀된 기능에 대해서만 소개하겠습니다. ## 로컬 배포 -1. [pnpm](https://pnpm.io/installation)을 설치하고, [Pull Request 가이드](./development.md#github-pull-request-진행-과정)을 참고해, 저장소를 로컬에 클론합니다. -2. `docs` 경로에서 새로운 터미널을 열고, `pnpm i` 을 실행하여 의존성 파일을 다운로드합니다. +1. [pnpm](https://pnpm.io/installation)을 설치하고, [Pull Request 가이드](./pr-tutorial.md)를 참고해, 저장소를 로컬에 클론합니다. +2. `docs` 경로에서 새로운 터미널을 열고, `pnpm i` 를 실행하여 의존성을 설치합니다. 3. `pnpm run dev` 를 실행하여 배포를 시작합니다. -## 컨테이너 - -~~도커 컨테이너가 아닙니다~~ +## 컨테이너와 카드 이 테마는 팁, 주석, 정보, 주의, 경고 및 세부 정보를 사용자 정의하는 컨테이너를 지원합니다. 이 기능을 사용하여 내용을 강조할 수 있습니다. @@ -31,7 +29,14 @@ icon: jam:write-f ::: ``` -허용되는 컨테이너 유형 및 기본 제목은 다음과 같습니다: +또는 Github 스타일 구문 사용: + +```markdown +> [!컨테이너 타입] +> 내용을 입력하세요 +``` + +허용되는 컨테이너 내용 및 기본 제목은 다음과 같습니다: - `tip` 팁 - `note` 주석 @@ -39,42 +44,229 @@ icon: jam:write-f - `warning` 주의 - `danger` 경고 - `details` 세부 사항 +- `demo-wrapper` ==특수 컨테이너== ### 컨테이너 예시 ::: tip -이것은 팁 컨테이너입니다. +이것은 팁 컨테이너입니다 ::: ::: note -이것은 주석 컨테이너입니다. +이것은 주석 컨테이너입니다 ::: ::: info -이것은 정보 컨테이너입니다. +이것은 정보 컨테이너입니다 ::: ::: warning -이것은 주의 컨테이너입니다. +이것은 주의 컨테이너입니다 ::: ::: danger -이것은 위험 컨테이너입니다. +이것은 위험 컨테이너입니다 ::: ::: details -이것은 세부 사항 컨테이너입니다. +이것은 세부 사항 컨테이너입니다 ::: +::: demo-wrapper +이것은 매우 특별한 컨테이너입니다 +::: + +## 형광펜 표시 + +마크다운 구문을 사용하여 원하는 내용을 표시하고 강조할 수 있습니다. + +사용 방법: `==표시 내용=={표시 색상(선택 사항)}` 구문을 사용하여 표시하며, 양쪽에 공백이 있어야 합니다. + +**입력:** + +```markdown +MaaAssistantArknights는 ==많은 돼지들== 에 의해 개발되었습니다 +``` + +**출력:** + +MaaAssistantArknights는 ==많은 돼지들== 에 의해 개발되었습니다 + +테마에는 다음과 같은 색상 구성표가 내장되어 있습니다: + +- **default**: `==Default==` - ==Default== +- **info**: `==Info=={.info}` - ==Info=={.info} +- **note**: `==Note=={.note}` - ==Note=={.note} +- **tip**: `==Tip=={.tip}` - ==Tip=={.tip} +- **warning**: `==Warning=={.warning}` - ==Warning=={.warning} +- **danger**: `==Danger=={.danger}` - ==Danger=={.danger} +- **caution**: `==Caution=={.caution}` - ==Caution=={.caution} +- **important**: `==Important=={.important}` - ==Important=={.important} + +## 숨겨진 텍스트 + +어떤 이유로 문서의 일부를 일시적으로 가려야 할 때, 숨겨진 텍스트 기능을 사용할 수 있습니다. + +`!!숨겨야 할 내용!!{설정(선택 사항)}` 구문을 사용하여 사용할 수 있으며, 기본 효과는 다음과 같습니다. + +!!왠지 모르게 맹모단(모에 백과)을 보고 있는 것 같다(취소선!! + +다음과 같은 설정을 사용할 수 있습니다: + +::: demo-wrapper +입력: + +```markdown ++ 마스크 효과 + 마우스 호버: !!마우스 호버 시 보입니다!!{.mask .hover} ++ 마스크 효과 + 클릭: !!클릭 시 보입니다!!{.mask .click} ++ 블러 효과 + 마우스 호버: !!마우스 호버 시 보입니다!!{.blur .hover} ++ 블러 효과 + 클릭: !!클릭 시 보입니다!!{.blur .click} +``` + +출력: + +- 마스크 효과 + 마우스 호버: !!마우스 호버 시 보입니다!!{.mask .hover} +- 마스크 효과 + 클릭: !!클릭 시 보입니다!!{.mask .click} +- 블러 효과 + 마우스 호버: !!마우스 호버 시 보입니다!!{.blur .hover} +- 블러 효과 + 클릭: !!클릭 시 보입니다!!{.blur .click} + +::: + +## 단계 (Steps) + +단계별 튜토리얼을 작성할 때, 순서가 있는 목록은 중첩으로 인해 계층 구조가 불분명해질 수 있습니다. 이럴 때 `steps` 컨테이너가 최고의 선택입니다. + +이 컨테이너는 일반적인 컨테이너와 달리 시작과 끝을 표시하기 위해 4개의 콜론을 사용합니다. + +입력: + +````markdown +:::: steps +1. 단계 1 + + ```ts + console.log('Hello World!') + ``` + +2. 단계 2 + + 여기는 단계 2의 관련 내용입니다 + +3. 단계 3 + + ::: tip + 팁 컨테이너 + ::: + +4. 종료 +:::: +```` + +출력: + +:::: steps + +1. 단계 1 + + ```ts + console.log('Hello World!') + ``` + +2. 단계 2 + + 여기는 단계 2의 관련 내용입니다 + +3. 단계 3 + + ::: tip + 팁 컨테이너 + ::: + +4. 종료 + +:::: + +## 스마트 이미지 컨테이너 + +우리는 테마가 제공하는 기능을 기반으로 이미지 컨테이너를 포장했습니다. 이 컨테이너는 라이트/다크 테마에 따라 해당 이미지를 자동으로 표시하며, 자동 레이아웃을 지원합니다. + +마크다운 본문에서 `` 컴포넌트를 사용하여 이 메서드를 호출할 수 있으며, 구체적인 구문과 효과는 다음과 같습니다. + +::: demo-wrapper + +구문: + +```markdown + +``` + +렌더링 효과: + + + +::: + +## 필드 컨테이너 + +이 구문은 다소 복잡하므로 [공식 문서](https://theme-plume.vuejs.press/guide/markdown/field/)를 참고하여 사용하세요. + +효과는 다음과 같습니다. + +:::: field-group +::: field name="theme" type="ThemeConfig" required default="{ base: '/' }" +테마 설정 +::: + +::: field name="enabled" type="boolean" optional default="true" +활성화 여부 +::: + +::: field name="callback" type="(...args: any[]) => void" optional default="() => {}" + +콜백 함수 +::: + +::: field name="other" type="string" deprecated + +폐기된 속성 +::: +:::: + ## 아이콘 이 테마는 아이콘을 지원합니다. 다음 위치에서 아이콘을 사용할 수 있습니다: -- 문서 제목: frontmatter에서 문서 제목 옆에 아이콘 설정 +- 문서 제목: frontmatter에서 문서 제목 옆에 아이콘 설정. -- 탐색 모음/사이드바: 탐색 모음 및 사이드바에 표시되는 아이콘 설정 +- 내비게이션 바/사이드바: 내비게이션 바와 사이드바에 표시되는 아이콘 설정. -- 문서 내용: 문서에서 아이콘 사용 +- 문서 내용: 문서 내에서 아이콘 사용. ### 문서의 아이콘 설정 @@ -94,32 +286,37 @@ icon: jam:write-f ### 문서에서 아이콘 사용 -마크다운에서 `` 구성 요소를 사용하여 아이콘을 추가할 수 있습니다. 이 구성 요소에는 다음과 같은 속성이 있습니다: +마크다운에서 `` 컴포넌트를 사용하여 아이콘을 추가할 수 있습니다. 이 컴포넌트에는 다음과 같은 속성이 있습니다: -- `icon` 아이콘 키워드 및 URL 수신. 예: `jam:write-f`, `ic:round-home` 등 -- `color` css 스타일 색상 값 수신. 예: `#fff`, `red` 등 (이 옵션은 svg 아이콘에만 유효함) -- `size` css 스타일 크기 값 수신. 예: `1rem`, `2em`, `100px` 등 +- `icon` 아이콘 키워드 및 URL을 받습니다. 예: `jam:write-f`, `ic:round-home` 등 +- `color` css 스타일 색상 값을 받습니다. 예: `#fff`, `red` 등 (이 옵션은 svg 아이콘에만 유효함) +- `size` css 스타일 크기 값을 받습니다. 예: `1rem`, `2em`, `100px` 등 -::: details 예시 - +::: demo-wrapper 예시 + +입력: ```markdown - +- home - +- vscode - +- twitter - ``` - -```markdown - -``` +출력: + +- home - +- vscode - +- twitter - + ::: -### 아이콘 키워드 가져오기 +### 아이콘 키워드 획득 -이 문서에서 사용하는 아이콘은 [iconify](https://iconify.design/)에서 제공됩니다. 원하는 아이콘을 검색하려면 제공된 [아이콘 검색 페이지](https://icon-sets.iconify.design/)에서 검색한 다음 키워드를 복사하세요. +이 문서에서 사용하는 아이콘은 [iconify](https://iconify.design/)에서 가져옵니다. 제공되는 [아이콘 검색 인터페이스](https://icon-sets.iconify.design/)에서 원하는 아이콘을 검색한 후 키워드를 복사할 수 있습니다. ## Frontmatter -Frontmatter는 Markdown 문서의 시작 부분에 `---`로 둘러싸인 내용이며 내부에서는 YAML 구문을 사용합니다. Frontmatter를 통해 문서의 편집 시간, 사용된 아이콘, 분류, 태그 등을 식별할 수 있습니다. +Frontmatter는 마크다운 문서 맨 처음에 `---`로 감싸진 내용으로, 내부적으로 yml 문법을 사용합니다. Frontmatter를 통해 문서의 편집 시간, 사용하는 아이콘, 분류, 태그 등을 식별할 수 있습니다. ::: details 예시 @@ -139,6 +336,6 @@ order: 1 각 필드의 의미는 다음과 같습니다: -- `date` 문서의 편집 시간 -- `icon` 문서 제목 옆에 표시되는 아이콘 -- `order` 사이드바에서 문서의 순서 +- `date`: 문서의 편집 시간 +- `icon`: 문서 제목 옆의 아이콘 +- `order`: 사이드바에서 문서의 정렬 순서 diff --git a/docs/ko-kr/develop/issue-bot-usage.md b/docs/ko-kr/develop/issue-bot-usage.md index b62788e301..9cbc823cc8 100644 --- a/docs/ko-kr/develop/issue-bot-usage.md +++ b/docs/ko-kr/develop/issue-bot-usage.md @@ -8,7 +8,7 @@ icon: bxs:bot Issue Bot의 동작은 [issue-checker](https://github.com/zzyyyl/issue-checker)로 이루어지며, 설정 파일은 [issue-checker.yml](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/issue-checker.yml) 입니다. ::: warning -Commitizen 규격으로 커밋하지 않는 경우, 병합 요청(Merge Request)가 `ambiguous(애매모호한)`로 표시됨에 주의해주세요. +Commitizen 규격으로 커밋하지 않는 경우, 풀 리퀘스트(Pull Request)가 `ambiguous(애매모호한)`로 표시됨에 주의해주세요. ::: ## 기능 @@ -46,7 +46,7 @@ Issue Bot은 풀 리퀘스트의 제목을 확인합니다. 아래 키워드로 - `Skip {LABEL_NAME}`은 특정 유형의 라벨이 추가되지 않도록 합니다. - `Skip labels`은 모든 라벨이 추가되지 않도록 합니다. -- `fixed(수정함)` 라벨을 추가하려면 다음 명령어 중 하나를 사용할 수 있습니다:``1 `` +- `fixed(수정함)` 라벨을 추가하려면 다음 명령어 중 하나를 사용할 수 있습니다:1 - `https://github.com/MaaAssistantArknights/MaaAssistantArknights/commit/{COMMIT_HASH} fixed` - `fixed by https://github.com/MaaAssistantArknights/MaaAssistantArknights/commit/{COMMIT_HASH}` - `{VERSION} fixed` diff --git a/docs/ko-kr/develop/linux-tutorial.md b/docs/ko-kr/develop/linux-tutorial.md index 86ca76f7d4..de614fad6c 100644 --- a/docs/ko-kr/develop/linux-tutorial.md +++ b/docs/ko-kr/develop/linux-tutorial.md @@ -5,75 +5,99 @@ icon: teenyicons:linux-alt-solid # Linux 컴파일 가이드 -**이 튜토리얼은 독자가 일정한 Linux 환경 설정 능력과 프로그래밍 기초를 가지고 있다고 가정합니다!**, 만약 여러분이 MAA를 직접 컴파일하는 대신에 단순히 설치하길 원한다면 [Linux 설명서](../manual/device/linux.md)를 참고하세요. +**이 가이드는 독자가 일정한 Linux 환경 설정 능력과 프로그래밍 기초를 가지고 있다고 가정합니다!** MAA를 직접 컴파일하는 대신 단순히 설치하길 원한다면 [사용자 매뉴얼 - Linux 지원](../manual/device/linux.md)를 참고하세요. -::: info 정보 -MAA의 빌드 방법은 여전히 논의 중입니다. 이 튜토리얼의 내용은 오래되었을 수 있으므로 [GitHub workflow file](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/workflows/ci.yml#L134)의 스크립트를 참고하세요. 또한 [AUR PKGBUILD](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=maa-assistant-arknights) 및 [nixpkgs](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)을 참고할 수 있습니다. +::: info 주의 +MAA의 빌드 방법은 여전히 논의 중입니다. 이 가이드의 내용은 최신 내용이 아닐 수 있으므로 [GitHub workflow file](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/workflows/ci.yml#L134)의 스크립트를 참고하는 것이 좋습니다. +또한 [AUR PKGBUILD](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=maa-assistant-arknights) 또는 [nixpkgs](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)를 참고할 수도 있습니다. ::: ::: info -Mac은 `tools/build_macos_universal.zsh` 스크립트를 사용하여 컴파일할 수 있습니다. [MaaAssistantArknights/MaaMacGui](https://github.com/MaaAssistantArknights/MaaMacGui) 프로젝트의 README.md를 참고하는 것을 권장합니다. +Mac은 `tools/build_macos_universal.zsh` 스크립트를 사용하여 컴파일할 수 있습니다. +MaaAssistantArknights/MaaMacGui 프로젝트의 [README.md](https://github.com/MaaAssistantArknights/MaaMacGui/blob/master/README.md)를 참고하는 것을 권장합니다. ::: ## 컴파일 과정 -1. 컴파일에 필요한 종속성 다운로드 - - Ubuntu/Debian +:::: steps - ```bash - sudo apt install gcc-14 g++-14 cmake zlib1g-dev +1. 컴파일에 필요한 종속성 다운로드 + ::: code-tabs + @tab:active Ubuntu/Debian + + ```bash :no-line-numbers + sudo apt install cmake ``` + @tab Arch + + ```bash :no-line-numbers + sudo pacman -S --needed cmake + ``` + + ::: + 2. 서드파티 라이브러리 빌드 - 사전 빌드된 종속성 라이브러리를 다운로드하거나 직접 빌드할 수 있습니다. - - 사전 빌드된 서드파티 라이브러리 다운로드 (권장됨) + 사전 빌드된 라이브러리를 다운로드하거나 처음부터 컴파일할 수 있습니다. + - 사전 빌드된 서드파티 라이브러리 다운로드 (권장) - > **Note** - > 상대적으로 최신의 Linux 배포판 (Ubuntu 22.04)에서 컴파일된 동적 라이브러리가 포함되어 있습니다. 시스템의 libstdc++ 버전이 오래되었을 경우 ABI 호환성 문제가 발생할 수 있습니다. + > [!Note] + > ~~상대적으로 최신의 Linux 배포판 (Ubuntu 22.04)에서 컴파일된 동적 라이브러리가 포함되어 있습니다. 시스템의 libstdc++ 버전이 오래되었을 경우 ABI 호환성 문제가 발생할 수 있습니다.~~ + > 현재 크로스 컴파일을 기반으로 실행 환경 요구 사항을 낮추었으며, glibc 2.31 (ubuntu 20.04)만 있으면 됩니다. ```bash python tools/maadeps-download.py ``` - 위의 방법으로 다운로드한 라이브러리가 시스템에서 실행되지 않거나 컨테이너와 같은 대안을 사용하지 않고 싶은 경우 직접 빌드해볼 수도 있습니다. - - 서드파티 라이브러리 직접 빌드 (시간이 오래 걸릴 수 있음) + 만약 위 방법으로 다운로드한 라이브러리가 ABI 버전 등의 이유로 시스템에서 실행되지 않고, 컨테이너 등을 사용하고 싶지 않다면 처음부터 컴파일을 시도해 볼 수 있습니다. + - 서드파티 라이브러리 직접 빌드 (오랜 시간이 소요됩니다) ```bash - git submodule update --init --recursive + git clone https://github.com/MaaAssistantArknights/MaaDeps cd MaaDeps + # 시스템 환경이 너무 낮아 사전 빌드된 llvm 20을 사용할 수 없는 경우, 크로스 컴파일을 사용하지 않고 로컬 컴파일 환경을 직접 사용해 보세요. + # src/MaaUtils/MaaDeps/cmake의 toolchain 구성을 조정해야 합니다. + python linux-toolchain-download.py python build.py ``` 3. MAA 컴파일 ```bash - CC=gcc-14 CXX=g++-14 cmake -B build \ + cmake -B build \ -DINSTALL_RESOURCE=ON \ - -DINSTALL_PYTHON=ON + -DINSTALL_PYTHON=ON \ + -DCMAKE_TOOLCHAIN_FILE=src/MaaUtils/MaaDeps/cmake/maa-x64-linux-toolchain.cmake cmake --build build ``` - 경로에 MAA를 설치하기 위해 위의 명령을 사용합니다. MAA는 `LD_LIBRARY_PATH`를 지정하여 실행하는 것이 좋으며, MAA를 `/usr`에 설치하지 마세요. + MAA를 대상 위치에 설치합니다. MAA는 `LD_LIBRARY_PATH`를 지정하여 실행하는 것을 권장하며, 관리자 권한을 사용하여 MAA를 `/usr`에 설치하지 마세요. + + > 지금은 실행 시 `LD_LIBRARY_PATH`를 지정할 필요가 없을 수도 있습니다. ```bash cmake --install build --prefix ``` +4. 완료, 디렉터리에서 빌드 파일을 확인할 수 있을 것입니다. + +:::: + ## 통합 문서 -[~~문서가 아닐수도 있습니다~~](../protocol/integration.md) +[~~문서라고 부르기도 애매한~~](../protocol/integration.md) ### Python -[Python demo](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Python/sample.py)에서 `__main__`의 구현을 참조하세요. +[Python demo](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Python/sample.py)에서 `__main__`의 구현을 참고하세요. ### C++ -[CppSample](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Cpp/main.cpp)의 구현을 참조하세요. +[CppSample](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Cpp/main.cpp)의 구현을 참고하세요. ### C Sharp -[MaaWpfGui](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/MaaWpfGui/Main/AsstProxy.cs)의 구현을 참조하세요. +[MaaWpfGui](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/MaaWpfGui/Main/AsstProxy.cs)의 구현을 참고하세요. diff --git a/docs/ko-kr/develop/overseas-client-adaptation.md b/docs/ko-kr/develop/overseas-client-adaptation.md index 68c1546d7d..df69de123d 100644 --- a/docs/ko-kr/develop/overseas-client-adaptation.md +++ b/docs/ko-kr/develop/overseas-client-adaptation.md @@ -10,7 +10,7 @@ icon: ri:earth-fill 이 튜토리얼을 시작하기 전에 다음 사항이 준비되었는지 확인해야 합니다. 1. 필요한 소프트웨어를 설치하고 올바르게 구성했습니다. ZH-CN 클라이언트 또는 해당 클라이언트의 `readme.md` 에 지원되는 기능이 제대로 작동하는지 확인할 수 있는 정보가 있어야 합니다. -2. [작업 스키마](../protocol/task-schema.md) 를 읽고 각 필드의 의미와 사용법을 기본적으로 이해해야 합니다. 코드에서 `@` 와 `#` 의 의미와 용법도 이해해야 합니다. +2. [작업 프로토콜](../protocol/task-schema.md)을 읽고 각 필드의 의미와 사용법을 기본적으로 이해해야 합니다. 코드에서 `@` 와 `#` 의 의미와 용법도 이해해야 합니다. 3. ZH-CN 클라이언트의 `task.json` 파일과 템플릿 이미지는 해외 클라이언트에 대해 언급되지 않았거나 누락된 경우의 대안으로 사용된다는 점을 이해해야합니다. 해외 클라이언트에 대한 `task.json` 의 내용은 ZH-CN 작업 필드에 따라 다시 작성해야 합니다. 4. 영어 실력이 있고, 영어 로그를 읽을 수 있으며, 로그를 통해 누락된 사진과 다른 정보를 찾을 수 있는 역량이 있으면 좋습니다. 5. 작업 체인에 따라 개별적으로 수정을 수행하는 것이 좋습니다. 예를 들어, Award 작업을 수정하려면 `next` 필드의 순서에 따라 `template image`, `text`, 그리고 `roi` 를 단계적으로 수정해야 합니다. 이렇게 하면 수정 후 모든 작업이 정상적으로 작동하고 오류를 쉽게 발견할 수 있습니다. 또한 이렇게 하면 한 번에 너무 많은 콘텐츠가 수정될 때 소프트웨어가 어떤 작업에 고정되어 있는지 혼동하거나 잊어버리는 것을 방지할 수 있습니다. @@ -134,7 +134,7 @@ ROI 범위를 수정하는 방법: ```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.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 ] [2022-12-18 17:43:18.541][TRC][Px7ec][Tx15c8] Ocr Pipeline with asst::WordOcr | enter [2022-12-18 17:43:18.634][TRC][Px7ec][Tx15c8] Ocr Pipeline with asst::WordOcr | leave, 93 ms diff --git a/docs/ko-kr/develop/pr-tutorial.md b/docs/ko-kr/develop/pr-tutorial.md index a5b0d1976d..4d3eb666f7 100644 --- a/docs/ko-kr/develop/pr-tutorial.md +++ b/docs/ko-kr/develop/pr-tutorial.md @@ -9,7 +9,7 @@ icon: mingcute:git-pull-request-fill ::: warning 이 가이드는 많은 개념을 단순화하여 더 많은 사람들이 실제로 사용할 수 있도록 설계되었습니다. 때로는 꽤 불안불안한 ~~하지만 간단한~~ 조치들과 약간 부정확한 설명이 있을 수 있으므로 전문가 분들의 이해를 부탁드립니다. -만약 Git 사용 경험이 있고 프로그래밍 기초를 가지고 계시다면 ~~그럼 당신은 왜 보고 있나요🔨~~, 약간 더 발전된 가이드인 [Github Pull Request 진행과정](./development.md#github-pull-request-진행-과정)을 확인해주세요. +만약 Git 사용 경험이 있고 프로그래밍 기초 지식을 가지고 계시다면 ~~그럼 당신은 왜 보고 있나요🔨~~, 약간 더 발전된 가이드인 [Github Pull Request 진행과정](./development.md#완전한-환경-설정-windows)을 확인해주세요. ::: ## 기본 개념 및 용어 설명 @@ -32,9 +32,9 @@ repo로도 알려져 있으며 코드 및 다른 리소스 파일을 저장하 ### Fork (복사) 단어 그대로 MAA의 코드를 복사하고 나서 수정 등의 작업을 수행할 수 있습니다. 원본을 망치지 않도록 조심하세요. -그러나 중국어로 "복사"라는 용어를 사용할 때는 일반적으로 "복사"라는 용어를 생각합니다.또한 "fork"라는 명확한 번역이 없으므로 일반적으로 영어를 사용합니다. 예를 들어 "코드를 fork하여 복사합니다." +하지만 일반적으로 '복제'라고 하면 Ctrl+C/V를 생각하기 쉬우므로, 보통 영단어 그대로 'Fork'라고 부릅니다. 예를 들어 "코드를 fork해간다"라고 합니다. -복사한 것은 `MAA (1)` (bushi)입니다. +복사한 것은 `MAA (1)` (복사본)입니다. 원래 저장소와 구별하기 위해 일반적으로 원래 MAA 저장소를 "원본 저장소", "원격 저장소", "상위 저장소"로 지칭합니다. 각 사람이 자신의 복사본을 만들 수 있기 때문에 복사본을 "개인 저장소"로 지칭합니다. @@ -52,7 +52,7 @@ PR로도 알려져 있으며, "풀 리퀘스트"라는 용어는 너무 길고 물론 "요청"이니까 승인이 필요합니다. MAA 팀의 분들이 당신의 변경 사항에 대해 몇 가지 의견을 제시할 수 있습니다. 물론 우리의 의견이 모두 옳은 것은 아니며, 합리적으로 논의합니다~ -👇 아래는 현재 전문가들이 제시한 PR을 대기 중인 상태입니다. +👇 아래는 현재 전문가들이 제시한 PR을 검토 대기 중인 상태입니다. -2. "마스터 브랜치만" 옵션을 해제한 다음 Fork를 클릭합니다. +2. 그런 다음 Create Fork를 클릭합니다. 6. 수정하세요! (리소스 파일과 같은 경우 먼저 컴퓨터에있는 MAA 폴더에서 수정 사항을 테스트 한 다음 웹 페이지로 복사하여 잘못된 수정을 방지하세요) -7. 수정이 완료되면 맨 아래로 스크롤하여 수정 내용을 적습니다. +7. 수정이 완료되면 오른쪽 상단의 👇 이 버튼을 클릭하여 커밋 페이지를 열고, 무엇을 수정했는지 작성합니다. - 우리는 간단한 커밋 제목 [관례적 커밋](https://www.conventionalcommits.org/zh-hans/v1.0.0/)이 있으니 가능하면 지켜주세요. 물론 정말 이해가 안 된다면 일단 아무렇게나 써도 됩니다. + 우리는 간단한 커밋 제목 [관례적 커밋](https://www.conventionalcommits.org/ko/v1.0.0/)이 있으니 가능하면 지켜주세요. 물론 정말 이해가 안 된다면 일단 아무렇게나 써도 됩니다. -8. 두 번째 파일을 수정해야합니까? 수정 후 오류가 발생하여 수정을 다시하고 싶습니까? 전혀 문제가되지 않습니다! 5-8을 반복하세요! -9. 모두 완료되면 PR을 제출하세요! Pull Request 탭을 클릭합니다. - Compare & Pull Request 버튼이 있으면 좋지만 없어도 걱정하지 마세요. 아래의 New Pull Request를 클릭하면 됩니다. (11단계 참조) +8. 두 번째 파일을 수정해야하나요? 수정 후 오류가 발생하여 다시 수정하고 싶으신가요? 전혀 문제 없습니다! 4-7 단계를 반복하세요! +9. 모두 완료되면 PR을 제출하세요! Code를 클릭하여 **개인 저장소** 메인 페이지로 돌아갑니다. + Compare & Pull Request 버튼이 있으면 바로 클릭하세요! + 없어도 걱정하지 마세요. 아래의 Contribute 버튼을 클릭한 다음 Open Pull Request를 클릭하면 됩니다. 그런 다음 제목, 수정한 내용 등을 작성하고 확인을 클릭합니다. - PR 제목도 [관례적 커밋](https://www.conventionalcommits.org/zh-hans/v1.0.0/)을 지켜주세요. 물론 여전히 이해가 안 된다면 일단 아무렇게나 써도 됩니다. + PR 제목도 [관례적 커밋](https://www.conventionalcommits.org/ko/v1.0.0/)을 지켜주세요. 물론 여전히 이해가 안 된다면 일단 아무렇게나 써도 됩니다. -11. MAA 팀의 전문가들의 검토를 기다립니다! 물론 그들도 의견을 제시 할 수 있습니다. +11. MAA 팀원들의 검토를 기다립니다! 물론 그들도 의견을 제시 할 수 있습니다. 👇 예를 들어(오로지 오락을 위한 것이니 진지하게 받아들이지 마세요) -12. 만약 전문가들이 몇 가지 작은 문제를 수정하라고 말한다면 개인 저장소로 돌아가 이전의 dev 브랜치로 이동하여 3-9 단계를 반복하세요! - 당신의 현재 PR은 여전히 검토 대기 중이므로 나중에 수정 사항이 이 PR에 직접 반영됩니다. - 👇 예를 들어 아래에서 "재수정 데모"라는 새로운 내용이 추가된 것을 볼 수 있습니다. +12. 만약 팀원들이 몇 가지 작은 문제를 수정하라고 한다면, **개인 저장소**로 돌아가서 4-7 단계를 반복하세요! + 1-2 단계(다시 fork)와 9-10 단계(다시 Pull Request)는 필요 없습니다. 현재 Pull Request는 여전히 검토 대기 중이며, 이후 수정 사항은 이 Pull Request에 직접 반영됩니다. + 👇 예를 들어 맨 아래에 재수정한 내용이 추가된 것을 볼 수 있습니다. -13. 전문가들의 승인을 기다리면 모두 완료됩니다! 수정한 내용이 이미 MAA 메인 저장소에 들어갔습니다! +13. MAA 팀원들의 승인을 기다리면 모두 완료됩니다! 수정한 내용이 이미 MAA 메인 저장소에 들어갔습니다! -14. 다음에 다른 PR을 제출하려면 먼저 dev 브랜치로 전환한 다음 아래 그림과 같이 진행하세요. +14. 다음에 다른 PR을 제출하려면 먼저 개인 저장소 메인 페이지로 돌아가, `Sync fork`를 클릭하여 당신의 저장소를 주 저장소와 동기화하세요. - ::: warning - 이 조작은 개인 저장소를 주 저장소와 완전히 동일한 상태로 강제로 동기화합니다. 이것은 충돌을 해결하는 가장 간단하고 효과적인 방법입니다. 그러나 개인 저장소에 이미 추가한 것이 있으면 그것이 삭제됩니다! - ::: - 충돌을 일으키지 않을 경우 오른쪽에 초록색 `Update Branch` 버튼을 사용하세요. + 여기서 주의할 점은, 빨간색 `Discard 1 commit`이 있다면 빨간색을 클릭하고, 없다면 녹색 `Update branch`를 클릭하세요. - 충돌 상황에 대해 잘 모르거나 알 필요가 없다면 왼쪽의 버튼을 클릭하세요. + 그 다음 4-10 단계를 반복하여 다시 수정할 수 있습니다. - 그러면 3-14 단계를 반복하여 수정하고 PR을 제출하면 됩니다~ - -**버전이 출시**되면 당신의 GitHub 프로필 사진이 자동으로 기여자 목록에 추가됩니다. 모든 분들의 자비로운 공헌에 감사드립니다! -~~왜 모든 사람들이 이중 인격이야, 아 나도 그렇지, 그럼 괜찮아~~ +**신규 버전이 출시**되면 당신의 GitHub 프로필 사진이 자동으로 기여자 목록에 추가됩니다. 모든 분들의 자비로운 공헌에 감사드립니다! +~~왜 다들 오타쿠야, 아 나도 그렇지, 그럼 괜찮아~~ ::: tip 기여자 -개발/테스트에 참여한 모든 친구들에게 감사드립니다. 여러분의 도움으로 MAA가 점점 더 좋아지고 있습니다! (\*´▽ `)ノノ +개발/테스트에 참여한 모든 분들에게 감사드립니다. 여러분의 도움으로 MAA가 점점 더 좋아지고 있습니다! (\*´▽ `)ノノ [![Contributors](https://contributors-img.web.app/image?repo=MaaAssistantArknights/MaaAssistantArknights&max=105&columns=15)](https://github.com/MaaAssistantArknights/MaaAssistantArknights/graphs/contributors) ::: diff --git a/docs/ko-kr/develop/vsc-ext-tutorial.md b/docs/ko-kr/develop/vsc-ext-tutorial.md index a2bc54f8e9..912914b38f 100644 --- a/docs/ko-kr/develop/vsc-ext-tutorial.md +++ b/docs/ko-kr/develop/vsc-ext-tutorial.md @@ -3,127 +3,129 @@ order: 8 icon: iconoir:code-brackets --- -# Dedicated VSCode Extension Tutorial +# 전용 VSCode 확장 프로그램 가이드 -The extension provides a series of convenient development capabilities for MaaAssistantArknights/MaaFramework, including but not limited to the following features: +이 확장 프로그램은 MaaAssistantArknights/MaaFramework에 대해 다음과 같은 기능들을 포함한 편리한 개발 기능들을 제공합니다: -- tasks.json support, including `template preview`, `next jump`, `task reference`, etc. -- Screenshot / Crop image +- `template 미리보기`, `next 점프`, `작업 참조(Task Reference)` 등을 포함한 tasks.json 지원 +- 이미지 캡처/자르기 -For details, please visit [Extension Store](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support) or [Repository](https://github.com/neko-para/maa-support-extension). +자세한 내용은 [마켓플레이스](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support) 또는 [저장소](https://github.com/neko-para/maa-support-extension)를 방문하여 확인할 수 있습니다. -## Installation +## 설치 -Searching `Maa` and installing it from VSCode extensions list is recommended. +VSCode 확장 프로그램 목록에서 `Maa`를 검색하여 직접 설치하는 것을 권장합니다. ::: tip -When used for the first time, the extension will automatically download the preset version of resources. -Search command `Maa: select fetch registry` to switch the download source (npm / cnpm). +처음 사용할 때 확장 프로그램은 사전 설정된 버전의 리소스를 자동으로 다운로드합니다. +명령 팔레트에서 `Maa: 선택된 다운로드 소스(Maa: select fetch registry)`를 검색하여 다운로드 소스(npm / cnpm)를 전환할 수 있습니다. ::: -## Features +## 기능 -### Control Panel +### 제어판 -A dedicated control panel is added to the left, with icon ![MaaSupport ControlPanel](/images/maa-support-panel.svg) +전용 제어판이 왼쪽에 추가되었으며, 아이콘은 ![MaaSupport ControlPanel](/images/maa-support-panel.svg) 입니다. -The major features of the extension are based on the `interface.json` configuration. Select the activated `interface.json` on the top of the control panel. +확장 프로그램의 대부분의 기능은 `interface.json` 구성을 기반으로 합니다. 제어판 상단에서 활성화할 `interface.json`을 선택할 수 있습니다. -The extension has a `Maa` compatiable mode. If `src/MaaCore` folder exists inside the opened workspace, the mode will be enabled automatically. +확장 프로그램에는 `Maa` 호환 모드가 있습니다. 열린 폴더 내에 `src/MaaCore` 폴더가 감지되면 자동으로 활성화됩니다. -### Semantic resource analysis +### 의미론적 리소스 분석 -Select expected resource via the `Resource` select inside the control panel. The extension will index and diagnose resource via corresponding paths. +제어판의 `리소스(Resource)` 드롭다운을 전환하여 예상되는 리소스를 선택하세요. 확장 프로그램은 해당 경로를 기반으로 인덱싱 및 진단을 수행합니다. -If you find that the editing json isn't hinted by the extension, please check if the activated resource contains it. +편집하려는 json 파일에 플러그인 힌트가 표시되지 않는 경우, 활성화된 리소스에 해당 파일이 포함되어 있는지 확인하세요. -> The term `definitions of task / task defs` refers to key props of task objects. +> `작업 정의(task defs)`란 작업 객체의 키 속성을 의미합니다. > -> The term `references of task / task refs` refers to values containing task name (e.g. in `next`) in other task objects. +> `작업 참조(task refs)`란 다른 작업 객체에서 작업 이름을 값으로 가질 수 있는 속성(예: `next`)을 의미합니다. -#### Query task defs / task refs +#### 작업 정의/참조 조회 -The extension supports Jump to task defs, Jump to task refs and View task defs. +확장 프로그램은 정의로 이동(Jump to definition), 참조로 이동(Jump to references), 작업 정의 보기(View task definition)를 지원합니다. -When enabling the `Maa` compatible mode, the extension will be able to parse `template task`, supporting querying task defs and task refs in conjunction with base tasks. Images that have the same name as the task will be shown when hovering the task defs. +`Maa` 호환 모드를 켜면 `템플릿 작업`을 파싱할 수 있어, 기본 클래스와 연동하여 작업 정의 및 참조를 조회할 수 있습니다. 작업 정의에 마우스를 올리면 동일한 이름의 이미지를 볼 수 있습니다. -Use `Ctrl+T` to quickly query and jump to a task definition. +`Ctrl+T` 단축키를 사용하여 작업 정의를 빠르게 조회하고 이동할 수 있습니다. -#### Query / open images +#### 이미지 조회/열기 -The extension supports open images. +이 확장 프로그램은 이미지 열기를 지원합니다. -When enabling the `Maa` compatible mode, the extension will be able to recursively search for the image. +`Maa` 호환 모드를 켜면 이미지 경로에 대한 재귀적 검색을 허용합니다. -#### Task completion +#### 작업 자동 완성 -The extension supports autocompletion according to all known tasks. +확장 프로그램은 알려진 모든 작업을 기반으로 자동 완성을 지원합니다. -When enabling the `Maa` compatible mode, typing `@` will trigger completion. +`Maa` 호환 모드를 켜면 `@`를 입력하여 완성을 트리거할 수 있습니다. -#### Image path completion +#### 이미지 경로 자동 완성 -The extension supports autocompletion according to the path of all known images. +확장 프로그램은 알려진 모든 이미지 경로를 기반으로 자동 완성을 지원합니다. -When enabling the `Maa` compatible mode, the extension will be able to recursively search for the image. +`Maa` 호환 모드를 켜면 이미지 경로에 대한 재귀적 검색을 허용합니다. -#### Check tasks / image paths +#### 작업/이미지 경로 유효성 검사 -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. +- 중복된 작업 정의가 있는지 확인 +- 알 수 없는 작업 참조가 있는지 확인 +- 알 수 없는 이미지 참조가 있는지 확인 +- 단일 작업 내에 중복된 작업 참조가 있는지 확인 -#### Multiple paths resource support +#### 다중 경로 리소스 지원 -The extension supports resource with multiple paths. The extension will perform logical overlapping according to specified order, thus content loaded later can reference content loaded earlier. +확장 프로그램은 리소스가 여러 경로를 포함하는 것을 지원하며, 지정된 순서대로 논리적 덮어쓰기를 수행합니다. 즉, 나중에 로드된 콘텐츠가 이전에 로드된 콘텐츠를 참조할 수 있습니다. -### Evaluate Task / Tsak List Expression (Only Maa) +### 작업 계산 / 작업 목록 표현식 (Maa 전용) -Evaluating the expanded task object and the sources of each properties, and the result of the task list expression via the control panel. +제어판을 통해 실제 확장된 작업 내용과 각 항목의 출처를 계산할 수 있으며, 작업 목록 표현식의 확장 결과도 계산할 수 있습니다. -### MaaPiCli feature (Only MaaFramework projects) +### MaaPiCli 기능 (MaaFramework 프로젝트 전용) -Scanning and selecting controllers, selecting resource, adding and manipulating tasks, and launching tasks can be done via the control panel. +제어판을 통해 컨트롤러를 스캔 및 선택하고, 리소스를 선택하고, 작업을 추가 및 관리하고, 작업을 실행할 수 있습니다. -### Take screenshots and crop images +### 스크린샷 캡처 및 자르기 -Searching and launching `Maa: open crop tool` inside VSCode command panel can open `Screenshots / Crop` panel. +VSCode 명령 팔레트에서 `Maa: 스크린샷 도구 열기(Maa: open crop tool)`를 검색하고 실행하여 `스크린샷 / 자르기(Screenshots / Crop)` 패널을 열 수 있습니다. -> Use `Ctrl+Shift+P` (`Command+Shift+P` on MacOS) to open command panel +> `Ctrl+Shift+P` (MacOS의 경우 `Command+Shift+P`)를 사용하여 명령 팔레트를 엽니다. -- 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 -- Use `Copy` button to copy the ROI as an array to the clipboard. -- Click `Tool` button to open the recognition tool panel, where you can directly test recognition on the current image. +- 컨트롤러를 선택하고 연결한 후 `스크린샷(Screencap)` 버튼을 사용하여 직접 스크린샷을 얻을 수 있습니다. +- `업로드(Upload)` 버튼을 사용하여 수동으로 이미지를 업로드할 수 있습니다. +- `Ctrl` 키를 누른 상태에서 자를 영역을 선택합니다. +- 휠을 사용하여 확대/축소할 수 있습니다. +- 자르기가 완료되면 `다운로드(Download)` 버튼을 사용하여 활성 리소스의 최상위 이미지 디렉터리에 자르기 결과를 자동으로 저장할 수 있습니다. +- `복사(Copy)` 버튼을 사용하여 ROI를 배열 형태로 클립보드에 복사할 수 있습니다. +- `도구(Tool)` 버튼을 누르면 인식 도구 패널이 열리며, 현재 이미지에 대해 직접 인식 테스트를 수행할 수 있습니다. ::: warning -If OCR recognition returns an empty result, please check whether the [OCR model](https://github.com/MaaXYZ/MaaFramework/blob/main/docs/en_us/1.1-QuickStarted.md#text-recognition-model-files) is configured correctly. +(MaaFramework 프로젝트 전용) + +OCR 인식 결과가 비어 있다면 [OCR 모델](https://github.com/MaaXYZ/MaaFramework/blob/main/docs/en_us/1.1-QuickStarted.md#text-recognition-model-files)이 올바르게 구성되었는지 확인하세요. ::: -### Log View +### 로그 보기 기능 -#### MaaFramework Log +#### MaaFramework 로그 -Search and execute `Maa: open maa log` in the VSCode command panel to view the `maa.log` generated during debugging. +VSCode 명령 팔레트에서 `Maa: maa 로그 열기(Maa: open maa log)`를 검색하고 실행하여 디버깅 중에 생성된 `maa.log` 로그를 볼 수 있습니다. -#### Maa Pipeline Support Extension Log +#### Maa Pipeline Support 확장 로그 -Search and execute `Maa: open extension log` in the VSCode command panel to view the `mse.log` generated during debugging. +VSCode 명령 팔레트에서 `Maa: 확장 로그 열기(Maa: open extension log)`를 검색하고 실행하여 디버깅 중에 생성된 `mse.log` 로그를 볼 수 있습니다. -### Bottom status bar +### 하단 상태 표시줄 -#### MaaSupport \[Extension Version\] +#### MaaSupport [확장 버전] -Click to reveal control panel +클릭하여 제어판으로 포커스를 이동합니다. -#### MaaFramework [MaaFw Version] +#### MaaFramework [MaaFw 버전] -Click to switch `MaaFramework` version used by the extension. The selectable versions are limited to those supported by the current extension. If the version you need is not in the list, please consider changing the extension version. +클릭하여 확장 프로그램에서 사용하는 `MaaFramework` 버전을 전환합니다. 선택할 수 있는 버전은 현재 확장 프로그램이 지원하는 버전으로 제한되며, 필요한 버전이 목록에 없으면 확장 프로그램 버전을 변경하는 것을 고려하세요. diff --git a/docs/ko-kr/manual/cli/config.md b/docs/ko-kr/manual/cli/config.md index ebec1f6f57..e073b48d0d 100644 --- a/docs/ko-kr/manual/cli/config.md +++ b/docs/ko-kr/manual/cli/config.md @@ -11,7 +11,7 @@ maa-cli 설정 파일은 특정 설정 경로에 위치하며, `maa dir config` 모든 설정 파일은 TOML, YAML 또는 JSON 형식을 사용할 수 있으며, 아래 예시에서는 TOML 형식을 사용하고 파일 확장자는 `.toml`을 사용하겠습니다. 하지만 파일 확장자가 올바르면 이 세 가지 형식을 혼합해서 사용할 수 있습니다. -또한 일부 작업은 `filename`을 매개변수로 받아들이며, 상대 경로를 사용할 경우 설정 경로의 해당 하위 경로를 기준으로 합니다. 예를 들어, 사용자 정의 기반 시설 계획 파일의 상대 경로는 `$MAA_CONFIG_DIR/infrast`를 기준으로 해야 하고, 보안 파견 작업 파일은 `$MAA_CONFIG_DIR/ssscopilot`를 기준으로 해야 합니다. +또한 일부 작업은 `filename`을 매개변수로 받아들이며, 상대 경로를 사용할 경우 설정 경로의 해당 하위 경로를 기준으로 합니다. 예를 들어, 사용자 정의 기반시설 계획 파일의 상대 경로는 `$MAA_CONFIG_DIR/infrast`를 기준으로 해야 하고, 보안 파견 작업 파일은 `$MAA_CONFIG_DIR/ssscopilot`를 기준으로 해야 합니다. ## 사용자 정의 작업 @@ -36,14 +36,14 @@ params = { client_type = "Official", start_game_enabled = true } # 해당 작업 ```toml [[tasks]] -name = "기반 시설 교대" +name = "기반시설 교대" type = "Infrast" [tasks.params] mode = 10000 facility = ["Trade", "Reception", "Mfg", "Control", "Power", "Office", "Dorm"] dorm_trust_enabled = true -filename = "normal.json" # 사용자 정의 기반 시설 계획 파일 이름은 `$MAA_CONFIG_DIR/infrast`에 있어야 합니다. +filename = "normal.json" # 사용자 정의 기반시설 계획 파일 이름은 `$MAA_CONFIG_DIR/infrast`에 있어야 합니다. # 18:00:00부터 다음 날 04:00:00까지 계획 0, 12:00:00 이전에는 계획 1, 그 이후에는 계획 2 사용 [[tasks.variants]] @@ -61,7 +61,7 @@ params = { plan_index = 2 } `condition` 필드는 어떤 변형이 사용될지를 결정하는 데 사용되며, 일치하는 변형의 `params` 필드는 작업의 매개변수에 합쳐집니다. -**주의**: 사용자 정의 기반 시설 계획 파일이 상대 경로를 사용하는 경우, `$MAA_CONFIG_DIR/infrast`를 기준으로 해야 합니다. 또한, 기반 시설 파일은 maa-cli가 아닌 MaaCore가 읽기 때문에 해당 파일 형식은 반드시 JSON이어야 합니다. maa-cli는 기반 시설 파일을 읽지 않으며, 파일에 정의된 시간대에 따라 적절한 서브 계획을 선택하지 않습니다. 따라서 `condition` 필드를 통해 적절한 시간대에 올바른 기반 시설 계획의 `plan_index` 매개변수를 지정해야 합니다. 이렇게 하면 적절한 시간대에 올바른 기반 시설 계획이 사용될 수 있습니다. +**주의**: 사용자 정의 기반시설 계획 파일이 상대 경로를 사용하는 경우, `$MAA_CONFIG_DIR/infrast`를 기준으로 해야 합니다. 또한, 기반시설 파일은 maa-cli가 아닌 MaaCore가 읽기 때문에 해당 파일 형식은 반드시 JSON이어야 합니다. maa-cli는 기반시설 파일을 읽지 않으며, 파일에 정의된 시간대에 따라 적절한 서브 계획을 선택하지 않습니다. 따라서 `condition` 필드를 통해 적절한 시간대에 올바른 기반시설 계획의 `plan_index` 매개변수를 지정해야 합니다. 이렇게 하면 적절한 시간대에 올바른 기반시설 계획이 사용될 수 있습니다. `Time` 조건 외에도 `DateTime`, `Weekday`, `DayMod` 조건이 있습니다. `DateTime` 조건은 특정 시간대를 지정하는 데 사용되고, `Weekday` 조건은 일주일 중 특정 요일을 지정하는 데 사용됩니다. `DayMod`는 사용자 정의 주기의 특정 일을 지정하는 데 사용됩니다. @@ -89,11 +89,11 @@ params = { stage = "1-7" } 위의 특정 조건 외에도, `OnSideStory`라는 조건이 있으며, 이 조건을 활성화하면 maa-cli는 해당 리소스를 읽어 현재 이벤트가 진행 중인지 판단합니다. 만약 진행 중인 이벤트가 있으면 해당 변형이 일치하게 됩니다. 예를 들어, 여름 이벤트 기간 동안 SL-8 파밍을 위한 조건은 `{ type = "OnSideStory", client = "Official" }`로 간단히 할 수 있습니다. 여기서 `client` 매개변수는 사용 중인 클라이언트를 나타내며, 각 클라이언트의 이벤트 시간은 다릅니다. 공식 서버나 b 서버를 사용하는 경우 이 매개변수를 생략할 수 있습니다. 이 조건을 통해 매번 이벤트가 업데이트될 때마다 이벤트의 열림 시간을 수동으로 수정할 필요 없이 해당 이벤트의 스테이지만 업데이트하면 됩니다. 위의 기본 조건 외에도 `{ type = "And", conditions = [...] }`, `{ type = "Or", conditions = [...] }`, `{ type = "Not", condition = ... }`를 사용하여 조건을 논리적으로 결합할 수 있습니다. -여러 날에 걸친 기반 시설 교대를 원하는 사용자는 `DayMod`와 `Time`을 조합하여 여러 날에 걸친 교대를 설정할 수 있습니다. 예를 들어, 매 이틀마다 6번 교대를 원한다면 다음과 같이 작성할 수 있습니다: +여러 날에 걸친 기반시설 교대를 원하는 사용자는 `DayMod`와 `Time`을 조합하여 여러 날에 걸친 교대를 설정할 수 있습니다. 예를 들어, 매 이틀마다 6번 교대를 원한다면 다음과 같이 작성할 수 있습니다: ```toml [[tasks]] -name = "기반 시설 교대 (2일 6교대)" +name = "기반시설 교대 (2일 6교대)" type = "Infrast" [tasks.params] @@ -265,10 +265,13 @@ params = { stage = "CE-6" } [tasks.variants.params.stage] default = "1-7" # 기본 스테이지, 선택 사항 (기본값이 없으면 빈 값 입력 시 다시 입력하라는 메시지가 표시됨) description = "싸울 스테이지" # 설명, 선택 사항 + +# 입력한 스테이지가 1-7일 때 이성 회복제 수량 입력 필요 [tasks.variants.params.medicine] -# 의존 매개변수, 키는 매개변수 이름, 값은 의존 매개변수의 예상 값 -# 설정 시 모든 의존 매개변수가 예상 값을 만족할 때만 이 매개변수를 입력해야 함 -deps = { stage = "1-7" } +# 매개변수는 조건부 매개변수로 설정할 수 있으며, 조건이 충족될 때만 입력이 필요합니다. +# conditions 필드는 테이블로, 키는 동일 레벨의 다른 매개변수 이름이고 값은 예상 값입니다. +# 여기서 조건은 stage가 1-7인 경우입니다. 여러 조건이 있는 경우 모든 조건이 충족되어야 합니다. +conditions = { stage = "1-7" } default = 1000 description = "사용할 이성 회복제" ``` @@ -330,7 +333,13 @@ address = "127.0.0.1:7777" # 필요 시 사전 설정된 주소를 재정의할 현재 `MuMuPro` 한 가지 에뮬레이터만 사전 설정이 있으며, 다른 일반적인 에뮬레이터의 사전 설정을 추가하고 싶다면 issue나 PR을 제출하세요. -여기에는 `PlayCover`라는 특수한 사전 설정이 있으며, 이는 macOS에서 `PlayCover`를 통해 네이티브로 실행되는 게임 클라이언트에 연결하는 데 사용됩니다. 이 경우 `adb_path`를 지정할 필요가 없으며, `address`는 `adb` 연결 주소가 아닌 `PlayTools`의 주소입니다. 자세한 내용은 [PlayCover 지원 문서][playcover-doc]를 참고하세요. +#### 특수 프리셋 + +현재 `PlayCover (MacOS)`, `Waydroid (Linux)` 두 가지 특수 프리셋이 사전 구성되어 있습니다. + +- `PlayCover`는 macOS에서 `PlayCover`를 통해 네이티브로 실행되는 게임 클라이언트에 연결하는 데 사용됩니다. 이 경우 `adb_path`를 지정할 필요가 없으며, `address`는 `adb` 연결 주소가 아닌 `PlayTools`의 주소입니다. 자세한 내용은 [PlayCover 지원 문서][playcover-doc]를 참고하세요. + +- `Waydroid`는 Linux에서 `Waydroid`를 통해 네이티브로 실행되는 게임 클라이언트에 연결하는 데 사용됩니다. 이 경우에도 `adb_path`를 지정해야 합니다. 자세한 내용은 [Waydroid 지원 문서][waydroid-doc]를 참고하세요. ### 리소스 설정 @@ -404,25 +413,34 @@ auto_update = true # 각 작업 실행 시 리소스를 자동 업데이트할 warn_on_update_failure = true # 업데이트 실패 시 오류를 바로 보고하지 않고 경고를 발행할지 여부 backend = "libgit2" # 리소스 핫 업데이트 백엔드, 가능한 값은 "git" 또는 "libgit2", 기본값은 "git" +# 리소스 핫 업데이트 원격 저장소 관련 설정 [resource.remote] -branch = "main" # 원격 저장소의 브랜치, 기본값은 "main"입니다. -# 원격 리소스 저장소의 URL, 기본 URL을 사용하려면 비워 두세요. -url = "git@github.com:MaaAssistantArknights/MaaResource.git" -# ssh를 사용하려면 인증 방식을 구성해야 하며, "ssh-agent" 또는 "ssh-key" 중 하나를 사용할 수 있습니다. -# ssh-agent를 사용하려면 `use_ssh_agent`를 true로 설정하고, `ssh_key`와 `passphrase`는 비워 두세요. -# use_ssh_agent = true # ssh-agent를 사용하여 인증 -# ssh-key를 사용하려면 `ssh_key`에 ssh 키의 경로를 설정하세요. +branch = "main" # 원격 저장소의 브랜치, 기본값은 "main" +# 원격 리소스 저장소의 URL, 비워두면 기본 URL 사용 +# GitHub 저장소는 HTTPS와 SSH 두 가지 프로토콜을 지원하며, HTTPS 프로토콜 사용을 권장합니다. 별도의 설정이 필요 없기 때문입니다. +url = "https://github.com/MaaAssistantArknights/MaaResource.git" +# url = "git@github.com:MaaAssistantArknights/MaaResource.git" +# SSH 프로토콜을 사용해야 하는 경우, SSH 키를 제공해야 합니다. 가장 간단한 방법은 키의 경로를 제공하는 것입니다. ssh_key = "~/.ssh/id_ed25519" # ssh 키의 경로 -# ssh 키가 암호화된 경우, 암호를 입력해야 합니다. +# maa는 기본적으로 암호화되지 않은 키를 사용합니다. 키가 암호로 보호된 경우, 키를 복호화할 암호를 제공해야 합니다. +# 주의: libgit2 백엔드를 사용할 때만 maa가 암호를 libgit2에 전달합니다. +# git 백엔드를 사용할 때는 git이 직접 암호를 요청합니다. +# git 백엔드를 사용하고 키가 암호로 보호된 경우, ssh-agent를 사용하여 키를 관리하세요. passphrase = "password" # ssh 키의 암호 -# 설정 파일에 평문 암호를 저장하는 것은 안전하지 않으므로 이를 방지하기 위한 방법이 있습니다. +# 그러나 설정 파일에 평문 암호를 저장하는 것은 안전하지 않으므로, 이를 피하는 몇 가지 방법이 있습니다. # 1. `passphrase`를 true로 설정하면, maa-cli가 매번 암호를 입력하라고 요청합니다. +# 이 방법은 안전하지만 번거롭고 batch 모드에서는 사용할 수 없습니다. # passphrase = true # 2. `passphrase`를 환경 변수 이름으로 설정하면, maa-cli는 해당 환경 변수를 암호로 사용합니다. +# 이 방법은 평문 암호보다 안전하지만, 환경 변수는 모든 프로그램에서 접근할 수 있으므로 여전히 위험이 있습니다. # passphrase = { env = "MAA_SSH_PASSPHRASE" } # 3. `passphrase`를 명령어로 설정하면, maa-cli는 해당 명령어를 실행하여 암호를 가져옵니다. -# 이는 암호 관리자를 사용하여 암호를 관리할 때 매우 유용합니다. +# 암호 관리자를 사용하여 암호를 관리한다면, 이 방법이 가장 안전하고 편리할 수 있습니다. # passphrase = { cmd = ["pass", "show", "ssh/id_ed25519"] } +# 4. ssh-agent를 사용하여 키를 관리, **권장** +# ssh-agent는 키를 메모리에 저장하므로 매번 암호를 입력할 필요가 없습니다. +# 주의: ssh-agent가 시작되어 있고 키가 추가되어 있어야 하며, SSH_AUTH_SOCK 환경 변수가 설정되어 있어야 합니다. +# use_ssh_agent = true # ssh-agent를 사용하여 인증, true로 설정하면 ssh_key와 passphrase 필드가 무시됩니다. ``` **주의사항**: @@ -450,6 +468,7 @@ passphrase = "password" # ssh 키의 암호 [task-types]: ../../protocol/integration.md#작업-유형-목록 [emulator-ports]: ../../manual/connection.md#포트-번호-입력 [playcover-doc]: ../../manual/device/macos.md#✅-playcover-제일-부드럽습니다-🚀 +[waydroid-doc]: ../../manual/device/linux.md#✅-waydroid [example-config]: https://github.com/MaaAssistantArknights/maa-cli/blob/main/crates/maa-cli/config_examples [wangl-cc-dotfiles]: https://github.com/wangl-cc/dotfiles/tree/main/home/dot_config/maa [schema-dir]: https://github.com/MaaAssistantArknights/maa-cli/blob/main/crates/maa-cli/schemas/ diff --git a/docs/ko-kr/manual/cli/usage.md b/docs/ko-kr/manual/cli/usage.md index 3c08e0df96..34b184fd58 100644 --- a/docs/ko-kr/manual/cli/usage.md +++ b/docs/ko-kr/manual/cli/usage.md @@ -47,7 +47,7 @@ MaaCore의 설치 및 구성을 완료하면 작업을 실행할 준비가 된 - `maa startup [client]`: 게임을 시작하고 메인 화면으로 이동합니다. `[client]`는 클라이언트 유형이며, 생략하면 게임 클라이언트를 시작하지 않습니다. - `maa closedown [client]`: 게임 클라이언트를 종료합니다. `[client]`는 클라이언트 유형이며, 기본값은 `Official`입니다. - `maa fight [stage]`: 전투 작업을 실행합니다. `[stage]`는 스테이지 이름이며, 예를 들어 `1-7`입니다. 생략하면 이전 또는 현재 스테이지를 선택합니다. -- `maa copilot ...`: 자동 전투 작업을 실행합니다. ``는 작업의 URI이며, 여러 URI는 순차적으로 실행됩니다. `maa_uri`는 `maa://1234` 또는 로컬 파일 경로 `./1234.json`일 수 있습니다. +- `maa copilot ...`: 자동지휘 작업을 실행합니다. ``는 작업의 URI이며, 여러 URI는 순차적으로 실행됩니다. `maa_uri`는 `maa://1234` 또는 로컬 파일 경로 `./1234.json`일 수 있습니다. - `maa sscopilot `: 자동 보안 파견을 실행합니다. ``는 보안 파견 작업의 URI입니다. - `maa roguelike `: 자동 통합 전략을 실행합니다. ``는 통합 전략의 주제이며, 선택 가능한 값은 `Phantom`, `Mizuki`, `Sami`, `Sarkaz`, `JieGarden`입니다. - `maa reclamation `: 자동 생활 게임을 실행합니다. ``는 생활 게임의 주제이며, 현재 사용 가능한 값은 `Tales`입니다. @@ -96,7 +96,7 @@ maa-cli는 기본적으로 표준 오류(stderr)에 로그를 출력합니다. ` - `maa cleanup`: `maa-cli` 및 `MaaCore`의 캐시를 정리합니다. - `maa import [-t ]:` 설정 파일을 가져옵니다. `file`은 설정 파일의 경로입니다. `-t` 옵션을 통해 설정 파일의 유형(`cli`, `profile`, `infrast` 등)을 지정할 수 있습니다. -더 많은 명령어 사용 방법은 `maa help`를 통해 확인할 수 있으며, 특정 명령어의 사용 방법은 `maa help 를 통해 확인할 수 있습니다. +더 많은 명령어 사용 방법은 `maa help`를 통해 확인할 수 있으며, 특정 명령어의 사용 방법은 `maa help `를 통해 확인할 수 있습니다. [config-core]: config.md#maacore-관련-설정 [custom-task]: config.md#사용자-정의-작업 diff --git a/docs/ko-kr/manual/connection.md b/docs/ko-kr/manual/connection.md index ffe073297d..40179ed3fe 100644 --- a/docs/ko-kr/manual/connection.md +++ b/docs/ko-kr/manual/connection.md @@ -24,6 +24,7 @@ MAA v5.22.3까지 지원하는 감지 가능한 에뮬레이터 및 연결 주 :::info 기술적 정보 자동 감지는 에뮬레이터의 ADB를 사용하지만, 자동 감지에 문제가 있을 경우 수동 설정이 필요합니다. `ADB 강제 교체`는 구글이 제공하는 ADB를 다운로드한 후 교체하는 것으로, 구글 ADB를 설정하면 한 번만 설정해두면 됩니다. +환경 변수에 사용 가능한 ADB가 존재할 경우, `adb`라고 직접 입력해도 됩니다. ::: ### 에뮬레이터에서 제공하는 ADB 사용 @@ -55,7 +56,7 @@ MAA 폴더에 직접 압축을 푸는 것을 권장합니다. 그러면 ADB 경 - [Bluestacks 5](https://support.bluestacks.com/hc/ko/articles/360061342631-%EB%B8%94%EB%A3%A8%EC%8A%A4%ED%83%9D4-%EB%B8%94%EB%A3%A8%EC%8A%A4%ED%83%9D5%EB%A1%9C-%EC%95%B1-%EC%A0%84%EC%86%A1%ED%95%98%EA%B8%B0) `5555` - [MuMu](https://mumu.163.com/help/20240807/40912_1073151.html?maa) `16384` - [MuMu Pro](https://mumu.163.com/mac/function/20240126/40028_1134600.html) `16384` -- [LDPlayer 9](https://help.ldmnq.com/docs/LD9adbserver) `emulator-5554` +- [LDPlayer 9](https://help.ldmnq.com/docs/LD9adbserver#edc3863750608062bcb3feea256413dc) `emulator-5554` - [逍遥(Xiaoyao)](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `21503` - [夜神(Yeshen)](https://support.yeshen.com/zh-CN/qt/ml) `62001` @@ -106,60 +107,66 @@ MAA 폴더에 직접 압축을 푸는 것을 권장합니다. 그러면 ADB 경 일반적으로 이렇게 설정하면 연결됩니다. 연결되지 않는 경우, 여러 에뮬레이터 코어가 존재하거나 문제가 발생한 것입니다. 아래의 추가 설정을 읽어보세요. -#### `Bluestacks.Config.Keyword` 지정 +:::: steps -::: info 주의 -멀티 인스턴스 기능을 활성화했거나 여러 에뮬레이터 코어를 설치한 경우, 사용 중인 에뮬레이터 번호를 지정해야 합니다. -::: +1. `Bluestacks.Config.Keyword` 지정 -`.\config\gui.json`에서 `Bluestacks.Config.Keyword` 필드를 검색합니다. 내용은 `"bst.instance.<에뮬레이터 번호>.status.adb_port"`입니다. 에뮬레이터 번호는 에뮬레이터 경로의 `BlueStacks_nxt\Engine`에서 확인할 수 있습니다. + ::: info 주의 + 멀티 인스턴스 기능을 활성화했거나 여러 에뮬레이터 코어를 설치한 경우, 사용 중인 에뮬레이터 번호를 지정해야 합니다. + ::: -::: details 예시 -Nougat64 코어: + `.\config\gui.json`에서 `Bluestacks.Config.Keyword` 필드를 검색합니다. 내용은 `"bst.instance.<에뮬레이터 번호>.status.adb_port"`입니다. 에뮬레이터 번호는 에뮬레이터 경로의 `BlueStacks_nxt\Engine`에서 확인할 수 있습니다. -```json -"Bluestacks.Config.Keyword":"bst.instance.Nougat64.status.adb_port", -``` + ::: details 예시 + Nougat64 코어: -Pie64_2 코어:(코어 이름 뒤의 숫자는 멀티 인스턴스 코어를 나타냅니다) + ```json + "Bluestacks.Config.Keyword":"bst.instance.Nougat64.status.adb_port", + ``` -```json -"Bluestacks.Config.Keyword": "bst.instance.Pie64_2.status.adb_port", -``` + Pie64_2 코어:(코어 이름 뒤의 숫자는 멀티 인스턴스 코어를 나타냅니다) -::: + ```json + "Bluestacks.Config.Keyword": "bst.instance.Pie64_2.status.adb_port", + ``` -#### `Bluestacks.Config.Path` 지정 + ::: -::: info 주의 -MAA는 이제 레지스트리에서 `bluestacks.conf`의 저장 위치를 읽어오려고 시도합니다. 이 기능이 작동하지 않을 경우 수동으로 구성 파일 경로를 지정해야 합니다. -::: +2. `Bluestacks.Config.Path` 지정 -1. 블루스택 데이터 디렉토리에서 `bluestacks.conf` 파일을 찾습니다. - - 글로벌 버전 `C:\ProgramData\BlueStacks_nxt\bluestacks.conf` - - 중국 내륙 버전 `C:\ProgramData\BlueStacks_nxt_cn\bluestacks.conf` + ::: info 주의 + MAA는 이제 레지스트리에서 `bluestacks.conf`의 저장 위치를 읽어오려고 시도합니다. 이 기능이 작동하지 않을 경우 수동으로 구성 파일 경로를 지정해야 합니다. + ::: + 1. 블루스택 데이터 디렉토리에서 `bluestacks.conf` 파일을 찾습니다. + - 글로벌 버전 `C:\ProgramData\BlueStacks_nxt\bluestacks.conf` + - 중국 내륙 버전 `C:\ProgramData\BlueStacks_nxt_cn\bluestacks.conf` - 참고: `C:\ProgramData`는 숨겨진 디렉터리입니다. 필요한 경우, 파일 탐색기의 주소 표시줄에 이 주소를 직접 붙여넣어 접근하세요. + 참고: `C:\ProgramData`는 숨겨진 디렉터리입니다. 필요한 경우, 파일 탐색기의 주소 표시줄에 이 주소를 직접 붙여넣어 접근하세요. -2. 처음 사용하는 경우, MAA를 한 번 실행하여 MAA가 자동으로 구성 파일을 생성하게 합니다. + 2. 처음 사용하는 경우, MAA를 한 번 실행하여 MAA가 자동으로 구성 파일을 생성하게 합니다. + 3. **MAA를 종료**한 후, `gui.json`을 열어 `Configurations` 아래의 현재 구성 이름 필드를 찾습니다(설정-구성 전환에서 확인할 수 있으며, 기본값은 `Default`입니다). 그 안에서 `Bluestacks.Config.Path` 필드를 찾아 `bluestacks.conf`의 전체 경로를 입력합니다. (슬래시를 이스케이프 `\\`해서 사용해야 합니다.) -3. **MAA를 종료**한 후, `gui.json`을 열어 `Configurations` 아래의 현재 구성 이름 필드를 찾습니다(설정-구성 전환에서 확인할 수 있으며, 기본값은 `Default`입니다). 그 안에서 `Bluestacks.Config.Path` 필드를 찾아 `bluestacks.conf`의 전체 경로를 입력합니다. (슬래시를 이스케이프 `\\`해서 사용해야 합니다.) + ::: details 예시 + `C:\ProgramData\BlueStacks_nxt\bluestacks.conf` 경로 예시 -::: details 예시 -`C:\ProgramData\BlueStacks_nxt\bluestacks.conf` 경로 예시 + ```json + { + "Configurations": { + "Default": { + "Bluestacks.Config.Path": "C:\\ProgramData\\BlueStacks_nxt\\bluestacks.conf" + // 다른 구성 필드, 수동으로 입력하지 마세요. + } + } + } + ``` -```json -{ - "Configurations": { - "Default": { - "Bluestacks.Config.Path": "C:\\ProgramData\\BlueStacks_nxt\\bluestacks.conf" - // 다른 구성 필드, 수동으로 입력하지 마세요. - } - } -} -``` + ::: -::: +3. MAA로 돌아가서 테스트 + + `설정-실행 설정`에서 `스크린샷 테스트` 기능을 사용하여 예상한 에뮬레이터 코어에 연결되었는지 확인할 수 있습니다. + +:::: ## 연결 구성 @@ -179,7 +186,7 @@ MAA는 이제 레지스트리에서 `bluestacks.conf`의 저장 위치를 읽어 ### LD 스크린샷 향상 모드 -현재 중국판 LD Player 9 V9.1.32 이상 버전만 지원됩니다. 명일방주 에디션은 현재 지원되지 않습니다. +공식 또는 국제판(International) LD Player 9 V9.1.32 이상 버전이 지원됩니다. 1. 설정 → 연결 설정에서 `LD의 스크린샷 향상 모드 활성화`를 켭니다. 체크할 경우 MAA는 레지스트리를 통해 설치 경로를 자동으로 입력하려고 시도합니다. diff --git a/docs/ko-kr/manual/device/linux.md b/docs/ko-kr/manual/device/linux.md index 7fd22f9de7..d7d686cd16 100644 --- a/docs/ko-kr/manual/device/linux.md +++ b/docs/ko-kr/manual/device/linux.md @@ -56,51 +56,52 @@ MAA Wine Bridge에서 생성된 `MaaDesktopIntegration.so`를 `MAA.exe`와 같 ### Python 사용 -#### 1. MAA 동적 라이브러리 설치 +:::: steps -1. [MAA 공식 웹사이트](https://maa.plus/)에서 리눅스 라이브러리를 다운로드하고 압축을 풉니다. 혹은 소프트웨어 저장소에서 설치합니다: - - AUR:[maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights)을 설치한 후에 설치 지침에 따라 파일을 편집합니다. - - Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix) +1. MAA 동적 라이브러리 설치 + 1. [MAA 공식 웹사이트](https://maa.plus/)에서 Linux 동적 라이브러리를 다운로드하고 압축을 풀거나 소프트웨어 저장소에서 설치합니다: + - AUR:[maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights)을 설치한 후에 설치 지침에 따라 파일을 편집합니다. + - Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix) + 2. `./MAA-v{버전}-linux-{아키텍처}/Python/` 디렉토리로 이동하여 `sample.py` 파일을 엽니다. -2. `./MAA-v{버전}-linux-{아키텍처}/Python/` 폴더로 이동하여 `sample.py` 파일을 엽니다. + ::: tip + 사전 컴파일된 버전은 상대적으로 최신 버전의 Linux 배포판 (Ubuntu 22.04)에서 컴파일된 동적 라이브러리를 포함하고 있습니다. 시스템의 libstdc++ 버전이 오래되면 ABI 호환성 문제가 발생할 수 있습니다. + [Linux 컴파일 가이드](../../develop/linux-tutorial.md)를 참조하여 다시 컴파일하거나 컨테이너를 사용할 수 있습니다. + ::: -::: tip -사전 컴파일된 버전은 상대적으로 최신 버전의 리눅스 배포판 (Ubuntu 22.04)에서 컴파일된 동적 라이브러리를 포함하고 있습니다. 시스템의 libstdc++ 버전이 오래되어 ABI 호환성 문제가 발생할 수 있습니다. [Linux 컴파일 가이드](../../develop/linux-tutorial.md)를 참조하여 다시 컴파일하거나 컨테이너를 실행할 수 있습니다. -::: +2. ADB 구성 + 1. [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/b4fc3528decd6777441a8aca684c22d35d2b2574/src/Python/sample.py#L62) 줄을 찾습니다. + 2. ADB 도구 호출 + - 에뮬레이터가 `Android Studio`의 `avd`를 사용하는 경우 ADB가 내장되어 있습니다. `adb.exe` 필드에 ADB 경로를 입력합니다. 일반적으로 `$HOME/Android/Sdk/platform-tools/` 폴더에서 찾을 수 있습니다. 예시: -#### 2. `adb` 구성 + ```python + if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "에뮬레이터의 ADB 주소"): + ``` -1. [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L48) 줄을 찾습니다. + - 다른 에뮬레이터를 사용하는 경우 먼저 ADB를 다운로드해야 합니다: `$ sudo apt install adb` 후 경로를 입력하거나 `PATH` 환경 변수를 사용하여 `adb`를 입력합니다. -2. `adb` 도구 호출 - - 에뮬레이터가 `Android Studio`의 `avd`를 사용하는 경우 `adb`가 내장되어 있습니다. `adb.exe` 필드에 `adb` 경로를 입력합니다. 일반적으로 `$HOME/Android/Sdk/platform-tools/` 폴더에 있습니다. 예시: + 3. 에뮬레이터 ADB 경로 가져오기 + - ADB 도구를 직접 사용할 수 있습니다: `$ adb경로 devices`, 예시: - ```python - if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "모바일 에뮬레이터의 adb 주소"): - ``` + ```shell + $ /home/foo/Android/Sdk/platform-tools/adb devices + List of devices attached + emulator-5554 device + ``` - - 다른 에뮬레이터를 사용하는 경우 `adb`를 먼저 다운로드해야 합니다: `$ sudo apt install adb`를 실행한 후 경로를 입력하거나 `PATH` 환경 변수를 사용하여 `adb`를 입력합니다. + - 반환된 `emulator-5554`가 에뮬레이터의 ADB 주소이므로 `127.0.0.1:5555`를 대체합니다. 예시: -3. 에뮬레이터의 `adb` 경로 확인: - - 직접 `adb` 도구를 사용할 수 있습니다: `$ adb경로 devices`를 실행하면 됩니다. 예시: + ```python + if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"): + ``` - ```shell - $ /home/foo/Android/Sdk/platform-tools/adb devices - List of devices attached - emulator-5554 device - ``` + 4. 이제 테스트할 수 있습니다: `$ python3 sample.py`를 실행하고 `연결 성공`이 반환되면 대부분 성공한 것입니다. - - 반환된 `emulator-5554`가 에뮬레이터의 `adb` 주소이므로 `127.0.0.1:5555`를 덮어씁니다. 예를 들어: +3. 작업 구성 - ```python - if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"): - ``` +사용자 정의 작업: 필요에 따라 [통합 문서](../../protocol/integration.md)를 참조하여 `sample.py`의 [`# 작업 및 매개변수는 docs/integration.md 참조`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54) 부분을 수정합니다. -4. 이제 테스트를 진행해볼 수 있습니다: `$ python3 sample.py`를 실행한 후 연결 성공이 표시되면 대부분의 작업이 완료된 것입니다. - -#### 3. 작업 설정 - -사용자 정의 작업: [통합 문서](../../protocol/integration.md)를 참조하고, `sample.py`의 # 작업 및 매개 변수는 [예제](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54)를 참조해 줄을 수정하세요. +:::: ## 모바일 에뮬레이터 지원 diff --git a/docs/ko-kr/manual/device/windows.md b/docs/ko-kr/manual/device/windows.md index 6a92abe402..4d5f3fe284 100644 --- a/docs/ko-kr/manual/device/windows.md +++ b/docs/ko-kr/manual/device/windows.md @@ -25,7 +25,7 @@ const fullySupport = [ { name: 'MuMu 에뮬레이터', link: 'https://mumu.163.com/', - note: '완전히 호환되며, [스크린샷 향상 모드](../connection.html#mumu-스크린샷-향상-모드)에 대한 추가 지원이 있습니다. Hyper-V와 호환되는 것으로 알려져 있습니다.\n\n- "완료 시 에뮬레이터 종료" 기능이 간혹 비정상적일 수 있습니다. 이런 경우 MuMu 공식 채널에 피드백을 주세요;\n- 둘 이상의 인스턴스를 열 때는 MuMu 다중 실행기의 ADB 버튼을 통해 해당 인스턴스의 포트 정보를 확인하고, MAA `설정` - `연결 설정`에서 연결 주소의 포트 번호를 해당 포트로 변경해야 합니다.\n- `메모리 사용 정책`을 `리소스 사용량 감소`로 설정하지 마십시오.', + note: '완전히 호환되며, [스크린샷 향상 모드](../connection.html#mumu-스크린샷-향상-모드)에 대한 추가 지원이 있습니다. Hyper-V와 호환되는 것으로 알려져 있습니다.\n\n- "완료 시 에뮬레이터 종료" 기능이 간혹 비정상적일 수 있습니다. 이런 경우 MuMu 공식 채널에 피드백을 주세요;\n- 둘 이상의 인스턴스를 열 때는 MuMu 다중 실행기의 ADB 버튼을 통해 해당 인스턴스의 포트 정보를 확인하고, MAA `설정` - `연결 설정`에서 연결 주소의 포트 번호를 해당 포트로 변경해야 합니다.\n- `메모리 사용 정책`을 `리소스 사용량 감소`로 설정하지 마세요.', }, { name: 'LDPlayer', @@ -37,7 +37,7 @@ const fullySupport = [ { name: 'Bluestacks 5', link: 'https://www.bluestacks.com/ko/', - note: '완전히 호환됩니다. 에뮬레이터의 `설정` - `고급 설정`에서 `ADB 기능`을 켜야 합니다. Hyper-V와 호환되는 것으로 알려져 있습니다.\n\n- 느리고 번들로 제공되는 설치를 피하기 위해 [오프라인 설치 프로그램](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer)을 다운로드하는 것이 좋습니다; [Android 11](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer#:~:text=To%20install%20BlueStacks%205%20Android%2011) 버전 설치를 권장합니다; 제거하려면 공식 [제거 도구](https://support.bluestacks.com/hc/en-us/articles/360057724751-How-to-uninstall-BlueStacks-5-BlueStacks-X-and-BlueStacks-Services-completely-from-your-PC)를 사용하여 잔여물을 제거하세요.\n- adb 포트 번호가 계속 불규칙하게 변경되고 시작할 때마다 다르다면 컴퓨터에 [Hyper-V](https://support.bluestacks.com/hc/en-us/articles/4415238471053-System-requirements-for-BlueStacks-5-on-Hyper-V-enabled-Windows-10-and-11)가 활성화되어 있기 때문일 수 있습니다. MAA는 이제 BlueStacks 에뮬레이터 구성 파일 내에서 포트 번호를 자동으로 읽으려고 시도할 것입니다. 이 방법이 작동하지 않거나 다중 실행/둘 이상의 에뮬레이터 커널이 설치된 경우 [연결 (TODO)](../faq.html#블루스택-에뮬레이터가-매번-시작될-때마다-포트-번호가-다릅니다-hyper-v)을 참조하여 변경하세요. Hyper-V는 관리자로 실행되므로 에뮬레이터 자동 종료, 자동 연결 감지 등 adb와 관련 없는 작업도 MAA를 관리자로 실행해야 합니다.', + note: '완전히 호환됩니다. 에뮬레이터의 `설정` - `고급 설정`에서 `ADB 기능`을 켜야 합니다. Hyper-V와 호환되는 것으로 알려져 있습니다.\n\n- 느리고 번들로 제공되는 설치를 피하기 위해 [오프라인 설치 프로그램](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer)을 다운로드하는 것이 좋습니다; [Android 11](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer#:~:text=To%20install%20BlueStacks%205%20Android%2011) 버전 설치를 권장합니다; 제거하려면 공식 [제거 도구](https://support.bluestacks.com/hc/en-us/articles/360057724751-How-to-uninstall-BlueStacks-5-BlueStacks-X-and-BlueStacks-Services-completely-from-your-PC)를 사용하여 잔여물을 제거하세요.\n- adb 포트 번호가 계속 불규칙하게 변경되고 시작할 때마다 다르다면 컴퓨터에 [Hyper-V](https://support.bluestacks.com/hc/en-us/articles/4415238471053-System-requirements-for-BlueStacks-5-on-Hyper-V-enabled-Windows-10-and-11)가 활성화되어 있기 때문일 수 있습니다. MAA는 이제 BlueStacks 에뮬레이터 구성 파일 내에서 포트 번호를 자동으로 읽으려고 시도할 것입니다. 이 방법이 작동하지 않거나 다중 실행/둘 이상의 에뮬레이터 커널이 설치된 경우 [연결 설정](../connection.md#bluestacks-에뮬레이터-hyper-v-포트-번호-변경)을 참조하여 변경하세요. Hyper-V는 관리자로 실행되므로 에뮬레이터 자동 종료, 자동 연결 감지 등 adb와 관련 없는 작업도 MAA를 관리자로 실행해야 합니다.', }, ...shuffleArray([ { diff --git a/docs/ko-kr/manual/faq.md b/docs/ko-kr/manual/faq.md index 2d8ff2d683..41ea99bd23 100644 --- a/docs/ko-kr/manual/faq.md +++ b/docs/ko-kr/manual/faq.md @@ -37,6 +37,14 @@ winget install "Microsoft.VCRedist.2015+.x64" --override "/repair /passive /nore 웹 페이지 오른쪽 아래에 있는 위로 ↑ 화살표를 찾아 클릭하세요. +### 시스템 문제 + +- MAA는 32비트 운영 체제를 지원하지 않으며, Windows 7 / 8 / 8.1을 지원하지 않습니다. +- 아래의 런타임 설치는 모두 구성 요소 저장소(CBS, TrustedInstaller/TiWorker, WinSxS)에 의존합니다. + 구성 요소 저장소가 손상되면 정상적으로 설치할 수 없습니다. + +운영 체제를 다시 설치하는 것 이외에 다른 수정 방법을 제공할 수 없으며, 확장 기능이나 리스크가 표시되지 않은 "정리판" 운영 체제를 사용하는 것을 피하세요. 또는 아주 오래된 구버전 시스템 사용을 피하세요. + #### Windows N/KN 관련 Windows 8/8.1/10/11 N/KN(유럽/한국) 버전을 사용하는 경우, [미디어 기능 팩](https://support.microsoft.com/ko-kr/topic/c1c6fffa-d052-8338-7a79-a4bb980a700a)을 설치해야 합니다. @@ -55,26 +63,12 @@ Windows 7의 경우, 위에서 언급한 두 개의 런타임 라이브러리를 ##### .NET 8 애플리케이션이 Windows 7에서 비정상적으로 실행되는 문제 완화 조치 [#8238](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/8238) -Windows 7에서 .NET 8 애플리케이션을 실행할 때 메모리 사용량이 비정상적으로 증가하는 문제가 있습니다. 아래의 완화 조치를 참조하십시오. Windows 8/8.1은 테스트되지 않았습니다. 동일한 문제가 있는 경우, 문서를 업데이트할 수 있도록 Issue를 제출해 주십시오. +Windows 7에서 .NET 8 애플리케이션을 실행할 때 메모리 사용량이 비정상적으로 증가하는 문제가 있습니다. 아래의 완화 조치를 참조하세요. Windows 8/8.1은 테스트되지 않았습니다. 동일한 문제가 있는 경우, 문서를 업데이트할 수 있도록 Issue를 제출해 주세요. 1. `컴퓨터`를 열고 빈 공간을 마우스 오른쪽 버튼으로 클릭하여 속성을 클릭하고, 왼쪽의 `고급 시스템 설정`을 클릭한 다음 `환경 변수`를 클릭합니다. 2. 새 시스템 변수를 만들고, 변수 이름을 `DOTNET_EnableWriteXorExecute`, 변수 값을 `0`으로 설정합니다. 3. 컴퓨터를 재시작합니다. -#### 공식 통합 패키지 (확실함) - -::: info 참고 -이 작업은 약 10GB 정도의 디스크 공간을 소비하므로 다른 방법들을 모두 시도한 후에 마지막으로 시도하세요. -::: - -[Microsoft C++ 빌드도구](https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/)를 설치하여 완전한 개발 환경을 설정하세요 (닷넷 및 C++ 개발 환경만 설치하면 됩니다). - -### 가능성 3: 시스템 구성 요소 문제 - -상기된 런타임 설치는 구성 요소 저장소(CBS, TrustedInstaller/TiWorker, WinSxS)에 의존합니다. 구성 요소 저장소가 손상되면 정상적으로 설치할 수 없습니다. - -운영 체제를 다시 설치하는 것 이외에 다른 수정 방법을 제공할 수 없으며, 확장 기능이나 리스크가 표시되지 않은 "정리판" 운영 체제를 사용하는 것을 피하세요. - ## 연결 오류 ::: tip @@ -141,17 +135,17 @@ UU 가속기와 MuMu를 동시에 사용할 경우 [공식 문서](https://mumu. - `UI 위치 조절`을 사용하는 경우 0으로 설정하세요. - 국가 별 클라이언트를 플레이하는 경우 먼저 `설정` - `게임 설정` - `클라이언트 유형`에서 `클라이언트 버전`을 선택하세요. 해외 클라이언트의 경우 일부 기능이 완전히 호환되지 않을 수 있으므로 해당 해외 클라이언트 사용 설명서를 참조하세요. -- 통합전략 기능을 사용할 경우, [사용자 설명서](./introduction/integrated-strategy.md)를 참조하고 `통합전략` - `테마`에서 올바른 테마를 선택하세요 -- 자동 전투가 자주 일시 정지되고 오퍼레이터가 배치되지 않으면 `설정` - `실행 설정`에서 `일시정지 상태로 배치하기`를 비활성화하세요. -- 자동 배치가 오퍼레이터를 제대로 인식하지 못할 경우, 해당 오퍼레이터의 즐겨찾기를 해제하세요. -- `Adb Input` 터치 모드 작업이 느린 것은 정상입니다. Copilot 기능이 필요한 경우 다른 모드로 전환해 보세요. -- MuMu 에뮬레이터를 사용하는 경우, `메모리 사용 정책`을 `리소스 사용량 최소화`로 설정하지 마십시오. +- 통합 전략 기능을 사용할 경우, [사용자 설명서](./introduction/integrated-strategy.md)를 참조하고 `통합 전략` - `테마`에서 올바른 테마를 선택하세요 +- 자동지휘가 자주 일시 정지되고 오퍼레이터가 배치되지 않으면 `설정` - `실행 설정`에서 `일시정지 상태로 배치하기`를 비활성화하세요. +- 자동 편성 시 오퍼레이터를 제대로 인식하지 못할 경우, 해당 오퍼레이터의 즐겨찾기를 해제하세요. +- `Adb Input` 터치 모드 작업이 느린 것은 정상입니다. 자동지휘 기능이 필요한 경우 다른 모드로 전환해 보세요. +- MuMu 에뮬레이터를 사용하는 경우, `메모리 사용 정책`을 `리소스 사용량 최소화`로 설정하지 마세요. ### 스크린샷 촬영이 오래 걸리거나 오랜 시간이 걸립니다 - MAA는 현재 `RawByNc`, `RawWithGzip`, `Encode` 세 가지 방법으로 스크린샷을 지원하며 평균 스크린샷 시간이 400/800보다 클 때 한 번의 메시지를 출력합니다. (한 번의 작업에서 한 번만 메시지를 출력합니다) - `설정` - `연결 설정`에서 최근 30회 스크린샷 시간의 최소/평균/최대값을 표시하며 10회마다 스크린샷이 새로 고침됩니다. -- Copilot(자동 전투) 기능은 스크린샷 시간에 크게 영향을 받습니다. +- 자동지휘 기능은 스크린샷 시간에 크게 영향을 받습니다. - 이 시간은 MAA와 관련이 없으며 컴퓨터 성능, 현재 사용률 또는 에뮬레이터에 따라 달라집니다. 백그라운드를 정리하거나 에뮬레이터를 변경하거나 컴퓨터 구성을 업그레이드하는 등의 조치를 취해보세요. ## 관리자 권한 관련 문제 @@ -167,4 +161,4 @@ UAC가 비활성화된 시스템에서는 "우클릭하여 관리자 권한으 ## 중간에 다운로드 중 "로그인"/"인증" 메시지가 표시됩니다 -브라우저 / IDM / FDM 등의 다운로드 관리자를 사용하여 파일을 다운로드하세요. **웨이더를 사용하지 마세요!** +브라우저 / IDM / FDM 등의 다운로드 관리자를 사용하여 파일을 다운로드하세요. **Xunlei(썬더)를 사용하지 마세요!** diff --git a/docs/ko-kr/manual/introduction/README.md b/docs/ko-kr/manual/introduction/README.md index 236942f402..7d814d77d2 100644 --- a/docs/ko-kr/manual/introduction/README.md +++ b/docs/ko-kr/manual/introduction/README.md @@ -1,5 +1,5 @@ --- -title: 기능 +title: 기능 소개 icon: mdi:information-outline index: false dir: diff --git a/docs/ko-kr/manual/introduction/combat.md b/docs/ko-kr/manual/introduction/combat.md index 9f200afa52..49d728e566 100644 --- a/docs/ko-kr/manual/introduction/combat.md +++ b/docs/ko-kr/manual/introduction/combat.md @@ -3,7 +3,7 @@ order: 3 icon: hugeicons:brain-02 --- -# 이성 사용 (Combat) +# 이성 사용 ## 일반 설정 diff --git a/docs/ko-kr/manual/introduction/copilot.md b/docs/ko-kr/manual/introduction/copilot.md index 845772493e..b4c6681f75 100644 --- a/docs/ko-kr/manual/introduction/copilot.md +++ b/docs/ko-kr/manual/introduction/copilot.md @@ -3,12 +3,12 @@ order: 9 icon: ph:sword-bold --- -# Copilot (자동 전투) +# 자동지휘 [prts.plus](https://prts.plus)에서 이용해 다운로드/업로드 및 제작할 수 있습니다! ::: warning -모든 자동 전투 관련 기능은 다음 전제 조건이 필요합니다. 여기에는 자동 전투와 통합전략이 포함되며 이에 국한되지 않습니다. +모든 자동지휘 관련 기능은 다음 전제 조건이 필요합니다. 여기에는 자동지휘와 통합 전략이 포함되며 이에 국한되지 않습니다. - 최소 60 프레임의 **안정적인** 게임 프레임률 - 터치 모드는 Minitouch 또는 MaaTouch @@ -17,7 +17,7 @@ icon: ph:sword-bold ## 작업 불러오기 -Copilot은 `일반/이벤트 스테이지` 및 `보안파견` 등을 지원합니다. +자동지휘는 `편성 가능한 모든 스테이지` 및 `보안파견` 등을 지원합니다. - 이 기능을 사용하려면 전투 준비 화면에서 `작전 개시` 버튼이 있는 곳에서 시작해야 합니다. 그런 다음 MAA의 `자동지휘` 칸에서 `JSON 파일`을 가져오거나 [prts.plus](https://prts.plus)와 같은 사이트에서 코드를 입력하면 됩니다. @@ -25,20 +25,22 @@ Copilot은 `일반/이벤트 스테이지` 및 `보안파견` 등을 지원합 - 자동 배치에 해당하는 오퍼레이터의 즐겨찾기를 해제해야 합니다. - `맞춤 오퍼레이터 추가`및 `신뢰도가 낮은 오퍼레이터 추가`도 할 수 있습니다. - `지원 유닛`을 사용하거나, 자동 편성이 불가능할 경우 수동 편성도 가능합니다. - - `패러독스 시뮬레이션`의 경우 `자동 편성`을 사용하면 안됩니다! 스킬을 수동 선택 후 `시뮬레이션 시작` 버튼이 있는 화면에서 실행하세요. - - `보안 파견`의 경우 자동편성이 불가능합니다! `수동 편성` 해주세요. -- `반복 횟수` 기능이 있지만 `반복 횟수` 기능을 사용할 경우, MAA는 `지원 유닛`을 자동으로 빌리는 기능은 아직 없기에 주의하세요! + - `패러독스 시뮬레이션`의 경우 `자동 편성`을 사용해서는 안 됩니다. 스킬을 수동 선택 후 `시뮬레이션 시작` 버튼이 있는 화면에서 실행하세요. + - `보안 파견`의 경우 자동편성이 불가능합니다. `수동 편성` 해주세요. +- `반복 횟수` 기능이 있지만 `반복 횟수` 기능을 사용할 경우, MAA는 `지원 유닛`을 자동으로 빌리는 기능은 아직 없기에 주의하세요. - 동일한 지역의 스테이지를 연속적으로 전투하려면, `전투 목록` 기능을 사용할 수 있습니다. - - `전투 목록 아래`의 세 가지 버튼은 왼쪽에서 부터 `폴더 가져오기`, `스테이지 추가`, `스테이지 지우기`입니다. - - 작업을 시작하려면 해당 지역의 지도 화면에서 자동 전투를 시작하세요. 이성이 부족하거나, 3성 클리어를 못한 경우 전투를 정지합니다. + - `전투 목록 아래`의 세 가지 버튼은 왼쪽에서 부터 `폴더 가져오기`, `스테이지 추가`, `스테이지 지우기`입니다. + `스테이지 추가` 우클릭은 작전 스테이지 추가이고, `스테이지 지우기` 우클릭은 선택되지 않은 스테이지만 지우기입니다. + - 작업을 가져온 후, 전투 목록 아래에 스테이지 이름이 표시됩니다. 올바른지 확인한 후 해당 스테이지를 추가하세요. 목록의 스테이지는 드래그하여 순서를 조정하고, 실행 여부를 체크할 수 있습니다. + - 작업을 시작하려면 해당 지역의 지도 화면에서 자동지휘를 시작하세요. 이성이 부족하거나, 전투 실패, 3성 클리어를 못한 경우 자동 전투 대기열을 중지합니다. - 전투 목록에 있는 스테이지는 `동일한 지역`에 있어야 합니다. (지도를 좌우로 스크롤하여 이동할 수 있어야 합니다) -- **우수한 Copilot 파일에 반드시 추천을 눌러 제작자를 격려하세요! 큰 도움이 됩니다!** +- **우수한 자동지휘 파일에 반드시 추천을 눌러 제작자를 격려해 주세요! 큰 도움이 됩니다!** ![image](/images/zh-cn/copilot-click-like.png) -## Copilot 파일 작성 +## 자동지휘 파일 작성 -- [파일 작성기](https://prts.plus/create)를 사용할 수 있고, [전투 스키마 문서](../../protocol/copilot-schema.md)를 참조할 수도 있습니다. +- [파일 작성기](https://prts.plus/create)를 사용할 수 있고, [전투 프로토콜 문서](../../protocol/copilot-schema.md)를 참조할 수도 있습니다. - 좌표를 가져오려면: - 파일 작성기에서 스테이지를 입력한 후, 왼쪽 하단에 자동으로 확대/축소 가능한 좌표 지도가 표시됩니다. 오퍼레이터 위치를 클릭하여 설정할 수 있습니다. - 스테이지를 입력하고 JSON을 내보낸 후, 시작 버튼을 누르면 MAA 폴더의 `debug\map`에 좌표 정보가 포함된 지도 스크린샷이 생성됩니다. diff --git a/docs/ko-kr/manual/introduction/infrastructure.md b/docs/ko-kr/manual/introduction/infrastructure.md index 4de96e8828..a790b6b4a0 100644 --- a/docs/ko-kr/manual/introduction/infrastructure.md +++ b/docs/ko-kr/manual/introduction/infrastructure.md @@ -26,11 +26,11 @@ icon: material-symbols:view-quilt-rounded - 제어 센터의 복잡성으로 인해서, `아미야`, `스와이어`, `켈시`, `레인보우 팀`과 기타 시간당 컨디션 +0.05 오퍼레이터만이 고려됩니다. 향후 개선될 예정입니다. - 필요한 시설 유형만 선택해 MAA가 처리하도록 할 수 있습니다. 기본값은 모두 선택되어있습니다 -## 일괄 쉬프트 +## 일괄 교대 - 게임 내 프리셋 팀 설정 후 MAA가 자동으로 순환합니다. ## 커스텀 기반시설 +- Yituliu의 [기반시설 JSON 생성기](https://ark.yituliu.cn/tools/schedule)를 참고해서 작성하세요. [기반시설 프로토콜 문서](../../protocol/base-scheduling-schema.md)도 참조할 수 있습니다. - MAA 폴더의 `/resource/custom_infrast/`에는 이론적 최대 효율의 작업 몇 개가 내장되어 있습니다. 오퍼레이터 인원 수 및 육성의 요구 사항이 매우 높기 때문에 직접 사용하는 것은 권장하지 않습니다. -- Yituliu의 JSON 생성기를 참고해서 작성하세요. [기반시설 JSON 생성기](https://ark.yituliu.cn/tools/schedule), [기반시설 프로토콜 문서](../../protocol/base-scheduling-schema.md)도 참조하세요. diff --git a/docs/ko-kr/manual/introduction/integrated-strategy.md b/docs/ko-kr/manual/introduction/integrated-strategy.md index 69bd01f450..3ef1e4c01d 100644 --- a/docs/ko-kr/manual/introduction/integrated-strategy.md +++ b/docs/ko-kr/manual/introduction/integrated-strategy.md @@ -3,19 +3,19 @@ order: 7 icon: ri:game-fill --- -# 통합전략 +# 통합 전략 -MAA는 기본적으로 가장 최신의 테마를 선택하며, `통합전략` - `일반 설정`에서 변경할 수 있습니다. +MAA는 기본적으로 가장 최신의 테마를 선택하며, `통합 전략` - `일반 설정`에서 변경할 수 있습니다. ::: warning -모든 자동 전투 관련 기능은 다음 전제 조건이 필요합니다. 여기에는 자동 전투와 통합전략이 포함되며 이에 국한되지 않습니다. +모든 자동지휘 관련 기능은 다음 전제 조건이 필요합니다. 여기에는 자동지휘와 통합 전략이 포함되며 이에 국한되지 않습니다. - 최소 60 프레임의 **안정적인** 게임 프레임률 - 터치 모드는 Minitouch 또는 MaaTouch ::: -- 게임 내에서 해당 통합전략 테마를 터미널에서 고정(`PIN`)해주세요. 현재 자동 탐색이 가능하지만 장기적인 사용을 보장할 수는 없습니다. +- 게임 내에서 해당 통합 전략 테마를 터미널에서 고정(`PIN`)해주세요. 현재 자동 탐색이 가능하지만 장기적인 사용을 보장할 수는 없습니다. - **목표가 아닌 테마**의 탐험을 미리 수동으로 종료하여 목표 테마가 현재 탐험을 시작할 수 있는지 확인하세요. - 설정에서 테마, 난이도, 분대, 시작 오퍼레이터(하나의 오퍼레이터만 가능) 등을 선택할 수 있습니다. - MAA는 지원 유닛을 사용하여 시작할 수 있습니다. 먼저 `일반 설정` → `시작 오퍼레이터`에 목표 오퍼레이터 이름을 입력하고, `고급 설정` → `「시작 오퍼레이터」로 지원 유닛 사용`을 활성화하세요. @@ -25,7 +25,7 @@ MAA는 기본적으로 가장 최신의 테마를 선택하며, `통합전략` - ## 추천 시작법 -::: details _최종 업데이트: 2025/8/30_ +::: details _최종 업데이트: 2026/01/03_ | 테마 | 난이도 | 분대 | 직업군 | 오퍼레이터 | | ------ | ----------------- | --------------------------------- | -------- | ---------- | @@ -49,9 +49,9 @@ MAA는 기본적으로 가장 최신의 테마를 선택하며, `통합전략` - ## 전투 전략 -자동 전투 중의 모든 작업은 미리 설정된 전략이며, 모든 스테이지 전투는 내장된 작업 파일을 호출합니다. 해당 스테이지의 작업이 존재하지 않을 경우, 그다지 똑똑하지 않은 일반 결정 로직이 전투에 사용됩니다. +자동지휘 중의 모든 작업은 미리 설정된 전략이며, 모든 스테이지 전투는 내장된 작업 파일을 호출합니다. 해당 스테이지의 작업이 존재하지 않을 경우, 그다지 똑똑하지 않은 일반 결정 로직이 전투에 사용됩니다. -자세한 내용은 [통합전략 스키마](../../protocol/integrated-strategy-schema.md)를 참고하세요. +자세한 내용은 [통합 전략 프로토콜](../../protocol/integrated-strategy-schema.md)을 참고하세요. - 오퍼레이터와 숙련도를 자동으로 인식하고 더 나은 오퍼레이터와 스킬을 자동으로 선택합니다. - 상점 아이템을 식별하고 더 좋은 수집품을 우선적으로 구매합니다. @@ -60,6 +60,6 @@ MAA는 기본적으로 가장 최신의 테마를 선택하며, `통합전략` - - 작업에 문제가 발생하면 현재 탐색을 자동으로 포기하고 재시도합니다. - 전투 시간이 5분을 초과하면 모든 지상 유닛이 자동으로 철수하며, 6분을 초과하면 현재 전투를 자동으로 포기하여 시간 낭비를 방지합니다. -- 간헐적인 연결 끊김이나 업데이트 후에 자동으로 재연결하고 작업을 계속하려면 '시작 웨이크업 작업'을 활성화하고 해당 시간에 강제 예약 시작을 설정하세요. +- 간헐적인 연결 끊김이나 업데이트 후에 자동으로 재연결하고 작업을 계속하려면 '로그인 작업'을 활성화하고 해당 시간에 강제 예약 시작을 설정하세요. -동일한 위치에서 여러 번 멈추는 경우, 로그와 스크린샷을 첨부하여 Issue를 제출해 주세요. +동일한 위치에서 여러 번 멈추는 경우, 로그와 `debug/Roguelike` 폴더의 스크린샷을 첨부하여 Issue를 제출해 주세요. diff --git a/docs/ko-kr/manual/introduction/reclamation-algorithm.md b/docs/ko-kr/manual/introduction/reclamation-algorithm.md index 2f04180b23..4b372551ba 100644 --- a/docs/ko-kr/manual/introduction/reclamation-algorithm.md +++ b/docs/ko-kr/manual/introduction/reclamation-algorithm.md @@ -3,19 +3,19 @@ order: 8 icon: solar:streets-map-point-linear --- -# 생존연산 +# 생존 연산 -현재 생존연산 기능은 초기 단계이며, 현재 단계에서는 안정성을 보장할 수 없습니다. +현재 생존 연산 기능은 초기 단계이며, 현재 단계에서는 안정성을 보장할 수 없습니다. ## 기본 모드 -1. 생존연산 메인화면에서 시작해야합니다 +1. 생존 연산 메인화면에서 시작해야합니다 2. 기존 데이터(진행사항)가 있으면 사용할 수 없습니다. -3. 생존연산의 편성창에 오퍼레이터가 있으면 안됩니다. +3. 생존 연산의 편성창에 오퍼레이터가 있으면 안됩니다. ## 도구 제조 모드 -1. 생존연산 주둔지가 보이는 화면에서 시작해야합니다. +1. 생존 연산 주둔지가 보이는 화면에서 시작해야합니다. 2. 제작할 도구 이름 미작성시, 기본적으로 형광봉을 만듭니다. 3. 결산 후 첫 번째 날이어야 하며, 이 후 3일 이내에 적의 침입이 없어야 합니다. 4. 제조 가능한 수량이 99의 배수일 경우 멈출 수 있습니다. 저장하기 전에 재료를 약간 사용한 후에 다시 시도하세요. diff --git a/docs/ko-kr/manual/introduction/recruit.md b/docs/ko-kr/manual/introduction/recruit.md index a890a38605..4e02341c36 100644 --- a/docs/ko-kr/manual/introduction/recruit.md +++ b/docs/ko-kr/manual/introduction/recruit.md @@ -5,11 +5,11 @@ icon: fluent:people-24-filled # 공개모집 -공개모집과 툴박스의 [공개모집 태그 인식](./tools.md#recruitment-recognition)과는 다른 기능입니다!! +공개모집과 툴박스의 [공개모집 태그 인식](./tools.md#공개모집-태그-인식)과는 다른 기능입니다!! ## 자동 공개모집 -공개모집은 `즉시 완료 허가증`을 사용하여 자동으로 연속적으로 모집합니다. Please `공개모집` - `일반 설정`으로 이동하여 자동으로 `즉시 완료 허가증을 자동 사용`을 선택하고 실행 시 최대 모집 횟수를 수정하세요. +`즉시 완료 허가증` 자동 사용을 지원하며, 1회 실행 시 `최대 모집 횟수`를 설정할 수 있습니다. `즉시 완료 허가증 자동 사용`과 연계하여 모집권을 한 번에 모두 소모할 수도 있습니다. 1★, 5★, 6★이 나오면 알림이 표시됩니다. diff --git a/docs/ko-kr/manual/introduction/rewards.md b/docs/ko-kr/manual/introduction/rewards.md index 533bee042e..d6cb6df052 100644 --- a/docs/ko-kr/manual/introduction/rewards.md +++ b/docs/ko-kr/manual/introduction/rewards.md @@ -3,7 +3,7 @@ order: 6 icon: lucide:gift --- -# 임무 +# 보상 수령 매일 보상과 매주 보상을 자동으로 수령합니다. diff --git a/docs/ko-kr/manual/introduction/startup.md b/docs/ko-kr/manual/introduction/startup.md index 97590ad287..a62340e117 100644 --- a/docs/ko-kr/manual/introduction/startup.md +++ b/docs/ko-kr/manual/introduction/startup.md @@ -7,11 +7,11 @@ icon: ic:round-rocket-launch 자동으로 에뮬레이터를 시작하고, 클라이언트를 자동으로 시작하며, 게임에 자동으로 로그인합니다. -자동으로 에뮬레이터를 시작하려면 별도의 설정이 필요합니다. 자세한 내용은 TODO를 참조하세요. +자동으로 에뮬레이터를 시작하려면 별도의 설정이 필요합니다. 자세한 내용은 `설정` - `시작 설정`을 참조하세요. ## 계정 전환 -**글로벌 서버는 해당이 안됩니다. (CN만 가능)** +**글로벌 서버는 지원하지 않습니다. (CN만 가능)** 이 기능은 설정 전환 또는 정기 실행과 함께 사용해야 하며, `로그인` 작업이 실행될 때마다 계정 전환 작업이 수행됩니다. @@ -21,6 +21,6 @@ icon: ic:round-rocket-launch ## 연결 설정 -[여기로!](../connection.md) +[연결 설정](../connection.md) diff --git a/docs/ko-kr/manual/introduction/tools.md b/docs/ko-kr/manual/introduction/tools.md index fcece40b0d..88bacd01b5 100644 --- a/docs/ko-kr/manual/introduction/tools.md +++ b/docs/ko-kr/manual/introduction/tools.md @@ -21,27 +21,25 @@ icon: octicon:tools-16 현재 [펭귄 물류](https://penguin-stats.cn/planner), [Arknights Toolbox](https://arkntools.app/#/material), [Arknights | Planner](https://ark-nights.com/settings)로 내보내기 기능을 지원합니다. -JSON 스키마와 통합을 희망하는 경우 언제든지 문의해주세요. +JSON 프로토콜과 통합을 희망하는 경우 언제든지 문의해주세요. 앞으로 더 유용한 기능이 추가될 **가능성**이 있습니다. ## 영상 인식 (Alpha) -전술 비디오를 인식하고 자동으로 Copilot 파일을 생성할 수 있습니다. 비디오 파일을 Copilot 탭 페이지로 끌어다 놓으면 시작됩니다. +전술 비디오를 인식하고 자동으로 자동지휘 파일을 생성할 수 있습니다. 비디오 파일을 자동지휘 탭 페이지로 끌어다 놓으면 시작됩니다. 가로세로 비율이 16:9 이고 720p 이상의 해상도를 갖는 비디오만 지원됩니다. 비디오 내용에는 검은 테두리, 왜곡 보정, 에뮬레이터 테두리 또는 기타 요소가 없어야 합니다. ## 헤드헌팅 (가챠) -::: warning -진짜로 가챠를 진행합니다. +::: center +**당신의 계정으로 오퍼레이터를 뽑았어!  당신의 계정으로 오퍼레이터를 뽑았어!  당신의 계정으로 오퍼레이터를 뽑았어!**   +**당신의 계정으로 오퍼레이터를 뽑았어!  당신의 계정으로 오퍼레이터를 뽑았어!  당신의 계정으로 오퍼레이터를 뽑았어!**   +**당신의 계정으로 오퍼레이터를 뽑았어!  당신의 계정으로 오퍼레이터를 뽑았어!  당신의 계정으로 오퍼레이터를 뽑았어!**   ::: -**당신의 계정으로 오퍼레이터를 뽑았어! 당신의 계정으로 오퍼레이터를 뽑았어!** -**당신의 계정으로 오퍼레이터를 뽑았어! 당신의 계정으로 오퍼레이터를 뽑았어!** -**당신의 계정으로 오퍼레이터를 뽑았어! 당신의 계정으로 오퍼레이터를 뽑았어!** - -니우니우 항공을 탈 기회를 놓쳤나요? 걱정 마세요! 이제 모두가 자신의 니우니우 항공을 가지고 있어요! 그리고 헤드헌팅 과정 중에는 스크린샷이 찍혀서 자동적으로 인터페이스 중앙에 표시될 거에요! +[니우니우 항공](https://www.bilibili.com/opus/926129394412421126)을 탈 기회를 놓쳤나요? 걱정 마세요! 이제 모두가 자신의 니우니우 항공을 가지고 있어요! 그리고 헤드헌팅 과정 중에는 스크린샷이 찍혀서 자동적으로 인터페이스 중앙에 표시될 거에요! ## 모니터링 diff --git a/docs/ko-kr/manual/newbie.md b/docs/ko-kr/manual/newbie.md index ace2d83dcb..651afcc53f 100644 --- a/docs/ko-kr/manual/newbie.md +++ b/docs/ko-kr/manual/newbie.md @@ -9,11 +9,13 @@ icon: ri:guide-fill ## 사전 준비 +:::: steps + 1. 시스템 버전 확인 - MAA 는 Windows 10/11만 지원합니다. 이전 버전의 Windows를 사용하는 경우 [FAQ](./faq.md#가능성2:런타임문제)를 참조하세요. + MAA 는 Windows 10/11만 지원합니다. 이전 버전의 Windows를 사용하는 경우 [FAQ](./faq.md#런타임-문제)를 참조하세요. - Windows 사용자가 아닌 경우 [에뮬레이터 및 장치 지원](./device/)을 참조하십시오. + Windows 사용자가 아닌 경우 [에뮬레이터 및 장치 지원](./device/)을 참조하세요. 2. 알맞는 버전 다운로드 @@ -27,7 +29,7 @@ icon: ri:guide-fill MAA는 VCRedist x64 및 .NET 10이 필요합니다. MAA 디렉토리의 `DependencySetup_依赖库安装.bat`를 실행하여 설치하세요. - 자세한 정보는 [FAQ](./faq.md#가능성-2-런타임-문제)를 참조하세요. + 자세한 정보는 [FAQ](./faq.md#런타임-문제)를 참조하세요. 5. 에뮬레이터 지원 확인 @@ -37,6 +39,8 @@ icon: ri:guide-fill 에뮬레이터 해상도는 가로 모드에서 `1280x720` 또는 `1920x1080`이어야 합니다. YosterEN 플레이어의 경우 `1920x1080`이어야 합니다. +:::: + ## 초기 설정 0. 자동 감지 기능을 사용하려면, 하나의 에뮬레이터만 설치되어 있고 멀티 인스턴스 기능을 사용하지 않아야 합니다. diff --git a/docs/ko-kr/protocol/base-scheduling-schema.md b/docs/ko-kr/protocol/base-scheduling-schema.md index f1c1c55e8f..00d89040d0 100644 --- a/docs/ko-kr/protocol/base-scheduling-schema.md +++ b/docs/ko-kr/protocol/base-scheduling-schema.md @@ -3,33 +3,34 @@ order: 6 icon: material-symbols:view-quilt-rounded --- -# 기반시설 스키마 +# 기반시설 스케줄링 프로토콜 -`resource/custom_infrast/*.json` 파일들의 사용법과 각 필드에 대한 설명입니다. +`resource/custom_infrast/*.json` 파일의 사용법 및 각 필드 설명 ::: tip -주의: JSON 형식은 주석을 지원하지 않으므로 아래의 예시에서 주석은 제거해주시기 바랍니다. +JSON 파일은 주석을 지원하지 않으므로, 텍스트 내의 주석은 예시용입니다. 직접 복사하여 사용하지 마세요. ::: -[기반시설 시각적 표 제작도구(yituliu)](https://ark.yituliu.cn/tools/schedule) +[기반시설 스케줄링 생성 도구](https://ark.yituliu.cn/tools/schedule) -## 완전한 필드 목록 +## 전체 필드 목록 ```json { - "title": "小号的换班方案", // 구성 제목, 선택 사항 - "description": "哈哈哈哈", // 구성 설명, 선택 사항 + "title": "小号的换班方案", // 작업명, 선택 사항 + "description": "哈哈哈哈", // 작업 설명, 선택 사항 "plans": [ { - "name": "早班", // 계획 이름, 선택 사항, 2~4교대로 돌릴 때의 각 파트별 구성이 헷갈리지 않도록 해줍니다. - "description": "lol", // 계획 설명, 선택 사항 - "description_post": "", // 계획 실행 후에 표시할 설명, 선택 사항 - "period": [ // 교대 기간, 선택 사항 - // 현재 시간이 이 범위 안에 있는 경우, 계획은 자동으로 선택됩니다 (전체 JSON 파일에 여러 계획이 있을 수 있음) - // 이 필드가 없으면 각 실행 후 자동으로 다음 계획으로 전환됩니다. - // Core에서 이 필드를 처리하지 않습니다. MAA와 인터페이스 통합을 사용하는 경우, 이 논리를 직접 구현하세요. + "name": "早班", // 계획명, 선택 사항 + "description": "lol", // 계획 설명, 선택 사항 + "description_post": "", // 계획 실행 완료 후 표시되는 설명, 선택 사항 + "period": [ + // 교대 시간대, 선택 사항 + // 현재 시간이 이 구간 내에 있으면 해당 계획을 자동으로 선택합니다 (전체 json 파일에 여러 계획이 포함될 수 있음) + // 이 필드가 없으면 매번 교대가 끝난 후 자동으로 다음 계획으로 전환됩니다 + // core는 이 필드를 처리하지 않으므로, 인터페이스를 사용하여 maa를 통합하는 경우 이 로직을 직접 구현하세요 [ - "22:00", // hh:mm 형식으로 표시되며 현재는 단순 숫자 비교만 사용됩니다. 자정을 넘어가는 경우 이 파일의 예시를 참조하세요. + "22:00", // hh:mm 형식 요구, 현재는 단순히 숫자 크기만 비교합니다. 날짜를 넘기는 경우 이 예시처럼 작성하세요 "23:59" ], [ @@ -37,21 +38,23 @@ icon: material-symbols:view-quilt-rounded "06:00" ] ], - "duration": 360, // 근무 기간 (분 단위), 예약 필드로 현재는 사용되지 않습니다. 나중에 시간이 되면 알림이나 자동 교대 기능이 추가될 수 있습니다. - "Fiammetta": { // "Fiammetta"를 사용하는 오퍼레이터, 선택 사항. 사용하지 않는 경우 필요하지 않습니다. - "enable": true, // "Fiammetta"를 사용할지 여부, 선택 사항. 기본값은 true입니다. - "target": "巫恋", // 대상 오퍼레이터, 이는 OCR을 통해 얻어지며, 해당 클라이언트 언어에서 오퍼레이터 이름을 전달해야 합니다. - "order": "pre", // 전체 교대 전에 사용할지 후에 사용할지 여부, 선택 사항. 값 범위는 "pre" / "post"입니다. 기본값은 "pre"입니다. + "duration": 360, // 작업 지속 시간(분), 예약된 필드로 현재는 효과가 없습니다. 나중에 시간이 되면 교대 알림을 띄우거나 자동으로 교대할 수 있습니다 + "Fiammetta": { + // "피아메타"를 어느 오퍼레이터에게 사용할지, 선택 사항, 비워두면 사용하지 않음 + "enable": true, // "피아메타" 사용 여부, 선택 사항, 기본값 true + "target": "巫恋", // 목표 오퍼레이터, OCR을 사용하지만 OcrReplace를 지원하기에, 중문명으로 작성해야 함 + "order": "pre" // 전체 교대 전에 사용할지, 교대 후에 사용할지, 선택 사항, 값 범위 "pre" / "post", 기본값 "pre" }, - "drones": { // 드론 사용에 대한 정보입니다. 선택 사항이며, 지정하지 않으면 드론은 사용되지 않습니다. - "enable": true, // 드론을 사용할지 여부. 선택 사항입니다. 기본값은 true입니다. - "room": "trading", // 어떤 유형의 방에 드론을 사용할지를 지정합니다. 가능한 값으로는 "trading(무역소)" / "manufacture(제조소)"가 있습니다. - "index": 1, // 드론을 사용할 방의 인덱스입니다. 왼쪽의 탭과 대응됩니다. 가능한 값으로는 [1 ~ 5]가 있습니다. - "rule": "all", // 사용 규칙입니다. 예약 필드로 현재는 사용되지 않지만 플러그인 등의 작업 지원을 위해 나중에 사용될 수 있습니다. - "order": "pre" // 오퍼레이터 교대 전에 드론을 사용할지 후에 사용할지 여부입니다. 선택 사항입니다. 가능한 값으로는 "pre" / "post"가 있습니다. 기본값은 "pre"입니다. + "drones": { + // 드론 사용, 선택 사항, 비워두면 드론을 사용하지 않음 + "enable": true, // 드론 사용 여부, 선택 사항, 기본값 true + "room": "trading", // 어느 유형의 시설에 사용할지, 값 범위 "trading" / "manufacture" + "index": 1, // 몇 번째 해당 유형의 시설에 사용할지, 왼쪽 탭 순서에 대응, 값 범위 [1, 5] + "rule": "all", // 사용 규칙, 예약된 필드로 현재는 효과가 없습니다. 나중에 플러그인 등 조작을 지원하는 데 사용할 수 있습니다 + "order": "pre" // 오퍼레이터 교대 전에 사용할지, 교대 후에 사용할지, 선택 사항, 값 범위 "pre" / "post", 기본값 "pre" }, "groups": [ - // "control" / "manufacture" / "trading"에 대해 오퍼레이터 그룹을 설정할 수 있습니다. + // "control" / "manufacture" / "trading"에 대해 오퍼레이터 편성을 설정할 수 있음 { "name": "古+银", "operators": ["古米", "银灰", "梅"] @@ -62,74 +65,71 @@ icon: material-symbols:view-quilt-rounded } ], "rooms": { - // 방 정보입니다. 필수 항목입니다. - // 가능한 값으로는 "control(제어 센터)" / "manufacture(제조소)" / "trading(무역소)" / "power(발전소)" / "meeting(응접실)" / "hire(사무소)" / "dormitory()"가 있습니다. - // 방이 지정되지 않은 경우 기본 알고리즘으로 오퍼레이터 교대를 수행합니다. - // 특정 방에서 오퍼레이터 교대를 하지 않으려면 "skip" 필드를 사용하거나 소프트웨어의 인프라 설정에서 해당 시설을 선택 해제하세요. + // 시설 정보, 필수 + // 값 범위 "control" / "manufacture" / "trading" / "power" / "meeting" / "hire" / "dormitory" / "processing" + // 하나라도 빠지면 해당 시설은 기본 알고리즘을 사용하여 교대합니다. + // 특정 시설의 교대를 원하지 않으면 skip 필드를 사용하거나, 소프트웨어 '임무 설정 - 기반시설 교대 - 일반 설정'에서 해당 시설의 체크를 해제하세요 "control": [ - { - "operators": [ // 이 방에 할당된 오퍼레이터들입니다. OCR을 통해 식별되며 해당 클라이언트 언어로 오퍼레이터 이름을 전달해야 합니다. - "夕", - "令", - "凯尔希", - "阿米娅", - "玛恩纳" - ] - } + { + "operators": [ + "夕", // OCR을 사용하지만 OcrReplace를 지원하기에, 중문명으로 작성해야 함 + "令", + "凯尔希", + "阿米娅", + "玛恩纳" + ] + } ], "manufacture": [ - { - "operators": ["芬", "稀音", "克洛丝"], - "sort": false, // 오퍼레이터들을 위의 순서에 따라 정렬할지 여부입니다. 선택 사항입니다. 기본값은 false입니다. - // 예를 들어 "稀音", "帕拉斯", "巫恋"(씬, 팔라스, 샤마르)와 같은 오퍼레이터를 사용하는 경우 - // "sort": false로 설정하면 순서가 뒤바뀔 수 있으며, 특히 시간이 지남에 따라 효율이 상승하는 오퍼레이터의 효과가 초기화되어 손실로 이어질 수 있습니다. - // "sort": true를 사용하면 이러한 문제를 피할 수 있습니다. - }, - { - "skip": true // 이 방을 건너뛸지 여부를 나타냅니다 (배열 인덱스에 해당). 선택 사항입니다. 기본값은 false입니다. - // true로 설정하면 다른 모든 필드를 비워둘 수 있습니다. 오퍼레이터 변경만 건너뛰게 됩니다. 드론 사용 및 단서 교환과 같은 다른 작업은 계속 진행됩니다. - }, - { - "operators": ["Castle-3"], - "autofill": true, // 원래 알고리즘을 사용하여 나머지 위치를 자동으로 채울지 여부를 나타냅니다. 선택 사항입니다. 기본값은 false입니다. - // 오퍼레이터 배열이 비어있는 경우 방 전체의 스케줄링은 원래 알고리즘을 기반으로 합니다. - // 오퍼레이터 배열이 비어 있지 않은 경우 개별 오퍼레이터의 효율성만 고려되며 전체 조합의 효율성은 고려되지 않습니다. - // 이후에 정의된 사용자 정의 오퍼레이터들과 충돌할 수 있으므로 주의해야 합니다. 예를 들어, 이후에 필요한 오퍼레이터들이 여기서 사용되는 경우에는 주의해서 사용하거나, 자동채우기를 하는 방의 순서를 뒤로 미루세요. - "product": "Battle Record" // 현재 제조되는 제품, 선택 사항. - // 시설에서 인식된 제품이 작업에 설정된 제품과 일치하지 않으면 인터페이스에 빨간색 경고 메시지가 표시됩니다. 미래에 추가 기능이 추가될 수 있습니다. - // 가능한 값으로는 "Battle Record()" | "Pure Gold(순금)" | "Dualchip(듀얼 칩)" | "Originium Shard(오리지늄 조각)" | "LMD(용문폐)" | "Orundum()"가 있습니다. - }, - { - "operators": [ - "多萝西" - ], - "candidates": [ - // 선택적 후보 오퍼레이터입니다. 모든 위치가 채워질 때까지 목록에 있는 오퍼레이터들을 사용합니다. - // autofill=true와 호환되지 않습니다. 이 배열이 비어 있지 않은 경우 autofill을 false로 설정하세요. - "星源", - "白面鸮", - "赫默" - ] - }, - { - "use_operator_groups": true, // groups에 있는 오퍼레이터 그룹을 사용하려면 true로 설정, 기본값은 false - "operators": [ - // 활성화되면, operators에 있는 이름이 그룹 이름으로 해석됩니다. - "古+银", // 컨디션 임계값 및 설정 순서에 따라 그룹 선택 - "清流" // 만약 古+银 그룹의 오퍼레이터 컨디션이 임계값 이하인 경우 清流 그룹 사용 - ] - } + { + "operators": ["芬", "稀音", "克洛丝"], + "sort": false // 정렬 여부 (위의 operators 순서대로), 선택 사항, 기본값 false + // 예: 씬, 팔라스, 샤마르 등의 오퍼레이터를 사용하고 "sort": false인 경우, 오퍼레이터 순서가 섞여 예열 효과가 손실될 수 있습니다. + // "sort": true를 사용하면 이 문제를 피할 수 있습니다 + }, + { + "skip": true // 현재 시설을 건너뛸지 여부 (배열 순서 대응), 선택 사항, 기본값 false + // true일 경우, 다른 필드는 모두 비워둘 수 있습니다. 오퍼레이터 교대 작업만 건너뛰며, 드론 사용이나 단서 교환 등은 정상적으로 진행됩니다 + }, + { + "operators": ["Castle-3"], + "autofill": true, // 기존 알고리즘을 사용하여 남은 위치를 자동으로 채움, 선택 사항, 기본값 false + // operators가 비어 있으면, 해당 시설은 완전히 기존 알고리즘을 사용하여 스케줄링합니다 + // operators가 비어 있지 않으면, 단일 오퍼레이터 효율만 고려하며 전체 조합 효율은 고려하지 않습니다 + // 뒤에 정의된 사용자 오퍼레이터와 충돌할 수 있으니 주의하세요. 예를 들어 뒤에 필요한 오퍼레이터를 여기서 가져다 쓸 수 있으므로 신중하게 사용하거나, autofill 시설 순서를 마지막으로 배치하세요 + "product": "Battle Record" // 현재 제조 생산품, 선택 사항. + // 현재 시설과 작업에 설정된 생산품이 일치하지 않는 것으로 식별되면, 인터페이스에 빨간 글씨로 힌트가 뜹니다. 나중에 더 많은 기능이 생길 수 있습니다 + // 값 범위: "Battle Record" | "Pure Gold" | "Dualchip" | "Originium Shard" | "LMD" | "Orundum" + }, + { + "operators": ["多萝西"], + "candidates": [ + // 후보 오퍼레이터, 선택 사항. 여기에 있는 오퍼레이터 중 있는 것을 사용하며 꽉 찰 때까지 선택합니다 + // autofill=true와 호환되지 않습니다. 즉 이 배열이 비어 있지 않으면 autofill은 false여야 합니다 + "星源", + "白面鸮", + "赫默" + ] + }, + { + "use_operator_groups": true, // true로 설정하여 groups의 오퍼레이터 편성을 사용, 기본값 false + "operators": [ + // 활성화 시, operators의 이름은 편성명으로 해석됨 + "古+银", // 컨디션 임계값 및 설정 순서에 따라 편성 선택 + "清流" // 만약 古+银 그룹에 컨디션이 임계값보다 낮은 오퍼레이터가 있다면 清流 그룹 사용 + ] + } ], "meeting": [ { - "autofill": true // 방 전체에 autofill을 사용합니다. + "autofill": true // 이 시설 전체 autofill } ] } }, { - "name": "晚班" - // ... + "name": "晚班" + // ... } ] } @@ -137,6 +137,6 @@ icon: material-symbols:view-quilt-rounded ## 예시 -[243_layout_3_times_a_day](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/243_layout_3_times_a_day.json) 243 3교대 +[243 극한 효율, 하루 3회 교대](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/243_layout_3_times_a_day.json) -[153_layout_3_times_a_day](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/153_layout_3_times_a_day.json) 153 3교대 +[153 극한 효율, 하루 3회 교대](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/153_layout_3_times_a_day.json) diff --git a/docs/ko-kr/protocol/callback-schema.md b/docs/ko-kr/protocol/callback-schema.md index 8ef2ed9630..34a70e2bcc 100644 --- a/docs/ko-kr/protocol/callback-schema.md +++ b/docs/ko-kr/protocol/callback-schema.md @@ -3,635 +3,515 @@ order: 2 icon: material-symbols:u-turn-left --- -# 콜백 메세지 프로토콜 +# 콜백 메시지 프로토콜 ::: info 정보 콜백 메시지는 버전 업데이트를 통해 빠르게 변경되고 있으며 이 문서는 오래된 것일 수 있습니다. 최신 콘텐츠는 [C# 통합 소스 코드](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/MaaWpfGui/Main/AsstProxy.cs)를 참조하세요. ::: -## 프로토타입 +## 콜백 함수 프로토타입 ```cpp typedef void(ASST_CALL* AsstCallback)(int msg, const char* details, void* custom_arg); ``` -## 개요 +## 파라미터 개요 - `int msg` - 메시지 유형입니다. + 메시지 유형 ```cpp enum class AsstMsg { - /* 전역 정보 */ - InternalError = 0, // 내부 오류 - InitFailed, // 초기화 실패 - ConnectionInfo, // 연결 정보 - AllTasksCompleted, // 모든 태스크가 완료되었는지 여부 - AsyncCallInfo, // 비동기 호출 정보 - /* TaskChain 정보 */ - TaskChainError = 10000, // 태스크 체인 실행/인식 오류 - TaskChainStart, // 태스크 체인 시작 - TaskChainCompleted, // 태스크 체인 완료 - TaskChainExtraInfo, // 태스크 체인에 대한 추가 정보 - TaskChainStopped, // 태스크 체인 중지 - /* SubTask 정보 */ - SubTaskError = 20000, // 서브태스크 실행/인식 오류 - SubTaskStart, // 서브태스크 시작 - SubTaskCompleted, // 서브태스크 완료 - SubTaskExtraInfo, // 서브태스크에 대한 추가 정보 - SubTaskStopped, // 서브태스크 중지 + /* Global Info */ + InternalError = 0, // 내부 오류 + InitFailed = 1, // 초기화 실패 + ConnectionInfo = 2, // 연결 정보 + AllTasksCompleted = 3, // 모든 작업 완료 + AsyncCallInfo = 4, // 비동기 호출 정보 + Destroyed = 5, // 인스턴스 소멸됨 + + /* TaskChain Info */ + TaskChainError = 10000, // 작업 체인 실행/인식 오류 + TaskChainStart = 10001, // 작업 체인 시작 + TaskChainCompleted = 10002, // 작업 체인 완료 + TaskChainExtraInfo = 10003, // 작업 체인 추가 정보 + TaskChainStopped = 10004, // 작업 체인 수동 중지 + + /* SubTask Info */ + SubTaskError = 20000, // 서브 작업 실행/인식 오류 + SubTaskStart = 20001, // 서브 작업 시작 + SubTaskCompleted = 20002, // 서브 작업 완료 + SubTaskExtraInfo = 20003, // 서브 작업 추가 정보 + SubTaskStopped = 20004, // 서브 작업 수동 중지 /* Web Request */ - ReportRequest = 30000, // 보고 요청 + ReportRequest = 30000, // 보고 요청 }; ``` - `const char* details` - 메시지 세부사항, JSON 형식입니다. 또한 [필드 설명](#필드-설명)도 참조하세요. + 메시지 세부사항, JSON 문자열, [필드 설명](#필드-설명) 참조 - `void* custom_arg` - 호출자의 사용자 정의 인수로, `AsstCreateEx` 인터페이스의 `custom_arg` 인수를 전달합니다. C 언어 기반 언어에서는 이를 통해 `this` 포인터를 전달할 수 있습니다. + 호출자의 사용자 정의 인수로, `AsstCreateEx` 인터페이스의 `custom_arg` 인수가 그대로 전달됩니다. C 계열 언어에서는 이를 통해 `this` 포인터를 전달할 수 있습니다. ## 필드 설명 ### InternalError -할일 +`details` 필드는 비어 있습니다. ### InitFailed -```json -{ - "what": string, // 오류 유형 - "why": string, // 오류 원인 - "details": object // 오류 세부사항 -} -``` +:::: field-group +::: field name="what" type="string" required +오류 유형 +::: +::: field name="why" type="string" required +오류 원인 +::: +::: field name="details" type="object" required +오류 상세 +::: +:::: ### ConnectionInfo -```json -{ - "what": string, // 정보 유형 - "why": string, // 정보 원인 - "uuid": string, // UUID (연결 실패 시 빈 문자열) - "details": { - "adb": string, // AsstConnect 인터페이스의 adb_path 인수 - "address": string, // AsstConnect 인터페이스의 address 인수 - "config": string // AsstConnect 인터페이스의 config 인수 - } -} -``` +:::: field-group +::: field name="what" type="string" required +정보 유형 +::: +::: field name="why" type="string" required +정보 원인 +::: +::: field name="uuid" type="string" +장치 고유 코드(UUID) (연결 실패 시 비어 있음) +::: +::: field name="details" type="object" required +연결 상세 정보. 구조는 다음과 같습니다: -### 자주 사용되는 `what` 필드 값 +- `adb` (string, required): `AsstConnect` 인터페이스의 `adb_path` 파라미터. +- `address` (string, required): `AsstConnect` 인터페이스의 `address` 파라미터. +- `config` (string, required): `AsstConnect` 인터페이스의 `config` 파라미터. + +::: +:::: + +### 자주 사용되는 `What` 필드 - `ConnectFailed` - 연결 실패. + 연결 실패 - `Connected` - 연결됨. 이제 `uuid` 필드는 비어 있습니다 (다음 단계에서 가져올 것입니다). + 연결됨, 이때 `uuid` 필드는 비어 있음 (다음 단계에서 획득) - `UuidGot` - UUID를 가져왔습니다. + 장치 고유 코드(UUID) 획득 - `UnsupportedResolution` - 해상도가 지원되지 않습니다. + 지원하지 않는 해상도 - `ResolutionError` - 해상도를 가져올 수 없습니다. + 해상도 획득 오류 - `Reconnecting` - 연결이 끊어졌습니다 (adb/에뮬레이터 충돌), 재연결 중 + 연결 끊김 (adb / 에뮬레이터 충돌), 재연결 중 - `Reconnected` - 연결이 끊어졌습니다 (adb/에뮬레이터 충돌), 재연결 성공 + 연결 끊김 (adb / 에뮬레이터 충돌), 재연결 성공 - `Disconnect` - 연결이 끊어졌습니다 (adb/에뮬레이터 충돌), 재연결 실패 + 연결 끊김 (adb / 에뮬레이터 충돌), 재시도 실패 - `ScreencapFailed` - 스크린샷 실패 (adb/에뮬레이터 충돌), 재연결 실패 + 스크린샷 실패 (adb / 에뮬레이터 충돌), 재시도 실패 - `TouchModeNotAvailable` - 터치 모드를 사용할 수 없습니다 + 지원하지 않는 터치 모드 ### AsyncCallInfo -```json -{ - "uuid": string, // UUID - "what": string, // 호출 유형, "Connect" | "Click" | "Screencap" | ... - "async_call_id": int, // 비동기 호출 ID, AsstAsyncXXX API를 호출한 결과 값입니다. - "details": { - "ret": bool, // 결과 - "cost": int64, // 경과 시간 (밀리초) - } -} -``` +:::: field-group +::: field name="uuid" type="string" required +장치 고유 코드 +::: +::: field name="what" type="string" required +콜백 유형, 예: `Connect` | `Click` | `Screencap` 등 +::: +::: field name="async_call_id" type="number" required +비동기 요청 id, 즉 `AsstAsyncXXX` 호출 시 반환값 +::: +::: field name="details" type="object" required +비동기 호출 상세. 구조는 다음과 같습니다: + +- `ret` (boolean, required): 실제 호출의 반환값. +- `cost` (number, required): 소요 시간, 단위 밀리초. + +::: +:::: ### AllTasksCompleted -```json -{ - "taskchain": string, // 마지막 태스크 체인 - "uuid": string, // UUID - "finished_tasks": [ // 실행된 마지막 태스크의 ID 목록 - int, - ... - ] -} -``` +:::: field-group +::: field name="taskchain" type="string" required +마지막 작업 체인 +::: +::: field name="uuid" type="string" required +장치 고유 코드 +::: +::: field name="finished_tasks" type="array" required +이미 실행된 작업 id 목록 +::: +:::: -#### 자주 사용되는 `taskchain` 필드 값 +#### 자주 사용되는 `taskchain` 필드 - `StartUp` - 시작. + 시작 (깨우기) - `CloseDown` - 게임 클라이언트 닫기 + 게임 종료 - `Fight` - 전투. + 이성 소모 작전 - `Mall` - 상점. + 크레딧 상점 및 쇼핑 - `Recruit` - 자동 인원 모집. + 자동 공개모집 - `Infrast` - 시설. + 기반시설 교대 - `Award` - 일일 보상 받기 + 일일 보상 수령 - `Roguelike` - 로그라이크. + 통합 전략 반복 - `Copilot` - JSON 파일로 자동 전투 + 자동지휘 - `SSSCopilot` - JSON 파일로 자동 전투 for STATIONARY SECURITY SERVICE + 보안 파견 자동지휘 - `Depot` 창고 인식 - `OperBox` - 오퍼레이터 박스 인식 + 오퍼레이터 인식 - `Reclamation` - Reclamation Algorithm (CN 클라이언트의 새로운 모드) + 생존 연산 - `Custom` - 사용자 정의 태스크 + 사용자 정의 작업 - `SingleStep` - 단일 단계 태스크 + 단일 단계 작업 - `VideoRecognition` - Copilot용 비디오 인식 + 비디오 인식 작업 - `Debug` - 디버그. + 디버그 -### TaskChain과 관련된 정보 +### TaskChain 관련 메시지 -```json -{ - "taskchain": string, // 현재 Task Chain - "taskid": int, // 현재 Task ID - "uuid": string // UUID -} -``` +:::: field-group +::: field name="taskchain" type="string" required +현재 작업 체인 +::: +::: field name="taskid" type="number" required +현재 작업 TaskId +::: +::: field name="uuid" type="string" required +장치 고유 코드 +::: +:::: ### TaskChainExtraInfo -할 일 +`details` 필드는 비어 있습니다. -### SubTask와 관련된 정보 +### SubTask 관련 메시지 -```json -{ - "subtask": string, // 서브태스크 이름 - "class": string, // 서브태스크 클래스 - "taskchain": string, // 현재 Task Chain - "taskid": int, // 현재 Task ID - "details": object, // 상세 정보 - "uuid": string // UUID -} -``` +:::: field-group +::: field name="subtask" type="string" required +서브 작업명 +::: +::: field name="class" type="string" required +서브 작업 심볼명 +::: +::: field name="taskchain" type="string" required +현재 작업 체인 +::: +::: field name="taskid" type="number" required +현재 작업 TaskId +::: +::: field name="details" type="object" required +상세 정보 +::: +::: field name="uuid" type="string" required +장치 고유 코드 +::: +:::: -#### 자주 사용되는 `subtask` 필드 값 +#### 자주 사용되는 `subtask` 필드 -- `ProcessTask` +- `ProcessTask` + `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "task": "StartButton2", // 태스크 이름 - "action": 512, - "exec_times": 1, // 실행 횟수 - "max_times": 999, // 최대 실행 횟수 - "algorithm": 0 - } - ``` + :::: field-group + ::: field name="task" type="string" required + 작업명 + ::: + ::: field name="action" type="number" required + Action ID + ::: + ::: field name="exec_times" type="number" required + 실행된 횟수 + ::: + ::: field name="max_times" type="number" required + 최대 실행 횟수 + ::: + ::: field name="algorithm" type="number" required + 인식 알고리즘 + ::: + :::: -- 기타 할 일 +- Todo 기타 -##### 자주 사용되는 `task` 필드 값 +##### 자주 사용되는 `task` 필드 - `StartButton2` - 시작 중입니다. + 작전 시작 - `MedicineConfirm` - 이성 회복제 사용 확인. + 이성 회복제 사용 확인 - `ExpiringMedicineConfirm` - 만료가 임박한 이성 회복 아이템을 사용 확인. + 48시간 내 만료되는 이성 회복제 사용 확인 - `StoneConfirm` - 오리지늄 조각 사용 확인. + 오리지늄 사용 확인 - `RecruitRefreshConfirm` - 공개모집 새로고침 여부 확인. + 공개모집 태그 갱신 확인 - `RecruitConfirm` - 공개모집 확인. + 공개모집 채용 확인 - `RecruitNowConfirm` - 즉시 완료 허가증 확인. + 공개모집 즉시 완료 허가증 사용 확인 - `ReportToPenguinStats` - 펭귄 스텟에 보고합니다. + 펭귄 물류 데이터 통계 보고 - `ReportToYituliu` - Yituliu 빅데이터에 보고합니다. + Yituliu 빅데이터 보고 - `InfrastDormDoubleConfirmButton` - 기반시설 더블 확인 버튼입니다. 다른 오퍼레이터와 충돌이 있을 때만 발생합니다. + 기반시설 숙소의 2차 확인 버튼, 오퍼레이터 충돌 시에만 나타남, 사용자에게 알림 필요 - `StartExplore` - 통합전략: 시작 중입니다. + 통합 전략 탐험 시작 - `StageTraderInvestConfirm` - 통합전략: 오리지늄 각뿔 아이템 거래. + 통합 전략 각뿔 투자 확인 - `StageTraderInvestSystemFull` - 통합전략: 투자 시스템이 가득 참. + 통합 전략 투자 한도 도달 - `ExitThenAbandon` - 통합전략: 나가기 확인. + 통합 전략 이번 탐험 포기 - `MissionCompletedFlag` - 통합전략: 미션 완료. + 통합 전략 전투 완료 - `MissionFailedFlag` - 통합전략: 미션 실패. + 통합 전략 전투 실패 - `StageTraderEnter` - 통합전략: 교활한 상인 진입. + 통합 전략 노드: 교활한 상인 - `StageSafeHouseEnter` - 통합전략: 안전가옥 진입. + 통합 전략 노드: 안전가옥 - `StageEncounterEnter` - 통합전략: 우연한 만남 진입. + 통합 전략 노드: 우연한 만남/고성의 선물 - `StageCombatDpsEnter` - 통합전략: 작전 진입. + 통합 전략 노드: 일반 작전 - `StageEmergencyDps` - 통합전략: 긴급 작전 진입. + 통합 전략 노드: 긴급 작전 - `StageDreadfulFoe` - 통합전략: 보스 진입. -- `StartGameTask` - 클라이언트를 시작할 수 없음 (클라이언트 유형과 호환되지 않는 구성 파일). -- 기타 할 일 + 통합 전략 노드: 험난한 길 +- `StartGameTask` + 클라이언트 실행 실패 (설정 파일과 입력된 client_type 불일치) +- Todo 기타 ### SubTaskExtraInfo -```json -{ - "taskchain": string, // 현재 Task Chain - "class": string, // 서브태스크 클래스 - "what": string, // 정보 유형 - "details": object, // 정보 상세 내용 - "uuid": string, // UUID -} -``` +:::: field-group +::: field name="taskchain" type="string" required +현재 작업 체인 +::: +::: field name="class" type="string" required +서브 작업 유형 +::: +::: field name="what" type="string" required +정보 유형 +::: +::: field name="details" type="object" required +정보 상세 +::: +::: field name="uuid" type="string" required +장치 고유 코드 +::: +:::: -#### 자주 사용되는 `what`과 `details` 필드 값 +#### 자주 사용되는 `what` 및 `details` 필드 - `StageDrops` - 스테이지 드롭 정보 - - ```json - // 해당 details 필드 예시 - { - "drops": [ - // 인식된 드롭 아이템 - { - "itemId": "3301", - "quantity": 2, - "itemName": "技巧概要·卷1" - }, - { - "itemId": "3302", - "quantity": 1, - "itemName": "技巧概要·卷2" - }, - { - "itemId": "3303", - "quantity": 2, - "itemName": "技巧概要·卷3" - } - ], - "stage": { - // 스테이지 정보 - "stageCode": "CA-5", - "stageId": "wk_fly_5" - }, - "stars": 3, // 행동 종료 시 클리어 별 개수 - "stats": [ - // 해당 실행 기간 동안의 전체 드롭 아이템 - { - "itemId": "3301", - "itemName": "技巧概要·卷1", - "quantity": 4, - "addQuantity": 2 //이번에 추가된 드롭 수량 - }, - { - "itemId": "3302", - "itemName": "技巧概要·卷2", - "quantity": 3, - "addQuantity": 1 - }, - { - "itemId": "3303", - "itemName": "技巧概要·卷3", - "quantity": 4, - "addQuantity": 2 - } - ] - } - - ``` + 노드 재료 드롭 정보. `details` 필드 구조는 다음과 같습니다: + - `drops` (array, required): 이번에 식별된 드롭 재료, 배열의 각 항목: + - `itemId` (string, required): 재료 ID + - `quantity` (number, required): 드롭 수량 + - `itemName` (string, required): 재료 명칭 + - `stage` (object, required): 노드 정보: + - `stageCode` (string, required): 노드 코드 + - `stageId` (string, required): 노드 ID + - `stars` (number, required): 작전 종료 등급(별) + - `stats` (array, required): 이번 실행 기간 동안의 총 재료 드롭, 배열의 각 항목: + - `itemId` (string, required): 재료 ID + - `itemName` (string, required): 재료 명칭 + - `quantity` (number, required): 총 수량 + - `addQuantity` (number, required): 이번에 추가된 드롭 수량 - `RecruitTagsDetected` - 공개모집 태그 감지 + 공개모집 태그를 식별했습니다. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "tags": [ - "费用回复", - "防护", - "先锋干员", - "辅助干员", - "近战位" - ] - } - ``` + :::: field-group + ::: field name="tags" type="array" required + 식별된 태그 목록 + ::: + :::: - `RecruitSpecialTag` - 고급 특별 채용 감지 + 공개모집 특수 태그를 식별했습니다. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "tag": "高级资深干员" // 고급 특별 채용 - } - ``` + :::: field-group + ::: field name="tag" type="string" required + 특수 태그 명칭, 예: `고급 특별 채용` + ::: + :::: - `RecruitResult` - 공개모집 결과 - - ```json - // 상세 정보에 대한 예시 - { - "tags": [ // 모든 태그들, 반드시 5개여야 함 - "削弱", - "减速", - "术师干员", - "辅助干员", - "近战位" - ], - "level": 4, // ★ 총합 - "result": [ - { - "tags": [ - "削弱" - ], - "level": 4, // 태그의 최소 레어도 - "opers": [ - { - "name": "初雪", - "level": 5 // 오퍼레이터의 레어도 - }, - { - "name": "陨星", - "level": 5 - }, - { - "name": "槐琥", - "level": 5 - }, - { - "name": "夜烟", - "level": 4 - }, - { - "name": "流星", - "level": 4 - } - ] - }, - { - "tags": [ - "减速", - "术师干员" - ], - "level": 4, - "opers": [ - { - "name": "夜魔", - "level": 5 - }, - { - "name": "格雷伊", - "level": 4 - } - ] - }, - { - "tags": [ - "削弱", - "术师干员" - ], - "level": 4, - "opers": [ - { - "name": "夜烟", - "level": 4 - } - ] - } - ] - } - ``` + 공개모집 식별 결과. `details` 필드 구조는 다음과 같습니다: + - `tags` (array, required): 식별된 모든 태그, 현재 5개로 고정 + - `level` (number, required): 조합의 최고 등급(별) + - `result` (array, required): 구체적인 조합 결과, 배열의 각 항목: + - `tags` (array, required): 조합에 참여한 태그 + - `level` (number, required): 이 태그 조합의 등급 + - `opers` (array, required): 모집 가능한 오퍼레이터, 배열의 각 항목: + - `name` (string, required): 오퍼레이터 명칭 + - `level` (number, required): 오퍼레이터 등급 - `RecruitTagsRefreshed` - 공개모집 태그 갱신 완료 + 공개모집 태그를 갱신했습니다. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "count": 1, // 갱신된 슬롯의 횟수 - "refresh_limit": 3 // 갱신 횟수 제한 - } - ``` + :::: field-group + ::: field name="count" type="number" required + 현재 슬롯 갱신 횟수 + ::: + ::: field name="refresh_limit" type="number" required + 현재 슬롯 갱신 횟수 상한 + ::: + :::: - `RecruitNoPermit` - 모집 라이센스가 없습니다 + 모집 허가증이 없습니다. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "continue": true, // 계속 새로고침할지 말지 - } - ``` + :::: field-group + ::: field name="continue" type="boolean" required + 계속 갱신할지 여부 + ::: + :::: - `RecruitTagsSelected` - 공개모집 태그 선택 완료 + 공개모집 태그를 선택했습니다. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "tags": [ - "减速", - "术师干员" - ] - } - ``` + :::: field-group + ::: field name="tags" type="array" required + 선택한 태그 목록 + ::: + :::: - `RecruitSlotCompleted` - 모집 슬롯 완료 -- `RecruitError` - 모집 인식 오류 -- `EnterFacility` - 기반시설 입장 + 현재 공개모집 슬롯 작업 완료. `details` 필드는 비어 있습니다 - ```json - // 상세 정보에 대한 예시 - { - "facility": "Mfg", // 시설 이름 - "index": 0 // 시설 ID - } - ``` +- `RecruitError` + 공개모집 식별 오류. `details` 필드는 비어 있습니다 + +- `EnterFacility` + 기반시설 시설에 진입했습니다. `details` 필드 내용은 다음과 같습니다: + + :::: field-group + ::: field name="facility" type="string" required + 시설명 + ::: + ::: field name="index" type="number" required + 시설 순서(인덱스) + ::: + :::: - `NotEnoughStaff` - 사용 가능한 오퍼레이터가 부족함 + 기반시설 가용 오퍼레이터 부족. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "facility": "Mfg", // 시설 이름 - "index": 0 // 시설 ID - } - ``` + :::: field-group + ::: field name="facility" type="string" required + 시설명 + ::: + ::: field name="index" type="number" required + 시설 순서 + ::: + :::: - `ProductOfFacility` - 시설의 생산물 + 기반시설 생산물. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "product": "Money", // 생산물 - "facility": "Mfg", // 시설 이름 - "index": 0 // 시설 ID - } - ``` + :::: field-group + ::: field name="product" type="string" required + 생산물명 + ::: + ::: field name="facility" type="string" required + 시설명 + ::: + ::: field name="index" type="number" required + 시설 순서 + ::: + :::: - `StageInfo` - 자동 전투 스테이지 정보 + 자동 작전 노드 정보. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "name": string // 스테이지 이름 - } - ``` + :::: field-group + ::: field name="name" type="string" required + 노드명 + ::: + :::: - `StageInfoError` - 자동 전투 스테이지 정보 오류 + 자동 작전 노드 식별 오류. `details` 필드는 비어 있습니다 + - `PenguinId` - PenguinStats ID + 펭귄 물류 ID. `details` 필드 내용은 다음과 같습니다: - ```json - // 상세 정보에 대한 예시 - { - "id": string - } - ``` + :::: field-group + ::: field name="id" type="string" required + 펭귄 물류 ID + ::: + :::: -- `DepotInfo` - 창고 인식 결과 +- `Depot` + 창고 인식 결과. `details` 필드 구조는 다음과 같습니다: + - `done` (boolean, required): 인식 완료 여부, `false`는 아직 인식 중임(진행 중 데이터)을 의미 + - `arkplanner` (object, required): [ArkPlanner](https://penguin-stats.cn/planner) 포맷 데이터 + - `lolicon` (object, required): [lolicon](https://arkntools.app/#/material) (Arkntools) 포맷 데이터 - ```json - // 상세 정보에 대한 예시 - // ArkPlanner 포맷만 지원합니다. 더 많은 포맷이 나중에 지원될 수 있습니다. - "arkplanner": { - "object": { - "items": [ - { - "id": "2004", - "have": 4, - "name": "高级作战记录" - }, - { - "id": "mod_unlock_token", - "have": 25, - "name": "模组数据块" - }, - { - "id": "2003", - "have": 20, - "name": "中级作战记录" - } - ], - "@type": "@penguin-statistics/depot" - }, - "data": "{\"@type\":\"@penguin-statistics/depot\",\"items\":[{\"id\":\"2004\",\"have\":4,\"name\":\"高级作战记录\"},{\"id\":\"mod_unlock_token\",\"have\":25,\"name\":\"模组数据块\"},{\"id\":\"2003\",\"have\":20,\"name\":\"中级作战记录\"}]}" - }, - "lolicon": { // https://arkntools.app/#/material - "object": { - "2004" : 4, - "mod_unlock_token": 25, - "2003": 20 - - - }, - "data": "{\"2003\":20,\"2004\": 4,\"mod_unlock_token\": 25}" - } - // 현재는 ArkPlanner와 Lolicon (Arkntools) 포맷만 지원하며, 미래에 더 많은 웹사이트가 지원될 예정입니다. - ``` - -- `OperBoxInfo` - 오퍼레이터 보유 목록 인식 결과 - - ```json - // 상세 정보에 대한 예시 - "done": bool, // 인식 완료 여부, false는 아직 진행 중임을 의미합니다 (진행 중인 데이터) - "all_oper": [ - { - "id": "char_002_amiya", - "name": "阿米娅", - "own": true - }, - { - "id": "char_003_kalts", - "name": "凯尔希", - "own": true - }, - { - "id": "char_1020_reed2", - "name": "焰影苇草", - "own": false - }, - ] - "own_opers": [ - { - "id": "char_002_amiya", // 오퍼레이터 ID - "name": "阿米娅", // 오퍼레이터 이름 - "own": true, // 보유 여부 - "elite": 2, // 정예화 단계 0, 1, 2 - "level": 50, // 오퍼레이터 레벨 - "potential": 6, // 오퍼레이터 잠재능력 [1, 6] - "rarity": 5 // [1, 6] - }, - { - "id": "char_003_kalts", - "name": "凯尔希", - "own": true, - "elite": 2, - "level": 50, - "potential": 1, - "rarity": 6 - } - ] - ``` +- `OperBox` + 오퍼레이터 보관함 인식 결과. `details` 필드 구조는 다음과 같습니다: + - `done` (boolean, required): 인식 완료 여부, `false`는 아직 인식 중임(진행 중 데이터)을 의미 + - `all_oper` (array, required): 전체 오퍼레이터 목록, 배열의 각 항목: + - `id` (string, required): 오퍼레이터 ID + - `name` (string, required): 오퍼레이터 명칭 + - `own` (boolean, required): 보유 여부 + - `rarity` (number, required): 오퍼레이터 레어도 [1, 6] + - `own_opers` (array, required): 보유 중인 오퍼레이터 상세 정보 목록, 배열의 각 항목: + - `id` (string, required): 오퍼레이터 ID + - `name` (string, required): 오퍼레이터 명칭 + - `own` (boolean, required): 보유 여부 + - `elite` (number, required): 정예화 단계 [0, 2] + - `level` (number, required): 오퍼레이터 레벨 + - `potential` (number, required): 오퍼레이터 잠재 [1, 6] + - `rarity` (number, required): 오퍼레이터 레어도 [1, 6] - `UnsupportedLevel` - 지원되지 않는 레벨 이름 + 자동지휘, 지원하지 않는 노드명. `details` 필드는 비어 있습니다 ### ReportRequest -이 필드는 코어 모듈에서 UI 계층으로 네트워크 요청 정보를 전달하는 데 주로 사용되며, UI는 실제 HTTP 보고 작업을 수행합니다. +이 필드는 주로 코어 모듈이 UI 계층에 네트워크 요청 정보를 전달하는 데 사용되며, UI가 구체적인 HTTP 보고(Report) 작업을 수행합니다 -```json -{ - "url": "string", // 요청의 전체 URL 예: https://penguin-stats.io/PenguinStats/api/v2/report - "headers": { // 요청 헤더 키-값 쌍 (Content-Type 제외, UI에서 추가) - "authorization": "PenguinID 1234567890", - "User-Agent": "MaaAssistantArknights/1.2.3 cpr/4.5.6" - }, - "body": "string", // 요청 본문 내용 (보통 JSON 형식의 문자열) - "subtask": "string" // 구체적인 보고 작업을 식별하는 서브태스크 이름 예: "ReportToPenguinStats", "ReportToYituliu" -} -``` +:::: field-group +::: field name="url" type="string" required +요청 전체 URL, 예: `https://penguin-stats.io/PenguinStats/api/v2/report` +::: +::: field name="headers" type="object" required +요청 헤더 키-값 쌍 (`Content-Type` 미포함, UI 계층에서 자동 추가) +::: +::: field name="body" type="string" required +요청 본문 내용 (일반적으로 JSON 형식의 문자열) +::: +::: field name="subtask" type="string" required +서브 작업명, 구체적인 상보 임무 식별, 예: `ReportToPenguinStats`, `ReportToYituliu` +::: +:::: diff --git a/docs/ko-kr/protocol/copilot-schema.md b/docs/ko-kr/protocol/copilot-schema.md index dd40b8e13e..50d8bdeaad 100644 --- a/docs/ko-kr/protocol/copilot-schema.md +++ b/docs/ko-kr/protocol/copilot-schema.md @@ -3,157 +3,172 @@ order: 3 icon: ph:sword-bold --- -# 전투 스키마 +# 자동지휘 프로토콜 + +`resource/copilot/*.json` 파일의 사용법 및 각 필드 설명 ::: tip -주의: JSON 형식은 주석을 지원하지 않으므로 아래의 예시에서 주석은 제거해주시기 바랍니다. +JSON 파일은 주석을 지원하지 않으므로, 텍스트 내의 주석은 예시용입니다. 직접 복사하여 사용하지 마세요. ::: -`resource/copilot/*.json` 및 필드 설명의 사용법. - -## 개요 +## 전체 필드 목록 ```json { - "stage_name": "暴君", // 스테이지 이름, 필수 입력 항목입니다. 레벨, 코드, stageId, levelId 등 중복되지 않는 중국어 이름이면 어떤 것이든 사용 가능합니다. - "opers": [ // 오퍼레이터 목록 + "stage_name": "暴君", // 스테이지명, 필수. 스테이지 중문명, code, stageId, levelId 등 유일성만 보장되면 가능 + "opers": [ + // 특정 오퍼레이터 지정 { - "name": "棘刺", // 오퍼레이터 이름 - - "skill": 3, // 스킬 ID (범위: [1, 3]), 선택 사항, 기본값은 1입니다. - - "skill_usage": 0, // 스킬 사용법, 선택 사항, 기본값은 0입니다. - // 0 - 'actions'에서 사용됨 - // 1 - 준비되면 사용 (예: 쏜즈: 데스트레자, 머틀: 지원지령β) - // 2 - 준비되면 사용되며, 한 번만 사용됨 (예: 마운틴: 스탠스 스위칭) - // 3 - 자동 결정 (구현되지 않음) - // 0은 자동 발동 스킬(예: 강타, 패시브 등)입니다. - - "requirements": { // 요구 사항, 예약된 필드이며 구현되지 않았습니다. 선택 사항이며 기본적으로 비어 있습니다. - "elite": 2, // 정예화 요구 사항, 선택 사항, 기본값은 0입니다. - "level": 90, // 레벨 요구 사항, 선택 사항, 기본값은 0입니다. - "skill_level": 10, // 스킬 레벨 요구 사항, 선택 사항, 기본값은 0입니다. - "module": 1, // 모듈 요구 사항, 선택 사항, 기본값은 0입니다. - "module_level": 3, // 모듈 레벨, 선택 사항, 기본값은 0입니다. - "potential": 1 // 잠재능력 요구 사항, 선택 사항, 기본값은 0입니다. + "name": "重岳", // 오퍼레이터명 + "skill": 3, // 스킬 번호. 선택 사항, 기본값 1, 범위 [1, 3] + "skill_usage": 2, // 스킬 사용법. 선택 사항, 기본값 0 + // 0 - 자동 사용 안 함 ("actions" 필드에 의존) + // 1 - 쿨타임 찰 때마다 사용 (예: 쏜즈 3스킬, 머틀 1스킬 등) + // 2 - X회 사용 (예: 마운틴 2스킬 1회 전환, 총웨 3스킬 5회 사용 등, "skill_times" 필드로 설정) + // 3 - 자동 판단 (구현 예정) + // 완전 자동 시전 스킬(패시브 등)인 경우 0 입력 + "skill_times": 5, // 스킬 사용 횟수. 선택 사항, 기본값 1 + "requirements": { + // 육성 상태 요구. 예약된 필드로 아직 미구현. 선택 사항, 기본값 비어 있음 + "elite": 2, // 정예화 단계. 선택 사항, 기본값 0 (요구 없음) + "level": 90, // 오퍼레이터 레벨. 선택 사항, 기본값 0 + "skill_level": 10, // 스킬 레벨. 선택 사항, 기본값 0 + "module": 1, // 모듈 번호. 선택 사항, 기본값 0 + "module_level": 3, // 모듈 레벨, 선택 사항, 기본값 0 + "potential": 1 // 잠재(돌파) 요구. 선택 사항, 기본값 0 } - }, + } ], "groups": [ { - "name": "任意正常群奶", // 그룹 이름, 필수 입력 항목입니다. - // `deploy` 아래의 `name` 필드와 일치하는 모든 이름이 허용됩니다. - - "opers": [ // 랜덤하게 선택되는 오퍼레이터들로 이루어진 목록입니다. 위의 `opers` 필드와 유사합니다. 레벨이 높은 오퍼레이터일수록 높은 우선순위를 갖습니다. + "name": "任意正常群奶", // 그룹명, 필수 + // 임의로 이름을 지으면 되며, 아래 deploy의 name과 일치하면 됨 + "opers": [ + // 오퍼레이터 중 하나 선택, 순서 없음, 육성 상태 높은 것 우선 선택, 사용법은 위 opers 필드와 동일 { - "name": "夜莺", // Nightingale + "name": "夜莺", "skill": 3, - "skill_usage": 2 // 스킬 재사용 대기 시간이 다를 수 있음 + "skill_usage": 2 // 특정 시점인 경우, 오퍼레이터마다 스킬 쿨타임이 다를 수 있으니 주의 }, { - "name": "白面鸮", // Ptilopsis + "name": "白面鸮", "skill": 2, "skill_usage": 2 } ] } ], - "actions": [ // 순차적으로 실행되는 작업들로 이루어진 목록입니다. 필수 입력 항목입니다. + "actions": [ + // 전투 중 조작. 순서가 있으며, 이전 동작이 완료되어야 다음 동작 실행. 필수 { - "type": "部署", // 작업 유형, 선택 사항, 기본값은 "Deploy"입니다. - // "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Output" | "SkillDaemon" | "MoveCamera" | "ResetStopwatch" - // "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" | "打印" | "摆完挂机" | "移动镜头" | "重置全局计时器" - // 영어와 중국어 모두 지원됩니다. - // "Deploy"는 비용이 충분해질 때까지 대기합니다 (타임아웃이 아닌 한). - // "Skill"은 스킬이 준비될 때까지 대기합니다 (타임아웃이 아닌 한). - // "SpeedUp"은 전환 가능하며, 사용 후 2배 속도가 됩니다. 다시 사용하면 정상 속도로 돌아갑니다. - // "BulletTime"은 예약된 필드이며 구현되지 않았으며, 모든 다른 작업과 함께 정상 속도로 돌아갑니다. - // "Output"은 문서의 내용을 출력합니다(자막 등). - // "SkillDaemon"은 스킬을 사용 가능할 때 사용하고, 끝까지 아무 작업도 수행하지 않습니다. - // "MoveCamera" — “파일럿 시험(引航者试炼)” 모드에서 사용되며, distance 필드도 함께 입력해야 합니다. - // "ResetStopwatch" — 전역 타이머를 초기화합니다. “time_elapsed” 조건을 참고하세요. - - // 다음 다섯 가지 필드 사이의 관계는 AND(논리곱)입니다, 즉 && - "kills": 0, // 필요한 킬 수에 도달할 때까지 대기합니다. 선택 사항, 기본값은 0입니다. - - "costs": 50, // 특정 코스트가 될 때까지 대기합니다. 선택 사항, 기본값은 0입니다. - // 잠재력으로 인해 코스트가 변경될 수 있으므로, 이 필드는 쉬운 전투에만 사용하세요. 그렇지 않으면 "cost_changes"를 사용하세요. - // 코스트가 두 자리 수인 경우에만 정확하게 인식됩니다. 세 자리 수 비용에는 권장하지 않습니다. - - "cost_changes": 5, // 특정 코스트가 변경될 때까지 대기합니다. 선택 사항, 기본값은 0입니다. - // 작업 시작 시 코스트를 기준으로 계산합니다 (이전 작업의 비용을 기준으로 함). - // 코스트가 두 자리 수인 경우에만 정확하게 인식됩니다. 세 자리 수 비용에는 권장하지 않습니다. - - "cooling": 2, // 스킬 쿨타임에 있는 오퍼레이터의 수가 특정 숫자에 도달할 때까지 대기합니다. 선택 사항, 기본값은 "ignore"(-1)입니다. - - "time_elapsed": 1000, // 밀리초(ms) 단위의 전역 타이머 조건입니다. 지정된 시간이 지나지 않으면 계속 대기합니다. 선택 항목이며, 기본값은 0으로 즉시 실행됩니다. - // 주의: 이 시간은 마지막으로 실행된 type:ResetStopwatch 액션부터 계산됩니다. - // 사용하기 전에 반드시 type:ResetStopwatch 액션을 실행해 타이머를 초기화해야 합니다. 그렇지 않으면 멈춰버립니다. - - // TODO: 다른 조건 - // TODO: "condition_type": 0, // 조건 집계 유형, 선택 사항, 기본값은 0입니다. - // // 0 - AND(논리곱); 1 - OR(논리합) - - "name": "棘刺", // 오퍼레이터/그룹 이름, "Deploy" 유형일 때 필수 입력 항목입니다. "Skill" 또는 "Retreat" 유형일 때 선택 사항입니다. - - "location": [ 5, 5 ], // 배치 위치 - // "Deploy" 유형일 때 필수 입력 항목입니다. - // "Skill" 또는 "Retreat" 유형일 때 선택 사항입니다. - // "Skill": 일반 오퍼레이터에게 스킬을 사용할 때 위치 대신 스킬 사용을 위한 위치 시설을 권장합니다. 스킬을 사용하기 위해 이름 대신 위치를 사용하세요. - // "Retreat": 여러 소환물이 존재할 때 위치 대신 소환을 위해 철수를 권장합니다. 이름 대신 위치를 사용하세요. - - "direction": "左", // 배치 방향, "Deploy" 유형일 때 필수 입력 항목입니다. - // "Left" | "Right" | "Up" | "Down" | "None" - // "左" | "右" | "上" | "下" | "无" - // 영어와 중국어 모두 지원됩니다. - - "skip_if_not_ready": false, // type이 "Skill"일 때만 유효합니다. 스킬이 준비되지 않았을 경우 현재 액션을 건너뛸 수 있으며, 주로 완료되지 않은 탄약 스킬을 비활성화할 때 사용됩니다. 선택 사항이며 기본값은 false입니다. - - "skill_usage": 1, // 스킬 사용 설정을 재정의합니다. "SkillUsage" 유형일 때 필수 입력 항목입니다. - // 예: Myrtle은 처음에 스킬을 사용하지 않고 공격해야 하며, 나중에 자동으로 스킬을 사용해야 합니다. - // 이 경우 1로 설정하세요. - - "pre_delay": 0, // 선행 지연 시간 (밀리초), 선택 사항, 기본값은 0입니다. - "post_delay": 0, // 후행 지연 시간 (밀리초), 선택 사항, 기본값은 0입니다. - - // "timeout": 999999999, // 예약된 필드이며 구현되지 않았습니다. - // 제한 시간 (밀리초), "Deploy" 또는 "Skill" 유형일 때 선택 사항, 기본값은 INT_MAX입니다. - // 타임아웃 시 다음 작업으로 진행합니다. - - "doc": "下棘刺了!", // 설명, 선택 사항, 효과는 없지만 UI에 표시됩니다. - "doc_color": "orange" // 설명 색상, 선택 사항, 효과는 없지만 UI에 표시됩니다. + "type": "部署", // 조작 유형, 선택 사항, 기본값 "Deploy" + // "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Output" | "SkillDaemon" | "MoveCamera" | "ResetStopwatch" + // "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" | "打印" | "摆完挂机" | "移动镜头" | "重置全局计时器" + // 중/영문 모두 가능, 효과 동일 + // "Deploy"인 경우, 코스트가 부족하면 코스트가 모일 때까지 계속 대기 (timeout 제외) + // "Skill"인 경우, 스킬 쿨타임이 안 찼으면 쿨타임 찰 때까지 계속 대기 (timeout 제외) + // "二倍速"은 토글 방식임. 한 번 쓰면 2배속, 다시 쓰면 1배속으로 돌아옴 + // "子弹时间"은 임의의 오퍼레이터를 클릭한 후 1/5 속도로 만드는 것. 다른 action을 수행하면 정상 속도로 복구됨 + // "name" 또는 "location" 중 하나 필수. 어떤 오퍼레이터를 눌러 저속 모드에 진입할지 지정. 전장 또는 대기열 오퍼레이터 모두 가능 (자동 판단) + // 만약 다음 동작이 "Skill" / "Retreat"라면, 다음 동작과 동일한 "name" 또는 "location"을 입력해야 함 + // 만약 다음 동작이 "Deploy"라면, 아무나 적어도 됨 (단 대기열에 있는 오퍼레이터는 누르면 인식이 가려질 수 있으므로 피하는 게 좋음) + // "打印" 화면에는 이 단계가 표시되지 않으며, doc 내용만 출력됨 (설명 표시 용도) + // "摆完挂机" "스킬 재사용 대기시간 완료 시 사용" 설정된 스킬만 사용하며, 전투 종료까지 아무것도 하지 않음 + // "移动镜头" "인도자의 시련" 모드에서 사용, distance 필드 필요 + // "重置全局计时器" 전역 타이머 리셋, "time_elapsed" 조건 참고 + // 현재 아래 5개 조건은 AND 관계임 (&&) + "kills": 0, // 킬 수 조건, 도달 못하면 계속 대기. 선택 사항, 기본값 0 (즉시 실행) + "costs": 50, // 코스트 조건, 도달 못하면 계속 대기. 선택 사항, 기본값 0 (즉시 실행) + // 코스트는 잠재 등의 영향을 받으므로 정확하지 않을 수 있음. 타임라인이 엄격하지 않은 전투에 적합 + // 그렇지 않으면 아래 cost_changes 사용 권장 + // 또한 코스트가 두 자리 수일 때만 인식이 비교적 정확함. 세 자리 수는 인식 오류 가능성 있음. 비추천 + "cost_changes": 5, // 코스트 변화량 조건, 도달 못하면 계속 대기. 선택 사항, 기본값 0 (즉시 실행) + // 이 action을 실행하기 시작한 시점부터 계산 (즉 이전 action이 끝난 시점의 코스트 기준) + // 음수 지원 (제이 등 코스트 지속 소모 오퍼레이터로 인해 코스트가 줄어드는 경우) + // 또한 코스트가 두 자리 수일 때만 인식이 비교적 정확함. 세 자리 수는 인식 오류 가능성 있음. 비추천 + "cooling": 2, // 쿨타임 중인 오퍼레이터 수 조건, 도달 못하면 계속 대기. 선택 사항, 기본값 -1 (인식 안 함) + "time_elapsed": 1000, // 밀리초(ms) 단위 전역 타이머 조건, 도달 못하면 계속 대기. 선택 사항, 기본값 0 (즉시 실행) + // 이전 type:ResetStopwatch action이 실행된 시점부터 계산됨 + // 사용 전 반드시 type:ResetStopwatch action을 실행하여 타이머를 초기화해야 함. 안 그러면 멈춤 + // TODO: 기타 조건 + // TODO: "condition_type": 0, // 실행 조건 간 관계, 선택 사항, 기본값 0 + // // 0 - AND; 1 - OR + "name": "棘刺", // 오퍼레이터명 또는 그룹명. type이 "Deploy"일 때 필수, "Skill" | "Retreat"일 때 선택 + "location": [ + 5, + 5 + ], // 오퍼레이터 배치 위치 + // type "Deploy" 시 필수 + // type "Skill" | "Retreat" 시 선택 + // "Skill": 필드 위 자동 장치 등에 추천 (name 없이 location으로 스킬 발동). 일반 오퍼레이터는 name 권장 + // "Retreat": 동명의 소환물이 여러 개일 때 추천 (name 없이 location으로 퇴각). 일반 오퍼레이터는 name 권장 + // 좌표 정보는 https://map.ark-nights.com/areas 에서 확인 가능. 설정에서 "좌표 표시"를 "MAA"로 선택하면 MAA 좌표 확인 가능 + "direction": "左", // 배치 방향. type "Deploy" 시 필수 + // "Left" | "Right" | "Up" | "Down" | "None" + // "左" | "右" | "上" | "下" | "无" + // 중/영문 모두 가능, 효과 동일 + "skip_if_not_ready": false, // type "Skill" 시 유효. 스킬 사용 불가 시 해당 동작 건너뛰기 허용. 주로 다 못 쓴 탄약 스킬 끄는 용도. 선택 사항, 기본값 false + "skill_usage": 1, // 스킬 용법 수정. type "SkillUsage" 시 필수 + // 예: 머틀 배치 직후에는 몹을 잡아야 해서 스킬을 안 쓰다가, 중반부터 자동으로 스킬을 써야 할 때 + // 해당 시점에 1로 설정하면 됨 + "skill_times": 5, // 스킬 사용 횟수. 선택 사항, 기본값 1 + "pre_delay": 0, // 전행 딜레이. 선택 사항, 기본값 0, 단위 ms + // 현재 action의 모든 조건이 충족된 후 타이머 시작, 종료 후 type 동작 실행 + "post_delay": 0, // 후행 딜레이. 선택 사항, 기본값 0, 단위 ms + // 현재 action의 type 동작 완료 후 타이머 시작, 종료 후 다음 action 진행 + // + // "timeout": 999999999, // 예약된 필드, 미구현 + // 타임아웃. type "Deploy" | "Skill" 시 선택. 기본값 INT_MAX, 단위 ms + // 타임아웃 시 현재 동작 포기하고 다음 동작 실행 + "distance": [ + 4.5, + 0 + ], // type "MoveCamera" 시 필수 + // [ x 이동 칸수, y 이동 칸수 ], 소수 가능, 음수 가능 + // x 양수면 카메라 우측 이동, y 양수면 카메라 위쪽 이동 + // 예: "distance": [-1, 1], "location": [5, 6]이면 실제로는 [6, 7]에 배치됨 + // 주의: x > +2 인 경우 강제로 화면 전환을 기다리며, 전환 후 동작 완료. 그 외에는 즉시 실행 및 완료 + "doc": "下棘刺了!", // 설명, 선택 사항. 인터페이스에 표시됨, 실제 기능 없음 + "doc_color": "orange" // 설명 글자색, 선택 사항, 기본값 회색. 인터페이스에 표시됨, 실제 기능 없음 }, - // 예시 1 + // 예시 1 { "name": "任意正常群奶", - "location": [ 5, 6 ], + "location": [ + 5, + 6 + ], "direction": "右" }, - // 예시 2 + // 예시 2 { "name": "史尔特尔", - "location": [ 4, 5 ], + "location": [ + 4, + 5 + ], "direction": "左", "doc": "你史尔特尔奶奶来啦!", "doc_color": "red" }, - // 예시 3 + // 예시 3 { "type": "二倍速" } ], - "minimum_required": "v4.0", // 필요한 최소한의 MAA 버전, 필수 입력 항목, 예약된 필드이며 구현되지 않았습니다. - "doc": { // 설명, 선택 사항입니다. + "minimum_required": "v4.0", // MAA 최소 요구 버전, 필수 + "doc": { + // 설명, 선택 사항 "title": "低练度高成功率作业", "title_color": "dark", - "details": "对练度要求很低balabala……", // 여기에 이름, 비디오 링크, 공략글 링크 등을 쓸 수 있습니다. + "details": "对练度要求很低balabala……", // 여기에 작성자명, 공략 영상 링크 등을 적으세요 "details_color": "dark" }, - "difficulty": 0 // 작업의 난이도, 선택 사항, 기본값은 0입니다. - // 0: 기본값, 설정 안 됨 - // 1: 일반 난이도 지원 - // 2: 레이드 난이도 지원 - // 3: 일반 및 레이드 난이도 지원 + "difficulty": 0 // 작업 난이도, 선택 사항, 기본값 0 + // 0: 기본, 미설정 + // 1: 일반 모드 지원 + // 2: 하드 모드 지원 + // 3: 일반, 하드 모드 지원 } ``` diff --git a/docs/ko-kr/protocol/integrated-strategy-schema.md b/docs/ko-kr/protocol/integrated-strategy-schema.md index 76d523cbbf..ba0e849bfc 100644 --- a/docs/ko-kr/protocol/integrated-strategy-schema.md +++ b/docs/ko-kr/protocol/integrated-strategy-schema.md @@ -1,47 +1,51 @@ ---- +--- order: 5 icon: ri:game-fill --- -# 통합전략 스키마 +# 통합 전략 프로토콜 ::: tip -주의: JSON 형식은 주석을 지원하지 않으므로 아래의 예시에서 주석은 제거해주시기 바랍니다. +JSON 파일은 주석을 지원하지 않습니다. 본문의 주석은 설명을 위한 것이므로 직접 복사하여 사용하지 마세요. ::: -## 로그라이크 리소스 파일 위치 +## 통합 전략 리소스 저장 위치 -- `resource/roguelike/`아래에 테마별 로그라이크 작업의 리소스를 저장합니다. - - 테마 폴더: `Phantom/` 팬텀 로그라이크, `Mizuki/` 미즈키 로그라이크, `Sami/` 사미 로그라이크, `Sarkaz/` 살카즈 로그라이크, `JieGarden/` 쉐이 로그라이크 - - `autopilot/` 내에는 각 레벨의 작전 json이 있습니다. - - `关卡名.json` 레벨의 작전 로직 - - `encounter/` 우연한 만남의 로직 (모든 비전투 및 상점이 아닌 노드) +- `resource/roguelike/` 하위에 테마별로 통합 전략 리소스를 저장합니다. + - 테마 폴더: `Phantom/` 팬텀 & 크림슨 솔리테어, `Mizuki/` 미즈키 & 카이룰라 아버, `Sami/` 탐험가의 은빛 서리 끝자락, `Sarkaz/` 살카즈의 영겁 기담, `JieGarden/` 쉐이의 기이한 계원 + - `autopilot/` 에는 각 스테이지의 작전 json 파일이 위치합니다. + - `스테이지명.json` 해당 스테이지의 작전 로직 + - `encounter/` 에는 우연한 만남(전투 및 상점을 제외한 모든 노드) 이벤트 로직이 위치합니다. - `default.json` 레벨링 모드 - - `deposit.json` 오리지늄 주괴 모드 + - `deposit.json` 오리지늄각뿔 파밍 모드 - `recruitment.json` 오퍼레이터 모집 로직 - - `shopping.json` 상점 구매 수집품 로직 + - `shopping.json` 상점 소장품 구매 로직 -- 특별히, `Sami/` 아래의 - - `foldartal.json`은 사미 로그라이크의 암호판의 사용 로직을 나타냅니다. - - `collapsal_paradigms.json`은 사미 로그라이크 붕괴 패러다임의 유형을 나타냅니다. - - `autopilot/关卡名_collapse.json` 레벨의 작전 로직 (붕괴 패러다임 모드) - - `encounter/collapse.json` 붕괴 패러다임 모드 우연한 만남 로직 +- 특별히 `Sami/` 폴더 하위에는: + - `foldartal.json` 사미 통합 전략의 암호판 사용 로직 + - `collapsal_paradigms.json` 사미 통합 전략의 붕괴 패러다임 유형 + - `autopilot/스테이지명_collapse.json` 작전 로직 (붕괴 패러다임 파밍 모드) + - `encounter/collapse.json` 붕괴 패러다임 파밍 모드의 우연한 만남 로직 -- `Sarkaz/` 아래의 - - `fragments.json`은 살카즈 로그라이크 사념의 기본 정보를 저장합니다. - - `map.json`은 살카즈 로그라이크 청사진 통과용 템플릿 이미지 정보를 저장합니다. +- `Sarkaz/` 폴더 하위에는: + - `fragments.json` 살카즈 통합 전략의 구상(Thought) 기본 정보 + - `map.json` 살카즈 통합 전략의 청사진 이동을 위한 템플릿 이미지 정보 -## 로그라이크 첫 단계 - 오퍼레이터 모집 +- `JieGarden/` 폴더 하위에는: + - `coppers.json` 주화의 기본 정보 및 줍기/교체 로직 -`resource/roguelike/主题名/recruitment.json` 은 오퍼레이터 모집의 로직을 설명합니다. +## 통합 전략 1단계 — 오퍼레이터 모집 -```json +`resource/roguelike/테마명/recruitment.json`은 오퍼레이터 모집 로직을 기술합니다. +`tools/RoguelikeRecruitmentTool` 및 `tools/RoguelikeOperSearch` 보조 도구를 사용하여 확인 및 작성할 수 있습니다. + +```json5 { - "theme": "Phantom", //로그라이크 테마 (팬텀) - "priority": [ //그룹의 우선순위, 순서대로 + "theme": "Phantom", // 통합 전략 테마 (여기서는 팬텀) + "priority": [ // 그룹별 우선순위 (순서대로) ... ], - "team_complete_condition": [ //팀의 완성도 검사 + "team_complete_condition": [ // 편성 완성도 검사 ... ] } @@ -49,32 +53,32 @@ icon: ri:game-fill ### 오퍼레이터 분류 -게임 이해에 따라 오퍼레이터를 다양한 **_groups_** (관련 개념은 [전투 스키마](./copilot-schema.md)를 참고)으로 분류합니다 +여러분의 게임 이해도에 따라 오퍼레이터를 다양한 **그룹** (관련 개념은 [자동지휘 프로토콜](./copilot-schema.md) 참조)으로 분류하세요. ::: info 주의 -1. 같은 그룹 내의 오퍼레이터와 소환물은 배치 방식이 일치해야 합니다(즉, 근접이거나 원거리로 동일). +1. 동일 그룹 내의 오퍼레이터와 소환물은 **배치 방식이 일치**해야 하며(모두 지상 또는 모두 언덕), **공격 범위가 최대한 비슷**해야 합니다. -2. 같은 오퍼레이터나 소환물을 다르게 사용할 수 있게 다른 그룹으로 분류할 수 있습니다. +2. 동일한 오퍼레이터나 소환물이라도 사용법에 따라 다른 그룹으로 분류할 수 있습니다. -3. 기존의 그룹 이름을 수정하지 마세요. MAA 업데이트 시 이전 버전의 작업을 사용할 수 없게 될 수 있습니다. +3. 기존에 존재하는 그룹 이름은 수정하지 마세요. MAA 업데이트 시 이전 버전의 리소스가 작동하지 않을 수 있습니다. -4. 새로운 그룹을 가능한 한 추가하지 마시고, 새로 추가하는 단위를 기존 그룹에 편입시키세요. +4. 가급적 그룹을 새로 추가하지 말고, 새로 추가하는 오퍼레이터를 사용 용도에 맞춰 기존 그룹에 포함시키세요. ::: ::: tip -기본적으로 1정 55레벨 이상의 오퍼레이터만 모집합니다. +기본적으로 1차 정예화 55레벨 이상의 오퍼레이터만 모집합니다. ::: -```json +```json5 { "theme": "Phantom", "priority": [ // 그룹, 순서대로 { - "name": "棘刺", // 그룹 이름(이 그룹 이름은 쏜즈) - "opers": [ // 그룹에 포함된 오퍼레이터, 순서대로, 오퍼레이터 배치 시 우선순위 표시, - // (예를 들어 이 그룹의 오퍼레이터를 배치할 때, 먼저 가시가 있는지 확인하고, 가시가 있으면 가시를 배치하고, 없으면 다음 오퍼레이터를 확인) + "name": "棘刺", // 그룹명 (이 그룹의 이름은 '쏜즈') + "opers": [ // 그룹에 포함된 오퍼레이터, 순서대로 배치 우선순위를 나타냄 + // (예: 이 그룹의 오퍼레이터를 배치해야 할 때, 쏜즈가 있는지 먼저 확인하고 있으면 배치, 없으면 혼을 확인) { "name": "棘刺", // 오퍼레이터 이름 ... @@ -85,7 +89,7 @@ icon: ri:game-fill } ] }, - "team_complete_condition": [ + "team_complete_condition": [ ... ] ] @@ -94,210 +98,269 @@ icon: ri:game-fill 1. 기존 그룹 소개 - 팬텀의 로그라이크를 예로 들어 설명: 오퍼레이터는 주로 다음과 같이 분류됩니다. + 사미 통합 전략 리소스를 예로 들면, 오퍼레이터를 다음과 같이 분류했습니다. - | Group | Considerations | Class | Operators | - | :------------------------ | :------------------- | :--------------- | :----------------------------------------------------------------- | - | **_Ground block_** | 전장과 잡몹 정리 | 디펜더, 가드 | 라 플루마, 마운틴, 몬3터, 링과 씬의 소환물, 스팟, 디펜더 예비 인원 | - | **_Ground single-block_** | 단독으로 보스와 교전 | 처형자, 스페셜 | 수르트, 키린R 야토, 몬3터, 레드 | - | **_Ranged C_** | 일반과 결전 | 스나이퍼, 캐스터 | 첸 더 홀룽데이, 골든글로우, 에이야퍄들라, 피아메타 | - | **_Ranged DPS_** | 대공 및 일반 | 스나이퍼, 캐스터 | 아르케토, 엑시아, 크루스, 스튜어드 | - | **_힐러_** | 치료 능력 | 힐러, 서포터 | 켈시, 스카디 더 커럽팅 하트, 히비스커스, 안셀 | - | **_코스트 회복_** | 코스트 회복 | 뱅가드 | 머틀, 이네스, 팽, 바닐라 | - | **_포탄 흡수_** | 포탄 흡수, 재배치 | 특수, 소환물 | 몬3터, 레드, 머틀, 예비 인원 | - | **_고지대 예비_** | 일정한 공격 능력 | | 오키드, 예비 인원 | + | 그룹 | 주요 고려 사항 | 주요 직군 | 오퍼레이터 예시 | + | :---------------------- | :---------------------------------- | :------------------------------- | :--------------------------------------------------------------------------- | + | **_地面阻挡_** | 전선 유지 및 일반 적 처리 | 디펜더, 가드 | 사리아, 마운틴, 라 플루마, Mon3tr, 링과 씬의 소환물, 스팟, 예비 디펜더 | + | **_地面单切/处决者_** | 엘리트 적 1:1 대처 | 스페셜리스트-처형자 | 수르트, 텍사스 디 오메르토사, 키린 R 야토, Mon3tr, 레드 | + | **_高台 C_** | 기본 공격 및 결전 화력 | 스나이퍼, 캐스터 | 위셔델, 로고스, 첸 더 홀룽데이, 골든글로우 | + | **_高台输出_** | 대공 및 기본 공격 화력 | 스나이퍼, 캐스터 | 아르케토, 엑시아, 크루스, 스튜어드 | + | **_速狙_** | 물리 피해, 표준 사거리 | 스나이퍼 | 엘라, 엑시아, 케이퍼, 크루스 | + | **_术师_** | 마법 피해, 표준 사거리 | 캐스터-코어 캐스터 | 에이야퍄들라, 로고스, 스튜어드 | + | **_辅助_** | 후방 1칸 공격 가능 | 서포터 | 비르투오사, 스즈란, 케이퍼, 오키드 | + | **_狙击_** | 긴 사거리의 언덕 | 스나이퍼-투척수/공성사수 | 위셔델, 티폰, 로사 | + | **_奶_** | 치료 능력 | 메딕, 서포터 | 켈시, 스카디 더 커럽팅 하트, 히비스커스, 안셀 | + | **_单奶_** | 공격 범위 깊이 >= 4 | 메딕 | 켈시, 리드 더 플레임 섀도우, 에이야퍄들라 더 크비트 아스카, 히비스커스, 안셀 | + | **_群奶_** | 공격 범위 깊이 < 4, 후방 치료 가능 | 메딕, 서포터 | 나이팅게일, 프틸롭시스, 스카디 더 커럽팅 하트 | + | **_回费_** | 코스트 수급 | 뱅가드 | 머틀, 이네스, 팽, 바닐라 | + | **_地刺_** | 저지 불가, 피해 또는 감속 | 스페셜리스트-매복자 | 언펙터, 아스카론, 맨티코어 | + | **_地面远程_** | 지상 사거리 김, 디펜더 뒤 공격 지원 | 가드-교관/로드 | 혼, 팔라스, 쏜즈, 실버애쉬 | + | **_领主_** | 지상 공격 범위 깊이 > 4, 대공 가능 | 디펜더-포트리스, 가드-로드 | 쏜즈, 실버애쉬, 츄바이 | + | **_盾法_** | 짧은 사거리, 방어 능력 보유 | 캐스터-진법 캐스터 | 린, 카넬리안 | + | **_炮灰_** | 탄환 흡수, 재배치 | 스페셜리스트, 소환물 | Mon3tr, 레드, 머틀, 예비 오퍼레이터 | + | **_大龙_** | 전방 방어, 합체 편의성 | 소환물 | 링의 소환물, 제시카 더 리버레이티드의 방패 | + | **_补给站_** | 메인 공격수 SP 보조 | 소환물 | 보급기, 메카 캐스터 소환물 | + | **_无人机_** | 언덕/지상 무시 치료 소환물 | 소환물 | 스카디의 해사, 사일런스의 드론 | + | **_支援陷阱_** | 지상 배치 폭발물 | 소환물 | W의 지뢰, 도로시의 함정 | + | **_障碍物_** | 배치 수 미소모, 어그로/저지 | 소환물 | 새장, 장애물 | + | **_其他地面_** | 우선순위 낮은 지상 유닛 | 밀치기, 1저지 뱅가드, 소드마스터 | 백파이프, 크루아상 | + | **_高台预备/其他高台_** | 우선순위 낮은 언덕 유닛 | 광역 캐스터, 체인 캐스터, 전술가 | 오키드, 예비 오퍼레이터 | -2. 특별 취급이 필요한 그룹 + ::: tip + `地面阻挡`은 오퍼레이터의 종합적인 방어 능력을 고려합니다. - 위의 일반적인 그룹 외에도 일부 오퍼레이터나 유형에 대한 맞춤형 조정이 필요할 수 있습니다. + `奶`는 종합적인 치유 능력을 고려합니다. 단일 메딕(4칸)이나 멀티 메딕(후방 커버 가능)의 공격 범위 구분이 필요한 경우 별도로 분류하여 사용해 주세요. - | Group | Operators | Features | - | :---------- | :-------------------- | :--------------------------------------------------------------------------------------------------- | - | Thorns | 쏜즈, 혼 | 장거리 근접, 많은 맵에서 좋음 | - | Summoners | 켈시, 링, 씬 | 근접 블록, 일부 맵은 배치 우선순위 필요, 소환물은 블록 또는 포드로 사용 가능 | - | Agent | 칸타빌레, 이네스 | 코스트 회복 가능, DPS 제공 및 단일 블록 | - | Skadi Alter | 스카디 더 커럽팅 하트 | 낮은 DP 비용, 특별한 범위, 일부 맵에서 최적의 위치 | - | Reed Alter | 리드 더 플레임 섀도우 | 사미 로그라이크에서 개막 캐스터, DPS 및 치유로 자주 사용, 일부 맵에서 최적의 위치 | - | SilverAsh | 실버애쉬, 무에나 | 큰 범위의 지상 오퍼레이터, 보스에게 매우 유용 | - | Surtr | 수르트 | 수르트는 항상 세 번째 스킬을 사용하므로 위치 선정 능력이 거의 없으며, 배치 우선순위가 매우 낮습니다. | - | Dice | 주사위 | 미즈키 로그라이크에서 주사위는 별도로 작동해야 합니다. | + `高台输出`는 순수 화력을 고려합니다. 공격 타입이나 범위 제한이 필요한 경우 `速狙`, `术师`, `辅助`, `盾法` 등을 별도로 사용해 주세요. -::: info -현재 정해진 그룹을 알 수 없는 지상 크루는 마지막 전형 (다른 지상) 뒤에, 고지대 그룹는 마지막 전형 (다른 고지대) 뒤에 고정되어 있습니다. + 함정류 소환물은 종류가 많으므로 `支援陷阱` 그룹에 넣지 말고 MAA가 자동으로 배치하도록 하는 것이 효율적입니다. + ::: + +2. 특수 조작이 필요한 그룹 + + 위의 일반적인 분류 외에도 특정 오퍼레이터나 직군을 정교하게 조작해야 할 때가 있습니다. 예를 들어: + + | 그룹 | 포함 오퍼레이터 | 주요 특징 | + | :--------- | :-------------------- | :---------------------------------------------------------------------------- | + | 益达 | 위셔델 | 언덕 딜러, 우선 배치하여 부담 경감 | + | 棘刺 | 쏜즈, 혼 | 지상 원거리 딜러, 팬텀 통합 전략 등에서 매우 좋은 자리가 있음 | + | 召唤类 | 켈시, 링, 씬 | 자체 저지 가능, 맵에 따라 우선 배치 필요, 소환물을 저지나 미끼로 활용 | + | 情报官 | 칸타빌레, 이네스 | 코스트 회복, 측면 딜링, 암살 모두 가능 | + | 浊心斯卡蒂 | 스카디 더 커럽팅 하트 | 저압 상황 힐링 준수, 특수 범위, 특정 맵에서 좋은 자리가 있음 | + | 焰苇 | 리드 더 플레임 섀도우 | 사미 통합 전략 권장 스타팅, 치유/공격 겸업, 특정 맵에서 좋은 자리가 있음 | + | 玛恩纳 | 무에나, 실버애쉬 | 지상 광역 결전 병기, 보스전 등에서 배치 | + | 史尔特尔 | 수르트 | 2차 정예화 후 3스킬 고정 사용 시 저지 능력 거의 없음, 배치 우선순위 매우 낮음 | + | 骰子 | 주사위 | 미즈키 통합 전략의 주사위는 별도 조작 필요 | + +::: info 주의 +현재 식별되지 않은 지상 오퍼레이터는 뒤에서 두 번째 그룹(`其他地面`) 뒤에, 식별되지 않은 언덕 오퍼레이터는 마지막 그룹(`高台预备/其他高台`) 뒤에 자동으로 추가됩니다. ::: -### 사전 설정 그룹--완전한 라인업 테스트 - -높은 계층을 통과하거나 도달하기 위해 기본 핵심 플레이어가 필요한 팀에서는 어떤 오퍼레이터가 필수적일까요? 몇 명이 필요할까요? - -::: info -현재 스크립트의 모집 로직은 라인업 완성도를 충족하기 전에 0 희망과 코어 오퍼레이터를 모집하며, 높은 레어도의 코어 오퍼레이터를 위해 희망을 존버합니다. -따라서 너무 높은 임계값 수치를 설정하지 마시고, 필요한 모든 오퍼레이터 수 (기본 핵심 라인업)가 4-8 자릿수가 되도록 권장합니다. +::: tip +새로 추가된 오퍼레이터는 각 테마의 `recruitment.json`에 수동으로 추가해야 합니다. 개발자가 모든 오퍼레이터를 즉시 추가하지 못할 수 있습니다. +누락된 것을 발견하면 Issue를 제보하거나 직접 PR을 보내주세요. ::: -```json +### 편성 프리셋 — 편성 완성도 검사 + +클리어 또는 고층 등반을 위해 필수적인 핵심 멤버는 누구일까요? 몇 명이 필요할까요? + +::: info 주의 +현재 스크립트의 모집 로직은 '편성 완성도'를 만족하기 전까지는 **희망 소모 0인 오퍼레이터(주로 3성)** 와 **KEY 오퍼레이터(화이트리스트)** 만 모집하며, 고등급 KEY 오퍼레이터를 위해 희망을 아낍니다. +(현재 구현 방식: 고성능 오퍼레이터와 3성에게 수동으로 KEY 태그 부여, 모집 시 KEY 오퍼레이터만 선택) (TODO: 0 희망 오퍼레이터 자동 식별) + +따라서 완성도 총합을 적절하게 설정해야 합니다. 필요한 총 오퍼레이터 수(핵심 1, 지상 2, 힐러 1-2, 언덕 1 등)는 4~8명 정도가 적당합니다. + +편성 완성도를 만족한 후에는 모집권을 얻을 때마다 오퍼레이터 점수와 2차 정예화 우선순위에 따라 모집합니다. 희망 자원 손실을 방지하려면 원하지 않는 오퍼레이터는 점수를 설정하지 않거나 동종 3성/예비대원보다 낮게 설정해 주세요. +(확실히 원하는 오퍼레이터나 절대 원하지 않는 오퍼레이터는 점수를 극단적으로 높거나 낮게 설정할 수 있습니다. `Sami`의 `止颂`(레싱) 설정 참조) + +작전 편성 시, 오퍼레이터 선택 화면의 기본 정렬(위->아래, 왼쪽->오른쪽) 순서대로 읽어들입니다. +이 순서에 기반해, 편성 완성도 조건을 만족하는 오퍼레이터 중 먼저 나온 순서대로 앞쪽에 배치하고, 조건이 충족되거나 대상이 없을 때까지 반복합니다. +그 후 예비 오퍼레이터를 맨 뒤로 보내고, 새로운 순서대로 선택합니다. +임시 모집 6성은 편성 시 기본적으로 맨 앞에 위치하므로 실제 편성에서 포함되기 쉽습니다. (TODO: 사용 불가능한 1정예 임시 모집 오퍼레이터 제외) + +뉴비 계정의 경우: 10회 모집 동안 KEY 오퍼레이터가 절반도 모이지 않으면 완성도 검사를 포기하고 점수대로 아무거나 모집합니다. 따라서 3성을 키우지 않은 뉴비 계정은 6성 2~3개와 예비대원만 잔뜩 들고 가는 경우가 생길 수 있습니다. +::: + +```json5 { - "theme": "Phantom", // 로그라이크 테마 + "theme": "Phantom", // 통합 전략 테마 "priority": [ // 그룹 ... ], - "team_complete_condition": [ // 라인업 완성도 검사 - { - "groups": [ // 필요한 그룹 멤버 - "C-team" + "team_complete_condition": [ // 편성 완성도 검사 + { // 하나의 조건(condition) 그룹 + "groups": [ // 어느 그룹의 오퍼레이터가 필요한가 + "高台输出" // (여기서는 고대출력 그룹의 오퍼레이터 1명 필요) ], - "threshold": 1 // 필요한 오퍼레이터 수 - }, // (이것은 C팀의 고지대 오퍼레이터이 필요하다는 것을 나타냅니다) - { + "threshold": 1 // 필요한 수량 + }, + { // 여러 조건 그룹 설정 가능 "groups": [ - "Thorns", // (최소 2명의 오퍼레이터가 필요합니다 Thorns, GroundBlock, Ground1Block, Fodder) - "GroundBlock", - "Ground1Block", - "Fodder" + "棘刺", // (여기서는 쏜즈, 지상저지, 지상암살, 포회 그룹 중 합해서 2명 필요) + "地面阻挡", + "地面单切", + "炮灰" ], "threshold": 2 }, + { + "groups": [ + "奶" // (여기서는 힐러 그룹 오퍼레이터 1명 필요) + ], + "threshold": 1 + } ... ] } ``` -### 오퍼레이터 모집을 위한 매개변수 조정 +::: caution +한 오퍼레이터가 여러 그룹에 속해 있어도, **하나의 조건 그룹 내에서는 한 번만 카운트**됩니다. +예: `쏜즈`가 `棘刺` 그룹과 `地面阻挡` 그룹에 모두 속해 있을 때, 위 예시의 두 번째 조건 그룹에서 `쏜즈`는 1명으로만 계산됩니다. -1. 그룹 내의 순서는 배치 검사 우선순위를 나타냅니다. +하지만 **서로 다른 조건 그룹 간에는 중복 카운트**됩니다. +예: `리드 더 플레임 섀도우`가 `高台输出`와 `奶` 그룹에 모두 속해 있다면, 첫 번째 조건과 세 번째 조건을 동시에 만족시키는 데 기여할 수 있습니다. +::: -2. 그룹 멤버의 각 필드와 스크립트 관련 로직의 의미 +### 오퍼레이터 모집 파라미터 조정 - ```json - { - "theme": "Phantom", - "priority": [ - "name": "GroundBlocking", // 그룹 이름 (이 경우 GroundBlocking) - "doc": "기준 라인은 1단 기어 (청소 능력 또는 필드 능력이 산보다 우수) > 산 > 2단 기어 (블록>2, 자체 회복 가능) > Spot, 필드 능력이 Spot보다 적은 경우 단일 절단 또는 포드 그룹", - // Doc 필드는 노트입니다. 프로그램에는 영향을 미치지 않습니다. - "opers": [ // 포함된 오퍼레이터, 순서대로 배치 우선순위를 나타냅니다. - { - "name": "가비알 디 인빈서블", // 오퍼레이터 이름 (가비알 디 인빈서블, 그룹 내 첫 번째 위치는 - // 지상 블로킹 그룹 배치 시 우선적으로 이격 가비알의 여부를 확인합니다.) - "skill": 3, // 사용할 스킬 (이 경우 스킬 3) - "skill_usage": 2, // 스킬 사용 모드, 3.3COPILOT_SCHEMA 참조, 비어 있으면 기본값은 1, 2는 지정된 횟수만큼 사용 - // (x는 "skill_times" 필드에 설정됨), 3은 아직 지원되지 않음. - "skill_times": 2, // 스킬 사용 횟수, 기본값은 1, "skill_usage" 필드가 2일 때 유효합니다. - "alternate_skill": 2, // 지정된 스킬이 없을 때 사용하는 대체 스킬, 일반적으로 6성 오퍼레이터가 E2를 달성하지 않았고 - // 승진 후 3 스킬을 사용하는 경우 - // (이 경우 3 스킬이 없을 때 2 스킬을 사용). - "alternate_skill_usage": 1 // 대체 스킬의 사용 모드 (이 필드는 아직 구현되지 않음) - "alternate_skill_times": 1 // 대체 스킬의 사용 횟수 (이 필드는 아직 구현되지 않음) - "recruit_priority": 900, // 모집 우선순위, 큰 숫자일수록 우선순위가 높으며, 900 이상은 반드시 모집 - // 400 이하의 우선순위는 일부 핵심 오퍼레이터의 우선순위보다 낮음 - // 임시로 모집된 오퍼레이터 우선순위는 자동으로 +800 - "promote_priority": 600, // 승진 우선순위, 큰 숫자일수록 우선순위가 높으며, 900 이상은 충분한 희망이 있으면 보장된 E2 - // 400 이하의 우선순위는 일반 3성 오퍼레이터보다 낮음 - // 팁: 모집 우선순위를 낮추거나 작성하지 않고, 일부 E2의 우선순위를 높이면 - // 임시로 모집된 오퍼레이터의 우선순위를 높이는 것입니다. - "is_key": true, // true인 경우, 오퍼레이터는 핵심 요소입니다. 비어 있으면 기본값은 false. - // 라인업 완성도 검사를 통과하지 못하면, 핵심 오퍼레이터와 0 희망 오퍼레이터만 모집하여 희망을 절약합니다. - "is_start": true, // true인 경우, 오퍼레이터는 시작 오퍼레이터입니다. 비어 있으면 기본값은 false. 팀에 시작 오퍼레이터이 없으면, - // 시작 오퍼레이터과 0 희망 오퍼레이터만 모집하고, 사용자로부터 작성된 오퍼레이터을 모집합니다. - "auto_retreat": 0, // 배치 후 몇 초 동안 자동 후퇴, 0보다 큰 경우 유효, 주로 특수 오퍼레이터 및 전위에 사용, - // 로그라이크는 보통 2배 속도로 시작하므로 스킬 지속 시간을 2로 나누는 것이 좋습니다. - "promote_priority_when_team_full": 850, - "recruit_priority_offsets": [ // 현재 라인업에 따라 우선순위 조정 - { - "groups": [ // 조건을 충족해야 하는 그룹 - "Kaltsit", - "GroundBlocking", - "Thorns" - ], - "is_less": false, // true는 미만, false는 초과. 비어 있으면 기본값은 false - "threshold": 2, // 조건 충족 횟수 - "offset": -300 // 충족 후 모집 우선순위 조정 - // (이것은 Kaltsit, GroundBlocking, Thorns에서 2명 이상의 오퍼레이터가 있을 때, - // 가비알 디 인빈서블의 모집 우선순위가 300 감소한다는 것을 의미합니다.) - } - ] - }, - ... - ], - ], - "team_complete_condition": [ - ... - ] - } +1. 그룹 내 오퍼레이터 순서는 작전 배치 시 선택 우선순위를 의미합니다. + +2. 임시 모집 오퍼레이터는 기본 점수에 +600점이 추가됩니다. + +3. 랜덤 승급(바로 2차 정예화) 오퍼레이터 점수는 모집 점수 + 2차 정예화 점수 합산으로 계산됩니다. + +4. 그룹 내 각 필드의 의미와 스크립트 로직 + + ```json5 + { + "theme": "Phantom", + "priority": [ + "name": "地面阻挡", // 그룹명 (여기서는 지상저지) + "doc": "기준: 1저지(잡몹처리/유지력 마운틴보다 강함) > 마운틴 > 2저지(2저지 이상, 자가회복) > 스팟. 유지력이 스팟보다 낮으면 1저지나 미끼 그룹으로.", + // "doc" 필드는 json 내부 주석용이며 프로그램 실행에 영향 없음 + "opers": [ // 포함된 오퍼레이터 (순서 = 배치 우선순위) + { + "name": "百炼嘉维尔", // 오퍼레이터 이름 (가비알 디 인빈서블이 1순위. 지상 저지 그룹 배치 시 먼저 확인) + "skill": 3, // 사용 스킬 (여기선 3스킬) + "skill_usage": 2, // 스킬 사용 모드 (자동지휘 프로토콜 참조. 여기선 안 쓰면 기본값 1) + // (0:안씀, 1:쿨마다, 2:x번만(skill_times), 3:미지원) + "skill_times": 2, // 스킬 사용 횟수 (skill_usage가 2일 때) + "alternate_skill": 2, // 지정 스킬 없을 때 대체 스킬 (6성 2차 정예화 전 등. 예: 3스킬 없으면 2스킬 사용) + "alternate_skill_usage": 1, // 대체 스킬 사용 모드 (미구현) + "alternate_skill_times": 1, // 대체 스킬 사용 횟수 (미구현) + "recruit_priority": 900, // 모집 우선순위. 높을수록 먼저 모집. 900↑: 보이면 필수로 집음. 400↓: 핵심 오퍼 2차 정예화보다 낮음. + // 임시 모집은 자동으로 +600 + "promote_priority": 600, // 승급(2차 정예화) 우선순위. 900↑: 희망 있으면 바로 승급. 400↓: 3성 모집보다 낮음. + // 팁: 모집 우선순위를 낮추고 승급 우선순위를 높이면, 임시 모집으로 떴을 때 승급을 잘 시켜줌. + "is_key": true, // true: 핵심(KEY) 오퍼레이터. 편성 완성 전에는 KEY와 0희망만 모집. + "is_start": true, // true: 스타팅 오퍼레이터. 파티에 스타팅 멤버 없으면 스타팅과 0희망만 모집. + // UI의 스타팅 오퍼레이터 설정과 연동됨. 사용자가 수동 입력하면 강제로 start로 설정됨. + "auto_retreat": 0, // 배치 후 n초 뒤 자동 철수. 0보다 클 때 작동. (특수/뱅가드용. 2배속 고려하여 지속시간/2 추천) + "recruit_priority_when_team_full": 850, // 편성 완성 후 모집 우선순위 (기본값: 모집 우선순위 - 100) + "promote_priority_when_team_full": 850, // 편성 완성 후 승급 우선순위 (기본값: 승급 우선순위 + 300) + "recruit_priority_offsets": [ // 현재 편성에 따른 모집 우선순위 조정 + { + "groups": [ // 조건 그룹 (중복 오퍼레이터 없이 그룹별 카운트) + "凯尔希", + "地面阻挡", + "棘刺" + ], + "is_less": false, // false: 이상(>=), true: 이하(<=). 기본값 false. + "threshold": 2, // 기준 수량. 기본값 0. + "offset": -300 // 조정값. 기본값 0. + // (예: 켈시, 지상 저지, 쏜즈 그룹 합쳐서 2명 이상이면 가비알 디 인빈서블의 모집 우선순위 -300) + } + ] + }, + ... + ], + ], + "team_complete_condition": [ + ... + ] + } ``` -3. 그룹과 오퍼레이터를 필요에 따라 추가합니다. + ::: info 주의 + `recruit_priority_offsets`의 `groups` 내 그룹들 간에 오퍼레이터가 중복되지 않도록 하세요. - 새로운 그룹을 추가할 때 기존 그룹에서 오퍼레이터를 복사할 수 있습니다. 개발자가 이미 부여한 평가를 참고하고, 이를 바탕으로 수정합니다. + `auto_retreat` 설정 시 작전 계획에서 별도로 `retreat_plan`을 설정할 필요가 없습니다. + ::: -## 통합 전략 2단계 - 전투 로직 +5. 오퍼레이터 및 그룹 추가 -`resource/roguelike/theme_name/autopilot/level_name.json` 은 각 레벨의 전투 전략을 설명합니다. + 새로운 그룹을 추가한 뒤, 기존 그룹에서 오퍼레이터를 복사해오거나 고수들의 평가를 참고하여 점수를 수정하세요. -### MAA의 기본 로그라이크 전투 로직 +## 통합 전략 2단계 — 전투 로직 -1. 맵의 그리드 유형에 따라 기본 전투 작업 수행 - - MAA는 맵의 그리드가 목표 지점인지 적 출현 지점인지, 고지대인지 지상인지, 배치 가능한지 여부에 따라 기본 전투 작업을 수행합니다. +`resource/roguelike/테마명/autopilot/스테이지명.json`은 각 스테이지의 작전 전략을 기술합니다. - - MAA는 맵 이름이나 번호를 기준으로 직업을 결정하며, 맵의 **표준**, **긴급**, **분기점**, **아이템 사용** 등의 상황을 판단하지 않습니다. +### MAA 통합 전략 공용 전투 로직 - - MAA는 전투 중 **맵의 정의되지 않은 그리드**을 판단하지 않습니다. 예를 들어, `Taming Hut`의 제단 위치, 왼쪽이나 오른쪽에서 나오는 몬스터의 `팔로워 효과` 등을 판단하지 않습니다. +(해당 스테이지의 작전 파일이 없을 때 적용됨) - 따라서 미래에는 **맵 이름의 모든 시나리오**에 대응할 수 있는 전투 로직을 설계해야 하며, 이 맵이 긴급 모드에서 작동하는 문제에 주의해야 합니다. +1. 타일 속성에 따른 기본 전투 + - MAA는 타일이 방어 지점인지 적 출현 지점인지, 언덕인지 지상인지, 배치 가능한지 등을 판단하여 기본 전투를 수행합니다. + - MAA는 맵 이름이나 번호만으로 로직을 결정하며, **일반/긴급**, **맵 변형**, **암호판 사용 여부** 등을 구분하지 않습니다. -2. MAA의 기본 전투 전략 -- 목표 지점 진입 막기 - 1. 지상 크루는 우선적으로 목표 지점 (그리드)를 중심으로 (또는 주변) 배치되며, 적 출현 지점을 향해 배치됩니다 (자동으로 계산됨). 적 출현 지점에는 배치되지 않습니다. + - MAA는 **지도 상에서 확실하지 않은 정보**(예: `사육장`의 제단 위치, `군중심리`의 적 출현 방향 등)는 판단하지 않습니다. - 2. 고지대보다 지상을 우선 배치하고, 목표 지점에서 주변으로 원형으로 배치됩니다. + 따라서, 하나의 맵 이름에 대해 **모든 변수**를 커버할 수 있는 범용적인 로직을 구성해야 합니다. - 3. 위의 로직에 따라 배치할 수 있는 것들 (오퍼레이터, 소환물, 지원 아이템 등)을 계속 배치합니다. +2. MAA 공용 전략 — 입구 막기 + 1. 지상 오퍼레이터는 **방어 지점** 타일 위(이유는 후술)나 주변에 우선 배치하며, 적이 오는 방향(자동 계산)을 바라봅니다. + + 2. 지상을 먼저 배치하고 힐러와 언덕을 배치합니다. 방어 지점을 중심으로 원형으로 퍼져나가며 배치합니다. + + 3. 배치 가능한 모든 것(오퍼레이터, 소환물, 지원 도구 등)을 계속해서 배치합니다. ### 기본 전투 전략 최적화 -1. 목표 지점 대체 +1. 방어 지점 대체 - 목표 지점 앞에 오퍼레이터를 쌓는 것은 분명히 현명하지 않습니다. 일부 레벨에는 통과할 수 없는 그리드가 있으며, 이러한 위치에서는 방어가 매우 효율적입니다. + 오퍼레이터를 무작정 방어 지점 앞에 쌓는 건 좋지 않습니다. 어떤 맵은 특정 길목을 막는 게 훨씬 효율적일 수 있습니다. + 또한 방어 지점이 여러 개일 때 MAA가 엉뚱한 곳을 막을 수도 있습니다. - 또는 여러 목표 지점이 있는 레벨에서 MAA가 어떤 목표 지점가 어떤 적 출현 지점와 대응되는지 모를 경우, 무작위로 배치할 수 있습니다. + 이때 [지도 위키](https://map.ark-nights.com/areas?coord_override=MAA)를 켜고, `설정`에서 `좌표 표시`를 `MAA`로 바꾼 뒤 지휘해 봅시다. - 이 경우 [map wiki](https://map.ark-nights.com/areas?coord_override=maa)를 열고 전투를 상상하면서 방어해야 할 우선순위 그리드와 방향을 찾아 `replacement_home`에 작성합니다. + 우선 방어해야 할 좌표와 방향을 찾아 json의 `"replacement_home"`에 적습니다. - 이 링크를 사용하세요. 그렇지 않으면 `설정`에서 `좌표 표시`를 `MAA`로 전환하세요. - - 그런 다음, 경험을 바탕으로 방어 우선순위가 필요한 지점의 좌표와 방향을 찾아 json의 `replacement_home`에 작성하세요. - - ```json - { - "stage_name": "蓄水池", // 레벨 이름 (중국어) - "replacement_home": [ // 진입 지점 (목표 지점 대체 지점), - // 최소 1개 이상이어야 완전합니다. - { - "location": [ // 그리드 좌표, 맵 위키에서 얻을 수 있음 - 6, - 4 - ], - "direction_Doc1": "선호 방향, 반드시 해당 방향이라는 의미는 아님 (알고리즘이 자체적으로 판단함)", - "direction_Doc2": "기본값은 없음, 즉 추천 방향이 없으며, 완전히 알고리즘에 의해 결정됨", - "direction_Doc3": "none / left / right / up / down / 无 / 上 / 下 / 左 / 右", - "direction": "left" // (이것은 그리드 6,4에서 왼쪽으로 오퍼레이터를 우선 배치함을 나타냅니다.) - } - ], - ... + ```json5 + { + "stage_name": "蓄水池", // 스테이지명 + "replacement_home": [ // 중요 방어 지점, 최소 1개 필수 + { + "location": [ // 맵 사이트에서 확인한 좌표 + 6, + 4 + ], + "direction_Doc1": "우선 방향. 절대적인 건 아님 (알고리즘 판단)", + "direction_Doc2": "생략 시 기본값 none (알고리즘이 알아서 판단)", + "direction_Doc3": "none / left / right / up / down / 无 / 上 / 下 / 左 / 右", + "direction": "left" // (6,4 좌표에 우선 배치하고 왼쪽을 보게 함. 주변 자동 배치도 왼쪽을 보려고 노력함) + } + ], ``` -2. 배치 그리드 블랙리스트 - - 방어를 우선해야 할 지점과 오퍼레이터를 배치하지 않아야 할 지점이 있습니다. 예를 들어 화염구가 지나가는 곳, 보스의 발 밑, 배치하기 좋지 않은 위치 등입니다. - - 이 경우 `blacklist_location`을 도입하여 MAA가 오퍼레이터를 배치하지 않도록 그리드를 블랙리스트에 추가합니다. - ::: info - 여기에 추가된 그리드는 나중에 배치 전략에 포함되더라도 배치되지 않습니다. + ::: tip + `replacement_home`은 `deploy_plan`이 모두 끝났는데도 대기 중인 오퍼레이터가 있을 때 작동합니다. 로직은 공용 전략과 같습니다. ::: - ```json +2. 배치 금지 구역 + + 화염구가 지나가는 길, 보스의 바로 발밑, 딜 각이 안 나오는 곳 등 배치하면 안 되는 곳을 `"blacklist_location"`으로 지정합니다. + + ::: info 주의 + 여기에 지정된 타일은 뒤에서 설명할 `deploy_plan`에 적혀 있어도 배치가 불가능합니다. + ::: + + ```json5 ... - "blacklist_location_Doc": "이것은 사용 예시이며, 맵 '蓄水池'가 필요로 하는 것은 아님.", - "blacklist_location": [ // 오퍼레이터 배치 금지 위치 + "blacklist_location_Doc": "예시입니다. 실제 저수지 맵에서 여기를 금지하라는 뜻은 아님", + "blacklist_location": [ // 배치 금지 좌표 [ 0, 0 @@ -309,36 +372,34 @@ icon: ri:game-fill ], ``` -3. 대체 맵 전략 +3. 기타 맵 전략 - 예를 들어, 미즈키 로그라이크에서 목표 지점에 몬스터가 있다면 주사위를 사용하여 몬스터 쌓이는 상황을 완화할 수 있습니다. + 예: 미즈키 통합 전략에서 방어 지점에 적이 들어오면 주사위를 굴릴 것인가? - ```json - "not_use_dice_Doc": "목표 지점 오퍼레이터가 후퇴할 때 MAA가 주사위를 사용할 필요가 있는지 여부. 비어 있으면 기본값은 false입니다.", + ```json5 + "not_use_dice_Doc": "방어 지점 라이프 감소 시 주사위 사용 안 함 여부. 기본값 false (사용함)", "not_use_dice": false, ``` -### 이제 긴급 작전인가요? 이제 진정한 실력을 발휘할 때에요! - 맞춤형 전투 전략 +### 커스텀 작전 전략 -`"deploy_plan"` 및 `"retreat_plan"`을 사용하여 맞춤 설정 +`"deploy_plan"`(배치)과 `"retreat_plan"`(철수)을 사용하여 정교한 작전을 짭니다. -맞춤형 전략은 기본 전투 전략보다 우선하며, 맞춤형 전략의 모든 단계를 시도한 후 저장되거나 퇴각한 오퍼레이터가 기본 전투 전략에 따라 배치됩니다. +커스텀 전략은 공용 전략보다 우선합니다. 커스텀 전략이 모두 실행된 후 남은 오퍼레이터는 공용 전략에 따라 배치됩니다. -문제가 발생했을 때 맞춤형 계획을 너무 많이 설정할 필요는 없습니다. 중요한 단계를 완료한 후 MAA에 맡기거나 둘 다 결합하는 것이 더 나을 수 있습니다. +모든 전략을 다 작성할 필요는 없으며, 핵심적인 부분만 작성하고 나머지는 MAA에게 맡기는(공용 전략) 방식이 효율적일 수 있습니다. -1. 그룹을 사용하여 오퍼레이터 배치 +1. 그룹별 오퍼레이터 배치 - ```json - "deploy_plan": [ // 배치 로직: 위에서 아래로, 왼쪽에서 오른쪽으로 순서대로 - // 첫 번째 오퍼레이터를 찾고, 찾지 못하면 건너뜁니다. + ```json5 + "deploy_plan": [ // 배치 로직 로직 (위에서 아래로, 왼쪽에서 오른쪽으로 검색하여 첫 번째로 찾은 오퍼레이터 배치) { - - "groups": ["GavialAlter", "Mudrock", "GroundC", "Horn", "Vanguard"], // 이 그룹에서 오퍼레이터를 찾습니다. - "location": [ 6, 4 ], // 첫 번째 오퍼레이터을 그리드 6,4에 배치하고 왼쪽을 향합니다. - "direction": "left", // 찾지 못하면 다음 배치 작업으로 넘어갑니다. - }, + "groups": [ "百嘉", "基石", "地面C", "号角", "挡人先锋" ],// 이 단계에서 이 그룹들 중 오퍼레이터를 탐색 + "location": [ 6, 4 ], // 가비알 디 인빈서블, 라인 유지 오퍼레이터, 지상 딜러, 혼 등의 그룹 순회 + "direction": "left" // 첫 번째로 찾은 오퍼레이터를 6,4 좌표에 왼쪽을 보게 배치 + }, // 없으면 다음 단계로 { - "groups": [ "Summoner" ], + "groups": [ "召唤" ], "location": [ 6, 3 ], "direction": "left" }, @@ -350,27 +411,38 @@ icon: ri:game-fill ] ``` - ::: info - MAA는 모든 배치 명령을 평탄화한 후 가장 높은 우선순위 배치 작업을 실행합니다. - 예: [ "Gavial", "Cornerstone", "GroundC"]를 [6,4]에 배치하고, [ "Cornerstone", "GroundC"]를 [6,3]에 배치한 후 MAA는 배치 명령을 포매팅하여 [ "Gavial", "Cornerstone", "GroundC", "Cornerstone", "GroundC"]로 만듭니다. - 전투 중 [6,4]에 있는 "Gavial" 오퍼레이터가 후퇴하면, "Cornerstone" 오퍼레이터가 있다면 [6,4]에 배치되며 [6,3]에는 배치되지 않습니다. + ::: info 주의 + MAA는 모든 배치 명령을 평탄화(flatten)한 뒤 가장 우선순위가 높은 행동을 수행합니다. + 예: [6,4]에 ["A", "B"], [6,3]에 ["B", "C"]를 배치하라고 하면, 전체 목록은 [(6,4)-A, (6,4)-B, (6,3)-B, (6,3)-C]가 됩니다. + 만약 [6,4]의 A가 죽었고 내 손에 B가 있다면, [6,3]이 아니라 [6,4]에 B를 우선 배치합니다. + + 즉, 거시적으로 볼 때 매번 배치 동작 후 처음부터 전략을 다시 검토합니다. (현재 단계 위치가 비어 있고, 배치 가능한 해당 그룹 오퍼레이터가 있는지) ::: -2. 특정 시간에 오퍼레이터 배치 ::: tip - 특정 단일 절단 오퍼레이터나 포드가 필요한 사용 시나리오에 적합합니다. + 자주 쓰이는 조합 팁: + 1. 메인 방어선: `["地面阻挡", "处决者", "其他地面"]` (메인 탱커 죽으면 암살자로 시간 벌기). 압박 심할 때: `["重装","地面阻挡", "处决者", "炮灰", "其他地面"]`. 탱커 뒤: `["地面远程","地面阻挡", "处决者", "其他地面"]`. 어그로/미끼: `["炮灰", "障碍物", "其他地面"]`. + + 2. 언덕 딜러: `["高台输出", "其他高台"]`. 아무나 놔도 된다면: `["高台输出", "狙击", "辅助", "盾法", "其他高台"]`. + + 3. 무에나나 매복자에게 적합한 위치: `["玛恩纳", "地刺"]` + ::: + +2. 특정 시점에 배치 (조건부 배치) + ::: tip + 암살자나 미끼를 특정 타이밍에 쓸 때 유용합니다. ::: - ```json + ```json5 "deploy_plan": [ { - "groups": [ "StrangeVirtue", "Assassin", "Vanguard", "OtherFloors" ], + "groups": [ "异德", "刺客", "挡人先锋", "其他地面" ], "location": [ 5, 3 ], "direction": "left", - "condition": [ 0, 3 ] // 처치 수가 0 - 3일 때만 이 작업을 수행합니다. + "condition": [ 0, 3 ] // 처치 수(kill count)가 0~3일 때만 수행 }, { - "groups": [ "StrangeVirtue", "Assassin", "Vanguard", "OtherFloors" ], + "groups": [ "异德", "刺客", "挡人先锋", "其他地面" ], "location": [ 5, 3 ], "direction": "left", "condition": [ 6, 10 ] @@ -379,27 +451,29 @@ icon: ri:game-fill ] ``` -3. 특정 시간에 오퍼레이터 퇴각 +3. 특정 시점에 철수 ::: tip - 때때로 포드가 너무 강해 필드를 유지하거나 라인업을 이동하기 위해 배치해야 할 때가 있습니다. 이때 퇴각하세요! + 유인용 오퍼레이터가 강해서 쓰러지지 않거나, 자리를 비워야 할 때 철수합니다. + + 같은 위치의 배치/철수 `condition` 숫자가 겹치지 않게 주의하세요. (놓자마자 회수할 수 있음) ::: - ```json - "retreat_plan": [ // 특정 시간에 오퍼레이터 퇴각 대상 + ```json5 + "retreat_plan": [ // 특정 시점에 철수 { "location": [ 4, 1 ], - "condition": [ 7, 8 ] // 처치 수가 7 - 8일 때 [4,1]에 있는 오퍼레이터를 제거합니다. 없으면 건너뜁니다. + "condition": [ 7, 8 ] // 처치 수 7~8일 때 [4,1] 오퍼레이터 철수. 없으면 패스. } ] ``` -4. 특정 시간에 스킬 비활성화 (_TODO_) +4. 특정 시점에 스킬 사용 (to do) -5. 추가 필드 (권장하지 않음) +5. 기타 필드 (권장하지 않음) - ```json - "role_order_Doc": "오퍼레이터 유형 배치 순서, 지정되지 않은 부분은 Guard, Vanguard, Medic, Defender, Sniper, Caster, Supporter, Specialist, Summoner 순서로 채워집니다.", - "role_order": [ // 권장하지 않음, deploy_plan 필드를 구성하세요. + ```json5 + "role_order_Doc": "직업 배치 순서. 영문 입력. 미기재 시 가드, 뱅가드, 메딕, 디펜더, 스나이퍼, 캐스터, 서포터, 스페셜리스트, 소환물 순서", + "role_order": [ // 비권장, deploy_plan 사용 권장 "warrior", "pioneer", "medic", @@ -410,20 +484,20 @@ icon: ri:game-fill "special", "drone" ], - "force_air_defense_when_deploy_blocking_num_Doc": "필드에 10000개의 블록 유닛이 있을 때 강제적으로 총 1쌍의 공중 유닛을 배치합니다 (기본 배치 로직에는 영향을 미치지 않음), 이 기간 동안 의료 유닛 배치는 금지되지 않습니다 (기본값은 false).", - "force_air_defense_when_deploy_blocking_num": { // 권장하지 않음, deploy_plan 필드를 구성하세요. + "force_air_defense_when_deploy_blocking_num_Doc": "필드에 저지 유닛 10000명 배치 시 대공 유닛 1명 강제 배치 시작 (기본값 false). 이 기간 동안 의료 유닛 배치 금지되지 않음.", + "force_air_defense_when_deploy_blocking_num": { // 비권장, deploy_plan 사용 권장 "melee_num": 10000, "air_defense_num": 1, "ban_medic": false }, - "force_deploy_direction_Doc": "특정 직업에 대한 강제 배치 방향", - "force_deploy_direction": [ // 권장하지 않음, deploy_plan 필드를 구성하세요. + "force_deploy_direction_Doc": "특정 직업군의 강제 배치 방향 설정", + "force_deploy_direction": [ // 비권장, deploy_plan 사용 권장 { "location": [ 1, 1 ], - "role_Doc": "입력된 직업에 대한 강제 배치 방향 적용", + "role_Doc": "적용할 직업군", "role": [ "warrior", "pioneer" @@ -443,62 +517,62 @@ icon: ri:game-fill ], ``` -### 오퍼레이터의 플레이 스타일에 대한 특별한 이해가 있습니까? -- 특정 오퍼레이터의 정교한 운영 +::: info 주의 +MAA가 현재 스테이지 이름에 맞는 커스텀 전략 파일(`스테이지명.json`)을 찾지 못하면 공용 전략을 실행합니다. -이 오퍼레이터를 별도로 그룹화하세요. +스테이지 이름 인식 자체를 실패하면 아무것도 하지 않습니다. +::: -과제를 작성할 때 이 오퍼레이터가 기존 과제와의 우선순위를 고려하세요. +### 특정 오퍼레이터 정밀 조작 -또는 이 오퍼레이터에 대한 전투 로직을 따로 작성할 수도 있습니다. +해당 오퍼레이터를 별도 그룹으로 만드세요. -오퍼레이터 한 명만 사용해도 됩니다! MAA로 레벨을 클리어하세요 (다른 논리의 불완전성 때문에 가능성은 매우 낮습니다). +작업 작성 시 이 오퍼레이터와 기존 작업 간의 우선순위를 고려하세요. -참고 예시: 1. 팬텀 로그라이크의 Thorns 2. 미즈키 로그라이크의 Texas the Omertosa 3. 사미 로그라이크의 Reed the Flame Shadow +아예 그 오퍼레이터 하나만 사용하는 작전 로직을 구성할 수도 있습니다. -## 통합 전략 단계 3: 조우 노드 로직 +참고 예시: 1. 팬텀 통합 전략 쏜즈, 2. 미즈키 통합 전략 특사스, 3. 사미 통합 전략 리드 더 플레임 섀도우/위셔델, 4. 살카즈 통합 전략 위셔델 -`resource/roguelike/theme_name/encounter/default.json` 레벨링 모드에서 조우 이벤트 선택에 대한 전략 +## 통합 전략 3단계 — 우연한 만남(Encounter) 로직 -`resource/roguelike/theme_name/encounter/deposit.json` 투자 모드에서 조우 이벤트 선택에 대한 전략 +`resource/roguelike/테마명/encounter/default.json` (레벨링 모드) -### MAA가 조우를 판단하는 방법 +`resource/roguelike/테마명/encounter/deposit.json` (파밍 모드/스타팅 파밍 모드) -OCR이 조우를 인식하지만 선택은 고정된 위치에서 이루어집니다. +### MAA의 우연한 만남 판단 방식 -조우를 인식하지 못하면 하단의 선택지를 클릭합니다. +OCR로 이벤트 이름을 인식하지만, 선택지는 **고정된 위치**를 클릭합니다. -일반적으로 약간의 조정만 필요하거나 조정이 필요 없습니다 (개발자가 이미 처리했습니다). +이벤트 이름 인식을 실패하면 선택지 아이콘(있으면)을 누르거나 가장 아래쪽 선택지를 누릅니다. -### 조우 옵션의 우선순위 최적화 +선택지 아이콘은 있는데 선택 불가능한 경우 가끔 멈출 수 있습니다 (TODO). -각 조우 옵션의 효과를 확인하려면 [prts.wiki](https://prts.wiki/w/%E9%9B%86%E6%88%90%E6%88%98%E7%95%A5)를 참조하세요. 옵션이 반드시 고정되지 않습니다. +로직을 개선할 때 일반적으로 미세 조정만 하거나 아예 안 해도 됩니다 (고수들이 다 해놨으니까요). -조우 옵션을 수정하여 MAA가 특별한 결말로 향하도록 유도할 수 있습니다. +### 선택지 우선순위 최적화 (Encounter) -```json +[PRTS 위키](https://prts.wiki/w/%E9%9B%86%E6%88%90%E6%88%98%E7%95%A5) 등을 참고하여 선택지 효과를 확인하세요. (선택지는 고정이 아닐 수 있음) + +특정 엔딩을 보거나 특정 보상을 원한다면 우선순위를 수정할 수 있습니다. + +```json5 { - "theme": "Sami", // 로그라이크 테마 - "stage": [ // 조우 이벤트 + "theme": "Sami", // 테마 + "stage": [ // 이벤트 목록 { - "name": "低地市集", // 조우 이름 - "option_num": 3, // 총 몇 개의 옵션이 있는지 (이 경우: 3) - "choose": 3, // 어떤 옵션을 먼저 선택해야 하는지 (여기서는 세 번째 옵션을 우선 선택함) - // 선택할 수 없으면 도주 옵션을 선택합니다 (기본적으로 마지막 옵션) - - "choice_require": [ // 옵션 선택 요구 사항 - // (프로그램 운영에는 영향을 미치지 않음 - // 적용 가능한 상황만 표시하여 수정하기 쉽게 함) + "name": "低地市集", // 이벤트 이름 (저지대 시장) + "option_num": 3, // 총 선택지 개수 (여기선 3) + "choose": 3, // 우선 선택할 선택지 번호 (여기선 3번째). 실패 시 런(주로 마지막). + "choices": [ // 선택 조건 (현재는 주석 용도, 로직 구현 시 참고용) { - "name": "약초 선택", // 옵션 이름 - "ChaosLevel": { // 면역 / 가벼운 수준 - "value": "3", // 필요한 수 - "type": ">" // 초과인지 미만인지 - //(여기서는 면역 / 가벼운 수준이 3을 초과하는 경우만 - // "약초 선택" 옵션이 활성화됨) + "name": "选择碎草药", // 선택지 이름 (잘게 썬 약초 선택) + "ChaosLevel": { // 간섭 지수 / 등불 수치 조건 + "value": "3", // 기준값 + "type": ">" // > 3 일 때 활성화 } }, { - "name": "보기 좋은 천 선택", + "name": "选择好看的织物", "ChaosLevel": { "value": "3", "type": ">" @@ -507,79 +581,266 @@ OCR이 조우를 인식하지만 선택은 고정된 위치에서 이루어집 ... ``` -### 팀 상황에 따라 특정 옵션의 우선순위 동적으로 설정 (_TODO_) +### 팀 상황에 따른 동적 우선순위 조정 (TODO) -## 통합 전략 단계 4: 무역 상점 수집 우선순위 +## 통합 전략 4단계 — 상점/소장품 우선순위 -`resource/roguelike/theme_name/shopping.json` 상점에서 수집품 구매에 대한 전략을 설명 (전투 후 수집품 선택?) +`resource/roguelike/테마명/shopping.json`은 상점 구매 및 소장품(전투 후 획득 포함?) 선택 전략을 기술합니다. -```json +```json5 { - "theme": "Phantom", // 로그라이크 테마 - "priority": [ // 순서가 우선순위 - // 순서가 높을수록 구매 우선순위가 높음. - // 그러나 우선순위 판단은 오퍼레이터 및 역할의 스크리닝 이전에 이루어집니다. - // 고우선순위 제품이 스크리닝되어 아무것도 구매하지 않는 경우가 발생할 수 있습니다. + "theme": "Phantom", // 테마 (여기서는 팬텀) + "priority": [ // 구매 우선순위 (순서대로) + // chars, roles 필터링이 먼저 적용되므로 조건 안 맞으면 안 삼. { - "name": "Golden Chalice", // 수집품 이름 (이 경우 Golden Chalice) - "no_longer_buy": true, // true는 아이템을 획득한 후 더 이상 돈을 쓰지 않음을 의미 - // false 또는 비어 있으면 아이템을 계속 구매함 - "ignore_no_longer_buy": true, // true는 상점에 수집품이 있을 때 "no_longer_buy"를 무시함 - // 즉, 구매함 - // false 또는 생략된 경우, 상점에 있음 - "effect": "每有5源石锭, 所有我方单位的攻击速度+7", // 수집품 효과 (운영에는 영향을 미치지 않으며 정렬에 유용함) - "No": 167 // 수집품 번호 (위키에서 찾을 수 있으며, 운영에는 영향을 미치지 않음) + "name": "金酒之杯", // 소장품 이름 (금주에 든 술잔) + "no_longer_buy": true, // true: 이 소장품을 획득하면 더 이상 구매하지 않음. + "ignore_no_longer_buy": true, // true: 상점에 이 소장품이 있다면 "구매 중단" 상태여도 구매함. + "effect": "每有5源石锭,所有我方单位的攻击速度+7", // 효과 메모 + "No": 167 // 도감 번호 메모 }, ... { - "name": "Hand of Diffusion", - "chars": [ // 팀에 이러한 오퍼레이터가 있을 때 이 아이템을 구매함 - "Passenger" // (이 경우 팀에 패신저가 있으면, - // Hand of Diffusion을 만났을 때 구매하려고 시도함) + "name": "扩散之手", // 확산의 손 + "chars": [ // 이 오퍼레이터가 있을 때만 구매 + "异客" // (패신저가 있을 때 구매 시도) ], - "effect": "[Diffusion Artist], [Chain Artist], and [Blast Artist] regain 2 SP for each unit they deal damage to.", + "effect": "【扩散术师】、【链术师】和【轰击术师】每对一个单位造成伤害就回复2点技力值", "No": 136 }, ... { - "name": "Folding the halberd - Breaking the cauldron", - "roles": [ // 팀에 이러한 직군이 있을 때 이 수집품을 구매함 - "WARRIOR" // (이 경우 팀에 가드 오퍼레이터가 있으면 - // Halberd-Breaker를 만났을 때 구매하려고 시도함) + "name": "折戟-破釜沉舟", // 부러진 창 - 배수진 + "roles": [ // 이 직군이 있을 때만 구매 + "WARRIOR" // (가드 직군이 있을 때 구매 시도) ], - "effect": "All [Guard] Operators members have -40% Defence, but +40% Attack Power and +30% Attack Speed.", + "effect": "所有【近卫】干员的防御力-40%,但攻击力+40%,攻击速度+30", "No": 16 }, ... { - "name": "Miss.Christine Touch coupon", - "promotion": 2, // 팀에 승진할 오퍼레이터가 2명 있을 때 구매함 - "effect": "Immediate promote two operators (Does not consume Hope)", + "name": "Miss.Christine摸摸券", // 미스 크리스틴 쓰다듬기 권 + "promotion": 2, // 승급 가능한 오퍼레이터가 2명 이상일 때 구매(?) + "effect": "立即进阶两个干员(不消耗希望)", "No": 15 }, + ... + + { + "name": "警戒篱木", // 경계의 쐐기 + "effect": "坍缩值-2,目标生命上限+2", + "No": 198, + "decrease_collapse": true // true: 획득 시 붕괴치 감소. (mode 5 붕괴 파밍 때는 안 삼) + }, + ... + + "others": // 절대 구매하지 않는 목록 (엔딩 분기용 등) + { + "name": "无人起重机" // 무인 기중기 + }, ``` -## 원하는 로직 (_TODO_) +## 통합 전략 특수 메커니즘 -### 자동 포메이션 로직 +### 탐험가의 은빛 서리 끝자락 — 암호판 -1. 다양한 맵의 포메이션 완성도 테스트 및 스킬 우선순위를 설정할 수 있습니다. +`resource/roguelike/Sami/foldartal.json`은 사미 통합 전략의 암호판 전략을 기술합니다. -2. 사용할 수 있는 라인업에 따라 일부 어려운 전투를 피할 수 있습니다. +```json5 +{ + "theme": "Sami", // 테마 (탐험가의 은빛 서리 끝자락) + "groups": [ // 암호판 사용 전략 그룹 + { + "usage": "SkipBattle", // 용도: 전투 건너뛰기 (전투 노드 회피 등) + "doc": "전투 회피용, 파밍 모드", + "pairs": [ // 조합 목록. 위에서부터 확인해서 만들 수 있으면 다 씀. 없으면 진입. + { // (상흔 + 공허 조합) + "up": [ // 상판 + "伤痕" + ], + "down": [ // 하판 + "空无" + ] + }, + { // (추방자+경악, 추방자+의혹... 순차 검색) + "up": [ + "黜人", + "猎手", + ... + ], + "down": [ + "惊讶", + "疑惑", + ... + ] + } + ] + }, + { + "usage": "Boss", // 보스전용 + "doc": "보유한 모든 암호판 사용", + ... + } + ], + "foldartal": [ // 암호판 데이터 (참고용) + { + "name": "布局", // 유형 (배치) + "foldartal": [ + { + "name": "黜人", // 이름 (추방자) - 중국어 원문 유지 + "effect": "选择所有右侧邻近的战斗节点" // 효과 + }, +``` -### 경로 찾기 알고리즘 최적화 +### 탐험가의 은빛 서리 끝자락 — 붕괴 패러다임 -예를 들어, 첫 3개의 스테이지에서는 더 많은 전투를 달성하고 나중에는 적은 전투를 달성하여 개발을 더 좋게 만들 수 있습니다. +`check_collapsal_paradigms`가 `true`일 때, MAA는 두 가지 방법으로 붕괴 상태를 확인합니다. -### 스킬 유지 +- **Panel Check**: 맵 선택 화면 상단 패널을 클릭하여 확인. +- **Banner Check**: 화면 오른쪽의 붕괴 알림 배너를 감지. -특정 프레임에 배치된 오퍼레이터는 스킬이 켜진 후 x초 동안 대기하며, 축에 맞추기 쉽습니다. `Skill_hold` 를 `Deploy_plan` 아래에 작성하거나 `Skill_hold_plan`을 작성할 수 있습니다. +붕괴치가 증가하는 다양한 상황을 고려했습니다: -### 스킬 종료 +1. 전투 후 비완벽 전투로 붕괴치 증가 -> Banner Check +2. 전투 후 소장품 획득으로 붕괴치 변동 -> Banner Check +3. 우연한 만남 선택지 선택 -> Banner Check +4. 교활한 상인에서 구매 -> Banner Check +5. 암호판 사용으로 붕괴치 감소 -> Banner Check +6. 다음 층 진입 -> Panel Check +7. Banner Check 중 붕괴 패러다임이 사라진 경우(소멸), 혹시 2단계가 한 번에 사라졌을 가능성을 대비해 다음 맵 화면에서 Panel Check. +8. `double_check_collapsal_paradigms`가 `true`면 맵 화면 갈 때마다 Panel Check (놓친 거 확인용). -탄약 스킬이 있는 오퍼레이터에게 유용합니다. +히든 붕괴 패러다임 파밍 예시 (히든 엔딩 조건 달성용): + +```json5 +{ + "theme": "Sami", + "mode": 5, + "investment_enabled": false, + "squad": "远程战术分队", + "roles": "稳扎稳打", + "core_char": "维什戴尔", + "expected_collapsal_paradigms": ["目空一些", "睁眼瞎", "图像损坏", "一抹黑"] +} +``` + +`mode`가 `5`일 때: + +- `스테이지명_collapse.json` 작전 전략을 우선 사용합니다. (예: `resource/roguelike/Sami/autopilot/事不过四_collapse.json`) +- `resource/roguelike/Sami/encounter/collapse.json` 이벤트 전략을 사용합니다. +- `decrease_collapse`가 `true`인(붕괴치 낮추는) 소장품을 사지 않습니다. + +`mode`가 5가 아니어도 `check_collapsal_paradigms`가 `true`면 붕괴를 체크하고, `expected_collapsal_paradigms` 목록에 있는 붕괴가 뜨면 **작업을 정지**합니다. (목록에 없는 게 뜨면 재시도 안 함) + +히든 붕괴 파밍 추천 난이도: N10. 추천 덱: + +- 위셔델 + 스팟 + 스튜어드 +- 리드 더 플레임 섀도우 + 오키드 + 포푸카 +- 티폰 + 스팟 + 스튜어드 + +### 쉐이의 기이한 계원 — 주화 + +`resource/roguelike/JieGarden/coppers.json`은 쉐이 통합 전략의 주화 배치/교환 전략을 기술합니다. + +```json5 +{ + "theme": "JieGarden", // 테마 (쉐이의 기이한 계원) + "addons": { // 주화 접두어 효과 (참고용) + "锈色": "投出时,每经过一个节点,获得源石锭+1", // 녹슨 + "存护": "加入钱盒时,获得护盾值+2", // 존호 + "入幻": "加入钱盒时,获得希望+1", // 입환 + "引光": "加入钱盒时,获得烛火+1", // 인광 + "巡游": "投出时,每完成一场战斗,获得票券+1" // 순유 + }, + "coppers": [ // 주화 목록 + { + "name": "大炎通宝", // 주화 이름 (대염 통보) - 중국어 원문 유지 + "desc": "普通又空白,什么也没有", // 설명 + "rarity": "NORMAL", // 희귀도 + "pickup_priority": 0, // 줍기 우선순위 (높을수록 우선) + "discard_priority": 1000 // 버리기/교체하기 우선순위 (높을수록 먼저 버림) + }, + { + "name": "衡-奇土生金", // 형 - 기토생금 + "desc": "投出时,立即获得源石锭+4(下次投钱前变化为-大炎通宝)", + "rarity": "NORMAL", + "pickup_priority": 200, + "discard_priority": 800, + "cast_discard_priority": 999 // (선택) 이미 던져진 상태일 때의 버리기 우선순위. + // 던지고 나면 효과가 변하는(대염 통보가 되는) 것들에 사용. + }, + { + "name": "厉-西廉贞", // 려 - 서렴정 + "desc": "投出时,精英及领袖敌人的生命值、攻击力+10%,在险路恶敌及岁兽残识中攻击力、生命值额外+20%", + "rarity": "NORMAL", + "pickup_priority": 0, + "discard_priority": 1998, + "cast_discard_priority": 2098 // 던지면 디버프 걸리는 주화 등 + }, + ... + ] +} +``` + +#### 주화 교환 로직 + +MAA는 쉐이 통합 전략에서 자동으로 주화를 줍고 교환합니다. + +::: tip 활성화 조건 + +- 투자 모드: "투자 모드에서 쇼핑/모집/2층진입 켜기" 옵션 필요 +- 기타 모드: 기본 활성화 + ::: + +1. **주화 줍기**: 전투 종료 후 주화 드랍 창에서 `pickup_priority`가 가장 높은 것을 선택. +2. **주화 교환**: 주머니가 꽉 찼을 때 새 주화를 주우면: + - 주머니 속 주화들의 유형/이름/투척상태 식별 + - `discard_priority`가 가장 높은(가장 쓸모없는) 주화 탐색 + - 새 주화의 `discard_priority`가 그것보다 낮으면(더 좋으면) 교체, 아니면 포기. + +3. **투척 상태 특수 처리**: + - `cast_discard_priority`가 설정된 주화가 '던져진' 상태라면, `discard_priority` 대신 `cast_discard_priority`를 사용하여 가치를 판단. + +#### 주화 식별 메커니즘 + +MAA는 다음 방법으로 주화를 인식하고 처리합니다: + +1. 템플릿 매칭으로 주화 유형 아이콘(려/형/화) 식별 +2. 유형 아이콘 위치 기반 ROI 오프셋으로 OCR 이름 식별 +3. 주화의 '투척됨' 상태 식별 +4. 교환 화면에서 목록을 스크롤하며 모든 주화 스캔 및 비교 + +#### 인식 흐름 예시 + +![image](/images/zh-cn/copper-explanation-1.png) +![image](/images/zh-cn/copper-explanation-2.png) + +::: info 주의 + +- OCR로 인식된 주화 이름이 설정 파일에 없으면, MAA는 디버그 이미지를 `debug/roguelike/coppers/unknown` 디렉토리에 저장합니다. + +::: + +## 향후 구현 예정 (TODO) + +### 자동 편성 로직 + +1. 맵별 고유 편성 완성도/스킬 우선순위 설정 +2. 현 편성으로 감당 불가능한 고난이도 맵 회피 + +### ~~길찾기 알고리즘 최적화~~ (초기 구현됨) + +3층까지 전투 많이, 그 뒤로 전투 적게 등 성장 곡선 최적화. 노드 연결 인식 등 + +### 스킬 대기 (Skill Hold) + +배치 후 x초 대기 후 스킬 발동 (택틱 최적화) + +### 스킬 끄기 + +탄약형 스킬 끄기 등 diff --git a/docs/ko-kr/protocol/integration.md b/docs/ko-kr/protocol/integration.md index 421fd05e6f..eff47e7628 100644 --- a/docs/ko-kr/protocol/integration.md +++ b/docs/ko-kr/protocol/integration.md @@ -3,518 +3,808 @@ order: 1 icon: bxs:book --- -# 통합문서 +# 통합 문서 -## API +## 인터페이스 소개 ### `AsstAppendTask` -#### 프로토타입 +#### 인터페이스 원형 ```cpp -TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* params); +AsstTaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* params); ``` -#### 설명 +#### 인터페이스 설명 -작업을 추가합니다. +작업 추가 #### 반환 값 -- `TaskId` - 작업이 성공적으로 추가되면 작업 ID가 반환됩니다. - 그렇지 않으면 0이 반환됩니다. +- `AsstTaskId` + 추가 성공 시 해당 작업 ID 반환, 이후 작업 파라미터 설정에 사용 가능; + 추가 실패 시 0 반환 -#### 매개변수 설명 +#### 파라미터 설명 -- `AsstHandle handle` - 인스턴스 핸들 -- `const char* type` - 작업 유형 -- `const char* params` - JSON 형식의 작업 매개변수 +:::: field-group +::: field name="handle" type="AsstHandle" required +인스턴스 핸들 +::: +::: field name="type" type="const char*" required +작업 유형 +::: +::: field name="params" type="const char*" required +작업 파라미터, json string +::: +:::: ##### 작업 유형 목록 - `StartUp` - 게임 시작 + 시작 및 깨우기 -```json5 -// 해당 작업 매개변수 -{ - "enable": bool, // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true - "client_type": string, // 클라이언트 타입이 필요합니다. - // 옵션: "Official" | "Bilibili" | "txwy" | "YoStarEN" | "YoStarJP" | "YoStarKR" - "start_game_enabled": bool, // 클라이언트를 자동으로 실행할지 여부, 선택 사항, 기본값은 false - "account_name": string // 계정 전환, 선택 사항, 기본값은 전환하지 않음 - // 이미 로그인된 계정으로만 전환 가능, 로그인 이름으로 검색, 모든 로그인된 계정에서 고유한 입력 내용 보장 필요 -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="client_type" type="string" required +클라이언트 버전 +
+옵션: `Official` | `Bilibili` | `txwy` | `YoStarEN` | `YoStarJP` | `YoStarKR` +::: +::: field name="start_game_enabled" type="boolean" optional default="false" +클라이언트 자동 실행 여부 +::: +::: field name="account_name" type="string" optional +계정 전환, 기본값은 전환하지 않음 +
+로그인된 계정으로만 전환 가능하며, 로그인 이름으로 검색하므로 입력 내용이 로그인된 모든 계정 중 유일해야 함 +
+공식 서버: `123****4567`인 경우 `123****4567`, `4567`, `123`, `3****4567` 입력 가능 +
+Bilibili 서버: `张三`인 경우 `张三`, `张`, `三` 입력 가능 +::: +:::: - `CloseDown` - 게임 종료 + 게임 종료 -```json5 -// 해당 작업 매개변수 -{ - "enable": bool, // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true - "client_type": string, // 클라이언트 버전이 필수이며, 빈칸을 채우지 않으면 실행되지 않습니다. - // 옵션: "Official" | "Bilibili" | "txwy" | "YoStarEN" | "YoStarJP" | "YoStarKR" -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="client_type" type="string" required +클라이언트 버전, 비워두면 실행하지 않음 +
+옵션: `Official` | `Bilibili` | `txwy` | `YoStarEN` | `YoStarJP` | `YoStarKR` +::: +:::: - `Fight` - 작전 + 이성 사용 작전 -```json5 -// 해당 작업 매개변수 -{ - "enable": bool, // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true - "stage": string, // 스테이지 이름, 선택 사항, 기본적으로 현재/마지막 스테이지로 설정됩니다. 실행 중에 편집할 수 없습니다. - // "1-7", "S3-2" 등 모든 메인스토리 스테이지를 지원합니다. - // 레벨 끝에서 노말/하드를 입력하여 노말과 하드 난이도를 전환할 수 있습니다. - // "CE-6" 등 일부 특수 스테이지를 지원합니다. (C# 통합 예시 참조) - "medicine": int, // 최대 사용 가능한 이성 회복제 수, 선택 사항, 기본값은 0 - "expiring_medicine": int, // 48시간 이내에 만료되는 이성 회복제 수, 선택 사항, 기본값은 0 - "stone": int, // 최대 사용 가능한 오리지늄의 수, 선택 사항, 기본값은 0 - "times": int, // 최대 반복 횟수, 선택 사항, 기본값은 무한대입니다. - "series": int, // 연전 횟수, 선택사항, 1~6 - // -1 시리즈 전환을 비활성화하려면 - // 0 현재 사용 가능한 최대 시리즈 수로 자동 전환하려면, 현재 사용 가능한 횟수가 6회 미만인 경우 사용 가능한 최소 횟수를 선택하세요. - // 1~6 지정된 횟수로 변경하려면 - "drops": { // 드랍 수량을 지정합니다. 선택 사항, 기본적으로 지정되지 않습니다. - "30011": int, // 키: 아이템 ID; 값: 아이템 수량. 키는 resource/item_index.json을 참조합니다. - "30062": int // OR 조합 - }, - /* 아이템은 OR 연산자와 결합되며, 즉 어떤 조건을 만족하면 작업이 중지됩니다. */ - - "report_to_penguin": bool, // Pengiun Stats에 데이터를 업로드할지 여부, 선택 사항, 기본값은 false - "penguin_id": string, // Pengiun Stats ID, 선택 사항, 기본값은 빈 문자열입니다. `report_to_penguin`이 `true`인 경우에만 사용할 수 있습니다. - "server": string, // 서버, 선택 사항, 기본값은 "CN"입니다. 재료 드랍 인식과 업로드에 영향을 미칩니다. - // 옵션: "CN" | "US" | "JP" | "KR" - "client_type": string, // 클라이언트 버전, 선택 사항, 기본값은 빈 문자열입니다. 게임이 충돌한 후 다시 연결하는 데 사용됩니다. 빈 값은 이 기능을 비활성화합니다. - // 옵션: "Official" | "Bilibili" | "txwy" | "YoStarEN" | "YoStarJP" | "YoStarKR" - "DrGrandet": bool, // 오리지늄을 사용하여 "이성을 절약하는(매우 중요)" 옵션, 선택 사항, 기본값은 false입니다. 오리지늄을 사용해야하는 경우에만 유효합니다. - // 이성 1 포인트가 복구되면 오리지늄을 사용하여 확정화면에서 대기한 다음 즉시 오리지늄을 사용합니다. -} -``` - -특수 스테이지의 일부를 지원합니다. 자세한 내용은 [자동 현지화 예제](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/tools/AutoLocalization/example/ko-kr.xaml#L233)를 참고하세요. +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="stage" type="string" optional +스테이지명, 기본값은 비어 있음(현재/지난 스테이지 인식). 실행 중 설정 불가 +
+`"1-7"`, `"S3-2"` 등 모든 메인 스토리 스테이지 지원 +
+스테이지명 끝에 `Normal`/`Hard`를 입력하여 일반/하드 난이도 전환 가능 +
+섬멸 작전의 경우 반드시 `"Annihilation"` 입력 +
+현재 진행 중인 SideStory의 뒤쪽 3개 스테이지는 반드시 전체 스테이지 번호를 입력해야 함 +::: +::: field name="medicine" type="number" optional default="0" +이성 회복제 최대 사용 개수 +::: +::: field name="expiring_medicine" type="number" optional default="0" +48시간 내 만료되는 이성 회복제 최대 사용 개수 +::: +::: field name="stone" type="number" optional default="0" +오리지늄 최대 사용 개수 +::: +::: field name="times" type="number" optional default="2147483647" +전투 횟수 +::: +::: field name="series" type="number" optional +연속 전투 횟수, -1~6 +
+`-1`: 전환 비활성화 +
+`0`: 현재 사용 가능한 최대 횟수로 자동 전환. 만약 현재 이성이 6회 미만이면 사용 가능한 최소 횟수 선택 +
+`1~6`: 지정된 연속 전투 횟수 +::: +::: field name="drops" type="object" optional +지정 드랍 수량, 기본값은 지정 안 함. key는 item_id, value는 수량. key는 `resource/item_index.json` 파일 참조 +
+예: `{ "30011": 10, "30062": 5 }` +
+위 조건들은 OR 관계이므로, 어느 하나라도 도달하면 작업 중지 +::: +::: field name="report_to_penguin" type="boolean" optional default="false" +펭귄 물류(Penguin Stats) 데이터 전송 여부 +::: +::: field name="penguin_id" type="string" optional +펭귄 물류 전송 ID, 기본값 비어 있음. `report_to_penguin`이 true일 때만 유효 +::: +::: field name="server" type="string" optional default="CN" +서버, 드랍 인식 및 업로드에 영향 +
+옵션: `CN` | `US` | `JP` | `KR` +::: +::: field name="client_type" type="string" optional +클라이언트 버전, 기본값 비어 있음. 게임 크래시 시 재시작 후 재접속하여 계속 파밍하는 용도. 비워두면 해당 기능 비활성화 +
+옵션: `Official` | `Bilibili` | `txwy` | `YoStarEN` | `YoStarJP` | `YoStarKR` +::: +::: field name="DrGrandet" type="boolean" optional default="false" +이성 절약 모드, 오리지늄 사용 가능성이 있을 때만 유효 +
+오리지늄 사용 확인 창에서 대기하다가, 현재 1이성이 회복되면 즉시 오리지늄을 사용 +::: +:::: +일부 소수 자원 스테이지명도 지원합니다. [통합 예시](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/tools/AutoLocalization/example/zh-cn.xaml#L260)를 참고하세요 - `Recruit` - 공개모집 + 공개 모집 -```json5 -// 해당 작업 매개변수 -{ - "enable": bool, // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true - "refresh": bool, // 3★ 태그를 새로 고칠지 여부, 선택 사항, 기본값은 false - "select": [ // 클릭할 태그 레벨, 필수 - int, - ... - ], - "confirm": [ // 확인용 태그 레벨, 필수. 계산용으로만. 빈 배열로 설정할 수 있습니다. - int, - ... - ], - "first_tags": [ // 기본 태그, 태그 레벨이 3인 경우에만 유효합니다. 선택 사항, 기본값은 비어 있습니다. - string, // 태그 레벨이 3이면 여기에 있는 태그(있는 경우)가 최대한 많이 선택됩니다. - ... // 또한 강제 선택이므로 '3등급 태그 선택 해제' 설정은 모두 무시됩니다. - ], - "extra_tags_mode": int, // 더 많은 태그 선택, 선택 사항, 기본값은 0 - // 0 - 기본 동작 - // 1 - 태그 3개 선택, 충돌 가능 - // 2 - 가능한 경우 더 많은 고성급 태그 조합을 동시에 선택, 충돌 가능 - "times": int, // 고용 횟수, 선택 사항, 기본값은 0입니다. 계산용으로만 0으로 설정할 수 있습니다. - "set_time": bool, // 시간을 9시간으로 설정할지 여부, `times`가 0인 경우에만 사용 가능한 옵션입니다, 선택 사항, 기본값은 true입니다. - "expedite": bool, // 즉시 완료 허가증을 사용할지 여부, 선택 사항, 기본값은 false입니다. - "expedite_times": int, // 즉시 완료 허가증을 사용할 횟수, `expedite`가 `true`일 때만 사용 가능한 옵션입니다, 선택 사항, 기본적으로 `times`가 한도에 도달할 때까지 무한대입니다. - "skip_robot": bool, // 로봇 태그가 인식될 때 건너뛸지 여부, 선택 사항, 기본값은 건너뛰기입니다. - "recruitment_time": { // 태그 레벨과 지속 시간(분)을 설정합니다, 선택 사항, 기본값은 540(9시간)입니다. - "3": int, - "4": int, - ... - }, - "report_to_penguin": bool, // Penguin Stats에 보고할지 여부, 선택 사항, 기본값은 false입니다. - "penguin_id": string, // Penguin Stats 사용자 ID, 선택 사항, 기본값은 빈 문자열입니다. `report_to_penguin`이 `true`인 경우에만 사용할 수 있습니다. - "report_to_yituliu": bool, // YITULIU에 보고할지 여부, 선택 사항, 기본값은 false입니다. - "yituliu_id": string, // YITULIU 사용자 ID, 선택 사항, 기본값은 빈 문자열입니다. `report_to_yituliu`이 `true`인 경우에만 사용할 수 있습니다. - "server": string, // 서버, 선택 사항, 기본값은 "CN"입니다. 업로드에 영향을 미칩니다. -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="refresh" type="boolean" optional default="false" +3성 태그 새로고침 여부 +::: +::: field name="select" type="array" required +클릭할 태그 등급 +::: +::: field name="confirm" type="array" required +확인 클릭할 태그 등급. 공모 계산만 할 경우 빈 배열로 설정 가능 +::: +::: field name="first_tags" type="array" optional +우선 태그, 태그 등급이 3일 때만 유효. 기본값 비어 있음 +
+태그 등급이 3일 때, 여기에 있는 태그(존재하는 경우)를 가능한 많이 선택하며, 강제 선택이므로 "3성 태그 선택 안 함" 설정을 무시함 +::: +::: field name="extra_tags_mode" type="number" optional default="0" +추가 태그 선택 모드 +
+`0` - 기본 동작 +
+`1` - 충돌 가능성 무시하고 태그 3개 선택 +
+`2` - 충돌 가능성 무시하고 가능한 많은 고성급 태그 조합 동시 선택 +::: +::: field name="times" type="number" optional default="0" +모집 횟수. 공모 계산만 할 경우 0으로 설정 가능 +::: +::: field name="set_time" type="boolean" optional default="true" +모집 시간 설정 여부. `times`가 0일 때만 유효 +::: +::: field name="expedite" type="boolean" optional default="false" +즉시 완료 허가증 사용 여부 +::: +::: field name="expedite_times" type="number" optional +즉시 완료 사용 횟수, `expedite`가 true일 때만 유효. 기본값은 무제한(즉 `times` 상한까지) +::: +::: field name="skip_robot" type="boolean" optional default="true" +로봇 태그 인식 시 건너뛸지 여부 +::: +::: field name="recruitment_time" type="object" optional +태그 등급(3 이상)과 대응하는 희망 모집 시간(분 단위), 기본값은 모두 540(즉 09:00:00) +
+예: `{ "3": 540, "4": 540 }` +::: +::: field name="report_to_penguin" type="boolean" optional default="false" +펭귄 물류 데이터 전송 여부 +::: +::: field name="penguin_id" type="string" optional +펭귄 물류 전송 ID, 기본값 비어 있음. `report_to_penguin`이 true일 때만 유효 +::: +::: field name="report_to_yituliu" type="boolean" optional default="false" +Yituliu 데이터 전송 여부 +::: +::: field name="yituliu_id" type="string" optional +Yituliu 전송 ID, 기본값 비어 있음. `report_to_yituliu`가 true일 때만 유효 +::: +::: field name="server" type="string" optional default="CN" +서버, 업로드에 영향 +
+옵션: `CN` | `US` | `JP` | `KR` +::: +:::: - `Infrast` - 기반시설 교대 + 기반시설 교대 -```json5 -{ - "enable": bool, // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true - "mode": int, // 전환 모드, 선택 사항입니다. 실행 중에는 편집할 수 없습니다. - // 0 - 기본값, 자동 전환 - // 10000 - 사용자 정의 모드, 인프라 스키마 문서를 참조하세요. - // 20000 - 로테이션: 원키 로테이션 모드로 제어센터, 발전소, 기숙사, 사무실을 스킵하고, 기타 시설은 교대근무를 하지 않고 기본 운영(드론 사용, 접수실 로직 등)을 그대로 유지 - "facility": [ // 전환할 시설, 필수입니다. 실행 중에 편집할 수 없습니다. - string, // 시설 이름: "Mfg" | "Trade" | "Power" | "Control" | "Reception" | "Office" | "Dorm" | "Processing" | "Training" - ... - ], - "drones": string, // 드론 사용, 선택 사항, 기본값은 "_NotUse"입니다. - // "_NotUse"、"Money"、"SyntheticJade"、"CombatRecord"、"PureGold"、"OriginStone"、"Chip" - "threshold": float, // 의욕 임계값, 범위 [0, 1.0], 선택 사항, 기본값은 0.3입니다. - "replenish": bool, // 오리지늄 조각을 보충할지 여부, 선택 사항, 기본값은 false입니다. - "dorm_notstationed_enabled": bool, // "비어 있지 않음" 옵션을 활성화할지 여부, 기본값은 false입니다. - "dorm_trust_enabled": bool, // 숙소에서 신뢰도작을 할지에 대한 여부, 기본값은 false입니다. - "reception_message_board": bool, // 접수실 게시판에서 크레딧을 수집할지 여부, 선택 사항, 기본값 true - "reception_clue_exchange": bool, // 단서 교환을 수행할지 여부, 선택 사항, 기본값 true - "reception_send_clue": bool, // 단서를 보낼지 여부, 선택 사항, 기본값 true - - /* 다음은 mode == 10000일 때만 유효합니다 */ - "filename": string, // 사용자 정의 구성 json 파일 경로 - "plan_index": int, // 사용자 정의 구성 플랜 인덱스 -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="mode" type="number" optional default="0" +교대 작업 모드 +
+`0` - `Default`: 기본 교대 모드, 단일 시설 최적해 +
+`10000` - `Custom`: 사용자 정의 교대 모드, 사용자 설정 로드. [기반시설 스케줄링 프로토콜](./base-scheduling-schema.md) 참고 +
+`20000` - `Rotation`: 원터치 로테이션 모드. 제어 센터, 발전소, 숙소, 사무실은 건너뛰고, 나머지 시설은 교대하지 않지만 기본 조작(드론 사용, 응접실 로직 등)은 유지 +::: +::: field name="facility" type="array" required +교대할 시설(순서 있음). 실행 중 설정 불가 +
+시설명: `Mfg` | `Trade` | `Power` | `Control` | `Reception` | `Office` | `Dorm` | `Processing` | `Training` +::: +::: field name="drones" type="string" optional default="\_NotUse" +드론 용도. `mode = 10000`일 때 이 필드는 무효 +
+옵션: `_NotUse` | `Money` | `SyntheticJade` | `CombatRecord` | `PureGold` | `OriginStone` | `Chip` +::: +::: field name="threshold" type="number" optional default="0.3" +컨디션 임계값, 범위 [0, 1.0] +
+`mode = 10000`일 때 이 필드는 "autofill"에 대해서만 유효 +
+`mode = 20000`일 때 이 필드는 무효 +::: +::: field name="replenish" type="boolean" optional default="false" +무역소 "오리지늄 조각" 자동 보충 여부 +::: +::: field name="dorm_notstationed_enabled" type="boolean" optional default="false" +작업 오퍼레이터 숙소 "미배치" 옵션 활성화 여부 +::: +::: field name="dorm_trust_enabled" type="boolean" optional default="false" +숙소 남은 자리에 신뢰도 미만 오퍼레이터 배치 여부 +::: +::: field name="reception_message_board" type="boolean" optional default="true" +응접실 게시판 크레딧 수령 여부 +::: +::: field name="reception_clue_exchange" type="boolean" optional default="true" +단서 교환 수행 여부 +::: +::: field name="reception_send_clue" type="boolean" optional default="true" +단서 보내기 여부 +::: +::: field name="filename" type="string" required +사용자 정의 설정 경로. 실행 중 설정 불가 +
+ +::: +::: field name="plan_index" type="number" required +설정 내 사용할 플랜 번호. 실행 중 설정 불가 +
+ +::: +:::: - `Mall` - 크레딧 수집 및 자동 구매 - "구매 우선 항목" 목록에 따라 순서대로 아이템을 구매하며 "무시 항목"에 있는 항목을 무시하고 크레딧이 넘칠 때까지 다른 항목을 순서대로 구매합니다. + 크레딧 수령 및 상점 구매 + 먼저 `buy_first` 목록 순서대로 구매하고, 그 다음 `blacklist`를 제외하고 왼쪽에서 오른쪽으로 구매하며, 크레딧이 넘칠 경우 블랙리스트를 무시하고 넘치지 않을 때까지 구매 -```json5 -// 해당 작업 매개변수 -{ - "enable": bool, // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true - "visit_friends": bool, // 친구의 기지를 방문하여 크레딧을 획득할지 여부. 선택 사항, 기본값 true - "shopping": bool, // 상점에서 아이템을 구매할지 여부, 선택 사항, 기본값은 false입니다. 실행 중에 편집할 수 없습니다. - "buy_first": [ // 우선적으로 구매할 아이템 목록, 선택 사항입니다. 실행 중에 편집할 수 없습니다. - string, // 아이템 이름, 예: "招聘许可" (모집 허가증), "龙门币" (용문폐) 등 - ... - ], - "blacklist": [ // 블랙리스트, 선택 사항입니다. 실행 중에 편집할 수 없습니다. - string, // 아이템 이름, 예: "加急许可" (즉시 완료 허가증), "家具零件" (가구 부품) 등 - ... - ], - "force_shopping_if_credit_full": bool, // 크레딧이 넘친다면 블랙리스트를 무시할지 여부, 기본값은 true입니다. - "only_buy_discount": bool, // 크레딧 포인트가 300 미만으로 떨어질 때 구매를 중단할지 여부입니다. 기본적으로 두 번째 구매 시에만 적용되며 기본값은 false입니다. - "reserve_max_credit": bool, // 크레딧 포인트가 300 미만으로 떨어질 때 구매를 중단할지 여부. 기본적으로 두 번째 구매 시에만 적용되며 기본값은 false입니다. - "credit_fight": bool, // 지원을 빌려 OF-1 스테이지를 1회 클리어하여 다음 날 더 많은 크레딧을 획득할지 여부. 선택 사항, 기본값 false - "formation_index": int // OF-1 진행 시 사용할 편성 슬롯의 인덱스. 선택 사항, 기본값 0. - // 0~4 사이의 정수이며, 0은 현재 편성을, 1~4는 각각 첫 번째~네 번째 편성을 나타냄 -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="visit_friends" type="boolean" optional default="true" +친구 기반시설을 방문하여 크레딧 획득 여부 +::: +::: field name="shopping" type="boolean" optional default="true" +크레딧 상점 구매 수행 여부 +::: +::: field name="buy_first" type="array" optional default="[]" +우선 구매 목록. 상품명, 예: `"채용 허가증"`, `"용문폐"` 등 +::: +::: field name="blacklist" type="array" optional default="[]" +구매 블랙리스트. 상품명, 예: `"즉시 완료 허가증"`, `"가구 부품"` 등 +::: +::: field name="force_shopping_if_credit_full" type="boolean" optional default="false" +크레딧 넘침 시 블랙리스트 무시 여부 +::: +::: field name="only_buy_discount" type="boolean" optional default="false" +할인 상품만 구매 여부, 2차 구매(목록 순서 외)에만 적용 +::: +::: field name="reserve_max_credit" type="boolean" optional default="false" +크레딧이 300 미만일 때 구매 중지 여부, 2차 구매에만 적용 +::: +::: field name="credit_fight" type="boolean" optional default="false" +다음 날 더 많은 크레딧을 얻기 위해 지원을 빌려 OF-1 스테이지를 1회 클리어할지 여부 +::: +::: field name="formation_index" type="number" optional default="0" +OF-1 플레이 시 사용할 편성 슬롯 번호 +
+0~4의 정수, 0은 현재 편성, 1~4는 제1~4 편성 +::: +:::: - `Award` - 임무 보상 수령 + 각종 보상 수령 -```json5 -// 해당 작업 매개변수 -{ - "enable": bool // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="award" type="boolean" optional default="true" +일일/주간 임무 보상 수령 +::: +::: field name="mail" type="boolean" optional default="false" +모든 우편 보상 수령 +::: +::: field name="recruit" type="boolean" optional default="false" +한정 헤드헌팅 매일 무료 단차 수령 +::: +::: field name="orundum" type="boolean" optional default="false" +합성옥 추첨(LUCKY WALL 등) 보상 수령 +::: +::: field name="mining" type="boolean" optional default="false" +한정 채굴 허가(합성옥 채굴) 보상 수령 +::: +::: field name="specialaccess" type="boolean" optional default="false" +5주년 등 이벤트 월정액 보상 수령 +::: +:::: - `Roguelike` - 통합전략 + 통합 전략 무한 반복 -```json5 -// 해당 작업 파라미터 -{ - "enable": bool, // 작업을 활성화할지 여부, 선택 가능, 기본값 true - "theme": string, // 테마, 선택 가능, 기본값 "Phantom" - // Phantom - 괴영과 주홍색 혈다이아 - // Mizuki - 수월과 심해의 나무 - // Sami - 탐색자의 은서림의 종점 - // Sarkaz - 사카즈의 끝없는 기묘담 - // JieGarden - 界园 - "mode": int, // 모드, 선택 가능, 기본값 0 - // 0 - 점수/보상 포인트 획득, 가능한 한 안정적으로 더 많은 층 도달 - // 1 - 원석 정 수집, 첫 층에서 투자 후 종료 - // 2 - 【폐지됨】모드 0과 1을 겸한 방식, 투자 후 종료하고 투자 없으면 계속 진행 - // 3 - 개발 중… - // 4 - 시작 리셋, 난이도 0에서 3층 도달 후 리셋, 지정된 난이도로 리셋 보상 시도. 열쇠 아이템이 뜨지 않으면 난이도 0으로 돌아감; - // Phantom 테마에서는 난이도 변경 없이 현재 난이도에서 3층 도달 후 리셋 및 시작 리셋 시도 - // 5 - 붕괴 패러다임 수집; Sami 테마에만 해당; 전투에서 적을 놓쳐 붕괴 수치를 빠르게 누적시킴. - // 첫 붕괴 패러다임이 expected_collapsal_paradigms 리스트에 있으면 작업 중지, 없으면 리셋 - "squad": string, // 시작 시 부대명, 선택 가능, 기본값 "지휘 부대" - "roles": string, // 시작 직업 그룹, 선택 가능, 기본값 "적재적소 활용" - "core_char": string, // 시작 캐릭터 이름, 선택 가능; 단일 캐릭터 **한국어 이름**만 지원, 서버 무관; 비우거나 ""로 설정하면 자동으로 숙련도 기반 선택 - "use_support": bool, // 시작 캐릭터가 지원 캐릭터인지 여부, 선택 가능, 기본값 false - "use_nonfriend_support": bool, // 비친구 지원 캐릭터 사용 가능 여부, 선택 가능, 기본값 false; use_support가 true일 때만 유효 - "starts_count": int, // 탐색 시작 횟수, 선택 가능, 기본값 INT_MAX; 도달 시 자동으로 작업 중지 - "difficulty": int, // 난이도 설정, 선택 가능, 기본값 0; **Phantom 제외** 테마에만 해당; - // 해제되지 않은 경우, 현재 해제된 최고 난이도 선택 - "stop_at_final_boss": bool, // 5층 최종 보스 노드에서 작업을 중지할지 여부, 선택 가능, 기본값 false; **Phantom 제외** 테마에만 해당 - "stop_at_max_level": bool, // 로그라이크에서 최대 레벨에 도달했을 때 작업을 멈출지 여부, 선택 가능, 기본값 false - "investment_enabled": bool, // 원석 정을 투자할지 여부, 선택 가능, 기본값 true - "investments_count": int, // 원석 정 투자 횟수, 선택 가능, 기본값 INT_MAX; 도달 시 자동으로 작업 중지 - "stop_when_investment_full": bool, // 투자 한도 도달 시 작업을 자동 중지할지 여부, 선택 가능, 기본값 false - "investment_with_more_score": bool, // 투자 후 쇼핑을 시도할지 여부 (선택 가능, 기본값: false); 모드 1 에만 적용 - "start_with_elite_two": bool, // 시작 리셋 시 엘리트2 등급 진급을 함께 시도할지 여부, 선택 가능, 기본값 false; 모드 4에만 해당 - "only_start_with_elite_two": bool, // 엘리트2 등급 진급만 시도하고 다른 조건 무시 여부, 선택 가능, 기본값 false; - // 모드가 4이고 start_with_elite_two가 true일 때만 유효 - "refresh_trader_with_dice": bool, // 주사위를 사용해 상점을 새로고침해 특정 상품 구매할지 여부, 선택 가능, 기본값 false; Mizuki 테마에만 해당, 지표 물고기 획득 목표 - "first_floor_foldartal": string, // 1층 원견 단계에서 획득 희망하는 밀문, 선택 가능; Sami 테마에만 해당, 모드와 무관; 성공 시 작업 중지 - "start_foldartal_list": [ // 시작 리셋 시 획득 희망 밀문 목록, 선택 가능, 기본값 [];Sami 테마에서 모드 4일 때만 유효; - string, // 시작 시 목록의 모든 밀문을 보유할 경우 시작 리셋 성공으로 간주; - ... // 주의: 이 파라미터는 "생활 우선 부대"와 함께 사용해야 하며, 다른 부대에서는 시작 보상으로 밀문 획득 불가; - ], - "collectible_mode_start_list": { // 시작 시 원하는 보상 항목 (선택 사항), 기본값은 모두 false; 모드 4에서만 유효 - "hot_water": bool, // 보온병 보상, 물 끓이기 시스템 활성화에 사용됨 (공통) - "shield": bool, // 방어막 보상, 추가 체력과 동일 (공통) - "ingot": bool, // 원석 주괴 보상 (공통) - "hope": bool, // 희망 보상 (공통, 참고: JieGarden 테마에서는 제공되지 않음) - "random": bool, // 랜덤 보상 옵션: 모든 원석 주괴를 소모해 무작위 수집품 획득 (공통) - "key": bool, // 열쇠 보상, Mizuki 테마에서만 유효 - "dice": bool, // 주사위 보상, Mizuki 테마에서만 유효 - "ideas": bool, // 2개 구상 보상, Sarkaz 테마에서만 유효 - }, - "use_foldartal": bool, // 밀문 사용 여부, 모드 5에서는 기본값 false, 다른 모드에서는 기본값 true; Sami 테마에만 해당 - "check_collapsal_paradigms": bool, // 획득한 붕괴 패러다임을 확인할지 여부, 모드 5에서는 기본값 true, 다른 모드에서는 기본값 false - "double_check_collapsal_paradigms": bool, // 붕괴 패러다임 확인 누락 방지 조치를 수행할지 여부, 모드 5에서는 기본값 true, 다른 모드에서는 기본값 false; - // 테마가 Sami이고 check_collapsal_paradigms가 true일 때만 유효 - "expected_collapsal_paradigms": [ // 기대하는 붕괴 패러다임, 기본값 ["조금의 무시", "눈 감기", "이미지 손상", "새까맘"]; - string, // 테마가 Sami이고 모드가 5일 때만 유효 - ... - ] -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="theme" type="string" optional default="Phantom" +테마 +
+`Phantom` - 팬텀 & 크림슨 솔리테어 +
+`Mizuki` - 미즈키 & 카이룰라 아버 +
+`Sami` - 탐험가의 은빛 서리 끝자락 +
+`Sarkaz` - 살카즈의 영겁 기담 +
+`JieGarden` - 쉐이의 기이한 계원 +::: +::: field name="mode" type="number" optional default="0" +모드 +
+`0` - 점수/보상 포인트 파밍, 가능한 안정적으로 많은 층수 도달 +
+`1` - 오리지늄 각뿔 파밍, 1층 투자 후 퇴각 +
+`2` - 모드 0과 1 겸용, 투자 후 퇴각, 투자할 게 없으면 계속 진행 +
+`3` - 개발 중.. +
+`4` - 스타트 리세마라, 난이도 0으로 3층 도달 후 재시작, 지정 난이도에서 스타트 보상 확인. 전기주전자나 희망이 아니면 난이도 0으로 돌아가 반복; Phantom 테마는 난이도 전환 없이 현재 난이도에서 반복 +
+`5` - 붕괴 패러다임 파밍; Sami 테마 전용; 전투 중 적을 흘려 붕괴치를 빠르게 누적, 첫 붕괴 패러다임이 `expected_collapsal_paradigms` 목록에 있으면 정지, 아니면 재시작 +
+`6` - 월간 소대 보상 파밍, 모드 적응 외엔 모드 0과 동일 +
+`7` - 심층 조사 보상 파밍, 모드 적응 외엔 모드 0과 동일 +::: +::: field name="squad" type="string" optional default="지휘 분대" +시작 분대명 +::: +::: field name="roles" type="string" optional default="적재적소 활용" +시작 모집 조합 +::: +::: field name="core_char" type="string" optional +시작 오퍼레이터명. 단일 오퍼레이터 **중문명**만 지원(서버 무관); 비워두거나 `""`이면 육성도에 따라 자동 선택 +::: +::: field name="use_support" type="boolean" optional default="false" +시작 오퍼레이터를 지원 유닛으로 빌릴지 여부 +::: +::: field name="use_nonfriend_support" type="boolean" optional default="false" +친구가 아닌 지원 유닛 사용 가능 여부. `use_support`가 true일 때만 유효 +::: +::: field name="starts_count" type="number" optional default="2147483647" +탐색 시작 횟수. 도달 시 자동 정지 +::: +::: field name="difficulty" type="number" optional default="0" +지정 난이도 등급. **Phantom 제외** 테마에만 적용. 미해금 시 현재 해금된 최고 난이도 선택 +::: +::: field name="stop_at_final_boss" type="boolean" optional default="false" +5층 보스 노드 앞에서 정지할지 여부. **Phantom 제외** 테마에만 적용 +::: +::: field name="stop_at_max_level" type="boolean" optional default="false" +통합 전략 만렙 도달 시 정지할지 여부 +::: +::: field name="investment_enabled" type="boolean" optional default="true" +오리지늄각뿔 투자 여부 +::: +::: field name="investments_count" type="number" optional default="2147483647" +투자 횟수. 도달 시 자동 정지 +::: +::: field name="stop_when_investment_full" type="boolean" optional default="false" +투자 한도 도달 시 자동 정지 여부 +::: +::: field name="investment_with_more_score" type="boolean" optional default="false" +투자 후 쇼핑 시도 여부. 모드 1에만 적용 +::: +::: field name="start_with_elite_two" type="boolean" optional default="false" +스타트 리세마라 시 2차 정예화도 함께 노릴지 여부. 모드 4에만 적용 +::: +::: field name="only_start_with_elite_two" type="boolean" optional default="false" +다른 스타트 조건 무시하고 2차 정예화만 노릴지 여부. 모드 4이고 `start_with_elite_two`가 true일 때만 유효 +::: +::: field name="refresh_trader_with_dice" type="boolean" optional default="false" +주사위로 상점을 새로고침하여 특수 상품 구매 시도 여부. Mizuki 테마 전용, 길잡이 비늘 파밍용 +::: +::: field name="first_floor_foldartal" type="string" optional +1층 원견 단계에서 얻길 희망하는 암호문. Sami 테마 전용, 모드 무관; 성공 시 정지 +::: +::: field name="start_foldartal_list" type="array" optional default="[]" +스타트 리세마라 시 시작 보상으로 얻길 희망하는 암호문 목록. Sami 테마 모드 4일 때만 유효 +
+목록의 모든 암호문을 보유해야 성공으로 간주 +
+주의: "생존지상 분대"와 함께 사용해야 함. 다른 분대는 시작 보상으로 암호문을 얻지 못함 +::: +::: field name="collectible_mode_start_list" type="object" optional +스타트 리세마라 시 희망 보상, 기본값은 모두 false. 모드 4일 때만 유효 +
+`hot_water`: 전기주전자 보상, 파밍 매커니즘 트리거용 (공통) +
+`shield`: 보호막 값 보상, 추가 체력 (공통) +
+`ingot`: 오리지늄 각뿔 보상 (공통) +
+`hope`: 희망 보상 (공통, 주의: JieGarden 테마는 hope 보상 없음) +
+`random`: 랜덤 보상 옵션: 게임 내 "모든 각뿔을 소모하여 랜덤 소장품 1개 획득" (공통) +
+`key`: 열쇠 보상, Mizuki 테마 전용 +
+`dice`: 주사위 보상, Mizuki 테마 전용 +
+`ideas`: 구상 2개 보상, Sarkaz 테마 전용 +::: +::: field name="use_foldartal" type="boolean" optional +암호문 사용 여부. 모드 5 기본값 `false`, 기타 모드 기본값 `true`. Sami 테마 전용 +::: +::: field name="check_collapsal_paradigms" type="boolean" optional +획득한 붕괴 패러다임 감지 여부. 모드 5 기본값 `true`, 기타 모드 기본값 `false` +::: +::: field name="double_check_collapsal_paradigms" type="boolean" optional default="true" +붕괴 패러다임 누락 방지 검사 수행 여부. Sami 테마이고 `check_collapsal_paradigms`가 true일 때 유효. 모드 5 기본값 `true`, 기타 모드 기본값 `false` +::: +::: field name="expected_collapsal_paradigms" type="array" optional default="['目空一些', '睁眼瞎', '图像损坏', '一抹黑']" +희망하는 붕괴 패러다임. Sami 테마이고 모드 5일 때 유효 +::: +::: field name="monthly_squad_auto_iterate" type="boolean" optional +월간 소대 자동 전환 활성화 여부 +::: +::: field name="monthly_squad_check_comms" type="boolean" optional +월간 소대 통신 완료 여부도 전환 기준으로 삼을지 여부 +::: +::: field name="deep_exploration_auto_iterate" type="boolean" optional +심층 조사 자동 전환 활성화 여부 +::: +::: field name="collectible_mode_shopping" type="boolean" optional default="false" +파밍 중 쇼핑 활성화 여부 +::: +::: field name="collectible_mode_squad" type="string" optional +파밍 중 사용할 분대, 기본적으로 squad와 동기화, squad가 비었고 이 값도 없으면 지휘 분대 +::: +::: field name="start_with_seed" type="boolean" optional default="false" +시드를 사용하여 각뿔 파밍 +
+Sarkaz 테마, Investment 모드, "연금술 분대" 또는 "지원 분대"일 때만 true 가능 +
+고정 시드 사용 +::: +:::: +붕괴 패러다임 파밍 기능에 대한 자세한 내용은 [통합 전략 보조 프로토콜](./integrated-strategy-schema.md#탐험가의-은빛-서리-끝자락-—-붕괴-패러다임)을 참고하세요. - `Copilot` - Copilot 기반 자동 전투 기능 + 자동지휘 -```json5 -{ - "enable": bool, // 이 작업을 활성화할지 여부. 선택 사항, 기본값은 true. - "filename": string, // 단일 작업 JSON 파일 경로. 필수 (copilot_list와 상호 배타). 상대 경로 및 절대 경로 모두 가능. - "copilot_list": [ // 작업 목록. 필수 (filename과 상호 배타). filename과 copilot_list가 모두 존재하면 copilot_list는 무시됩니다;이 매개변수가 유효할 때 set_params는 한 번만 실행 가능. - { - "filename": string, // 작업 JSON 파일 경로. 상대 경로 및 절대 경로 모두 가능. - "stage_name": string, // 스테이지 이름. 자세한 내용은 [PRTS.Map](https://map.ark-nights.com) 참고. - "is_raid": bool, // 토벌(도전) 모드로 전환할지 여부. 선택 사항, 기본값 false. - "is_paradox": bool // 역설 시뮬레이션 스테이지인지 여부. 선택 사항, 기본값 false;실험적 매개변수. - }, - ... - ], - "loop_times": int, // 반복 횟수. 선택 사항, 기본값은 1. 단일 작업 모드(filename 지정 시)에서만 유효;이 매개변수가 유효할 때 set_params는 한 번만 실행 가능. - "use_sanity_potion": bool, // 이성이 부족할 때 회복제를 사용할지 여부. 선택 사항, 기본값은 false. - "formation": bool, // 자동 편성을 사용할지 여부. 선택 사항, 기본값은 false. - "formation_index": int, // 자동 편성에 사용할 편성 슬롯 번호. 선택 사항, 기본값은 0. - // 0~4 정수. 0은 현재 편성, 1–4는 1~4번째 편성을 의미. - "user_additional": [ // 사용자 지정 추가 오퍼레이터 목록. 선택 사항, 기본값은 []. formation이 true일 때만 유효. - { - "name": string, // 오퍼레이터 이름. 선택 사항, 기본값은 "". 비워두면 무시됩니다. - "skill": int // 사용할 스킬. 선택 사항, 기본값은 1. 1~3 사이의 정수. 범위를 벗어나면 게임 내 기본 스킬을 따름. - }, - ... - ], - "add_trust": bool, // 자동 편성 시 신뢰도 오름차순으로 빈 슬롯을 채울지 여부. 선택 사항, 기본값은 false. formation이 true일 때만 유효. - "ignore_requirements": bool, // 자동 편성 시 오퍼레이터 속성 요구 조건을 무시할지 여부. 선택 사항, 기본값은 false. formation이 true일 때만 유효. - "support_unit_usage": int, // 서포트 오퍼레이터 사용 모드. 선택 사항, 기본값은 0. 0~3 정수. formation이 true일 때만 유효. - // 0 - 서포트 오퍼레이터 사용 안 함. - // 1 - 결원이 한 명일 경우만 서포트로 채움. 결원이 없으면 사용 안 함. - // 2 - 결원이 한 명일 경우 서포트로 채움. 결원이 없으면 지정된 서포트를 사용. - // 3 - 결원이 한 명일 경우 서포트로 채움. 결원이 없으면 랜덤 서포트를 사용. - "support_unit_name": string // 지정된 서포트 오퍼레이터 이름. 선택 사항, 기본값은 "". support_unit_usage = 2일 때만 유효. -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="filename" type="string" +단일 작전 JSON 파일 경로, copilot_list와 택일(필수); 상대/절대 경로 모두 가능 +::: +::: field name="copilot_list" type="array" +작전 목록, filename과 택일(필수); filename과 copilot_list 동시 존재 시 copilot_list 무시; 이 파라미터 유효 시 set_params는 1회만 실행 가능 +
+각 객체 포함: +
-더 많은 자세한 정보는 [전투 스키마](./copilot-schema.md)를 참조하세요. +- `filename`: 작전 JSON 파일 경로; 상대/절대 경로 모두 가능 +
+- `stage_name`: 스테이지명, 구체적인 건 [PRTS.Map](https://map.ark-nights.com) 참고 +
+- `is_raid`: 하드 모드 전환 여부, 선택 사항, 기본값 false +
+- `is_paradox`: 패러독스 시뮬레이션 여부, 선택 사항, 기본값 false; 테스트 중인 파라미터 + ::: + ::: field name="loop_times" type="number" optional default="1" + 반복 횟수. 단일 작전 모드(filename 지정)에서만 유효; 이 파라미터 유효 시 set_params는 1회만 실행 가능 + ::: + ::: field name="use_sanity_potion" type="boolean" optional default="false" + 이성 부족 시 이성 회복제 사용 허용 여부 + ::: + ::: field name="formation" type="boolean" optional default="false" + 자동 편성 수행 여부 + ::: + ::: field name="formation_index" type="number" optional default="0" + 자동 편성 시 사용할 편성 슬롯 번호. `formation`이 true일 때 유효 +
+ 0–4 정수, 0은 현재 편성 선택, 1-4는 제1, 2, 3, 4 편성 + ::: + ::: field name="user_additional" type="array" optional default="[]" + 사용자 정의 추가 오퍼레이터 목록. `formation`이 true일 때 유효 +
+ 각 객체 포함: +
+- `name`: 오퍼레이터명, 선택 사항, 기본값 "", 비워두면 무시됨 +
+- `skill`: 휴대 스킬, 선택 사항, 기본값 1; 1–3 정수, 범위 벗어나면 게임 내 기본 스킬 선택 따름 + ::: + ::: field name="add_trust" type="boolean" optional default="false" + 자동 편성 시 남은 자리를 신뢰도 낮은 순으로 채울지 여부. `formation`이 true일 때 유효 + ::: + ::: field name="ignore_requirements" type="boolean" optional default="false" + 자동 편성 시 오퍼레이터 육성 요구조건 무시 여부. `formation`이 true일 때 유효 + ::: + ::: field name="support_unit_usage" type="number" optional default="0" + 지원 유닛 사용 모드. 0–3 정수. `formation`이 true일 때 유효 +
+ `0` - 지원 유닛 사용 안 함 +
+ `1` - 결원이 딱 1명일 때만 지원 유닛으로 보충, 결원 없으면 안 씀 +
+ `2` - 결원이 딱 1명일 때 지원 유닛 보충 시도, 결원 없으면 지정된 지원 유닛 사용 +
+ `3` - 결원이 딱 1명일 때 지원 유닛 보충 시도, 결원 없으면 랜덤 지원 유닛 사용 + ::: + ::: field name="support_unit_name" type="string" optional default="" + 지정 지원 유닛명. `support_unit_usage`가 2일 때 유효 + ::: + :::: + +작전 JSON은 [자동지휘 프로토콜](./copilot-schema.md)을 참고하세요. - `SSSCopilot` - 보안파견용 AI 동반(Copilot 기반) 자동 전투 기능 + 보안 파견 자동지휘 -```json5 -{ - "enable": bool, // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true - "filename": string, // 작업 JSON의 파일명과 경로, 절대/상대 경로를 지원합니다. 실행 중에 편집할 수 없습니다. - "loop_times": int -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="filename" type="string" required +작전 JSON 파일 경로, 절대/상대 경로 모두 가능. 실행 중 설정 불가 +::: +::: field name="loop_times" type="number" optional +반복 실행 횟수 +::: +:::: +보안 파견 작전 JSON은 [보안 파견 프로토콜](./sss-schema.md)을 참고하세요. -더 많은 자세한 정보는 [보안파견 스키마](./sss-schema.md)를 참조하세요. +- `Depot` + 창고 인식 -- `Depot` - 창고 인식 - -```json5 -// 해당 작업 매개변수 -{ - "enable": bool // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +:::: - `OperBox` - 오퍼레이터 보유 목록 인식 결과 + 오퍼레이터 인식 -```json5 -// 해당 작업 매개변수 -{ - "enable": bool // 이 작업을 활성화할지 여부, 선택 사항, 기본값은 true -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +:::: - `Reclamation` - 생명연산 + 생존 연산 -```json5 -{ - "enable": bool, - "theme": string, // 테마, 선택사항, 기본값은 1입니다. - // Fire - *모래 속의 불꽃* - // Tales - *모래 안의 이야기* - "mode": int, // 모드,선택사항, 기본값은 0 - // 0 - 점수를 획득하고 건설 점수를 얻어 전투에 진입한 후 바로 나가기 - // 1 - *모래 속의 불꽃*: 황금을 얻기 위해 오퍼레이터가 물을 사고 기지를 강화합니다. - // *모래 안의 이야기*: 모래 안의 이야기: 자동으로 아이템을 제작하고 로드하여 통화를 획득 - "tools_to_craft": [ - string, // 자동으로 제작되는 아이템, 선택 사항, 기본값은 형광봉 - ... - ] - // 부분 문자열을 채우는 것이 좋습니다 - "increment_mode": int, // 클릭 유형, 선택 사항. 기본값은 0 - // 0 - 연속 클릭 - // 1 - 길게 누르기 - "num_craft_batches": int // 한 번의 최대 제작 배치 수, 선택 사항. 기본값은 16 -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="theme" type="string" optional default="Fire" +테마 +
+`Fire` - _모래 속의 불_ +
+`Tales` - _사막 이야기_ +::: +::: field name="mode" type="number" optional default="0" +모드 +
+`0` - 점수 및 건설 포인트 파밍, 전투 진입 후 바로 포기 +
+`1` - 모래 속의 불: 적금 파밍, 연락원에게 물 구매 후 기지에서 주조; 사막 이야기: 자동 아이템 제작 및 로드 반복으로 화폐 파밍 +::: +::: field name="tools_to_craft" type="array" optional default="['荧光棒']" +자동 제작 아이템, 부분 문자열 입력 권장 +::: +::: field name="increment_mode" type="number" optional default="0" +클릭 유형 +
+`0` - 연타 +
+`1` - 꾹 누르기 +::: +::: field name="num_craft_batches" type="number" optional default="16" +1회 최대 제작 배치 수 +::: +:::: -- `Custom` +- `Custom` + 사용자 정의 작업 - 사용자 정의 태스크 +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="task_names" type="array" required +배열 중 첫 번째로 매칭된 작업(및 후속 next 등)을 실행. 여러 작업을 실행하려면 Custom task를 여러 번 append +::: +:::: -```json5 -{ - "enable": bool, - "task_names": [ // 배열에서 첫 번째 일치하는 항목부터 실행 (이후 next 등 순차적으로 진행) - // 여러 태스크를 수행하려면 Custom 태스크를 여러 번 추가할 수 있습니다. - string, - ... - ] -} -``` +- `SingleStep` + 단일 단계 작업 (현재 전투만 지원) -- `SingleStep` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="type" type="string" required default="copilot" +현재 `"copilot"`만 지원 +::: +::: field name="subtask" type="string" required +서브 작업 유형 +
+`stage` - 스테이지명 설정, `"details": { "stage": "xxxx" }` 필요 +
+`start` - 작전 시작, `details` 없음 +
+`action` - 단일 작전 조작, `details`는 작전 프로토콜 중 단일 action이어야 함. 예: `"details": { "name": "수르트", "location": [ 4, 5 ], "direction": "左" }`. 상세 내용은 [자동지휘 프로토콜](./copilot-schema.md) 참고 +::: +::: field name="details" type="object" optional +서브 작업 상세 파라미터 +::: +:::: - 단일 단계 태스크 (현재로서는 Copilot만 지원) +- `VideoRecognition` + 영상 인식, 현재 작전(전투) 영상만 지원 -```json5 -{ - "enable": bool, - "type": string, // 현재로서는 "copilot"만 지원합니다. - "subtask": string, // "stage" | "start" | "action" - // "stage"는 단계 이름 설정 (예: "details": { "stage": "xxxx" }) - // "start"는 미션 시작으로, 추가적인 세부사항 없이 시작합니다. - // "action"은 단일 전투 동작으로, 세부사항은 Copilot의 단일 동작입니다. - // 예시: "details": { "name": "史尔特尔", "location": [ 4, 5 ], "direction": "左" },자세한 내용은 전투 스키마 문서 참조 - "details": { - ... - } -} -``` - -- `VideoRecognition` - - 비디오 인식, 현재로서는 전투 비디오만 지원합니다. - -```json5 -{ - "enable": bool, - "filename": string, -} -``` +:::: field-group +::: field name="enable" type="boolean" optional default="true" +본 작업 활성화 여부 +::: +::: field name="filename" type="string" required +영상 파일 경로, 절대/상대 경로 모두 가능. 실행 중 설정 불가 +::: +:::: ### `AsstSetTaskParams` -#### 프로토타입 +#### 인터페이스 원형 ```cpp -bool ASSTAPI AsstSetTaskParams(AsstHandle handle, TaskId id, const char* params); +bool ASSTAPI AsstSetTaskParams(AsstHandle handle, AsstTaskId id, const char* params); ``` -#### 설명 +#### 인터페이스 설명 -태스크 매개변수 설정 +작업 파라미터 설정 #### 반환 값 - `bool` - 매개변수가 성공적으로 설정되었는지 여부입니다. + 설정 성공 여부 반환 -#### 매개변수 설명 +#### 파라미터 설명 -- `AsstHandle handle` - 인스턴스 핸들 -- `TaskId task` - 태스크 ID, `AsstAppendTask`의 반환 값입니다. -- `const char* params` - JSON 형식의 태스크 매개변수, `AsstAppendTask`와 동일합니다. - "Editing in run-time is not supported"으로 표시되지 않은 필드는 실행 중에 변경할 수 있습니다. 그렇지 않으면 태스크가 실행 중일 때 이러한 변경 사항은 무시됩니다. +:::: field-group +::: field name="handle" type="AsstHandle" required +인스턴스 핸들 +::: +::: field name="task" type="AsstTaskId" required +작업 ID, `AsstAppendTask` 인터페이스 반환 값 +::: +::: field name="params" type="const char\*" required +작업 파라미터, json string, `AsstAppendTask` 인터페이스와 동일 +"실행 중 설정 불가"로 표시되지 않은 필드는 실시간 수정 가능; 표시된 경우 현재 작업이 실행 중이면 해당 필드 무시 +::: +:::: ### `AsstSetStaticOption` -#### 프로토타입 +#### 인터페이스 원형 ```cpp bool ASSTAPI AsstSetStaticOption(AsstStaticOptionKey key, const char* value); ``` -#### 설명 +#### 인터페이스 설명 -프로세스 수준의 매개변수 설정 +프로세스 레벨 파라미터 설정 #### 반환 값 - `bool` - 설정이 성공적인지 여부입니다. + 설정 성공 여부 반환 -#### 매개변수 설명 +#### 파라미터 설명 -- `AsstStaticOptionKey key` - 키 -- `const char* value` - 값 +:::: field-group +::: field name="key" type="AsstStaticOptionKey" required +Key +::: +::: field name="value" type="const char\*" required +Value +::: +:::: -##### 키와 값 목록 +##### 키-값 목록 없음 ### `AsstSetInstanceOption` -#### 프로토타입 +#### 인터페이스 원형 ```cpp bool ASSTAPI AsstSetInstanceOption(AsstHandle handle, AsstInstanceOptionKey key, const char* value); ``` -#### 설명 +#### 인터페이스 설명 -인스턴스 수준의 매개변수 설정 +인스턴스 레벨 파라미터 설정 #### 반환 값 - `bool` - 설정이 성공적인지 여부입니다. + 설정 성공 여부 반환 -#### 매개변수 설명 +#### 파라미터 설명 -- `AsstHandle handle` - 핸들 -- `AsstInstanceOptionKey key` - 키 -- `const char* value` - 값 +:::: field-group +::: field name="handle" type="AsstHandle" required +인스턴스 핸들 +::: +::: field name="key" type="AsstInstanceOptionKey" required +Key +::: +::: field name="value" type="const char\*" required +Value +::: +:::: -##### 키와 값 목록 +##### 키-값 목록 -```cpp - enum InstanceOptionKey - { - Invalid = 0, - // Deprecated // MinitouchEnabled = 1, // minitouch를 사용할 수 있는지 여부 - // minitouch를 사용할 수 없는 경우에는 활성화되지 않습니다. - // "1" - 켬, "0" - 끔 - TouchMode = 2, // 터치 모드, 기본적으로 minitouch - // minitouch | maatouch | adb - DeploymentWithPause = 3, // 일시정지 중에 배치 (로그라이크, Copilot 및 보안파견) - // "1" | "0" - AdbLiteEnabled = 4, // AdbLite를 활성화할지 여부, "0" | "1" - KillAdbOnExit = 5, // 종료 시 Adb 해제, "0" | "1" - }; -``` +:::: field-group +::: field name="Invalid" type="number" optional default="0" +무효 점유. 열거값: 0 +::: +::: field name="MinitouchEnabled" type="boolean" optional +폐기됨. 원 minitouch 활성화 여부; "1" 켜기, "0" 끄기. 장치가 지원하지 않을 수 있음. 열거값: 1 (폐기됨) +::: +::: field name="TouchMode" type="string" optional default="minitouch" +터치 모드 설정. 옵션: minitouch | maatouch | adb. 기본값 minitouch. 열거값: 2 +::: +::: field name="DeploymentWithPause" type="boolean" optional +오퍼레이터 배치 시 일시정지 여부, 자동지휘/통합 전략/보안파견에 모두 영향. 옵션: "1" 켜기, "0" 끄기. 열거값: 3 +::: +::: field name="AdbLiteEnabled" type="boolean" optional +AdbLite 사용 여부. 옵션: "0" 끄기, "1" 켜기. 열거값: 4 +::: +::: field name="KillAdbOnExit" type="boolean" optional +종료 시 ADB 프로세스 종료 여부. 옵션: "0" 끄기, "1" 켜기. 열거값: 5 +::: +:::: diff --git a/docs/ko-kr/protocol/remote-control-schema.md b/docs/ko-kr/protocol/remote-control-schema.md index 87959d74cb..0f5bd97a3c 100644 --- a/docs/ko-kr/protocol/remote-control-schema.md +++ b/docs/ko-kr/protocol/remote-control-schema.md @@ -5,158 +5,156 @@ icon: mdi:remote-desktop # 원격 제어 프로토콜 -MAA를 원격으로 제어하려면 http(s) 서비스를 제공해야 합니다. 이 서비스는 아래 두 가지 익명 엔드포인트를 제공해야 합니다. 이 두 엔드포인트는 웹 엔드포인트이며 http(s) 프로토콜이어야 합니다. +MAA를 원격으로 제어하려면 http(s) 서비스를 제공해야 합니다. 이 서비스는 아래 두 가지 익명 엔드포인트(Endpoint)를 제공해야 하며, 두 엔드포인트는 http(s) 프로토콜의 Web 엔드포인트여야 합니다. ::: warning -엔드포인트가 http 프로토콜인 경우 MAA는 연결시마다 안전하지 않음 경고를 발생시킵니다. **공개 네트워크에 프로토콜을 배포하는 것은 매우 권장되지 않으며 위험합니다. 테스트 용도로만 사용하세요!** +엔드포인트가 http 프로토콜인 경우 MAA는 연결 시마다 '안전하지 않음' 경고를 표시합니다. **공개 네트워크에 평문 전송 서비스를 배포하는 것은 매우 위험하므로 권장하지 않습니다. 테스트 용도로만 사용해 주세요.** ::: ::: tip -주의: JSON 형식은 주석을 지원하지 않으므로 아래의 예시에서 주석은 제거해주시기 바랍니다. +주의: JSON 파일은 주석을 지원하지 않으므로 아래의 예시에서 주석은 제거하고 사용해 주세요. ::: -## 작업 엔드포인트 가져오기 +## 작업 획득 엔드포인트 (Get Task) -MAA는 이 엔드 포인트를 계속하여 폴링하여 실행해야하는 작업을 시도하고 가져와야합니다. 그리고 가져온 목록에 따라 순서대로 실행합니다. +MAA는 이 엔드포인트를 1초 간격으로 지속적으로 폴링하여 실행할 작업을 가져옵니다. 그리고 가져온 목록에 따라 순서대로 작업을 실행합니다. -엔드 포인트 경로는 자유롭지만 반드시 http(s) 엔드 포인트 여야합니다. 예를 들어: `https://your-control-host.net/maa/getTask` +엔드포인트 경로는 자유롭지만 반드시 http(s) 엔드포인트여야 합니다. +예: `https://your-control-host.net/maa/getTask` -제어 대상 MAA는 이 엔드포인트를 MAA 설정의 `작업 가져오기 엔드포인트` 텍스트 상자에 작성해야합니다. +제어 대상 MAA의 설정 내 `작업 획득 엔드포인트` 입력란에 해당 엔드포인트를 입력해 주세요. -이 엔드포인트는 `Content-Type=application/json`의 POST 요청을 수락해야하며, 이 요청은 다음과 같은 JSON을 요청 본문으로 수락 할 수 있어야합니다. +이 엔드포인트는 `Content-Type=application/json`인 POST 요청을 받을 수 있어야 하며, 요청 본문(Body)으로 아래와 같은 JSON을 수신할 수 있어야 합니다. ```json { - "user":"ea6c39eb-a45f-4d82-9ecc-33a7bf2ae4dc", // 사용자가 MAA 설정에 제공한 사용자 식별자. - "device":"f7cd9682-3de9-4eef-9137-ec124ea9e9ec" // MAA가 생성 한 장치 식별자. - ... // 이 엔드포인트에 다른 용도가 있는 경우 선택적 매개 변수를 추가 할 수 있지만 MAA는 user 및 device 만 전달합니다. + "user":"ea6c39eb-a45f-4d82-9ecc-33a7bf2ae4dc", // 사용자가 MAA 설정에 입력한 사용자 식별자 + "device":"f7cd9682-3de9-4eef-9137-ec124ea9e9ec" // MAA가 자동 생성한 기기 식별자 + ... // 이 엔드포인트에 다른 용도가 있다면 선택적 파라미터를 추가할 수 있지만, MAA는 user와 device만 전송합니다. } ``` -이 엔드포인트는 JSON 형식의 응답을 반환해야하며 최소한 다음 형식을 충족해야합니다. +이 엔드포인트는 JSON 형식의 응답(Response)을 반환해야 하며, 최소한 다음 형식을 만족해야 합니다. ```json { - "tasks": // MAA가 실행해야하는 Task 목록입니다. 현재 지원되는 유형은 아래 예시와 같습니다. 작업이없는 경우 연결이 무효로 간주됩니다. + "tasks": // MAA가 실행해야 할 작업(Task) 목록입니다. 현재 지원되는 유형은 아래 예시와 같습니다. tasks가 없으면 연결 실패로 간주합니다. [ - // 순차 실행 작업: 아래 작업은 전달된 순서대로 대기열에 들어갑니다 + // 순차 실행 작업: 아래 작업들은 전달된 순서대로 대기열에 들어가 실행됩니다. { - "id": "b353c469-b902-4357-bd8f-d133199eea31", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "CaptureImage", //스크린샷 작업입니다. 현재 에뮬레이터의 스크린샷을 캡처하고 작업 보고서의 페이로드에 Base64 문자열로 넣습니다. 이러한 유형의 작업을 발행해야하는 경우 요청하는 엔드 포인트가 수용 할 수 있는 최대 요청 크기에 주의하세요. 스크린샷은 수십 메가바이트가 있으며 일반적인 게이트웨이의 기본 크기 제한을 초과할 수 있습니다. + "id": "b353c469-b902-4357-bd8f-d133199eea31", // 작업의 고유 ID (문자열). 작업 보고 시 사용됩니다. + "type": "CaptureImage", // 스크린샷 작업. 현재 에뮬레이터 화면을 캡처하여 작업 보고의 payload에 Base64 문자열로 담습니다. 이 작업을 내릴 때는 엔드포인트가 허용하는 최대 요청 크기에 주의해 주세요. 스크린샷은 수십 MB에 달할 수 있어 일반적인 게이트웨이의 기본 제한을 초과할 수 있습니다. }, { - "id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "LinkStart", //원 클릭 모의 농장 시작 + "id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", // 작업의 고유 ID + "type": "LinkStart", // 원클릭 파밍 시작 (StartUp) }, { - "id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "LinkStart-Recruiting", //현재 구성에 따라 원 클릭 모의 농장의 해당 하위 기능을 독립적으로 실행합니다. 주 요구 사항에 대한 이러한 타입의 옵션은 아래에 나와 있습니다. + "id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", // 작업의 고유 ID + "type": "LinkStart-Recruiting", // 현재 설정에 따라 원클릭 파밍의 하위 기능(예: 공개모집)을 단독 실행합니다. 메인화면의 체크 여부는 무시합니다. 선택 가능한 값은 아래 설명을 참고하세요. }, { - "id": "b353c469-b902-4357-bd8f-d133199eea31", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "Toolbox-GachaOnce", //툴박스에서의 하나의 카드 뽑기 작업입니다. 이 유형의 선택할 수 있는 값은 Toolbox-GachaOnce, Toolbox-GachaTenTimes입니다. + "id": "b353c469-b902-4357-bd8f-d133199eea31", // 작업의 고유 ID + "type": "Toolbox-GachaOnce", // 툴박스의 1회 뽑기 작업. 선택 가능 값: Toolbox-GachaOnce, Toolbox-GachaTenTimes }, { - "id": "b353c469-b902-4357-bd8f-d133199eea31", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "Settings-ConnectionAddress", //설정 항목을 수정하는 작업입니다. ConfigurationHelper.SetValue("ConnectionAddress", params);를 실행하는 것과 동일합니다. 안전을 위해 모든 구성이 수정 가능한 것은 아닙니다. 수정 가능한 구성에 대한 자세한 내용은 아래를 참조하세요. - "params": "value" //수정할 값 + "id": "b353c469-b902-4357-bd8f-d133199eea31", // 작업의 고유 ID + "type": "Settings-ConnectionAddress", // 설정값 수정 작업. ConfigurationHelper.SetValue("ConnectionAddress", params)와 동일합니다. 보안을 위해 모든 설정을 수정할 수 있는 것은 아닙니다. 수정 가능한 설정은 아래를 참고하세요. + "params": "value" // 수정할 값 }, - //즉시 실행 작업: 아래 작업은 순차 실행 작업 중 실행되며, MAA는 아래의 모든 작업이 가능한 한 빨리 결과를 반환 할 것임을 보장합니다. 이러한 작업은 일반적으로 원격 제어 기능 자체의 제어에 사용됩니다. + // 즉시 실행 작업: 아래 작업들은 순차 실행 작업 도중에 실행될 수 있으며, MAA는 가능한 한 빨리 결과를 반환합니다.주로 원격 제어 기능 자체를 제어할 때 사용합니다. { - "id": "b353c469-b902-4357-bd8f-d133199eea31", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "CaptureImageNow", //즉시 스크린샷 작업입니다. 위의 스크린샷 작업과 기본적으로 동일하지만 이 작업은 다른 작업을 기다리지 않고 즉시 실행됩니다. + "id": "b353c469-b902-4357-bd8f-d133199eea31", // 작업의 고유 ID + "type": "CaptureImageNow", // 즉시 스크린샷 작업. 위의 스크린샷 작업과 비슷하지만, 다른 작업을 기다리지 않고 즉시 실행됩니다. }, { - "id": "b353c469-b902-4357-bd8f-d133199eea31", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "StopTask", //현재 작업을 종료하는 작업입니다. 현재 실행중인 작업을 종료하려고 시도합니다. 목록에 다른 작업이있는 경우 다음 작업을 계속하여 실행합니다. 이 작업은 현재 작업이 중지되고 확인되기를 기다리지 않으므로 중지 명령이 적용되었는지 확인하기 위해 하트비트 작업을 사용하세요. + "id": "b353c469-b902-4357-bd8f-d133199eea31", // 작업의 고유 ID + "type": "StopTask", // 현재 작업 중지. 실행 중인 작업을 중지하고, 목록에 대기 중인 다음 작업이 있다면 실행합니다. 이 명령은 중지 완료를 기다리지 않고 반환되므로, 중지 여부는 HeartBeat로 확인해 주세요. }, { - "id": "b353c469-b902-4357-bd8f-d133199eea31", //작업의 고유 ID, 문자열 형식입니다. 작업 보고서에 사용됩니다. - "type": "HeartBeat", //하트비트 작업은 즉시 반환되며, 현재 "순차 실행 작업" 대기열에서 실행 중인 작업의 ID를 페이로드로 반환합니다. 현재 작업이 없으면 빈 문자열을 반환합니다. + "id": "b353c469-b902-4357-bd8f-d133199eea31", // 작업의 고유 ID + "type": "HeartBeat", // 하트비트 작업. 즉시 반환되며, 현재 '순차 실행 작업' 큐에서 실행 중인 작업의 ID를 payload로 반환합니다. 실행 중인 작업이 없으면 빈 문자열을 반환합니다. }, ], - ... //이 엔드포인트에 다른 용도가 있는 경우 선택적 반환 값을 추가 할 수 있지만 MAA는 작업 만 읽습니다. + ... // 이 엔드포인트에 다른 용도가 있다면 선택적 반환값을 추가할 수 있지만, MAA는 tasks만 읽습니다. } ``` -이러한 작업은 순서대로 실행되므로 먼저 공개 인수를 내보내고 나중에 스크린샷을 보내면 스크린샷이 공개 인수 이후에 실행됩니다. -이 엔드 포인트는 재진입이 가능하고 반복적으로 작업을 반환해야합니다. MAA는 작업 ID를 자동으로 기록하며 동일한 ID의 경우 작업을 다시 실행하지 않습니다. +이 작업들은 순서대로 실행됩니다. 예를 들어 공개모집 작업을 먼저 보내고 스크린샷 작업을 보내면, 스크린샷은 공개모집이 끝난 뒤 실행됩니다. +이 엔드포인트는 재진입 가능해야 하며, 실행할 작업을 반복해서 반환해야 합니다. MAA는 작업 ID를 자동으로 기록하여, 동일한 ID의 작업은 중복 실행하지 않습니다. ::: note -- LinkStart-[TaskName] 유형의 작업 유형의 LinkStart의 선택 가능한 값은 LinkStart-Base, LinkStart-WakeUp, LinkStart-Combat, LinkStart-Recruiting, LinkStart-Mall, LinkStart-Mission, LinkStart-AutoRoguelike, LinkStart-Reclamation입니다. -- Settings-[SettingsName] 작업 유형의 유형 매개 변수의 선택 가능한 값은 Settings-ConnectionAddress, Settings-Stage1입니다. -- 설정 시리즈 작업은 여전히 순서대로 실행되며 작업을 받은 즉시 실행되지 않으며 이전 작업 뒤에 배치됩니다. -- 여러 즉시 실행 작업은 순서대로 실행되지만 이러한 작업은 모두 빠르게 실행되므로 순서에 관심을 두지 않아도됩니다. +- **LinkStart-[TaskName]** 유형의 `type` 선택 가능 값: + `LinkStart-Base`, `LinkStart-WakeUp`, `LinkStart-Combat`, `LinkStart-Recruiting`, `LinkStart-Mall`, `LinkStart-Mission`, `LinkStart-AutoRoguelike`, `LinkStart-Reclamation` +- **Settings-[SettingsName]** 유형의 `type` 선택 가능 값: + `Settings-ConnectionAddress`, `Settings-Stage1` +- **Settings** 시리즈 작업은 순차 실행 작업으로 간주되어, 수신 즉시 실행되지 않고 이전 작업이 끝난 뒤 실행됩니다. +- 복수의 **즉시 실행 작업**도 전달된 순서대로 실행되지만, 실행 속도가 매우 빠르므로 순서는 크게 신경 쓰지 않아도 됩니다. ::: -## 작업 보고 엔드 포인트 +## 작업 보고 엔드포인트 (Report Status) -MAA가 작업을 완료하면 작업의 실행 결과를 원격에 보고해야합니다. +MAA가 작업을 완료하면, 이 엔드포인트를 통해 작업 실행 결과를 원격 서버로 보고합니다. -엔드 포인트 경로는 자유롭지만 반드시 http(s) 엔드 포인트 여야합니다. 예를 들어: `https://your-control-host.net/maa/reportStatus` +엔드포인트 경로는 자유롭지만 반드시 http(s) 엔드포인트여야 합니다. +예: `https://your-control-host.net/maa/reportStatus` -제어 대상 MAA는이 엔드 포인트를 MAA 설정의 `작업 보고 엔드포인트` 텍스트 상자에 작성해야합니다 +제어 대상 MAA의 설정 내 `작업 보고 엔드포인트` 입력란에 해당 엔드포인트를 입력해 주세요. -이 엔드포인트는 `Content-Type=application/json`의 POST 요청을 수락해야하며, 이 요청은 다음과 같은 JSON을 요청 본문으로 수락 할 수 있어야합니다. +이 엔드포인트는 `Content-Type=application/json`인 POST 요청을 받을 수 있어야 하며, 요청 본문(Body)으로 아래와 같은 JSON을 수신할 수 있어야 합니다. ```json { - "user":"ea6c39eb-a45f-4d82-9ecc-33a7bf2ae4dc", // 사용자가 MAA 설정에 제공한 사용자 식별자. - "device":"f7cd9682-3de9-4eef-9137-ec124ea9e9ec", // MAA가 생성 한 장치 식별자. - "task":"15be4725-5bd3-443d-8ae3-0a5ae789254c", // 보고 할 작업의 ID는 작업을 가져올 때의 ID와 일치합니다. - "status":"SUCCESS", // 작업 실행 결과는 SUCCESS 또는 FAILED입니다. 일반적으로 작업이 성공하든 실패하든 SUCCESS 만 반환됩니다. 특별한 경우에만 실패를 반환합니다. 실패한 경우 상세 내용은 해당 작업 소개에서 명확하게 설명됩니다. - "payload":"", // 보고서에 대한 데이터는 문자열 형식입니다. 작업 유형에 따라 달라집니다. 예를 들어 스크린샷 작업 보고서는 여기에 스크린샷의 Base64 문자열을 가져옵니다. - ... // 이 엔드포인트에 다른 용도가 있는 경우 선택적 매개 변수를 추가 할 수 있지만 MAA는 user 및 device 만 전달합니다. + "user":"ea6c39eb-a45f-4d82-9ecc-33a7bf2ae4dc", // 사용자가 MAA 설정에 입력한 사용자 식별자 + "device":"f7cd9682-3de9-4eef-9137-ec124ea9e9ec", // MAA가 자동 생성한 기기 식별자 + "task":"15be4725-5bd3-443d-8ae3-0a5ae789254c", // 보고할 작업의 ID (Get Task 시 받은 ID와 일치) + "status":"SUCCESS", // 작업 실행 결과 (SUCCESS 또는 FAILED). 일반적으로 성공/실패 여부와 관계없이 SUCCESS만 반환하며, 특수한 경우에만 FAILED를 반환합니다(해당 작업 설명에 명시됨). + "payload":"", // 보고 데이터 (문자열). 작업 유형에 따라 다릅니다. 예: 스크린샷 작업은 여기에 Base64 문자열이 들어갑니다. + ... // 이 엔드포인트에 다른 용도가 있다면 선택적 파라미터를 추가할 수 있지만, MAA는 user와 device만 전송합니다. } ``` -이 엔드 포인트의 반환 내용은 상관 없습니다. 그러나 200OK를 반환하지 않으면 MAA 측에서 `업로드 실패`라는 알림이 표시됩니다. +이 엔드포인트의 반환 내용은 자유롭지만, 200 OK를 반환하지 않으면 MAA 측에 `업로드 실패` 알림이 표시됩니다. -## 예시 워크플로우 - QQBot을 사용하여 MAA 제어 +## 예시 워크플로우 - QQBot으로 MAA 제어 -A 개발자는 자신의 QQBot을 사용하여 MAA를 제어하려고합니다. 따라서 공개 네트워크에서 노출 된 백엔드를 개발하여 다음 두 가지 엔드포인트를 제공합니다. +A 개발자는 자신의 QQBot으로 MAA를 제어하고 싶어 합니다. 이를 위해 공용 네트워크에 노출된 백엔드를 개발하고 두 개의 엔드포인트를 제공했습니다: -> [!tip] -> https://myqqbot.com/maa/getTask -> https://myqqbot.com/maa/reportStatus +```text +https://myqqbot.com/maa/getTask +https://myqqbot.com/maa/reportStatus +``` -사용자의 편의를 위해 getTask 인터페이스는 어떤 매개 변수를 받더라도 기본적으로 200OK와 비어있는 작업 목록을 반환합니다. -요청이 수신되면 A는 데이터베이스에서 중복 장치를 확인하고 그렇지 않으면 해당 장치와 사용자를 데이터베이스에 기록합니다. -즉,이 워크플로우에서는이 엔드포인트가 사용자 등록을 담당합니다. +사용자 편의를 위해 `getTask` 인터페이스는 어떤 파라미터가 오든 기본적으로 200 OK와 빈 `tasks` 목록을 반환합니다. +A는 요청이 올 때마다 데이터베이스에 중복된 `device`가 있는지 확인하고, 없으면 해당 `device`와 `user`를 기록합니다. 즉, 이 인터페이스는 사용자 등록 기능도 겸합니다. -그는 QQBot에 사용자의 장치 ID를 제출하는 명령을 제공했습니다. +A는 QQBot에 사용자가 자신의 `deviceId`를 제출할 수 있는 명령어를 추가했습니다. +그리고 사용 설명서에 "MAA의 `사용자 식별자`에 자신의 QQ 번호를 적고, `기기 식별자`를 복사해서 봇에게 보내세요"라고 안내했습니다. -그의 QQBot 사용 설명서에는 MAA의 `사용자 식별자`에 자신의 QQ 번호를 입력하고 `장치 식별자`를 QQ 채팅으로 보내도록 지시합니다. +QQBot이 식별자를 받으면, 메시지를 보낸 유저의 QQ 번호를 이용해 데이터베이스에 해당 기록이 있는지 찾습니다. 없으면 사용자에게 MAA 설정을 먼저 하라고 안내합니다. +(MAA를 설정하면 지속적으로 요청을 보내므로, 사용자가 봇에게 메시지를 보낼 즈음엔 이미 DB에 기록이 있어야 합니다.) -A는 장치 ID를 수신하면 QQBot이 메시지의 사용자 QQ 번호를 기준으로 데이터베이스에서 해당 레코드를 찾아보고 없으면 사용자가 먼저 MAA를 구성하라고 알립니다. -MAA를 구성 한 후 사용자가 MAA를 구성하면 MAA가 지속적으로 요청을 보내기 때문에 사용자가 MAA를 구성하면 메시지를 제출 할 때 데이터베이스에 일치하는 레코드가 있어야합니다. +기록이 있다면 봇은 해당 DB 레코드에 '인증됨' 표시를 합니다. 이제 `getTask`는 인증된 `device`와 `user` 요청에 대해 진짜 작업 목록을 반환하기 시작합니다. -이후 Bot은 데이터베이스의 해당 레코드를 확인하고 검증 된 플래그를 설정하여이 장치 및 사용자가 빠른 getTask 요청에 대한 진정한 작업 목록을 반환하도록합니다. +사용자가 QQBot을 통해 명령(예: "파밍 시작")을 내리면, 봇은 DB에 작업을 추가합니다. 잠시 후 `getTask` 요청이 오면 이 작업을 반환합니다. A는 친절하게도 사용자가 명령을 보낼 때마다 자동으로 스크린샷 작업도 하나씩 추가하도록 만들었습니다. -사용자가 QQBot을 통해 명령을 제출하면 Bot은 데이터베이스에 작업을 작성하므로 getTask가 이러한 작업을 반환합니다. 또한 사용자가 명령을 제출할 때마다,이 QQBot은 기본적으로 스크린 샷 작업 하나를 추가합니다. +MAA가 작업을 마치고 `reportStatus`를 호출하면, 봇은 결과를 받아 사용자에게 QQ 메시지로 알림과 스크린샷을 전송합니다. -작업이 완료되면 MAA가 reportStatus를 호출하여 결과를 보고하면 Bot은 결과를받고 사용자에게 메시지를 보내고 스크린 샷을 표시합니다. +## 예시 워크플로우 - 웹사이트로 MAA 제어 -## 예시 워크플로우 - 웹 사이트를 사용하여 MAA 제어 +B 개발자는 웹사이트를 통해 MAA를 대량으로 관리하고 싶습니다. 자체 회원 시스템이 있는 웹사이트 백엔드를 만들고, 익명 접근 가능한 두 엔드포인트를 열었습니다: -B 개발자는 웹 사이트를 작성했으며 웹 사이트를 통해 MAA를 대량으로 관리하려고합니다. 따라서 공개 네트워크에서 자체 사용자 관리 시스템을 보유하고 두 가지 익명 엔드 포인트를 제공하는 백엔드를 개발했습니다. +```text +https://mywebsite.com/maa/getTask +https://mywebsite.com/maa/reportStatus +``` -> [!tip] -> https://mywebsite.com/maa/getTask -> https://mywebsite.com/maa/reportStatus。 +웹사이트에는 MAA 연결 페이지가 있고, B가 `사용자 키`라고 부르는 랜덤 문자열과 `기기 식별자` 입력칸이 있습니다. +웹사이트는 사용자에게 "MAA의 `사용자 식별자`에 이 사용자 키를 넣고, MAA의 `기기 식별자`를 여기에 입력하세요"라고 안내합니다. -웹 사이트에는 MAA 인스턴스에 대한 연결을 표시하는 페이지가 있습니다. B 개발자는 랜덤 문자열을 `사용자 키`라고하는 이 페이지에 표시하고 장치 ID를 입력할 수있는 텍스트 상자가 있습니다. +웹사이트에서 '연결 생성'이 성공해야만 `getTask`가 200 OK를 반환하도록 하고, 그 외에는 401 Unauthorized를 반환하게 설정했습니다. +따라서 사용자가 MAA에 정보를 잘못 입력하고 '연결 테스트'를 누르면 실패 알림을 받게 됩니다. -웹 사이트는 MAA의 `사용자 식별자`에 사용자 키를 입력하고 `장치 식별자`를 웹 사이트에 입력하도록 요구합니다. - -MAA의 설정에 올바르게 MAA 연결을 만들려면 웹 사이트에서 사용자 키 및 장치 ID가 정확해야합니다. - -사용자가 웹 사이트를 통해 MAA에 대한 제어 명령을 제출하면 웹 사이트는 데이터베이스에 작업을 작성합니다. - -웹 사이트는이 페이지를 공개하기 때문에 누구나 사용자 키를 복사하여 사용할 수 있지만 장치 ID가 없으면 적절한 데이터베이스 레코드를 찾을 수 없으므로 getTask 호출에 대한 결과는 빈 목록입니다. - -작업이 완료되면 MAA가 reportStatus를 호출하여 결과를 보고하면 웹 사이트는 결과를받고 사용자에게 페이지를 업데이트하여 작업 결과를 표시합니다. - - +사용자는 웹사이트에서 작업을 내리고, 대기열을 확인하고, 스크린샷을 볼 수 있습니다. 구현 방식은 QQBot 예시와 비슷하게 `getTask`와 `reportStatus`의 조합으로 이루어집니다. diff --git a/docs/ko-kr/protocol/sss-schema.md b/docs/ko-kr/protocol/sss-schema.md index 7763c6ed0c..33cc3d1d0f 100644 --- a/docs/ko-kr/protocol/sss-schema.md +++ b/docs/ko-kr/protocol/sss-schema.md @@ -3,74 +3,84 @@ order: 7 icon: game-icons:prisoner --- -# 보안파견 스키마 +# 보안 파견 프로토콜 ::: tip -주의: JSON 형식은 주석을 지원하지 않으므로 아래의 예시에서 주석은 제거해주시기 바랍니다. +주의: JSON 파일은 주석을 지원하지 않으므로, 텍스트 내의 주석은 예시용입니다. 직접 복사하여 사용하지 마세요. ::: -```json +```json5 { - "type": "SSS", // 프로토콜 유형, SSS는 보안파견 의미함, 필수, 변경 불가 - "stage_name": "多索雷斯在建地块", // 구역 위치의 이름(도솔레스 건설부지), 필수 - "minimum_required": "v4.9.0", // MAA의 최소 요구 버전, 필수 + "type": "SSS", // 프로토콜 유형, SSS는 보안파견을 의미. 필수, 변경 불가 + "stage_name": "多索雷斯在建地块", // 보안 파견 맵 이름, 필수 + "minimum_required": "v4.9.0", // MAA 최소 요구 버전, 필수 "doc": { // 설명, 선택 사항 "title": "低练度高成功率作业", "title_color": "dark", - "details": "L对练度要求很低balabala……", // 여기에 작성자 명이나, 참고 영상등의 정보를 적는게 좋습니다! + "details": "对练度要求很低balabala……", // 여기에 작성자명이나 참고 영상 링크 등을 적으면 좋습니다. "details_color": "dark" }, - "buff": "自适应补给元件", // 자유롭게 선택 가능합니다 - "equipment": [ // 전술 장비 선택, 가로로 카운트, 선택 사항 - // 현재 버전에서는 구현되지 않으며, 인터페이스에만 표시됨 + "buff": "自适应补给元件", // 시작 전술 장비 선택, 선택 사항 + "equipment": [ // 시작 장비 선택, 가로 방향 순서, 선택 사항 + // 현재 버전 미구현, UI에만 표시됨 "A", "A", "A", "A", "B", "B", "B", "B" ], - "strategy": "优选策略", // "Optimized strategy"(최적화 전략) 또는 "Free strategy"(자유 전략), 선택 사항 - // 현재 버전에서는 구현되지 않으며, 인터페이스에만 표시됨 - "opers": [ // 지정된 오퍼레이터, 선택 사항 + "strategy": "优选策略", // "우선 전략"(Optimized) 또는 "자유 전략"(Free), 선택 사항 + // 현재 버전 미구현, UI에만 표시됨 + "opers": [ // 지정 오퍼레이터, 선택 사항 { "name": "棘刺", "skill": 3, "skill_usage": 1 } ], - "tool_men": { // 필요한 각 직의 남은 인원 수, 코스트별로 정렬, 선택 사항 - // 현재 버전에서는 구현되지 않으며, 인터페이스에만 표시됨 + "tool_men": { // 필요한 직군별 나머지 인원 수, 코스트 순 정렬, 선택 사항 + // 현재 버전 미구현, UI에만 표시됨 "Pioneer": 13, - "Guards": 2, + "近卫": 2, // 중/영문 모두 가능 "Medic": 2 }, - "drops": [ // 우선 순위로 플레이 시작 및 전투 중에 오퍼레이터 및 장비 획득 + "drops": [ // 전투 시작 및 도중 오퍼레이터/장비 획득 우선순위 "空弦", - "能天使", - "先锋", + "能天使", // 오퍼레이터명, 직군명 지원 + "先锋", // 직군명은 중/영문 모두 가능 "Support", - "无需增调干员", // 아무도 영입하지 않음 - "重整导能组件", // 장비 이름을 지원, 함께 씀 + "无需增调干员", // 아무도 영입하지 않음 + "重整导能组件", // 장비명 지원, 함께 작성 가능 "反制导能组件", - "战备激活阀", // 레벨 중간의 선택적 장비도 여기에 포함 + "战备激活阀", // 층 중간 선택 장비도 여기에 포함 "改派发讯器" ], - "blacklist": [ // 블랙리스트, 선택 사항. 이들은 드롭에서 선택되지 않을 것입니다. - // 이후 버전에서는 배치 도구의 사람들도 이들을 선택하지 않습니다. + "blacklist": [ // 블랙리스트, 선택 사항. drops에서 선택되지 않음. + // 추후 버전에서 편성 시에도 이 오퍼레이터들은 제외됨. "夜半", "梅尔" ], "stages": [ { - "stage_name": "蜂拥而上", // 단일 레벨 스테이지 이름, 필수 - // 이름, stageId, levelId, 추천 stageId 또는 levelId를 지원합니다. - // 기타 보존 스테이지와 충돌하는 코드 (예: LT-1)는 사용하지 말아주세요. - - + "stage_name": "蜂拥而上", // 단일 층 스테이지명, 필수 + // name, stageId, levelId 지원. stageId 또는 levelId 권장. + // 다른 보안 파견 맵과 겹칠 수 있는 code(예: LT-1)는 사용하지 마세요. "strategies": [ // 필수 - // 순서대로 각 객체의 tool_men에 따라 배치될 것입니다. - // 현재 핸드에 tool_men이 없는 경우 다음 객체를 배치합니다. + // 매 확인마다 위에서부터 순서대로 진행하며, 실행 완료된 전략은 건너뜀. + // 현재 전략의 tool_men 배치가 완료된 경우: + // core가 없으면 해당 전략 실행 완료로 간주 + // core가 있고 배치 가능하면 core를 배치하고 전략 실행 완료로 간주 + // core가 코스트 전환 중이면 대기하고 후속 전략 건너뜀 + // 현재 전략의 tool_men 배치가 아직 완료되지 않은 경우: + // 대기 구역에 필요한 tool_men이 없으면 다음 전략 확인 + // 대기 구역에 필요한 tool_men이 있으면: + // 즉시 배치 가능한 유닛이 없으면 대기 + // 즉시 배치 가능한 유닛이 있으면 코스트 적은 순으로 우선 배치 + // 같은 칸의 전략에 대해: + // core가 없으면 대기 구역에 필요 유닛 없을 때(코스트 무관) 같은 칸 후속 전략 계속 확인 허용 + // core가 있으면 실행 완료 전까지 같은 칸 후속 전략 무시 + // 같은 칸에 여러 core 오퍼레이터를 작성 가능. 맨 마지막이 아닌 core 오퍼레이터는 전략 완료 후 패스와 동등하게 취급됨(tool_men 미포함) { "core": "棘刺", "tool_men": { - "Pioneer": 1, // 영어 또는 중국어 이름 모두 허용됩니다. + "Pioneer": 1, // 중/영문 모두 가능 "Warrior": 1, "Medic": 1 }, @@ -94,7 +104,7 @@ icon: game-icons:prisoner "direction": "Left" }, { - // "core"를 제공하지 않으면, 통과를 보조하는 tool_men을 배치하는 데 사용될 수 있습니다. + // "core"가 없으면 패순환용 오퍼레이터(tool_men) 배치 용도로 사용 가능 "tool_men": { "Support": 100 }, @@ -105,15 +115,15 @@ icon: game-icons:prisoner "direction": "Left" } ], - "draw_as_possible": true, // "오퍼레이터 배치" 버튼. 가능할 때 사용할지 여부. 선택 사항, 기본값은 true입니다. + "draw_as_possible": true, // "오퍼레이터 배치"(패순환) 버튼. 쿨 돌면 바로 누를지 여부. 선택 사항, 기본값 true. "actions": [ // 선택 사항 - // 숙제 복사의 논리를 재사용합니다. - // 조건이 해당 액션을 충족하면 액션을 실행합니다. 그렇지 않으면 위의 전략들이 실행됩니다. + // 자동지휘 로직 재사용 + // action 조건 만족 시 action 실행, 아니면 위 strategies 실행 { - "type": "调配干员" // 새로운 타입. "오퍼레이터 배치" 버튼을 클릭합니다. "draw_as_possible"가 true일 때는 무효화됩니다. + "type": "调配干员" // 신규 타입. "오퍼레이터 배치" 버튼 클릭. "draw_as_possible"이 true면 무효. }, { - "type": "CheckIfStartOver", // 새로운 타입. 오퍼레이터가 사용 가능한지 확인합니다. 사용 불가능하면 종료하고 재시작합니다. + "type": "CheckIfStartOver", // 신규 타입. 오퍼레이터 존재 확인. 없으면 재시도. "name": "棘刺" }, { @@ -122,7 +132,7 @@ icon: game-icons:prisoner 4, 5 ], - "direction": "Left" + "direction": "左" }, { "kills": 10, @@ -130,17 +140,17 @@ icon: game-icons:prisoner "name": "桃金娘" } ], - "retry_times": 3 // 전투 실패 시 재시도 횟수. 이 제한을 초과하면 해당 스테이지를 포기합니다. + "retry_times": 3 // 전투 실패 시 재시도 횟수. 초과 시 해당 판 포기. }, { "stage_name": "见者有份" // ... } - // 하고 싶은만큼의 스테이지를 작성합니다. 예를 들어, 4개만 작성하면 스테이지 4개를 완료한 후 자동으로 재시작합니다. + // 원하는 층수만큼 작성. 예를 들어 4층까지만 쓰면 4층 깨고 자동 재시도. ] } ``` -## 예시 +## 예시 파일 diff --git a/docs/ko-kr/protocol/task-schema.md b/docs/ko-kr/protocol/task-schema.md index fc49976d71..e378511fd2 100644 --- a/docs/ko-kr/protocol/task-schema.md +++ b/docs/ko-kr/protocol/task-schema.md @@ -3,334 +3,421 @@ order: 4 icon: material-symbols:task --- -# Tasks 스키마 - -::: tip -It is recommended to use [Visual Studio Code](https://code.visualstudio.com/) and install [Maa Pipeline Support](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support) extension for efficient editing. For more details, please visit the extension's homepage and the [docs](../develop/vsc-ext-tutorial.md). -::: - -::: warning -주의: JSON 형식은 주석을 지원하지 않으므로 아래의 예시에서 주석은 제거해주시기 바랍니다. -::: +# 작업 프로토콜 `resource/tasks`의 사용법 및 각 필드 설명 -## 개요 +::: tip +[Visual Studio Code](https://code.visualstudio.com/)를 사용하고 [Maa Pipeline Support](https://marketplace.visualstudio.com/items?itemName=nekosu.maa-support) 확장을 설치하여 효율적으로 편집하는 것을 권장합니다. 자세한 내용은 확장 홈페이지와 [문서](../develop/vsc-ext-tutorial.md)를 참조하세요. +::: + +::: warning +JSON 파일은 주석을 지원하지 않으므로, 텍스트 내의 주석은 예시용입니다. 직접 복사하여 사용하지 마세요. +::: + +## 전체 필드 목록 ```json { - "작업이름": { // 작업 이름 + "TaskName": { // 작업 이름, @가 포함된 경우 특수 작업일 수 있으며 기본값이 다를 수 있음. 아래 특수 작업 유형 참조 - "baseTask": "xxx", // 작업의 템플릿으로 사용될 xxx 작업을 지정합니다. 특수 작업 유형인 경우 아래의 템플릿 작업에 대한 설명을 참조하세요. + "baseTask": "xxx", // xxx 작업을 템플릿(기반)으로 하여 작업 생성. 아래 특수 작업 유형의 '파생 작업' 참조 - "algorithm": "MatchTemplate", // 선택 사항, 인식 알고리즘 유형을 나타냅니다. - // 입력하지 않으면 기본값은 MatchTemplate입니다. - // - JustReturn: 인식 없이 작업을 직접 실행합니다. - // - MatchTemplate: 이미지 매칭 - // - OcrDetect: 텍스트 인식 - // - FeatureMatch: 특징 매칭 + "algorithm": "MatchTemplate", // 선택 사항, 인식 알고리즘 유형 + // 비워둘 시 기본값: MatchTemplate + // - JustReturn: 인식 없이 바로 action 실행 + // - MatchTemplate: 이미지 매칭 + // - OcrDetect: 텍스트 인식 + // - FeatureMatch: 특징 매칭 - "action": "ClickSelf", // 선택 사항, 인식 후 작업 유형을 나타냅니다. - // 입력하지 않으면 기본값은 DoNothing입니다. - // - ClickSelf: 인식된 위치를 클릭합니다 (인식된 대상 범위 내에서 무작위 점). - // - ClickRect: 지정된 영역을 클릭합니다. specificRect 필드에 해당합니다. 이 옵션은 권장하지 않습니다. - // - DoNothing: 아무 작업도 수행하지 않습니다. - // - Stop: 현재 작업을 중지합니다. - // - Swipe: 슬라이드, specificRect 및 rectMove 필드와 관련이 있습니다. - // - Input: 텍스트 입력, algorithm이 JustReturn이어야 하며, inputText 필드에 해당합니다. + "action": "ClickSelf", // 선택 사항, 인식 성공 후 동작 + // 비워둘 시 기본값: DoNothing + // - ClickSelf: 인식된 위치 클릭 (인식된 목표 범위 내 무작위 지점) + // - ClickRect: 지정된 영역 클릭, specificRect 필드에 대응 (비권장) + // - DoNothing: 아무것도 하지 않음 + // - Stop: 현재 작업 정지 + // - Swipe: 스와이프, specificRect 및 rectMove 필드에 대응 + // - Input: 텍스트 입력, algorithm이 JustReturn이어야 함, inputText 필드에 대응 - "sub": [ "SubTaskName1", "SubTaskName2" ], - // 선택 사항, 서브 작업 목록입니다. 현재 작업이 실행된 후에 각 서브 작업을 순차적으로 실행합니다. - // 서브 작업은 재귀적으로 정의할 수 있습니다. 그러나 무한 루프에 빠지지 않도록 주의하세요. + "sub": ["SubTaskName1", "SubTaskName2"], + // 선택 사항, 서브 작업 (비권장). 현재 작업 실행 후 서브 작업들을 순차적으로 실행 + // 중첩 가능(서브 작업의 서브 작업). 단, 무한 루프에 주의 - "subErrorIgnored": true, // 선택 사항, 서브 작업 오류를 무시할지 여부를 나타냅니다. - // 입력하지 않으면 기본값은 false입니다. - // false인 경우, 서브 작업에 오류가 발생하면 이후 작업을 실행하지 않고 현재 작업이 오류로 간주됩니다. - // true인 경우, 서브 작업의 오류 여부와는 무관하게 이후 작업 실행에 영향을 미치지 않습니다. - - "maxTimes": 10, // 선택 사항, 작업이 최대로 실행될 수 있는 횟수를 나타냅니다. - // 입력하지 않으면 무한히 실행됩니다. - // 최대 횟수에 도달하면 exceededNext 필드가 존재한다면 exceededNext 작업이 실행되며, 그렇지 않으면 현재 작업이 중지됩니다. + "subErrorIgnored": true, // 선택 사항, 서브 작업 오류 무시 여부 + // 비워둘 시 기본값: false + // false: 서브 작업 중 하나라도 오류 발생 시 후속 작업 실행 안 함 (본 작업 오류로 간주) + // true: 서브 작업 오류 여부가 영향을 주지 않음 "next": ["OtherTaskName1", "OtherTaskName2"], - // 선택 사항, 현재 작업과 sub 작업을 완료한 후 다음에 실행할 작업을 나타냅니다. - // 앞에서부터 순차적으로 인식하여 첫 번째로 매칭되는 작업을 실행합니다. - // 입력하지 않으면 현재 작업 완료 후 바로 중지됩니다. + // 선택 사항, 현재 작업 및 sub 작업 완료 후 실행할 다음 작업 + // 앞에서부터 순차적으로 인식하여 첫 번째로 매칭된 작업 실행 + // 비워둘 시 현재 작업 완료 후 바로 정지 + // 동일 작업에 대해 첫 번째 인식 후 두 번째는 인식하지 않음: + // "next": [ "A", "B", "A", "A" ] -> "next": [ "A", "B" ] + // JustReturn 유형 작업은 마지막 항목이 아닌 곳에 위치할 수 없음 - "exceededNext": [ "OtherTaskName1", "OtherTaskName2" ], - // 선택 사항, 최대 실행 횟수에 도달했을 때 실행할 작업을 나타냅니다. - // 입력하지 않으면 최대 실행 횟수에 도달하면 중지됩니다. 입력했을 경우, next 대신 여기서 실행됩니다. + "maxTimes": 10, // 선택 사항, 최대 실행 횟수 + // 비워둘 시 기본값: 무한 + // 최대 횟수 도달 후, exceededNext 필드가 있으면 실행, 없으면 작업 정지 - "onErrorNext": [ "OtherTaskName1", "OtherTaskName2" ], - // 선택 사항, 실행 중 오류가 발생한 경우에 실행될 이후 작업을 나타냅니다. + "exceededNext": ["OtherTaskName1", "OtherTaskName2"], + // 선택 사항, 최대 실행 횟수 도달 시 실행할 작업 + // 비워둘 시 정지; 작성 시 next 대신 이곳의 작업 실행 + "onErrorNext": ["OtherTaskName1", "OtherTaskName2"], + // 선택 사항, 실행 오류 발생 시 후속 실행할 작업 - "preDelay": 1000, // 선택 사항, 인식된 후 작업이 실행될 때까지 대기하는 시간을 밀리초로 나타냅니다. 입력하지 않으면 기본값은 0입니다. - "postDelay": 1000, // 선택 사항, 실행된 후 다음 인식까지 지연되는 시간을 밀리초로 나타냅니다. 입력하지 않으면 기본값은 0입니다. + "preDelay": 1000, // 선택 사항, 인식 성공 후 action 실행 전 지연 시간 (ms); 기본값 0 + "postDelay": 1000, // 선택 사항, action 실행 후 다음 next 인식 전 지연 시간 (ms); 기본값 0 - "roi": [ 0, 0, 1280, 720 ], // 선택 사항, 인식 범위를 나타냅니다. 포맷은 [ x, y, width, height ]입니다. - // 자동으로 1280 * 720으로 확장됩니다. 입력하지 않으면 기본값은 [ 0, 0, 1280, 720 ]입니다. - // 가능한 한 많이 작성하고 인식 범위를 축소하면 성능 소비가 줄어들고 인식 속도가 빨라질 수 있습니다. + "roi": [0, 0, 1280, 720], // 선택 사항, 인식 범위 [x, y, width, height] + // 1280 * 720 기준 자동 스케일링; 기본값 [0, 0, 1280, 720] + // 범위를 줄이면 성능 소모를 줄이고 인식 속도를 높일 수 있음 - "cache": false, // 선택 사항, 작업이 캐싱을 사용하는지 여부를 나타냅니다. 기본값은 false입니다. - // 최초 인식 이후에는 해당 위치만 인식하며, 성능을 크게 개선할 수 있습니다. + "cache": true, // 선택 사항, 캐시 사용 여부, 기본값 true; + // 첫 인식 성공 시 이후에는 해당 위치에서만 인식. 성능 대폭 절약 가능 + // 단, 인식 대상 위치가 절대 변하지 않는 경우에만 사용. 변할 수 있다면 false로 설정 + "rectMove": [0, 0, 0, 0], // 선택 사항, 인식 후 목표 이동 (비권장). 1280 * 720 기준 자동 스케일링 + // 예: A를 인식했지만 실제 클릭은 A 아래 10픽셀 5*2 영역일 때 + // [0, 10, 5, 2]로 설정. 가능하면 클릭 위치를 직접 인식하는 것을 권장 + // 추가로, action이 Swipe일 때 유효하며 필수 (스와이프 종점) - // 단, 대상 인식 위치가 절대로 변하지 않을 작업에만 사용하세요. 대상 인식 위치가 항상 변하는 경우 false로 설정하세요. + "reduceOtherTimes": ["OtherTaskName1", "OtherTaskName2"], + // 선택 사항, 실행 후 다른 작업의 실행 카운트 감소 + // 예: 이성 회복제 사용 시, 이전에 누른 파란색 작전 시작 버튼이 무효화되었으므로 해당 작업 카운트 -1 - "rectMove": [ 0, 0, 0, 0 ], // 선택 사항, 인식 후 대상 이동을 나타냅니다. Auto-scaling으로 기준은 1280 * 720입니다. - // 예를 들어 A가 인식되지만 클릭해야 할 실제 위치는 A 아래 10 픽셀 5 * 2 영역의 어딘가에 있을 경우 - // [ 0, 10, 5, 2 ]를 채우고 가능한 경우 바로 클릭할 위치를 인식합니다. 이 옵션은 권장하지 않습니다. - // 추가적으로, action이 Swipe인 경우 유효하고 필수입니다. 슬라이드의 끝점을 나타냅니다. + "specificRect": [100, 100, 50, 50], + // action이 ClickRect일 때 유효하며 필수, 지정 클릭 위치 (범위 내 무작위 점) + // action이 Swipe일 때 유효하며 필수, 스와이프 시점 + // 1280 * 720 기준 자동 스케일링 + // algorithm이 "OcrDetect"일 때, specificRect[0]과 [1]은 그레이스케일 상/하한 임계값 - "reduceOtherTimes": [ "OtherTaskName1", "OtherTaskName2" ], - // 선택 사항, 다른 작업의 실행 횟수를 줄이기 위해 실행합니다. - // 예를 들어 정신약을 먹으면 마지막으로 파란색 시작 동작 버튼을 클릭한 효과가 없으므로 파란색 시작 동작이 -1됩니다. + "specialParams": [int, ...], // 특정 인식기에 필요한 추가 파라미터 + // action이 Swipe일 때 선택 사항: [0] duration, [1] 추가 슬라이드 활성화 여부 - "specificRect": [ 100, 100, 50, 50 ], - // action이 ClickRect인 경우 유효하고 필수입니다. 지정된 클릭 위치를 나타냅니다 (범위 내의 무작위 점). - // action이 Swipe인 경우 유효하고 필수입니다. 슬라이드의 시작점을 나타냅니다. - // Auto-scaling으로 기준은 1280 * 720입니다. - // algorithm이 "OcrDetect"일 경우, specificRect[0]과 specificRect[1]은 그레이스케일의 상한선과 하한선 임계값을 나타냅니다. + "highResolutionSwipeFix": false, // 선택 사항, 고해상도 스와이프 보정 활성화 여부 + // 현재 스테이지 내비게이션만 Unity 스와이프를 사용하지 않으므로 켜야 함 + // 기본값 false - "specialParams": [ int, ... ], // 일부 특수 인식기에 필요한 매개변수를 나타냅니다. - // 추가 옵션, action이 Swipe인 경우 [0]은 지속 시간, [1]은 추가 슬라이드 여부를 나타냅니다. + /* 이하 필드는 algorithm이 MatchTemplate일 때만 유효 */ - "highResolutionSwipeFix": false, // 선택 항목. 고해상도 스와이프 보정을 활성화할지 여부. - // 현재는 스테이지 내비게이션만 Unity 스와이프 방식을 사용하지 않으므로 이 옵션을 켜야 함 - // 기본값은 false + "template": "xxx.png", // 선택 사항, 매칭할 이미지 파일명 (문자열 또는 리스트) + // 기본값 "TaskName.png" + // 템플릿 파일은 template 폴더 및 하위 폴더에서 재귀적으로 검색됨 - /* 다음 필드들은 algorithm이 MatchTemplate인 경우에만 유효합니다. */ + "templThreshold": 0.8, // 선택 사항, 템플릿 매칭 점수 임계값. 이 값 이상이어야 인식 성공 (숫자 또는 리스트) + // 기본값 0.8, 실제 점수는 로그 확인 - "template": "xxx.png", // 선택 사항, 이미지 매칭에 사용할 이미지 파일의 이름을 나타냅니다. - // 기본값은 "작업이름.png"입니다. + "maskRange": [1, 255], // 선택 사항, 매칭 시 그레이스케일 마스크 범위. array + // 예: 인식 불필요 부분을 검은색(0)으로 칠하고 + // [1, 255]로 설정하면 검은색 부분 무시 - "templThreshold": 0.8, // 선택 사항, 이미지 템플릿 매칭 점수의 임계값을 나타냅니다. 이 점수 이상인 경우 이미지가 인식되었다고 판단합니다. - // 기본값은 0.8입니다. 실제 점수는 로그에서 확인할 수 있습니다. - - "maskRange": [ 1, 255 ], // 선택 사항, 흑백 마스크 범위를 나타냅니다. - // 예를 들어 인식할 필요가 없는 이미지 부분은 검은색으로 칠해질 수 있습니다 (0의 흑백 값). - // 그러면 "maskRange"를 [ 1, 255 ]로 설정하면 검은색 처리된 부분은 즉시 무시됩니다. - - - "colorScales": [ // method가 HSVCount 또는 RGBCount일 때 유효하고 필수, 색상 마스크 범위. + "colorScales": [ // method가 HSVCount 또는 RGBCount일 때 유효하며 필수, 색상 카운트 마스크 범위 [ // list, 2>> / list> - [23, 150, 40], // 구조는 [[lower1, upper1], [lower2, upper2], ...] - [25, 230, 150] // 내측이 int일 경우는 그레이스케일, - ], //   array일 경우는 삼채널 색상으로, method에 따라 RGB 또는 HSV로 결정됩니다; - ... // 중간 층의 array<*, 2>는 색상(또는 그레이스케일)의 하한과 상한: - ], // 외층은 다른 색상 범위를 나타내며, 식별할 영역은 템플릿 이미지에서 이들의 마스크의 합집합입니다. + [23, 150, 40], // 구조: [[lower1, upper1], [lower2, upper2], ...] + [25, 230, 150] // 내부가 int면 그레이스케일, + ], // array이면 3채널 색상 (method에 따라 RGB/HSV) + ... // 중간층 array<*, 2>는 색상(또는 그레이스케일) 하한/상한 + ], // 최외각은 서로 다른 색상 범위를 나타내며, 인식 대상 영역은 이들의 마스크 합집합임 - "colorWithClose": true, // 선택 사항, method가 HSVCount 또는 RGBCount일 때 유효, 기본값은 true - // 색상 수를 세는 동안 마스크 범위에 먼저 닫힘 연산을 적용할지 여부. - // 닫힘 연산은 작은 검은 점을 메울 수 있으며, 일반적으로 색상 수 세기 매칭 효과를 향상시키지만 이미지에 텍스트가 포함된 경우 false로 설정하는 것이 좋습니다 + "colorWithClose": true, // 선택 사항, method가 HSVCount/RGBCount일 때 유효, 기본값 true + // 색상 카운트 시 마스크 범위에 대해 닫힘 연산(Closing) 수행 여부 + // 작은 구멍을 메워 매칭 효과를 높이나, 글자가 포함된 경우 false 권장 - "pureColor": false, // 선택 사항, method가 HSVCount 또는 RGBCount일 때 유효, 기본값은 false - // true인 경우 템플릿 매칭 점수를 무시하고 색상 매칭 결과에만 의존 - // 색상 특징이 뚜렷하지만 템플릿 매칭 효과가 좋지 않은 시나리오에 적합 - // 이 옵션 사용 시 templThreshold를 상향 조정하는 것이 권장됨 + "pureColor": false, // 선택 사항, method가 HSVCount/RGBCount일 때 유효, 기본값 false + // true일 경우 템플릿 매칭 점수 무시, 색상 매칭 결과만 신뢰 + // 색상 특징은 뚜렷하나 템플릿 매칭이 잘 안 될 때 사용 + // 사용 시 templThreshold를 높이는 것을 권장 - "method": "Ccoeff", // 선택 사항, 템플릿 매칭 알고리즘, 목록 형태일 수 있음 - // 지정하지 않을 경우 기본값은 Ccoeff - // - Ccoeff: 색상에 민감하지 않은 템플릿 매칭 알고리즘, cv::TM_CCOEFF_NORMED에 해당 - // - RGBCount: 색상에 민감한 템플릿 매칭 알고리즘, - // 먼저 마스크 범위에 따라 매칭 영역과 템플릿 이미지를 이진화하고, - // RGB 색 공간 내의 유사도를 F1-score를 지표로 계산한 후, - // 결과를 Ccoeff 결과와 점곱합니다 - // - HSVCount: RGBCount와 유사하지만 색상 공간을 HSV로 변경 + "method": "Ccoeff", // 선택 사항, 템플릿 매칭 알고리즘 (리스트 가능) + // 비워둘 시 기본값 Ccoeff + // - Ccoeff: 색상에 둔감한 템플릿 매칭 (cv::TM_CCOEFF_NORMED) + // - RGBCount: 색상에 민감. colorScales로 이진화 후 + // RGB 공간 내 유사도(F1-score) 계산, + // 그 결과를 Ccoeff 결과와 곱함 + // - HSVCount: RGBCount와 유사하나 HSV 공간 사용 - /* 다음 필드들은 algorithm이 OcrDetect인 경우에만 유효합니다. */ + /* 이하 필드는 algorithm이 OcrDetect일 때만 유효 */ - "text": [ "接管作战", "代理指挥" ], // 필수 사항, 인식할 텍스트 내용을 나타냅니다. 어떤 항목이 일치하면 인식되었다고 판단합니다. + "text": [ "작전 수행", "대리 지휘" ], // 필수, 인식할 텍스트 내용. 하나라도 매칭되면 성공 - "ocrReplace": [ // 선택 사항, 자주 오인식되는 텍스트를 대체할 내용입니다 (정규표현식 지원). - [ "千员", "干员" ], - [ ".+击干员", "狙击干员" ] + "ocrReplace": [ // 선택 사항, 자주 오인식되는 텍스트 교정 (정규식 지원) + [ "머틀", "머틀" ], + [ ".+격대원", "저격대원" ] ], - "fullMatch": false, // 선택 사항, 텍스트 인식이 모든 단어를 일치시키는지 여부를 나타냅니다. 기본값은 false입니다. - // false인 경우, 부분 문자열인 경우 인식됩니다. 예를 들어 text: [ "시작" ]이면 실제 인식에서 "시작 작업"도 인식됩니다. - // true인 경우, "시작"만 인식되어야 합니다. + "fullMatch": false, // 선택 사항, 전체 일치 여부, 기본값 false + // false: 부분 문자열 매칭 허용 (예: text ["시작"] -> "작전 시작" 인식 성공) + // true: 정확히 일치해야 함 ("시작" -> "작전 시작" 실패) - "isAscii": false, // 선택 사항, 인식할 텍스트 내용이 ASCII 문자인지 여부를 나타냅니다. - // 기본값은 false입니다. + "isAscii": false, // 선택 사항, 인식 대상이 ASCII 문자인지 여부 + // 기본값 false - "withoutDet": false, // 선택 사항, 탐지 모델을 사용하지 않을지 여부를 나타냅니다. - // 기본값은 false입니다. + "withoutDet": false, // 선택 사항, 디텍션 모델 미사용 여부 + // 기본값 false - /* 다음 필드들은 algorithm이 OcrDetect이고 withoutDet가 true일 때만 유효합니다 */ + /* 이하 필드는 algorithm이 OcrDetect이고 withoutDet가 true일 때만 유효 */ - "useRaw": true, // 선택 사항, 원본 이미지를 사용하여 매칭할지 여부 - // 기본값은 true이며, false이면 그레이스케일 매칭 + "useRaw": true, // 선택 사항, 원본 이미지 사용 여부 + // 기본값 true, false면 그레이스케일 매칭 - "binThreshold": [140, 255], // 선택 사항. 그레이스케일 이진화의 상한 임계값 (기본값: [140, 255]) - // 이 값보다 높은 픽셀은 배경으로 간주되어 문자 영역에서 제외됩니다 - // 최종적으로 [lower, upper] 범위의 픽셀만 문자 전경으로 유지됩니다 + "binThreshold": [140, 255], // 선택 사항, 이진화 임계값 (기본값 [140, 255]) + // 범위 밖 픽셀은 배경으로 간주되어 제외됨 + // [lower, upper] 구간 픽셀만 전경(글자)으로 남음 - /* 다음 필드들은 algorithm이 JustReturn이고 action이 Input일 때만 유효합니다 */ + /* 이하 필드는 algorithm이 JustReturn, action이 Input일 때만 유효 */ - "inputText": "A string text.", // 필수 사항. 입력할 문자열 내용, 문자열 형식 + "inputText": "A string text.", // 필수, 입력할 문자열 - /* 다음 필드들은 FeatureMatch인 경우에만 유효합니다. */ + /* 이하 필드는 algorithm이 FeatureMatch일 때만 유효 */ - "template": "xxx.png", // 선택 사항. 일치시킬 이미지 파일 이름. 문자열 또는 문자열 목록일 수 있습니다. - // 기본값: "taskname.png" + "template": "xxx.png", // 선택 사항, 매칭할 이미지 파일명 (문자열/리스트) + // 기본값 "TaskName.png" - "count": 4, // 일치시킬 특징점 수(임계값), 기본값: 4 + "count": 4, // 매칭 특징점 수 (임계값), 기본값 4 - "ratio": 0.6, // KNN 일치 알고리즘의 거리 비율, [0 - 1.0]. 비율이 클수록 일치가 느슨해지고 연결하기가 더 쉽습니다. 기본값: 0.6 + "ratio": 0.6, // KNN 매칭 거리 비율 [0 - 1.0]. 클수록 느슨하여 매칭 쉬움. 기본값 0.6 - "detector": "SIFT", // 특징점 검출기 유형, 선택 사항: SIFT, ORB, BRISK, KAZE, AKAZE, SURF; 기본값: SIFT - // SIFT: 높은 계산 복잡도, 스케일 불변성, 회전 불변성. 최상의 효과. - // ORB: 매우 빠른 계산 속도, 회전 불변성. 하지만 스케일 불변성은 없습니다. - // BRISK: 매우 빠른 계산 속도, 스케일 불변성, 회전 불변성을 가집니다. - // KAZE: 2D 및 3D 이미지에 적용 가능하며, 스케일 불변성과 회전 불변성을 가집니다. - // AKAZE: 빠른 계산 속도, 스케일 불변성과 회전 불변성을 가집니다. + "detector": "SIFT", // 특징점 검출기. SIFT, ORB, BRISK, KAZE, AKAZE, SURF. 기본값 SIFT + // SIFT: 느리지만 스케일/회전 불변성 우수. 성능 최고. + // ORB: 매우 빠름, 회전 불변. 스케일 불변성 없음. + // BRISK: 매우 빠름, 스케일/회전 불변. + // KAZE: 2D/3D 적용 가능, 스케일/회전 불변. + // AKAZE: 빠름, 스케일/회전 불변. } } ``` +## 표현식 계산 + +작업 목록 유형 필드 (`sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes`)는 표현식 계산을 지원합니다. + +| 기호 | 의미 | 예시 | +| :--------: | :-------------------------------------------------------: | :------------------------------------: | +| `@` | `@` 형 작업 | `Fight@ReturnTo` | +| `#` (단항) | 가상 작업 | `#self` | +| `#` (이항) | 가상 작업 | `StartUpThemes#next` | +| `*` | 다중 작업 반복 | `(ClickCornerAfterPRTS+ClickCorner)*5` | +| `+` | 작업 목록 병합 (next 계열 필드에서 동명 작업은 앞쪽 우선) | `A+B` | +| `^` | 작업 목록 차집합 (전자에만 존재, 순서 유지) | `(A+A+B+C)^(A+B+D)` (결과는 `C`) | + +연산자 `@`, `#`, `*`, `+`, `^`의 우선순위: `#`(단항) > `@` = `#`(이항) > `*` > `+` = `^`. + ## 특수 작업 유형 -### 템플릿 작업(`@` 유형 작업) +### 템플릿 작업 -템플릿 작업과 기반 작업을 함께 **템플릿 작업**이라고 합니다. +**템플릿 작업**은 파생 작업과 `@` 형 작업을 포함합니다. 템플릿 작업의 핵심은 기반 작업을 바탕으로 **필드의 기본값을 수정**하는 것입니다. -작업 "A"를 템플릿으로 사용하고 "B@A"로 표기하여 "A"를 통해 생성된 작업을 나타낼 수 있습니다. +#### 파생 작업 (Derived Task) -- 작업 "B@A"가 `tasks.json`에 명시적으로 정의되어 있지 않으면 `sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes` 필드에 "B@" 접두사를 추가합니다(또는 작업 이름이 `#`로 시작하는 경우 "B"로 접두사를 추가 +`baseTask` 필드가 존재하는 작업이 파생 작업이며, `baseTask`에 지정된 작업을 해당 파생 작업의 **기반 작업(Base Task)**이라고 합니다. 파생 작업에서: -합니다). 나머지 매개변수는 "A" 작업과 동일합니다. 즉, 작업 "A"에 다음과 같은 매개변수가 있는 경우: +1. 템플릿 매칭 작업이라도 **`template` 필드**의 기본값은 여전히 `"TaskName.png"`입니다. +2. `algorithm` 필드가 기반 작업과 다르면, 파생 클래스 파라미터는 상속되지 않습니다 (TaskInfo 정의 파라미터만 상속). +3. 나머지 필드의 기본값은 모두 **기반 작업의 해당 필드**를 따릅니다. -```json - "A": { - "template": "A.png", - ..., - "next": [ "N1", "N2" ] - } -``` +#### 암시적 `@` 형 작업 -이는 다음과 같이 정의한 것과 동일합니다. +작업 `"A"`가 존재할 때, 작업 파일에 직접 정의되지 않았지만 `"B@A"` 형태의 작업이 사용되면 이를 암시적 `@` 형 작업이라 합니다. 작업 `"A"`는 작업 `"B@A"`의 **기반 작업**이 됩니다. 암시적 `@` 형 작업에서: -```json - "B@A": { - "template": "A.png", - ..., - "next": [ "B@N1", "B@N2" ] - } -``` +1. 작업 목록 유형 필드(`sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes`)의 기본값은 기반 작업의 해당 필드에 **직접** `B@` 접두사를 붙인 값이 됩니다 (작업명이 `#`로 시작하면 `B` 접두사). +2. 나머지 필드의 기본값은 모두 **기반 작업의 해당 필드**를 따릅니다 (필드 `template` 포함). -- 작업 "B@A"가 `tasks.json`에 정의되어 있다면 - 1. `B@A`의 `algorithm` 필드가 `A`의 `algorithm`과 다른 경우, 파생된 클래스 매개변수는 상속되지 않습니다(단지 `TaskInfo`로 정의된 매개변수만 상속됨). - 2. 이미지 매칭 작업의 경우, 명시적으로 정의되지 않으면 `template`은 `B@A.png`가 됩니다(단지 "A" 작업의 `template` 이름을 상속하지 않음). 그렇지 않은 경우 다른 파생된 클래스 매개변수는 "A" 작업에서 직접 상속됩니다. - 3. `TaskInfo` 기본 클래스에 정의된 매개변수 (모든 유형의 작업에 해당하는 매개변수, 예를 들어 algorithm, roi, next 등)가 `B@A` 내에서 명시적으로 정의되지 않은 경우, 앞에서 언급한 `sub` 등 다섯 개의 필드를 제외한 나머지 매개변수는 `B@` 접두어가 추가된 상속시 추가됩니다. 그 외의 매개변수는 `A` 작업의 매개변수를 직접 상속합니다. +#### 명시적 `@` 형 작업 - > _참고: `"XXX#self"`는 `"#self"`와 동일한 의미를 갖습니다._ +작업 `"A"`가 존재하고, 작업 파일에 `"B@A"` 형태의 작업이 직접 정의되어 있으면 이를 명시적 `@` 형 작업이라 합니다. 작업 `"A"`는 작업 `"B@A"`의 **기반 작업**이 됩니다. 명시적 `@` 형 작업에서: -### 기반 작업 +1. 작업 목록 유형 필드(`sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes`)의 기본값은 기반 작업의 해당 필드에 **직접** `B@` 접두사를 붙인 값이 됩니다 (작업명이 `#`로 시작하면 `B` 접두사). +2. 템플릿 매칭 작업이라도 **`template` 필드**의 기본값은 여전히 `"TaskName.png"`입니다. +3. `algorithm` 필드가 기반 작업과 다르면, 파생 클래스 파라미터는 상속되지 않습니다 (TaskInfo 정의 파라미터만 상속). +4. 나머지 필드의 기본값은 모두 **기반 작업의 해당 필드**를 따릅니다. -기반 작업과 템플릿 작업을 함께 **템플릿 작업**이라고 합니다. +### 가상 작업 (`#` 형 작업) -`baseTask` 필드가 있는 작업은 기반 작업입니다. +가상 작업은 `"#{sharp_type}"` 또는 `"B#{sharp_type}"` 형태의 작업입니다. 여기서 `{sharp_type}`은 `none`, `self`, `back`, `next`, `sub`, `on_error_next`, `exceeded_next`, `reduce_other_times` 중 하나입니다. -기반 작업은 템플릿 작업보다 우선합니다. 즉, `"B@A": { "baseTask": "C", ... }`는 작업 A와 관련이 없습니다. +가상 작업은 **명령 가상 작업**(`none` / `self` / `back`)과 **필드 가상 작업**(`next` 등)으로 나뉩니다. -명시적으로 정의되지 않은 모든 매개변수는 해당 작업이 접두사 없이 기반 작업의 매개변수를 사용하며, `template`은 명시적으로 정의되지 않은 경우에는 여전히 `"작업이름.png"`입니다. +| 가상 작업 유형 | 의미 | 간단 예시 | +| :------------: | :-------------------: | :----------------------------------------------------------------------------------------------------------------------: | +| none | 빈 작업 | 직접 건너뜀1
`"A": {"next": ["#none", "T1"]}` -> `"A": {"next": ["T1"]}`
`"A#none + T1"` -> `"T1"` | +| self | 현재 작업명 | `"A": {"next": ["#self"]}`의 `"#self"` -> `"A"`
`"B": {"next": ["A@B@C#self"]}`의 `"A@B@C#self"` -> `"B"`2 | +| back | # 앞의 작업명 | `"A@B#back"` -> `"A@B"`
`"#back"`이 직접 등장하면 건너뜀3 | +| next, sub 등 | # 앞 작업의 해당 필드 | `next` 예시:
`"A#next"` -> `Task.get("A")->next`
`"#next"`가 직접 등장하면 건너뜀 | -#### 멀티 파일 Task +_Note1: `"#none"`은 주로 템플릿 작업의 접두사 추가 특성과 함께 사용하거나, `baseTask` 사용 시 불필요한 필드 상속을 피하기 위해 사용합니다._ -나중에 로드된 작업 파일 (예: 글로벌 서버의 `tasks.json` 파일)에서 정의된 작업이 먼저 로드된 작업 파일 (예: CN 서버의 `tasks.json` 파일)에서도 동일한 이름의 작업이 정의된 경우 다음과 같습니다: +_Note2: `"XXX#self"`와 `"#self"`는 동일한 의미입니다._ -- 파일 2에 작업에 `baseTask` 필드가 없으면 파일 1에서 동일한 이름의 작업의 필드를 직접 상속합니다 -- 파일 2에 작업에 `baseTask` 필드가 있으면 파일 1에서 동일한 이름의 작업의 필드를 직접 상속하는 대신에 덮어씁니다. +_Note3: 여러 작업이 `"next": [ "#back" ]`을 가질 때, `"T1@T2@T3"`는 `T3`, `T2`, `T1` 순으로 실행됨을 의미합니다._ -### 가상 작업 +### 다중 파일 작업 -가상 작업은 또한 숫자 기호(`#` 유형 작업)로 불립니다. +나중에 로드된 작업 파일(예: 외섭 `tasks.json`, 이하 파일2)에 정의된 작업이 먼저 로드된 작업 파일(예: 중섭 `tasks.json`, 이하 파일1)에도 정의되어 있다면: -이름에 `#`이 포함된 작업은 가상 작업입니다. `#` 다음에는 `next`, `back`, `self`, `sub`, `on_error_next`, `exceeded_next`, `reduce_other_times`가 따라옵니다. - -| 가상 작업 유형 | 의미 | 간단한 예시 | -| :------------: | :----------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------: | -| self | 부모 작업 이름 | `"A": {"next": "#self"}`에서 `"#self"`는 `"A"`로 해석됩니다.`
"B": {"next": "A@B@C#self"}`에서 `"A@B@C#self"`은 `"B"`로 해석됩니다.``1 `` | -| back | # 앞 작업 이름 | `"A@B#back"`은 `"A@B"`로 해석됩니다.`
`직접 나타날 경우 `"#back"`은 무시됩니다. | -| next, sub 등 | 이전 작업 이름에 대응하는 필드 | `next`를 예로 들면:`
"A#next"`는 `Task.get("A")->next`로 해석됩니다.`
`직접 나타날 경우 `"#next"`은 무시됩니다. | - -_참고 ``1 ``: `"XXX#self"`는 `"#self"`와 같은 의미를 갖습니다._ - -#### 간단한 예시 - -```json -{ - "A": { "next": [ "N1", "N2" ] }, - "C": { "next": [ "B@A#next" ] }, - - "Loading": { - "next": [ "#self", "#next", "#back" ] - }, - "B": { - "next": [ "Other", "B@Loading" ] - } -} -``` - -다음 형식도 가능합니다. - -```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" }; -``` - -#### 몇 가지 사용 예시 - -- `"next": ["#back"]`와 같이 여러 작업이 주어진 경우, `"Task1@Task2@Task3"`은 `Task3`, `Task2`, `Task1` 순으로 순차적으로 실행됨을 나타냅니다. - -#### 기타 관련 정보 - -```json -{ - "A": { "next": ["N0"] }, - "B": { "next": ["A#next"] }, - "C@A": { "next": ["N1"] } -} -``` - -위의 예시에서, `"C@B" -> next` (즉, `C@A#next`)는 `["N1"]`이 아닌 `["C@N0"]`입니다. - -## 런타임에서 작업 수정 - -- `Task.lazy_parse()`는 런타임에서 json 작업 구성 파일을 로드할 수 있습니다. lazy_parse 규칙은 [멀티파일 Task](#멀티-파일-task)와 동일합니다. -- `Task.set_task_base()`를 사용하여 작업의 `baseTask` 필드를 수정할 수 있습니다. +- 파일2 작업에 `baseTask` 필드가 **없으면**, 파일1의 동명 작업 필드를 직접 상속합니다. +- 파일2 작업에 `baseTask` 필드가 **있으면**, 파일1의 동명 작업 필드를 상속하지 않고 **덮어씁니다**. 특히, 템플릿이 없을 때 `"baseTask": "#none"`을 사용하여 불필요한 필드 상속을 막을 수 있습니다. ### 사용 예시 -다음과 같은 작업 구성 파일이 있다고 가정합니다. +- 파생 작업 예시 (`baseTask` 필드) + + 다음 두 작업이 정의되어 있다고 가정합니다: + + ```json + "Return": { + "action": "ClickSelf", + "next": [ "Stop" ] + }, + "Return2": { + "baseTask": "Return" + }, + ``` + + `"Return2"` 작업은 `"Return"` 작업을 상속받아 실제로 다음 파라미터를 가집니다: + + ```json + "Return2": { + "algorithm": "MatchTemplate", // 직접 상속 + "template": "Return2.png", // "TaskName.png" 규칙 (템플릿 매칭이므로) + "action": "ClickSelf", // 직접 상속 + "next": [ "Stop" ] // 직접 상속 (Template Task와 달리 접두사 없음) + } + ``` + +- `@` 형 작업 예시 + + 다음 파라미터를 가진 작업 `"A"`가 있다고 가정합니다: + + ```json + "A": { + "template": "A.png", + ..., + "next": [ "N1", "#back" ] + }, + ``` + + 작업 `"B@A"`가 직접 정의되지 않았다면(암시적), `"B@A"`는 실제로 다음 파라미터를 가집니다: + + ```json + "B@A": { + "template": "A.png", + ..., + "next": [ "B@N1", "B#back" ] + } + ``` + + 작업 `"B@A"`가 `"B@A": {}`로 정의되어 있다면(명시적), `"B@A"`는 실제로 다음 파라미터를 가집니다: + + ```json + "B@A": { + "template": "B@A.png", + ..., + "next": [ "B@N1", "B#back" ] + } + ``` + +- 가상 작업 예시 + + ```json + { + "A": { "next": ["N1", "N2"] }, + "C": { "next": ["B@A#next"] }, + + "Loading": { + "next": ["#self", "#next", "#back"] + }, + "B": { + "next": ["Other", "B@Loading"] + } + } + ``` + + 결과는 다음과 같습니다: + + ```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" }; + ``` + +### 주의 사항 + +작업 목록 유형 필드(`next` 등)에 정의된 작업이 낮은 우선순위 연산을 포함할 경우, 실제 결과가 예상과 다를 수 있습니다. + +1. `@`와 이항 `#` 연산 순서에 따른 특례 + + ```json + { + "A": { "next": ["N0"] }, + "B": { "next": ["A#next"] }, + "C@A": { "next": ["N1"] } + } + ``` + + 이 경우, `"C@B" -> next` (즉 `C@A#next`)는 `[ "N1" ]`이 되며, `[ "C@N0" ]`가 아닙니다. + +2. `@`와 `+` 연산 순서에 따른 특례 + + ```json + { + "A": { "next": ["#back + N0"] }, + "B@A": {} + } + ``` + + 이 경우, + + ```cpp + Task.get("A")->next = { "N0" }; + + Task.get_raw("B@A")->next = { "B#back + N0" }; + Task.get("B@A")->next = { "B", "N0" }; // [ "B", "B@N0" ]가 아님에 주의 + ``` + + 사실 이 특성을 이용해 불필요한 접두사 추가를 피할 수 있습니다: + + ```json + { + "A": { "next": ["#none + N0"] } + } + ``` + +## 런타임 작업 수정 + +- `Task.lazy_parse()`는 런타임에 JSON 작업 설정을 로드할 수 있습니다. lazy_parse 규칙은 [다중 파일 작업](#다중-파일-작업)과 동일합니다. +- `Task.set_task_base()`는 작업의 `baseTask` 필드를 수정할 수 있습니다. + +### 사용 예시 + +다음과 같은 작업 설정 파일이 있다고 가정합니다: ```json { - "A": { - "baseTask": "A_default" - }, - "A_default": { - "next": ["xxx"] - }, - "A_mode1": { - "next": ["yyy"] - }, - "A_mode2": { - "next": ["zzz"] - } + "A": { + "baseTask": "A_default" + }, + "A_default": { + "next": ["xxx"] + }, + "A_mode1": { + "next": ["yyy"] + }, + "A_mode2": { + "next": ["zzz"] + } } ``` -다음 코드는 `mode` 값에 따라 작업 "A"를 변경하며, "A"에 의존하는 다른 작업인 "B@A" 등도 변경됩니다: +다음 코드는 `mode` 값에 따라 작업 "A"를 변경하며, 동시에 "B@A"와 같이 "A"에 의존하는 다른 작업들도 변경합니다: ```cpp switch (mode) { case 1: - Task.set_task_base("A", "A_mode1"); // 이것은 사실상 A를 A_mode1의 내용으로 대체하는 것과 같습니다. 아래와 같이 진행됩니다. + Task.set_task_base("A", "A_mode1"); // 기본적으로 A를 A_mode1 내용으로 덮어쓰는 것과 같음. 아래도 동일 break; case 2: Task.set_task_base("A", "A_mode2"); @@ -341,27 +428,14 @@ default: } ``` -## 표현식 계산 +## Schema 검증 -| 기호 | 의미 | 예시 | -| :---------------: | :----------------------------------------------------------------------: | :------------------------------------: | -| `@` | 템플릿 작업 | `Fight@ReturnTo` | -| `#` (unary/단항) | 가상 작업 | `#self` | -| `#` (binary/이항) | 가상 작업 | `StartUpThemes#next` | -| `*` | 작업 반복 | `(ClickCornerAfterPRTS+ClickCorner)*5` | -| `+` | 작업 목록 병합 | `A+B` | -| `^` | 작업 목록 차집합 (앞쪽에는 있지만 뒤쪽에는 없는 작업으로, 순서는 유지됨) | `(A+A+B+C)^(A+B+D)` (= `C`) | - -`@`, `#`, `*`, `+`, `^` 연산자의 우선순위는 다음과 같습니다: `#` (단항) > `@` = `#` (이항) > `*` > `+` = `^`. - -## 스키마 확인 - -이 프로젝트는 `tasks.json`에 대한 JSON 스키마 확인을 설정하며, 스키마 파일은 `docs/maa_tasks_schema.json`입니다. +본 프로젝트는 `tasks.json`에 대한 JSON schema 검증을 구성했습니다. 프로토콜 파일은 `docs/maa_tasks_schema.json`입니다. ### Visual Studio -`MaaCore.vcxproj`에 구성되어 있으며 즉시 사용할 수 있습니다. 힌트 효과는 상대적으로 불명확하며 일부 정보가 누락됩니다. +`MaaCore.vcxproj`에 구성되어 있어 바로 사용 가능합니다. 힌트 효과는 다소 불명확하며 일부 정보가 누락될 수 있습니다. ### Visual Studio Code -`.vscode/settings.json`에 구성되어 있으며, 해당 **프로젝트 폴더**를 vscode로 열고 사용할 수 있습니다. 힌트가 더 잘 작동합니다. +`.vscode/settings.json`에 구성되어 있으며, VS Code로 해당 **프로젝트 폴더**를 열면 사용할 수 있습니다. 힌트 효과가 좋습니다. diff --git a/docs/ko-kr/readme.md b/docs/ko-kr/readme.md index e443b38c7c..f358bca785 100644 --- a/docs/ko-kr/readme.md +++ b/docs/ko-kr/readme.md @@ -37,7 +37,7 @@ MAA는 MAA Assistant Arknights의 약자입니다 ## 주요 기능 - 이성을 사용하고, 아이템 드랍을 인식해 자동으로 통계 사이트에 업로드 합니다. [펭귄 물류](https://penguin-stats.io/), [Yituliu](https://ark.yituliu.cn/) -- 자동으로 오퍼레이터 효율을 고려해 기반시설 교대를 하며, 동시에 사용자 커스텀 교대 기능도 지원합니다. [기반시설 스키마](./protocol/base-scheduling-schema.md) +- 자동으로 오퍼레이터 효율을 고려해 기반시설 교대를 하며, 동시에 사용자 커스텀 교대 기능도 지원합니다. [기반시설 스케줄링 프로토콜](./protocol/base-scheduling-schema.md) - 자동으로 공개모집 및 즉시 모집을 선택할 수 있으며, 자동으로 통계 사이트에 업로드 합니다. [펭귄 물류](https://penguin-stats.io/result/stage/recruit/recruit), [Yituliu](https://ark.yituliu.cn/survey/maarecruitdata) - 공개 모집 화면에서 태그 인식을 할 수 있습니다. - 오퍼레이터 목록을 인식해, 보유중인 오퍼레이터들 및 잠재를 통계화하여 공개모집 태그 인식 시 표시합니다. @@ -45,7 +45,7 @@ MAA는 MAA Assistant Arknights의 약자입니다 - 공개 모집 인터페이스에 수동 식별을 지원하여 높은 등급의 오퍼레이터 공개 모집을 용이하게 합니다. - 오퍼레이터 목록을 식별하고, 보유 및 미보유 오퍼레이터와 그들의 잠재를 계산하며, 이를 공개 모집 인터페이스에서 표시하는 것을 지원합니다. - 원클릭으로 친구 방문 및 크레딧 획득/구매를 하며, 임무 보상 수령 등의 모든 일과를 수행합니다. -- 통합전략에서 자동으로 오퍼레이터 레벨을 인식하며, 오리지늄 각뿔 획득 및 노드 개방과 레벨을 올려줍니다. +- 통합 전략에서 자동으로 오퍼레이터 레벨을 인식하며, 오리지늄 각뿔 획득 및 노드 개방과 레벨을 올려줍니다. - Copliot 파일을 통한 자동 지휘가 가능합니다. [영상 설명](https://www.bilibili.com/video/BV1H841177Fk/) - C, Python, Java, Rust, Golang, Java HTTP, Rust HTTP 다음과 같은 다양한 환경에서 MAA를 사용할 수 있습니다! @@ -118,9 +118,9 @@ MAA는 중국어(간체)를 기본 언어로 하며, 번역 단어는 중국어( - [TypeScript 인터페이스](https://github.com/MaaAssistantArknights/MaaX/tree/main/packages/main/coreLoader) - [Woolang 인터페이스](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Woolang/maa.wo):[예제](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Woolang/demo.wo) - [통합문서](./protocol/integration.md) -- [콜백 스키마](./protocol/callback-schema.md) -- [전투 스키마](./protocol/copilot-schema.md) -- [작업 스키마](./protocol/task-schema.md) +- [콜백 프로토콜](./protocol/callback-schema.md) +- [작업 프로토콜](./protocol/task-schema.md) +- [자동지휘 프로토콜](./protocol/copilot-schema.md) ### 해외 서버 현지화