圣遗物主词条加权随机

This commit is contained in:
UnKownOwO
2023-02-19 14:37:09 +08:00
parent e580baeb46
commit 777ffea0a9
8 changed files with 122 additions and 7 deletions

View File

@@ -48,6 +48,7 @@ type GameDataConfig struct {
RewardDataMap map[int32]*RewardData // 奖励
AvatarCostumeDataMap map[int32]*AvatarCostumeData // 角色时装
AvatarFlycloakDataMap map[int32]*AvatarFlycloakData // 角色风之翼
ReliquaryMainDataMap map[int32]map[int32]*ReliquaryMainData // 圣遗物主属性
}
func InitGameDataConfig() {
@@ -71,7 +72,7 @@ func ReplaceGameDataConfig() {
}
func (g *GameDataConfig) loadAll() {
pathPrefix := config.GetConfig().Hk4e.GameDataConfigPath
pathPrefix := config.CONF.Hk4e.GameDataConfigPath
dirInfo, err := os.Stat(pathPrefix)
if err != nil || !dirInfo.IsDir() {
@@ -131,6 +132,7 @@ func (g *GameDataConfig) load() {
g.loadRewardData() // 奖励
g.loadAvatarCostumeData() // 角色时装
g.loadAvatarFlycloakData() // 角色风之翼
g.loadReliquaryMainData() // 圣遗物主属性
}
func (g *GameDataConfig) readCsvFileData(fileName string) []byte {

View File

@@ -35,7 +35,9 @@ type ItemData struct {
SkillAffix []int32
AwakenCoinCostList []uint32
// 圣遗物
ReliquaryType int32 `csv:"ReliquaryType,omitempty"` // 圣遗物类别
ReliquaryType int32 `csv:"ReliquaryType,omitempty"` // 圣遗物类别
MainPropDepotId int32 `csv:"MainPropDepotId,omitempty"` // 主属性库ID
AppendPropDepotId int32 `csv:"AppendPropDepotId,omitempty"` // 追加属性库ID
}
func (g *GameDataConfig) loadItemData() {

View File

@@ -0,0 +1,69 @@
package gdconf
import (
"fmt"
"hk4e/pkg/logger"
"github.com/jszwec/csvutil"
"github.com/mroth/weightedrand"
)
// ReliquaryMainData 圣遗物主属性配置表
type ReliquaryMainData struct {
MainPropId int32 `csv:"MainPropId"` // 主属性ID
MainPropDepotId int32 `csv:"MainPropDepotId,omitempty"` // 主属性库ID
PropType int32 `csv:"PropType,omitempty"` // 属性类别
Weight int32 `csv:"Weight,omitempty"` // 随机权重
}
func (g *GameDataConfig) loadReliquaryMainData() {
g.ReliquaryMainDataMap = make(map[int32]map[int32]*ReliquaryMainData)
data := g.readCsvFileData("ReliquaryMainData.csv")
var reliquaryMainDataList []*ReliquaryMainData
err := csvutil.Unmarshal(data, &reliquaryMainDataList)
if err != nil {
info := fmt.Sprintf("parse file error: %v", err)
panic(info)
}
for _, reliquaryMainData := range reliquaryMainDataList {
// 通过主属性库ID找到
_, ok := g.ReliquaryMainDataMap[reliquaryMainData.MainPropDepotId]
if !ok {
g.ReliquaryMainDataMap[reliquaryMainData.MainPropDepotId] = make(map[int32]*ReliquaryMainData)
}
// list -> map
g.ReliquaryMainDataMap[reliquaryMainData.MainPropDepotId][reliquaryMainData.MainPropId] = reliquaryMainData
}
logger.Info("ReliquaryMainData count: %v", len(g.ReliquaryMainDataMap))
}
func GetReliquaryMainDataByDepotIdAndPropId(mainPropDepotId int32, mainPropId int32) *ReliquaryMainData {
value, exist := CONF.ReliquaryMainDataMap[mainPropDepotId]
if !exist {
return nil
}
return value[mainPropId]
}
func GetReliquaryMainDataRandomByDepotId(mainPropDepotId int32) *ReliquaryMainData {
mainPropMap, exist := CONF.ReliquaryMainDataMap[mainPropDepotId]
if !exist {
return nil
}
choices := make([]weightedrand.Choice, 0, len(mainPropMap))
for _, data := range mainPropMap {
choices = append(choices, weightedrand.NewChoice(data, uint(data.Weight)))
}
chooser, err := weightedrand.NewChooser(choices...)
if err != nil {
logger.Error("reliquary main error: %v", err)
return nil
}
result := chooser.Pick()
return result.(*ReliquaryMainData)
}
func GetReliquaryMainDataMap() map[int32]map[int32]*ReliquaryMainData {
return CONF.ReliquaryMainDataMap
}

View File

@@ -591,6 +591,16 @@
"field_name": "ReliquaryType",
"field_type": "int32",
"origin_name": "圣遗物类别"
},
{
"field_name": "MainPropDepotId",
"field_type": "int32",
"origin_name": "主属性库ID"
},
{
"field_name": "AppendPropDepotId",
"field_type": "int32",
"origin_name": "追加属性库ID"
}
]
},
@@ -953,5 +963,30 @@
"origin_name": "道具ID"
}
]
},
{
"table_name": "ReliquaryMainData",
"field_list": [
{
"field_name": "MainPropId",
"field_type": "int32",
"origin_name": "主属性ID"
},
{
"field_name": "MainPropDepotId",
"field_type": "int32",
"origin_name": "主属性库ID"
},
{
"field_name": "PropType",
"field_type": "int32",
"origin_name": "属性类别"
},
{
"field_name": "Weight",
"field_type": "int32",
"origin_name": "随机权重"
}
]
}
]