From ca90ebdfa8789654766c5d7969baa7afacd9ebd2 Mon Sep 17 00:00:00 2001 From: BanceDev Date: Mon, 16 Feb 2026 16:31:54 -0500 Subject: initial commit --- demo/qwd/cmd.go | 94 ++++++++++++++++++++++++++++++++++++++++++++ demo/qwd/data.go | 32 +++++++++++++++ demo/qwd/parse.go | 66 +++++++++++++++++++++++++++++++ demo/qwd/parse_test.go | 67 +++++++++++++++++++++++++++++++ demo/qwd/read.go | 42 ++++++++++++++++++++ demo/qwd/set.go | 35 +++++++++++++++++ demo/qwd/testdata/demo1.qwd | Bin 0 -> 13326081 bytes demo/qwd/testdata/demo2.qwd | Bin 0 -> 14619553 bytes demo/qwd/testdata/demo3.qwd | Bin 0 -> 6568269 bytes demo/qwd/testdata/demo4.qwd | Bin 0 -> 3599960 bytes demo/qwd/testdata/demo5.qwd | Bin 0 -> 9282497 bytes demo/qwd/testdata/demo6.qwd | Bin 0 -> 13509417 bytes 12 files changed, 336 insertions(+) create mode 100644 demo/qwd/cmd.go create mode 100644 demo/qwd/data.go create mode 100644 demo/qwd/parse.go create mode 100644 demo/qwd/parse_test.go create mode 100644 demo/qwd/read.go create mode 100644 demo/qwd/set.go create mode 100644 demo/qwd/testdata/demo1.qwd create mode 100644 demo/qwd/testdata/demo2.qwd create mode 100644 demo/qwd/testdata/demo3.qwd create mode 100644 demo/qwd/testdata/demo4.qwd create mode 100644 demo/qwd/testdata/demo5.qwd create mode 100644 demo/qwd/testdata/demo6.qwd (limited to 'demo/qwd') 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 Binary files /dev/null and b/demo/qwd/testdata/demo1.qwd differ diff --git a/demo/qwd/testdata/demo2.qwd b/demo/qwd/testdata/demo2.qwd new file mode 100644 index 0000000..55f5306 Binary files /dev/null and b/demo/qwd/testdata/demo2.qwd differ diff --git a/demo/qwd/testdata/demo3.qwd b/demo/qwd/testdata/demo3.qwd new file mode 100644 index 0000000..e04d332 Binary files /dev/null and b/demo/qwd/testdata/demo3.qwd differ diff --git a/demo/qwd/testdata/demo4.qwd b/demo/qwd/testdata/demo4.qwd new file mode 100644 index 0000000..005a143 Binary files /dev/null and b/demo/qwd/testdata/demo4.qwd differ diff --git a/demo/qwd/testdata/demo5.qwd b/demo/qwd/testdata/demo5.qwd new file mode 100644 index 0000000..a78e779 Binary files /dev/null and b/demo/qwd/testdata/demo5.qwd differ diff --git a/demo/qwd/testdata/demo6.qwd b/demo/qwd/testdata/demo6.qwd new file mode 100644 index 0000000..78e6abc Binary files /dev/null and b/demo/qwd/testdata/demo6.qwd differ -- cgit v1.2.3-59-g8ed1b