Subversion Repositories eduke32

Rev

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