arena/todo.md

28 KiB

  1. 투사체 피격 판정이 너무 좋지않음
  • 원인 분석:
    • src/game/combat.jsPROJECTILE_HIT_RADIUS가 8픽셀로 설정되어 있어 투사체의 물리적 크기에 비해 판정 범위가 좁습니다.
    • 투사체가 생성될 때 공격자와 대상 사이의 거리가 매우 가까우면 투사체가 대상을 지나쳐버리는 현상이 발생할 수 있습니다.
    • 현재 projectilePathHitsDefender 함수에서 투사체의 궤적(Line)과 대상의 히트박스(Rectangle) 충돌을 검사하고 있지만, 대상의 실제 충돌 영역(defender.body)의 위치와 크기가 애니메이션 프레임에 따라 미세하게 변하면서 판정이 어긋날 수 있습니다.
  1. 내가 이야기한 참가자 닉네임을 입력하고 팀당인원을 입력하면 참가자 닉네임 별 캐릭터가 스폰돼야해 (완료)
  • 조치 사항:
    • src/game/matchSetup.js를 수정하여 입력된 각 닉네임을 독립된 팀으로 설정.
    • 설정된 teamSize만큼 각 닉네임의 캐릭터가 소환되도록 로직 변경.
  1. 승리판정이 이상함 (완료)
  • 조치 사항:
    • src/game/ArenaScene.jsfinishMatch 로직을 개선하여 생존 팀이 1개일 때 해당 닉네임 승리 표시.
    • 생존자가 없을 경우 "무승부!"가 표시되도록 예외 처리 추가.
  1. MongoDB 기반 유니크 방문자 체크 API 추가 (완료)
  • 조치 사항:
    • Fastify 서버를 추가하고 config.json 기반 서버/MongoDB 설정을 도입.
    • MongoDB 커넥션 풀을 재사용하는 server/db.js 구성.
    • POST /api/visitors/check, GET /api/visitors/stats, GET /api/health API 추가.
    • 프론트엔드 로드 시 방문자 체크 API를 호출하고 유니크 방문자 수를 표시.
  1. 처치 보상 및 공격력 튜닝 상수화 (완료)
  • 조치 사항:
    • 적 처치 시 현재 체력 기준 30% 회복, 누적 성장 배율에 따른 크기/공격속도/이동속도 증가를 적용.
    • 기존 combat.js에 하드코딩되어 있던 14~24 피해량을 ATTACK_DAMAGE_MIN, ATTACK_DAMAGE_MAX 상수로 분리.
    • 주요 전투/카메라/UI 상수마다 조정 대상이 무엇인지 주석 추가.
  1. 캐릭터 히트박스 기준 이름표 및 선택 관전 기능 (완료)
  • 조치 사항:
    • 캐릭터 이름표를 스프라이트 중심이 아니라 실제 히트박스 하단에 고정.
    • 캐릭터 클릭 시 선택 상태를 설정하고 카메라를 해당 캐릭터 히트박스 중심에 고정.
    • 초기 선택 표시는 사각형 대신 원본 alpha 마스크 기반 실루엣으로 생성.
    • 이후 선택 전용 실루엣은 상시 팀 색상 마커로 전환되어, 생존 캐릭터마다 팀 색상을 계속 보여줌.
  1. 패키지 락 파일 제외 (완료)
  • 조치 사항:
    • package-lock.json을 git 추적에서 제외하고 .gitignore에 추가.
  1. Slime 캐릭터 특성 추가 (완료)
  • 조치 사항:
    • src/game/fighterManifest.js에 Slime 전용 stats.maxHp: 1traits를 추가.
    • Slime으로 배정된 기본 스폰 슬롯 1개가 실제 Slime 10마리로 확장되도록 spawnMultiplier 처리 추가.
    • Slime 사망 시 50% 확률로 최대 체력 1인 Slime 2마리를 생성하도록 분열 특성 추가.
    • 분열체는 childCanSplit: false로 다시 분열하지 않도록 제한.
    • 처치 보상은 최대 체력을 증가시키지 않으므로 Slime이 적을 처치해도 최대 체력 1이 유지됨.
  1. 전투 진입 UI, 좌측 HUD badge, 좌측 하단 킬로그 개선 (완료)
  • 조치 사항:
    • 최초 접속 화면에 투명 전투 프리뷰, ARENA / PICKER 2단 로고, Start 버튼을 배치.
    • Start 클릭 시 우측 옵션 drawer가 열리고 홈 drawer 상태에서는 ARENA / PICKER 로고 위치를 유지한 채 Start 버튼을 숨기며, 전투 시작 시 실제 경기 화면으로 전환.
    • 팀 badge를 상단 좌/우 분할에서 경기장 밖 좌측 HUD 레일로 이동.
    • badge를 팀명, 팀 색상 구분선, 생존 인원 형식으로 표기.
    • 좌측 HUD 레일 폭과 경기장 시작 위치를 분리 계산해 badge가 미니맵과 경기장 캔버스를 가리지 않도록 조정.
    • 전투 시작 후 하단 안내바는 숨기고, 좌측 하단에 처치자/피처치자 이미지와 manifest.key를 포함한 목록형 킬로그를 표시. 중앙 텍스트는 처치로 유지하고 피처치자 아이콘에는 빨간 X를 겹쳐 구분.
  1. 전투 중 옵션 drawer 유지, 접기/펼치기, 재시작, 일시정지 추가 (완료)
  • 조치 사항:
    • 전투 시작 후 우측 drawer를 compact 패널로 유지하고, 전투 화면 중앙 정렬을 유지.
    • 전투 설정 헤더 우측 상단에 옵션 접기/옵션 펼치기 버튼을 배치.
    • 접힌 상태에서는 같은 우측 상단 위치에 토글 버튼만 남기고 패널 내용은 숨겨 전투 화면을 가리지 않도록 조정.
    • 재시작 버튼으로 현재 입력값 기준 새 전투를 즉시 시작하도록 연결.
    • 일시정지/계속 버튼으로 Phaser 물리, 타이머, tween, 스프라이트 애니메이션을 함께 정지/재개하도록 구현.
  1. 팀 badge 기반 무작위 시점 고정 (완료)
  • 조치 사항:
    • 좌측 팀 badge를 클릭 가능한 버튼으로 변경.
    • 클릭한 팀의 생존 캐릭터 중 무작위 1명을 선택해 기존 캐릭터 선택 카메라 고정 로직에 연결.
    • 선택된 팀 badge에 강조 스타일을 적용하고, 전투 중 하단 안내바가 노출되지 않도록 상태 표시를 정리.
  1. 처치 성장 scale 상한 및 arena 내부 보정 (완료)
  • 조치 사항:
    • KILL_GROWTH_MAX_MULTIPLIER를 추가해 처치 누적 보상으로 인한 크기/공격속도/이동속도 증가에 상한을 적용.
    • 처치 성장 tween 중/완료 시 캐릭터 위치를 arena 안쪽으로 보정해 히트박스가 전장 밖으로 나가는 문제를 방지.
  1. 종족별 사망 통계 저장 및 상단 안내바 추가 (완료)
  • 조치 사항:
    • 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에 사망 통계 컬렉션명과 집계 타임존 설정 예시를 추가.
  1. 사망 캐릭터가 생존 캐릭터를 가리는 문제 개선 (완료)
  • 조치 사항:
    • 사망한 캐릭터 sprite를 반투명 처리하고 생존 캐릭터보다 낮은 depth로 내려 전투원을 가리지 않도록 조정.
    • 사망 캐릭터의 이름표, 체력바, 팀 색상 마커를 숨겨 전투 화면의 가독성을 유지.
  1. 전투 설정 입력값 localStorage 유지 (완료)
  • 조치 사항:
    • 참가자 닉네임 textarea와 팀당 인원 숫자 입력/range 값을 브라우저 localStorage에 저장.
    • 앱 로드 시 저장된 참가자 닉네임과 팀당 인원을 먼저 복원해 새로고침/재접속 후에도 입력값이 유지되도록 구현.
    • 저장된 입력값이 최초 대기 전투 프리뷰 규모를 키우지 않도록 프리뷰는 10팀 x 팀당 5명 설정으로 분리.
  1. 최종교전 카메라 조건 및 슬로우모션 연출 추가 (완료)
  • 조치 사항:
    • 생존 4명 이하에서는 카메라가 생존 캐릭터를 일정 간격으로 무작위 포커싱하도록 변경.
    • 잔여 팀이 2팀이고 생존 캐릭터 합이 8명 이하이면 생존 수가 적은 팀의 중앙을 포커싱하도록 추가.
    • FINAL_COMBAT_SLOW_MOTION_ENABLED로 최종교전 슬로우모션을 켜고 끌 수 있게 하고 기본값은 false로 둠.
    • 활성화 시 최종교전 상태에서 idle이 아닌 공격 모션이 시작될 때 진입/유지/복귀 완급이 있는 전역 슬로우모션을 적용하고, Arcade Physics 이동에는 역수 timeScale을 적용.
  1. 미니맵 뷰포트 박스 검은 깨짐 수정 (완료)
  • 조치 사항:
    • 현재 뷰포트 사각형 좌표를 미니맵 픽셀 격자에 맞춰 이동 중 가장자리 흔들림을 완화.
    • 검은 외곽 stroke 위에 노란 stroke를 겹치던 뷰포트 박스를 노란 내부 채움 선으로 바꿔 이동 중 일부 선이 검게 보이는 현상을 제거.
  1. 치명타 적중 표기 추가 (완료)
  • 조치 사항:
    • 공격 프로필의 치명타 판정을 실제 적중 처리까지 전달해 전투 타입별 적중 연출이 같은 흐름을 사용하도록 정리.
    • 치명타 적중 시 대상 위에 Critical! 문구를 띄우고 즉시 처치가 적용되도록 applyHit()를 보강. (카메라 흔들림은 이후 메테오 착탄 연출로 이전)
  1. 리스폰 배치 설정 구분 추가 (완료)
  • 조치 사항:
    • 전투 설정 drawer에 스타팅 지점 배치와 기존 완전 랜덤 배치를 선택하는 리스폰 설정을 추가.
    • 스타팅 지점 배치에서는 참가자별 스타팅 영역과 영역 안 스폰 위치를 매치마다 무작위로 정하도록 구현했으며, 이후 30번 작업에서 영역 선택을 랜덤 중심 셀 기반 5 x 5 방식으로 구체화.
    • 선택한 리스폰 배치 모드를 localStorage에 저장해 새로고침과 재시작 이후에도 유지.
  1. 팀당 인원 직접 입력 동기화 (완료)
  • 조치 사항:
    • 팀당 인원 표시 필드를 number 입력으로 바꿔 값을 직접 입력할 수 있도록 변경.
    • 숫자 입력과 range 슬라이더가 같은 1~100 범위를 사용하며 양방향으로 즉시 동기화되도록 연결.
  1. 승리 화면 축하 연출 추가 (완료)
  • 조치 사항:
    • 기존 중앙 승리 배너를 금빛 광선과 컨페티가 함께 터지는 .victory-celebration 레이어로 확장.
    • 실제 전투 시작에서 Web Audio 컨텍스트를 준비하고 승리 시 짧은 팡파르를 합성해 재생하도록 추가.
    • 무승부는 팡파르와 컨페티를 제외한 절제된 결과 배너를 유지하고, 축하 애니메이션은 축소 모션 설정을 따르도록 보강.
  1. ArenaScene.js 모듈화 및 src/game 폴더 구조 정리 (완료)
  • 조치 사항:
    • ArenaScene.js의 방대한 기능을 7개의 전문 모듈(arenaKillLog, arenaScoreboard, battleDeathNotice, victoryCelebration, arenaMatchRuntime, arenaSpectatorCamera, arenaFinalCombatEffects)로 분리.
    • src/game 폴더 내의 파일들을 역할별 하위 폴더(arena/, combat/, fighter/, match/)로 분류하여 재배치.
    • 모든 import 경로를 새로운 계층 구조에 맞춰 업데이트하고 빌드 안정성을 확보.
    • ArenaScene.js는 이제 각 모듈을 조율하는 오케스트레이션 역할에 집중하도록 경량화됨.
  1. 일일 운영 지표 집계 추가 (완료)
  • 조치 사항:
    • 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일로 설정.
    • 프리뷰 전투는 제외하고 사용자가 시작한 실제 전투만 매치 시작/종료 지표에 반영.
  1. 모바일 전투 화면 구성 및 종료 팝업 대응 (완료)
  • 조치 사항:
    • 모바일에서 실제 전투 시작 시 옵션 drawer를 자동으로 접어 상단 HUD와 전투 화면을 먼저 보여주도록 변경.
    • 전투 중 옵션을 다시 펼쳐도 패널이 좌우 화면 밖으로 밀리지 않도록 모바일 live drawer 위치와 크기 규칙을 보정.
    • 모바일 킬 로그를 정사각형 전투 캔버스 바로 아래에 배치해 큰 빈 구간이 생기지 않도록 조정.
    • 전투 종료 시 옵션 drawer를 접고 match-ended 상태를 부여해 승리/무승부 연출이 설정 폼 위에 겹치지 않게 처리.
    • 승리 연출은 읽을 수 있는 시간 동안 표시한 뒤 자동으로 사라지며, 결과 텍스트가 더 빠르게 선명하게 보이도록 애니메이션을 조정.
    • 모바일 접힘 상태의 옵션 버튼을 더 작게 표시하고 상단 팀 HUD를 두 줄 4열 레이아웃으로 바꿔 4개 이후 팀도 잘리지 않게 조정.
    • 모바일 킬로그 최대 높이 계산에 방문자 카운터 안전 여백을 포함해 하단 방문자 카운터와 겹치지 않도록 보정.
    • 모바일 팀 카드의 선택 표시를 내부 테두리로 바꿔 카드 외곽선이 부모 영역에서 잘려 보이지 않게 수정.
    • 모바일 전투 중 옵션 drawer를 압축하고 닉네임 입력 높이를 고정해 전투 시작/재시작/일시정지 버튼이 한 화면에 보이도록 조정.
    • 승리/무승부 연출 레이어를 클릭하면 즉시 닫히도록 처리.
  1. 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만 추가.
  1. 전투 화면 'About' 버튼 위치 최적화 및 정적 자산 캐싱 강화 (완료)
  • 조치 사항:
    • index.html에서 about-buttonvisitor-countarena-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 등 핵심 문법 지원.
  1. 개인정보처리방침 DB 연동 로직 개선 및 실시간 조회 적용 (완료)
  • 조치 사항:
    • server/about.jsensureAboutDefaults 로직을 수정하여, DB에 이미 데이터가 있는 경우 기본값으로 덮어씌우지 않고 기존 데이터를 보존하도록 $setOnInsert 적용.
    • 유저가 About 다이얼로그를 열 때마다 DB에서 최신 데이터를 가져오도록 서버 메모리 캐시 로직을 제거.
    • 기본 개인정보처리방침 마크다운의 공고/시행 일자를 최신화.
  1. 전투 역할별 기본 스탯 프로필 분리 (완료)
  • 조치 사항:
    • src/constants.jsFIGHTER_TYPE_STATS.melee/ranged/magic 프로필을 추가해 최대 체력, 이동속도, 사거리, 쿨다운, 피해량, 치명타, 공격 발동 지연을 역할별로 조정할 수 있도록 변경.
    • src/game/fighter/fighterStats.js를 추가해 투사체 캐릭터는 원거리, 즉발 주문 캐릭터는 마법, 나머지는 근접 프로필로 판별하고 개별 스킨 오버라이드를 병합.
    • 캐릭터 생성과 전투 엔진이 해석된 프로필을 사용하도록 연결해 역할별 체력, 이동 및 공격 수치가 실제 전투에 적용되도록 변경.
  1. 킬로그 캐릭터 아이콘 가시성 개선 (완료)
  • 조치 사항:
    • 100x100 idle 프레임에 포함된 투명 여백까지 축소되던 킬로그 아이콘 배경 표시 방식을 보정.
    • 아이콘 박스 크기와 행 레이아웃은 유지하면서 캐릭터 실루엣이 있는 중앙 하단 영역을 확대 표시하도록 배경 크기와 위치를 조정.
  1. 팀별 스타팅 영역 앵커 및 전장 표시 추가 (완료)
  • 조치 사항:
    • 스타팅 지점 배치에서 전장 스폰 가능 그리드 중 팀별 중심 셀을 무작위로 선택하고, 중심 주변 2칸을 포함하는 5 x 5 영역을 팀별 스폰 구역으로 사용하도록 변경.
    • 겹치지 않는 후보가 남아 있는 동안에는 선택된 스타팅 영역끼리 중첩되지 않는 랜덤 중심을 우선 사용해 전투 시작 즉시 팀이 섞이는 상황을 줄임.
    • 팀별로 무작위 배정된 스타팅 영역 데이터를 실제 스폰 좌표와 공유해 표시 영역 밖에서 시작하지 않도록 구성.
    • arenaRenderer.js에 팀 색상의 매우 옅은 채움 및 외곽선 오버레이를 추가하고, 랜덤 배치에서는 오버레이가 표시되지 않도록 연결.
  1. 사망 시점 팀 badge 클릭 입력 유실 수정 (완료)
  • 조치 사항:
    • 사망 발생 때마다 arenaScoreboard.js가 팀 badge 버튼 전체를 재생성해 클릭 중인 DOM이 제거되던 문제를 수정.
    • 팀 구성이 바뀌지 않는 전투 중 갱신에서는 기존 버튼 DOM을 유지하고 생존 인원, 선택 강조, 비활성 상태만 업데이트하도록 변경.
    • 사망 처리와 팀 badge 클릭이 같은 시점에 겹쳐도 생존 캐릭터 관전 시점 선택이 정상 전달되도록 보강.
  1. 주기적 월드 이펙트 메테오 및 냉각지대 추가 (완료)
  • 조치 사항:
    • public/assets/effects/world_Effect.png를 7프레임 공용 스프라이트시트로 로드하고, 실제 전투 시작 후 8초마다 무작위 생존자 위치에 메테오 또는 냉각지대를 무작위 발동하도록 worldEffects.js를 추가.
    • 메테오는 낙하 경고 후 대상 위치 기준 5 x 5 영역에 환경 피해를 적용하고, 환경 사망이 처치 보상 없이 사망 통계와 승패 판정에 반영되도록 전투 피해 처리를 확장.
    • 냉각지대는 냉기 착탄 연출과 지속 구역을 표시하며, 구역 안에 있는 캐릭터의 공격속도와 이동속도를 함께 감속하도록 연결.
    • 발동 간격, 범위, 피해량, 냉각 지속시간과 감속 배율을 src/constants.jsWORLD_EFFECT_* 상수로 분리하고, 새 경기/종료/일시정지 생명주기에 맞춰 정리되도록 구성.
  1. 월드 메테오 대각선 낙하 및 냉기 전용 시트 적용 (완료)
  • 조치 사항:
    • 대상 위치가 전장 좌측 반면(2, 3사분면)이면 좌상단에서 우하단, 우측 반면(1, 4사분면)이면 우상단에서 좌하단으로 낙하하도록 궤적, 좌우 반전, 45도 회전을 적용.
    • WORLD_EFFECT_VISUAL_SCALEWORLD_EFFECT_FALL_TRAVEL_TILES를 추가해 피해 판정 5 x 5는 유지하면서 스프라이트를 전역 마법처럼 크게 보이도록 확장.
    • 화염 메테오는 public/assets/effects/world_Effect.png, 냉기 메테오는 새 public/assets/effects/world_Effect_2.png를 각각 독립된 7프레임 애니메이션으로 로드하도록 변경.
  1. 냉기 메테오 착탄 피해 옵션 추가 (완료)
  • 조치 사항:
    • WORLD_EFFECT_FROST_DAMAGE를 추가해 냉기 메테오 피해를 화염 메테오와 독립적으로 조절할 수 있도록 변경.
    • 냉기 메테오 착탄 시 5 x 5 영역 피해를 먼저 처리하고, 전투가 종료되지 않은 경우 기존 냉각지대 감속 효과를 이어서 생성하도록 연결.
  1. 스타팅 영역 표시 시간 제한 추가 (완료)
  • 조치 사항:
    • 팀별 스타팅 영역 오버레이가 스타팅 지점 배치 매치 시작 후 5초 동안만 표시되고 이후 자동으로 사라지도록 연결.
    • 숨김 예약을 Phaser 씬 타이머로 관리하여 일시정지 시간은 표시 지속 시간에 포함되지 않고, 새 매치 시작 시 이전 숨김 타이머가 남지 않도록 정리.
  1. 최종 2팀 자동 관전 및 메테오 착탄 화면 흔들림 전환 (완료)
  • 조치 사항:
    • 생존 캐릭터가 30명 미만이거나 최종 2팀만 남으면 후반 자동 줌과 교전 중심 포커싱이 시작되도록 관전 조건을 확장.
    • 치명타의 Critical! 표기와 즉시 처치는 유지하면서 카메라 흔들림을 제거.
    • 화염 메테오 착탄 화면 흔들림을 먼저 적용했으며, 이후 모든 메테오 착탄이 크기 기반 흔들림을 공유하도록 확장.
  1. 자동 관전 이전 메테오 임시 포커싱 추가 (완료)
  • 조치 사항:
    • 후반 자동 관전 조건이 성립하기 전 화염 또는 냉기 메테오가 낙하하면 착탄 위치를 확대 추적하고 착탄 연출 종료 후 기존 카메라 위치와 줌을 복원.
    • 캐릭터 수동 선택과 후반/최종 자동 관전은 메테오 임시 시점보다 우선하도록 카메라 상태를 정리.
    • src/constants.jsCAMERA.METEOR_FOCUS_ENABLED 플래그로 메테오 임시 포커싱을 코드에서 켜고 끌 수 있도록 구성.
  1. 냉기 메테오 동결 기절 및 실루엣 효과 추가 (완료)
  • 조치 사항:
    • 냉기 메테오 착탄 피해에 생존한 전투원은 2초 동안 이동과 새 공격이 정지되는 isFrostStunned 상태가 되도록 연결.
    • 동결 중 캐릭터 본체와 팀 실루엣 마커를 함께 얼음색으로 틴트하고, 시간이 끝나거나 매치가 정리되면 본체 원본 색상과 팀 색상으로 복원.
    • WORLD_EFFECT.FROST_STUN_DURATIONWORLD_EFFECT.FROST_STUN_TINT를 추가해 동결 지속시간과 표시 색상을 조절 가능하게 구성.
  1. 모바일 세로모드 팀 카드 가로폭 불균형 수정 (완료)
  • 조치 사항:
    • 모바일 미디어 쿼리에서 .score-side가 데스크톱의 grid-template-columns: repeat(2, 114px)를 상속받아 1~4번 팀 카드만 길게 표시되던 현상을 수정.
    • grid-template-columns: none을 추가하여 모든 팀 카드가 grid-auto-columns에 설정된 일정한 가로폭을 가지도록 보정.
  1. CSS 파일 기능별 모듈화 (완료)
  • 조치 사항:
    • 거대했던 src/styles.css(약 2,000라인)를 기능별로 6개의 파일(base, intro, game-ui, overlay, animations, mobile)로 분리.
    • src/styles/ 폴더를 생성하여 모듈화된 CSS 파일들을 관리.
    • src/styles.css는 이제 @import를 통해 각 모듈을 통합하는 엔트리 포인트 역할만 수행.
    • 코드 가독성과 유지보수 편의성을 대폭 향상.
  1. 스타일 관련 컨텍스트 문서 추가 및 라우팅 업데이트 (완료)
  • 조치 사항:
    • 새로운 CSS 모듈 구조와 디자인 원칙을 설명하는 context/style.md 문서를 신규 생성.
    • agent.md의 상세 기술 가이드(Context Routing) 섹션에 스타일 및 디자인 항목을 추가하여 문서 접근성 개선.
  1. 상단 공지(Battle Notice) 콘텐츠 확장 (완료)
  • 조치 사항:
    • 사망 통계만 보여주던 공지 UI에 게임 시스템 가이드(화염/냉기 메테오 특성, 밀리 치명타 확률 등) 팁을 추가.
    • 사망 통계 공지 2회당 1회의 비율로 시스템 팁이 교차 출력되도록 로직 개선.
  1. 구매 배수 기반 월드 이펙트 독주 표적 가중치 추가 (완료)
  • 조치 사항:
    • 닉네임*N으로 구매한 추가 병력은 수량과 전투 수치를 낮추지 않고 그대로 유지.
    • 생존 팀별 구매 배수 지분과 현재 생존 지분을 비교해, 구매 지분을 초과해 살아남은 팀에만 월드 이펙트 표적 가중치를 추가.
    • WORLD_EFFECT.DOMINANCE_TARGETING_MULTIPLIER를 추가하고 기본값을 1로 설정하여 초과 생존 지분 기반 압력을 활성화하며, 0으로 설정하면 기존 생존 유닛 비례 표적 선택으로 복귀하도록 구성.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.