aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/messages/types/svcGameEvent.go45
-rw-r--r--pkg/messages/types/svcGameEventList.go52
2 files changed, 68 insertions, 29 deletions
diff --git a/pkg/messages/types/svcGameEvent.go b/pkg/messages/types/svcGameEvent.go
index e12d75a..4410369 100644
--- a/pkg/messages/types/svcGameEvent.go
+++ b/pkg/messages/types/svcGameEvent.go
@@ -6,15 +6,52 @@ import (
6) 6)
7 7
8type SvcGameEvent struct { 8type SvcGameEvent struct {
9 Length uint16 9 Length uint16
10 Data []byte // TODO: GameEvent[] 10 EventID uint32
11 EventDescription GameEventDescriptor
12 EventDescriptors []EventDescriptorKey
13}
14
15type EventDescriptorKey struct {
16 Name string
17 Descriptor any
11} 18}
12 19
13func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent { 20func ParseSvcGameEvent(reader *bitreader.Reader) SvcGameEvent {
14 svcGameEvent := SvcGameEvent{ 21 svcGameEvent := SvcGameEvent{
15 Length: uint16(reader.TryReadBits(11)), 22 Length: uint16(reader.TryReadBits(11)),
16 } 23 }
17 svcGameEvent.Data = reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)) 24 gameEventReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEvent.Length)), true)
18 writer.TempAppendLine("\t\tData: %v", svcGameEvent.Data) 25 svcGameEvent.parseGameEvent(gameEventReader)
19 return svcGameEvent 26 return svcGameEvent
20} 27}
28
29func (svcGameEvent *SvcGameEvent) parseGameEvent(reader *bitreader.Reader) {
30 svcGameEvent.EventID = uint32(reader.TryReadBits(9))
31 svcGameEvent.EventDescription = GameEventList.GameEventDescriptor[svcGameEvent.EventID]
32 writer.TempAppendLine("\t\t%s (%d):", svcGameEvent.EventDescription.Name, svcGameEvent.EventID)
33 for _, descriptor := range svcGameEvent.EventDescription.Keys {
34 var value any
35 switch descriptor.Type {
36 case EventDescriptorString:
37 value = reader.TryReadString()
38 case EventDescriptorFloat:
39 value = reader.TryReadFloat32()
40 case EventDescriptorInt32:
41 value = reader.TryReadSInt32()
42 case EventDescriptorInt16:
43 value = reader.TryReadSInt16()
44 case EventDescriptorInt8:
45 value = reader.TryReadUInt8()
46 case EventDescriptorBool:
47 value = reader.TryReadBool()
48 case EventDescriptorUInt64:
49 value = reader.TryReadUInt64()
50 }
51 svcGameEvent.EventDescriptors = append(svcGameEvent.EventDescriptors, EventDescriptorKey{
52 Name: descriptor.Name,
53 Descriptor: value,
54 })
55 writer.TempAppendLine("\t\t\t%s: %v", descriptor.Name, value)
56 }
57}
diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go
index d020feb..f1cfffb 100644
--- a/pkg/messages/types/svcGameEventList.go
+++ b/pkg/messages/types/svcGameEventList.go
@@ -7,6 +7,8 @@ import (
7 "github.com/pektezol/demoparser/pkg/writer" 7 "github.com/pektezol/demoparser/pkg/writer"
8) 8)
9 9
10var GameEventList *SvcGameEventList
11
10type SvcGameEventList struct { 12type SvcGameEventList struct {
11 Events int16 13 Events int16
12 Length int32 14 Length int32
@@ -16,10 +18,12 @@ type SvcGameEventList struct {
16type GameEventDescriptor struct { 18type GameEventDescriptor struct {
17 EventID uint32 19 EventID uint32
18 Name string 20 Name string
19 Keys []struct { 21 Keys []GameEventDescriptorKey
20 Name string 22}
21 Type EventDescriptor 23
22 } 24type GameEventDescriptorKey struct {
25 Name string
26 Type EventDescriptor
23} 27}
24 28
25type EventDescriptor uint8 29type EventDescriptor uint8
@@ -32,60 +36,58 @@ func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList {
32 gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true) 36 gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true)
33 writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events) 37 writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events)
34 svcGameEventList.parseGameEventDescriptor(gameEventListReader) 38 svcGameEventList.parseGameEventDescriptor(gameEventListReader)
39 GameEventList = &svcGameEventList
35 return svcGameEventList 40 return svcGameEventList
36} 41}
37 42
38func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) { 43func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) {
39 svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events) 44 svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events)
40 for event := 0; event < int(svcGameEventList.Events); event++ { 45 for event := 0; event < int(svcGameEventList.Events); event++ {
41 gameEventDescriptor := GameEventDescriptor{ 46 svcGameEventList.GameEventDescriptor[event] = GameEventDescriptor{
42 EventID: uint32(reader.TryReadBits(9)), 47 EventID: uint32(reader.TryReadBits(9)),
43 Name: reader.TryReadString(), 48 Name: reader.TryReadString(),
44 } 49 }
45 writer.TempAppendLine("\t\t\t%d: %s", gameEventDescriptor.EventID, gameEventDescriptor.Name) 50 writer.TempAppendLine("\t\t\t%d: %s", svcGameEventList.GameEventDescriptor[event].EventID, svcGameEventList.GameEventDescriptor[event].Name)
46 for { 51 for {
47 descriptorType := reader.TryReadBits(3) 52 descriptorType := reader.TryReadBits(3)
48 if descriptorType == 0 { 53 if descriptorType == 0 {
49 break 54 break
50 } 55 }
51 KeyName := reader.TryReadString() 56 KeyName := reader.TryReadString()
52 gameEventDescriptor.Keys = append(gameEventDescriptor.Keys, struct { 57 svcGameEventList.GameEventDescriptor[event].Keys = append(svcGameEventList.GameEventDescriptor[event].Keys, GameEventDescriptorKey{
53 Name string
54 Type EventDescriptor
55 }{
56 Name: KeyName, 58 Name: KeyName,
57 Type: EventDescriptor(descriptorType), 59 Type: EventDescriptor(descriptorType),
58 }) 60 })
59 } 61 }
60 writer.TempAppendLine("\t\t\t\tKeys: %v", gameEventDescriptor.Keys) 62 writer.TempAppendLine("\t\t\t\tKeys: %v", svcGameEventList.GameEventDescriptor[event].Keys)
61 } 63 }
62} 64}
63 65
64const ( 66const (
65 String EventDescriptor = iota + 1 67 EventDescriptorString EventDescriptor = iota + 1
66 Float 68 EventDescriptorFloat
67 Int32 69 EventDescriptorInt32
68 Int16 70 EventDescriptorInt16
69 Int8 71 EventDescriptorInt8
70 Bool 72 EventDescriptorBool
71 UInt64 73 EventDescriptorUInt64
72) 74)
73 75
74func (eventDescriptor EventDescriptor) String() string { 76func (eventDescriptor EventDescriptor) String() string {
75 switch eventDescriptor { 77 switch eventDescriptor {
76 case String: 78 case EventDescriptorString:
77 return "String" 79 return "String"
78 case Float: 80 case EventDescriptorFloat:
79 return "Float" 81 return "Float"
80 case Int32: 82 case EventDescriptorInt32:
81 return "Int32" 83 return "Int32"
82 case Int16: 84 case EventDescriptorInt16:
83 return "Int16" 85 return "Int16"
84 case Int8: 86 case EventDescriptorInt8:
85 return "Int8" 87 return "Int8"
86 case Bool: 88 case EventDescriptorBool:
87 return "Bool" 89 return "Bool"
88 case UInt64: 90 case EventDescriptorUInt64:
89 return "UInt64" 91 return "UInt64"
90 default: 92 default:
91 return fmt.Sprintf("%d", eventDescriptor) 93 return fmt.Sprintf("%d", eventDescriptor)