Slot Megaways cố định 5 cột × 4 hàng. Tumble cascade, multiplier tăng theo lượt nổ. 3 scatter = 12 free spin. Không jackpot, không mua bonus. Client nói HTTP JSON với server game. Trang này chỉ được serve khi ENVIRONMENT != production.
1. Tổng quan
Mục
Giá trị
Grid
5 cột × 4 hàng. reels[col][row], row 0 = trên. Mỗi ô là packed int: 4 bit thấp là symbol id, bit 4 là golden
Pay
Megaways trái → phải, tối thiểu 3 cột. Wild (8) thay paying symbol, không thay Scatter (9)
Ways
Tích số ô khớp mỗi cột liên tiếp. Board đầy = 4^5 = 1024 ways
Scatter
≥3 trên board sau mọi tumble → 12 FS. Trong FS không rơi scatter, không retrigger
Multiplier
Mỗi spin bắt đầu ×1. Base: 1→2→3→4→5. FS: 1→2→4→6→8→10
Không có
Jackpot, buy bonus, mallet, top reel, size symbol
Base path
/api/v1
Session in-memory. Bắt buộc GET /api/v1/gameplay trước khi spin. Reconnect đọc lại mini_game_type / FS từ /gameplay.
2. Luồng ghép
Vào game → GET /gameplay. Render board preview 5×4, bet, paytable, FS nếu đang dở.
Base: POST /spins{"bet":...}. Play tuần tự win_result[].
Dùng symbol để chọn sprite và isGolden để vẽ khung/hiệu ứng vàng. Không so sánh trực tiếp packed value với id, ví dụ dùng unpackSymbol(cell).symbol === 8 thay vì cell === 8.
mini_game_type: 0 base · 1 free spin. Dùng pay_table từ /gameplay, đừng hardcode. pay_table[symbol][n-1] = hệ số khi ăn n cột (n ≥ 3 mới > 0).
5. Multiplier
Mỗi spin (kể cả FS) bắt đầu multiplier = 1. Lượt nổ sau nhân với multiplier của lượt trước. Tăng sau tumble thắng.
Mode
Chuỗi (tumble 1, 2, 3…)
Max
Base
×1, ×2, ×3, ×4, ×5
5
Free spin
×1, ×2, ×4, ×6, ×8, ×10
10
win_result[i].multiplier = hệ số áp vào win của tumble đó.
bonus_multiplier = số vừa tăng để dùng tumble sau (0 nếu tumble không thắng).
Không cộng dồn giữa các spin FS — mỗi FS spin reset về ×1.
6. GET /api/v1/gameplay
Gọi 1 lần khi vào game. Thiếu bước này thì spin trả code 69.
Trigger FS: is_bonus_free_spin = true, number_of_bonus_free_spins = 12, mini_game_type = 1. Scatter không biến mất khi tumble (không thuộc pay line).
8. Animation / tumble
Vẽ win_result[i].reels (5×4, row 0 trên).
Highlight positions / từng lines. Hiện multiplier của bước.
Ô thắng thường biến mất. Ô thắng có isGolden = true phải animate thành Wild (id 8), không biến mất. Sau đó gravity theo cột; board mới = phần tử tiếp theo — đừng tự random.
5 cột × 4 hàng. Có thể gửi symbol id thô 0–9 hoặc packed value từ packSymbol để test golden, ví dụ packSymbol(0, true) = 16. Ô trống / thiếu → server random. Production bỏ qua reels.
10. Error & tiền
Tình huống
Hành vi client
HTTP 401
Token hết hạn — relogin
code 69
GET /gameplay lại, sync state, đừng spam spin
code 1000
Popup msg (string i18n)
code -1 khi spin
Hết tiền hoặc lỗi nội bộ — refresh qua /gameplay
Spin khi user đang room PvP khác
HTTP 400 body "blocked"
Event
Chip
Base spin
−bet ngay; +win cùng response
FS giữa chừng
Không đổi chip. Tăng free_spin_pot
FS kết thúc
+pot vào user_money
11. Checklist client
GET /gameplay trước mọi spin.
Grid 5×4 dùng packed symbol; unpack trước khi chọn sprite, và render cờ golden. Không top reel / mallet / jackpot / buy.
Play tuần tự win_result. Bet chỉ giá trị trong bets.
3 scatter → đúng 12 FS. Trong FS không vẽ scatter.
Multiplier reset mỗi spin; base max 5, FS max 10.
FS line win vào pot. Không gọi song song 2 request cho 1 user.