feat: add coin for private table
This commit is contained in:
+50
-5
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user