Subversion Repositories eduke32

Rev

Rev 509 | Rev 514 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 Plagman 1
//-------------------------------------------------------------------------
2
/*
484 terminx 3
Copyright (C) 1996, 2003 - 3D Realms Entertainment
4
Copyright (C) 2000, 2003 - Matt Saettler (EDuke Enhancements)
5
Copyright (C) 2004, 2007 - EDuke32 developers
5 Plagman 6
 
7
This file is part of EDuke32
8
 
9
EDuke32 is free software; you can redistribute it and/or
10
modify it under the terms of the GNU General Public License version 2
11
as published by the Free Software Foundation.
12
 
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
 
17
See the GNU General Public License for more details.
18
 
19
You should have received a copy of the GNU General Public License
20
along with this program; if not, write to the Free Software
21
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
*/
23
//-------------------------------------------------------------------------
24
 
25
#include "duke3d.h"
26
#include "mouse.h"
27
#include "osd.h"
28
#include <sys/stat.h>
29
 
30
extern char inputloc;
31
extern int recfilep;
32
//extern char vgacompatible;
432 terminx 33
short globalskillsound=-1;
482 terminx 34
int probey=0;
35
static int lastsavehead=0,last_menu_pos=0,last_menu,sh,onbar,buttonstat,deletespot;
36
static int last_zero,last_fifty,last_onehundred,last_twoohtwo,last_threehundred = 0;
5 Plagman 37
 
147 terminx 38
static char menunamecnt;
5 Plagman 39
 
40
static CACHE1D_FIND_REC *finddirs=NULL, *findfiles=NULL, *finddirshigh=NULL, *findfileshigh=NULL;
41
static int numdirs=0, numfiles=0;
42
static int currentlist=0;
43
 
44
static int function, whichkey;
45
static int changesmade, newvidmode, curvidmode, newfullscreen;
337 terminx 46
static int vidsets[16] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };
47
static int curvidset, newvidset = 0;
5 Plagman 48
 
478 terminx 49
static char *mousebuttonnames[] = { "Left", "Right", "Middle", "Thumb", "Wheel Up", "Wheel Down" };
5 Plagman 50
 
147 terminx 51
extern int gotvote[MAXPLAYERS], votes[MAXPLAYERS], voting;
52
 
432 terminx 53
void cmenu(int cm)
5 Plagman 54
{
55
    current_menu = cm;
56
 
333 terminx 57
    if ((cm >= 1000 && cm <= 1009))
5 Plagman 58
        return;
59
 
333 terminx 60
    if (cm == 0)
5 Plagman 61
        probey = last_zero;
331 terminx 62
    else if (cm == 50)
5 Plagman 63
        probey = last_fifty;
331 terminx 64
    else if (cm == 100)
5 Plagman 65
        probey = last_onehundred;
331 terminx 66
    else if (cm == 202)
69 terminx 67
        probey = last_twoohtwo;
331 terminx 68
    else if (cm >= 300 && cm < 400)
5 Plagman 69
        probey = last_threehundred;
331 terminx 70
    else if (cm == 110)
5 Plagman 71
        probey = 1;
72
    else probey = 0;
482 terminx 73
    lastsavehead = -1;
5 Plagman 74
}
75
 
398 terminx 76
#if 0
5 Plagman 77
void savetemp(char *fn,long daptr,long dasiz)
78
{
79
    FILE *fp;
80
 
81
    if ((fp = fopen(fn,"wb")) == (FILE *)NULL)
82
        return;
83
 
84
    fwrite((char *)daptr,dasiz,1,fp);
85
 
86
    fclose(fp);
87
}
398 terminx 88
#endif
5 Plagman 89
 
90
#define LMB (buttonstat&1)
91
#define RMB (buttonstat&2)
478 terminx 92
#define WHEELUP (buttonstat&16)
93
#define WHEELDOWN (buttonstat&32)
5 Plagman 94
 
484 terminx 95
static ControlInfo minfo;
5 Plagman 96
 
484 terminx 97
static short mi, mii;
5 Plagman 98
 
