fix: rule game for kot and hakem kot

This commit is contained in:
2026-06-15 20:09:39 +03:30
parent 390ef96e7e
commit 7dadb23fbe
7 changed files with 79 additions and 8 deletions
+1
View File
@@ -58,6 +58,7 @@ type handOverMsg struct {
Type string `json:"type"` // "hand_over"
WinnerTeam int `json:"winner_team"`
Kot bool `json:"kot"`
HakemKot bool `json:"hakem_kot"`
Points int `json:"points"`
Scores [2]int `json:"scores"`
}
+7 -2
View File
@@ -101,7 +101,12 @@ func (r *Room) run() {
// start بازی را ساخته، matched را برای انسان‌ها فرستاده و وضعیت اولیه را پخش می‌کند.
func (r *Room) start() {
r.game = game.NewGame(targetScore, game.FirstHakem())
// تعداد هَندِ لازم برای برد بازی از روی نوعِ میز (tier) تعیین می‌شود.
target := r.settler.TargetHands(r.tier)
if target <= 0 {
target = targetScore
}
r.game = game.NewGame(target, game.FirstHakem())
for seat, s := range r.seats {
if s.client != nil {
s.client.trySend(mustJSON(r.matchedFor(seat)))
@@ -127,7 +132,7 @@ func (r *Room) react() {
res := r.game.LastResult
r.broadcast(mustJSON(handOverMsg{
Type: "hand_over", WinnerTeam: res.WinnerTeam, Kot: res.Kot,
Points: res.Points, Scores: r.game.Scores,
HakemKot: res.HakemKot, Points: res.Points, Scores: r.game.Scores,
}))
if err := r.game.NextHand(); err != nil {
slog.Error("next hand", "room", r.ID, "err", err)
+7 -4
View File
@@ -7,12 +7,15 @@ type Settler interface {
Refund(userID int64, tier string) // بازگرداندن ورودی در صورت لغو
AwardWinner(userID int64, tier string) // جایزه/XP/جام به برنده
RecordGame(room, playersJSON string, winnerTeam int, kot bool)
// TargetHands تعداد هَندِ لازم برای برد بازی در این tier (مثلاً مبتدی=۳).
TargetHands(tier string) int
}
// noopSettler پیش‌فرض (برای تست‌ها و حالت بدون اقتصاد).
type noopSettler struct{}
func (noopSettler) ChargeEntry(int64, string) error { return nil }
func (noopSettler) Refund(int64, string) {}
func (noopSettler) AwardWinner(int64, string) {}
func (noopSettler) RecordGame(string, string, int, bool) {}
func (noopSettler) ChargeEntry(int64, string) error { return nil }
func (noopSettler) Refund(int64, string) {}
func (noopSettler) AwardWinner(int64, string) {}
func (noopSettler) RecordGame(string, string, int, bool) {}
func (noopSettler) TargetHands(string) int { return 7 }
+3
View File
@@ -346,6 +346,9 @@ func (s *recordingSettler) RecordGame(string, string, int, bool) {
s.records++
s.mu.Unlock()
}
// برای سرعتِ تست، بازی پس از ۲ هَند تمام می‌شود.
func (s *recordingSettler) TargetHands(string) int { return 2 }
func (s *recordingSettler) snapshot() (c, r, a, rec int) {
s.mu.Lock()
defer s.mu.Unlock()