Subversion Repositories eduke32

Rev

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