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

📄 p_mobj.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: p_mobj.c,v 1.2 2003/09/08 22:34:29 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_mobj.c,v $// Revision 1.2  2003/09/08 22:34:29  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:53  jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION://	Moving object handling. Spawn functions.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: p_mobj.c,v 1.2 2003/09/08 22:34:29 jasonk Exp $";#include "i_system.h"#include "z_zone.h"#include "m_random.h"#include "doomdef.h"#include "p_local.h"#include "sounds.h"#include "st_stuff.h"#include "hu_stuff.h"#include "s_sound.h"#include "doomstat.h"void G_PlayerReborn (int player);void P_SpawnMapThing (mapthing_t*	mthing);//// P_SetMobjState// Returns true if the mobj is still present.//int test;booleanP_SetMobjState( mobj_t*	mobj,  statenum_t	state ){    state_t*	st;    do    {	if (state == S_NULL)	{	    mobj->state = (state_t *) S_NULL;	    P_RemoveMobj (mobj);	    return false;	}	st = &states[state];	mobj->state = st;	mobj->tics = st->tics;	mobj->sprite = st->sprite;	mobj->frame = st->frame;	// Modified handling.	// Call action functions when the state is set	if (st->action.acp1)			    st->action.acp1(mobj);			state = st->nextstate;    } while (!mobj->tics);				    return true;}//// P_ExplodeMissile  //void P_ExplodeMissile (mobj_t* mo){    mo->momx = mo->momy = mo->momz = 0;    P_SetMobjState (mo, mobjinfo[mo->type].deathstate);    mo->tics -= P_Random()&3;    if (mo->tics < 1)	mo->tics = 1;    mo->flags &= ~MF_MISSILE;    if (mo->info->deathsound)	S_StartSound (mo, mo->info->deathsound);}//// P_XYMovement  //#define STOPSPEED		0x1000#define FRICTION		0xe800void P_XYMovement (mobj_t* mo) { 	    fixed_t 	ptryx;    fixed_t	ptryy;    player_t*	player;    fixed_t	xmove;    fixed_t	ymove;			    if (!mo->momx && !mo->momy)    {	if (mo->flags & MF_SKULLFLY)	{	    // the skull slammed into something	    mo->flags &= ~MF_SKULLFLY;	    mo->momx = mo->momy = mo->momz = 0;	    P_SetMobjState (mo, mo->info->spawnstate);	}	return;    }	    player = mo->player;		    if (mo->momx > MAXMOVE)	mo->momx = MAXMOVE;    else if (mo->momx < -MAXMOVE)	mo->momx = -MAXMOVE;    if (mo->momy > MAXMOVE)	mo->momy = MAXMOVE;    else if (mo->momy < -MAXMOVE)	mo->momy = -MAXMOVE;		    xmove = mo->momx;    ymove = mo->momy;	    do    {	if (xmove > MAXMOVE/2 || ymove > MAXMOVE/2)	{	    ptryx = mo->x + xmove/2;	    ptryy = mo->y + ymove/2;	    xmove >>= 1;	    ymove >>= 1;	}	else	{	    ptryx = mo->x + xmove;	    ptryy = mo->y + ymove;	    xmove = ymove = 0;	}			if (!P_TryMove (mo, ptryx, ptryy))	{	    // blocked move	    if (mo->player)	    {	// try to slide along it		P_SlideMove (mo);	    }	    else if (mo->flags & MF_MISSILE)	    {		// explode a missile		if (ceilingline &&		    ceilingline->backsector &&		    ceilingline->backsector->ceilingpic == skyflatnum)		{		    // Hack to prevent missiles exploding		    // against the sky.		    // Does not handle sky floors.		    P_RemoveMobj (mo);		    return;		}		P_ExplodeMissile (mo);	    }	    else		mo->momx = mo->momy = 0;	}    } while (xmove || ymove);        // slow down    if (player && player->cheats & CF_NOMOMENTUM)    {	// debug option for no sliding at all	mo->momx = mo->momy = 0;	return;    }    if (mo->flags & (MF_MISSILE | MF_SKULLFLY) )	return; 	// no friction for missiles ever		    if (mo->z > mo->floorz)	return;		// no friction when airborne    if (mo->flags & MF_CORPSE)    {	// do not stop sliding	//  if halfway off a step with some momentum	if (mo->momx > FRACUNIT/4	    || mo->momx < -FRACUNIT/4	    || mo->momy > FRACUNIT/4	    || mo->momy < -FRACUNIT/4)	{	    if (mo->floorz != mo->subsector->sector->floorheight)		return;	}    }    if (mo->momx > -STOPSPEED	&& mo->momx < STOPSPEED	&& mo->momy > -STOPSPEED	&& mo->momy < STOPSPEED	&& (!player	    || (player->cmd.forwardmove== 0		&& player->cmd.sidemove == 0 ) ) )    {	// if in a walking frame, stop moving	if ( player&&(unsigned)((player->mo->state - states)- S_PLAY_RUN1) < 4)	    P_SetMobjState (player->mo, S_PLAY);		mo->momx = 0;	mo->momy = 0;    }    else    {	mo->momx = FixedMul (mo->momx, FRICTION);	mo->momy = FixedMul (mo->momy, FRICTION);    }}//// P_ZMovement//void P_ZMovement (mobj_t* mo){    fixed_t	dist;    fixed_t	delta;        // check for smooth step up    if (mo->player && mo->z < mo->floorz)    {	mo->player->viewheight -= mo->floorz-mo->z;	mo->player->deltaviewheight	    = (VIEWHEIGHT - mo->player->viewheight)>>3;    }        // adjust height    mo->z += mo->momz;	    if ( mo->flags & MF_FLOAT	 && mo->target)    {	// float down towards target if too close	if ( !(mo->flags & MF_SKULLFLY)	     && !(mo->flags & MF_INFLOAT) )	{	    dist = P_AproxDistance (mo->x - mo->target->x,				    mo->y - mo->target->y);	    	    delta =(mo->target->z + (mo->height>>1)) - mo->z;	    if (delta<0 && dist < -(delta*3) )		mo->z -= FLOATSPEED;	    else if (delta>0 && dist < (delta*3) )		mo->z += FLOATSPEED;				}	    }        // clip movement    if (mo->z <= mo->floorz)    {	// hit the floor	// Note (id):	//  somebody left this after the setting momz to 0,	//  kinda useless there.	if (mo->flags & MF_SKULLFLY)	{	    // the skull slammed into something	    mo->momz = -mo->momz;	}		if (mo->momz < 0)	{	    if (mo->player		&& mo->momz < -GRAVITY*8)		    {		// Squat down.		// Decrease viewheight for a moment		// after hitting the ground (hard),		// and utter appropriate sound.		mo->player->deltaviewheight = mo->momz>>3;		S_StartSound (mo, sfx_oof);	    }	    mo->momz = 0;	}	mo->z = mo->floorz;	if ( (mo->flags & MF_MISSILE)	     && !(mo->flags & MF_NOCLIP) )	{	    P_ExplodeMissile (mo);	    return;	}    }    else if (! (mo->flags & MF_NOGRAVITY) )    {	if (mo->momz == 0)	    mo->momz = -GRAVITY*2;	else	    mo->momz -= GRAVITY;    }	    if (mo->z + mo->height > mo->ceilingz)    {	// hit the ceiling	if (mo->momz > 0)	    mo->momz = 0;	{	    mo->z = mo->ceilingz - mo->height;	}	if (mo->flags & MF_SKULLFLY)	{	// the skull slammed into something	    mo->momz = -mo->momz;	}		if ( (mo->flags & MF_MISSILE)	     && !(mo->flags & MF_NOCLIP) )	{	    P_ExplodeMissile (mo);	    return;	}    }} //// P_NightmareRespawn//voidP_NightmareRespawn (mobj_t* mobj){    fixed_t		x;    fixed_t		y;    fixed_t		z;     subsector_t*	ss;     mobj_t*		mo;    mapthing_t*		mthing;		    x = mobj->spawnpoint.x << FRACBITS;     y = mobj->spawnpoint.y << FRACBITS;     // somthing is occupying it's position?    if (!P_CheckPosition (mobj, x, y) ) 	return;	// no respwan    // spawn a teleport fog at old spot    // because of removal of the body?    mo = P_SpawnMobj (mobj->x,		      mobj->y,		      mobj->subsector->sector->floorheight , MT_TFOG);     // initiate teleport sound    S_StartSound (mo, sfx_telept);    // spawn a teleport fog at the new spot    ss = R_PointInSubsector (x,y);     mo = P_SpawnMobj (x, y, ss->sector->floorheight , MT_TFOG);     S_StartSound (mo, sfx_telept);    // spawn the new monster    mthing = &mobj->spawnpoint;	    // spawn it    if (mobj->info->flags & MF_SPAWNCEILING)	z = ONCEILINGZ;    else	z = ONFLOORZ;    // inherit attributes from deceased one    mo = P_SpawnMobj (x,y,z, mobj->type);    mo->spawnpoint = mobj->spawnpoint;	    mo->angle = ANG45 * (mthing->angle/45);    if (mthing->options & MTF_AMBUSH)	mo->flags |= MF_AMBUSH;    mo->reactiontime = 18;	    // remove the old monster,    P_RemoveMobj (mobj);}//// P_MobjThinker//void P_MobjThinker (mobj_t* mobj){    // momentum movement    if (mobj->momx	|| mobj->momy	|| (mobj->flags&MF_SKULLFLY) )    {	P_XYMovement (mobj);	// FIXME: decent NOP/NULL/Nil function pointer please.	if (mobj->thinker.function.acv == (actionf_v) (-1))	    return;		// mobj was removed    }    if ( (mobj->z != mobj->floorz)	 || mobj->momz )    {	P_ZMovement (mobj);		// FIXME: decent NOP/NULL/Nil function pointer please.	if (mobj->thinker.function.acv == (actionf_v) (-1))	    return;		// mobj was removed    }        // cycle through states,    // calling action functions at transitions    if (mobj->tics != -1)    {	mobj->tics--;			// you can cycle through multiple states in a tic	if (!mobj->tics)	    if (!P_SetMobjState (mobj, mobj->state->nextstate) )		return;		// freed itself    }    else    {	// check for nightmare respawn	if (! (mobj->flags & MF_COUNTKILL) )	    return;	if (!respawnmonsters)	    return;	mobj->movecount++;	if (mobj->movecount < 12*35)	    return;	if ( leveltime&31 )	    return;	if (P_Random () > 4)	    return;	P_NightmareRespawn (mobj);    }}//// P_SpawnMobj//mobj_t*P_SpawnMobj( fixed_t	x,  fixed_t	y,  fixed_t	z,  mobjtype_t	type ){    mobj_t*	mobj;    state_t*	st;    mobjinfo_t*	info;	    mobj = Z_Malloc (sizeof(*mobj), PU_LEVEL, NULL);

⌨️ 快捷键说明

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