NON-PRODUCTION
Sicbo — tài liệu ghép client
Mini-game 3 xúc xắc. Cược cửa Big / Small. Có leaderboard, history, sessions, logs trên cùng WS. Envelope lobby game_event; payload bàn proto sicbo_event. Frame binary, không JSON.
1. Tổng quan
| Mục | Giá trị |
|---|---|
| Connect | GET /ws?access_token=<JWT> trên domain game |
| Lobby | internal/proto/game-event · package game_event |
| Gameplay | package sicbo_event trong data_send.data |
| Side | Big=0 (tổng ≥ 11) · Small=1 (tổng < 11) |
| Dice | 3 mặt 1–6. score = tổng. UI có thể hiện even/odd từ tổng, cửa cược API chỉ Big/Small |
| Money | Echo bet trả user_money ngay. Finish: win_amount = win_bet_amount + returned_amount |
| 1 user | Một connection. Duplicate → lobby 102 |
State: Pending=0 · Countdown=1 · DealTime=2 · ShowdownTime=3 · BetTime=4.
2. Demo xúc xắc
4
5
6
score = 15 · win_side = Big
EVEN
ODD
BIG ≥11
SMALL <11
Chip vàng = cửa API thắng. Even/Odd là hiển thị tổng (15 lẻ) — không gửi trong RequestBet.side.
3. WS envelope (đầy đủ)
Frame binary protobuf. Handshake: 0 closed · 1 other device playing · 2 too many conn · 4 token expired · 5 banned.
GET /ws?access_token=<JWT> // domain game sicbo
game_event.Request.data_send { room_id: 7 data: <bytes sicbo_event.Request> }
game_event.Response.game_message { room_id: 7 data: <bytes sicbo_event.Response> }
game_message còn user_joined / user_left / start_countdown / start_game / reset_game / auto_leave.4. Lobby C→S / S→C
| C→S | Field |
|---|---|
room_config | → room_types, play_now, best_choice, disable_* |
get_room_list | bet |
create_room | bet, password, max_players, name |
join_room | room_id, password, is_viewer |
join_any_room | bet, max_players |
leave_room | room_id |
find_room | room_id |
invite | room_id, password, user_id |
free_users_list | bet |
send_chat_message | room_id, message, to[], is_private_chat |
data_send | room_id + bytes game hoặc auto_leave |
| S→C | Field |
|---|---|
room_config / room_list | sảnh / danh sách bàn |
game_message | payload bàn |
error | code + tag |
chat_message | chat |
invite / someone_invited_you | mời |
5. Gameplay proto sicbo_event
C→S Request (oneof)
| Message | Field | Ghi chú |
|---|---|---|
bet TagBet=1 | side, bet_amount | Echo + user_money + total_side_bet |
leaderboard | — | Top win ngày |
history | — | Lịch sử cược của mình |
sessions | — | Danh sách phiên |
logs | — | Lịch sử cửa thắng + current_session |
session_commands | session, side, from, to | Tối đa 100 lệnh / page |
room_state / last_messages | — | Sync / chat cũ |
cheat | dices[] | Non-prod |
Request { bet { side: Big bet_amount: 5000 } }
Request { session_commands { session: 8821 side: Big from: 0 to: 50 } }
S→C ResponseBet (echo ngay khi cược)
| Field | Ý nghĩa |
|---|---|
user_id, side, bet_amount | Ai cược cửa nào |
total_bet | Tổng cược user này trên cửa |
user_money | Chip còn lại sau trừ |
total_side_bet | Tổng toàn server trên cửa đó |
S→C vòng chơi
| Message | Field |
|---|---|
start_bet | delay_millis, end_at (unix) |
deal | session — mã phiên, khóa cược |
update_status | user_big_count, user_small_count, big_total_bet, small_total_bet |
finish | dices[], win_side, score, win_amount, user_money, win_bet_amount, returned_amount |
room_state | state, dices, score, win_side, bets[], bet_sides, big/small totals, session, max_bet, … |
Response { start_bet { delay_millis: 30000 end_at: 1720000030 } }
Response { deal { session: 8821 } }
Response { finish {
dices: [4, 5, 6]
win_side: Big
score: 15
win_amount: 10000
user_money: 505000
win_bet_amount: 5000
returned_amount: 5000
} }
room_state — restore
| Field | Client |
|---|---|
state, count_down_millis, state_start_time, state_end_time | Đồng hồ + khóa cửa |
dices[], score, win_side, side | Hiện nếu đang ShowdownTime |
bets[], bet_sides[] | Mệnh giá + cược của mình |
big_total_bet, small_total_bet, user_big_count, user_small_count | Thanh cân cửa |
session, max_bet | Mã phiên; max_bet < 0 = không giới hạn |
Response { bet {
user_id: 1001 side: Big bet_amount: 5000
total_bet: 5000 user_money: 495000 total_side_bet: 1200000
} }
Response { update_status {
user_big_count: 86 user_small_count: 41
big_total_bet: 1200000 small_total_bet: 800000
} }
returned_amount = hoàn cân cửa. win_amount = tiền ăn + hoàn. Cập nhật chip = user_money trên finish (và echo bet). Không suy ra even/odd từ Side enum.Bảng phụ
ResponseHistory.history[]: session, time, bet_side, win_side, bet, returned_amount, win_amount
ResponseSessions.sessions[]: time, session, dices, score, total_bet_big/small, total_returned_*, win_side, number_of_commands_*
ResponseSessionCommands: session, from, to, side, commands[{time, total_bet, returned, side, user_id, username}]
ResponseLeaderboard.members[]: rank, name, user_id, total_win
ResponseLogs: logs[{dices, score, win_side, session}], current_session
Lobby payload mẫu
Request { room_config {} }
Request { join_any_room { bet: 5000 max_players: 0 } }
Request { create_room { bet: 5000 password: "" max_players: 100 name: "sicbo-1" } }
Request { data_send { room_id: 7 data: <sicbo_event.Request bet> } }
Một user một socket. Gửi join lần 2 khi đã trong phòng → lobby 114/119. Hết chip → 120.
6. Luồng ghép
Connect /ws
room_config
join_any_room
start_bet
bet
deal → finish
- Connect JWT trên domain sicbo. Close 1/2/4/5 → dừng.
room_configrồi join. Restoreroom_state(session, totals, dices nếu đang showdown).start_bet: đếmend_at, enable Big/Small.- Gửi
betTag=1. Cập nhật chip từ echouser_money, vẽ total_side_bet. dealkhóa cửa. Animate 3 xúc xắc theofinish.dices, highlight win_side, cộngwin_amount.- Mở panel: leaderboard / history / sessions / session_commands khi user tap.
7. Error codes
| Handshake | 0 closed · 1 other device · 2 too many conn · 4 token expired · 5 banned |
|---|
| Lobby | 100 missing payload · 102 duplicated login · 103 room not found · 108 bad password · 113 room full · 114 in other room · 115 bet not found · 120 not enough money |
|---|
| Gameplay tag=1 | 1 NotBetTime · 2 InvalidBet · 3 NotEnoughChip · 4 SideBetNotAllowed · 5 UserNotFound · 6 ActionNotAllowed |
|---|
Khi nào chip đổi
| Event | Chip |
|---|---|
Echo bet | user_money đã trừ bet_amount |
finish thắng Big | +win_bet_amount + returned_amount |
finish thua | chỉ +returned_amount (nếu cân cửa) |
8. Checklist client
- Binary protobuf, domain game, một socket / user.
- Action bàn =
data_send.databytessicbo_event.Request. - API side chỉ Big/Small. Even/Odd chỉ UI từ tổng dices.
- Chip: echo bet + finish.user_money. Công thức win = win_bet + returned.
- Phiên: dùng
sessiontrên deal/logs/session_commands. - Cheat dices chỉ non-prod. Không spam bet ngoài BetTime (code 1).
- update_status định kỳ — vẽ lại thanh Big/Small totals, đừng interpolate.