1. 투사체 피격 판정이 너무 좋지않음 - **원인 분석**: - `src/game/combat.js`의 `PROJECTILE_HIT_RADIUS`가 8픽셀로 설정되어 있어 투사체의 물리적 크기에 비해 판정 범위가 좁습니다. - 투사체가 생성될 때 공격자와 대상 사이의 거리가 매우 가까우면 투사체가 대상을 지나쳐버리는 현상이 발생할 수 있습니다. - 현재 `projectilePathHitsDefender` 함수에서 투사체의 궤적(Line)과 대상의 히트박스(Rectangle) 충돌을 검사하고 있지만, 대상의 실제 충돌 영역(`defender.body`)의 위치와 크기가 애니메이션 프레임에 따라 미세하게 변하면서 판정이 어긋날 수 있습니다. 2. 내가 이야기한 참가자 닉네임을 입력하고 팀당인원을 입력하면 참가자 닉네임 별 캐릭터가 스폰돼야해 (완료) - **조치 사항**: - `src/game/matchSetup.js`를 수정하여 입력된 각 닉네임을 독립된 팀으로 설정. - 설정된 `teamSize`만큼 각 닉네임의 캐릭터가 소환되도록 로직 변경. 3. 승리판정이 이상함 (완료) - **조치 사항**: - `src/game/ArenaScene.js`의 `finishMatch` 로직을 개선하여 생존 팀이 1개일 때 해당 닉네임 승리 표시. - 생존자가 없을 경우 "무승부!"가 표시되도록 예외 처리 추가. 4. MongoDB 기반 유니크 방문자 체크 API 추가 (완료) - **조치 사항**: - Fastify 서버를 추가하고 `config.json` 기반 서버/MongoDB 설정을 도입. - MongoDB 커넥션 풀을 재사용하는 `server/db.js` 구성. - `POST /api/visitors/check`, `GET /api/visitors/stats`, `GET /api/health` API 추가. - 프론트엔드 로드 시 방문자 체크 API를 호출하고 유니크 방문자 수를 표시. 5. 처치 보상 및 공격력 튜닝 상수화 (완료) - **조치 사항**: - 적 처치 시 현재 체력 기준 30% 회복, 누적 성장 배율에 따른 크기/공격속도/이동속도 증가를 적용. - 기존 `combat.js`에 하드코딩되어 있던 `14~24` 피해량을 `ATTACK_DAMAGE_MIN`, `ATTACK_DAMAGE_MAX` 상수로 분리. - 주요 전투/카메라/UI 상수마다 조정 대상이 무엇인지 주석 추가. 6. 캐릭터 히트박스 기준 이름표 및 선택 관전 기능 (완료) - **조치 사항**: - 캐릭터 이름표를 스프라이트 중심이 아니라 실제 히트박스 하단에 고정. - 캐릭터 클릭 시 선택 상태를 설정하고 카메라를 해당 캐릭터 히트박스 중심에 고정. - 초기 선택 표시는 사각형 대신 원본 alpha 마스크 기반 실루엣으로 생성. - 이후 선택 전용 실루엣은 상시 팀 색상 마커로 전환되어, 생존 캐릭터마다 팀 색상을 계속 보여줌. 7. 패키지 락 파일 제외 (완료) - **조치 사항**: - `package-lock.json`을 git 추적에서 제외하고 `.gitignore`에 추가. 8. Slime 캐릭터 특성 추가 (완료) - **조치 사항**: - `src/game/fighterManifest.js`에 Slime 전용 `stats.maxHp: 1`과 `traits`를 추가. - Slime으로 배정된 기본 스폰 슬롯 1개가 실제 Slime 10마리로 확장되도록 `spawnMultiplier` 처리 추가. - Slime 사망 시 50% 확률로 최대 체력 1인 Slime 2마리를 생성하도록 분열 특성 추가. - 분열체는 `childCanSplit: false`로 다시 분열하지 않도록 제한. - 처치 보상은 최대 체력을 증가시키지 않으므로 Slime이 적을 처치해도 최대 체력 1이 유지됨. 9. 전투 진입 UI, 좌측 HUD badge, 좌측 하단 킬로그 개선 (완료) - **조치 사항**: - 최초 접속 화면에 투명 전투 프리뷰, `ARENA` / `PICKER` 2단 로고, `Start` 버튼을 배치. - `Start` 클릭 시 우측 옵션 drawer가 열리고 홈 drawer 상태에서는 `ARENA` / `PICKER` 로고 위치를 유지한 채 `Start` 버튼을 숨기며, 전투 시작 시 실제 경기 화면으로 전환. - 팀 badge를 상단 좌/우 분할에서 경기장 밖 좌측 HUD 레일로 이동. - badge를 팀명, 팀 색상 구분선, 생존 인원 형식으로 표기. - 좌측 HUD 레일 폭과 경기장 시작 위치를 분리 계산해 badge가 미니맵과 경기장 캔버스를 가리지 않도록 조정. - 전투 시작 후 하단 안내바는 숨기고, 좌측 하단에 처치자/피처치자 이미지와 `manifest.key`를 포함한 목록형 킬로그를 표시. 중앙 텍스트는 `처치`로 유지하고 피처치자 아이콘에는 빨간 X를 겹쳐 구분. 10. 전투 중 옵션 drawer 유지, 접기/펼치기, 재시작, 일시정지 추가 (완료) - **조치 사항**: - 전투 시작 후 우측 drawer를 compact 패널로 유지하고, 전투 화면 중앙 정렬을 유지. - `전투 설정` 헤더 우측 상단에 `옵션 접기/옵션 펼치기` 버튼을 배치. - 접힌 상태에서는 같은 우측 상단 위치에 토글 버튼만 남기고 패널 내용은 숨겨 전투 화면을 가리지 않도록 조정. - `재시작` 버튼으로 현재 입력값 기준 새 전투를 즉시 시작하도록 연결. - `일시정지/계속` 버튼으로 Phaser 물리, 타이머, tween, 스프라이트 애니메이션을 함께 정지/재개하도록 구현. 11. 팀 badge 기반 무작위 시점 고정 (완료) - **조치 사항**: - 좌측 팀 badge를 클릭 가능한 버튼으로 변경. - 클릭한 팀의 생존 캐릭터 중 무작위 1명을 선택해 기존 캐릭터 선택 카메라 고정 로직에 연결. - 선택된 팀 badge에 강조 스타일을 적용하고, 전투 중 하단 안내바가 노출되지 않도록 상태 표시를 정리. 12. 처치 성장 scale 상한 및 arena 내부 보정 (완료) - **조치 사항**: - `KILL_GROWTH_MAX_MULTIPLIER`를 추가해 처치 누적 보상으로 인한 크기/공격속도/이동속도 증가에 상한을 적용. - 처치 성장 tween 중/완료 시 캐릭터 위치를 arena 안쪽으로 보정해 히트박스가 전장 밖으로 나가는 문제를 방지. 13. 종족별 사망 통계 저장 및 상단 안내바 추가 (완료) - **조치 사항**: - `src/game/fighterManifest.js`의 모든 캐릭터에 `human`, `orc`, `skeleton`, `slime`, `wolf`, `bear` 중 하나의 `species` 값을 부여. - 실제 전투에서 사망한 캐릭터를 `skin.species` 기준으로 집계하고, 프리뷰 전투는 통계에서 제외. - `server/deathStats.js`와 `/api/death-stats/today` API를 추가해 별도 매치별 문서 없이 오늘 일자별 집계에 사망 카운트를 누적. - 전투가 5초 이상 지속되면 상단 `#battle-notice`에 오늘 종족별 사망 집계를 2초 표시/10초 대기 주기의 재치 있는 안내 문구로 표시. - 상단 안내바 폭을 전투 화면 안쪽에 어울리도록 줄이고, 방문자 수는 메인 화면 대신 전투 화면 우측 하단 작은 배지로 이동. - `config.json.sample`에 사망 통계 컬렉션명과 집계 타임존 설정 예시를 추가. 14. 사망 캐릭터가 생존 캐릭터를 가리는 문제 개선 (완료) - **조치 사항**: - 사망한 캐릭터 sprite를 반투명 처리하고 생존 캐릭터보다 낮은 depth로 내려 전투원을 가리지 않도록 조정. - 사망 캐릭터의 이름표, 체력바, 팀 색상 마커를 숨겨 전투 화면의 가독성을 유지. 15. 전투 설정 입력값 localStorage 유지 (완료) - **조치 사항**: - 참가자 닉네임 textarea와 팀당 인원 숫자 입력/range 값을 브라우저 `localStorage`에 저장. - 앱 로드 시 저장된 참가자 닉네임과 팀당 인원을 먼저 복원해 새로고침/재접속 후에도 입력값이 유지되도록 구현. - 저장된 입력값이 최초 대기 전투 프리뷰 규모를 키우지 않도록 프리뷰는 10팀 x 팀당 5명 설정으로 분리. 16. 최종교전 카메라 조건 및 슬로우모션 연출 추가 (완료) - **조치 사항**: - 생존 4명 이하에서는 카메라가 생존 캐릭터를 일정 간격으로 무작위 포커싱하도록 변경. - 잔여 팀이 2팀이고 생존 캐릭터 합이 8명 이하이면 생존 수가 적은 팀의 중앙을 포커싱하도록 추가. - `FINAL_COMBAT_SLOW_MOTION_ENABLED`로 최종교전 슬로우모션을 켜고 끌 수 있게 하고 기본값은 `false`로 둠. - 활성화 시 최종교전 상태에서 idle이 아닌 공격 모션이 시작될 때 진입/유지/복귀 완급이 있는 전역 슬로우모션을 적용하고, Arcade Physics 이동에는 역수 timeScale을 적용. 17. 미니맵 뷰포트 박스 검은 깨짐 수정 (완료) - **조치 사항**: - 현재 뷰포트 사각형 좌표를 미니맵 픽셀 격자에 맞춰 이동 중 가장자리 흔들림을 완화. - 검은 외곽 stroke 위에 노란 stroke를 겹치던 뷰포트 박스를 노란 내부 채움 선으로 바꿔 이동 중 일부 선이 검게 보이는 현상을 제거. 18. 치명타 적중 표기 추가 (완료) - **조치 사항**: - 공격 프로필의 치명타 판정을 실제 적중 처리까지 전달해 전투 타입별 적중 연출이 같은 흐름을 사용하도록 정리. - 치명타 적중 시 대상 위에 `Critical!` 문구를 띄우고 즉시 처치가 적용되도록 `applyHit()`를 보강. (카메라 흔들림은 이후 메테오 착탄 연출로 이전) 19. 리스폰 배치 설정 구분 추가 (완료) - **조치 사항**: - 전투 설정 drawer에 `스타팅 지점 배치`와 기존 `완전 랜덤 배치`를 선택하는 리스폰 설정을 추가. - `스타팅 지점 배치`에서는 참가자별 스타팅 영역과 영역 안 스폰 위치를 매치마다 무작위로 정하도록 구현했으며, 이후 30번 작업에서 영역 선택을 랜덤 중심 셀 기반 `5 x 5` 방식으로 구체화. - 선택한 리스폰 배치 모드를 `localStorage`에 저장해 새로고침과 재시작 이후에도 유지. 20. 팀당 인원 직접 입력 동기화 (완료) - **조치 사항**: - 팀당 인원 표시 필드를 `number` 입력으로 바꿔 값을 직접 입력할 수 있도록 변경. - 숫자 입력과 range 슬라이더가 같은 `1~100` 범위를 사용하며 양방향으로 즉시 동기화되도록 연결. 21. 승리 화면 축하 연출 추가 (완료) - **조치 사항**: - 기존 중앙 승리 배너를 금빛 광선과 컨페티가 함께 터지는 `.victory-celebration` 레이어로 확장. - 실제 전투 시작에서 Web Audio 컨텍스트를 준비하고 승리 시 짧은 팡파르를 합성해 재생하도록 추가. - 무승부는 팡파르와 컨페티를 제외한 절제된 결과 배너를 유지하고, 축하 애니메이션은 축소 모션 설정을 따르도록 보강. 22. ArenaScene.js 모듈화 및 src/game 폴더 구조 정리 (완료) - **조치 사항**: - `ArenaScene.js`의 방대한 기능을 7개의 전문 모듈(`arenaKillLog`, `arenaScoreboard`, `battleDeathNotice`, `victoryCelebration`, `arenaMatchRuntime`, `arenaSpectatorCamera`, `arenaFinalCombatEffects`)로 분리. - `src/game` 폴더 내의 파일들을 역할별 하위 폴더(`arena/`, `combat/`, `fighter/`, `match/`)로 분류하여 재배치. - 모든 `import` 경로를 새로운 계층 구조에 맞춰 업데이트하고 빌드 안정성을 확보. - `ArenaScene.js`는 이제 각 모듈을 조율하는 오케스트레이션 역할에 집중하도록 경량화됨. 23. 일일 운영 지표 집계 추가 (완료) - **조치 사항**: - `server/dailyMetrics.js`와 `/api/daily-metrics/today`, `/match-started`, `/match-finished`, `/donation-clicked` API를 추가. - 날짜별 합산 문서에는 `uniqueVisitors`, `totalVisits`, `totalMatchStarts`, `totalMatchFinishes`, `visitorsWithTwoOrMoreMatches`, `donationClicks`만 저장. - 날짜+방문자 UUID 해시 기준의 `daily_visitor_activity` 임시 카운터로 당일 2회 이상 매치 시작 방문자 수를 계산. - 임시 카운터에는 TTL 인덱스를 적용하고, 기본 보관 기간을 `DAILY_ACTIVITY_RETENTION_DAYS` 60일로 설정. - 프리뷰 전투는 제외하고 사용자가 시작한 실제 전투만 매치 시작/종료 지표에 반영. 24. 모바일 전투 화면 구성 및 종료 팝업 대응 (완료) - **조치 사항**: - 모바일에서 실제 전투 시작 시 옵션 drawer를 자동으로 접어 상단 HUD와 전투 화면을 먼저 보여주도록 변경. - 전투 중 옵션을 다시 펼쳐도 패널이 좌우 화면 밖으로 밀리지 않도록 모바일 live drawer 위치와 크기 규칙을 보정. - 모바일 킬 로그를 정사각형 전투 캔버스 바로 아래에 배치해 큰 빈 구간이 생기지 않도록 조정. - 전투 종료 시 옵션 drawer를 접고 `match-ended` 상태를 부여해 승리/무승부 연출이 설정 폼 위에 겹치지 않게 처리. - 승리 연출은 읽을 수 있는 시간 동안 표시한 뒤 자동으로 사라지며, 결과 텍스트가 더 빠르게 선명하게 보이도록 애니메이션을 조정. - 모바일 접힘 상태의 옵션 버튼을 더 작게 표시하고 상단 팀 HUD를 두 줄 4열 레이아웃으로 바꿔 4개 이후 팀도 잘리지 않게 조정. - 모바일 킬로그 최대 높이 계산에 방문자 카운터 안전 여백을 포함해 하단 방문자 카운터와 겹치지 않도록 보정. - 모바일 팀 카드의 선택 표시를 내부 테두리로 바꿔 카드 외곽선이 부모 영역에서 잘려 보이지 않게 수정. - 모바일 전투 중 옵션 drawer를 압축하고 닉네임 입력 높이를 고정해 전투 시작/재시작/일시정지 버튼이 한 화면에 보이도록 조정. - 승리/무승부 연출 레이어를 클릭하면 즉시 닫히도록 처리. 25. About 다이얼로그 및 개인정보처리방침 보관 컬렉션 추가 (완료) - **조치 사항**: - `server/about.js`를 추가해 `about_content` 컬렉션에 `developer-info`, `privacy-policy` 기본 문서를 서버 시작 시 upsert하고 메모리에 캐시. - 개발자정보 기본값을 `alias: horoli`, `email: sunha321@gmail.com`, `github: https://github.com/Horoli`로 설정. - 개인정보처리방침은 DB의 `privacy-policy.markdown` 문자열 필드에 Markdown 원문으로 저장하고, 클라이언트에서는 안전한 DOM 노드로 렌더링. - 대기 화면과 전투 화면에 공통 About 버튼을 추가하고 개발자정보/개인정보처리방침 탭 다이얼로그를 연결. - 수정 API는 만들지 않고, 브라우저 표시용 `GET /api/about` 읽기 전용 API만 추가. 26. 전투 화면 'About' 버튼 위치 최적화 및 정적 자산 캐싱 강화 (완료) - **조치 사항**: - `index.html`에서 `about-button`과 `visitor-count`를 `arena-meta` 컨테이너로 통합하여 `arena-shell` 내부로 배치. - `styles.css`에서 `arena-meta`에 flex 레이아웃을 적용하여 전투 중 방문자 수 표시와 About 버튼이 나란히 배치되도록 수정. - `server/index.js`에서 프로덕션 환경(`--production`) 시 정적 자산에 대해 강력한 캐싱(7일 유지, immutable) 및 명시적 Cache-Control 헤더 주입 로직 추가. - `index.html`에 이모지 데이터 URI를 활용한 파비콘 설정을 추가하여 404 오류 해결. - `src/ui/aboutDialog.js`의 Markdown 렌더러를 고도화하여 Bold, Italic, Code, Blockquote 등 핵심 문법 지원. 27. 개인정보처리방침 DB 연동 로직 개선 및 실시간 조회 적용 (완료) - **조치 사항**: - `server/about.js`의 `ensureAboutDefaults` 로직을 수정하여, DB에 이미 데이터가 있는 경우 기본값으로 덮어씌우지 않고 기존 데이터를 보존하도록 `$setOnInsert` 적용. - 유저가 About 다이얼로그를 열 때마다 DB에서 최신 데이터를 가져오도록 서버 메모리 캐시 로직을 제거. - 기본 개인정보처리방침 마크다운의 공고/시행 일자를 최신화. 28. 전투 역할별 기본 스탯 프로필 분리 (완료) - **조치 사항**: - `src/constants.js`에 `FIGHTER_TYPE_STATS.melee/ranged/magic` 프로필을 추가해 최대 체력, 이동속도, 사거리, 쿨다운, 피해량, 치명타, 공격 발동 지연을 역할별로 조정할 수 있도록 변경. - `src/game/fighter/fighterStats.js`를 추가해 투사체 캐릭터는 원거리, 즉발 주문 캐릭터는 마법, 나머지는 근접 프로필로 판별하고 개별 스킨 오버라이드를 병합. - 캐릭터 생성과 전투 엔진이 해석된 프로필을 사용하도록 연결해 역할별 체력, 이동 및 공격 수치가 실제 전투에 적용되도록 변경. 29. 킬로그 캐릭터 아이콘 가시성 개선 (완료) - **조치 사항**: - `100x100` idle 프레임에 포함된 투명 여백까지 축소되던 킬로그 아이콘 배경 표시 방식을 보정. - 아이콘 박스 크기와 행 레이아웃은 유지하면서 캐릭터 실루엣이 있는 중앙 하단 영역을 확대 표시하도록 배경 크기와 위치를 조정. 30. 팀별 스타팅 영역 앵커 및 전장 표시 추가 (완료) - **조치 사항**: - `스타팅 지점 배치`에서 전장 스폰 가능 그리드 중 팀별 중심 셀을 무작위로 선택하고, 중심 주변 2칸을 포함하는 `5 x 5` 영역을 팀별 스폰 구역으로 사용하도록 변경. - 겹치지 않는 후보가 남아 있는 동안에는 선택된 스타팅 영역끼리 중첩되지 않는 랜덤 중심을 우선 사용해 전투 시작 즉시 팀이 섞이는 상황을 줄임. - 팀별로 무작위 배정된 스타팅 영역 데이터를 실제 스폰 좌표와 공유해 표시 영역 밖에서 시작하지 않도록 구성. - `arenaRenderer.js`에 팀 색상의 매우 옅은 채움 및 외곽선 오버레이를 추가하고, 랜덤 배치에서는 오버레이가 표시되지 않도록 연결. 31. 사망 시점 팀 badge 클릭 입력 유실 수정 (완료) - **조치 사항**: - 사망 발생 때마다 `arenaScoreboard.js`가 팀 badge 버튼 전체를 재생성해 클릭 중인 DOM이 제거되던 문제를 수정. - 팀 구성이 바뀌지 않는 전투 중 갱신에서는 기존 버튼 DOM을 유지하고 생존 인원, 선택 강조, 비활성 상태만 업데이트하도록 변경. - 사망 처리와 팀 badge 클릭이 같은 시점에 겹쳐도 생존 캐릭터 관전 시점 선택이 정상 전달되도록 보강. 32. 주기적 월드 이펙트 메테오 및 냉각지대 추가 (완료) - **조치 사항**: - `public/assets/effects/world_Effect.png`를 7프레임 공용 스프라이트시트로 로드하고, 실제 전투 시작 후 8초마다 무작위 생존자 위치에 메테오 또는 냉각지대를 무작위 발동하도록 `worldEffects.js`를 추가. - 메테오는 낙하 경고 후 대상 위치 기준 `5 x 5` 영역에 환경 피해를 적용하고, 환경 사망이 처치 보상 없이 사망 통계와 승패 판정에 반영되도록 전투 피해 처리를 확장. - 냉각지대는 냉기 착탄 연출과 지속 구역을 표시하며, 구역 안에 있는 캐릭터의 공격속도와 이동속도를 함께 감속하도록 연결. - 발동 간격, 범위, 피해량, 냉각 지속시간과 감속 배율을 `src/constants.js`의 `WORLD_EFFECT_*` 상수로 분리하고, 새 경기/종료/일시정지 생명주기에 맞춰 정리되도록 구성. 33. 월드 메테오 대각선 낙하 및 냉기 전용 시트 적용 (완료) - **조치 사항**: - 대상 위치가 전장 좌측 반면(2, 3사분면)이면 좌상단에서 우하단, 우측 반면(1, 4사분면)이면 우상단에서 좌하단으로 낙하하도록 궤적, 좌우 반전, `45`도 회전을 적용. - `WORLD_EFFECT_VISUAL_SCALE`과 `WORLD_EFFECT_FALL_TRAVEL_TILES`를 추가해 피해 판정 `5 x 5`는 유지하면서 스프라이트를 전역 마법처럼 크게 보이도록 확장. - 화염 메테오는 `public/assets/effects/world_Effect.png`, 냉기 메테오는 새 `public/assets/effects/world_Effect_2.png`를 각각 독립된 7프레임 애니메이션으로 로드하도록 변경. 34. 냉기 메테오 착탄 피해 옵션 추가 (완료) - **조치 사항**: - `WORLD_EFFECT_FROST_DAMAGE`를 추가해 냉기 메테오 피해를 화염 메테오와 독립적으로 조절할 수 있도록 변경. - 냉기 메테오 착탄 시 `5 x 5` 영역 피해를 먼저 처리하고, 전투가 종료되지 않은 경우 기존 냉각지대 감속 효과를 이어서 생성하도록 연결. 35. 스타팅 영역 표시 시간 제한 추가 (완료) - **조치 사항**: - 팀별 스타팅 영역 오버레이가 `스타팅 지점 배치` 매치 시작 후 5초 동안만 표시되고 이후 자동으로 사라지도록 연결. - 숨김 예약을 Phaser 씬 타이머로 관리하여 일시정지 시간은 표시 지속 시간에 포함되지 않고, 새 매치 시작 시 이전 숨김 타이머가 남지 않도록 정리. 36. 최종 2팀 자동 관전 및 메테오 착탄 화면 흔들림 전환 (완료) - **조치 사항**: - 생존 캐릭터가 30명 미만이거나 최종 2팀만 남으면 후반 자동 줌과 교전 중심 포커싱이 시작되도록 관전 조건을 확장. - 치명타의 `Critical!` 표기와 즉시 처치는 유지하면서 카메라 흔들림을 제거. - 화염 메테오 착탄 화면 흔들림을 먼저 적용했으며, 이후 모든 메테오 착탄이 크기 기반 흔들림을 공유하도록 확장. 37. 자동 관전 이전 메테오 임시 포커싱 추가 (완료) - **조치 사항**: - 후반 자동 관전 조건이 성립하기 전 화염 또는 냉기 메테오가 낙하하면 착탄 위치를 확대 추적하고 착탄 연출 종료 후 기존 카메라 위치와 줌을 복원. - 캐릭터 수동 선택과 후반/최종 자동 관전은 메테오 임시 시점보다 우선하도록 카메라 상태를 정리. - `src/constants.js`의 `CAMERA.METEOR_FOCUS_ENABLED` 플래그로 메테오 임시 포커싱을 코드에서 켜고 끌 수 있도록 구성. 38. 냉기 메테오 동결 기절 및 실루엣 효과 추가 (완료) - **조치 사항**: - 냉기 메테오 착탄 피해에 생존한 전투원은 `2초` 동안 이동과 새 공격이 정지되는 `isFrostStunned` 상태가 되도록 연결. - 동결 중 캐릭터 본체와 팀 실루엣 마커를 함께 얼음색으로 틴트하고, 시간이 끝나거나 매치가 정리되면 본체 원본 색상과 팀 색상으로 복원. - `WORLD_EFFECT.FROST_STUN_DURATION`과 `WORLD_EFFECT.FROST_STUN_TINT`를 추가해 동결 지속시간과 표시 색상을 조절 가능하게 구성. 39. 모바일 세로모드 팀 카드 가로폭 불균형 수정 (완료) - **조치 사항**: - 모바일 미디어 쿼리에서 `.score-side`가 데스크톱의 `grid-template-columns: repeat(2, 114px)`를 상속받아 1~4번 팀 카드만 길게 표시되던 현상을 수정. - `grid-template-columns: none`을 추가하여 모든 팀 카드가 `grid-auto-columns`에 설정된 일정한 가로폭을 가지도록 보정. 40. CSS 파일 기능별 모듈화 (완료) - **조치 사항**: - 거대했던 `src/styles.css`(약 2,000라인)를 기능별로 6개의 파일(`base`, `intro`, `game-ui`, `overlay`, `animations`, `mobile`)로 분리. - `src/styles/` 폴더를 생성하여 모듈화된 CSS 파일들을 관리. - `src/styles.css`는 이제 `@import`를 통해 각 모듈을 통합하는 엔트리 포인트 역할만 수행. - 코드 가독성과 유지보수 편의성을 대폭 향상. 41. 스타일 관련 컨텍스트 문서 추가 및 라우팅 업데이트 (완료) - **조치 사항**: - 새로운 CSS 모듈 구조와 디자인 원칙을 설명하는 `context/style.md` 문서를 신규 생성. - `agent.md`의 상세 기술 가이드(Context Routing) 섹션에 스타일 및 디자인 항목을 추가하여 문서 접근성 개선. 42. 상단 공지(Battle Notice) 콘텐츠 확장 (완료) - **조치 사항**: - 사망 통계만 보여주던 공지 UI에 게임 시스템 가이드(화염/냉기 메테오 특성, 밀리 치명타 확률 등) 팁을 추가. - 사망 통계 공지 2회당 1회의 비율로 시스템 팁이 교차 출력되도록 로직 개선. 43. 구매 배수 기반 월드 이펙트 독주 표적 가중치 추가 (완료) - **조치 사항**: - `닉네임*N`으로 구매한 추가 병력은 수량과 전투 수치를 낮추지 않고 그대로 유지. - 생존 팀별 구매 배수 지분과 현재 생존 지분을 비교해, 구매 지분을 초과해 살아남은 팀에만 월드 이펙트 표적 가중치를 추가. - `WORLD_EFFECT.DOMINANCE_TARGETING_MULTIPLIER`를 추가하고 기본값을 `1`로 설정하여 초과 생존 지분 기반 압력을 활성화하며, `0`으로 설정하면 기존 생존 유닛 비례 표적 선택으로 복귀하도록 구성. 44. Team marker duplicated sprite removal and team shadow baking (completed) - **Changes**: - Removed the duplicated per-fighter `teamMarker` Phaser sprite and its frame/position/depth synchronization path. - Added lazy team-colored spritesheet and animation generation in `fighterAssets.js` by recoloring floor shadow pixels (`#534545`) to the fighter team color. - Updated fighter creation and combat animation playback to use team-shadow animation keys for idle, walk, attack, hurt, and death actions. - Kept frost stun as a body `setTint(WORLD_EFFECT.FROST_STUN_TINT)` effect, with no team-marker tint state to restore. - Verified production build with `npm run build`. 45. Dead fighter battlefield despawn (completed) - **Changes**: - Added `FIGHTER.DEAD_DESPAWN_DELAY_MS` in `src/constants.js` so corpse lifetime is easy to tune. - Updated `combat.js` to keep a dead fighter at initial opacity, fade it toward `FIGHTER.DEAD_DESPAWN_ALPHA`, then remove it from `scene.fighters` and destroy the sprite after the configured delay. - Kept death bookkeeping, kill rewards, split-on-death, and winner checks ahead of the despawn schedule. 46. Variable meteor impact and visual scale (completed) - **Changes**: - Added `WORLD_EFFECT.SIZE_SCALE_VARIANCE` so each fire/frost meteor drop can pick a different size multiplier. - Updated `worldEffects.js` to apply the same per-drop multiplier to both the damage/frost zone bounds and the falling/impact sprite scale. - Added `WORLD_EFFECT.METEOR_SHAKE_DURATION_MS` and `WORLD_EFFECT.METEOR_SHAKE_INTENSITY`, then scaled fire/frost meteor camera shake from the meteor size multiplier. 47. Large-battle combat effect focus gating (completed) - Suppressed critical labels, instant-spell sprites, kill-heal sprites, and kill-growth tweens during large battles outside meteor camera focus. - Kept combat outcomes, reward values, meteor/frost visuals, and projectile hit-detection objects unchanged. 48. Direct fighter count input and generated population cap (completed) - Replaced the team-size control with `nickname*N` direct assigned-fighter input semantics and preserved the preview size with internal suffixed entries. - Added `SPAWN.MAX_FIGHTER_COUNT = 8000` validation for participant-assigned fighter slots before match replacement; Slime trait-generated spawns and splits remain outside that input cap. - Distributed starting-zone teams through `SPAWN.FIGHTERS_PER_STARTING_ZONE = 100`, assigning any remainder to the final zone. 49. Inline fighter-count limit warning (completed) - Displayed assigned-count cap violations beneath the participant nickname textarea. - Cleared the warning when participant input changes or a valid live match is submitted. 50. Dense-area multi-meteor barrage targeting (completed) - Replaced random living-fighter world-effect targeting with a summed-area tile scan that selects the most populated `WORLD_EFFECT.AREA_TILES` warning region. - Changed each fire/frost activation into a configurable number of smaller strikes inside the warning region, with damage, stun, and lingering frost applied only per impact zone. - Added `WORLD_EFFECT.IMPACT_*` tuning values and retired purchase-share dominance weighting in favor of direct crowd-density pressure. 51. Initial and repeating barrage interval split (completed) - Kept `WORLD_EFFECT.INTERVAL` as the delay from match start to the first barrage and added `WORLD_EFFECT.REPEAT_INTERVAL` for subsequent normal barrages. - Preserved `WORLD_EFFECT.SUDDEN_DEATH.INTERVAL_MS` as the repeat delay once sudden death becomes active. 52. Configurable barrage warning duration (completed) - Added `WORLD_EFFECT.WARNING_DURATION_MS` to control the visible lifetime of the large dense-area warning marker. - Kept scheduled small impacts and meteor camera focus running after the warning marker hides.