📄 p_setup.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: p_setup.c,v 1.2 2003/09/08 22:34:30 jasonk Exp $//// Copyright (C) 1993-1996 by id Software, Inc.//// This source is available for distribution and/or modification// only under the terms of the DOOM Source Code License as// published by id Software. All rights reserved.//// The source is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License// for more details.//// $Log: p_setup.c,v $// Revision 1.2 2003/09/08 22:34:30 jasonk// Updated files because this fucker won't build for no fucking good reason.//// Revision 1.1.1.1 2003/09/04 21:08:13 jasonk// Initial import//// Revision 1.1 2000/12/08 21:07:54 jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION:// Do all the WAD I/O, get map description,// set up initial state and misc. LUTs.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: p_setup.c,v 1.2 2003/09/08 22:34:30 jasonk Exp $";#include <math.h>#include "z_zone.h"#include "m_swap.h"#include "m_bbox.h"#include "g_game.h"#include "i_system.h"#include "w_wad.h"#include "doomdef.h"#include "p_local.h"#include "s_sound.h"#include "doomstat.h"void P_SpawnMapThing (mapthing_t* mthing);//// MAP related Lookup tables.// Store VERTEXES, LINEDEFS, SIDEDEFS, etc.//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;// BLOCKMAP// Created from axis aligned bounding box// of the map, a rectangular array of// blocks of size ...// Used to speed up collision detection// by spatial subdivision in 2D.//// Blockmap size.int bmapwidth;int bmapheight; // size in mapblocksshort* blockmap; // int for larger maps// offsets in blockmap are from hereshort* blockmaplump; // origin of block mapfixed_t bmaporgx;fixed_t bmaporgy;// for thing chainsmobj_t** blocklinks; // REJECT// For fast sight rejection.// Speeds up enemy AI by skipping detailed// LineOf Sight calculation.// Without special effect, this could be// used as a PVS lookup as well.//byte* rejectmatrix;// Maintain single and multi player starting spots.#define MAX_DEATHMATCH_STARTS 10mapthing_t deathmatchstarts[MAX_DEATHMATCH_STARTS];mapthing_t* deathmatch_p;mapthing_t playerstarts[MAXPLAYERS];//// P_LoadVertexes//void P_LoadVertexes (int lump){ byte* data; int i; mapvertex_t* ml; vertex_t* li; // Determine number of lumps: // total lump length / vertex record length. numvertexes = W_LumpLength (lump) / sizeof(mapvertex_t); // Allocate zone memory for buffer. vertexes = Z_Malloc (numvertexes*sizeof(vertex_t),PU_LEVEL,0); // Load data into cache. data = W_CacheLumpNum (lump,PU_STATIC); ml = (mapvertex_t *)data; li = vertexes; // Copy and convert vertex coordinates, // internal representation as fixed. for (i=0 ; i<numvertexes ; i++, li++, ml++) { li->x = SHORT(ml->x)<<FRACBITS; li->y = SHORT(ml->y)<<FRACBITS; } // Free buffer memory. 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; int 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; 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; } Z_Free (data);}//// P_LoadNodes//void P_LoadNodes (int lump){ byte* data; int i; int j; int 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; boolean spawn; data = W_CacheLumpNum (lump,PU_STATIC); numthings = W_LumpLength (lump) / sizeof(mapthing_t); mt = (mapthing_t *)data; for (i=0 ; i<numthings ; i++, mt++) { spawn = true; // Do not spawn cool, new monsters if !commercial if ( gamemode != commercial) { switch(mt->type) { case 68: // Arachnotron case 64: // Archvile case 88: // Boss Brain case 89: // Boss Shooter case 69: // Hell Knight case 67: // Mancubus case 71: // Pain Elemental case 65: // Former Human Commando case 66: // Revenant case 84: // Wolf SS spawn = false; break; } } if (spawn == false) break; // Do spawn all other stuff. mt->x = SHORT(mt->x); mt->y = SHORT(mt->y); mt->angle = SHORT(mt->angle); mt->type = SHORT(mt->type); mt->options = SHORT(mt->options); P_SpawnMapThing (mt); } Z_Free (data);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -