Subversion Repositories eduke32

Rev

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