Files
hk4e/gdconf/drop_data.go
2023-03-21 23:03:00 +08:00

249 lines
8.8 KiB
Go

package gdconf
import (
"fmt"
"hk4e/pkg/logger"
)
type SubDrop struct {
Id int32 // 子掉落ID
CountRange []int32 // 子掉落数量区间
Weight int32 // 子掉落权重
}
const (
RandomTypeChoose = 0
RandomTypeIndep = 1
RandomTypeIndepWeight = 10000
)
// DropData 掉落配置表
type DropData struct {
DropId int32 `csv:"掉落ID"`
RandomType int32 `csv:"随机方式,omitempty"` // 0:轮盘选择法掉落单个权重项 1:每个权重项独立随机(分母为10000)
DropLayer int32 `csv:"掉落层级,omitempty"`
SubDrop1Id int32 `csv:"子掉落1ID,omitempty"`
SubDrop1CountRange FloatArray `csv:"子掉落1数量区间,omitempty"`
SubDrop1Weight int32 `csv:"子掉落1权重,omitempty"`
SubDrop2Id int32 `csv:"子掉落2ID,omitempty"`
SubDrop2CountRange FloatArray `csv:"子掉落2数量区间,omitempty"`
SubDrop2Weight int32 `csv:"子掉落2权重,omitempty"`
SubDrop3Id int32 `csv:"子掉落3ID,omitempty"`
SubDrop3CountRange FloatArray `csv:"子掉落3数量区间,omitempty"`
SubDrop3Weight int32 `csv:"子掉落3权重,omitempty"`
SubDrop4Id int32 `csv:"子掉落4ID,omitempty"`
SubDrop4CountRange FloatArray `csv:"子掉落4数量区间,omitempty"`
SubDrop4Weight int32 `csv:"子掉落4权重,omitempty"`
SubDrop5Id int32 `csv:"子掉落5ID,omitempty"`
SubDrop5CountRange FloatArray `csv:"子掉落5数量区间,omitempty"`
SubDrop5Weight int32 `csv:"子掉落5权重,omitempty"`
SubDrop6Id int32 `csv:"子掉落6ID,omitempty"`
SubDrop6CountRange FloatArray `csv:"子掉落6数量区间,omitempty"`
SubDrop6Weight int32 `csv:"子掉落6权重,omitempty"`
SubDrop7Id int32 `csv:"子掉落7ID,omitempty"`
SubDrop7CountRange FloatArray `csv:"子掉落7数量区间,omitempty"`
SubDrop7Weight int32 `csv:"子掉落7权重,omitempty"`
SubDrop8Id int32 `csv:"子掉落8ID,omitempty"`
SubDrop8CountRange FloatArray `csv:"子掉落8数量区间,omitempty"`
SubDrop8Weight int32 `csv:"子掉落8权重,omitempty"`
SubDrop9Id int32 `csv:"子掉落9ID,omitempty"`
SubDrop9CountRange FloatArray `csv:"子掉落9数量区间,omitempty"`
SubDrop9Weight int32 `csv:"子掉落9权重,omitempty"`
SubDrop10Id int32 `csv:"子掉落10ID,omitempty"`
SubDrop10CountRange FloatArray `csv:"子掉落10数量区间,omitempty"`
SubDrop10Weight int32 `csv:"子掉落10权重,omitempty"`
SubDrop11Id int32 `csv:"子掉落11ID,omitempty"`
SubDrop11CountRange FloatArray `csv:"子掉落11数量区间,omitempty"`
SubDrop11Weight int32 `csv:"子掉落11权重,omitempty"`
SubDrop12Id int32 `csv:"子掉落12ID,omitempty"`
SubDrop12CountRange FloatArray `csv:"子掉落12数量区间,omitempty"`
SubDrop12Weight int32 `csv:"子掉落12权重,omitempty"`
SubDropList []*SubDrop // 子掉落列表
SubDropTotalWeight int32 // 总权重
}
func (g *GameDataConfig) loadDropData() {
g.DropDataMap = make(map[int32]*DropData)
fileNameList := []string{"DropLeafData.txt", "DropTreeData.txt"}
for _, fileName := range fileNameList {
dropDataList := make([]*DropData, 0)
readTable[DropData](g.txtPrefix+fileName, &dropDataList)
for _, dropData := range dropDataList {
// 子掉落列合并
dropData.SubDropList = make([]*SubDrop, 0)
if dropData.SubDrop1Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop1CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop1Id,
CountRange: countRange,
Weight: dropData.SubDrop1Weight,
})
}
if dropData.SubDrop2Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop2CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop2Id,
CountRange: countRange,
Weight: dropData.SubDrop2Weight,
})
}
if dropData.SubDrop3Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop3CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop3Id,
CountRange: countRange,
Weight: dropData.SubDrop3Weight,
})
}
if dropData.SubDrop4Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop4CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop4Id,
CountRange: countRange,
Weight: dropData.SubDrop4Weight,
})
}
if dropData.SubDrop5Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop5CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop5Id,
CountRange: countRange,
Weight: dropData.SubDrop5Weight,
})
}
if dropData.SubDrop6Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop6CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop6Id,
CountRange: countRange,
Weight: dropData.SubDrop6Weight,
})
}
if dropData.SubDrop7Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop7CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop7Id,
CountRange: countRange,
Weight: dropData.SubDrop7Weight,
})
}
if dropData.SubDrop8Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop8CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop8Id,
CountRange: countRange,
Weight: dropData.SubDrop8Weight,
})
}
if dropData.SubDrop9Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop9CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop9Id,
CountRange: countRange,
Weight: dropData.SubDrop9Weight,
})
}
if dropData.SubDrop10Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop10CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop10Id,
CountRange: countRange,
Weight: dropData.SubDrop10Weight,
})
}
if dropData.SubDrop11Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop11CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop11Id,
CountRange: countRange,
Weight: dropData.SubDrop11Weight,
})
}
if dropData.SubDrop12Id != 0 {
countRange := make([]int32, 0)
for _, v := range dropData.SubDrop12CountRange {
countRange = append(countRange, int32(v))
}
dropData.SubDropList = append(dropData.SubDropList, &SubDrop{
Id: dropData.SubDrop12Id,
CountRange: countRange,
Weight: dropData.SubDrop12Weight,
})
}
if dropData.RandomType == RandomTypeChoose {
// 计算轮盘总权重
for _, subDrop := range dropData.SubDropList {
dropData.SubDropTotalWeight += subDrop.Weight
}
}
g.DropDataMap[dropData.DropId] = dropData
}
}
// 检查
for _, dropData := range g.DropDataMap {
if dropData.RandomType == RandomTypeIndep {
for _, subDrop := range dropData.SubDropList {
if subDrop.Weight > RandomTypeIndepWeight {
info := fmt.Sprintf("invalid weight for indep rand type, weight: %v, dropId: %v", subDrop.Weight, dropData.DropId)
panic(info)
}
}
}
for _, subDrop := range dropData.SubDropList {
// 掉落id优先在掉落表里找 找不到就去道具表里找
_, exist := g.DropDataMap[subDrop.Id]
if !exist {
_, exist := g.ItemDataMap[subDrop.Id]
if !exist {
info := fmt.Sprintf("drop item id not exist, itemId: %v, dropId: %v", subDrop.Id, dropData.DropId)
panic(info)
}
}
}
}
logger.Info("DropData count: %v", len(g.DropDataMap))
}
func GetDropDataById(dropId int32) *DropData {
return CONF.DropDataMap[dropId]
}
func GetDropDataMap() map[int32]*DropData {
return CONF.DropDataMap
}