📄 p_setup.c
字号:
{ *linebuffer++ = li; M_AddToBox (bbox, li->v1->x, li->v1->y); M_AddToBox (bbox, li->v2->x, li->v2->y); } } if (linebuffer - sector->lines != sector->linecount) I_Error ("P_GroupLines: miscounted"); // set the degenmobj_t to the middle of the bounding box sector->soundorg.x = (bbox[BOXRIGHT]+bbox[BOXLEFT])/2; sector->soundorg.y = (bbox[BOXTOP]+bbox[BOXBOTTOM])/2; // adjust bounding box to map blocks block = (bbox[BOXTOP]-bmaporgy+MAXRADIUS)>>MAPBLOCKSHIFT; block = block >= bmapheight ? bmapheight-1 : block; sector->blockbox[BOXTOP]=block; block = (bbox[BOXBOTTOM]-bmaporgy-MAXRADIUS)>>MAPBLOCKSHIFT; block = block < 0 ? 0 : block; sector->blockbox[BOXBOTTOM]=block; block = (bbox[BOXRIGHT]-bmaporgx+MAXRADIUS)>>MAPBLOCKSHIFT; block = block >= bmapwidth ? bmapwidth-1 : block; sector->blockbox[BOXRIGHT]=block; block = (bbox[BOXLEFT]-bmaporgx-MAXRADIUS)>>MAPBLOCKSHIFT; block = block < 0 ? 0 : block; sector->blockbox[BOXLEFT]=block; }}//=============================================================================/*=================== P_SetupLevel==================*/#ifdef __WATCOMC__ extern boolean i_CDMusic;#endifvoid P_SetupLevel(int episode, int map, int playermask, skill_t skill){ int i; int parm; char lumpname[9]; char auxName[128]; int lumpnum; mobj_t *mobj; for(i = 0; i < MAXPLAYERS; i++) { players[i].killcount = players[i].secretcount = players[i].itemcount = 0; } players[consoleplayer].viewz = 1; // will be set by player think#ifdef __WATCOMC__ if(i_CDMusic == false) { S_StartSongName("chess", true); // Waiting-for-level-load song }#endif Z_FreeTags(PU_LEVEL, PU_PURGELEVEL-1); P_InitThinkers(); leveltime = 0; if(DevMaps) { sprintf(auxName, "%sMAP%02d.WAD", DevMapsDir, map); W_OpenAuxiliary(auxName); } sprintf(lumpname, "MAP%02d", map); lumpnum = W_GetNumForName(lumpname); // // Begin processing map lumps // Note: most of this ordering is important // P_LoadBlockMap(lumpnum+ML_BLOCKMAP); P_LoadVertexes(lumpnum+ML_VERTEXES); P_LoadSectors(lumpnum+ML_SECTORS); P_LoadSideDefs(lumpnum+ML_SIDEDEFS); P_LoadLineDefs(lumpnum+ML_LINEDEFS); P_LoadSubsectors(lumpnum+ML_SSECTORS); P_LoadNodes(lumpnum+ML_NODES); P_LoadSegs(lumpnum+ML_SEGS); rejectmatrix = W_CacheLumpNum(lumpnum+ML_REJECT, PU_LEVEL); P_GroupLines(); bodyqueslot = 0; po_NumPolyobjs = 0; deathmatch_p = deathmatchstarts; P_LoadThings(lumpnum+ML_THINGS); PO_Init(lumpnum+ML_THINGS); // Initialize the polyobjs P_LoadACScripts(lumpnum+ML_BEHAVIOR); // ACS object code // // End of map lump processing // if(DevMaps) { // Close the auxiliary file, but don't free its loaded lumps. // The next call to W_OpenAuxiliary() will do a full shutdown // of the current auxiliary WAD (free lumps and info lists). W_CloseAuxiliaryFile(); W_UsePrimary(); } // If deathmatch, randomly spawn the active players TimerGame = 0; if(deathmatch) { for (i=0 ; i<MAXPLAYERS ; i++) { if (playeringame[i]) { // must give a player spot before deathmatchspawn mobj = P_SpawnMobj (playerstarts[0][i].x<<16, playerstarts[0][i].y<<16,0, MT_PLAYER_FIGHTER); players[i].mo = mobj; G_DeathMatchSpawnPlayer (i); P_RemoveMobj (mobj); } } parm = M_CheckParm("-timer"); if(parm && parm < myargc-1) { TimerGame = atoi(myargv[parm+1])*35*60; } }// set up world state P_SpawnSpecials ();// build subsector connect matrix// P_ConnectSubsectors ();// Load colormap and set the fullbright flag i = P_GetMapFadeTable(gamemap); W_ReadLump(i, colormaps); if(i == W_GetNumForName("COLORMAP")) { LevelUseFullBright = true; } else { // Probably fog ... don't use fullbright sprites LevelUseFullBright = false; }// preload graphics if (precache) R_PrecacheLevel (); // Check if the level is a lightning level P_InitLightning(); S_StopAllSound(); SN_StopAllSequences(); S_StartSong(gamemap, true);//printf ("free memory: 0x%x\n", Z_FreeMemory());}//==========================================================================//// InitMapInfo////==========================================================================static void InitMapInfo(void){ int map; int mapMax; int mcmdValue; mapInfo_t *info; char songMulch[10]; mapMax = 1; // Put defaults into MapInfo[0] info = MapInfo; info->cluster = 0; info->warpTrans = 0; info->nextMap = 1; // Always go to map 1 if not specified info->cdTrack = 1; info->sky1Texture = R_TextureNumForName(DEFAULT_SKY_NAME); info->sky2Texture = info->sky1Texture; info->sky1ScrollDelta = 0; info->sky2ScrollDelta = 0; info->doubleSky = false; info->lightning = false; info->fadetable = W_GetNumForName(DEFAULT_FADE_TABLE); strcpy(info->name, UNKNOWN_MAP_NAME);// strcpy(info->songLump, DEFAULT_SONG_LUMP); SC_Open(MAPINFO_SCRIPT_NAME); while(SC_GetString()) { if(SC_Compare("MAP") == false) { SC_ScriptError(NULL); } SC_MustGetNumber(); if(sc_Number < 1 || sc_Number > 99) { // SC_ScriptError(NULL); } map = sc_Number; info = &MapInfo[map]; // Save song lump name strcpy(songMulch, info->songLump); // Copy defaults to current map definition memcpy(info, &MapInfo[0], sizeof(*info)); // Restore song lump name strcpy(info->songLump, songMulch); // The warp translation defaults to the map number info->warpTrans = map; // Map name must follow the number SC_MustGetString(); strcpy(info->name, sc_String); // Process optional tokens while(SC_GetString()) { if(SC_Compare("MAP")) { // Start next map definition SC_UnGet(); break; } mcmdValue = MapCmdIDs[SC_MustMatchString(MapCmdNames)]; switch(mcmdValue) { case MCMD_CLUSTER: SC_MustGetNumber(); info->cluster = sc_Number; break; case MCMD_WARPTRANS: SC_MustGetNumber(); info->warpTrans = sc_Number; break; case MCMD_NEXT: SC_MustGetNumber(); info->nextMap = sc_Number; break; case MCMD_CDTRACK: SC_MustGetNumber(); info->cdTrack = sc_Number; break; case MCMD_SKY1: SC_MustGetString(); info->sky1Texture = R_TextureNumForName(sc_String); SC_MustGetNumber(); info->sky1ScrollDelta = sc_Number<<8; break; case MCMD_SKY2: SC_MustGetString(); info->sky2Texture = R_TextureNumForName(sc_String); SC_MustGetNumber(); info->sky2ScrollDelta = sc_Number<<8; break; case MCMD_DOUBLESKY: info->doubleSky = true; break; case MCMD_LIGHTNING: info->lightning = true; break; case MCMD_FADETABLE: SC_MustGetString(); info->fadetable = W_GetNumForName(sc_String); break; case MCMD_CD_STARTTRACK: case MCMD_CD_END1TRACK: case MCMD_CD_END2TRACK: case MCMD_CD_END3TRACK: case MCMD_CD_INTERTRACK: case MCMD_CD_TITLETRACK: SC_MustGetNumber(); cd_NonLevelTracks[mcmdValue-MCMD_CD_STARTTRACK] = sc_Number; break; } } mapMax = map > mapMax ? map : mapMax; } SC_Close(); MapCount = mapMax;}//==========================================================================//// P_GetMapCluster////==========================================================================int P_GetMapCluster(int map){ return MapInfo[QualifyMap(map)].cluster;}//==========================================================================//// P_GetMapCDTrack////==========================================================================int P_GetMapCDTrack(int map){ return MapInfo[QualifyMap(map)].cdTrack;}//==========================================================================//// P_GetMapWarpTrans////==========================================================================int P_GetMapWarpTrans(int map){ return MapInfo[QualifyMap(map)].warpTrans;}//==========================================================================//// P_GetMapNextMap////==========================================================================int P_GetMapNextMap(int map){ return MapInfo[QualifyMap(map)].nextMap;}//==========================================================================//// P_TranslateMap//// Returns the actual map number given a warp map number.////==========================================================================int P_TranslateMap(int map){ int i; for(i = 1; i < 99; i++) // Make this a macro { if(MapInfo[i].warpTrans == map) { return i; } } // Not found return -1;}//==========================================================================//// P_GetMapSky1Texture////==========================================================================int P_GetMapSky1Texture(int map){ return MapInfo[QualifyMap(map)].sky1Texture;}//==========================================================================//// P_GetMapSky2Texture////==========================================================================int P_GetMapSky2Texture(int map){ return MapInfo[QualifyMap(map)].sky2Texture;}//==========================================================================//// P_GetMapName////==========================================================================char *P_GetMapName(int map){ return MapInfo[QualifyMap(map)].name;}//==========================================================================//// P_GetMapSky1ScrollDelta////==========================================================================fixed_t P_GetMapSky1ScrollDelta(int map){ return MapInfo[QualifyMap(map)].sky1ScrollDelta;}//==========================================================================//// P_GetMapSky2ScrollDelta////==========================================================================fixed_t P_GetMapSky2ScrollDelta(int map){ return MapInfo[QualifyMap(map)].sky2ScrollDelta;}//==========================================================================//// P_GetMapDoubleSky////==========================================================================boolean P_GetMapDoubleSky(int map){ return MapInfo[QualifyMap(map)].doubleSky;}//==========================================================================//// P_GetMapLightning////==========================================================================boolean P_GetMapLightning(int map){ return MapInfo[QualifyMap(map)].lightning;}//==========================================================================//// P_GetMapFadeTable////==========================================================================boolean P_GetMapFadeTable(int map){ return MapInfo[QualifyMap(map)].fadetable;}//==========================================================================//// P_GetMapSongLump////==========================================================================char *P_GetMapSongLump(int map){ if(!strcasecmp(MapInfo[QualifyMap(map)].songLump, DEFAULT_SONG_LUMP)) { return NULL; } else { return MapInfo[QualifyMap(map)].songLump; }}//==========================================================================//// P_PutMapSongLump////==========================================================================void P_PutMapSongLump(int map, char *lumpName){ if(map < 1 || map > MapCount) { return; } strcpy(MapInfo[map].songLump, lumpName);}//==========================================================================//// P_GetCDStartTrack////==========================================================================int P_GetCDStartTrack(void){ return cd_NonLevelTracks[MCMD_CD_STARTTRACK-MCMD_CD_STARTTRACK];}//==========================================================================//// P_GetCDEnd1Track////==========================================================================int P_GetCDEnd1Track(void){ return cd_NonLevelTracks[MCMD_CD_END1TRACK-MCMD_CD_STARTTRACK];}//==========================================================================//// P_GetCDEnd2Track////==========================================================================int P_GetCDEnd2Track(void){ return cd_NonLevelTracks[MCMD_CD_END2TRACK-MCMD_CD_STARTTRACK];}//==========================================================================//// P_GetCDEnd3Track////==========================================================================int P_GetCDEnd3Track(void){ return cd_NonLevelTracks[MCMD_CD_END3TRACK-MCMD_CD_STARTTRACK];}//==========================================================================//// P_GetCDIntermissionTrack////==========================================================================int P_GetCDIntermissionTrack(void){ return cd_NonLevelTracks[MCMD_CD_INTERTRACK-MCMD_CD_STARTTRACK];}//==========================================================================//// P_GetCDTitleTrack////==========================================================================int P_GetCDTitleTrack(void){ return cd_NonLevelTracks[MCMD_CD_TITLETRACK-MCMD_CD_STARTTRACK];}//==========================================================================//// QualifyMap////==========================================================================static int QualifyMap(int map){ return (map < 1 || map > MapCount) ? 0 : map;}//==========================================================================//// P_Init////==========================================================================void P_Init(void){ InitMapInfo(); P_InitSwitchList(); P_InitFTAnims(); // Init flat and texture animations P_InitTerrainTypes(); P_InitLava(); R_InitSprites(sprnames);}// Special early initializer needed to start sound before R_Init()void InitMapMusicInfo(void){ int i; for (i=0; i<99; i++) { strcpy(MapInfo[i].songLump, DEFAULT_SONG_LUMP); } MapCount = 98;}/*void My_Debug(void){ int i; printf("My debug stuff ----------------------\n"); printf("gamemap=%d\n",gamemap); for (i=0; i<10; i++) { printf("i=%d songlump=%s\n",i,MapInfo[i].songLump); }}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -