aboutsummaryrefslogtreecommitdiff
path: root/pkg/classes/sarData.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/classes/sarData.go')
-rw-r--r--pkg/classes/sarData.go110
1 files changed, 78 insertions, 32 deletions
diff --git a/pkg/classes/sarData.go b/pkg/classes/sarData.go
index 35163c3..27e8a64 100644
--- a/pkg/classes/sarData.go
+++ b/pkg/classes/sarData.go
@@ -5,6 +5,7 @@ import (
5 "fmt" 5 "fmt"
6 6
7 "github.com/pektezol/bitreader" 7 "github.com/pektezol/bitreader"
8 "github.com/pektezol/demoparser/pkg/writer"
8) 9)
9 10
10type SarDataType uint8 11type SarDataType uint8
@@ -137,12 +138,12 @@ type SarDataSpeedrunTimeSplits struct {
137} 138}
138 139
139type SarDataTimestamp struct { 140type SarDataTimestamp struct {
140 Year uint16 141 Year uint16
141 Mon uint8 142 Month uint8
142 Day uint8 143 Day uint8
143 Hour uint8 144 Hour uint8
144 Min uint8 145 Minute uint8
145 Sec uint8 146 Second uint8
146} 147}
147 148
148type SarDataFileChecksum struct { 149type SarDataFileChecksum struct {
@@ -163,6 +164,7 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
163 len = 9 164 len = 9
164 } 165 }
165 dataReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(len-1), true) 166 dataReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(len-1), true)
167 writer.AppendLine("\tMessage: %s (%d):", sarData.Type.String(), sarData.Type)
166 switch sarData.Type { 168 switch sarData.Type {
167 case ESarDataTimescaleCheat: 169 case ESarDataTimescaleCheat:
168 sarData.Data, err = parseTimescaleCheatData(dataReader, len) 170 sarData.Data, err = parseTimescaleCheatData(dataReader, len)
@@ -173,6 +175,7 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
173 sarData.Data = parseInitialCVarData(dataReader) 175 sarData.Data = parseInitialCVarData(dataReader)
174 case ESarDataEntityInputSlot: 176 case ESarDataEntityInputSlot:
175 sarData.Slot = int(dataReader.TryReadBytes(1)) 177 sarData.Slot = int(dataReader.TryReadBytes(1))
178 writer.AppendLine("\t\tSlot: %d", sarData.Slot)
176 case ESarDataEntityInput: 179 case ESarDataEntityInput:
177 sarData.Data = parseEntityInputData(dataReader) 180 sarData.Data = parseEntityInputData(dataReader)
178 case ESarDataChecksum: 181 case ESarDataChecksum:
@@ -198,6 +201,7 @@ func (sarData *SarData) ParseSarData(reader *bitreader.Reader) (err error) {
198 if err != nil { 201 if err != nil {
199 sarData.Data = nil 202 sarData.Data = nil
200 } 203 }
204 writer.AppendLine("\t\tSlot: %d", sarData.Slot)
201 case ESarDataPause: 205 case ESarDataPause:
202 sarData.Data, err = parsePauseData(dataReader, len) 206 sarData.Data, err = parsePauseData(dataReader, len)
203 if err != nil { 207 if err != nil {
@@ -239,45 +243,60 @@ func parseTimescaleCheatData(reader *bitreader.Reader, length uint64) (SarDataTi
239 if length != 5 { 243 if length != 5 {
240 return SarDataTimescaleCheat{}, errors.New("sar data invalid") 244 return SarDataTimescaleCheat{}, errors.New("sar data invalid")
241 } 245 }
242 return SarDataTimescaleCheat{ 246 sarDataTimescaleCheat := SarDataTimescaleCheat{
243 Timescale: reader.TryReadFloat32(), 247 Timescale: reader.TryReadFloat32(),
244 }, nil 248 }
249 writer.AppendLine("\t\tTimescale: %f", sarDataTimescaleCheat.Timescale)
250 return sarDataTimescaleCheat, nil
245} 251}
246 252
247func parseInitialCVarData(reader *bitreader.Reader) SarDataInitialCVar { 253func parseInitialCVarData(reader *bitreader.Reader) SarDataInitialCVar {
248 return SarDataInitialCVar{ 254 sarDataInitialCvar := SarDataInitialCVar{
249 CVar: reader.TryReadString(), 255 CVar: reader.TryReadString(),
250 Val: reader.TryReadString(), 256 Val: reader.TryReadString(),
251 } 257 }
258 writer.AppendLine("\t\tCvar: \"%s\" = \"%s\"", sarDataInitialCvar.CVar, sarDataInitialCvar.Val)
259 return sarDataInitialCvar
252} 260}
253 261
254func parseEntityInputData(reader *bitreader.Reader) SarDataEntityInput { 262func parseEntityInputData(reader *bitreader.Reader) SarDataEntityInput {
255 return SarDataEntityInput{ 263 sarDataEntityInput := SarDataEntityInput{
256 TargetName: reader.TryReadString(), 264 TargetName: reader.TryReadString(),
257 ClassName: reader.TryReadString(), 265 ClassName: reader.TryReadString(),
258 InputName: reader.TryReadString(), 266 InputName: reader.TryReadString(),
259 Parameter: reader.TryReadString(), 267 Parameter: reader.TryReadString(),
260 } 268 }
269 writer.AppendLine("\t\tTarget: %s", sarDataEntityInput.TargetName)
270 writer.AppendLine("\t\tClass: %s", sarDataEntityInput.ClassName)
271 writer.AppendLine("\t\tInput: %s", sarDataEntityInput.InputName)
272 writer.AppendLine("\t\tParameter: %s", sarDataEntityInput.Parameter)
273 return sarDataEntityInput
261} 274}
262 275
263func parseChecksumData(reader *bitreader.Reader, length uint64) (SarDataChecksum, error) { 276func parseChecksumData(reader *bitreader.Reader, length uint64) (SarDataChecksum, error) {
264 if length != 9 { 277 if length != 9 {
265 return SarDataChecksum{}, errors.New("sar data invalid") 278 return SarDataChecksum{}, errors.New("sar data invalid")
266 } 279 }
267 return SarDataChecksum{ 280 sarDataChecksum := SarDataChecksum{
268 DemoSum: reader.TryReadUInt32(), 281 DemoSum: reader.TryReadUInt32(),
269 SarSum: reader.TryReadUInt32(), 282 SarSum: reader.TryReadUInt32(),
270 }, nil 283 }
284 writer.AppendLine("\t\tDemo Checksum: %d", sarDataChecksum.DemoSum)
285 writer.AppendLine("\t\tSAR Checksum: %d", sarDataChecksum.SarSum)
286 return sarDataChecksum, nil
271} 287}
272 288
273func parseChecksumV2Data(reader *bitreader.Reader, length uint64) (SarDataChecksumV2, error) { 289func parseChecksumV2Data(reader *bitreader.Reader, length uint64) (SarDataChecksumV2, error) {
274 if length != 69 { 290 if length != 69 {
275 return SarDataChecksumV2{}, errors.New("sar data invalid") 291 return SarDataChecksumV2{}, errors.New("sar data invalid")
276 } 292 }
277 return SarDataChecksumV2{ 293 sarDataChecksumV2 := SarDataChecksumV2{
278 SarSum: reader.TryReadUInt32(), 294 SarSum: reader.TryReadUInt32(),
279 Signature: [64]byte(reader.TryReadBytesToSlice(60)), 295 Signature: [64]byte(reader.TryReadBytesToSlice(60)),
280 }, nil 296 }
297 writer.AppendLine("\t\tSAR Checksum: %d", sarDataChecksumV2.SarSum)
298 writer.AppendLine("\t\tSignature: %v", sarDataChecksumV2.Signature)
299 return sarDataChecksumV2, nil
281} 300}
282 301
283func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataPortalPlacement, int, error) { 302func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataPortalPlacement, int, error) {
@@ -287,12 +306,17 @@ func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataP
287 slot := int(reader.TryReadBytes(1)) 306 slot := int(reader.TryReadBytes(1))
288 orange := reader.TryReadBool() 307 orange := reader.TryReadBool()
289 reader.SkipBits(7) 308 reader.SkipBits(7)
290 return SarDataPortalPlacement{ 309 sarDataPortalPlacement := SarDataPortalPlacement{
291 Orange: orange, 310 Orange: orange,
292 X: reader.TryReadFloat32(), 311 X: reader.TryReadFloat32(),
293 Y: reader.TryReadFloat32(), 312 Y: reader.TryReadFloat32(),
294 Z: reader.TryReadFloat32(), 313 Z: reader.TryReadFloat32(),
295 }, slot, nil 314 }
315 writer.AppendLine("\t\tOrange: %t", orange)
316 writer.AppendLine("\t\tX: %f", sarDataPortalPlacement.X)
317 writer.AppendLine("\t\tY: %f", sarDataPortalPlacement.Y)
318 writer.AppendLine("\t\tZ: %f", sarDataPortalPlacement.Z)
319 return sarDataPortalPlacement, slot, nil
296} 320}
297 321
298func parseChallengeFlagsCrouchFlyData(reader *bitreader.Reader, length uint64) (int, error) { 322func parseChallengeFlagsCrouchFlyData(reader *bitreader.Reader, length uint64) (int, error) {
@@ -306,29 +330,37 @@ func parsePauseData(reader *bitreader.Reader, length uint64) (SarDataPause, erro
306 if length != 5 { 330 if length != 5 {
307 return SarDataPause{}, errors.New("sar data invalid") 331 return SarDataPause{}, errors.New("sar data invalid")
308 } 332 }
309 return SarDataPause{ 333 sarDataPause := SarDataPause{
310 PauseTicks: reader.TryReadUInt32(), 334 PauseTicks: reader.TryReadUInt32(),
311 }, nil 335 }
336 writer.AppendLine("\t\tPause Ticks: %d", sarDataPause.PauseTicks)
337 return sarDataPause, nil
312} 338}
313 339
314func parseWaitRunData(reader *bitreader.Reader, length uint64) (SarDataWaitRun, error) { 340func parseWaitRunData(reader *bitreader.Reader, length uint64) (SarDataWaitRun, error) {
315 if length < 6 { 341 if length < 6 {
316 return SarDataWaitRun{}, errors.New("sar data invalid") 342 return SarDataWaitRun{}, errors.New("sar data invalid")
317 } 343 }
318 return SarDataWaitRun{ 344 sarDataWaitRun := SarDataWaitRun{
319 Ticks: int(reader.TryReadUInt32()), 345 Ticks: int(reader.TryReadUInt32()),
320 Cmd: reader.TryReadString(), 346 Cmd: reader.TryReadString(),
321 }, nil 347 }
348 writer.AppendLine("\t\tTicks: %d", sarDataWaitRun.Ticks)
349 writer.AppendLine("\t\tCmd: \"%s\"", sarDataWaitRun.Cmd)
350 return sarDataWaitRun, nil
322} 351}
323 352
324func parseHWaitRunData(reader *bitreader.Reader, length uint64) (SarDataHWaitRun, error) { 353func parseHWaitRunData(reader *bitreader.Reader, length uint64) (SarDataHWaitRun, error) {
325 if length < 6 { 354 if length < 6 {
326 return SarDataHWaitRun{}, errors.New("sar data invalid") 355 return SarDataHWaitRun{}, errors.New("sar data invalid")
327 } 356 }
328 return SarDataHWaitRun{ 357 sarDataHWaitRun := SarDataHWaitRun{
329 Ticks: int(reader.TryReadUInt32()), 358 Ticks: int(reader.TryReadUInt32()),
330 Cmd: reader.TryReadString(), 359 Cmd: reader.TryReadString(),
331 }, nil 360 }
361 writer.AppendLine("\t\tTicks: %d", sarDataHWaitRun.Ticks)
362 writer.AppendLine("\t\tCmd: \"%s\"", sarDataHWaitRun.Cmd)
363 return sarDataHWaitRun, nil
332} 364}
333 365
334func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpeedrunTime, error) { 366func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpeedrunTime, error) {
@@ -340,10 +372,14 @@ func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpee
340 for splitCount := 0; splitCount < int(numberOfSplits); splitCount++ { 372 for splitCount := 0; splitCount < int(numberOfSplits); splitCount++ {
341 splits[splitCount].Name = reader.TryReadString() 373 splits[splitCount].Name = reader.TryReadString()
342 splits[splitCount].NSegs = reader.TryReadUInt32() 374 splits[splitCount].NSegs = reader.TryReadUInt32()
375 writer.AppendLine("\t\t[%d] Split Name: \"%s\"", splitCount, splits[splitCount].Name)
376 writer.AppendLine("\t\t[%d] Number of Segments: %d", splitCount, splits[splitCount].NSegs)
343 splits[splitCount].Segs = make([]SarDataSpeedrunTimeSegs, splits[splitCount].NSegs) 377 splits[splitCount].Segs = make([]SarDataSpeedrunTimeSegs, splits[splitCount].NSegs)
344 for segCount := 0; segCount < int(splits[splitCount].NSegs); segCount++ { 378 for segCount := 0; segCount < int(splits[splitCount].NSegs); segCount++ {
345 splits[splitCount].Segs[segCount].Name = reader.TryReadString() 379 splits[splitCount].Segs[segCount].Name = reader.TryReadString()
346 splits[splitCount].Segs[segCount].Ticks = reader.TryReadUInt32() 380 splits[splitCount].Segs[segCount].Ticks = reader.TryReadUInt32()
381 writer.AppendLine("\t\t\t[%d] Segment Name: \"%s\"", segCount, splits[splitCount].Segs[segCount].Name)
382 writer.AppendLine("\t\t\t[%d] Segment Ticks: %d", segCount, splits[splitCount].Segs[segCount].Ticks)
347 } 383 }
348 } 384 }
349 return SarDataSpeedrunTime{ 385 return SarDataSpeedrunTime{
@@ -357,22 +393,32 @@ func parseTimestampData(reader *bitreader.Reader, length uint64) (SarDataTimesta
357 return SarDataTimestamp{}, errors.New("sar data invalid") 393 return SarDataTimestamp{}, errors.New("sar data invalid")
358 } 394 }
359 timestamp := reader.TryReadBytesToSlice(7) 395 timestamp := reader.TryReadBytesToSlice(7)
360 return SarDataTimestamp{ 396 sarDataTimeStamp := SarDataTimestamp{
361 Year: uint16(timestamp[0]) | uint16(timestamp[1])<<8, 397 Year: uint16(timestamp[0]) | uint16(timestamp[1])<<8,
362 Mon: timestamp[2] + 1, 398 Month: timestamp[2] + 1,
363 Day: timestamp[3], 399 Day: timestamp[3],
364 Hour: timestamp[4], 400 Hour: timestamp[4],
365 Min: timestamp[5], 401 Minute: timestamp[5],
366 Sec: timestamp[6], 402 Second: timestamp[6],
367 }, nil 403 }
404 writer.AppendLine("\t\tYear: %d", sarDataTimeStamp.Year)
405 writer.AppendLine("\t\tMonth: %d", sarDataTimeStamp.Month)
406 writer.AppendLine("\t\tDay: %d", sarDataTimeStamp.Day)
407 writer.AppendLine("\t\tHour: %d", sarDataTimeStamp.Hour)
408 writer.AppendLine("\t\tMinute: %d", sarDataTimeStamp.Minute)
409 writer.AppendLine("\t\tSecond: %d", sarDataTimeStamp.Second)
410 return sarDataTimeStamp, nil
368} 411}
369 412
370func parseFileChecksumData(reader *bitreader.Reader, length uint64) (SarDataFileChecksum, error) { 413func parseFileChecksumData(reader *bitreader.Reader, length uint64) (SarDataFileChecksum, error) {
371 if length < 6 { 414 if length < 6 {
372 return SarDataFileChecksum{}, errors.New("sar data invalid") 415 return SarDataFileChecksum{}, errors.New("sar data invalid")
373 } 416 }
374 return SarDataFileChecksum{ 417 sarDataFileChecksum := SarDataFileChecksum{
375 Sum: reader.TryReadUInt32(), 418 Sum: reader.TryReadUInt32(),
376 Path: reader.TryReadString(), 419 Path: reader.TryReadString(),
377 }, nil 420 }
421 writer.AppendLine("\t\tChecksum: %d", sarDataFileChecksum.Sum)
422 writer.AppendLine("\t\tPath: \"%s\"", sarDataFileChecksum.Path)
423 return sarDataFileChecksum, nil
378} 424}