NON-PRODUCTION
Juicy Fruits — tài liệu ghép client
Payline slot 5×3 + minigame Fruit Basket / Fruit Rain và jackpot 4 cấp (mini / minor / major / grand).
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 (~20 line). Wild (12) thay thế paying symbol |
| Scatter | Symbol 13. number_of_scatter_cols + scatter_win_amount |
| Bonus | Symbol 11. Trigger Fruit Basket / Fruit Rain |
| game_type | 0 NormalSpin · 1 FruitBasket · 2 FruitRain |
| Jackpot | mini / minor / major / grand — GET /jackpot |
| FS | Pot giữa chừng, credit khi is_finish_free_spin |
| Base path | /api/v1 |
Session in-memory. Bắt buộc
GET /api/v1/gameplay trước spin.
Nếu reconnect giữa Fruit Rain, restore từ fruit_rain_info.
2. Luồng ghép
- Vào game →
GET /gameplayvàGET /jackpot. Render board, bet, jackpot meters. POST /spinsvới bet trongbets. Highlightwin_lines.- Nếu
is_fruit_basket_game→ khóa spin, gọiPOST /fruit-basket. - Nếu
is_fruit_rain_game(từ spin hoặc sau basket) → loopPOST /fruit-raintớiis_finished. - FS: không trừ bet, win vào pot; credit khi
is_finish_free_spin. - Cập nhật jackpot UI từ field
jackpottrên spin hoặc GET lại/jackpot.
3. Auth & envelope
Authorization: Bearer <access_token> Content-Type: application/json
Mọi API dưới /api/v1 cần JWT. Envelope HTTP 200 + code / 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, đang MG/FS |
1000 | Popup i18n |
4. Grid & symbol
Board chính 5×3 (trái) và overlay Fruit Rain cùng kích thước (phải) — rain cell hiện multiplier.
Base 5×3
8
12
8
4
13
2
5
9
1
3
0
11
6
7
10
Fruit Rain overlay
×2
·
MIN
·
×5
·
×3
·
·
·
·
·
×10
·
GRD
Ô vàng = payline thắng. 12 = Wild. 13 = Scatter. 11 = Bonus. Rain: ×N = multiplier, MIN/GRD = jackpot.
| id | Symbol |
|---|---|
| 0–3 | Low |
| 4–7 | Mid |
| 8–10 | High |
| 11 | Bonus — Fruit Basket / Rain |
| 12 | Wild |
| 13 | Scatter |
5. GET /api/v1/jackpot
GET /api/v1/jackpot
| Field | Type | Ý nghĩa |
|---|---|---|
mini | int64 | Meter mini |
minor | int64 | Meter minor |
major | int64 | Meter major |
grand | int64 | Meter grand |
bet | int64 | Bet gắn meter (nếu server trả) |
{
"code": 0,
"msg": { "mini": 12000, "minor": 45000, "major": 180000, "grand": 2500000, "bet": 1000 }
}
6. GET /api/v1/gameplay
GET /api/v1/gameplay
| Field | Type | Client dùng để |
|---|---|---|
init_reels | int[5][3] | Board preview idle |
user_money | int64 | Chip |
bet / bets / show_bets | int64 / [] | Bet UI |
pay_table | float[][] | Bảng trả thưởng |
game_type | int | 0 base · 1 basket · 2 rain |
is_free_spin | bool | Restore FS UI |
free_spins / max_free_spins | int | Thanh FS |
free_spin_pot | int64 | Pot chưa credit |
fruit_rain_info | object? | Restore rain: rewards[], win_amount, spins, multiplier |
{
"code": 0,
"msg": {
"init_reels": [[8,2,0],[12,5,11],[8,9,6],[4,1,7],[13,3,10]],
"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]],
"game_type": 0, "is_free_spin": false, "free_spins": 0, "max_free_spins": 0, "free_spin_pot": 0
}
}
7. POST /api/v1/spins
POST /api/v1/spins
{ "bet": 1000 }
| Field | Type | Ý nghĩa |
|---|---|---|
user_money | int64 | Chip sau response |
win_amount | int64 | Win spin (FS giữa chừng chưa credit chip) |
bet | int64 | Bet server dùng |
number_of_bonus_free_spins | int | +N FS popup |
is_free_spin / free_spins / max_free_spins | — | State FS |
free_spin_pot | int64 | Pot |
is_finish_free_spin | bool | Credit pot |
win_lines | WinLine[] | Payline thắng |
reels | int[5][3] | Board sau spin |
is_fruit_basket_game | bool | Phải gọi /fruit-basket |
is_fruit_rain_game | bool | Phải loop /fruit-rain |
number_of_scatter_cols | int | Số cột có scatter |
scatter_win_amount | int64 | Win scatter |
jackpot | {mini,minor,major,grand,bet} | Meter sau spin |
WinLine
| Field | Ý nghĩa |
|---|---|
win_amount | Chip của line |
line | Mảng symbol trên line |
line_number | Index payline |
symbol | Paying symbol |
number_of_symbols | Số ô khớp |
{
"code": 0,
"msg": {
"user_money": 499000, "win_amount": 2500, "bet": 1000,
"number_of_bonus_free_spins": 0, "is_free_spin": false, "free_spins": 0,
"max_free_spins": 0, "free_spin_pot": 0, "is_finish_free_spin": false,
"win_lines": [{ "win_amount": 2500, "line": [8,12,8,4,13], "line_number": 0, "symbol": 8, "number_of_symbols": 3 }],
"reels": [[8,2,0],[12,5,11],[8,9,6],[4,1,7],[13,3,10]],
"is_fruit_basket_game": true, "is_fruit_rain_game": false,
"number_of_scatter_cols": 1, "scatter_win_amount": 0,
"jackpot": { "mini": 12050, "minor": 45120, "major": 180400, "grand": 2500100, "bet": 1000 }
}
}
8. POST /api/v1/fruit-basket
Chỉ gọi khi is_fruit_basket_game = true. Body rỗng.
POST /api/v1/fruit-basket
| Field | Type | Ý nghĩa |
|---|---|---|
game_type | int | Mode sau basket (thường 2 = rain hoặc FS) |
fruit_rain_multiplier | int | Hệ số rain được seed |
fruit_rain_spins | int | Số lượt rain |
number_of_bonus_free_spins | int | Nếu basket award FS |
{
"code": 0,
"msg": { "game_type": 2, "fruit_rain_multiplier": 3, "fruit_rain_spins": 5, "number_of_bonus_free_spins": 0 }
}
Sau basket nếu vào rain: loop
/fruit-rain. Nếu award FS: quay về /spins trong free-spin mode.9. POST /api/v1/fruit-rain
POST /api/v1/fruit-rain
{ }
Cheat non-prod có thể gửi {"jackpot": 3} (0–3 = mini…grand). Production bỏ qua.
| Field | Type | Ý nghĩa |
|---|---|---|
user_money | int64 | Chip (credit khi finish) |
win_amount | int64 | Win bước này / tổng tùy finish |
bet | int64 | Bet |
multiplier | int | Hệ số rain hiện tại |
spins | int | Lượt rain còn lại |
is_finished | bool | Loop tới khi true |
rewards | Reward[] | Ô vừa rơi: row, col, multiplier, win_amount, jackpot |
jackpot_win_amount | int64 | Chip jackpot nếu trúng |
is_grand_jackpot | bool | Fanfare grand |
is_fruit_rain_game | bool | Còn trong rain |
{
"code": 0,
"msg": {
"user_money": 499000, "win_amount": 3000, "bet": 1000,
"multiplier": 3, "spins": 4, "is_finished": false,
"rewards": [
{ "row": 0, "col": 0, "multiplier": 2, "win_amount": 2000, "jackpot": 0 },
{ "row": 0, "col": 2, "multiplier": 0, "win_amount": 12050, "jackpot": 1 }
],
"jackpot_win_amount": 12050, "is_grand_jackpot": false, "is_fruit_rain_game": true
}
}
Không spin base khi
is_fruit_rain_game. Gọi /fruit-rain đến is_finished rồi mới mở spin.10. Animation / flow MG
- Spin: vẽ
reels, highlight từngwin_lines[].linetheoline_number. - Hiện scatter win nếu
scatter_win_amount > 0. - Basket: animation chọn phần thưởng → đọc multiplier / spins / FS từ response.
- Rain: mỗi response overlay ô
rewards[](row/col). Cộngwin_amount. Jackpot theo fieldjackpottrên reward (0 = không). - FS: khóa bet; tin
free_spins; credit chip khiis_finish_free_spin.
11. Cheat (chỉ non-prod)
{ "bet": 1000, "reels": [[8,2,0],[12,5,11],[8,9,6],[4,1,7],[13,3,10]] }
Fruit-rain cheat: {"jackpot": 4} force grand. Production luôn random.
12. Error & tiền
| Tình huống | Hành vi client |
|---|---|
| HTTP 401 | Relogin |
| code 69 | GET /gameplay lại — có thể đang dở rain |
| code 1000 | Popup i18n |
HTTP 400 blocked | User đang room PvP |
| Event | Chip |
|---|---|
| Base spin | −bet; +win_amount |
| FS giữa chừng | Không đổi, tăng pot |
| FS / rain finish | +pot / win vào user_money |
13. Checklist client
GET /gameplay(+/jackpot) trước mọi spin.- Board 5×3
[col][row]. is_fruit_basket_game→/fruit-basketrồi nhánh rain/FS.- Loop
/fruit-raintớiis_finished. - Restore rain từ
fruit_rain_info. - FS: khóa bet; credit khi
is_finish_free_spin. - Không spam song song 2 request gameplay.