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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
#ifndef DEMO_H
#define DEMO_H
#include <stdio.h>
typedef enum
{
DEMOTICK = 0,
DEMOSNAP = 1,
DEMOMESSAGE = 2,
DEMODELTA = 3
} demochunktype;
/* demoheader struct */
typedef struct
{
unsigned char version;
char netversion[64];
char mapname[64];
int mapsize;
int mapcrc;
char type[8];
int length;
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];
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
{
int datasize;
char *data;
} demodelta;
typedef struct
{
int datasize;
char *data;
} demomessage;
/* union for different chunks */
typedef union {
demosnap *snap;
demotick *tick;
demodelta *delta;
demomessage *message;
} chunkdata;
/* demochunk struct */
typedef struct
{
demochunktype type;
chunkdata data;
} demochunk;
/* demodata struct, stores all chunks */
typedef struct
{
int numchunks;
demochunk *chunks;
} demodata;
typedef struct
{
demoheader *header;
demotimeline *timeline;
demomap *map;
demodata *data;
} demo;
/* 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, unsigned char version);
/* 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);
int readdemochunks(FILE *fp, demodata *dd, unsigned char ver);
int writedemoheader(FILE *outfile, demoheader *header);
int writedemotimeline(FILE *outfile, demotimeline *timeline);
int writedemomap(FILE *outfile, demomap *map, int mapsize, unsigned char version);
int writedemotick(FILE *outfile, demotick *tick, unsigned char version);
int writedemosnap(FILE *outfile, demosnap *snap, unsigned char version);
int writedemomessage(FILE *outfile, demomessage *message, unsigned char ver);
int writedemodelta(FILE *outfile, demodelta *delta, unsigned char ver);
void printdemoheader(demoheader *header);
void printdemotick(demotick *tick);
void printdemosnap(demosnap *snap);
#endif // DEMO_H
|