feat: add priority fixed

This commit is contained in:
2026-06-19 21:36:07 +03:30
parent 32f0406e63
commit cf043e2a19
3 changed files with 16 additions and 7 deletions
+3
View File
@@ -17,6 +17,7 @@ const (
defaultMatchWait = 6 * time.Second // مهلت پر شدن میز با انسان پیش از افزودن بات defaultMatchWait = 6 * time.Second // مهلت پر شدن میز با انسان پیش از افزودن بات
defaultTrickHold = 1200 * time.Millisecond // مدت نمایش دستِ کامل پیش از جمع‌آوری defaultTrickHold = 1200 * time.Millisecond // مدت نمایش دستِ کامل پیش از جمع‌آوری
defaultFirstHandDelay = 3000 * time.Millisecond // تأخیر اولین حرکتِ بات تا پایانِ اینترو+بُر زدنِ کلاینت defaultFirstHandDelay = 3000 * time.Millisecond // تأخیر اولین حرکتِ بات تا پایانِ اینترو+بُر زدنِ کلاینت
defaultDealDelay = 1600 * time.Millisecond // تأخیر اولین بازی تا پایانِ انیمیشنِ پخشِ کارت‌ها
) )
// AuthFunc توکن را تأیید کرده و (شناسه کاربر، نام نمایشی) را برمی‌گرداند. // AuthFunc توکن را تأیید کرده و (شناسه کاربر، نام نمایشی) را برمی‌گرداند.
@@ -71,6 +72,7 @@ type Hub struct {
matchWait time.Duration matchWait time.Duration
trickHold time.Duration trickHold time.Duration
firstHandDelay time.Duration // تأخیر اولین حرکتِ بات (هماهنگ با انیمیشنِ بُر زدنِ کلاینت) firstHandDelay time.Duration // تأخیر اولین حرکتِ بات (هماهنگ با انیمیشنِ بُر زدنِ کلاینت)
dealDelay time.Duration // تأخیر اولین بازی پس از انتخابِ حکم (انیمیشنِ پخشِ کارت‌ها)
countdownDelay time.Duration // مهلت شمارش معکوسِ میز خصوصی پیش از شروع countdownDelay time.Duration // مهلت شمارش معکوسِ میز خصوصی پیش از شروع
register chan *Client register chan *Client
@@ -101,6 +103,7 @@ func NewHub(auth AuthFunc) *Hub {
matchWait: defaultMatchWait, matchWait: defaultMatchWait,
trickHold: defaultTrickHold, trickHold: defaultTrickHold,
firstHandDelay: defaultFirstHandDelay, firstHandDelay: defaultFirstHandDelay,
dealDelay: defaultDealDelay,
countdownDelay: 3 * time.Second, countdownDelay: 3 * time.Second,
register: make(chan *Client), register: make(chan *Client),
unregister: make(chan *Client), unregister: make(chan *Client),
+12 -7
View File
@@ -58,8 +58,10 @@ type Room struct {
turnTimeout time.Duration turnTimeout time.Duration
botDelay time.Duration botDelay time.Duration
trickHold time.Duration trickHold time.Duration
firstHandDelay time.Duration firstHandDelay time.Duration // پنجره‌ی بُر زدن+پخشِ ۵ کارت (ابتدای هَند)
handStart time.Time // زمانِ شروعِ هَندِ جاری (برای پنجره‌ی بُر زدن) dealDelay time.Duration // پنجره‌ی پخشِ بقیه‌ی کارت‌ها (پس از انتخابِ حکم)
// graceUntil: تا این لحظه هیچ حرکتِ خودکاری انجام نمی‌شود (هماهنگ با انیمیشن‌های کلاینت).
graceUntil time.Time
} }
func newRoom(id string, seats [4]*seatInfo, hub *Hub) *Room { func newRoom(id string, seats [4]*seatInfo, hub *Hub) *Room {
@@ -73,6 +75,7 @@ func newRoom(id string, seats [4]*seatInfo, hub *Hub) *Room {
botDelay: hub.botDelay, botDelay: hub.botDelay,
trickHold: hub.trickHold, trickHold: hub.trickHold,
firstHandDelay: hub.firstHandDelay, firstHandDelay: hub.firstHandDelay,
dealDelay: hub.dealDelay,
} }
} }
@@ -111,7 +114,7 @@ func (r *Room) start() {
target = targetScore target = targetScore
} }
r.game = game.NewGame(target, game.FirstHakem()) r.game = game.NewGame(target, game.FirstHakem())
r.handStart = time.Now() r.graceUntil = time.Now().Add(r.firstHandDelay) // بُر زدن + پخشِ ۵ کارت
for seat, s := range r.seats { for seat, s := range r.seats {
if s.client != nil { if s.client != nil {
s.client.trySend(mustJSON(r.matchedFor(seat))) s.client.trySend(mustJSON(r.matchedFor(seat)))
@@ -146,7 +149,7 @@ func (r *Room) react() {
r.endRoom() r.endRoom()
return return
} }
r.handStart = time.Now() // شروعِ هَندِ جدید ⇒ پنجره‌ی بُر زدن r.graceUntil = time.Now().Add(r.firstHandDelay) // هَندِ جدید ⇒ بُر زدن + پخشِ ۵ کارت
r.broadcastState() r.broadcastState()
r.armTimer() r.armTimer()
case game.PhaseGameOver: case game.PhaseGameOver:
@@ -211,9 +214,9 @@ func (r *Room) armTimer() {
delay := r.turnTimeout delay := r.turnTimeout
if r.seats[actor].auto() { if r.seats[actor].auto() {
delay = r.botDelay delay = r.botDelay
// در پنجره‌ی ابتدای هَند (انیمیشنِ بُر زدنِ کلاینت)، حرکتِ خودکار را عقب // تا پایانِ پنجره‌ی انیمیشنِ کلاینت (بُر زدن یا پخشِ کارت)، حرکتِ خودکار را
// می‌اندازیم تا کارت‌ها وسطِ بُر زدن روی میز نیفتند. نوبتِ انسان دست‌نخورده می‌ماند. // عقب می‌اندازیم تا کارت‌ها وسطِ انیمیشن روی میز نیفتند. نوبتِ انسان دست‌نخورده می‌ماند.
if grace := r.firstHandDelay - time.Since(r.handStart); grace > delay { if grace := time.Until(r.graceUntil); grace > delay {
delay = grace delay = grace
} }
} }
@@ -244,6 +247,7 @@ func (r *Room) handleInput(act roomAction) {
r.sendError(act.seat, err.Error()) r.sendError(act.seat, err.Error())
return return
} }
r.graceUntil = time.Now().Add(r.dealDelay) // انیمیشنِ پخشِ بقیه‌ی کارت‌ها
r.react() r.react()
case "play_card": case "play_card":
card, err := game.ParseCard(act.msg.Card) card, err := game.ParseCard(act.msg.Card)
@@ -294,6 +298,7 @@ func (r *Room) autoChooseTrump(seat int) {
} }
} }
_ = r.game.ChooseTrump(seat, best) _ = r.game.ChooseTrump(seat, best)
r.graceUntil = time.Now().Add(r.dealDelay) // انیمیشنِ پخشِ بقیه‌ی کارت‌ها
} }
// autoPlayCard یک کارت مجاز (پایین‌ترین کارتِ خالِ زمینه، وگرنه پایین‌ترین کارت) بازی می‌کند. // autoPlayCard یک کارت مجاز (پایین‌ترین کارتِ خالِ زمینه، وگرنه پایین‌ترین کارت) بازی می‌کند.
+1
View File
@@ -123,6 +123,7 @@ func testHub() *Hub {
hub.matchWait = 300 * time.Millisecond hub.matchWait = 300 * time.Millisecond
hub.trickHold = 5 * time.Millisecond hub.trickHold = 5 * time.Millisecond
hub.firstHandDelay = 0 hub.firstHandDelay = 0
hub.dealDelay = 0
hub.countdownDelay = 20 * time.Millisecond hub.countdownDelay = 20 * time.Millisecond
go hub.Run() go hub.Run()
return hub return hub