1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <machine/endian.h>
5 #include "zlib/zlib.h"
6 
7 typedef unsigned char uchar;
8 
9 #define MAX_ENT 1024
10 #define MAJOR_VERSION 2
11 #define MINOR_VERSION 9
12 #define INITCRC 0xffffffff
13 
14 enum { TYPE_NORMAL, TYPE_DEMV1, TYPE_TXT, TYPE_PAK, TYPE_DZ, TYPE_DEM,
15 	TYPE_NEHAHRA, TYPE_DIR, TYPE_STORE, TYPE_LAST };
16 
17 enum {
18 	DEM_bad, DEM_nop, DEM_disconnect, DEM_updatestat, DEM_version,
19 	DEM_setview, DEM_sound, DEM_time, DEM_print, DEM_stufftext,
20 	DEM_setangle, DEM_serverinfo, DEM_lightstyle, DEM_updatename,
21 	DEM_updatefrags, DEM_clientdata, DEM_stopsound, DEM_updatecolors,
22 	DEM_particle, DEM_damage, DEM_spawnstatic, DEM_spawnbinary,
23 	DEM_spawnbaseline, DEM_temp_entity, DEM_setpause, DEM_signonnum,
24 	DEM_centerprint, DEM_killedmonster, DEM_foundsecret,
25 	DEM_spawnstaticsound, DEM_intermission, DEM_finale,
26 	DEM_cdtrack, DEM_sellscreen, DEM_cutscene, DZ_longtime,
27 /* nehahra */
28 	DEM_showlmp = 35, DEM_hidelmp, DEM_skybox, DZ_showlmp
29 };
30 
31 typedef struct {
32 	uchar voz, pax;
33 	uchar ang0, ang1, ang2;
34 	uchar vel0, vel1, vel2;
35 	long items;
36 	uchar uk10, uk11, invbit;
37 	uchar wpf, av, wpm;
38 	int health;
39 	uchar am, sh, nl, rk, ce, wp;
40 	int force;
41 } cdata_t;
42 
43 typedef struct {
44 	uInt ptr;	/* start of file inside dz */
45 	uInt size;	/* v1: intermediate size. v2: compressed size */
46 	uInt real;	/* uncompressed size */
47 	unsigned short len;	/* length of name */
48 	unsigned short pak;
49 	uInt crc;
50 	uInt type;
51 	uInt date;
52 	uInt inter;	/* v2: intermediate size */
53 	char *name;
54 } direntry_t;
55 #define DE_DISK_SIZE 32
56 
57 typedef struct {
58 	uchar modelindex, frame;
59 	uchar colormap, skin;
60 	uchar effects;
61 	uchar ang0, ang1, ang2;
62 	uchar newbit, present, active;
63 	uchar fullbright;	/* nehahra */
64 	int org0, org1, org2;
65 	int od0, od1, od2;
66 	int force;
67 	float alpha;		/* nehahra */
68 } ent_t;
69 
70 typedef struct {
71 	char name[56];
72 	uInt ptr;
73 	uInt len;
74 } pakentry_t;
75 
76 int bplus (int, int);
77 void copy_msg (uInt);
78 void create_clientdata_msg (void);
79 void crc_init (void);
80 void dem_compress (uInt, uInt);
81 void dem_copy_ue (void);
82 uInt dem_uncompress (uInt);
83 void dem_uncompress_init (int);
84 void demv1_clientdata (void);
85 void demv1_updateentity (void);
86 void demv1_dxentities (void);
87 void dzAddFolder (char *);
88 void dzCompressFile (char *, uInt, uInt);
89 void dzDeleteFiles  (uInt *, int, void (*)(uInt, uInt));
90 void dzExtractFile (uInt, int);
91 int dzRead (int);
92 int dzReadDirectory (char *);
93 void dzFile_Read (void *, uInt);
94 void dzFile_Write (void *, uInt);
95 uInt dzFile_Size (void);
96 void dzFile_Seek (uInt);
97 void dzFile_Truncate (void);
98 void dzWrite (void *, int);
99 void dzWriteDirectory (void);
100 void *Dzip_malloc (uInt);
101 void *Dzip_realloc (void *, uInt);
102 char *Dzip_strdup (const char *);
103 void end_zlib_compression (void);
104 void error (const char *, ...);
105 char *FileExtension (char *);
106 int get_filetype (char *);
107 char *GetFileFromPath (char *);
108 void Infile_Read (void *, uInt);
109 void Infile_Seek (uInt);
110 void Infile_Store (uInt);
111 void insert_msg (void *, uInt);
112 void make_crc (uchar *, int);
113 void normal_compress (uInt);
114 void Outfile_Write (void *, uInt);
115 
116 #define pakid *(int *)"PACK"
117 #define discard_msg(x) inptr += x
118 
119 #ifndef SFXVAR
120 #define SFXVAR extern
121 #endif
122 
123 extern uchar dem_updateframe;
124 SFXVAR uchar copybaseline;
125 SFXVAR int maxent, lastent, sble;
126 extern int maj_ver, min_ver;	/* of the current dz file */
127 #define p_blocksize 32768
128 extern int numfiles;
129 extern uInt totalsize;
130 SFXVAR int entlink[MAX_ENT];
131 SFXVAR long dem_gametime;
132 SFXVAR long outlen;
133 SFXVAR long cam0, cam1, cam2;
134 SFXVAR uchar *inblk, *outblk, *inptr;
135 extern uchar *tmpblk;
136 extern char AbortOp;
137 extern unsigned long crcval;
138 SFXVAR cdata_t oldcd, newcd;
139 SFXVAR ent_t base[MAX_ENT], oldent[MAX_ENT], newent[MAX_ENT];
140 extern direntry_t *directory;
141 
142 #if BYTE_ORDER == LITTLE_ENDIAN
143 
144 #define getshort(x) (*(short*)(x))
145 #define getlong(x) (*(long*)(x))
146 #define getfloat(x) (*(float*)(x))
147 #define cnvlong(x) (x)
148 
149 #else
150 
151 short getshort (uchar *);
152 long getlong (uchar *);
153 float getfloat (uchar *);
154 #define cnvlong(x) getlong((uchar*)(&x))
155 
156 #endif
157 
158 #define Z_BUFFER_SIZE 16384
159 extern z_stream zs;
160 extern uchar *zbuf;
161 extern uInt ztotal;
162 extern int zlevel;
163 
164 #ifdef GUI
165 
166 void GuiProgressMsg(const char *, ...);
167 #define printf
168 #define fprintf
169 #define fflush
170 
171 #endif
172 
173 #ifdef WIN32
174 #define DIRCHAR '\\'
175 #define WRONGCHAR '/'
176 #define strcasecmp stricmp
177 #else
178 #define DIRCHAR '/'
179 #define WRONGCHAR '\\'
180 #endif