Subversion Repositories eduke32

Rev

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