{{ define "koka-character" -}} module horse/character // Automatically generated with the horsegen tool; DO NOT EDIT // Character identity. pub type character {{- range $uma := $.Characters }} {{ kkenum $uma.Name }} {{- end }} // The list of all characters. val character/all = [ {{- range $uma := $.Characters }} {{ kkenum $uma.Name }}, {{- end }} ] // Get the character for a character ID. // Generally, these are four digit numbers in the range 1000-1999. pub fun character/from-id(id: int): maybe match id {{- range $uma := $.Characters }} {{ $uma.ID }} -> Just( {{- kkenum $uma.Name -}} ) {{- end }} _ -> Nothing // Get the ID for a character. pub fun character/id(c: character): int match c {{- range $uma := $.Characters }} {{ kkenum $uma.Name }} -> {{ $uma.ID }} {{- end }} // Get the name of a character. pub fun character/show(c: character): string match c {{- range $uma := $.Characters }} {{ kkenum $uma.Name }} -> {{ printf "%q" $uma.Name }} {{- end }} // Compare two characters. pub fip fun character/order2(a: character, b: character): order2 match (a, b) {{- range $uma := $.Characters }}{{ $e := kkenum $uma.Name }} ( {{- $e }}, {{ $e -}} ) -> Eq2( {{- $e -}} ) {{- if ne $uma.ID $.MaxID }} ( {{- $e }}, b') -> Lt2( {{- $e }}, b') (a', {{ $e -}} ) -> Gt2( {{- $e }}, a') {{- end }} {{- end }} // Character equality. pub fun character/(==)(a: character, b: character): bool match (a, b) {{- range $uma := $.Characters }}{{ $e := kkenum $uma.Name }} ( {{- $e }}, {{ $e -}} ) -> True {{- end }} _ -> False // Base affinity between a pair using the global ruleset. pub fun global/pair-affinity(a: character, b: character): int match (a, b) {{- range $pair := $.Pairs }} ( {{- kkenum $pair.NameA }}, {{ kkenum $pair.NameB -}} ) -> {{ $pair.Affinity }} {{- end }} // Reflexive cases are always 0. {{- range $uma := $.Characters }}{{ $e := kkenum $uma.Name }} ( {{- $e }}, {{ $e -}} ) -> 0 {{- end }} {{/* TODO: probably use a data structure instead of hoping the compilers fix this */ -}} // Base affinity for a trio using the global ruleset. pub fun global/trio-affinity(a: character, b: character, c: character): int match (a, b, c) {{- range $trio := $.Trios }} ( {{- kkenum $trio.NameA }}, {{ kkenum $trio.NameB }}, {{ kkenum $trio.NameC -}} ) -> {{ $trio.Affinity }} {{- end }} (_, _, _) -> 0 {{- end }}