2025-12-05 20:15:55 +08:00
|
|
|
|
package model
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
import (
|
2026-01-16 19:33:39 +08:00
|
|
|
|
"fmt"
|
2025-12-09 17:49:29 +08:00
|
|
|
|
model2 "roserver/baseserver/model"
|
|
|
|
|
|
gameModel "roserver/game/model"
|
|
|
|
|
|
"roserver/serverproto"
|
|
|
|
|
|
)
|
2025-12-05 20:15:55 +08:00
|
|
|
|
|
|
|
|
|
|
type LiveAnswerRoom struct {
|
|
|
|
|
|
LiveRoom
|
2025-12-09 17:49:29 +08:00
|
|
|
|
questions []*QuestionInfo
|
|
|
|
|
|
userAnswers map[uint64]*AnswerInfo
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type QuestionInfo struct {
|
|
|
|
|
|
questionCfg *serverproto.LiveRoomQuestionCfg
|
|
|
|
|
|
options []int32
|
|
|
|
|
|
answer int32
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type AnswerInfo struct {
|
|
|
|
|
|
uid uint64
|
|
|
|
|
|
answers map[uint64]int32
|
|
|
|
|
|
rewardItems []*serverproto.KeyValueType
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func newLiveAnswerRoom(roomId uint32, tickInterval uint32) *LiveAnswerRoom {
|
|
|
|
|
|
room := &LiveAnswerRoom{
|
|
|
|
|
|
LiveRoom: newLiveRoom(roomId, LIVEROOM_TYPE_ANSWER, tickInterval),
|
|
|
|
|
|
}
|
2025-12-13 17:06:18 +08:00
|
|
|
|
room.SetVF()
|
2025-12-05 20:15:55 +08:00
|
|
|
|
return room
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-13 17:06:18 +08:00
|
|
|
|
func (self *LiveAnswerRoom) SetVF() {
|
|
|
|
|
|
self.VF_GetMaxReadyNum = self.GetMaxReadyNum
|
|
|
|
|
|
self.VF_GetCMDPlayDataList = self.GetCMDPlayDataList
|
|
|
|
|
|
self.VF_GetShowResultList = self.GetShowResultList
|
|
|
|
|
|
self.VF_GetShowRewardList = self.GetShowRewardList
|
|
|
|
|
|
self.VF_HasShowData = self.HasShowData
|
|
|
|
|
|
self.VF_GetShowData = self.GetShowData
|
|
|
|
|
|
self.VF_HandleShowSubmit = self.HandleShowSubmit
|
|
|
|
|
|
self.VF_GetStageEnterParams = self.GetStageEnterParams
|
|
|
|
|
|
self.VF_ReadyStart = self.ReadyStart
|
|
|
|
|
|
self.VF_ShowStart = self.ShowStart
|
|
|
|
|
|
self.VF_CheckIfShowEnd = self.CheckIfShowEnd
|
|
|
|
|
|
self.VF_ShowEnd = self.ShowEnd
|
|
|
|
|
|
self.VF_HandlePlayCMD = self.HandlePlayCMD
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-05 20:15:55 +08:00
|
|
|
|
func (self *LiveAnswerRoom) GetMaxReadyNum(roomType uint32) int {
|
|
|
|
|
|
return LIVEROOM_ANSWER_MAX_READY_NUM
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
func (self *LiveAnswerRoom) ShowStart() {
|
|
|
|
|
|
self.userAnswers = make(map[uint64]*AnswerInfo)
|
|
|
|
|
|
self.questions = make([]*QuestionInfo, 0)
|
|
|
|
|
|
liveRoomQuestionCfg := serverproto.LiveRoomQuestionCfgLoader
|
|
|
|
|
|
keys := RandomKeys(liveRoomQuestionCfg, 1)
|
|
|
|
|
|
for _, key := range keys {
|
|
|
|
|
|
cfg := liveRoomQuestionCfg[key]
|
|
|
|
|
|
options := []int32{1, 2, 3, 4}
|
|
|
|
|
|
answerIdx := cfg.Answer
|
|
|
|
|
|
ShuffleInPlace(options)
|
|
|
|
|
|
for i := 0; i < len(options); i++ {
|
|
|
|
|
|
if options[i] == answerIdx {
|
|
|
|
|
|
answerIdx = int32(i + 1)
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
self.questions = append(self.questions, &QuestionInfo{
|
|
|
|
|
|
questionCfg: cfg,
|
|
|
|
|
|
options: options,
|
|
|
|
|
|
answer: answerIdx,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
func (self *LiveAnswerRoom) CheckAnswer(questionId int32, answer int32) bool {
|
|
|
|
|
|
for _, v := range self.questions {
|
|
|
|
|
|
if v.questionCfg.Id == questionId && v.answer == answer {
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 对游戏进行结算
|
|
|
|
|
|
func (self *LiveAnswerRoom) ShowEnd() {
|
|
|
|
|
|
for _, v := range self.userAnswers {
|
|
|
|
|
|
score := 0
|
|
|
|
|
|
for questionId, answer := range v.answers {
|
|
|
|
|
|
if self.CheckAnswer(int32(questionId), answer) {
|
|
|
|
|
|
score += 1
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if score > 0 {
|
|
|
|
|
|
for _, str := range self.LiveRoom.roomCfg.RewardS {
|
|
|
|
|
|
itemId, itemNum := model2.Str2Res(str)
|
|
|
|
|
|
v.rewardItems = append(v.rewardItems, &serverproto.KeyValueType{Key: itemId, Value: itemNum})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
self.LiveRoom.AddItemList(v.uid, v.rewardItems, int32(gameModel.AddFrom_LiveRoom_Answer), false)
|
|
|
|
|
|
}
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
// Play命令:用于给客户端发送命令,显示题目,这里返回客户端显示题目相关数据
|
2025-12-12 19:20:10 +08:00
|
|
|
|
func (self *LiveAnswerRoom) GetCMDPlayDataList(readyUidList []uint64, uid uint64, cfg *serverproto.LiveRoomTalkCfg) []*serverproto.KeyValueType64 {
|
2025-12-05 20:15:55 +08:00
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
|
// 返回玩家分数排名
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetShowResultList(readyUidList []uint64, uid uint64) []*serverproto.LiveRoomPlayerInfo {
|
|
|
|
|
|
playerResults := make([]*serverproto.LiveRoomPlayerInfo, 0)
|
2026-01-16 19:33:39 +08:00
|
|
|
|
for _, tmpUid := range self.readyUidList {
|
|
|
|
|
|
playerInfo := MakeLiveRoomPlayerInfo(tmpUid)
|
2025-12-09 17:49:29 +08:00
|
|
|
|
playerInfo.Data = "0"
|
2026-01-16 19:33:39 +08:00
|
|
|
|
if userAnswerInfo, exist := self.userAnswers[tmpUid]; exist {
|
2025-12-09 17:49:29 +08:00
|
|
|
|
for k, v := range userAnswerInfo.answers {
|
|
|
|
|
|
questionId := k
|
|
|
|
|
|
answer := v
|
|
|
|
|
|
if self.CheckAnswer(int32(questionId), answer) {
|
|
|
|
|
|
playerInfo.Data = "1"
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-16 19:33:39 +08:00
|
|
|
|
playerResults = append(playerResults, playerInfo)
|
2025-12-09 17:49:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
return playerResults
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回玩家玩游戏得到的奖励
|
2025-12-12 19:20:10 +08:00
|
|
|
|
func (self *LiveAnswerRoom) GetShowRewardList(readyUidList []uint64, uid uint64) []*serverproto.KeyValueType64 {
|
|
|
|
|
|
rewardList := make([]*serverproto.KeyValueType64, 0)
|
2025-12-09 17:49:29 +08:00
|
|
|
|
if userAnswerInfo, exist := self.userAnswers[uid]; exist {
|
|
|
|
|
|
for _, v := range userAnswerInfo.rewardItems {
|
2025-12-12 19:20:10 +08:00
|
|
|
|
rewardList = append(rewardList, &serverproto.KeyValueType64{
|
|
|
|
|
|
Key: uint64(v.Key),
|
|
|
|
|
|
Value: v.Value,
|
2025-12-09 17:49:29 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return rewardList
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (self *LiveAnswerRoom) HasShowData() bool {
|
2026-01-16 19:33:39 +08:00
|
|
|
|
return true
|
2025-12-09 17:49:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回游戏过程中的状态数据
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetShowData(readyUidList []uint64, uid uint64) []*serverproto.KeyValueType64 {
|
2026-01-16 19:33:39 +08:00
|
|
|
|
showData := make([]*serverproto.KeyValueType64, 0)
|
|
|
|
|
|
for _, v := range self.userAnswers {
|
|
|
|
|
|
score := 0
|
|
|
|
|
|
for questionId, answer := range v.answers {
|
|
|
|
|
|
if self.CheckAnswer(int32(questionId), answer) {
|
|
|
|
|
|
score += 1
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
showData = append(showData, &serverproto.KeyValueType64{
|
|
|
|
|
|
Key: v.uid,
|
|
|
|
|
|
Value: int32(score),
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
return showData
|
2025-12-09 17:49:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理玩家在游戏过程中提交的输入,玩家提交选择
|
|
|
|
|
|
func (self *LiveAnswerRoom) HandleShowSubmit(uid uint64, data []*serverproto.KeyValueType64) []*serverproto.KeyValueType64 {
|
|
|
|
|
|
submitResult := make([]*serverproto.KeyValueType64, 0)
|
|
|
|
|
|
if _, exist := self.userAnswers[uid]; exist == false {
|
|
|
|
|
|
self.userAnswers[uid] = &AnswerInfo{
|
|
|
|
|
|
uid: uid,
|
|
|
|
|
|
answers: map[uint64]int32{},
|
|
|
|
|
|
rewardItems: make([]*serverproto.KeyValueType, 0),
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, v := range data {
|
|
|
|
|
|
questionId := v.Key
|
2026-01-16 19:33:39 +08:00
|
|
|
|
answer := v.Value
|
2025-12-12 19:20:10 +08:00
|
|
|
|
self.userAnswers[uid].answers[questionId] = int32(answer)
|
2025-12-09 17:49:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
return submitResult
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 返回进入游戏阶段的一些初始化配置数据,下发题库
|
|
|
|
|
|
func (self *LiveAnswerRoom) GetStageEnterParams(stage uint32) string {
|
|
|
|
|
|
stageEnterParams := ""
|
|
|
|
|
|
switch stage {
|
|
|
|
|
|
case LIVEROOM_STAGE_SHOW:
|
2026-01-16 19:33:39 +08:00
|
|
|
|
optionStr := ArrayJoin(self.questions[0].options, "-")
|
|
|
|
|
|
stageEnterParams = fmt.Sprintf("question:%d;options:%s", self.questions[0].questionCfg.Id, optionStr)
|
2025-12-09 17:49:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
return stageEnterParams
|
2025-12-05 20:15:55 +08:00
|
|
|
|
}
|