Subversion Repositories eduke32

Rev

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