/* eslint-disable */ // ───────────────────────────────────────────────────────────── // searchgg · 서든어택 전적검색 — 더미 데이터 (서든어택 세계관 기반) // 군대 계급, 폭파미션/생존전/클랜전, 한국식 FPS 닉/맵 // window.SA 로 노출 // ───────────────────────────────────────────────────────────── // 군대 계급(랭크) 사다리 — 서든어택 특유의 '계급' 시스템 const RANKS = { 이병: { name: '이병', group: '사병', tier: 1, color: '#737d8a', pips: 1, shape: 'bar' }, 일병: { name: '일병', group: '사병', tier: 2, color: '#6b7682', pips: 2, shape: 'bar' }, 상병: { name: '상병', group: '사병', tier: 3, color: '#5e6975', pips: 3, shape: 'bar' }, 병장: { name: '병장', group: '사병', tier: 4, color: '#525c68', pips: 4, shape: 'bar' }, 하사: { name: '하사', group: '부사관', tier: 5, color: '#b3712b', pips: 1, shape: 'chev' }, 중사: { name: '중사', group: '부사관', tier: 6, color: '#ac6c28', pips: 2, shape: 'chev' }, 상사: { name: '상사', group: '부사관', tier: 7, color: '#a56625', pips: 3, shape: 'chev' }, 원사: { name: '원사', group: '부사관', tier: 8, color: '#9e6022', pips: 4, shape: 'chev' }, 준위: { name: '준위', group: '준사관', tier: 9, color: '#566f8e', pips: 1, shape: 'dia' }, 소위: { name: '소위', group: '위관', tier: 10, color: '#4f6b8a', pips: 1, shape: 'dia' }, 중위: { name: '중위', group: '위관', tier: 11, color: '#486485', pips: 2, shape: 'dia' }, 대위: { name: '대위', group: '위관', tier: 12, color: '#415d7e', pips: 3, shape: 'dia' }, 소령: { name: '소령', group: '영관', tier: 13, color: '#c0901a', pips: 1, shape: 'flower' }, 중령: { name: '중령', group: '영관', tier: 14, color: '#b78812', pips: 2, shape: 'flower' }, 대령: { name: '대령', group: '영관', tier: 15, color: '#ad800c', pips: 3, shape: 'flower' }, 준장: { name: '준장', group: '장성', tier: 16, color: '#9c7b1e', pips: 1, shape: 'star' }, 소장: { name: '소장', group: '장성', tier: 17, color: '#937319', pips: 2, shape: 'star' }, 중장: { name: '중장', group: '장성', tier: 18, color: '#8a6c16', pips: 3, shape: 'star' }, 대장: { name: '대장', group: '장성', tier: 19, color: '#7d6111', pips: 4, shape: 'star' }, }; const MAPS = ['제3보급창고', '웨어하우스', '데드폴', '웨스트게이트', '가스폭발', '6th 어벤터', '컨테이너시티', '욕망의 항구', '라스트포트', '폐건물', '지하철', '눈보라 기지', '국경지대', '폐쇄병동', '사막의 폭풍', '시가지', '비밀연구소', '공장지대', '항구창고', '폭우의 거리']; function r(n) { return Math.floor(Math.random() * n); } function pick(a) { return a[r(a.length)]; } function pad(n) { return n < 10 ? '0' + n : '' + n; } // 닉네임 풀 (매치 팀 로스터용) const NICK_POOL = ['독수리오형제', '한밤의저격수', '돌격대장', '연사의신', '헤드샷마스터', '클러치킹', '무한리필', 'рато', '광속에임', '벽뚫는소리', '근접의달인', '플래시뱅', '노스코프', '스팀팩', '리코일제로', '원피스원킬', '소음기장착', '전장의지배자', '마지막총알', '검은표범', '강철멘탈', '불꽃튀는키보드', '야시경', '폭파전문가', '리스폰지옥', '엄폐엄폐', '각잡고대기', '스나는예술', '돌진또돌진', '침착한손']; // 매치 팀 로스터 생성기 function genRoster(meName, mePos, ownerStats, ownerRank) { const used = new Set([meName]); const mk = (isOwner) => { let name; if (isOwner) name = meName; else { do { name = pick(NICK_POOL); } while (used.has(name)); used.add(name); } const k = isOwner ? ownerStats.k : 4 + r(26); const d = isOwner ? ownerStats.d : 5 + r(17); const a = isOwner ? ownerStats.a : 2 + r(12); const rank = isOwner && ownerRank ? ownerRank : pick(RANK_LIST); return { name, isOwner, rank, k, d, a, hs: 14 + r(48), dmg: 1800 + r(5200) }; }; const blue = [], red = []; for (let i = 0; i < 5; i++) blue.push(mk(mePos === 'blue' && i === 0)); for (let i = 0; i < 5; i++) red.push(mk(mePos === 'red' && i === 0)); const sortFn = (a, b) => b.k - a.k; return { blue: blue.sort(sortFn), red: red.sort(sortFn) }; } // 최근 매치 생성기 function genMatches(count, base, ownerName, ownerRank) { const out = []; const meName = ownerName || '나'; for (let i = 0; i < count; i++) { const mode = pick(['클랜전', '솔로 랭크전', '파티 랭크전', '클랜 랭크전', '토너먼트']); const win = Math.random() < (base ? base.wr / 100 : 0.55); const k = 8 + r(28); const d = 6 + r(18); const a = 3 + r(12); const hours = i === 0 ? 0 : Math.floor(Math.random() * (i * 5) + i); const winSide = pick(['blue', 'red']); const mePos = win ? winSide : (winSide === 'blue' ? 'red' : 'blue'); out.push({ mode, map: pick(MAPS), win, k, d, a, teams: genRoster(meName, mePos, { k, d, a }, ownerRank), mePos, winSide, ago: hours === 0 ? '방금 전' : hours < 24 ? `${hours}시간 전` : `${Math.floor(hours / 24)}일 전`, }); } return out; } // ── 프로필 확장 전적 생성기 ── const TIERS_DESC = ['하이랭커', '랭커', '챌린저', '그랜드마스터', '마스터', '골드', '실버', '브론즈']; const CLAN_POOL = [['서울제일', 'SEL'], ['불곰부대', 'BEAR'], ['야간전투', 'NGT'], ['한강수비대', 'HAN'], ['벚꽃클랜', 'SAK'], ['강철군화', 'STL'], ['백호부대', 'WHT']]; const RANK_LIST = Object.values(RANKS).sort((a, b) => a.tier - b.tier); function clamp(lo, hi, v) { return Math.max(lo, Math.min(hi, Math.round(v))); } function rankStep(rank, d) { const t = Math.max(1, Math.min(RANK_LIST.length, rank.tier + d)); return RANK_LIST.find((x) => x.tier === t) || rank; } function tierByWr(wr, idx) { const i = Math.max(0, Math.min(7, Math.floor((78 - wr) / 4) + idx)); return TIERS_DESC[i]; } function recBase(wrIn) { const wr = clamp(38, 80, wrIn); const mt = 60 + r(260); const w = Math.round(mt * wr / 100); return { matches: mt, w, l: mt - w, wr, kd: clamp(48, 80, wr + r(10) - 4), hs: 24 + r(34) }; } function genClanPeriods(isCurrent) { const n = 1 + r(2); // 1~3회 가입 const periods = []; let year = 2023 + r(2); let mon = 1 + r(11); for (let i = 0; i < n; i++) { const dur = 2 + r(11); const from = `${year}.${pad(mon)}`; let em = mon + dur, ey = year + Math.floor((em - 1) / 12); em = ((em - 1) % 12) + 1; const last = i === n - 1; periods.push({ from, to: (last && isCurrent) ? '활동 중' : `${ey}.${pad(em)}`, months: dur }); year = ey; mon = em + 1 + r(6); if (mon > 12) { year += 1; mon -= 12; } } return periods; } function genClanRecords(o) { const out = []; const seen = new Set(); if (o.clan) { out.push({ clan: o.clan, tag: o.clanTag, ...recBase(o.wr), periods: genClanPeriods(true) }); seen.add(o.clan); } const pool = CLAN_POOL.filter((c) => !seen.has(c[0])); const n = 2 + r(3); for (let i = 0; i < n && i < pool.length; i++) out.push({ clan: pool[i][0], tag: pool[i][1], ...recBase(o.wr - 3 - r(8)), periods: genClanPeriods(false) }); return out; } function rankedRec(wrIn, tier) { const apex = tier === '하이랭커'; return { tier, div: apex ? null : (1 + r(4)), points: apex ? (2200 + r(2600)) : (300 + r(1600)), ...recBase(wrIn) }; } function genRankedSeasons(o) { const seasons = ['2026 시즌2', '2026 시즌1', '2025 시즌4', '2025 시즌3', '2025 시즌2', '2025 시즌1']; return seasons.map((s, idx) => ({ season: s, solo: rankedRec(o.wr - idx * 2, tierByWr(o.wr, idx)), party: rankedRec(o.wr - 3 - idx * 2, tierByWr(o.wr - 2, idx)), })); } function genMapRecords(o) { return MAPS.map((name) => ({ name, ...recBase(o.wr + r(10) - 5) })).sort((a, b) => b.matches - a.matches); } function genModeRecords(o) { return [ { name: '솔로 랭크전', ...recBase(o.wr) }, { name: '파티 랭크전', ...recBase(o.wr - 3) }, { name: '클랜전', ...recBase(o.wr - 1) }, { name: '일반전', ...recBase(o.wr - 2 + r(6)) }, ]; } function genTrend(o) { const baseWr = clamp(38, 80, o.wr); const baseKd = Math.round((o.kda / (o.kda + 1)) * 100); const series = (n, labeler, vol) => { const out = []; let wr = baseWr - 4 + r(8), kd = baseKd - 4 + r(8); for (let i = n - 1; i >= 0; i--) { wr = clamp(30, 88, wr + (r(2 * vol + 1) - vol)); kd = clamp(30, 85, kd + (r(2 * vol + 1) - vol)); out.push({ label: labeler(i), wr, kd, games: 6 + r(22) }); } return out; }; return { daily: series(14, (i) => `${i === 0 ? '오늘' : i + '일 전'}`, 5), weekly: series(10, (i) => `${i === 0 ? '이번주' : i + '주 전'}`, 4), }; } function mkPlayer(o) { const rank = RANKS[o.rank]; const games = o.games || (3000 + r(9000)); const wins = Math.round(games * (o.wr / 100)); const m = genMatches(14, { wr: o.wr }, o.name, rank); const rifle = 50 + r(22); const sniper = Math.round((100 - rifle) * (0.45 + Math.random() * 0.35)); const special = Math.max(0, 100 - rifle - sniper); return { id: o.name, name: o.name, rank, level: o.level || (40 + r(160)), clan: o.clan || null, clanTag: o.clanTag || null, wr: o.wr, kda: o.kda, hs: o.hs, // 헤드샷 % rifle, sniper, special, // 무기 분류별 킬 비중 % rankNoTotal: Math.max(1, Math.round((4.3 - o.kda) * 4200) + r(600)), // 통합 랭킹(위) rankNoSeason: Math.max(1, Math.round((4.3 - o.kda) * 4200 * (0.7 + Math.random() * 0.8)) + r(500)), // 시즌 랭킹(위) manner: 80 + r(18), // 매너 점수 connRate: 52 + r(46), // 접속률 % rankTotal: rank, // 통합 계급(피크) rankSeason: rankStep(rank, -1), // 이번 시즌 계급 clanRecords: genClanRecords(o), // 소속 클랜별 클랜전 전적 rankedSeasons: genRankedSeasons(o), // 시즌별 랭크전(솔로/파티) mapRecords: genMapRecords(o), // 맵별 전적 modeRecords: genModeRecords(o), // 모드별 전적 games, wins, losses: games - wins, matches: m, together: (() => { const g = 12 + r(180); const w = Math.round(g * (o.wr / 100)); return { games: g, w, l: g - w }; })(), trend: genTrend(o), color: rank.color, }; } // ── 로그인 유저(나) ── const me = mkPlayer({ name: '헤드샷장인', rank: '소령', level: 187, wr: 61, kda: 2.14, hs: 47, clan: '불곰부대', clanTag: 'BEAR', games: 8420, }); // ── 솔로랭크 TOP ── const soloRanking = [ mkPlayer({ name: 'GLOCK_여신', rank: '대장', level: 240, wr: 73, kda: 3.42, hs: 58, clan: '서울제일', clanTag: 'SEL', games: 14200, badge: '챔피언' }), mkPlayer({ name: '서든황제김씨', rank: '중장', level: 233, wr: 70, kda: 3.08, hs: 54, clan: '불곰부대', clanTag: 'BEAR', games: 13100 }), mkPlayer({ name: '컨테이너지박령', rank: '소장', level: 221, wr: 68, kda: 2.91, hs: 61, clan: '야간전투', clanTag: 'NGT', games: 11890 }), mkPlayer({ name: '원킬원샷', rank: '준장', level: 215, wr: 66, kda: 2.77, hs: 63, clan: null, games: 10400 }), mkPlayer({ name: '데드폴터줏대', rank: '대령', level: 208, wr: 64, kda: 2.55, hs: 49, clan: '한강수비대', clanTag: 'HAN', games: 9870 }), mkPlayer({ name: '도라에몽핵아님', rank: '중령', level: 199, wr: 63, kda: 2.48, hs: 52, clan: null, games: 9210 }), mkPlayer({ name: '오로라공주', rank: '소령', level: 191, wr: 62, kda: 2.31, hs: 45, clan: '벚꽃클랜', clanTag: 'SAK', games: 8650 }), mkPlayer({ name: '연막탄장인', rank: '대위', level: 178, wr: 60, kda: 2.22, hs: 41, clan: null, games: 7980 }), ]; // ── 생존전 랭킹 ── const survRanking = [ mkPlayer({ name: '최후의1인', rank: '대장', level: 238, wr: 41, kda: 4.10, hs: 50, clan: '서울제일', clanTag: 'SEL', games: 6200, badge: '생존왕' }), mkPlayer({ name: '자기장보다빠름', rank: '중장', level: 226, wr: 38, kda: 3.71, hs: 47, clan: null, games: 5840 }), mkPlayer({ name: '낙하산명사수', rank: '소장', level: 219, wr: 36, kda: 3.40, hs: 44, clan: '야간전투', clanTag: 'NGT', games: 5510 }), mkPlayer({ name: '엄폐의달인', rank: '준장', level: 210, wr: 34, kda: 3.12, hs: 39, clan: null, games: 5120 }), mkPlayer({ name: '캠핑은매너', rank: '대령', level: 203, wr: 32, kda: 2.95, hs: 42, clan: '한강수비대', clanTag: 'HAN', games: 4790 }), mkPlayer({ name: '막판뒤집기', rank: '중령', level: 196, wr: 31, kda: 2.80, hs: 38, clan: null, games: 4510 }), mkPlayer({ name: '보급상자요정', rank: '소령', level: 188, wr: 30, kda: 2.66, hs: 36, clan: '벚꽃클랜', clanTag: 'SAK', games: 4230 }), mkPlayer({ name: '치킨한마리', rank: '대위', level: 175, wr: 29, kda: 2.51, hs: 35, clan: null, games: 3980 }), ]; // ── 클랜 랭킹 ── // ── 최근 검색한 유저(빠른 재검색) ── const recentSearches = ['GLOCK_여신', '서든황제김씨', '원킬원샷', '오로라공주', '최후의1인', '연막탄장인']; // ── 인기 검색 랭킹(가장 많이 조회된 유저 · 24시간) ── const searchTrending = [ { name: 'GLOCK_여신', count: 18420, move: 0 }, { name: '최후의1인', count: 15330, move: 2 }, { name: '헤드샷장인', count: 12870, move: -1 }, { name: '서든황제김씨', count: 11240, move: 'new' }, { name: '원킬원샷', count: 9680, move: 1 }, { name: '오로라공주', count: 8210, move: -2 }, { name: '컨테이너지박령', count: 7050, move: 'new' }, { name: '연막탄장인', count: 6320, move: 3 }, ]; // ── 즐겨찾기(친구/전우) ── const friends = [ mkPlayer({ name: '같이가요전우님', rank: '대위', level: 172, wr: 58, kda: 1.98, hs: 38, clan: '불곰부대', clanTag: 'BEAR', online: true }), mkPlayer({ name: '소이탄러버', rank: '중위', level: 154, wr: 55, kda: 1.81, hs: 35, clan: '불곰부대', clanTag: 'BEAR', online: true }), mkPlayer({ name: '야1돌이', rank: '상사', level: 121, wr: 52, kda: 1.62, hs: 33, clan: null, online: false }), mkPlayer({ name: '닷지의신', rank: '소위', level: 138, wr: 54, kda: 1.74, hs: 30, clan: '불곰부대', clanTag: 'BEAR', online: false }), ]; // ── 실시간 전장 현황(오늘) ── const liveStats = { date: '06월 09일', totalMatches: 151873, matchModes: [ { name: '클랜전', count: 40713 }, { name: '솔로 랭크전', count: 62840 }, { name: '파티 랭크전', count: 48320 }, { name: '클랜 랭크전', count: 21560 }, ], online: 31204, topMap: '제3보급창고', topMode: '폭파미션', newClans: 142, bannedToday: 87, // 핵/불량 유저 제재 prevDelta: +6.2, // 전일대비 % }; // ── 커뮤니티 게시판 ── const community = { 자유: [ { tag: '유머', title: '제3보급창고 A롱 각도 외운 사람만 아는 그것 ㅋㅋㅋ', cmt: 214, hot: true, time: '12분 전' }, { tag: '질문', title: '20년차 복귀유저인데 요즘 메타 AK가 국룰인가요?', cmt: 88, hot: true, time: '34분 전' }, { tag: '자랑', title: '드디어 소령 달았습니다… 학창시절부터 한 게임 (눈물)', cmt: 156, hot: true, time: '1시간 전' }, { tag: '잡담', title: '오늘 생존전 스쿼드 막판 1:4 역전 클립 보고가셈', cmt: 42, hot: false, time: '2시간 전' }, { tag: '질문', title: '클랜원 모집 어디서 하는 게 제일 빠른가요?', cmt: 19, hot: false, time: '3시간 전' }, ], 공략: [ { tag: '에임', title: '헤드라인 유지 — 입문자가 3일 만에 헤드샷률 올리는 법', cmt: 327, hot: true, time: '6시간 전' }, { tag: '맵', title: '[데드폴] 폭파 공격팀 기본 진입 루트 3가지 총정리', cmt: 198, hot: true, time: '8시간 전' }, { tag: '맵', title: '[웨어하우스] 수비팀 크로스 각 잡는 3가지 포지션', cmt: 142, hot: false, time: '1일 전' }, { tag: '생존', title: '생존전 솔로 — 자기장 사이클별 동선 가이드', cmt: 89, hot: false, time: '1일 전' }, { tag: '클랜', title: '클랜전 입문 — 포지션별 역할과 콜 기본기', cmt: 64, hot: false, time: '2일 전' }, ], }; // ── SA 소식: 공지사항 / 업데이트 / 이벤트 ── const news = { 공지사항: [ { title: '6/11(목) 정기점검 및 게임 프레임 확장 베타 서버 적용 안내', date: '06.09', pin: true }, { title: '확률형 아이템 확률 정보 통합 안내 페이지 오픈 안내', date: '06.05', pin: true }, { title: '비매너·불법 프로그램 사용 계정 제재 안내 (6월 1주차)', date: '06.04', pin: false }, { title: '서버 안정화 작업에 따른 일부 채널 일시 점검 안내', date: '05.30', pin: false }, { title: '닉네임 변경권 사용 정책 일부 개정 안내', date: '05.27', pin: false }, { title: '고객지원 운영시간 변경 안내', date: '05.22', pin: false }, ], 'GM이야기': [ { title: '[GM레터] 게임 프레임 확장 베타, 직접 체험해본 후기', date: '06.09', tag: 'GM' }, { title: '개발팀이 전하는 2026 시즌2 「페르소나」 기획 비하인드', date: '06.03', tag: 'GM' }, { title: '[GM노트] 밸런스 패치는 어떤 기준으로 결정되나요?', date: '05.27', tag: 'GM' }, { title: '커뮤니티 의견 반영 현황 — 여러분의 제안이 이렇게 적용됐어요', date: '05.20', tag: 'GM' }, { title: '[GM레터] 비매너·핵 근절을 위한 모니터링 강화 이야기', date: '05.13', tag: 'GM' }, { title: '신규·복귀 유저를 위한 GM의 온보딩 팁 모음', date: '05.06', tag: 'GM' }, ], 업데이트: [ { title: '2026 시즌2 「페르소나」 — 신규 캐릭터 리나·린 추가', date: '06.04', tag: '신규' }, { title: '생존전 로데오 솔로 모드 및 신규 콤보 시스템 적용', date: '05.28', tag: '모드' }, { title: '무기 컬렉션 대표 스킨 시스템 개편', date: '05.21', tag: '시스템' }, { title: '2026 무기 개편 2차 — SG552·FAMAS 밸런스 조정', date: '05.14', tag: '밸런스' }, { title: '정채연 캐릭터 출시 및 전용 모션 추가', date: '05.07', tag: '캐릭터' }, { title: '제3보급창고 리마스터 및 충돌 버그 수정', date: '04.30', tag: '맵' }, ], 이벤트: [ { title: 'SUMMER PARTY TIME! PC방 파티 출석 이벤트', date: '06.08', tag: '진행중' }, { title: '얼리 썸머 체크인 — 7일 출석 시 무기 스킨 지급', date: '06.05', tag: '진행중' }, { title: '2026 챔피언십 시즌2 승부예측 6주차', date: '06.02', tag: '진행중' }, { title: '신규·복귀 전우 환영 미션 패키지', date: '05.26', tag: '상시' }, { title: '친구 초대하고 캐릭터 뽑기권 받기', date: '05.20', tag: '상시' }, ], }; // ── 지금 방송 중 LIVE (치지직 / 숲 / 유튜브 연동) ── const streamPlatforms = { 치지직: { label: '치지직', en: 'CHZZK', color: '#00b6a0', tag: 'CHZZK' }, 숲: { label: '숲', en: 'SOOP', color: '#0064ff', tag: 'SOOP' }, 유튜브: { label: '유튜브', en: 'YOUTUBE', color: '#e62117', tag: 'YT' }, }; const streams = [ { platform: '치지직', streamer: '헤드샷장인', title: '소령 → 중령 승급전 가즈아 [클랜전 정주행]', viewers: 4210, started: '2시간째' }, { platform: '숲', streamer: 'BJ철벽수비', title: '생존전 1인 스쿼드 치킨 30판 도전', viewers: 2870, started: '1시간째' }, { platform: '유튜브', streamer: '원킬원샷TV', title: 'AWP 원챔으로 솔로랭크 끝까지 등반', viewers: 1530, started: '3시간째' }, { platform: '치지직', streamer: '오로라공주', title: '시청자 참여 클랜전 · 같이 서든해요', viewers: 980, started: '40분째' }, { platform: '숲', streamer: '연막탄장인', title: '데드폴 공격팀 진입 루트 풀이 + 랭크', viewers: 760, started: '1시간째' }, { platform: '유튜브', streamer: '서든레전드', title: '랭크전 티어별 동선·포지션 완전 정리', viewers: 540, started: '2시간째' }, ]; // ── 컨텐츠 랭크전 티어 색상표 (브론즈→하이랭커 8단계) ── const tiers = [ { name: '브론즈', color: '#a9743b' }, { name: '실버', color: '#94a0aa' }, { name: '골드', color: '#c4960f' }, { name: '마스터', color: '#5b8a72' }, { name: '그랜드마스터', color: '#4f6b8a' }, { name: '챌린저', color: '#7a5bb0' }, { name: '랭커', color: '#b25a2b' }, { name: '하이랭커', color: '#b23b3b' }, ]; // ── SA 랭킹 5종 (각 top10) ── // 1) 시즌 계급 랭킹 — 이번 시즌 계급 점수 const seasonClassRanking = [ { name: 'GLOCK_여신', score: 41820 }, { name: '최후의1인', score: 39650 }, { name: '서든황제김씨', score: 37410 }, { name: '자기장보다빠름', score: 35880 }, { name: '컨테이너지박령', score: 34120 }, { name: '낙하산명사수', score: 32540 }, { name: '원킬원샷', score: 30980 }, { name: '엄폐의달인', score: 29360 }, { name: '데드폴터줏대', score: 27910 }, { name: '캠핑은매너', score: 26480 }, ]; // 2) 통합 계급 랭킹 — 역대 누적 계급 점수 const totalClassRanking = [ { name: '서든황제김씨', score: 284900 }, { name: 'GLOCK_여신', score: 271350 }, { name: '원킬원샷', score: 258740 }, { name: '컨테이너지박령', score: 246180 }, { name: '데드폴터줏대', score: 233520 }, { name: '도라에몽핵아님', score: 221070 }, { name: '최후의1인', score: 209640 }, { name: '오로라공주', score: 198330 }, { name: '연막탄장인', score: 187020 }, { name: '헤드샷장인', score: 176510 }, ]; // 3) 컨텐츠 랭킹 — 솔로/파티 랭크전 (RP순) const soloRpRanking = [ { name: 'GLOCK_여신', tier: '하이랭커', rp: 4920 }, { name: '원킬원샷', tier: '하이랭커', rp: 4710 }, { name: '컨테이너지박령', tier: '랭커', rp: 4480 }, { name: '서든황제김씨', tier: '랭커', rp: 4350 }, { name: '데드폴터줏대', tier: '챌린저', rp: 4120 }, { name: '도라에몽핵아님', tier: '챌린저', rp: 3980 }, { name: '오로라공주', tier: '그랜드마스터', rp: 3760 }, { name: '연막탄장인', tier: '그랜드마스터', rp: 3610 }, { name: '헤드샷장인', tier: '마스터', rp: 3420 }, { name: '같이가요전우님', tier: '마스터', rp: 3280 }, ]; const partyRpRanking = [ { name: '최후의1인', tier: '하이랭커', rp: 4860 }, { name: 'GLOCK_여신', tier: '하이랭커', rp: 4690 }, { name: '자기장보다빠름', tier: '랭커', rp: 4420 }, { name: '서든황제김씨', tier: '랭커', rp: 4300 }, { name: '낙하산명사수', tier: '챌린저', rp: 4080 }, { name: '원킬원샷', tier: '챌린저', rp: 3940 }, { name: '엄폐의달인', tier: '그랜드마스터', rp: 3720 }, { name: '오로라공주', tier: '그랜드마스터', rp: 3580 }, { name: '캠핑은매너', tier: '마스터', rp: 3360 }, { name: '보급상자요정', tier: '마스터', rp: 3210 }, ]; // 3-1) 랭크전 클랜 랭킹 — 클랜 랭크전 (RP순) const clanRpRanking = [ { name: '서울제일', tag: 'SEL', members: 48, rp: 9840 }, { name: '불곰부대', tag: 'BEAR', members: 52, rp: 9510 }, { name: '야간전투', tag: 'NGT', members: 41, rp: 9180 }, { name: '강철군화', tag: 'STL', members: 50, rp: 8870 }, { name: '한강수비대', tag: 'HAN', members: 45, rp: 8560 }, { name: '한밤의늑대', tag: 'WLF', members: 44, rp: 8240 }, { name: '데드샷연합', tag: 'DSU', members: 39, rp: 7930 }, { name: '벚꽃클랜', tag: 'SAK', members: 38, rp: 7610 }, { name: '폭풍전야', tag: 'STM', members: 42, rp: 7350 }, { name: '은하수비대', tag: 'GLX', members: 36, rp: 7080 }, ]; // 4) 공식 클랜 랭킹 — 운영팀 인증 클랜 const officialClanRanking = [ { name: '서울제일', tag: 'SEL', members: 48, rp: 28940 }, { name: '불곰부대', tag: 'BEAR', members: 52, rp: 27110 }, { name: '야간전투', tag: 'NGT', members: 41, rp: 25880 }, { name: '정예타격대', tag: 'ACE', members: 50, rp: 24990 }, { name: '한강수비대', tag: 'HAN', members: 45, rp: 24500 }, { name: '백호부대', tag: 'WHT', members: 47, rp: 23770 }, { name: '벚꽃클랜', tag: 'SAK', members: 38, rp: 23210 }, { name: '강철군화', tag: 'STL', members: 50, rp: 22640 }, { name: '흑표클랜', tag: 'BLP', members: 43, rp: 21980 }, { name: '새벽기습', tag: 'DWN', members: 39, rp: 21330 }, ]; // 5) 클랜 랭킹 — 일반 클랜 const generalClanRanking = [ { name: '불곰부대', tag: 'BEAR', members: 52, rp: 26210 }, { name: '한밤의늑대', tag: 'WLF', members: 44, rp: 25540 }, { name: '서울제일', tag: 'SEL', members: 48, rp: 24880 }, { name: '돌격대대', tag: 'CHG', members: 36, rp: 23960 }, { name: '야간전투', tag: 'NGT', members: 41, rp: 23310 }, { name: '폭풍전선', tag: 'STM', members: 40, rp: 22650 }, { name: '벚꽃클랜', tag: 'SAK', members: 38, rp: 21940 }, { name: '강철군화', tag: 'STL', members: 50, rp: 21280 }, { name: '백전노장', tag: 'VET', members: 33, rp: 20710 }, { name: '한강수비대', tag: 'HAN', members: 45, rp: 20150 }, ]; // ── 시즌 현황 (시즌 D-day · 보상 · 시즌 맵) ── const season = { name: '2026 시즌2 「페르소나」', period: '05.07 ~ 06.30', dday: 'D-20', progress: 63, reward: '시즌2 한정 칭호 「페르소나」 · 캐릭터 뽑기권 10장', maps5v5: ['제3보급창고', '웨어하우스', '데드폴', '컨테이너시티', '라스트포트'], maps3v3: ['욕망의 항구', '폐건물', '가스폭발', '웨스트게이트'], }; // ── 연승 핫스트릭 (폼 좋은 유저) ── const hotStreak = [ { name: 'GLOCK_여신', streak: 12 }, { name: '원킬원샷', streak: 9 }, { name: '컨테이너지박령', streak: 8 }, { name: '오로라공주', streak: 7 }, { name: '서든황제김씨', streak: 6 }, { name: '데드폴터줏대', streak: 6 }, ]; // ── 진행중인 이벤트 배너(피처드) ── const events = [ { title: '게임 프레임 확장 베타 테스트', sub: '최대 200 FPS 개선 서버를 일주일간 체험', period: '06.04 ~ 06.11', dday: 'D-2', tag: 'GM이야기', kind: 'beta' }, { title: 'SUMMER PARTY TIME!', sub: 'PC방 접속하고 파티 보상 받아가세요', period: '06.01 ~ 06.30', dday: 'D-21', tag: 'PC방', kind: 'party' }, { title: '시즌2 「페르소나」 승부예측', sub: '6주차 매치 결과 맞히고 포인트 적립', period: '~ 06.15', dday: 'D-6', tag: '리그', kind: 'league' }, { title: '얼리 썸머 체크인', sub: '7일 연속 출석 시 한정 무기 스킨 증정', period: '06.05 ~ 06.19', dday: 'D-10', tag: '출석', kind: 'checkin' }, { title: '신규·복귀 유저 부스트', sub: '경험치 2배 + 스타터 보급 패키지 지급', period: '06.01 ~ 06.30', dday: 'D-21', tag: '복귀', kind: 'boost' }, { title: '주말 클랜전 더블 포인트', sub: '토·일 클랜전 승리 시 클랜 포인트 2배', period: '매주 주말', dday: '상시', tag: '클랜', kind: 'clan' }, { title: '핫타임 드롭 이벤트', sub: '매일 20~22시 접속 시 랜덤 보급상자', period: '06.01 ~ 06.30', dday: 'D-21', tag: '핫타임', kind: 'hot' }, { title: '명사수 챌린지', sub: '주간 헤드샷 목표 달성하고 보상 획득', period: '06.09 ~ 06.16', dday: 'D-7', tag: '챌린지', kind: 'challenge' }, ]; window.SA = { me, soloRanking, survRanking, recentSearches, friends, liveStats, community, news, events, streams, streamPlatforms, searchTrending, tiers, seasonClassRanking, totalClassRanking, soloRpRanking, partyRpRanking, clanRpRanking, officialClanRanking, generalClanRanking, season, hotStreak, // 즐겨찾기 (페이지네이션 시연용 — 친구 + 랭커 혼합) favorites: [...friends, ...soloRanking, ...survRanking.slice(1, 6)], // 전체 검색 대상 풀 allPlayers: [me, ...soloRanking, ...survRanking, ...friends], fmt: (n) => n.toLocaleString('en-US'), kdPct: (kda) => Math.round((kda / (kda + 1)) * 100), };