Subversion Repositories eduke32

Rev

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