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
+50 -5
View File
@@ -49,8 +49,11 @@ type Room struct {
ID string
hub *Hub
tier string
private bool // میز دورهمی: بدون ورودی/جایزه (فقط آمار ثبت می‌شود)
handsOverride int // تعداد دستِ سفارشیِ میز خصوصی (۰ یعنی از tier)
private bool // میز دورهمی: بدون ورودی/جایزه‌ی tier (فقط آمار و شرطِ سکه)
handsOverride int // تعداد دستِ سفارشیِ میز خصوصی (۰ یعنی از tier)
stake int64 // شرطِ سکه‌ایِ هر بازیکن در میز خصوصی (۰ یعنی رایگان)
pot int64 // مجموعِ سکه‌های جمع‌آوری‌شده برای برنده
paid [4]bool // جایگاه‌هایی که شرط را پرداخته‌اند (برای بازگشت هنگام لغو)
settler Settler
seats [4]*seatInfo
game *game.Game
@@ -122,6 +125,19 @@ func (r *Room) start() {
}
r.game = game.NewGame(target, game.FirstHakem())
r.graceUntil = time.Now().Add(r.firstHandDelay) // بُر زدن + پخشِ ۵ کارت
// شرطِ سکه‌ایِ میزِ خصوصی: از هر بازیکنِ انسان کسر و به pot اضافه می‌شود
// (هر که موجودی نداشت، رایگان بازی می‌کند و به pot اضافه نمی‌شود).
if r.stake > 0 {
for seat, s := range r.seats {
if s.isBot || s.userID == 0 {
continue
}
if err := r.settler.ChargeCoins(s.userID, r.stake, r.ID); err == nil {
r.pot += r.stake
r.paid[seat] = true
}
}
}
// اطلاعاتِ نمایشیِ بازیکنان (سکه و نشانِ رتبه) را یک‌بار هنگام شروع می‌گیریم.
for _, s := range r.seats {
if s.isBot || s.userID == 0 {
@@ -462,26 +478,55 @@ func (r *Room) endRoom() {
// settleGameOver جایزه را به برندگانِ انسان می‌دهد و بازی را ثبت می‌کند.
func (r *Room) settleGameOver(res *game.HandResult) {
// برندگانِ انسان (برای تقسیمِ potِ میزِ خصوصی).
var winners []int64
for seat, s := range r.seats {
if s.isBot || s.userID == 0 {
continue
}
won := game.Team(seat) == res.WinnerTeam
if won && !r.private {
r.settler.AwardWinner(s.userID, r.tier) // میز دورهمی جایزه‌ی سکه ندارد
if won {
winners = append(winners, s.userID)
if !r.private {
r.settler.AwardWinner(s.userID, r.tier)
}
}
if !r.private {
r.settler.AwardRank(s.userID, r.tier, won) // امتیازِ رتبه (اگر میزِ رتبه‌بندی باشد)
}
r.settler.RecordGameResult(s.userID, won)
}
// تقسیمِ potِ شرطِ خصوصی بینِ برندگانِ انسان (باقی‌مانده به نفرِ اول).
if r.private && r.pot > 0 && len(winners) > 0 {
share := r.pot / int64(len(winners))
rem := r.pot - share*int64(len(winners))
for i, id := range winners {
amt := share
if i == 0 {
amt += rem
}
r.settler.AwardCoins(id, amt, r.ID)
}
r.pot = 0
}
r.settler.RecordGame(r.ID, r.playersJSON(res.WinnerTeam), res.WinnerTeam, res.Kot)
}
// refundAll ورودی را به بازیکنانِ انسان که داوطلبانه خارج نشده‌اند بازمی‌گرداند.
func (r *Room) refundAll() {
if r.private {
return // میز دورهمی ورودی نگرفته، پس بازگشتی هم ندارد
// میزِ خصوصی: فقط شرطِ سکه‌ایِ پرداخت‌شده بازمی‌گردد (اگر شرطی بوده).
if r.stake > 0 {
for seat, s := range r.seats {
if s.isBot || s.left || s.userID == 0 || !r.paid[seat] {
continue
}
r.settler.AwardCoins(s.userID, r.stake, r.ID+":refund")
r.paid[seat] = false
}
r.pot = 0
}
return
}
for _, s := range r.seats {
if s.isBot || s.left || s.userID == 0 {