Subversion Repositories eduke32

Rev

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