Rev 3661 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3661 | Rev 3708 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | 29 | ||
30 | #include "duke3d.h"
|
30 | #include "duke3d.h"
|
31 | #include "common_game.h"
|
31 | #include "common_game.h"
|
32 | #include "grpscan.h"
|
32 | #include "grpscan.h"
|
33 | 33 | ||
- | 34 | // custom GRP support for the startup window, file format reflects the structure below
|
|
- | 35 | #define GAMELISTFILE "games.list"
|
|
- | 36 | // name crc size flags dependency scriptname defname
|
|
34 | struct grpfile grpfiles[NUMGRPFILES] = |
37 | struct grpfile internalgrpfiles[NUMGRPFILES] = |
35 | {
|
38 | {
|
36 | { "Duke Nukem 3D", DUKE13_CRC, 26524524, GAMEFLAG_DUKE, 0, NULL, NULL }, |
39 | { "Duke Nukem 3D", DUKE13_CRC, 26524524, GAMEFLAG_DUKE, 0, NULL, NULL, NULL }, |
37 | { "Duke Nukem 3D (South Korean Censored)", DUKEKR_CRC, 26385383, GAMEFLAG_DUKE, 0, NULL, NULL }, |
40 | { "Duke Nukem 3D (South Korean Censored)", DUKEKR_CRC, 26385383, GAMEFLAG_DUKE, 0, NULL, NULL, NULL }, |
38 | { "Duke Nukem 3D: Atomic Edition", DUKE15_CRC, 44356548, GAMEFLAG_DUKE, 0, NULL, NULL }, |
41 | { "Duke Nukem 3D: Atomic Edition", DUKE15_CRC, 44356548, GAMEFLAG_DUKE, 0, NULL, NULL, NULL }, |
39 | { "Duke Nukem 3D: Plutonium Pak", DUKEPP_CRC, 44348015, GAMEFLAG_DUKE, 0, NULL, NULL }, |
42 | { "Duke Nukem 3D: Plutonium Pak", DUKEPP_CRC, 44348015, GAMEFLAG_DUKE, 0, NULL, NULL, NULL }, |
40 | { "Duke Nukem 3D Shareware", DUKESW_CRC, 11035779, GAMEFLAG_DUKE, 0, NULL, NULL }, |
43 | { "Duke Nukem 3D Shareware", DUKESW_CRC, 11035779, GAMEFLAG_DUKE, 0, NULL, NULL, NULL }, |
41 | { "Duke Nukem 3D Mac Demo", DUKEMD_CRC, 10444391, GAMEFLAG_DUKE, 0, NULL, NULL }, |
44 | { "Duke Nukem 3D Mac Demo", DUKEMD_CRC, 10444391, GAMEFLAG_DUKE, 0, NULL, NULL, NULL }, |
42 | { "Duke it out in D.C.", DUKEDC_CRC, 8410183 , GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL }, |
45 | { "Duke it out in D.C.", DUKEDC_CRC, 8410183 , GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL, NULL }, |
43 | { "Duke Caribbean: Life's a Beach", DUKECB_CRC, 22213819, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL }, |
46 | { "Duke Caribbean: Life's a Beach", DUKECB_CRC, 22213819, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL, NULL }, |
44 | { "Duke: Nuclear Winter", DUKENW_CRC, 16169365, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, "nwinter.con", NULL }, |
47 | { "Duke: Nuclear Winter", DUKENW_CRC, 16169365, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, "nwinter.con", NULL, NULL }, |
45 | { "NAM", NAM_CRC, 43448927, GAMEFLAG_NAM, 0, NULL, NULL }, |
48 | { "NAM", NAM_CRC, 43448927, GAMEFLAG_NAM, 0, "nam.con", "nam.def", NULL }, |
46 | { "NAPALM", NAPALM_CRC, 44365728, GAMEFLAG_NAM|GAMEFLAG_NAPALM, 0, NULL, NULL }, |
49 | { "NAPALM", NAPALM_CRC, 44365728, GAMEFLAG_NAM|GAMEFLAG_NAPALM, 0, "napalm.con", "nam.def", NULL }, |
47 | { "WWII GI", WW2GI_CRC, 77939508, GAMEFLAG_WW2GI|GAMEFLAG_NAM, 0, NULL, NULL }, |
50 | { "WWII GI", WW2GI_CRC, 77939508, GAMEFLAG_WW2GI|GAMEFLAG_NAM, 0, "ww2gi.con", "ww2gi.def", NULL }, |
48 | }; |
51 | }; |
49 | struct grpfile *foundgrps = NULL; |
52 | struct grpfile *foundgrps = NULL; |
- | 53 | struct grpfile *listgrps = NULL; |
|
- | 54 | ||
- | 55 | static void LoadList(const char * filename) |
|
- | 56 | {
|
|
- | 57 | struct grpfile *fg; |
|
- | 58 | ||
- | 59 | char *grpend = NULL; |
|
- | 60 | ||
- | 61 | scriptfile *script = scriptfile_fromfile(filename); |
|
- | 62 | ||
- | 63 | if (!script) |
|
- | 64 | return; |
|
- | 65 | ||
- | 66 | scriptfile_addsymbolvalue("GAMEFLAG_DUKE", GAMEFLAG_DUKE); |
|
- | 67 | scriptfile_addsymbolvalue("GAMEFLAG_ADDON", GAMEFLAG_DUKE|GAMEFLAG_ADDON); |
|
- | 68 | scriptfile_addsymbolvalue("DUKE15_CRC", DUKE15_CRC); |
|
- | 69 | scriptfile_addsymbolvalue("DUKE13_CRC", DUKE13_CRC); |
|
- | 70 | scriptfile_addsymbolvalue("DUKEDC_CRC", DUKEDC_CRC); |
|
- | 71 | scriptfile_addsymbolvalue("DUKECB_CRC", DUKECB_CRC); |
|
- | 72 | scriptfile_addsymbolvalue("DUKENW_CRC", DUKENW_CRC); |
|
- | 73 | ||
- | 74 | enum
|
|
- | 75 | {
|
|
- | 76 | T_GRPINFO,
|
|
- | 77 | T_GAMENAME,
|
|
- | 78 | T_CRC,
|
|
- | 79 | T_SIZE,
|
|
- | 80 | T_DEPCRC,
|
|
- | 81 | T_SCRIPTNAME,
|
|
- | 82 | T_DEFNAME,
|
|
- | 83 | T_FLAGS,
|
|
- | 84 | }; |
|
- | 85 | ||
- | 86 | static const tokenlist profiletokens[] = |
|
- | 87 | {
|
|
- | 88 | { "grpinfo", T_GRPINFO }, |
|
- | 89 | }; |
|
- | 90 | ||
- | 91 | while (!scriptfile_eof(script)) |
|
- | 92 | {
|
|
- | 93 | int32_t token = getatoken(script,profiletokens,sizeof(profiletokens)/sizeof(tokenlist)); |
|
- | 94 | switch (token) |
|
- | 95 | {
|
|
- | 96 | case T_GRPINFO: |
|
- | 97 | {
|
|
- | 98 | int32_t gsize = 0, gcrcval = 0, gflags = GAMEFLAG_DUKE, gdepcrc = DUKE15_CRC; |
|
- | 99 | char *gname = NULL, *gscript = NULL, *gdef = NULL; |
|
- | 100 | ||
- | 101 | static const tokenlist grpinfotokens[] = |
|
- | 102 | {
|
|
- | 103 | { "name", T_GAMENAME }, |
|
- | 104 | { "scriptname", T_SCRIPTNAME }, |
|
- | 105 | { "defname", T_DEFNAME }, |
|
- | 106 | { "crc", T_CRC }, |
|
- | 107 | { "dependency", T_DEPCRC }, |
|
- | 108 | { "size", T_SIZE }, |
|
- | 109 | { "flags", T_FLAGS }, |
|
- | 110 | ||
- | 111 | }; |
|
- | 112 | ||
- | 113 | if (scriptfile_getbraces(script,&grpend)) break; |
|
- | 114 | ||
- | 115 | while (script->textptr < grpend) |
|
- | 116 | {
|
|
- | 117 | int32_t token = getatoken(script,grpinfotokens,sizeof(grpinfotokens)/sizeof(tokenlist)); |
|
- | 118 | ||
- | 119 | switch (token) |
|
- | 120 | {
|
|
- | 121 | case T_GAMENAME: |
|
- | 122 | scriptfile_getstring(script,&gname); break; |
|
- | 123 | case T_SCRIPTNAME: |
|
- | 124 | scriptfile_getstring(script,&gscript); break; |
|
- | 125 | case T_DEFNAME: |
|
- | 126 | scriptfile_getstring(script,&gdef); break; |
|
- | 127 | ||
- | 128 | case T_FLAGS: |
|
- | 129 | scriptfile_getsymbol(script,&gflags); break; |
|
- | 130 | case T_DEPCRC: |
|
- | 131 | scriptfile_getsymbol(script,&gdepcrc); break; |
|
- | 132 | case T_CRC: |
|
- | 133 | scriptfile_getsymbol(script,&gcrcval); break; |
|
- | 134 | case T_SIZE: |
|
- | 135 | scriptfile_getnumber(script,&gsize); break; |
|
- | 136 | default: |
|
- | 137 | break; |
|
- | 138 | }
|
|
- | 139 | ||
- | 140 | fg = (struct grpfile *)Bcalloc(1, sizeof(struct grpfile)); |
|
- | 141 | fg->next = listgrps; |
|
- | 142 | listgrps = fg; |
|
- | 143 | ||
- | 144 | if (gname) |
|
- | 145 | fg->name = Bstrdup(gname); |
|
- | 146 | ||
- | 147 | fg->size = gsize; |
|
- | 148 | fg->crcval = gcrcval; |
|
- | 149 | fg->dependency = gdepcrc; |
|
- | 150 | fg->game = gflags; |
|
- | 151 | ||
- | 152 | if (gscript) |
|
- | 153 | fg->scriptname = dup_filename(gscript); |
|
- | 154 | ||
- | 155 | if (gdef) |
|
- | 156 | fg->defname = dup_filename(gdef); |
|
- | 157 | }
|
|
- | 158 | }
|
|
- | 159 | ||
- | 160 | break; |
|
- | 161 | default: |
|
- | 162 | break; |
|
- | 163 | }
|
|
- | 164 | }
|
|
- | 165 | ||
- | 166 | scriptfile_close(script); |
|
- | 167 | scriptfile_clearsymbols(); |
|
- | 168 | }
|
|
- | 169 | ||
- | 170 | static void LoadGameList(void) |
|
- | 171 | {
|
|
- | 172 | struct grpfile *fg; |
|
- | 173 | CACHE1D_FIND_REC *srch, *sidx; |
|
- | 174 | ||
- | 175 | int32_t i; |
|
- | 176 | ||
- | 177 | for (i = 0; i<NUMGRPFILES; i++) |
|
- | 178 | {
|
|
- | 179 | fg = (struct grpfile *)Bcalloc(1, sizeof(struct grpfile)); |
|
- | 180 | ||
- | 181 | fg->name = Bstrdup(internalgrpfiles[i].name); |
|
- | 182 | fg->crcval = internalgrpfiles[i].crcval; |
|
- | 183 | fg->size = internalgrpfiles[i].size; |
|
- | 184 | fg->game = internalgrpfiles[i].game; |
|
- | 185 | fg->dependency = internalgrpfiles[i].dependency; |
|
- | 186 | ||
- | 187 | if (internalgrpfiles[i].scriptname) |
|
- | 188 | fg->scriptname = dup_filename(internalgrpfiles[i].scriptname); |
|
- | 189 | ||
- | 190 | if (internalgrpfiles[i].defname) |
|
- | 191 | fg->defname = dup_filename(internalgrpfiles[i].defname); |
|
- | 192 | ||
- | 193 | fg->next = listgrps; |
|
- | 194 | listgrps = fg; |
|
- | 195 | }
|
|
- | 196 | ||
- | 197 | srch = klistpath("/", "*.grpinfo", CACHE1D_FIND_FILE); |
|
- | 198 | ||
- | 199 | for (sidx = srch; sidx; sidx = sidx->next) |
|
- | 200 | LoadList(srch->name); |
|
- | 201 | ||
- | 202 | klistfree(srch); |
|
- | 203 | }
|
|
- | 204 | ||
- | 205 | static void FreeGameList(void) |
|
- | 206 | {
|
|
- | 207 | struct grpfile *fg; |
|
- | 208 | ||
- | 209 | while (listgrps) |
|
- | 210 | {
|
|
- | 211 | fg = listgrps->next; |
|
- | 212 | Bfree(listgrps->name); |
|
- | 213 | ||
- | 214 | if (listgrps->scriptname) |
|
- | 215 | Bfree(listgrps->scriptname); |
|
- | 216 | ||
- | 217 | if (listgrps->defname) |
|
- | 218 | Bfree(listgrps->defname); |
|
- | 219 | ||
- | 220 | Bfree(listgrps); |
|
- | 221 | listgrps = fg; |
|
- | 222 | }
|
|
- | 223 | }
|
|
- | 224 | ||
50 | 225 | ||
51 | #define GRPCACHEFILE "grpfiles.cache"
|
226 | #define GRPCACHEFILE "grpfiles.cache"
|
52 | static struct grpcache |
227 | static struct grpcache |
53 | {
|
228 | {
|
54 | struct grpcache *next; |
229 | struct grpcache *next; |
Line 167... | Line 342... | ||
167 | return 0; |
342 | return 0; |
168 | }
|
343 | }
|
169 | 344 | ||
170 | initprintf("Searching for game data...\n"); |
345 | initprintf("Searching for game data...\n"); |
171 | 346 | ||
- | 347 | LoadGameList(); |
|
172 | LoadGroupsCache(); |
348 | LoadGroupsCache(); |
173 | 349 | ||
174 | srch = klistpath("/", "*.grp", CACHE1D_FIND_FILE); |
350 | srch = klistpath("/", "*.grp", CACHE1D_FIND_FILE); |
175 | 351 | ||
176 | for (sidx = srch; sidx; sidx = sidx->next) |
352 | for (sidx = srch; sidx; sidx = sidx->next) |
Line 249... | Line 425... | ||
249 | klistfree(srch); |
425 | klistfree(srch); |
250 | FreeGroupsCache(); |
426 | FreeGroupsCache(); |
251 | 427 | ||
252 | for (grp = foundgrps; grp; /*grp=grp->next*/) |
428 | for (grp = foundgrps; grp; /*grp=grp->next*/) |
253 | {
|
429 | {
|
254 | int32_t i; |
430 | struct grpfile *igrp; |
- | 431 | for (igrp = listgrps; igrp; igrp=igrp->next) |
|
- | 432 | if (grp->crcval == igrp->crcval) break; |
|
255 | 433 | ||
256 | for (i = 0; i<NUMGRPFILES; i++) if (grp->crcval == grpfiles[i].crcval) break; |
434 | if (igrp == NULL) |
- | 435 | {
|
|
257 | if (i == NUMGRPFILES) { grp=grp->next; continue; } // unrecognised grp file |
436 | grp = grp->next; |
- | 437 | continue; |
|
- | 438 | }
|
|
258 | 439 | ||
259 | if (grpfiles[i].dependency) |
440 | if (igrp->dependency) |
260 | {
|
441 | {
|
261 | //initprintf("found grp with dep\n");
|
442 | //initprintf("found grp with dep\n");
|
262 | for (grp = foundgrps; grp; grp=grp->next) |
443 | for (grp = foundgrps; grp; grp=grp->next) |
263 | if (grp->crcval == grpfiles[i].dependency) break; |
444 | if (grp->crcval == igrp->dependency) break; |
264 | 445 | ||
265 | if (grp == NULL || grp->crcval != grpfiles[i].dependency) // couldn't find dependency |
446 | if (grp == NULL || grp->crcval != igrp->dependency) // couldn't find dependency |
266 | {
|
447 | {
|
267 | //initprintf("removing %s\n", grp->name);
|
448 | //initprintf("removing %s\n", grp->name);
|
268 | RemoveGroup(grpfiles[i].crcval); |
449 | RemoveGroup(igrp->crcval); |
269 | grp = foundgrps; |
450 | grp = foundgrps; |
270 | continue; |
451 | continue; |
271 | }
|
452 | }
|
272 | }
|
453 | }
|
273 | 454 | ||
Line 312... | Line 493... | ||
312 | fg = foundgrps->next; |
493 | fg = foundgrps->next; |
313 | Bfree((char *)foundgrps->name); |
494 | Bfree((char *)foundgrps->name); |
314 | Bfree(foundgrps); |
495 | Bfree(foundgrps); |
315 | foundgrps = fg; |
496 | foundgrps = fg; |
316 | }
|
497 | }
|
- | 498 | ||
- | 499 | FreeGameList(); |
|
317 | }
|
500 | }
|
318 | 501 |