ro-webgl-server/server/roserver/fruit/model/live_answer_room.go

198 lines
5.7 KiB
Go
Raw Normal View History

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
}