first commit
This commit is contained in:
@@ -0,0 +1,490 @@
|
||||
/* 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),
|
||||
};
|
||||
Reference in New Issue
Block a user