NON-PRODUCTION

Mini Slot — tài liệu ghép client

Slot cổ điển 1 hàng × 3 cửa sổ. Thắng khi các symbol khớp từ trái sang phải. 3 Lucky7 = jackpot. Credit chip ngay mỗi spin. Trang này chỉ được serve khi ENVIRONMENT != production.

1. Tổng quan

MụcGiá trị
Grid1×3 — field reel là mảng 3 int (trái → phải)
PayKhớp liên tiếp từ cột 0. 2 giống = band 1, 3 giống = band 2. Hệ số từ paytable server
Jackpot3 Lucky7 (id 6). Credit ngay cùng response
Tiền−bet rồi +win trong cùng POST /spins. Không có pot / FS
Base path/api/v1
Vẫn gọi GET /gameplay khi vào game để lấy bets + reel preview. GameInfo không có user_money — số dư lấy từ response spin (hoặc wallet chung).

2. Luồng ghép

  1. Vào game → GET /gameplay. Vẽ 3 cửa sổ từ init_reel (5 symbol preview; chỉ dùng 3 ô giữa hoặc map idle riêng).
  2. User chọn bet trong bets.
  3. POST /spins {"bet":...}. Animate 3 reel tới reel[0..2].
  4. Nếu có win_amount: highlight symbol khớp, hiện multiplier. is_jackpot → fanfare Lucky7.
  5. Cập nhật chip = user_money. Có thể poll history / top-win cho panel phụ.

3. Auth & envelope

Authorization: Bearer <access_token>
Content-Type: application/json

Mọi API dưới /api/v1 cần JWT. HTTP 200 + code = 0 thành công; payload trong msg.

{ "code": 0, "msg": { ... } }
codeÝ nghĩa
0OK
-1Unknown / JWT invalid (HTTP 401 nếu thiếu token)
-2Invalid input
69Wrong state — chưa /gameplay, bet không hợp lệ
1000Popup i18n

4. Reel & symbol

Ba cửa sổ lớn. Ô vàng = 3 Lucky7 jackpot.

7
7
7

Ví dụ thua (Cherry / Lemon / Orange):

🍒
🍋
🍊
idSymbolidSymbol
0Cherry4Bell
1Lemon5Bar
2Orange6Lucky7 (JP khi ×3)
3Grape

Server đếm khớp từ trái: reel[0] so với reel[1], reel[2]. number_of_symbols = số ô thêm (1 = hai giống, 2 = ba giống). Không khớp → các field win omit (omitempty).

5. GET /api/v1/gameplay

GET /api/v1/gameplay
FieldTypeClient dùng để
init_reelint[]Preview idle (server gửi 5 id mẫu, không phải kết quả spin)
betsint64[]Mức bet hợp lệ — chỉ gửi đúng 1 giá trị này
show_betsint64[]Giá trị hiển thị UI (cùng index)
betint64Bet đang chọn trên server
{
  "code": 0,
  "msg": {
    "init_reel": [0, 1, 2, 3, 4],
    "bets": [100, 500, 1000, 5000],
    "show_bets": [100, 500, 1000, 5000],
    "bet": 1000
  }
}

6. POST /api/v1/spins

POST /api/v1/spins
{ "bet": 1000 }

Trừ bet ngay, cộng win (nếu có) trong cùng response. Field win dùng omitempty — thua thì không có win_amount / symbol / multiplier / is_jackpot.

FieldTypeÝ nghĩa
user_moneyint64Chip sau −bet +win
win_amountint64?Chip thắng (omit nếu 0)
betint64Bet vừa dùng
reelint[3]3 symbol kết quả
number_of_symbolsint?Số ô khớp thêm (1 hoặc 2)
symbolint?Symbol thắng (id 0–6)
multiplierfloat?Hệ số × bet = win
is_jackpotbool?true khi 3 Lucky7

Thắng thường

{
  "code": 0,
  "msg": {
    "user_money": 502000,
    "win_amount": 3000,
    "bet": 1000,
    "reel": [4, 4, 4],
    "number_of_symbols": 2,
    "symbol": 4,
    "multiplier": 3
  }
}

Jackpot 3 Lucky7

{
  "code": 0,
  "msg": {
    "user_money": 1500000,
    "win_amount": 1000000,
    "bet": 1000,
    "reel": [6, 6, 6],
    "number_of_symbols": 2,
    "symbol": 6,
    "multiplier": 1000,
    "is_jackpot": true
  }
}

Thua

{ "code": 0, "msg": { "user_money": 499000, "bet": 1000, "reel": [0, 1, 2] } }

7. GET /api/v1/top-win

GET /api/v1/top-win
FieldÝ nghĩa
winners[].rankHạng 1-based
user_id / usernameNgười chơi
total_winTổng lãi (win − bet) trên bảng xếp hạng
{
  "code": 0,
  "msg": {
    "winners": [
      { "rank": 1, "user_id": 1001, "username": "meo", "total_win": 880000 },
      { "rank": 2, "user_id": 1002, "username": "lan", "total_win": 210000 }
    ]
  }
}

8. GET /api/v1/spins-history

GET /api/v1/spins-history
FieldÝ nghĩa
spins[].user_moneyChip sau spin
win_amount / bet / reelKết quả
multiplier / is_jackpotHệ số / JP
created_atUnix seconds
{
  "code": 0,
  "msg": {
    "spins": [
      { "user_money": 502000, "win_amount": 3000, "bet": 1000, "reel": [4,4,4], "multiplier": 3, "is_jackpot": false, "created_at": 1710000000 }
    ]
  }
}

9. GET /api/v1/jackpots-history

GET /api/v1/jackpots-history
FieldÝ nghĩa
jackpots[].timeUnix seconds
user_id / usernameNgười nổ
bet / win_amount / reelCược, tiền JP, 3 Lucky7
{
  "code": 0,
  "msg": {
    "jackpots": [
      { "time": 1710000100, "user_id": 1001, "username": "meo", "bet": 1000, "win_amount": 1000000, "reel": [6,6,6] }
    ]
  }
}

10. Animation

  1. Lock nút spin tới khi nhận response.
  2. Quay 3 cửa sổ; dừng lần lượt trái → phải đúng reel[i].
  3. Thắng: highlight number_of_symbols + 1 ô đầu. Cộng counter = win_amount.
  4. is_jackpot: overlay Lucky7, không cần poll thêm — chip đã trong user_money.

11. Cheat (chỉ non-prod / cheater)

Body reels là 3 cột, mỗi cột 1 symbol (handler flatten thành [s0,s1,s2]):

{ "bet": 1000, "reels": [[6], [6], [6]] }

Production bỏ qua, luôn random.

12. Error & tiền

Tình huốngHành vi client
HTTP 401Relogin
code 69GET /gameplay, kiểm tra bet ∈ bets
code 1000Popup i18n
code -1 khi spinHết tiền / lỗi — đừng trừ chip local
HTTP 400 blockedUser đang room PvP khác
Mỗi spin: −bet rồi +win_amount (nếu có) trong cùng response. Không có free-spin pot.

13. Checklist client