feat: add coin for private table

This commit is contained in:
2026-07-04 12:45:07 +03:30
parent 413fca68cc
commit 63716576ca
6 changed files with 104 additions and 8 deletions
+26 -3
View File
@@ -50,6 +50,7 @@ type pendingTable struct {
clients []*Client
hands int // تعداد دستِ انتخاب‌شده توسط میزبان (۳/۵/۷)
rot int // چرخشِ جایگاه‌های غیرِمیزبان (۰..۲)
stake int // شرطِ سکه‌ایِ هر بازیکن (۰ یعنی رایگان)
started bool // پس از فشردن «شروع» توسط میزبان
}
@@ -188,7 +189,9 @@ func (h *Hub) handle(in inbound) {
case "join_table":
h.joinTable(c, in.msg.Code)
case "start_table":
h.startTable(c, in.msg.Hands)
h.startTable(c, in.msg.Hands, in.msg.Stake)
case "set_stake":
h.setStake(c, in.msg.Stake)
case "rotate_table":
h.rotateTable(c, in.msg.Dir)
case "leave_table":
@@ -245,12 +248,15 @@ func (h *Hub) joinTable(c *Client, code string) {
}
// startTable شمارش معکوس را آغاز و پس از آن بازی را شروع می‌کند (فقط میزبان).
func (h *Hub) startTable(c *Client, hands int) {
func (h *Hub) startTable(c *Client, hands, stake int) {
t := h.tables[c.tableCode]
if t == nil || t.host != c.UserID || t.started {
return
}
t.hands = clampHands(hands) // تعداد دستِ انتخابیِ میزبان (۳/۵/۷)
if stake >= 0 {
t.stake = stake // آخرین شرطِ سکه‌ای (اگر همراهِ شروع فرستاده شد)
}
t.started = true
cd := mustJSON(countdownMsg{Type: "countdown", Seconds: 3})
for _, cl := range t.clients {
@@ -298,6 +304,7 @@ func (h *Hub) onStartTable(code string) {
room.tier = defaultTier // برای جایزه/ورودی بی‌اثر است (میز خصوصی)
room.private = true
room.handsOverride = clampHands(t.hands) // تعداد دستِ انتخابیِ میزبان
room.stake = int64(t.stake) // شرطِ سکه‌ایِ هر بازیکن
for s := 0; s < 4; s++ {
if seats[s].isBot {
continue
@@ -312,6 +319,22 @@ func (h *Hub) onStartTable(code string) {
slog.Info("private room started", "room", room.ID, "code", code, "humans", humans)
}
// setStake شرطِ سکه‌ایِ میز را تنظیم و برای همه پخش می‌کند (فقط میزبان، پیش از شروع).
func (h *Hub) setStake(c *Client, stake int) {
t := h.tables[c.tableCode]
if t == nil || t.host != c.UserID || t.started {
return
}
if stake < 0 {
stake = 0
}
if stake > 1_000_000 {
stake = 1_000_000
}
t.stake = stake
h.broadcastLobby(t)
}
// rotateTable جایگاهِ بازیکنانِ غیرِمیزبان را دورِ میز می‌چرخاند (فقط میزبان).
// میزبان همیشه جایگاهِ اولش را حفظ می‌کند؛ چرخش تیم‌بندی را تغییر می‌دهد.
func (h *Hub) rotateTable(c *Client, dir int) {
@@ -379,7 +402,7 @@ func (h *Hub) broadcastLobby(t *pendingTable) {
cl.trySend(mustJSON(tableLobbyMsg{
Type: "table_lobby", Code: t.code, Players: players,
Host: cl.UserID == t.host, YouSeat: t.seatOf(i),
Remaining: remaining, Unlimited: unlimited,
Remaining: remaining, Unlimited: unlimited, Stake: t.stake,
}))
}
}