Subversion Repositories eduke32

Rev

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

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