Subversion Repositories eduke32

Rev

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