게임 시스템

게임 내 상점: 진열대, 상품, 가격

iDos Games의 준비된 상점이 작동하는 방식: 상품이 바뀌는 진열대, 게임 재화나 실제 돈으로 매기는 가격, 무료 선물, 구매 한도, 그리고 대시보드에서 코드 없이 설정하는 방법.

상점은 준비된 시스템입니다. 게임 속 상점 화면과 서버의 구매 로직이 함께 들어 있습니다. 진열대와 상품은 대시보드에서 설정하고, 구매할 때마다 서버가 가격, 한도, 교체를 직접 확인합니다. 게임에서 구매를 조작할 수 없고, 상점에 내 서버가 필요 없습니다.

플레이어가 보는 것

  • 탭으로 된 진열대. 진열대의 첫 섹션은 캐러셀이고, 나머지는 카드 그리드입니다.
  • 받을 때까지 빛나는 무료 일일 선물.
  • 카드의 타이머: "갱신까지", "오픈까지", "품절".
  • 구매 확인 창(휴대폰에서는 하단 시트).
  • "획득" 애니메이션: 보상이 잔액 카운터로 날아갑니다.
  • 무료 상품이 기다릴 때 상점 탭의 배지.
상점
12 450
320
일일1
재화
팩
오늘의 특가 15:40:12 후 갱신
오늘의 선물
무료
영웅의 검
1 200
장비 상자
90
품절
코인 500
$0.99
최고 가성비코인 1 200
$1.99
첫 구매 x2
진열대는 탭이고, 배지는 받을 무료 상품 수입니다.
교체 타이머: 시간이 다 되면 서버가 슬롯의 상품을 바꿉니다.
무료 오늘의 선물은 받을 때까지 빛납니다.
‘품절’: 이 기간의 한도를 다 썼습니다.
리본과 첫 구매 보너스는 상품 설정에서 옵니다.
예시. 플레이어가 보는 상점 화면, 기본 디자인. 디자인은 src/ui.config.ts에서 바꿉니다.

상점의 구조

상점은 트리입니다: 진열대 → 섹션 → 슬롯 → 상품.

  • 상품: 파는 것. 가격, 보상, 한도, 리본("최고 가성비", "x2"). 상품은 하나의 카탈로그에 있습니다.
  • 슬롯: 진열대 선반의 자리. 상품은 슬롯을 통해서만 살 수 있고, 어느 슬롯에도 없는 상품은 전혀 팔리지 않습니다.
  • 교체: 슬롯은 풀에서 상품을 보여 주고 일정에 따라 바꿀 수 있습니다. 오늘의 상점처럼요. 교체는 서버가 계산하므로 플레이어는 어느 기기에서나 같은 상점을 봅니다.
진열대‘오늘의 상점’
섹션‘오늘의 특가’
슬롯
슬롯 1: 항상 오늘의 선물
슬롯 2: 상품 6개 중 하나, 24시간마다 새로
슬롯 3: 기간이 열릴 때까지 비어 있음
상품 카탈로그가격, 보상, 한도
슬롯에 없는 상품은 판매되지 않습니다
예시. 대시보드에서 상점 진열대를 구성하는 방법: 상품은 슬롯을 통해서만 판매됩니다.

가격

플레이어가 내는 것작동 방식
게임 재화, 아이템플레이어 잔액에서 차감
실제 돈앱 스토어 구매, 서버가 영수증 확인
광고 시청플레이어가 얻은 광고 시청 횟수를 사용(광고가 있는 빌드)
없음무료 상품. 한도가 필수이며, 없으면 서버가 팔지 않음

취소선이 그어진 "이전" 가격을 보여 줄 수 있고, 할인율은 서버가 계산합니다. 상품 하나에 여러 가격 옵션을 둘 수도 있습니다. 예를 들어 코인 또는 보석.

구매 한도

  • 평생: 예를 들어 스타터 팩은 한 번.
  • 하루: UTC 자정에 초기화.
  • 쿨다운: 정해진 시간이 지나야 다음 구매.
  • 교체 기간당: 이 상품이 선반에 있는 동안의 슬롯 한도.

"첫 구매"와 "품절" 표시와 타이머는 서버가 플레이어마다 계산합니다.

단계 01프로젝트에 상점 추가하기

