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

📄 p_inter.c

📁 Nxdoom真的满好用的
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: p_inter.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_inter.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://	Handling interactions (i.e., collisions).////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: p_inter.c,v 1.2 2003/09/08 22:34:29 jasonk Exp $";// Data.#include "doomdef.h"#include "dstrings.h"#include "sounds.h"#include "doomstat.h"#include "m_random.h"#include "i_system.h"#include "am_map.h"#include "p_local.h"#include "s_sound.h"#ifdef __GNUG__#pragma implementation "p_inter.h"#endif#include "p_inter.h"#define BONUSADD	6// a weapon is found with two clip loads,// a big item has five clip loadsint	maxammo[NUMAMMO] = {200, 50, 300, 50};int	clipammo[NUMAMMO] = {10, 4, 20, 1};//// GET STUFF////// P_GiveAmmo// Num is the number of clip loads,// not the individual count (0= 1/2 clip).// Returns false if the ammo can't be picked up at all//booleanP_GiveAmmo( player_t*	player,  ammotype_t	ammo,  int		num ){    int		oldammo;	    if (ammo == am_noammo)	return false;		    if (ammo < 0 || ammo > NUMAMMO)	I_Error ("P_GiveAmmo: bad type %i", ammo);		    if ( player->ammo[ammo] == player->maxammo[ammo]  )	return false;		    if (num)	num *= clipammo[ammo];    else	num = clipammo[ammo]/2;        if (gameskill == sk_baby	|| gameskill == sk_nightmare)    {	// give double ammo in trainer mode,	// you'll need in nightmare	num <<= 1;    }    		    oldammo = player->ammo[ammo];    player->ammo[ammo] += num;    if (player->ammo[ammo] > player->maxammo[ammo])	player->ammo[ammo] = player->maxammo[ammo];    // If non zero ammo,     // don't change up weapons,    // player was lower on purpose.    if (oldammo)	return true;	    // We were down to zero,    // so select a new weapon.    // Preferences are not user selectable.    switch (ammo)    {      case am_clip:	if (player->readyweapon == wp_fist)	{	    if (player->weaponowned[wp_chaingun])		player->pendingweapon = wp_chaingun;	    else		player->pendingweapon = wp_pistol;	}	break;	      case am_shell:	if (player->readyweapon == wp_fist	    || player->readyweapon == wp_pistol)	{	    if (player->weaponowned[wp_shotgun])		player->pendingweapon = wp_shotgun;	}	break;	      case am_cell:	if (player->readyweapon == wp_fist	    || player->readyweapon == wp_pistol)	{	    if (player->weaponowned[wp_plasma])		player->pendingweapon = wp_plasma;	}	break;	      case am_misl:	if (player->readyweapon == wp_fist)	{	    if (player->weaponowned[wp_missile])		player->pendingweapon = wp_missile;	}      default:	break;    }	    return true;}//// P_GiveWeapon// The weapon name may have a MF_DROPPED flag ored in.//booleanP_GiveWeapon( player_t*	player,  weapontype_t	weapon,  boolean	dropped ){    boolean	gaveammo;    boolean	gaveweapon;	    if (netgame	&& (deathmatch!=2)	 && !dropped )    {	// leave placed weapons forever on net games	if (player->weaponowned[weapon])	    return false;	player->bonuscount += BONUSADD;	player->weaponowned[weapon] = true;	if (deathmatch)	    P_GiveAmmo (player, weaponinfo[weapon].ammo, 5);	else	    P_GiveAmmo (player, weaponinfo[weapon].ammo, 2);	player->pendingweapon = weapon;	if (player == &players[consoleplayer])	    S_StartSound (NULL, sfx_wpnup);	return false;    }	    if (weaponinfo[weapon].ammo != am_noammo)    {	// give one clip with a dropped weapon,	// two clips with a found weapon	if (dropped)	    gaveammo = P_GiveAmmo (player, weaponinfo[weapon].ammo, 1);	else	    gaveammo = P_GiveAmmo (player, weaponinfo[weapon].ammo, 2);    }    else	gaveammo = false;	    if (player->weaponowned[weapon])	gaveweapon = false;    else    {	gaveweapon = true;	player->weaponowned[weapon] = true;	player->pendingweapon = weapon;    }	    return (gaveweapon || gaveammo);} //// P_GiveBody// Returns false if the body isn't needed at all//booleanP_GiveBody( player_t*	player,  int		num ){    if (player->health >= MAXHEALTH)	return false;		    player->health += num;    if (player->health > MAXHEALTH)	player->health = MAXHEALTH;    player->mo->health = player->health;	    return true;}//// P_GiveArmor// Returns false if the armor is worse// than the current armor.//booleanP_GiveArmor( player_t*	player,  int		armortype ){    int		hits;	    hits = armortype*100;    if (player->armorpoints >= hits)	return false;	// don't pick up		    player->armortype = armortype;    player->armorpoints = hits;	    return true;}//// P_GiveCard//voidP_GiveCard( player_t*	player,  card_t	card ){    if (player->cards[card])	return;        player->bonuscount = BONUSADD;    player->cards[card] = 1;}//// P_GivePower//booleanP_GivePower( player_t*	player,  int /*powertype_t*/	power ){    if (power == pw_invulnerability)    {	player->powers[power] = INVULNTICS;	return true;    }        if (power == pw_invisibility)    {	player->powers[power] = INVISTICS;	player->mo->flags |= MF_SHADOW;	return true;    }        if (power == pw_infrared)    {	player->powers[power] = INFRATICS;	return true;    }        if (power == pw_ironfeet)    {	player->powers[power] = IRONTICS;	return true;    }        if (power == pw_strength)    {	P_GiveBody (player, 100);	player->powers[power] = 1;	return true;    }	    if (player->powers[power])	return false;	// already got it		    player->powers[power] = 1;    return true;}//// P_TouchSpecialThing//voidP_TouchSpecialThing( mobj_t*	special,  mobj_t*	toucher ){    player_t*	player;    int		i;    fixed_t	delta;    int		sound;		    delta = special->z - toucher->z;    if (delta > toucher->height	|| delta < -8*FRACUNIT)    {	// out of reach	return;    }    	    sound = sfx_itemup;	    player = toucher->player;    // Dead thing touching.    // Can happen with a sliding player corpse.    if (toucher->health <= 0)	return;    // Identify by sprite.    switch (special->sprite)    {	// armor      case SPR_ARM1:	if (!P_GiveArmor (player, 1))	    return;	player->message = GOTARMOR;	break;		      case SPR_ARM2:	if (!P_GiveArmor (player, 2))	    return;	player->message = GOTMEGA;	break;		// bonus items      case SPR_BON1:	player->health++;		// can go over 100%	if (player->health > 200)	    player->health = 200;	player->mo->health = player->health;	player->message = GOTHTHBONUS;	break;	      case SPR_BON2:	player->armorpoints++;		// can go over 100%	if (player->armorpoints > 200)	    player->armorpoints = 200;	if (!player->armortype)	    player->armortype = 1;	player->message = GOTARMBONUS;	break;	      case SPR_SOUL:	player->health += 100;	if (player->health > 200)	    player->health = 200;	player->mo->health = player->health;	player->message = GOTSUPER;	sound = sfx_getpow;	break;	      case SPR_MEGA:	if (gamemode != commercial)	    return;	player->health = 200;	player->mo->health = player->health;	P_GiveArmor (player,2);	player->message = GOTMSPHERE;	sound = sfx_getpow;	break;		// cards	// leave cards for everyone      case SPR_BKEY:	if (!player->cards[it_bluecard])	    player->message = GOTBLUECARD;	P_GiveCard (player, it_bluecard);	if (!netgame)	    break;	return;	      case SPR_YKEY:	if (!player->cards[it_yellowcard])	    player->message = GOTYELWCARD;	P_GiveCard (player, it_yellowcard);	if (!netgame)	    break;	return;	      case SPR_RKEY:	if (!player->cards[it_redcard])	    player->message = GOTREDCARD;	P_GiveCard (player, it_redcard);	if (!netgame)	    break;	return;	      case SPR_BSKU:	if (!player->cards[it_blueskull])	    player->message = GOTBLUESKUL;	P_GiveCard (player, it_blueskull);	if (!netgame)	    break;	return;	      case SPR_YSKU:	if (!player->cards[it_yellowskull])	    player->message = GOTYELWSKUL;

⌨️ 快捷键说明

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