281a3659522ad9bf2ccbcbfc0cb0ba1cacc7d656
- main.go를 main()만 남기고 함수 분리 (game.go, protocol.go, ui.go) - 재시도 로직을 retryWithBackoff 공통 함수로 통합 - redeemTicketFrom 별도 HTTP 클라이언트 → apiClient 사용으로 통일 - doDownload에서 resumeOffset 이중 계산 제거 - extractZip에서 stripTopDir/extractFile 함수 분리 - downloadWithProgress에서 createProgressWindow 함수 분리 - DLL 선언을 DLL별로 그룹화, 상수를 역할별로 분리 - 전체 주석 한국어 통일 및 섹션 구분 추가 버그 수정: - ensureLauncher가 설치 경로 대신 실행 중인 경로를 해시하던 문제 수정 - uninstall 시 실행 중인 exe 삭제 실패 → 백그라운드 cmd로 대체 - moveContents에서 os.Remove 에러를 무시하던 문제 수정 - install/uninstall 메시지 통일, exitWithError 헬퍼 추가 - .gitignore에 *.exe 통일, ANALYSIS.md 삭제 - 빌드 명령에 git 태그 기반 버전 주입 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
One of the plans — Launcher
Windows 전용 게임 런처. a301:// 커스텀 URI 프로토콜을 등록하고, 웹에서 게임 시작 버튼 클릭 시 게임을 자동 다운로드/업데이트/실행합니다.
빌드
# Go 1.24+ 필요
go build -ldflags="-H windowsgui -s -w" -o launcher.exe .
-H windowsgui — 콘솔 창 없이 실행 (Win32 GUI 앱)
-s -w — 디버그 심볼 제거 (바이너리 크기 축소)
사용법
| 실행 방법 | 동작 |
|---|---|
launcher.exe (인자 없음) |
a301:// 프로토콜 등록 확인 다이얼로그 |
launcher.exe install |
프로토콜 강제 등록 |
launcher.exe uninstall |
프로토콜 제거 |
launcher.exe "a301://launch?token=<JWT>" |
게임 실행 (웹에서 자동 호출) |
게임 실행 흐름
웹 "게임 시작" 클릭
└─ a301://launch?token=JWT
└─ launcher.exe 실행
├─ 서버에서 최신 버전 정보 조회 (fileHash, url)
├─ A301.exe 없음 또는 해시 불일치 → 다운로드 창 표시
│ ├─ game.zip 다운로드 (진행률 표시)
│ └─ 압축 해제 (launcher.exe 자신은 덮어쓰기 방지)
└─ A301.exe -token <JWT> 실행
UI
다크 테마 Win32 창 (배경 #2E2C2F, 강조색 #BACDB0).
4K / FHD 해상도 모두 자연스럽게 표시 (DPI 인식 + 동적 스케일링).
배포 구조
유저가 받는 구성:
(게임 폴더)/
├── launcher.exe ← 이 파일
└── A301.exe ← 런처가 자동 다운로드
launcher.exe를 처음 실행하면 레지스트리에 a301:// 프로토콜을 등록하고, 이후 웹에서 게임 시작 버튼을 누를 때마다 자동으로 이 런처가 실행됩니다.
레지스트리 등록 경로
HKCU\Software\Classes\a301\
HKCU\Software\Classes\a301\shell\open\command → "launcher.exe" "%1"
의존성
golang.org/x/sys/windows— Win32 APIgolang.org/x/sys/windows/registry— 레지스트리 접근
Description