syntax = "proto3"; package tienlenstar_event; option go_package = ".;tienlenstar_event"; enum State { // đợi đủ người để bắt đầu ván chơi, chuẩn bị bắt đầu ván chơi Pending = 0; // đang đếm ngược để cho người chơi vào game Countdown = 1; // thời gian chia bài DealTime = 2; // đang trong thời gian diễn kết quả trận đấu ShowdownTime = 3; // đang trong lượt đánh của player PlayerTurn = 4; // đang diễn action player đánh bài PrePlayerTurn = 5; } // các loại bộ bài đánh ra enum Combination { // lá đơn Card = 0; // đôi Pair = 1; // tam ThreeOfAKind = 2; // tứ quý FourOfAKind = 3; // sảnh Straight = 4; // 2 đôi thông TwoConsecutivePairs = 5; // 3 đôi thông ThreeConsecutivePairs = 6; // 4 đôi thông FourConsecutivePairs = 7; // bỏ bài Pass = 8; } // các trường hợp thắng trắng enum InstantWinCombination { // không phải thắng trắng Normal = 0; // 5 đôi thông FiveConsecutivePairs = 1; // 4 bộ tam QuadThreeOfAKinds = 2; // 6 đôi SixPairs = 3; // sảnh rồng StraightFlush = 4; // tứ quý 2 FourOfAKindTwo = 5; // tứ quý 3 hoặc 3 đôi thông 3 bích FourOfAKindThree = 6; ThreeConsecutivePairsThreeSpade = 7; } // thối bài, phạt thêm điểm cuối ván nêếu còn ủ hàng hoặc cháy bài enum HandPenalty { // không thối gì None = 0; // thối 2 PenaltyCard2 = 1; // thối 3 đôi thông PenaltyThreeConsecutivePairs = 2; // thối tứ quý PenaltyFourOfAKind = 3; // thối 4 đôi thông PenaltyFourConsecutivePairs = 4; // cháy bài PenaltyBurn = 5; } message Response { oneof message { ResponseRoomState room_state = 1; ResponseDeal deal = 2; ResponseFinishGame finish = 3; ResponseError error = 4; ResponsePlayerTurn player_turn = 6; ResponsePlayerPlay player_play = 7; ResponseStartCheat start_cheat = 8; } } message Request { oneof message { RequestPlay play = 1; RequestCheat cheat = 2; RequestStartCheat start_cheat = 3; RequestCheatPlay cheat_play = 4; } } message ResponseError { // 1: wrong state // 2: not your turn // 3: invalid card uint32 code = 1; // 1: RequestPlay uint32 tag = 2; } message Player { int32 user_id = 1; string name = 2; int64 chip = 3; int32 avatar = 4; int32 level = 5; int32 vip = 6; int32 seat = 7; bool disconnected = 8; // state của player // 0 = viewing // 1 = playing int32 state = 9; // số lá bài còn lại trên tay int32 number_of_cards = 10; // true nếu người chơi đã bỏ bài trong lượt này bool passed = 11; } message ResponseRoomState { // trạng thái của game State state = 1; // số milli giây còn lại của trạng thái hiện tại int32 count_down_millis = 2; // time unix thời điểm trạng thái hiện tại bắt đầu int32 state_start_time = 3; // thời điểm trạng thái hiện tại kết thúc (unix second) int32 state_end_time = 4; // mức cược int64 bet = 5; // danh sách người chơi repeated Player players = 6; // true nếu đang đăng ký thoát bàn, kết thúc ván sẽ tự động bị kick bool is_registered_leave = 7; // lá bài trên tay repeated int32 cards = 8; // lá bài trên bàn repeated int32 table_cards = 9; // loại bộ bài trên bàn Combination table_cards_combination = 10; // người chơi hiện tại, nếu ko trong game thì = 0 int32 current_player_id = 11; // người chơi thắng game trước, nếu không có thì = 0; int32 last_winner_id = 12; // true nếu bắt buộc đánh lá 3 bích bool must_play_3spade = 13; // true nếu là lượt đánh đầu trong round hiện tại bool is_first_turn = 14; // số giây tối đa 1 lượt đánh int32 turn_time = 15; // true nếu show số lượng bài còn lại của người chơi bool show_card_count = 16; int32 star = 17; } // chia bài cho user message ResponseDeal { repeated int32 cards = 1; // bộ bài thắng trắng InstantWinCombination combination = 2; // true nếu show số lượng bài còn lại của người chơi bool show_card_count = 3; int32 star = 4; } // bắt đầu lượt của người chơi message ResponsePlayerTurn { // số giây cho lượt này int32 seconds = 1; // thời điểm kết thúc lượt int32 end_at = 2; // id của người chơi lượt này int32 user_id = 3; // true nếu bắt đầu 1 round mới, người đánh ko phải chặt lá gì hết bool is_new_round = 4; // true nếu bắt buộc đánh lá 3 bích hoặc các bộ chứ lá 3 bích bool must_play_3spade = 5; // chặt đồ ăn tiền WinPenalty win_penalty = 6; } // win chặt đồ message WinPenalty { // id của người ăn tiền chuỗi int32 winner_id = 1; // id người bị chặt đồ cuối trong chuỗi (người này phải trả tiền chặt đồ cho tất cả người chơi bị chặt trước đó) int32 loser_id = 2; // tiền user hiện tại ăn int64 win_amount = 3; // tiền loser mất int64 lose_amount = 4; // tiền user int64 winner_money = 5; // tiền loser int64 loser_money = 6; } // gửi lên để đánh bài message RequestPlay { // lá cần đánh ra repeated int32 cards = 1; // loại bộ bài đánh ra Combination combination = 2; } // người chơi vừa đánh bài message ResponsePlayerPlay { // id ng đánh int32 user_id = 1; // true nếu là server đánh hộ bool is_auto = 2; repeated int32 cards = 3; Combination combination = 4; } // kết thúc game trả về danh sách người chơi, tiền thắng thua message ResponseFinishGame { message PlayerResult { // tiền thắng thua int64 winAmount = 1; // tiền user int64 user_money = 2; // danh sách lá bài repeated int32 cards = 3; // thối HandPenalty penalty = 4; // tổng điểm int32 point = 5; // id user int32 user_id = 6; } // id người win int32 winner_id = 1; // kết quả của người chơi repeated PlayerResult player_result = 2; // chặt đồ xong win WinPenalty win_penalty = 3; // trường hợp instant win sẽ có trả về cái này InstantWinCombination instant_win = 4; } // stop game state hiện tại để chọn bài cheat, game state sẽ chuyển về Pending // chỉ tác dụng khi đang countdown hoặc pending mà thôi message RequestStartCheat {} // nhận được gói này tức là game state đã chuyển về pending, stop mọi action trong room như đếm ngược message ResponseStartCheat {} message CheatCards { int32 seat = 1; // ko gần gửi full 7 lá, gửi < 7 lá thì các lá còn lại sẽ được random repeated int32 cards = 2; } // gửi gói cheat này lên và server sẽ trả về gói start countdown nếu thành công // còn nếu ko thì sẽ ko gửi về gì message RequestCheat { repeated CheatCards cheat_cards = 1; int32 start = 2; } message RequestCheatPlay {}