128 lines
2.4 KiB
Go
128 lines
2.4 KiB
Go
package data
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"ur.gs/chaos-gate/internal/util/asciiscan"
|
|
)
|
|
|
|
type Cell struct {
|
|
X int // FIXME: This is just a guess, but I think it's a 3D coordinate system
|
|
Y int
|
|
Z int
|
|
}
|
|
|
|
type AnimatedObject struct {
|
|
CentreCell Cell
|
|
Direction int
|
|
Type int
|
|
AnimationID int
|
|
AnimationGroup int
|
|
AnimatedType int
|
|
AnimationIDs CompassPoints // 8 of these, down to MoveBits. Compass points?
|
|
InCells CompassPoints
|
|
VisualBits CompassPoints
|
|
MoveBits CompassPoints
|
|
Visibility int
|
|
Protection int
|
|
MinDelay int // in milliseconds
|
|
DelayRange int // in milliseconds
|
|
}
|
|
|
|
func LoadAnimatedObjectDefinitions(filename string) ([]AnimatedObject, error) {
|
|
var out []AnimatedObject
|
|
|
|
s, err := asciiscan.New(filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer s.Close()
|
|
|
|
for {
|
|
obj, err := consumeAnimatedObjectDefinition(s)
|
|
if err == io.EOF {
|
|
return out, nil
|
|
} else if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
out = append(out, obj)
|
|
}
|
|
}
|
|
|
|
func consumeAnimatedObjectDefinition(scanner *asciiscan.Scanner) (AnimatedObject, error) {
|
|
var out AnimatedObject
|
|
var err error
|
|
|
|
out.CentreCell, err = consumeCell(scanner)
|
|
if err != nil {
|
|
return out, err
|
|
}
|
|
|
|
if err := scanner.ConsumeIntPtrs(
|
|
&out.Direction, &out.Type, &out.AnimationID, &out.AnimationGroup, &out.AnimatedType,
|
|
); err != nil {
|
|
return out, err
|
|
}
|
|
|
|
// 8-int arrays
|
|
out.AnimationIDs, err = consumeCompassPoints(scanner)
|
|
if err != nil {
|
|
return out, err
|
|
}
|
|
|
|
out.InCells, err = consumeCompassPoints(scanner)
|
|
if err != nil {
|
|
return out, err
|
|
}
|
|
|
|
out.VisualBits, err = consumeCompassPoints(scanner)
|
|
if err != nil {
|
|
return out, err
|
|
}
|
|
|
|
out.MoveBits, err = consumeCompassPoints(scanner)
|
|
if err != nil {
|
|
return out, err
|
|
}
|
|
|
|
if err := scanner.ConsumeIntPtrs(
|
|
&out.Visibility, &out.Protection, &out.MinDelay, &out.DelayRange,
|
|
); err != nil {
|
|
return out, err
|
|
}
|
|
|
|
return out, nil
|
|
}
|
|
|
|
func consumeCell(scanner *asciiscan.Scanner) (Cell, error) {
|
|
out := Cell{}
|
|
str, err := scanner.ConsumeString()
|
|
if err != nil {
|
|
return out, err
|
|
}
|
|
|
|
parts := strings.Split(str, " ")
|
|
if len(parts) != 3 {
|
|
return out, errors.New("Malformed cell definition")
|
|
}
|
|
|
|
if out.X, err = strconv.Atoi(parts[0]); err != nil {
|
|
return out, err
|
|
}
|
|
|
|
if out.Y, err = strconv.Atoi(parts[1]); err != nil {
|
|
return out, err
|
|
}
|
|
|
|
if out.Z, err = strconv.Atoi(parts[2]); err != nil {
|
|
return out, err
|
|
}
|
|
|
|
return out, nil
|
|
}
|