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) 전장에 맞게 수치를 바로 고친다. 새로 더하는 것:
    1. 무기에 대상 구분 vs: 'air' | 'ground' | 'both'와 관통 등급 penetration.
    2. 대칭을 채우는 신규 유닛(아래 표의 "신규").
    3. 플레이어가 조종할 때의 수치(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_attack 250 → 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_ir 2(헬기 장갑 2에 ×1 → 표의 "250 × 1"), 공격 헬기 공대공 2, 레이더 SAM 2, 전투기 공대공 jet_aam 3(신규). 스팅어 관통 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_aam 0.5~5km, 폭탄 g_bomb 3km·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 추정 — 캠페인 문자열 제거로 줄어든 만큼 다시 측정).