Subversion Repositories eduke32

Rev

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