Subversion Repositories eduke32

Rev

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