2025-12-05 20:15:55 +08:00
|
|
|
package model
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"math/rand"
|
|
|
|
|
"rocommon/util"
|
|
|
|
|
"roserver/baseserver/model"
|
|
|
|
|
model2 "roserver/game/model"
|
|
|
|
|
"roserver/serverproto"
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
2025-12-05 20:15:55 +08:00
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
ROLL_CARD_X5 = 5
|
|
|
|
|
ROLL_CARD_TYPE_NORMAL = 1
|
|
|
|
|
ROLL_CARD_TYPE_MINI = 2
|
|
|
|
|
ROLL_CARD_TYPE_MVP = 3
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type RollCardCfg struct {
|
|
|
|
|
cardId int32
|
|
|
|
|
cardType int32
|
|
|
|
|
cardLevel int32
|
2025-12-09 17:49:29 +08:00
|
|
|
weight int
|
|
|
|
|
rangeStart int
|
|
|
|
|
rangeEnd int
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type LiveCardRoom struct {
|
|
|
|
|
LiveRoom
|
|
|
|
|
rollCardCfgList []*RollCardCfg
|
2025-12-12 19:20:10 +08:00
|
|
|
rollCards []*serverproto.KeyValueType64
|
|
|
|
|
showRewards []*serverproto.KeyValueType64
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newLiveCardRoom(roomId uint32, tickInterval uint32) *LiveCardRoom {
|
|
|
|
|
room := &LiveCardRoom{
|
2025-12-09 17:49:29 +08:00
|
|
|
LiveRoom: newLiveRoom(roomId, LIVEROOM_TYPE_CARD, tickInterval),
|
2025-12-12 19:20:10 +08:00
|
|
|
rollCards: make([]*serverproto.KeyValueType64, 0),
|
|
|
|
|
showRewards: make([]*serverproto.KeyValueType64, 0),
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
2025-12-13 17:06:18 +08:00
|
|
|
room.SetVF()
|
2025-12-05 20:15:55 +08:00
|
|
|
room.Init()
|
|
|
|
|
return room
|
|
|
|
|
}
|
2025-12-13 17:06:18 +08:00
|
|
|
|
|
|
|
|
func (self *LiveCardRoom) 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-09 17:49:29 +08:00
|
|
|
}
|
2025-12-05 20:15:55 +08:00
|
|
|
|
|
|
|
|
func (self *LiveCardRoom) Init() {
|
|
|
|
|
cardCfg := serverproto.CardCfgLoader
|
|
|
|
|
for _, v := range cardCfg {
|
2025-12-09 17:49:29 +08:00
|
|
|
if v.CardId < 20000 {
|
|
|
|
|
switch v.CardType {
|
|
|
|
|
case ROLL_CARD_TYPE_NORMAL:
|
|
|
|
|
self.rollCardCfgList = append(self.rollCardCfgList, &RollCardCfg{
|
|
|
|
|
cardId: v.CardId,
|
|
|
|
|
cardType: v.CardType,
|
|
|
|
|
cardLevel: v.CardLevel,
|
|
|
|
|
weight: 5 * (6 - int(v.CardLevel)),
|
|
|
|
|
rangeStart: 0,
|
|
|
|
|
rangeEnd: 0,
|
|
|
|
|
})
|
|
|
|
|
case ROLL_CARD_TYPE_MINI:
|
|
|
|
|
self.rollCardCfgList = append(self.rollCardCfgList, &RollCardCfg{
|
|
|
|
|
cardId: v.CardId,
|
|
|
|
|
cardType: v.CardType,
|
|
|
|
|
cardLevel: v.CardLevel,
|
|
|
|
|
weight: 5 * (6 - int(v.CardLevel)),
|
|
|
|
|
rangeStart: 0,
|
|
|
|
|
rangeEnd: 0,
|
|
|
|
|
})
|
|
|
|
|
case ROLL_CARD_TYPE_MVP:
|
|
|
|
|
self.rollCardCfgList = append(self.rollCardCfgList, &RollCardCfg{
|
|
|
|
|
cardId: v.CardId,
|
|
|
|
|
cardType: v.CardType,
|
|
|
|
|
cardLevel: v.CardLevel,
|
|
|
|
|
weight: 5 * (6 - int(v.CardLevel)),
|
|
|
|
|
rangeStart: 0,
|
|
|
|
|
rangeEnd: 0,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var offset int = 0
|
|
|
|
|
for _, v := range self.rollCardCfgList {
|
|
|
|
|
if v.cardType == ROLL_CARD_TYPE_NORMAL {
|
|
|
|
|
v.rangeStart += offset
|
|
|
|
|
v.rangeEnd = v.rangeStart + v.weight - 1
|
|
|
|
|
offset += v.weight
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
offset = 0
|
|
|
|
|
for _, v := range self.rollCardCfgList {
|
|
|
|
|
if v.cardType == ROLL_CARD_TYPE_MINI {
|
|
|
|
|
v.rangeStart += offset
|
|
|
|
|
v.rangeEnd = v.rangeStart + v.weight - 1
|
|
|
|
|
offset += v.weight
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
offset = 0
|
|
|
|
|
for _, v := range self.rollCardCfgList {
|
|
|
|
|
if v.cardType == ROLL_CARD_TYPE_MVP {
|
|
|
|
|
v.rangeStart += offset
|
|
|
|
|
v.rangeEnd = v.rangeStart + v.weight - 1
|
|
|
|
|
offset += v.weight
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
//Test RollCards
|
|
|
|
|
result1 := self.RollCards(1, 1)
|
|
|
|
|
result2 := self.RollCards(2, 3)
|
|
|
|
|
result3 := self.RollCards(3, 5)
|
|
|
|
|
//addItems := make([]*serverproto.KeyValueType, 0)
|
|
|
|
|
//for _, v := range result3 {
|
|
|
|
|
// itemId, itemNum := model.Str2Res(v)
|
|
|
|
|
// addItems = append(addItems, &serverproto.KeyValueType{Key: itemId, Value: itemNum})
|
|
|
|
|
//}
|
|
|
|
|
//self.AddItemList(self.LiveRoom.uidList[0], addItems, int32(model2.AddFrom_LiveRoom_Card), false)
|
|
|
|
|
util.InfoF("result: ", strings.Join(result1, ";"), strings.Join(result2, ";"), strings.Join(result3, ";"))
|
|
|
|
|
//for _, v := range self.rollCardCfgList {
|
|
|
|
|
// if v.cardType == ROLL_CARD_TYPE_NORMAL {
|
|
|
|
|
// util.InfoF("rollCfg-ROLL_CARD_TYPE_NORMAL: cardId-%d cardLv-%d [%d, %d]", v.cardId, v.cardLevel, v.rangeStart, v.rangeEnd)
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
//for _, v := range self.rollCardCfgList {
|
|
|
|
|
// if v.cardType == ROLL_CARD_TYPE_MINI {
|
|
|
|
|
// util.InfoF("rollCfg-ROLL_CARD_TYPE_MINI: cardId-%d cardLv-%d [%d, %d]", v.cardId, v.cardLevel, v.rangeStart, v.rangeEnd)
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
//for _, v := range self.rollCardCfgList {
|
|
|
|
|
// if v.cardType == ROLL_CARD_TYPE_MVP {
|
|
|
|
|
// util.InfoF("rollCfg-ROLL_CARD_TYPE_MVP: cardId-%d cardLv-%d [%d, %d]", v.cardId, v.cardLevel, v.rangeStart, v.rangeEnd)
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
}
|
2025-12-05 20:15:55 +08:00
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
func (self *LiveCardRoom) RollCards(cardType int32, cardCount int) []string {
|
|
|
|
|
var sumWeight int = 0
|
|
|
|
|
for _, v := range self.rollCardCfgList {
|
|
|
|
|
if v.cardType == cardType {
|
|
|
|
|
sumWeight += v.weight
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
rollCardIds := make([]string, 0)
|
|
|
|
|
for i := 0; i < cardCount; i++ {
|
|
|
|
|
var rollCardId int32 = 0
|
|
|
|
|
randNum := rand.Intn(sumWeight)
|
|
|
|
|
for _, v := range self.rollCardCfgList {
|
|
|
|
|
if v.cardType == cardType && randNum >= v.rangeStart && randNum <= v.rangeEnd {
|
|
|
|
|
rollCardId = v.cardId
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
rollCardIds = append(rollCardIds, fmt.Sprintf("%d:%d", rollCardId, 1))
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
2025-12-09 17:49:29 +08:00
|
|
|
return rollCardIds
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (self *LiveCardRoom) ShowStart() {
|
|
|
|
|
// 为准备的玩家抽卡
|
2025-12-09 17:49:29 +08:00
|
|
|
weightCfg := map[string]int{"NORMAL": 50, "MINI": 30, "MVP": 20}
|
2025-12-12 19:20:10 +08:00
|
|
|
self.rollCards = make([]*serverproto.KeyValueType64, 0)
|
2026-01-10 14:39:46 +08:00
|
|
|
self.showRewards = make([]*serverproto.KeyValueType64, 0)
|
2025-12-05 20:15:55 +08:00
|
|
|
for _, uid := range self.LiveRoom.readyUidList {
|
2025-12-09 17:49:29 +08:00
|
|
|
cards := make([]string, 0)
|
|
|
|
|
// 1. 保底抽一张MINI卡
|
|
|
|
|
firstCard := self.RollCards(ROLL_CARD_TYPE_MINI, 1)
|
|
|
|
|
cards = append(cards, firstCard...)
|
|
|
|
|
// 2. 抽其他4张卡
|
|
|
|
|
for i := 1; i <= 4; i++ {
|
2025-12-13 17:06:18 +08:00
|
|
|
quality := WeightedRandomChoice(weightCfg)
|
2025-12-09 17:49:29 +08:00
|
|
|
switch quality {
|
|
|
|
|
case "NORMAL":
|
|
|
|
|
normalCard := self.RollCards(ROLL_CARD_TYPE_NORMAL, 1)
|
|
|
|
|
cards = append(cards, normalCard...)
|
|
|
|
|
case "MINI":
|
|
|
|
|
miniCard := self.RollCards(ROLL_CARD_TYPE_MINI, 1)
|
|
|
|
|
cards = append(cards, miniCard...)
|
|
|
|
|
case "MVP":
|
|
|
|
|
mvpCard := self.RollCards(ROLL_CARD_TYPE_MVP, 1)
|
|
|
|
|
cards = append(cards, mvpCard...)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
rand.Shuffle(len(cards), func(i, j int) {
|
|
|
|
|
cards[i], cards[j] = cards[j], cards[i]
|
|
|
|
|
})
|
2025-12-12 19:20:10 +08:00
|
|
|
self.rollCards = append(self.rollCards, &serverproto.KeyValueType64{
|
2025-12-09 17:49:29 +08:00
|
|
|
Key: uid,
|
|
|
|
|
StrVal: strings.Join(cards, ";"),
|
2025-12-05 20:15:55 +08:00
|
|
|
})
|
2025-12-12 19:20:10 +08:00
|
|
|
self.showRewards = append(self.showRewards, &serverproto.KeyValueType64{
|
2025-12-09 17:49:29 +08:00
|
|
|
Key: uid,
|
|
|
|
|
StrVal: strings.Join(cards, ";"),
|
|
|
|
|
})
|
|
|
|
|
addItems := make([]*serverproto.KeyValueType, 0)
|
|
|
|
|
for _, v := range cards {
|
|
|
|
|
itemId, itemNum := model.Str2Res(v)
|
|
|
|
|
addItems = append(addItems, &serverproto.KeyValueType{Key: itemId, Value: itemNum})
|
|
|
|
|
}
|
|
|
|
|
self.AddItemList(uid, addItems, int32(model2.AddFrom_LiveRoom_Card), false)
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (self *LiveCardRoom) ShowEnd() {}
|
|
|
|
|
|
|
|
|
|
func (self *LiveCardRoom) GetMaxReadyNum(roomType uint32) int {
|
2025-12-13 17:06:18 +08:00
|
|
|
util.InfoF("LiveCardRoom: GetMaxReadyNum")
|
2025-12-05 20:15:55 +08:00
|
|
|
return LIVEROOM_CARD_MAX_READY_NUM
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-12 19:20:10 +08:00
|
|
|
func (self *LiveCardRoom) 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 *LiveCardRoom) GetShowResultList(readyUidList []uint64, uid uint64) []*serverproto.LiveRoomPlayerInfo {
|
|
|
|
|
showResultList := make([]*serverproto.LiveRoomPlayerInfo, 0)
|
|
|
|
|
for _, v := range self.rollCards {
|
|
|
|
|
currUid := v.Key
|
|
|
|
|
currPlayerInfo := MakeLiveRoomPlayerInfo(currUid)
|
|
|
|
|
currPlayerInfo.Data = v.StrVal
|
|
|
|
|
showResultList = append(showResultList, currPlayerInfo)
|
|
|
|
|
}
|
|
|
|
|
return showResultList
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 抽卡:获取当前玩家获得的物品
|
2025-12-12 19:20:10 +08:00
|
|
|
func (self *LiveCardRoom) GetShowRewardList(readyUidList []uint64, uid uint64) []*serverproto.KeyValueType64 {
|
2025-12-09 17:49:29 +08:00
|
|
|
return self.showRewards
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|
|
|
|
|
|
2025-12-09 17:49:29 +08:00
|
|
|
func (self *LiveCardRoom) ShowSubmit(uid uint64, data []*serverproto.KeyValueType64) []*serverproto.KeyValueType64 {
|
|
|
|
|
return nil
|
2025-12-05 20:15:55 +08:00
|
|
|
}
|