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

📄 p_mobj.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 2 页
字号:
    memset (mobj, 0, sizeof (*mobj));    info = &mobjinfo[type];	    mobj->type = type;    mobj->info = info;    mobj->x = x;    mobj->y = y;    mobj->radius = info->radius;    mobj->height = info->height;    mobj->flags = info->flags;    mobj->health = info->spawnhealth;    if (gameskill != sk_nightmare)	mobj->reactiontime = info->reactiontime;        mobj->lastlook = P_Random () % MAXPLAYERS;    // do not set the state with P_SetMobjState,    // because action routines can not be called yet    st = &states[info->spawnstate];    mobj->state = st;    mobj->tics = st->tics;    mobj->sprite = st->sprite;    mobj->frame = st->frame;    // set subsector and/or block links    P_SetThingPosition (mobj);	    mobj->floorz = mobj->subsector->sector->floorheight;    mobj->ceilingz = mobj->subsector->sector->ceilingheight;    if (z == ONFLOORZ)	mobj->z = mobj->floorz;    else if (z == ONCEILINGZ)	mobj->z = mobj->ceilingz - mobj->info->height;    else 	mobj->z = z;    mobj->thinker.function.acp1 = (actionf_p1)P_MobjThinker;	    P_AddThinker (&mobj->thinker);    return mobj;}//// P_RemoveMobj//mapthing_t	itemrespawnque[ITEMQUESIZE];int		itemrespawntime[ITEMQUESIZE];int		iquehead;int		iquetail;void P_RemoveMobj (mobj_t* mobj){    if ((mobj->flags & MF_SPECIAL)	&& !(mobj->flags & MF_DROPPED)	&& (mobj->type != MT_INV)	&& (mobj->type != MT_INS))    {	itemrespawnque[iquehead] = mobj->spawnpoint;	itemrespawntime[iquehead] = leveltime;	iquehead = (iquehead+1)&(ITEMQUESIZE-1);	// lose one off the end?	if (iquehead == iquetail)	    iquetail = (iquetail+1)&(ITEMQUESIZE-1);    }	    // unlink from sector and block lists    P_UnsetThingPosition (mobj);        // stop any playing sound    S_StopSound (mobj);        // free block    P_RemoveThinker ((thinker_t*)mobj);}//// P_RespawnSpecials//void P_RespawnSpecials (void){    fixed_t		x;    fixed_t		y;    fixed_t		z;        subsector_t*	ss;     mobj_t*		mo;    mapthing_t*		mthing;        int			i;    // only respawn items in deathmatch    if (deathmatch != 2)	return;	//     // nothing left to respawn?    if (iquehead == iquetail)	return;		    // wait at least 30 seconds    if (leveltime - itemrespawntime[iquetail] < 30*35)	return;			    mthing = &itemrespawnque[iquetail];	    x = mthing->x << FRACBITS;     y = mthing->y << FRACBITS; 	      // spawn a teleport fog at the new spot    ss = R_PointInSubsector (x,y);     mo = P_SpawnMobj (x, y, ss->sector->floorheight , MT_IFOG);     S_StartSound (mo, sfx_itmbk);    // find which type to spawn    for (i=0 ; i< NUMMOBJTYPES ; i++)    {	if (mthing->type == mobjinfo[i].doomednum)	    break;    }        // spawn it    if (mobjinfo[i].flags & MF_SPAWNCEILING)	z = ONCEILINGZ;    else	z = ONFLOORZ;    mo = P_SpawnMobj (x,y,z, i);    mo->spawnpoint = *mthing;	    mo->angle = ANG45 * (mthing->angle/45);    // pull it from the que    iquetail = (iquetail+1)&(ITEMQUESIZE-1);}//// P_SpawnPlayer// Called when a player is spawned on the level.// Most of the player structure stays unchanged//  between levels.//void P_SpawnPlayer (mapthing_t* mthing){    player_t*		p;    fixed_t		x;    fixed_t		y;    fixed_t		z;    mobj_t*		mobj;    int			i;    // not playing?    if (!playeringame[mthing->type-1])	return;							    p = &players[mthing->type-1];    if (p->playerstate == PST_REBORN)	G_PlayerReborn (mthing->type-1);    x 		= mthing->x << FRACBITS;    y 		= mthing->y << FRACBITS;    z		= ONFLOORZ;    mobj	= P_SpawnMobj (x,y,z, MT_PLAYER);    // set color translations for player sprites    if (mthing->type > 1)			mobj->flags |= (mthing->type-1)<<MF_TRANSSHIFT;		    mobj->angle	= ANG45 * (mthing->angle/45);    mobj->player = p;    mobj->health = p->health;    p->mo = mobj;    p->playerstate = PST_LIVE;	    p->refire = 0;    p->message = NULL;    p->damagecount = 0;    p->bonuscount = 0;    p->extralight = 0;    p->fixedcolormap = 0;    p->viewheight = VIEWHEIGHT;    // setup gun psprite    P_SetupPsprites (p);        // give all cards in death match mode    if (deathmatch)	for (i=0 ; i<NUMCARDS ; i++)	    p->cards[i] = true;			    if (mthing->type-1 == consoleplayer)    {	// wake up the status bar	ST_Start ();	// wake up the heads up text	HU_Start ();		    }}//// P_SpawnMapThing// The fields of the mapthing should// already be in host byte order.//void P_SpawnMapThing (mapthing_t* mthing){    int			i;    int			bit;    mobj_t*		mobj;    fixed_t		x;    fixed_t		y;    fixed_t		z;		    // count deathmatch start positions    if (mthing->type == 11)    {	if (deathmatch_p < &deathmatchstarts[10])	{	    memcpy (deathmatch_p, mthing, sizeof(*mthing));	    deathmatch_p++;	}	return;    }	    // check for players specially    if (mthing->type <= 4)    {	// save spots for respawning in network games	playerstarts[mthing->type-1] = *mthing;	if (!deathmatch)	    P_SpawnPlayer (mthing);	return;    }    // check for apropriate skill level    if (!netgame && (mthing->options & 16) )	return;		    if (gameskill == sk_baby)	bit = 1;    else if (gameskill == sk_nightmare)	bit = 4;    else	bit = 1<<(gameskill-1);    if (!(mthing->options & bit) )	return;	    // find which type to spawn    for (i=0 ; i< NUMMOBJTYPES ; i++)	if (mthing->type == mobjinfo[i].doomednum)	    break;	    if (i==NUMMOBJTYPES)	I_Error ("P_SpawnMapThing: Unknown type %i at (%i, %i)",		 mthing->type,		 mthing->x, mthing->y);		    // don't spawn keycards and players in deathmatch    if (deathmatch && mobjinfo[i].flags & MF_NOTDMATCH)	return;		    // don't spawn any monsters if -nomonsters    if (nomonsters	&& ( i == MT_SKULL	     || (mobjinfo[i].flags & MF_COUNTKILL)) )    {	return;    }        // spawn it    x = mthing->x << FRACBITS;    y = mthing->y << FRACBITS;    if (mobjinfo[i].flags & MF_SPAWNCEILING)	z = ONCEILINGZ;    else	z = ONFLOORZ;        mobj = P_SpawnMobj (x,y,z, i);    mobj->spawnpoint = *mthing;    if (mobj->tics > 0)	mobj->tics = 1 + (P_Random () % mobj->tics);    if (mobj->flags & MF_COUNTKILL)	totalkills++;    if (mobj->flags & MF_COUNTITEM)	totalitems++;		    mobj->angle = ANG45 * (mthing->angle/45);    if (mthing->options & MTF_AMBUSH)	mobj->flags |= MF_AMBUSH;}//// GAME SPAWN FUNCTIONS////// P_SpawnPuff//extern fixed_t attackrange;voidP_SpawnPuff( fixed_t	x,  fixed_t	y,  fixed_t	z ){    mobj_t*	th;	    z += ((P_Random()-P_Random())<<10);    th = P_SpawnMobj (x,y,z, MT_PUFF);    th->momz = FRACUNIT;    th->tics -= P_Random()&3;    if (th->tics < 1)	th->tics = 1;	    // don't make punches spark on the wall    if (attackrange == MELEERANGE)	P_SetMobjState (th, S_PUFF3);}//// P_SpawnBlood// voidP_SpawnBlood( fixed_t	x,  fixed_t	y,  fixed_t	z,  int		damage ){    mobj_t*	th;	    z += ((P_Random()-P_Random())<<10);    th = P_SpawnMobj (x,y,z, MT_BLOOD);    th->momz = FRACUNIT*2;    th->tics -= P_Random()&3;    if (th->tics < 1)	th->tics = 1;		    if (damage <= 12 && damage >= 9)	P_SetMobjState (th,S_BLOOD2);    else if (damage < 9)	P_SetMobjState (th,S_BLOOD3);}//// P_CheckMissileSpawn// Moves the missile forward a bit//  and possibly explodes it right there.//void P_CheckMissileSpawn (mobj_t* th){    th->tics -= P_Random()&3;    if (th->tics < 1)	th->tics = 1;        // move a little forward so an angle can    // be computed if it immediately explodes    th->x += (th->momx>>1);    th->y += (th->momy>>1);    th->z += (th->momz>>1);    if (!P_TryMove (th, th->x, th->y))	P_ExplodeMissile (th);}//// P_SpawnMissile//mobj_t*P_SpawnMissile( mobj_t*	source,  mobj_t*	dest,  mobjtype_t	type ){    mobj_t*	th;    angle_t	an;    int		dist;    th = P_SpawnMobj (source->x,		      source->y,		      source->z + 4*8*FRACUNIT, type);        if (th->info->seesound)	S_StartSound (th, th->info->seesound);    th->target = source;	// where it came from    an = R_PointToAngle2 (source->x, source->y, dest->x, dest->y);	    // fuzzy player    if (dest->flags & MF_SHADOW)	an += (P_Random()-P_Random())<<20;	    th->angle = an;    an >>= ANGLETOFINESHIFT;    th->momx = FixedMul (th->info->speed, finecosine[an]);    th->momy = FixedMul (th->info->speed, finesine[an]);	    dist = P_AproxDistance (dest->x - source->x, dest->y - source->y);    dist = dist / th->info->speed;    if (dist < 1)	dist = 1;    th->momz = (dest->z - source->z) / dist;    P_CheckMissileSpawn (th);	    return th;}//// P_SpawnPlayerMissile// Tries to aim at a nearby monster//voidP_SpawnPlayerMissile( mobj_t*	source,  mobjtype_t	type ){    mobj_t*	th;    angle_t	an;        fixed_t	x;    fixed_t	y;    fixed_t	z;    fixed_t	slope;        // see which target is to be aimed at    an = source->angle;    slope = P_AimLineAttack (source, an, 16*64*FRACUNIT);        if (!linetarget)    {	an += 1<<26;	slope = P_AimLineAttack (source, an, 16*64*FRACUNIT);	if (!linetarget)	{	    an -= 2<<26;	    slope = P_AimLineAttack (source, an, 16*64*FRACUNIT);	}	if (!linetarget)	{	    an = source->angle;	    slope = 0;	}    }		    x = source->x;    y = source->y;    z = source->z + 4*8*FRACUNIT;	    th = P_SpawnMobj (x,y,z, type);    if (th->info->seesound)	S_StartSound (th, th->info->seesound);    th->target = source;    th->angle = an;    th->momx = FixedMul( th->info->speed,			 finecosine[an>>ANGLETOFINESHIFT]);    th->momy = FixedMul( th->info->speed,			 finesine[an>>ANGLETOFINESHIFT]);    th->momz = FixedMul( th->info->speed, slope);    P_CheckMissileSpawn (th);}

⌨️ 快捷键说明

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