aboutsummaryrefslogtreecommitdiffstats
path: root/demo/qwd
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--demo/qwd/cmd.go94
-rw-r--r--demo/qwd/data.go32
-rw-r--r--demo/qwd/parse.go66
-rw-r--r--demo/qwd/parse_test.go67
-rw-r--r--demo/qwd/read.go42
-rw-r--r--demo/qwd/set.go35
-rw-r--r--demo/qwd/testdata/demo1.qwdbin0 -> 13326081 bytes
-rw-r--r--demo/qwd/testdata/demo2.qwdbin0 -> 14619553 bytes
-rw-r--r--demo/qwd/testdata/demo3.qwdbin0 -> 6568269 bytes
-rw-r--r--demo/qwd/testdata/demo4.qwdbin0 -> 3599960 bytes
-rw-r--r--demo/qwd/testdata/demo5.qwdbin0 -> 9282497 bytes
-rw-r--r--demo/qwd/testdata/demo6.qwdbin0 -> 13509417 bytes
12 files changed, 336 insertions, 0 deletions
diff --git a/demo/qwd/cmd.go b/demo/qwd/cmd.go
new file mode 100644
index 0000000..8bd4d15
--- /dev/null
+++ b/demo/qwd/cmd.go
@@ -0,0 +1,94 @@
+package qwd
+
+import (
+ "github.com/osm/quake/common/buffer"
+ "github.com/osm/quake/common/context"
+)
+
+type Cmd struct {
+ Msec byte
+ UserAngle [3]float32
+ Forward uint16
+ Side uint16
+ Up uint16
+ Buttons byte
+ Impulse byte
+ Padding [3]byte
+ Angle [3]float32
+}
+
+func (cmd *Cmd) Bytes() []byte {
+ buf := buffer.New()
+
+ buf.PutByte(cmd.Msec)
+
+ for i := 0; i < 3; i++ {
+ buf.PutFloat32(cmd.UserAngle[i])
+ }
+
+ buf.PutUint16(cmd.Forward)
+ buf.PutUint16(cmd.Side)
+ buf.PutUint16(cmd.Up)
+
+ for i := 0; i < 3; i++ {
+ buf.PutByte(cmd.Padding[i])
+ }
+
+ buf.PutByte(cmd.Buttons)
+ buf.PutByte(cmd.Impulse)
+
+ for i := 0; i < 3; i++ {
+ buf.PutFloat32(cmd.Angle[i])
+ }
+
+ return buf.Bytes()
+}
+
+func parseCmd(ctx *context.Context, buf *buffer.Buffer) (*Cmd, error) {
+ var err error
+ var cmd Cmd
+
+ if cmd.Msec, err = buf.ReadByte(); err != nil {
+ return nil, err
+ }
+
+ for i := 0; i < 3; i++ {
+ if cmd.UserAngle[i], err = buf.GetFloat32(); err != nil {
+ return nil, err
+ }
+ }
+
+ if cmd.Forward, err = buf.GetUint16(); err != nil {
+ return nil, err
+ }
+
+ if cmd.Side, err = buf.GetUint16(); err != nil {
+ return nil, err
+ }
+
+ if cmd.Up, err = buf.GetUint16(); err != nil {
+ return nil, err
+ }
+
+ for i := 0; i < 3; i++ {
+ if cmd.Padding[i], err = buf.ReadByte(); err != nil {
+ return nil, err
+ }
+ }
+
+ if cmd.Buttons, err = buf.ReadByte(); err != nil {
+ return nil, err
+ }
+
+ if cmd.Impulse, err = buf.ReadByte(); err != nil {
+ return nil, err
+ }
+
+ for i := 0; i < 3; i++ {
+ if cmd.Angle[i], err = buf.GetFloat32(); err != nil {
+ return nil, err
+ }
+ }
+
+ return &cmd, nil
+}
diff --git a/demo/qwd/data.go b/demo/qwd/data.go
new file mode 100644
index 0000000..cc00c23
--- /dev/null
+++ b/demo/qwd/data.go
@@ -0,0 +1,32 @@
+package qwd
+
+import (
+ "github.com/osm/quake/common/buffer"
+ "github.com/osm/quake/protocol"
+)
+
+type Data struct {
+ Timestamp float32
+ Command byte
+ Cmd *Cmd
+ Read *Read
+ Set *Set
+}
+
+func (d *Data) Bytes() []byte {
+ buf := buffer.New()
+
+ buf.PutFloat32(d.Timestamp)
+ buf.PutByte(d.Command)
+
+ switch d.Command {
+ case protocol.DemoCmd:
+ buf.PutBytes(d.Cmd.Bytes())
+ case protocol.DemoRead:
+ buf.PutBytes(d.Read.Bytes())
+ case protocol.DemoSet:
+ buf.PutBytes(d.Set.Bytes())
+ }
+
+ return buf.Bytes()
+}
diff --git a/demo/qwd/parse.go b/demo/qwd/parse.go
new file mode 100644
index 0000000..458f714
--- /dev/null
+++ b/demo/qwd/parse.go
@@ -0,0 +1,66 @@
+package qwd
+
+import (
+ "errors"
+
+ "github.com/osm/quake/common/buffer"
+ "github.com/osm/quake/common/context"
+ "github.com/osm/quake/protocol"
+)
+
+var ErrUnknownType = errors.New("unknown type")
+
+type Demo struct {
+ Data []*Data
+}
+
+func (dem *Demo) Bytes() []byte {
+ buf := buffer.New()
+
+ for _, d := range dem.Data {
+ buf.PutBytes(d.Bytes())
+ }
+
+ return buf.Bytes()
+}
+
+func Parse(ctx *context.Context, data []byte) (*Demo, error) {
+ var err error
+ var cmd Demo
+
+ buf := buffer.New(buffer.WithData(data))
+ ctx.SetIsQWD(true)
+
+ for buf.Off() < buf.Len() {
+ var data Data
+
+ if data.Timestamp, err = buf.GetFloat32(); err != nil {
+ return nil, err
+ }
+
+ if data.Command, err = buf.ReadByte(); err != nil {
+ return nil, err
+ }
+
+ switch data.Command {
+ case protocol.DemoCmd:
+ if data.Cmd, err = parseCmd(ctx, buf); err != nil {
+ return nil, err
+ }
+ case protocol.DemoRead:
+ if data.Read, err = parseRead(ctx, buf); err != nil {
+ return nil, err
+ }
+ case protocol.DemoSet:
+ if data.Set, err = parseSet(ctx, buf); err != nil {
+ return nil, err
+ }
+ default:
+ return nil, ErrUnknownType
+ }
+
+ cmd.Data = append(cmd.Data, &data)
+ }
+
+ return &cmd, nil
+}
diff --git a/demo/qwd/parse_test.go b/demo/qwd/parse_test.go
new file mode 100644
index 0000000..97e39df
--- /dev/null
+++ b/demo/qwd/parse_test.go
@@ -0,0 +1,67 @@
+package qwd
+
+import (
+ "crypto/sha256"
+ "fmt"
+ "io/ioutil"
+ "testing"
+
+ "github.com/osm/quake/common/context"
+)
+
+type qwdTest struct {
+ filePath string
+ checksum string
+}
+
+var qwdTests = []qwdTest{
+ {
+ filePath: "testdata/demo1.qwd",
+ checksum: "849cf01cb3fe5c7161625dafdf03178536048d093eda885ca9b37fc673c3c72a",
+ },
+ {
+ filePath: "testdata/demo2.qwd",
+ checksum: "c90f0a6c9ba79fc7f84d90b12d923a3ad2c0e54849d8df6fd913264f147931b2",
+ },
+ {
+ filePath: "testdata/demo3.qwd",
+ checksum: "b816f366489d22ed70b84f105a19ce63810fee7295e3b3612fdf7e09c26fc9e9",
+ },
+ {
+ filePath: "testdata/demo4.qwd",
+ checksum: "6b9088a13fc08609ca58e9887379e743beae0c0752939c001ac35d81a8f9c5af",
+ },
+ {
+ filePath: "testdata/demo5.qwd",
+ checksum: "698b1961ee8ac009fff062255cece5ab6729c50df9f6ece2d1cf7f1c52406c13",
+ },
+ {
+ filePath: "testdata/demo6.qwd",
+ checksum: "796357af178feb0c5fd5bff9cc6423914a36cc028f172b92c1336f1000e48d74",
+ },
+}
+
+func TestParse(t *testing.T) {
+ for _, qt := range qwdTests {
+ t.Run(qt.filePath, func(t *testing.T) {
+ data, err := ioutil.ReadFile(qt.filePath)
+ if err != nil {
+ t.Errorf("unable to open demo file, %v", err)
+ }
+
+ demo, err := Parse(context.New(), data)
+ if err != nil {
+ t.Errorf("unable to parse demo, %v", err)
+ }
+
+ h := sha256.New()
+ h.Write(demo.Bytes())
+ checksum := fmt.Sprintf("%x", h.Sum(nil))
+ if checksum != qt.checksum {
+ t.Errorf("sha256 checksums didn't match")
+ t.Logf("output: %#v", checksum)
+ t.Logf("expected: %#v", qt.checksum)
+ }
+ })
+ }
+}
diff --git a/demo/qwd/read.go b/demo/qwd/read.go
new file mode 100644
index 0000000..fdcee77
--- /dev/null
+++ b/demo/qwd/read.go
@@ -0,0 +1,42 @@
+package qwd
+
+import (
+ "github.com/osm/quake/common/buffer"
+ "github.com/osm/quake/common/context"
+ "github.com/osm/quake/packet"
+ "github.com/osm/quake/packet/svc"
+)
+
+type Read struct {
+ Size uint32
+ Packet packet.Packet
+}
+
+func (cmd *Read) Bytes() []byte {
+ buf := buffer.New()
+
+ buf.PutUint32(cmd.Size)
+ buf.PutBytes(cmd.Packet.Bytes())
+
+ return buf.Bytes()
+}
+
+func parseRead(ctx *context.Context, buf *buffer.Buffer) (*Read, error) {
+ var err error
+ var cmd Read
+
+ if cmd.Size, err = buf.GetUint32(); err != nil {
+ return nil, err
+ }
+
+ bytes, err := buf.GetBytes(int(cmd.Size))
+ if err != nil {
+ return nil, err
+ }
+
+ if cmd.Packet, err = svc.Parse(ctx, bytes); err != nil {
+ return nil, err
+ }
+
+ return &cmd, nil
+}
diff --git a/demo/qwd/set.go b/demo/qwd/set.go
new file mode 100644
index 0000000..d7cc48d
--- /dev/null
+++ b/demo/qwd/set.go
@@ -0,0 +1,35 @@
+package qwd
+
+import (
+ "github.com/osm/quake/common/buffer"
+ "github.com/osm/quake/common/context"
+)
+
+type Set struct {
+ SeqOut uint32
+ SeqIn uint32
+}
+
+func (cmd *Set) Bytes() []byte {
+ buf := buffer.New()
+
+ buf.PutUint32(cmd.SeqOut)
+ buf.PutUint32(cmd.SeqIn)
+
+ return buf.Bytes()
+}
+
+func parseSet(ctx *context.Context, buf *buffer.Buffer) (*Set, error) {
+ var err error
+ var cmd Set
+
+ if cmd.SeqOut, err = buf.GetUint32(); err != nil {
+ return nil, err
+ }
+
+ if cmd.SeqIn, err = buf.GetUint32(); err != nil {
+ return nil, err
+ }
+
+ return &cmd, nil
+}
diff --git a/demo/qwd/testdata/demo1.qwd b/demo/qwd/testdata/demo1.qwd
new file mode 100644
index 0000000..afc2c30
--- /dev/null
+++ b/demo/qwd/testdata/demo1.qwd
Binary files differ
diff --git a/demo/qwd/testdata/demo2.qwd b/demo/qwd/testdata/demo2.qwd
new file mode 100644
index 0000000..55f5306
--- /dev/null
+++ b/demo/qwd/testdata/demo2.qwd
Binary files differ
diff --git a/demo/qwd/testdata/demo3.qwd b/demo/qwd/testdata/demo3.qwd
new file mode 100644
index 0000000..e04d332
--- /dev/null
+++ b/demo/qwd/testdata/demo3.qwd
Binary files differ
diff --git a/demo/qwd/testdata/demo4.qwd b/demo/qwd/testdata/demo4.qwd
new file mode 100644
index 0000000..005a143
--- /dev/null
+++ b/demo/qwd/testdata/demo4.qwd
Binary files differ
diff --git a/demo/qwd/testdata/demo5.qwd b/demo/qwd/testdata/demo5.qwd
new file mode 100644
index 0000000..a78e779
--- /dev/null
+++ b/demo/qwd/testdata/demo5.qwd
Binary files differ
diff --git a/demo/qwd/testdata/demo6.qwd b/demo/qwd/testdata/demo6.qwd
new file mode 100644
index 0000000..78e6abc
--- /dev/null
+++ b/demo/qwd/testdata/demo6.qwd
Binary files differ