1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#ifndef DEMO_H
#define DEMO_H
#include <stdio.h>
/* demoheader struct */
typedef struct
{
unsigned char version;
char netversion[64];
char mapname[64];
unsigned char mapsize[4]; // Big endian int
unsigned char mapcrc[4]; // Big endian int
char type[8];
unsigned char length[4]; // Big endian int
char timestamp[20];
} demoheader;
/* demotimeline struct, only contains the raw data */
typedef struct
{
char data[260];
} demotimeline;
/* demomap struct */
typedef struct
{
unsigned char sha256[32];
unsigned char *data;
} demomap;
typedef struct
{
unsigned short type;
unsigned short id;
int numdata;
int *data;
} demosnapitem;
/* Chunk types */
typedef struct
{
int datasize;
int numitems;
int *offsets;
demosnapitem *items;
} demosnap;
typedef struct
{
char keyframe;
char innline;
int delta;
} demotick;
typedef struct
{
} demodelta;
typedef struct
{
} demomessage;
/* union for different chunks */
typedef union {
demosnap *snap;
demotick *tick;
demodelta *delta;
demomessage *message;
} chunkdata;
/* demochunk struct */
typedef struct
{
unsigned char type;
chunkdata data;
} demochunk;
/* demodata struct, stores all chunks */
typedef struct
{
int numchunks;
demochunk *chunks;
} demodata;
/* Read demo header from demofile into given demoheader */
/* Returns a positive number on success, negative on fail */
int readdemoheader(FILE *demofile, demoheader *header);
/* Read demo timeline from demofile into given demoheader */
/* Returns a positive number on success, negative on fail */
/* Must have read the header from demofile beforehand */
int readdemotimeline(FILE *demofile, demotimeline *timeline);
/* Read demo map from demofile into given demomap */
/* Returns a positive number on success, negative on fail */
/* Must have read the demoheader and demotimeline beforehand */
int readdemomap(FILE *demofile, demomap *map, int mapsize);
/* Reads a chunk from demofile into given chunk */
/* Returns a positive number on success, 0 on EOF, and negative number on error */
/* Will allocate memory if chunk is snap, delta or message */
int readdemochunk(FILE *demofile, demochunk *chunk, unsigned char version);
#endif // DEMO_H
|