⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_setup.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
//**************************************************************************//**//** p_setup.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: p_setup.c,v $//** $Revision: 1.39 $//** $Date: 96/03/12 12:04:11 $//** $Author: bgokey $//**//**************************************************************************// HEADER FILES ------------------------------------------------------------#include <math.h>#include <stdlib.h>#include "h2def.h"#include "p_local.h"#include "soundst.h"// MACROS ------------------------------------------------------------------#define MAPINFO_SCRIPT_NAME "MAPINFO"#define MCMD_SKY1 1#define MCMD_SKY2 2#define MCMD_LIGHTNING 3#define MCMD_FADETABLE 4#define MCMD_DOUBLESKY 5#define MCMD_CLUSTER 6#define MCMD_WARPTRANS 7#define MCMD_NEXT 8#define MCMD_CDTRACK 9#define MCMD_CD_STARTTRACK 10#define MCMD_CD_END1TRACK 11#define MCMD_CD_END2TRACK 12#define MCMD_CD_END3TRACK 13#define MCMD_CD_INTERTRACK 14#define MCMD_CD_TITLETRACK 15#define UNKNOWN_MAP_NAME "DEVELOPMENT MAP"#define DEFAULT_SKY_NAME "SKY1"#define DEFAULT_SONG_LUMP "DEFSONG"#define DEFAULT_FADE_TABLE "COLORMAP"// TYPES -------------------------------------------------------------------typedef struct mapInfo_s mapInfo_t;struct mapInfo_s{	short cluster;	short warpTrans;	short nextMap;	short cdTrack;	char name[32];	short sky1Texture;	short sky2Texture;	fixed_t sky1ScrollDelta;	fixed_t sky2ScrollDelta;	boolean doubleSky;	boolean lightning;	int fadetable;	char songLump[10];};// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------void P_SpawnMapThing(mapthing_t *mthing);// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------static int QualifyMap(int map);// EXTERNAL DATA DECLARATIONS ----------------------------------------------// PUBLIC DATA DEFINITIONS -------------------------------------------------int MapCount;mapthing_t deathmatchstarts[MAXDEATHMATCHSTARTS], *deathmatch_p;mapthing_t playerstarts[MAX_PLAYER_STARTS][MAXPLAYERS];int numvertexes;vertex_t *vertexes;int numsegs;seg_t *segs;int numsectors;sector_t *sectors;int numsubsectors;subsector_t *subsectors;int numnodes;node_t *nodes;int numlines;line_t *lines;int numsides;side_t *sides;short *blockmaplump; // offsets in blockmap are from hereshort *blockmap;int bmapwidth, bmapheight; // in mapblocksfixed_t bmaporgx, bmaporgy; // origin of block mapmobj_t **blocklinks; // for thing chainsbyte *rejectmatrix; // for fast sight rejection// PRIVATE DATA DEFINITIONS ------------------------------------------------static mapInfo_t MapInfo[99];static char *MapCmdNames[] ={	"SKY1",	"SKY2",	"DOUBLESKY",	"LIGHTNING",	"FADETABLE",	"CLUSTER",	"WARPTRANS",	"NEXT",	"CDTRACK",	"CD_START_TRACK",	"CD_END1_TRACK",	"CD_END2_TRACK",	"CD_END3_TRACK",	"CD_INTERMISSION_TRACK",	"CD_TITLE_TRACK",	NULL};static int MapCmdIDs[] ={	MCMD_SKY1,	MCMD_SKY2,	MCMD_DOUBLESKY,	MCMD_LIGHTNING,	MCMD_FADETABLE,	MCMD_CLUSTER,	MCMD_WARPTRANS,	MCMD_NEXT,	MCMD_CDTRACK,	MCMD_CD_STARTTRACK,	MCMD_CD_END1TRACK,	MCMD_CD_END2TRACK,	MCMD_CD_END3TRACK,	MCMD_CD_INTERTRACK,	MCMD_CD_TITLETRACK};static int cd_NonLevelTracks[6]; // Non-level specific song cd track numbers // CODE --------------------------------------------------------------------/*=================== P_LoadVertexes==================*/void P_LoadVertexes (int lump){	byte            *data;	int                     i;	mapvertex_t     *ml;	vertex_t        *li;	numvertexes = W_LumpLength (lump) / sizeof(mapvertex_t);	vertexes = Z_Malloc (numvertexes*sizeof(vertex_t),PU_LEVEL,0);	data = W_CacheLumpNum (lump,PU_STATIC);	ml = (mapvertex_t *)data;	li = vertexes;	for (i=0 ; i<numvertexes ; i++, li++, ml++)	{		li->x = SHORT(ml->x)<<FRACBITS;		li->y = SHORT(ml->y)<<FRACBITS;	}	Z_Free (data);}/*=================== P_LoadSegs==================*/void P_LoadSegs (int lump){	byte            *data;	int                     i;	mapseg_t        *ml;	seg_t           *li;	line_t  *ldef;	int                     linedef, side;	numsegs = W_LumpLength (lump) / sizeof(mapseg_t);	segs = Z_Malloc (numsegs*sizeof(seg_t),PU_LEVEL,0);	memset (segs, 0, numsegs*sizeof(seg_t));	data = W_CacheLumpNum (lump,PU_STATIC);	ml = (mapseg_t *)data;	li = segs;	for (i=0 ; i<numsegs ; i++, li++, ml++)	{		li->v1 = &vertexes[SHORT(ml->v1)];		li->v2 = &vertexes[SHORT(ml->v2)];		li->angle = (SHORT(ml->angle))<<16;		li->offset = (SHORT(ml->offset))<<16;		linedef = SHORT(ml->linedef);		ldef = &lines[linedef];		li->linedef = ldef;		side = SHORT(ml->side);		li->sidedef = &sides[ldef->sidenum[side]];		li->frontsector = sides[ldef->sidenum[side]].sector;		if (ldef-> flags & ML_TWOSIDED)			li->backsector = sides[ldef->sidenum[side^1]].sector;		else			li->backsector = 0;	}	Z_Free (data);}/*=================== P_LoadSubsectors==================*/void P_LoadSubsectors (int lump){	byte                    *data;	int                             i;	mapsubsector_t  *ms;	subsector_t             *ss;	numsubsectors = W_LumpLength (lump) / sizeof(mapsubsector_t);	subsectors = Z_Malloc (numsubsectors*sizeof(subsector_t),PU_LEVEL,0);	data = W_CacheLumpNum (lump,PU_STATIC);	ms = (mapsubsector_t *)data;	memset (subsectors,0, numsubsectors*sizeof(subsector_t));	ss = subsectors;	for (i=0 ; i<numsubsectors ; i++, ss++, ms++)	{		ss->numlines = SHORT(ms->numsegs);		ss->firstline = SHORT(ms->firstseg);	}	Z_Free (data);}/*=================== P_LoadSectors==================*/void P_LoadSectors (int lump){	byte                    *data;	int                             i;	mapsector_t             *ms;	sector_t                *ss;	numsectors = W_LumpLength (lump) / sizeof(mapsector_t);	sectors = Z_Malloc (numsectors*sizeof(sector_t),PU_LEVEL,0);	memset (sectors, 0, numsectors*sizeof(sector_t));	data = W_CacheLumpNum (lump,PU_STATIC);	ms = (mapsector_t *)data;	ss = sectors;	// Make sure primary lumps are used for flat searching	W_UsePrimary();	for(i = 0; i < numsectors; i++, ss++, ms++)	{		ss->floorheight = SHORT(ms->floorheight)<<FRACBITS;		ss->ceilingheight = SHORT(ms->ceilingheight)<<FRACBITS;		ss->floorpic = R_FlatNumForName(ms->floorpic);		ss->ceilingpic = R_FlatNumForName(ms->ceilingpic);		ss->lightlevel = SHORT(ms->lightlevel);		ss->special = SHORT(ms->special);		ss->tag = SHORT(ms->tag);		ss->thinglist = NULL;		ss->seqType = SEQTYPE_STONE; // default seqType	}	if(DevMaps)	{		W_UseAuxiliary();	}	Z_Free(data);}/*=================== P_LoadNodes==================*/void P_LoadNodes (int lump){	byte            *data;	int                     i,j,k;	mapnode_t       *mn;	node_t          *no;	numnodes = W_LumpLength (lump) / sizeof(mapnode_t);	nodes = Z_Malloc (numnodes*sizeof(node_t),PU_LEVEL,0);	data = W_CacheLumpNum (lump,PU_STATIC);	mn = (mapnode_t *)data;	no = nodes;	for (i=0 ; i<numnodes ; i++, no++, mn++)	{		no->x = SHORT(mn->x)<<FRACBITS;		no->y = SHORT(mn->y)<<FRACBITS;		no->dx = SHORT(mn->dx)<<FRACBITS;		no->dy = SHORT(mn->dy)<<FRACBITS;		for (j=0 ; j<2 ; j++)		{			no->children[j] = SHORT(mn->children[j]);			for (k=0 ; k<4 ; k++)				no->bbox[j][k] = SHORT(mn->bbox[j][k])<<FRACBITS;		}	}	Z_Free (data);}//==========================================================================//// P_LoadThings////==========================================================================void P_LoadThings(int lump){	byte *data;	int i;	mapthing_t *mt;	int numthings;	int playerCount;	int deathSpotsCount;	data = W_CacheLumpNum(lump, PU_STATIC);	numthings = W_LumpLength(lump)/sizeof(mapthing_t);	mt = (mapthing_t *)data;	for(i = 0; i < numthings; i++, mt++)	{		mt->tid = SHORT(mt->tid);		mt->x = SHORT(mt->x);		mt->y = SHORT(mt->y);		mt->height = SHORT(mt->height);		mt->angle = SHORT(mt->angle);		mt->type = SHORT(mt->type);		mt->options = SHORT(mt->options);		P_SpawnMapThing(mt);	}	P_CreateTIDList();	P_InitCreatureCorpseQueue(false); // false = do NOT scan for corpses	Z_Free(data);	if(!deathmatch)	{ // Don't need to check deathmatch spots		return;	}	playerCount = 0;	for(i = 0; i < MAXPLAYERS; i++)	{		playerCount += playeringame[i];	}	deathSpotsCount = deathmatch_p-deathmatchstarts;	if(deathSpotsCount < playerCount)	{		I_Error("P_LoadThings: Player count (%d) exceeds deathmatch "			"spots (%d)", playerCount, deathSpotsCount);	}}/*=================== P_LoadLineDefs==================*/void P_LoadLineDefs(int lump){	byte *data;	int i;	maplinedef_t *mld;	line_t *ld;	vertex_t *v1, *v2;	numlines = W_LumpLength(lump)/sizeof(maplinedef_t);	lines = Z_Malloc(numlines*sizeof(line_t), PU_LEVEL, 0);	memset(lines, 0, numlines*sizeof(line_t));	data = W_CacheLumpNum(lump, PU_STATIC);	mld = (maplinedef_t *)data;	ld = lines;	for(i = 0; i < numlines; i++, mld++, ld++)	{		ld->flags = SHORT(mld->flags);		// Old line special info ...		//ld->special = SHORT(mld->special);		//ld->tag = SHORT(mld->tag);		// New line special info ...		ld->special = mld->special;		ld->arg1 = mld->arg1;		ld->arg2 = mld->arg2;		ld->arg3 = mld->arg3;		ld->arg4 = mld->arg4;		ld->arg5 = mld->arg5;		v1 = ld->v1 = &vertexes[SHORT(mld->v1)];		v2 = ld->v2 = &vertexes[SHORT(mld->v2)];		ld->dx = v2->x - v1->x;		ld->dy = v2->y - v1->y;		if (!ld->dx)			ld->slopetype = ST_VERTICAL;		else if (!ld->dy)			ld->slopetype = ST_HORIZONTAL;		else		{			if (FixedDiv (ld->dy , ld->dx) > 0)				ld->slopetype = ST_POSITIVE;			else				ld->slopetype = ST_NEGATIVE;		}		if (v1->x < v2->x)		{			ld->bbox[BOXLEFT] = v1->x;			ld->bbox[BOXRIGHT] = v2->x;		}		else		{			ld->bbox[BOXLEFT] = v2->x;			ld->bbox[BOXRIGHT] = v1->x;		}		if (v1->y < v2->y)		{			ld->bbox[BOXBOTTOM] = v1->y;			ld->bbox[BOXTOP] = v2->y;		}		else		{			ld->bbox[BOXBOTTOM] = v2->y;			ld->bbox[BOXTOP] = v1->y;		}		ld->sidenum[0] = SHORT(mld->sidenum[0]);		ld->sidenum[1] = SHORT(mld->sidenum[1]);		if (ld->sidenum[0] != -1)			ld->frontsector = sides[ld->sidenum[0]].sector;		else			ld->frontsector = 0;		if (ld->sidenum[1] != -1)			ld->backsector = sides[ld->sidenum[1]].sector;		else			ld->backsector = 0;	}	Z_Free (data);}/*=================== P_LoadSideDefs==================*/void P_LoadSideDefs (int lump){	byte                    *data;	int                             i;	mapsidedef_t    *msd;	side_t                  *sd;	numsides = W_LumpLength (lump) / sizeof(mapsidedef_t);	sides = Z_Malloc (numsides*sizeof(side_t),PU_LEVEL,0);	memset (sides, 0, numsides*sizeof(side_t));	data = W_CacheLumpNum (lump,PU_STATIC);	msd = (mapsidedef_t *)data;	sd = sides;	// Make sure primary lumps are used for texture searching	W_UsePrimary();	for(i = 0; i < numsides; i++, msd++, sd++)	{		sd->textureoffset = SHORT(msd->textureoffset)<<FRACBITS;		sd->rowoffset = SHORT(msd->rowoffset)<<FRACBITS;		sd->toptexture = R_TextureNumForName(msd->toptexture);		sd->bottomtexture = R_TextureNumForName(msd->bottomtexture);		sd->midtexture = R_TextureNumForName(msd->midtexture);		sd->sector = &sectors[SHORT(msd->sector)];	}	if(DevMaps)	{		W_UseAuxiliary();	}	Z_Free(data);}/*=================== P_LoadBlockMap==================*/void P_LoadBlockMap (int lump){	int             i, count;	blockmaplump = W_CacheLumpNum (lump,PU_LEVEL);	blockmap = blockmaplump+4;	count = W_LumpLength (lump)/2;	for (i=0 ; i<count ; i++)		blockmaplump[i] = SHORT(blockmaplump[i]);	bmaporgx = blockmaplump[0]<<FRACBITS;	bmaporgy = blockmaplump[1]<<FRACBITS;	bmapwidth = blockmaplump[2];	bmapheight = blockmaplump[3];// clear out mobj chains	count = sizeof(*blocklinks)* bmapwidth*bmapheight;	blocklinks = Z_Malloc (count,PU_LEVEL, 0);	memset (blocklinks, 0, count);}/*=================== P_GroupLines== Builds sector line lists and subsector sector numbers= Finds block bounding boxes for sectors=================*/void P_GroupLines (void){	line_t          **linebuffer;	int                     i, j, total;	line_t          *li;	sector_t        *sector;	subsector_t     *ss;	seg_t           *seg;	fixed_t         bbox[4];	int                     block;// look up sector number for each subsector	ss = subsectors;	for (i=0 ; i<numsubsectors ; i++, ss++)	{		seg = &segs[ss->firstline];		ss->sector = seg->sidedef->sector;	}// count number of lines in each sector	li = lines;	total = 0;	for (i=0 ; i<numlines ; i++, li++)	{		total++;		li->frontsector->linecount++;		if (li->backsector && li->backsector != li->frontsector)		{			li->backsector->linecount++;			total++;		}	}// build line tables for each sector	linebuffer = Z_Malloc (total*4, PU_LEVEL, 0);	sector = sectors;	for (i=0 ; i<numsectors ; i++, sector++)	{		M_ClearBox (bbox);		sector->lines = linebuffer;		li = lines;		for (j=0 ; j<numlines ; j++, li++)		{			if (li->frontsector == sector || li->backsector == sector)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -