📄 p_setup.c
字号:
//**************************************************************************//**//** 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 = §ors[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 + -