Koin dan toko di dalam game
Koin adalah mata uang arcade. Satu saldo mengikuti pemain lintas game, jadi yang dia kumpulkan di game balapan bisa dibelanjakan di game puzzle. Gamemu tidak mencetak atau menyimpan koin; dia minta arcade yang memindahkannya.
Dari mana koin pemain datang
| Sumber | Aturan |
|---|---|
| Misi | Misi harian, mingguan, dan event yang bukan soal bermain (misalnya menonton iklan berhadiah), diklaim pemain |
| Hadiah harian | Streak yang tumbuh selama hari berturut-turut |
| Iklan berhadiah | Dikreditkan setelah jaringan iklan memverifikasi tayangannya |
| Papan peringkat | Dibayarkan saat papan mingguan ditutup, plus hadiah peringkat harian yang diklaim di dalam game |
| Pembelian | Paket koin yang dibeli dengan uang di aplikasi resmi |
Tidak ada satu pun tindakan gamemu yang memberi koin, dan bermain pun tidak dibayar: dari sebuah game, koin sampai ke pemain hanya lewat papan peringkatnya. Skor tinggi tidak membayar langsung; dia membayar saat masuk peringkat.
Menjual sesuatu dengan koin
Dua langkah: daftarkan daftar harganya, lalu panggil buy().
1. Daftarkan katalognya
Harga tinggal di server, tidak pernah di bundle-mu. Deklarasikan seluruh daftarnya lewat server MCP:
update_game(game: 'rosok-garage', shop: [
{ sku: 'engine_lv2', title: 'Mesin Lv2', coin_price: 800 },
{ sku: 'paint_gold', title: 'Cat emas', coin_price: 400 },
{ sku: 'fuel', title: 'Bensin', coin_price: 150, type: 'consumable' },
])
atau lewat Harness API kalau kamu menulis skripnya sendiri.
shop mengganti daftarnya sekaligus. Sku yang kamu tinggalkan dinonaktifkan, bukan dihapus, jadi pemain yang sudah
membelinya tetap punya nama untuk ditampilkan. Kolomnya:
| Kolom | Arti |
|---|---|
sku |
Id item, huruf, angka, _ dan -, unik di dalam satu game |
title |
Yang dilihat pemain di riwayat dompetnya |
coin_price |
Harga dalam koin, minimal 1 |
type |
non_consumable (dimiliki sekali, default) atau consumable (menumpuk jumlahnya) |
active |
Setel false untuk memensiunkan item tanpa mengeluarkannya dari daftar |
2. Beli dari dalam game
const { items } = await taploka.shop();
// [{ sku: 'engine_lv2', title: 'Mesin Lv2', coin_price: 800, type, owned: false, qty: 0 }]
try {
const { item, balance } = await taploka.buy('engine_lv2');
unlockEngine(item.sku);
showBalance(balance);
} catch (error) {
if (error.code === 'INSUFFICIENT_BALANCE') {
showTopUpHint();
}
}
Kamu mengirim sebuah sku dan tidak ada yang lain. Arcade membaca harganya dari katalog, memotong dompet, dan mencatat itemnya, semua dalam satu transaksi: pemotongan yang gagal tidak memberi apa pun, dan item yang diberikan sudah pasti dibayar.
3. Baca kepemilikan saat start-up
const { items } = await taploka.inventory(); // [{ sku, qty, granted_at }]
Lakukan ini, jangan percaya cloud save-mu. Save ditulis klien dan bisa diedit; inventori tidak. Pakai save untuk progres, inventori untuk kepemilikan.
Error yang perlu ditangani
error.code |
Kapan |
|---|---|
INSUFFICIENT_BALANCE |
Koin kurang. Tawarkan dompet arcade, jangan pura-pura pembeliannya berhasil |
ITEM_OWNED |
Item non-consumable yang sudah dia punya. Segarkan inventorimu |
ITEM_UNKNOWN |
Sku-nya tidak ada di katalog, atau sudah dinonaktifkan |
Percobaan ulang dan dobel tap
Setiap pembelian bersifat idempoten. Host melampirkan kunci untukmu, jadi permintaan yang timeout lalu diulang tetap dipotong sekali. Kalau kodemu sendiri bisa menembakkan pembelian yang sama dua kali, kirim kunci stabil buatanmu:
await taploka.buy('fuel', { key: `fuel-${runId}` });
Dua pembelian dengan kunci yang sama dihitung satu pemotongan. Item non-consumable ditolak dengan ITEM_OWNED apa pun
kuncinya, jadi dobel tap karena tidak sabar tidak akan pernah membayar dua kali.
Memotong tanpa item katalog
Untuk pemotongan yang bukan item terdaftar, potong langsung:
const { balance } = await taploka.spend(50, 'continue', { key: `continue-${runId}` });
reason adalah slug pendek yang ditampilkan di riwayat dompet. Pakai ini untuk konsumsi yang tidak bisa diwakili entri
toko, misalnya membayar untuk melanjutkan ronde. Dia tidak memberi apa pun, jadi apa yang dibeli pemain jadi urusanmu
untuk diingat. Utamakan buy() kalau cocok: hanya buy() yang mendapat harga sisi server dan catatan kepemilikan yang
tidak bisa diutak-atik.
Membaca saldo
const { balance, earned, spent } = await taploka.wallet();
Tampilkan kalau tokomu punya layar. Jangan cache lintas sesi: misi dan hadiah bisa mengkredit pemain saat dia masih bermain.
Apa yang kamu dapat, dan cara mencairkannya
Setiap koin yang dibelanjakan pemain di gamemu memberimu bagi hasil, 70% secara default, dikreditkan ke dompetmu sebagai berlian dalam transaksi yang sama dengan penjualannya, jadi sudah ada di sana sebelum animasi di layar pemain selesai. Membeli dari gamemu sendiri tidak membayar apa-apa: bagi hasilnya akan langsung kembali dan itemnya jadi gratis.
Panel developer-mu menampilkannya di Pendapatan: berapa yang sudah dibayarkan tiap game, berapa yang siap dicairkan, dan kursnya.
1.000 koin item → 700 berlian buat kamu → Rp1.400 dengan kurs Rp2 per berlian
Pencairan adalah permintaan yang diproses administrator secara manual. Tidak ada transfer otomatis:
- Kamu mengajukan sejumlah nominal, minimal batas bawahnya (50.000 berlian secara default), dengan rekening bank atau e-wallet.
- Berliannya langsung keluar dari dompetmu. Penahanan itulah yang mencegah saldo yang sama diajukan dua kali.
- Admin melakukan transfernya dan menandai lunas, atau menolaknya. Penolakan mengembalikan berliannya langsung.
Dua aturan yang perlu kamu tahu sebelum merencanakan sesuatu di atasnya:
- Hanya berlian yang bisa dicairkan. Koin yang kamu beli, menangkan dari misi, atau kumpulkan dari main boleh kamu belanjakan, tapi tidak bisa dijual balik. Arcade membeli kembali apa yang dia bayarkan ke kamu, tidak lebih.
- Berlian bukan koin. Saldonya terpisah dari koinmu dan tidak bisa dibelanjakan di game mana pun: hanya bisa dicairkan atau dipakai mendanai kampanye klip. Gaji moderator dan bayaran klip TikTok juga masuk sebagai berlian.
Kursnya ditentukan arcade dan disalin ke tiap permintaan saat kamu mengajukannya, jadi perubahan kurs tidak pernah menghargai ulang pencairan yang sudah menunggu.
Tamu
Pemain yang belum masuk tetap mengumpulkan dan membelanjakan seperti biasa, dan semua yang dia beli pindah ke akunnya begitu dia mendaftar. Jangan kunci toko di balik login. Yang tidak bisa dilakukan tamu adalah masuk papan peringkat dan membeli paket koin dengan uang.