04 진영 병과 탈것 - kyhsa93/karda GitHub Wiki
04. 진영·병과·탈것
4.1 원칙
- 진영은 둘: 연합 신속대응군과 베로스 인민군(VPA). 플레이어는 전장 설정에서 한쪽을 고른다(D8). 민간 진영(
civilian)은 전장에 나오지 않는다(D9). - 수치 대칭, 외형 비대칭: 두 진영의 같은 분류(예: 연합 전차 ↔ VPA 전차)는 HP·장갑·무장·속도가 모두 같다. 다른 것은 이름·외형(모델·색)·소리·조종석 모양뿐이다.
- 근거: 1인 게임에서 한쪽 진영만 약하면 그 진영을 고른 판이 망가진다. 밸런스를 한 벌로 맞추면 하니스 결과가 양 진영에 그대로 적용된다(작업 수 절감). 비대칭의 재미는 맵(본진 위치·거점 효과)이 만든다.
- 예외는 두지 않는다. 플레이어가 속한 진영의 봇 편제만 조금 줄인다(플레이어 가치 보정 — 봇 AI 5.1).
- 기존 유닛 ID는 그대로 쓴다(
src/content/units.json의inf,c_inf,tank,c_tank…). 캠페인이 없어졌으므로(D13) 전장에 맞게 수치를 바로 고친다. 새로 더하는 것:- 무기에 대상 구분
vs: 'air' | 'ground' | 'both'와 관통 등급penetration. - 대칭을 채우는 신규 유닛(아래 표의 "신규").
- 플레이어가 조종할 때의 수치(
player블록: 속도·포탑 회전·재장전 등)는 탈것 페이지의 표를 원본으로src/content/battle/vehicles.json에 둔다.
- 무기에 대상 구분
- 피해 계산은 기존
src/sim/weapons/damage.ts의 관통 vs 장갑 배율(낮으면 ×0.1, 같으면 ×1, 높으면 ×1.2)을 그대로 쓴다. - 봇의 사격은 확률 판정 + 연출 예광탄(기존 적 AI 방식). 명중률 =
accuracy × (1 − (거리/사거리)²) × skill. 분대 발사율은 살아 있는 인원 비율을 곱한다. 플레이어의 사격과 플레이어를 향한 사격만 실제 발사체·유도 엔티티다(발사체 ≤ 300·미사일 ≤ 24 예산을 봇 전투가 잡아먹지 않게). - 분대 = sim 유닛 1개: 보병 분대는 유닛 하나이고, 분대원은 그 유닛 안의 슬롯(위치 오프셋)과 체력 목록이다(봇 AI 5.1, 기술 설계 9.3). 분대 HP 40 = 분대원 5명 × 8.
4.2 유닛 목록 (진영 대칭)
"조종" 열: P = 플레이어 조종 가능(탈것 슬롯 또는 보병 병과), B = 봇만. 봇 무장 수치는 봇 대 봇 통계 사격용이다. 플레이어가 조종할 때의 수치는 각 탈것 페이지.
보병 (분대)
| 분류 | 연합 ID / 이름 | VPA ID / 이름 | 상태 | 인원 · HP / 장갑 | 봇 대지 무장 (사거리 · 피해 · 관통 · 발사율 · 명중) | 봇 대공 무장 | 조종 | 대응 병과 |
|---|---|---|---|---|---|---|---|---|
| 소총 분대 | c_inf 소총 분대 |
inf 보병 분대 |
기존(인원 5로 통일) | 5 · 40 / 0 | 소총 400m · 1.5 · 0 · 2/s · 0.15 | 기존 소총(대 헬기) | B (플레이어는 돌격병) | 돌격 |
| 대전차 분대 | c_inf_at |
inf_at |
신규 둘 | 5 · 40 / 0 | 대전차 무기 1,500m · 250 · 5 · 1/12s · 0.45 + 소총 | — | B | 공병 |
| 기관총 분대 | c_inf_mg |
inf_mg |
연합 신규 | 5 · 40 / 0 | 경기관총 700m · 2 · 1 · 5/s · 0.12 | 기존 | B | 지원 |
| 대공조 | c_manpads |
manpads |
연합 신규 | 3 · 24 / 0 | 소총 400m | 적외선 대공 500~4,500m, 피해 250 (플레이어 기체엔 실제 미사일) | B | 지원(휴대용 대공) |
| 저격조 | c_sniper |
sniper |
신규 둘 | 2 · 16 / 0 | 저격소총 800m · 3 · 0 · 1/4s · 0.35 | — | B | 정찰 |
지상 탈것
| 분류 | 연합 ID / 이름 | VPA ID / 이름 | 상태 | HP / 장갑 | 봇 대지 무장 | 봇 대공 무장 | 탑승 | 조종 |
|---|---|---|---|---|---|---|---|---|
| 전차 | c_tank 전차 |
tank 전차 |
기존 | 300 / 4 | 주포 2,500m · 180 · 5 · 1/7s · 0.45 / 기관총 800m · 2 · 1 · 5/s · 0.15 | 기존 대공 기관총 | — | P |
| 장갑차 | c_apc 장갑차 |
apc 보병전투차 |
기존 | 150 / 3 | 30mm 2,000m · 8 · 3 · 3/s · 0.2 / 대전차 미사일 2,000m · 250 · 5 · 1/20s · 0.5 | 기존 30mm | 분대 1 | P |
| 경차량 | c_technical 기관총 차량 |
technical 기관총 차량 |
연합 신규 | 60 / 1 | 중기관총 1,000m · 3 · 1 · 6/s · 0.12 | 기존 | — | P |
| 수송 트럭 | c_truck |
truck |
기존 | 60 / 1 | — | — | 분대 1 | P |
| 방공 차량 | c_spaag 방공 차량 |
spaag 자주대공포 |
연합 신규 | 180 / 2 | 대공포 대지 2,000m · 5 · 2 · 8/s · 0.1 | 대공포 2,500m (레이더) | — | P |
항공
| 분류 | 연합 ID / 이름 | VPA ID / 이름 | 상태 | HP / 장갑 | 봇 무장 | 탑승 | 조종 |
|---|---|---|---|---|---|---|---|
| 공격 헬기 | c_apache 아파치 |
heli_attack 공격 헬기 |
기존 | 300 / 2 | 로켓·기관포·대전차 미사일(통계) vs: 'both', 공대공(통계) |
— | P (플레이어 아파치는 기존 HeliState 경로, 헬기) |
| 수송 헬기 | c_heli_transport |
heli_transport |
신규 둘(연합 외형 = 기존 c_heli_rescue) |
150 / 1 | — | 분대 2 | P |
| 전투기 | c_jet 다목적 전투기 |
jet 다목적 전투기 |
신규 둘 | 200 / 1 | 기관포·폭탄(통계), 공대공(통계) | — | P |
- 공격 헬기 HP를 300으로 맞춘다(기존
heli_attack250 → 300, 대칭).
구현 메모 (B1-3)
- 기존 무기(플레이어 헬기를 쏘던 것)는 모두
vs: 'air'로 두고 이름을 유지했다. 표의 봇 대지 무장은g_접두 새 무기(g_rifle·g_at·g_lmg·g_sniper·g_main·g_coax·g_ac30·g_atgm·g_hmg·g_aaa·g_bomb)로 추가했다. 적 AI(대 플레이어)는vs가ground가 아닌 무기만 쓴다. - 무기 종류에
shell(주포·대전차 로켓·폭탄)과atgm을 더했다. 탑승 칸은carry(분대 수: 장갑차·트럭 1, 수송 헬기 2). - 유닛 미사일의 관통은 실제 미사일(
weapons.json)과 같게 맞췄다: 대공조sa_ir2(헬기 장갑 2에 ×1 → 표의 "250 × 1"), 공격 헬기 공대공 2, 레이더 SAM 2, 전투기 공대공jet_aam3(신규). 스팅어 관통 2 → 3: 헬기 HP가 300으로 오르면서 260 × 1 로는 한 발에 안 떨어지므로, 공대공 미사일 한 발 = 헬기 격추(260 × 1.2 = 312)를 유지했다. - 본진 SAM(
sam_short·c_sam_short)은 사거리 0.5~3km, 레이더 탐색 8km·추적 4km. 연합 쪽 점수도 VPA와 같게 맞췄다(플레이어가 VPA를 고를 수 있으므로). - 봇 전투기 무장(표에 수치 없음, 추정): 기관포 1km·피해 10·관통 2·10/s·명중 0.2(공대공),
jet_aam0.5~5km, 폭탄g_bomb3km·350·관통 4·120초에 1회.
고정·구조물
| 분류 | 연합 | VPA | 상태 | HP / 장갑 | 무장 | 비고 |
|---|---|---|---|---|---|---|
| 본진 고정 대공(포) | c_aaa |
aaa_light |
연합 신규 | 100 / 1 | 대공포 2,000m | 진영당 2 |
| 본진 단거리 SAM | c_sam_short |
sam_short |
연합 신규 | 150 / 2 | 레이더 SAM, 전장 사거리 3km로 제한(기존 10km는 맵 폭을 덮음 — 전장 맵 6.2) | 진영당 1 |
| FARP | farp |
v_farp |
VPA 신규(외형 = 기존 FARP 색 변형) | 파괴 불가 | — | 본진·거점 재보급 |
| 깃발 기둥 | 거점 객체 | 거점 객체 | 신규 | 유닛 아님 | — | 게임 모드 3.3 |
- 쓰지 않는 기존 유닛:
civ_*(D9),fuel_truck·ammo_depot·searchlight·bunker·hq·sam_radar(돌파 맵의 수비 구조물로만 선택 사용),c_heli_rescue(수송 헬기 외형으로만).
4.3 대표 교전 계산 (봇 대 봇, 보통 난이도)
수치가 맞물리는지 확인하는 기대값이다. 모두 (추정), B1 하니스로 확인한다.
| 교전 | 계산 | 기대 시간 | 의도 |
|---|---|---|---|
| 전차 vs 전차, 1.5km | 명중 0.45 × (1 − 0.6²) = 0.29/발, 피해 180 × 1.2 = 216 → 2발 → 2 ÷ 0.29 × 7s | 약 48초 | 기갑 교전은 1분 안팎. 플레이어 전차(재장전 5초, 측·후면 ×1.5)나 헬파이어 1발(400 × 1.2)이면 확연히 빨라진다 |
| 대전차 분대 vs 전차, 1km | 0.45 × (1 − 0.44) = 0.25, 250 × 1.2 = 300 → 1발 → 1 ÷ 0.25 × 12s | 약 48초 | 보병이 전차의 천적 |
| 장갑차 30mm vs 소총 분대, 1km | 0.2 × 0.75 × 3/s × 8 × 1.2 = 4.3 HP/s | 약 9초 | 장갑차는 보병 킬러 |
| 소총 분대 vs 소총 분대, 300m | 0.15 × (1 − 0.56) × 2/s × 1.5 = 0.2 HP/s | 약 3분 | 보병끼리는 교착 → 탈것·플레이어가 푼다 |
| 대공조 vs 공격 헬기, 3km | 발사 간격 20s, 명중 0.5(유도 무기는 거리 감쇠 없음), 피해 250 × 1 → 2발 → 2 ÷ 0.5 × 20s | 약 80초 | 헬기가 적 거점 위에 오래 못 머문다 |
| 방공 차량 vs 공격 헬기, 2km | 0.1 × (1 − 0.64) × 8/s × 5 × 1.2 = 1.7 HP/s | 약 3분 | 방공 차량은 억지력, 즉사 수단이 아님 |
측정 (B1-5, 20시드 평균, sim/battle/combat.test.ts): 전차 대 전차 52.8초 · 대전차 분대 대 전차 40.0초 · 장갑차 대 소총 분대 11.2초 · 소총 분대끼리 188.4초 · 대공조 대 공격 헬기 90.6초 · 방공 차량 대 공격 헬기 167.5초 — 모두 기대 시간 ±40% 안.
봇 사격 규칙 (B1-5)
- 표적을 잡으면 반응 시간 뒤 한 발 간격이 지나야 첫 발(위 계산의 "발 수 × 간격"과 같은 기준).
- 분대 발사율 × 살아 있는 인원 비율. 분대에 대한 한 발의 피해는 총탄 1명분(HP/인원), 폭발 무기 2명분까지 — 분대가 유닛 하나라서 주포 한 발에 분대 전체가 사라지지 않게.
- 대전차 미사일(
atgm)은 보병·공중 표적에 쓰지 않는다. 유도 미사일은 거리 감쇠 없이accuracy. - 대 플레이어용으로 조정된 무기는 봇끼리 쓸 때의 값을
vsUnits로 따로 둔다: 방공 차량zu23x4(피해 5·8/s·명중 0.1·관통 3 — 표의 1.7 HP/s), 대공조sa_ir(20초 간격·명중 0.5). - 봇 사격
fire이벤트는 사수가 플레이어 2km 안일 때만. LOS 쌍 캐시는 10초마다 2초 넘은 항목 삭제.
플레이어가 개입하는 교전(플레이어 보병 대 봇 분대 등)의 수치는 보병 12.5, 탈것 페이지의 "교전 기준" 표.
4.4 봇 탈것 운용 요약
| 탈것 | 운전 | 탑승·하차 | 파괴 시 탑승 보병 |
|---|---|---|---|
| 수송 트럭·장갑차 | 도로 그래프 A*(기존 movement.ts), 궤도는 거점 400m 안에서 야지로 |
거점 300~400m 앞 엄폐 지점에서 정지 → 분대 하차(5초) | 분대원 절반(올림) 사망, 나머지 하차 |
| 수송 헬기 | 지형 위 60m 경로 비행, 착륙 지점은 거점 400m 밖 평지 | 착륙 20초 동안 하차 → 본진 귀환 | 탑승 분대 전멸 |
| 전차·방공 차량·경차량 | 도로 → 거점 근처 야지 | 없음 | — |
| 공격 헬기 | 기존 선회 공격(air.ts)을 표적 일반화 |
없음 | — |
| 전투기 | 경주로 패턴 → 공격 진입 → 이탈 (전투기 15.8) | 없음 | — |
- 탑승 중인 보병은 보이지 않는 상태(
carriedBy)로 두고 인지·교전·이동을 돌리지 않는다. - 플레이어 탈것에 봇이 타는 규칙은 봇 AI 5.4.
4.5 모델과 외형
외부 에셋은 채택 규칙(docs/design 10장 10.8) 그대로. 새 분류(애니메이션 보병·전투기·수송 헬기 모델·새 소리)는 외부 에셋에서 후보를 조사하고 소유자 결정 전까지 코드 모델 폴백으로 만든다.
| 대상 | 연합 외형 | VPA 외형 | 비고 |
|---|---|---|---|
| 보병 인형 | 코드 저폴리 인형(강체 부위 7개), 올리브색 + 사각 어깨 표식 | 같은 인형, 회갈색 + 삼각 어깨 표식 + 둥근 모자 | 보병 12.7. 채택 soldier.glb는 전장에서 쓰지 않는다(애니메이션 없음, 1,077폴리곤으로 인형(약 150)보다 무겁다) |
| 전차 | 채택 전차(KolosStudios) 연합 색 | 같은 모델 VPA 색 + 포탑 위 코드 부품(적외선 탐조등 상자) | 형상 차이로 TADS·조준경 식별 가능 |
| 장갑차 | 채택 장갑차(Quaternius) | 같은 모델 VPA 색 + 코드 부품(측면 장갑판) | |
| 경차량 | 채택 픽업(Quaternius) | 같음, 색 | |
| 수송 트럭 | 채택 트럭(KolosStudios) | 같음, 색 | |
| 방공 차량 | airDefenseModels.ts spaag 연합 색 |
기존 | |
| 공격 헬기 | 자기 기체 아파치 코드 모델(heliModel.ts) |
fallbackModel의 air |
|
| 수송 헬기 | 기존 c_heli_rescue 외형 |
air에서 로켓 포드를 뺀 긴 동체 코드 모델 |
|
| 전투기 | 코드 모델(단발·단일 수직꼬리 델타에 가까운 형상) | 코드 모델(쌍발·쌍수직꼬리) | 전투기 15.10 |
- 게임 안 이름은 가상 명칭을 쓰고 실존 표식·국기는 넣지 않는다(기존 원칙).
- 새 문자열(병과·탈것·무기·무전·HUD)은
strings.ko.json. 한글 서브셋 글꼴 예산 160KB는fonts.test.ts가 지킨다(새 글자 약 250자, +12KB 추정 — 캠페인 문자열 제거로 줄어든 만큼 다시 측정).