69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
package data
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"reflect"
|
|
"strings"
|
|
)
|
|
|
|
type tableLoader interface {
|
|
load(buf []byte) error
|
|
}
|
|
|
|
type Tables struct {
|
|
Copy CopyTable
|
|
CopyMain CopyMainTable
|
|
Equip EquipTable
|
|
EquipLevel EquipLevelTable
|
|
EquipSet EquipSetTable
|
|
Hero HeroTable
|
|
HeroBond HeroBondTable
|
|
HeroBook HeroBookTable
|
|
HeroBreak HeroBreakTable
|
|
HeroLevel HeroLevelTable
|
|
FunctionOpen FunctionOpenTable
|
|
Item ItemTable
|
|
Monster MonsterTable
|
|
Scene SceneTable
|
|
ServerConfig ServerConfigTable
|
|
Treasure TreasureTable
|
|
TreasureLevel TreasureLevelTable
|
|
UpgradeMaster UpgradeMasterTable
|
|
}
|
|
|
|
func NewTables(dataDir string) (*Tables, error) {
|
|
var tables = new(Tables)
|
|
var tt = reflect.TypeOf(tables).Elem()
|
|
var tv = reflect.ValueOf(tables).Elem()
|
|
|
|
var fn = tt.NumField()
|
|
for i := range fn {
|
|
var sf = tt.Field(i)
|
|
var ft = sf.Type
|
|
var name = ft.Name()
|
|
if strings.HasSuffix(name, "Table") {
|
|
name = strings.TrimSuffix(name, "Table")
|
|
}
|
|
|
|
var fv = tv.Field(i)
|
|
|
|
loader, ok := fv.Addr().Interface().(tableLoader)
|
|
if !ok {
|
|
continue
|
|
}
|
|
|
|
buf, err := os.ReadFile(fmt.Sprintf("%s/tb%s.json", dataDir, strings.ToLower(name)))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = loader.load(buf)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return tables, nil
|
|
}
|