15 KiB
15 KiB
- 투사체 피격 판정이 너무 좋지않음
- 원인 분석:
src/game/combat.js의PROJECTILE_HIT_RADIUS가 8픽셀로 설정되어 있어 투사체의 물리적 크기에 비해 판정 범위가 좁습니다.- 투사체가 생성될 때 공격자와 대상 사이의 거리가 매우 가까우면 투사체가 대상을 지나쳐버리는 현상이 발생할 수 있습니다.
- 현재
projectilePathHitsDefender함수에서 투사체의 궤적(Line)과 대상의 히트박스(Rectangle) 충돌을 검사하고 있지만, 대상의 실제 충돌 영역(defender.body)의 위치와 크기가 애니메이션 프레임에 따라 미세하게 변하면서 판정이 어긋날 수 있습니다.
- 내가 이야기한 참가자 닉네임을 입력하고 팀당인원을 입력하면 참가자 닉네임 별 캐릭터가 스폰돼야해 (완료)
- 조치 사항:
src/game/matchSetup.js를 수정하여 입력된 각 닉네임을 독립된 팀으로 설정.- 설정된
teamSize만큼 각 닉네임의 캐릭터가 소환되도록 로직 변경.
- 승리판정이 이상함 (완료)
- 조치 사항:
src/game/ArenaScene.js의finishMatch로직을 개선하여 생존 팀이 1개일 때 해당 닉네임 승리 표시.- 생존자가 없을 경우 "무승부!"가 표시되도록 예외 처리 추가.
- MongoDB 기반 유니크 방문자 체크 API 추가 (완료)
- 조치 사항:
- Fastify 서버를 추가하고
config.json기반 서버/MongoDB 설정을 도입. - MongoDB 커넥션 풀을 재사용하는
server/db.js구성. POST /api/visitors/check,GET /api/visitors/stats,GET /api/healthAPI 추가.- 프론트엔드 로드 시 방문자 체크 API를 호출하고 유니크 방문자 수를 표시.
- Fastify 서버를 추가하고
- 처치 보상 및 공격력 튜닝 상수화 (완료)
- 조치 사항:
- 적 처치 시 현재 체력 기준 30% 회복, 누적 성장 배율에 따른 크기/공격속도/이동속도 증가를 적용.
- 기존
combat.js에 하드코딩되어 있던14~24피해량을ATTACK_DAMAGE_MIN,ATTACK_DAMAGE_MAX상수로 분리. - 주요 전투/카메라/UI 상수마다 조정 대상이 무엇인지 주석 추가.
- 캐릭터 히트박스 기준 이름표 및 선택 관전 기능 (완료)
- 조치 사항:
- 캐릭터 이름표를 스프라이트 중심이 아니라 실제 히트박스 하단에 고정.
- 캐릭터 클릭 시 선택 상태를 설정하고 카메라를 해당 캐릭터 히트박스 중심에 고정.
- 초기 선택 표시는 사각형 대신 원본 alpha 마스크 기반 실루엣으로 생성.
- 이후 선택 전용 실루엣은 상시 팀 색상 마커로 전환되어, 생존 캐릭터마다 팀 색상을 계속 보여줌.
- 패키지 락 파일 제외 (완료)
- 조치 사항:
package-lock.json을 git 추적에서 제외하고.gitignore에 추가.
- Slime 캐릭터 특성 추가 (완료)
- 조치 사항:
src/game/fighterManifest.js에 Slime 전용stats.maxHp: 1과traits를 추가.- Slime으로 배정된 기본 스폰 슬롯 1개가 실제 Slime 10마리로 확장되도록
spawnMultiplier처리 추가. - Slime 사망 시 50% 확률로 최대 체력 1인 Slime 2마리를 생성하도록 분열 특성 추가.
- 분열체는
childCanSplit: false로 다시 분열하지 않도록 제한. - 처치 보상은 최대 체력을 증가시키지 않으므로 Slime이 적을 처치해도 최대 체력 1이 유지됨.
- 전투 진입 UI, 좌측 HUD badge, 좌측 하단 킬로그 개선 (완료)
- 조치 사항:
- 최초 접속 화면에 투명 전투 프리뷰,
Arena로고,Start버튼을 배치. Start클릭 시 우측 옵션 drawer가 열리고 홈 drawer 상태에서는Arena로고 위치를 유지한 채Start버튼을 숨기며, 전투 시작 시 실제 경기 화면으로 전환.- 팀 badge를 상단 좌/우 분할에서 경기장 밖 좌측 HUD 레일로 이동.
- badge를 팀명, 팀 색상 구분선, 생존 인원 형식으로 표기.
- 좌측 HUD 레일 폭과 경기장 시작 위치를 분리 계산해 badge가 미니맵과 경기장 캔버스를 가리지 않도록 조정.
- 전투 시작 후 하단 안내바는 숨기고, 좌측 하단에 처치자/피처치자 이미지와
manifest.key를 포함한 목록형 킬로그를 표시. 중앙 텍스트는처치로 유지하고 피처치자 아이콘에는 빨간 X를 겹쳐 구분.
- 최초 접속 화면에 투명 전투 프리뷰,
- 전투 중 옵션 drawer 유지, 접기/펼치기, 재시작, 일시정지 추가 (완료)
- 조치 사항:
- 전투 시작 후 우측 drawer를 compact 패널로 유지하고, 전투 화면 중앙 정렬을 유지.
전투 설정헤더 우측 상단에옵션 접기/옵션 펼치기버튼을 배치.- 접힌 상태에서는 같은 우측 상단 위치에 토글 버튼만 남기고 패널 내용은 숨겨 전투 화면을 가리지 않도록 조정.
재시작버튼으로 현재 입력값 기준 새 전투를 즉시 시작하도록 연결.일시정지/계속버튼으로 Phaser 물리, 타이머, tween, 스프라이트 애니메이션을 함께 정지/재개하도록 구현.
- 팀 badge 기반 무작위 시점 고정 (완료)
- 조치 사항:
- 좌측 팀 badge를 클릭 가능한 버튼으로 변경.
- 클릭한 팀의 생존 캐릭터 중 무작위 1명을 선택해 기존 캐릭터 선택 카메라 고정 로직에 연결.
- 선택된 팀 badge에 강조 스타일을 적용하고, 전투 중 하단 안내바가 노출되지 않도록 상태 표시를 정리.
- 처치 성장 scale 상한 및 arena 내부 보정 (완료)
- 조치 사항:
KILL_GROWTH_MAX_MULTIPLIER를 추가해 처치 누적 보상으로 인한 크기/공격속도/이동속도 증가에 상한을 적용.- 처치 성장 tween 중/완료 시 캐릭터 위치를 arena 안쪽으로 보정해 히트박스가 전장 밖으로 나가는 문제를 방지.
- 종족별 사망 통계 저장 및 상단 안내바 추가 (완료)
- 조치 사항:
src/game/fighterManifest.js의 모든 캐릭터에human,orc,skeleton,slime,wolf,bear중 하나의species값을 부여.- 실제 전투에서 사망한 캐릭터를
skin.species기준으로 집계하고, 프리뷰 전투는 통계에서 제외. server/deathStats.js와/api/death-stats/todayAPI를 추가해 별도 매치별 문서 없이 오늘 일자별 집계에 사망 카운트를 누적.- 전투가 5초 이상 지속되면 상단
#battle-notice에 오늘 종족별 사망 집계를 2초 표시/10초 대기 주기의 재치 있는 안내 문구로 표시. - 상단 안내바 폭을 전투 화면 안쪽에 어울리도록 줄이고, 방문자 수는 메인 화면 대신 전투 화면 우측 하단 작은 배지로 이동.
config.json.sample에 사망 통계 컬렉션명과 집계 타임존 설정 예시를 추가.
- 사망 캐릭터가 생존 캐릭터를 가리는 문제 개선 (완료)
- 조치 사항:
- 사망한 캐릭터 sprite를 반투명 처리하고 생존 캐릭터보다 낮은 depth로 내려 전투원을 가리지 않도록 조정.
- 사망 캐릭터의 이름표, 체력바, 팀 색상 마커를 숨겨 전투 화면의 가독성을 유지.
- 전투 설정 입력값 localStorage 유지 (완료)
- 조치 사항:
- 참가자 닉네임 textarea와 팀당 인원 숫자 입력/range 값을 브라우저
localStorage에 저장. - 앱 로드 시 저장된 참가자 닉네임과 팀당 인원을 먼저 복원해 새로고침/재접속 후에도 입력값이 유지되도록 구현.
- 저장된 입력값이 최초 대기 전투 프리뷰 규모를 키우지 않도록 프리뷰는 10팀 x 팀당 5명 설정으로 분리.
- 참가자 닉네임 textarea와 팀당 인원 숫자 입력/range 값을 브라우저
- 최종교전 카메라 조건 및 슬로우모션 연출 추가 (완료)
- 조치 사항:
- 생존 4명 이하에서는 카메라가 생존 캐릭터를 일정 간격으로 무작위 포커싱하도록 변경.
- 잔여 팀이 2팀이고 생존 캐릭터 합이 8명 이하이면 생존 수가 적은 팀의 중앙을 포커싱하도록 추가.
FINAL_COMBAT_SLOW_MOTION_ENABLED로 최종교전 슬로우모션을 켜고 끌 수 있게 하고 기본값은false로 둠.- 활성화 시 최종교전 상태에서 idle이 아닌 공격 모션이 시작될 때 진입/유지/복귀 완급이 있는 전역 슬로우모션을 적용하고, Arcade Physics 이동에는 역수 timeScale을 적용.
- 미니맵 뷰포트 박스 검은 깨짐 수정 (완료)
- 조치 사항:
- 현재 뷰포트 사각형 좌표를 미니맵 픽셀 격자에 맞춰 이동 중 가장자리 흔들림을 완화.
- 검은 외곽 stroke 위에 노란 stroke를 겹치던 뷰포트 박스를 노란 내부 채움 선으로 바꿔 이동 중 일부 선이 검게 보이는 현상을 제거.
- 치명타 적중 표기 추가 (완료)
- 조치 사항:
- 공격 프로필의 치명타 판정을 실제 적중 처리까지 전달해 전투 타입별 적중 연출이 같은 흐름을 사용하도록 정리.
- 치명타 적중 시 대상 위에
Critical!문구를 띄우고 즉시 처치와 카메라 흔들림이 함께 적용되도록applyHit()를 보강.
- 리스폰 배치 설정 구분 추가 (완료)
- 조치 사항:
- 전투 설정 drawer에
스타팅 지점 배치와 기존완전 랜덤 배치를 선택하는 리스폰 설정을 추가. 스타팅 지점 배치에서는 참가자 수에 맞춰 전장 구역을 나누고 참가자별 시작 구역 배정과 구역 안 스폰 위치를 매치마다 무작위로 정하도록 구현.- 선택한 리스폰 배치 모드를
localStorage에 저장해 새로고침과 재시작 이후에도 유지.
- 전투 설정 drawer에
- 팀당 인원 직접 입력 동기화 (완료)
- 조치 사항:
- 팀당 인원 표시 필드를
number입력으로 바꿔 값을 직접 입력할 수 있도록 변경. - 숫자 입력과 range 슬라이더가 같은
1~100범위를 사용하며 양방향으로 즉시 동기화되도록 연결.
- 팀당 인원 표시 필드를
- 승리 화면 축하 연출 추가 (완료)
- 조치 사항:
- 기존 중앙 승리 배너를 금빛 광선과 컨페티가 함께 터지는
.victory-celebration레이어로 확장. - 실제 전투 시작에서 Web Audio 컨텍스트를 준비하고 승리 시 짧은 팡파르를 합성해 재생하도록 추가.
- 무승부는 팡파르와 컨페티를 제외한 절제된 결과 배너를 유지하고, 축하 애니메이션은 축소 모션 설정을 따르도록 보강.
- 기존 중앙 승리 배너를 금빛 광선과 컨페티가 함께 터지는
- ArenaScene.js 모듈화 및 src/game 폴더 구조 정리 (완료)
- 조치 사항:
ArenaScene.js의 방대한 기능을 7개의 전문 모듈(arenaKillLog,arenaScoreboard,battleDeathNotice,victoryCelebration,arenaMatchRuntime,arenaSpectatorCamera,arenaFinalCombatEffects)로 분리.src/game폴더 내의 파일들을 역할별 하위 폴더(arena/,combat/,fighter/,match/)로 분류하여 재배치.- 모든
import경로를 새로운 계층 구조에 맞춰 업데이트하고 빌드 안정성을 확보. ArenaScene.js는 이제 각 모듈을 조율하는 오케스트레이션 역할에 집중하도록 경량화됨.
- 일일 운영 지표 집계 추가 (완료)
- 조치 사항:
server/dailyMetrics.js와/api/daily-metrics/today,/match-started,/match-finished,/donation-clickedAPI를 추가.- 날짜별 합산 문서에는
uniqueVisitors,totalVisits,totalMatchStarts,totalMatchFinishes,visitorsWithTwoOrMoreMatches,donationClicks만 저장. - 날짜+방문자 UUID 해시 기준의
daily_visitor_activity임시 카운터로 당일 2회 이상 매치 시작 방문자 수를 계산. - 임시 카운터에는 TTL 인덱스를 적용하고, 기본 보관 기간을
DAILY_ACTIVITY_RETENTION_DAYS60일로 설정. - 프리뷰 전투는 제외하고 사용자가 시작한 실제 전투만 매치 시작/종료 지표에 반영.
- 모바일 전투 화면 구성 및 종료 팝업 대응 (완료)
- 조치 사항:
- 모바일에서 실제 전투 시작 시 옵션 drawer를 자동으로 접어 상단 HUD와 전투 화면을 먼저 보여주도록 변경.
- 전투 중 옵션을 다시 펼쳐도 패널이 좌우 화면 밖으로 밀리지 않도록 모바일 live drawer 위치와 크기 규칙을 보정.
- 모바일 킬 로그를 정사각형 전투 캔버스 바로 아래에 배치해 큰 빈 구간이 생기지 않도록 조정.
- 전투 종료 시 옵션 drawer를 접고
match-ended상태를 부여해 승리/무승부 연출이 설정 폼 위에 겹치지 않게 처리. - 승리 연출은 읽을 수 있는 시간 동안 표시한 뒤 자동으로 사라지며, 결과 텍스트가 더 빠르게 선명하게 보이도록 애니메이션을 조정.
- 모바일 접힘 상태의 옵션 버튼을 더 작게 표시하고 상단 팀 HUD를 두 줄 4열 레이아웃으로 바꿔 4개 이후 팀도 잘리지 않게 조정.
- 모바일 킬로그 최대 높이 계산에 방문자 카운터 안전 여백을 포함해 하단 방문자 카운터와 겹치지 않도록 보정.
- 모바일 팀 카드의 선택 표시를 내부 테두리로 바꿔 카드 외곽선이 부모 영역에서 잘려 보이지 않게 수정.
- 모바일 전투 중 옵션 drawer를 압축하고 닉네임 입력 높이를 고정해 전투 시작/재시작/일시정지 버튼이 한 화면에 보이도록 조정.
- 승리/무승부 연출 레이어를 클릭하면 즉시 닫히도록 처리.
- 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만 추가.
- 전투 화면 '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 등 핵심 문법 지원.