]> git.mxchange.org Git - quix0rs-blobwars.git/blob - src/CPak.cpp
Update copyrights.
[quix0rs-blobwars.git] / src / CPak.cpp
1 /*
2 Copyright (C) 2004-2010 Parallel Realities
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19 */
20
21 #include "headers.h"
22
23 Pak::Pak()
24 {
25         input = NULL;
26         fd = NULL;
27         
28         numberOfFiles = 0;
29         listPos = 0;
30         currentFile = NULL;
31
32         pakFilename[0] = 0;
33         filename[0] = 0;
34 }
35
36 Pak::~Pak()
37 {
38         delete[] input;
39         delete[] fd;
40 }
41
42 void Pak::showPakErrorAndExit()
43 {
44         printf("\nFatal Error: The Blob Wars PAK file was either not found or was not accessable.\n");
45         printf("(If you compiled from source did you forget to run make install?)\n");
46         printf("The path to the file was expected to be,\n\n");
47         printf(PAKFULLPATH"\n\n");
48         printf("Please try running the game again. If problems persist either reinstall the game or check,\n\n");
49         printf("http://www.parallelrealities.co.uk/blobWars.php\n\n");
50         printf("for updates.\n\n");
51         exit(1);
52 }
53
54 void Pak::setPakFile(const char *pakFilename)
55 {
56         #if USEPAK
57         strlcpy(this->pakFilename, pakFilename, sizeof this->pakFilename);
58         
59         debug(("Pak : Filename set to %s\n", pakFilename));
60
61         FILE *pak = fopen(pakFilename, "rb");
62
63         if (!pak)
64         {
65                 showPakErrorAndExit();
66         }
67
68         fseek(pak, (-sizeof(Uint32)) * 2, SEEK_END);
69         fread(&listPos, sizeof(Uint32), 1, pak);
70         fread(&numberOfFiles, sizeof(Uint32), 1, pak);
71         
72         debug(("Pak : File list resides at %d\n", (int)listPos));
73         debug(("Pak : Number of files are %d\n", (int)numberOfFiles));
74         
75         fd = new FileData[numberOfFiles];
76         
77         fseek(pak, listPos, SEEK_SET);
78         
79         int result = 0;
80         
81         for (unsigned int i = 0 ; i < numberOfFiles ; i++)
82         {
83                 result = fread(&fd[i], sizeof(FileData), 1, pak);
84                 
85                 if (!result)
86                 {
87                         fclose(pak);
88                         showPakErrorAndExit();
89                 }
90                 
91                 debug(("Read FileData #%d / %d : %s\n", (i + 1), numberOfFiles, fd[i].filename));
92         }
93         
94         fclose(pak);
95         
96         #endif
97 }
98
99 bool Pak::unpack(const char *filename, unsigned char **buffer)
100 {
101         debug(("Pak : Unpacking %s...\n", filename));
102         
103         currentFile = NULL;
104         
105         for (unsigned int i = 0 ; i < numberOfFiles ; i++)
106         {
107                 if (strcmp(filename, fd[i].filename) == 0)
108                 {
109                         currentFile = &fd[i];
110                         break;
111                 }
112         }
113         
114         if (currentFile == NULL)
115         {
116                 return false;
117         }
118         
119         FILE *pak = fopen(pakFilename, "rb");
120         if (!pak)
121         {
122                 showPakErrorAndExit();
123         }
124         
125         fseek(pak, currentFile->location, SEEK_SET);
126
127         delete[] input;
128         input = NULL;
129         
130         input = new unsigned char[(int)(currentFile->cSize * 1.01) + 12];
131         *buffer = new unsigned char[currentFile->fSize + 1];
132
133         fread(input, 1, currentFile->cSize, pak);
134         
135         uLongf fSize = (uLongf)currentFile->fSize;
136         
137         uncompress(*buffer, &fSize, input, currentFile->cSize);
138         (*buffer)[currentFile->fSize] = 0;
139
140         fclose(pak);
141         
142         delete[] input;
143         input = NULL;
144         
145         debug(("Pak : Unpack %s...Done\n", filename));
146
147         return true;
148 }
149
150 bool Pak::fileExists(const char *filename)
151 {
152         for (unsigned int i = 0 ; i < numberOfFiles ; i++)
153         {
154                 if (strcmp(fd[i].filename, filename) == 0)
155                 {
156                         return true;
157                 }
158         }
159         
160         return false;
161 }
162
163 unsigned int Pak::getUncompressedSize() const
164 {
165         return (unsigned int)currentFile->fSize;
166 }