장단콩 보드게임 & 미니어처 게임 클럽

트로피 시스템 확장 설계 (13종 추가)

개요

2026-07-15-trophy-system-design.md에서 구현한 5종 트로피(콩즈 죽돌이/개근왕, 일정 메이커, 만석 달성왕, 2048 간판왕)는 그대로 유지한다. 이 문서는 13종 신규 트로피와, 그 판정에 필요한 신규 Cloud Function 트리거 3개(posts, parties, users, suika_scores)를 정의한다. 트로피 총 개수는 18종이 된다.

기존 설계의 데이터 모델(users/{uid}.trophies: [{id, earnedAt, seen}]), 팝업 방식(다음 페이지 로드 시 1회, .victory-overlay 재사용), 트로피 정의 위치(functions/trophies.js 코드 상수 + assets/js/trophies-meta.js 클라이언트 미러)는 이번 확장에도 동일하게 적용된다.

신규 트로피 정의

id 이름 조건 데이터 소스
annual-member 연회원 가입 users/{uid}.annualMember === true users 문서
paju-ghost-1 파주 귀신 I 누적 출석 50회 (attendCount >= 50) stats/global
paju-ghost-2 파주 귀신 II 누적 출석 75회 (attendCount >= 75) stats/global
paju-ghost-3 파주 귀신 III 누적 출석 100회 (attendCount >= 100) stats/global
no-noshow-20 불참 없이 참석 20회 confirmedAttendees 포함 이벤트(마감된 것만) 누적 20회 posts
five-day-streak 5일 연속 참여 confirmedAttendees 기준 실제 참석 날짜가 달력상 연속 5일 posts
suika-master 콩드랍 마스터 suika_scores에서 best 전체 1위 suika_scores
party-planner 파티 플래너 현재 보유 중인 파티(parties, ownerUid 기준) 3개 이상 parties
heartthrob 인기 만점 평균 평점(매너·실력·재만남 가중치는 computeAverages와 무관, 단순 평균) 4.5 이상, ratingCount >= 10 stats/global
writing-master 글쓰기 장인 누적 게시글 30개 (postCount >= 30) stats/global
weekend-regular 주말 개근 confirmedAttendees 기준 주말(토/일) 이벤트 실제 참석 누적 10회 posts
kongz-hot 콩즈 온도왕 콩즈 온도(computeKongzTemp) 60도 이상 stats/global
so-hot 쏘핫 콩즈 온도 62도 이상 stats/global

이미지 경로는 기존과 동일한 규칙: /assets/trophies/{id}.png (실제 이미지 파일 제작은 범위 밖).

판정 트리거

1. stats/global 트리거 확장 (기존 onStatsUpdated)

기존 로직(콩즈 죽돌이/개근왕, 일정 메이커, 만석 달성왕)에 다음을 추가:

이 트리거는 이미 members 맵을 순회하며 memberStats를 들고 있으므로, 위 신규 조건들은 추가 Firestore 쿼리 없이 같은 순회 루프 안에서 판정 가능하다.

2. posts/{postId} 트리거 신규 (onPostConfirmed)

confirmedAttendees 필드가 쓰여질 때(즉 호스트가 참석 확정을 저장할 때) 발동하는 새 onDocumentWritten("posts/{postId}", ...) 트리거.

성능 참고: 이 트리거는 confirmedAttendees가 바뀔 때마다, 그 안에 포함된 모든 uid 각각에 대해 posts 쿼리를 1회씩 실행한다(예: 참석자 5명짜리 이벤트를 확정하면 쿼리 5회). 클럽 규모(회원 수십 명, 이벤트도 빈번하지 않음)에서는 허용 가능한 수준이나, 사이트 성장 시 배치/캐싱을 고려할 수 있다는 점을 주석으로 남긴다.

3. suika_scores/{uid} 트리거 신규 (onSuikaScoreUpdated)

기존 onGameScoreUpdated(2048)와 완전히 동일한 패턴으로 별도 작성:

4. parties/{partyId} 트리거 신규 (onPartyUpdated)

5. users/{uid} 트리거 신규 (onUserUpdated)

순수 함수 목록 (functions/trophies.js 확장)

기존 checkAttendanceTrophies, checkScheduleMakerTrophy, checkFullHouseTrophy, checkGame2048Trophy, newlyEarnedTrophyIds에 추가:

클라이언트 메타 (assets/js/trophies-meta.js)

TROPHIES_META 배열에 위 13개 항목을 동일한 {id, name, description, image} 형태로 추가. 기존 5개와 합쳐 총 18개, 순서는 위 표 순서를 따른다.

범위 밖