Subversion Repositories eduke32

Rev

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