99
static int probe_(int type,int x,int y,int i,int n)
100
{
101
    short centre, s;
102
 
103
    s = 1+(CONTROL_GetMouseSensitivity()>>4);
104
 
105
    {
333 terminx 106
        CONTROL_GetInput(&minfo);
484 terminx 107
        mi += (minfo.dpitch+minfo.dz);
410 terminx 108
        mii += minfo.dyaw;
5 Plagman 109
    }
110
 
333 terminx 111
    if (x == (320>>1))
5 Plagman 112
        centre = 320>>2;
113
    else centre = 0;
114
 
410 terminx 115
    if (!buttonstat || buttonstat == 16 || buttonstat == 32)
5 Plagman 116
    {
408 terminx 117
        if (KB_KeyPressed(sc_UpArrow) || KB_KeyPressed(sc_PgUp) || KB_KeyPressed(sc_kpad_8) || mi < -8192 || WHEELUP)
5 Plagman 118
        {
411 terminx 119
            mi = mii = 0;
333 terminx 120
            KB_ClearKeyDown(sc_UpArrow);
121
            KB_ClearKeyDown(sc_kpad_8);
122
            KB_ClearKeyDown(sc_PgUp);
410 terminx 123
            MOUSE_ClearButton(WHEELUP_MOUSE);
5 Plagman 124
            sound(KICK_HIT);
125
 
126
            probey--;
331 terminx 127
            if (probey < 0) probey = n-1;
5 Plagman 128
        }
411 terminx 129
        if (KB_KeyPressed(sc_DownArrow) || KB_KeyPressed(sc_PgDn) || KB_KeyPressed(sc_kpad_2) || mi > 8192 || WHEELDOWN)
5 Plagman 130
        {
411 terminx 131
            mi = mii = 0;
333 terminx 132
            KB_ClearKeyDown(sc_DownArrow);
133
            KB_ClearKeyDown(sc_kpad_2);
134
            KB_ClearKeyDown(sc_PgDn);
410 terminx 135
            MOUSE_ClearButton(WHEELDOWN_MOUSE);
5 Plagman 136
            sound(KICK_HIT);
137
            probey++;
138
        }
139
    }
140
 
331 terminx 141
    if (probey >= n)
5 Plagman 142
        probey = 0;
143
 
331 terminx 144
    if (centre)
5 Plagman 145
    {
146
        //        rotatesprite(((320>>1)+(centre)+54)<<16,(y+(probey*i)-4)<<16,65536L,0,SPINNINGNUKEICON+6-((6+(totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1);
147
        //        rotatesprite(((320>>1)-(centre)-54)<<16,(y+(probey*i)-4)<<16,65536L,0,SPINNINGNUKEICON+((totalclock>>3)%7),sh,0,10,0,0,xdim-1,ydim-1);
148
 
149
        rotatesprite(((320>>1)+(centre>>1)+70)<<16,(y+(probey*i)-4)<<16,65536L>>type,0,SPINNINGNUKEICON+6-((6+(totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1);
150
        rotatesprite(((320>>1)-(centre>>1)-70)<<16,(y+(probey*i)-4)<<16,65536L>>type,0,SPINNINGNUKEICON+((totalclock>>3)%7),sh,0,10,0,0,xdim-1,ydim-1);
151
    }
152
    else
153
        rotatesprite((x<<16)-((tilesizx[BIGFNTCURSOR]-4)<<(16-type)),(y+(probey*i)-(4>>type))<<16,65536L>>type,0,SPINNINGNUKEICON+(((totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1);
154
 
333 terminx 155
    if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Enter) || (LMB && !onbar))
5 Plagman 156
    {
331 terminx 157
        if (current_menu != 110)
5 Plagman 158
            sound(PISTOL_BODYHIT);
333 terminx 159
        KB_ClearKeyDown(sc_Enter);
160
        KB_ClearKeyDown(sc_Space);
161
        KB_ClearKeyDown(sc_kpad_Enter);
410 terminx 162
        MOUSE_ClearButton(LEFT_MOUSE);
5 Plagman 163
        return(probey);
164
    }
333 terminx 165
    else if (KB_KeyPressed(sc_Escape) || (RMB))
5 Plagman 166
    {
167
        onbar = 0;
333 terminx 168
        KB_ClearKeyDown(sc_Escape);
5 Plagman 169
        sound(EXITMENUSOUND);
428 terminx 170
        MOUSE_ClearButton(RIGHT_MOUSE);
5 Plagman 171
        return(-1);
172
    }
173
    else
174
    {
331 terminx 175
        if (onbar == 0) return(-probey-2);
424 terminx 176
        if (KB_KeyPressed(sc_LeftArrow) || KB_KeyPressed(sc_kpad_4) || ((buttonstat&1) && (WHEELUP || mii < -256)))
5 Plagman 177
            return(probey);
424 terminx 178
        else if (KB_KeyPressed(sc_RightArrow) || KB_KeyPressed(sc_kpad_6) || ((buttonstat&1) && (WHEELDOWN || mii > 256)))
5 Plagman 179
            return(probey);
419 terminx 180
        return(-probey-2);
5 Plagman 181
    }
182
}
398 terminx 183
static inline int probe(int x,int y,int i,int n)
335 terminx 184
{
185
    return probe_(0,x,y,i,n);
186
}
398 terminx 187
 
188
static inline int probesm(int x,int y,int i,int n)
335 terminx 189
{
190
    return probe_(1,x,y,i,n);
191
}
5 Plagman 192
 
398 terminx 193
static int menutext_(int x,int y,short s,short p,char *t)
5 Plagman 194
{
195
    short i, ac, centre;
196
 
197
    y -= 12;
198
 
199
    i = centre = 0;
200
 
333 terminx 201
    if (x == (320>>1))
5 Plagman 202
    {
333 terminx 203
        while (*(t+i))
5 Plagman 204
        {
331 terminx 205
            if (*(t+i) == ' ')
5 Plagman 206
            {
207
                centre += 5;
208
                i++;
209
                continue;
210
            }
211
            ac = 0;
331 terminx 212
            if (*(t+i) >= '0' && *(t+i) <= '9')
5 Plagman 213
                ac = *(t+i) - '0' + BIGALPHANUM-10;
331 terminx 214
            else if (*(t+i) >= 'a' && *(t+i) <= 'z')
5 Plagman 215
                ac = toupper(*(t+i)) - 'A' + BIGALPHANUM;
331 terminx 216
            else if (*(t+i) >= 'A' && *(t+i) <= 'Z')
5 Plagman 217
                ac = *(t+i) - 'A' + BIGALPHANUM;
331 terminx 218
            else switch (*(t+i))
5 Plagman 219
                {
337 terminx 220
                case '-':
221
                    ac = BIGALPHANUM-11;
222
                    break;
223
                case '.':
224
                    ac = BIGPERIOD;
225
                    break;
226
                case '\'':
227
                    ac = BIGAPPOS;
228
                    break;
229
                case ',':
230
                    ac = BIGCOMMA;
231
                    break;
232
                case '!':
233
                    ac = BIGX;
234
                    break;
235
                case '?':
236
                    ac = BIGQ;
237
                    break;
238
                case ';':
239
                    ac = BIGSEMI;
240
                    break;
241
                case ':':
242
                    ac = BIGSEMI;
243
                    break;
244
                default:
245
                    centre += 5;
246
                    i++;
247
                    continue;
335 terminx 248
                }
249
 
250
            centre += tilesizx[ac]-1;
251
            i++;
252
        }
253
    }
254
 
255
    if (centre)
256
        x = (320-centre-10)>>1;
257
 
258
    while (*t)
259
    {
260
        if (*t == ' ')
261
        {
262
            x+=5;
263
            t++;
264
            continue;
265
        }
266
        ac = 0;
267
        if (*t >= '0' && *t <= '9')
268
            ac = *t - '0' + BIGALPHANUM-10;
269
        else if (*t >= 'a' && *t <= 'z')
270
            ac = toupper(*t) - 'A' + BIGALPHANUM;
271
        else if (*t >= 'A' && *t <= 'Z')
272
            ac = *t - 'A' + BIGALPHANUM;
273
        else switch (*t)
274
            {
337 terminx 275
            case '-':
276
                ac = BIGALPHANUM-11;
277
                break;
278
            case '.':
279
                ac = BIGPERIOD;
280
                break;
281
            case ',':
282
                ac = BIGCOMMA;
283
                break;
284
            case '!':
285
                ac = BIGX;
286
                break;
287
            case '\'':
288
                ac = BIGAPPOS;
289
                break;
290
            case '?':
291
                ac = BIGQ;
292
                break;
293
            case ';':
294
                ac = BIGSEMI;
295
                break;
296
            case ':':
297
                ac = BIGCOLIN;
298
                break;
299
            default:
300
                x += 5;
301
                t++;
302
                continue;
5 Plagman 303
            }
304
 
305
        rotatesprite(x<<16,y<<16,65536L,0,ac,s,p,10+16,0,0,xdim-1,ydim-1);
306
 
307
        x += tilesizx[ac];
308
        t++;
309
    }
310
    return (x);
311
}
312
 
509 terminx 313
inline int menutext(int x,int y,int s,int p,const char *t)
152 terminx 314
{
437 terminx 315
    return(menutext_(x,y,s,p,(char *)stripcolorcodes(t)));
152 terminx 316
}
317
 
509 terminx 318
static void bar_(int type, int x,int y,short *p,int dainc,int damodify,int s, int pa)
5 Plagman 319
{
320
    short xloc;
321
    char rev;
322
 
335 terminx 323
    if (dainc < 0)
324
    {
325
        dainc = -dainc;
326
        rev = 1;
327
    }
5 Plagman 328
    else rev = 0;
329
    y-=2;
330
 
331 terminx 331
    if (damodify)
5 Plagman 332
    {
331 terminx 333
        if (rev == 0)
5 Plagman 334
        {
424 terminx 335
            if (*p > 0 && (KB_KeyPressed(sc_LeftArrow) || KB_KeyPressed(sc_kpad_4) || ((buttonstat&1) && (WHEELUP || mii < -256))))         // && onbar) )
5 Plagman 336
            {
333 terminx 337
                KB_ClearKeyDown(sc_LeftArrow);
338
                KB_ClearKeyDown(sc_kpad_4);
424 terminx 339
                MOUSE_ClearButton(WHEELUP_MOUSE);
410 terminx 340
                mii = 0;
5 Plagman 341
                *p -= dainc;
331 terminx 342
                if (*p < 0)
5 Plagman 343
                    *p = 0;
344
                sound(KICK_HIT);
345
            }
424 terminx 346
            if (*p < 63 && (KB_KeyPressed(sc_RightArrow) || KB_KeyPressed(sc_kpad_6) || ((buttonstat&1) && (WHEELDOWN || mii > 256))))        //&& onbar) )
5 Plagman 347
            {
333 terminx 348
                KB_ClearKeyDown(sc_RightArrow);
349
                KB_ClearKeyDown(sc_kpad_6);
424 terminx 350
                MOUSE_ClearButton(WHEELDOWN_MOUSE);
428 terminx 351
                mii = 0;
5 Plagman 352
                *p += dainc;
331 terminx 353
                if (*p > 63)
5 Plagman 354
                    *p = 63;
355
                sound(KICK_HIT);
356
            }
357
        }
358
        else
359
        {
333 terminx 360
            if (*p > 0 && (KB_KeyPressed(sc_RightArrow) || KB_KeyPressed(sc_kpad_6) || ((buttonstat&1) && minfo.dyaw > 256)))        //&& onbar) )
5 Plagman 361
            {
333 terminx 362
                KB_ClearKeyDown(sc_RightArrow);
363
                KB_ClearKeyDown(sc_kpad_6);
5 Plagman 364
 
365
                *p -= dainc;
331 terminx 366
                if (*p < 0)
5 Plagman 367
                    *p = 0;
368
                sound(KICK_HIT);
369
            }
333 terminx 370
            if (*p < 64 && (KB_KeyPressed(sc_LeftArrow) || KB_KeyPressed(sc_kpad_4) || ((buttonstat&1) && minfo.dyaw < -256)))         // && onbar) )
5 Plagman 371
            {
333 terminx 372
                KB_ClearKeyDown(sc_LeftArrow);
373
                KB_ClearKeyDown(sc_kpad_4);
5 Plagman 374
 
375
                *p += dainc;
331 terminx 376
                if (*p > 64)
5 Plagman 377
                    *p = 64;
378
                sound(KICK_HIT);
379
            }
380
        }
381
    }
382
 
383
    xloc = *p;
384
 
333 terminx 385
    rotatesprite((x<<16)+(22<<(16-type)),(y<<16)-(3<<(16-type)),65536L>>type,0,SLIDEBAR,s,pa,10,0,0,xdim-1,ydim-1);
331 terminx 386
    if (rev == 0)
333 terminx 387
        rotatesprite((x<<16)+((xloc+1)<<(16-type)),(y<<16)+(1<<(16-type)),65536L>>type,0,SLIDEBAR+1,s,pa,10,0,0,xdim-1,ydim-1);
5 Plagman 388
    else
333 terminx 389
        rotatesprite((x<<16)+((65-xloc)<<(16-type)),(y<<16)+(1<<(16-type)),65536L>>type,0,SLIDEBAR+1,s,pa,10,0,0,xdim-1,ydim-1);
5 Plagman 390
}
391
 
509 terminx 392
static inline void bar(int x,int y,short *p,int dainc,int damodify,int s, int pa)
335 terminx 393
{
394
    bar_(0,x,y,p,dainc,damodify,s,pa);
395
}
509 terminx 396
static inline void barsm(int x,int y,short *p,int dainc,int damodify,int s, int pa)
335 terminx 397
{
398
    bar_(1,x,y,p,dainc,damodify,s,pa);
399
}
5 Plagman 400
 
509 terminx 401
static void modval(int min, int max,int *p,int dainc,int damodify)
5 Plagman 402
{
403
    char rev;
404
 
335 terminx 405
    if (dainc < 0)
406
    {
407
        dainc = -dainc;
408
        rev = 1;
409
    }
5 Plagman 410
    else rev = 0;
411
 
331 terminx 412
    if (damodify)
5 Plagman 413
    {
331 terminx 414
        if (rev == 0)
5 Plagman 415
        {
333 terminx 416
            if (KB_KeyPressed(sc_LeftArrow) || KB_KeyPressed(sc_kpad_4) || ((buttonstat&1) && minfo.dyaw < -256))        // && onbar) )
5 Plagman 417
            {
333 terminx 418
                KB_ClearKeyDown(sc_LeftArrow);
419
                KB_ClearKeyDown(sc_kpad_4);
5 Plagman 420
 
421
                *p -= dainc;
331 terminx 422
                if (*p < min)
509 terminx 423
                {
511 terminx 424
                    *p = max;
509 terminx 425
                    if (damodify == 2)
426
                        *p = min;
511 terminx 427
                }
5 Plagman 428
                sound(PISTOL_BODYHIT);
429
            }
333 terminx 430
            if (KB_KeyPressed(sc_RightArrow) || KB_KeyPressed(sc_kpad_6) || ((buttonstat&1) && minfo.dyaw > 256))       //&& onbar) )
5 Plagman 431
            {
333 terminx 432
                KB_ClearKeyDown(sc_RightArrow);
433
                KB_ClearKeyDown(sc_kpad_6);
5 Plagman 434
 
435
                *p += dainc;
331 terminx 436
                if (*p > max)
509 terminx 437
                {
511 terminx 438
                    *p = min;
509 terminx 439
                    if (damodify == 2)
440
                        *p = max;
511 terminx 441
                }
5 Plagman 442
                sound(PISTOL_BODYHIT);
443
            }
444
        }
445
        else
446
        {
333 terminx 447
            if (KB_KeyPressed(sc_RightArrow) || KB_KeyPressed(sc_kpad_6) || ((buttonstat&1) && minfo.dyaw > 256))      //&& onbar ))
5 Plagman 448
            {
333 terminx 449
                KB_ClearKeyDown(sc_RightArrow);
450
                KB_ClearKeyDown(sc_kpad_6);
5 Plagman 451
 
452
                *p -= dainc;
331 terminx 453
                if (*p < min)
509 terminx 454
                {
511 terminx 455
                    *p = max;
509 terminx 456
                    if (damodify == 2)
457
                        *p = min;
511 terminx 458
                }
5 Plagman 459
                sound(PISTOL_BODYHIT);
460
            }
333 terminx 461
            if (KB_KeyPressed(sc_LeftArrow) || KB_KeyPressed(sc_kpad_4) || ((buttonstat&1) && minfo.dyaw < -256))      // && onbar) )
5 Plagman 462
            {
333 terminx 463
                KB_ClearKeyDown(sc_LeftArrow);
464
                KB_ClearKeyDown(sc_kpad_4);
5 Plagman 465
 
466
                *p += dainc;
331 terminx 467
                if (*p > max)
509 terminx 468
                {
511 terminx 469
                    *p = min;
509 terminx 470
                    if (damodify == 2)
471
                        *p = max;
511 terminx 472
                }
5 Plagman 473
                sound(PISTOL_BODYHIT);
474
            }
475
        }
476
    }
477
}
478
 
482 terminx 479
#define UNSELMENUSHADE 10
480
#define DISABLEDMENUSHADE 20
481
#define MENUHIGHLIGHT(x) probey==x?-(sintable[(totalclock<<4)&2047]>>12):UNSELMENUSHADE
78 terminx 482
// #define MENUHIGHLIGHT(x) probey==x?-(sintable[(totalclock<<4)&2047]>>12):probey-x>=0?(probey-x)<<2:-((probey-x)<<2)
483
 
5 Plagman 484
#define SHX(X) 0
485
// ((x==X)*(-sh))
486
#define PHX(X) 0
487
// ((x==X)?1:2)
488
#define MWIN(X) rotatesprite( 320<<15,200<<15,X,0,MENUSCREEN,-16,0,10+64,0,0,xdim-1,ydim-1)
489
#define MWINXY(X,OX,OY) rotatesprite( ( 320+(OX) )<<15, ( 200+(OY) )<<15,X,0,MENUSCREEN,-16,0,10+64,0,0,xdim-1,ydim-1)
490
 
491
extern int loadpheader(char spot,struct savehead *saveh);
492
 
493
static struct savehead savehead;
494
//static int32 volnum,levnum,plrskl,numplr;
495
//static char brdfn[BMAX_PATH];
432 terminx 496
int lastsavedpos = -1;
5 Plagman 497
 
398 terminx 498
static void dispnames(void)
5 Plagman 499
{
432 terminx 500
    int x, c = 160;
5 Plagman 501
 
502
    c += 64;
331 terminx 503
    for (x = 0;x <= 108;x += 12)
5 Plagman 504
        rotatesprite((c+91-64)<<16,(x+56)<<16,65536L,0,TEXTBOX,24,0,10,0,0,xdim-1,ydim-1);
505
 
506
    rotatesprite(22<<16,97<<16,65536L,0,WINDOWBORDER2,24,0,10,0,0,xdim-1,ydim-1);
507
    rotatesprite(180<<16,97<<16,65536L,1024,WINDOWBORDER2,24,0,10,0,0,xdim-1,ydim-1);
508
    rotatesprite(99<<16,50<<16,65536L,512,WINDOWBORDER1,24,0,10,0,0,xdim-1,ydim-1);
509
    rotatesprite(103<<16,144<<16,65536L,1024+512,WINDOWBORDER1,24,0,10,0,0,xdim-1,ydim-1);
510
 
511
    for (x=0;x<=9;x++)
512
        minitext(c,48+(12*x),ud.savegame[x],2,10+16);
513
}
514
 
428 terminx 515
static void clearfilenames(void)
5 Plagman 516
{
517
    klistfree(finddirs);
518
    klistfree(findfiles);
519
    finddirs = findfiles = NULL;
520
    numfiles = numdirs = 0;
521
}
522
 
438 terminx 523
static int getfilenames(const char *path, char kind[])
5 Plagman 524
{
525
    CACHE1D_FIND_REC *r;
526
 
527
    clearfilenames();
528
    finddirs = klistpath(path,"*",CACHE1D_FIND_DIR);
529
    findfiles = klistpath(path,kind,CACHE1D_FIND_FILE);
530
    for (r = finddirs; r; r=r->next) numdirs++;
531
    for (r = findfiles; r; r=r->next) numfiles++;
532
 
533
    finddirshigh = finddirs;
534
    findfileshigh = findfiles;
535
    currentlist = 0;
536
    if (findfileshigh) currentlist = 1;
537
 
538
    return(0);
539
}
540
 
541
long quittimer = 0;
542
 
59 terminx 543
void check_player_color(int *color,int prev_color)
544
{
545
    int i, disallowed[] = { 1, 2, 3, 4, 5, 6, 7, 8, 17, 18, 19, 20, 22 };
546
 
335 terminx 547
    for (i=0;i<(signed)(sizeof(disallowed)/sizeof(disallowed[0]));i++)
548
    {
549
        while (*color == disallowed[i])
550
        {
331 terminx 551
            if (*color > prev_color)
59 terminx 552
                (*color)++;
553
            else (*color)--;
554
            i=0;
555
        }
556
    }
557
}
558
 
77 terminx 559
void sendquit(void)
560
{
333 terminx 561
    if (gamequit == 0 && (numplayers > 1))
77 terminx 562
    {
331 terminx 563
        if (ps[myconnectindex].gm&MODE_GAME)
77 terminx 564
        {
565
            gamequit = 1;
566
            quittimer = totalclock+120;
567
        }
568
        else
569
        {
438 terminx 570
            int i;
471 terminx 571
 
77 terminx 572
            tempbuf[0] = 254;
573
            tempbuf[1] = myconnectindex;
574
 
331 terminx 575
            for (i=connecthead;i >= 0;i=connectpoint2[i])
77 terminx 576
            {
577
                if (i != myconnectindex) sendpacket(i,tempbuf,2);
578
                if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
579
            }
580
            gameexit(" ");
581
        }
582
    }
333 terminx 583
    else if (numplayers < 2)
77 terminx 584
        gameexit(" ");
585
 
333 terminx 586
    if ((totalclock > quittimer) && (gamequit == 1))
77 terminx 587
        gameexit("Timed out.");
588
}
589
 
5 Plagman 590
void menus(void)
591
{
592
    CACHE1D_FIND_REC *dir;
432 terminx 593
    int c,x,i;
5 Plagman 594
    long l,m;
595
    char *p = NULL;
596
 
597
    getpackets();
598
 
599
    {
331 terminx 600
        if (buttonstat != 0 && !onbar)
5 Plagman 601
        {
602
            x = MOUSE_GetButtons()<<3;
333 terminx 603
            if (x) buttonstat = x<<3;
5 Plagman 604
            else buttonstat = 0;
605
        }
606
        else
607
            buttonstat = MOUSE_GetButtons();
608
    }
609
 
333 terminx 610
    if ((ps[myconnectindex].gm&MODE_MENU) == 0)
5 Plagman 611
    {
612
        walock[TILE_LOADSHOT] = 1;
613
        return;
614
    }
615
 
616
    ps[myconnectindex].gm &= (0xff-MODE_TYPE);
617
    ps[myconnectindex].fta = 0;
618
 
619
    x = 0;
620
 
621
    sh = 4-(sintable[(totalclock<<4)&2047]>>11);
471 terminx 622
 
331 terminx 623
    if (bpp > 8)
5 Plagman 624
    {
625
        long x,y,y1=0,y2=ydim;
331 terminx 626
        for (y=y1;y<y2;y+=tilesizy[BIGHOLE])
627
            for (x=0;x<xdim;x+=tilesizx[BIGHOLE])
5 Plagman 628
                rotatesprite(x<<16,y<<16,65536L,0,BIGHOLE,80,0,1+8+16,0,0,xdim-1,ydim-1);
629
    }
471 terminx 630
 
331 terminx 631
    if (!(current_menu >= 1000 && current_menu <= 2999 && current_menu >= 300 && current_menu <= 369))
5 Plagman 632
        vscrn();
633
 
438 terminx 634
    if (KB_KeyPressed(sc_Q))
75 terminx 635
    {
438 terminx 636
        switch (current_menu)
637
        {
638
        case 210:
639
        case 360:
640
        case 361:
641
        case 362:
642
        case 363:
643
        case 364:
644
        case 365:
645
        case 366:
646
        case 367:
647
        case 368:
648
        case 369:
649
        case 500:
650
        case 501:
651
        case 502:
652
        case 603:
471 terminx 653
        case 10001:
438 terminx 654
        case 20003:
655
        case 20005:
656
            break;
657
        default:
658
            if (current_menu >= 0)
659
            {
660
                last_menu = current_menu;
482 terminx 661
                last_menu_pos = probey;
438 terminx 662
                cmenu(502);
663
            }
664
            break;
665
        }
75 terminx 666
    }
471 terminx 667
 
331 terminx 668
    switch (current_menu)
5 Plagman 669
    {
337 terminx 670
    case 25000:
671
        gametext(160,90,"SELECT A SAVE SPOT BEFORE",0,2+8+16);
672
        gametext(160,90+9,"YOU QUICK RESTORE.",0,2+8+16);
5 Plagman 673
 
411 terminx 674
        x = probe(186,124,0,1);
337 terminx 675
        if (x >= -1)
676
        {
677
            if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 678
            {
337 terminx 679
                ready2send = 1;
680
                totalclock = ototalclock;
5 Plagman 681
            }
337 terminx 682
            ps[myconnectindex].gm &= ~MODE_MENU;
683
        }
684
        break;
5 Plagman 685
 
337 terminx 686
    case 20000:
411 terminx 687
        x = probe(326,190,0,1);
337 terminx 688
        gametext(160,50-8,"YOU ARE PLAYING THE SHAREWARE",0,2+8+16);
689
        gametext(160,59-8,"VERSION OF DUKE NUKEM 3D.  WHILE",0,2+8+16);
690
        gametext(160,68-8,"THIS VERSION IS REALLY COOL, YOU",0,2+8+16);
691
        gametext(160,77-8,"ARE MISSING OVER 75%% OF THE TOTAL",0,2+8+16);
692
        gametext(160,86-8,"GAME, ALONG WITH OTHER GREAT EXTRAS",0,2+8+16);
693
        gametext(160,95-8,"AND GAMES, WHICH YOU'LL GET WHEN",0,2+8+16);
694
        gametext(160,104-8,"YOU ORDER THE COMPLETE VERSION AND",0,2+8+16);
695
        gametext(160,113-8,"GET THE FINAL TWO EPISODES.",0,2+8+16);
5 Plagman 696
 
337 terminx 697
        gametext(160,113+8,"PLEASE READ THE 'HOW TO ORDER' ITEM",0,2+8+16);
698
        gametext(160,122+8,"ON THE MAIN MENU IF YOU WISH TO",0,2+8+16);
699
        gametext(160,131+8,"UPGRADE TO THE FULL REGISTERED",0,2+8+16);
700
        gametext(160,140+8,"VERSION OF DUKE NUKEM 3D.",0,2+8+16);
701
        gametext(160,149+16,"PRESS ANY KEY...",0,2+8+16);
5 Plagman 702
 
337 terminx 703
        if (x >= -1) cmenu(100);
704
        break;
5 Plagman 705
 
337 terminx 706
    case 20001:
707
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
708
        menutext(160,24,0,0,"NETWORK GAME");
5 Plagman 709
 
337 terminx 710
        x = probe(160,100-18,18,3);
5 Plagman 711
 
337 terminx 712
        if (x == -1) cmenu(0);
713
        else if (x == 2) cmenu(20010);
714
        else if (x == 1) cmenu(20020);
715
        else if (x == 0) cmenu(20002);
5 Plagman 716
 
337 terminx 717
        menutext(160,100-18,MENUHIGHLIGHT(0),0,"PLAYER SETUP");
718
        menutext(160,100,MENUHIGHLIGHT(1),0,"JOIN GAME");
719
        menutext(160,100+18,MENUHIGHLIGHT(2),0,"HOST GAME");
720
        break;
5 Plagman 721
 
337 terminx 722
    case 20002:
723
    case 20003:
724
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
725
        menutext(160,24,0,0,"PLAYER SETUP");
471 terminx 726
        c = (320>>1)-120;
337 terminx 727
        {
471 terminx 728
            int io, ii, yy = 37, d=c+140, enabled;
729
            char *opts[] = {
730
                               "Name",
482 terminx 731
                               "-",
471 terminx 732
                               "Color",
482 terminx 733
                               "-",
471 terminx 734
                               "Team",
735
                               "-",
736
                               "-",
482 terminx 737
                               "Auto aim",
471 terminx 738
                               "Mouse aim",
739
                               "-",
740
                               "-",
472 terminx 741
                               "Switch weapon on pickup",
742
                               "Switch weapon when empty",
471 terminx 743
                               "-",
482 terminx 744
                               "-",
509 terminx 745
                               "Network packets/sec",
746
                               "-",
747
                               "-",
474 terminx 748
                               "Multiplayer macros",
471 terminx 749
                               NULL
750
                           };
751
 
752
            x = ud.color;
753
 
754
            if (probey == 2)
755
                x = getteampal(ud.team);
482 terminx 756
 
472 terminx 757
            rotatesprite((260)<<16,(24+(tilesizy[APLAYER]>>1))<<16,49152L,0,1441-((((4-(totalclock>>4)))&3)*5),0,x,10,0,0,xdim-1,ydim-1);
471 terminx 758
 
759
            for (ii=io=0; opts[ii]; ii++)
335 terminx 760
            {
471 terminx 761
                if (opts[ii][0] == '-' && !opts[ii][1])
762
                {
763
                    if (io <= probey) yy += 4;
764
                    continue;
765
                }
766
                if (io < probey) yy += 8;
767
                io++;
268 terminx 768
            }
5 Plagman 769
 
482 terminx 770
 
471 terminx 771
            if (current_menu == 20002)
335 terminx 772
            {
471 terminx 773
                x = probesm(c,yy+5,0,io);
56 terminx 774
 
471 terminx 775
                if (x == -1)
776
                {
777
                    cmenu(202);
778
                    probey = 3;
779
                    break;
780
                }
5 Plagman 781
 
471 terminx 782
                for (ii=io=0; opts[ii]; ii++)
783
                {
784
                    if (opts[ii][0] == '-' && !opts[ii][1])
785
                        continue;
786
                    enabled = 1;
787
                    switch (io)
788
                    {
789
                    case 0:
790
                        if (x == io)
791
                        {
792
                            strcpy(buf, myname);
793
                            inputloc = strlen(buf);
794
                            current_menu = 20003;
56 terminx 795
 
471 terminx 796
                            KB_ClearKeyDown(sc_Enter);
797
                            KB_ClearKeyDown(sc_kpad_Enter);
798
                            KB_FlushKeyboardQueue();
799
                        }
800
                        break;
58 terminx 801
 
471 terminx 802
                    case 1:
482 terminx 803
                        i = ud.color;
471 terminx 804
                        if (x == io)
805
                        {
806
                            ud.color++;
807
                            if (ud.color > 23)
808
                                ud.color = 0;
482 terminx 809
                            check_player_color((int *)&ud.color,-1);
471 terminx 810
                        }
811
                        modval(0,23,(int *)&ud.color,1,probey==1);
482 terminx 812
                        check_player_color((int *)&ud.color,i);
471 terminx 813
                        if (ud.color != i)
482 terminx 814
                            updateplayer();
471 terminx 815
                        break;
268 terminx 816
 
471 terminx 817
                    case 2:
818
                        i = ud.team;
819
                        if (x == io)
820
                        {
821
                            ud.team++;
822
                            if (ud.team == 4)
823
                                ud.team = 0;
482 terminx 824
                        }
471 terminx 825
                        modval(0,3,(int *)&ud.team,1,probey==2);
826
                        if (ud.team != i)
827
                            updateplayer();
828
                        break;
53 terminx 829
 
471 terminx 830
                    case 3:
831
                        i = AutoAim;
832
                        if (x == io)
833
                            AutoAim = (AutoAim == 2) ? 0 : AutoAim+1;
834
                        modval(0,2,(int *)&AutoAim,1,probey==3);
835
                        if (AutoAim != i)
836
                            updateplayer();
837
                        break;
838
 
839
                    case 4:
840
                        i = ud.mouseaiming;
841
                        if (x == io)
842
                            ud.mouseaiming = !ud.mouseaiming;
843
                        modval(0,1,(int *)&ud.mouseaiming,1,probey==4);
844
                        if (ud.mouseaiming != i)
845
                            updateplayer();
846
                        break;
482 terminx 847
 
471 terminx 848
                    case 5:
849
                        i = 0;
850
                        if (ud.weaponswitch & 1)
851
                            i = 1;
852
                        if (x == io)
853
                            i = 1-i;
854
                        modval(0,1,(int *)&i,1,probey==5);
855
                        if ((ud.weaponswitch & 1 && !i) || (!(ud.weaponswitch & 1) && i))
856
                        {
857
                            ud.weaponswitch ^= 1;
858
                            updateplayer();
859
                        }
860
                        break;
861
                    case 6:
862
                        i = 0;
863
                        if (ud.weaponswitch & 2)
864
                            i = 1;
865
                        if (x == io)
866
                            i = 1-i;
867
                        modval(0,1,(int *)&i,1,probey==6);
868
                        if ((ud.weaponswitch & 2 && !i) || (!(ud.weaponswitch & 2) && i))
869
                        {
870
                            ud.weaponswitch ^= 2;
871
                            updateplayer();
482 terminx 872
                        }
471 terminx 873
                        break;
874
                    case 7:
875
                        if (x == io)
509 terminx 876
                            packetrate = min(max(((packetrate/50)*50)+50,50),1000);
877
                        modval(50,1000,(int *)&packetrate,10,probey==7?2:0);
878
                        break;
879
                    case 8:
880
                        if (x == io)
471 terminx 881
                        {
882
                            cmenu(20004);
883
                        }
884
                        break;
885
 
886
                    default:
887
                        break;
888
                    }
889
                    io++;
890
                }
57 terminx 891
            }
471 terminx 892
            else
893
            {
472 terminx 894
                x = strget(d-50,37,buf,30,0);
337 terminx 895
 
471 terminx 896
                while (Bstrlen(stripcolorcodes(buf)) > 10)
897
                {
898
                    buf[Bstrlen(buf)-1] = '\0';
899
                    inputloc--;
900
                }
901
 
902
                if (x)
903
                {
904
                    if (x == 1)
905
                    {
906
                        if (buf[0] && Bstrcmp(myname,buf))
907
                        {
908
                            Bstrcpy(myname,buf);
909
                            updateplayer();
910
                        }
911
                        // send name update
912
                    }
913
                    KB_ClearKeyDown(sc_Enter);
914
                    KB_ClearKeyDown(sc_kpad_Enter);
915
                    KB_FlushKeyboardQueue();
916
 
917
                    current_menu = 20002;
918
                }
337 terminx 919
            }
151 terminx 920
 
471 terminx 921
            yy = 37;
337 terminx 922
            {
471 terminx 923
                for (ii=io=0; opts[ii]; ii++)
335 terminx 924
                {
471 terminx 925
                    if (opts[ii][0] == '-' && !opts[ii][1])
335 terminx 926
                    {
471 terminx 927
                        yy += 4;
928
                        continue;
101 terminx 929
                    }
471 terminx 930
                    enabled = 1;
931
                    switch (io)
932
                    {
933
                    case 0:
934
                        if (current_menu == 20002)
935
                        {
936
                            gametext(d-50,yy,myname,MENUHIGHLIGHT(io),2+8+16);
937
                        }
938
                        break;
335 terminx 939
 
471 terminx 940
                    case 1:
941
                        {
942
                            char *s[] = { "Auto","","","","","","","","","Blue","Red","Green","Gray","Dark gray","Dark green","Brown",
943
                                          "Dark blue","","","","","Bright red","","Yellow","","" };
944
                            gametext(d-50,yy,s[ud.color],MENUHIGHLIGHT(io),2+8+16);
945
                        }
946
                        break;
5 Plagman 947
 
471 terminx 948
                    case 2:
949
                        {
472 terminx 950
                            char *s[] = { "Blue", "Red", "Green", "Gray" };
471 terminx 951
                            gametext(d-50,yy,s[ud.team],MENUHIGHLIGHT(io),2+8+16);
952
                        }
953
                        break;
5 Plagman 954
 
471 terminx 955
                    case 3:
956
                        {
957
                            char *s[] = { "Off", "All weapons", "Hitscan only" };
958
                            gametext(d-50,yy,s[AutoAim],MENUHIGHLIGHT(io),2+8+16);
959
                        }
960
                        break;
53 terminx 961
 
471 terminx 962
                    case 4:
963
                        gametext(d-50,yy,ud.mouseaiming?"Hold button":"Toggle on/off",MENUHIGHLIGHT(io),2+8+16);
964
                        break;
54 terminx 965
 
471 terminx 966
                    case 5:
472 terminx 967
                        gametext(d+70,yy,ud.weaponswitch&1?"On":"Off",MENUHIGHLIGHT(io),2+8+16);
471 terminx 968
                        break;
482 terminx 969
 
471 terminx 970
                    case 6:
472 terminx 971
                        gametext(d+70,yy,ud.weaponswitch&2?"On":"Off",MENUHIGHLIGHT(io),2+8+16);
471 terminx 972
                        break;
509 terminx 973
                    case 7:
974
                        Bsprintf(tempbuf,"%d",packetrate);
975
                        gametext(d+70,yy,tempbuf,MENUHIGHLIGHT(io),2+8+16);
976
                        break;
471 terminx 977
                    default:
978
                        break;
979
                    }
482 terminx 980
                    gametextpal(c,yy, opts[ii], enabled?MENUHIGHLIGHT(io):DISABLEDMENUSHADE, 10);
471 terminx 981
                    io++;
982
                    yy += 8;
983
                }
984
            }
5 Plagman 985
 
471 terminx 986
            break;
987
        }
337 terminx 988
    case 20004:
989
    case 20005:
990
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
474 terminx 991
        menutext(160,24,0,0,"MULTIPLAYER MACROS");
88 terminx 992
 
337 terminx 993
        if (current_menu == 20004)
994
        {
995
            x = probesm(24,45,8,10);
996
            if (x == -1)
88 terminx 997
            {
337 terminx 998
                cmenu(20002);
509 terminx 999
                probey = 8;
88 terminx 1000
            }
337 terminx 1001
            else if (x >= 0 && x <= 9)
88 terminx 1002
            {
337 terminx 1003
                strcpy(buf, ud.ridecule[x]);
1004
                inputloc = strlen(buf);
482 terminx 1005
                last_menu_pos = probey;
337 terminx 1006
                current_menu = 20005;
1007
                KB_ClearKeyDown(sc_Enter);
1008
                KB_ClearKeyDown(sc_kpad_Enter);
1009
                KB_FlushKeyboardQueue();
1010
            }
1011
        }
1012
        else
1013
        {
1014
            x = strget(26,40+(8*probey),buf,34,0);
1015
            if (x)
1016
            {
1017
                if (x == 1)
335 terminx 1018
                {
482 terminx 1019
                    Bstrcpy(ud.ridecule[last_menu_pos],buf);
88 terminx 1020
                }
337 terminx 1021
                KB_ClearKeyDown(sc_Enter);
1022
                KB_ClearKeyDown(sc_kpad_Enter);
1023
                KB_FlushKeyboardQueue();
1024
                current_menu = 20004;
88 terminx 1025
            }
337 terminx 1026
        }
1027
        for (i=0;i<10;i++)
1028
        {
482 terminx 1029
            if (current_menu == 20005 && i == last_menu_pos) continue;
337 terminx 1030
            gametextpal(26,40+(i<<3),ud.ridecule[i],MENUHIGHLIGHT(i),0);
1031
        }
91 terminx 1032
 
482 terminx 1033
        gametext(160,144,"ACTIVATE IN-GAME WITH SHIFT-F#",0,2+8+16);
91 terminx 1034
 
337 terminx 1035
        break;
88 terminx 1036
 
383 terminx 1037
#if 0
337 terminx 1038
    case 20010:
1039
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1040
        menutext(160,24,0,0,"HOST NETWORK GAME");
5 Plagman 1041
 
337 terminx 1042
        x = probe(46,50,80,2);
5 Plagman 1043
 
337 terminx 1044
        if (x == -1)
1045
        {
1046
            cmenu(20001);
1047
            probey = 2;
1048
        }
1049
        else if (x == 0) cmenu(20011);
5 Plagman 1050
 
337 terminx 1051
        menutext(40,50,0,0,        "GAME OPTIONS");
1052
        minitext(90,60,            "GAME TYPE"    ,2,26);
1053
        minitext(90,60+8,          "EPISODE"      ,2,26);
1054
        minitext(90,60+8+8,        "LEVEL"        ,2,26);
1055
        minitext(90,60+8+8+8,      "MONSTERS"     ,2,26);
1056
        if (ud.m_coop == 0)
1057
            minitext(90,60+8+8+8+8,    "MARKERS"      ,2,26);
1058
        else if (ud.m_coop == 1)
1059
            minitext(90,60+8+8+8+8,    "FRIENDLY FIRE",2,26);
1060
        minitext(90,60+8+8+8+8+8,  "USER MAP"     ,2,26);
5 Plagman 1061
 
337 terminx 1062
        gametext(90+60,60,gametype_names[ud.m_coop],0,26);
5 Plagman 1063
 
337 terminx 1064
        minitext(90+60,60+8,      volume_names[ud.m_volume_number],0,26);
381 terminx 1065
        minitext(90+60,60+8+8,    level_names[MAXLEVELS*ud.m_volume_number+ud.m_level_number],0,26);
337 terminx 1066
        if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
1067
            minitext(90+60,60+8+8+8,  skill_names[ud.m_player_skill],0,26);
1068
        else minitext(90+60,60+8+8+8,  "NONE",0,28);
1069
        if (ud.m_coop == 0)
1070
        {
1071
            if (ud.m_marker) minitext(90+60,60+8+8+8+8,"ON",0,26);
1072
            else minitext(90+60,60+8+8+8+8,"OFF",0,26);
1073
        }
1074
        else if (ud.m_coop == 1)
1075
        {
1076
            if (ud.m_ffire) minitext(90+60,60+8+8+8+8,"ON",0,26);
1077
            else minitext(90+60,60+8+8+8+8,"OFF",0,26);
1078
        }
1079
 
1080
        menutext(40,50+80,0,0,"LAUNCH GAME");
1081
        break;
1082
 
1083
    case 20011:
1084
        c = (320>>1) - 120;
1085
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1086
        menutext(160,24,0,0,"NET GAME OPTIONS");
1087
 
1088
        x = probe(c,57-8,16,8);
1089
 
1090
        switch (x)
1091
        {
1092
        case -1:
1093
            cmenu(20010);
1094
            break;
1095
        case 0:
1096
            ud.m_coop++;
1097
            if (ud.m_coop == 3) ud.m_coop = 0;
1098
            break;
1099
        case 1:
1100
            if (!VOLUMEONE)
335 terminx 1101
            {
337 terminx 1102
                ud.m_volume_number++;
1103
                if (ud.m_volume_number == num_volumes) ud.m_volume_number = 0;
1104
                if (ud.m_volume_number == 0 && ud.m_level_number > 6)
1105
                    ud.m_level_number = 0;
1106
                if (ud.m_level_number > 10) ud.m_level_number = 0;
335 terminx 1107
            }
337 terminx 1108
            break;
1109
        case 2:
1110
            ud.m_level_number++;
1111
            if (!VOLUMEONE)
335 terminx 1112
            {
337 terminx 1113
                if (ud.m_volume_number == 0 && ud.m_level_number > 6)
1114
                    ud.m_level_number = 0;
335 terminx 1115
            }
337 terminx 1116
            else
1117
            {
1118
                if (ud.m_volume_number == 0 && ud.m_level_number > 5)
1119
                    ud.m_level_number = 0;
1120
            }
1121
            if (ud.m_level_number > 10) ud.m_level_number = 0;
1122
            break;
1123
        case 3:
1124
            if (ud.m_monsters_off == 1 && ud.m_player_skill > 0)
1125
                ud.m_monsters_off = 0;
5 Plagman 1126
 
337 terminx 1127
            if (ud.m_monsters_off == 0)
1128
            {
1129
                ud.m_player_skill++;
1130
                if (ud.m_player_skill > 3)
1131
                {
1132
                    ud.m_player_skill = 0;
1133
                    ud.m_monsters_off = 1;
1134
                }
1135
            }
1136
            else ud.m_monsters_off = 0;
1137
 
335 terminx 1138
            break;
5 Plagman 1139
 
337 terminx 1140
        case 4:
1141
            if (ud.m_coop == 0)
1142
                ud.m_marker = !ud.m_marker;
1143
            break;
5 Plagman 1144
 
337 terminx 1145
        case 5:
1146
            if (ud.m_coop == 1)
1147
                ud.m_ffire = !ud.m_ffire;
1148
            break;
5 Plagman 1149
 
337 terminx 1150
        case 6:
1151
            // pick the user map
1152
            break;
5 Plagman 1153
 
337 terminx 1154
        case 7:
1155
            cmenu(20010);
1156
            break;
1157
        }
5 Plagman 1158
 
337 terminx 1159
        c += 40;
5 Plagman 1160
 
337 terminx 1161
        //         if(ud.m_coop==1) gametext(c+70,57-7-9,"COOPERATIVE PLAY",0,2+8+16);
1162
        //         else if(ud.m_coop==2) gametext(c+70,57-7-9,"DUKEMATCH (NO SPAWN)",0,2+8+16);
1163
        //         else gametext(c+70,57-7-9,"DUKEMATCH (SPAWN)",0,2+8+16);
1164
        gametext(c+70,57-7-9,gametype_names[ud.m_coop],0,26);
5 Plagman 1165
 
337 terminx 1166
        gametext(c+70,57+16-7-9,volume_names[ud.m_volume_number],0,2+8+16);
5 Plagman 1167
 
381 terminx 1168
        gametext(c+70,57+16+16-7-9,&level_names[MAXLEVELS*ud.m_volume_number+ud.m_level_number][0],0,2+8+16);
5 Plagman 1169
 
337 terminx 1170
        if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
1171
            gametext(c+70,57+16+16+16-7-9,skill_names[ud.m_player_skill],0,2+8+16);
1172
        else gametext(c+70,57+16+16+16-7-9,"NONE",0,2+8+16);
5 Plagman 1173
 
337 terminx 1174
        if (ud.m_coop == 0)
1175
        {
1176
            if (ud.m_marker)
1177
                gametext(c+70,57+16+16+16+16-7-9,"ON",0,2+8+16);
1178
            else gametext(c+70,57+16+16+16+16-7-9,"OFF",0,2+8+16);
1179
        }
5 Plagman 1180
 
337 terminx 1181
        if (ud.m_coop == 1)
1182
        {
1183
            if (ud.m_ffire)
1184
                gametext(c+70,57+16+16+16+16+16-7-9,"ON",0,2+8+16);
1185
            else gametext(c+70,57+16+16+16+16+16-7-9,"OFF",0,2+8+16);
1186
        }
5 Plagman 1187
 
337 terminx 1188
        c -= 44;
5 Plagman 1189
 
337 terminx 1190
        menutext(c,57-9,MENUHIGHLIGHT(0),PHX(-2),"GAME TYPE");
5 Plagman 1191
 
337 terminx 1192
        sprintf(tempbuf,"EPISODE %ld",ud.m_volume_number+1);
1193
        menutext(c,57+16-9,MENUHIGHLIGHT(1),PHX(-3),tempbuf);
5 Plagman 1194
 
337 terminx 1195
        sprintf(tempbuf,"LEVEL %ld",ud.m_level_number+1);
1196
        menutext(c,57+16+16-9,MENUHIGHLIGHT(2),PHX(-4),tempbuf);
5 Plagman 1197
 
337 terminx 1198
        menutext(c,57+16+16+16-9,MENUHIGHLIGHT(3),PHX(-5),"MONSTERS");
5 Plagman 1199
 
337 terminx 1200
        if (ud.m_coop == 0)
1201
            menutext(c,57+16+16+16+16-9,MENUHIGHLIGHT(4),PHX(-6),"MARKERS");
1202
        else
1203
            menutext(c,57+16+16+16+16-9,MENUHIGHLIGHT(4),1,"MARKERS");
5 Plagman 1204
 
337 terminx 1205
        if (ud.m_coop == 1)
1206
            menutext(c,57+16+16+16+16+16-9,MENUHIGHLIGHT(5),PHX(-6),"FR. FIRE");
1207
        else menutext(c,57+16+16+16+16+16-9,MENUHIGHLIGHT(5),1,"FR. FIRE");
5 Plagman 1208
 
337 terminx 1209
        if (VOLUMEALL)
1210
        {
1211
            menutext(c,57+16+16+16+16+16+16-9,MENUHIGHLIGHT(6),boardfilename[0] == 0,"USER MAP");
1212
            if (boardfilename[0] != 0)
1213
                gametext(c+70+44,57+16+16+16+16+16,boardfilename,0,2+8+16);
1214
        }
1215
        else
1216
        {
1217
            menutext(c,57+16+16+16+16+16+16-9,MENUHIGHLIGHT(6),1,"USER MAP");
1218
        }
5 Plagman 1219
 
337 terminx 1220
        menutext(c,57+16+16+16+16+16+16+16-9,MENUHIGHLIGHT(7),PHX(-8),"ACCEPT");
1221
        break;
5 Plagman 1222
 
337 terminx 1223
    case 20020:
1224
    case 20021: // editing server
1225
    case 20022: // editing port
1226
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1227
        menutext(160,24,0,0,"JOIN NETWORK GAME");
5 Plagman 1228
 
337 terminx 1229
        if (current_menu == 20020)
1230
        {
1231
            x = probe(46,50,20,3);
5 Plagman 1232
 
337 terminx 1233
            if (x == -1)
335 terminx 1234
            {
337 terminx 1235
                cmenu(20001);
1236
                probey = 1;
335 terminx 1237
            }
337 terminx 1238
            else if (x == 0)
335 terminx 1239
            {
337 terminx 1240
                strcpy(buf, "localhost");
1241
                inputloc = strlen(buf);
1242
                current_menu = 20021;
335 terminx 1243
            }
337 terminx 1244
            else if (x == 1)
335 terminx 1245
            {
337 terminx 1246
                strcpy(buf, "19014");
1247
                inputloc = strlen(buf);
1248
                current_menu = 20022;
1249
            }
1250
            else if (x == 2)
1251
            {}
1252
            KB_ClearKeyDown(sc_Enter);
1253
            KB_ClearKeyDown(sc_kpad_Enter);
1254
            KB_FlushKeyboardQueue();
1255
        }
1256
        else if (current_menu == 20021)
1257
        {
1258
            x = strget(40+100,50-9,buf,31,0);
1259
            if (x)
1260
            {
1261
                if (x == 1)
335 terminx 1262
                {
337 terminx 1263
                    //strcpy(myname,buf);
5 Plagman 1264
                }
337 terminx 1265
 
5 Plagman 1266
                KB_ClearKeyDown(sc_Enter);
1267
                KB_ClearKeyDown(sc_kpad_Enter);
1268
                KB_FlushKeyboardQueue();
337 terminx 1269
 
1270
                current_menu = 20020;
335 terminx 1271
            }
337 terminx 1272
        }
1273
        else if (current_menu == 20022)
1274
        {
1275
            x = strget(40+100,50+20-9,buf,5,997);
1276
            if (x)
335 terminx 1277
            {
337 terminx 1278
                if (x == 1)
335 terminx 1279
                {
337 terminx 1280
                    //strcpy(myname,buf);
335 terminx 1281
                }
5 Plagman 1282
 
337 terminx 1283
                KB_ClearKeyDown(sc_Enter);
1284
                KB_ClearKeyDown(sc_kpad_Enter);
1285
                KB_FlushKeyboardQueue();
5 Plagman 1286
 
337 terminx 1287
                current_menu = 20020;
5 Plagman 1288
            }
337 terminx 1289
        }
5 Plagman 1290
 
337 terminx 1291
        menutext(40,50,0,0,"SERVER");
1292
        if (current_menu != 20021) gametext(40+100,50-9,"server",0,2+8+16);
5 Plagman 1293
 
337 terminx 1294
        menutext(40,50+20,0,0,"PORT");
1295
        if (current_menu != 20022)
1296
        {
1297
            sprintf(tempbuf,"%d",19014);
1298
            gametext(40+100,50+20-9,tempbuf,0,2+8+16);
1299
        }
5 Plagman 1300
 
337 terminx 1301
        menutext(160,50+20+20,0,0,"CONNECT");
5 Plagman 1302
 
1303
 
337 terminx 1304
        // ADDRESS
1305
        // PORT
1306
        // CONNECT
1307
        break;
383 terminx 1308
#endif
337 terminx 1309
    case 15001:
1310
    case 15000:
5 Plagman 1311
 
337 terminx 1312
        gametext(160,90,"LOAD last game:",0,2+8+16);
5 Plagman 1313
 
337 terminx 1314
        sprintf(tempbuf,"\"%s\"",ud.savegame[lastsavedpos]);
1315
        gametext(160,99,tempbuf,0,2+8+16);
5 Plagman 1316
 
337 terminx 1317
        gametext(160,99+9,"(Y/N)",0,2+8+16);
5 Plagman 1318
 
337 terminx 1319
        if (KB_KeyPressed(sc_Escape) || KB_KeyPressed(sc_N) || RMB)
1320
        {
1321
            if (sprite[ps[myconnectindex].i].extra <= 0)
5 Plagman 1322
            {
337 terminx 1323
                if (enterlevel(MODE_GAME)) backtomenu();
1324
                return;
1325
            }
5 Plagman 1326
 
337 terminx 1327
            KB_ClearKeyDown(sc_N);
1328
            KB_ClearKeyDown(sc_Escape);
5 Plagman 1329
 
337 terminx 1330
            ps[myconnectindex].gm &= ~MODE_MENU;
1331
            if (ud.multimode < 2 && ud.recstat != 2)
1332
            {
1333
                ready2send = 1;
1334
                totalclock = ototalclock;
5 Plagman 1335
            }
337 terminx 1336
        }
5 Plagman 1337
 
337 terminx 1338
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1339
        {
1340
            KB_FlushKeyboardQueue();
1341
            KB_ClearKeysDown();
1342
            FX_StopAllSounds();
1343
 
1344
            if (ud.multimode > 1)
335 terminx 1345
            {
337 terminx 1346
                loadplayer(-1-lastsavedpos);
1347
                ps[myconnectindex].gm = MODE_GAME;
1348
            }
1349
            else
1350
            {
1351
                c = loadplayer(lastsavedpos);
1352
                if (c == 0)
5 Plagman 1353
                    ps[myconnectindex].gm = MODE_GAME;
1354
            }
337 terminx 1355
        }
5 Plagman 1356
 
337 terminx 1357
        probe(186,124+9,0,0);
5 Plagman 1358
 
337 terminx 1359
        break;
1360
 
1361
    case 10000:
1362
    case 10001:
1363
 
1364
        c = 60;
1365
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1366
        menutext(160,24,0,0,"ADULT MODE");
1367
 
1368
        x = probe(60,50+16,16,2);
1369
        if (x == -1)
1370
        {
1371
            cmenu(201);
1372
            probey = 0;
335 terminx 1373
            break;
337 terminx 1374
        }
5 Plagman 1375
 
337 terminx 1376
        menutext(c,50+16,MENUHIGHLIGHT(0),PHX(-2),"ADULT MODE");
1377
        menutext(c,50+16+16,MENUHIGHLIGHT(1),PHX(-3),"ENTER PASSWORD");
5 Plagman 1378
 
337 terminx 1379
        menutext(c+160+40,50+16,MENUHIGHLIGHT(0),0,ud.lockout?"OFF":"ON");
5 Plagman 1380
 
337 terminx 1381
        if (current_menu == 10001)
1382
        {
1383
            gametext(160,50+16+16+16+16-12,"ENTER PASSWORD",0,2+8+16);
1384
            x = strget((320>>1),50+16+16+16+16,buf,19, 998);
1385
 
1386
            if (x)
335 terminx 1387
            {
337 terminx 1388
                if (ud.pwlockout[0] == 0 || ud.lockout == 0)
1389
                    strcpy(&ud.pwlockout[0],buf);
1390
                else if (strcmp(buf,&ud.pwlockout[0]) == 0)
1391
                {
1392
                    ud.lockout = 0;
1393
                    buf[0] = 0;
5 Plagman 1394
 
337 terminx 1395
                    for (x=0;x<numanimwalls;x++)
1396
                        if (wall[animwall[x].wallnum].picnum != W_SCREENBREAK &&
1397
                                wall[animwall[x].wallnum].picnum != W_SCREENBREAK+1 &&
1398
                                wall[animwall[x].wallnum].picnum != W_SCREENBREAK+2)
1399
                            if (wall[animwall[x].wallnum].extra >= 0)
1400
                                wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
5 Plagman 1401
 
337 terminx 1402
                }
1403
                current_menu = 10000;
1404
                KB_ClearKeyDown(sc_Enter);
1405
                KB_ClearKeyDown(sc_kpad_Enter);
1406
                KB_FlushKeyboardQueue();
1407
            }
1408
        }
1409
        else
1410
        {
1411
            if (x == 0)
5 Plagman 1412
            {
337 terminx 1413
                if (ud.lockout == 1)
5 Plagman 1414
                {
337 terminx 1415
                    if (ud.pwlockout[0] == 0)
5 Plagman 1416
                    {
1417
                        ud.lockout = 0;
331 terminx 1418
                        for (x=0;x<numanimwalls;x++)
333 terminx 1419
                            if (wall[animwall[x].wallnum].picnum != W_SCREENBREAK &&
5 Plagman 1420
                                    wall[animwall[x].wallnum].picnum != W_SCREENBREAK+1 &&
333 terminx 1421
                                    wall[animwall[x].wallnum].picnum != W_SCREENBREAK+2)
1422
                                if (wall[animwall[x].wallnum].extra >= 0)
5 Plagman 1423
                                    wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
1424
                    }
1425
                    else
1426
                    {
337 terminx 1427
                        buf[0] = 0;
1428
                        current_menu = 10001;
1429
                        inputloc = 0;
1430
                        KB_FlushKeyboardQueue();
5 Plagman 1431
                    }
1432
                }
337 terminx 1433
                else
1434
                {
1435
                    ud.lockout = 1;
335 terminx 1436
 
337 terminx 1437
                    for (x=0;x<numanimwalls;x++)
1438
                        switch (dynamictostatic[wall[animwall[x].wallnum].picnum])
1439
                        {
1440
                        case FEMPIC1__STATIC:
1441
                            wall[animwall[x].wallnum].picnum = BLANKSCREEN;
1442
                            break;
1443
                        case FEMPIC2__STATIC:
1444
                        case FEMPIC3__STATIC:
1445
                            wall[animwall[x].wallnum].picnum = SCREENBREAK6;
1446
                            break;
1447
                        }
5 Plagman 1448
                }
1449
            }
1450
 
337 terminx 1451
            else if (x == 1)
1452
            {
1453
                current_menu = 10001;
1454
                inputloc = 0;
1455
                KB_FlushKeyboardQueue();
1456
            }
1457
        }
5 Plagman 1458
 
337 terminx 1459
        break;
5 Plagman 1460
 
337 terminx 1461
    case 1000:
1462
    case 1001:
1463
    case 1002:
1464
    case 1003:
1465
    case 1004:
1466
    case 1005:
1467
    case 1006:
1468
    case 1007:
1469
    case 1008:
1470
    case 1009:
5 Plagman 1471
 
337 terminx 1472
        rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
1473
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1474
        menutext(160,24,0,0,"LOAD GAME");
1475
        rotatesprite(101<<16,97<<16,65536>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
5 Plagman 1476
 
337 terminx 1477
        dispnames();
5 Plagman 1478
 
337 terminx 1479
        sprintf(tempbuf,"PLAYERS: %-2ld                      ",savehead.numplr);
1480
        gametext(160,156,tempbuf,0,2+8+16);
5 Plagman 1481
 
337 terminx 1482
        sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+savehead.volnum,1+savehead.levnum,savehead.plrskl);
1483
        gametext(160,168,tempbuf,0,2+8+16);
5 Plagman 1484
 
337 terminx 1485
        if (savehead.volnum == 0 && savehead.levnum == 7)
1486
            gametext(160,180,savehead.boardfn,0,2+8+16);
5 Plagman 1487
 
337 terminx 1488
        gametext(160,90,"LOAD game:",0,2+8+16);
1489
        sprintf(tempbuf,"\"%s\"",ud.savegame[current_menu-1000]);
1490
        gametext(160,99,tempbuf,0,2+8+16);
1491
        gametext(160,99+9,"(Y/N)",0,2+8+16);
1492
 
1493
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1494
        {
1495
            lastsavedpos = current_menu-1000;
1496
 
1497
            KB_FlushKeyboardQueue();
1498
            KB_ClearKeysDown();
1499
            if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 1500
            {
337 terminx 1501
                ready2send = 1;
1502
                totalclock = ototalclock;
1503
            }
5 Plagman 1504
 
337 terminx 1505
            if (ud.multimode > 1)
1506
            {
1507
                if (ps[myconnectindex].gm&MODE_GAME)
5 Plagman 1508
                {
337 terminx 1509
                    loadplayer(-1-lastsavedpos);
1510
                    ps[myconnectindex].gm = MODE_GAME;
5 Plagman 1511
                }
337 terminx 1512
                else
5 Plagman 1513
                {
337 terminx 1514
                    tempbuf[0] = 126;
1515
                    tempbuf[1] = lastsavedpos;
1516
                    tempbuf[2] = myconnectindex;
1517
                    for (x=connecthead;x>=0;x=connectpoint2[x])
5 Plagman 1518
                    {
337 terminx 1519
                        if (x != myconnectindex) sendpacket(x,tempbuf,3);
1520
                        if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
5 Plagman 1521
                    }
337 terminx 1522
                    getpackets();
5 Plagman 1523
 
337 terminx 1524
                    loadplayer(lastsavedpos);
5 Plagman 1525
 
337 terminx 1526
                    multiflag = 0;
5 Plagman 1527
                }
1528
            }
337 terminx 1529
            else
5 Plagman 1530
            {
337 terminx 1531
                c = loadplayer(lastsavedpos);
1532
                if (c == 0)
1533
                    ps[myconnectindex].gm = MODE_GAME;
5 Plagman 1534
            }
1535
 
1536
            break;
337 terminx 1537
        }
410 terminx 1538
 
428 terminx 1539
        probe(186,124+9,0,0);
1540
 
337 terminx 1541
        if (KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
1542
        {
1543
            KB_ClearKeyDown(sc_N);
1544
            KB_ClearKeyDown(sc_Escape);
1545
            sound(EXITMENUSOUND);
410 terminx 1546
            if (ps[myconnectindex].gm&MODE_GAME)
5 Plagman 1547
            {
337 terminx 1548
                ps[myconnectindex].gm &= ~MODE_MENU;
331 terminx 1549
                if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 1550
                {
1551
                    ready2send = 1;
1552
                    totalclock = ototalclock;
1553
                }
428 terminx 1554
            }
1555
            else
1556
            {
410 terminx 1557
                cmenu(300);
1558
                probey = last_threehundred;
5 Plagman 1559
            }
337 terminx 1560
        }
5 Plagman 1561
 
337 terminx 1562
        break;
1563
 
1564
    case 1500:
1565
 
1566
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1567
        {
1568
            KB_FlushKeyboardQueue();
1569
            cmenu(100);
1570
        }
1571
        if (KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
1572
        {
1573
            KB_ClearKeyDown(sc_N);
1574
            KB_ClearKeyDown(sc_Escape);
1575
            if (ud.multimode < 2 && ud.recstat != 2)
1576
            {
1577
                ready2send = 1;
1578
                totalclock = ototalclock;
1579
            }
1580
            ps[myconnectindex].gm &= ~MODE_MENU;
1581
            sound(EXITMENUSOUND);
335 terminx 1582
            break;
337 terminx 1583
        }
1584
        probe(186,124,0,0);
1585
        gametext(160,90,"ABORT this game?",0,2+8+16);
1586
        gametext(160,90+9,"(Y/N)",0,2+8+16);
5 Plagman 1587
 
337 terminx 1588
        break;
5 Plagman 1589
 
337 terminx 1590
    case 2000:
1591
    case 2001:
1592
    case 2002:
1593
    case 2003:
1594
    case 2004:
1595
    case 2005:
1596
    case 2006:
1597
    case 2007:
1598
    case 2008:
1599
    case 2009:
5 Plagman 1600
 
337 terminx 1601
        rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
1602
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1603
        menutext(160,24,0,0,"SAVE GAME");
5 Plagman 1604
 
337 terminx 1605
        rotatesprite(101<<16,97<<16,65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
1606
        sprintf(tempbuf,"PLAYERS: %-2ld                      ",ud.multimode);
1607
        gametext(160,156,tempbuf,0,2+8+16);
5 Plagman 1608
 
337 terminx 1609
        sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+ud.volume_number,1+ud.level_number,ud.player_skill);
1610
        gametext(160,168,tempbuf,0,2+8+16);
5 Plagman 1611
 
337 terminx 1612
        if (ud.volume_number == 0 && ud.level_number == 7)
1613
            gametext(160,180,boardfilename,0,2+8+16);
5 Plagman 1614
 
337 terminx 1615
        dispnames();
5 Plagman 1616
 
337 terminx 1617
        gametext(160,90,"OVERWRITE previous SAVED game?",0,2+8+16);
1618
        gametext(160,90+9,"(Y/N)",0,2+8+16);
5 Plagman 1619
 
337 terminx 1620
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1621
        {
1622
            inputloc = strlen(&ud.savegame[current_menu-2000][0]);
5 Plagman 1623
 
337 terminx 1624
            cmenu(current_menu-2000+360);
5 Plagman 1625
 
337 terminx 1626
            KB_FlushKeyboardQueue();
5 Plagman 1627
            break;
337 terminx 1628
        }
1629
        if (KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
1630
        {
1631
            KB_ClearKeyDown(sc_N);
1632
            KB_ClearKeyDown(sc_Escape);
1633
            cmenu(351);
1634
            sound(EXITMENUSOUND);
1635
        }
5 Plagman 1636
 
337 terminx 1637
        probe(186,124,0,0);
5 Plagman 1638
 
337 terminx 1639
        break;
5 Plagman 1640
 
337 terminx 1641
    case 990:
1642
    case 991:
1643
    case 992:
1644
    case 993:
1645
    case 994:
1646
    case 995:
1647
    case 996:
1648
    case 997:
1649
    case 998:
1650
        c = 160;
1651
        if (!VOLUMEALL || !PLUTOPAK)
1652
        {
1653
            //rotatesprite(c<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
1654
            rotatesprite(c<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1655
            menutext(c,24,0,0,current_menu == 998 ? "ABOUT EDUKE32" : "CREDITS");
5 Plagman 1656
 
337 terminx 1657
            l = 8;
1658
        }
1659
        else
1660
        {
1661
            l = 3;
1662
        }
5 Plagman 1663
 
337 terminx 1664
        if (KB_KeyPressed(sc_LeftArrow) ||
1665
                KB_KeyPressed(sc_kpad_4) ||
1666
                KB_KeyPressed(sc_UpArrow) ||
1667
                KB_KeyPressed(sc_PgUp) ||
411 terminx 1668
                KB_KeyPressed(sc_kpad_8) ||
1669
                WHEELUP)
337 terminx 1670
        {
1671
            KB_ClearKeyDown(sc_LeftArrow);
1672
            KB_ClearKeyDown(sc_kpad_4);
1673
            KB_ClearKeyDown(sc_UpArrow);
1674
            KB_ClearKeyDown(sc_PgUp);
1675
            KB_ClearKeyDown(sc_kpad_8);
1676
 
1677
            sound(KICK_HIT);
1678
            current_menu--;
1679
            if (current_menu < 990) current_menu = 990+l;
1680
        }
1681
        else if (
1682
            KB_KeyPressed(sc_PgDn) ||
1683
            KB_KeyPressed(sc_Enter) ||
1684
            KB_KeyPressed(sc_Space) ||
1685
            KB_KeyPressed(sc_kpad_Enter) ||
1686
            KB_KeyPressed(sc_RightArrow) ||
1687
            KB_KeyPressed(sc_DownArrow) ||
1688
            KB_KeyPressed(sc_kpad_2) ||
1689
            KB_KeyPressed(sc_kpad_9) ||
409 terminx 1690
            KB_KeyPressed(sc_kpad_6) ||
411 terminx 1691
            LMB || WHEELDOWN)
337 terminx 1692
        {
1693
            KB_ClearKeyDown(sc_PgDn);
1694
            KB_ClearKeyDown(sc_Enter);
1695
            KB_ClearKeyDown(sc_RightArrow);
1696
            KB_ClearKeyDown(sc_kpad_Enter);
1697
            KB_ClearKeyDown(sc_kpad_6);
1698
            KB_ClearKeyDown(sc_kpad_9);
1699
            KB_ClearKeyDown(sc_kpad_2);
1700
            KB_ClearKeyDown(sc_DownArrow);
1701
            KB_ClearKeyDown(sc_Space);
1702
            sound(KICK_HIT);
1703
            current_menu++;
1704
            if (current_menu > 990+l) current_menu = 990;
1705
        }
1706
 
482 terminx 1707
        x = probe(0,0,0,1);
1708
 
1709
        if (x == -1)
1710
        {
1711
            cmenu(0);
1712
            break;
1713
        }
1714
 
337 terminx 1715
        if (!VOLUMEALL || !PLUTOPAK)
1716
        {
1717
            switch (current_menu)
335 terminx 1718
            {
337 terminx 1719
            case 990:
1720
                gametext(c,40,                      "ORIGINAL CONCEPT",0,2+8+16);
1721
                gametext(c,40+9,                    "TODD REPLOGLE",0,2+8+16);
1722
                gametext(c,40+9+9,                  "ALLEN H. BLUM III",0,2+8+16);
5 Plagman 1723
 
337 terminx 1724
                gametext(c,40+9+9+9+9,              "PRODUCED & DIRECTED BY",0,2+8+16);
1725
                gametext(c,40+9+9+9+9+9,            "GREG MALONE",0,2+8+16);
5 Plagman 1726
 
337 terminx 1727
                gametext(c,40+9+9+9+9+9+9+9,        "EXECUTIVE PRODUCER",0,2+8+16);
1728
                gametext(c,40+9+9+9+9+9+9+9+9,      "GEORGE BROUSSARD",0,2+8+16);
5 Plagman 1729
 
337 terminx 1730
                gametext(c,40+9+9+9+9+9+9+9+9+9+9,  "BUILD ENGINE",0,2+8+16);
1731
                gametext(c,40+9+9+9+9+9+9+9+9+9+9+9,"KEN SILVERMAN",0,2+8+16);
1732
                break;
1733
            case 991:
1734
                gametext(c,40,                      "GAME PROGRAMMING",0,2+8+16);
1735
                gametext(c,40+9,                    "TODD REPLOGLE",0,2+8+16);
5 Plagman 1736
 
337 terminx 1737
                gametext(c,40+9+9+9,                "3D ENGINE/TOOLS/NET",0,2+8+16);
1738
                gametext(c,40+9+9+9+9,              "KEN SILVERMAN",0,2+8+16);
5 Plagman 1739
 
337 terminx 1740
                gametext(c,40+9+9+9+9+9+9,          "NETWORK LAYER/SETUP PROGRAM",0,2+8+16);
1741
                gametext(c,40+9+9+9+9+9+9+9,        "MARK DOCHTERMANN",0,2+8+16);
1742
                break;
1743
            case 992:
1744
                gametext(c,40,                      "MAP DESIGN",0,2+8+16);
1745
                gametext(c,40+9,                    "ALLEN H BLUM III",0,2+8+16);
1746
                gametext(c,40+9+9,                  "RICHARD GRAY",0,2+8+16);
5 Plagman 1747
 
337 terminx 1748
                gametext(c,40+9+9+9+9,              "3D MODELING",0,2+8+16);
1749
                gametext(c,40+9+9+9+9+9,            "CHUCK JONES",0,2+8+16);
1750
                gametext(c,40+9+9+9+9+9+9,          "SAPPHIRE CORPORATION",0,2+8+16);
5 Plagman 1751
 
337 terminx 1752
                gametext(c,40+9+9+9+9+9+9+9+9,      "ARTWORK",0,2+8+16);
1753
                gametext(c,40+9+9+9+9+9+9+9+9+9,    "DIRK JONES, STEPHEN HORNBACK",0,2+8+16);
1754
                gametext(c,40+9+9+9+9+9+9+9+9+9+9,  "JAMES STOREY, DAVID DEMARET",0,2+8+16);
1755
                gametext(c,40+9+9+9+9+9+9+9+9+9+9+9,"DOUGLAS R WOOD",0,2+8+16);
1756
                break;
1757
            case 993:
1758
                gametext(c,40,                      "SOUND ENGINE",0,2+8+16);
1759
                gametext(c,40+9,                    "JIM DOSE",0,2+8+16);
5 Plagman 1760
 
337 terminx 1761
                gametext(c,40+9+9+9,                "SOUND & MUSIC DEVELOPMENT",0,2+8+16);
1762
                gametext(c,40+9+9+9+9,              "ROBERT PRINCE",0,2+8+16);
1763
                gametext(c,40+9+9+9+9+9,            "LEE JACKSON",0,2+8+16);
5 Plagman 1764
 
337 terminx 1765
                gametext(c,40+9+9+9+9+9+9+9,        "VOICE TALENT",0,2+8+16);
1766
                gametext(c,40+9+9+9+9+9+9+9+9,      "LANI MINELLA - VOICE PRODUCER",0,2+8+16);
1767
                gametext(c,40+9+9+9+9+9+9+9+9+9,    "JON ST. JOHN AS \"DUKE NUKEM\"",0,2+8+16);
1768
                break;
1769
            case 994:
1770
                gametext(c,60,                      "GRAPHIC DESIGN",0,2+8+16);
1771
                gametext(c,60+9,                    "PACKAGING, MANUAL, ADS",0,2+8+16);
1772
                gametext(c,60+9+9,                  "ROBERT M. ATKINS",0,2+8+16);
1773
                gametext(c,60+9+9+9,                "MICHAEL HADWIN",0,2+8+16);
5 Plagman 1774
 
337 terminx 1775
                gametext(c,60+9+9+9+9+9,            "SPECIAL THANKS TO",0,2+8+16);
1776
                gametext(c,60+9+9+9+9+9+9,          "STEVEN BLACKBURN, TOM HALL",0,2+8+16);
1777
                gametext(c,60+9+9+9+9+9+9+9,        "SCOTT MILLER, JOE SIEGLER",0,2+8+16);
1778
                gametext(c,60+9+9+9+9+9+9+9+9,      "TERRY NAGY, COLLEEN COMPTON",0,2+8+16);
1779
                gametext(c,60+9+9+9+9+9+9+9+9+9,    "HASH INC., FORMGEN, INC.",0,2+8+16);
1780
                break;
1781
            case 995:
1782
                gametext(c,49,                      "THE 3D REALMS BETA TESTERS",0,2+8+16);
5 Plagman 1783
 
337 terminx 1784
                gametext(c,49+9+9,                  "NATHAN ANDERSON, WAYNE BENNER",0,2+8+16);
1785
                gametext(c,49+9+9+9,                "GLENN BRENSINGER, ROB BROWN",0,2+8+16);
1786
                gametext(c,49+9+9+9+9,              "ERIK HARRIS, KEN HECKBERT",0,2+8+16);
1787
                gametext(c,49+9+9+9+9+9,            "TERRY HERRIN, GREG HIVELY",0,2+8+16);
1788
                gametext(c,49+9+9+9+9+9+9,          "HANK LEUKART, ERIC BAKER",0,2+8+16);
1789
                gametext(c,49+9+9+9+9+9+9+9,        "JEFF RAUSCH, KELLY ROGERS",0,2+8+16);
1790
                gametext(c,49+9+9+9+9+9+9+9+9,      "MIKE DUNCAN, DOUG HOWELL",0,2+8+16);
1791
                gametext(c,49+9+9+9+9+9+9+9+9+9,    "BILL BLAIR",0,2+8+16);
1792
                break;
1793
            case 996:
1794
                gametext(c,32,                      "COMPANY PRODUCT SUPPORT",0,2+8+16);
5 Plagman 1795
 
337 terminx 1796
                gametext(c,32+9+9,                  "THE FOLLOWING COMPANIES WERE COOL",0,2+8+16);
1797
                gametext(c,32+9+9+9,                "ENOUGH TO GIVE US LOTS OF STUFF",0,2+8+16);
1798
                gametext(c,32+9+9+9+9,              "DURING THE MAKING OF DUKE NUKEM 3D.",0,2+8+16);
5 Plagman 1799
 
337 terminx 1800
                gametext(c,32+9+9+9+9+9+9,          "ALTEC LANSING MULTIMEDIA",0,2+8+16);
1801
                gametext(c,32+9+9+9+9+9+9+9,        "FOR TONS OF SPEAKERS AND THE",0,2+8+16);
1802
                gametext(c,32+9+9+9+9+9+9+9+9,      "THX-LICENSED SOUND SYSTEM",0,2+8+16);
1803
                gametext(c,32+9+9+9+9+9+9+9+9+9,    "FOR INFO CALL 1-800-548-0620",0,2+8+16);
5 Plagman 1804
 
337 terminx 1805
                gametext(c,32+9+9+9+9+9+9+9+9+9+9+9,"CREATIVE LABS, INC.",0,2+8+16);
5 Plagman 1806
 
337 terminx 1807
                gametext(c,32+9+9+9+9+9+9+9+9+9+9+9+9+9,"THANKS FOR THE HARDWARE, GUYS.",0,2+8+16);
1808
                break;
1809
            case 997:
1810
                gametext(c,50,                      "DUKE NUKEM IS A TRADEMARK OF",0,2+8+16);
1811
                gametext(c,50+9,                    "3D REALMS ENTERTAINMENT",0,2+8+16);
5 Plagman 1812
 
337 terminx 1813
                gametext(c,50+9+9+9,                "DUKE NUKEM",0,2+8+16);
1814
                gametext(c,50+9+9+9+9,              "(C) 1996 3D REALMS ENTERTAINMENT",0,2+8+16);
5 Plagman 1815
 
337 terminx 1816
                if (VOLUMEONE)
1817
                {
1818
                    gametext(c,106,                     "PLEASE READ LICENSE.DOC FOR SHAREWARE",0,2+8+16);
1819
                    gametext(c,106+9,                   "DISTRIBUTION GRANTS AND RESTRICTIONS",0,2+8+16);
1820
                }
5 Plagman 1821
 
337 terminx 1822
                gametext(c,VOLUMEONE?134:115,       "MADE IN DALLAS, TEXAS USA",0,2+8+16);
5 Plagman 1823
                break;
337 terminx 1824
            case 998:
1825
                l = 10;
1826
                goto cheat_for_port_credits;
5 Plagman 1827
            }
337 terminx 1828
            break;
1829
        }
5 Plagman 1830
 
337 terminx 1831
        // Plutonium pak menus
1832
        switch (current_menu)
1833
        {
1834
        case 990:
1835
        case 991:
1836
        case 992:
1837
            rotatesprite(160<<16,200<<15,65536L,0,2504+current_menu-990,0,0,10+64,0,0,xdim-1,ydim-1);
1838
            break;
1839
        case 993:   // JBF 20031220
1840
            rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,0,0,10+64,0,0,xdim-1,ydim-1);
1841
            rotatesprite(c<<16,19<<16,65536L,0,MENUBAR,0,0,10,0,0,xdim-1,ydim-1);
1842
            menutext(160,24,0,0,"ABOUT EDUKE32");
5 Plagman 1843
 
1844
cheat_for_port_credits:
337 terminx 1845
            if (conversion == 13) l = (-2);
1846
            gametext(160,38-l,"GAME PROGRAMMING",0,2+8+16);
1847
            p = "Richard \"TerminX\" Gobeille";
1848
            minitext(161-(Bstrlen(p)<<1), 39+10-l, p, 4, 10+16+128);
1849
            minitext(160-(Bstrlen(p)<<1), 38+10-l, p, 8, 10+16+128);
5 Plagman 1850
 
337 terminx 1851
            gametext(160,57-l,"\"JFDUKE3D\" AND \"JFBUILD\" CODE",0,2+8+16);
1852
            p = "Jonathon \"JonoF\" Fowler";
1853
            minitext(161-(Bstrlen(p)<<1), 58+10-l, p, 4, 10+16+128);
1854
            minitext(160-(Bstrlen(p)<<1), 57+10-l, p, 8, 10+16+128);
5 Plagman 1855
 
337 terminx 1856
            gametext(160,76-l,"ORIGINAL \"POLYMOST\" RENDERER",0,2+8+16);
1857
            gametext(160,76+8-l,"NETWORKING, OTHER CODE",0,2+8+16);
1858
            p = "Ken \"Awesoken\" Silverman";
1859
            minitext(161-(Bstrlen(p)<<1), 77+8+10-l, p, 4, 10+16+128);
1860
            minitext(160-(Bstrlen(p)<<1), 76+8+10-l, p, 8, 10+16+128);
5 Plagman 1861
 
337 terminx 1862
            gametext(160,103-l,"RENDERING FEATURES",0,2+8+16);
1863
            p = "Pierre-Loup \"Plagman\" Griffais";
1864
            minitext(161-(Bstrlen(p)<<1), 104+10-l, p, 4, 10+16+128);
1865
            minitext(160-(Bstrlen(p)<<1), 103+10-l, p, 8, 10+16+128);
5 Plagman 1866
 
337 terminx 1867
            gametext(160,122-l,"LICENSE AND OTHER CONTRIBUTORS",0,2+8+16);
5 Plagman 1868
            {
337 terminx 1869
                const char *scroller[] =
335 terminx 1870
                    {
337 terminx 1871
                        "This program is distributed under the terms of the",
1872
                        "GNU General Public License version 2 as published by the",
1873
                        "Free Software Foundation. See GNU.TXT for details.",
1874
                        "",
1875
                        "Thanks to the following people for their contributions:",
1876
                        "",
1877
                        "Adam Fazakerley",
1878
                        "Ed Coolidge",
341 terminx 1879
                        "James Bentler",
337 terminx 1880
                        "Javier Martinez",
1881
                        "Jeff Hart",
1882
                        "Jonathan Smith",
1883
                        "Jose del Castillo",
1884
                        "Lachlan McDonald",
1885
                        "Matthew Palmer",
1886
                        "Peter Green",
341 terminx 1887
                        "Ryan C. Gordon",
337 terminx 1888
                        "",
1889
                        "EDuke originally by Matt Saettler",
1890
                        "",
1891
                        "--x--",
1892
                        "",
1893
                        "",
1894
                        "",
1895
                        "",
1896
                        "",
1897
                        ""
1898
                    };
1899
                const int numlines = sizeof(scroller)/sizeof(char *);
1900
                for (m=0,i=(totalclock/104)%numlines; m<6; m++,i++)
335 terminx 1901
                {
337 terminx 1902
                    if (i==numlines) i=0;
1903
                    minitext(161-(Bstrlen(scroller[i])<<1), 101+10+10+8+4+(m*7)-l, (char*)scroller[i], 4, 10+16+128);
1904
                    minitext(160-(Bstrlen(scroller[i])<<1), 100+10+10+8+4+(m*7)-l, (char*)scroller[i], 8, 10+16+128);
335 terminx 1905
                }
1906
            }
5 Plagman 1907
 
337 terminx 1908
            p = "Visit www.eduke32.com for news and updates";
1909
            minitext(161-(Bstrlen(p)<<1), 136+10+10+10+10+4-l, p, 4, 10+16+128);
1910
            minitext(160-(Bstrlen(p)<<1), 135+10+10+10+10+4-l, p, 8, 10+16+128);
1911
        }
1912
        break;
335 terminx 1913
 
337 terminx 1914
    case 0:
1915
        c = (320>>1);
1916
        rotatesprite(c<<16,28<<16,65536L,0,INGAMEDUKETHREEDEE,0,0,10,0,0,xdim-1,ydim-1);
1917
        if (PLUTOPAK)   // JBF 20030804
1918
            rotatesprite((c+100)<<16,36<<16,65536L,0,PLUTOPAKSPRITE+2,(sintable[(totalclock<<4)&2047]>>11),0,2+8,0,0,xdim-1,ydim-1);
1919
        x = probe(c,67,16,6);
1920
        if (x >= 0)
1921
        {
1922
            if (ud.multimode > 1 && x == 0 && ud.recstat != 2)
5 Plagman 1923
            {
337 terminx 1924
                if (movesperpacket == 4 && myconnectindex != connecthead)
1925
                    break;
335 terminx 1926
 
337 terminx 1927
                last_zero = 0;
1928
                cmenu(600);
335 terminx 1929
            }
1930
            else
1931
            {
337 terminx 1932
                last_zero = x;
1933
                switch (x)
1934
                {
5 Plagman 1935
                case 0:
337 terminx 1936
                    cmenu(100);
5 Plagman 1937
                    break;
337 terminx 1938
                    //case 1: break;//cmenu(20001);break;   // JBF 20031128: I'm taking over the TEN menu option
331 terminx 1939
                case 1:
337 terminx 1940
                    cmenu(202);
1941
                    break;   // JBF 20031205: was 200
5 Plagman 1942
                case 2:
331 terminx 1943
                    if (movesperpacket == 4 && connecthead != myconnectindex)
5 Plagman 1944
                        break;
1945
                    cmenu(300);
1946
                    break;
331 terminx 1947
                case 3:
335 terminx 1948
                    KB_FlushKeyboardQueue();
1949
                    cmenu(400);
1950
                    break;
337 terminx 1951
                case 4:
1952
                    cmenu(990);
1953
                    break;
331 terminx 1954
                case 5:
335 terminx 1955
                    cmenu(500);
1956
                    break;
337 terminx 1957
                }
5 Plagman 1958
            }
337 terminx 1959
        }
5 Plagman 1960
 
337 terminx 1961
        if (KB_KeyPressed(sc_Q)) cmenu(500);
5 Plagman 1962
 
337 terminx 1963
        if (x == -1 && (ps[myconnectindex].gm&MODE_GAME || ud.recstat == 2))
1964
        {
1965
            ps[myconnectindex].gm &= ~MODE_MENU;
1966
            if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 1967
            {
337 terminx 1968
                ready2send = 1;
1969
                totalclock = ototalclock;
5 Plagman 1970
            }
337 terminx 1971
        }
1972
 
1973
        if (movesperpacket == 4)
1974
        {
1975
            if (myconnectindex == connecthead)
1976
                menutext(c,67,MENUHIGHLIGHT(0),PHX(-2),"NEW GAME");
5 Plagman 1977
            else
337 terminx 1978
                menutext(c,67,MENUHIGHLIGHT(0),1,"NEW GAME");
1979
        }
1980
        else
1981
            menutext(c,67,MENUHIGHLIGHT(0),PHX(-2),"NEW GAME");
1982
 
1983
        //    menutext(c,67+16,0,1,"NETWORK GAME");
1984
 
1985
        menutext(c,67+16/*+16*/,MENUHIGHLIGHT(1),PHX(-3),"OPTIONS");
1986
 
1987
        if (movesperpacket == 4 && connecthead != myconnectindex)
1988
            menutext(c,67+16+16/*+16*/,MENUHIGHLIGHT(2),1,"LOAD GAME");
1989
        else menutext(c,67+16+16/*+16*/,MENUHIGHLIGHT(2),PHX(-4),"LOAD GAME");
1990
 
1991
        if (!VOLUMEALL)
1992
        {
1993
 
1994
            menutext(c,67+16+16+16/*+16*/,MENUHIGHLIGHT(3),PHX(-5),"HOW TO ORDER");
1995
        }
1996
        else
1997
        {
1998
 
1999
            menutext(c,67