feat: add cards templete
This commit is contained in:
@@ -50,6 +50,8 @@ type PlayerInfo struct {
|
||||
Name string `json:"name"`
|
||||
Bot bool `json:"bot"`
|
||||
Connected bool `json:"connected"`
|
||||
Coins int64 `json:"coins"`
|
||||
RankTier string `json:"rank_tier"` // bronze..king (برای نشانِ رتبه)
|
||||
}
|
||||
|
||||
// matchedMsg به کلاینت پس از تشکیل میز.
|
||||
|
||||
+18
-2
@@ -36,7 +36,9 @@ type seatInfo struct {
|
||||
userID int64
|
||||
name string
|
||||
connected bool
|
||||
left bool // خروج دائمی داوطلبانه (در تسویه از بازگشت ورودی محروم)
|
||||
left bool // خروج دائمی داوطلبانه (در تسویه از بازگشت ورودی محروم)
|
||||
coins int64 // برای نمایش سرِ میز
|
||||
rankTier string // نشانِ رتبه برای نمایش سرِ میز
|
||||
}
|
||||
|
||||
// auto مشخص میکند جایگاه باید خودکار بازی شود (بات یا قطعشده).
|
||||
@@ -119,6 +121,13 @@ func (r *Room) start() {
|
||||
}
|
||||
r.game = game.NewGame(target, game.FirstHakem())
|
||||
r.graceUntil = time.Now().Add(r.firstHandDelay) // بُر زدن + پخشِ ۵ کارت
|
||||
// اطلاعاتِ نمایشیِ بازیکنان (سکه و نشانِ رتبه) را یکبار هنگام شروع میگیریم.
|
||||
for _, s := range r.seats {
|
||||
if s.isBot || s.userID == 0 {
|
||||
continue
|
||||
}
|
||||
s.coins, s.rankTier = r.settler.PlayerProfile(s.userID)
|
||||
}
|
||||
for seat, s := range r.seats {
|
||||
if s.client != nil {
|
||||
s.client.trySend(mustJSON(r.matchedFor(seat)))
|
||||
@@ -439,6 +448,9 @@ func (r *Room) settleGameOver(res *game.HandResult) {
|
||||
if won && !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)
|
||||
}
|
||||
r.settler.RecordGame(r.ID, r.playersJSON(res.WinnerTeam), res.WinnerTeam, res.Kot)
|
||||
@@ -485,7 +497,11 @@ func (r *Room) connectedHumans() int {
|
||||
func (r *Room) playersInfo() []PlayerInfo {
|
||||
out := make([]PlayerInfo, 4)
|
||||
for i, s := range r.seats {
|
||||
out[i] = PlayerInfo{Seat: i, Name: s.name, Bot: s.isBot, Connected: s.isBot || s.connected}
|
||||
out[i] = PlayerInfo{
|
||||
Seat: i, Name: s.name, Bot: s.isBot,
|
||||
Connected: s.isBot || s.connected,
|
||||
Coins: s.coins, RankTier: s.rankTier,
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
@@ -6,11 +6,14 @@ type Settler interface {
|
||||
ChargeEntry(userID int64, tier string) error // کسر ورودی هنگام ورود به صف
|
||||
Refund(userID int64, tier string) // بازگرداندن ورودی در صورت لغو
|
||||
AwardWinner(userID int64, tier string) // جایزه/XP/جام به برنده
|
||||
AwardRank(userID int64, tier string, won bool) // امتیازِ رتبه (میزِ رتبهبندی)
|
||||
RecordGame(room, playersJSON string, winnerTeam int, kot bool)
|
||||
// آمار پروفایل (همگی غیرحیاتی و fire-and-forget).
|
||||
RecordHand(userID int64, won, kot, asHakem bool) // پایان یک هَند
|
||||
RecordCut(userID int64) // بُرِش با حکم
|
||||
RecordGameResult(userID int64, won bool) // پایان بازی (برد/باخت)
|
||||
// PlayerProfile سکه و نشانِ رتبهی بازیکن را برای نمایش سرِ میز برمیگرداند.
|
||||
PlayerProfile(userID int64) (coins int64, rankTier string)
|
||||
// میز خصوصی (دورهمی).
|
||||
ChargePrivateTable(userID int64) error // مصرفِ یک میز رایگان (خطا اگر سقف پر باشد)
|
||||
PrivateTableInfo(userID int64) (remaining int, unlimited bool)
|
||||
@@ -24,10 +27,12 @@ type noopSettler struct{}
|
||||
func (noopSettler) ChargeEntry(int64, string) error { return nil }
|
||||
func (noopSettler) Refund(int64, string) {}
|
||||
func (noopSettler) AwardWinner(int64, string) {}
|
||||
func (noopSettler) AwardRank(int64, string, bool) {}
|
||||
func (noopSettler) RecordGame(string, string, int, bool) {}
|
||||
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) ChargePrivateTable(int64) error { return nil }
|
||||
func (noopSettler) PrivateTableInfo(int64) (int, bool) { return 0, true }
|
||||
func (noopSettler) TargetHands(string) int { return 7 }
|
||||
|
||||
@@ -456,6 +456,7 @@ func (s *recordingSettler) AwardWinner(int64, string) {
|
||||
s.awards++
|
||||
s.mu.Unlock()
|
||||
}
|
||||
func (s *recordingSettler) AwardRank(int64, string, bool) {}
|
||||
func (s *recordingSettler) RecordGame(string, string, int, bool) {
|
||||
s.mu.Lock()
|
||||
s.records++
|
||||
@@ -478,7 +479,8 @@ func (s *recordingSettler) RecordGameResult(int64, bool) {
|
||||
s.mu.Unlock()
|
||||
}
|
||||
|
||||
func (s *recordingSettler) ChargePrivateTable(int64) error { return nil }
|
||||
func (s *recordingSettler) PlayerProfile(int64) (int64, string) { return 0, "" }
|
||||
func (s *recordingSettler) ChargePrivateTable(int64) error { return nil }
|
||||
func (s *recordingSettler) PrivateTableInfo(int64) (int, bool) { return 5, false }
|
||||
|
||||
// برای سرعتِ تست، بازی پس از ۲ هَند تمام میشود.
|
||||
|
||||
Reference in New Issue
Block a user