From 2ec2cf3cff547ae5daa79e7914394ce3f88504b2 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 27 Sep 2023 00:52:47 +0300 Subject: added game event list detailed parsing (#14) --- pkg/messages/types/svcGameEventList.go | 76 ++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go index 1fa7589..d020feb 100644 --- a/pkg/messages/types/svcGameEventList.go +++ b/pkg/messages/types/svcGameEventList.go @@ -1,6 +1,8 @@ package messages import ( + "fmt" + "github.com/pektezol/bitreader" "github.com/pektezol/demoparser/pkg/writer" ) @@ -8,18 +10,84 @@ import ( type SvcGameEventList struct { Events int16 Length int32 - GameEventDescriptor []gameEventDescriptor + GameEventDescriptor []GameEventDescriptor } -type gameEventDescriptor struct { +type GameEventDescriptor struct { + EventID uint32 + Name string + Keys []struct { + Name string + Type EventDescriptor + } } +type EventDescriptor uint8 + func ParseSvcGameEventList(reader *bitreader.Reader) SvcGameEventList { svcGameEventList := SvcGameEventList{ Events: int16(reader.TryReadBits(9)), Length: int32(reader.TryReadBits(20)), } - reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)) - writer.TempAppendLine("\t\tEvents: %d", svcGameEventList.Events) + gameEventListReader := bitreader.NewReaderFromBytes(reader.TryReadBitsToSlice(uint64(svcGameEventList.Length)), true) + writer.TempAppendLine("\t\t%d Events:", svcGameEventList.Events) + svcGameEventList.parseGameEventDescriptor(gameEventListReader) return svcGameEventList } + +func (svcGameEventList *SvcGameEventList) parseGameEventDescriptor(reader *bitreader.Reader) { + svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events) + for event := 0; event < int(svcGameEventList.Events); event++ { + gameEventDescriptor := GameEventDescriptor{ + EventID: uint32(reader.TryReadBits(9)), + Name: reader.TryReadString(), + } + writer.TempAppendLine("\t\t\t%d: %s", gameEventDescriptor.EventID, gameEventDescriptor.Name) + for { + descriptorType := reader.TryReadBits(3) + if descriptorType == 0 { + break + } + KeyName := reader.TryReadString() + gameEventDescriptor.Keys = append(gameEventDescriptor.Keys, struct { + Name string + Type EventDescriptor + }{ + Name: KeyName, + Type: EventDescriptor(descriptorType), + }) + } + writer.TempAppendLine("\t\t\t\tKeys: %v", gameEventDescriptor.Keys) + } +} + +const ( + String EventDescriptor = iota + 1 + Float + Int32 + Int16 + Int8 + Bool + UInt64 +) + +func (eventDescriptor EventDescriptor) String() string { + switch eventDescriptor { + case String: + return "String" + case Float: + return "Float" + case Int32: + return "Int32" + case Int16: + return "Int16" + case Int8: + return "Int8" + case Bool: + return "Bool" + case UInt64: + return "UInt64" + default: + return fmt.Sprintf("%d", eventDescriptor) + } +} -- cgit v1.2.3