Files
2nd/10_Wiki/Topics/Game_Design/Sector-Breach-Store.md
T
2026-05-10 22:08:15 +09:00

5.9 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
id title category status canonical_id aliases duplicate_of source_trust_level confidence_score verification_status tags raw_sources last_reinforced github_commit tech_stack
wiki-2026-0508-sector-breach-store Sector Breach Store 10_Wiki/Topics verified self
Breach Store
Event Currency Store
Sector Event Shop
none A 0.9 applied
game-design
monetization
event-economy
war-commander
liveops
2026-05-10 pending
language framework
typescript liveops-store

Sector Breach Store

매 한 줄

"매 event currency 의 최고 sink 는 매 limited-time store 다.". Sector Breach Store 는 War Commander 류 sector-event 의 핵심 reward delivery 메커니즘 — event 동안 earned breach token 을 매 limited-time exclusive item 으로 redeem 하는 store. 매 2026 LiveOps 에서 dual-currency (free token + paid premium token) 디자인 + scarcity timer + tier-locked stock 의 표준 패턴.

매 핵심

매 Store Anatomy

  • Currency: breach token (event-specific, decays after event end)
  • Stock tiers: common (unlimited) / rare (limited per player) / mythic (limited globally)
  • Refresh cadence: rotating featured slots every 24h
  • Decay rule: unused token → converted at fixed ratio or expired

매 Monetization Lever

  • 매 paid premium token bundle = 매 fast-track to mythic stock
  • 매 store-only skin = collector retention
  • 매 last-day surge: 매 event final 24h 의 매출 peak (FOMO)
  • 매 alliance discount: 매 social engagement gate

매 응용

  1. War Commander: sector breach event store.
  2. Mobile Strike: faction war supply depot.
  3. Clash Royale: clan war shop.
  4. Brawl Stars: ranked season shop.

💻 패턴

Pattern 1 — Store catalog schema

interface BreachStoreItem {
  id: string;
  rarity: 'common'|'rare'|'mythic';
  costToken: number;
  costPremiumToken?: number;
  stockGlobal?: number;
  stockPerPlayer?: number;
  startsAt: number;
  endsAt: number;
}

Pattern 2 — Purchase transaction

async function purchase(playerId: string, itemId: string, useTokenType: 'free'|'premium') {
  return await db.transaction(async tx => {
    const item = await tx.fetchItem(itemId);
    const player = await tx.fetchPlayer(playerId);
    if (Date.now() > item.endsAt) throw new Error('EVENT_ENDED');
    const cost = useTokenType === 'premium' ? item.costPremiumToken! : item.costToken;
    const balance = useTokenType === 'premium' ? player.premiumToken : player.token;
    if (balance < cost) throw new Error('INSUFFICIENT_TOKEN');
    if (item.stockPerPlayer && player.purchases[itemId] >= item.stockPerPlayer)
      throw new Error('PER_PLAYER_LIMIT');
    if (item.stockGlobal !== undefined) {
      const remaining = await tx.decrementStock(itemId);
      if (remaining < 0) throw new Error('SOLD_OUT');
    }
    await tx.deductToken(playerId, cost, useTokenType);
    await tx.grantItem(playerId, itemId);
    return { ok: true };
  });
}
function selectFeaturedSlots(catalog: BreachStoreItem[], rng: RNG, count = 4): BreachStoreItem[] {
  const eligible = catalog.filter(i => i.rarity !== 'common');
  return weightedSample(eligible, count, i => RARITY_WEIGHT[i.rarity], rng);
}

Pattern 4 — Token decay on event end

async function settleEventEnd(eventId: string) {
  const players = await fetchEventParticipants(eventId);
  for (const p of players) {
    const leftover = p.token;
    const refunded = Math.floor(leftover * 0.1); // 매 10% conversion to permanent currency
    await grantPermanentCurrency(p.id, refunded);
    await zeroEventToken(p.id, eventId);
  }
}

Pattern 5 — FOMO surge banner

function shouldShowSurgeBanner(now: number, eventEndsAt: number): boolean {
  const hoursLeft = (eventEndsAt - now) / 3600000;
  return hoursLeft <= 24;
}

Pattern 6 — Anti-bot purchase rate-limit

const purchaseRate = new SlidingWindow({ windowMs: 60_000, max: 30 });
function checkPurchaseAllowed(playerId: string): boolean {
  return purchaseRate.tryAcquire(playerId);
}

Pattern 7 — Alliance discount

function applyAllianceDiscount(cost: number, alliance: Alliance): number {
  const tier = alliance.eventTier; // 매 alliance event participation tier
  const discount = ALLIANCE_DISCOUNT_TABLE[tier] ?? 0;
  return Math.ceil(cost * (1 - discount));
}

매 결정 기준

상황 Approach
New event launch Conservative stock, observe purchase telemetry
Repeat seasonal event Rotate skins, keep core items consistent
Whale-targeted Add premium-only mythic tier
F2P-friendly Generous token earn rate, no premium gate on rare tier

기본값: dual-currency, mythic stock global limit 1000, 24h featured rotation, 10% leftover-token conversion.

🔗 Graph

🤖 LLM 활용

언제: event store catalog design, currency decay rule 검토, FOMO surge 분석. 언제 X: persistent metagame store (event currency 부적합).

안티패턴

  • No decay rule: event 후 token 영구화 → 매 future event 의 currency 가치 dilute.
  • Premium-only mythic: f2p 의 ceiling 명확화 → 신규 유저 churn.
  • No stock cap: scarcity 효과 사라짐 → 매출 떨어짐.
  • Hidden cost change mid-event: trust 파괴 → community backlash.

🧪 검증 / 중복

  • Verified (Kixeye War Commander event docs, GDC LiveOps talks 2023-2025).
  • 신뢰도 A.

🕓 Changelog

날짜 변경
2026-05-08 Phase 1
2026-05-10 Manual cleanup — store anatomy + 7 patterns + transaction flow