4075 lines
132 KiB
C
4075 lines
132 KiB
C
|
//-------------------------------------------------------------------------
|
||
|
/*
|
||
|
Copyright (C) 1996, 2003 - 3D Realms Entertainment
|
||
|
|
||
|
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
|
||
|
|
||
|
Duke Nukem 3D is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU General Public License
|
||
|
as published by the Free Software Foundation; either version 2
|
||
|
of the License, or (at your option) any later version.
|
||
|
|
||
|
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.
|
||
|
|
||
|
Original Source: 1996 - Todd Replogle
|
||
|
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
|
||
|
*/
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
#include "duke3d.h"
|
||
|
#include "mouse.h"
|
||
|
#include "animlib.h"
|
||
|
|
||
|
/* this should be a proper prototype included from a header file */
|
||
|
extern int stricmp(const char *x, const char *y);
|
||
|
|
||
|
extern short 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_threehundred = 0;
|
||
|
static char fileselect = 1, menunamecnt, menuname[256][17], curpath[80], menupath[80];
|
||
|
|
||
|
int ignore_escape = 0;
|
||
|
|
||
|
// CTW - REMOVED
|
||
|
/* Error codes */
|
||
|
/*
|
||
|
#define eTenBnNotInWindows 3801
|
||
|
#define eTenBnBadGameIni 3802
|
||
|
#define eTenBnBadTenIni 3803
|
||
|
#define eTenBnBrowseCancel 3804
|
||
|
#define eTenBnBadTenInst 3805
|
||
|
|
||
|
int tenBnStart(void);
|
||
|
void tenBnSetBrowseRtn(char *(*rtn)(char *str, int len));
|
||
|
void tenBnSetExitRtn(void (*rtn)(void));
|
||
|
void tenBnSetEndRtn(void (*rtn)(void));*/
|
||
|
// CTW END - REMOVED
|
||
|
|
||
|
void dummyfunc(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void dummymess(int i,char *c)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
// CTW - REMOVED
|
||
|
/*
|
||
|
void TENtext(void)
|
||
|
{
|
||
|
long dacount,dalastcount;
|
||
|
|
||
|
puts("\nDuke Nukem 3D has been licensed exclusively to TEN (Total");
|
||
|
puts("Entertainment Network) for wide-area networked (WAN) multiplayer");
|
||
|
puts("games.\n");
|
||
|
|
||
|
puts("The multiplayer code within Duke Nukem 3D has been highly");
|
||
|
puts("customized to run best on TEN, where you'll experience fast and");
|
||
|
puts("stable performance, plus other special benefits.\n");
|
||
|
|
||
|
puts("We do not authorize or recommend the use of Duke Nukem 3D with");
|
||
|
puts("gaming services other than TEN.\n");
|
||
|
|
||
|
puts("Duke Nukem 3D is protected by United States copyright law and");
|
||
|
puts("international treaty.\n");
|
||
|
|
||
|
puts("For the best online multiplayer gaming experience, please call TEN");
|
||
|
puts("at 800-8040-TEN, or visit TEN's Web Site at www.ten.net.\n");
|
||
|
|
||
|
puts("Press any key to continue.\n");
|
||
|
|
||
|
_bios_timeofday(0,&dacount);
|
||
|
|
||
|
while( _bios_keybrd(1) == 0 )
|
||
|
{
|
||
|
_bios_timeofday(0,&dalastcount);
|
||
|
if( (dacount+240) < dalastcount ) break;
|
||
|
}
|
||
|
}
|
||
|
*/
|
||
|
// CTW END - REMOVED
|
||
|
|
||
|
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 >= 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)
|
||
|
{
|
||
|
int fp;
|
||
|
|
||
|
fp = open(fn,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
|
||
|
|
||
|
write(fp,(char *)daptr,dasiz);
|
||
|
|
||
|
close(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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static int loadpheader(char spot,int32 *vn,int32 *ln,int32 *psk,int32 *nump)
|
||
|
{
|
||
|
|
||
|
long i;
|
||
|
char filename[] = "game0.sav";
|
||
|
char fullname[256];
|
||
|
long fil;
|
||
|
long bv = 0;
|
||
|
|
||
|
filename[4] = spot+'0';
|
||
|
GetPathFromEnvironment(fullname, 128, filename);
|
||
|
|
||
|
if ((fil = kopen4load(fullname,0)) == -1) return(-1);
|
||
|
|
||
|
walock[MAXTILES-3] = 255;
|
||
|
|
||
|
kdfread(&bv,4,1,fil);
|
||
|
if(bv != BYTEVERSION)
|
||
|
{
|
||
|
FTA(114,&ps[myconnectindex]);
|
||
|
kclose(fil);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
kdfread(nump,4,1,fil);
|
||
|
|
||
|
kdfread(tempbuf,19,1,fil);
|
||
|
kdfread(vn,4,1,fil);
|
||
|
kdfread(ln,4,1,fil);
|
||
|
kdfread(psk,4,1,fil);
|
||
|
|
||
|
if (waloff[MAXTILES-3] == 0) allocache(&waloff[MAXTILES-3],160*100,&walock[MAXTILES-3]);
|
||
|
tilesizx[MAXTILES-3] = 100; tilesizy[MAXTILES-3] = 160;
|
||
|
kdfread((char *)waloff[MAXTILES-3],160,100,fil);
|
||
|
|
||
|
kclose(fil);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
|
||
|
int loadplayer(signed char spot)
|
||
|
{
|
||
|
short k,music_changed;
|
||
|
char fn[] = "game0.sav";
|
||
|
char mpfn[] = "gameA_00.sav";
|
||
|
char fullname[128];
|
||
|
char *fnptr, scriptptrs[MAXSCRIPTSIZE];
|
||
|
long fil, bv, i, j, x;
|
||
|
int32 nump;
|
||
|
|
||
|
if(spot < 0)
|
||
|
{
|
||
|
multiflag = 1;
|
||
|
multiwhat = 0;
|
||
|
multipos = -spot-1;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if( multiflag == 2 && multiwho != myconnectindex )
|
||
|
{
|
||
|
mpfn[4] = spot + 'A';
|
||
|
|
||
|
if(ud.multimode > 9)
|
||
|
{
|
||
|
mpfn[6] = (multiwho/10) + '0';
|
||
|
mpfn[7] = (multiwho%10) + '0';
|
||
|
}
|
||
|
else mpfn[7] = multiwho + '0';
|
||
|
|
||
|
GetPathFromEnvironment(fullname, 128, mpfn);
|
||
|
fnptr = fullname;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fn[4] = spot + '0';
|
||
|
|
||
|
GetPathFromEnvironment(fullname, 128, fn);
|
||
|
fnptr = fullname;
|
||
|
}
|
||
|
|
||
|
if ((fil = kopen4load(fnptr,0)) == -1) return(-1);
|
||
|
|
||
|
ready2send = 0;
|
||
|
|
||
|
kdfread(&bv,4,1,fil);
|
||
|
if(bv != BYTEVERSION)
|
||
|
{
|
||
|
FTA(114,&ps[myconnectindex]);
|
||
|
kclose(fil);
|
||
|
ototalclock = totalclock;
|
||
|
ready2send = 1;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
kdfread(&nump,4,1,fil);
|
||
|
if(nump != numplayers)
|
||
|
{
|
||
|
kclose(fil);
|
||
|
ototalclock = totalclock;
|
||
|
ready2send = 1;
|
||
|
FTA(124,&ps[myconnectindex]);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
if(numplayers > 1)
|
||
|
{
|
||
|
pub = NUMPAGES;
|
||
|
pus = NUMPAGES;
|
||
|
vscrn();
|
||
|
drawbackground();
|
||
|
menutext(160,100,0,0,"LOADING...");
|
||
|
nextpage();
|
||
|
}
|
||
|
|
||
|
waitforeverybody();
|
||
|
|
||
|
FX_StopAllSounds();
|
||
|
clearsoundlocks();
|
||
|
MUSIC_StopSong();
|
||
|
|
||
|
if(numplayers > 1)
|
||
|
kdfread(&buf,19,1,fil);
|
||
|
else
|
||
|
kdfread(&ud.savegame[spot][0],19,1,fil);
|
||
|
|
||
|
music_changed = (music_select != (ud.volume_number*11) + ud.level_number);
|
||
|
|
||
|
kdfread(&ud.volume_number,4,1,fil);
|
||
|
kdfread(&ud.level_number,4,1,fil);
|
||
|
kdfread(&ud.player_skill,4,1,fil);
|
||
|
|
||
|
ud.m_level_number = ud.level_number;
|
||
|
ud.m_volume_number = ud.volume_number;
|
||
|
ud.m_player_skill = ud.player_skill;
|
||
|
|
||
|
//Fake read because lseek won't work with compression
|
||
|
walock[MAXTILES-3] = 1;
|
||
|
if (waloff[MAXTILES-3] == 0) allocache(&waloff[MAXTILES-3],160*100,&walock[MAXTILES-3]);
|
||
|
tilesizx[MAXTILES-3] = 100; tilesizy[MAXTILES-3] = 160;
|
||
|
kdfread((char *)waloff[MAXTILES-3],160,100,fil);
|
||
|
|
||
|
kdfread(&numwalls,2,1,fil);
|
||
|
kdfread(&wall[0],sizeof(walltype),MAXWALLS,fil);
|
||
|
kdfread(&numsectors,2,1,fil);
|
||
|
kdfread(§or[0],sizeof(sectortype),MAXSECTORS,fil);
|
||
|
kdfread(&sprite[0],sizeof(spritetype),MAXSPRITES,fil);
|
||
|
kdfread(&headspritesect[0],2,MAXSECTORS+1,fil);
|
||
|
kdfread(&prevspritesect[0],2,MAXSPRITES,fil);
|
||
|
kdfread(&nextspritesect[0],2,MAXSPRITES,fil);
|
||
|
kdfread(&headspritestat[0],2,MAXSTATUS+1,fil);
|
||
|
kdfread(&prevspritestat[0],2,MAXSPRITES,fil);
|
||
|
kdfread(&nextspritestat[0],2,MAXSPRITES,fil);
|
||
|
kdfread(&numcyclers,sizeof(numcyclers),1,fil);
|
||
|
kdfread(&cyclers[0][0],12,MAXCYCLERS,fil);
|
||
|
kdfread(ps,sizeof(ps),1,fil);
|
||
|
kdfread(po,sizeof(po),1,fil);
|
||
|
kdfread(&numanimwalls,sizeof(numanimwalls),1,fil);
|
||
|
kdfread(&animwall,sizeof(animwall),1,fil);
|
||
|
kdfread(&msx[0],sizeof(long),sizeof(msx)/sizeof(long),fil);
|
||
|
kdfread(&msy[0],sizeof(long),sizeof(msy)/sizeof(long),fil);
|
||
|
kdfread((short *)&spriteqloc,sizeof(short),1,fil);
|
||
|
kdfread((short *)&spriteqamount,sizeof(short),1,fil);
|
||
|
kdfread((short *)&spriteq[0],sizeof(short),spriteqamount,fil);
|
||
|
kdfread(&mirrorcnt,sizeof(short),1,fil);
|
||
|
kdfread(&mirrorwall[0],sizeof(short),64,fil);
|
||
|
kdfread(&mirrorsector[0],sizeof(short),64,fil);
|
||
|
kdfread(&show2dsector[0],sizeof(char),MAXSECTORS>>3,fil);
|
||
|
kdfread(&actortype[0],sizeof(char),MAXTILES,fil);
|
||
|
kdfread(&boardfilename[0],sizeof(boardfilename),1,fil);
|
||
|
|
||
|
kdfread(&numclouds,sizeof(numclouds),1,fil);
|
||
|
kdfread(&clouds[0],sizeof(short)<<7,1,fil);
|
||
|
kdfread(&cloudx[0],sizeof(short)<<7,1,fil);
|
||
|
kdfread(&cloudy[0],sizeof(short)<<7,1,fil);
|
||
|
|
||
|
kdfread(&scriptptrs[0],1,MAXSCRIPTSIZE,fil);
|
||
|
kdfread(&script[0],4,MAXSCRIPTSIZE,fil);
|
||
|
for(i=0;i<MAXSCRIPTSIZE;i++)
|
||
|
if( scriptptrs[i] )
|
||
|
{
|
||
|
j = (long)script[i]+(long)&script[0];
|
||
|
script[i] = j;
|
||
|
}
|
||
|
|
||
|
kdfread(&actorscrptr[0],4,MAXTILES,fil);
|
||
|
for(i=0;i<MAXTILES;i++)
|
||
|
if(actorscrptr[i])
|
||
|
{
|
||
|
j = (long)actorscrptr[i]+(long)&script[0];
|
||
|
actorscrptr[i] = (long *)j;
|
||
|
}
|
||
|
|
||
|
kdfread(&scriptptrs[0],1,MAXSPRITES,fil);
|
||
|
kdfread(&hittype[0],sizeof(struct weaponhit),MAXSPRITES,fil);
|
||
|
|
||
|
for(i=0;i<MAXSPRITES;i++)
|
||
|
{
|
||
|
j = (long)(&script[0]);
|
||
|
if( scriptptrs[i]&1 ) T2 += j;
|
||
|
if( scriptptrs[i]&2 ) T5 += j;
|
||
|
if( scriptptrs[i]&4 ) T6 += j;
|
||
|
}
|
||
|
|
||
|
kdfread(&lockclock,sizeof(lockclock),1,fil);
|
||
|
kdfread(&pskybits,sizeof(pskybits),1,fil);
|
||
|
kdfread(&pskyoff[0],sizeof(pskyoff[0]),MAXPSKYTILES,fil);
|
||
|
|
||
|
kdfread(&animatecnt,sizeof(animatecnt),1,fil);
|
||
|
kdfread(&animatesect[0],2,MAXANIMATES,fil);
|
||
|
kdfread(&animateptr[0],4,MAXANIMATES,fil);
|
||
|
for(i = animatecnt-1;i>=0;i--) animateptr[i] = (long *)((long)animateptr[i]+(long)(§or[0]));
|
||
|
kdfread(&animategoal[0],4,MAXANIMATES,fil);
|
||
|
kdfread(&animatevel[0],4,MAXANIMATES,fil);
|
||
|
|
||
|
kdfread(&earthquaketime,sizeof(earthquaketime),1,fil);
|
||
|
kdfread(&ud.from_bonus,sizeof(ud.from_bonus),1,fil);
|
||
|
kdfread(&ud.secretlevel,sizeof(ud.secretlevel),1,fil);
|
||
|
kdfread(&ud.respawn_monsters,sizeof(ud.respawn_monsters),1,fil);
|
||
|
ud.m_respawn_monsters = ud.respawn_monsters;
|
||
|
kdfread(&ud.respawn_items,sizeof(ud.respawn_items),1,fil);
|
||
|
ud.m_respawn_items = ud.respawn_items;
|
||
|
kdfread(&ud.respawn_inventory,sizeof(ud.respawn_inventory),1,fil);
|
||
|
ud.m_respawn_inventory = ud.respawn_inventory;
|
||
|
|
||
|
kdfread(&ud.god,sizeof(ud.god),1,fil);
|
||
|
kdfread(&ud.auto_run,sizeof(ud.auto_run),1,fil);
|
||
|
kdfread(&ud.crosshair,sizeof(ud.crosshair),1,fil);
|
||
|
kdfread(&ud.monsters_off,sizeof(ud.monsters_off),1,fil);
|
||
|
ud.m_monsters_off = ud.monsters_off;
|
||
|
kdfread(&ud.last_level,sizeof(ud.last_level),1,fil);
|
||
|
kdfread(&ud.eog,sizeof(ud.eog),1,fil);
|
||
|
|
||
|
kdfread(&ud.coop,sizeof(ud.coop),1,fil);
|
||
|
ud.m_coop = ud.coop;
|
||
|
kdfread(&ud.marker,sizeof(ud.marker),1,fil);
|
||
|
ud.m_marker = ud.marker;
|
||
|
kdfread(&ud.ffire,sizeof(ud.ffire),1,fil);
|
||
|
ud.m_ffire = ud.ffire;
|
||
|
|
||
|
kdfread(&camsprite,sizeof(camsprite),1,fil);
|
||
|
kdfread(&connecthead,sizeof(connecthead),1,fil);
|
||
|
kdfread(connectpoint2,sizeof(connectpoint2),1,fil);
|
||
|
kdfread(&numplayersprites,sizeof(numplayersprites),1,fil);
|
||
|
kdfread((short *)&frags[0][0],sizeof(frags),1,fil);
|
||
|
|
||
|
kdfread(&randomseed,sizeof(randomseed),1,fil);
|
||
|
kdfread(&global_random,sizeof(global_random),1,fil);
|
||
|
kdfread(¶llaxyscale,sizeof(parallaxyscale),1,fil);
|
||
|
|
||
|
kclose(fil);
|
||
|
|
||
|
if(ps[myconnectindex].over_shoulder_on != 0)
|
||
|
{
|
||
|
cameradist = 0;
|
||
|
cameraclock = 0;
|
||
|
ps[myconnectindex].over_shoulder_on = 1;
|
||
|
}
|
||
|
|
||
|
screenpeek = myconnectindex;
|
||
|
|
||
|
clearbufbyte(gotpic,sizeof(gotpic),0L);
|
||
|
clearsoundlocks();
|
||
|
cacheit();
|
||
|
docacheit();
|
||
|
|
||
|
if(music_changed == 0)
|
||
|
music_select = (ud.volume_number*11) + ud.level_number;
|
||
|
playmusic(&music_fn[0][(int)music_select][0]);
|
||
|
|
||
|
ps[myconnectindex].gm = MODE_GAME;
|
||
|
ud.recstat = 0;
|
||
|
|
||
|
if(ps[myconnectindex].jetpack_on)
|
||
|
spritesound(DUKE_JETPACK_IDLE,ps[myconnectindex].i);
|
||
|
|
||
|
restorepalette = 1;
|
||
|
setpal(&ps[myconnectindex]);
|
||
|
vscrn();
|
||
|
|
||
|
FX_SetReverb(0);
|
||
|
|
||
|
if(ud.lockout == 0)
|
||
|
{
|
||
|
for(x=0;x<numanimwalls;x++)
|
||
|
if( wall[animwall[x].wallnum].extra >= 0 )
|
||
|
wall[animwall[x].wallnum].picnum = wall[animwall[x].wallnum].extra;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(x=0;x<numanimwalls;x++)
|
||
|
switch(wall[animwall[x].wallnum].picnum)
|
||
|
{
|
||
|
case FEMPIC1:
|
||
|
wall[animwall[x].wallnum].picnum = BLANKSCREEN;
|
||
|
break;
|
||
|
case FEMPIC2:
|
||
|
case FEMPIC3:
|
||
|
wall[animwall[x].wallnum].picnum = SCREENBREAK6;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
numinterpolations = 0;
|
||
|
startofdynamicinterpolations = 0;
|
||
|
|
||
|
k = headspritestat[3];
|
||
|
while(k >= 0)
|
||
|
{
|
||
|
switch(sprite[k].lotag)
|
||
|
{
|
||
|
case 31:
|
||
|
setinterpolation(§or[sprite[k].sectnum].floorz);
|
||
|
break;
|
||
|
case 32:
|
||
|
setinterpolation(§or[sprite[k].sectnum].ceilingz);
|
||
|
break;
|
||
|
case 25:
|
||
|
setinterpolation(§or[sprite[k].sectnum].floorz);
|
||
|
setinterpolation(§or[sprite[k].sectnum].ceilingz);
|
||
|
break;
|
||
|
case 17:
|
||
|
setinterpolation(§or[sprite[k].sectnum].floorz);
|
||
|
setinterpolation(§or[sprite[k].sectnum].ceilingz);
|
||
|
break;
|
||
|
case 0:
|
||
|
case 5:
|
||
|
case 6:
|
||
|
case 11:
|
||
|
case 14:
|
||
|
case 15:
|
||
|
case 16:
|
||
|
case 26:
|
||
|
case 30:
|
||
|
setsectinterpolate(k);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
k = nextspritestat[k];
|
||
|
}
|
||
|
|
||
|
for(i=numinterpolations-1;i>=0;i--) bakipos[i] = *curipos[i];
|
||
|
for(i = animatecnt-1;i>=0;i--)
|
||
|
setinterpolation(animateptr[i]);
|
||
|
|
||
|
show_shareware = 0;
|
||
|
everyothertime = 0;
|
||
|
|
||
|
clearbufbyte(playerquitflag,MAXPLAYERS,0x01010101);
|
||
|
|
||
|
resetmys();
|
||
|
|
||
|
ready2send = 1;
|
||
|
|
||
|
flushpackets();
|
||
|
clearfifo();
|
||
|
waitforeverybody();
|
||
|
|
||
|
resettimevars();
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
int saveplayer(signed char spot)
|
||
|
{
|
||
|
long i, j;
|
||
|
char fn[] = "game0.sav";
|
||
|
char mpfn[] = "gameA_00.sav";
|
||
|
char fullname[128];
|
||
|
char *fnptr,scriptptrs[MAXSCRIPTSIZE];
|
||
|
FILE *fil;
|
||
|
long bv = BYTEVERSION;
|
||
|
|
||
|
if(spot < 0)
|
||
|
{
|
||
|
multiflag = 1;
|
||
|
multiwhat = 1;
|
||
|
multipos = -spot-1;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
waitforeverybody();
|
||
|
|
||
|
if( multiflag == 2 && multiwho != myconnectindex )
|
||
|
{
|
||
|
mpfn[4] = spot + 'A';
|
||
|
|
||
|
if(ud.multimode > 9)
|
||
|
{
|
||
|
mpfn[6] = (multiwho/10) + '0';
|
||
|
mpfn[7] = multiwho + '0';
|
||
|
}
|
||
|
else mpfn[7] = multiwho + '0';
|
||
|
|
||
|
GetPathFromEnvironment(fullname, 128, mpfn);
|
||
|
fnptr = fullname;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fn[4] = spot + '0';
|
||
|
|
||
|
GetPathFromEnvironment(fullname, 128, fn);
|
||
|
fnptr = fullname;
|
||
|
}
|
||
|
|
||
|
if ((fil = fopen(fnptr,"wb")) == 0) return(-1);
|
||
|
|
||
|
ready2send = 0;
|
||
|
|
||
|
dfwrite(&bv,4,1,fil);
|
||
|
dfwrite(&ud.multimode,sizeof(ud.multimode),1,fil);
|
||
|
|
||
|
dfwrite(&ud.savegame[spot][0],19,1,fil);
|
||
|
dfwrite(&ud.volume_number,sizeof(ud.volume_number),1,fil);
|
||
|
dfwrite(&ud.level_number,sizeof(ud.level_number),1,fil);
|
||
|
dfwrite(&ud.player_skill,sizeof(ud.player_skill),1,fil);
|
||
|
dfwrite((char *)waloff[MAXTILES-1],160,100,fil);
|
||
|
|
||
|
dfwrite(&numwalls,2,1,fil);
|
||
|
dfwrite(&wall[0],sizeof(walltype),MAXWALLS,fil);
|
||
|
dfwrite(&numsectors,2,1,fil);
|
||
|
dfwrite(§or[0],sizeof(sectortype),MAXSECTORS,fil);
|
||
|
dfwrite(&sprite[0],sizeof(spritetype),MAXSPRITES,fil);
|
||
|
dfwrite(&headspritesect[0],2,MAXSECTORS+1,fil);
|
||
|
dfwrite(&prevspritesect[0],2,MAXSPRITES,fil);
|
||
|
dfwrite(&nextspritesect[0],2,MAXSPRITES,fil);
|
||
|
dfwrite(&headspritestat[0],2,MAXSTATUS+1,fil);
|
||
|
dfwrite(&prevspritestat[0],2,MAXSPRITES,fil);
|
||
|
dfwrite(&nextspritestat[0],2,MAXSPRITES,fil);
|
||
|
dfwrite(&numcyclers,sizeof(numcyclers),1,fil);
|
||
|
dfwrite(&cyclers[0][0],12,MAXCYCLERS,fil);
|
||
|
dfwrite(ps,sizeof(ps),1,fil);
|
||
|
dfwrite(po,sizeof(po),1,fil);
|
||
|
dfwrite(&numanimwalls,sizeof(numanimwalls),1,fil);
|
||
|
dfwrite(&animwall,sizeof(animwall),1,fil);
|
||
|
dfwrite(&msx[0],sizeof(long),sizeof(msx)/sizeof(long),fil);
|
||
|
dfwrite(&msy[0],sizeof(long),sizeof(msy)/sizeof(long),fil);
|
||
|
dfwrite(&spriteqloc,sizeof(short),1,fil);
|
||
|
dfwrite(&spriteqamount,sizeof(short),1,fil);
|
||
|
dfwrite(&spriteq[0],sizeof(short),spriteqamount,fil);
|
||
|
dfwrite(&mirrorcnt,sizeof(short),1,fil);
|
||
|
dfwrite(&mirrorwall[0],sizeof(short),64,fil);
|
||
|
dfwrite(&mirrorsector[0],sizeof(short),64,fil);
|
||
|
dfwrite(&show2dsector[0],sizeof(char),MAXSECTORS>>3,fil);
|
||
|
dfwrite(&actortype[0],sizeof(char),MAXTILES,fil);
|
||
|
dfwrite(&boardfilename[0],sizeof(boardfilename),1,fil);
|
||
|
|
||
|
dfwrite(&numclouds,sizeof(numclouds),1,fil);
|
||
|
dfwrite(&clouds[0],sizeof(short)<<7,1,fil);
|
||
|
dfwrite(&cloudx[0],sizeof(short)<<7,1,fil);
|
||
|
dfwrite(&cloudy[0],sizeof(short)<<7,1,fil);
|
||
|
|
||
|
for(i=0;i<MAXSCRIPTSIZE;i++)
|
||
|
{
|
||
|
if( (long)script[i] >= (long)(&script[0]) && (long)script[i] < (long)(&script[MAXSCRIPTSIZE]) )
|
||
|
{
|
||
|
scriptptrs[i] = 1;
|
||
|
j = (long)script[i] - (long)&script[0];
|
||
|
script[i] = j;
|
||
|
}
|
||
|
else scriptptrs[i] = 0;
|
||
|
}
|
||
|
|
||
|
dfwrite(&scriptptrs[0],1,MAXSCRIPTSIZE,fil);
|
||
|
dfwrite(&script[0],4,MAXSCRIPTSIZE,fil);
|
||
|
|
||
|
for(i=0;i<MAXSCRIPTSIZE;i++)
|
||
|
if( scriptptrs[i] )
|
||
|
{
|
||
|
j = script[i]+(long)&script[0];
|
||
|
script[i] = j;
|
||
|
}
|
||
|
|
||
|
for(i=0;i<MAXTILES;i++)
|
||
|
if(actorscrptr[i])
|
||
|
{
|
||
|
j = (long)actorscrptr[i]-(long)&script[0];
|
||
|
actorscrptr[i] = (long *)j;
|
||
|
}
|
||
|
dfwrite(&actorscrptr[0],4,MAXTILES,fil);
|
||
|
for(i=0;i<MAXTILES;i++)
|
||
|
if(actorscrptr[i])
|
||
|
{
|
||
|
j = (long)actorscrptr[i]+(long)&script[0];
|
||
|
actorscrptr[i] = (long *)j;
|
||
|
}
|
||
|
|
||
|
for(i=0;i<MAXSPRITES;i++)
|
||
|
{
|
||
|
scriptptrs[i] = 0;
|
||
|
|
||
|
if(actorscrptr[PN] == 0) continue;
|
||
|
|
||
|
j = (long)&script[0];
|
||
|
|
||
|
if(T2 >= j && T2 < (long)(&script[MAXSCRIPTSIZE]) )
|
||
|
{
|
||
|
scriptptrs[i] |= 1;
|
||
|
T2 -= j;
|
||
|
}
|
||
|
if(T5 >= j && T5 < (long)(&script[MAXSCRIPTSIZE]) )
|
||
|
{
|
||
|
scriptptrs[i] |= 2;
|
||
|
T5 -= j;
|
||
|
}
|
||
|
if(T6 >= j && T6 < (long)(&script[MAXSCRIPTSIZE]) )
|
||
|
{
|
||
|
scriptptrs[i] |= 4;
|
||
|
T6 -= j;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dfwrite(&scriptptrs[0],1,MAXSPRITES,fil);
|
||
|
dfwrite(&hittype[0],sizeof(struct weaponhit),MAXSPRITES,fil);
|
||
|
|
||
|
for(i=0;i<MAXSPRITES;i++)
|
||
|
{
|
||
|
if(actorscrptr[PN] == 0) continue;
|
||
|
j = (long)&script[0];
|
||
|
|
||
|
if(scriptptrs[i]&1)
|
||
|
T2 += j;
|
||
|
if(scriptptrs[i]&2)
|
||
|
T5 += j;
|
||
|
if(scriptptrs[i]&4)
|
||
|
T6 += j;
|
||
|
}
|
||
|
|
||
|
dfwrite(&lockclock,sizeof(lockclock),1,fil);
|
||
|
dfwrite(&pskybits,sizeof(pskybits),1,fil);
|
||
|
dfwrite(&pskyoff[0],sizeof(pskyoff[0]),MAXPSKYTILES,fil);
|
||
|
dfwrite(&animatecnt,sizeof(animatecnt),1,fil);
|
||
|
dfwrite(&animatesect[0],2,MAXANIMATES,fil);
|
||
|
for(i = animatecnt-1;i>=0;i--) animateptr[i] = (long *)((long)animateptr[i]-(long)(§or[0]));
|
||
|
dfwrite(&animateptr[0],4,MAXANIMATES,fil);
|
||
|
for(i = animatecnt-1;i>=0;i--) animateptr[i] = (long *)((long)animateptr[i]+(long)(§or[0]));
|
||
|
dfwrite(&animategoal[0],4,MAXANIMATES,fil);
|
||
|
dfwrite(&animatevel[0],4,MAXANIMATES,fil);
|
||
|
|
||
|
dfwrite(&earthquaketime,sizeof(earthquaketime),1,fil);
|
||
|
dfwrite(&ud.from_bonus,sizeof(ud.from_bonus),1,fil);
|
||
|
dfwrite(&ud.secretlevel,sizeof(ud.secretlevel),1,fil);
|
||
|
dfwrite(&ud.respawn_monsters,sizeof(ud.respawn_monsters),1,fil);
|
||
|
dfwrite(&ud.respawn_items,sizeof(ud.respawn_items),1,fil);
|
||
|
dfwrite(&ud.respawn_inventory,sizeof(ud.respawn_inventory),1,fil);
|
||
|
dfwrite(&ud.god,sizeof(ud.god),1,fil);
|
||
|
dfwrite(&ud.auto_run,sizeof(ud.auto_run),1,fil);
|
||
|
dfwrite(&ud.crosshair,sizeof(ud.crosshair),1,fil);
|
||
|
dfwrite(&ud.monsters_off,sizeof(ud.monsters_off),1,fil);
|
||
|
dfwrite(&ud.last_level,sizeof(ud.last_level),1,fil);
|
||
|
dfwrite(&ud.eog,sizeof(ud.eog),1,fil);
|
||
|
dfwrite(&ud.coop,sizeof(ud.coop),1,fil);
|
||
|
dfwrite(&ud.marker,sizeof(ud.marker),1,fil);
|
||
|
dfwrite(&ud.ffire,sizeof(ud.ffire),1,fil);
|
||
|
dfwrite(&camsprite,sizeof(camsprite),1,fil);
|
||
|
dfwrite(&connecthead,sizeof(connecthead),1,fil);
|
||
|
dfwrite(connectpoint2,sizeof(connectpoint2),1,fil);
|
||
|
dfwrite(&numplayersprites,sizeof(numplayersprites),1,fil);
|
||
|
dfwrite((short *)&frags[0][0],sizeof(frags),1,fil);
|
||
|
|
||
|
dfwrite(&randomseed,sizeof(randomseed),1,fil);
|
||
|
dfwrite(&global_random,sizeof(global_random),1,fil);
|
||
|
dfwrite(¶llaxyscale,sizeof(parallaxyscale),1,fil);
|
||
|
|
||
|
fclose(fil);
|
||
|
|
||
|
if(ud.multimode < 2)
|
||
|
{
|
||
|
strcpy(fta_quotes[122],"GAME SAVED");
|
||
|
FTA(122,&ps[myconnectindex]);
|
||
|
}
|
||
|
|
||
|
ready2send = 1;
|
||
|
|
||
|
waitforeverybody();
|
||
|
|
||
|
ototalclock = totalclock;
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
#define LMB (buttonstat&1)
|
||
|
#define RMB (buttonstat&2)
|
||
|
|
||
|
ControlInfo minfo;
|
||
|
|
||
|
long mi;
|
||
|
|
||
|
static int probe_with_delete(int x,int y,int i,int n,int *hitdelete)
|
||
|
{
|
||
|
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,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,0,SPINNINGNUKEICON+((totalclock>>3)%7),sh,0,10,0,0,xdim-1,ydim-1);
|
||
|
}
|
||
|
else
|
||
|
rotatesprite((x-tilesizx[BIGFNTCURSOR]-4)<<16,(y+(probey*i)-4)<<16,65536L,0,SPINNINGNUKEICON+(((totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1);
|
||
|
|
||
|
if (hitdelete != NULL)
|
||
|
{
|
||
|
*hitdelete = ((KB_KeyPressed(sc_Delete)) ||
|
||
|
(KB_KeyPressed(sc_BackSpace)) ||
|
||
|
(KB_KeyPressed(sc_kpad_Period)));
|
||
|
|
||
|
if (*hitdelete)
|
||
|
{
|
||
|
sound(KICK_HIT);
|
||
|
KB_ClearKeyDown(sc_Delete);
|
||
|
KB_ClearKeyDown(sc_BackSpace);
|
||
|
KB_ClearKeyDown(sc_kpad_Period);
|
||
|
return(probey);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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_with_delete(x,y,i,n,NULL);
|
||
|
}
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|
||
|
|
||
|
int menutextc(int x,int y,short s,short p,char *t)
|
||
|
{
|
||
|
short i, ac, centre;
|
||
|
|
||
|
s += 8;
|
||
|
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+26+26;
|
||
|
if(*(t+i) >= 'a' && *(t+i) <= 'z')
|
||
|
ac = *(t+i) - 'a' + BIGALPHANUM+26;
|
||
|
if(*(t+i) >= 'A' && *(t+i) <= 'Z')
|
||
|
ac = *(t+i) - 'A' + BIGALPHANUM;
|
||
|
|
||
|
else switch(*t)
|
||
|
{
|
||
|
case '-':
|
||
|
ac = BIGALPHANUM-11;
|
||
|
break;
|
||
|
case '.':
|
||
|
ac = BIGPERIOD;
|
||
|
break;
|
||
|
case ',':
|
||
|
ac = BIGCOMMA;
|
||
|
break;
|
||
|
case '!':
|
||
|
ac = BIGX;
|
||
|
break;
|
||
|
case '?':
|
||
|
ac = BIGQ;
|
||
|
break;
|
||
|
case ';':
|
||
|
ac = BIGSEMI;
|
||
|
break;
|
||
|
case ':':
|
||
|
ac = BIGCOLIN;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
centre += tilesizx[ac]-1;
|
||
|
i++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
x -= centre>>1;
|
||
|
|
||
|
while(*t)
|
||
|
{
|
||
|
if(*t == ' ') {x+=5;t++;continue;}
|
||
|
ac = 0;
|
||
|
if(*t >= '0' && *t <= '9')
|
||
|
ac = *t - '0' + BIGALPHANUM+26+26;
|
||
|
if(*t >= 'a' && *t <= 'z')
|
||
|
ac = *t - 'a' + BIGALPHANUM+26;
|
||
|
if(*t >= 'A' && *t <= 'Z')
|
||
|
ac = *t - 'A' + BIGALPHANUM;
|
||
|
switch(*t)
|
||
|
{
|
||
|
case '-':
|
||
|
ac = BIGALPHANUM-11;
|
||
|
break;
|
||
|
case '.':
|
||
|
ac = BIGPERIOD;
|
||
|
break;
|
||
|
case ',':
|
||
|
ac = BIGCOMMA;
|
||
|
break;
|
||
|
case '!':
|
||
|
ac = BIGX;
|
||
|
break;
|
||
|
case '?':
|
||
|
ac = BIGQ;
|
||
|
break;
|
||
|
case ';':
|
||
|
ac = BIGSEMI;
|
||
|
break;
|
||
|
case ':':
|
||
|
ac = BIGCOLIN;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
rotatesprite(x<<16,y<<16,65536L,0,ac,s,p,10+16,0,0,xdim-1,ydim-1);
|
||
|
|
||
|
x += tilesizx[ac];
|
||
|
t++;
|
||
|
}
|
||
|
return (x);
|
||
|
}
|
||
|
|
||
|
|
||
|
void bar(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( 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( 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( 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( 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+22)<<16,(y-3)<<16,65536L,0,SLIDEBAR,s,pa,10,0,0,xdim-1,ydim-1);
|
||
|
if(rev == 0)
|
||
|
rotatesprite( (x+xloc+1)<<16,(y+1)<<16,65536L,0,SLIDEBAR+1,s,pa,10,0,0,xdim-1,ydim-1);
|
||
|
else
|
||
|
rotatesprite( (x+(65-xloc) )<<16,(y+1)<<16,65536L,0,SLIDEBAR+1,s,pa,10,0,0,xdim-1,ydim-1);
|
||
|
}
|
||
|
|
||
|
#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)
|
||
|
|
||
|
|
||
|
int32 volnum,levnum,plrskl,numplr;
|
||
|
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);
|
||
|
|
||
|
minitext(c,48,ud.savegame[0],2,10+16);
|
||
|
minitext(c,48+12,ud.savegame[1],2,10+16);
|
||
|
minitext(c,48+12+12,ud.savegame[2],2,10+16);
|
||
|
minitext(c,48+12+12+12,ud.savegame[3],2,10+16);
|
||
|
minitext(c,48+12+12+12+12,ud.savegame[4],2,10+16);
|
||
|
minitext(c,48+12+12+12+12+12,ud.savegame[5],2,10+16);
|
||
|
minitext(c,48+12+12+12+12+12+12,ud.savegame[6],2,10+16);
|
||
|
minitext(c,48+12+12+12+12+12+12+12,ud.savegame[7],2,10+16);
|
||
|
minitext(c,48+12+12+12+12+12+12+12+12,ud.savegame[8],2,10+16);
|
||
|
minitext(c,48+12+12+12+12+12+12+12+12+12,ud.savegame[9],2,10+16);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
// This is the same thing as was in build.c ...
|
||
|
// We DO have a _dos_findfirst implementation now...maybe use that instead?
|
||
|
// --ryan.
|
||
|
#if ORIGINAL_DUKE3D_GETFILENAMES
|
||
|
int getfilenames(char kind[6])
|
||
|
{
|
||
|
short type;
|
||
|
struct find_t fileinfo;
|
||
|
|
||
|
if (strcmp(kind,"SUBD") == 0)
|
||
|
{
|
||
|
strcpy(kind,"*.*");
|
||
|
if (_dos_findfirst(kind,_A_SUBDIR,&fileinfo) != 0)
|
||
|
return(-1);
|
||
|
type = 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (_dos_findfirst(kind,_A_NORMAL,&fileinfo) != 0)
|
||
|
return(-1);
|
||
|
type = 0;
|
||
|
}
|
||
|
do
|
||
|
{
|
||
|
if ((type == 0) || ((fileinfo.attrib&16) > 0))
|
||
|
if ((fileinfo.name[0] != '.') || (fileinfo.name[1] != 0))
|
||
|
{
|
||
|
strcpy(menuname[menunamecnt],fileinfo.name);
|
||
|
menuname[menunamecnt][16] = type;
|
||
|
menunamecnt++;
|
||
|
}
|
||
|
}
|
||
|
while (_dos_findnext(&fileinfo) == 0);
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
int getfilenames(char kind[6])
|
||
|
{
|
||
|
/* !!! FIXME: Visual C? */
|
||
|
#if (defined __WATCOMC__)
|
||
|
short type;
|
||
|
struct find_t fileinfo;
|
||
|
|
||
|
if (strcmp(kind,"SUBD") == 0)
|
||
|
{
|
||
|
strcpy(kind,"*.*");
|
||
|
if (_dos_findfirst(kind,_A_SUBDIR,&fileinfo) != 0)
|
||
|
return(-1);
|
||
|
type = 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (_dos_findfirst(kind,_A_NORMAL,&fileinfo) != 0)
|
||
|
return(-1);
|
||
|
type = 0;
|
||
|
}
|
||
|
do
|
||
|
{
|
||
|
if ((type == 0) || ((fileinfo.attrib&16) > 0))
|
||
|
if ((fileinfo.name[0] != '.') || (fileinfo.name[1] != 0))
|
||
|
{
|
||
|
strcpy(menuname[menunamecnt],fileinfo.name);
|
||
|
menuname[menunamecnt][16] = type;
|
||
|
menunamecnt++;
|
||
|
}
|
||
|
}
|
||
|
while (_dos_findnext(&fileinfo) == 0);
|
||
|
|
||
|
#elif (defined PLATFORM_UNIX)
|
||
|
|
||
|
DIR *dir;
|
||
|
struct dirent *dent;
|
||
|
struct stat statbuf;
|
||
|
int add_this;
|
||
|
char *ptr = NULL;
|
||
|
int len = 0;
|
||
|
int subdirs = 0;
|
||
|
|
||
|
if (strcmp(kind,"SUBD") == 0)
|
||
|
subdirs = 1;
|
||
|
|
||
|
dir = opendir(".");
|
||
|
if (dir == NULL)
|
||
|
return(-1);
|
||
|
|
||
|
do
|
||
|
{
|
||
|
add_this = 0;
|
||
|
dent = readdir(dir);
|
||
|
if (dent != NULL)
|
||
|
{
|
||
|
#ifndef DC
|
||
|
if (stat(dent->d_name, &statbuf) == 0)
|
||
|
#endif
|
||
|
{
|
||
|
if (subdirs)
|
||
|
{
|
||
|
#ifdef DC
|
||
|
if (dent->size==-1)
|
||
|
#else
|
||
|
if (S_ISDIR(statbuf.st_mode))
|
||
|
#endif
|
||
|
add_this = 1;
|
||
|
} /* if */
|
||
|
else
|
||
|
{
|
||
|
/* need to expand support if this assertion ever fails. */
|
||
|
assert(stricmp(kind, "*.MAP") == 0);
|
||
|
len = strlen(dent->d_name);
|
||
|
if (len >= 5)
|
||
|
{
|
||
|
ptr = ((char *) dent->d_name) + len;
|
||
|
ptr += strlen(ptr) - 4;
|
||
|
if (stricmp(ptr, ".MAP") == 0)
|
||
|
add_this = 1;
|
||
|
} /* if */
|
||
|
} /* else */
|
||
|
|
||
|
if (add_this)
|
||
|
{
|
||
|
strcpy(menuname[(int)menunamecnt],dent->d_name);
|
||
|
menuname[(int)menunamecnt][16] = subdirs;
|
||
|
menunamecnt++;
|
||
|
} /* if */
|
||
|
} /* if */
|
||
|
} /* if */
|
||
|
} while (dent != NULL);
|
||
|
|
||
|
closedir(dir);
|
||
|
|
||
|
#endif
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
void sortfilenames()
|
||
|
{
|
||
|
char sortbuffer[17];
|
||
|
long i, j, k;
|
||
|
|
||
|
for(i=1;i<menunamecnt;i++)
|
||
|
for(j=0;j<i;j++)
|
||
|
{
|
||
|
k = 0;
|
||
|
while ((menuname[i][k] == menuname[j][k]) && (menuname[i][k] != 0) && (menuname[j][k] != 0))
|
||
|
k++;
|
||
|
if (menuname[i][k] < menuname[j][k])
|
||
|
{
|
||
|
memcpy(&sortbuffer[0],&menuname[i][0],sizeof(menuname[0]));
|
||
|
memcpy(&menuname[i][0],&menuname[j][0],sizeof(menuname[0]));
|
||
|
memcpy(&menuname[j][0],&sortbuffer[0],sizeof(menuname[0]));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
long quittimer = 0;
|
||
|
|
||
|
|
||
|
#define MENU_CONTROLS 30000
|
||
|
#define MENU_CONTROLS_MOVEMENT 30001
|
||
|
#define MENU_CONTROLS_MOREMOVEMENT 30002
|
||
|
#define MENU_CONTROLS_ACTIONS 30003
|
||
|
#define MENU_CONTROLS_WEAPONS 30004
|
||
|
#define MENU_CONTROLS_ITEMS 30005
|
||
|
#define MENU_CONTROLS_MISC 30006
|
||
|
#define MENU_CONTROLS_KEYBINDER 30007
|
||
|
|
||
|
#if CONTROLS_CONFIG_MENU
|
||
|
|
||
|
static int controlsstackedprobey = -1;
|
||
|
|
||
|
#define ALEN(x) (sizeof (x) / sizeof (x[0]))
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
char *name;
|
||
|
int32 which;
|
||
|
} KeyBinds;
|
||
|
|
||
|
static void keybindtext(int pos, char *name, int32 which)
|
||
|
{
|
||
|
char *binding = (char *) CONTROL_GetMappingName(which);
|
||
|
if (binding == NULL)
|
||
|
binding = "?";
|
||
|
pos++;
|
||
|
menutext(45,20+(16*pos),SHX(-pos),PHX(-pos),name);
|
||
|
menutext(235,20+(16*pos),SHX(-pos),PHX(-pos),binding);
|
||
|
}
|
||
|
|
||
|
|
||
|
static KeyBinds *currentbind = NULL;
|
||
|
static int prevbindmenu = 0;
|
||
|
static int keybindprobey = 0;
|
||
|
|
||
|
static void DoKeybindMenu(char *name, KeyBinds *keybinds, int cnt, int prevmenu)
|
||
|
{
|
||
|
int i;
|
||
|
int rc;
|
||
|
int hitdelete = 0;
|
||
|
int drawmenu = 0;
|
||
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
||
|
menutext(320>>1,15,0,0,name);
|
||
|
|
||
|
rc = probe_with_delete(46,20+16,16,cnt,&hitdelete);
|
||
|
if (rc == -1) // escape
|
||
|
{
|
||
|
cmenu(prevmenu);
|
||
|
if (controlsstackedprobey >= 0)
|
||
|
{
|
||
|
probey = controlsstackedprobey;
|
||
|
controlsstackedprobey = -1;
|
||
|
}
|
||
|
}
|
||
|
else if (rc >= 0) // chose an option.
|
||
|
{
|
||
|
if (hitdelete) // clear this keybind.
|
||
|
{
|
||
|
char *fname = CONFIG_FunctionNumToName(keybinds[rc].which);
|
||
|
CONTROL_MapKey(keybinds[rc].which, 0, 0);
|
||
|
CONFIG_PutString("KeyDefinitions", fname, "");
|
||
|
drawmenu = 1;
|
||
|
}
|
||
|
else // Go to the keybinder menu to select a new key.
|
||
|
{
|
||
|
prevbindmenu = current_menu;
|
||
|
currentbind = &keybinds[rc];
|
||
|
keybindprobey = probey;
|
||
|
KB_FlushKeyboardQueue();
|
||
|
KB_ClearKeysDown();
|
||
|
cmenu(MENU_CONTROLS_KEYBINDER);
|
||
|
}
|
||
|
}
|
||
|
else // unknown option or none chosen, so draw menu.
|
||
|
{
|
||
|
drawmenu = 1;
|
||
|
}
|
||
|
|
||
|
if (drawmenu)
|
||
|
{
|
||
|
for (i = 0; i < cnt; i++)
|
||
|
keybindtext(i, keybinds[i].name, keybinds[i].which);
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
static void non3dr_menus(void)
|
||
|
{
|
||
|
short c = (320>>1);
|
||
|
int rc;
|
||
|
|
||
|
switch(current_menu)
|
||
|
{
|
||
|
#if CONTROLS_CONFIG_MENU
|
||
|
case MENU_CONTROLS_KEYBINDER: // binding a new key.
|
||
|
{
|
||
|
int bound = 0;
|
||
|
char *binding;
|
||
|
if (currentbind == NULL) // sanity check.
|
||
|
{
|
||
|
cmenu(prevbindmenu ? prevbindmenu : MENU_CONTROLS);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (KB_KeyWaiting())
|
||
|
{
|
||
|
kb_scancode sc = KB_GetLastScanCode();
|
||
|
char *scstr = KB_ScanCodeToString(sc);
|
||
|
KB_FlushKeyboardQueue();
|
||
|
KB_ClearKeysDown();
|
||
|
|
||
|
if (scstr == NULL) // make sure it maps.
|
||
|
sound(KICK_HIT);
|
||
|
else
|
||
|
{
|
||
|
if (sc == sc_Escape) // cancel request?
|
||
|
sound(EXITMENUSOUND);
|
||
|
else
|
||
|
{
|
||
|
char *fname = CONFIG_FunctionNumToName(currentbind->which);
|
||
|
sound(PISTOL_BODYHIT);
|
||
|
CONTROL_MapKey(currentbind->which, sc, 0);
|
||
|
CONFIG_PutString("KeyDefinitions", fname, scstr);
|
||
|
}
|
||
|
bound = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if 0 // !!! FIXME...yuck.
|
||
|
else
|
||
|
{
|
||
|
int32 buttons = MOUSE_GetButtons();
|
||
|
if (buttons)
|
||
|
{
|
||
|
int i;
|
||
|
int32 b = 1;
|
||
|
for (i = 0; i < MAXMOUSEBUTTONS; i++, b <<= 1)
|
||
|
{
|
||
|
if (b & buttons)
|
||
|
{
|
||
|
char *fname = CONFIG_FunctionNumToName(currentbind->which);
|
||
|
char buf[64];
|
||
|
snprintf(buf, sizeof (buf), "MouseButton%d", i);
|
||
|
CONTROL_MapButton(currentbind->which, i, 0);
|
||
|
CONFIG_PutString("Controls", buf, fname);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
bound = ((b & buttons) != 0);
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
if (bound)
|
||
|
{
|
||
|
cmenu(prevbindmenu ? prevbindmenu : MENU_CONTROLS);
|
||
|
prevbindmenu = 0;
|
||
|
currentbind = NULL;
|
||
|
probey = keybindprobey;
|
||
|
break; // we're done.
|
||
|
}
|
||
|
|
||
|
// still waiting for valid user input...draw UI.
|
||
|
|
||
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
||
|
menutext(320>>1,15,0,0,currentbind->name);
|
||
|
|
||
|
binding = (char *) CONTROL_GetMappingName(currentbind->which);
|
||
|
if (binding != NULL)
|
||
|
{
|
||
|
menutext(320>>1,15+30,0,0,"CURRENTLY BOUND TO:");
|
||
|
menutext(320>>1,15+30+16,0,0,binding);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
menutext(320>>1,15+30+16,0,0,"NOT CURRENTLY BOUND");
|
||
|
}
|
||
|
|
||
|
menutext(320>>1,15+30+16+30,0,0,"PRESS NEW KEY");
|
||
|
menutext(320>>1,15+30+16+30+16,0,0,"OR");
|
||
|
menutext(320>>1,15+30+16+30+16+16,0,0,"ESC TO LEAVE AS IS");
|
||
|
|
||
|
rotatesprite((320>>1)<<16,(15+30+16+30+16+16+20)<<16,65536L,0,SPINNINGNUKEICON+(((totalclock>>3))%7),sh,0,10,0,0,xdim-1,ydim-1);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case MENU_CONTROLS: // main config menu.
|
||
|
{
|
||
|
rotatesprite(320<<15,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
||
|
menutext(320>>1,15,0,0,"CONTROLS");
|
||
|
|
||
|
ignore_escape = 1;
|
||
|
rc = probe(320/4,20+16,16,6); // !!! FIXME: Move cursor to right more.
|
||
|
controlsstackedprobey = rc;
|
||
|
switch (rc)
|
||
|
{
|
||
|
case -1: // escape
|
||
|
cmenu(200); // options menu
|
||
|
ignore_escape = 0;
|
||
|
break;
|
||
|
case 0: // movement
|
||
|
cmenu(MENU_CONTROLS_MOVEMENT);
|
||
|
break;
|
||
|
case 1: // more movement
|
||
|
cmenu(MENU_CONTROLS_MOREMOVEMENT);
|
||
|
break;
|
||
|
case 2: // actions
|
||
|
cmenu(MENU_CONTROLS_ACTIONS);
|
||
|
break;
|
||
|
case 3: // weapons
|
||
|
cmenu(MENU_CONTROLS_WEAPONS);
|
||
|
break;
|
||
|
case 4: // items
|
||
|
cmenu(MENU_CONTROLS_ITEMS);
|
||
|
break;
|
||
|
case 5: // misc
|
||
|
cmenu(MENU_CONTROLS_MISC);
|
||
|
break;
|
||
|
default:
|
||
|
menutext(c,20+16,SHX(-1),PHX(-1),"MOVEMENT");
|
||
|
menutext(c,20+16+16,SHX(-2),PHX(-2),"MORE MOVEMENT");
|
||
|
menutext(c,20+16+16+16,SHX(-3),PHX(-3),"ACTIONS");
|
||
|
menutext(c,20+16+16+16+16,SHX(-4),PHX(-4),"WEAPON SELECT");
|
||
|
menutext(c,20+16+16+16+16+16,SHX(-5),PHX(-5),"INVENTORY");
|
||
|
menutext(c,20+16+16+16+16+16+16,SHX(-6),PHX(-6),"MISCELLANEOUS");
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case MENU_CONTROLS_MOVEMENT: // movement controls.
|
||
|
{
|
||
|
static KeyBinds keybinds[] =
|
||
|
{
|
||
|
{ "MOVE FORWARD", gamefunc_Move_Forward },
|
||
|
{ "MOVE BACKWARD", gamefunc_Move_Backward },
|
||
|
{ "STRAFE LEFT", gamefunc_Strafe_Left },
|
||
|
{ "STRAFE RIGHT", gamefunc_Strafe_Right },
|
||
|
{ "TURN LEFT",gamefunc_Turn_Left },
|
||
|
{ "TURN RIGHT",gamefunc_Turn_Right },
|
||
|
{ "STRAFE", gamefunc_Strafe }
|
||
|
};
|
||
|
|
||
|
DoKeybindMenu("MOVEMENT", keybinds, ALEN(keybinds), MENU_CONTROLS);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case MENU_CONTROLS_MOREMOVEMENT: // more movement controls.
|
||
|
{
|
||
|
static KeyBinds keybinds[] =
|
||
|
{
|
||
|
{ "JUMP", gamefunc_Jump },
|
||
|
{ "CROUCH", gamefunc_Crouch },
|
||
|
{ "RUN", gamefunc_Run },
|
||
|
{ "RUNLOCK", gamefunc_AutoRun },
|
||
|
{ "AIM UP", gamefunc_Aim_Up },
|
||
|
{ "AIM DOWN", gamefunc_Aim_Down },
|
||
|
{ "CENTER VIEW", gamefunc_Center_View },
|
||
|
{ "MOUSE AIM", gamefunc_Mouse_Aiming }
|
||
|
};
|
||
|
|
||
|
DoKeybindMenu("MORE MOVEMENT", keybinds, ALEN(keybinds), MENU_CONTROLS);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case MENU_CONTROLS_ACTIONS: // actions controls
|
||
|
{
|
||
|
static KeyBinds keybinds[] =
|
||
|
{
|
||
|
{ "FIRE OR ATTACK", gamefunc_Fire },
|
||
|
{ "OPEN OR USE", gamefunc_Open },
|
||
|
{ "QUICK KICK", gamefunc_Quick_Kick },
|
||
|
{ "180 TURN", gamefunc_TurnAround },
|
||
|
{ "VIEW MAP", gamefunc_Map },
|
||
|
{ "HOLSTER WEAPON" ,gamefunc_Holster_Weapon },
|
||
|
{ "PREVIOUS WEAPON", gamefunc_Previous_Weapon },
|
||
|
{ "NEXT WEAPON", gamefunc_Next_Weapon }
|
||
|
};
|
||
|
|
||
|
DoKeybindMenu("ACTIONS", keybinds, ALEN(keybinds), MENU_CONTROLS);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case MENU_CONTROLS_WEAPONS: // weapon controls
|
||
|
{
|
||
|
static KeyBinds keybinds[] =
|
||
|
{
|
||
|
{ "KICK", gamefunc_Weapon_1 },
|
||
|
{ "PISTOL", gamefunc_Weapon_2 },
|
||
|
{ "SHOTGUN", gamefunc_Weapon_3 },
|
||
|
{ "RIPPER", gamefunc_Weapon_4 },
|
||
|
{ "RPG", gamefunc_Weapon_5 },
|
||
|
{ "PIPEBOMB", gamefunc_Weapon_6 },
|
||
|
{ "SHRINK RAY", gamefunc_Weapon_7 },
|
||
|
{ "DEVASTATOR", gamefunc_Weapon_8 },
|
||
|
{ "TRIP BOMP", gamefunc_Weapon_9 },
|
||
|
{ "FREEZER", gamefunc_Weapon_10 }
|
||
|
};
|
||
|
|
||
|
DoKeybindMenu("WEAPON SELECT", keybinds, ALEN(keybinds), MENU_CONTROLS);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case MENU_CONTROLS_ITEMS: // item controls
|
||
|
{
|
||
|
static KeyBinds keybinds[] =
|
||
|
{
|
||
|
{ "INVENTORY", gamefunc_Inventory },
|
||
|
{ "PREVIOUS ITEM", gamefunc_Inventory_Left },
|
||
|
{ "NEXT ITEM", gamefunc_Inventory_Right },
|
||
|
{ "USE HOLODUKE", gamefunc_Holo_Duke},
|
||
|
{ "USE JETPACK", gamefunc_Jetpack },
|
||
|
{ "USE NIGHTVISION", gamefunc_NightVision },
|
||
|
{ "USE MEDKIT", gamefunc_MedKit },
|
||
|
{ "USE STEROIDS", gamefunc_Steroids }
|
||
|
};
|
||
|
|
||
|
DoKeybindMenu("INVENTORY", keybinds, ALEN(keybinds), MENU_CONTROLS);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case MENU_CONTROLS_MISC: // misc controls
|
||
|
{
|
||
|
static KeyBinds keybinds[] =
|
||
|
{
|
||
|
{ "SHRINK SCREEN", gamefunc_Shrink_Screen },
|
||
|
{ "ENLARGE SCREEN", gamefunc_Enlarge_Screen },
|
||
|
{ "SHOW WEAPONS", gamefunc_Show_Opponents_Weapon },
|
||
|
{ "MAP FOLLOW MODE", gamefunc_Map_Follow_Mode },
|
||
|
{ "SEE COOP VIEW", gamefunc_See_Coop_View },
|
||
|
{ "CHAT MESSAGE", gamefunc_SendMessage },
|
||
|
{ "TOGGLE CROSSHAIR", gamefunc_Toggle_Crosshair },
|
||
|
};
|
||
|
|
||
|
DoKeybindMenu("MISCELLANEOUS", keybinds, ALEN(keybinds), MENU_CONTROLS);
|
||
|
break;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
default:
|
||
|
//gameexit("\nERROR: Unknown menu?!\n");
|
||
|
cmenu(0); // main menu
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void menus(void)
|
||
|
{
|
||
|
int count;
|
||
|
short shorttmp = 0;
|
||
|
short c,x;
|
||
|
volatile long l;
|
||
|
// CTW - REMOVED
|
||
|
// int tenerr;
|
||
|
// CTW END - REMOVED
|
||
|
|
||
|
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[MAXTILES-3] = 1;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ps[myconnectindex].gm &= (0xff-MODE_TYPE);
|
||
|
ps[myconnectindex].fta = 0;
|
||
|
|
||
|
x = 0;
|
||
|
|
||
|
sh = 4-(sintable[(totalclock<<4)&2047]>>11);
|
||
|
|
||
|
if(!(current_menu >= 1000 && current_menu <= 2999 && current_menu >= 300 && current_menu <= 369))
|
||
|
vscrn();
|
||
|
|
||
|
// icculus.org-added menus?
|
||
|
if (current_menu >= 30000)
|
||
|
non3dr_menus();
|
||
|
else 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;
|
||
|
// CTW - REMOVED
|
||
|
/* case 20001:
|
||
|
x = probe(188,80+32+32,0,0);
|
||
|
gametext(160,86-8,"You must be in Windows 95 to",0,2+8+16);
|
||
|
gametext(160,86,"play on TEN",0,2+8+16);
|
||
|
gametext(160,86+32,"PRESS ANY KEY...",0,2+8+16);
|
||
|
if(x >= -1) cmenu(0);
|
||
|
break;
|
||
|
|
||
|
case 20002:
|
||
|
x = probe(188,80+32+32+32,0,0);
|
||
|
gametext(160,86-8,"MISSING FILE: TENGAME.INI. PLEASE",0,2+8+16);
|
||
|
gametext(160,86,"CONNECT TO TEN BY LAUNCHING THE",0,2+8+16);
|
||
|
gametext(160,86+8,"CONNECT TO TEN SHORTCUT OR CONTACT",0,2+8+16);
|
||
|
gametext(160,86+8+8,"CUSTOMER SUPPORT AT 1-800-8040-TEN.",0,2+8+16);
|
||
|
gametext(160,86+8+8+32,"PRESS ANY KEY...",0,2+8+16);
|
||
|
if(x >= -1) cmenu(0);
|
||
|
break;
|
||
|
case 20003:
|
||
|
x = probe(188,80+32+32,0,0);
|
||
|
gametext(160,86-8,"BAD TEN INSTALL: PLEASE RE-INSTALL",0,2+8+16);
|
||
|
gametext(160,86,"BAD TEN INSTALL: PLEASE RE-INSTALL TEN",0,2+8+16);
|
||
|
gametext(160,86+32,"PRESS ANY KEY...",0,2+8+16);
|
||
|
if(x >= -1) cmenu(0);
|
||
|
break;
|
||
|
case 20005:
|
||
|
x = probe(188,80+32+32,0,0);
|
||
|
gametext(160,86-8,"GET THE LATEST TEN SOFTWARE AT",0,2+8+16);
|
||
|
gametext(160,86,"HTTP://WWW.TEN.NET",0,2+8+16);
|
||
|
gametext(160,86+32,"PRESS ANY KEY...",0,2+8+16);
|
||
|
if(x >= -1) cmenu(0);
|
||
|
break;*/
|
||
|
// CTW END - REMOVED
|
||
|
|
||
|
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)
|
||
|
{
|
||
|
enterlevel(MODE_GAME);
|
||
|
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();
|
||
|
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(200); 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(wall[animwall[x].wallnum].picnum)
|
||
|
{
|
||
|
case FEMPIC1:
|
||
|
wall[animwall[x].wallnum].picnum = BLANKSCREEN;
|
||
|
break;
|
||
|
case FEMPIC2:
|
||
|
case FEMPIC3:
|
||
|
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,512,MAXTILES-3,-32,0,4+10+64,0,0,xdim-1,ydim-1);
|
||
|
|
||
|
dispnames();
|
||
|
|
||
|
sprintf(tempbuf,"PLAYERS: %-2ld ",numplr); // int32 = long
|
||
|
gametext(160,158,tempbuf,0,2+8+16);
|
||
|
|
||
|
sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+volnum,1+levnum,plrskl);
|
||
|
gametext(160,170,tempbuf,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();
|
||
|
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;
|
||
|
for(x=connecthead;x>=0;x=connectpoint2[x])
|
||
|
if(x != myconnectindex)
|
||
|
sendpacket(x,tempbuf,2);
|
||
|
|
||
|
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,512,MAXTILES-3,-32,0,4+10+64,0,0,xdim-1,ydim-1);
|
||
|
sprintf(tempbuf,"PLAYERS: %-2ld ",ud.multimode);
|
||
|
gametext(160,158,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,170,tempbuf,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 )
|
||
|
{
|
||
|
KB_FlushKeyboardQueue();
|
||
|
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:
|
||
|
|
||
|
// 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,"CREDITS");
|
||
|
|
||
|
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 = 992;
|
||
|
}
|
||
|
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 > 992) current_menu = 990;
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 0:
|
||
|
c = (320>>1);
|
||
|
rotatesprite(c<<16,(28<<16)-5,65536L,0,INGAMEDUKETHREEDEE,0,0,10,0,0,xdim-1,ydim-1);
|
||
|
rotatesprite((c+100)<<16,(36<<16)-5,65536L,0,PLUTOPAKSPRITE+2,(sintable[(totalclock<<4)&2047]>>11),0,2+8,0,0,xdim-1,ydim-1);
|
||
|
// CTW - MODIFICATION
|
||
|
// x = probe(c,67-3,16,7);
|
||
|
count = 6;
|
||
|
#if NET_MENU
|
||
|
count++;
|
||
|
#endif
|
||
|
x = probe(c,67-3,16,count);
|
||
|
// CTW END - MODIFICATION
|
||
|
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;
|
||
|
// CTW - MODIFICATION
|
||
|
// Shifted the entire menu input results up one.
|
||
|
/* case 1:
|
||
|
if(movesperpacket == 4 || numplayers > 1)
|
||
|
break;
|
||
|
|
||
|
tenBnSetExitRtn(dummyfunc);
|
||
|
setDebugMsgRoutine(dummymess);
|
||
|
tenerr = tenBnStart();
|
||
|
|
||
|
switch(tenerr)
|
||
|
{
|
||
|
case eTenBnNotInWindows:
|
||
|
cmenu(20001);
|
||
|
break;
|
||
|
case eTenBnBadGameIni:
|
||
|
cmenu(20002);
|
||
|
break;
|
||
|
case eTenBnBadTenIni:
|
||
|
cmenu(20003);
|
||
|
break;
|
||
|
case eTenBnBrowseCancel:
|
||
|
cmenu(20004);
|
||
|
break;
|
||
|
case eTenBnBadTenInst:
|
||
|
cmenu(20005);
|
||
|
break;
|
||
|
default:
|
||
|
playonten = 1;
|
||
|
gameexit(" ");
|
||
|
break;
|
||
|
}
|
||
|
break;*/
|
||
|
case 1: cmenu(200);break;
|
||
|
case 2:
|
||
|
if(movesperpacket == 4 && connecthead != myconnectindex)
|
||
|
break;
|
||
|
cmenu(300);
|
||
|
break;
|
||
|
case 3: KB_FlushKeyboardQueue();cmenu(400);break;
|
||
|
case 4: cmenu(990);break;
|
||
|
#if NET_MENU
|
||
|
case 5: cmenu(30000);break;
|
||
|
case 6: cmenu(500);break;
|
||
|
#else
|
||
|
case 5: cmenu(500);break;
|
||
|
#endif
|
||
|
|
||
|
// CTW END - MODIFICATION
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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-3,SHX(-2),PHX(-2),"NEW GAME");
|
||
|
else
|
||
|
menutext(c,67-3,SHX(-2),1,"NEW GAME");
|
||
|
}
|
||
|
else
|
||
|
menutext(c,67-3,SHX(-2),PHX(-2),"NEW GAME");
|
||
|
|
||
|
// CTW - REMOVED
|
||
|
/* if(movesperpacket != 4 && numplayers < 2)
|
||
|
menutext(c,67-3+16,SHX(-3),PHX(-3),"PLAY ON TEN");
|
||
|
else
|
||
|
menutext(c,67-3+16,SHX(-3),1,"PLAY ON TEN");*/
|
||
|
// CTW END - REMOVED
|
||
|
|
||
|
// CTW - MODIFICATION - Not going to comment out the exact old code here.
|
||
|
// I shifted up every menu option by 16.
|
||
|
// I shifted up every menu result by 1.
|
||
|
menutext(c,67-3+16,SHX(-3),PHX(-3),"OPTIONS");
|
||
|
|
||
|
if(movesperpacket == 4 && connecthead != myconnectindex)
|
||
|
menutext(c,67-3+16+16,SHX(-4),1,"LOAD GAME");
|
||
|
else menutext(c,67-3+16+16,SHX(-4),PHX(-4),"LOAD GAME");
|
||
|
|
||
|
#ifndef VOLUMEALL
|
||
|
menutext(c,67-3+16+16+16,SHX(-5),PHX(-5),"HOW TO ORDER");
|
||
|
#else
|
||
|
menutext(c,67-3+16+16+16,SHX(-5),PHX(-5),"HELP");
|
||
|
#endif
|
||
|
menutext(c,67-3+16+16+16+16,SHX(-6),PHX(-6),"CREDITS");
|
||
|
|
||
|
#if NET_MENU
|
||
|
menutext(c,67-3+16+16+16+16+16,SHX(-7),PHX(-7),"NETWORK GAME");
|
||
|
menutext(c,67-3+16+16+16+16+16+16,SHX(-8),PHX(-8),"QUIT");
|
||
|
#else
|
||
|
menutext(c,67-3+16+16+16+16+16,SHX(-7),PHX(-7),"QUIT");
|
||
|
#endif
|
||
|
|
||
|
break;
|
||
|
// CTW END - MODIFICATION
|
||
|
|
||
|
case 50:
|
||
|
c = (320>>1);
|
||
|
rotatesprite(c<<16,32<<16,65536L,0,INGAMEDUKETHREEDEE,0,0,10,0,0,xdim-1,ydim-1);
|
||
|
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(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");
|
||
|
#ifndef 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");
|
||
|
#endif
|
||
|
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");
|
||
|
#ifdef PLUTOPAK
|
||
|
if(boardfilename[0])
|
||
|
x = probe(160,60,20,5);
|
||
|
else x = probe(160,60,20,4);
|
||
|
#else
|
||
|
if(boardfilename[0])
|
||
|
x = probe(160,60,20,4);
|
||
|
else x = probe(160,60,20,3);
|
||
|
#endif
|
||
|
if(x >= 0)
|
||
|
{
|
||
|
#ifdef VOLUMEONE
|
||
|
if(x > 0)
|
||
|
cmenu(20000);
|
||
|
else
|
||
|
{
|
||
|
ud.m_volume_number = x;
|
||
|
ud.m_level_number = 0;
|
||
|
cmenu(110);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#ifndef VOLUMEONE
|
||
|
#ifndef PLUTOPAK
|
||
|
|
||
|
if(x == 3 && boardfilename[0])
|
||
|
{
|
||
|
ud.m_volume_number = 0;
|
||
|
ud.m_level_number = 7;
|
||
|
}
|
||
|
#else
|
||
|
if(x == 4 && boardfilename[0])
|
||
|
{
|
||
|
ud.m_volume_number = 0;
|
||
|
ud.m_level_number = 7;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
else
|
||
|
{
|
||
|
ud.m_volume_number = x;
|
||
|
ud.m_level_number = 0;
|
||
|
}
|
||
|
cmenu(110);
|
||
|
#endif
|
||
|
}
|
||
|
else if(x == -1)
|
||
|
{
|
||
|
if(ps[myconnectindex].gm&MODE_GAME) cmenu(50);
|
||
|
else cmenu(0);
|
||
|
}
|
||
|
|
||
|
menutext(160,60,SHX(-2),PHX(-2),volume_names[0]);
|
||
|
|
||
|
c = 80;
|
||
|
#ifdef VOLUMEONE
|
||
|
menutext(160,60+20,SHX(-3),1,volume_names[1]);
|
||
|
menutext(160,60+20+20,SHX(-4),1,volume_names[2]);
|
||
|
#ifdef PLUTOPAK
|
||
|
menutext(160,60+20+20,SHX(-5),1,volume_names[3]);
|
||
|
#endif
|
||
|
#else
|
||
|
menutext(160,60+20,SHX(-3),PHX(-3),volume_names[1]);
|
||
|
menutext(160,60+20+20,SHX(-4),PHX(-4),volume_names[2]);
|
||
|
#ifdef PLUTOPAK
|
||
|
menutext(160,60+20+20+20,SHX(-5),PHX(-5),volume_names[3]);
|
||
|
if(boardfilename[0])
|
||
|
{
|
||
|
|
||
|
menutext(160,60+20+20+20+20,SHX(-6),PHX(-6),"USER MAP");
|
||
|
gametextpal(160,60+20+20+20+20+3,boardfilename,16+(sintable[(totalclock<<4)&2047]>>11),2);
|
||
|
}
|
||
|
#else
|
||
|
if(boardfilename[0])
|
||
|
{
|
||
|
menutext(160,60+20+20+20,SHX(-6),PHX(-6),"USER MAP");
|
||
|
gametext(160,60+20+20+20+6,boardfilename,2,2+8+16);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
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);
|
||
|
enterlevel(MODE_GAME);
|
||
|
}
|
||
|
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,10<<16,65536L,0,MENUBAR,16,0,10,0,0,xdim-1,ydim-1);
|
||
|
menutext(320>>1,15,0,0,"OPTIONS");
|
||
|
|
||
|
c = (320>>1)-120;
|
||
|
|
||
|
onbar = (probey == 3 || probey == 4 || probey == 5);
|
||
|
count = 10;
|
||
|
#if CONTROLS_CONFIG_MENU
|
||
|
count++;
|
||
|
#endif
|
||
|
x = probe(c+6,31,15,count);
|
||
|
|
||
|
if(x == -1)
|
||
|
{ if(ps[myconnectindex].gm&MODE_GAME) cmenu(50);else cmenu(0); }
|
||
|
|
||
|
if(onbar == 0) switch(x)
|
||
|
{
|
||
|
case 0:
|
||
|
ud.detail = 1-ud.detail;
|
||
|
break;
|
||
|
case 1:
|
||
|
ud.shadows = 1-ud.shadows;
|
||
|
break;
|
||
|
case 2:
|
||
|
ud.screen_tilting = 1-ud.screen_tilting;
|
||
|
break;
|
||
|
case 6:
|
||
|
if ( ControllerType == controltype_keyboardandmouse )
|
||
|
ud.mouseflip = 1-ud.mouseflip;
|
||
|
break;
|
||
|
case 7:
|
||
|
cmenu(700);
|
||
|
break;
|
||
|
case 8:
|
||
|
#ifndef AUSTRALIA
|
||
|
cmenu(10000);
|
||
|
#endif
|
||
|
break;
|
||
|
case 9:
|
||
|
if( (ps[myconnectindex].gm&MODE_GAME) )
|
||
|
{
|
||
|
closedemowrite();
|
||
|
break;
|
||
|
}
|
||
|
ud.m_recstat = !ud.m_recstat;
|
||
|
break;
|
||
|
#if CONTROLS_CONFIG_MENU
|
||
|
case 10:
|
||
|
cmenu(MENU_CONTROLS);
|
||
|
break;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
if(ud.detail) menutext(c+160+40,31,0,0,"HIGH");
|
||
|
else menutext(c+160+40,31,0,0,"LOW");
|
||
|
|
||
|
if(ud.shadows) menutext(c+160+40,31+15,0,0,"ON");
|
||
|
else menutext(c+160+40,31+15,0,0,"OFF");
|
||
|
|
||
|
switch(ud.screen_tilting)
|
||
|
{
|
||
|
case 0: menutext(c+160+40,31+15+15,0,0,"OFF");break;
|
||
|
case 1: menutext(c+160+40,31+15+15,0,0,"ON");break;
|
||
|
case 2: menutext(c+160+40,31+15+15,0,0,"FULL");break;
|
||
|
}
|
||
|
|
||
|
menutext(c,31,SHX(-2),PHX(-2),"DETAIL");
|
||
|
menutext(c,31+15,SHX(-3),PHX(-3),"SHADOWS");
|
||
|
menutext(c,31+15+15,SHX(-4),PHX(-4),"SCREEN TILTING");
|
||
|
menutext(c,31+15+15+15,SHX(-5),PHX(-5),"SCREEN SIZE");
|
||
|
shorttmp = (short) ud.screen_size;
|
||
|
bar(c+167+40,31+15+15+15,(short *)&shorttmp,-4,x==3,SHX(-5),PHX(-5));
|
||
|
ud.screen_size = (int32) shorttmp;
|
||
|
|
||
|
menutext(c,31+15+15+15+15,SHX(-6),PHX(-6),"BRIGHTNESS");
|
||
|
shorttmp = (short) ud.brightness;
|
||
|
bar(c+167+40,31+15+15+15+15,(short *)&shorttmp,8,x==4,SHX(-6),PHX(-6));
|
||
|
ud.brightness = (int32) shorttmp;
|
||
|
if(x==4) setbrightness(ud.brightness>>2,&ps[myconnectindex].palette[0]);
|
||
|
|
||
|
if ( ControllerType == controltype_keyboardandmouse )
|
||
|
{
|
||
|
short sense;
|
||
|
sense = CONTROL_GetMouseSensitivity()>>10;
|
||
|
|
||
|
menutext(c,31+15+15+15+15+15,SHX(-7),PHX(-7),"MOUSE SENSITIVITY");
|
||
|
bar(c+167+40,31+15+15+15+15+15,&sense,4,x==5,SHX(-7),PHX(-7));
|
||
|
CONTROL_SetMouseSensitivity( sense<<10 );
|
||
|
menutext(c,31+15+15+15+15+15+15,SHX(-7),PHX(-7),"MOUSE AIMING FLIP");
|
||
|
|
||
|
if(ud.mouseflip) menutext(c+160+40,31+15+15+15+15+15+15,SHX(-7),PHX(-7),"ON");
|
||
|
else menutext(c+160+40,31+15+15+15+15+15+15,SHX(-7),PHX(-7),"OFF");
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
short sense;
|
||
|
sense = CONTROL_GetMouseSensitivity()>>10;
|
||
|
|
||
|
menutext(c,31+15+15+15+15+15,SHX(-7),1,"MOUSE SENSITIVITY");
|
||
|
bar(c+167+40,31+15+15+15+15+15,&sense,4,x==99,SHX(-7),1);
|
||
|
menutext(c,31+15+15+15+15+15+15,SHX(-7),1,"MOUSE AIMING FLIP");
|
||
|
|
||
|
if(ud.mouseflip) menutext(c+160+40,31+15+15+15+15+15+15,SHX(-7),1,"ON");
|
||
|
else menutext(c+160+40,31+15+15+15+15+15+15,SHX(-7),1,"OFF");
|
||
|
}
|
||
|
|
||
|
menutext(c,31+15+15+15+15+15+15+15,SHX(-8),PHX(-8),"SOUNDS");
|
||
|
#ifndef AUSTRALIA
|
||
|
menutext(c,31+15+15+15+15+15+15+15+15,SHX(-9),PHX(-9),"PARENTAL LOCK");
|
||
|
#else
|
||
|
menutext(c,31+15+15+15+15+15+15+15+15,SHX(-9),1,"PARENTAL LOCK");
|
||
|
#endif
|
||
|
if( (ps[myconnectindex].gm&MODE_GAME) && ud.m_recstat != 1 )
|
||
|
{
|
||
|
menutext(c,31+15+15+15+15+15+15+15+15+15,SHX(-10),1,"RECORD");
|
||
|
menutext(c+160+40,31+15+15+15+15+15+15+15+15+15,SHX(-10),1,"OFF");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
menutext(c,31+15+15+15+15+15+15+15+15+15,SHX(-10),PHX(-10),"RECORD");
|
||
|
|
||
|
if(ud.m_recstat == 1)
|
||
|
menutext(c+160+40,31+15+15+15+15+15+15+15+15+15,SHX(-10),PHX(-10),"ON");
|
||
|
else menutext(c+160+40,31+15+15+15+15+15+15+15+15+15,SHX(-10),PHX(-10),"OFF");
|
||
|
}
|
||
|
|
||
|
#if CONTROLS_CONFIG_MENU
|
||
|
menutext(c,31+15+15+15+15+15+15+15+15+15+15,SHX(-11),PHX(-11),"CONTROLS...");
|
||
|
#endif
|
||
|
break;
|
||
|
|
||
|
case 700:
|
||
|
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,"SOUNDS");
|
||
|
onbar = ( probey == 2 || probey == 3 );
|
||
|
|
||
|
x = probe(c,50,16,7);
|
||
|
switch(x)
|
||
|
{
|
||
|
case -1:
|
||
|
if(ps[myconnectindex].gm&MODE_GAME)
|
||
|
{
|
||
|
ps[myconnectindex].gm &= ~MODE_MENU;
|
||
|
if(ud.multimode < 2 && ud.recstat != 2)
|
||
|
{
|
||
|
ready2send = 1;
|
||
|
totalclock = ototalclock;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
else cmenu(200);
|
||
|
break;
|
||
|
case 0:
|
||
|
if (FXDevice != NumSoundCards)
|
||
|
{
|
||
|
SoundToggle = 1-SoundToggle;
|
||
|
if( SoundToggle == 0 )
|
||
|
{
|
||
|
FX_StopAllSounds();
|
||
|
clearsoundlocks();
|
||
|
}
|
||
|
onbar = 0;
|
||
|
}
|
||
|
break;
|
||
|
case 1:
|
||
|
|
||
|
if(eightytwofifty == 0 || numplayers < 2)
|
||
|
if(MusicDevice != NumSoundCards)
|
||
|
{
|
||
|
MusicToggle = 1-MusicToggle;
|
||
|
if( MusicToggle == 0 ) MUSIC_Pause();
|
||
|
else
|
||
|
{
|
||
|
if(ud.recstat != 2 && ps[myconnectindex].gm&MODE_GAME)
|
||
|
playmusic(&music_fn[0][(int)music_select][0]);
|
||
|
else playmusic(&env_music_fn[0][0]);
|
||
|
|
||
|
MUSIC_Continue();
|
||
|
}
|
||
|
}
|
||
|
onbar = 0;
|
||
|
|
||
|
break;
|
||
|
case 4:
|
||
|
if(SoundToggle && (FXDevice != NumSoundCards)) VoiceToggle = 1-VoiceToggle;
|
||
|
onbar = 0;
|
||
|
break;
|
||
|
case 5:
|
||
|
if(SoundToggle && (FXDevice != NumSoundCards)) AmbienceToggle = 1-AmbienceToggle;
|
||
|
onbar = 0;
|
||
|
break;
|
||
|
case 6:
|
||
|
if(SoundToggle && (FXDevice != NumSoundCards))
|
||
|
{
|
||
|
ReverseStereo = 1-ReverseStereo;
|
||
|
FX_SetReverseStereo(ReverseStereo);
|
||
|
}
|
||
|
onbar = 0;
|
||
|
break;
|
||
|
default:
|
||
|
onbar = 1;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(SoundToggle && FXDevice != NumSoundCards) menutext(c+160+40,50,0,(FXDevice == NumSoundCards),"ON");
|
||
|
else menutext(c+160+40,50,0,(FXDevice == NumSoundCards),"OFF");
|
||
|
|
||
|
if(MusicToggle && (MusicDevice != NumSoundCards) && (!eightytwofifty||numplayers<2))
|
||
|
menutext(c+160+40,50+16,0,(MusicDevice == NumSoundCards),"ON");
|
||
|
else menutext(c+160+40,50+16,0,(MusicDevice == NumSoundCards),"OFF");
|
||
|
|
||
|
menutext(c,50,SHX(-2),(FXDevice == NumSoundCards),"SOUND");
|
||
|
menutext(c,50+16+16,SHX(-4),(FXDevice==NumSoundCards)||SoundToggle==0,"SOUND VOLUME");
|
||
|
{
|
||
|
l = FXVolume;
|
||
|
FXVolume >>= 2;
|
||
|
shorttmp = (short) FXVolume;
|
||
|
bar(c+167+40,50+16+16,(short *)&shorttmp,4,(FXDevice!=NumSoundCards)&&x==2,SHX(-4),SoundToggle==0||(FXDevice==NumSoundCards));
|
||
|
FXVolume = (int32) shorttmp;
|
||
|
if(l != FXVolume)
|
||
|
FXVolume <<= 2;
|
||
|
if(l != FXVolume)
|
||
|
FX_SetVolume( (short) FXVolume );
|
||
|
}
|
||
|
menutext(c,50+16,SHX(-3),(MusicDevice==NumSoundCards),"MUSIC");
|
||
|
menutext(c,50+16+16+16,SHX(-5),(MusicDevice==NumSoundCards)||(numplayers > 1 && eightytwofifty)||MusicToggle==0,"MUSIC VOLUME");
|
||
|
{
|
||
|
l = MusicVolume;
|
||
|
MusicVolume >>= 2;
|
||
|
shorttmp = (short) MusicVolume;
|
||
|
bar(c+167+40,50+16+16+16,
|
||
|
&shorttmp,4,
|
||
|
(eightytwofifty==0||numplayers < 2) && (MusicDevice!=NumSoundCards) && x==3,SHX(-5),
|
||
|
(numplayers > 1 && eightytwofifty)||MusicToggle==0||(MusicDevice==NumSoundCards));
|
||
|
MusicVolume = (int32) shorttmp;
|
||
|
MusicVolume <<= 2;
|
||
|
if(l != MusicVolume)
|
||
|
{
|
||
|
STUBBED("Check this");
|
||
|
// !!! FIXME: Used to be Music_ not MUSIC_. --ryan.
|
||
|
MUSIC_SetVolume( (short) MusicVolume );
|
||
|
}
|
||
|
}
|
||
|
menutext(c,50+16+16+16+16,SHX(-6),(FXDevice==NumSoundCards)||SoundToggle==0,"DUKE TALK");
|
||
|
menutext(c,50+16+16+16+16+16,SHX(-7),(FXDevice==NumSoundCards)||SoundToggle==0,"AMBIENCE");
|
||
|
|
||
|
menutext(c,50+16+16+16+16+16+16,SHX(-8),(FXDevice==NumSoundCards)||SoundToggle==0,"FLIP STEREO");
|
||
|
|
||
|
if(VoiceToggle) menutext(c+160+40,50+16+16+16+16,0,(FXDevice==NumSoundCards)||SoundToggle==0,"ON");
|
||
|
else menutext(c+160+40,50+16+16+16+16,0,(FXDevice==NumSoundCards)||SoundToggle==0,"OFF");
|
||
|
|
||
|
if(AmbienceToggle) menutext(c+160+40,50+16+16+16+16+16,0,(FXDevice==NumSoundCards)||SoundToggle==0,"ON");
|
||
|
else menutext(c+160+40,50+16+16+16+16+16,0,(FXDevice==NumSoundCards)||SoundToggle==0,"OFF");
|
||
|
|
||
|
if(ReverseStereo) menutext(c+160+40,50+16+16+16+16+16+16,0,(FXDevice==NumSoundCards)||SoundToggle==0,"ON");
|
||
|
else menutext(c+160+40,50+16+16+16+16+16+16,0,(FXDevice==NumSoundCards)||SoundToggle==0,"OFF");
|
||
|
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 350:
|
||
|
cmenu(351);
|
||
|
screencapt = 1;
|
||
|
displayrooms(myconnectindex,65536);
|
||
|
savetemp("duke3d.tmp",waloff[MAXTILES-1],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,158,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,170,tempbuf,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,512,MAXTILES-1,-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,&volnum,&levnum,&plrskl,&numplr);
|
||
|
lastprobey = probey;
|
||
|
}
|
||
|
|
||
|
rotatesprite(101<<16,97<<16,65536L,512,MAXTILES-3,-32,0,4+10+64,0,0,xdim-1,ydim-1);
|
||
|
sprintf(tempbuf,"PLAYERS: %-2ld ",numplr);
|
||
|
gametext(160,158,tempbuf,0,2+8+16);
|
||
|
sprintf(tempbuf,"EPISODE: %-2ld / LEVEL: %-2ld / SKILL: %-2ld",1+volnum,1+levnum,plrskl);
|
||
|
gametext(160,170,tempbuf,0,2+8+16);
|
||
|
}
|
||
|
else menutext(69,70,0,0,"EMPTY");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if( ud.savegame[probey][0] )
|
||
|
{
|
||
|
if(lastprobey != probey)
|
||
|
loadpheader(probey,&volnum,&levnum,&plrskl,&numplr);
|
||
|
lastprobey = probey;
|
||
|
rotatesprite(101<<16,97<<16,65536L,512,MAXTILES-3,-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,158,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,170,tempbuf,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;
|
||
|
|
||
|
#ifndef VOLUMEALL
|
||
|
case 400:
|
||
|
case 401:
|
||
|
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);
|
||
|
|
||
|
#else
|
||
|
case 400:
|
||
|
case 401:
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
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");
|
||
|
sortfilenames();
|
||
|
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);
|
||
|
|
||
|
newgame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill+1);
|
||
|
enterlevel(MODE_GAME);
|
||
|
}
|
||
|
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 == 3) ud.m_coop = 0;
|
||
|
break;
|
||
|
case 1:
|
||
|
#ifndef VOLUMEONE
|
||
|
ud.m_volume_number++;
|
||
|
#ifdef PLUTOPAK
|
||
|
if(ud.m_volume_number > 3) ud.m_volume_number = 0;
|
||
|
#else
|
||
|
if(ud.m_volume_number > 2) ud.m_volume_number = 0;
|
||
|
#endif
|
||
|
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;
|
||
|
#endif
|
||
|
break;
|
||
|
case 2:
|
||
|
#ifndef ONELEVELDEMO
|
||
|
ud.m_level_number++;
|
||
|
#ifndef 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;
|
||
|
#endif
|
||
|
if(ud.m_level_number > 10) ud.m_level_number = 0;
|
||
|
#endif
|
||
|
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:
|
||
|
#ifdef 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(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;
|
||
|
tempbuf[10] = ud.m_ffire;
|
||
|
|
||
|
for(c=connecthead;c>=0;c=connectpoint2[c])
|
||
|
{
|
||
|
resetweapons(c);
|
||
|
resetinventory(c);
|
||
|
|
||
|
if(c != myconnectindex)
|
||
|
sendpacket(c,tempbuf,11);
|
||
|
}
|
||
|
|
||
|
newgame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill+1);
|
||
|
enterlevel(MODE_GAME);
|
||
|
|
||
|
return;
|
||
|
#endif
|
||
|
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(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;
|
||
|
tempbuf[10] = ud.m_ffire;
|
||
|
|
||
|
for(c=connecthead;c>=0;c=connectpoint2[c])
|
||
|
{
|
||
|
resetweapons(c);
|
||
|
resetinventory(c);
|
||
|
|
||
|
if(c != myconnectindex)
|
||
|
sendpacket(c,tempbuf,11);
|
||
|
}
|
||
|
|
||
|
newgame(ud.m_volume_number,ud.m_level_number,ud.m_player_skill+1);
|
||
|
enterlevel(MODE_GAME);
|
||
|
|
||
|
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);
|
||
|
|
||
|
#ifdef 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);
|
||
|
#endif
|
||
|
|
||
|
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");
|
||
|
|
||
|
#ifdef 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);
|
||
|
#endif
|
||
|
|
||
|
#ifndef ONELEVELDEMO
|
||
|
sprintf(tempbuf,"LEVEL %ld",ud.m_level_number+1);
|
||
|
menutext(c,57+16+16-9,SHX(-4),PHX(-4),tempbuf);
|
||
|
#else
|
||
|
sprintf(tempbuf,"LEVEL %ld",ud.m_level_number+1);
|
||
|
menutext(c,57+16+16-9,SHX(-4),1,tempbuf);
|
||
|
#endif
|
||
|
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");
|
||
|
|
||
|
#ifdef 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");
|
||
|
#endif
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void palto(char r,char g,char b,long e)
|
||
|
{
|
||
|
int i;
|
||
|
char temparray[768];
|
||
|
|
||
|
for(i=0;i<768;i+=3)
|
||
|
{
|
||
|
temparray[i ] =
|
||
|
ps[myconnectindex].palette[i+0]+((((long)r-(long)ps[myconnectindex].palette[i+0])*(long)(e&127))>>6);
|
||
|
temparray[i+1] =
|
||
|
ps[myconnectindex].palette[i+1]+((((long)g-(long)ps[myconnectindex].palette[i+1])*(long)(e&127))>>6);
|
||
|
temparray[i+2] =
|
||
|
ps[myconnectindex].palette[i+2]+((((long)b-(long)ps[myconnectindex].palette[i+2])*(long)(e&127))>>6);
|
||
|
}
|
||
|
|
||
|
// CTW - MODIFICATION
|
||
|
/* if( (e&128) == 0 )
|
||
|
if ((vidoption != 1) || (vgacompatible == 1)) limitrate();*/
|
||
|
if( (e&128) == 0 )
|
||
|
if ((ScreenMode != 1) || (vgacompatible == 1)) limitrate();
|
||
|
// CTW END - MODIFICATION
|
||
|
|
||
|
setbrightness(ud.brightness>>2,temparray);
|
||
|
}
|
||
|
|
||
|
|
||
|
void drawoverheadmap(long cposx, long cposy, long czoom, short cang)
|
||
|
{
|
||
|
long i=0l, j=0l, k=0l, l=0l, x1=0l, y1=0l, x2=0l, y2=0l, x3=0l;
|
||
|
long y3=0l, x4=0l, y4=0l, ox=0l, oy=0l, xoff=0l, yoff=0l;
|
||
|
long dax=0l, day=0l, cosang=0l, sinang=0l, xspan=0l, yspan=0l, sprx=0l, spry=0l;
|
||
|
long xrepeat=0l, yrepeat=0l, z1=0l, z2=0l, startwall=0l, endwall=0l, tilenum=0l, daang=0l;
|
||
|
long xvect=0l, yvect=0l, xvect2=0l, yvect2=0l;
|
||
|
short p=0l;
|
||
|
char col;
|
||
|
walltype *wal, *wal2;
|
||
|
spritetype *spr;
|
||
|
|
||
|
xvect = sintable[(-cang)&2047] * czoom;
|
||
|
yvect = sintable[(1536-cang)&2047] * czoom;
|
||
|
xvect2 = mulscale16(xvect,yxaspect);
|
||
|
yvect2 = mulscale16(yvect,yxaspect);
|
||
|
|
||
|
//Draw red lines
|
||
|
for(i=0;i<numsectors;i++)
|
||
|
{
|
||
|
if (!(show2dsector[i>>3]&(1<<(i&7)))) continue;
|
||
|
|
||
|
startwall = sector[i].wallptr;
|
||
|
endwall = sector[i].wallptr + sector[i].wallnum;
|
||
|
|
||
|
z1 = sector[i].ceilingz; z2 = sector[i].floorz;
|
||
|
|
||
|
for(j=startwall,wal=&wall[startwall];j<endwall;j++,wal++)
|
||
|
{
|
||
|
k = wal->nextwall; if (k < 0) continue;
|
||
|
|
||
|
//if ((show2dwall[j>>3]&(1<<(j&7))) == 0) continue;
|
||
|
//if ((k > j) && ((show2dwall[k>>3]&(1<<(k&7))) > 0)) continue;
|
||
|
|
||
|
if (sector[wal->nextsector].ceilingz == z1)
|
||
|
if (sector[wal->nextsector].floorz == z2)
|
||
|
if (((wal->cstat|wall[wal->nextwall].cstat)&(16+32)) == 0) continue;
|
||
|
|
||
|
col = 139; //red
|
||
|
if ((wal->cstat|wall[wal->nextwall].cstat)&1) col = 234; //magenta
|
||
|
|
||
|
if (!(show2dsector[wal->nextsector>>3]&(1<<(wal->nextsector&7))))
|
||
|
col = 24;
|
||
|
else continue;
|
||
|
|
||
|
ox = wal->x-cposx; oy = wal->y-cposy;
|
||
|
x1 = dmulscale16(ox,xvect,-oy,yvect)+(xdim<<11);
|
||
|
y1 = dmulscale16(oy,xvect2,ox,yvect2)+(ydim<<11);
|
||
|
|
||
|
wal2 = &wall[wal->point2];
|
||
|
ox = wal2->x-cposx; oy = wal2->y-cposy;
|
||
|
x2 = dmulscale16(ox,xvect,-oy,yvect)+(xdim<<11);
|
||
|
y2 = dmulscale16(oy,xvect2,ox,yvect2)+(ydim<<11);
|
||
|
|
||
|
drawline256(x1,y1,x2,y2,col);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Draw sprites
|
||
|
k = ps[screenpeek].i;
|
||
|
for(i=0;i<numsectors;i++)
|
||
|
{
|
||
|
if (!(show2dsector[i>>3]&(1<<(i&7)))) continue;
|
||
|
for(j=headspritesect[i];j>=0;j=nextspritesect[j])
|
||
|
//if ((show2dsprite[j>>3]&(1<<(j&7))) > 0)
|
||
|
{
|
||
|
spr = &sprite[j];
|
||
|
|
||
|
if (j == k || (spr->cstat&0x8000) || spr->cstat == 257 || spr->xrepeat == 0) continue;
|
||
|
|
||
|
col = 71; //cyan
|
||
|
if (spr->cstat&1) col = 234; //magenta
|
||
|
|
||
|
sprx = spr->x;
|
||
|
spry = spr->y;
|
||
|
|
||
|
if( (spr->cstat&257) != 0) switch (spr->cstat&48)
|
||
|
{
|
||
|
case 0: break;
|
||
|
|
||
|
ox = sprx-cposx; oy = spry-cposy;
|
||
|
x1 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y1 = dmulscale16(oy,xvect2,ox,yvect2);
|
||
|
|
||
|
ox = (sintable[(spr->ang+512)&2047]>>7);
|
||
|
oy = (sintable[(spr->ang)&2047]>>7);
|
||
|
x2 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y2 = dmulscale16(oy,xvect,ox,yvect);
|
||
|
|
||
|
x3 = mulscale16(x2,yxaspect);
|
||
|
y3 = mulscale16(y2,yxaspect);
|
||
|
|
||
|
drawline256(x1-x2+(xdim<<11),y1-y3+(ydim<<11),
|
||
|
x1+x2+(xdim<<11),y1+y3+(ydim<<11),col);
|
||
|
drawline256(x1-y2+(xdim<<11),y1+x3+(ydim<<11),
|
||
|
x1+x2+(xdim<<11),y1+y3+(ydim<<11),col);
|
||
|
drawline256(x1+y2+(xdim<<11),y1-x3+(ydim<<11),
|
||
|
x1+x2+(xdim<<11),y1+y3+(ydim<<11),col);
|
||
|
break;
|
||
|
|
||
|
case 16:
|
||
|
if( spr->picnum == LASERLINE )
|
||
|
{
|
||
|
x1 = sprx; y1 = spry;
|
||
|
tilenum = spr->picnum;
|
||
|
xoff = (long)((signed char)((picanm[tilenum]>>8)&255))+((long)spr->xoffset);
|
||
|
if ((spr->cstat&4) > 0) xoff = -xoff;
|
||
|
k = spr->ang; l = spr->xrepeat;
|
||
|
dax = sintable[k&2047]*l; day = sintable[(k+1536)&2047]*l;
|
||
|
l = tilesizx[tilenum]; k = (l>>1)+xoff;
|
||
|
x1 -= mulscale16(dax,k); x2 = x1+mulscale16(dax,l);
|
||
|
y1 -= mulscale16(day,k); y2 = y1+mulscale16(day,l);
|
||
|
|
||
|
ox = x1-cposx; oy = y1-cposy;
|
||
|
x1 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y1 = dmulscale16(oy,xvect2,ox,yvect2);
|
||
|
|
||
|
ox = x2-cposx; oy = y2-cposy;
|
||
|
x2 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y2 = dmulscale16(oy,xvect2,ox,yvect2);
|
||
|
|
||
|
drawline256(x1+(xdim<<11),y1+(ydim<<11),
|
||
|
x2+(xdim<<11),y2+(ydim<<11),col);
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case 32:
|
||
|
|
||
|
tilenum = spr->picnum;
|
||
|
xoff = (long)((signed char)((picanm[tilenum]>>8)&255))+((long)spr->xoffset);
|
||
|
yoff = (long)((signed char)((picanm[tilenum]>>16)&255))+((long)spr->yoffset);
|
||
|
if ((spr->cstat&4) > 0) xoff = -xoff;
|
||
|
if ((spr->cstat&8) > 0) yoff = -yoff;
|
||
|
|
||
|
k = spr->ang;
|
||
|
cosang = sintable[(k+512)&2047]; sinang = sintable[k];
|
||
|
xspan = tilesizx[tilenum]; xrepeat = spr->xrepeat;
|
||
|
yspan = tilesizy[tilenum]; yrepeat = spr->yrepeat;
|
||
|
|
||
|
dax = ((xspan>>1)+xoff)*xrepeat; day = ((yspan>>1)+yoff)*yrepeat;
|
||
|
x1 = sprx + dmulscale16(sinang,dax,cosang,day);
|
||
|
y1 = spry + dmulscale16(sinang,day,-cosang,dax);
|
||
|
l = xspan*xrepeat;
|
||
|
x2 = x1 - mulscale16(sinang,l);
|
||
|
y2 = y1 + mulscale16(cosang,l);
|
||
|
l = yspan*yrepeat;
|
||
|
k = -mulscale16(cosang,l); x3 = x2+k; x4 = x1+k;
|
||
|
k = -mulscale16(sinang,l); y3 = y2+k; y4 = y1+k;
|
||
|
|
||
|
ox = x1-cposx; oy = y1-cposy;
|
||
|
x1 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y1 = dmulscale16(oy,xvect2,ox,yvect2);
|
||
|
|
||
|
ox = x2-cposx; oy = y2-cposy;
|
||
|
x2 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y2 = dmulscale16(oy,xvect2,ox,yvect2);
|
||
|
|
||
|
ox = x3-cposx; oy = y3-cposy;
|
||
|
x3 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y3 = dmulscale16(oy,xvect2,ox,yvect2);
|
||
|
|
||
|
ox = x4-cposx; oy = y4-cposy;
|
||
|
x4 = dmulscale16(ox,xvect,-oy,yvect);
|
||
|
y4 = dmulscale16(oy,xvect2,ox,yvect2);
|
||
|
|
||
|
drawline256(x1+(xdim<<11),y1+(ydim<<11),
|
||
|
x2+(xdim<<11),y2+(ydim<<11),col);
|
||
|
|
||
|
drawline256(x2+(xdim<<11),y2+(ydim<<11),
|
||
|
x3+(xdim<<11),y3+(ydim<<11),col);
|
||
|
|
||
|
drawline256(x3+(xdim<<11),y3+(ydim<<11),
|
||
|
x4+(xdim<<11),y4+(ydim<<11),col);
|
||
|
|
||
|
drawline256(x4+(xdim<<11),y4+(ydim<<11),
|
||
|
x1+(xdim<<11),y1+(ydim<<11),col);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Draw white lines
|
||
|
for(i=0;i<numsectors;i++)
|
||
|
{
|
||
|
if (!(show2dsector[i>>3]&(1<<(i&7)))) continue;
|
||
|
|
||
|
startwall = sector[i].wallptr;
|
||
|
endwall = sector[i].wallptr + sector[i].wallnum;
|
||
|
|
||
|
k = -1;
|
||
|
for(j=startwall,wal=&wall[startwall];j<endwall;j++,wal++)
|
||
|
{
|
||
|
if (wal->nextwall >= 0) continue;
|
||
|
|
||
|
//if ((show2dwall[j>>3]&(1<<(j&7))) == 0) continue;
|
||
|
|
||
|
if (tilesizx[wal->picnum] == 0) continue;
|
||
|
if (tilesizy[wal->picnum] == 0) continue;
|
||
|
|
||
|
if (j == k)
|
||
|
{ x1 = x2; y1 = y2; }
|
||
|
else
|
||
|
{
|
||
|
ox = wal->x-cposx; oy = wal->y-cposy;
|
||
|
x1 = dmulscale16(ox,xvect,-oy,yvect)+(xdim<<11);
|
||
|
y1 = dmulscale16(oy,xvect2,ox,yvect2)+(ydim<<11);
|
||
|
}
|
||
|
|
||
|
k = wal->point2; wal2 = &wall[k];
|
||
|
ox = wal2->x-cposx; oy = wal2->y-cposy;
|
||
|
x2 = dmulscale16(ox,xvect,-oy,yvect)+(xdim<<11);
|
||
|
y2 = dmulscale16(oy,xvect2,ox,yvect2)+(ydim<<11);
|
||
|
|
||
|
drawline256(x1,y1,x2,y2,24);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for(p=connecthead;p >= 0;p=connectpoint2[p])
|
||
|
{
|
||
|
if(ud.scrollmode && p == screenpeek) continue;
|
||
|
|
||
|
ox = sprite[ps[p].i].x-cposx; oy = sprite[ps[p].i].y-cposy;
|
||
|
daang = (sprite[ps[p].i].ang-cang)&2047;
|
||
|
if (p == screenpeek) { ox = 0; oy = 0; daang = 0; }
|
||
|
x1 = mulscale(ox,xvect,16) - mulscale(oy,yvect,16);
|
||
|
y1 = mulscale(oy,xvect2,16) + mulscale(ox,yvect2,16);
|
||
|
|
||
|
if(p == screenpeek || ud.coop == 1 )
|
||
|
{
|
||
|
if(sprite[ps[p].i].xvel > 16 && ps[p].on_ground)
|
||
|
i = APLAYERTOP+((totalclock>>4)&3);
|
||
|
else
|
||
|
i = APLAYERTOP;
|
||
|
|
||
|
j = klabs(ps[p].truefz-ps[p].posz)>>8;
|
||
|
j = mulscale(czoom*(sprite[ps[p].i].yrepeat+j),yxaspect,16);
|
||
|
|
||
|
if(j < 22000) j = 22000;
|
||
|
else if(j > (65536<<1)) j = (65536<<1);
|
||
|
|
||
|
rotatesprite((x1<<4)+(xdim<<15),(y1<<4)+(ydim<<15),j,
|
||
|
daang,i,sprite[ps[p].i].shade,sprite[ps[p].i].pal,
|
||
|
(sprite[ps[p].i].cstat&2)>>1,windowx1,windowy1,windowx2,windowy2);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void endanimsounds(long fr)
|
||
|
{
|
||
|
switch(ud.volume_number)
|
||
|
{
|
||
|
case 0:break;
|
||
|
case 1:
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 1:
|
||
|
sound(WIND_AMBIENCE);
|
||
|
break;
|
||
|
case 26:
|
||
|
sound(ENDSEQVOL2SND1);
|
||
|
break;
|
||
|
case 36:
|
||
|
sound(ENDSEQVOL2SND2);
|
||
|
break;
|
||
|
case 54:
|
||
|
sound(THUD);
|
||
|
break;
|
||
|
case 62:
|
||
|
sound(ENDSEQVOL2SND3);
|
||
|
break;
|
||
|
case 75:
|
||
|
sound(ENDSEQVOL2SND4);
|
||
|
break;
|
||
|
case 81:
|
||
|
sound(ENDSEQVOL2SND5);
|
||
|
break;
|
||
|
case 115:
|
||
|
sound(ENDSEQVOL2SND6);
|
||
|
break;
|
||
|
case 124:
|
||
|
sound(ENDSEQVOL2SND7);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case 2:
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 1:
|
||
|
sound(WIND_REPEAT);
|
||
|
break;
|
||
|
case 98:
|
||
|
sound(DUKE_GRUNT);
|
||
|
break;
|
||
|
case 82+20:
|
||
|
sound(THUD);
|
||
|
sound(SQUISHED);
|
||
|
break;
|
||
|
case 104+20:
|
||
|
sound(ENDSEQVOL3SND3);
|
||
|
break;
|
||
|
case 114+20:
|
||
|
sound(ENDSEQVOL3SND2);
|
||
|
break;
|
||
|
case 158:
|
||
|
sound(PIPEBOMB_EXPLODE);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void logoanimsounds(long fr)
|
||
|
{
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 1:
|
||
|
sound(FLY_BY);
|
||
|
break;
|
||
|
case 19:
|
||
|
sound(PIPEBOMB_EXPLODE);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void intro4animsounds(long fr)
|
||
|
{
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 1:
|
||
|
sound(INTRO4_B);
|
||
|
break;
|
||
|
case 12:
|
||
|
case 34:
|
||
|
sound(SHORT_CIRCUIT);
|
||
|
break;
|
||
|
case 18:
|
||
|
sound(INTRO4_5);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void first4animsounds(long fr)
|
||
|
{
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 1:
|
||
|
sound(INTRO4_1);
|
||
|
break;
|
||
|
case 12:
|
||
|
sound(INTRO4_2);
|
||
|
break;
|
||
|
case 7:
|
||
|
sound(INTRO4_3);
|
||
|
break;
|
||
|
case 26:
|
||
|
sound(INTRO4_4);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void intro42animsounds(long fr)
|
||
|
{
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 10:
|
||
|
sound(INTRO4_6);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void endanimvol41(long fr)
|
||
|
{
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 3:
|
||
|
sound(DUKE_UNDERWATER);
|
||
|
break;
|
||
|
case 35:
|
||
|
sound(VOL4ENDSND1);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void endanimvol42(long fr)
|
||
|
{
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 11:
|
||
|
sound(DUKE_UNDERWATER);
|
||
|
break;
|
||
|
case 20:
|
||
|
sound(VOL4ENDSND1);
|
||
|
break;
|
||
|
case 39:
|
||
|
sound(VOL4ENDSND2);
|
||
|
break;
|
||
|
case 50:
|
||
|
FX_StopAllSounds();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void endanimvol43(long fr)
|
||
|
{
|
||
|
switch(fr)
|
||
|
{
|
||
|
case 1:
|
||
|
sound(BOSS4_DEADSPEECH);
|
||
|
break;
|
||
|
case 40:
|
||
|
sound(VOL4ENDSND1);
|
||
|
sound(DUKE_UNDERWATER);
|
||
|
break;
|
||
|
case 50:
|
||
|
sound(BIGBANG);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
long lastanimhack=0;
|
||
|
void playanm(char *fn,char t)
|
||
|
{
|
||
|
char *animbuf, *palptr;
|
||
|
long i, j, k, length=0, numframes=0;
|
||
|
int32 handle=-1;
|
||
|
|
||
|
// return;
|
||
|
|
||
|
if(t != 7 && t != 9 && t != 10 && t != 11)
|
||
|
KB_FlushKeyboardQueue();
|
||
|
|
||
|
if( KB_KeyWaiting() )
|
||
|
{
|
||
|
FX_StopAllSounds();
|
||
|
goto ENDOFANIMLOOP;
|
||
|
}
|
||
|
|
||
|
handle = kopen4load(fn,0);
|
||
|
if(handle == -1) return;
|
||
|
length = kfilelength(handle);
|
||
|
|
||
|
walock[MAXTILES-3-t] = 219+t;
|
||
|
|
||
|
if(anim == 0 || lastanimhack != (MAXTILES-3-t))
|
||
|
allocache((long *)&anim,length+sizeof(anim_t),&walock[MAXTILES-3-t]);
|
||
|
|
||
|
animbuf = (char *)(FP_OFF(anim)+sizeof(anim_t));
|
||
|
|
||
|
lastanimhack = (MAXTILES-3-t);
|
||
|
|
||
|
tilesizx[MAXTILES-3-t] = 200;
|
||
|
tilesizy[MAXTILES-3-t] = 320;
|
||
|
|
||
|
kread(handle,animbuf,length);
|
||
|
kclose(handle);
|
||
|
|
||
|
ANIM_LoadAnim (animbuf);
|
||
|
numframes = ANIM_NumFrames();
|
||
|
|
||
|
palptr = ANIM_GetPalette();
|
||
|
for(i=0;i<256;i++)
|
||
|
{
|
||
|
j = (i<<2); k = j-i;
|
||
|
tempbuf[j+0] = (palptr[k+2]>>2);
|
||
|
tempbuf[j+1] = (palptr[k+1]>>2);
|
||
|
tempbuf[j+2] = (palptr[k+0]>>2);
|
||
|
tempbuf[j+3] = 0;
|
||
|
}
|
||
|
|
||
|
VBE_setPalette(0L,256L,tempbuf);
|
||
|
|
||
|
ototalclock = totalclock + 10;
|
||
|
|
||
|
for(i=1;i<numframes;i++)
|
||
|
{
|
||
|
while(totalclock < ototalclock)
|
||
|
{
|
||
|
if( KB_KeyWaiting() )
|
||
|
goto ENDOFANIMLOOP;
|
||
|
getpackets();
|
||
|
}
|
||
|
|
||
|
if(t == 10) ototalclock += 14;
|
||
|
else if(t == 9) ototalclock += 10;
|
||
|
else if(t == 7) ototalclock += 18;
|
||
|
else if(t == 6) ototalclock += 14;
|
||
|
else if(t == 5) ototalclock += 9;
|
||
|
else if(ud.volume_number == 3) ototalclock += 10;
|
||
|
else if(ud.volume_number == 2) ototalclock += 10;
|
||
|
else if(ud.volume_number == 1) ototalclock += 18;
|
||
|
else ototalclock += 10;
|
||
|
|
||
|
waloff[MAXTILES-3-t] = FP_OFF(ANIM_DrawFrame(i));
|
||
|
rotatesprite(0<<16,0<<16,65536L,512,MAXTILES-3-t,0,0,2+4+8+16+64, 0,0,xdim-1,ydim-1);
|
||
|
nextpage();
|
||
|
|
||
|
if(t == 8) endanimvol41(i);
|
||
|
else if(t == 10) endanimvol42(i);
|
||
|
else if(t == 11) endanimvol43(i);
|
||
|
else if(t == 9) intro42animsounds(i);
|
||
|
else if(t == 7) intro4animsounds(i);
|
||
|
else if(t == 6) first4animsounds(i);
|
||
|
else if(t == 5) logoanimsounds(i);
|
||
|
else if(t < 4) endanimsounds(i);
|
||
|
}
|
||
|
|
||
|
ENDOFANIMLOOP:
|
||
|
|
||
|
ANIM_FreeAnim ();
|
||
|
walock[MAXTILES-3-t] = 1;
|
||
|
}
|
||
|
|