방치형 RPG 템플릿에는 예시 진열대가 있는 상점이 이미 있습니다. 다른 프로젝트에서는 AI 코더가 추가합니다. 채팅에 "상점 추가해 줘"라고 쓰세요. 상점을 처음부터 쓰지 않고 준비된 시스템을 설치합니다. 상점 탭은 팔 것이 생기면 플레이어에게 보입니다.

단계 02상품과 진열대 설정하기

대시보드를 열고 프로젝트를 고른 뒤 라이브 운영 → v2 → 상점으로 가세요.

  • 상품 탭에서 상품을 만드세요: 이름, 가격, 플레이어가 받는 것, 한도.
  • 진열대 탭에서 진열대를 만들고, 섹션과 슬롯을 추가하고, 상품을 슬롯에 넣으세요.
  • 프리셋은 여러 상품에 한 번에 적용할 수 있는 공용 설정입니다.

대시보드는 슬롯 없는 상품과 한도 없는 무료 상품을 경고합니다. 페이지의 AI 버튼은 어시스턴트를 엽니다. 팔 것을 설명하면("0.99달러에 코인 500개 팩과 무료 일일 상자") 변경을 제안하고, 확인한 뒤 저장을 누르면 됩니다.

단계 03테스트하고 출시하기

앱의 테스트 버전에서 상점을 확인하세요. 설정은 별도 작업으로 라이브 앱에 보내지므로 코드 출시가 설정을 덮어쓰지 않습니다. 자세한 내용은 공개와 링크에 있습니다.

개발자용

상점은 @idosgames/core의 client.store로 작동합니다. 화면은 getStorefront()로 그리세요. 이 플레이어에 맞게 이미 계산된 진열대(교체, 한도, 타이머)입니다. getDefinitions()는 모두에게 같은 설정일 뿐입니다.

TypeScript
const res = await client.store.getStorefront()
if (!res.ok) return showError(res.error)

for (const store of res.data.Stores ?? [])
  for (const section of store.Sections ?? [])
    for (const slot of section.Slots ?? []) {
      // 빈 슬롯은 Offer === null로 옵니다: 선반이 튀지 않도록 빈 틀을 그리세요.
      if (!slot.Offer) continue
      drawCard(slot.Offer, slot.RefreshesAtUtc)
    }

const buy = await client.store.purchase(offer.OfferID, 1, {
  selectedOptionID: option.OptionID,
  slot: { storeID: store.StoreID, sectionID: section.SectionID, slotID: slot.SlotID },
})
  • 구매가 OFFER_NOT_IN_ROTATION을 돌려주면 진열대가 바뀐 것입니다. 오류를 보여 주지 말고 다시 불러오세요.
  • 요청이 진행되는 동안 "구매" 버튼을 끄세요. purchase 호출 하나하나가 별개의 구매입니다.
  • 타이머는 기기 시계가 아니라 응답의 ServerTimeUtc에서부터 세세요.
  • 남은 한도의 null은 "한도 없음", 0은 "품절"입니다.

모든 필드는 SDK의 MCP 서버가 제공하는 store-system 스킬에 설명되어 있습니다.

자주 묻는 질문

상품이 카탈로그에 있는데 왜 살 수 없나요?

상품은 진열대 슬롯을 통해서만 살 수 있습니다. 어느 슬롯에도 없으면 전혀 살 수 없습니다. 대시보드는 이런 상품을 "어느 진열대에도 없음" 경고 아래 따로 보여 줍니다.

무료 일일 선물을 만들 수 있나요?

네. 가격이 없는 상품은 평범한 무료 상품이지만, 하루 한 번처럼 한도가 있어야 합니다. 서버는 한도 없는 무료 상품을 팔지 않습니다.

내 서버에서 구매를 검증해야 하나요?

아니요. iDos Games 서버가 구매마다 가격, 한도, 교체를 확인합니다. 게임은 진열대를 보여 주고 구매를 요청할 뿐입니다.

프리미엄 할인이 적용되나요?

네. 서버가 프리미엄 등급의 할인과 보너스를 알아서 적용합니다. 실제로 차감되고 지급된 것은 게임이 구매 응답에서 읽습니다.

함께 보기

나만의 게임을 만드세요

아이디어를 한 문장으로 설명하면 AI 코더가 만들어 주고, 게임은 고유 링크로 바로 공개됩니다.