145 lines
2.7 KiB
Plaintext
145 lines
2.7 KiB
Plaintext
{{ define "go-character" -}}
|
|
package horse
|
|
|
|
// Automatically generated with horsegen; DO NOT EDIT
|
|
|
|
import (
|
|
"fmt"
|
|
"slices"
|
|
"strconv"
|
|
)
|
|
|
|
type Character struct {
|
|
ID int16
|
|
Name string
|
|
}
|
|
|
|
var characterIDs = []int16{
|
|
{{- range $c := $.Characters }}
|
|
{{ $c.ID }}, // {{ $c.Name }}
|
|
{{- end }}
|
|
}
|
|
|
|
var characterNames = []string{
|
|
{{- range $c := $.Characters }}
|
|
{{ printf "%q" $c.Name }},
|
|
{{- end }}
|
|
}
|
|
|
|
var characterNameToID = map[string]int16{
|
|
{{- range $c := $.Characters }}
|
|
{{ printf "%q" $c.Name }}: {{ $c.ID }},
|
|
{{- end }}
|
|
}
|
|
|
|
func characterIndex(id int16) (int, bool) {
|
|
return slices.BinarySearch(characterIDs, id)
|
|
}
|
|
|
|
func CharacterForID(id int16) Character {
|
|
i, ok := characterIndex(id)
|
|
if !ok {
|
|
return Character{}
|
|
}
|
|
return Character{
|
|
ID: id,
|
|
Name: characterNames[i],
|
|
}
|
|
}
|
|
|
|
func CharacterForName(name string) Character {
|
|
id, ok := characterNameToID[name]
|
|
if !ok {
|
|
return Character{}
|
|
}
|
|
return Character{
|
|
ID: id,
|
|
Name: name,
|
|
}
|
|
}
|
|
|
|
func (c *Character) MarshalJSON() ([]byte, error) {
|
|
// Only marshal legal or empty characters.
|
|
if c.ID == 0 {
|
|
return []byte{'0'}, nil
|
|
}
|
|
i, ok := characterIndex(c.ID)
|
|
if !ok {
|
|
return nil, fmt.Errorf("marshaling character %q with invalid ID %d", c.Name, c.ID)
|
|
}
|
|
if characterNames[i] != c.Name {
|
|
return nil, fmt.Errorf("marshaling character with ID %d: name is %q but should be %q", c.ID, c.Name, characterNames[i])
|
|
}
|
|
return strconv.AppendInt(nil, int64(c.ID), 10), nil
|
|
}
|
|
|
|
func (c *Character) UnmarshalJSON(b []byte) error {
|
|
if string(b) == "null" {
|
|
return nil
|
|
}
|
|
id, err := strconv.ParseInt(string(b), 10, 16)
|
|
if err != nil {
|
|
return fmt.Errorf("unmarshaling invalid character ID %q: %w", b, err)
|
|
}
|
|
if id == 0 {
|
|
*c = Character{}
|
|
return nil
|
|
}
|
|
i, ok := characterIndex(int16(id))
|
|
if !ok {
|
|
return fmt.Errorf("unmarshaling unrecognized character ID %d", id)
|
|
}
|
|
*c = Character{
|
|
ID: int16(id),
|
|
Name: characterNames[i],
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var pairAffinity = []int8{
|
|
{{- range $a := $.Characters -}}
|
|
{{- range $b := $.Characters -}}
|
|
{{- index $.PairMaps $a.ID $b.ID -}},
|
|
{{- end -}}
|
|
{{- end -}}
|
|
}
|
|
|
|
var trioAffinity = []int8{
|
|
{{- range $a := $.Characters -}}
|
|
{{- range $b := $.Characters -}}
|
|
{{- range $c := $.Characters -}}
|
|
{{- index $.TrioMaps $a.ID $b.ID $c.ID -}},
|
|
{{- end -}}
|
|
{{- end -}}
|
|
{{- end -}}
|
|
}
|
|
|
|
func PairAffinity(a, b Character) int {
|
|
i, ok := characterIndex(a.ID)
|
|
if !ok {
|
|
return 0
|
|
}
|
|
j, ok := characterIndex(b.ID)
|
|
if !ok {
|
|
return 0
|
|
}
|
|
return int(pairAffinity[i*{{ $.Count }} + j])
|
|
}
|
|
|
|
func TrioAffinity(a, b, c Character) int {
|
|
i, ok := characterIndex(a.ID)
|
|
if !ok {
|
|
return 0
|
|
}
|
|
j, ok := characterIndex(b.ID)
|
|
if !ok {
|
|
return 0
|
|
}
|
|
k, ok := characterIndex(c.ID)
|
|
if !ok {
|
|
return 0
|
|
}
|
|
return int(trioAffinity[i*{{ $.Count }}*{{ $.Count }} + j*{{ $.Count }} + k])
|
|
}
|
|
|
|
{{ end }} |