feat: add characters

This commit is contained in:
2026-07-10 00:56:03 +03:30
parent da6df0328f
commit fe0b63083c
19 changed files with 635 additions and 92 deletions
+7 -6
View File
@@ -391,13 +391,14 @@ func (h *Hub) removeFromTable(t *pendingTable, c *Client) {
func (h *Hub) broadcastLobby(t *pendingTable) {
players := make([]lobbyPlayer, len(t.clients))
for i, cl := range t.clients {
_, _, avatar, frame := h.settler.PlayerProfile(cl.UserID)
_, _, avatar, frame, avatarImg := h.settler.PlayerProfile(cl.UserID)
players[i] = lobbyPlayer{
Name: cl.Name,
Avatar: avatar,
Frame: frame,
Host: cl.UserID == t.host,
Seat: t.seatOf(i),
Name: cl.Name,
Avatar: avatar,
Frame: frame,
AvatarImg: avatarImg,
Host: cl.UserID == t.host,
Seat: t.seatOf(i),
}
}
for i, cl := range t.clients {
+8 -6
View File
@@ -27,10 +27,11 @@ type chatMsg struct {
// lobbyPlayer یک بازیکن در اتاق انتظارِ میز خصوصی.
type lobbyPlayer struct {
Name string `json:"name"`
Avatar string `json:"avatar"` // seed آواتارِ کاربر
Frame string `json:"frame"` // قابِ آواتارِ انتخابی
Host bool `json:"host"`
Name string `json:"name"`
Avatar string `json:"avatar"` // seed آواتارِ کاربر
Frame string `json:"frame"` // قابِ آواتارِ انتخابی
AvatarImg string `json:"avatar_img"` // شخصیتِ آواتارِ انتخابی (خالی ⇒ تصادفی)
Host bool `json:"host"`
Seat int `json:"seat"` // جایگاهِ مطلق (۰..۳)
}
@@ -66,8 +67,9 @@ type PlayerInfo struct {
Connected bool `json:"connected"`
Coins int64 `json:"coins"`
RankTier string `json:"rank_tier"` // bronze..king (برای نشانِ رتبه)
Avatar string `json:"avatar"` // seed آواتارِ کاربر
Frame string `json:"frame"` // قابِ آواتارِ انتخابی (کازمتیک)
Avatar string `json:"avatar"` // seed آواتارِ کاربر
Frame string `json:"frame"` // قابِ آواتارِ انتخابی (کازمتیک)
AvatarImg string `json:"avatar_img"` // شخصیتِ آواتارِ انتخابی (خالی ⇒ تصادفی)
}
// matchedMsg به کلاینت پس از تشکیل میز.
+3 -1
View File
@@ -41,6 +41,7 @@ type seatInfo struct {
rankTier string // نشانِ رتبه برای نمایش سرِ میز
avatar string // seed آواتارِ انتخابیِ کاربر (برای نمایش سرِ میز)
frame string // قابِ آواتارِ انتخابیِ کاربر (کازمتیک)
avatarImg string // شناسه‌ی شخصیتِ آواتارِ انتخابی (خالی ⇒ آواتارِ تصادفی)
}
// auto مشخص می‌کند جایگاه باید خودکار بازی شود (بات یا قطع‌شده).
@@ -148,7 +149,7 @@ func (r *Room) start() {
if s.isBot || s.userID == 0 {
continue
}
s.coins, s.rankTier, s.avatar, s.frame = r.settler.PlayerProfile(s.userID)
s.coins, s.rankTier, s.avatar, s.frame, s.avatarImg = r.settler.PlayerProfile(s.userID)
}
for seat, s := range r.seats {
if s.client != nil {
@@ -549,6 +550,7 @@ func (r *Room) playersInfo() []PlayerInfo {
Seat: i, Name: s.name, Bot: s.isBot,
Connected: s.isBot || s.connected,
Coins: s.coins, RankTier: s.rankTier, Avatar: s.avatar, Frame: s.frame,
AvatarImg: s.avatarImg,
}
}
return out
+6 -3
View File
@@ -12,8 +12,9 @@ type Settler interface {
RecordHand(userID int64, won, kot, asHakem bool) // پایان یک هَند
RecordCut(userID int64) // بُرِش با حکم
RecordGameResult(userID int64, won bool) // پایان بازی (برد/باخت)
// PlayerProfile سکه، نشانِ رتبه، آواتار و قابِ انتخابیِ بازیکن را برای نمایش سرِ میز برمی‌گرداند.
PlayerProfile(userID int64) (coins int64, rankTier string, avatar string, frame string)
// PlayerProfile سکه، نشانِ رتبه، آواتار، قاب و شخصیتِ آواتارِ انتخابیِ بازیکن را
// برای نمایش سرِ میز برمی‌گرداند (avatarImg خالی ⇒ آواتارِ تصادفیِ پیش‌فرض).
PlayerProfile(userID int64) (coins int64, rankTier, avatar, frame, avatarImg string)
// ChargeTicket یک بلیت برای بُرِ مجدد در فازِ انتخابِ حکم مصرف می‌کند.
ChargeTicket(userID int64) error
// ChargeCoins/AwardCoins برای شرطِ سکه‌ایِ میزِ خصوصی (pot). Charge در صورتِ
@@ -38,7 +39,9 @@ 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, string, string) { return 0, "", "", "" }
func (noopSettler) PlayerProfile(int64) (int64, string, string, string, string) {
return 0, "", "", "", ""
}
func (noopSettler) ChargeTicket(int64) error { return nil }
func (noopSettler) ChargeCoins(int64, int64, string) error { return nil }
func (noopSettler) AwardCoins(int64, int64, string) {}
+3 -1
View File
@@ -481,7 +481,9 @@ func (s *recordingSettler) RecordGameResult(int64, bool) {
s.mu.Unlock()
}
func (s *recordingSettler) PlayerProfile(int64) (int64, string, string, string) { return 0, "", "", "" }
func (s *recordingSettler) PlayerProfile(int64) (int64, string, string, string, string) {
return 0, "", "", "", ""
}
func (s *recordingSettler) ChargeTicket(int64) error { return nil }
func (s *recordingSettler) ChargeCoins(int64, int64, string) error { return nil }
func (s *recordingSettler) AwardCoins(int64, int64, string) {}