diff options
Diffstat (limited to 'pkg/classes/sarData.go')
| -rw-r--r-- | pkg/classes/sarData.go | 110 |
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 | ||
| 10 | type SarDataType uint8 | 11 | type SarDataType uint8 |
| @@ -137,12 +138,12 @@ type SarDataSpeedrunTimeSplits struct { | |||
| 137 | } | 138 | } |
| 138 | 139 | ||
| 139 | type SarDataTimestamp struct { | 140 | type 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 | ||
| 148 | type SarDataFileChecksum struct { | 149 | type 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 | ||
| 247 | func parseInitialCVarData(reader *bitreader.Reader) SarDataInitialCVar { | 253 | func 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 | ||
| 254 | func parseEntityInputData(reader *bitreader.Reader) SarDataEntityInput { | 262 | func 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 | ||
| 263 | func parseChecksumData(reader *bitreader.Reader, length uint64) (SarDataChecksum, error) { | 276 | func 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 | ||
| 273 | func parseChecksumV2Data(reader *bitreader.Reader, length uint64) (SarDataChecksumV2, error) { | 289 | func 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 | ||
| 283 | func parsePortalPlacementData(reader *bitreader.Reader, length uint64) (SarDataPortalPlacement, int, error) { | 302 | func 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 | ||
| 298 | func parseChallengeFlagsCrouchFlyData(reader *bitreader.Reader, length uint64) (int, error) { | 322 | func 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 | ||
| 314 | func parseWaitRunData(reader *bitreader.Reader, length uint64) (SarDataWaitRun, error) { | 340 | func 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 | ||
| 324 | func parseHWaitRunData(reader *bitreader.Reader, length uint64) (SarDataHWaitRun, error) { | 353 | func 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 | ||
| 334 | func parseSpeedrunTimeData(reader *bitreader.Reader, length uint64) (SarDataSpeedrunTime, error) { | 366 | func 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 | ||
| 370 | func parseFileChecksumData(reader *bitreader.Reader, length uint64) (SarDataFileChecksum, error) { | 413 | func 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 | } |