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

📄 p_telept.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
字号:
//**************************************************************************//**//** p_telept.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: p_telept.c,v $//** $Revision: 1.13 $//** $Date: 95/10/08 04:23:24 $//** $Author: paul $//**//**************************************************************************// HEADER FILES ------------------------------------------------------------#include "h2def.h"#include "p_local.h"#include "soundst.h"// MACROS ------------------------------------------------------------------// TYPES -------------------------------------------------------------------// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------// EXTERNAL DATA DECLARATIONS ----------------------------------------------// PUBLIC DATA DEFINITIONS -------------------------------------------------// PRIVATE DATA DEFINITIONS ------------------------------------------------// CODE --------------------------------------------------------------------//==========================================================================//// P_Teleport////==========================================================================boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, angle_t angle,	boolean useFog){	fixed_t oldx;	fixed_t oldy;	fixed_t oldz;	fixed_t aboveFloor;	fixed_t fogDelta;	player_t *player;	unsigned an;	mobj_t *fog;	oldx = thing->x;	oldy = thing->y;	oldz = thing->z;	aboveFloor = thing->z-thing->floorz;	if(!P_TeleportMove(thing, x, y))	{		return false;	}	if(thing->player)	{		player = thing->player;		if(player->powers[pw_flight] && aboveFloor)		{			thing->z = thing->floorz+aboveFloor;			if(thing->z+thing->height > thing->ceilingz)			{				thing->z = thing->ceilingz-thing->height;			}			player->viewz = thing->z+player->viewheight;		}		else		{			thing->z = thing->floorz;			player->viewz = thing->z+player->viewheight;			if(useFog)			{				player->lookdir = 0;			}		}	}	else if(thing->flags&MF_MISSILE)	{		thing->z = thing->floorz+aboveFloor;		if(thing->z+thing->height > thing->ceilingz)		{			thing->z = thing->ceilingz-thing->height;		}	}	else	{		thing->z = thing->floorz;	}	// Spawn teleport fog at source and destination	if(useFog)	{		fogDelta = thing->flags&MF_MISSILE ? 0 : TELEFOGHEIGHT;		fog = P_SpawnMobj(oldx, oldy, oldz+fogDelta, MT_TFOG);		S_StartSound(fog, SFX_TELEPORT);		an = angle>>ANGLETOFINESHIFT;		fog = P_SpawnMobj(x+20*finecosine[an],			y+20*finesine[an], thing->z+fogDelta, MT_TFOG);		S_StartSound(fog, SFX_TELEPORT);		if(thing->player && !thing->player->powers[pw_speed])		{ // Freeze player for about .5 sec			thing->reactiontime = 18;		}		thing->angle = angle;	}	if(thing->flags2&MF2_FLOORCLIP)	{		if(thing->z == thing->subsector->sector->floorheight 			&& P_GetThingFloorType(thing) > FLOOR_SOLID)		{			thing->floorclip = 10*FRACUNIT;		}		else		{			thing->floorclip = 0;		}	}	if(thing->flags&MF_MISSILE)	{		angle >>= ANGLETOFINESHIFT;		thing->momx = FixedMul(thing->info->speed, finecosine[angle]);		thing->momy = FixedMul(thing->info->speed, finesine[angle]);	}	else if(useFog) // no fog doesn't alter the player's momentums	{		thing->momx = thing->momy = thing->momz = 0;	}	return true;}//==========================================================================//// EV_Teleport////==========================================================================boolean EV_Teleport(int tid, mobj_t *thing, boolean fog){	int i;	int count;	mobj_t *mo;	int searcher;	if(!thing)	{ // Teleport function called with an invalid mobj		return false;	}	if(thing->flags2&MF2_NOTELEPORT)	{		return false;	}	count = 0;	searcher = -1;	while(P_FindMobjFromTID(tid, &searcher) != NULL)	{		count++;	}	if(count == 0)	{		return false;	}	count = 1+(P_Random()%count);	searcher = -1;	for(i = 0; i < count; i++)	{		mo = P_FindMobjFromTID(tid, &searcher);	}	if (!mo) I_Error("Can't find teleport mapspot\n");	return P_Teleport(thing, mo->x, mo->y, mo->angle, fog);}

⌨️ 快捷键说明

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