From 77e4b066cb8d506b4bc944ab4eb2d6e4679e2202 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 15 Jun 2024 13:58:30 +0300 Subject: enable multithreading with goroutines (#20) --- pkg/types/gameevent.go | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ pkg/types/types.go | 71 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 pkg/types/gameevent.go create mode 100644 pkg/types/types.go (limited to 'pkg/types') diff --git a/pkg/types/gameevent.go b/pkg/types/gameevent.go new file mode 100644 index 0000000..4f00bc0 --- /dev/null +++ b/pkg/types/gameevent.go @@ -0,0 +1,80 @@ +package types + +import ( + "fmt" + + "github.com/pektezol/bitreader" +) + +type SvcGameEventList struct { + Events int16 `json:"events"` + Length int32 `json:"length"` + GameEventDescriptor []GameEventDescriptor `json:"game_event_descriptor"` +} + +type GameEventDescriptor struct { + EventID uint32 `json:"event_id"` + Name string `json:"name"` + Keys []GameEventDescriptorKey `json:"keys"` +} + +type GameEventDescriptorKey struct { + Name string `json:"name"` + Type EventDescriptor `json:"type"` +} + +type EventDescriptor uint8 + +func (svcGameEventList *SvcGameEventList) ParseGameEventDescriptor(reader *bitreader.Reader, demo *Demo) { + svcGameEventList.GameEventDescriptor = make([]GameEventDescriptor, svcGameEventList.Events) + for event := 0; event < int(svcGameEventList.Events); event++ { + svcGameEventList.GameEventDescriptor[event] = GameEventDescriptor{ + EventID: uint32(reader.TryReadBits(9)), + Name: reader.TryReadString(), + } + demo.Writer.TempAppendLine("\t\t\t%d: %s", svcGameEventList.GameEventDescriptor[event].EventID, svcGameEventList.GameEventDescriptor[event].Name) + for { + descriptorType := reader.TryReadBits(3) + if descriptorType == 0 { + break + } + KeyName := reader.TryReadString() + svcGameEventList.GameEventDescriptor[event].Keys = append(svcGameEventList.GameEventDescriptor[event].Keys, GameEventDescriptorKey{ + Name: KeyName, + Type: EventDescriptor(descriptorType), + }) + } + demo.Writer.TempAppendLine("\t\t\t\tKeys: %v", svcGameEventList.GameEventDescriptor[event].Keys) + } +} + +const ( + EventDescriptorString EventDescriptor = iota + 1 + EventDescriptorFloat + EventDescriptorInt32 + EventDescriptorInt16 + EventDescriptorInt8 + EventDescriptorBool + EventDescriptorUInt64 +) + +func (eventDescriptor EventDescriptor) String() string { + switch eventDescriptor { + case EventDescriptorString: + return "String" + case EventDescriptorFloat: + return "Float" + case EventDescriptorInt32: + return "Int32" + case EventDescriptorInt16: + return "Int16" + case EventDescriptorInt8: + return "Int8" + case EventDescriptorBool: + return "Bool" + case EventDescriptorUInt64: + return "UInt64" + default: + return fmt.Sprintf("%d", eventDescriptor) + } +} diff --git a/pkg/types/types.go b/pkg/types/types.go new file mode 100644 index 0000000..341e875 --- /dev/null +++ b/pkg/types/types.go @@ -0,0 +1,71 @@ +package types + +import ( + "github.com/pektezol/sdp.go/pkg/writer" +) + +type Demo struct { + Headers Headers `json:"headers"` + Messages []Message `json:"messages"` + Writer *writer.Writer `json:"-"` + GameEventList *SvcGameEventList `json:"-"` +} + +type Headers struct { + DemoFileStamp string `json:"demo_file_stamp"` + DemoProtocol int32 `json:"demo_protocol"` + NetworkProtocol int32 `json:"network_protocol"` + ServerName string `json:"server_name"` + ClientName string `json:"client_name"` + MapName string `json:"map_name"` + GameDirectory string `json:"game_directory"` + PlaybackTime float32 `json:"playback_time"` + PlaybackTicks int32 `json:"playback_ticks"` + PlaybackFrames int32 `json:"playback_frames"` + SignOnLength int32 `json:"sign_on_length"` +} + +type Message struct { + PacketType MessageType `json:"packet_type"` + TickNumber int32 `json:"tick_number"` + SlotNumber uint8 `json:"slot_number"` + Data any `json:"data"` +} + +type MessageType uint8 + +const ( + SignOn MessageType = iota + 1 + Packet + SyncTick + ConsoleCmd + UserCmd + DataTables + Stop + CustomData + StringTables +) + +func (t MessageType) String() string { + switch t { + case SignOn: + return "SIGNON" + case Packet: + return "PACKET" + case SyncTick: + return "SYNCTICK" + case ConsoleCmd: + return "CONSOLECMD" + case UserCmd: + return "USERCMD" + case DataTables: + return "DATATABLES" + case Stop: + return "STOP" + case CustomData: + return "CUSTOMDATA" + case StringTables: + return "STRINGTABLES" + } + return "INVALID" +} -- cgit v1.2.3