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ục | Giá trị |
|---|---|
| Grid | 1×3 — field reel là mảng 3 int (trái → phải) |
| Pay | Khớp liên tiếp từ cột 0. 2 giống = band 1, 3 giống = band 2. Hệ số từ paytable server |
| Jackpot | 3 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
- 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). - User chọn bet trong
bets. POST /spins{"bet":...}. Animate 3 reel tớireel[0..2].- Nếu có
win_amount: highlight symbol khớp, hiện multiplier.is_jackpot→ fanfare Lucky7. - 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 |
|---|---|
0 | OK |
-1 | Unknown / JWT invalid (HTTP 401 nếu thiếu token) |
-2 | Invalid input |
69 | Wrong state — chưa /gameplay, bet không hợp lệ |
1000 | Popup i18n |
4. Reel & symbol
Ba cửa sổ lớn. Ô vàng = 3 Lucky7 jackpot.
7
7
7
Ví dụ thua (Cherry / Lemon / Orange):
🍒
🍋
🍊
| id | Symbol | id | Symbol |
|---|---|---|---|
| 0 | Cherry | 4 | Bell |
| 1 | Lemon | 5 | Bar |
| 2 | Orange | 6 | Lucky7 (JP khi ×3) |
| 3 | Grape |
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
| Field | Type | Client dùng để |
|---|---|---|
init_reel | int[] | Preview idle (server gửi 5 id mẫu, không phải kết quả spin) |
bets | int64[] | Mức bet hợp lệ — chỉ gửi đúng 1 giá trị này |
show_bets | int64[] | Giá trị hiển thị UI (cùng index) |
bet | int64 | Bet đ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.
| Field | Type | Ý nghĩa |
|---|---|---|
user_money | int64 | Chip sau −bet +win |
win_amount | int64? | Chip thắng (omit nếu 0) |
bet | int64 | Bet vừa dùng |
reel | int[3] | 3 symbol kết quả |
number_of_symbols | int? | Số ô khớp thêm (1 hoặc 2) |
symbol | int? | Symbol thắng (id 0–6) |
multiplier | float? | Hệ số × bet = win |
is_jackpot | bool? | 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[].rank | Hạng 1-based |
user_id / username | Người chơi |
total_win | Tổ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_money | Chip sau spin |
win_amount / bet / reel | Kết quả |
multiplier / is_jackpot | Hệ số / JP |
created_at | Unix 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[].time | Unix seconds |
user_id / username | Người nổ |
bet / win_amount / reel | Cượ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
- Lock nút spin tới khi nhận response.
- Quay 3 cửa sổ; dừng lần lượt trái → phải đúng
reel[i]. - Thắng: highlight
number_of_symbols + 1ô đầu. Cộng counter =win_amount. is_jackpot: overlay Lucky7, không cần poll thêm — chip đã tronguser_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ống | Hành vi client |
|---|---|
| HTTP 401 | Relogin |
| code 69 | GET /gameplay, kiểm tra bet ∈ bets |
| code 1000 | Popup i18n |
| code -1 khi spin | Hết tiền / lỗi — đừng trừ chip local |
HTTP 400 blocked | User đ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
- Vào game: GET /gameplay. Bet chỉ gửi giá trị trong
bets. - Vẽ đúng 3 cửa sổ từ
reel(int 0–6). - Omit field = thua — đừng hiện 0× giả.
- Jackpot khi
is_jackpot(3× Lucky7), credit ngay. - Không gọi song song 2 spin cho 1 user.