比赛场数据统计

This commit is contained in:
by 2024-05-11 17:10:30 +08:00
parent 0e6487256a
commit 355c6aae93
3 changed files with 96 additions and 54 deletions

View File

@ -7,32 +7,15 @@ import (
"github.com/globalsign/mgo/bson"
)
const (
MATCHPLAYER_FLAG_ISROB uint = iota //机器人
MATCHPLAYER_FLAG_ISFIRST //首次参赛
MATCHPLAYER_FLAG_ISNEWBIE //新人
MATCHPLAYER_FLAG_ISQUIT //退赛
MATCHPLAYER_FLAG_SIGNUP_USEFREE //免费报名
MATCHPLAYER_FLAG_SIGNUP_USETICKET //使用报名券报名
MATCHPLAYER_FLAG_SIGNUP_USECOIN //使用金币报名
)
// 比赛各阶段时间消耗
type MatchProcessTimeSpend struct {
Name string //赛程名称
MMType int32 //赛制类型
Spend int32 //用时,单位:秒
}
// 比赛参赛人员信息
type MatchPlayer struct {
SnId int32 //玩家id
Flag int32 //玩家类型,二进制 第1位:1是机器人,0玩家 第2位:1首次参加 0:非首次参加 第3位:1新人 0:老玩家 第4位:1退赛 0未退赛 第5位: 1免费报名 第6位: 1使用入场券报名 第7位: 1使用金币报名
Spend int32 //报名消耗
Gain int32 //获得奖励
Rank int32 //名次
WaitTime int32 //从报名到开始比赛的等待时间 单位:秒
MatchTime int32 //比赛中用时 从开始比赛到比赛结束总的用时 单位:秒
SnId int32 //玩家id
CostCoin int64 //报名消耗金币
CostDiamond int64 //报名消耗钻石
Coin int64 //比赛获得金币
Diamond int64 //比赛获得钻石
Item map[int32]int64 //比赛获得物品id
Rank int32 //名次
}
// 比赛牌局记录
@ -47,35 +30,14 @@ type MatchGameLog struct {
// 比赛详情
type MatchLog struct {
Id bson.ObjectId `bson:"_id"`
Platform string //平台编号
MatchId int32 //比赛编号
MatchName string //比赛名称
GameFreeId int32 //游戏类型
StartTime time.Time //开始时间
EndTime time.Time //结束时间
Players []*MatchPlayer //参赛人员数据
TimeSpend []*MatchProcessTimeSpend //赛程用时
GameLogs []*MatchGameLog //牌局记录
}
func (ml *MatchLog) AppendMatchProcess(name string, mmtype int32, spend int32) {
ml.TimeSpend = append(ml.TimeSpend, &MatchProcessTimeSpend{
Name: name,
MMType: mmtype,
Spend: spend,
})
}
func (ml *MatchLog) AppendGameLog(name string, gamelogId string, processIdx, numOfGame, spendTime int32, snids []int32) {
ml.GameLogs = append(ml.GameLogs, &MatchGameLog{
Name: name,
GameLogId: gamelogId,
ProcessIdx: processIdx,
NumOfGame: numOfGame,
SpendTime: spendTime,
SnIds: snids,
})
Id bson.ObjectId `bson:"_id"`
Platform string //平台编号
MatchId int32 //比赛编号
MatchName string //比赛名称
GameFreeId int32 //游戏类型
StartTime time.Time //开始时间
EndTime time.Time //结束时间
Players []*MatchPlayer //参赛人员数据
}
var (

View File

@ -34,6 +34,7 @@ type TmMatch struct {
robotGrades map[int][]*TmGradeInfo // 第几轮:玩家积分
copyRobotGrades []*TmGradeInfo // 最近一轮的机器人积分备份
useRobot int32 // 是否使用机器人
StartTime int64 // 本场比赛开始时间
}
type TmGradeInfo struct {
@ -52,7 +53,7 @@ func (tm *TmMatch) Start() {
proto.SetDefaults(pack)
logger.Logger.Trace("SCTMStart:", pack)
tm.BroadcastMessage(int(tournament.TOURNAMENTID_PACKET_TM_SCTMStart), pack)
tm.StartTime = time.Now().Unix()
//创建房间
timer.StartTimer(timer.TimerActionWrapper(func(h timer.TimerHandle, ud interface{}) bool {
MatchSceneMgrSingleton.MatchStart(tm)

View File

@ -1010,6 +1010,24 @@ func (this *Tournament) sendPromotionInfo(mc *PlayerMatchContext, sortId int32,
this.CheckAddMatchSeasonLv(mc)
}
delete(this.players[sortId], mc.p.SnId)
//真人被淘汰,如果剩下的都是机器人,比赛解散
if !mc.p.IsRob {
if this.players[sortId] != nil {
hasReal := false
for snid, context := range this.players[sortId] {
if !context.p.IsRob && !this.isOut(sortId, snid) { // 有真人没有淘汰
hasReal = true
break
}
}
//没有真人比赛解散
if !hasReal {
logger.Logger.Trace("没有真人比赛解散")
this.StopMatch(mc.tm.TMId, sortId)
}
}
}
}
}
@ -1196,6 +1214,8 @@ func (this *Tournament) CheckAddMatchSeasonLv(mc *PlayerMatchContext) {
func (this *Tournament) StopMatch(tmId, sortId int32) {
//房间清理
if this.matches[tmId] != nil && this.matches[tmId][sortId] != nil {
matchLog := this.MakeMatchLog(this.matches[tmId][sortId].Platform, tmId, sortId)
this.saveMatchLog(matchLog)
this.matches[tmId][sortId].Stop()
delete(this.matches[tmId], sortId)
}
@ -1426,3 +1446,62 @@ func (this *Tournament) Shutdown() {
func init() {
module.RegisteModule(TournamentMgr, time.Second, 0)
}
func (this *Tournament) MakeMatchLog(platform string, tmId, sortId int32) *model.MatchLog {
gameMatchDate := this.GetMatchInfo(platform, tmId)
matchLog := model.NewMatchLog()
players := this.copyPlayers[sortId][1]
for _, player := range players {
if !player.p.IsRob {
var coin, diamond int64
items := make(map[int32]int64)
rankId := int32(-1)
perRankInfo := this.finalPerRank[sortId]
for _, info := range perRankInfo {
if info.SnId == player.p.SnId {
rankId = info.RankId
break
}
}
if gameMatchDate.Award != nil {
for _, award := range gameMatchDate.Award {
if rankId >= award.UpLimit && rankId <= award.DownLimit { //上下限是反的,我也是醉了
coin = award.Coin
diamond = award.Diamond
if award.ItemId != nil {
for _, info := range award.ItemId {
items[info.ItemId] = info.ItemNum
}
}
}
}
}
matchLog.Players = append(matchLog.Players, &model.MatchPlayer{
SnId: player.p.SnId,
CostCoin: this.matches[tmId][sortId].gmd.SignupCostCoin,
CostDiamond: this.matches[tmId][sortId].gmd.SignupCostDiamond,
Coin: coin,
Diamond: diamond,
Item: items,
Rank: rankId,
})
}
}
matchLog.MatchId = tmId
matchLog.MatchName = gameMatchDate.MatchName
matchLog.Platform = platform
matchLog.GameFreeId = gameMatchDate.GameFreeId
matchLog.StartTime = time.Unix(this.matches[tmId][sortId].StartTime, 0)
matchLog.EndTime = time.Now()
logger.Logger.Trace("比赛场log记录", matchLog)
return matchLog
}
func (this *Tournament) saveMatchLog(matchLog *model.MatchLog) {
err := model.InsertMatchLogs(matchLog)
if err != nil {
logger.Logger.Error("saveMatchLog error %v", err)
return
}
}