스폰 위치 선택 시각화
2026-08 워크스페이스(inf_nav_team_nearest 1) 대응: 확장이 멀티소스 역방향 다익스트라를 한 번 실행해 각 Nav 영역에 「가장 가까운 가용 생존자까지의 경로 거리 + 귀속 owner」를 기록합니다. 플러그인은 10개의 고정 거리 레이어를 가까운 곳부터 먼 곳으로 탐색하고, 레이어 안에서는 Flow 앞쪽부터 소비합니다. 회색 벽은 통행 불가 영역으로 "경로 거리 ≠ 직선 거리"를 직관적으로 볼 수 있습니다. 생존자는 직접 드래그할 수 있으며, 드래그 후 현재 상태로 거리장을 재계산합니다.
2D 모드: 왼쪽 드래그로 생존자를 직접 잡아 이동하고, 빈 공간을 드래그하면 화면이 이동합니다. 휠은 커서를 중심으로 확대/축소, 더블 클릭은 화면 초기화입니다. "벽 그리기 / 벽 지우기"를 선택한 뒤 누른 채 드래그해 그립니다(내장 그리드 전용).
3D 모드: 왼쪽 드래그로 회전(스무딩 적용), 오른쪽 드래그 또는 Shift+왼쪽 드래그로 이동, 휠은 커서 방향으로 확대/축소, 더블 클릭은 시점 초기화입니다. 생존자 배치는 2D에서 하세요(호버 하이라이트는 유지됩니다).
그래프 모드 2D: 생존자를 드래그하면 가장 가까운 Nav 구역 중심에 스냅되고, 빈 공간 드래그로 화면을 이동합니다. "구역 봉쇄"는 클릭/드래그로 동적 차단(엘리베이터/문/nav_block 시뮬레이션)을 토글하며, 봉쇄된 구역은 거리장과 후보에서 제외됩니다.
그래프 모드 가시성: 지오메트리 데이터 로드 후에는 BSP 삼각형에 대한 실제 레이캐스트로 판정합니다(world+disp의 모든 삼각형이 차폐에 참여, 바닥/천장 포함. 투명 벽은 시야를 가리지 않음. 직선 거리 ≤1800인 쌍만 검사). 지오메트리가 없으면 "직선 ≤1500, |Δz| ≤120, 우회비 ≤1.6" 휴리스틱으로 폴백합니다. 내보낸 데이터에는 지상 연결만 포함됩니다(사다리 엣지 없음). 실제 맵 데이터는 서버에서 sm_navgraph_export 명령으로 내보낸 뒤 "맵 JSON 가져오기"로 로드합니다.
서드파티 맵은 서버가 필요 없습니다. .vpk / .zip / 단독 .bsp+.nav 를 화면에 끌어다 놓거나 「로컬 맵 해석」을 누르세요. 해석은 브라우저에서만 이루어지며 업로드하지 않습니다. .7z/.rar 는 지원하지 않으니 먼저 vpk 로 푸세요. 결과는 맵 파일 프리셋으로, Anne stripper blocker 와 director 라운드 아이템이 없고 flow 는 자체 계산 근사입니다. 공식 맵이나 런타임 값이 필요하면 기존처럼 드롭다운 / 「맵 JSON 가져오기」로 sm_navgraph_export 결과를 쓰세요.
생존자 상태(클릭으로 전환, 드래그로 이동)
이번 탐색 상태
장면 저장(브라우저 로컬)
탐색 로그([FIND]/[SpawnPerf] 기준에 대응)
일반 스폰 시도 1회의 전체 흐름(team-nearest 분기)
이 페이지와 실제 구현의 대응 관계 / 단순화 설명
| 실제 구현 | 이 페이지 데모 |
|---|---|
| AnneSpawn_NavCandidatesPrepareTeam / CollectTeam(멀티소스 다익스트라, owner=최단 경로를 만든 생존자, 동일 거리는 낮은 번호) | 8방향 그리드 다익스트라로 셀마다 dist+owner 기록, 동일 거리는 낮은 번호. 1칸 = 50u |
| TEAM_NAV_LAYER_EDGES 10 레이어 ∩ 병과 [classMin, min(finalMax, inf_SpawnDistanceMax×2)], 반개구간·마지막 레이어는 폐구간 | 완전 일치(선택한 병과로 잘라내고 빈 레이어는 건너뜀) |
| 레이어 내 flowOrder: Flow 내림차순(전방 우선), team 모드는 삼분위 교차·셔플을 하지 않음 | 일치(Flow=가로 진행도) |
| 임의 생존자로부터 직선 <max(250, inf_SpawnDistanceMin) 제외, 가시성 trace, 끼임, 경로 재검증 | 제외권 + 그리드 시선(Bresenham 벽 판정), 끼임/경로 재검증은 생략 |
| inf_score_behind_reject_gap 8 / _hjc 4, owner 진행도 ≥90이면 감점만 하고 하드 거부하지 않음 | 일치 |
| SpawnScore_BuildCandidate 다요소 점수 + 후보 예산 12개 중 최적 선택 | 전방 보너스 − 후방 기울기 − 거리 편차 − 커널 밀도. 하드 분산 100u는 하드 거부. 예산 12개 중 최적 선택 |
| SI_Target_limit: limit=(상한/기동 가능 인원)+1, 선두는 ×2(스폰 용량 기준만) | 일치. 1마리 스폰마다 owner 카운트 +1, 상한 도달 시 참여 집합에서 빠지고 거리장을 재계산 |
| 레이어 소진 → Director Range(DIRECTOR_FALLBACK_MAX_TEAM_DISTANCE=2000 직선) 폴백 | 안내용 표시(무작위 실행 가능 원거리 지점) |
| 커널 밀도(붙은 특감 제외, 핵 반지름은 상한에 따라 축소) / 하드 분산(고정 100u) / Nav 쿨다운 / 텔레포트 감독 | 쿨다운, 하드 분산 100u, 커널 밀도(반지름은 상한에 따라 축소)를 구현. 텔레포트 감독은 생략 |
| 실제 맵 Nav 그래프(sm_navgraph_export로 내보내기: 구역 중심/모서리/flow/속성 비트/방향 간선) | 그래프 모드: 동일한 상태 머신이 가져온 인접 리스트 위에서 실행됩니다. 지오메트리 데이터 로드 후 가시성은 실제 삼각형 레이캐스트(엔진 trace와는 약간의 차이 있음: 동적 prop 없음, 유리 재질 의미론 없음), 지오메트리가 없으면 휴리스틱(직선 ≤1500, |Δz| ≤120, 우회비 ≤1.6)으로 폴백. 사다리 엣지 없음, IsValidFlags의 종반 분기는 재현하지 않음 |
| blocked 스냅숏은 확장이 매 프레임 엔진에서 실시간으로 읽어옵니다(엘리베이터/문/nav_block 등 동적 차단) | 그래프 모드는 "구역 봉쇄"로 수동 표시하며, Dijkstra와 후보 수집은 봉쇄 노드를 그대로 건너뜁니다 |
| 아이템/차단 엔티티 레이어는 맵 로드 후의 런타임 스냅숏입니다(stripper의 추가·삭제·수정을 자연히 포함). 라운드 시작 시 Director가 아이템 밀도에 따라 일부 사전 배치점을 정리할 수 있습니다 | 시각화 도구는 스냅숏 그대로 아이템 아이콘과 차단 박스를 렌더링하며, Director의 정리는 시뮬레이션하지 않습니다(v2 내보내기 데이터 전용) |