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

📄 p_pspr.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_pspr.c,v 1.2 2003/09/08 22:34:30 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_pspr.c,v $// Revision 1.2  2003/09/08 22:34:30  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:54  jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION://	Weapon sprite animation, weapon objects.//	Action functions for weapons.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: p_pspr.c,v 1.2 2003/09/08 22:34:30 jasonk Exp $";#include "doomdef.h"#include "d_event.h"#include "m_random.h"#include "p_local.h"#include "s_sound.h"// State.#include "doomstat.h"// Data.#include "sounds.h"#include "p_pspr.h"#define LOWERSPEED		FRACUNIT*6#define RAISESPEED		FRACUNIT*6#define WEAPONBOTTOM	128*FRACUNIT#define WEAPONTOP		32*FRACUNIT// plasma cells for a bfg attack#define BFGCELLS		40		//// P_SetPsprite//voidP_SetPsprite( player_t*	player,  int		position,  statenum_t	stnum ) {    pspdef_t*	psp;    state_t*	state;	    psp = &player->psprites[position];	    do    {	if (!stnum)	{	    // object removed itself	    psp->state = NULL;	    break;		}		state = &states[stnum];	psp->state = state;	psp->tics = state->tics;	// could be 0	if (state->misc1)	{	    // coordinate set	    psp->sx = state->misc1 << FRACBITS;	    psp->sy = state->misc2 << FRACBITS;	}		// Call action routine.	// Modified handling.	if (state->action.acp2)	{	    state->action.acp2(player, psp);	    if (!psp->state)		break;	}		stnum = psp->state->nextstate;	    } while (!psp->tics);    // an initial state of 0 could cycle through}//// P_CalcSwing//	fixed_t		swingx;fixed_t		swingy;void P_CalcSwing (player_t*	player){    fixed_t	swing;    int		angle;	    // OPTIMIZE: tablify this.    // A LUT would allow for different modes,    //  and add flexibility.    swing = player->bob;    angle = (FINEANGLES/70*leveltime)&FINEMASK;    swingx = FixedMul ( swing, finesine[angle]);    angle = (FINEANGLES/70*leveltime+FINEANGLES/2)&FINEMASK;    swingy = -FixedMul ( swingx, finesine[angle]);}//// P_BringUpWeapon// Starts bringing the pending weapon up// from the bottom of the screen.// Uses player//void P_BringUpWeapon (player_t* player){    statenum_t	newstate;	    if (player->pendingweapon == wp_nochange)	player->pendingweapon = player->readyweapon;		    if (player->pendingweapon == wp_chainsaw)	S_StartSound (player->mo, sfx_sawup);		    newstate = weaponinfo[player->pendingweapon].upstate;    player->pendingweapon = wp_nochange;    player->psprites[ps_weapon].sy = WEAPONBOTTOM;    P_SetPsprite (player, ps_weapon, newstate);}//// P_CheckAmmo// Returns true if there is enough ammo to shoot.// If not, selects the next weapon to use.//boolean P_CheckAmmo (player_t* player){    ammotype_t		ammo;    int			count;    ammo = weaponinfo[player->readyweapon].ammo;    // Minimal amount for one shot varies.    if (player->readyweapon == wp_bfg)	count = BFGCELLS;    else if (player->readyweapon == wp_supershotgun)	count = 2;	// Double barrel.    else	count = 1;	// Regular.    // Some do not need ammunition anyway.    // Return if current ammunition sufficient.    if (ammo == am_noammo || player->ammo[ammo] >= count)	return true;		    // Out of ammo, pick a weapon to change to.    // Preferences are set here.    do    {	if (player->weaponowned[wp_plasma]	    && player->ammo[am_cell]	    && (gamemode != shareware) )	{	    player->pendingweapon = wp_plasma;	}	else if (player->weaponowned[wp_supershotgun] 		 && player->ammo[am_shell]>2		 && (gamemode == commercial) )	{	    player->pendingweapon = wp_supershotgun;	}	else if (player->weaponowned[wp_chaingun]		 && player->ammo[am_clip])	{	    player->pendingweapon = wp_chaingun;	}	else if (player->weaponowned[wp_shotgun]		 && player->ammo[am_shell])	{	    player->pendingweapon = wp_shotgun;	}	else if (player->ammo[am_clip])	{	    player->pendingweapon = wp_pistol;	}	else if (player->weaponowned[wp_chainsaw])	{	    player->pendingweapon = wp_chainsaw;	}	else if (player->weaponowned[wp_missile]		 && player->ammo[am_misl])	{	    player->pendingweapon = wp_missile;	}	else if (player->weaponowned[wp_bfg]		 && player->ammo[am_cell]>40		 && (gamemode != shareware) )	{	    player->pendingweapon = wp_bfg;	}	else	{	    // If everything fails.	    player->pendingweapon = wp_fist;	}	    } while (player->pendingweapon == wp_nochange);    // Now set appropriate weapon overlay.    P_SetPsprite (player,		  ps_weapon,		  weaponinfo[player->readyweapon].downstate);    return false;	}//// P_FireWeapon.//void P_FireWeapon (player_t* player){    statenum_t	newstate;	    if (!P_CheckAmmo (player))	return;	    P_SetMobjState (player->mo, S_PLAY_ATK1);    newstate = weaponinfo[player->readyweapon].atkstate;    P_SetPsprite (player, ps_weapon, newstate);    P_NoiseAlert (player->mo, player->mo);}//// P_DropWeapon// Player died, so put the weapon away.//void P_DropWeapon (player_t* player){    P_SetPsprite (player,		  ps_weapon,		  weaponinfo[player->readyweapon].downstate);}//// A_WeaponReady// The player can fire the weapon// or change to another weapon at this time.// Follows after getting weapon up,// or after previous attack/fire sequence.//voidA_WeaponReady( player_t*	player,  pspdef_t*	psp ){	    statenum_t	newstate;    int		angle;        // get out of attack state    if (player->mo->state == &states[S_PLAY_ATK1]	|| player->mo->state == &states[S_PLAY_ATK2] )    {	P_SetMobjState (player->mo, S_PLAY);    }        if (player->readyweapon == wp_chainsaw	&& psp->state == &states[S_SAW])    {	S_StartSound (player->mo, sfx_sawidl);    }        // check for change    //  if player is dead, put the weapon away    if (player->pendingweapon != wp_nochange || !player->health)    {	// change weapon	//  (pending weapon should allready be validated)	newstate = weaponinfo[player->readyweapon].downstate;	P_SetPsprite (player, ps_weapon, newstate);	return;	    }        // check for fire    //  the missile launcher and bfg do not auto fire    if (player->cmd.buttons & BT_ATTACK)    {	if ( !player->attackdown	     || (player->readyweapon != wp_missile		 && player->readyweapon != wp_bfg) )	{	    player->attackdown = true;	    P_FireWeapon (player);			    return;	}    }    else	player->attackdown = false;        // bob the weapon based on movement speed    angle = (128*leveltime)&FINEMASK;    psp->sx = FRACUNIT + FixedMul (player->bob, finecosine[angle]);    angle &= FINEANGLES/2-1;    psp->sy = WEAPONTOP + FixedMul (player->bob, finesine[angle]);}//// A_ReFire// The player can re-fire the weapon// without lowering it entirely.//void A_ReFire( player_t*	player,  pspdef_t*	psp ){        // check for fire    //  (if a weaponchange is pending, let it go through instead)    if ( (player->cmd.buttons & BT_ATTACK) 	 && player->pendingweapon == wp_nochange	 && player->health)    {	player->refire++;	P_FireWeapon (player);    }    else    {	player->refire = 0;	P_CheckAmmo (player);    }}voidA_CheckReload( player_t*	player,  pspdef_t*	psp ){    P_CheckAmmo (player);#if 0    if (player->ammo[am_shell]<2)	P_SetPsprite (player, ps_weapon, S_DSNR1);#endif}//// A_Lower// Lowers current weapon,//  and changes weapon at bottom.//voidA_Lower( player_t*	player,  pspdef_t*	psp ){	    psp->sy += LOWERSPEED;    // Is already down.    if (psp->sy < WEAPONBOTTOM )	return;    // Player is dead.    if (player->playerstate == PST_DEAD)    {	psp->sy = WEAPONBOTTOM;	// don't bring weapon back up	return;		    }        // The old weapon has been lowered off the screen,    // so change the weapon and start raising it    if (!player->health)    {	// Player is dead, so keep the weapon off screen.	P_SetPsprite (player,  ps_weapon, S_NULL);	return;	    }	    player->readyweapon = player->pendingweapon;     P_BringUpWeapon (player);}//// A_Raise//voidA_Raise( player_t*	player,  pspdef_t*	psp ){    statenum_t	newstate;	    psp->sy -= RAISESPEED;    if (psp->sy > WEAPONTOP )	return;        psp->sy = WEAPONTOP;        // The weapon has been raised all the way,

⌨️ 快捷键说明

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