게임 세피리아의 메인 인벤토리에서 아티팩트와 석판의 위치 및 석판 회전을 함께 계산해, 아티팩트 효과를 높이는 배치를 찾아 적용하는 BepInEx 플러그인입니다.
이 플러그인은 큰 인벤토리에서는 전역 최적성을 보장하는 대신, 제한 시간 안에 완전히 검증한 배치 중 가장 좋은 결과를 사용합니다.
| 항목 | 대상 환경 |
|---|---|
| 운영 체제 | Windows x64 |
| 게임 런타임 | Unity Mono (6000.3.21f1) |
| 모드 로더 | BepInEx 6 Unity Mono x64 |
| 플러그인 프레임워크 | .NET Standard 2.1 |
게임 업데이트로 내부 구조가 바뀌면 플러그인이 동작하지 않을 수 있습니다.
- 아티팩트와 석판의 최적화 배치
- 아티팩트 및 콤보의 우선순위 배정
- 게임 컨트롤러를 포함하여 쉽고 편리하게 사용할 수 있는 친절한 UI
-
Sephiria 게임 폴더에 BepInEx 6 Unity Mono x64를 설치합니다.
-
게임을 한 번 실행해
BepInEx\plugins폴더가 생성되었는지 확인한 뒤 종료합니다. -
배포 파일 또는 직접 빌드한
Sephiria.QuickTabletOptimizer.dll을 다음 경로에 복사합니다.<Sephiria 설치 폴더>\BepInEx\plugins\QuickTabletOptimizer\Sephiria.QuickTabletOptimizer.dll -
게임을 실행하고
BepInEx\LogOutput.txt에서 다음과 같은 로드 메시지를 확인합니다.Sephiria Quick Tablet Optimizer 0.1.0 loaded.
업데이트할 때는 게임을 종료한 상태에서 기존 DLL을 새 버전으로 교체합니다.
- 게임에서 일반 모드의 메인 인벤토리를 엽니다. 인벤토리에 아티팩트가 하나 이상 있으면 좌측 상단에 최적화 버튼이 활성화됩니다.
- 특정 대상을 먼저 강화하고 싶다면 아티팩트 슬롯 또는 콤보 행에 마우스를 올리고 **가운데 버튼 (휠 클릭)**을 누릅니다. 게임패드에서는 대상에 포커스를 둔 뒤 Y를 누릅니다.
- 선택한 순서가 숫자로 표시됩니다. 아티팩트 우선순위와 콤보 우선순위는 각각 독립적으로 관리되며, 먼저 선택한 항목일수록 앞선 우선순위로 비교됩니다. 같은 입력을 다시 누르면 해당 항목이 목록에서 제거됩니다.
- 최적화 버튼을 클릭하거나 게임패드 확인 입력으로 활성화합니다. 계산 중에는 버튼이 잠기며 상태 메시지가 표시됩니다.
- 계산과 검증이 성공하면 선택된 배치가 적용됩니다. 더 나은 배치를 찾지 못했거나 현재 배치가 선택되면 인벤토리는 그대로 유지됩니다.
우선순위는 같은 던전 세션에서 인벤토리를 닫았다 다시 열어도 유지되며, 새 던전 세션에 들어가면 초기화됩니다. 식별·인챈트·신비 항아리 선택·석판 조합 같은 특수 인벤토리 모드에서는 우선순위 편집과 최적화 버튼을 사용할 수 없습니다.
- .NET 8 SDK (
global.json기준8.0.200이상) - Sephiria 설치본
- 로컬 실행 및 자동 배포 시 초기화된 BepInEx 6 설치본
프로젝트의 실제 게임 연동 코드는 Assembly-CSharp.dll, Mirror.dll, UnityEngine.UI.dll 등 Sephiria의 관리형 어셈블리가 있을 때 포함됩니다. 따라서 동작 가능한 모드 DLL을 만들려면 저장소 루트에서 로컬 설정 파일을 먼저 준비해야 합니다.
Copy-Item Directory.Build.local.props.example Directory.Build.local.props생성한 Directory.Build.local.props에서 GameDir을 Sephiria.exe가 있는 폴더로 수정합니다. 이 파일은 개인 게임 경로를 포함하므로 Git에서 제외됩니다.
dotnet restore --locked-mode
dotnet build --configuration Release --no-restore
dotnet test --configuration Release --no-build빌드 결과는 다음 위치에 생성됩니다.
src\Sephiria.QuickTabletOptimizer\bin\Release\netstandard2.1\Sephiria.QuickTabletOptimizer.dll
빌드할 때 게임 폴더로 자동 복사하려면 Directory.Build.local.props의 DeployOnBuild를 true로 변경합니다. BepInEx를 한 번 실행해 BepInEx\plugins가 생성된 뒤에만 자동 배포를 활성화하세요.
NuGet 의존성을 의도적으로 갱신할 때만 --locked-mode 없이 복원하고, 변경된 packages.lock.json을 검토합니다. 개발 환경에 관한 추가 설명은 docs/development.md를 참고하세요.
최적화기는 현재 배치를 초기 해답으로 삼는 결정론적 exact anytime branch-and-bound 탐색을 사용합니다.
- 입력 캡처: 활성화된 메인 그리드 슬롯과 아티팩트·석판의 인스턴스, 현재 위치와 회전, 아티팩트 및 콤보 우선순위, 효과 계산에 필요한 상태를 불변 스냅샷으로 만듭니다. 일반 아이템과 이동할 수 없는 효과 원천은 고정 점유로 남기고 물약 전용 보관함은 제외합니다.
- 의미 검증 및 컴파일: 현재 배치를 가상으로 다시 계산해 실제 아티팩트 레벨·활성화 상태·콤보 소속과 일치하는지 확인합니다. 일치하지 않거나 지원할 수 없는 효과가 있으면 배치를 변경하지 않고 계산을 중단합니다.
- 초기 후보 개선: 석판의 위치·회전별 전체 효과 필드를 만들고, 서로 독립적인 아티팩트는 정확한 이분 매칭으로 슬롯에 배정해 빠르게 좋은 완성 후보를 구합니다.
- 정확 탐색: 아티팩트와 석판의 모든 합법적 위치 및 석판 회전을 같은 탐색 공간에서 다룹니다. 낙관적 상한, 동치·우월 관계, 제약 전파와 제한된 캐시로 현재 최선보다 나을 수 없다고 증명된 분기를 제거합니다.
- 종료 및 적용: 모든 분기를 해결하면 최적성이 증명된 결과를 얻습니다. 기본 7.5초 탐색 기한에 먼저 도달하면 그 시점까지 완전히 평가된 최선의 후보를 유지합니다. 이후 서버가 인벤토리와 우선순위가 캡처 시점과 같은지 재검증하고, 유효할 때만 위치와 회전을 한 번에 적용합니다.
후보는 다음 항목을 위에서부터 사전식으로 비교합니다.
후보 비교 우선순위 보기
flowchart TD
A["1. 아티팩트 우선순위별 효과 단계<br/>높은 값 우선"]
B["2. 콤보 우선순위별 효과 단계 합계<br/>높은 값 우선"]
C["3. 모든 아티팩트의 효과 단계 합계<br/>높은 값 우선"]
D["4. 음수 레벨 부족분<br/>작은 값 우선"]
E["5. 최대 레벨을 넘는 낭비<br/>작은 값 우선"]
F["6. 이동한 아이템 수<br/>작은 값 우선"]
G["7. 회전한 석판 수<br/>작은 값 우선"]
H["8. 정규화된 슬롯·회전 키<br/>사전순으로 작은 키 우선"]
I(["최종 후보 선택"])
A -->|동률일 때| B
B -->|동률일 때| C
C -->|동률일 때| D
D -->|동률일 때| E
E -->|동률일 때| F
F -->|동률일 때| G
G -->|동률일 때| H
H --> I
활성화된 아티팩트의 효과 단계는 clamp(원시 레벨, 0, 최대 레벨) + 1이며, 비활성화된 아티팩트는 0입니다. 이 정의는 레벨 0에서도 활성 효과가 있는 게임 규칙을 반영합니다. 마지막 정규화 키까지 같게 적용하므로 같은 입력과 같은 완료 탐색 범위에서는 항상 같은 배치를 선택합니다.
이 프로젝트의 코드와 문서는 BSD 3-Clause License로 배포됩니다.
다음 이미지 자산은 BSD 3-Clause License 적용 범위에서 명시적으로 제외되며, LICENSE 파일은 이 자산의 사용, 복제, 수정 또는 배포를 허가하지 않습니다.
src/Sephiria.QuickTabletOptimizer/Assets/quick-tablet-optimizer-icon.png
docs/assets/preview.gif
Sephiria와 관련 상표 및 게임 자산의 권리는 각 권리자에게 있습니다. 이 프로젝트는 게임 원본 파일, 추출한 DLL 또는 BepInEx 배포본을 포함하지 않습니다.
