mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-03-01 00:35:36 +08:00
世界怪物、NPC、装置等场景实体读取lua配置生成,实现AOI九宫格动态加载
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
package gdconf
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"hk4e/common/config"
|
||||
"hk4e/pkg/logger"
|
||||
|
||||
lua "github.com/yuin/gopher-lua"
|
||||
)
|
||||
|
||||
// 游戏数据配置表
|
||||
@@ -16,6 +20,7 @@ type GameDataConfig struct {
|
||||
// 配置表路径前缀
|
||||
csvPrefix string
|
||||
jsonPrefix string
|
||||
luaPrefix string
|
||||
// 配置表数据
|
||||
AvatarDataMap map[int32]*AvatarData // 角色
|
||||
AvatarSkillDataMap map[int32]*AvatarSkillData // 角色技能
|
||||
@@ -23,12 +28,14 @@ type GameDataConfig struct {
|
||||
DropGroupDataMap map[int32]*DropGroupData // 掉落组
|
||||
GCGCharDataMap map[int32]*GCGCharData // 角色卡牌
|
||||
GCGSkillDataMap map[int32]*GCGSkillData // 卡牌技能
|
||||
SceneDataMap map[int32]*SceneData // 场景
|
||||
SceneMap map[int32]*Scene // 场景详情
|
||||
}
|
||||
|
||||
func InitGameDataConfig() {
|
||||
CONF = new(GameDataConfig)
|
||||
CONF.csvPrefix = ""
|
||||
CONF.loadAll()
|
||||
logger.Info("load all game data config finish")
|
||||
}
|
||||
|
||||
func (g *GameDataConfig) loadAll() {
|
||||
@@ -56,6 +63,14 @@ func (g *GameDataConfig) loadAll() {
|
||||
}
|
||||
g.jsonPrefix += "/"
|
||||
|
||||
g.luaPrefix = pathPrefix + "/lua"
|
||||
dirInfo, err = os.Stat(g.luaPrefix)
|
||||
if err != nil || !dirInfo.IsDir() {
|
||||
info := fmt.Sprintf("open game data config lua dir error: %v", err)
|
||||
panic(info)
|
||||
}
|
||||
g.luaPrefix += "/"
|
||||
|
||||
g.load()
|
||||
}
|
||||
|
||||
@@ -66,6 +81,8 @@ func (g *GameDataConfig) load() {
|
||||
g.loadDropGroupData() // 掉落组
|
||||
g.loadGCGCharData() // 角色卡牌
|
||||
g.loadGCGSkillData() // 卡牌技能
|
||||
g.loadSceneData() // 场景
|
||||
g.loadScene() // 场景详情
|
||||
}
|
||||
|
||||
func (g *GameDataConfig) readCsvFileData(fileName string) []byte {
|
||||
@@ -83,3 +100,87 @@ func (g *GameDataConfig) readCsvFileData(fileName string) []byte {
|
||||
standardCsvData = append(standardCsvData, fileData[index3+(index2+1)+(index1+1):]...)
|
||||
return standardCsvData
|
||||
}
|
||||
|
||||
func fixLuaState(luaStr string) *lua.LState {
|
||||
fixLua := ""
|
||||
fixLua += "GadgetState = {}"
|
||||
fixLua += "EventType = {}"
|
||||
fixLua += "RegionShape = {}"
|
||||
fixLua += "VisionLevelType = {}"
|
||||
luaLineList := strings.Split(luaStr, "\n")
|
||||
luaStr = ""
|
||||
for _, luaLine := range luaLineList {
|
||||
line := strings.TrimSpace(luaLine)
|
||||
if len(line) != 0 && line[0] == '[' && strings.Contains(line, "]") && strings.Contains(line, "=") {
|
||||
luaStr += luaLine[strings.Index(luaLine, "=")+1:] + "\n"
|
||||
} else {
|
||||
luaStr += luaLine + "\n"
|
||||
}
|
||||
}
|
||||
luaStr = fixLua + luaStr
|
||||
luaState := lua.NewState()
|
||||
err := luaState.DoString(luaStr)
|
||||
if err != nil {
|
||||
if !strings.Contains(err.Error(), "module") {
|
||||
logger.Error("lua parse error: %v", err)
|
||||
}
|
||||
}
|
||||
return luaState
|
||||
}
|
||||
|
||||
func parseLuaTableToObject[T any](luaState *lua.LState, tableName string, object T) bool {
|
||||
luaValue := luaState.GetGlobal(tableName)
|
||||
table, ok := luaValue.(*lua.LTable)
|
||||
if !ok {
|
||||
logger.Info("get lua table error, table name: %v, lua type: %v", tableName, luaValue.Type().String())
|
||||
return false
|
||||
}
|
||||
tableObject := convLuaValueToGo(table)
|
||||
jsonData, err := json.Marshal(tableObject)
|
||||
if err != nil {
|
||||
logger.Error("build json error: %v", err)
|
||||
return false
|
||||
}
|
||||
if string(jsonData) == "{}" {
|
||||
return true
|
||||
}
|
||||
err = json.Unmarshal(jsonData, object)
|
||||
if err != nil {
|
||||
logger.Error("parse json error: %v", err)
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func convLuaValueToGo(lv lua.LValue) any {
|
||||
switch v := lv.(type) {
|
||||
case *lua.LNilType:
|
||||
return nil
|
||||
case lua.LBool:
|
||||
return bool(v)
|
||||
case lua.LString:
|
||||
return string(v)
|
||||
case lua.LNumber:
|
||||
return float64(v)
|
||||
case *lua.LTable:
|
||||
maxn := v.MaxN()
|
||||
if maxn == 0 {
|
||||
// table
|
||||
ret := make(map[string]any)
|
||||
v.ForEach(func(key, value lua.LValue) {
|
||||
keystr := fmt.Sprint(convLuaValueToGo(key))
|
||||
ret[keystr] = convLuaValueToGo(value)
|
||||
})
|
||||
return ret
|
||||
} else {
|
||||
// array
|
||||
ret := make([]any, 0, maxn)
|
||||
for i := 1; i <= maxn; i++ {
|
||||
ret = append(ret, convLuaValueToGo(v.RawGetInt(i)))
|
||||
}
|
||||
return ret
|
||||
}
|
||||
default:
|
||||
return v
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user