Subversion Repositories eduke32

Rev

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