전투 엔진 아키텍처 · 자산 슬롯 맵
← 이전 🏠 홈

실시간 전투 엔진(games/battle.html)은 데이터전투 알고리즘UI(렌더)3계층 분리되어 있습니다. 데이터·알고리즘은 캔버스를 전혀 참조하지 않으므로, 병종 스킨·총알/미사일·이펙트·액션 이미지를 받아 UI 레이어에만 꽂으면 밸런스 로직을 건드리지 않고 비주얼을 교체할 수 있습니다. 아래는 각 계층의 실제 함수와 🖼 이미지 주입 슬롯 지도입니다. (라인 번호 = battle.html 기준)

ARCH3계층 스택 — 카드를 클릭하면 실제 모듈이 펼쳐집니다
위 계층은 아래 계층에만 의존합니다. 의존 방향이 한쪽(단방향)이라 상위 UI를 통째로 갈아끼워도 하위가 안전합니다.
UI · 렌더
🖼 화면 · 스킨 · 발사체 · 이펙트 · HUD
Canvas 2D 렌더 — 여기만 이미지로 교체 (하위 3종이 자산 슬롯)
▼ 펼치기
render()990 drawBackground1011 drawBase1091 🖼 drawUnit / drawUnitBody1102·1141 🖼 drawProjectile1290 🖼 explosion·muzzleFlash·smoke951·964·937 drawHpBar·drawReticle·drawPopup1267+
규칙 — 캔버스 ctx는 이 계층에서만 등장. 상태(G.units, G.projectiles)를 읽기만 하고 좌표에 그림. 벡터 드로잉을 drawImage(sprite,…)로 바꾸면 끝.
▲ 읽음 (의존)
알고리즘
⚙ 전투 로직 · AI · 데미지
캔버스 미참조 — 순수 계산. 이미지와 완전 무관
▼ 펼치기
synergy() 상성348 update / updateUnit582·625 pickTarget·canHit678·696 fireWeapon703 updateProjectile804 detonate·applyDamage854·885 inHomeTerrain·killUnit913·919
규칙 — 데미지·명중·이동·타깃팅만 담당. fireWeapon은 발사체의 종류(kind)와 payload만 정하고, 어떻게 보이는지는 UI에 위임. 이미지 교체가 이 계층을 절대 건드리지 않음.
▲ 읽음 (의존)
데이터
📦 병종 스펙 · 상성 · 색/레인
순수 상수 객체 — 밸런스의 단일 원천(Single Source of Truth)
▼ 펼치기
UNIT_TYPES (7병종)356 BEATS 상성표347 LANE / SIDE_COL / BRANCH_COL337+ defaultComp · COST_CAP375·372
규칙 — 여기에 sprite 필드 하나만 추가하면(UNIT_TYPES[k].sprite='...') 자산 경로가 데이터로 관리됩니다. 밸런스 수치(atk/hp/range…)와 자산을 한 곳에서 매핑.
FLOW한 프레임의 데이터 흐름
편성 데이터가 유닛으로 스폰되고 → 알고리즘이 상태를 갱신 → UI가 상태를 읽어 그립니다. 색 = 소속 계층.
comp편성 데이터
spawnArmies유닛 생성
update(dt)AI·이동·타깃
fireWeaponkind+payload 결정
projectile비행·명중
detonate→applyDamage상성·데미지
render()🖼 상태를 그림

🖼 자산 슬롯 맵 · 이미지 납품 명세

A병종 스킨 — 6종
현재는 drawUnitBody()(1038)의 if(t.key===…) 분기에서 벡터로 그립니다. 각 병종당 좌향/우향 1장(facing으로 좌우반전 처리 가능) 스프라이트를 받으면 됩니다. 권장 크기는 유닛 반경 r 기준.
B발사체 — 총알 · 포탄 · 미사일 · 어뢰 · 폭탄
fireWeapon()가 무기별로 spawn*()를 호출해 발사체의 kind를 심고, drawProjectile()(1169)의 if(p.kind===…) 분기가 그립니다. 회전은 속도벡터(atan2(vy,vx))로 자동. 작은 스프라이트 또는 스프라이트시트(불꽃 프레임)로 교체.
C이펙트 & 액션
타격감·지휘 연출. 파티클 함수 또는 스프라이트시트(프레임 애니메이션)로 교체. 액션은 플레이어 지휘 버튼이 트리거합니다.
구분현재 함수 (line)트리거권장 자산
💥 폭발 (착탄)explosion() · detonate() 867·770발사체 명중/광역fx/explosion_[0-7].png (시트)
🔥 총구 화염muzzleFlash() 880fireWeapon 발사 순간fx/muzzle.png
💨 연기·먼지smoke() · debris() 853·857포격·격파fx/smoke_[0-5].png
🌊 물보라splash() 862어뢰·해상 착탄fx/splash.png
✨ "효과적!" 상성popEffective() 884상성 우세타fx/effective.png
🏇 돌격 (액션)doCharge() 1273지휘 버튼전 아군 전진 버프 연출
🎯 일제사격 (액션)doVolley() 1281지휘 버튼동시 발사 + 화면 흔들림

🔧 이미지 통합 방법 · 최소 수정 패턴

1자산 레지스트리 + 로더 (신규)
데이터 계층에 스프라이트 경로만 등록하고, 프리로드. 로드 실패 시 기존 벡터로 자동 폴백.

  
2drawUnit / drawProjectile 에 3줄 추가
기존 벡터 코드는 폴백으로 그대로 유지. 스프라이트가 있으면 이미지, 없으면 벡터 — 무손실 점진 교체.

  

✅ 분리도 평가

📦
데이터 A

UNIT_TYPES 순수 객체. 밸런스 단일 원천. sprite 필드 추가 여지 충분.

알고리즘 A

캔버스 ctx 완전 미참조. fireWeapon이 kind만 결정, 렌더는 UI에 위임 — 이미지와 독립.

🖼
UI 렌더 A-

스킨·발사체·이펙트가 각각 독립 함수(kind/key 분기). 자산 주입점이 명확.

개선 여지

drawUnitBody가 한 함수에 7병종 벡터를 몰아둠 → 스프라이트 도입 시 skins[key] 맵으로 분리 권장.

결론 — 이미지 자산을 데이터/알고리즘 수정 없이 UI 레이어에만 적용 가능한 구조. 슬롯: 병종 스킨 6 · 발사체 5 · 이펙트 5+ · 액션 2. 위 최소 수정 패턴으로 벡터→이미지 점진 전환 권장.
MAKEWAR3 · 전투 엔진 아키텍처 문서 · battle.html 계층 분석 기준