feat: add reshuffle
This commit is contained in:
@@ -82,6 +82,11 @@ func (g gameSettler) PlayerProfile(userID int64) (int64, string) {
|
|||||||
return p.Coins, p.RankTier
|
return p.Coins, p.RankTier
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChargeTicket یک بلیت برای بُرِ مجدد مصرف میکند (خطا اگر بلیت کافی نباشد).
|
||||||
|
func (g gameSettler) ChargeTicket(userID int64) error {
|
||||||
|
return g.eco.Adjust(context.Background(), userID, economy.CurrencyTicket, -1, "reshuffle", "")
|
||||||
|
}
|
||||||
|
|
||||||
// ChargePrivateTable یک میز خصوصیِ رایگان را برای کاربر مصرف میکند.
|
// ChargePrivateTable یک میز خصوصیِ رایگان را برای کاربر مصرف میکند.
|
||||||
func (g gameSettler) ChargePrivateTable(userID int64) error {
|
func (g gameSettler) ChargePrivateTable(userID int64) error {
|
||||||
return g.eco.ConsumePrivateTable(context.Background(), userID)
|
return g.eco.ConsumePrivateTable(context.Background(), userID)
|
||||||
|
|||||||
@@ -124,6 +124,19 @@ func (g *Game) startHand() {
|
|||||||
g.TrickDone = false
|
g.TrickDone = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reshuffle دستِ جاری را پیش از انتخابِ حکم دوباره بُر میزند و ۵ کارتِ تازه به
|
||||||
|
// همان حاکم میدهد (مصرفِ یک بلیت در لایهی بالاتر انجام میشود).
|
||||||
|
func (g *Game) Reshuffle(seat int) error {
|
||||||
|
if g.Phase != PhaseChooseTrump {
|
||||||
|
return ErrWrongPhase
|
||||||
|
}
|
||||||
|
if seat != g.Hakem {
|
||||||
|
return ErrNotHakem
|
||||||
|
}
|
||||||
|
g.startHand() // همان حاکم، دستِ نو، باز هم منتظرِ انتخابِ حکم
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ChooseTrump حکم را توسط حاکم تعیین کرده و بقیه کارتها را پخش میکند.
|
// ChooseTrump حکم را توسط حاکم تعیین کرده و بقیه کارتها را پخش میکند.
|
||||||
func (g *Game) ChooseTrump(seat int, s Suit) error {
|
func (g *Game) ChooseTrump(seat int, s Suit) error {
|
||||||
if g.Phase != PhaseChooseTrump {
|
if g.Phase != PhaseChooseTrump {
|
||||||
|
|||||||
+1
-1
@@ -173,7 +173,7 @@ func (h *Hub) handle(in inbound) {
|
|||||||
}
|
}
|
||||||
h.enqueue(c, tier)
|
h.enqueue(c, tier)
|
||||||
}
|
}
|
||||||
case "choose_trump", "play_card", "leave":
|
case "choose_trump", "play_card", "reshuffle", "leave":
|
||||||
if c.room != nil {
|
if c.room != nil {
|
||||||
if in.msg.Type == "leave" {
|
if in.msg.Type == "leave" {
|
||||||
delete(h.locations, c.UserID) // پس از خروج دائمی، reconnect نشود
|
delete(h.locations, c.UserID) // پس از خروج دائمی، reconnect نشود
|
||||||
|
|||||||
@@ -262,6 +262,25 @@ func (r *Room) handleInput(act roomAction) {
|
|||||||
}
|
}
|
||||||
r.graceUntil = time.Now().Add(r.dealDelay) // انیمیشنِ پخشِ بقیهی کارتها
|
r.graceUntil = time.Now().Add(r.dealDelay) // انیمیشنِ پخشِ بقیهی کارتها
|
||||||
r.react()
|
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":
|
case "play_card":
|
||||||
card, err := game.ParseCard(act.msg.Card)
|
card, err := game.ParseCard(act.msg.Card)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ type Settler interface {
|
|||||||
RecordGameResult(userID int64, won bool) // پایان بازی (برد/باخت)
|
RecordGameResult(userID int64, won bool) // پایان بازی (برد/باخت)
|
||||||
// PlayerProfile سکه و نشانِ رتبهی بازیکن را برای نمایش سرِ میز برمیگرداند.
|
// PlayerProfile سکه و نشانِ رتبهی بازیکن را برای نمایش سرِ میز برمیگرداند.
|
||||||
PlayerProfile(userID int64) (coins int64, rankTier string)
|
PlayerProfile(userID int64) (coins int64, rankTier string)
|
||||||
|
// ChargeTicket یک بلیت برای بُرِ مجدد در فازِ انتخابِ حکم مصرف میکند.
|
||||||
|
ChargeTicket(userID int64) error
|
||||||
// میز خصوصی (دورهمی).
|
// میز خصوصی (دورهمی).
|
||||||
ChargePrivateTable(userID int64) error // مصرفِ یک میز رایگان (خطا اگر سقف پر باشد)
|
ChargePrivateTable(userID int64) error // مصرفِ یک میز رایگان (خطا اگر سقف پر باشد)
|
||||||
PrivateTableInfo(userID int64) (remaining int, unlimited bool)
|
PrivateTableInfo(userID int64) (remaining int, unlimited bool)
|
||||||
@@ -33,6 +35,7 @@ func (noopSettler) RecordHand(int64, bool, bool, bool) {}
|
|||||||
func (noopSettler) RecordCut(int64) {}
|
func (noopSettler) RecordCut(int64) {}
|
||||||
func (noopSettler) RecordGameResult(int64, bool) {}
|
func (noopSettler) RecordGameResult(int64, bool) {}
|
||||||
func (noopSettler) PlayerProfile(int64) (int64, string) { return 0, "" }
|
func (noopSettler) PlayerProfile(int64) (int64, string) { return 0, "" }
|
||||||
|
func (noopSettler) ChargeTicket(int64) error { return nil }
|
||||||
func (noopSettler) ChargePrivateTable(int64) error { return nil }
|
func (noopSettler) ChargePrivateTable(int64) error { return nil }
|
||||||
func (noopSettler) PrivateTableInfo(int64) (int, bool) { return 0, true }
|
func (noopSettler) PrivateTableInfo(int64) (int, bool) { return 0, true }
|
||||||
func (noopSettler) TargetHands(string) int { return 7 }
|
func (noopSettler) TargetHands(string) int { return 7 }
|
||||||
|
|||||||
@@ -480,6 +480,7 @@ func (s *recordingSettler) RecordGameResult(int64, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *recordingSettler) PlayerProfile(int64) (int64, string) { return 0, "" }
|
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) ChargePrivateTable(int64) error { return nil }
|
||||||
func (s *recordingSettler) PrivateTableInfo(int64) (int, bool) { return 5, false }
|
func (s *recordingSettler) PrivateTableInfo(int64) (int, bool) { return 5, false }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user