From 975643cacc0bcb776622ec66be5d4aef26444446 Mon Sep 17 00:00:00 2001 From: 王家文 Date: Wed, 15 May 2024 15:41:25 +0800 Subject: [PATCH] feat✨:排行榜功能 报名条件 分数计算 --- service/code-msg/code-msg.go | 2 ++ service/roomrank/handle.go | 15 +++++++++++++++ service/roomrank/room.go | 42 +++++++++++++++++++++++++++--------------- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/service/code-msg/code-msg.go b/service/code-msg/code-msg.go index 0c182ce..d03289c 100644 --- a/service/code-msg/code-msg.go +++ b/service/code-msg/code-msg.go @@ -53,6 +53,7 @@ const ( RECODE_MERGE_ROOMRANK_LEVEL_ERROR = "2201" RECODE_MERGE_ROOMRANK_HASSETTLE_ERROR = "2202" RECODE_MERGE_ROOMRANK_NOTHASSETTLE_ERROR = "2203" + RECODE_MERGE_ROOMRANK_CANTSIGN_ERROR = "2204" ) var recodeText = map[string]string{ @@ -106,6 +107,7 @@ var recodeText = map[string]string{ RECODE_MERGE_ROOMRANK_LEVEL_ERROR: "参与等级不足", RECODE_MERGE_ROOMRANK_HASSETTLE_ERROR: "还有未领取的结算奖励", RECODE_MERGE_ROOMRANK_NOTHASSETTLE_ERROR: "没有未领取的结算奖励", + RECODE_MERGE_ROOMRANK_CANTSIGN_ERROR: "活动倒计时不允许报名", } func RecodeText(code string) string { diff --git a/service/roomrank/handle.go b/service/roomrank/handle.go index 9090a04..856bf66 100644 --- a/service/roomrank/handle.go +++ b/service/roomrank/handle.go @@ -4,6 +4,7 @@ import ( "apigame/configs/confroomrank" "apigame/models" "apigame/service/code-msg" + "apigame/util/util-lx/lxtime" "apigame/util/zredislock" ) @@ -70,6 +71,13 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan code = code_msg.RECODE_MERGE_ROOMRANK_LEVEL_ERROR return } + // 于此同时,如果活动倒计时 < 关门时间 * 2,则不再允许报名 + secNow := lxtime.NowUninx() + dtEnd := GetTimeEnd(activityTime, config.ReleaseTime).Unix() + if secNow > dtEnd-RoomCloseSecond*2 { + code = code_msg.RECODE_MERGE_ROOMRANK_CANTSIGN_ERROR + return + } needSavePlayer := false defer func() { @@ -218,6 +226,13 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs code = code_msg.RECODE_MERGE_ROOMRANK_LEVEL_ERROR return } + // 于此同时,如果活动倒计时 < 关门时间 * 2,则不再允许报名 + secNow := lxtime.NowUninx() + dtEnd := GetTimeEnd(activityTime, config.ReleaseTime).Unix() + if secNow > dtEnd-RoomCloseSecond*2 { + code = code_msg.RECODE_MERGE_ROOMRANK_CANTSIGN_ERROR + return + } needSavePlayer := false defer func() { diff --git a/service/roomrank/room.go b/service/roomrank/room.go index 33021ce..27287a5 100644 --- a/service/roomrank/room.go +++ b/service/roomrank/room.go @@ -169,8 +169,7 @@ func TryCloseRoom(gameId string, room *Room, config *confroomrank.ActivityConfig return } secNow := lxtime.NowUninx() - dateEnd := GetTimeEnd(room.ActivityTime, config.ReleaseTime) - if secNow > dateEnd.Unix()-RoomCloseSecond { + if secNow > room.CreateTime+RoomCloseSecond { room.Closed = true // 根据缺口自动填充机器人 for i := 0; i < len(roomConfig.PlayerTypeCount); i++ { @@ -183,6 +182,9 @@ func TryCloseRoom(gameId string, room *Room, config *confroomrank.ActivityConfig room.Details.Players = append(room.Details.Players, roomPlayer) } } + // 填充完之后要排序计算 + TryReSort(room, config) + SaveRoom(gameId, room) } } @@ -214,17 +216,17 @@ func JoinInitRobot(gameId string, room *Room, roomConfig confroomrank.RoomConfig } // TrySettleRoom 尝试结算房间 -func TrySettleRoom(gameId string, room *Room, confActivity *confroomrank.ActivityConfig) { +func TrySettleRoom(gameId string, room *Room, config *confroomrank.ActivityConfig) { // 已经结算过的不结算 if room.HasSettle { return } // 活动切换或者时间到 触发结算 needSettle := false - if room.ActivityId != confActivity.Id { + if room.ActivityId != config.Id { needSettle = true } else { - dateEnd := GetTimeEnd(room.ActivityTime, confActivity.ReleaseTime) + dateEnd := GetTimeEnd(room.ActivityTime, config.ReleaseTime) dtNow := lxtime.NowUninx() if dtNow >= dateEnd.Unix() { needSettle = true @@ -235,15 +237,28 @@ func TrySettleRoom(gameId string, room *Room, confActivity *confroomrank.Activit return } + percent := float64(0) + dateEnd := GetTimeEnd(room.ActivityTime, config.ReleaseTime) + secTotal := 24 * 60 * 60 + dtEnd := dateEnd.Unix() + if dtEnd > config.EndTime { + dtEnd = config.EndTime + } + dtCreate := room.CreateTime + if dtEnd <= dtCreate { + percent = 0 + } else { + percent = float64(dtEnd-dtCreate) * 100 / float64(secTotal) + } // 机器人最终算分 for i := 0; i < len(room.Details.Players); i++ { roomPlayer := room.Details.Players[i] if roomPlayer.RobotConfigId == 0 { continue } - confRobot, hasConfRobot := confActivity.Robot[roomPlayer.RobotConfigId] + confRobot, hasConfRobot := config.Robot[roomPlayer.RobotConfigId] if hasConfRobot { - roomPlayer.Score = GetRobotScoreMax(&confRobot) + roomPlayer.Score = GetRobotScoreCurrent(&confRobot, percent) } } @@ -262,23 +277,20 @@ func TryResetRobot(room *Room, config *confroomrank.ActivityConfig) { percent := float64(0) dateEnd := GetTimeEnd(room.ActivityTime, config.ReleaseTime) - dateStart := dateEnd.AddDate(0, 0, -1) - dtStart := dateStart.Unix() + secTotal := 24 * 60 * 60 dtEnd := dateEnd.Unix() - if dtStart < config.StartTime { - dtStart = config.StartTime - } if dtEnd > config.EndTime { dtEnd = config.EndTime } - if dtEnd <= dtStart { + dtCreate := room.CreateTime + if dtEnd <= dtCreate { percent = 0 - } else if secNow <= dtStart { + } else if secNow <= dtCreate { percent = 0 } else if secNow >= dtEnd { percent = 100 } else { - percent = float64(secNow-dtStart) * 100 / float64(dtEnd-dtStart) + percent = float64(secNow-dtCreate) * 100 / float64(secTotal) } // 机器人即时算分 -- libgit2 0.21.0