Subversion Repositories eduke32

Rev

Rev 762 | Rev 782 | 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;
649 terminx 35
static int lastsavehead=0,last_menu_pos=0,last_menu,sh,onbar,buttonstat;
482 terminx 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
 
564 terminx 51
extern int voting;
147 terminx 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
584 terminx 77
void savetemp(char *fn,int daptr,int dasiz)
5 Plagman 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
 
584 terminx 541
int quittimer = 0;
5 Plagman 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
    {
564 terminx 563
        if (g_player[myconnectindex].ps->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;
584 terminx 594
    int l,m;
5 Plagman 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
 
564 terminx 610
    if ((g_player[myconnectindex].ps->gm&MODE_MENU) == 0)
5 Plagman 611
    {
612
        walock[TILE_LOADSHOT] = 1;
613
        return;
614
    }
763 terminx 615
    OnEvent(EVENT_DISPLAYMENU, g_player[screenpeek].ps->i, screenpeek, -1);
5 Plagman 616
 
564 terminx 617
    g_player[myconnectindex].ps->gm &= (0xff-MODE_TYPE);
618
    g_player[myconnectindex].ps->fta = 0;
5 Plagman 619
 
620
    x = 0;
621
 
622
    sh = 4-(sintable[(totalclock<<4)&2047]>>11);
471 terminx 623
 
331 terminx 624
    if (bpp > 8)
5 Plagman 625
    {
626 terminx 626
        int x,y=0;
627
        for (;y<ydim;y+=tilesizy[BIGHOLE])
331 terminx 628
            for (x=0;x<xdim;x+=tilesizx[BIGHOLE])
5 Plagman 629
                rotatesprite(x<<16,y<<16,65536L,0,BIGHOLE,80,0,1+8+16,0,0,xdim-1,ydim-1);
630
    }
471 terminx 631
 
331 terminx 632
    if (!(current_menu >= 1000 && current_menu <= 2999 && current_menu >= 300 && current_menu <= 369))
5 Plagman 633
        vscrn();
634
 
438 terminx 635
    if (KB_KeyPressed(sc_Q))
75 terminx 636
    {
438 terminx 637
        switch (current_menu)
638
        {
625 terminx 639
        case 102:
438 terminx 640
        case 210:
641
        case 360:
642
        case 361:
643
        case 362:
644
        case 363:
645
        case 364:
646
        case 365:
647
        case 366:
648
        case 367:
649
        case 368:
650
        case 369:
651
        case 500:
652
        case 501:
653
        case 502:
654
        case 603:
471 terminx 655
        case 10001:
438 terminx 656
        case 20003:
657
        case 20005:
658
            break;
659
        default:
660
            if (current_menu >= 0)
661
            {
662
                last_menu = current_menu;
482 terminx 663
                last_menu_pos = probey;
438 terminx 664
                cmenu(502);
665
            }
666
            break;
667
        }
75 terminx 668
    }
471 terminx 669
 
331 terminx 670
    switch (current_menu)
5 Plagman 671
    {
337 terminx 672
    case 25000:
673
        gametext(160,90,"SELECT A SAVE SPOT BEFORE",0,2+8+16);
674
        gametext(160,90+9,"YOU QUICK RESTORE.",0,2+8+16);
5 Plagman 675
 
411 terminx 676
        x = probe(186,124,0,1);
337 terminx 677
        if (x >= -1)
678
        {
679
            if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 680
            {
337 terminx 681
                ready2send = 1;
682
                totalclock = ototalclock;
5 Plagman 683
            }
564 terminx 684
            g_player[myconnectindex].ps->gm &= ~MODE_MENU;
337 terminx 685
        }
686
        break;
5 Plagman 687
 
337 terminx 688
    case 20000:
411 terminx 689
        x = probe(326,190,0,1);
337 terminx 690
        gametext(160,50-8,"YOU ARE PLAYING THE SHAREWARE",0,2+8+16);
691
        gametext(160,59-8,"VERSION OF DUKE NUKEM 3D.  WHILE",0,2+8+16);
692
        gametext(160,68-8,"THIS VERSION IS REALLY COOL, YOU",0,2+8+16);
693
        gametext(160,77-8,"ARE MISSING OVER 75%% OF THE TOTAL",0,2+8+16);
694
        gametext(160,86-8,"GAME, ALONG WITH OTHER GREAT EXTRAS",0,2+8+16);
695
        gametext(160,95-8,"AND GAMES, WHICH YOU'LL GET WHEN",0,2+8+16);
696
        gametext(160,104-8,"YOU ORDER THE COMPLETE VERSION AND",0,2+8+16);
697
        gametext(160,113-8,"GET THE FINAL TWO EPISODES.",0,2+8+16);
5 Plagman 698
 
337 terminx 699
        gametext(160,113+8,"PLEASE READ THE 'HOW TO ORDER' ITEM",0,2+8+16);
700
        gametext(160,122+8,"ON THE MAIN MENU IF YOU WISH TO",0,2+8+16);
701
        gametext(160,131+8,"UPGRADE TO THE FULL REGISTERED",0,2+8+16);
702
        gametext(160,140+8,"VERSION OF DUKE NUKEM 3D.",0,2+8+16);
703
        gametext(160,149+16,"PRESS ANY KEY...",0,2+8+16);
5 Plagman 704
 
337 terminx 705
        if (x >= -1) cmenu(100);
706
        break;
5 Plagman 707
 
337 terminx 708
    case 20001:
709
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
710
        menutext(160,24,0,0,"NETWORK GAME");
5 Plagman 711
 
337 terminx 712
        x = probe(160,100-18,18,3);
5 Plagman 713
 
337 terminx 714
        if (x == -1) cmenu(0);
715
        else if (x == 2) cmenu(20010);
716
        else if (x == 1) cmenu(20020);
717
        else if (x == 0) cmenu(20002);
5 Plagman 718
 
337 terminx 719
        menutext(160,100-18,MENUHIGHLIGHT(0),0,"PLAYER SETUP");
720
        menutext(160,100,MENUHIGHLIGHT(1),0,"JOIN GAME");
721
        menutext(160,100+18,MENUHIGHLIGHT(2),0,"HOST GAME");
722
        break;
5 Plagman 723
 
337 terminx 724
    case 20002:
725
    case 20003:
726
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
727
        menutext(160,24,0,0,"PLAYER SETUP");
471 terminx 728
        c = (320>>1)-120;
337 terminx 729
        {
471 terminx 730
            int io, ii, yy = 37, d=c+140, enabled;
559 terminx 731
            char *opts[] =
732
            {
733
                "Name",
734
                "-",
735
                "Color",
736
                "-",
737
                "Team",
738
                "-",
739
                "-",
740
                "Auto aim",
741
                "Mouse aim",
742
                "-",
743
                "-",
744
                "Switch weapon on pickup",
745
                "Switch weapon when empty",
746
                "-",
747
                "-",
748
                "Network packets/sec",
749
                "-",
750
                "-",
751
                "Multiplayer macros",
752
                NULL
753
            };
471 terminx 754
 
755
            x = ud.color;
756
 
757
            if (probey == 2)
758
                x = getteampal(ud.team);
482 terminx 759
 
472 terminx 760
            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 761
 
762
            for (ii=io=0; opts[ii]; ii++)
335 terminx 763
            {
471 terminx 764
                if (opts[ii][0] == '-' && !opts[ii][1])
765
                {
766
                    if (io <= probey) yy += 4;
767
                    continue;
768
                }
769
                if (io < probey) yy += 8;
770
                io++;
268 terminx 771
            }
5 Plagman 772
 
482 terminx 773
 
471 terminx 774
            if (current_menu == 20002)
335 terminx 775
            {
471 terminx 776
                x = probesm(c,yy+5,0,io);
56 terminx 777
 
471 terminx 778
                if (x == -1)
779
                {
780
                    cmenu(202);
781
                    probey = 3;
782
                    break;
783
                }
5 Plagman 784
 
471 terminx 785
                for (ii=io=0; opts[ii]; ii++)
786
                {
787
                    if (opts[ii][0] == '-' && !opts[ii][1])
788
                        continue;
789
                    enabled = 1;
790
                    switch (io)
791
                    {
792
                    case 0:
793
                        if (x == io)
794
                        {
795
                            strcpy(buf, myname);
796
                            inputloc = strlen(buf);
797
                            current_menu = 20003;
56 terminx 798
 
471 terminx 799
                            KB_ClearKeyDown(sc_Enter);
800
                            KB_ClearKeyDown(sc_kpad_Enter);
801
                            KB_FlushKeyboardQueue();
802
                        }
803
                        break;
58 terminx 804
 
471 terminx 805
                    case 1:
482 terminx 806
                        i = ud.color;
471 terminx 807
                        if (x == io)
808
                        {
809
                            ud.color++;
810
                            if (ud.color > 23)
811
                                ud.color = 0;
482 terminx 812
                            check_player_color((int *)&ud.color,-1);
471 terminx 813
                        }
814
                        modval(0,23,(int *)&ud.color,1,probey==1);
482 terminx 815
                        check_player_color((int *)&ud.color,i);
471 terminx 816
                        if (ud.color != i)
482 terminx 817
                            updateplayer();
471 terminx 818
                        break;
268 terminx 819
 
471 terminx 820
                    case 2:
821
                        i = ud.team;
822
                        if (x == io)
823
                        {
824
                            ud.team++;
825
                            if (ud.team == 4)
826
                                ud.team = 0;
482 terminx 827
                        }
471 terminx 828
                        modval(0,3,(int *)&ud.team,1,probey==2);
829
                        if (ud.team != i)
830
                            updateplayer();
831
                        break;
53 terminx 832
 
471 terminx 833
                    case 3:
563 terminx 834
                        i = ud.config.AutoAim;
471 terminx 835
                        if (x == io)
563 terminx 836
                            ud.config.AutoAim = (ud.config.AutoAim == 2) ? 0 : ud.config.AutoAim+1;
837
                        modval(0,2,(int *)&ud.config.AutoAim,1,probey==3);
838
                        if (ud.config.AutoAim != i)
471 terminx 839
                            updateplayer();
840
                        break;
841
 
842
                    case 4:
843
                        i = ud.mouseaiming;
844
                        if (x == io)
845
                            ud.mouseaiming = !ud.mouseaiming;
846
                        modval(0,1,(int *)&ud.mouseaiming,1,probey==4);
847
                        if (ud.mouseaiming != i)
848
                            updateplayer();
849
                        break;
482 terminx 850
 
471 terminx 851
                    case 5:
852
                        i = 0;
853
                        if (ud.weaponswitch & 1)
854
                            i = 1;
855
                        if (x == io)
856
                            i = 1-i;
857
                        modval(0,1,(int *)&i,1,probey==5);
858
                        if ((ud.weaponswitch & 1 && !i) || (!(ud.weaponswitch & 1) && i))
859
                        {
860
                            ud.weaponswitch ^= 1;
861
                            updateplayer();
862
                        }
863
                        break;
864
                    case 6:
865
                        i = 0;
866
                        if (ud.weaponswitch & 2)
867
                            i = 1;
868
                        if (x == io)
869
                            i = 1-i;
870
                        modval(0,1,(int *)&i,1,probey==6);
871
                        if ((ud.weaponswitch & 2 && !i) || (!(ud.weaponswitch & 2) && i))
872
                        {
873
                            ud.weaponswitch ^= 2;
874
                            updateplayer();
482 terminx 875
                        }
471 terminx 876
                        break;
877
                    case 7:
878
                        if (x == io)
509 terminx 879
                            packetrate = min(max(((packetrate/50)*50)+50,50),1000);
880
                        modval(50,1000,(int *)&packetrate,10,probey==7?2:0);
881
                        break;
882
                    case 8:
883
                        if (x == io)
471 terminx 884
                        {
885
                            cmenu(20004);
886
                        }
887
                        break;
888
 
889
                    default:
890
                        break;
891
                    }
892
                    io++;
893
                }
57 terminx 894
            }
471 terminx 895
            else
896
            {
472 terminx 897
                x = strget(d-50,37,buf,30,0);
337 terminx 898
 
471 terminx 899
                while (Bstrlen(stripcolorcodes(buf)) > 10)
900
                {
901
                    buf[Bstrlen(buf)-1] = '\0';
902
                    inputloc--;
903
                }
904
 
905
                if (x)
906
                {
907
                    if (x == 1)
908
                    {
909
                        if (buf[0] && Bstrcmp(myname,buf))
910
                        {
911
                            Bstrcpy(myname,buf);
912
                            updateplayer();
913
                        }
914
                        // send name update
915
                    }
916
                    KB_ClearKeyDown(sc_Enter);
917
                    KB_ClearKeyDown(sc_kpad_Enter);
918
                    KB_FlushKeyboardQueue();
919
 
920
                    current_menu = 20002;
921
                }
337 terminx 922
            }
151 terminx 923
 
471 terminx 924
            yy = 37;
337 terminx 925
            {
471 terminx 926
                for (ii=io=0; opts[ii]; ii++)
335 terminx 927
                {
471 terminx 928
                    if (opts[ii][0] == '-' && !opts[ii][1])
335 terminx 929
                    {
471 terminx 930
                        yy += 4;
931
                        continue;
101 terminx 932
                    }
471 terminx 933
                    enabled = 1;
934
                    switch (io)
935
                    {
936
                    case 0:
937
                        if (current_menu == 20002)
938
                        {
939
                            gametext(d-50,yy,myname,MENUHIGHLIGHT(io),2+8+16);
940
                        }
941
                        break;
335 terminx 942
 
471 terminx 943
                    case 1:
726 terminx 944
                    {
945
                        char *s[] = { "Auto","","","","","","","","","Blue","Red","Green","Gray","Dark gray","Dark green","Brown",
946
                                      "Dark blue","","","","","Bright red","","Yellow","",""
947
                                    };
948
                        gametext(d-50,yy,s[ud.color],MENUHIGHLIGHT(io),2+8+16);
949
                    }
950
                    break;
5 Plagman 951
 
471 terminx 952
                    case 2:
726 terminx 953
                    {
954
                        char *s[] = { "Blue", "Red", "Green", "Gray" };
955
                        gametext(d-50,yy,s[ud.team],MENUHIGHLIGHT(io),2+8+16);
956
                    }
957
                    break;
5 Plagman 958
 
471 terminx 959
                    case 3:
726 terminx 960
                    {
961
                        char *s[] = { "Off", "All weapons", "Hitscan only" };
962
                        gametext(d-50,yy,s[ud.config.AutoAim],MENUHIGHLIGHT(io),2+8+16);
963
                    }
964
                    break;
53 terminx 965
 
471 terminx 966
                    case 4:
967
                        gametext(d-50,yy,ud.mouseaiming?"Hold button":"Toggle on/off",MENUHIGHLIGHT(io),2+8+16);
968
                        break;
54 terminx 969
 
471 terminx 970
                    case 5:
472 terminx 971
                        gametext(d+70,yy,ud.weaponswitch&1?"On":"Off",MENUHIGHLIGHT(io),2+8+16);
471 terminx 972
                        break;
482 terminx 973
 
471 terminx 974
                    case 6:
472 terminx 975
                        gametext(d+70,yy,ud.weaponswitch&2?"On":"Off",MENUHIGHLIGHT(io),2+8+16);
471 terminx 976
                        break;
509 terminx 977
                    case 7:
978
                        Bsprintf(tempbuf,"%d",packetrate);
979
                        gametext(d+70,yy,tempbuf,MENUHIGHLIGHT(io),2+8+16);
980
                        break;
471 terminx 981
                    default:
982
                        break;
983
                    }
482 terminx 984
                    gametextpal(c,yy, opts[ii], enabled?MENUHIGHLIGHT(io):DISABLEDMENUSHADE, 10);
471 terminx 985
                    io++;
986
                    yy += 8;
987
                }
988
            }
5 Plagman 989
 
471 terminx 990
            break;
991
        }
337 terminx 992
    case 20004:
993
    case 20005:
994
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
474 terminx 995
        menutext(160,24,0,0,"MULTIPLAYER MACROS");
88 terminx 996
 
337 terminx 997
        if (current_menu == 20004)
998
        {
999
            x = probesm(24,45,8,10);
1000
            if (x == -1)
88 terminx 1001
            {
337 terminx 1002
                cmenu(20002);
509 terminx 1003
                probey = 8;
88 terminx 1004
            }
337 terminx 1005
            else if (x >= 0 && x <= 9)
88 terminx 1006
            {
337 terminx 1007
                strcpy(buf, ud.ridecule[x]);
1008
                inputloc = strlen(buf);
482 terminx 1009
                last_menu_pos = probey;
337 terminx 1010
                current_menu = 20005;
1011
                KB_ClearKeyDown(sc_Enter);
1012
                KB_ClearKeyDown(sc_kpad_Enter);
1013
                KB_FlushKeyboardQueue();
1014
            }
1015
        }
1016
        else
1017
        {
1018
            x = strget(26,40+(8*probey),buf,34,0);
1019
            if (x)
1020
            {
1021
                if (x == 1)
335 terminx 1022
                {
482 terminx 1023
                    Bstrcpy(ud.ridecule[last_menu_pos],buf);
88 terminx 1024
                }
337 terminx 1025
                KB_ClearKeyDown(sc_Enter);
1026
                KB_ClearKeyDown(sc_kpad_Enter);
1027
                KB_FlushKeyboardQueue();
1028
                current_menu = 20004;
88 terminx 1029
            }
337 terminx 1030
        }
1031
        for (i=0;i<10;i++)
1032
        {
482 terminx 1033
            if (current_menu == 20005 && i == last_menu_pos) continue;
337 terminx 1034
            gametextpal(26,40+(i<<3),ud.ridecule[i],MENUHIGHLIGHT(i),0);
1035
        }
91 terminx 1036
 
482 terminx 1037
        gametext(160,144,"ACTIVATE IN-GAME WITH SHIFT-F#",0,2+8+16);
91 terminx 1038
 
337 terminx 1039
        break;
88 terminx 1040
 
383 terminx 1041
#if 0
337 terminx 1042
    case 20010:
1043
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1044
        menutext(160,24,0,0,"HOST NETWORK GAME");
5 Plagman 1045
 
337 terminx 1046
        x = probe(46,50,80,2);
5 Plagman 1047
 
337 terminx 1048
        if (x == -1)
1049
        {
1050
            cmenu(20001);
1051
            probey = 2;
1052
        }
1053
        else if (x == 0) cmenu(20011);
5 Plagman 1054
 
337 terminx 1055
        menutext(40,50,0,0,        "GAME OPTIONS");
1056
        minitext(90,60,            "GAME TYPE"    ,2,26);
1057
        minitext(90,60+8,          "EPISODE"      ,2,26);
1058
        minitext(90,60+8+8,        "LEVEL"        ,2,26);
1059
        minitext(90,60+8+8+8,      "MONSTERS"     ,2,26);
1060
        if (ud.m_coop == 0)
1061
            minitext(90,60+8+8+8+8,    "MARKERS"      ,2,26);
1062
        else if (ud.m_coop == 1)
1063
            minitext(90,60+8+8+8+8,    "FRIENDLY FIRE",2,26);
1064
        minitext(90,60+8+8+8+8+8,  "USER MAP"     ,2,26);
5 Plagman 1065
 
337 terminx 1066
        gametext(90+60,60,gametype_names[ud.m_coop],0,26);
5 Plagman 1067
 
337 terminx 1068
        minitext(90+60,60+8,      volume_names[ud.m_volume_number],0,26);
381 terminx 1069
        minitext(90+60,60+8+8,    level_names[MAXLEVELS*ud.m_volume_number+ud.m_level_number],0,26);
337 terminx 1070
        if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
1071
            minitext(90+60,60+8+8+8,  skill_names[ud.m_player_skill],0,26);
1072
        else minitext(90+60,60+8+8+8,  "NONE",0,28);
1073
        if (ud.m_coop == 0)
1074
        {
1075
            if (ud.m_marker) minitext(90+60,60+8+8+8+8,"ON",0,26);
1076
            else minitext(90+60,60+8+8+8+8,"OFF",0,26);
1077
        }
1078
        else if (ud.m_coop == 1)
1079
        {
1080
            if (ud.m_ffire) minitext(90+60,60+8+8+8+8,"ON",0,26);
1081
            else minitext(90+60,60+8+8+8+8,"OFF",0,26);
1082
        }
1083
 
1084
        menutext(40,50+80,0,0,"LAUNCH GAME");
1085
        break;
1086
 
1087
    case 20011:
1088
        c = (320>>1) - 120;
1089
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1090
        menutext(160,24,0,0,"NET GAME OPTIONS");
1091
 
1092
        x = probe(c,57-8,16,8);
1093
 
1094
        switch (x)
1095
        {
1096
        case -1:
1097
            cmenu(20010);
1098
            break;
1099
        case 0:
1100
            ud.m_coop++;
1101
            if (ud.m_coop == 3) ud.m_coop = 0;
1102
            break;
1103
        case 1:
1104
            if (!VOLUMEONE)
335 terminx 1105
            {
337 terminx 1106
                ud.m_volume_number++;
1107
                if (ud.m_volume_number == num_volumes) ud.m_volume_number = 0;
1108
                if (ud.m_volume_number == 0 && ud.m_level_number > 6)
1109
                    ud.m_level_number = 0;
1110
                if (ud.m_level_number > 10) ud.m_level_number = 0;
335 terminx 1111
            }
337 terminx 1112
            break;
1113
        case 2:
1114
            ud.m_level_number++;
1115
            if (!VOLUMEONE)
335 terminx 1116
            {
337 terminx 1117
                if (ud.m_volume_number == 0 && ud.m_level_number > 6)
1118
                    ud.m_level_number = 0;
335 terminx 1119
            }
337 terminx 1120
            else
1121
            {
1122
                if (ud.m_volume_number == 0 && ud.m_level_number > 5)
1123
                    ud.m_level_number = 0;
1124
            }
1125
            if (ud.m_level_number > 10) ud.m_level_number = 0;
1126
            break;
1127
        case 3:
1128
            if (ud.m_monsters_off == 1 && ud.m_player_skill > 0)
1129
                ud.m_monsters_off = 0;
5 Plagman 1130
 
337 terminx 1131
            if (ud.m_monsters_off == 0)
1132
            {
1133
                ud.m_player_skill++;
1134
                if (ud.m_player_skill > 3)
1135
                {
1136
                    ud.m_player_skill = 0;
1137
                    ud.m_monsters_off = 1;
1138
                }
1139
            }
1140
            else ud.m_monsters_off = 0;
1141
 
335 terminx 1142
            break;
5 Plagman 1143
 
337 terminx 1144
        case 4:
1145
            if (ud.m_coop == 0)
1146
                ud.m_marker = !ud.m_marker;
1147
            break;
5 Plagman 1148
 
337 terminx 1149
        case 5:
1150
            if (ud.m_coop == 1)
1151
                ud.m_ffire = !ud.m_ffire;
1152
            break;
5 Plagman 1153
 
337 terminx 1154
        case 6:
1155
            // pick the user map
1156
            break;
5 Plagman 1157
 
337 terminx 1158
        case 7:
1159
            cmenu(20010);
1160
            break;
1161
        }
5 Plagman 1162
 
337 terminx 1163
        c += 40;
5 Plagman 1164
 
337 terminx 1165
        //         if(ud.m_coop==1) gametext(c+70,57-7-9,"COOPERATIVE PLAY",0,2+8+16);
1166
        //         else if(ud.m_coop==2) gametext(c+70,57-7-9,"DUKEMATCH (NO SPAWN)",0,2+8+16);
1167
        //         else gametext(c+70,57-7-9,"DUKEMATCH (SPAWN)",0,2+8+16);
1168
        gametext(c+70,57-7-9,gametype_names[ud.m_coop],0,26);
5 Plagman 1169
 
337 terminx 1170
        gametext(c+70,57+16-7-9,volume_names[ud.m_volume_number],0,2+8+16);
5 Plagman 1171
 
381 terminx 1172
        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 1173
 
337 terminx 1174
        if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
1175
            gametext(c+70,57+16+16+16-7-9,skill_names[ud.m_player_skill],0,2+8+16);
1176
        else gametext(c+70,57+16+16+16-7-9,"NONE",0,2+8+16);
5 Plagman 1177
 
337 terminx 1178
        if (ud.m_coop == 0)
1179
        {
1180
            if (ud.m_marker)
1181
                gametext(c+70,57+16+16+16+16-7-9,"ON",0,2+8+16);
1182
            else gametext(c+70,57+16+16+16+16-7-9,"OFF",0,2+8+16);
1183
        }
5 Plagman 1184
 
337 terminx 1185
        if (ud.m_coop == 1)
1186
        {
1187
            if (ud.m_ffire)
1188
                gametext(c+70,57+16+16+16+16+16-7-9,"ON",0,2+8+16);
1189
            else gametext(c+70,57+16+16+16+16+16-7-9,"OFF",0,2+8+16);
1190
        }
5 Plagman 1191
 
337 terminx 1192
        c -= 44;
5 Plagman 1193
 
337 terminx 1194
        menutext(c,57-9,MENUHIGHLIGHT(0),PHX(-2),"GAME TYPE");
5 Plagman 1195
 
584 terminx 1196
        sprintf(tempbuf,"EPISODE %d",ud.m_volume_number+1);
337 terminx 1197
        menutext(c,57+16-9,MENUHIGHLIGHT(1),PHX(-3),tempbuf);
5 Plagman 1198
 
584 terminx 1199
        sprintf(tempbuf,"LEVEL %d",ud.m_level_number+1);
337 terminx 1200
        menutext(c,57+16+16-9,MENUHIGHLIGHT(2),PHX(-4),tempbuf);
5 Plagman 1201
 
337 terminx 1202
        menutext(c,57+16+16+16-9,MENUHIGHLIGHT(3),PHX(-5),"MONSTERS");
5 Plagman 1203
 
337 terminx 1204
        if (ud.m_coop == 0)
1205
            menutext(c,57+16+16+16+16-9,MENUHIGHLIGHT(4),PHX(-6),"MARKERS");
1206
        else
1207
            menutext(c,57+16+16+16+16-9,MENUHIGHLIGHT(4),1,"MARKERS");
5 Plagman 1208
 
337 terminx 1209
        if (ud.m_coop == 1)
1210
            menutext(c,57+16+16+16+16+16-9,MENUHIGHLIGHT(5),PHX(-6),"FR. FIRE");
1211
        else menutext(c,57+16+16+16+16+16-9,MENUHIGHLIGHT(5),1,"FR. FIRE");
5 Plagman 1212
 
337 terminx 1213
        if (VOLUMEALL)
1214
        {
1215
            menutext(c,57+16+16+16+16+16+16-9,MENUHIGHLIGHT(6),boardfilename[0] == 0,"USER MAP");
1216
            if (boardfilename[0] != 0)
1217
                gametext(c+70+44,57+16+16+16+16+16,boardfilename,0,2+8+16);
1218
        }
1219
        else
1220
        {
1221
            menutext(c,57+16+16+16+16+16+16-9,MENUHIGHLIGHT(6),1,"USER MAP");
1222
        }
5 Plagman 1223
 
337 terminx 1224
        menutext(c,57+16+16+16+16+16+16+16-9,MENUHIGHLIGHT(7),PHX(-8),"ACCEPT");
1225
        break;
5 Plagman 1226
 
337 terminx 1227
    case 20020:
1228
    case 20021: // editing server
1229
    case 20022: // editing port
1230
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1231
        menutext(160,24,0,0,"JOIN NETWORK GAME");
5 Plagman 1232
 
337 terminx 1233
        if (current_menu == 20020)
1234
        {
1235
            x = probe(46,50,20,3);
5 Plagman 1236
 
337 terminx 1237
            if (x == -1)
335 terminx 1238
            {
337 terminx 1239
                cmenu(20001);
1240
                probey = 1;
335 terminx 1241
            }
337 terminx 1242
            else if (x == 0)
335 terminx 1243
            {
337 terminx 1244
                strcpy(buf, "localhost");
1245
                inputloc = strlen(buf);
1246
                current_menu = 20021;
335 terminx 1247
            }
337 terminx 1248
            else if (x == 1)
335 terminx 1249
            {
337 terminx 1250
                strcpy(buf, "19014");
1251
                inputloc = strlen(buf);
1252
                current_menu = 20022;
1253
            }
1254
            else if (x == 2)
559 terminx 1255
                {}
337 terminx 1256
            KB_ClearKeyDown(sc_Enter);
1257
            KB_ClearKeyDown(sc_kpad_Enter);
1258
            KB_FlushKeyboardQueue();
1259
        }
1260
        else if (current_menu == 20021)
1261
        {
1262
            x = strget(40+100,50-9,buf,31,0);
1263
            if (x)
1264
            {
1265
                if (x == 1)
335 terminx 1266
                {
337 terminx 1267
                    //strcpy(myname,buf);
5 Plagman 1268
                }
337 terminx 1269
 
5 Plagman 1270
                KB_ClearKeyDown(sc_Enter);
1271
                KB_ClearKeyDown(sc_kpad_Enter);
1272
                KB_FlushKeyboardQueue();
337 terminx 1273
 
1274
                current_menu = 20020;
335 terminx 1275
            }
337 terminx 1276
        }
1277
        else if (current_menu == 20022)
1278
        {
1279
            x = strget(40+100,50+20-9,buf,5,997);
1280
            if (x)
335 terminx 1281
            {
337 terminx 1282
                if (x == 1)
335 terminx 1283
                {
337 terminx 1284
                    //strcpy(myname,buf);
335 terminx 1285
                }
5 Plagman 1286
 
337 terminx 1287
                KB_ClearKeyDown(sc_Enter);
1288
                KB_ClearKeyDown(sc_kpad_Enter);
1289
                KB_FlushKeyboardQueue();
5 Plagman 1290
 
337 terminx 1291
                current_menu = 20020;
5 Plagman 1292
            }
337 terminx 1293
        }
5 Plagman 1294
 
337 terminx 1295
        menutext(40,50,0,0,"SERVER");
1296
        if (current_menu != 20021) gametext(40+100,50-9,"server",0,2+8+16);
5 Plagman 1297
 
337 terminx 1298
        menutext(40,50+20,0,0,"PORT");
1299
        if (current_menu != 20022)
1300
        {
1301
            sprintf(tempbuf,"%d",19014);
1302
            gametext(40+100,50+20-9,tempbuf,0,2+8+16);
1303
        }
5 Plagman 1304
 
337 terminx 1305
        menutext(160,50+20+20,0,0,"CONNECT");
5 Plagman 1306
 
1307
 
337 terminx 1308
        // ADDRESS
1309
        // PORT
1310
        // CONNECT
1311
        break;
383 terminx 1312
#endif
337 terminx 1313
    case 15001:
1314
    case 15000:
5 Plagman 1315
 
337 terminx 1316
        gametext(160,90,"LOAD last game:",0,2+8+16);
5 Plagman 1317
 
337 terminx 1318
        sprintf(tempbuf,"\"%s\"",ud.savegame[lastsavedpos]);
1319
        gametext(160,99,tempbuf,0,2+8+16);
5 Plagman 1320
 
337 terminx 1321
        gametext(160,99+9,"(Y/N)",0,2+8+16);
5 Plagman 1322
 
337 terminx 1323
        if (KB_KeyPressed(sc_Escape) || KB_KeyPressed(sc_N) || RMB)
1324
        {
564 terminx 1325
            if (sprite[g_player[myconnectindex].ps->i].extra <= 0)
5 Plagman 1326
            {
337 terminx 1327
                if (enterlevel(MODE_GAME)) backtomenu();
1328
                return;
1329
            }
5 Plagman 1330
 
337 terminx 1331
            KB_ClearKeyDown(sc_N);
1332
            KB_ClearKeyDown(sc_Escape);
5 Plagman 1333
 
564 terminx 1334
            g_player[myconnectindex].ps->gm &= ~MODE_MENU;
337 terminx 1335
            if (ud.multimode < 2 && ud.recstat != 2)
1336
            {
1337
                ready2send = 1;
1338
                totalclock = ototalclock;
5 Plagman 1339
            }
337 terminx 1340
        }
5 Plagman 1341
 
337 terminx 1342
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1343
        {
1344
            KB_FlushKeyboardQueue();
1345
            KB_ClearKeysDown();
1346
            FX_StopAllSounds();
1347
 
1348
            if (ud.multimode > 1)
335 terminx 1349
            {
337 terminx 1350
                loadplayer(-1-lastsavedpos);
564 terminx 1351
                g_player[myconnectindex].ps->gm = MODE_GAME;
337 terminx 1352
            }
1353
            else
1354
            {
1355
                c = loadplayer(lastsavedpos);
1356
                if (c == 0)
564 terminx 1357
                    g_player[myconnectindex].ps->gm = MODE_GAME;
5 Plagman 1358
            }
337 terminx 1359
        }
5 Plagman 1360
 
337 terminx 1361
        probe(186,124+9,0,0);
5 Plagman 1362
 
337 terminx 1363
        break;
1364
 
1365
    case 10000:
1366
    case 10001:
1367
 
1368
        c = 60;
1369
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1370
        menutext(160,24,0,0,"ADULT MODE");
1371
 
1372
        x = probe(60,50+16,16,2);
1373
        if (x == -1)
1374
        {
1375
            cmenu(201);
1376
            probey = 0;
335 terminx 1377
            break;
337 terminx 1378
        }
5 Plagman 1379
 
337 terminx 1380
        menutext(c,50+16,MENUHIGHLIGHT(0),PHX(-2),"ADULT MODE");
1381
        menutext(c,50+16+16,MENUHIGHLIGHT(1),PHX(-3),"ENTER PASSWORD");
5 Plagman 1382
 
337 terminx 1383
        menutext(c+160+40,50+16,MENUHIGHLIGHT(0),0,ud.lockout?"OFF":"ON");
5 Plagman 1384
 
337 terminx 1385
        if (current_menu == 10001)
1386
        {
1387
            gametext(160,50+16+16+16+16-12,"ENTER PASSWORD",0,2+8+16);
1388
            x = strget((320>>1),50+16+16+16+16,buf,19, 998);
1389
 
1390
            if (x)
335 terminx 1391
            {
337 terminx 1392
                if (ud.pwlockout[0] == 0 || ud.lockout == 0)
1393
                    strcpy(&ud.pwlockout[0],buf);
1394
                else if (strcmp(buf,&ud.pwlockout[0]) == 0)
1395
                {
1396
                    ud.lockout = 0;
1397
                    buf[0] = 0;
5 Plagman 1398
 
337 terminx 1399
                    for (x=0;x<numanimwalls;x++)
1400
                        if (wall[animwall[x].wallnum].picnum != W_SCREENBREAK &&
1401
                                wall[animwall[x].wallnum].picnum != W_SCREENBREAK+1 &&
1402
                                wall[animwall[x].wallnum].picnum != W_SCREENBREAK+2)
1403
                            if (wall[animwall[x].wallnum].extra >= 0)
1404
                                wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
5 Plagman 1405
 
337 terminx 1406
                }
1407
                current_menu = 10000;
1408
                KB_ClearKeyDown(sc_Enter);
1409
                KB_ClearKeyDown(sc_kpad_Enter);
1410
                KB_FlushKeyboardQueue();
1411
            }
1412
        }
1413
        else
1414
        {
1415
            if (x == 0)
5 Plagman 1416
            {
337 terminx 1417
                if (ud.lockout == 1)
5 Plagman 1418
                {
337 terminx 1419
                    if (ud.pwlockout[0] == 0)
5 Plagman 1420
                    {
1421
                        ud.lockout = 0;
331 terminx 1422
                        for (x=0;x<numanimwalls;x++)
333 terminx 1423
                            if (wall[animwall[x].wallnum].picnum != W_SCREENBREAK &&
5 Plagman 1424
                                    wall[animwall[x].wallnum].picnum != W_SCREENBREAK+1 &&
333 terminx 1425
                                    wall[animwall[x].wallnum].picnum != W_SCREENBREAK+2)
1426
                                if (wall[animwall[x].wallnum].extra >= 0)
5 Plagman 1427
                                    wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
1428
                    }
1429
                    else
1430
                    {
337 terminx 1431
                        buf[0] = 0;
1432
                        current_menu = 10001;
1433
                        inputloc = 0;
1434
                        KB_FlushKeyboardQueue();
5 Plagman 1435
                    }
1436
                }
337 terminx 1437
                else
1438
                {
1439
                    ud.lockout = 1;
335 terminx 1440
 
337 terminx 1441
                    for (x=0;x<numanimwalls;x++)
1442
                        switch (dynamictostatic[wall[animwall[x].wallnum].picnum])
1443
                        {
1444
                        case FEMPIC1__STATIC:
1445
                            wall[animwall[x].wallnum].picnum = BLANKSCREEN;
1446
                            break;
1447
                        case FEMPIC2__STATIC:
1448
                        case FEMPIC3__STATIC:
1449
                            wall[animwall[x].wallnum].picnum = SCREENBREAK6;
1450
                            break;
1451
                        }
5 Plagman 1452
                }
1453
            }
1454
 
337 terminx 1455
            else if (x == 1)
1456
            {
1457
                current_menu = 10001;
1458
                inputloc = 0;
1459
                KB_FlushKeyboardQueue();
1460
            }
1461
        }
5 Plagman 1462
 
337 terminx 1463
        break;
5 Plagman 1464
 
337 terminx 1465
    case 1000:
1466
    case 1001:
1467
    case 1002:
1468
    case 1003:
1469
    case 1004:
1470
    case 1005:
1471
    case 1006:
1472
    case 1007:
1473
    case 1008:
1474
    case 1009:
5 Plagman 1475
 
337 terminx 1476
        rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
1477
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1478
        menutext(160,24,0,0,"LOAD GAME");
1479
        rotatesprite(101<<16,97<<16,65536>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
5 Plagman 1480
 
337 terminx 1481
        dispnames();
5 Plagman 1482
 
584 terminx 1483
        sprintf(tempbuf,"PLAYERS: %-2d                      ",savehead.numplr);
337 terminx 1484
        gametext(160,156,tempbuf,0,2+8+16);
5 Plagman 1485
 
584 terminx 1486
        sprintf(tempbuf,"EPISODE: %-2d / LEVEL: %-2d / SKILL: %-2d",1+savehead.volnum,1+savehead.levnum,savehead.plrskl);
337 terminx 1487
        gametext(160,168,tempbuf,0,2+8+16);
5 Plagman 1488
 
337 terminx 1489
        if (savehead.volnum == 0 && savehead.levnum == 7)
1490
            gametext(160,180,savehead.boardfn,0,2+8+16);
5 Plagman 1491
 
337 terminx 1492
        gametext(160,90,"LOAD game:",0,2+8+16);
1493
        sprintf(tempbuf,"\"%s\"",ud.savegame[current_menu-1000]);
1494
        gametext(160,99,tempbuf,0,2+8+16);
1495
        gametext(160,99+9,"(Y/N)",0,2+8+16);
1496
 
1497
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1498
        {
1499
            lastsavedpos = current_menu-1000;
1500
 
1501
            KB_FlushKeyboardQueue();
1502
            KB_ClearKeysDown();
1503
            if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 1504
            {
337 terminx 1505
                ready2send = 1;
1506
                totalclock = ototalclock;
1507
            }
5 Plagman 1508
 
337 terminx 1509
            if (ud.multimode > 1)
1510
            {
564 terminx 1511
                if (g_player[myconnectindex].ps->gm&MODE_GAME)
5 Plagman 1512
                {
337 terminx 1513
                    loadplayer(-1-lastsavedpos);
564 terminx 1514
                    g_player[myconnectindex].ps->gm = MODE_GAME;
5 Plagman 1515
                }
337 terminx 1516
                else
5 Plagman 1517
                {
337 terminx 1518
                    tempbuf[0] = 126;
1519
                    tempbuf[1] = lastsavedpos;
1520
                    tempbuf[2] = myconnectindex;
1521
                    for (x=connecthead;x>=0;x=connectpoint2[x])
5 Plagman 1522
                    {
337 terminx 1523
                        if (x != myconnectindex) sendpacket(x,tempbuf,3);
1524
                        if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
5 Plagman 1525
                    }
337 terminx 1526
                    getpackets();
5 Plagman 1527
 
337 terminx 1528
                    loadplayer(lastsavedpos);
5 Plagman 1529
 
337 terminx 1530
                    multiflag = 0;
5 Plagman 1531
                }
1532
            }
337 terminx 1533
            else
5 Plagman 1534
            {
337 terminx 1535
                c = loadplayer(lastsavedpos);
1536
                if (c == 0)
564 terminx 1537
                    g_player[myconnectindex].ps->gm = MODE_GAME;
5 Plagman 1538
            }
1539
 
1540
            break;
337 terminx 1541
        }
410 terminx 1542
 
428 terminx 1543
        probe(186,124+9,0,0);
1544
 
337 terminx 1545
        if (KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
1546
        {
1547
            KB_ClearKeyDown(sc_N);
1548
            KB_ClearKeyDown(sc_Escape);
1549
            sound(EXITMENUSOUND);
564 terminx 1550
            if (g_player[myconnectindex].ps->gm&MODE_GAME)
5 Plagman 1551
            {
564 terminx 1552
                g_player[myconnectindex].ps->gm &= ~MODE_MENU;
331 terminx 1553
                if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 1554
                {
1555
                    ready2send = 1;
1556
                    totalclock = ototalclock;
1557
                }
428 terminx 1558
            }
1559
            else
1560
            {
410 terminx 1561
                cmenu(300);
1562
                probey = last_threehundred;
5 Plagman 1563
            }
337 terminx 1564
        }
5 Plagman 1565
 
337 terminx 1566
        break;
1567
 
1568
    case 1500:
1569
 
1570
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1571
        {
1572
            KB_FlushKeyboardQueue();
1573
            cmenu(100);
1574
        }
1575
        if (KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
1576
        {
1577
            KB_ClearKeyDown(sc_N);
1578
            KB_ClearKeyDown(sc_Escape);
1579
            if (ud.multimode < 2 && ud.recstat != 2)
1580
            {
1581
                ready2send = 1;
1582
                totalclock = ototalclock;
1583
            }
564 terminx 1584
            g_player[myconnectindex].ps->gm &= ~MODE_MENU;
337 terminx 1585
            sound(EXITMENUSOUND);
335 terminx 1586
            break;
337 terminx 1587
        }
1588
        probe(186,124,0,0);
1589
        gametext(160,90,"ABORT this game?",0,2+8+16);
1590
        gametext(160,90+9,"(Y/N)",0,2+8+16);
5 Plagman 1591
 
337 terminx 1592
        break;
5 Plagman 1593
 
337 terminx 1594
    case 2000:
1595
    case 2001:
1596
    case 2002:
1597
    case 2003:
1598
    case 2004:
1599
    case 2005:
1600
    case 2006:
1601
    case 2007:
1602
    case 2008:
1603
    case 2009:
5 Plagman 1604
 
337 terminx 1605
        rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
1606
        rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1607
        menutext(160,24,0,0,"SAVE GAME");
5 Plagman 1608
 
337 terminx 1609
        rotatesprite(101<<16,97<<16,65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
584 terminx 1610
        sprintf(tempbuf,"PLAYERS: %-2d                      ",ud.multimode);
337 terminx 1611
        gametext(160,156,tempbuf,0,2+8+16);
5 Plagman 1612
 
584 terminx 1613
        sprintf(tempbuf,"EPISODE: %-2d / LEVEL: %-2d / SKILL: %-2d",1+ud.volume_number,1+ud.level_number,ud.player_skill);
337 terminx 1614
        gametext(160,168,tempbuf,0,2+8+16);
5 Plagman 1615
 
337 terminx 1616
        if (ud.volume_number == 0 && ud.level_number == 7)
1617
            gametext(160,180,boardfilename,0,2+8+16);
5 Plagman 1618
 
337 terminx 1619
        dispnames();
5 Plagman 1620
 
337 terminx 1621
        gametext(160,90,"OVERWRITE previous SAVED game?",0,2+8+16);
1622
        gametext(160,90+9,"(Y/N)",0,2+8+16);
5 Plagman 1623
 
337 terminx 1624
        if (KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB)
1625
        {
1626
            inputloc = strlen(&ud.savegame[current_menu-2000][0]);
5 Plagman 1627
 
337 terminx 1628
            cmenu(current_menu-2000+360);
5 Plagman 1629
 
337 terminx 1630
            KB_FlushKeyboardQueue();
5 Plagman 1631
            break;
337 terminx 1632
        }
1633
        if (KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
1634
        {
1635
            KB_ClearKeyDown(sc_N);
1636
            KB_ClearKeyDown(sc_Escape);
1637
            cmenu(351);
1638
            sound(EXITMENUSOUND);
1639
        }
5 Plagman 1640
 
337 terminx 1641
        probe(186,124,0,0);
5 Plagman 1642
 
337 terminx 1643
        break;
5 Plagman 1644
 
337 terminx 1645
    case 990:
1646
    case 991:
1647
    case 992:
1648
    case 993:
1649
    case 994:
1650
    case 995:
1651
    case 996:
1652
    case 997:
1653
    case 998:
1654
        c = 160;
1655
        if (!VOLUMEALL || !PLUTOPAK)
1656
        {
1657
            //rotatesprite(c<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
1658
            rotatesprite(c<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
1659
            menutext(c,24,0,0,current_menu == 998 ? "ABOUT EDUKE32" : "CREDITS");
5 Plagman 1660
 
337 terminx 1661
            l = 8;
1662
        }
1663
        else
1664
        {
1665
            l = 3;
1666
        }
5 Plagman 1667
 
337 terminx 1668
        if (KB_KeyPressed(sc_LeftArrow) ||
1669
                KB_KeyPressed(sc_kpad_4) ||
1670
                KB_KeyPressed(sc_UpArrow) ||
1671
                KB_KeyPressed(sc_PgUp) ||
411 terminx 1672
                KB_KeyPressed(sc_kpad_8) ||
1673
                WHEELUP)
337 terminx 1674
        {
1675
            KB_ClearKeyDown(sc_LeftArrow);
1676
            KB_ClearKeyDown(sc_kpad_4);
1677
            KB_ClearKeyDown(sc_UpArrow);
1678
            KB_ClearKeyDown(sc_PgUp);
1679
            KB_ClearKeyDown(sc_kpad_8);
1680
 
1681
            sound(KICK_HIT);
1682
            current_menu--;
1683
            if (current_menu < 990) current_menu = 990+l;
1684
        }
1685
        else if (
1686
            KB_KeyPressed(sc_PgDn) ||
1687
            KB_KeyPressed(sc_Enter) ||
1688
            KB_KeyPressed(sc_Space) ||
1689
            KB_KeyPressed(sc_kpad_Enter) ||
1690
            KB_KeyPressed(sc_RightArrow) ||
1691
            KB_KeyPressed(sc_DownArrow) ||
1692
            KB_KeyPressed(sc_kpad_2) ||
1693
            KB_KeyPressed(sc_kpad_9) ||
409 terminx 1694
            KB_KeyPressed(sc_kpad_6) ||
411 terminx 1695
            LMB || WHEELDOWN)
337 terminx 1696
        {
1697
            KB_ClearKeyDown(sc_PgDn);
1698
            KB_ClearKeyDown(sc_Enter);
1699
            KB_ClearKeyDown(sc_RightArrow);
1700
            KB_ClearKeyDown(sc_kpad_Enter);
1701
            KB_ClearKeyDown(sc_kpad_6);
1702
            KB_ClearKeyDown(sc_kpad_9);
1703
            KB_ClearKeyDown(sc_kpad_2);
1704
            KB_ClearKeyDown(sc_DownArrow);
1705
            KB_ClearKeyDown(sc_Space);
1706
            sound(KICK_HIT);
1707
            current_menu++;
1708
            if (current_menu > 990+l) current_menu = 990;
1709
        }
1710
 
482 terminx 1711
        x = probe(0,0,0,1);
1712
 
1713
        if (x == -1)
1714
        {
1715
            cmenu(0);
1716
            break;
1717
        }
1718
 
337 terminx 1719
        if (!VOLUMEALL || !PLUTOPAK)
1720
        {
1721
            switch (current_menu)
335 terminx 1722
            {
337 terminx 1723
            case 990:
1724
                gametext(c,40,                      "ORIGINAL CONCEPT",0,2+8+16);
1725
                gametext(c,40+9,                    "TODD REPLOGLE",0,2+8+16);
1726
                gametext(c,40+9+9,                  "ALLEN H. BLUM III",0,2+8+16);
5 Plagman 1727
 
337 terminx 1728
                gametext(c,40+9+9+9+9,              "PRODUCED & DIRECTED BY",0,2+8+16);
1729
                gametext(c,40+9+9+9+9+9,            "GREG MALONE",0,2+8+16);
5 Plagman 1730
 
337 terminx 1731
                gametext(c,40+9+9+9+9+9+9+9,        "EXECUTIVE PRODUCER",0,2+8+16);
1732
                gametext(c,40+9+9+9+9+9+9+9+9,      "GEORGE BROUSSARD",0,2+8+16);
5 Plagman 1733
 
337 terminx 1734
                gametext(c,40+9+9+9+9+9+9+9+9+9+9,  "BUILD ENGINE",0,2+8+16);
1735
                gametext(c,40+9+9+9+9+9+9+9+9+9+9+9,"KEN SILVERMAN",0,2+8+16);
1736
                break;
1737
            case 991:
1738
                gametext(c,40,                      "GAME PROGRAMMING",0,2+8+16);
1739
                gametext(c,40+9,                    "TODD REPLOGLE",0,2+8+16);
5 Plagman 1740
 
337 terminx 1741
                gametext(c,40+9+9+9,                "3D ENGINE/TOOLS/NET",0,2+8+16);
1742
                gametext(c,40+9+9+9+9,              "KEN SILVERMAN",0,2+8+16);
5 Plagman 1743
 
337 terminx 1744
                gametext(c,40+9+9+9+9+9+9,          "NETWORK LAYER/SETUP PROGRAM",0,2+8+16);
1745
                gametext(c,40+9+9+9+9+9+9+9,        "MARK DOCHTERMANN",0,2+8+16);
1746
                break;
1747
            case 992:
1748
                gametext(c,40,                      "MAP DESIGN",0,2+8+16);
1749
                gametext(c,40+9,                    "ALLEN H BLUM III",0,2+8+16);
1750
                gametext(c,40+9+9,                  "RICHARD GRAY",0,2+8+16);
5 Plagman 1751
 
337 terminx 1752
                gametext(c,40+9+9+9+9,              "3D MODELING",0,2+8+16);
1753
                gametext(c,40+9+9+9+9+9,            "CHUCK JONES",0,2+8+16);
1754
                gametext(c,40+9+9+9+9+9+9,          "SAPPHIRE CORPORATION",0,2+8+16);
5 Plagman 1755
 
337 terminx 1756
                gametext(c,40+9+9+9+9+9+9+9+9,      "ARTWORK",0,2+8+16);
1757
                gametext(c,40+9+9+9+9+9+9+9+9+9,    "DIRK JONES, STEPHEN HORNBACK",0,2+8+16);
1758
                gametext(c,40+9+9+9+9+9+9+9+9+9+9,  "JAMES STOREY, DAVID DEMARET",0,2+8+16);
1759
                gametext(c,40+9+9+9+9+9+9+9+9+9+9+9,"DOUGLAS R WOOD",0,2+8+16);
1760
                break;
1761
            case 993:
1762
                gametext(c,40,                      "SOUND ENGINE",0,2+8+16);
1763
                gametext(c,40+9,                    "JIM DOSE",0,2+8+16);
5 Plagman 1764
 
337 terminx 1765
                gametext(c,40+9+9+9,                "SOUND & MUSIC DEVELOPMENT",0,2+8+16);
1766
                gametext(c,40+9+9+9+9,              "ROBERT PRINCE",0,2+8+16);
1767
                gametext(c,40+9+9+9+9+9,            "LEE JACKSON",0,2+8+16);
5 Plagman 1768
 
337 terminx 1769
                gametext(c,40+9+9+9+9+9+9+9,        "VOICE TALENT",0,2+8+16);
1770
                gametext(c,40+9+9+9+9+9+9+9+9,      "LANI MINELLA - VOICE PRODUCER",0,2+8+16);
1771
                gametext(c,40+9+9+9+9+9+9+9+9+9,    "JON ST. JOHN AS \"DUKE NUKEM\"",0,2+8+16);
1772
                break;
1773
            case 994:
1774
                gametext(c,60,                      "GRAPHIC DESIGN",0,2+8+16);
1775
                gametext(c,60+9,                    "PACKAGING, MANUAL, ADS",0,2+8+16);
1776
                gametext(c,60+9+9,                  "ROBERT M. ATKINS",0,2+8+16);
1777
                gametext(c,60+9+9+9,                "MICHAEL HADWIN",0,2+8+16);
5 Plagman 1778
 
337 terminx 1779
                gametext(c,60+9+9+9+9+9,            "SPECIAL THANKS TO",0,2+8+16);
1780
                gametext(c,60+9+9+9+9+9+9,          "STEVEN BLACKBURN, TOM HALL",0,2+8+16);
1781
                gametext(c,60+9+9+9+9+9+9+9,        "SCOTT MILLER, JOE SIEGLER",0,2+8+16);
1782
                gametext(c,60+9+9+9+9+9+9+9+9,      "TERRY NAGY, COLLEEN COMPTON",0,2+8+16);
1783
                gametext(c,60+9+9+9+9+9+9+9+9+9,    "HASH INC., FORMGEN, INC.",0,2+8+16);
1784
                break;
1785
            case 995:
1786
                gametext(c,49,                      "THE 3D REALMS BETA TESTERS",0,2+8+16);
5 Plagman 1787
 
337 terminx 1788
                gametext(c,49+9+9,                  "NATHAN ANDERSON, WAYNE BENNER",0,2+8+16);
1789
                gametext(c,49+9+9+9,                "GLENN BRENSINGER, ROB BROWN",0,2+8+16);
1790
                gametext(c,49+9+9+9+9,              "ERIK HARRIS, KEN HECKBERT",0,2+8+16);
1791
                gametext(c,49+9+9+9+9+9,            "TERRY HERRIN, GREG HIVELY",0,2+8+16);
1792
                gametext(c,49+9+9+9+9+9+9,          "HANK LEUKART, ERIC BAKER",0,2+8+16);
1793
                gametext(c,49+9+9+9+9+9+9+9,        "JEFF RAUSCH, KELLY ROGERS",0,2+8+16);
1794
                gametext(c,49+9+9+9+9+9+9+9+9,      "MIKE DUNCAN, DOUG HOWELL",0,2+8+16);
1795
                gametext(c,49+9+9+9+9+9+9+9+9+9,    "BILL BLAIR",0,2+8+16);
1796
                break;
1797
            case 996:
1798
                gametext(c,32,                      "COMPANY PRODUCT SUPPORT",0,2+8+16);
5 Plagman 1799
 
337 terminx 1800
                gametext(c,32+9+9,                  "THE FOLLOWING COMPANIES WERE COOL",0,2+8+16);
1801
                gametext(c,32+9+9+9,                "ENOUGH TO GIVE US LOTS OF STUFF",0,2+8+16);
1802
                gametext(c,32+9+9+9+9,              "DURING THE MAKING OF DUKE NUKEM 3D.",0,2+8+16);
5 Plagman 1803
 
337 terminx 1804
                gametext(c,32+9+9+9+9+9+9,          "ALTEC LANSING MULTIMEDIA",0,2+8+16);
1805
                gametext(c,32+9+9+9+9+9+9+9,        "FOR TONS OF SPEAKERS AND THE",0,2+8+16);
1806
                gametext(c,32+9+9+9+9+9+9+9+9,      "THX-LICENSED SOUND SYSTEM",0,2+8+16);
1807
                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 1808
 
337 terminx 1809
                gametext(c,32+9+9+9+9+9+9+9+9+9+9+9,"CREATIVE LABS, INC.",0,2+8+16);
5 Plagman 1810
 
337 terminx 1811
                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);
1812
                break;
1813
            case 997:
1814
                gametext(c,50,                      "DUKE NUKEM IS A TRADEMARK OF",0,2+8+16);
1815
                gametext(c,50+9,                    "3D REALMS ENTERTAINMENT",0,2+8+16);
5 Plagman 1816
 
337 terminx 1817
                gametext(c,50+9+9+9,                "DUKE NUKEM",0,2+8+16);
1818
                gametext(c,50+9+9+9+9,              "(C) 1996 3D REALMS ENTERTAINMENT",0,2+8+16);
5 Plagman 1819
 
337 terminx 1820
                if (VOLUMEONE)
1821
                {
1822
                    gametext(c,106,                     "PLEASE READ LICENSE.DOC FOR SHAREWARE",0,2+8+16);
1823
                    gametext(c,106+9,                   "DISTRIBUTION GRANTS AND RESTRICTIONS",0,2+8+16);
1824
                }
5 Plagman 1825
 
337 terminx 1826
                gametext(c,VOLUMEONE?134:115,       "MADE IN DALLAS, TEXAS USA",0,2+8+16);
5 Plagman 1827
                break;
337 terminx 1828
            case 998:
1829
                l = 10;
1830
                goto cheat_for_port_credits;
5 Plagman 1831
            }
337 terminx 1832
            break;
1833
        }
5 Plagman 1834
 
337 terminx 1835
        // Plutonium pak menus
1836
        switch (current_menu)
1837
        {
1838
        case 990:
1839
        case 991:
1840
        case 992:
1841
            rotatesprite(160<<16,200<<15,65536L,0,2504+current_menu-990,0,0,10+64,0,0,xdim-1,ydim-1);
1842
            break;
1843
        case 993:   // JBF 20031220
1844
            rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,0,0,10+64,0,0,xdim-1,ydim-1);
1845
            rotatesprite(c<<16,19<<16,65536L,0,MENUBAR,0,0,10,0,0,xdim-1,ydim-1);
1846
            menutext(160,24,0,0,"ABOUT EDUKE32");
5 Plagman 1847
 
1848
cheat_for_port_credits:
561 terminx 1849
            if (g_ScriptVersion == 13) l = (-2);
337 terminx 1850
            gametext(160,38-l,"GAME PROGRAMMING",0,2+8+16);
1851
            p = "Richard \"TerminX\" Gobeille";
1852
            minitext(161-(Bstrlen(p)<<1), 39+10-l, p, 4, 10+16+128);
1853
            minitext(160-(Bstrlen(p)<<1), 38+10-l, p, 8, 10+16+128);
5 Plagman 1854
 
337 terminx 1855
            gametext(160,57-l,"\"JFDUKE3D\" AND \"JFBUILD\" CODE",0,2+8+16);
1856
            p = "Jonathon \"JonoF\" Fowler";
1857
            minitext(161-(Bstrlen(p)<<1), 58+10-l, p, 4, 10+16+128);
1858
            minitext(160-(Bstrlen(p)<<1), 57+10-l, p, 8, 10+16+128);
5 Plagman 1859
 
626 terminx 1860
            gametext(160,76-l,"BUILD ENGINE, \"POLYMOST\" RENDERER",0,2+8+16);
337 terminx 1861
            gametext(160,76+8-l,"NETWORKING, OTHER CODE",0,2+8+16);
1862
            p = "Ken \"Awesoken\" Silverman";
1863
            minitext(161-(Bstrlen(p)<<1), 77+8+10-l, p, 4, 10+16+128);
1864
            minitext(160-(Bstrlen(p)<<1), 76+8+10-l, p, 8, 10+16+128);
5 Plagman 1865
 
626 terminx 1866
            gametext(160,103-l,"ADDITIONAL RENDERING FEATURES",0,2+8+16);
337 terminx 1867
            p = "Pierre-Loup \"Plagman\" Griffais";
1868
            minitext(161-(Bstrlen(p)<<1), 104+10-l, p, 4, 10+16+128);
1869
            minitext(160-(Bstrlen(p)<<1), 103+10-l, p, 8, 10+16+128);
5 Plagman 1870
 
337 terminx 1871
            gametext(160,122-l,"LICENSE AND OTHER CONTRIBUTORS",0,2+8+16);
5 Plagman 1872
            {
337 terminx 1873
                const char *scroller[] =
559 terminx 1874
                {
1875
                    "This program is distributed under the terms of the",
1876
                    "GNU General Public License version 2 as published by the",
1877
                    "Free Software Foundation. See GNU.TXT for details.",
1878
                    "",
1879
                    "Thanks to the following people for their contributions:",
1880
                    "",
1881
                    "Adam Fazakerley",
1882
                    "Charlie Honig",
1883
                    "Ed Coolidge",
651 terminx 1884
                    "Hunter_rus",
559 terminx 1885
                    "James Bentler",
1886
                    "Javier Martinez",
1887
                    "Jeff Hart",
1888
                    "Jonathan Smith",
1889
                    "Jose del Castillo",
1890
                    "Lachlan McDonald",
1891
                    "Matthew Palmer",
749 terminx 1892
                    "Ozkan Sezer",
559 terminx 1893
                    "Peter Green",
749 terminx 1894
                    "Peter Veenstra",
1895
                    "Philipp Kutin",
559 terminx 1896
                    "Ryan Gordon",
749 terminx 1897
                    "Stephen Anthony",
559 terminx 1898
                    "",
1899
                    "EDuke originally by Matt Saettler",
1900
                    "",
1901
                    "--x--",
1902
                    "",
1903
                    "",
1904
                    "",
1905
                    "",
1906
                    "",
1907
                    ""
1908
                };
337 terminx 1909
                const int numlines = sizeof(scroller)/sizeof(char *);
1910
                for (m=0,i=(totalclock/104)%numlines; m<6; m++,i++)
335 terminx 1911
                {
337 terminx 1912
                    if (i==numlines) i=0;
1913
                    minitext(161-(Bstrlen(scroller[i])<<1), 101+10+10+8+4+(m*7)-l, (char*)scroller[i], 4, 10+16+128);
1914
                    minitext(160-(Bstrlen(scroller[i])<<1), 100+10+10+8+4+(m*7)-l, (char*)scroller[i], 8, 10+16+128);
335 terminx 1915
                }
1916
            }
5 Plagman 1917
 
337 terminx 1918
            p = "Visit www.eduke32.com for news and updates";
1919
            minitext(161-(Bstrlen(p)<<1), 136+10+10+10+10+4-l, p, 4, 10+16+128);
1920
            minitext(160-(Bstrlen(p)<<1), 135+10+10+10+10+4-l, p, 8, 10+16+128);
626 terminx 1921
            p = "See wiki.eduke32.com/stuff for new beta snapshots";
1922
            minitext(161-(Bstrlen(p)<<1), 143+10+10+10+10+4-l, p, 4, 10+16+128);
1923
            minitext(160-(Bstrlen(p)<<1), 142+10+10+10+10+4-l, p, 8, 10+16+128);
337 terminx 1924
        }
1925
        break;
335 terminx 1926
 
337 terminx 1927
    case 0:
1928
        c = (320>>1);
1929
        rotatesprite(c<<16,28<<16,65536L,0,INGAMEDUKETHREEDEE,0,0,10,0,0,xdim-1,ydim-1);
1930
        if (PLUTOPAK)   // JBF 20030804
1931
            rotatesprite((c+100)<<16,36<<16,65536L,0,PLUTOPAKSPRITE+2,(sintable[(totalclock<<4)&2047]>>11),0,2+8,0,0,xdim-1,ydim-1);
1932
        x = probe(c,67,16,6);
1933
        if (x >= 0)
1934
        {
1935
            if (ud.multimode > 1 && x == 0 && ud.recstat != 2)
5 Plagman 1936
            {
337 terminx 1937
                if (movesperpacket == 4 && myconnectindex != connecthead)
1938
                    break;
335 terminx 1939
 
337 terminx 1940
                last_zero = 0;
1941
                cmenu(600);
335 terminx 1942
            }
1943
            else
1944
            {
337 terminx 1945
                last_zero = x;
1946
                switch (x)
1947
                {
5 Plagman 1948
                case 0:
337 terminx 1949
                    cmenu(100);
5 Plagman 1950
                    break;
337 terminx 1951
                    //case 1: break;//cmenu(20001);break;   // JBF 20031128: I'm taking over the TEN menu option
331 terminx 1952
                case 1:
337 terminx 1953
                    cmenu(202);
1954
                    break;   // JBF 20031205: was 200
5 Plagman 1955
                case 2:
331 terminx 1956
                    if (movesperpacket == 4 && connecthead != myconnectindex)
5 Plagman 1957
                        break;
1958
                    cmenu(300);
1959
                    break;
331 terminx 1960
                case 3:
335 terminx 1961
                    KB_FlushKeyboardQueue();
1962
                    cmenu(400);
1963
                    break;
337 terminx 1964
                case 4:
1965
                    cmenu(990);
1966
                    break;
331 terminx 1967
                case 5:
335 terminx 1968
                    cmenu(500);
1969
                    break;
337 terminx 1970
                }
5 Plagman 1971
            }
337 terminx 1972
        }
5 Plagman 1973
 
337 terminx 1974
        if (KB_KeyPressed(sc_Q)) cmenu(500);
5 Plagman 1975
 
564 terminx 1976
        if (x == -1 && (g_player[myconnectindex].ps->gm&MODE_GAME || ud.recstat == 2))
337 terminx 1977
        {
564 terminx 1978
            g_player[myconnectindex].ps->gm &= ~MODE_MENU;
337 terminx 1979
            if (ud.multimode < 2 && ud.recstat != 2)
5 Plagman 1980
            {
337 terminx 1981
                ready2send = 1;
1982
                totalclock = ototalclock;
5 Plagman 1983
            }
337 terminx 1984
        }