Migration Analysis · T3_Lobby → Quantum Range

T3_Lobby → QR 전환 분석 보고서

QR은 T3_Lobby(Unity C#)를 근간으로 하되 1인 로그인 · 구독 플랜 · 모드 축소 · QR 전용 서버가 달라, 코드·프리팹·패킷·세이브 전 계층에서 바꿔야 할 지점을 7개 축으로 분석했다. 게임 로직 루트 E:\VX\T3_Lobby\Assets\MaumGolf\TUp2\Scripts 기준 실코드 근거(파일·클래스·라인)를 붙였다.

✅ 요약 — 전환 규모 체감

분석 축7개 (멀티플레이 축 심층 재분석 포함)
발견 건수약 50건 · high(구조급) 20+건
전환의 본질"옵션 제거"가 아니라 재설계
최대 리스크 ①관리자 탭 enum 서수 인덱스 시프트
최대 리스크 ②프리팹 6칸 그리드 레이아웃 붕괴
T3에 없어 신설구독 플랜 축 · plan 타일 그리드
사용자 지적 검증강퇴=장비(macId) 단위 → 6명 동시 강퇴 ✔
프로토타입 정합client.js가 자기 정책과 모순된 잔재 노출 중

왜 "재설계"인가 — T3는 ① 동시 최대 6인 슬롯 아키텍처, ② 플레이어 일괄설정, ③ 자동 퍼팅 이어하기, ④ 몸풀기 연습장, ⑤ 대회·팀·파크골프·이벤트·미니게임 3종 등 다인·다모드 전제가 전 계층에 박혀 있다. QR은 여기에 T3에 아예 없는 '구독 플랜' 축과 plan 기반 모드 타일 그리드를 새로 얹어야 한다. 로비·플레이어설정·모드선택은 "지우기"가 아니라 통째 다시 만드는 작업에 가깝다.

우선먼저 손대야 할 것

Tier 0 — 착수 전 반드시 선행 (블로커)

항목이유
구독 판정 상태 매니저 신설 결정18홀·멀티·코스60·다트·코스트레이닝 게이팅이 전부 이 공용 상태에 의존. Player.cs에 구독 필드가 전무(IsMember 이분법만). 원천(로그인 응답 vs 별도 매니저) 미정.
콘솔 A(세로)/B(가로) 단일카드·타일그리드 시안6칸 카드·스텝퍼·모드 depth 네비가 전부 프리팹 직렬화라 코드 선행 불가. 시안 없이 착수하면 재작업(가로는 실제 1920×1080 리플로우).
enum 시프트 처리 방침 확정T3GameOptionIndex 삭제 항목을 "슬롯 유지 + SetActive(false)" vs "재번호 + 프리팹 roundOptions 동시 수술" 중 택1. 방침 없이 개별 작업 시 탭 붕괴.

Tier 1 — high × large (구조 재작업)

축항목규모
1다인 6인 로그인 슬롯 아키텍처(maxUserCount=6·nextLoginSlotIndex·슬롯 순회) → 단일 유저high large
1플레이어 일괄설정(usesBatchSettings/roundBatch excludeFlags) 전면 제거high large
1로비 6슬롯 플레이어 카드 리스트 → 단일 카드화 (프리팹)high large
5모드선택 화면: depth 상태머신 → plan 타일 그리드 신규 구축high large
5QR 미사용 모드 대량 제거(대회·팀매치·파크골프·이벤트·히든홀·챌린지)high large
5코스 목록 30↔60 필터 재설계(서버 드리븐이라 'CSV 플래그' 그대로 불가)high large
3멀티 강퇴 macId(장비)→golfer 단위 재정의 (서버 프로토콜+클라)high large
3QR 전용 서버 격리(방리스트·매칭·순위) + 집계 단위(macId→golfer)high large

Tier 2 — high × medium/small (그 다음)

축항목규모
6·2관리자 경기환경 '자동 퍼팅 이어하기' 드롭다운 삭제 (enum 중간 인덱스 → 탭 전체 오정렬 위험)high medium
4모드선택 상단바 '연습장 입장(몸풀기)' 버튼 제거high medium
4스트로크 플레이어설정 몸풀기 시간 스텝퍼+입장 버튼 제거high medium
4·6관리자 소프트웨어 '몸풀기 연습시간'·'종료 후 시간요청' 삭제high medium
5미니게임 3종 → 다트 개인전만(틱택토·주얼리·다트팀 제거)high medium
5스트로크 18홀 구독 게이팅(잠금+안내팝업) — T3엔 홀수 토글·plan 개념 자체 없음high medium
2client.js 4곳 자동퍼팅이어하기 옵션 제거(프로토타입 정책 위반)high small

멀티멀티플레이 — 강퇴 · QR 전용 서버 (심층)

핵심 구조: Room(방) → NetworkSimulator(=물리 장비 1대, macId 키) → golfers(장비당 여러 명) 3계층. 이 계층이 QR 요구와 충돌하는 뿌리다.

M1. 강퇴/추방이 '장비(macId)' 단위 — 사용자 지적 검증됨 high large
T3 현재강퇴 요청 패킷 OnlineStrokeLeaveRoomRequest(Packet_OnlineStroke.cs:776)의 필드가 ulong joinRoomIdx, string leaveMacId 둘뿐 — 대상이 골퍼ID가 아니라 machineID(장비). 브로드캐스트 RoomMsgBenResponse(op FORCE_LEAVE=108) → NetworkGroup.RemoveMacIdGolfersBySzMsg()(NetworkGroup.cs:973-1050)가 해당 macId 장비의 golfers를 통째로 제거. 한 장비에 AddGolfers(addSelf=true)로 로컬 골퍼 전원(최대 6)이 묶이므로 → 강퇴 한 번에 최대 6명 제거.
QR 필요강퇴 대상을 golferId(사용자) 단위로. QR 전용 서버 Kick 패킷에 targetGolferId 추가, 클라 호출을 RemoveGolfer(macId, golferId)(이미 존재, NetworkGroup.cs:1074)로 전환. 단 서버 패킷에 golferId 필드가 없어 프로토콜부터 재정의 필수.
영향Packet_OnlineStroke.cs, NetworkGroup.cs, LobbyLogic_Multiple.cs(LeaveOnlineRoom(roomIdx, macId)), NetworkPlayPacketReceiver.cs, TUp2PacketType.cs
UI 붕괴대기방 참가자 리스트가 'macId 그룹'이 아닌 'golfer 평면 리스트'로 바뀌고, 강퇴 버튼이 골퍼 행 단위로 붙어야 함. (강퇴 버튼 발신 UI는 코드에서 미발견 → Open Q)
M2. 방 정원 6 하드코딩 + 홀수(9/18)=코스 개수 파생 med small~medium
T3 현재방 정원 Room.cs:544 capacity=6, RoomManager.cs:68. 홀수는 별도 설정이 아니라 OnlineStrokeDetailUI.cs:285 courseIds > 1 ? 18 : 9 — 코스 1개=9홀, 2개=18홀.
QR 필요멀티 9홀 강제 → 방 생성 시 코스 선택 1개 강제, 18홀 경로 차단, playHoleCount=9 고정. 방 정원 상한 확정(서버 MaxPlayerCount와 정합).
UI 붕괴IN/OUT 2코스 표기(inCourseName/outCourseName)·상세 UI가 18홀 2코스 전제 → 9홀 고정 시 IN코스 영역 정리.
M3. 서버 바인딩 — 하드코딩 아님, 런처 인자/에셋 주입 med small(설정)
T3 현재소켓(방/강퇴/라운드) 주소는 NetworkManager.Awake가 런처 인자 /server:<ip:port> + NetworkAddress ScriptableObject로 주입(소스 하드코딩 없음). 환경 URL은 URLManager가 CDN URL_{platform}.txt에서, GolfHub REST는 GolfHubConfig.baseUrl 에셋에서.
QR 필요QR 전용 엔드포인트로 바인딩 — 런처/배포 인자 또는 QR용 NetworkAddress·URL 키·GolfHub baseUrl 분리(Q와 물리 격리).
UI 붕괴없음. 단 Q/QR 데이터 격리가 순수 서버 인스턴스 분리로 충분한지는 서버 스펙 확인 필요(Open Q).
M4. 매칭·방리스트·순위 집계가 macId(장비) 묶음 단위 med large
T3 현재방리스트/매칭 = 소켓 OnlineStrokeGetRoomListRequest(op 10). 라운드 동기화 = GetSimulatorSeqRequest(op 52, macId 기반, IntroModule_WaitNetworkPlayer가 15초 폴링). 방내 순위 = NetworkGroup.multiRankingDatas의 생사판정이 시뮬레이터(macId).golfers 순회(MultiRankingDataConnectCheck). 대회/그랑프리 순위는 GolfHub REST(별개).
QR 필요방리스트·매칭·방내순위 전부 QR 소켓 서버로만(Q와 격리). 순위 집계를 macId 묶음이 아닌 golfer 단위로 재검토(1인 로그인이면 영향 적음). QR 누적 순위를 소켓 vs GolfHub 어디에 둘지 결정.
UI 붕괴순위·대기 UI가 시뮬레이터 집합을 순회 → golfer 평면화 시 랭킹/관전 로직 수정.
M5. 멀티 = 구독 전용 게이트가 T3에 없음 med medium(신규)
T3 현재멀티(OnlineStroke) 진입에 구독/멤버십 게이트 없음(T3는 매장 아케이드 전제, 구독 개념 자체 부재). grep상 구독 체크 로직 미존재.
QR 필요LobbySelectGameLogic의 OnlineStroke 진입부에 구독 상태 게이트 신규 추가. 자리는 있으나 로직은 새로 작성.
UI 붕괴없음(추가 게이트)
M6. 자동 퍼팅 이어하기 부활 지점 = golferCount 조건 med small~medium
T3 현재버튼 노출이 D.selfRound.golferCount < 2(BottomMenuUI.cs:355)·GetGolferCount() <= 1(ShotPuttContinue.cs:343)에 걸림 → 1인이면 자연 비활성. 단 한 장비에 2명 이상 태우면 즉시 부활(Room.MemberCheck()가 loginUserList 전원 Join).
QR 필요1인 로그인 강제로 버튼은 안 뜨나, ⓐ 멀티 방설정 UI에서 puttingContinue 토글 제거, ⓑ 다중 로컬 로그인 경로 차단으로 부활 원천 봉쇄. (클러스터 A와 함께)
UI 붕괴낮음(getter false면 숨김). 하단 메뉴 버튼 배열 정렬만 확인.
별개 — 계정 밴 UserBanished(빈 패킷 → 수신 시 앱 종료)는 방 강퇴와 다른 관리자/서버발 계정 차단. QR 전용 서버 기준 유지 여부 별도 결정(방 강퇴와 혼동 금지).

교차교차 이슈 지도 (병합 클러스터)

여러 축에 중복 등장 → 축별로 따로 치지 말고 클러스터 단위로 한 번에 처리. 상세는 지정 "주 축"에.

A · 자동 퍼팅 이어하기 전면 제거 (주 축 2)
관련: 축2 전체 · 5-F7 · 6-F1/F7 · 7-F1 · 멀티 M6
6개 계층이 얽힘: ① 인게임 버튼 2종(BottomMenuUI.cs 339-378, MainMenu_Touch_UI.cs 357-388) ② 엔진 ShotPuttContinue.cs·Round.putt(→turnSystems.CancelTurn) ③ 턴 우선순위 TurnSystems.ComparePuttContinue(reflection) ④ config 파이프라인 ClientRoundConfig.puttingContinue·RoundConfigType 0x0400·패킷/세이브 직렬화 ⑤ 관리자 경기환경 드롭다운(T3GameOptionIndex.PuttingContinue=16 → 클러스터 C) ⑥ client.js 4곳.
핵심 리스크 — Round.putt를 null화하면 BottomMenuUI:1347(null 미검사)·ShotMulliganContainer 680-683에서 NRE. → 완전 삭제보다 "항상 no-op(isReadyUsePuttContinue=false)" 무력화가 회귀 위험 낮음. 세이브/패킷 0x0400 슬롯은 서버 스펙 확정 전까지 상수(NotUse) 유지 권장.
B · 몸풀기(WarmingUp) 전면 제거 (주 축 4)
관련: 축4 전체 · 5-F7 · 6-F2/F3
진입점 2곳: 상단바 Lobby_MainButton_TT.EnterWarmingUp + 스트로크 플레이어설정 T3_Lobby_PlayerSetupTouchUI(스텝퍼). 관리자 소프트웨어 2옵션 PracticeTime=30·RequestTimeOnWarmupEnd=31(→클러스터 C). 인게임 서브시스템 Logic/WarmingUp/*·UI/InGame_WarmingUp/*·DlgWarmUpSetting_T3.
주의 — RoundType.WarmingUp=104/RoomType.WarmingUp=104 enum은 Club.cs·SensorManager.cs·Packet_ChangeGameStatus.cs가 참조 → 성급히 삭제 금지, 진입만 차단. client.js의 '연습장/range'는 샷트레이닝 Training 모드로 별개 개념(혼동 금지).
C · enum 위치 인덱스 시프트 붕괴 (주 축 6) — 🔴 최상 리스크
관련: 2-F1 · 6-F1/F2/F5
DlgAdminSetting_Game_T3.cs의 T3GameOptionIndex(0~31)가 직렬화 roundOptions(List)의 위치 인덱스로 직접 사용. PuttingContinue(=16, 중간) 삭제 시 DistanceUnit(17)~Training~Software(27~31) 전부 1칸 밀림(거리단위 드롭다운에 홀컵 문자열이 뜨는 식). PracticeTime(=30)·RequestTimeOnWarmupEnd(=31)은 말단 2개 동시 제거 시 안전.
안전책 — enum 서수 유지 + 해당 드롭다운 GameObject SetActive(false) + 바인딩 스킵, 또는 enum 재번호와 프리팹 roundOptions 리스트를 동시에 같은 순서로 재배치.
D · 다인/슬롯 → 1인 단일화 (주 축 1)
관련: 1-F1/F3/F8 · 7-F2/F3
슬롯 좌표 maxUserCount=6·loginSlotIndex·nextLoginSlotIndex. 6칸 카드 DlgLoginPlayer.loginUsers(6)·LobbyProgressPageUI.playerUIList(6). 턴 인디케이터 UserTurnUI·BottomNextUI·colorCodeList[0..6].
리스크 — colorCodeList 최소 7인덱스 전제 → 축소 후 잔존 인덱스 접근 시 IndexOutOfRange. BottomNextUI.SetWaitFlag 배관이 UI 비활성 경로에서 다음 턴을 멈출 잠재 리스크(7-F3).
E · 구독 플랜 게이팅 신설 (주 축 5)
관련: 1-F9 · 5-F3/F4/F5 · 멀티 M5
T3엔 plan/구독 개념 전무. Player.cs는 IsMember(회원/게스트) 이분법만, 구독 플래그 없음. 멤버십 등급은 GolfHub membership-api(grade)에 초안·미연결. 이 공용 상태로 18홀·멀티·코스30→60·다트·코스트레이닝 게이팅. '매장주 또는 플레이어 어느 쪽이든 구독=구독'.
정합 — client.js는 구독여부를 콘솔 전역 토글 state.plan에서 파생할 뿐 로그인 계정과 무관 → 실제로는 로그인 유저 구독상태를 읽어야 함(현재 오표시 구조).
F · 모드선택 화면 재설계 (주 축 5)
관련: 5-F1/F6 · 1-F4
T3: LobbySelectGameLogic 상태머신(ModeSelect→SelectCC→RoundSetting) + RadioButtonGroup2 depth 버튼. QR: 단일 타일 그리드, plan에 따라 모드 개수·버튼 크기 가변, 미진행 모드는 타이틀만. 로그인 게이트도 '시작 버튼'→'모드 버튼 클릭 시 per-mode'로 이동. 기준 구현: client.js MB_MAIN vs MB_MAIN_DEFAULT.
G · QR 프로토타입(client.js) 정책 불일치 정리
관련: 1-F2 · 2-F5 · 5-F8 · 6-F7 · 7-F1
client.js가 자기 정책과 모순되게 노출 중: 스트로크 개인/일괄 토글(1314·2960-2976, 1인이라 제거), 자동퍼팅이어하기 옵션 4곳(STROKE_OPTS:533·MP_ENV:1500·CT1_OPTS:367·CT2_OPTS:374), 레거시 로비 스킨(homeNav TOURNAMENT·renderJunior/renderEvent — 죽은 진입 격리).
혼동 금지 — 로비/스트로크의 '이어하기'(2554·2713)는 라운드/연습 resume이라 퍼팅 이어하기와 무관, 제거 대상 아님.

축별축별 상세

축 1 — 1인 로그인 · 플레이어 관리 (findings 9, high 3)

Finding요지 (T3 근거 → QR 필요)규모
F1 6인 슬롯SettingValueManager:202 maxUserCount=6·LoginManager.CreateLoginUser 슬롯 순회 → 단일 유저. 값만 1로 낮추면 로비 5칸 EMPTY 붕괴 → 프리팹 재설계(F3)high
F2 일괄설정Round.cs:388 usesBatchSettings·Golfer excludeFlags {"roundBatch"}·RoundLoginController.MakeDirtyExcluding → 항상 personal 경로만 (클러스터 G)high
F3 6칸 카드DlgLoginPlayer.loginUsers(6)·LobbyProgressPageUI.playerUIList → 단일 카드. 프리팹 6카드 고정 그리드 (콘솔 A/B 각각 재작성)high
F4 로그인 게이트LobbyButtonController.OnClickStartButton(시작 시점 게이트) → per-mode 게이트로 이동 (클러스터 F)med
F5 QR코드 범위회원전용 유지(정책 일치)나 내부 슬롯검사 단일화. 중국 Wechat QR(chinaQRInfos·라디오그룹) 제거 검토 → QR 영역 재정렬. serviceName 이미 "QUANTUM"med
F6 3분기 로그인회원/카카오/게스트 3분기 존재. 카카오 노출이 ProductType.TUp2 게이팅 → QR 제품타입 미인식 시 카카오 버튼 죽은버튼. QR ProductType/local 매핑 필요med
F7 자동 이어하기LoginManager.SetUserForContinuePlay·게스트 이어하기 슬롯 복원 → 제거/무력화 (정책 #3)med
F8 슬롯색상colorCodeList[slotIndex]·'SLOT 01' 배지 → 슬롯0 고정·단순화. IndexOutOfRange 주의 (클러스터 D)low
F9 구독회원 표시Player.cs:112 IsMember만 → 구독 필드 필요. client.js 2378이 state.plan 파생이라 뱃지 오표시 (클러스터 E)med

축 2 — 자동 퍼팅 이어하기 제거 (→ 전체 클러스터 A)

F1 관리자 드롭다운T3GameOptionIndex.PuttingContinue=16 삭제 → enum 시프트 (클러스터 C, 🔴)high
F3 엔진 NRERound.putt null화 시 BottomMenuUI:1347·ShotMulliganContainer NRE → no-op 무력화 권장med
F5 client.js 4곳그리드 3열 map 렌더라 1칸 빼면 고아 셀. CT2는 is-empty 필러(496) → 열수 재조정high

축 4 — 몸풀기 연습장 제거 (→ 전체 클러스터 B, findings 5 · high 3)

F1 상단바 버튼Lobby_MainButton_TT 연습장 입장 버튼·씬로드 제거 → HorizontalLayout 재배치high
F2 스텝퍼T3_Lobby_PlayerSetupTouchUI 몸풀기 스텝퍼 3요소 컨테이너째 제거 → 버튼 바 재정렬high
F3 소프트웨어 2옵션PracticeTime=30·RequestTimeOnWarmupEnd=31 말단 동시 제거(안전) → 언어만 남아 리플로우high
F4 인게임 씬/enumLogic/WarmingUp/*·씬 빌드 제외. enum은 존치+진입차단(Club/SensorManager/Packet 참조)med

축 5 — 모드 구성 · 구독 게이팅 (findings 8 · high 5)

F1 모드 대량제거대회·팀·파크골프·이벤트·히든홀·챌린지 → UI/진입 차단(enum은 프로토콜 호환 유지). depth 네비 인덱스 붕괴 (클러스터 F)high
F2 미니게임MiniGamesType(GOLF_DARTS/TICTACTOE/JEWELRY) → 다트 개인전만. 종류선택 스킵→다트 직행high
F3 18홀 게이팅T3는 홀수=코스 out/in 개수 파생(명시 토글 없음). QR은 명시 9/18 토글+디폴트 18홀 비활성+구독팝업high
F4 코스 30/60코스목록은 서버 CourseListUpdateRequest 드리븐 — 로컬 CSV 아님. 'QFree/QOption CSV 컬럼'은 소스가 서버라 불가 → 서버 스키마 플래그 vs 클라 화이트리스트 택1high
F5 멀티 게이팅EnterMultipleStroke 진입조건 IsLogined()뿐 → 구독+9홀 게이트 추가 (클러스터 E·멀티)med

축 6 — 관리자 설정 축소 (findings 7 · high 2)

F4 타이틀 전용 진입타이틀 OpenAdminSettingDialog 외 인게임 F1핫키·이벤트경쟁·미니게임·몸풀기에서도 동일 오프너 호출(InputShotLogic_TT:262 등) → 인게임 진입 차단med
F5 WindUse 불일치트레이닝환경 6개 바인딩하나 SaveTrainingEnvironmentOption은 5개만 저장(T3 자체 불일치). 정책 13-1은 5개 명시 → Training_WindUse 유지/제거 확정 필요(Open Q)med
F6 필드 유지 권장삭제값이 위치인자 생성자로 LocalDB 영속 → 필드 삭제 시 시그니처 변경+DB 마이그레이션. UI만 숨기고 필드 유지 권장low

축 7 — 턴 시스템 · 인게임 다인 전제 (findings 7, 대부분 이미 IsMultiple 가드)

F2 턴 인디케이터UserTurnUI 슬롯번호/색/팀배경 → 1인 최소 'Ready' 큐. teamBackgrounds dead (클러스터 D)med
F3 BottomNextUI표시는 가드로 숨김이나 SetWaitFlag 배관 항상 동작 → UI 비활성 경로에서 턴 멈출 잠재 리스크med
F6 팀플 dead pathFoursome/Fourball/Scramble 통째 도달불가 → prune. 공유 프리팹(UserTurnUI) 팀 요소는 물리 제거 시 인덱스 흔들림 → 코드 분기만 정리low
F7 듀얼스크린 스코어DlgScoreCard.IsMultiScoreCard(Count>=2)가 QR 듀얼스크린 2카드 표시에 필요한 값인지 vs 순수 다인값인지 확인 필요 — 오판 시 터치패널 스코어카드 소실 (Open Q)low

UI⚠ UI 붕괴 주의 하이라이트

옵션/요소 제거로 레이아웃·인덱스가 깨지는 곳 모음. 코드만으로 못 고치는 프리팹 항목 주의.

위험위치붕괴 유형 → 안전책
🔴 최상관리자 게임일반 탭 roundOptions[]enum 서수 시프트 — 중간 삭제 시 탭 전체 드롭다운 오매핑 → 슬롯 유지+SetActive(false) 또는 동시 재번호
🔴 최상Dialog_LoginPlayer / LobbyProgressPage 6칸프리팹 6카드 고정그리드 — max만 줄이면 5칸 EMPTY → 콘솔 A/B 단일카드 프리팹 재작성(시안 선행)
🔴 높음스트로크 플레이어설정 몸풀기 스텝퍼스텝퍼 3요소 제거 시 버튼 바 어긋남 → 컨테이너째 제거 + 재정렬
🔴 높음모드선택 depth 네비모드 제거 시 RadioButtonGroup2 인덱스 붕괴 → 제거 아닌 타일 그리드 재설계
🟠 중멀티 대기방 참가자 리스트macId 그룹 → golfer 평면 리스트로 재구성(개별 강퇴 버튼)
🟠 중colorCodeList/UserTurnUI backgrounds[slotIndex]0..6 전제 → 잔존 접근 시 IndexOutOfRange → 슬롯0 고정, 접근부 정리
🟠 중상단바 '연습장 입장' 버튼HorizontalLayout 정렬 무너짐 → 프리팹 제거/재배치
🟠 중client.js 옵션 그리드 3열1개 제거 시 고아 셀 → is-empty 필러(CT2:496) 재조정
🟠 중미니게임 종류 선택 리스트다트 단일화 시 빈 리스트 붕괴 → 선택 단계 스킵→다트 직행
⚪ 죽은버튼카카오 로그인 버튼QR 제품타입 미인식 시 selectable=null → 죽은 버튼 → QR ProductType 매핑
🟡 낮공유 프리팹 팀 오브젝트(UserTurnUI/BottomNextUI)물리 제거 시 인덱스 흔들림 → 코드 분기만 정리, 프리팹 요소 보존

?Open Questions — 착수 전 확인 필요

코드로 확정 못 한 것. 추측으로 채우지 말고 확인 후 진행.

구독 플랜 (클러스터 E)

  • 구독 상태 원천: 매장주 구독(QMS)·유저 구독(App)이 클라에 어떤 필드/패킷으로 오는가? GolfHub membership-api(grade)를 Player에 연결 vs 로그인 응답에 별도 플래그. '매장주 or 플레이어 중 1인↑ 구독=구독'을 클라 어디서 계산·보관?

로그인/슬롯 (클러스터 D)

  • 로그인 상한이 두 곳: SettingValueManager.maxUserCount(=6) vs base BeCONN.LoginManager.maxLoginUser. QR=1 시 어느 쪽이 권위값이며 base 소스 수정 없이 단일화 가능한지.
  • TR/FR/Q 회원 계정이 단일 통합 계정인가? golfTalkId/authKey가 QR(T ID) 로그인에 그대로 매핑되는지.
  • 게스트 오프라인 로컬생성 경로를 QR 전용 서버에서 타는지, 온라인 생성으로 통일할지. 중국 Wechat QR·America 분기가 QR에서 완전 불필요한지(글로벌 계획과 상충 여부).

멀티플레이 (축 3)

  • 강퇴 버튼 UI 발신 지점 미발견 — 마스터가 대상 macId를 넘겨 LeaveOnlineRoom 호출하는 버튼 프리팹/핸들러 위치 확인 필요(자기 퇴장 DlgLoginPlayer:774만 확인).
  • 온라인 방생성 코스 선택 강제 지점(9홀 강제 넣을 courseIDList 세팅 코드) 미확인.
  • MaxPlayerCount(방 정원) 서버 소스가 장비당/방당 어느 단위인지, QR 조정 방법.
  • 방 종료 후 QR 누적 순위/리더보드를 어느 API(소켓 vs GolfHub)가 저장·조회하는지.
  • Q/QR 데이터 격리가 순수 서버 인스턴스 분리로 충분한지(클라에 Q/QR 분기 필요 여부).

자동 퍼팅 이어하기 (클러스터 A)

  • QR 멀티에서 GetGolferCount()가 원격 골퍼를 포함하는가? 포함 시 count 게이트를 통과해 멀티에서 버튼/자동이 부활 → 정책 #3과 충돌. Round.golferCount 정의 확인 필요.
  • Round.putt 완전 삭제 vs 항상 no-op(후자가 회귀 위험 낮음), 0x0400 직렬화 슬롯 제거 vs 상수 유지 — QR 서버 스펙 확정 필요.

몸풀기 · 모드/코스 (클러스터 B·E·F)

  • RoundType.WarmingUp(104) 등 enum 완전 삭제 vs 존치+차단(참조 정리 비용 vs 빌드 안정성 — 존치+차단 권장). ParkGolfWarmingUp은 파크골프 제거 축과 연계.
  • 코스 QFree/QOption: 서버 스키마 플래그 vs 클라 화이트리스트/CSV 결정. 스트로크 9/18과 코스 선택(1코스=9,2코스=18) 정합 방법(18홀 잠금 시 in코스 비활성 등).
  • 샷트레이닝 '클럽 측정': T3 DRType은 LongGame/ShortGame/PuttGame 3종뿐 — clubtest가 DrivingRange 하위 별도인지 AI스윙과 별개 플로우인지 코드 위치 미확정.

관리자 (클러스터 C)

  • 트레이닝환경 Training_WindUse(=22) 유지/제거 확정(정책 13-1은 5개, T3는 6개 노출·5개 저장하는 자체 불일치). 제거 시 enum 시프트 수술 범위.
  • 정책 13-2 '타석' 탭이 T3 어느 탭/항목에 대응하는지(센서 탭 내부 vs 별도) 불명확. '비밀번호' 탭 유지 여부.
  • 인게임 관리자 진입(F1핫키 등)이 QR 제공 모드 조합에서 실제 도달 가능한 경로인지(상당수 컨텍스트가 QR 미제공일 수 있어 제거 우선순위 변동).

턴/듀얼스크린 (축 7)

  • 홀아웃 관전·대기 인트로·종료 랭킹의 NetworkGroup.simulators/D.selfRoom/GetSimulatorSeqRequest가 QR 전용 서버에 정상 바인딩되는지(QR 서버 구현 미확인).
  • DlgScoreCard.IsMultiScoreCard(Count>=2)가 QR 듀얼스크린 2카드 표시용 필요값인지 순수 다인값인지 — 프리팹/CanvasHeader 'Touch' 키 구성 확인.