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