Subversion Repositories eduke32

Rev

Rev 322 | Rev 333 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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