Files
d2go/cmd/d2data/main.go
Héctor Giménez de84f7bbe0 add basic tz data
2024-04-24 22:16:23 +09:00

147 lines
3.6 KiB
Go

package main
import (
"encoding/json"
"io"
"log"
"os"
"slices"
"text/template"
)
const templateSkillDesc = `// Code generated by d2data. DO NOT EDIT.
// source: cmd/d2data/d2data/skilldesc.json
package skill
var Desc = map[ID]Description{
{{- range $key, $value := . }}
{{ $key }}: {Page: {{ $value.SkillPage }}, Row: {{ $value.SkillRow }}, Column: {{ $value.SkillColumn }}, ListRow: {{ $value.ListRow }}, IconCel: {{ $value.IconCel }} },
{{- end }}
}`
const templateSkills = `// Code generated by d2data. DO NOT EDIT.
// source: cmd/d2data/d2data/skills.json
package skill
var Skills = map[ID]Skill{
{{- range $key, $value := . }}
{{ $key }}: {Name: "{{ $value.Name }}", ID: {{ $key }}, LeftSkill: {{ if eq $value.Leftskill 1 }}true{{ else }}false{{ end }}, RightSkill: {{ if eq $value.Rightskill 1 }}true{{ else }}false{{ end }} },
{{- end }}
}`
const templateLevels = `// Code generated by d2data. DO NOT EDIT.
// source: cmd/d2data/d2data/levels.json
package area
var Areas = map[ID]Area{
{{- range $key, $value := . }}
{{ $key }}: {Name: "{{ $value.LevelName }}", ID: {{ $key }}, CanBeTerrorized: {{ $value.CanBeTerrorized }}},
{{- end }}
}`
type skillDesc struct {
Skilldesc string `json:"skilldesc"`
SkillPage int `json:"SkillPage"`
SkillRow int `json:"SkillRow"`
SkillColumn int `json:"SkillColumn"`
ListRow int `json:"ListRow"`
IconCel int `json:"IconCel"`
StrName string `json:"str name"`
StrShort string `json:"str short"`
StrLong string `json:"str long"`
StrAlt string `json:"str alt"`
}
type Skill struct {
Leftskill int `json:"leftskill"`
Rightskill int `json:"rightskill"`
Name string `json:"skill"`
}
type Level struct {
ID int `json:"Id"`
LevelName string `json:"LevelName"`
CanBeTerrorized bool
}
// Generate static code from https://github.com/blizzhackers/d2data data files.
func main() {
err := generateFromFile(templateSkillDesc, "cmd/d2data/d2data/skilldesc.json", "pkg/data/skill/skilldesc.go", &map[string]skillDesc{})
if err != nil {
log.Fatal(err)
}
err = generateFromFile(templateSkills, "cmd/d2data/d2data/skills.json", "pkg/data/skill/skills.go", &map[string]Skill{})
if err != nil {
log.Fatal(err)
}
err = generateAreas()
if err != nil {
log.Fatal(err)
}
}
func generateFromFile(templateName, filePath, outPath string, unmarshallStruct interface{}) error {
err := unmarshalFile(filePath, &unmarshallStruct)
if err != nil {
return err
}
t := template.Must(template.New("tpl").Parse(templateName))
file, err := os.Create(outPath)
if err != nil {
return err
}
defer file.Close()
return t.Execute(file, unmarshallStruct)
}
func generateAreas() error {
levels := make(map[string]Level)
err := unmarshalFile("cmd/d2data/d2data/levels.json", &levels)
if err != nil {
return err
}
terrorizedLevels := make([]int, 0)
err = unmarshalFile("cmd/d2data/d2data/terrorized_levels.json", &terrorizedLevels)
if err != nil {
return err
}
for k, lvl := range levels {
if slices.Contains(terrorizedLevels, lvl.ID) {
lvl.CanBeTerrorized = true
levels[k] = lvl
}
}
t := template.Must(template.New("tpl").Parse(templateLevels))
file, err := os.Create("pkg/data/area/areas.go")
if err != nil {
return err
}
defer file.Close()
return t.Execute(file, levels)
}
func unmarshalFile(filePath string, unmarshallTo interface{}) error {
jsonFile, err := os.Open(filePath)
if err != nil {
return err
}
defer jsonFile.Close()
byteValue, err := io.ReadAll(jsonFile)
if err != nil {
return err
}
return json.Unmarshal(byteValue, &unmarshallTo)
}