feat: add private and profile
This commit is contained in:
+42
-4
@@ -47,6 +47,7 @@ type Room struct {
|
||||
ID string
|
||||
hub *Hub
|
||||
tier string
|
||||
private bool // میز دورهمی: بدون ورودی/جایزه (فقط آمار ثبت میشود)
|
||||
settler Settler
|
||||
seats [4]*seatInfo
|
||||
game *game.Game
|
||||
@@ -130,6 +131,7 @@ func (r *Room) react() {
|
||||
switch r.game.Phase {
|
||||
case game.PhaseHandOver:
|
||||
res := r.game.LastResult
|
||||
r.recordHandStats(res)
|
||||
r.broadcast(mustJSON(handOverMsg{
|
||||
Type: "hand_over", WinnerTeam: res.WinnerTeam, Kot: res.Kot,
|
||||
HakemKot: res.HakemKot, Points: res.Points, Scores: r.game.Scores,
|
||||
@@ -144,6 +146,7 @@ func (r *Room) react() {
|
||||
r.armTimer()
|
||||
case game.PhaseGameOver:
|
||||
res := r.game.LastResult
|
||||
r.recordHandStats(res)
|
||||
r.broadcast(mustJSON(gameOverMsg{
|
||||
Type: "game_over", WinnerTeam: res.WinnerTeam, Scores: r.game.Scores,
|
||||
}))
|
||||
@@ -238,7 +241,7 @@ func (r *Room) handleInput(act roomAction) {
|
||||
r.sendError(act.seat, "invalid card")
|
||||
return
|
||||
}
|
||||
if err := r.game.PlayCard(act.seat, card); err != nil {
|
||||
if err := r.playCard(act.seat, card); err != nil {
|
||||
r.sendError(act.seat, err.Error())
|
||||
return
|
||||
}
|
||||
@@ -307,7 +310,37 @@ func (r *Room) autoPlayCard(seat int) {
|
||||
}
|
||||
}
|
||||
}
|
||||
_ = r.game.PlayCard(seat, choice)
|
||||
_ = r.playCard(seat, choice)
|
||||
}
|
||||
|
||||
// playCard کارت را بازی کرده و در صورت بُرِش با حکم، آن را برای آمار ثبت میکند.
|
||||
func (r *Room) playCard(seat int, card game.Card) error {
|
||||
wasFirst := len(r.game.Trick) == 0
|
||||
if err := r.game.PlayCard(seat, card); err != nil {
|
||||
return err
|
||||
}
|
||||
// بُرِش: کارتِ غیرِاولِ دست، از خالِ حکم، در حالی که خالِ زمینه حکم نبوده
|
||||
// ⇒ بازیکن خالِ زمینه را نداشته و با حکم بریده است.
|
||||
if !wasFirst && card.Suit == r.game.Trump && r.game.LeadSuit != r.game.Trump {
|
||||
if s := r.seats[seat]; !s.isBot && s.userID != 0 {
|
||||
r.settler.RecordCut(s.userID)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// recordHandStats آمار هر بازیکنِ انسان را برای هَندِ پایانیافته ثبت میکند.
|
||||
func (r *Room) recordHandStats(res *game.HandResult) {
|
||||
if res == nil {
|
||||
return
|
||||
}
|
||||
for seat, s := range r.seats {
|
||||
if s.isBot || s.userID == 0 {
|
||||
continue
|
||||
}
|
||||
won := game.Team(seat) == res.WinnerTeam
|
||||
r.settler.RecordHand(s.userID, won, res.Kot, seat == res.Hakem)
|
||||
}
|
||||
}
|
||||
|
||||
// handleLeave خروج دائمی یک بازیکن؛ جایگاهش به بات تبدیل میشود.
|
||||
@@ -383,15 +416,20 @@ func (r *Room) settleGameOver(res *game.HandResult) {
|
||||
if s.isBot || s.userID == 0 {
|
||||
continue
|
||||
}
|
||||
if game.Team(seat) == res.WinnerTeam {
|
||||
r.settler.AwardWinner(s.userID, r.tier)
|
||||
won := game.Team(seat) == res.WinnerTeam
|
||||
if won && !r.private {
|
||||
r.settler.AwardWinner(s.userID, r.tier) // میز دورهمی جایزهی سکه ندارد
|
||||
}
|
||||
r.settler.RecordGameResult(s.userID, won)
|
||||
}
|
||||
r.settler.RecordGame(r.ID, r.playersJSON(res.WinnerTeam), res.WinnerTeam, res.Kot)
|
||||
}
|
||||
|
||||
// refundAll ورودی را به بازیکنانِ انسان که داوطلبانه خارج نشدهاند بازمیگرداند.
|
||||
func (r *Room) refundAll() {
|
||||
if r.private {
|
||||
return // میز دورهمی ورودی نگرفته، پس بازگشتی هم ندارد
|
||||
}
|
||||
for _, s := range r.seats {
|
||||
if s.isBot || s.left || s.userID == 0 {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user