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

📄 p_inter.c

📁 Nxdoom真的满好用的
💻 C
📖 第 1 页 / 共 2 页
字号:
	P_GiveCard (player, it_yellowskull);	if (!netgame)	    break;	return;	      case SPR_RSKU:	if (!player->cards[it_redskull])	    player->message = GOTREDSKULL;	P_GiveCard (player, it_redskull);	if (!netgame)	    break;	return;		// medikits, heals      case SPR_STIM:	if (!P_GiveBody (player, 10))	    return;	player->message = GOTSTIM;	break;	      case SPR_MEDI:	if (!P_GiveBody (player, 25))	    return;	if (player->health < 25)	    player->message = GOTMEDINEED;	else	    player->message = GOTMEDIKIT;	break;		// power ups      case SPR_PINV:	if (!P_GivePower (player, pw_invulnerability))	    return;	player->message = GOTINVUL;	sound = sfx_getpow;	break;	      case SPR_PSTR:	if (!P_GivePower (player, pw_strength))	    return;	player->message = GOTBERSERK;	if (player->readyweapon != wp_fist)	    player->pendingweapon = wp_fist;	sound = sfx_getpow;	break;	      case SPR_PINS:	if (!P_GivePower (player, pw_invisibility))	    return;	player->message = GOTINVIS;	sound = sfx_getpow;	break;	      case SPR_SUIT:	if (!P_GivePower (player, pw_ironfeet))	    return;	player->message = GOTSUIT;	sound = sfx_getpow;	break;	      case SPR_PMAP:	if (!P_GivePower (player, pw_allmap))	    return;	player->message = GOTMAP;	sound = sfx_getpow;	break;	      case SPR_PVIS:	if (!P_GivePower (player, pw_infrared))	    return;	player->message = GOTVISOR;	sound = sfx_getpow;	break;		// ammo      case SPR_CLIP:	if (special->flags & MF_DROPPED)	{	    if (!P_GiveAmmo (player,am_clip,0))		return;	}	else	{	    if (!P_GiveAmmo (player,am_clip,1))		return;	}	player->message = GOTCLIP;	break;	      case SPR_AMMO:	if (!P_GiveAmmo (player, am_clip,5))	    return;	player->message = GOTCLIPBOX;	break;	      case SPR_ROCK:	if (!P_GiveAmmo (player, am_misl,1))	    return;	player->message = GOTROCKET;	break;	      case SPR_BROK:	if (!P_GiveAmmo (player, am_misl,5))	    return;	player->message = GOTROCKBOX;	break;	      case SPR_CELL:	if (!P_GiveAmmo (player, am_cell,1))	    return;	player->message = GOTCELL;	break;	      case SPR_CELP:	if (!P_GiveAmmo (player, am_cell,5))	    return;	player->message = GOTCELLBOX;	break;	      case SPR_SHEL:	if (!P_GiveAmmo (player, am_shell,1))	    return;	player->message = GOTSHELLS;	break;	      case SPR_SBOX:	if (!P_GiveAmmo (player, am_shell,5))	    return;	player->message = GOTSHELLBOX;	break;	      case SPR_BPAK:	if (!player->backpack)	{	    for (i=0 ; i<NUMAMMO ; i++)		player->maxammo[i] *= 2;	    player->backpack = true;	}	for (i=0 ; i<NUMAMMO ; i++)	    P_GiveAmmo (player, i, 1);	player->message = GOTBACKPACK;	break;		// weapons      case SPR_BFUG:	if (!P_GiveWeapon (player, wp_bfg, false) )	    return;	player->message = GOTBFG9000;	sound = sfx_wpnup;		break;	      case SPR_MGUN:	if (!P_GiveWeapon (player, wp_chaingun, special->flags&MF_DROPPED) )	    return;	player->message = GOTCHAINGUN;	sound = sfx_wpnup;		break;	      case SPR_CSAW:	if (!P_GiveWeapon (player, wp_chainsaw, false) )	    return;	player->message = GOTCHAINSAW;	sound = sfx_wpnup;		break;	      case SPR_LAUN:	if (!P_GiveWeapon (player, wp_missile, false) )	    return;	player->message = GOTLAUNCHER;	sound = sfx_wpnup;		break;	      case SPR_PLAS:	if (!P_GiveWeapon (player, wp_plasma, false) )	    return;	player->message = GOTPLASMA;	sound = sfx_wpnup;		break;	      case SPR_SHOT:	if (!P_GiveWeapon (player, wp_shotgun, special->flags&MF_DROPPED ) )	    return;	player->message = GOTSHOTGUN;	sound = sfx_wpnup;		break;		      case SPR_SGN2:	if (!P_GiveWeapon (player, wp_supershotgun, special->flags&MF_DROPPED ) )	    return;	player->message = GOTSHOTGUN2;	sound = sfx_wpnup;		break;		      default:	I_Error ("P_SpecialThing: Unknown gettable thing");    }	    if (special->flags & MF_COUNTITEM)	player->itemcount++;    P_RemoveMobj (special);    player->bonuscount += BONUSADD;    if (player == &players[consoleplayer])	S_StartSound (NULL, sound);}//// KillMobj//voidP_KillMobj( mobj_t*	source,  mobj_t*	target ){    mobjtype_t	item;    mobj_t*	mo;	    target->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY);    if (target->type != MT_SKULL)	target->flags &= ~MF_NOGRAVITY;    target->flags |= MF_CORPSE|MF_DROPOFF;    target->height >>= 2;    if (source && source->player)    {	// count for intermission	if (target->flags & MF_COUNTKILL)	    source->player->killcount++;		if (target->player)	    source->player->frags[target->player-players]++;    }    else if (!netgame && (target->flags & MF_COUNTKILL) )    {	// count all monster deaths,	// even those caused by other monsters	players[0].killcount++;    }        if (target->player)    {	// count environment kills against you	if (!source)		    target->player->frags[target->player-players]++;				target->flags &= ~MF_SOLID;	target->player->playerstate = PST_DEAD;	P_DropWeapon (target->player);	if (target->player == &players[consoleplayer]	    && automapactive)	{	    // don't die in auto map,	    // switch view prior to dying	    AM_Stop ();	}	    }    if (target->health < -target->info->spawnhealth 	&& target->info->xdeathstate)    {	P_SetMobjState (target, target->info->xdeathstate);    }    else	P_SetMobjState (target, target->info->deathstate);    target->tics -= P_Random()&3;    if (target->tics < 1)	target->tics = 1;		    //	I_StartSound (&actor->r, actor->info->deathsound);    // Drop stuff.    // This determines the kind of object spawned    // during the death frame of a thing.    switch (target->type)    {      case MT_WOLFSS:      case MT_POSSESSED:	item = MT_CLIP;	break;	      case MT_SHOTGUY:	item = MT_SHOTGUN;	break;	      case MT_CHAINGUY:	item = MT_CHAINGUN;	break;	      default:	return;    }    mo = P_SpawnMobj (target->x,target->y,ONFLOORZ, item);    mo->flags |= MF_DROPPED;	// special versions of items}//// P_DamageMobj// Damages both enemies and players// "inflictor" is the thing that caused the damage//  creature or missile, can be NULL (slime, etc)// "source" is the thing to target after taking damage//  creature or NULL// Source and inflictor are the same for melee attacks.// Source can be NULL for slime, barrel explosions// and other environmental stuff.//voidP_DamageMobj( mobj_t*	target,  mobj_t*	inflictor,  mobj_t*	source,  int 		damage ){    unsigned	ang;    int		saved;    player_t*	player;    fixed_t	thrust;    int		temp;	    if ( !(target->flags & MF_SHOOTABLE) )	return;	// shouldn't happen...		    if (target->health <= 0)	return;    if ( target->flags & MF_SKULLFLY )    {	target->momx = target->momy = target->momz = 0;    }	    player = target->player;    if (player && gameskill == sk_baby)	damage >>= 1; 	// take half damage in trainer mode		    // Some close combat weapons should not    // inflict thrust and push the victim out of reach,    // thus kick away unless using the chainsaw.    if (inflictor	&& !(target->flags & MF_NOCLIP)	&& (!source	    || !source->player	    || source->player->readyweapon != wp_chainsaw))    {	ang = R_PointToAngle2 ( inflictor->x,				inflictor->y,				target->x,				target->y);			thrust = damage*(FRACUNIT>>3)*100/target->info->mass;	// make fall forwards sometimes	if ( damage < 40	     && damage > target->health	     && target->z - inflictor->z > 64*FRACUNIT	     && (P_Random ()&1) )	{	    ang += ANG180;	    thrust *= 4;	}			ang >>= ANGLETOFINESHIFT;	target->momx += FixedMul (thrust, finecosine[ang]);	target->momy += FixedMul (thrust, finesine[ang]);    }        // player specific    if (player)    {	// end of game hell hack	if (target->subsector->sector->special == 11	    && damage >= target->health)	{	    damage = target->health - 1;	}		// Below certain threshold,	// ignore damage in GOD mode, or with INVUL power.	if ( damage < 1000	     && ( (player->cheats&CF_GODMODE)		  || player->powers[pw_invulnerability] ) )	{	    return;	}		if (player->armortype)	{	    if (player->armortype == 1)		saved = damage/3;	    else		saved = damage/2;	    	    if (player->armorpoints <= saved)	    {		// armor is used up		saved = player->armorpoints;		player->armortype = 0;	    }	    player->armorpoints -= saved;	    damage -= saved;	}	player->health -= damage; 	// mirror mobj health here for Dave	if (player->health < 0)	    player->health = 0;		player->attacker = source;	player->damagecount += damage;	// add damage after armor / invuln	if (player->damagecount > 100)	    player->damagecount = 100;	// teleport stomp does 10k points...		temp = damage < 100 ? damage : 100;	if (player == &players[consoleplayer])	    I_Tactile (40,10,40+temp*2);    }        // do the damage	    target->health -= damage;	    if (target->health <= 0)    {	P_KillMobj (source, target);	return;    }    if ( (P_Random () < target->info->painchance)	 && !(target->flags&MF_SKULLFLY) )    {	target->flags |= MF_JUSTHIT;	// fight back!		P_SetMobjState (target, target->info->painstate);    }			    target->reactiontime = 0;		// we're awake now...	    if ( (!target->threshold || target->type == MT_VILE)	 && source && source != target	 && source->type != MT_VILE)    {	// if not intent on another player,	// chase after this one	target->target = source;	target->threshold = BASETHRESHOLD;	if (target->state == &states[target->info->spawnstate]	    && target->info->seestate != S_NULL)	    P_SetMobjState (target, target->info->seestate);    }			}

⌨️ 快捷键说明

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