Subversion Repositories eduke32

Rev

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