Subversion Repositories eduke32

Rev

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