feat: add reshuffle

This commit is contained in:
2026-06-24 21:01:21 +03:30
parent b1c7bfdd06
commit 27c20b1d34
6 changed files with 42 additions and 1 deletions
+1 -1
View File
@@ -173,7 +173,7 @@ func (h *Hub) handle(in inbound) {
}
h.enqueue(c, tier)
}
case "choose_trump", "play_card", "leave":
case "choose_trump", "play_card", "reshuffle", "leave":
if c.room != nil {
if in.msg.Type == "leave" {
delete(h.locations, c.UserID) // پس از خروج دائمی، reconnect نشود
+19
View File
@@ -262,6 +262,25 @@ func (r *Room) handleInput(act roomAction) {
}
r.graceUntil = time.Now().Add(r.dealDelay) // انیمیشنِ پخشِ بقیه‌ی کارت‌ها
r.react()
case "reshuffle":
// بُرِ مجدد با مصرفِ یک بلیت: فقط حاکم و فقط پیش از انتخابِ حکم.
if r.game.Phase != game.PhaseChooseTrump || act.seat != r.game.Hakem {
r.sendError(act.seat, "بُر مجدد مجاز نیست")
return
}
if s.isBot || s.userID == 0 {
return
}
if err := r.settler.ChargeTicket(s.userID); err != nil {
r.sendError(act.seat, "بلیت کافی ندارید")
return
}
if err := r.game.Reshuffle(act.seat); err != nil {
r.sendError(act.seat, err.Error())
return
}
r.graceUntil = time.Now().Add(r.firstHandDelay) // انیمیشنِ بُر زدنِ مجدد
r.react()
case "play_card":
card, err := game.ParseCard(act.msg.Card)
if err != nil {
+3
View File
@@ -14,6 +14,8 @@ type Settler interface {
RecordGameResult(userID int64, won bool) // پایان بازی (برد/باخت)
// PlayerProfile سکه و نشانِ رتبه‌ی بازیکن را برای نمایش سرِ میز برمی‌گرداند.
PlayerProfile(userID int64) (coins int64, rankTier string)
// ChargeTicket یک بلیت برای بُرِ مجدد در فازِ انتخابِ حکم مصرف می‌کند.
ChargeTicket(userID int64) error
// میز خصوصی (دورهمی).
ChargePrivateTable(userID int64) error // مصرفِ یک میز رایگان (خطا اگر سقف پر باشد)
PrivateTableInfo(userID int64) (remaining int, unlimited bool)
@@ -33,6 +35,7 @@ func (noopSettler) RecordHand(int64, bool, bool, bool) {}
func (noopSettler) RecordCut(int64) {}
func (noopSettler) RecordGameResult(int64, bool) {}
func (noopSettler) PlayerProfile(int64) (int64, string) { return 0, "" }
func (noopSettler) ChargeTicket(int64) error { return nil }
func (noopSettler) ChargePrivateTable(int64) error { return nil }
func (noopSettler) PrivateTableInfo(int64) (int, bool) { return 0, true }
func (noopSettler) TargetHands(string) int { return 7 }
+1
View File
@@ -480,6 +480,7 @@ func (s *recordingSettler) RecordGameResult(int64, bool) {
}
func (s *recordingSettler) PlayerProfile(int64) (int64, string) { return 0, "" }
func (s *recordingSettler) ChargeTicket(int64) error { return nil }
func (s *recordingSettler) ChargePrivateTable(int64) error { return nil }
func (s *recordingSettler) PrivateTableInfo(int64) (int, bool) { return 5, false }