249 lines
7.5 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 (
"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
}