samba/server/truco/room/matchClubRoom.go
2025-06-04 09:51:39 +08:00

83 lines
2.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package room
import (
"fmt"
"samba/pkg/log"
"samba/pkg/xtime"
"samba/server/game/baseroom"
"samba/server/game/player"
"samba/server/truco/service"
"samba/stub"
"samba/util/config"
"samba/util/model"
"time"
)
type ClubMatchQueue struct{}
func (q ClubMatchQueue) Matching() {
if config.Cmd.IsClub <= 0 {
return
}
p := model.NewRobotScorePoolOp().Load()
if !xtime.IsTodayTimestamp(p.Time) {
// 非今天,重置分数池
model.NewRobotScorePoolOp().Reset()
*p = model.RobotScorePool{}
}
if p.Score <= -2000 {
// 总AI输了超过2000分不配置AI
service.TrucoService.NewTimer(2*time.Second, q.Matching, false, "ClubMatchQueue.Matching")
return
}
waitRooms := baseroom.RoomMgr.FindWaitRooms()
now := time.Now()
clubRobotMap := map[int]bool{}
for _, ir := range waitRooms {
if ir.ClubId() <= 0 {
continue
}
room := ir.(*TrucoRoom)
hasRobot, ok := clubRobotMap[ir.ClubId()]
if !ok {
info, err := model.NewClubInfoOp().Load(ir.ClubId())
if err != nil {
log.Error(fmt.Sprintf("failed to load club info %s", err))
continue
}
hasRobot = info.HasRobot()
clubRobotMap[ir.ClubId()] = hasRobot
}
if t := room.LatestSeatedTime(); t.IsZero() || now.Sub(t) < 90*time.Second || !hasRobot {
// 尚未到超时时间,或俱乐部在机器人投放白名单外
continue
}
var playerNum, robotNum int
for _, seat := range room.Seats {
if seat.Player() != nil {
playerNum++
if seat.Player().IsRobot() {
robotNum++
}
}
}
// 匹配机器人
robotConfig := stub.FindClubRobotConfig(room.RoomCnf.Blind, room.RoomCnf.PlayType)
if playerNum < room.RoomCnf.MinPlayers && robotNum < robotConfig.RobotNum {
if user := player.ClubRobotMgr.Pop(robotConfig, room.ClubId()); user != nil {
room.OnEnterRoom(user)
} else {
log.Warn(fmt.Sprintf("clubId %d has not robot", room.ClubId()))
}
}
}
service.TrucoService.NewTimer(2*time.Second, q.Matching, false, "ClubMatchQueue.Matching")
}