📄 game.c
字号:
{
switch(p->inven_icon)
{
case 1: i = FIRSTAID_ICON; break;
case 2: i = STEROIDS_ICON; break;
case 3: i = HOLODUKE_ICON; break;
case 4: i = JETPACK_ICON; break;
case 5: i = HEAT_ICON; break;
case 6: i = AIRTANK_ICON; break;
case 7: i = BOOT_ICON; break;
default: i = -1;
}
if (i >= 0) rotatesprite((231-o)<<16,(200-21)<<16,65536L,0,i,0,0,10+16+permbit,0,0,xdim-1,ydim-1);
minitext(292-30-o,190,"%",6,10+16+permbit);
j = 0x80000000;
switch(p->inven_icon)
{
case 1: i = p->firstaid_amount; break;
case 2: i = ((p->steroids_amount+3)>>2); break;
case 3: i = ((p->holoduke_amount+15)/24); j = p->holoduke_on; break;
case 4: i = ((p->jetpack_amount+15)>>4); j = p->jetpack_on; break;
case 5: i = p->heat_amount/12; j = p->heat_on; break;
case 6: i = ((p->scuba_amount+63)>>6); break;
case 7: i = (p->boot_amount>>1); break;
}
invennum(284-30-o,200-6,(char)i,0,10+permbit);
if (j > 0) minitext(288-30-o,180,"ON",0,10+16+permbit);
else if (j != 0x80000000) minitext(284-30-o,180,"OFF",2,10+16+permbit);
if (p->inven_icon >= 6) minitext(284-35-o,180,"AUTO",2,10+16+permbit);
}
return;
}
//DRAW/UPDATE FULL STATUS BAR:
if (pus) { pus = 0; u = 0xffffffff; } else u = 0;
if (sbar.frag[myconnectindex] != p->frag) { sbar.frag[myconnectindex] = p->frag; u |= 32768; }
if (sbar.got_access != p->got_access) { sbar.got_access = p->got_access; u |= 16384; }
if (sbar.last_extra != p->last_extra) { sbar.last_extra = p->last_extra; u |= 1; }
if (sbar.shield_amount != p->shield_amount) { sbar.shield_amount = p->shield_amount; u |= 2; }
if (sbar.curr_weapon != p->curr_weapon) { sbar.curr_weapon = p->curr_weapon; u |= (4+8+16+32+64+128+256+512+1024+65536L); }
for(i=1;i < 10;i++)
{
if (sbar.ammo_amount[i] != p->ammo_amount[i]) {
sbar.ammo_amount[i] = p->ammo_amount[i]; if(i < 9) u |= ((2<<i)+1024); else u |= 65536L+1024; }
if (sbar.gotweapon[i] != p->gotweapon[i]) { sbar.gotweapon[i] =
p->gotweapon[i]; if(i < 9 ) u |= ((2<<i)+1024); else u |= 65536L+1024; }
}
if (sbar.inven_icon != p->inven_icon) { sbar.inven_icon = p->inven_icon; u |= (2048+4096+8192); }
if (sbar.holoduke_on != p->holoduke_on) { sbar.holoduke_on = p->holoduke_on; u |= (4096+8192); }
if (sbar.jetpack_on != p->jetpack_on) { sbar.jetpack_on = p->jetpack_on; u |= (4096+8192); }
if (sbar.heat_on != p->heat_on) { sbar.heat_on = p->heat_on; u |= (4096+8192); }
if (sbar.firstaid_amount != p->firstaid_amount) { sbar.firstaid_amount = p->firstaid_amount; u |= 8192; }
if (sbar.steroids_amount != p->steroids_amount) { sbar.steroids_amount = p->steroids_amount; u |= 8192; }
if (sbar.holoduke_amount != p->holoduke_amount) { sbar.holoduke_amount = p->holoduke_amount; u |= 8192; }
if (sbar.jetpack_amount != p->jetpack_amount) { sbar.jetpack_amount = p->jetpack_amount; u |= 8192; }
if (sbar.heat_amount != p->heat_amount) { sbar.heat_amount = p->heat_amount; u |= 8192; }
if (sbar.scuba_amount != p->scuba_amount) { sbar.scuba_amount = p->scuba_amount; u |= 8192; }
if (sbar.boot_amount != p->boot_amount) { sbar.boot_amount = p->boot_amount; u |= 8192; }
if (u == 0) return;
//0 - update health
//1 - update armor
//2 - update PISTOL_WEAPON ammo
//3 - update SHOTGUN_WEAPON ammo
//4 - update CHAINGUN_WEAPON ammo
//5 - update RPG_WEAPON ammo
//6 - update HANDBOMB_WEAPON ammo
//7 - update SHRINKER_WEAPON ammo
//8 - update DEVISTATOR_WEAPON ammo
//9 - update TRIPBOMB_WEAPON ammo
//10 - update ammo display
//11 - update inventory icon
//12 - update inventory on/off
//13 - update inventory %
//14 - update keys
//15 - update kills
//16 - update FREEZE_WEAPON ammo
if (u == 0xffffffff)
{
patchstatusbar(0,0,320,200);
if (ud.multimode > 1 && ud.coop != 1)
rotatesprite(277<<16,(200-27)<<16,65536L,0,KILLSICON,0,0,10+16+128,0,0,xdim-1,ydim-1);
}
if (ud.multimode > 1 && ud.coop != 1)
{
if (u&32768)
{
if (u != 0xffffffff) patchstatusbar(276,183,299,193);
digitalnumber(287,200-17,max(p->frag-p->fraggedself,0),-16,10+16+128);
}
}
else
{
if (u&16384)
{
if (u != 0xffffffff) patchstatusbar(275,182,299,194);
if (p->got_access&4) rotatesprite(275<<16,182<<16,65536L,0,ACCESS_ICON,0,23,10+16+128,0,0,xdim-1,ydim-1);
if (p->got_access&2) rotatesprite(288<<16,182<<16,65536L,0,ACCESS_ICON,0,21,10+16+128,0,0,xdim-1,ydim-1);
if (p->got_access&1) rotatesprite(281<<16,189<<16,65536L,0,ACCESS_ICON,0,0,10+16+128,0,0,xdim-1,ydim-1);
}
}
if (u&(4+8+16+32+64+128+256+512+65536L)) weapon_amounts(p,96,182,u);
if (u&1)
{
if (u != 0xffffffff) patchstatusbar(20,183,43,193);
if(sprite[p->i].pal == 1 && p->last_extra < 2)
digitalnumber(32,200-17,1,-16,10+16+128);
else digitalnumber(32,200-17,p->last_extra,-16,10+16+128);
}
if (u&2)
{
if (u != 0xffffffff) patchstatusbar(52,183,75,193);
digitalnumber(64,200-17,p->shield_amount,-16,10+16+128);
}
if (u&1024)
{
if (u != 0xffffffff) patchstatusbar(196,183,219,193);
if (p->curr_weapon != KNEE_WEAPON)
{
if (p->curr_weapon == HANDREMOTE_WEAPON) i = HANDBOMB_WEAPON; else i = p->curr_weapon;
digitalnumber(230-22,200-17,p->ammo_amount[i],-16,10+16+128);
}
}
if (u&(2048+4096+8192))
{
if (u != 0xffffffff)
{
if (u&(2048+4096)) { patchstatusbar(231,179,265,197); }
else { patchstatusbar(250,190,261,195); }
}
if (p->inven_icon)
{
o = 0; permbit = 128;
if (u&(2048+4096))
{
switch(p->inven_icon)
{
case 1: i = FIRSTAID_ICON; break;
case 2: i = STEROIDS_ICON; break;
case 3: i = HOLODUKE_ICON; break;
case 4: i = JETPACK_ICON; break;
case 5: i = HEAT_ICON; break;
case 6: i = AIRTANK_ICON; break;
case 7: i = BOOT_ICON; break;
}
rotatesprite((231-o)<<16,(200-21)<<16,65536L,0,i,0,0,10+16+permbit,0,0,xdim-1,ydim-1);
minitext(292-30-o,190,"%",6,10+16+permbit);
if (p->inven_icon >= 6) minitext(284-35-o,180,"AUTO",2,10+16+permbit);
}
if (u&(2048+4096))
{
switch(p->inven_icon)
{
case 3: j = p->holoduke_on; break;
case 4: j = p->jetpack_on; break;
case 5: j = p->heat_on; break;
default: j = 0x80000000;
}
if (j > 0) minitext(288-30-o,180,"ON",0,10+16+permbit);
else if (j != 0x80000000) minitext(284-30-o,180,"OFF",2,10+16+permbit);
}
if (u&8192)
{
switch(p->inven_icon)
{
case 1: i = p->firstaid_amount; break;
case 2: i = ((p->steroids_amount+3)>>2); break;
case 3: i = ((p->holoduke_amount+15)/24); break;
case 4: i = ((p->jetpack_amount+15)>>4); break;
case 5: i = p->heat_amount/12; break;
case 6: i = ((p->scuba_amount+63)>>6); break;
case 7: i = (p->boot_amount>>1); break;
}
invennum(284-30-o,200-6,(char)i,0,10+permbit);
}
}
}
}
#define AVERAGEFRAMES 16
static long frameval[AVERAGEFRAMES], framecnt = 0;
void tics(void)
{
long i;
char b[10];
i = totalclock;
if (i != frameval[framecnt])
{
sprintf(b,"%ld",(TICRATE*AVERAGEFRAMES)/(i-frameval[framecnt]));
printext256(windowx1,windowy1,31,-21,b,1);
frameval[framecnt] = i;
}
framecnt = ((framecnt+1)&(AVERAGEFRAMES-1));
}
void coords(short snum)
{
short y = 0;
if(ud.coop != 1)
{
if(ud.multimode > 1 && ud.multimode < 5)
y = 8;
else if(ud.multimode > 4)
y = 16;
}
sprintf(tempbuf,"X= %ld",ps[snum].posx);
printext256(250L,y,31,-1,tempbuf,1);
sprintf(tempbuf,"Y= %ld",ps[snum].posy);
printext256(250L,y+7L,31,-1,tempbuf,1);
sprintf(tempbuf,"Z= %ld",ps[snum].posz);
printext256(250L,y+14L,31,-1,tempbuf,1);
sprintf(tempbuf,"A= %ld",ps[snum].ang);
printext256(250L,y+21L,31,-1,tempbuf,1);
sprintf(tempbuf,"ZV= %ld",ps[snum].poszv);
printext256(250L,y+28L,31,-1,tempbuf,1);
sprintf(tempbuf,"OG= %ld",ps[snum].on_ground);
printext256(250L,y+35L,31,-1,tempbuf,1);
sprintf(tempbuf,"AM= %ld",ps[snum].ammo_amount[GROW_WEAPON]);
printext256(250L,y+43L,31,-1,tempbuf,1);
sprintf(tempbuf,"LFW= %ld",ps[snum].last_full_weapon);
printext256(250L,y+50L,31,-1,tempbuf,1);
sprintf(tempbuf,"SECTL= %ld",sector[ps[snum].cursectnum].lotag);
printext256(250L,y+57L,31,-1,tempbuf,1);
sprintf(tempbuf,"SEED= %ld",randomseed);
printext256(250L,y+64L,31,-1,tempbuf,1);
sprintf(tempbuf,"THOLD= %ld",ps[snum].transporter_hold);
printext256(250L,y+64L+7,31,-1,tempbuf,1);
}
void operatefta(void)
{
long i, j, k;
if(ud.screen_size > 0) j = 200-45; else j = 200-8;
quotebot = min(quotebot,j);
quotebotgoal = min(quotebotgoal,j);
if(ps[myconnectindex].gm&MODE_TYPE) j -= 8;
quotebotgoal = j; j = quotebot;
for(i=0;i<MAXUSERQUOTES;i++)
{
k = user_quote_time[i]; if (k <= 0) break;
if (k > 4)
gametext(320>>1,j,user_quote[i],0,2+8+16);
else if (k > 2) gametext(320>>1,j,user_quote[i],0,2+8+16+1);
else gametext(320>>1,j,user_quote[i],0,2+8+16+1+32);
j -= 8;
}
if (ps[screenpeek].fta <= 1) return;
if (ud.coop != 1 && ud.screen_size > 0 && ud.multimode > 1)
{
j = 0; k = 8;
for(i=connecthead;i>=0;i=connectpoint2[i])
if (i > j) j = i;
if (j >= 4 && j <= 8) k += 8;
else if (j > 8 && j <= 12) k += 16;
else if (j > 12) k += 24;
}
else k = 0;
if (ps[screenpeek].ftq == 115 || ps[screenpeek].ftq == 116)
{
k = quotebot;
for(i=0;i<MAXUSERQUOTES;i++)
{
if (user_quote_time[i] <= 0) break;
k -= 8;
}
k -= 4;
}
j = ps[screenpeek].fta;
if (j > 4)
gametext(320>>1,k,fta_quotes[ps[screenpeek].ftq],0,2+8+16);
else
if (j > 2) gametext(320>>1,k,fta_quotes[ps[screenpeek].ftq],0,2+8+16+1);
else
gametext(320>>1,k,fta_quotes[ps[screenpeek].ftq],0,2+8+16+1+32);
}
void FTA(short q,struct player_struct *p)
{
if( ud.fta_on == 1)
{
if( p->fta > 0 && q != 115 && q != 116 )
if( p->ftq == 115 || p->ftq == 116 ) return;
p->fta = 100;
if( p->ftq != q || q == 26 )
// || q == 26 || q == 115 || q ==116 || q == 117 || q == 122 )
{
p->ftq = q;
pub = NUMPAGES;
pus = NUMPAGES;
}
}
}
void showtwoscreens(void)
{
short i;
#ifndef VOLUMEALL
setview(0,0,xdim-1,ydim-1);
flushperms();
ps[myconnectindex].palette = palette;
for(i=0;i<64;i+=7) palto(0,0,0,i);
KB_FlushKeyboardQueue();
rotatesprite(0,0,65536L,0,3291,0,0,2+8+16+64, 0,0,xdim-1,ydim-1);
nextpage(); for(i=63;i>0;i-=7) palto(0,0,0,i);
while( !KB_KeyWaiting() ) getpackets();
for(i=0;i<64;i+=7) palto(0,0,0,i);
KB_FlushKeyboardQueue();
rotatesprite(0,0,65536L,0,3290,0,0,2+8+16+64, 0,0,xdim-1,ydim-1);
nextpage(); for(i=63;i>0;i-=7) palto(0,0,0,i);
while( !KB_KeyWaiting() ) getpackets();
#else
setview(0,0,xdim-1,ydim-1);
flushperms();
ps[myconnectindex].palette = palette;
for(i=0;i<64;i+=7) palto(0,0,0,i);
KB_FlushKeyboardQueue();
clearview(0L);
rotatesprite(0,0,65536L,0,TENSCREEN,0,0,2+8+16+64, 0,0,xdim-1,ydim-1);
nextpage(); for(i=63;i>0;i-=7) palto(0,0,0,i);
totalclock = 0;
while( !KB_KeyWaiting() && totalclock < 2400) getpackets();
#endif
}
void binscreen(void)
{
long fil;
#ifdef VOLUMEONE
fil = kopen4load("dukesw.bin",1);
#else
fil = kopen4load("duke3d.bin",1);
#endif
if(fil == -1) return;
kread(fil,(char *)0xb8000,4000);
kclose(fil);
}
void gameexit(char *t)
{
short i;
if(*t != 0) ps[myconnectindex].palette = (char *) &palette[0];
if(numplayers > 1)
{
allowtimetocorrecterrorswhenquitting();
uninitmultiplayers();
}
if(ud.recstat == 1) closedemowrite();
else if(ud.recstat == 2) { fclose(frecfilep); }
if(qe || cp)
goto GOTOHERE;
if(playerswhenstarted > 1 && ud.coop != 1 && *t == ' ')
{
dobonus(1);
setgamemode(ScreenMode,ScreenWidth,ScreenHeight);
}
#ifdef ONELEVELDEMO
doorders();
t = "You have been playing a ONE LEVEL demo of Duke Nukem 3D.";
#endif
if( *t !
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -