mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-26 11:40:44 +00:00
09f0c239b6
git-svn-id: https://svn.eduke32.com/eduke32@5 1a8010ca-5511-0410-912e-c29ae57300e0
4043 lines
143 KiB
C
4043 lines
143 KiB
C
//-------------------------------------------------------------------------
|
|
/*
|
|
Copyright (C) 2005 - EDuke32 team
|
|
|
|
This file is part of EDuke32
|
|
|
|
EDuke32 is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License version 2
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include "duke3d.h"
|
|
#include "mouse.h"
|
|
#include "osd.h"
|
|
#include <sys/stat.h>
|
|
|
|
extern char inputloc;
|
|
extern int recfilep;
|
|
//extern char vgacompatible;
|
|
short probey=0,lastprobey=0,last_menu,globalskillsound=-1;
|
|
short sh,onbar,buttonstat,deletespot;
|
|
short last_zero,last_fifty,last_onehundred,last_threehundred = 0;
|
|
|
|
static char fileselect = 1, menunamecnt, menuname[256][64], curpath[80], menupath[80];
|
|
|
|
static CACHE1D_FIND_REC *finddirs=NULL, *findfiles=NULL, *finddirshigh=NULL, *findfileshigh=NULL;
|
|
static int numdirs=0, numfiles=0;
|
|
static int currentlist=0;
|
|
|
|
static int function, whichkey;
|
|
static int changesmade, newvidmode, curvidmode, newfullscreen;
|
|
static int vidsets[16] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }, curvidset, newvidset = 0;
|
|
|
|
static char *mousebuttonnames[] = { "Left", "Right", "Middle", "Thumb", "Wheel Down", "Wheel Up" };
|
|
|
|
void cmenu(short cm)
|
|
{
|
|
current_menu = cm;
|
|
|
|
if( (cm >= 1000 && cm <= 1009) )
|
|
return;
|
|
|
|
if( cm == 0 )
|
|
probey = last_zero;
|
|
else if(cm == 50)
|
|
probey = last_fifty;
|
|
else if(cm == 100)
|
|
probey = last_onehundred;
|
|
else if(cm >= 300 && cm < 400)
|
|
probey = last_threehundred;
|
|
else if(cm == 110)
|
|
probey = 1;
|
|
else probey = 0;
|
|
lastprobey = -1;
|
|
}
|
|
|
|
void savetemp(char *fn,long daptr,long dasiz)
|
|
{
|
|
FILE *fp;
|
|
|
|
if ((fp = fopen(fn,"wb")) == (FILE *)NULL)
|
|
return;
|
|
|
|
fwrite((char *)daptr,dasiz,1,fp);
|
|
|
|
fclose(fp);
|
|
}
|
|
|
|
void getangplayers(short snum)
|
|
{
|
|
short i,a;
|
|
|
|
for(i=connecthead;i>=0;i=connectpoint2[i])
|
|
{
|
|
if(i != snum)
|
|
{
|
|
a = ps[snum].ang+getangle(ps[i].posx-ps[snum].posx,ps[i].posy-ps[snum].posy);
|
|
a = a-1024;
|
|
rotatesprite(
|
|
(320<<15) + (((sintable[(a+512)&2047])>>7)<<15),
|
|
(320<<15) - (((sintable[a&2047])>>8)<<15),
|
|
klabs(sintable[((a>>1)+768)&2047]<<2),0,APLAYER,0,ps[i].palookup,0,0,0,xdim-1,ydim-1);
|
|
}
|
|
}
|
|
}
|
|
|
|
#define LMB (buttonstat&1)
|
|
#define RMB (buttonstat&2)
|
|
|
|
ControlInfo minfo;
|
|
|
|
long mi;
|
|
|
|
static int probe_(int type,int x,int y,int i,int n)
|
|
{
|
|
short centre, s;
|
|
|
|
s = 1+(CONTROL_GetMouseSensitivity()>>4);
|
|
|
|
if( ControllerType == 1 && CONTROL_MousePresent )
|
|
{
|
|
CONTROL_GetInput( &minfo );
|
|
mi += minfo.dz;
|
|
}
|
|
|
|
else minfo.dz = minfo.dyaw = 0;
|
|
|
|
if( x == (320>>1) )
|
|
centre = 320>>2;
|
|
else centre = 0;
|
|
|
|
if(!buttonstat)
|
|
{
|
|
if( KB_KeyPressed( sc_UpArrow ) || KB_KeyPressed( sc_PgUp ) || KB_KeyPressed( sc_kpad_8 ) ||
|
|
mi < -8192 )
|
|
{
|
|
mi = 0;
|
|
KB_ClearKeyDown( sc_UpArrow );
|
|
KB_ClearKeyDown( sc_kpad_8 );
|
|
KB_ClearKeyDown( sc_PgUp );
|
|
sound(KICK_HIT);
|
|
|
|
probey--;
|
|
if(probey < 0) probey = n-1;
|
|
minfo.dz = 0;
|
|
}
|
|
if( KB_KeyPressed( sc_DownArrow ) || KB_KeyPressed( sc_PgDn ) || KB_KeyPressed( sc_kpad_2 )
|
|
|| mi > 8192 )
|
|
{
|
|
mi = 0;
|
|
KB_ClearKeyDown( sc_DownArrow );
|
|
KB_ClearKeyDown( sc_kpad_2 );
|
|
KB_ClearKeyDown( sc_PgDn );
|
|
sound(KICK_HIT);
|
|
probey++;
|
|
minfo.dz = 0;
|
|
}
|
|
}
|
|
|
|
if(probey >= n)
|
|
probey = 0;
|
|
|
|
if(centre)
|
|
{
|
|
// 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);
|
|
// 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);
|
|
|
|
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);
|
|
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);
|
|
}
|
|
else
|
|
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);
|
|
|
|
if( KB_KeyPressed(sc_Space) || KB_KeyPressed( sc_kpad_Enter ) || KB_KeyPressed( sc_Enter ) || (LMB && !onbar) )
|
|
{
|
|
if(current_menu != 110)
|
|
sound(PISTOL_BODYHIT);
|
|
KB_ClearKeyDown( sc_Enter );
|
|
KB_ClearKeyDown( sc_Space );
|
|
KB_ClearKeyDown( sc_kpad_Enter );
|
|
return(probey);
|
|
}
|
|
else if( KB_KeyPressed( sc_Escape ) || (RMB) )
|
|
{
|
|
onbar = 0;
|
|
KB_ClearKeyDown( sc_Escape );
|
|
sound(EXITMENUSOUND);
|
|
return(-1);
|
|
}
|
|
else
|
|
{
|
|
if(onbar == 0) return(-probey-2);
|
|
if ( KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) || ((buttonstat&1) && minfo.dyaw < -128 ) )
|
|
return(probey);
|
|
else if ( KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) || ((buttonstat&1) && minfo.dyaw > 128 ) )
|
|
return(probey);
|
|
else return(-probey-2);
|
|
}
|
|
}
|
|
int probe(int x,int y,int i,int n) { return probe_(0,x,y,i,n); }
|
|
int probesm(int x,int y,int i,int n) { return probe_(1,x,y,i,n); }
|
|
|
|
int menutext(int x,int y,short s,short p,char *t)
|
|
{
|
|
short i, ac, centre;
|
|
|
|
y -= 12;
|
|
|
|
i = centre = 0;
|
|
|
|
if( x == (320>>1) )
|
|
{
|
|
while( *(t+i) )
|
|
{
|
|
if(*(t+i) == ' ')
|
|
{
|
|
centre += 5;
|
|
i++;
|
|
continue;
|
|
}
|
|
ac = 0;
|
|
if(*(t+i) >= '0' && *(t+i) <= '9')
|
|
ac = *(t+i) - '0' + BIGALPHANUM-10;
|
|
else if(*(t+i) >= 'a' && *(t+i) <= 'z')
|
|
ac = toupper(*(t+i)) - 'A' + BIGALPHANUM;
|
|
else if(*(t+i) >= 'A' && *(t+i) <= 'Z')
|
|
ac = *(t+i) - 'A' + BIGALPHANUM;
|
|
else switch(*(t+i))
|
|
{
|
|
case '-':
|
|
ac = BIGALPHANUM-11;
|
|
break;
|
|
case '.':
|
|
ac = BIGPERIOD;
|
|
break;
|
|
case '\'':
|
|
ac = BIGAPPOS;
|
|
break;
|
|
case ',':
|
|
ac = BIGCOMMA;
|
|
break;
|
|
case '!':
|
|
ac = BIGX;
|
|
break;
|
|
case '?':
|
|
ac = BIGQ;
|
|
break;
|
|
case ';':
|
|
ac = BIGSEMI;
|
|
break;
|
|
case ':':
|
|
ac = BIGSEMI;
|
|
break;
|
|
default:
|
|
centre += 5;
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
centre += tilesizx[ac]-1;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
if(centre)
|
|
x = (320-centre-10)>>1;
|
|
|
|
while(*t)
|
|
{
|
|
if(*t == ' ') {x+=5;t++;continue;}
|
|
ac = 0;
|
|
if(*t >= '0' && *t <= '9')
|
|
ac = *t - '0' + BIGALPHANUM-10;
|
|
else if(*t >= 'a' && *t <= 'z')
|
|
ac = toupper(*t) - 'A' + BIGALPHANUM;
|
|
else if(*t >= 'A' && *t <= 'Z')
|
|
ac = *t - 'A' + BIGALPHANUM;
|
|
else switch(*t)
|
|
{
|
|
case '-':
|
|
ac = BIGALPHANUM-11;
|
|
break;
|
|
case '.':
|
|
ac = BIGPERIOD;
|
|
break;
|
|
case ',':
|
|
ac = BIGCOMMA;
|
|
break;
|
|
case '!':
|
|
ac = BIGX;
|
|
break;
|
|
case '\'':
|
|
ac = BIGAPPOS;
|
|
break;
|
|
case '?':
|
|
ac = BIGQ;
|
|
break;
|
|
case ';':
|
|
ac = BIGSEMI;
|
|
break;
|
|
case ':':
|
|
ac = BIGCOLIN;
|
|
break;
|
|
default:
|
|
x += 5;
|
|
t++;
|
|
continue;
|
|
}
|
|
|
|
rotatesprite(x<<16,y<<16,65536L,0,ac,s,p,10+16,0,0,xdim-1,ydim-1);
|
|
|
|
x += tilesizx[ac];
|
|
t++;
|
|
}
|
|
return (x);
|
|
}
|
|
|
|
static void bar_(int type, int x,int y,short *p,short dainc,char damodify,short s, short pa)
|
|
{
|
|
short xloc;
|
|
char rev;
|
|
|
|
if(dainc < 0) { dainc = -dainc; rev = 1; }
|
|
else rev = 0;
|
|
y-=2;
|
|
|
|
if(damodify)
|
|
{
|
|
if(rev == 0)
|
|
{
|
|
if( *p > 0 && (KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) || ((buttonstat&1) && minfo.dyaw < -256 ) ) ) // && onbar) )
|
|
{
|
|
KB_ClearKeyDown( sc_LeftArrow );
|
|
KB_ClearKeyDown( sc_kpad_4 );
|
|
|
|
*p -= dainc;
|
|
if(*p < 0)
|
|
*p = 0;
|
|
sound(KICK_HIT);
|
|
}
|
|
if( *p < 63 && (KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) || ((buttonstat&1) && minfo.dyaw > 256 ) ) )//&& onbar) )
|
|
{
|
|
KB_ClearKeyDown( sc_RightArrow );
|
|
KB_ClearKeyDown( sc_kpad_6 );
|
|
|
|
*p += dainc;
|
|
if(*p > 63)
|
|
*p = 63;
|
|
sound(KICK_HIT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( *p > 0 && (KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) || ((buttonstat&1) && minfo.dyaw > 256 ) ) )//&& onbar) )
|
|
{
|
|
KB_ClearKeyDown( sc_RightArrow );
|
|
KB_ClearKeyDown( sc_kpad_6 );
|
|
|
|
*p -= dainc;
|
|
if(*p < 0)
|
|
*p = 0;
|
|
sound(KICK_HIT);
|
|
}
|
|
if( *p < 64 && (KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) || ((buttonstat&1) && minfo.dyaw < -256 ) ) ) // && onbar) )
|
|
{
|
|
KB_ClearKeyDown( sc_LeftArrow );
|
|
KB_ClearKeyDown( sc_kpad_4 );
|
|
|
|
*p += dainc;
|
|
if(*p > 64)
|
|
*p = 64;
|
|
sound(KICK_HIT);
|
|
}
|
|
}
|
|
}
|
|
|
|
xloc = *p;
|
|
|
|
rotatesprite( (x<<16)+(22<<(16-type)),(y<<16)-(3<<(16-type)),65536L>>type,0,SLIDEBAR,s,pa,10,0,0,xdim-1,ydim-1);
|
|
if(rev == 0)
|
|
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);
|
|
else
|
|
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);
|
|
}
|
|
|
|
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); }
|
|
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); }
|
|
|
|
static void modval(int min, int max,int *p,short dainc,char damodify)
|
|
{
|
|
char rev;
|
|
|
|
if(dainc < 0) { dainc = -dainc; rev = 1; }
|
|
else rev = 0;
|
|
|
|
if(damodify)
|
|
{
|
|
if(rev == 0)
|
|
{
|
|
if( KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) || ((buttonstat&1) && minfo.dyaw < -256 ) ) // && onbar) )
|
|
{
|
|
KB_ClearKeyDown( sc_LeftArrow );
|
|
KB_ClearKeyDown( sc_kpad_4 );
|
|
|
|
*p -= dainc;
|
|
if(*p < min)
|
|
*p = max;
|
|
sound(PISTOL_BODYHIT);
|
|
}
|
|
if( KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) || ((buttonstat&1) && minfo.dyaw > 256 ) )//&& onbar) )
|
|
{
|
|
KB_ClearKeyDown( sc_RightArrow );
|
|
KB_ClearKeyDown( sc_kpad_6 );
|
|
|
|
*p += dainc;
|
|
if(*p > max)
|
|
*p = min;
|
|
sound(PISTOL_BODYHIT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) || ((buttonstat&1) && minfo.dyaw > 256 ))//&& onbar ))
|
|
{
|
|
KB_ClearKeyDown( sc_RightArrow );
|
|
KB_ClearKeyDown( sc_kpad_6 );
|
|
|
|
*p -= dainc;
|
|
if(*p < min)
|
|
*p = max;
|
|
sound(PISTOL_BODYHIT);
|
|
}
|
|
if( KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) || ((buttonstat&1) && minfo.dyaw < -256 ))// && onbar) )
|
|
{
|
|
KB_ClearKeyDown( sc_LeftArrow );
|
|
KB_ClearKeyDown( sc_kpad_4 );
|
|
|
|
*p += dainc;
|
|
if(*p > max)
|
|
*p = min;
|
|
sound(PISTOL_BODYHIT);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#define SHX(X) 0
|
|
// ((x==X)*(-sh))
|
|
#define PHX(X) 0
|
|
// ((x==X)?1:2)
|
|
#define MWIN(X) rotatesprite( 320<<15,200<<15,X,0,MENUSCREEN,-16,0,10+64,0,0,xdim-1,ydim-1)
|
|
#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)
|
|
|
|
extern int loadpheader(char spot,struct savehead *saveh);
|
|
|
|
static struct savehead savehead;
|
|
//static int32 volnum,levnum,plrskl,numplr;
|
|
//static char brdfn[BMAX_PATH];
|
|
short lastsavedpos = -1;
|
|
|
|
void dispnames(void)
|
|
{
|
|
short x, c = 160;
|
|
|
|
c += 64;
|
|
for(x = 0;x <= 108;x += 12)
|
|
rotatesprite((c+91-64)<<16,(x+56)<<16,65536L,0,TEXTBOX,24,0,10,0,0,xdim-1,ydim-1);
|
|
|
|
rotatesprite(22<<16,97<<16,65536L,0,WINDOWBORDER2,24,0,10,0,0,xdim-1,ydim-1);
|
|
rotatesprite(180<<16,97<<16,65536L,1024,WINDOWBORDER2,24,0,10,0,0,xdim-1,ydim-1);
|
|
rotatesprite(99<<16,50<<16,65536L,512,WINDOWBORDER1,24,0,10,0,0,xdim-1,ydim-1);
|
|
rotatesprite(103<<16,144<<16,65536L,1024+512,WINDOWBORDER1,24,0,10,0,0,xdim-1,ydim-1);
|
|
|
|
for (x=0;x<=9;x++)
|
|
minitext(c,48+(12*x),ud.savegame[x],2,10+16);
|
|
}
|
|
|
|
void clearfilenames(void)
|
|
{
|
|
klistfree(finddirs);
|
|
klistfree(findfiles);
|
|
finddirs = findfiles = NULL;
|
|
numfiles = numdirs = 0;
|
|
}
|
|
|
|
int getfilenames(char *path, char kind[])
|
|
{
|
|
CACHE1D_FIND_REC *r;
|
|
|
|
clearfilenames();
|
|
finddirs = klistpath(path,"*",CACHE1D_FIND_DIR);
|
|
findfiles = klistpath(path,kind,CACHE1D_FIND_FILE);
|
|
for (r = finddirs; r; r=r->next) numdirs++;
|
|
for (r = findfiles; r; r=r->next) numfiles++;
|
|
|
|
finddirshigh = finddirs;
|
|
findfileshigh = findfiles;
|
|
currentlist = 0;
|
|
if (findfileshigh) currentlist = 1;
|
|
|
|
return(0);
|
|
}
|
|
|
|
long quittimer = 0;
|
|
|
|
void menus(void)
|
|
{
|
|
CACHE1D_FIND_REC *dir;
|
|
short c,x,i;
|
|
long l,m;
|
|
char *p = NULL;
|
|
|
|
getpackets();
|
|
|
|
if(ControllerType == 1 && CONTROL_MousePresent)
|
|
{
|
|
if(buttonstat != 0 && !onbar)
|
|
{
|
|
x = MOUSE_GetButtons()<<3;
|
|
if( x ) buttonstat = x<<3;
|
|
else buttonstat = 0;
|
|
}
|
|
else
|
|
buttonstat = MOUSE_GetButtons();
|
|
}
|
|
else buttonstat = 0;
|
|
|
|
if( (ps[myconnectindex].gm&MODE_MENU) == 0 )
|
|
{
|
|
walock[TILE_LOADSHOT] = 1;
|
|
return;
|
|
}
|
|
|
|
ps[myconnectindex].gm &= (0xff-MODE_TYPE);
|
|
ps[myconnectindex].fta = 0;
|
|
|
|
x = 0;
|
|
|
|
sh = 4-(sintable[(totalclock<<4)&2047]>>11);
|
|
|
|
if(bpp > 8 && (ps[myconnectindex].gm&MODE_GAME || (ps[myconnectindex].gm&MODE_DEMO && ud.recstat != 0)))
|
|
{
|
|
long x,y,y1=0,y2=ydim;
|
|
for(y=y1;y<y2;y+=tilesizy[BIGHOLE])
|
|
for(x=0;x<xdim;x+=tilesizx[BIGHOLE])
|
|
rotatesprite(x<<16,y<<16,65536L,0,BIGHOLE,80,0,1+8+16,0,0,xdim-1,ydim-1);
|
|
}
|
|
if(!(current_menu >= 1000 && current_menu <= 2999 && current_menu >= 300 && current_menu <= 369))
|
|
vscrn();
|
|
|
|
switch(current_menu)
|
|
{
|
|
case 25000:
|
|
gametext(160,90,"SELECT A SAVE SPOT BEFORE",0,2+8+16);
|
|
gametext(160,90+9,"YOU QUICK RESTORE.",0,2+8+16);
|
|
|
|
x = probe(186,124,0,0);
|
|
if(x >= -1)
|
|
{
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
}
|
|
break;
|
|
|
|
case 20000:
|
|
x = probe(326,190,0,0);
|
|
gametext(160,50-8,"YOU ARE PLAYING THE SHAREWARE",0,2+8+16);
|
|
gametext(160,59-8,"VERSION OF DUKE NUKEM 3D. WHILE",0,2+8+16);
|
|
gametext(160,68-8,"THIS VERSION IS REALLY COOL, YOU",0,2+8+16);
|
|
gametext(160,77-8,"ARE MISSING OVER 75%% OF THE TOTAL",0,2+8+16);
|
|
gametext(160,86-8,"GAME, ALONG WITH OTHER GREAT EXTRAS",0,2+8+16);
|
|
gametext(160,95-8,"AND GAMES, WHICH YOU'LL GET WHEN",0,2+8+16);
|
|
gametext(160,104-8,"YOU ORDER THE COMPLETE VERSION AND",0,2+8+16);
|
|
gametext(160,113-8,"GET THE FINAL TWO EPISODES.",0,2+8+16);
|
|
|
|
gametext(160,113+8,"PLEASE READ THE 'HOW TO ORDER' ITEM",0,2+8+16);
|
|
gametext(160,122+8,"ON THE MAIN MENU IF YOU WISH TO",0,2+8+16);
|
|
gametext(160,131+8,"UPGRADE TO THE FULL REGISTERED",0,2+8+16);
|
|
gametext(160,140+8,"VERSION OF DUKE NUKEM 3D.",0,2+8+16);
|
|
gametext(160,149+16,"PRESS ANY KEY...",0,2+8+16);
|
|
|
|
if( x >= -1 ) cmenu(100);
|
|
break;
|
|
|
|
case 20001:
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"NETWORK GAME");
|
|
|
|
x = probe(160,100-18,18,3);
|
|
|
|
if (x == -1) cmenu(0);
|
|
else if (x == 2) cmenu(20010);
|
|
else if (x == 1) cmenu(20020);
|
|
else if (x == 0) cmenu(20002);
|
|
|
|
menutext(160,100-18,0,0,"PLAYER SETUP");
|
|
menutext(160,100,0,0,"JOIN GAME");
|
|
menutext(160,100+18,0,0,"HOST GAME");
|
|
break;
|
|
|
|
case 20002:
|
|
case 20003:
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"PLAYER SETUP");
|
|
|
|
if (current_menu == 20002) {
|
|
x = probe(46,50,20,2);
|
|
|
|
if (x == -1) cmenu(20001);
|
|
else if (x == 0) {
|
|
strcpy(buf, myname);
|
|
inputloc = strlen(buf);
|
|
current_menu = 20003;
|
|
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_FlushKeyboardQueue();
|
|
} else if (x == 1) {
|
|
// send colour update
|
|
}
|
|
} else {
|
|
x = strget(40+100,50-9,buf,31,0);
|
|
if (x) {
|
|
if (x == 1) {
|
|
strcpy(myname,buf);
|
|
// send name update
|
|
}
|
|
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_FlushKeyboardQueue();
|
|
|
|
current_menu = 20002;
|
|
}
|
|
}
|
|
|
|
menutext(40,50,0,0,"NAME");
|
|
if (current_menu == 20002) gametext(40+100,50-9,myname,0,2+8+16);
|
|
|
|
menutext(40,50+20,0,0,"COLOR");
|
|
rotatesprite((40+120)<<16,(50+20+(tilesizy[APLAYER]>>1))<<16,65536L,0,APLAYER,0,0,10,0,0,xdim-1,ydim-1);
|
|
|
|
break;
|
|
|
|
case 20010:
|
|
//note: this menu does not seem to be used and has not been updated to support custom game types
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"HOST NETWORK GAME");
|
|
|
|
x = probe(46,50,80,2);
|
|
|
|
if (x == -1) {
|
|
cmenu(20001);
|
|
probey = 2;
|
|
}
|
|
else if (x == 0) cmenu(20011);
|
|
|
|
menutext(40,50,0,0,"GAME OPTIONS");
|
|
minitext(90,60, "GAME TYPE" ,2,26);
|
|
minitext(90,60+8, "EPISODE" ,2,26);
|
|
minitext(90,60+8+8, "LEVEL" ,2,26);
|
|
minitext(90,60+8+8+8, "MONSTERS" ,2,26);
|
|
if (ud.m_coop == 0)
|
|
minitext(90,60+8+8+8+8, "MARKERS" ,2,26);
|
|
else if (ud.m_coop == 1)
|
|
minitext(90,60+8+8+8+8, "FRIENDLY FIRE",2,26);
|
|
minitext(90,60+8+8+8+8+8, "USER MAP" ,2,26);
|
|
|
|
/* if (ud.m_coop == 1) minitext(90+60,60,"COOPERATIVE PLAY",0,26);
|
|
else if (ud.m_coop == 2) minitext(90+60,60,"DUKEMATCH (NO SPAWN)",0,26);
|
|
else minitext(90+60,60,"DUKEMATCH (SPAWN)",0,26);*/
|
|
gametext(90+60,60,gametype_names[ud.m_coop],0,26);
|
|
|
|
minitext(90+60,60+8, volume_names[ud.m_volume_number],0,26);
|
|
minitext(90+60,60+8+8, level_names[11*ud.m_volume_number+ud.m_level_number],0,26);
|
|
if (ud.m_monsters_off == 0 || ud.m_player_skill > 0)
|
|
minitext(90+60,60+8+8+8, skill_names[ud.m_player_skill],0,26);
|
|
else minitext(90+60,60+8+8+8, "NONE",0,28);
|
|
if (ud.m_coop == 0) {
|
|
if (ud.m_marker) minitext(90+60,60+8+8+8+8,"ON",0,26);
|
|
else minitext(90+60,60+8+8+8+8,"OFF",0,26);
|
|
} else if (ud.m_coop == 1) {
|
|
if (ud.m_ffire) minitext(90+60,60+8+8+8+8,"ON",0,26);
|
|
else minitext(90+60,60+8+8+8+8,"OFF",0,26);
|
|
}
|
|
|
|
menutext(40,50+80,0,0,"LAUNCH GAME");
|
|
break;
|
|
|
|
case 20011:
|
|
c = (320>>1) - 120;
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"NET GAME OPTIONS");
|
|
|
|
x = probe(c,57-8,16,8);
|
|
|
|
switch(x)
|
|
{
|
|
case -1:
|
|
cmenu(20010);
|
|
break;
|
|
case 0:
|
|
ud.m_coop++;
|
|
if(ud.m_coop == 3) ud.m_coop = 0;
|
|
break;
|
|
case 1:
|
|
if (!VOLUMEONE) {
|
|
ud.m_volume_number++;
|
|
if(ud.m_volume_number == num_volumes) ud.m_volume_number = 0;
|
|
if(ud.m_volume_number == 0 && ud.m_level_number > 6)
|
|
ud.m_level_number = 0;
|
|
if(ud.m_level_number > 10) ud.m_level_number = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
ud.m_level_number++;
|
|
if (!VOLUMEONE) {
|
|
if(ud.m_volume_number == 0 && ud.m_level_number > 6)
|
|
ud.m_level_number = 0;
|
|
} else {
|
|
if(ud.m_volume_number == 0 && ud.m_level_number > 5)
|
|
ud.m_level_number = 0;
|
|
}
|
|
if(ud.m_level_number > 10) ud.m_level_number = 0;
|
|
break;
|
|
case 3:
|
|
if(ud.m_monsters_off == 1 && ud.m_player_skill > 0)
|
|
ud.m_monsters_off = 0;
|
|
|
|
if(ud.m_monsters_off == 0)
|
|
{
|
|
ud.m_player_skill++;
|
|
if(ud.m_player_skill > 3)
|
|
{
|
|
ud.m_player_skill = 0;
|
|
ud.m_monsters_off = 1;
|
|
}
|
|
}
|
|
else ud.m_monsters_off = 0;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
if(ud.m_coop == 0)
|
|
ud.m_marker = !ud.m_marker;
|
|
break;
|
|
|
|
case 5:
|
|
if(ud.m_coop == 1)
|
|
ud.m_ffire = !ud.m_ffire;
|
|
break;
|
|
|
|
case 6:
|
|
// pick the user map
|
|
break;
|
|
|
|
case 7:
|
|
cmenu(20010);
|
|
break;
|
|
}
|
|
|
|
c += 40;
|
|
|
|
// if(ud.m_coop==1) gametext(c+70,57-7-9,"COOPERATIVE PLAY",0,2+8+16);
|
|
// else if(ud.m_coop==2) gametext(c+70,57-7-9,"DUKEMATCH (NO SPAWN)",0,2+8+16);
|
|
// else gametext(c+70,57-7-9,"DUKEMATCH (SPAWN)",0,2+8+16);
|
|
gametext(c+70,57-7-9,gametype_names[ud.m_coop],0,26);
|
|
|
|
gametext(c+70,57+16-7-9,volume_names[ud.m_volume_number],0,2+8+16);
|
|
|
|
gametext(c+70,57+16+16-7-9,&level_names[11*ud.m_volume_number+ud.m_level_number][0],0,2+8+16);
|
|
|
|
if(ud.m_monsters_off == 0 || ud.m_player_skill > 0)
|
|
gametext(c+70,57+16+16+16-7-9,skill_names[ud.m_player_skill],0,2+8+16);
|
|
else gametext(c+70,57+16+16+16-7-9,"NONE",0,2+8+16);
|
|
|
|
if(ud.m_coop == 0)
|
|
{
|
|
if(ud.m_marker)
|
|
gametext(c+70,57+16+16+16+16-7-9,"ON",0,2+8+16);
|
|
else gametext(c+70,57+16+16+16+16-7-9,"OFF",0,2+8+16);
|
|
}
|
|
|
|
if(ud.m_coop == 1)
|
|
{
|
|
if(ud.m_ffire)
|
|
gametext(c+70,57+16+16+16+16+16-7-9,"ON",0,2+8+16);
|
|
else gametext(c+70,57+16+16+16+16+16-7-9,"OFF",0,2+8+16);
|
|
}
|
|
|
|
c -= 44;
|
|
|
|
menutext(c,57-9,SHX(-2),PHX(-2),"GAME TYPE");
|
|
|
|
sprintf(tempbuf,"EPISODE %ld",ud.m_volume_number+1);
|
|
menutext(c,57+16-9,SHX(-3),PHX(-3),tempbuf);
|
|
|
|
sprintf(tempbuf,"LEVEL %ld",ud.m_level_number+1);
|
|
menutext(c,57+16+16-9,SHX(-4),PHX(-4),tempbuf);
|
|
|
|
menutext(c,57+16+16+16-9,SHX(-5),PHX(-5),"MONSTERS");
|
|
|
|
if(ud.m_coop == 0)
|
|
menutext(c,57+16+16+16+16-9,SHX(-6),PHX(-6),"MARKERS");
|
|
else
|
|
menutext(c,57+16+16+16+16-9,SHX(-6),1,"MARKERS");
|
|
|
|
if(ud.m_coop == 1)
|
|
menutext(c,57+16+16+16+16+16-9,SHX(-6),PHX(-6),"FR. FIRE");
|
|
else menutext(c,57+16+16+16+16+16-9,SHX(-6),1,"FR. FIRE");
|
|
|
|
if (VOLUMEALL) {
|
|
menutext(c,57+16+16+16+16+16+16-9,SHX(-7),boardfilename[0] == 0,"USER MAP");
|
|
if( boardfilename[0] != 0 )
|
|
gametext(c+70+44,57+16+16+16+16+16,boardfilename,0,2+8+16);
|
|
} else {
|
|
menutext(c,57+16+16+16+16+16+16-9,SHX(-7),1,"USER MAP");
|
|
}
|
|
|
|
menutext(c,57+16+16+16+16+16+16+16-9,SHX(-8),PHX(-8),"ACCEPT");
|
|
break;
|
|
|
|
case 20020:
|
|
case 20021: // editing server
|
|
case 20022: // editing port
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"JOIN NETWORK GAME");
|
|
|
|
if (current_menu == 20020) {
|
|
x = probe(46,50,20,3);
|
|
|
|
if (x == -1) {
|
|
cmenu(20001);
|
|
probey = 1;
|
|
} else if (x == 0) {
|
|
strcpy(buf, "localhost");
|
|
inputloc = strlen(buf);
|
|
current_menu = 20021;
|
|
} else if (x == 1) {
|
|
strcpy(buf, "19014");
|
|
inputloc = strlen(buf);
|
|
current_menu = 20022;
|
|
} else if (x == 2) {
|
|
}
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_FlushKeyboardQueue();
|
|
} else if (current_menu == 20021) {
|
|
x = strget(40+100,50-9,buf,31,0);
|
|
if (x) {
|
|
if (x == 1) {
|
|
//strcpy(myname,buf);
|
|
}
|
|
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_FlushKeyboardQueue();
|
|
|
|
current_menu = 20020;
|
|
}
|
|
} else if (current_menu == 20022) {
|
|
x = strget(40+100,50+20-9,buf,5,997);
|
|
if (x) {
|
|
if (x == 1) {
|
|
//strcpy(myname,buf);
|
|
}
|
|
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_FlushKeyboardQueue();
|
|
|
|
current_menu = 20020;
|
|
}
|
|
}
|
|
|
|
menutext(40,50,0,0,"SERVER");
|
|
if (current_menu != 20021) gametext(40+100,50-9,"server",0,2+8+16);
|
|
|
|
menutext(40,50+20,0,0,"PORT");
|
|
if (current_menu != 20022) {
|
|
sprintf(tempbuf,"%d",19014);
|
|
gametext(40+100,50+20-9,tempbuf,0,2+8+16);
|
|
}
|
|
|
|
menutext(160,50+20+20,0,0,"CONNECT");
|
|
|
|
|
|
// ADDRESS
|
|
// PORT
|
|
// CONNECT
|
|
break;
|
|
|
|
case 15001:
|
|
case 15000:
|
|
|
|
gametext(160,90,"LOAD last game:",0,2+8+16);
|
|
|
|
sprintf(tempbuf,"\"%s\"",ud.savegame[lastsavedpos]);
|
|
gametext(160,99,tempbuf,0,2+8+16);
|
|
|
|
gametext(160,99+9,"(Y/N)",0,2+8+16);
|
|
|
|
if( KB_KeyPressed(sc_Escape) || KB_KeyPressed(sc_N) || RMB)
|
|
{
|
|
if(sprite[ps[myconnectindex].i].extra <= 0)
|
|
{
|
|
if (enterlevel(MODE_GAME)) backtomenu();
|
|
return;
|
|
}
|
|
|
|
KB_ClearKeyDown(sc_N);
|
|
KB_ClearKeyDown(sc_Escape);
|
|
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
}
|
|
|
|
if( KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB )
|
|
{
|
|
KB_FlushKeyboardQueue();
|
|
KB_ClearKeysDown();
|
|
FX_StopAllSounds();
|
|
|
|
if(ud.multimode > 1)
|
|
{
|
|
loadplayer(-1-lastsavedpos);
|
|
ps[myconnectindex].gm = MODE_GAME;
|
|
}
|
|
else
|
|
{
|
|
c = loadplayer(lastsavedpos);
|
|
if(c == 0)
|
|
ps[myconnectindex].gm = MODE_GAME;
|
|
}
|
|
}
|
|
|
|
probe(186,124+9,0,0);
|
|
|
|
break;
|
|
|
|
case 10000:
|
|
case 10001:
|
|
|
|
c = 60;
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"ADULT MODE");
|
|
|
|
x = probe(60,50+16,16,2);
|
|
if(x == -1) { cmenu(202); probey = 6; break; }
|
|
|
|
menutext(c,50+16,SHX(-2),PHX(-2),"ADULT MODE");
|
|
menutext(c,50+16+16,SHX(-3),PHX(-3),"ENTER PASSWORD");
|
|
|
|
if(ud.lockout) menutext(c+160+40,50+16,0,0,"OFF");
|
|
else menutext(c+160+40,50+16,0,0,"ON");
|
|
|
|
if(current_menu == 10001)
|
|
{
|
|
gametext(160,50+16+16+16+16-12,"ENTER PASSWORD",0,2+8+16);
|
|
x = strget((320>>1),50+16+16+16+16,buf,19, 998);
|
|
|
|
if( x )
|
|
{
|
|
if(ud.pwlockout[0] == 0 || ud.lockout == 0 )
|
|
strcpy(&ud.pwlockout[0],buf);
|
|
else if( strcmp(buf,&ud.pwlockout[0]) == 0 )
|
|
{
|
|
ud.lockout = 0;
|
|
buf[0] = 0;
|
|
|
|
for(x=0;x<numanimwalls;x++)
|
|
if( wall[animwall[x].wallnum].picnum != W_SCREENBREAK &&
|
|
wall[animwall[x].wallnum].picnum != W_SCREENBREAK+1 &&
|
|
wall[animwall[x].wallnum].picnum != W_SCREENBREAK+2 )
|
|
if( wall[animwall[x].wallnum].extra >= 0 )
|
|
wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
|
|
|
|
}
|
|
current_menu = 10000;
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_FlushKeyboardQueue();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(x == 0)
|
|
{
|
|
if( ud.lockout == 1 )
|
|
{
|
|
if(ud.pwlockout[0] == 0)
|
|
{
|
|
ud.lockout = 0;
|
|
for(x=0;x<numanimwalls;x++)
|
|
if( wall[animwall[x].wallnum].picnum != W_SCREENBREAK &&
|
|
wall[animwall[x].wallnum].picnum != W_SCREENBREAK+1 &&
|
|
wall[animwall[x].wallnum].picnum != W_SCREENBREAK+2 )
|
|
if( wall[animwall[x].wallnum].extra >= 0 )
|
|
wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
|
|
}
|
|
else
|
|
{
|
|
buf[0] = 0;
|
|
current_menu = 10001;
|
|
inputloc = 0;
|
|
KB_FlushKeyboardQueue();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ud.lockout = 1;
|
|
|
|
for(x=0;x<numanimwalls;x++)
|
|
switch(dynamictostatic[wall[animwall[x].wallnum].picnum])
|
|
{
|
|
case FEMPIC1__STATIC:
|
|
wall[animwall[x].wallnum].picnum = BLANKSCREEN;
|
|
break;
|
|
case FEMPIC2__STATIC:
|
|
case FEMPIC3__STATIC:
|
|
wall[animwall[x].wallnum].picnum = SCREENBREAK6;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
else if(x == 1)
|
|
{
|
|
current_menu = 10001;
|
|
inputloc = 0;
|
|
KB_FlushKeyboardQueue();
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 1000:
|
|
case 1001:
|
|
case 1002:
|
|
case 1003:
|
|
case 1004:
|
|
case 1005:
|
|
case 1006:
|
|
case 1007:
|
|
case 1008:
|
|
case 1009:
|
|
|
|
rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"LOAD GAME");
|
|
rotatesprite(101<<16,97<<16,65536>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
|
|
|
|
dispnames();
|
|
|
|
sprintf(tempbuf,"PLAYERS: %-2ld ",savehead.numplr);
|
|
gametext(160,156,tempbuf,0,2+8+16);
|
|
|
|
sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+savehead.volnum,1+savehead.levnum,savehead.plrskl);
|
|
gametext(160,168,tempbuf,0,2+8+16);
|
|
|
|
if (savehead.volnum == 0 && savehead.levnum == 7)
|
|
gametext(160,180,savehead.boardfn,0,2+8+16);
|
|
|
|
gametext(160,90,"LOAD game:",0,2+8+16);
|
|
sprintf(tempbuf,"\"%s\"",ud.savegame[current_menu-1000]);
|
|
gametext(160,99,tempbuf,0,2+8+16);
|
|
gametext(160,99+9,"(Y/N)",0,2+8+16);
|
|
|
|
if( KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB )
|
|
{
|
|
lastsavedpos = current_menu-1000;
|
|
|
|
KB_FlushKeyboardQueue();
|
|
KB_ClearKeysDown();
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
|
|
if(ud.multimode > 1)
|
|
{
|
|
if( ps[myconnectindex].gm&MODE_GAME )
|
|
{
|
|
loadplayer(-1-lastsavedpos);
|
|
ps[myconnectindex].gm = MODE_GAME;
|
|
}
|
|
else
|
|
{
|
|
tempbuf[0] = 126;
|
|
tempbuf[1] = lastsavedpos;
|
|
tempbuf[2] = myconnectindex;
|
|
for(x=connecthead;x>=0;x=connectpoint2[x])
|
|
{
|
|
if (x != myconnectindex) sendpacket(x,tempbuf,3);
|
|
if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
|
|
}
|
|
getpackets();
|
|
|
|
loadplayer(lastsavedpos);
|
|
|
|
multiflag = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
c = loadplayer(lastsavedpos);
|
|
if(c == 0)
|
|
ps[myconnectindex].gm = MODE_GAME;
|
|
}
|
|
|
|
break;
|
|
}
|
|
if( KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
|
|
{
|
|
KB_ClearKeyDown(sc_N);
|
|
KB_ClearKeyDown(sc_Escape);
|
|
sound(EXITMENUSOUND);
|
|
if(ps[myconnectindex].gm&MODE_DEMO) cmenu(300);
|
|
else
|
|
{
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
}
|
|
}
|
|
|
|
probe(186,124+9,0,0);
|
|
|
|
break;
|
|
|
|
case 1500:
|
|
|
|
if( KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB )
|
|
{
|
|
KB_FlushKeyboardQueue();
|
|
cmenu(100);
|
|
}
|
|
if( KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
|
|
{
|
|
KB_ClearKeyDown(sc_N);
|
|
KB_ClearKeyDown(sc_Escape);
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
sound(EXITMENUSOUND);
|
|
break;
|
|
}
|
|
probe(186,124,0,0);
|
|
gametext(160,90,"ABORT this game?",0,2+8+16);
|
|
gametext(160,90+9,"(Y/N)",0,2+8+16);
|
|
|
|
break;
|
|
|
|
case 2000:
|
|
case 2001:
|
|
case 2002:
|
|
case 2003:
|
|
case 2004:
|
|
case 2005:
|
|
case 2006:
|
|
case 2007:
|
|
case 2008:
|
|
case 2009:
|
|
|
|
rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"SAVE GAME");
|
|
|
|
rotatesprite(101<<16,97<<16,65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
|
|
sprintf(tempbuf,"PLAYERS: %-2ld ",ud.multimode);
|
|
gametext(160,156,tempbuf,0,2+8+16);
|
|
|
|
sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+ud.volume_number,1+ud.level_number,ud.player_skill);
|
|
gametext(160,168,tempbuf,0,2+8+16);
|
|
|
|
if (ud.volume_number == 0 && ud.level_number == 7)
|
|
gametext(160,180,boardfilename,0,2+8+16);
|
|
|
|
dispnames();
|
|
|
|
gametext(160,90,"OVERWRITE previous SAVED game?",0,2+8+16);
|
|
gametext(160,90+9,"(Y/N)",0,2+8+16);
|
|
|
|
if( KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB )
|
|
{
|
|
inputloc = strlen(&ud.savegame[current_menu-2000][0]);
|
|
|
|
cmenu(current_menu-2000+360);
|
|
|
|
KB_FlushKeyboardQueue();
|
|
break;
|
|
}
|
|
if( KB_KeyPressed(sc_N) || KB_KeyPressed(sc_Escape) || RMB)
|
|
{
|
|
KB_ClearKeyDown(sc_N);
|
|
KB_ClearKeyDown(sc_Escape);
|
|
cmenu(351);
|
|
sound(EXITMENUSOUND);
|
|
}
|
|
|
|
probe(186,124,0,0);
|
|
|
|
break;
|
|
|
|
case 990:
|
|
case 991:
|
|
case 992:
|
|
case 993:
|
|
case 994:
|
|
case 995:
|
|
case 996:
|
|
case 997:
|
|
case 998:
|
|
c = 160;
|
|
if (!VOLUMEALL || !PLUTOPAK) {
|
|
//rotatesprite(c<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
|
|
rotatesprite(c<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(c,24,0,0,current_menu == 998 ? "PORT CREDITS" : "CREDITS");
|
|
|
|
l = 8;
|
|
} else {
|
|
l = 3;
|
|
}
|
|
|
|
if(KB_KeyPressed(sc_Escape)) { cmenu(0); break; }
|
|
|
|
if( KB_KeyPressed( sc_LeftArrow ) ||
|
|
KB_KeyPressed( sc_kpad_4 ) ||
|
|
KB_KeyPressed( sc_UpArrow ) ||
|
|
KB_KeyPressed( sc_PgUp ) ||
|
|
KB_KeyPressed( sc_kpad_8 ) )
|
|
{
|
|
KB_ClearKeyDown(sc_LeftArrow);
|
|
KB_ClearKeyDown(sc_kpad_4);
|
|
KB_ClearKeyDown(sc_UpArrow);
|
|
KB_ClearKeyDown(sc_PgUp);
|
|
KB_ClearKeyDown(sc_kpad_8);
|
|
|
|
sound(KICK_HIT);
|
|
current_menu--;
|
|
if(current_menu < 990) current_menu = 990+l;
|
|
}
|
|
else if(
|
|
KB_KeyPressed( sc_PgDn ) ||
|
|
KB_KeyPressed( sc_Enter ) ||
|
|
KB_KeyPressed( sc_Space ) ||
|
|
KB_KeyPressed( sc_kpad_Enter ) ||
|
|
KB_KeyPressed( sc_RightArrow ) ||
|
|
KB_KeyPressed( sc_DownArrow ) ||
|
|
KB_KeyPressed( sc_kpad_2 ) ||
|
|
KB_KeyPressed( sc_kpad_9 ) ||
|
|
KB_KeyPressed( sc_kpad_6 ) )
|
|
{
|
|
KB_ClearKeyDown(sc_PgDn);
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_RightArrow);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_ClearKeyDown(sc_kpad_6);
|
|
KB_ClearKeyDown(sc_kpad_9);
|
|
KB_ClearKeyDown(sc_kpad_2);
|
|
KB_ClearKeyDown(sc_DownArrow);
|
|
KB_ClearKeyDown(sc_Space);
|
|
sound(KICK_HIT);
|
|
current_menu++;
|
|
if(current_menu > 990+l) current_menu = 990;
|
|
}
|
|
|
|
if (!VOLUMEALL || !PLUTOPAK) {
|
|
switch (current_menu) {
|
|
case 990:
|
|
gametext(c,40, "ORIGINAL CONCEPT",0,2+8+16);
|
|
gametext(c,40+9, "TODD REPLOGLE",0,2+8+16);
|
|
gametext(c,40+9+9, "ALLEN H. BLUM III",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9+9, "PRODUCED & DIRECTED BY",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9, "GREG MALONE",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9+9+9+9+9, "EXECUTIVE PRODUCER",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9+9, "GEORGE BROUSSARD",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9+9+9+9+9+9+9+9, "BUILD ENGINE",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9+9+9+9+9,"KEN SILVERMAN",0,2+8+16);
|
|
break;
|
|
case 991:
|
|
gametext(c,40, "GAME PROGRAMMING",0,2+8+16);
|
|
gametext(c,40+9, "TODD REPLOGLE",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9, "3D ENGINE/TOOLS/NET",0,2+8+16);
|
|
gametext(c,40+9+9+9+9, "KEN SILVERMAN",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9+9+9+9, "NETWORK LAYER/SETUP PROGRAM",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9, "MARK DOCHTERMANN",0,2+8+16);
|
|
break;
|
|
case 992:
|
|
gametext(c,40, "MAP DESIGN",0,2+8+16);
|
|
gametext(c,40+9, "ALLEN H BLUM III",0,2+8+16);
|
|
gametext(c,40+9+9, "RICHARD GRAY",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9+9, "3D MODELING",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9, "CHUCK JONES",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9, "SAPPHIRE CORPORATION",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9+9+9+9+9+9, "ARTWORK",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9+9+9, "DIRK JONES, STEPHEN HORNBACK",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9+9+9+9, "JAMES STOREY, DAVID DEMARET",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9+9+9+9+9,"DOUGLAS R WOOD",0,2+8+16);
|
|
break;
|
|
case 993:
|
|
gametext(c,40, "SOUND ENGINE",0,2+8+16);
|
|
gametext(c,40+9, "JIM DOSE",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9, "SOUND & MUSIC DEVELOPMENT",0,2+8+16);
|
|
gametext(c,40+9+9+9+9, "ROBERT PRINCE",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9, "LEE JACKSON",0,2+8+16);
|
|
|
|
gametext(c,40+9+9+9+9+9+9+9, "VOICE TALENT",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9+9, "LANI MINELLA - VOICE PRODUCER",0,2+8+16);
|
|
gametext(c,40+9+9+9+9+9+9+9+9+9, "JON ST. JOHN AS \"DUKE NUKEM\"",0,2+8+16);
|
|
break;
|
|
case 994:
|
|
gametext(c,60, "GRAPHIC DESIGN",0,2+8+16);
|
|
gametext(c,60+9, "PACKAGING, MANUAL, ADS",0,2+8+16);
|
|
gametext(c,60+9+9, "ROBERT M. ATKINS",0,2+8+16);
|
|
gametext(c,60+9+9+9, "MICHAEL HADWIN",0,2+8+16);
|
|
|
|
gametext(c,60+9+9+9+9+9, "SPECIAL THANKS TO",0,2+8+16);
|
|
gametext(c,60+9+9+9+9+9+9, "STEVEN BLACKBURN, TOM HALL",0,2+8+16);
|
|
gametext(c,60+9+9+9+9+9+9+9, "SCOTT MILLER, JOE SIEGLER",0,2+8+16);
|
|
gametext(c,60+9+9+9+9+9+9+9+9, "TERRY NAGY, COLLEEN COMPTON",0,2+8+16);
|
|
gametext(c,60+9+9+9+9+9+9+9+9+9, "HASH INC., FORMGEN, INC.",0,2+8+16);
|
|
break;
|
|
case 995:
|
|
gametext(c,49, "THE 3D REALMS BETA TESTERS",0,2+8+16);
|
|
|
|
gametext(c,49+9+9, "NATHAN ANDERSON, WAYNE BENNER",0,2+8+16);
|
|
gametext(c,49+9+9+9, "GLENN BRENSINGER, ROB BROWN",0,2+8+16);
|
|
gametext(c,49+9+9+9+9, "ERIK HARRIS, KEN HECKBERT",0,2+8+16);
|
|
gametext(c,49+9+9+9+9+9, "TERRY HERRIN, GREG HIVELY",0,2+8+16);
|
|
gametext(c,49+9+9+9+9+9+9, "HANK LEUKART, ERIC BAKER",0,2+8+16);
|
|
gametext(c,49+9+9+9+9+9+9+9, "JEFF RAUSCH, KELLY ROGERS",0,2+8+16);
|
|
gametext(c,49+9+9+9+9+9+9+9+9, "MIKE DUNCAN, DOUG HOWELL",0,2+8+16);
|
|
gametext(c,49+9+9+9+9+9+9+9+9+9, "BILL BLAIR",0,2+8+16);
|
|
break;
|
|
case 996:
|
|
gametext(c,32, "COMPANY PRODUCT SUPPORT",0,2+8+16);
|
|
|
|
gametext(c,32+9+9, "THE FOLLOWING COMPANIES WERE COOL",0,2+8+16);
|
|
gametext(c,32+9+9+9, "ENOUGH TO GIVE US LOTS OF STUFF",0,2+8+16);
|
|
gametext(c,32+9+9+9+9, "DURING THE MAKING OF DUKE NUKEM 3D.",0,2+8+16);
|
|
|
|
gametext(c,32+9+9+9+9+9+9, "ALTEC LANSING MULTIMEDIA",0,2+8+16);
|
|
gametext(c,32+9+9+9+9+9+9+9, "FOR TONS OF SPEAKERS AND THE",0,2+8+16);
|
|
gametext(c,32+9+9+9+9+9+9+9+9, "THX-LICENSED SOUND SYSTEM",0,2+8+16);
|
|
gametext(c,32+9+9+9+9+9+9+9+9+9, "FOR INFO CALL 1-800-548-0620",0,2+8+16);
|
|
|
|
gametext(c,32+9+9+9+9+9+9+9+9+9+9+9,"CREATIVE LABS, INC.",0,2+8+16);
|
|
|
|
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);
|
|
break;
|
|
case 997:
|
|
gametext(c,50, "DUKE NUKEM IS A TRADEMARK OF",0,2+8+16);
|
|
gametext(c,50+9, "3D REALMS ENTERTAINMENT",0,2+8+16);
|
|
|
|
gametext(c,50+9+9+9, "DUKE NUKEM",0,2+8+16);
|
|
gametext(c,50+9+9+9+9, "(C) 1996 3D REALMS ENTERTAINMENT",0,2+8+16);
|
|
|
|
if (VOLUMEONE) {
|
|
gametext(c,106, "PLEASE READ LICENSE.DOC FOR SHAREWARE",0,2+8+16);
|
|
gametext(c,106+9, "DISTRIBUTION GRANTS AND RESTRICTIONS",0,2+8+16);
|
|
}
|
|
|
|
gametext(c,VOLUMEONE?134:115, "MADE IN DALLAS, TEXAS USA",0,2+8+16);
|
|
break;
|
|
case 998:
|
|
l = 10;
|
|
goto cheat_for_port_credits;
|
|
}
|
|
break;
|
|
}
|
|
|
|
// Plutonium pak menus
|
|
switch(current_menu)
|
|
{
|
|
case 990:
|
|
case 991:
|
|
case 992:
|
|
rotatesprite(160<<16,200<<15,65536L,0,2504+current_menu-990,0,0,10+64,0,0,xdim-1,ydim-1);
|
|
break;
|
|
case 993: // JBF 20031220
|
|
rotatesprite(160<<16,200<<15,65536L,0,MENUSCREEN,0,0,10+64,0,0,xdim-1,ydim-1);
|
|
menutext(160,28,0,0,"PORT CREDITS");
|
|
|
|
cheat_for_port_credits:
|
|
if (conversion == 13) l = (-2);
|
|
gametext(160,38-l,"EDUKE PORT TO JFDUKE, NEW FEATURES,",0,2+8+16);
|
|
gametext(160,38+8-l,"FUNCTIONS, AND ENGINE MODIFICATIONS",0,2+8+16);
|
|
p = "Richard \"TerminX\" Gobeille, EDuke32 team";
|
|
minitext(160-(Bstrlen(p)<<1), 38+8+10-l, p, 8, 10+16+128);
|
|
|
|
gametext(160,70-l,"DUKE3D AND BUILD ENGINE PORTING,",0,2+8+16);
|
|
gametext(160,70+8-l, "MODIFICATIONS, AND GENERAL GUIDANCE",0,2+8+16);
|
|
p = "Jonathon \"JonoF\" Fowler";
|
|
minitext(160-(Bstrlen(p)<<1), 70+8+10-l, p, 8, 10+16+128);
|
|
|
|
gametext(160,102-l,"\"POLYMOST\" OPENGL RENDERER",0,2+8+16);
|
|
gametext(160,102+8-l,"NETWORKING, OTHER CODE",0,2+8+16);
|
|
p = "Ken Silverman";
|
|
minitext(160-(Bstrlen(p)<<1), 102+8+10-l, p, 8, 10+16+128);
|
|
|
|
|
|
// /* for (i=0;i<7;i++) {
|
|
// switch (i) {
|
|
// case 0: p = "This program is distributed under the terms of the"; break;
|
|
// case 1: p = "GNU General Public License version 2 as published by the"; break;
|
|
// case 2: p = "Free Software Foundation. See GNU.TXT for details."; break;
|
|
// case 3: p = NULL; break;
|
|
// case 4: p = "Visit http://www.eduke32.com for the source code,"; break;
|
|
// case 5: p = "latest news, and the current version of this port."; break;
|
|
// case 6: p = "EDuke originally by Matt Saettler."; break;
|
|
// }
|
|
// if (!p) continue;
|
|
// //minitext(160-(Bstrlen(p)<<1)+1, 110+10+1+(i*7)-l, p, 4, 10+16+128);
|
|
// minitext(160-(Bstrlen(p)<<1), 130+10+(i*7)-l, p, /*12*/8, 10+16+128);
|
|
// }
|
|
// */
|
|
{
|
|
const char *scroller[] = {
|
|
"This program is distributed under the terms of the",
|
|
"GNU General Public License version 2 as published by the",
|
|
"Free Software Foundation. See GNU.TXT for details.",
|
|
"",
|
|
"EDuke originally by Matthew Saettler",
|
|
"",
|
|
"Thanks to these people for their input and contributions:",
|
|
"",
|
|
"Ed Coolidge",
|
|
"Javier Martinez",
|
|
"Jeff Hart",
|
|
"Jonathan Smith",
|
|
"Jose del Castillo",
|
|
"Lachlan McDonald",
|
|
"Matthew Palmer",
|
|
"Peter Green",
|
|
"Pierre-Loup Archambeaud Griffais",
|
|
"",
|
|
"--x--",
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
""
|
|
};
|
|
const int numlines = sizeof(scroller)/sizeof(char *);
|
|
for (m=0,i=(totalclock/104)%numlines; m<6; m++,i++) {
|
|
if (i==numlines) i=0;
|
|
minitext(160-(Bstrlen(scroller[i])<<1), 100+10+10+8+4+(m*7)-l, (char*)scroller[i], 8, 10+16+128);
|
|
}
|
|
}
|
|
|
|
for (i=0;i<2;i++) {
|
|
switch (i) {
|
|
case 0: p = "www.eduke32.com"; break;
|
|
case 1: p = ""; break; // fuck I am lazy
|
|
}
|
|
minitext(160-(Bstrlen(p)<<1), 135+10+10+10+10+4+(i*7)-l, p, 8, 10+16+128);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 0:
|
|
c = (320>>1);
|
|
rotatesprite(c<<16,28<<16,65536L,0,INGAMEDUKETHREEDEE,0,0,10,0,0,xdim-1,ydim-1);
|
|
if (PLUTOPAK) // JBF 20030804
|
|
rotatesprite((c+100)<<16,36<<16,65536L,0,PLUTOPAKSPRITE+2,(sintable[(totalclock<<4)&2047]>>11),0,2+8,0,0,xdim-1,ydim-1);
|
|
x = probe(c,67,16,6);
|
|
if(x >= 0)
|
|
{
|
|
if( ud.multimode > 1 && x == 0 && ud.recstat != 2)
|
|
{
|
|
if( movesperpacket == 4 && myconnectindex != connecthead )
|
|
break;
|
|
|
|
last_zero = 0;
|
|
cmenu( 600 );
|
|
}
|
|
else
|
|
{
|
|
last_zero = x;
|
|
switch(x)
|
|
{
|
|
case 0:
|
|
cmenu(100);
|
|
break;
|
|
//case 1: break;//cmenu(20001);break; // JBF 20031128: I'm taking over the TEN menu option
|
|
case 1: cmenu(202);break; // JBF 20031205: was 200
|
|
case 2:
|
|
if(movesperpacket == 4 && connecthead != myconnectindex)
|
|
break;
|
|
cmenu(300);
|
|
break;
|
|
case 3: KB_FlushKeyboardQueue();cmenu(400);break;
|
|
case 4: cmenu(990);break;
|
|
case 5: cmenu(500);break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(KB_KeyPressed(sc_Q)) cmenu(500);
|
|
|
|
if(x == -1)
|
|
{
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
}
|
|
|
|
if(movesperpacket == 4)
|
|
{
|
|
if( myconnectindex == connecthead )
|
|
menutext(c,67,SHX(-2),PHX(-2),"NEW GAME");
|
|
else
|
|
menutext(c,67,SHX(-2),1,"NEW GAME");
|
|
}
|
|
else
|
|
menutext(c,67,SHX(-2),PHX(-2),"NEW GAME");
|
|
|
|
// menutext(c,67+16,0,1,"NETWORK GAME");
|
|
|
|
menutext(c,67+16/*+16*/,SHX(-3),PHX(-3),"OPTIONS");
|
|
|
|
if(movesperpacket == 4 && connecthead != myconnectindex)
|
|
menutext(c,67+16+16/*+16*/,SHX(-4),1,"LOAD GAME");
|
|
else menutext(c,67+16+16/*+16*/,SHX(-4),PHX(-4),"LOAD GAME");
|
|
|
|
if (!VOLUMEALL) {
|
|
|
|
menutext(c,67+16+16+16/*+16*/,SHX(-5),PHX(-5),"HOW TO ORDER");
|
|
} else {
|
|
|
|
menutext(c,67+16+16+16/*+16*/,SHX(-5),PHX(-5),"HELP");
|
|
}
|
|
|
|
menutext(c,67+16+16+16+16/*+16*/,SHX(-6),PHX(-6),"CREDITS");
|
|
|
|
|
|
menutext(c,67+16+16+16+16+16/*+16*/,SHX(-7),PHX(-7),"QUIT");
|
|
break;
|
|
|
|
case 50:
|
|
c = (320>>1);
|
|
rotatesprite(c<<16,32<<16,65536L,0,INGAMEDUKETHREEDEE,0,0,10,0,0,xdim-1,ydim-1);
|
|
if (PLUTOPAK) // JBF 20030804
|
|
rotatesprite((c+100)<<16,36<<16,65536L,0,PLUTOPAKSPRITE+2,(sintable[(totalclock<<4)&2047]>>11),0,2+8,0,0,xdim-1,ydim-1);
|
|
x = probe(c,67,16,7);
|
|
switch(x)
|
|
{
|
|
case 0:
|
|
if(movesperpacket == 4 && myconnectindex != connecthead)
|
|
break;
|
|
if(ud.multimode < 2 || ud.recstat == 2)
|
|
cmenu(1500);
|
|
else
|
|
{
|
|
cmenu(600);
|
|
last_fifty = 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
if(movesperpacket == 4 && connecthead != myconnectindex)
|
|
break;
|
|
if(ud.recstat != 2)
|
|
{
|
|
last_fifty = 1;
|
|
cmenu(350);
|
|
setview(0,0,xdim-1,ydim-1);
|
|
}
|
|
break;
|
|
case 2:
|
|
if(movesperpacket == 4 && connecthead != myconnectindex)
|
|
break;
|
|
last_fifty = 2;
|
|
cmenu(300);
|
|
break;
|
|
case 3:
|
|
last_fifty = 3;
|
|
cmenu(202); // JBF 20031205: was 200
|
|
break;
|
|
case 4:
|
|
last_fifty = 4;
|
|
KB_FlushKeyboardQueue();
|
|
cmenu(400);
|
|
break;
|
|
case 5:
|
|
if(numplayers < 2)
|
|
{
|
|
last_fifty = 5;
|
|
cmenu(501);
|
|
}
|
|
break;
|
|
case 6:
|
|
last_fifty = 6;
|
|
cmenu(500);
|
|
break;
|
|
case -1:
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if( KB_KeyPressed(sc_Q) )
|
|
cmenu(500);
|
|
|
|
if(movesperpacket == 4 && connecthead != myconnectindex)
|
|
{
|
|
menutext(c,67 ,SHX(-2),1,"NEW GAME");
|
|
menutext(c,67+16 ,SHX(-3),1,"SAVE GAME");
|
|
menutext(c,67+16+16 ,SHX(-4),1,"LOAD GAME");
|
|
}
|
|
else
|
|
{
|
|
menutext(c,67 ,SHX(-2),PHX(-2),"NEW GAME");
|
|
menutext(c,67+16 ,SHX(-3),PHX(-3),"SAVE GAME");
|
|
menutext(c,67+16+16 ,SHX(-4),PHX(-4),"LOAD GAME");
|
|
}
|
|
|
|
menutext(c,67+16+16+16 ,SHX(-5),PHX(-5),"OPTIONS");
|
|
if (!VOLUMEALL) {
|
|
menutext(c,67+16+16+16+16 ,SHX(-6),PHX(-6),"HOW TO ORDER");
|
|
} else {
|
|
menutext(c,67+16+16+16+16 ,SHX(-6),PHX(-6)," HELP");
|
|
}
|
|
if(numplayers > 1)
|
|
menutext(c,67+16+16+16+16+16 ,SHX(-7),1,"QUIT TO TITLE");
|
|
else menutext(c,67+16+16+16+16+16 ,SHX(-7),PHX(-7),"QUIT TO TITLE");
|
|
menutext(c,67+16+16+16+16+16+16,SHX(-8),PHX(-8),"QUIT GAME");
|
|
break;
|
|
|
|
case 100:
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"SELECT AN EPISODE");
|
|
// if(boardfilename[0])
|
|
if (PLUTOPAK)
|
|
x = probe(160,60-(num_volumes*2),20,num_volumes+1);
|
|
// else x = probe(160,60,20,4);
|
|
// if(boardfilename[0])
|
|
else
|
|
x = probe(160,VOLUMEONE?60:60-(num_volumes*2),20,VOLUMEONE?3:num_volumes+1);
|
|
// else x = probe(160,60,20,3);
|
|
if(x >= 0)
|
|
{
|
|
if (VOLUMEONE) {
|
|
if(x > 0)
|
|
cmenu(20000);
|
|
else
|
|
{
|
|
ud.m_volume_number = x;
|
|
ud.m_level_number = 0;
|
|
last_onehundred = x;
|
|
cmenu(110);
|
|
}
|
|
}
|
|
|
|
if (!VOLUMEONE) {
|
|
if(x == num_volumes /*&& boardfilename[0]*/)
|
|
{
|
|
//ud.m_volume_number = 0;
|
|
//ud.m_level_number = 7;
|
|
currentlist = 1;
|
|
last_onehundred = x;
|
|
cmenu(101);
|
|
}
|
|
else
|
|
{
|
|
ud.m_volume_number = x;
|
|
ud.m_level_number = 0;
|
|
last_onehundred = x;
|
|
cmenu(110);
|
|
}
|
|
}
|
|
}
|
|
else if(x == -1)
|
|
{
|
|
if(ps[myconnectindex].gm&MODE_GAME) cmenu(50);
|
|
else cmenu(0);
|
|
}
|
|
|
|
|
|
|
|
c = 80;
|
|
if (VOLUMEONE) {
|
|
menutext(160,60,SHX(-2),PHX(-2),volume_names[0]);
|
|
menutext(160,60+20,SHX(-3),1,volume_names[1]);
|
|
menutext(160,60+20+20,SHX(-4),1,volume_names[2]);
|
|
if (PLUTOPAK)
|
|
menutext(160,60+20+20,SHX(-5),1,volume_names[3]);
|
|
} else {
|
|
for (i=0;i<num_volumes;i++)
|
|
menutext(160,60-(num_volumes*2)+(20*i),SHX(-2),PHX(-2),volume_names[i]);
|
|
|
|
menutext(160,60-(num_volumes*2)+(20*i),SHX(-6),PHX(-6),"USER MAP");
|
|
}
|
|
break;
|
|
|
|
case 101:
|
|
if (boardfilename[0] == 0) strcpy(boardfilename, "./");
|
|
Bcorrectfilename(boardfilename,1);
|
|
getfilenames(boardfilename,"*.map");
|
|
cmenu(102);
|
|
KB_FlushKeyboardQueue();
|
|
case 102:
|
|
rotatesprite(160<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,24,0,0,"SELECT A USER MAP");
|
|
|
|
// black translucent background underneath file lists
|
|
rotatesprite(0<<16, 0<<16, 65536l<<5, 0, BLANK, 0, 0, 10+16+1+32,
|
|
scale(40-4,xdim,320),scale(12+32-2,ydim,200),
|
|
scale(320-40+4,xdim,320)-1,scale(12+32+112+4,ydim,200)-1);
|
|
|
|
// path
|
|
minitext(52,32,boardfilename,0,26);
|
|
|
|
{ // JBF 20040208: seek to first name matching pressed character
|
|
CACHE1D_FIND_REC *seeker = currentlist ? findfiles : finddirs;
|
|
if((KB_KeyPressed(sc_Home)|KB_KeyPressed(sc_End)) > 0)
|
|
{
|
|
while(KB_KeyPressed(sc_End)?seeker->next:seeker->prev)
|
|
seeker = KB_KeyPressed(sc_End)?seeker->next:seeker->prev;
|
|
if (seeker) {
|
|
if (currentlist) findfileshigh = seeker;
|
|
else finddirshigh = seeker;
|
|
sound(KICK_HIT);
|
|
}
|
|
}
|
|
else if((KB_KeyPressed(sc_PgUp)|KB_KeyPressed(sc_PgDn)) > 0)
|
|
{
|
|
seeker = currentlist?findfileshigh:finddirshigh;
|
|
i = 6;
|
|
while(i>0) {
|
|
if(KB_KeyPressed(sc_PgDn)?seeker->next:seeker->prev)
|
|
seeker = KB_KeyPressed(sc_PgDn)?seeker->next:seeker->prev;
|
|
i--;
|
|
}
|
|
if (seeker) {
|
|
if (currentlist) findfileshigh = seeker;
|
|
else finddirshigh = seeker;
|
|
sound(KICK_HIT);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
char ch2, ch;
|
|
ch = KB_Getch();
|
|
if (ch > 0 && ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'))) {
|
|
if (ch >= 'a') ch -= ('a'-'A');
|
|
while (seeker) {
|
|
ch2 = seeker->name[0];
|
|
if (ch2 >= 'a' && ch2 <= 'z') ch2 -= ('a'-'A');
|
|
if (ch2 == ch) break;
|
|
seeker = seeker->next;
|
|
}
|
|
if (seeker) {
|
|
if (currentlist) findfileshigh = seeker;
|
|
else finddirshigh = seeker;
|
|
sound(KICK_HIT);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
gametext(40+4,12+32,"DIRECTORIES",0,2+8+16);
|
|
|
|
if (finddirshigh) {
|
|
dir = finddirshigh;
|
|
for(i=0; i<2; i++) if (!dir->prev) break; else dir=dir->prev;
|
|
for(i=2; i>-2 && dir; i--, dir=dir->next) {
|
|
if (dir == finddirshigh) c=0; else c=16;
|
|
minitextshade(40,1+12+32+8*(3-i),dir->name,c,0,26);
|
|
}
|
|
}
|
|
|
|
gametext(40+4,8+32+40+8-1,"MAP FILES",0,2+8+16);
|
|
|
|
if (findfileshigh) {
|
|
dir = findfileshigh;
|
|
for(i=0; i<4; i++) if (!dir->prev) break; else dir=dir->prev;
|
|
for(i=4; i>-4 && dir; i--, dir=dir->next) {
|
|
if (dir == findfileshigh) c=0; else c=16;
|
|
minitextshade(40,(8+32+8*5)+8*(6-i),dir->name,c,2,26);
|
|
}
|
|
}
|
|
|
|
if( KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) || ((buttonstat&1) && minfo.dyaw < -256 ) ||
|
|
KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) || ((buttonstat&1) && minfo.dyaw > 256 ) ||
|
|
KB_KeyPressed( sc_Tab ) )
|
|
{
|
|
KB_ClearKeyDown( sc_LeftArrow );
|
|
KB_ClearKeyDown( sc_kpad_4 );
|
|
KB_ClearKeyDown( sc_RightArrow );
|
|
KB_ClearKeyDown( sc_kpad_6 );
|
|
KB_ClearKeyDown( sc_Tab );
|
|
currentlist = 1-currentlist;
|
|
sound(KICK_HIT);
|
|
}
|
|
|
|
onbar = 0;
|
|
probey = 2;
|
|
if (currentlist == 0) x = probe(50,12+32+16+4,0,3);
|
|
else x = probe(50,8+32+40+40+4,0,3);
|
|
|
|
if (probey == 1) {
|
|
if (currentlist == 0) {
|
|
if (finddirshigh)
|
|
if (finddirshigh->prev) finddirshigh = finddirshigh->prev;
|
|
} else {
|
|
if (findfileshigh)
|
|
if (findfileshigh->prev) findfileshigh = findfileshigh->prev;
|
|
}
|
|
} else if (probey == 0) {
|
|
if (currentlist == 0) {
|
|
if (finddirshigh)
|
|
if (finddirshigh->next) finddirshigh = finddirshigh->next;
|
|
} else {
|
|
if (findfileshigh)
|
|
if (findfileshigh->next) findfileshigh = findfileshigh->next;
|
|
}
|
|
}
|
|
|
|
if(x == -1) {
|
|
cmenu(100);
|
|
clearfilenames();
|
|
boardfilename[0] = 0;
|
|
}
|
|
else if(x >= 0)
|
|
{
|
|
if (currentlist == 0) {
|
|
if (!finddirshigh) break;
|
|
strcat(boardfilename, finddirshigh->name);
|
|
strcat(boardfilename, "/");
|
|
Bcorrectfilename(boardfilename, 1);
|
|
cmenu(101);
|
|
KB_FlushKeyboardQueue();
|
|
} else {
|
|
if (!findfileshigh) break;
|
|
strcat(boardfilename, findfileshigh->name);
|
|
ud.m_volume_number = 0;
|
|
ud.m_level_number = 7;
|
|
cmenu(110);
|
|
}
|
|
clearfilenames();
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
case 110:
|
|
c = (320>>1);
|
|
rotatesprite(c<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(c,24,0,0,"SELECT SKILL");
|
|
x = probe(c,70,19,4);
|
|
if(x >= 0)
|
|
{
|
|
switch(x)
|
|
{
|
|
case 0: globalskillsound = JIBBED_ACTOR6;break;
|
|
case 1: globalskillsound = BONUS_SPEECH1;break;
|
|
case 2: globalskillsound = DUKE_GETWEAPON2;break;
|
|
case 3: globalskillsound = JIBBED_ACTOR5;break;
|
|
}
|
|
|
|
sound(globalskillsound);
|
|
|
|
ud.m_player_skill = x+1;
|
|
if(x == 3) ud.m_respawn_monsters = 1;
|
|
else ud.m_respawn_monsters = 0;
|
|
|
|
ud.m_monsters_off = ud.monsters_off = 0;
|
|
|
|
ud.m_respawn_items = 0;
|
|
ud.m_respawn_inventory = 0;
|
|
|
|
ud.multimode = 1;
|
|
|
|
if(ud.m_volume_number == 3)
|
|
{
|
|
flushperms();
|
|
setview(0,0,xdim-1,ydim-1);
|
|
clearview(0L);
|
|
nextpage();
|
|
}
|
|
|
|
newgame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill);
|
|
if (enterlevel(MODE_GAME)) backtomenu();
|
|
}
|
|
else if(x == -1)
|
|
{
|
|
cmenu(100);
|
|
KB_FlushKeyboardQueue();
|
|
}
|
|
|
|
menutext(c,70,SHX(-2),PHX(-2),skill_names[0]);
|
|
menutext(c,70+19,SHX(-3),PHX(-3),skill_names[1]);
|
|
menutext(c,70+19+19,SHX(-4),PHX(-4),skill_names[2]);
|
|
menutext(c,70+19+19+19,SHX(-5),PHX(-5),skill_names[3]);
|
|
break;
|
|
|
|
case 200:
|
|
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"GAME OPTIONS");
|
|
|
|
c = (320>>1)-120;
|
|
|
|
{
|
|
int io, ii, yy, d=c+160+40, enabled;
|
|
char *opts[] = {
|
|
"Crosshair",
|
|
"Level stats",
|
|
"Status bar size",
|
|
"-",
|
|
"Mouse aiming type",
|
|
"Mouse aiming toggle",
|
|
"Invert mouse aim",
|
|
"Auto-aiming",
|
|
"Run key style",
|
|
"Auto weapon switching",
|
|
"-",
|
|
"Screen size",
|
|
"Detail",
|
|
"Shadows",
|
|
"Screen tilting",
|
|
"-",
|
|
"Record demo",
|
|
"-",
|
|
"More...",
|
|
NULL
|
|
};
|
|
|
|
yy = 34;
|
|
for (ii=io=0; opts[ii]; ii++) {
|
|
if (opts[ii][0] == '-' && !opts[ii][1]) {
|
|
if (io <= probey) yy += 4;
|
|
continue;
|
|
}
|
|
if (io < probey) yy += 8;
|
|
io++;
|
|
}
|
|
|
|
onbar = (probey == 2 || probey == 9);
|
|
x = probesm(c,yy+5,0,io);
|
|
|
|
if (x == -1) { cmenu(202); break; }
|
|
|
|
yy = 34;
|
|
for (ii=io=0; opts[ii]; ii++) {
|
|
if (opts[ii][0] == '-' && !opts[ii][1]) {
|
|
yy += 4;
|
|
continue;
|
|
}
|
|
enabled = 1;
|
|
switch (io) {
|
|
case 0: if (x==io) ud.crosshair = 1-ud.crosshair;
|
|
modval(0,1,(int *)&ud.crosshair,1,probey==0);
|
|
gametextpal(d,yy, ud.crosshair ? "On" : "Off", 0, 0); break;
|
|
case 1: if (x==io) ud.levelstats = 1-ud.levelstats;
|
|
modval(0,1,(int *)&ud.levelstats,1,probey==1);
|
|
gametextpal(d,yy, ud.levelstats ? "Shown" : "Hidden", 0, 0); break;
|
|
case 2:
|
|
{
|
|
short sbs, sbsl;
|
|
sbs = sbsl = scale(max(0,ud.statusbarscale-50),63,100-50);
|
|
barsm(d+8,yy+7, (short *)&sbs,9,x==io,SHX(-5),PHX(-5));
|
|
if (x == io && sbs != sbsl) {
|
|
sbs = scale(sbs,100-50,63)+50;
|
|
setstatusbarscale(sbs);
|
|
}
|
|
}
|
|
break;
|
|
case 3: if (ps[myconnectindex].gm&MODE_GAME || numplayers > 1) enabled = 0;
|
|
if (enabled && x==io) ud.mouseaiming = !ud.mouseaiming;
|
|
if (enabled) modval(0,1,(int *)&ud.mouseaiming,1,probey==3);
|
|
// don't change when in a multiplayer game
|
|
// because the state is sent during getnames()
|
|
// however, this will be fixed later
|
|
gametextpal(d,yy, ud.mouseaiming ? "Held" : "Toggle", enabled?0:10, 0); break;
|
|
case 4: enabled = !ud.mouseaiming;
|
|
if (enabled && x==io) myaimmode = 1-myaimmode;
|
|
if (enabled) modval(0,1,(int *)&myaimmode,1,probey==4);
|
|
gametextpal(d,yy, myaimmode && enabled ? "On" : "Off", enabled?0:10, 0); break;
|
|
case 5: if (x==io) ud.mouseflip = 1-ud.mouseflip;
|
|
modval(0,1,(int *)&ud.mouseflip,1,probey==5);
|
|
gametextpal(d,yy, ud.mouseflip ? "On" : "Off", 0, 0); break;
|
|
case 6: if (ps[myconnectindex].gm&MODE_GAME || numplayers > 1) enabled = 0;
|
|
if (enabled && x==io) AutoAim = 1-AutoAim;
|
|
if (enabled) modval(0,1,(int *)&AutoAim,1,probey==6);
|
|
gametextpal(d,yy, AutoAim ? "On" : "Off", enabled?0:10, 0); break;
|
|
case 7: if (x==io) ud.runkey_mode = 1-ud.runkey_mode;
|
|
modval(0,1,(int *)&ud.runkey_mode,1,probey==7);
|
|
gametextpal(d,yy, ud.runkey_mode ? "Classic" : "Modern", 0, 0); break;
|
|
case 8: if (ps[myconnectindex].gm&MODE_GAME || numplayers > 1) enabled = 0;
|
|
if (enabled && x==io) { ud.weaponswitch = (ud.weaponswitch == 3) ? 0 : ud.weaponswitch+1; }
|
|
if (enabled) modval(0,3,(int *)&ud.weaponswitch,1,probey==8);
|
|
{ char *s[] = { "Off", "Pickup", "Empty", "Both" };
|
|
gametextpal(d,yy, s[ud.weaponswitch], enabled?0:10, 0); break; }
|
|
break;
|
|
case 9: barsm(d+8,yy+7, (short *)&ud.screen_size,-4,x==io,SHX(-5),PHX(-5)); break;
|
|
case 10: if (x==io) ud.detail = 1-ud.detail;
|
|
modval(0,1,(int *)&ud.detail,1,probey==10);
|
|
gametextpal(d,yy, ud.detail ? "High" : "Low", 0, 0); break;
|
|
case 11: if (x==io) ud.shadows = 1-ud.shadows;
|
|
modval(0,1,(int *)&ud.shadows,1,probey==11);
|
|
gametextpal(d,yy, ud.shadows ? "On" : "Off", 0, 0); break;
|
|
case 12: if (x==io) ud.screen_tilting = 1-ud.screen_tilting;
|
|
modval(0,1,(int *)&ud.screen_tilting,1,probey==12);
|
|
gametextpal(d,yy, ud.screen_tilting ? "On" : "Off", 0, 0); break; // original had a 'full' option
|
|
case 13: if (x==io) {
|
|
enabled = !((ps[myconnectindex].gm&MODE_GAME) && ud.m_recstat != 1);
|
|
if( (ps[myconnectindex].gm&MODE_GAME) ) closedemowrite();
|
|
else ud.m_recstat = !ud.m_recstat;
|
|
}
|
|
if( (ps[myconnectindex].gm&MODE_GAME) && ud.m_recstat != 1 )
|
|
enabled = 0;
|
|
gametextpal(d,yy, ud.m_recstat ? ((ud.m_recstat && enabled && ps[myconnectindex].gm&MODE_GAME) ? "Recording" : "On") : "Off", 0, !enabled ? 1 : 0); break;
|
|
case 14: if (x==io) cmenu(201); break;
|
|
default: break;
|
|
}
|
|
gametextpal(c,yy, opts[ii], enabled?5:15, 2);
|
|
io++;
|
|
yy += 8;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 201:
|
|
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"GAME OPTIONS");
|
|
|
|
c = (320>>1)-120;
|
|
|
|
{
|
|
int io, ii, yy, d=c+160+40, enabled;
|
|
char *opts[] = {
|
|
"HUD weapon",
|
|
"FPS counter",
|
|
"-",
|
|
"Hightile textures",
|
|
"Precache textures",
|
|
"GL texture compression",
|
|
"Cache textures on disk",
|
|
"Compress disk cache",
|
|
"-",
|
|
"Models",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"-",
|
|
"Previous page",
|
|
NULL
|
|
};
|
|
|
|
yy = 34;
|
|
for (ii=io=0; opts[ii]; ii++) {
|
|
if (opts[ii][0] == '-' && !opts[ii][1]) {
|
|
if (io <= probey) yy += 4;
|
|
continue;
|
|
}
|
|
if (io < probey) yy += 8;
|
|
io++;
|
|
}
|
|
|
|
onbar = (probey == 2 || probey == 9);
|
|
x = probesm(c,yy+5,0,io);
|
|
|
|
if (x == -1) { cmenu(202); break; }
|
|
|
|
yy = 34;
|
|
for (ii=io=0; opts[ii]; ii++) {
|
|
if (opts[ii][0] == '-' && !opts[ii][1]) {
|
|
yy += 4;
|
|
continue;
|
|
}
|
|
enabled = 1;
|
|
switch (io) {
|
|
case 0: if (x==io) ud.drawweapon = 1-ud.drawweapon;
|
|
modval(0,1,(int *)&ud.drawweapon,1,probey==0);
|
|
gametextpal(d,yy, ud.drawweapon ? "On" : "Off", 0, 0); break;
|
|
case 1: if (x==io) ud.tickrate = 1-ud.tickrate;
|
|
modval(0,1,(int *)&ud.tickrate,1,probey==1);
|
|
gametextpal(d,yy, ud.tickrate ? "On" : "Off", 0, 0); break;
|
|
case 2: if (x==io) usehightile = 1-usehightile;
|
|
modval(0,1,(int *)&usehightile,1,probey==2);
|
|
gametextpal(d,yy, usehightile ? "On" : "Off", 0, 0); break;
|
|
case 3: enabled = usehightile;
|
|
if (enabled && x==io) useprecache = !useprecache;
|
|
if (enabled) modval(0,1,(int *)&useprecache,1,probey==3);
|
|
// don't change when in a multiplayer game
|
|
// because the state is sent during getnames()
|
|
// however, this will be fixed later
|
|
gametextpal(d,yy, useprecache && enabled ? "On" : "Off", enabled?0:10, 0); break;
|
|
case 4: enabled = usehightile;
|
|
if (enabled && x==io) glusetexcompr = !glusetexcompr;
|
|
if (enabled) modval(0,1,(int *)&glusetexcompr,1,probey==4);
|
|
gametextpal(d,yy, glusetexcompr && enabled ? "On" : "Off", enabled?0:10, 0); break;
|
|
case 5: enabled = (glusetexcompr && usehightile && useprecache);
|
|
if (enabled && x==io) glusetexcache = !glusetexcache;
|
|
if (enabled) modval(0,1,(int *)&glusetexcache,1,probey==5);
|
|
gametextpal(d,yy, glusetexcache && enabled ? "On" : "Off", enabled?0:10, 0); break;
|
|
case 6: enabled = (glusetexcompr && usehightile && useprecache && glusetexcache);
|
|
if (enabled && x==io) glusetexcachecompression = !glusetexcachecompression;
|
|
if (enabled) modval(0,1,(int *)&glusetexcachecompression,1,probey==6);
|
|
gametextpal(d,yy, glusetexcachecompression && enabled ? "On" : "Off", enabled?0:10, 0); break;
|
|
case 7: if (x==io) usemodels = 1-usemodels;
|
|
modval(0,1,(int *)&usemodels,1,probey==7);
|
|
gametextpal(d,yy, usemodels ? "On" : "Off", 0, 0); break;
|
|
case 8: if (x==io) cmenu(200); break;
|
|
default: break;
|
|
}
|
|
gametextpal(c,yy, opts[ii], enabled?5:15, 2);
|
|
io++;
|
|
yy += 8;
|
|
}
|
|
}
|
|
break;
|
|
|
|
// JBF 20031205: Second level options menu selection
|
|
case 202:
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"OPTIONS");
|
|
|
|
c = 200>>1;
|
|
|
|
onbar = 0;
|
|
x = probe(160,c-18-18-18,18,7);
|
|
|
|
switch (x) {
|
|
case -1:
|
|
if(ps[myconnectindex].gm&MODE_GAME) cmenu(50);else cmenu(0);
|
|
break;
|
|
|
|
case 0:
|
|
cmenu(200);
|
|
break;
|
|
|
|
case 1:
|
|
cmenu(700);
|
|
break;
|
|
|
|
case 2:
|
|
{
|
|
int dax = xdim, day = ydim, daz;
|
|
curvidmode = newvidmode = checkvideomode(&dax,&day,bpp,fullscreen);
|
|
if (newvidmode == 0x7fffffffl) newvidmode = validmodecnt;
|
|
newfullscreen = fullscreen;
|
|
changesmade = 0;
|
|
|
|
dax = 0;
|
|
for (day = 0; day < validmodecnt; day++) {
|
|
if (dax == sizeof(vidsets)/sizeof(vidsets[1])) break;
|
|
for (daz = 0; daz < dax; daz++)
|
|
if ((validmode[day].bpp|((validmode[day].fs&1)<<16)) == (vidsets[daz]&0x1ffffl)) break;
|
|
if (vidsets[daz] != -1) continue;
|
|
if (validmode[day].bpp == 8) {
|
|
vidsets[dax++] = 8|((validmode[day].fs&1)<<16);
|
|
vidsets[dax++] = 0x20000|8|((validmode[day].fs&1)<<16);
|
|
} else
|
|
vidsets[dax++] = 0x20000|validmode[day].bpp|((validmode[day].fs&1)<<16);
|
|
}
|
|
for (dax = 0; dax < (long)(sizeof(vidsets)/sizeof(vidsets[1])) && vidsets[dax] != -1; dax++)
|
|
if (vidsets[dax] == (((getrendermode()>=2)<<17)|(fullscreen<<16)|bpp)) break;
|
|
if (dax < (long)(sizeof(vidsets)/sizeof(vidsets[1]))) newvidset = dax;
|
|
curvidset = newvidset;
|
|
|
|
cmenu(203);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
currentlist = 0;
|
|
case 4:
|
|
case 5:
|
|
if (x==5 && (!CONTROL_JoystickEnabled || !CONTROL_JoyPresent)) break;
|
|
cmenu(204+x-3);
|
|
break;
|
|
|
|
case 6:
|
|
#ifndef AUSTRALIA
|
|
cmenu(10000);
|
|
#endif
|
|
break;
|
|
}
|
|
|
|
menutext(160,c-18-18-18,0,0,"GAME OPTIONS");
|
|
menutext(160,c-18-18, 0,0,"SOUND OPTIONS");
|
|
menutext(160,c-18, 0,0,"VIDEO SETTINGS");
|
|
menutext(160,c, 0,0,"KEYBOARD SETUP");
|
|
menutext(160,c+18, 0,0,"MOUSE SETUP");
|
|
menutext(160,c+18+18, 0,CONTROL_JoyPresent==0 || CONTROL_JoystickEnabled==0,"JOYSTICK SETUP");
|
|
menutext(160,c+18+18+18,0,0,"PARENTAL LOCK");
|
|
break;
|
|
|
|
// JBF 20031206: Video settings menu
|
|
case 203:
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"VIDEO SETTINGS");
|
|
|
|
c = (320>>1)-120;
|
|
|
|
#if defined(POLYMOST) && defined(USE_OPENGL)
|
|
x = 7;
|
|
#else
|
|
x = 5;
|
|
#endif
|
|
onbar = (probey == 4);
|
|
if (probey == 0 || probey == 1 || probey == 2)
|
|
x = probe(c+6,50,16,x);
|
|
else if (probey == 3)
|
|
x = probe(c+6,50+16+16+22,0,x);
|
|
else
|
|
x = probe(c+6,50+62-16-16-16,16,x);
|
|
|
|
if (probey==0 && (KB_KeyPressed(sc_LeftArrow) || KB_KeyPressed(sc_RightArrow))) {
|
|
sound(PISTOL_BODYHIT);
|
|
x=0;
|
|
}
|
|
switch (x) {
|
|
case -1:
|
|
cmenu(202);
|
|
probey = 2;
|
|
break;
|
|
|
|
case 0:
|
|
do {
|
|
if (KB_KeyPressed(sc_LeftArrow)) {
|
|
newvidmode--;
|
|
if (newvidmode < 0) newvidmode = validmodecnt-1;
|
|
} else {
|
|
newvidmode++;
|
|
if (newvidmode >= validmodecnt) newvidmode = 0;
|
|
}
|
|
} while ((validmode[newvidmode].fs&1) != ((vidsets[newvidset]>>16)&1) || validmode[newvidmode].bpp != (vidsets[newvidset] & 0x0ffff));
|
|
//OSD_Printf("New mode is %dx%dx%d-%d %d\n",validmode[newvidmode].xdim,validmode[newvidmode].ydim,validmode[newvidmode].bpp,validmode[newvidmode].fs,newvidmode);
|
|
if ((curvidmode == 0x7fffffffl && newvidmode == validmodecnt) || curvidmode == newvidmode)
|
|
changesmade &= ~1;
|
|
else
|
|
changesmade |= 1;
|
|
KB_ClearKeyDown(sc_LeftArrow);
|
|
KB_ClearKeyDown(sc_RightArrow);
|
|
break;
|
|
|
|
case 1:
|
|
{
|
|
int lastvidset, lastvidmode, safevidmode = -1;
|
|
lastvidset = newvidset;
|
|
lastvidmode = newvidmode;
|
|
// find the next vidset compatible with the current fullscreen setting
|
|
while (vidsets[0] != -1) {
|
|
newvidset++;
|
|
if (newvidset == sizeof(vidsets)/sizeof(vidsets[0]) || vidsets[newvidset] == -1) { newvidset = -1; continue; }
|
|
if (((vidsets[newvidset]>>16)&1) != newfullscreen) continue;
|
|
break;
|
|
}
|
|
|
|
if ((vidsets[newvidset] & 0x0ffff) != (vidsets[lastvidset] & 0x0ffff)) {
|
|
// adjust the video mode to something legal for the new vidset
|
|
do {
|
|
newvidmode++;
|
|
if (newvidmode == lastvidmode) break; // end of cycle
|
|
if (newvidmode >= validmodecnt) newvidmode = 0;
|
|
if (validmode[newvidmode].bpp == (vidsets[newvidset]&0x0ffff) &&
|
|
validmode[newvidmode].fs == newfullscreen &&
|
|
validmode[newvidmode].xdim <= validmode[lastvidmode].xdim &&
|
|
(safevidmode==-1?1:(validmode[newvidmode].xdim>=validmode[safevidmode].xdim)) &&
|
|
validmode[newvidmode].ydim <= validmode[lastvidmode].ydim &&
|
|
(safevidmode==-1?1:(validmode[newvidmode].ydim>=validmode[safevidmode].ydim))
|
|
)
|
|
safevidmode = newvidmode;
|
|
} while (1);
|
|
if (safevidmode == -1) {
|
|
//OSD_Printf("No best fit!\n");
|
|
newvidmode = lastvidmode;
|
|
newvidset = lastvidset;
|
|
} else {
|
|
//OSD_Printf("Best fit is %dx%dx%d-%d %d\n",validmode[safevidmode].xdim,validmode[safevidmode].ydim,validmode[safevidmode].bpp,validmode[safevidmode].fs,safevidmode);
|
|
newvidmode = safevidmode;
|
|
}
|
|
}
|
|
if (newvidset != curvidset) changesmade |= 4; else changesmade &= ~4;
|
|
if (newvidmode != curvidmode) changesmade |= 1; else changesmade &= ~1;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
newfullscreen = !newfullscreen;
|
|
{
|
|
int lastvidset, lastvidmode, safevidmode = -1, safevidset = -1;
|
|
lastvidset = newvidset;
|
|
lastvidmode = newvidmode;
|
|
// find the next vidset compatible with the current fullscreen setting
|
|
while (vidsets[0] != -1) {
|
|
newvidset++;
|
|
if (newvidset == lastvidset) break;
|
|
if (newvidset == sizeof(vidsets)/sizeof(vidsets[0]) || vidsets[newvidset] == -1) { newvidset = -1; continue; }
|
|
if (((vidsets[newvidset]>>16)&1) != newfullscreen) continue;
|
|
if ((vidsets[newvidset] & 0x2ffff) != (vidsets[lastvidset] & 0x2ffff)) {
|
|
if ((vidsets[newvidset] & 0x20000) == (vidsets[lastvidset] & 0x20000)) safevidset = newvidset;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
if (newvidset == lastvidset) {
|
|
if (safevidset == -1) {
|
|
newfullscreen = !newfullscreen;
|
|
break;
|
|
} else {
|
|
newvidset = safevidset;
|
|
}
|
|
}
|
|
|
|
// adjust the video mode to something legal for the new vidset
|
|
do {
|
|
newvidmode++;
|
|
if (newvidmode == lastvidmode) break; // end of cycle
|
|
if (newvidmode >= validmodecnt) newvidmode = 0;
|
|
if (validmode[newvidmode].bpp == (vidsets[newvidset]&0x0ffff) &&
|
|
validmode[newvidmode].fs == newfullscreen &&
|
|
validmode[newvidmode].xdim <= validmode[lastvidmode].xdim &&
|
|
(safevidmode==-1?1:(validmode[newvidmode].xdim>=validmode[safevidmode].xdim)) &&
|
|
validmode[newvidmode].ydim <= validmode[lastvidmode].ydim &&
|
|
(safevidmode==-1?1:(validmode[newvidmode].ydim>=validmode[safevidmode].ydim))
|
|
)
|
|
safevidmode = newvidmode;
|
|
} while (1);
|
|
if (safevidmode == -1) {
|
|
//OSD_Printf("No best fit!\n");
|
|
newvidmode = lastvidmode;
|
|
newvidset = lastvidset;
|
|
newfullscreen = !newfullscreen;
|
|
} else {
|
|
//OSD_Printf("Best fit is %dx%dx%d-%d %d\n",validmode[safevidmode].xdim,validmode[safevidmode].ydo,,validmode[safevidmode].bpp,validmode[safevidmode].fs,safevidmode);
|
|
newvidmode = safevidmode;
|
|
}
|
|
if (newvidset != curvidset) changesmade |= 4; else changesmade &= ~4;
|
|
if (newvidmode != curvidmode) changesmade |= 1; else changesmade &= ~1;
|
|
}
|
|
if (newfullscreen == fullscreen) changesmade &= ~2; else changesmade |= 2;
|
|
break;
|
|
|
|
case 3:
|
|
if (!changesmade) break;
|
|
{
|
|
long pxdim, pydim, pfs, pbpp, prend;
|
|
long nxdim, nydim, nfs, nbpp, nrend;
|
|
|
|
pxdim = xdim; pydim = ydim; pbpp = bpp; pfs = fullscreen; prend = getrendermode();
|
|
nxdim = (newvidmode==validmodecnt)?xdim:validmode[newvidmode].xdim;
|
|
nydim = (newvidmode==validmodecnt)?ydim:validmode[newvidmode].ydim;
|
|
nfs = newfullscreen;
|
|
nbpp = (newvidmode==validmodecnt)?bpp:validmode[newvidmode].bpp;
|
|
nrend = (vidsets[newvidset] & 0x20000) ? (nbpp==8?2:3) : 0;
|
|
|
|
if (setgamemode(nfs, nxdim, nydim, nbpp) < 0) {
|
|
if (setgamemode(pfs, pxdim, pydim, pbpp) < 0) {
|
|
setrendermode(prend);
|
|
gameexit("Failed restoring old video mode.");
|
|
} else onvideomodechange(pbpp > 8);
|
|
} else onvideomodechange(nbpp > 8);
|
|
vscrn();
|
|
setrendermode(nrend);
|
|
|
|
curvidmode = newvidmode; curvidset = newvidset;
|
|
changesmade = 0;
|
|
|
|
ScreenMode = fullscreen;
|
|
ScreenWidth = xdim;
|
|
ScreenHeight = ydim;
|
|
ScreenBPP = bpp;
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
break;
|
|
|
|
#if defined(POLYMOST) && defined(USE_OPENGL)
|
|
case 5:
|
|
if (bpp==8) break;
|
|
switch (gltexfiltermode) {
|
|
case 0: gltexfiltermode = 3; break;
|
|
case 3: gltexfiltermode = 5; break;
|
|
case 5: gltexfiltermode = 0; break;
|
|
default: gltexfiltermode = 3; break;
|
|
}
|
|
gltexapplyprops();
|
|
break;
|
|
|
|
case 6:
|
|
if (bpp==8) break;
|
|
glanisotropy *= 2;
|
|
if (glanisotropy > glinfo.maxanisotropy) glanisotropy = 1;
|
|
gltexapplyprops();
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
menutext(c,50,0,0,"RESOLUTION");
|
|
sprintf(tempbuf,"%ld x %ld",
|
|
(newvidmode==validmodecnt)?xdim:validmode[newvidmode].xdim,
|
|
(newvidmode==validmodecnt)?ydim:validmode[newvidmode].ydim);
|
|
gametext(c+154,50-8,tempbuf,0,2+8+16);
|
|
|
|
menutext(c,50+16,0,0,"VIDEO MODE");
|
|
sprintf(tempbuf, "%dbit %s", vidsets[newvidset]&0x0ffff, (vidsets[newvidset]&0x20000)?"Polymost":"Classic");
|
|
gametext(c+154,50+16-8,tempbuf,0,2+8+16);
|
|
|
|
menutext(c,50+16+16,0,0,"FULLSCREEN");
|
|
menutext(c+154,50+16+16,0,0,newfullscreen?"YES":"NO");
|
|
|
|
menutext(c+16,50+16+16+22,0,changesmade==0,"APPLY CHANGES");
|
|
|
|
menutext(c,50+62+16,SHX(-6),PHX(-6),"BRIGHTNESS");
|
|
{
|
|
short ss = ud.brightness;
|
|
bar(c+167,50+62+16,&ss,8,x==4,SHX(-6),PHX(-6));
|
|
if(x==4) {
|
|
ud.brightness = ss;
|
|
setbrightness(ud.brightness>>2,&ps[myconnectindex].palette[0],0);
|
|
}
|
|
}
|
|
|
|
#if defined(POLYMOST) && defined(USE_OPENGL)
|
|
menutext(c,50+62+16+16,0,bpp==8,"FILTERING");
|
|
switch (gltexfiltermode) {
|
|
case 0: strcpy(tempbuf,"NEAREST"); break;
|
|
case 3: strcpy(tempbuf,"BILINEAR"); break;
|
|
case 5: strcpy(tempbuf,"TRILINEAR"); break;
|
|
default: strcpy(tempbuf,"OTHER"); break;
|
|
}
|
|
menutext(c+154,50+62+16+16,0,bpp==8,tempbuf);
|
|
|
|
menutext(c,50+62+16+16+16,0,bpp==8,"ANISOTROPY");
|
|
if (glanisotropy == 1) strcpy(tempbuf,"NONE");
|
|
else sprintf(tempbuf,"%ld-tap",glanisotropy);
|
|
menutext(c+154,50+62+16+16+16,0,bpp==8,tempbuf);
|
|
#endif
|
|
break;
|
|
|
|
case 204:
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"KEYS SETUP");
|
|
|
|
c = (320>>1)-120;
|
|
|
|
onbar = 0;
|
|
x = probe(0,0,0,NUMGAMEFUNCTIONS);
|
|
|
|
if (x==-1) {
|
|
cmenu(202);
|
|
probey = 3;
|
|
} else if (x>=0) {
|
|
function = probey;
|
|
whichkey = currentlist;
|
|
cmenu(210);
|
|
KB_FlushKeyboardQueue();
|
|
KB_ClearLastScanCode();
|
|
break;
|
|
}
|
|
|
|
// the top of our list
|
|
m = probey - 6;
|
|
if (m < 0) m = 0;
|
|
else if (m + 13 >= NUMGAMEFUNCTIONS) m = NUMGAMEFUNCTIONS-13;
|
|
|
|
if (probey == gamefunc_Show_Console) currentlist = 0;
|
|
else if (KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) ||
|
|
KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) ||
|
|
KB_KeyPressed( sc_Tab )) {
|
|
currentlist ^= 1;
|
|
KB_ClearKeyDown( sc_LeftArrow );
|
|
KB_ClearKeyDown( sc_RightArrow );
|
|
KB_ClearKeyDown( sc_kpad_4 );
|
|
KB_ClearKeyDown( sc_kpad_6 );
|
|
KB_ClearKeyDown( sc_Tab );
|
|
sound(KICK_HIT);
|
|
} else if (KB_KeyPressed( sc_Delete )) {
|
|
KeyboardKeys[probey][currentlist] = 0;
|
|
CONTROL_MapKey( probey, KeyboardKeys[probey][0], KeyboardKeys[probey][1] );
|
|
sound(KICK_HIT);
|
|
KB_ClearKeyDown( sc_Delete );
|
|
}
|
|
|
|
for (l=0; l < min(13,NUMGAMEFUNCTIONS); l++) {
|
|
p = CONFIG_FunctionNumToName(m+l);
|
|
if (!p) continue;
|
|
|
|
strcpy(tempbuf, p);
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitextshade(70,34+l*8,tempbuf,(m+l == probey)?0:16,1,10+16);
|
|
|
|
//strcpy(tempbuf, KB_ScanCodeToString(KeyboardKeys[m+l][0]));
|
|
strcpy(tempbuf, getkeyname(KeyboardKeys[m+l][0]));
|
|
if (!tempbuf[0]) strcpy(tempbuf, " -");
|
|
minitextshade(70+100,34+l*8,tempbuf,
|
|
(m+l == probey && !currentlist?0:16),2,10+16);
|
|
|
|
//strcpy(tempbuf, KB_ScanCodeToString(KeyboardKeys[m+l][1]));
|
|
strcpy(tempbuf, getkeyname(KeyboardKeys[m+l][1]));
|
|
if (!tempbuf[0]) strcpy(tempbuf, " -");
|
|
minitextshade(70+120+34,34+l*8,tempbuf,
|
|
(m+l == probey && currentlist?0:16),2,10+16);
|
|
}
|
|
|
|
gametext(160,144,"UP/DOWN = SELECT ACTION",0,2+8+16);
|
|
gametext(160,144+9,"LEFT/RIGHT = SELECT LIST",0,2+8+16);
|
|
gametext(160,144+9+9,"ENTER = MODIFY DELETE = CLEAR",0,2+8+16);
|
|
|
|
break;
|
|
|
|
case 210: {
|
|
int32 sc;
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"KEYS SETUP");
|
|
|
|
gametext(320>>1,90,"PRESS THE KEY TO ASSIGN AS",0,2+8+16);
|
|
sprintf(tempbuf,"%s FOR \"%s\"", whichkey?"SECONDARY":"PRIMARY", CONFIG_FunctionNumToName(function));
|
|
gametext(320>>1,90+9,tempbuf,0,2+8+16);
|
|
gametext(320>>1,90+9+9+9,"PRESS \"ESCAPE\" TO CANCEL",0,2+8+16);
|
|
|
|
sc = KB_GetLastScanCode();
|
|
if ( sc != sc_None ) {
|
|
if ( sc == sc_Escape ) {
|
|
sound(EXITMENUSOUND);
|
|
} else {
|
|
sound(PISTOL_BODYHIT);
|
|
|
|
KeyboardKeys[function][whichkey] = KB_GetLastScanCode();
|
|
if (function == gamefunc_Show_Console)
|
|
OSD_CaptureKey(KB_GetLastScanCode());
|
|
else
|
|
CONTROL_MapKey( function, KeyboardKeys[function][0], KeyboardKeys[function][1] );
|
|
}
|
|
|
|
cmenu(204);
|
|
|
|
currentlist = whichkey;
|
|
probey = function;
|
|
|
|
KB_ClearKeyDown(sc);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 205:
|
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,15,0,0,"MOUSE SETUP");
|
|
|
|
c = 60-4;
|
|
|
|
onbar = (probey == (MAXMOUSEBUTTONS-2)*2+2);
|
|
if (probey < (MAXMOUSEBUTTONS-2)*2+2)
|
|
x = probe(0,0,0,(MAXMOUSEBUTTONS-2)*2+2+2);
|
|
else
|
|
x = probe(c+6,125-((MAXMOUSEBUTTONS-2)*2+2)*16,16,(MAXMOUSEBUTTONS-2)*2+2+2);
|
|
|
|
if (x==-1) {
|
|
cmenu(202);
|
|
probey = 4;
|
|
break;
|
|
} else if (x == (MAXMOUSEBUTTONS-2)*2+2) {
|
|
// sensitivity
|
|
} else if (x == (MAXMOUSEBUTTONS-2)*2+2+1) {
|
|
//advanced
|
|
cmenu(212);
|
|
break;
|
|
} else if (x >= 0) {
|
|
//set an option
|
|
cmenu(211);
|
|
function = 0;
|
|
whichkey = x;
|
|
if (x < (MAXMOUSEBUTTONS-2)*2)
|
|
probey = MouseFunctions[x>>1][x&1];
|
|
else
|
|
probey = MouseFunctions[x-4][0];
|
|
if (probey < 0) probey = NUMGAMEFUNCTIONS-1;
|
|
break;
|
|
}
|
|
|
|
for (l=0; l < (MAXMOUSEBUTTONS-2)*2+2; l++) {
|
|
tempbuf[0] = 0;
|
|
if (l < (MAXMOUSEBUTTONS-2)*2) {
|
|
if (l&1) {
|
|
Bstrcpy(tempbuf, "Double ");
|
|
m = MouseFunctions[l>>1][1];
|
|
} else
|
|
m = MouseFunctions[l>>1][0];
|
|
Bstrcat(tempbuf, mousebuttonnames[l>>1]);
|
|
} else {
|
|
Bstrcpy(tempbuf, mousebuttonnames[l-(MAXMOUSEBUTTONS-2)]);
|
|
m = MouseFunctions[l-(MAXMOUSEBUTTONS-2)][0];
|
|
}
|
|
|
|
minitextshade(c+20,30+l*8,tempbuf,(l==probey)?0:16,1,10+16);
|
|
|
|
if (m == -1)
|
|
minitextshade(c+100+20,30+l*8," -NONE-",(l==probey)?0:16,2,10+16);
|
|
else {
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(m));
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitextshade(c+100+20,30+l*8,tempbuf,(l==probey)?0:16,2,10+16);
|
|
}
|
|
}
|
|
|
|
{
|
|
short sense;
|
|
sense = CONTROL_GetMouseSensitivity()>>10;
|
|
|
|
menutext(c,125,SHX(-7),PHX(-7),"SENSITIVITY");
|
|
bar(c+167,125,&sense,4,x==(MAXMOUSEBUTTONS-2)*2+2,SHX(-7),PHX(-7));
|
|
CONTROL_SetMouseSensitivity( sense<<10 );
|
|
}
|
|
|
|
menutext(c,125+16,0,0,"ADVANCED...");
|
|
|
|
if (probey < (MAXMOUSEBUTTONS-2)*2+2) {
|
|
gametext(160,149,"UP/DOWN = SELECT BUTTON",0,2+8+16);
|
|
gametext(160,149+9,"ENTER = MODIFY",0,2+8+16);
|
|
}
|
|
break;
|
|
|
|
case 211:
|
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
if (function == 0) menutext(320>>1,15,0,0,"MOUSE SETUP");
|
|
else if (function == 1) menutext(320>>1,15,0,0,"ADVANCED MOUSE");
|
|
else if (function == 2) menutext(320>>1,15,0,0,"JOYSTICK BUTTONS");
|
|
else if (function == 3) menutext(320>>1,15,0,0,"JOYSTICK AXES");
|
|
|
|
x = probe(0,0,0,NUMGAMEFUNCTIONS);
|
|
|
|
if (x==-1) {
|
|
if (function == 0) { // mouse button
|
|
cmenu(205);
|
|
probey = whichkey;
|
|
} else if (function == 1) { // mouse digital axis
|
|
cmenu(212);
|
|
probey = 2+(whichkey^2);
|
|
} else if (function == 2) { // joystick button/hat
|
|
cmenu(207);
|
|
probey = whichkey;
|
|
} else if (function == 3) { // joystick digital axis
|
|
cmenu((whichkey>>2)+208);
|
|
probey = 1+((whichkey>>1)&1)*4+(whichkey&1);
|
|
}
|
|
break;
|
|
} else if (x >= 0) {
|
|
if (x == NUMGAMEFUNCTIONS-1) x = -1;
|
|
|
|
if (function == 0) {
|
|
if (whichkey < (MAXMOUSEBUTTONS-2)*2) {
|
|
MouseFunctions[whichkey>>1][whichkey&1] = x;
|
|
CONTROL_MapButton( x, whichkey>>1, whichkey&1, controldevice_mouse);
|
|
} else {
|
|
MouseFunctions[whichkey-(MAXMOUSEBUTTONS-2)][0] = x;
|
|
CONTROL_MapButton( x, whichkey-(MAXMOUSEBUTTONS-2), 0, controldevice_mouse);
|
|
}
|
|
cmenu(205);
|
|
probey = whichkey;
|
|
} else if (function == 1) {
|
|
MouseDigitalFunctions[whichkey>>1][whichkey&1] = x;
|
|
CONTROL_MapDigitalAxis(whichkey>>1, x, whichkey&1, controldevice_mouse);
|
|
cmenu(212);
|
|
probey = 2+(whichkey^2);
|
|
} else if (function == 2) {
|
|
if (whichkey < 2*joynumbuttons) {
|
|
JoystickFunctions[whichkey>>1][whichkey&1] = x;
|
|
CONTROL_MapButton( x, whichkey>>1, whichkey&1, controldevice_joystick);
|
|
} else {
|
|
JoystickFunctions[joynumbuttons + (whichkey-2*joynumbuttons)][0] = x;
|
|
CONTROL_MapButton( x, joynumbuttons + (whichkey-2*joynumbuttons), 0, controldevice_joystick);
|
|
}
|
|
cmenu(207);
|
|
probey = whichkey;
|
|
} else if (function == 3) {
|
|
JoystickDigitalFunctions[whichkey>>1][whichkey&1] = x;
|
|
CONTROL_MapDigitalAxis(whichkey>>1, x, whichkey&1, controldevice_joystick);
|
|
cmenu((whichkey>>2)+208);
|
|
probey = 1+((whichkey>>1)&1)*4+(whichkey&1);
|
|
}
|
|
break;
|
|
}
|
|
|
|
gametext(320>>1,25,"SELECT A FUNCTION TO ASSIGN",0,2+8+16);
|
|
|
|
if (function == 0) {
|
|
if (whichkey < (MAXMOUSEBUTTONS-2)*2)
|
|
sprintf(tempbuf,"TO %s%s", (whichkey&1)?"DOUBLE-CLICKED ":"", mousebuttonnames[whichkey>>1]);
|
|
else
|
|
Bstrcpy(tempbuf, mousebuttonnames[whichkey-(MAXMOUSEBUTTONS-2)]);
|
|
} else if (function == 1) {
|
|
Bstrcpy(tempbuf,"TO DIGITAL ");
|
|
switch (whichkey) {
|
|
case 0: Bstrcat(tempbuf, "LEFT"); break;
|
|
case 1: Bstrcat(tempbuf, "RIGHT"); break;
|
|
case 2: Bstrcat(tempbuf, "UP"); break;
|
|
case 3: Bstrcat(tempbuf, "DOWN"); break;
|
|
}
|
|
} else if (function == 2) {
|
|
static char *directions[] = { "UP", "RIGHT", "DOWN", "LEFT" };
|
|
if (whichkey < 2*joynumbuttons)
|
|
Bsprintf(tempbuf,"TO %s%s", (whichkey&1)?"DOUBLE-CLICKED ":"", getjoyname(1,whichkey>>1));
|
|
else
|
|
Bsprintf(tempbuf,"TO HAT %s", directions[whichkey-2*joynumbuttons]);
|
|
} else if (function == 3) {
|
|
Bsprintf(tempbuf,"TO DIGITAL %s %s",getjoyname(0,whichkey>>1),(whichkey&1)?"POSITIVE":"NEGATIVE");
|
|
}
|
|
|
|
gametext(320>>1,25+9,tempbuf,0,2+8+16);
|
|
|
|
if (KB_KeyPressed( sc_End )) { KB_ClearKeyDown(sc_End); probey = NUMGAMEFUNCTIONS-1; sound(KICK_HIT); }
|
|
else if (KB_KeyPressed( sc_Home )) { KB_ClearKeyDown(sc_Home); probey = 0; sound(KICK_HIT); }
|
|
|
|
m = probey - 6;
|
|
if (m < 0) m = 0;
|
|
else if (m + 13 >= NUMGAMEFUNCTIONS) m = NUMGAMEFUNCTIONS-13;
|
|
|
|
for (l=0; l < min(13,NUMGAMEFUNCTIONS); l++) {
|
|
if (l+m == NUMGAMEFUNCTIONS-1)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(m+l));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(100,46+l*8,tempbuf,(m+l == probey)?0:16,10+16);
|
|
}
|
|
|
|
gametext(320>>1,154,"PRESS \"ESCAPE\" TO CANCEL",0,2+8+16);
|
|
|
|
break;
|
|
|
|
case 212:
|
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,15,0,0,"ADVANCED MOUSE");
|
|
|
|
c = (320>>1)-120;
|
|
|
|
onbar = (probey == 0 || probey == 1);
|
|
if (probey < 2)
|
|
x = probe(c+6,40,16,6);
|
|
else if (probey < 6) {
|
|
m=50;
|
|
x = probe(c+6+10,91-(10+10),10,6);
|
|
} else {
|
|
x = probe(c+6,140-(16+16+16+16+16+16),16,6);
|
|
}
|
|
|
|
switch (x) {
|
|
case -1:
|
|
cmenu(205);
|
|
probey = (MAXMOUSEBUTTONS-2)*2+2+1;
|
|
break;
|
|
|
|
case 0:
|
|
// x-axis scale
|
|
case 1:
|
|
// y-axis scale
|
|
break;
|
|
|
|
case 2:
|
|
// digital up
|
|
case 3:
|
|
// digital down
|
|
case 4:
|
|
// digital left
|
|
case 5:
|
|
// digital right
|
|
function = 1;
|
|
whichkey = (x-2)^2; // flip the actual axis number
|
|
cmenu(211);
|
|
probey = MouseDigitalFunctions[whichkey>>1][whichkey&1];
|
|
if (probey < 0) probey = NUMGAMEFUNCTIONS-1;
|
|
break;
|
|
|
|
case 6:
|
|
// analogue x
|
|
case 7:
|
|
// analogue y
|
|
l = MouseAnalogueAxes[x-6];
|
|
if (l == analog_turning) l = analog_strafing;
|
|
else if (l == analog_strafing) l = analog_lookingupanddown;
|
|
else if (l == analog_lookingupanddown) l = analog_moving;
|
|
else if (l == analog_moving) l = -1;
|
|
else l = analog_turning;
|
|
MouseAnalogueAxes[x-6] = l;
|
|
CONTROL_MapAnalogAxis(x-6,l,controldevice_mouse);
|
|
break;
|
|
|
|
}
|
|
|
|
menutext(c,40,0,0,"X-AXIS SCALE");
|
|
l = (MouseAnalogueScale[0]+262144) >> 13;
|
|
bar(c+160+40,40,(short *)&l,1,x==0,0,0);
|
|
l = (l<<13)-262144;
|
|
if (l != MouseAnalogueScale[0]) {
|
|
CONTROL_SetAnalogAxisScale( 0, l, controldevice_mouse );
|
|
MouseAnalogueScale[0] = l;
|
|
}
|
|
Bsprintf(tempbuf,"%s%.2f",l>=0?" ":"",(float)l/65536.0);
|
|
gametext(c+160-16,40-8,tempbuf,0,2+8+16);
|
|
|
|
menutext(c,40+16,0,0,"Y-AXIS SCALE");
|
|
l = (MouseAnalogueScale[1]+262144) >> 13;
|
|
bar(c+160+40,40+16,(short *)&l,1,x==1,0,0);
|
|
l = (l<<13)-262144;
|
|
if (l != MouseAnalogueScale[1]) {
|
|
CONTROL_SetAnalogAxisScale( 1, l, controldevice_mouse );
|
|
MouseAnalogueScale[1] = l;
|
|
}
|
|
Bsprintf(tempbuf,"%s%.2f",l>=0?" ":"",(float)l/65536.0);
|
|
gametext(c+160-16,40+16-8,tempbuf,0,2+8+16);
|
|
|
|
menutext(c,40+16+16+8,0,0,"DIGITAL AXES ACTIONS");
|
|
|
|
gametext(c+10,84,"UP:",0,2+8+16);
|
|
if (MouseDigitalFunctions[1][0] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(MouseDigitalFunctions[1][0]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(c+10+60,85,tempbuf,0,10+16);
|
|
|
|
gametext(c+10,84+10,"DOWN:",0,2+8+16);
|
|
if (MouseDigitalFunctions[1][1] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(MouseDigitalFunctions[1][1]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(c+10+60,85+10,tempbuf,0,10+16);
|
|
|
|
gametext(c+10,84+10+10,"LEFT:",0,2+8+16);
|
|
if (MouseDigitalFunctions[0][0] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(MouseDigitalFunctions[0][0]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(c+10+60,85+10+10,tempbuf,0,10+16);
|
|
|
|
gametext(c+10,84+10+10+10,"RIGHT:",0,2+8+16);
|
|
if (MouseDigitalFunctions[0][1] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(MouseDigitalFunctions[0][1]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(c+10+60,85+10+10+10,tempbuf,0,10+16);
|
|
|
|
/* JBF 20040107: It would appear giving these options confuses some tinkerers, so they've
|
|
* been moved to the bottom, and hidden in case I dare to reenable them again.
|
|
menutext(c,116+16+8,0,0,"ANALOG X");
|
|
if (CONFIG_AnalogNumToName( MouseAnalogueAxes[0] )) {
|
|
p = CONFIG_AnalogNumToName( MouseAnalogueAxes[0] );
|
|
if (p) {
|
|
gametext(c+148+4,118+16, strchr(p,'_')+1, 0, 2+8+16 );
|
|
}
|
|
}
|
|
if (probey == 6) gametext(160,158,"Default is \"turning\"",8,2+8+16);
|
|
|
|
menutext(c,116+16+16+8,0,0,"ANALOG Y");
|
|
if (CONFIG_AnalogNumToName( MouseAnalogueAxes[1] )) {
|
|
p = CONFIG_AnalogNumToName( MouseAnalogueAxes[1] );
|
|
if (p) {
|
|
gametext(c+148+4,118+16+16, strchr(p,'_')+1, 0, 2+8+16 );
|
|
}
|
|
}
|
|
if (probey == 7) gametext(160,158,"Default is \"moving\"",8,2+8+16);
|
|
*/
|
|
break;
|
|
|
|
case 206:
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"JOYSTICK SETUP");
|
|
|
|
x = probe(160,100-18,18,3);
|
|
|
|
switch (x) {
|
|
case -1:
|
|
cmenu(202);
|
|
probey = 5;
|
|
break;
|
|
case 0:
|
|
case 1:
|
|
cmenu(207+x);
|
|
break;
|
|
case 2:
|
|
cmenu(213);
|
|
break;
|
|
}
|
|
|
|
menutext(160,100-18,0,0,"EDIT BUTTONS");
|
|
menutext(160,100,0,0,"EDIT AXES");
|
|
menutext(160,100+18,0,0,"DEAD ZONES");
|
|
|
|
break;
|
|
|
|
case 207:
|
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,15,0,0,"JOYSTICK BUTTONS");
|
|
|
|
c = 2*joynumbuttons + 4*(joynumhats>0);
|
|
|
|
x = probe(0,0,0,c);
|
|
|
|
if (x == -1) {
|
|
cmenu(206);
|
|
probey = 0;
|
|
break;
|
|
} else if (x >= 0) {
|
|
function = 2;
|
|
whichkey = x;
|
|
cmenu(211);
|
|
if (x < 2*joynumbuttons) {
|
|
probey = JoystickFunctions[x>>1][x&1];
|
|
} else {
|
|
probey = JoystickFunctions[joynumbuttons + (x-2*joynumbuttons)][0];
|
|
}
|
|
if (probey < 0) probey = NUMGAMEFUNCTIONS-1;
|
|
break;
|
|
}
|
|
|
|
// the top of our list
|
|
if (c < 13) m = 0;
|
|
else {
|
|
m = probey - 6;
|
|
if (m < 0) m = 0;
|
|
else if (m + 13 >= c) m = c-13;
|
|
}
|
|
|
|
for (l=0; l<min(13,c); l++) {
|
|
if (m+l < 2*joynumbuttons) {
|
|
sprintf(tempbuf, "%s%s", ((l+m)&1)?"Double ":"", getjoyname(1,(l+m)>>1));
|
|
x = JoystickFunctions[(l+m)>>1][(l+m)&1];
|
|
} else {
|
|
static char *directions[] = { "Up", "Right", "Down", "Left" };
|
|
sprintf(tempbuf, "Hat %s", directions[(l+m)-2*joynumbuttons]);
|
|
x = JoystickFunctions[joynumbuttons + ((l+m)-2*joynumbuttons)][0];
|
|
}
|
|
minitextshade(80-4,33+l*8,tempbuf,(m+l == probey)?0:16,1,10+16);
|
|
|
|
if (x == -1)
|
|
minitextshade(176,33+l*8," -NONE-",(m+l==probey)?0:16,2,10+16);
|
|
else {
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(x));
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitextshade(176,33+l*8,tempbuf,(m+l==probey)?0:16,2,10+16);
|
|
}
|
|
}
|
|
|
|
gametext(160,149,"UP/DOWN = SELECT BUTTON",0,2+8+16);
|
|
gametext(160,149+9,"ENTER = MODIFY",0,2+8+16);
|
|
break;
|
|
|
|
case 208:
|
|
case 209:
|
|
case 217:
|
|
case 218:
|
|
case 219:
|
|
case 220:
|
|
case 221:
|
|
case 222:
|
|
{
|
|
int thispage, twothispage;
|
|
|
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,15,0,0,"JOYSTICK AXES");
|
|
|
|
thispage = (current_menu < 217) ? (current_menu-208) : (current_menu-217)+2;
|
|
twothispage = (thispage*2+1 < joynumaxes);
|
|
|
|
onbar = 0;
|
|
switch (probey) {
|
|
case 0:
|
|
case 4: onbar = 1; x = probe(88,45+(probey==4)*64,0,1+(4<<twothispage)); break;
|
|
case 1:
|
|
case 2:
|
|
case 5:
|
|
case 6: x = probe(172+(probey==2||probey==6)*72,45+15+(probey==5||probey==6)*64,0,1+(4<<twothispage)); break;
|
|
case 3:
|
|
case 7: x = probe(88,45+15+15+(probey==7)*64,0,1+(4<<twothispage)); break;
|
|
default: x = probe(60,79+79*twothispage,0,1+(4<<twothispage)); break;
|
|
}
|
|
|
|
switch (x) {
|
|
case -1:
|
|
cmenu(206);
|
|
probey = 1;
|
|
break;
|
|
case 8:
|
|
if (joynumaxes > 2) {
|
|
if (thispage == ((joynumaxes+1)/2)-1) cmenu(208);
|
|
else {
|
|
if (current_menu == 209) cmenu(217);
|
|
else cmenu( current_menu+1 );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 4: // bar
|
|
if (!twothispage && joynumaxes > 2)
|
|
cmenu(208);
|
|
case 0: break;
|
|
|
|
case 1: // digitals
|
|
case 2:
|
|
case 5:
|
|
case 6:
|
|
function = 3;
|
|
whichkey = ((thispage*2+(x==5||x==6)) << 1) + (x==2||x==6);
|
|
cmenu(211);
|
|
probey = JoystickDigitalFunctions[whichkey>>1][whichkey&1];
|
|
if (probey < 0) probey = NUMGAMEFUNCTIONS-1;
|
|
break;
|
|
|
|
case 3: // analogues
|
|
case 7:
|
|
l = JoystickAnalogueAxes[thispage*2+(x==7)];
|
|
if (l == analog_turning) l = analog_strafing;
|
|
else if (l == analog_strafing) l = analog_lookingupanddown;
|
|
else if (l == analog_lookingupanddown) l = analog_moving;
|
|
else if (l == analog_moving) l = -1;
|
|
else l = analog_turning;
|
|
JoystickAnalogueAxes[thispage*2+(x==7)] = l;
|
|
CONTROL_MapAnalogAxis(thispage*2+(x==7),l,controldevice_joystick);
|
|
break;
|
|
default:break;
|
|
}
|
|
|
|
Bsprintf(tempbuf,getjoyname(0,thispage*2));
|
|
menutext(42,32,0,0,tempbuf);
|
|
if (twothispage)
|
|
{
|
|
Bsprintf(tempbuf,getjoyname(0,thispage*2+1));
|
|
menutext(42,32+64,0,0,tempbuf);
|
|
}
|
|
gametext(76,38,"SCALE",0,2+8+16);
|
|
l = (JoystickAnalogueScale[thispage*2]+262144) >> 13;
|
|
bar(140+56,38+8,(short *)&l,1,x==0,0,0);
|
|
l = (l<<13)-262144;
|
|
if (l != JoystickAnalogueScale[thispage*2]) {
|
|
CONTROL_SetAnalogAxisScale( thispage*2, l, controldevice_joystick );
|
|
JoystickAnalogueScale[thispage*2] = l;
|
|
}
|
|
Bsprintf(tempbuf,"%s%.2f",l>=0?" ":"",(float)l/65536.0);
|
|
gametext(140,38,tempbuf,0,2+8+16);
|
|
|
|
gametext(76,38+15,"DIGITAL",0,2+8+16);
|
|
if (JoystickDigitalFunctions[thispage*2][0] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(JoystickDigitalFunctions[thispage*2][0]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(140+12,38+15,tempbuf,0,10+16);
|
|
|
|
if (JoystickDigitalFunctions[thispage*2][1] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(JoystickDigitalFunctions[thispage*2][1]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(140+12+72,38+15,tempbuf,0,10+16);
|
|
|
|
gametext(76,38+15+15,"ANALOG",0,2+8+16);
|
|
if (CONFIG_AnalogNumToName( JoystickAnalogueAxes[thispage*2] )) {
|
|
p = CONFIG_AnalogNumToName( JoystickAnalogueAxes[thispage*2] );
|
|
if (p) {
|
|
gametext(140+12,38+15+15, strchr(p,'_')+1, 0, 2+8+16 );
|
|
}
|
|
}
|
|
|
|
if (twothispage) {
|
|
gametext(76,38+64,"SCALE",0,2+8+16);
|
|
l = (JoystickAnalogueScale[thispage*2+1]+262144) >> 13;
|
|
bar(140+56,38+8+64,(short *)&l,1,x==4,0,0);
|
|
l = (l<<13)-262144;
|
|
if (l != JoystickAnalogueScale[thispage*2+1]) {
|
|
CONTROL_SetAnalogAxisScale( thispage*2+1, l, controldevice_joystick );
|
|
JoystickAnalogueScale[thispage*2+1] = l;
|
|
}
|
|
Bsprintf(tempbuf,"%s%.2f",l>=0?" ":"",(float)l/65536.0);
|
|
gametext(140,38+64,tempbuf,0,2+8+16);
|
|
|
|
gametext(76,38+64+15,"DIGITAL",0,2+8+16);
|
|
if (JoystickDigitalFunctions[thispage*2+1][0] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(JoystickDigitalFunctions[thispage*2+1][0]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(140+12,38+15+64,tempbuf,0,10+16);
|
|
|
|
if (JoystickDigitalFunctions[thispage*2+1][1] < 0)
|
|
strcpy(tempbuf, " -NONE-");
|
|
else
|
|
strcpy(tempbuf, CONFIG_FunctionNumToName(JoystickDigitalFunctions[thispage*2+1][1]));
|
|
|
|
for (i=0;tempbuf[i];i++) if (tempbuf[i]=='_') tempbuf[i] = ' ';
|
|
minitext(140+12+72,38+15+64,tempbuf,0,10+16);
|
|
|
|
gametext(76,38+64+15+15,"ANALOG",0,2+8+16);
|
|
if (CONFIG_AnalogNumToName( JoystickAnalogueAxes[thispage*2+1] )) {
|
|
p = CONFIG_AnalogNumToName( JoystickAnalogueAxes[thispage*2+1] );
|
|
if (p) {
|
|
gametext(140+12,38+64+15+15, strchr(p,'_')+1, 0, 2+8+16 );
|
|
}
|
|
}
|
|
}
|
|
|
|
if (joynumaxes > 2) {
|
|
menutext(320>>1,twothispage?158:108,SHX(-10),(joynumaxes<=2),"NEXT...");
|
|
sprintf(tempbuf,"Page %d of %d",thispage+1,(joynumaxes+1)/2);
|
|
gametext(320-100,158,tempbuf,0,2+8+16);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 213:
|
|
case 214:
|
|
case 215:
|
|
case 216: { // Pray this is enough pages for now :-|
|
|
int first,last;
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"JOY DEAD ZONES");
|
|
|
|
first = 4*(current_menu-213);
|
|
last = min(4*(current_menu-213)+4,joynumaxes);
|
|
|
|
onbar = 1;
|
|
x = probe(320,48,15,2*(last-first)+(joynumaxes>4));
|
|
|
|
if (x==-1) {
|
|
cmenu(206);
|
|
probey = 2;
|
|
break;
|
|
} else if (x==2*(last-first) && joynumaxes>4) {
|
|
cmenu( (current_menu-213) == (joynumaxes/4) ? 213 : (current_menu+1) );
|
|
probey = 0;
|
|
break;
|
|
}
|
|
|
|
for (m=first;m<last;m++) {
|
|
unsigned short odx,dx,ody,dy;
|
|
Bsprintf(tempbuf,getjoyname(0,m));
|
|
menutext(32,48+30*(m-first),0,0,tempbuf);
|
|
|
|
gametext(128,48+30*(m-first)-8,"DEAD",0,2+8+16);
|
|
gametext(128,48+30*(m-first)-8+15,"SATU",0,2+8+16);
|
|
|
|
dx = odx = min(64,64l*JoystickAnalogueDead[m]/10000l);
|
|
dy = ody = min(64,64l*JoystickAnalogueSaturate[m]/10000l);
|
|
|
|
bar(217,48+30*(m-first),&dx,4,x==((m-first)*2),0,0);
|
|
bar(217,48+30*(m-first)+15,&dy,4,x==((m-first)*2+1),0,0);
|
|
|
|
Bsprintf(tempbuf,"%3d%%",100*dx/64); gametext(217-49,48+30*(m-first)-8,tempbuf,0,2+8+16);
|
|
Bsprintf(tempbuf,"%3d%%",100*dy/64); gametext(217-49,48+30*(m-first)-8+15,tempbuf,0,2+8+16);
|
|
|
|
if (dx != odx) JoystickAnalogueDead[m] = 10000l*dx/64l;
|
|
if (dy != ody) JoystickAnalogueSaturate[m] = 10000l*dy/64l;
|
|
if (dx != odx || dy != ody)
|
|
setjoydeadzone(m,JoystickAnalogueDead[m],JoystickAnalogueSaturate[m]);
|
|
}
|
|
//gametext(160,158,"DEAD = DEAD ZONE, SAT. = SATURATION",0,2+8+16);
|
|
if (joynumaxes>4) {
|
|
menutext(32,48+30*(last-first),0,0,"NEXT...");
|
|
sprintf(tempbuf,"Page %d of %d", 1+(current_menu-213), (joynumaxes+3)/4);
|
|
gametext(320-100,158,tempbuf,0,2+8+16);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 700:
|
|
case 701:
|
|
c = (320>>1)-120;
|
|
rotatesprite(320<<15,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"SOUND OPTIONS");
|
|
onbar = ( probey == 2 || probey == 3 );
|
|
|
|
x = probe(c,50,16,7);
|
|
switch(x)
|
|
{
|
|
case -1:
|
|
if(ps[myconnectindex].gm&MODE_GAME && current_menu == 701)
|
|
{
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
}
|
|
|
|
else cmenu(202);
|
|
probey = 1;
|
|
break;
|
|
case 0:
|
|
if (FXDevice >= 0)
|
|
{
|
|
SoundToggle = 1-SoundToggle;
|
|
if( SoundToggle == 0 )
|
|
{
|
|
FX_StopAllSounds();
|
|
clearsoundlocks();
|
|
}
|
|
onbar = 0;
|
|
}
|
|
break;
|
|
case 1:
|
|
|
|
if(numplayers < 2)
|
|
if(MusicDevice >= 0)
|
|
{
|
|
MusicToggle = 1-MusicToggle;
|
|
if( MusicToggle == 0 ) MUSIC_Pause();
|
|
else
|
|
{
|
|
if(ud.recstat != 2 && ps[myconnectindex].gm&MODE_GAME)
|
|
playmusic(&music_fn[0][music_select][0]);
|
|
else playmusic(&env_music_fn[0][0]);
|
|
|
|
MUSIC_Continue();
|
|
}
|
|
}
|
|
onbar = 0;
|
|
|
|
break;
|
|
case 4:
|
|
if(SoundToggle && (FXDevice >= 0)) VoiceToggle = 1-VoiceToggle;
|
|
onbar = 0;
|
|
break;
|
|
case 5:
|
|
if(SoundToggle && (FXDevice >= 0)) AmbienceToggle = 1-AmbienceToggle;
|
|
onbar = 0;
|
|
break;
|
|
case 6:
|
|
if(SoundToggle && (FXDevice >= 0))
|
|
{
|
|
ReverseStereo = 1-ReverseStereo;
|
|
FX_SetReverseStereo(ReverseStereo);
|
|
}
|
|
onbar = 0;
|
|
break;
|
|
default:
|
|
onbar = 1;
|
|
break;
|
|
}
|
|
|
|
if(SoundToggle && FXDevice >= 0) menutext(c+160+40,50,0,(FXDevice<0),"ON");
|
|
else menutext(c+160+40,50,0,(FXDevice<0),"OFF");
|
|
|
|
if(MusicToggle && (MusicDevice >= 0) && (numplayers<2))
|
|
menutext(c+160+40,50+16,0,(MusicDevice < 0),"ON");
|
|
else menutext(c+160+40,50+16,0,(MusicDevice < 0),"OFF");
|
|
|
|
menutext(c,50,SHX(-2),(FXDevice<0),"SOUND");
|
|
menutext(c,50+16+16,SHX(-4),(FXDevice<0)||SoundToggle==0,"SOUND VOLUME");
|
|
{
|
|
l = FXVolume;
|
|
FXVolume >>= 2;
|
|
bar(c+167+40,50+16+16,(short *)&FXVolume,4,(FXDevice>=0)&&x==2,SHX(-4),SoundToggle==0||(FXDevice<0));
|
|
if(l != FXVolume)
|
|
FXVolume <<= 2;
|
|
if(l != FXVolume)
|
|
FX_SetVolume( (short) FXVolume );
|
|
}
|
|
menutext(c,50+16,SHX(-3),(MusicDevice<0),"MUSIC");
|
|
menutext(c,50+16+16+16,SHX(-5),(MusicDevice<0)||MusicToggle==0,"MUSIC VOLUME");
|
|
{
|
|
l = MusicVolume;
|
|
MusicVolume >>= 2;
|
|
bar(c+167+40,50+16+16+16,
|
|
(short *)&MusicVolume,4,
|
|
(MusicDevice>=0) && x==3,SHX(-5),
|
|
MusicToggle==0||(MusicDevice<0));
|
|
MusicVolume <<= 2;
|
|
if(l != MusicVolume)
|
|
MUSIC_SetVolume( (short) MusicVolume );
|
|
|
|
}
|
|
menutext(c,50+16+16+16+16,SHX(-6),(FXDevice<0)||SoundToggle==0,"DUKE TALK");
|
|
menutext(c,50+16+16+16+16+16,SHX(-7),(FXDevice<0)||SoundToggle==0,"AMBIENCE");
|
|
|
|
menutext(c,50+16+16+16+16+16+16,SHX(-8),(FXDevice<0)||SoundToggle==0,"FLIP STEREO");
|
|
|
|
if(VoiceToggle) menutext(c+160+40,50+16+16+16+16,0,(FXDevice<0)||SoundToggle==0,"ON");
|
|
else menutext(c+160+40,50+16+16+16+16,0,(FXDevice<0)||SoundToggle==0,"OFF");
|
|
|
|
if(AmbienceToggle) menutext(c+160+40,50+16+16+16+16+16,0,(FXDevice<0)||SoundToggle==0,"ON");
|
|
else menutext(c+160+40,50+16+16+16+16+16,0,(FXDevice<0)||SoundToggle==0,"OFF");
|
|
|
|
if(ReverseStereo) menutext(c+160+40,50+16+16+16+16+16+16,0,(FXDevice<0)||SoundToggle==0,"ON");
|
|
else menutext(c+160+40,50+16+16+16+16+16+16,0,(FXDevice<0)||SoundToggle==0,"OFF");
|
|
|
|
|
|
break;
|
|
|
|
case 350:
|
|
cmenu(351);
|
|
screencapt = 1;
|
|
displayrooms(myconnectindex,65536);
|
|
//savetemp("duke3d.tmp",waloff[TILE_SAVESHOT],160*100);
|
|
screencapt = 0;
|
|
break;
|
|
|
|
case 360:
|
|
case 361:
|
|
case 362:
|
|
case 363:
|
|
case 364:
|
|
case 365:
|
|
case 366:
|
|
case 367:
|
|
case 368:
|
|
case 369:
|
|
case 351:
|
|
case 300:
|
|
|
|
c = 320>>1;
|
|
rotatesprite(c<<16,200<<15,65536L,0,MENUSCREEN,16,0,10+64,0,0,xdim-1,ydim-1);
|
|
rotatesprite(c<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
|
|
if(current_menu == 300) menutext(c,24,0,0,"LOAD GAME");
|
|
else menutext(c,24,0,0,"SAVE GAME");
|
|
|
|
if(current_menu >= 360 && current_menu <= 369 )
|
|
{
|
|
sprintf(tempbuf,"PLAYERS: %-2ld ",ud.multimode);
|
|
gametext(160,156,tempbuf,0,2+8+16);
|
|
sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+ud.volume_number,1+ud.level_number,ud.player_skill);
|
|
gametext(160,168,tempbuf,0,2+8+16);
|
|
if (ud.volume_number == 0 && ud.level_number == 7)
|
|
gametext(160,180,boardfilename,0,2+8+16);
|
|
|
|
x = strget((320>>1),184,&ud.savegame[current_menu-360][0],19, 999 );
|
|
|
|
if(x == -1)
|
|
{
|
|
// readsavenames();
|
|
ps[myconnectindex].gm = MODE_GAME;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
goto DISPLAYNAMES;
|
|
}
|
|
|
|
if( x == 1 )
|
|
{
|
|
if( ud.savegame[current_menu-360][0] == 0 )
|
|
{
|
|
KB_FlushKeyboardQueue();
|
|
cmenu(351);
|
|
}
|
|
else
|
|
{
|
|
if(ud.multimode > 1)
|
|
saveplayer(-1-(current_menu-360));
|
|
else saveplayer(current_menu-360);
|
|
lastsavedpos = current_menu-360;
|
|
ps[myconnectindex].gm = MODE_GAME;
|
|
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
KB_ClearKeyDown(sc_Escape);
|
|
sound(EXITMENUSOUND);
|
|
}
|
|
}
|
|
|
|
rotatesprite(101<<16,97<<16,65536>>1,512,TILE_SAVESHOT,-32,0,2+4+8+64,0,0,xdim-1,ydim-1);
|
|
dispnames();
|
|
rotatesprite((c+67+strlen(&ud.savegame[current_menu-360][0])*4)<<16,(50+12*probey)<<16,32768L-10240,0,SPINNINGNUKEICON+(((totalclock)>>3)%7),0,0,10,0,0,xdim-1,ydim-1);
|
|
break;
|
|
}
|
|
|
|
last_threehundred = probey;
|
|
|
|
x = probe(c+68,54,12,10);
|
|
|
|
if(current_menu == 300)
|
|
{
|
|
if( ud.savegame[probey][0] )
|
|
{
|
|
if( lastprobey != probey )
|
|
{
|
|
loadpheader(probey,&savehead);
|
|
lastprobey = probey;
|
|
}
|
|
|
|
rotatesprite(101<<16,97<<16,65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
|
|
sprintf(tempbuf,"PLAYERS: %-2ld ",savehead.numplr);
|
|
gametext(160,156,tempbuf,0,2+8+16);
|
|
sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+savehead.volnum,1+savehead.levnum,savehead.plrskl);
|
|
gametext(160,168,tempbuf,0,2+8+16);
|
|
if (savehead.volnum == 0 && savehead.levnum == 7)
|
|
gametext(160,180,savehead.boardfn,0,2+8+16);
|
|
}
|
|
else menutext(69,70,0,0,"EMPTY");
|
|
}
|
|
else
|
|
{
|
|
if( ud.savegame[probey][0] )
|
|
{
|
|
if(lastprobey != probey)
|
|
loadpheader(probey,&savehead);
|
|
lastprobey = probey;
|
|
rotatesprite(101<<16,97<<16,65536L>>1,512,TILE_LOADSHOT,-32,0,4+10+64,0,0,xdim-1,ydim-1);
|
|
}
|
|
else menutext(69,70,0,0,"EMPTY");
|
|
sprintf(tempbuf,"PLAYERS: %-2ld ",ud.multimode);
|
|
gametext(160,156,tempbuf,0,2+8+16);
|
|
sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+ud.volume_number,1+ud.level_number,ud.player_skill);
|
|
gametext(160,168,tempbuf,0,2+8+16);
|
|
if (ud.volume_number == 0 && ud.level_number == 7)
|
|
gametext(160,180,boardfilename,0,2+8+16);
|
|
}
|
|
|
|
switch( x )
|
|
{
|
|
case -1:
|
|
if(current_menu == 300)
|
|
{
|
|
if( (ps[myconnectindex].gm&MODE_GAME) != MODE_GAME)
|
|
{
|
|
cmenu(0);
|
|
break;
|
|
}
|
|
else
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
}
|
|
else
|
|
ps[myconnectindex].gm = MODE_GAME;
|
|
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
|
|
break;
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
if( current_menu == 300)
|
|
{
|
|
if( ud.savegame[x][0] )
|
|
current_menu = (1000+x);
|
|
}
|
|
else
|
|
{
|
|
if( ud.savegame[x][0] != 0)
|
|
current_menu = 2000+x;
|
|
else
|
|
{
|
|
KB_FlushKeyboardQueue();
|
|
current_menu = (360+x);
|
|
ud.savegame[x][0] = 0;
|
|
inputloc = 0;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
DISPLAYNAMES:
|
|
dispnames();
|
|
break;
|
|
|
|
case 400:
|
|
case 401:
|
|
if (VOLUMEALL) goto VOLUME_ALL_40x;
|
|
case 402:
|
|
case 403:
|
|
|
|
c = 320>>1;
|
|
|
|
if( KB_KeyPressed( sc_LeftArrow ) ||
|
|
KB_KeyPressed( sc_kpad_4 ) ||
|
|
KB_KeyPressed( sc_UpArrow ) ||
|
|
KB_KeyPressed( sc_PgUp ) ||
|
|
KB_KeyPressed( sc_kpad_8 ) )
|
|
{
|
|
KB_ClearKeyDown(sc_LeftArrow);
|
|
KB_ClearKeyDown(sc_kpad_4);
|
|
KB_ClearKeyDown(sc_UpArrow);
|
|
KB_ClearKeyDown(sc_PgUp);
|
|
KB_ClearKeyDown(sc_kpad_8);
|
|
|
|
sound(KICK_HIT);
|
|
current_menu--;
|
|
if(current_menu < 400) current_menu = 403;
|
|
}
|
|
else if(
|
|
KB_KeyPressed( sc_PgDn ) ||
|
|
KB_KeyPressed( sc_Enter ) ||
|
|
KB_KeyPressed( sc_kpad_Enter ) ||
|
|
KB_KeyPressed( sc_RightArrow ) ||
|
|
KB_KeyPressed( sc_DownArrow ) ||
|
|
KB_KeyPressed( sc_kpad_2 ) ||
|
|
KB_KeyPressed( sc_kpad_9 ) ||
|
|
KB_KeyPressed( sc_Space ) ||
|
|
KB_KeyPressed( sc_kpad_6 ) )
|
|
{
|
|
KB_ClearKeyDown(sc_PgDn);
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_RightArrow);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_ClearKeyDown(sc_kpad_6);
|
|
KB_ClearKeyDown(sc_kpad_9);
|
|
KB_ClearKeyDown(sc_kpad_2);
|
|
KB_ClearKeyDown(sc_DownArrow);
|
|
KB_ClearKeyDown(sc_Space);
|
|
sound(KICK_HIT);
|
|
current_menu++;
|
|
if(current_menu > 403) current_menu = 400;
|
|
}
|
|
|
|
if( KB_KeyPressed(sc_Escape) )
|
|
{
|
|
if(ps[myconnectindex].gm&MODE_GAME)
|
|
cmenu(50);
|
|
else cmenu(0);
|
|
return;
|
|
}
|
|
|
|
flushperms();
|
|
rotatesprite(0,0,65536L,0,ORDERING+current_menu-400,0,0,10+16+64,0,0,xdim-1,ydim-1);
|
|
|
|
break;
|
|
VOLUME_ALL_40x:
|
|
|
|
c = 320>>1;
|
|
|
|
if( KB_KeyPressed( sc_LeftArrow ) ||
|
|
KB_KeyPressed( sc_kpad_4 ) ||
|
|
KB_KeyPressed( sc_UpArrow ) ||
|
|
KB_KeyPressed( sc_PgUp ) ||
|
|
KB_KeyPressed( sc_kpad_8 ) )
|
|
{
|
|
KB_ClearKeyDown(sc_LeftArrow);
|
|
KB_ClearKeyDown(sc_kpad_4);
|
|
KB_ClearKeyDown(sc_UpArrow);
|
|
KB_ClearKeyDown(sc_PgUp);
|
|
KB_ClearKeyDown(sc_kpad_8);
|
|
|
|
sound(KICK_HIT);
|
|
current_menu--;
|
|
if(current_menu < 400) current_menu = 401;
|
|
}
|
|
else if(
|
|
KB_KeyPressed( sc_PgDn ) ||
|
|
KB_KeyPressed( sc_Enter ) ||
|
|
KB_KeyPressed( sc_kpad_Enter ) ||
|
|
KB_KeyPressed( sc_RightArrow ) ||
|
|
KB_KeyPressed( sc_DownArrow ) ||
|
|
KB_KeyPressed( sc_kpad_2 ) ||
|
|
KB_KeyPressed( sc_kpad_9 ) ||
|
|
KB_KeyPressed( sc_Space ) ||
|
|
KB_KeyPressed( sc_kpad_6 ) )
|
|
{
|
|
KB_ClearKeyDown(sc_PgDn);
|
|
KB_ClearKeyDown(sc_Enter);
|
|
KB_ClearKeyDown(sc_RightArrow);
|
|
KB_ClearKeyDown(sc_kpad_Enter);
|
|
KB_ClearKeyDown(sc_kpad_6);
|
|
KB_ClearKeyDown(sc_kpad_9);
|
|
KB_ClearKeyDown(sc_kpad_2);
|
|
KB_ClearKeyDown(sc_DownArrow);
|
|
KB_ClearKeyDown(sc_Space);
|
|
sound(KICK_HIT);
|
|
current_menu++;
|
|
if(current_menu > 401) current_menu = 400;
|
|
}
|
|
|
|
if( KB_KeyPressed(sc_Escape) )
|
|
{
|
|
if(ps[myconnectindex].gm&MODE_GAME)
|
|
cmenu(50);
|
|
else cmenu(0);
|
|
return;
|
|
}
|
|
|
|
flushperms();
|
|
switch(current_menu)
|
|
{
|
|
case 400:
|
|
rotatesprite(0,0,65536L,0,TEXTSTORY,0,0,10+16+64, 0,0,xdim-1,ydim-1);
|
|
break;
|
|
case 401:
|
|
rotatesprite(0,0,65536L,0,F1HELP,0,0,10+16+64, 0,0,xdim-1,ydim-1);
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
case 500:
|
|
c = 320>>1;
|
|
|
|
gametext(c,90,"Are you sure you want to quit?",0,2+8+16);
|
|
gametext(c,99,"(Y/N)",0,2+8+16);
|
|
|
|
if( KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB )
|
|
{
|
|
KB_FlushKeyboardQueue();
|
|
|
|
if( gamequit == 0 && ( numplayers > 1 ) )
|
|
{
|
|
if(ps[myconnectindex].gm&MODE_GAME)
|
|
{
|
|
gamequit = 1;
|
|
quittimer = totalclock+120;
|
|
}
|
|
else
|
|
{
|
|
sendlogoff();
|
|
gameexit(" ");
|
|
}
|
|
}
|
|
else if( numplayers < 2 )
|
|
gameexit(" ");
|
|
|
|
if( ( totalclock > quittimer ) && ( gamequit == 1) )
|
|
gameexit("Timed out.");
|
|
}
|
|
|
|
x = probe(186,124,0,0);
|
|
if(x == -1 || KB_KeyPressed(sc_N) || RMB)
|
|
{
|
|
KB_ClearKeyDown(sc_N);
|
|
quittimer = 0;
|
|
if( ps[myconnectindex].gm&MODE_DEMO )
|
|
ps[myconnectindex].gm = MODE_DEMO;
|
|
else
|
|
{
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
case 501:
|
|
c = 320>>1;
|
|
gametext(c,90,"Quit to Title?",0,2+8+16);
|
|
gametext(c,99,"(Y/N)",0,2+8+16);
|
|
|
|
if( KB_KeyPressed(sc_Space) || KB_KeyPressed(sc_Enter) || KB_KeyPressed(sc_kpad_Enter) || KB_KeyPressed(sc_Y) || LMB )
|
|
{
|
|
KB_FlushKeyboardQueue();
|
|
ps[myconnectindex].gm = MODE_DEMO;
|
|
if(ud.recstat == 1)
|
|
closedemowrite();
|
|
cmenu(0);
|
|
}
|
|
|
|
x = probe(186,124,0,0);
|
|
|
|
if(x == -1 || KB_KeyPressed(sc_N) || RMB)
|
|
{
|
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
|
if(ud.multimode < 2 && ud.recstat != 2)
|
|
{
|
|
ready2send = 1;
|
|
totalclock = ototalclock;
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 601:
|
|
displayfragbar();
|
|
rotatesprite(160<<16,29<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,34,0,0,&ud.user_name[myconnectindex][0]);
|
|
|
|
sprintf(tempbuf,"Waiting for master");
|
|
gametext(160,50,tempbuf,0,2+8+16);
|
|
gametext(160,59,"to select level",0,2+8+16);
|
|
|
|
if( KB_KeyPressed(sc_Escape) )
|
|
{
|
|
KB_ClearKeyDown(sc_Escape);
|
|
sound(EXITMENUSOUND);
|
|
cmenu(0);
|
|
}
|
|
break;
|
|
|
|
case 602:
|
|
if(menunamecnt == 0)
|
|
{
|
|
// getfilenames("SUBD");
|
|
getfilenames(".","*.MAP");
|
|
if (menunamecnt == 0)
|
|
cmenu(600);
|
|
}
|
|
case 603:
|
|
c = (320>>1) - 120;
|
|
displayfragbar();
|
|
rotatesprite(320>>1<<16,19<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(320>>1,24,0,0,"USER MAPS");
|
|
for(x=0;x<menunamecnt;x++)
|
|
{
|
|
if(x == fileselect)
|
|
minitext(15 + (x/15)*54,32 + (x%15)*8,menuname[x],0,26);
|
|
else minitext(15 + (x/15)*54,32 + (x%15)*8,menuname[x],16,26);
|
|
}
|
|
|
|
fileselect = probey;
|
|
if( KB_KeyPressed( sc_LeftArrow ) || KB_KeyPressed( sc_kpad_4 ) || ((buttonstat&1) && minfo.dyaw < -256 ) )
|
|
{
|
|
KB_ClearKeyDown( sc_LeftArrow );
|
|
KB_ClearKeyDown( sc_kpad_4 );
|
|
probey -= 15;
|
|
if(probey < 0) probey += 15;
|
|
else sound(KICK_HIT);
|
|
}
|
|
if( KB_KeyPressed( sc_RightArrow ) || KB_KeyPressed( sc_kpad_6 ) || ((buttonstat&1) && minfo.dyaw > 256 ) )
|
|
{
|
|
KB_ClearKeyDown( sc_RightArrow );
|
|
KB_ClearKeyDown( sc_kpad_6 );
|
|
probey += 15;
|
|
if(probey >= menunamecnt)
|
|
probey -= 15;
|
|
else sound(KICK_HIT);
|
|
}
|
|
|
|
onbar = 0;
|
|
x = probe(0,0,0,menunamecnt);
|
|
|
|
if(x == -1) cmenu(600);
|
|
else if(x >= 0)
|
|
{
|
|
tempbuf[0] = 8;
|
|
tempbuf[1] = ud.m_level_number = 6;
|
|
tempbuf[2] = ud.m_volume_number = 0;
|
|
tempbuf[3] = ud.m_player_skill+1;
|
|
|
|
if(ud.player_skill == 3)
|
|
ud.m_respawn_monsters = 1;
|
|
else ud.m_respawn_monsters = 0;
|
|
|
|
if(ud.m_coop == 0) ud.m_respawn_items = 1;
|
|
else ud.m_respawn_items = 0;
|
|
|
|
ud.m_respawn_inventory = 1;
|
|
|
|
tempbuf[4] = ud.m_monsters_off;
|
|
tempbuf[5] = ud.m_respawn_monsters;
|
|
tempbuf[6] = ud.m_respawn_items;
|
|
tempbuf[7] = ud.m_respawn_inventory;
|
|
tempbuf[8] = ud.m_coop;
|
|
tempbuf[9] = ud.m_marker;
|
|
|
|
x = strlen(menuname[probey]);
|
|
|
|
copybufbyte(menuname[probey],tempbuf+10,x);
|
|
copybufbyte(menuname[probey],boardfilename,x+1);
|
|
|
|
for(c=connecthead;c>=0;c=connectpoint2[c])
|
|
{
|
|
if (c != myconnectindex) sendpacket(c,tempbuf,x+10);
|
|
if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
|
|
}
|
|
|
|
newgame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill+1);
|
|
if (enterlevel(MODE_GAME)) backtomenu();
|
|
}
|
|
break;
|
|
|
|
case 600:
|
|
c = (320>>1) - 120;
|
|
if((ps[myconnectindex].gm&MODE_GAME) != MODE_GAME)
|
|
displayfragbar();
|
|
rotatesprite(160<<16,26<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
|
menutext(160,31,0,0,&ud.user_name[myconnectindex][0]);
|
|
|
|
x = probe(c,57-8,16,8);
|
|
|
|
switch(x)
|
|
{
|
|
case -1:
|
|
ud.m_recstat = 0;
|
|
if(ps[myconnectindex].gm&MODE_GAME) cmenu(50);
|
|
else cmenu(0);
|
|
break;
|
|
case 0:
|
|
ud.m_coop++;
|
|
if(ud.m_coop == num_gametypes) ud.m_coop = 0;
|
|
break;
|
|
case 1:
|
|
if (!VOLUMEONE) {
|
|
ud.m_volume_number++;
|
|
if(ud.m_volume_number == num_volumes) ud.m_volume_number = 0;
|
|
if(ud.m_volume_number == 0 && ud.m_level_number > 6)
|
|
ud.m_level_number = 0;
|
|
if(ud.m_level_number > 10) ud.m_level_number = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
ud.m_level_number++;
|
|
if (!VOLUMEONE) {
|
|
if(ud.m_volume_number == 0 && ud.m_level_number > 6)
|
|
ud.m_level_number = 0;
|
|
} else {
|
|
if(ud.m_volume_number == 0 && ud.m_level_number > 5)
|
|
ud.m_level_number = 0;
|
|
}
|
|
if(ud.m_level_number > 10) ud.m_level_number = 0;
|
|
break;
|
|
case 3:
|
|
if(ud.m_monsters_off == 1 && ud.m_player_skill > 0)
|
|
ud.m_monsters_off = 0;
|
|
|
|
if(ud.m_monsters_off == 0)
|
|
{
|
|
ud.m_player_skill++;
|
|
if(ud.m_player_skill > 3)
|
|
{
|
|
ud.m_player_skill = 0;
|
|
ud.m_monsters_off = 1;
|
|
}
|
|
}
|
|
else ud.m_monsters_off = 0;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
if((gametype_flags[ud.m_coop] & GAMETYPE_FLAG_MARKEROPTION))
|
|
ud.m_marker = !ud.m_marker;
|
|
break;
|
|
|
|
case 5:
|
|
if((gametype_flags[ud.m_coop] & GAMETYPE_FLAG_COOP))
|
|
ud.m_ffire = !ud.m_ffire;
|
|
break;
|
|
|
|
case 6:
|
|
if (VOLUMEALL) {
|
|
if(boardfilename[0] == 0) break;
|
|
|
|
tempbuf[0] = 5;
|
|
tempbuf[1] = ud.m_level_number = 7;
|
|
tempbuf[2] = ud.m_volume_number = 0;
|
|
tempbuf[3] = ud.m_player_skill+1;
|
|
|
|
ud.level_number = ud.m_level_number;
|
|
ud.volume_number = ud.m_volume_number;
|
|
|
|
if( ud.m_player_skill == 3 ) ud.m_respawn_monsters = 1;
|
|
else ud.m_respawn_monsters = 0;
|
|
|
|
if((gametype_flags[ud.m_coop] & GAMETYPE_FLAG_ITEMRESPAWN)) ud.m_respawn_items = 1;
|
|
else ud.m_respawn_items = 0;
|
|
|
|
ud.m_respawn_inventory = 1;
|
|
|
|
tempbuf[4] = ud.m_monsters_off;
|
|
tempbuf[5] = ud.m_respawn_monsters;
|
|
tempbuf[6] = ud.m_respawn_items;
|
|
tempbuf[7] = ud.m_respawn_inventory;
|
|
tempbuf[8] = ud.m_coop;
|
|
tempbuf[9] = ud.m_marker;
|
|
tempbuf[10] = ud.m_ffire;
|
|
|
|
for(c=connecthead;c>=0;c=connectpoint2[c])
|
|
{
|
|
resetweapons(c);
|
|
resetinventory(c);
|
|
|
|
}
|
|
for(c=connecthead;c>=0;c=connectpoint2[c])
|
|
{
|
|
if (c != myconnectindex) sendpacket(c,tempbuf,11);
|
|
if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
|
|
}
|
|
|
|
newgame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill+1);
|
|
if (enterlevel(MODE_GAME)) backtomenu();
|
|
|
|
return;
|
|
}
|
|
case 7:
|
|
|
|
tempbuf[0] = 5;
|
|
tempbuf[1] = ud.m_level_number;
|
|
tempbuf[2] = ud.m_volume_number;
|
|
tempbuf[3] = ud.m_player_skill+1;
|
|
|
|
if( ud.m_player_skill == 3 ) ud.m_respawn_monsters = 1;
|
|
else ud.m_respawn_monsters = 0;
|
|
|
|
if((gametype_flags[ud.m_coop] & GAMETYPE_FLAG_ITEMRESPAWN)) ud.m_respawn_items = 1;
|
|
else ud.m_respawn_items = 0;
|
|
|
|
ud.m_respawn_inventory = 1;
|
|
|
|
tempbuf[4] = ud.m_monsters_off;
|
|
tempbuf[5] = ud.m_respawn_monsters;
|
|
tempbuf[6] = ud.m_respawn_items;
|
|
tempbuf[7] = ud.m_respawn_inventory;
|
|
tempbuf[8] = ud.m_coop;
|
|
tempbuf[9] = ud.m_marker;
|
|
tempbuf[10] = ud.m_ffire;
|
|
|
|
for(c=connecthead;c>=0;c=connectpoint2[c])
|
|
{
|
|
resetweapons(c);
|
|
resetinventory(c);
|
|
|
|
}
|
|
for(c=connecthead;c>=0;c=connectpoint2[c])
|
|
{
|
|
if(c != myconnectindex) sendpacket(c,tempbuf,11);
|
|
if ((!networkmode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
|
|
}
|
|
|
|
newgame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill+1);
|
|
if (enterlevel(MODE_GAME)) backtomenu();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
c += 40;
|
|
|
|
//if(ud.m_coop==1) gametext(c+70,57-7-9,"COOPERATIVE PLAY",0,2+8+16);
|
|
//else if(ud.m_coop==2) gametext(c+70,57-7-9,"DUKEMATCH (NO SPAWN)",0,2+8+16);
|
|
//else gametext(c+70,57-7-9,"DUKEMATCH (SPAWN)",0,2+8+16);
|
|
gametext(c+70,57-7-9,gametype_names[ud.m_coop],0,2+8+16);
|
|
if (VOLUMEONE) {
|
|
gametext(c+70,57+16-7-9,volume_names[ud.m_volume_number],0,2+8+16);
|
|
} else {
|
|
gametext(c+70,57+16-7-9,volume_names[ud.m_volume_number],0,2+8+16);
|
|
}
|
|
|
|
gametext(c+70,57+16+16-7-9,&level_names[11*ud.m_volume_number+ud.m_level_number][0],0,2+8+16);
|
|
|
|
if(ud.m_monsters_off == 0 || ud.m_player_skill > 0)
|
|
gametext(c+70,57+16+16+16-7-9,skill_names[ud.m_player_skill],0,2+8+16);
|
|
else gametext(c+70,57+16+16+16-7-9,"NONE",0,2+8+16);
|
|
|
|
if(gametype_flags[ud.m_coop] & GAMETYPE_FLAG_MARKEROPTION)
|
|
{
|
|
if(ud.m_marker)
|
|
gametext(c+70,57+16+16+16+16-7-9,"ON",0,2+8+16);
|
|
else gametext(c+70,57+16+16+16+16-7-9,"OFF",0,2+8+16);
|
|
}
|
|
|
|
if(gametype_flags[ud.m_coop] & GAMETYPE_FLAG_COOP)
|
|
{
|
|
if(ud.m_ffire)
|
|
gametext(c+70,57+16+16+16+16+16-7-9,"ON",0,2+8+16);
|
|
else gametext(c+70,57+16+16+16+16+16-7-9,"OFF",0,2+8+16);
|
|
}
|
|
|
|
c -= 44;
|
|
|
|
menutext(c,57-9,SHX(-2),PHX(-2),"GAME TYPE");
|
|
|
|
if (VOLUMEONE) {
|
|
sprintf(tempbuf,"EPISODE %ld",ud.m_volume_number+1);
|
|
menutext(c,57+16-9,SHX(-3),1,tempbuf);
|
|
} else {
|
|
sprintf(tempbuf,"EPISODE %ld",ud.m_volume_number+1);
|
|
menutext(c,57+16-9,SHX(-3),PHX(-3),tempbuf);
|
|
}
|
|
|
|
sprintf(tempbuf,"LEVEL %ld",ud.m_level_number+1);
|
|
menutext(c,57+16+16-9,SHX(-4),PHX(-4),tempbuf);
|
|
|
|
menutext(c,57+16+16+16-9,SHX(-5),PHX(-5),"MONSTERS");
|
|
|
|
if(gametype_flags[ud.m_coop] & GAMETYPE_FLAG_MARKEROPTION)
|
|
menutext(c,57+16+16+16+16-9,SHX(-6),PHX(-6),"MARKERS");
|
|
else
|
|
menutext(c,57+16+16+16+16-9,SHX(-6),1,"MARKERS");
|
|
|
|
if(gametype_flags[ud.m_coop] & GAMETYPE_FLAG_COOP)
|
|
menutext(c,57+16+16+16+16+16-9,SHX(-6),PHX(-6),"FR. FIRE");
|
|
else menutext(c,57+16+16+16+16+16-9,SHX(-6),1,"FR. FIRE");
|
|
|
|
if (VOLUMEALL) {
|
|
menutext(c,57+16+16+16+16+16+16-9,SHX(-7),boardfilename[0] == 0,"USER MAP");
|
|
if( boardfilename[0] != 0 )
|
|
gametext(c+70+44,57+16+16+16+16+16,boardfilename,0,2+8+16);
|
|
} else {
|
|
menutext(c,57+16+16+16+16+16+16-9,SHX(-7),1,"USER MAP");
|
|
}
|
|
|
|
menutext(c,57+16+16+16+16+16+16+16-9,SHX(-8),PHX(-8),"START GAME");
|
|
|
|
break;
|
|
}
|
|
|
|
if( (ps[myconnectindex].gm&MODE_MENU) != MODE_MENU)
|
|
{
|
|
vscrn();
|
|
cameraclock = totalclock;
|
|
cameradist = 65536L;
|
|
}
|
|
}
|