NON-PRODUCTION
Inca — tài liệu ghép client
Payline slot 5×3, scatter / wild, free spins pot. Giữa FS không trừ bet; credit chip khi
is_finish_free_spin. Trang này chỉ được serve khi ENVIRONMENT != production.
1. Tổng quan
| Mục | Giá trị |
|---|---|
| Grid | 5 cột × 3 hàng · reels[col][row], row 0 = trên |
| Pay | Payline. Wild (11) thay thế paying symbol; line có thể tách symbol-win / wild-win |
| Scatter | Symbol 12. Đếm theo cột: number_of_scatter_cols |
| Scatter pay | 2 cột → ~2× (theo payline), 3 cột → ~5× — lấy scatter_win_amount, đừng hardcode |
| FS | Đủ scatter cột → is_bonus + number_of_bonus_free_spins |
| Pot | Mid-FS không debit bet, không credit win; cả pot vào chip khi finish |
| Base path | /api/v1 |
Session in-memory. Client bắt buộc
GET /api/v1/gameplay trước spin.
Reconnect giữa FS: restore is_free_spin, free_spins, free_spin_pot.
2. Luồng ghép
- Mở game →
GET /gameplay. Render board preview, bet, paytable, money, FS nếu đang feature. - User chọn bet chỉ khi
is_free_spin = false. POST /spinsbody{"bet": ...}(giá trị trongbets).- Highlight từng
win_lines[]. Hiện scatter nếuscatter_win_amount > 0. - Nếu
is_bonus→ popup +N FS từnumber_of_bonus_free_spins. - Khi
is_free_spin: không trừ bet, tiếp tục/spinstớiis_finish_free_spin. - Luôn lấy số dư từ
user_moneycủa response vừa nhận.
3. Auth & envelope
Header
Authorization: Bearer <access_token> Content-Type: application/json
Mọi API dưới /api/v1 cần JWT. Trang docs không cần token.
Envelope
HTTP 200 + code = 0 là thành công. Payload nằm trong msg.
{
"code": 0,
"msg": { ... }
}
| code | Ý nghĩa |
|---|---|
0 | OK |
-1 | Unknown / thiếu JWT / token invalid |
-2 | Invalid input |
69 | Wrong state — chưa /gameplay, đang FS mà đổi bet |
1000 | Popup i18n |
4. Grid & symbol
Board luôn mảng cột. Demo: payline thắng + Wild + Scatter được highlight.
8
11
8
4
12
2
5
12
1
3
0
6
9
7
10
Hàng đầu = row 0. Ô vàng = payline High1 (8) với Wild (11, xanh lá). Ô vàng đậm = Scatter (12) trên 2 cột — đủ scatter pay / tiến tới FS.
| id | Symbol | Pay? |
|---|---|---|
| 0–3 | Low | Có |
| 4–7 | Mid | Có |
| 8–10 | High | Có |
| 11 | Wild | Thay thế paying; có thể tự pay (wild_win) |
| 12 | Scatter | Pay theo số cột + trigger FS |
Paytable & line win
Luôn dùng pay_table từ /gameplay. Mỗi win_lines[] tách:
symbol_win_amount— thắng của paying symbol (có wild thay thế).wild_win_amount— thắng nếu line được tính như cụm wild.symbol_win_multiplier— hệ số paytable đã apply.- Tổng line client highlight = không tự cộng; tin từng field, tổng spin nằm ở
win_amounttop-level.
5. GET /api/v1/gameplay
Gọi 1 lần khi vào game. Thiếu bước này thì POST /spins trả code 69.
GET /api/v1/gameplay
| Field | Type | Client dùng để |
|---|---|---|
user_money | int64 | Chip hiện tại |
bet | int64 | Bet server đang giữ |
bets | int64[] | Mức hợp lệ — chỉ gửi đúng 1 giá trị |
show_bets | int64[] | Hiển thị UI, cùng index với bets |
pay_table | float[][] | Bảng trả thưởng |
is_free_spin | bool | Restore FS UI, khóa đổi bet |
free_spins | int | Số lượt còn lại |
max_free_spins | int | Mốc thanh FS |
free_spin_pot | int64 | Tổng win chưa credit |
init_reels | int[5][3] | Board preview idle |
{
"code": 0,
"msg": {
"user_money": 500000,
"bet": 1000,
"bets": [200, 1000, 2000, 10000],
"show_bets": [200, 1000, 2000, 10000],
"pay_table": [[1,2,5],[1.5,3,8],[2,4,10],[2.5,5,12],[3,8,15],[4,10,20],[5,12,25],[8,15,40],[10,25,80],[15,40,100],[20,50,150]],
"is_free_spin": false,
"free_spins": 0,
"max_free_spins": 0,
"free_spin_pot": 0,
"init_reels": [[8,2,0],[11,5,6],[8,12,9],[4,1,7],[12,3,10]]
}
}
6. POST /api/v1/spins
POST /api/v1/spins
{ "bet": 1000 }
- Phải gọi
/gameplaytrước. - Base: trừ
betngay. FS: không trừ, vẫn gửibet(server bỏ qua đổi bet). reelschỉ cheat non-prod.
SpinResult
| Field | Type | Ý nghĩa |
|---|---|---|
user_money | int64 | Chip sau response |
win_amount | int64 | Base: đã credit. FS giữa: win spin (chưa chip). FS xong: cả pot |
bet | int64 | Bet server dùng |
is_bonus | bool | Spin này award FS |
number_of_bonus_free_spins | int | +N cho popup |
is_free_spin | bool | Spin vừa rồi nằm trong FS |
free_spins | int | Source of truth số lượt còn |
max_free_spins | int | Thanh progress |
free_spin_pot | int64 | Pot sau spin; 0 khi finish |
is_finish_free_spin | bool | Credit pot vào user_money |
win_lines | WinLine[] | Payline thắng |
reels | int[5][3] | Board sau spin |
number_of_scatter_cols | int | Số cột có ≥1 scatter |
scatter_win_amount | int64 | Win scatter (đã gồm trong tổng khi base) |
WinLine
| Field | Ý nghĩa |
|---|---|
line | Mảng 5 symbol trên payline |
line_number | Index payline |
symbol | Paying symbol của line |
number_of_symbols | Số ô khớp (kể wild thay) |
number_of_wilds | Số wild trên line |
symbol_win_amount | Chip thắng symbol |
wild_win_amount | Chip thắng wild-as-line |
symbol_win_multiplier | Hệ số paytable |
{
"code": 0,
"msg": {
"user_money": 499000,
"win_amount": 8500,
"bet": 1000,
"is_bonus": true,
"number_of_bonus_free_spins": 10,
"is_free_spin": false,
"free_spins": 10,
"max_free_spins": 10,
"free_spin_pot": 0,
"is_finish_free_spin": false,
"win_lines": [{
"line": [8, 11, 8, 4, 12],
"line_number": 0,
"symbol": 8,
"number_of_symbols": 3,
"number_of_wilds": 1,
"symbol_win_amount": 8000,
"wild_win_amount": 0,
"symbol_win_multiplier": 8
}],
"reels": [[8,2,0],[11,5,6],[8,12,9],[4,1,7],[12,3,10]],
"number_of_scatter_cols": 2,
"scatter_win_amount": 500
}
}
Spin trigger FS: is_bonus = true nhưng is_free_spin = false. Win spin này credit ngay (kể scatter). Các spin sau mới là FS.
7. Free spins
- Trigger khi đủ scatter cột (server quyết, client tin
is_bonus). - Số lượt =
number_of_bonus_free_spins(confignumber_of_free_spins). - Giữa FS:
is_free_spin = true, không trừ bet, win cộngfree_spin_pot. - Spin cuối:
is_finish_free_spin = true,win_amount= cả pot,user_moneyđã cộng,free_spin_pot = 0. - Retrigger:
is_bonustrong lúc FS → cộng thêm lượt, popup +N,free_spinstăng. - Khóa đổi bet suốt FS. Vẫn gửi bet hiện tại.
Source of truth số lượt là
free_spins. Popup +N dùng number_of_bonus_free_spins. Credit chip chỉ khi is_finish_free_spin.{
"code": 0,
"msg": {
"user_money": 520000, "win_amount": 21000, "bet": 1000,
"is_bonus": false, "number_of_bonus_free_spins": 0,
"is_free_spin": true, "free_spins": 0, "max_free_spins": 10,
"free_spin_pot": 0, "is_finish_free_spin": true,
"win_lines": [], "reels": [[1,2,3],[4,5,6],[7,8,9],[0,1,2],[3,4,5]],
"number_of_scatter_cols": 0, "scatter_win_amount": 0
}
}
8. Animation
- Vẽ
reels5×3, row 0 trên cùng. - Lần lượt highlight từng
win_lines[]theoline/line_number. - Wild (11): overlay riêng; nếu
wild_win_amount > 0play nhánh wild. - Scatter: đếm cột từ board hoặc tin
number_of_scatter_cols. Cộngscatter_win_amount. is_bonus→ popup FS rồi chuyển mode.- FS: counter
free_spins/max_free_spins, pot meter. Finish → cộng chip một lần.
Không tự tính win từ paytable. Mọi số chip lấy từ response. Paytable chỉ để vẽ bảng infomation.
9. Cheat (chỉ non-prod / cheater)
{
"bet": 1000,
"reels": [
[8, 2, 0],
[11, 5, 6],
[8, 12, 9],
[4, 1, 7],
[12, 3, 10]
]
}
- Đủ 5 cột, mỗi cột 3 hàng. Production: field bị bỏ qua, luôn random.
- Dùng để force wild + scatter trên board test.
10. Error & tiền
| Tình huống | Hành vi client |
|---|---|
| HTTP 401 | Token hết hạn / thiếu — relogin |
| code 69 | Gọi lại GET /gameplay, sync FS/bet, đừng spam spin |
| code 1000 | Hiện popup msg (string i18n) |
| code -1 khi spin | Hết tiền hoặc lỗi nội bộ — refresh money qua /gameplay |
| Spin khi user đang room PvP | HTTP 400 body "blocked" |
Khi nào chip đổi
| Event | Chip |
|---|---|
| Base spin | −bet ngay; +win_amount (line + scatter) nếu thắng |
| FS giữa chừng | Không đổi. Chỉ tăng free_spin_pot |
| FS kết thúc | +pot vào user_money |
11. Checklist client
- Vào game:
GET /gameplaytrước mọi spin. - Board luôn
[col][row], 5×3, row 0 = top. - Highlight theo
win_lines; wild/scatter overlay riêng. - Tin
number_of_scatter_cols+scatter_win_amount. - Bet chỉ gửi giá trị trong
bets. - FS: khóa bet; tin
free_spins; credit chip chỉ khiis_finish_free_spin. - Restore: nếu
/gameplaytrảis_free_spin, nhảy thẳng FS UI. - Không gọi song song 2 spin cho 1 user — đợi response + animation xong.