samba/server/truco/room/matchClubRoom.go

83 lines
2.0 KiB
Go
Raw Normal View History

2025-06-04 09:51:39 +08:00
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")
}