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ụcGiá trị
Grid5 cột × 3 hàng · reels[col][row], row 0 = trên
PayPayline (~20 line). Wild (12) thay thế paying symbol
ScatterSymbol 13. number_of_scatter_cols + scatter_win_amount
BonusSymbol 11. Trigger Fruit Basket / Fruit Rain
game_type0 NormalSpin · 1 FruitBasket · 2 FruitRain
Jackpotmini / minor / major / grand — GET /jackpot
FSPot 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

  1. Vào game → GET /gameplayGET /jackpot. Render board, bet, jackpot meters.
  2. POST /spins với bet trong bets. Highlight win_lines.
  3. Nếu is_fruit_basket_game → khóa spin, gọi POST /fruit-basket.
  4. Nếu is_fruit_rain_game (từ spin hoặc sau basket) → loop POST /fruit-rain tới is_finished.
  5. FS: không trừ bet, win vào pot; credit khi is_finish_free_spin.
  6. Cập nhật jackpot UI từ field jackpot trê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
0OK
-1Unknown / JWT invalid (HTTP 401 nếu thiếu token)
-2Invalid input
69Wrong state — chưa /gameplay, đang MG/FS
1000Popup 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.

idSymbol
0–3Low
4–7Mid
8–10High
11Bonus — Fruit Basket / Rain
12Wild
13Scatter

5. GET /api/v1/jackpot

GET /api/v1/jackpot
FieldTypeÝ nghĩa
miniint64Meter mini
minorint64Meter minor
majorint64Meter major
grandint64Meter grand
betint64Bet 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
FieldTypeClient dùng để
init_reelsint[5][3]Board preview idle
user_moneyint64Chip
bet / bets / show_betsint64 / []Bet UI
pay_tablefloat[][]Bảng trả thưởng
game_typeint0 base · 1 basket · 2 rain
is_free_spinboolRestore FS UI
free_spins / max_free_spinsintThanh FS
free_spin_potint64Pot chưa credit
fruit_rain_infoobject?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 }
FieldTypeÝ nghĩa
user_moneyint64Chip sau response
win_amountint64Win spin (FS giữa chừng chưa credit chip)
betint64Bet server dùng
number_of_bonus_free_spinsint+N FS popup
is_free_spin / free_spins / max_free_spinsState FS
free_spin_potint64Pot
is_finish_free_spinboolCredit pot
win_linesWinLine[]Payline thắng
reelsint[5][3]Board sau spin
is_fruit_basket_gameboolPhải gọi /fruit-basket
is_fruit_rain_gameboolPhải loop /fruit-rain
number_of_scatter_colsintSố cột có scatter
scatter_win_amountint64Win scatter
jackpot{mini,minor,major,grand,bet}Meter sau spin

WinLine

FieldÝ nghĩa
win_amountChip của line
lineMảng symbol trên line
line_numberIndex payline
symbolPaying symbol
number_of_symbolsSố ô 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
FieldTypeÝ nghĩa
game_typeintMode sau basket (thường 2 = rain hoặc FS)
fruit_rain_multiplierintHệ số rain được seed
fruit_rain_spinsintSố lượt rain
number_of_bonus_free_spinsintNế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.

FieldTypeÝ nghĩa
user_moneyint64Chip (credit khi finish)
win_amountint64Win bước này / tổng tùy finish
betint64Bet
multiplierintHệ số rain hiện tại
spinsintLượt rain còn lại
is_finishedboolLoop tới khi true
rewardsReward[]Ô vừa rơi: row, col, multiplier, win_amount, jackpot
jackpot_win_amountint64Chip jackpot nếu trúng
is_grand_jackpotboolFanfare grand
is_fruit_rain_gameboolCò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

  1. Spin: vẽ reels, highlight từng win_lines[].line theo line_number.
  2. Hiện scatter win nếu scatter_win_amount > 0.
  3. Basket: animation chọn phần thưởng → đọc multiplier / spins / FS từ response.
  4. Rain: mỗi response overlay ô rewards[] (row/col). Cộng win_amount. Jackpot theo field jackpot trên reward (0 = không).
  5. FS: khóa bet; tin free_spins; credit chip khi is_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ốngHành vi client
HTTP 401Relogin
code 69GET /gameplay lại — có thể đang dở rain
code 1000Popup i18n
HTTP 400 blockedUser đang room PvP
EventChip
Base spin−bet; +win_amount
FS giữa chừngKhông đổi, tăng pot
FS / rain finish+pot / win vào user_money

13. Checklist client