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 } 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 }