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") }