📄 premap.c
字号:
//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
This file is NOT part of Duke Nukem 3D version 1.5 - Atomic EditionHowever, it is either an older version of a file that is, or issome test code written during the development of Duke Nukem 3D.This file is provided purely for educational interest.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.
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "duke3d.h"
extern char everyothertime;
short which_palookup = 9;
tloadtile(short tilenume)
{
gotpic[tilenume>>3] |= (1<<(tilenume&7));
}
void cachespritenum(short i)
{
char maxc;
short j;
if(ud.monsters_off && badguy(&sprite[i])) return;
maxc = 1;
switch(PN)
{
case HYDRENT:
tloadtile(BROKEFIREHYDRENT);
for(j = TOILETWATER; j < (TOILETWATER+4); j++)
if(waloff[j] == 0) tloadtile(j);
break;
case TOILET:
tloadtile(TOILETBROKE);
for(j = TOILETWATER; j < (TOILETWATER+4); j++)
if(waloff[j] == 0) tloadtile(j);
break;
case STALL:
tloadtile(STALLBROKE);
for(j = TOILETWATER; j < (TOILETWATER+4); j++)
if(waloff[j] == 0) tloadtile(j);
break;
case RUBBERCAN:
maxc = 2;
break;
case TOILETWATER:
maxc = 4;
break;
case FEMPIC1:
maxc = 44;
break;
case LIZTROOP:
case LIZTROOPRUNNING:
case LIZTROOPSHOOT:
case LIZTROOPJETPACK:
case LIZTROOPONTOILET:
case LIZTROOPDUCKING:
for(j = LIZTROOP; j < (LIZTROOP+72); j++)
if(waloff[j] == 0)
tloadtile(j);
for(j=HEADJIB1;j<LEGJIB1+3;j++)
if(waloff[j] == 0)
tloadtile(j);
maxc = 0;
break;
case WOODENHORSE:
maxc = 5;
for(j = HORSEONSIDE; j < (HORSEONSIDE+4); j++)
if(waloff[j] == 0)
tloadtile(j);
break;
case NEWBEAST:
case NEWBEASTSTAYPUT:
maxc = 90;
break;
case BOSS1:
case BOSS2:
case BOSS3:
maxc = 30;
break;
case OCTABRAIN:
case OCTABRAINSTAYPUT:
case COMMANDER:
case COMMANDERSTAYPUT:
maxc = 38;
break;
case RECON:
maxc = 13;
break;
case PIGCOP:
case PIGCOPDIVE:
maxc = 61;
break;
case SHARK:
maxc = 30;
break;
case LIZMAN:
case LIZMANSPITTING:
case LIZMANFEEDING:
case LIZMANJUMP:
for(j=LIZMANHEAD1;j<LIZMANLEG1+3;j++)
if(waloff[j] == 0)
tloadtile(j);
maxc = 80;
break;
case APLAYER:
maxc = 0;
if(ud.multimode > 1)
{
maxc = 5;
for(j = 1420;j < 1420+106; j++)
if(waloff[j] == 0)
tloadtile(j);
}
break;
case ATOMICHEALTH:
maxc = 14;
break;
case DRONE:
maxc = 10;
break;
case EXPLODINGBARREL:
case SEENINE:
case OOZFILTER:
maxc = 3;
break;
case NUKEBARREL:
case CAMERA1:
maxc = 5;
break;
}
for(j = PN; j < (PN+maxc); j++)
if(waloff[j] == 0)
tloadtile(j);
}
void cachegoodsprites(void)
{
short i;
if(ud.screen_size >= 8)
{
if(waloff[BOTTOMSTATUSBAR] == 0)
tloadtile(BOTTOMSTATUSBAR);
if( ud.multimode > 1)
{
if(waloff[FRAGBAR] == 0)
tloadtile(FRAGBAR);
for(i=MINIFONT;i<MINIFONT+63;i++)
if(waloff[i] == 0)
tloadtile(i);
}
}
tloadtile(VIEWSCREEN);
for(i=STARTALPHANUM;i<ENDALPHANUM+1;i++)
if (waloff[i] == 0)
tloadtile(i);
for(i=FOOTPRINTS;i<FOOTPRINTS+3;i++)
if (waloff[i] == 0)
tloadtile(i);
for( i = BIGALPHANUM; i < BIGALPHANUM+82; i++)
if(waloff[i] == 0)
tloadtile(i);
for( i = BURNING; i < BURNING+14; i++)
if(waloff[i] == 0)
tloadtile(i);
for( i = BURNING2; i < BURNING2+14; i++)
if(waloff[i] == 0)
tloadtile(i);
for( i = CRACKKNUCKLES; i < CRACKKNUCKLES+4; i++)
if(waloff[i] == 0)
tloadtile(i);
for( i = FIRSTGUN; i < FIRSTGUN+3 ; i++ )
if(waloff[i] == 0)
tloadtile(i);
for( i = EXPLOSION2; i < EXPLOSION2+21 ; i++ )
if(waloff[i] == 0)
tloadtile(i);
tloadtile(BULLETHOLE);
for( i = FIRSTGUNRELOAD; i < FIRSTGUNRELOAD+8 ; i++ )
if(waloff[i] == 0)
tloadtile(i);
tloadtile(FOOTPRINTS);
for( i = JIBS1; i < (JIBS5+5); i++)
if(waloff[i] == 0)
tloadtile(i);
for( i = SCRAP1; i < (SCRAP1+19); i++)
if(waloff[i] == 0)
tloadtile(i);
for( i = SMALLSMOKE; i < (SMALLSMOKE+4); i++)
if(waloff[i] == 0)
tloadtile(i);
}
char getsound(unsigned short num)
{
short fp;
long l;
if(num >= NUM_SOUNDS || SoundToggle == 0) return 0;
if (FXDevice == NumSoundCards) return 0;
fp = kopen4load(sounds[num],loadfromgrouponly);
if(fp == -1) return 0;
l = kfilelength( fp );
soundsiz[num] = l;
if( (ud.level_number == 0 && ud.volume_number == 0 && (num == 189 || num == 232 || num == 99 || num == 233 || num == 17 ) ) ||
( l < 12288 ) )
{
Sound[num].lock = 199;
allocache((long *)&Sound[num].ptr,l,&Sound[num].lock);
if(Sound[num].ptr != NULL)
kread( fp, Sound[num].ptr , l);
}
kclose( fp );
return 1;
}
void precachenecessarysounds(void)
{
short i, j;
if (FXDevice == NumSoundCards) return;
j = 0;
for(i=0;i<NUM_SOUNDS;i++)
if(Sound[i].ptr == 0)
{
j++;
if( (j&7) == 0 )
getpackets();
getsound(i);
}
}
void cacheit(void)
{
short i,j;
precachenecessarysounds();
cachegoodsprites();
for(i=0;i<numwalls;i++)
if( waloff[wall[i].picnum] == 0 )
{
if(waloff[wall[i].picnum] == 0)
tloadtile(wall[i].picnum);
if(wall[i].overpicnum >= 0 && waloff[wall[i].overpicnum] == 0 )
tloadtile(wall[i].overpicnum);
}
for(i=0;i<numsectors;i++)
{
if( waloff[sector[i].floorpicnum] == 0 )
tloadtile( sector[i].floorpicnum );
if( waloff[sector[i].ceilingpicnum] == 0 )
{
tloadtile( sector[i].ceilingpicnum );
if( waloff[sector[i].ceilingpicnum] == LA)
{
tloadtile(LA+1);
tloadtile(LA+2);
}
}
j = headspritesect[i];
while(j >= 0)
{
if(sprite[j].xrepeat != 0 && sprite[j].yrepeat != 0 && (sprite[j].cstat&32768) == 0)
if(waloff[sprite[j].picnum] == 0)
cachespritenum(j);
j = nextspritesect[j];
}
}
j = 0;
for(i=0;i<MAXTILES;i++)
if( (gotpic[i>>3]&(1<<(i&7))) && waloff[i] == 0)
{
loadtile((short)i);
j++;
if((j&7) == 0) getpackets();
}
clearbufbyte(gotpic,sizeof(gotpic),0L);
}
void xyzmirror(short i,short wn)
{
if (waloff[wn] == 0) loadtile(wn);
setviewtotile(wn,tilesizy[wn],tilesizx[wn]);
drawrooms(SX,SY,SZ,SA,100+sprite[i].shade,SECT);
display_mirror = 1; animatesprites(SX,SY,SA,65536L); display_mirror = 0;
drawmasks();
setviewback();
squarerotatetile(wn);
}
void vscrn(void)
{
long i, j, ss, x1, x2, y1, y2;
if(ud.screen_size < 0) ud.screen_size = 0;
else if(ud.screen_size > 63) ud.screen_size = 64;
if(ud.screen_size == 0) flushperms();
ss = max(ud.screen_size-8,0);
x1 = scale(ss,xdim,160);
x2 = xdim-x1;
y1 = ss; y2 = 200;
if ( ud.screen_size > 0 && ud.coop != 1 && ud.multimode > 1)
{
j = 0;
for(i=connecthead;i>=0;i=connectpoint2[i])
if(i > j) j = i;
if (j >= 1) y1 += 8;
if (j >= 4) y1 += 8;
if (j >= 8) y1 += 8;
if (j >= 12) y1 += 8;
}
if (ud.screen_size >= 8) y2 -= (ss+34);
y1 = scale(y1,ydim,200);
y2 = scale(y2,ydim,200);
setview(x1,y1,x2-1,y2-1);
pub = NUMPAGES;
pus = NUMPAGES;
}
void pickrandomspot(short snum)
{
struct player_struct *p;
short i;
p = &ps[snum];
if( ud.multimode > 1 && ud.coop != 1)
i = TRAND%numplayersprites;
else i = snum;
p->bobposx = p->oposx = p->posx = po[i].ox;
p->bobposy = p->oposy = p->posy = po[i].oy;
p->oposz = p->posz = po[i].oz;
p->ang = po[i].oa;
p->cursectnum = po[i].os;
}
void resetplayerstats(short snum)
{
struct player_struct *p;
short i;
p = &ps[snum];
ud.show_help = 0;
ud.showallmap = 0;
p->dead_flag = 0;
p->wackedbyactor = -1;
p->falling_counter = 0;
p->quick_kick = 0;
p->subweapon = 0;
p->last_full_weapon = 0;
p->ftq = 0;
p->fta = 0;
p->tipincs = 0;
p->buttonpalette = 0;
p->actorsqu =-1;
p->invdisptime = 0;
p->refresh_inventory= 0;
p->last_pissed_time = 0;
p->holster_weapon = 0;
p->pycount = 0;
p->pyoff = 0;
p->opyoff = 0;
p->loogcnt = 0;
p->angvel = 0;
p->weapon_sway = 0;
// p->select_dir = 0;
p->extra_extra8 = 0;
p->show_empty_weapon= 0;
p->dummyplayersprite=-1;
p->crack_time = 0;
p->hbomb_hold_delay = 0;
p->transporter_hold = 0;
p->wantweaponfire = -1;
p->hurt_delay = 0;
p->footprintcount = 0;
p->footprintpal = 0;
p->footprintshade = 0;
p->jumping_toggle = 0;
p->ohoriz = p->horiz= 140;
p->horizoff = 0;
p->bobcounter = 0;
p->on_ground = 0;
p->player_par = 0;
p->return_to_center = 9;
p->airleft = 15*26;
p->rapid_fire_hold = 0;
p->toggle_key_flag = 0;
p->access_spritenum = -1;
if(ud.multimode > 1 && ud.coop != 1 )
p->got_access = 7;
else p->got_access = 0;
p->random_club_frame= 0;
pus = 1;
p->on_warping_sector = 0;
p->spritebridge = 0;
p->palette = (char *) &palette[0];
if(p->steroids_amount < 400 )
{
p->steroids_amount = 0;
p->inven_icon = 0;
}
p->heat_on = 0;
p->jetpack_on = 0;
p->holoduke_on = -1;
p->look_ang = 512 - ((ud.level_number&1)<<10);
p->rotscrnang = 0;
p->newowner =-1;
p->jumping_counter = 0;
p->hard_landing = 0;
p->posxv = 0;
p->posyv = 0;
p->poszv = 0;
fricxv = 0;
fricyv = 0;
p->somethingonplayer =-1;
p->one_eighty_count = 0;
p->cheat_phase = 0;
p->on_crane = -1;
if(p->curr_weapon == PISTOL_WEAPON)
p->kickback_pic = 5;
else p->kickback_pic = 0;
p->weapon_pos = 6;
p->walking_snd_toggle= 0;
p->weapon_ang = 0;
p->knuckle_incs = 1;
p->fist_incs = 0;
p->knee_incs = 0;
p->jetpack_on = 0;
setpal(p);
}
void resetweapons(short snum)
{
short weapon;
struct player_struct *p;
p = &ps[snum];
for ( weapon = PISTOL_WEAPON; weapon < MAX_WEAPONS; weapon++ )
p->gotweapon[weapon] = 0;
for ( weapon = PISTOL_WEAPON; weapon < MAX_WEAPONS; weapon++ )
p->ammo_amount[weapon] = 0;
p->weapon_pos = 6;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -