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

📄 p_hpspr.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(linetarget)	{		//S_StartSound(player->mo, sfx_stfhit);		// turn to face target		player->mo->angle = R_PointToAngle2(player->mo->x,			player->mo->y, linetarget->x, linetarget->y);	}}//----------------------------------------------------------------------------//// PROC A_StaffAttackPL2////----------------------------------------------------------------------------void A_StaffAttackPL2(player_t *player, pspdef_t *psp){	angle_t angle;	int damage;	int slope;	// P_inter.c:P_DamageMobj() handles target momentums	damage = 18+(P_Random()&63);	angle = player->mo->angle;	angle += P_SignedRandom()<<18;        slope = P_AimLineAttack(player->mo, angle, MELEERANGE);	PuffType = MT_STAFFPUFF2;	P_LineAttack(player->mo, angle, MELEERANGE, slope, damage);	if(linetarget)	{		//S_StartSound(player->mo, sfx_stfpow);		// turn to face target		player->mo->angle = R_PointToAngle2(player->mo->x,			player->mo->y, linetarget->x, linetarget->y);	}}//----------------------------------------------------------------------------//// PROC A_FireBlasterPL1////----------------------------------------------------------------------------void A_FireBlasterPL1(player_t *player, pspdef_t *psp){    mobj_t *mo;    angle_t angle;    int damage;        mo = player->mo;    S_StartSound(mo, sfx_gldhit);    player->ammo[am_blaster] -= USE_BLSR_AMMO_1;    P_BulletSlope(mo);    damage = HITDICE(4);    angle = mo->angle;    if(player->refire)        angle += P_SignedRandom()<<18;    PuffType = MT_BLASTERPUFF1;    P_LineAttack(mo, angle, MISSILERANGE, bulletslope, damage);    S_StartSound(player->mo, sfx_blssht);}//----------------------------------------------------------------------------//// PROC P_BlasterMobjThinker//// Thinker for the ultra-fast blaster PL2 ripper-spawning missile.////----------------------------------------------------------------------------void P_BlasterMobjThinker(mobj_t *mobj){	int i;	fixed_t xfrac;	fixed_t yfrac;	fixed_t zfrac;	fixed_t z;	boolean changexy;	// Handle movement	if(mobj->momx || mobj->momy ||	   (mobj->z != mobj->floorz) || mobj->momz)	{		xfrac = mobj->momx>>3;		yfrac = mobj->momy>>3;		zfrac = mobj->momz>>3;		changexy = xfrac || yfrac;		for(i = 0; i < 8; i++)		{			if(changexy)			{				if(!P_TryMove(mobj, mobj->x+xfrac, mobj->y+yfrac, true))				{ // Blocked move					P_ExplodeMissile(mobj);					return;				}			}			mobj->z += zfrac;			if(mobj->z <= mobj->floorz)			{ // Hit the floor				mobj->z = mobj->floorz;				P_HitFloor(mobj);				P_ExplodeMissile(mobj);				return;			}			if(mobj->z+mobj->height > mobj->ceilingz)			{ // Hit the ceiling				mobj->z = mobj->ceilingz-mobj->height;				P_ExplodeMissile(mobj);				return;			}			if(changexy && (P_Random() < 64))			{				z = mobj->z-8*FRACUNIT;				if(z < mobj->floorz)				{					z = mobj->floorz;				}				P_SpawnMobj(mobj->x, mobj->y, z, MT_BLASTERSMOKE);			}		}	}	// Advance the state	if(mobj->tics != -1)	{		mobj->tics--;		while(!mobj->tics)		{			if(!P_SetMobjState(mobj, mobj->state->nextstate))			{ // mobj was removed				return;			}		}	}}//----------------------------------------------------------------------------//// PROC A_FireBlasterPL2////----------------------------------------------------------------------------void A_FireBlasterPL2(player_t *player, pspdef_t *psp){	mobj_t *mo;	player->ammo[am_blaster] -=		cv_deathmatch.value ? USE_BLSR_AMMO_1 : USE_BLSR_AMMO_2;	mo = P_SpawnPlayerMissile(player->mo, MT_BLASTERFX1);	if( mo )            mo->thinker.function.acp1 = (actionf_p1)P_BlasterMobjThinker;        S_StartSound(player->mo, sfx_blssht);}//----------------------------------------------------------------------------//// PROC A_FireGoldWandPL1////----------------------------------------------------------------------------void A_FireGoldWandPL1(player_t *player, pspdef_t *psp){    mobj_t *mo;    angle_t angle;    int damage;        mo = player->mo;    player->ammo[am_goldwand] -= USE_GWND_AMMO_1;    P_BulletSlope(mo);    damage = 7+(P_Random()&7);    angle = mo->angle;    if(player->refire)        angle += P_SignedRandom()<<18;    PuffType = MT_GOLDWANDPUFF1;    P_LineAttack(mo, angle, MISSILERANGE, bulletslope, damage);    S_StartSound(player->mo, sfx_gldhit);}//----------------------------------------------------------------------------//// PROC A_FireGoldWandPL2////----------------------------------------------------------------------------void A_FireGoldWandPL2(player_t *player, pspdef_t *psp){	int i;	mobj_t *mo;	angle_t angle;	int damage;	fixed_t momz;	mo = player->mo;	player->ammo[am_goldwand] -=		cv_deathmatch.value ? USE_GWND_AMMO_1 : USE_GWND_AMMO_2;	PuffType = MT_GOLDWANDPUFF2;	P_BulletSlope(mo);	momz = FixedMul(mobjinfo[MT_GOLDWANDFX2].speed, bulletslope);//	P_SpawnMissileAngle(mo, MT_GOLDWANDFX2, mo->angle-(ANG45/8), momz);//	P_SpawnMissileAngle(mo, MT_GOLDWANDFX2, mo->angle+(ANG45/8), momz);	angle = mo->angle-(ANG45/8);	for(i = 0; i < 5; i++)	{		damage = 1+(P_Random()&7);		P_LineAttack(mo, angle, MISSILERANGE, bulletslope, damage);		angle += ((ANG45/8)*2)/4;	}	S_StartSound(player->mo, sfx_gldhit);}//----------------------------------------------------------------------------//// PROC A_FireMacePL1B////----------------------------------------------------------------------------void A_FireMacePL1B(player_t *player, pspdef_t *psp){	mobj_t *pmo;	mobj_t *ball;	angle_t angle;	if(player->ammo[am_mace] < USE_MACE_AMMO_1)	{		return;	}	player->ammo[am_mace] -= USE_MACE_AMMO_1;	pmo = player->mo;	ball = P_SpawnMobj(pmo->x, pmo->y, pmo->z+28*FRACUNIT		- FOOTCLIPSIZE*((pmo->flags2&MF2_FEETARECLIPPED) != 0), MT_MACEFX2);	ball->momz = 2*FRACUNIT+((player->aiming)<<(FRACBITS-5));	angle = pmo->angle;	ball->target = pmo;	ball->angle = angle;	ball->z += (player->aiming)<<(FRACBITS-4);	angle >>= ANGLETOFINESHIFT;	ball->momx = (pmo->momx>>1)		+FixedMul(ball->info->speed, finecosine[angle]);	ball->momy = (pmo->momy>>1)		+FixedMul(ball->info->speed, finesine[angle]);	S_StartSound(ball, sfx_lobsht);	P_CheckMissileSpawn(ball);}//----------------------------------------------------------------------------//// PROC A_FireMacePL1////----------------------------------------------------------------------------void A_FireMacePL1(player_t *player, pspdef_t *psp){	mobj_t *ball;	if(P_Random() < 28)	{		A_FireMacePL1B(player, psp);		return;	}	if(player->ammo[am_mace] < USE_MACE_AMMO_1)	{		return;	}	player->ammo[am_mace] -= USE_MACE_AMMO_1;	psp->sx = ((P_Random()&3)-2)*FRACUNIT;	psp->sy = WEAPONTOP+(P_Random()&3)*FRACUNIT;	ball = P_SPMAngle(player->mo, MT_MACEFX1, player->mo->angle		                                  +(((P_Random()&7)-4)<<24));	if(ball)	{		ball->special1 = 16; // tics till dropoff	}}//----------------------------------------------------------------------------//// PROC A_MacePL1Check////----------------------------------------------------------------------------void A_MacePL1Check(mobj_t *ball){	angle_t angle;	if(ball->special1 == 0)	{		return;	}	ball->special1 -= 4;	if(ball->special1 > 0)	{		return;	}	ball->special1 = 0;	ball->flags2 |= MF2_LOGRAV;	angle = ball->angle>>ANGLETOFINESHIFT;	ball->momx = FixedMul(7*FRACUNIT, finecosine[angle]);	ball->momy = FixedMul(7*FRACUNIT, finesine[angle]);	ball->momz -= ball->momz>>1;}//----------------------------------------------------------------------------//// PROC A_MaceBallImpact////----------------------------------------------------------------------------void A_MaceBallImpact(mobj_t *ball){	if((ball->z <= ball->floorz) && (P_HitFloor(ball) != FLOOR_SOLID))	{ // Landed in some sort of liquid		P_RemoveMobj(ball);		return;	}	if((ball->health != MAGIC_JUNK) && (ball->z <= ball->floorz)		&& ball->momz)	{ // Bounce		ball->health = MAGIC_JUNK;		ball->momz = (ball->momz*192)>>8;		ball->flags2 &= ~MF2_FLOORBOUNCE;		P_SetMobjState(ball, ball->info->spawnstate);		S_StartSound(ball, sfx_bounce);	}	else	{ // Explode		ball->flags |= MF_NOGRAVITY;		ball->flags2 &= ~MF2_LOGRAV;		S_StartSound(ball, sfx_lobhit);	}}//----------------------------------------------------------------------------//// PROC A_MaceBallImpact2////----------------------------------------------------------------------------void A_MaceBallImpact2(mobj_t *ball){	mobj_t *tiny;	angle_t angle;	if((ball->z <= ball->floorz) && (P_HitFloor(ball) != FLOOR_SOLID))	{ // Landed in some sort of liquid		P_RemoveMobj(ball);		return;	}	if((ball->z != ball->floorz) || (ball->momz < 2*FRACUNIT))	{ // Explode		ball->momx = ball->momy = ball->momz = 0;		ball->flags |= MF_NOGRAVITY;		ball->flags2 &= ~(MF2_LOGRAV|MF2_FLOORBOUNCE);	}	else	{ // Bounce		ball->momz = (ball->momz*192)>>8;		P_SetMobjState(ball, ball->info->spawnstate);		tiny = P_SpawnMobj(ball->x, ball->y, ball->z, MT_MACEFX3);		angle = ball->angle+ANG90;		tiny->target = ball->target;		tiny->angle = angle;		angle >>= ANGLETOFINESHIFT;		tiny->momx = (ball->momx>>1)+FixedMul(ball->momz-FRACUNIT,			finecosine[angle]);		tiny->momy = (ball->momy>>1)+FixedMul(ball->momz-FRACUNIT,			finesine[angle]);		tiny->momz = ball->momz;		P_CheckMissileSpawn(tiny);		tiny = P_SpawnMobj(ball->x, ball->y, ball->z, MT_MACEFX3);		angle = ball->angle-ANG90;		tiny->target = ball->target;		tiny->angle = angle;		angle >>= ANGLETOFINESHIFT;		tiny->momx = (ball->momx>>1)+FixedMul(ball->momz-FRACUNIT,			finecosine[angle]);		tiny->momy = (ball->momy>>1)+FixedMul(ball->momz-FRACUNIT,			finesine[angle]);		tiny->momz = ball->momz;		P_CheckMissileSpawn(tiny);	}}//----------------------------------------------------------------------------//// PROC A_FireMacePL2////----------------------------------------------------------------------------void A_FireMacePL2(player_t *player, pspdef_t *psp){	mobj_t *mo;	player->ammo[am_mace] -=		cv_deathmatch.value ? USE_MACE_AMMO_1 : USE_MACE_AMMO_2;	mo = P_SpawnPlayerMissile(player->mo, MT_MACEFX4);	if(mo)	{		mo->momx += player->mo->momx;		mo->momy += player->mo->momy;		mo->momz = 2*FRACUNIT+((player->aiming)<<(FRACBITS-5));		if(linetarget)		{			mo->special1 = (int)linetarget;		}	}	S_StartSound(player->mo, sfx_lobsht);}//----------------------------------------------------------------------------//// PROC A_DeathBallImpact////----------------------------------------------------------------------------void A_DeathBallImpact(mobj_t *ball){	int i;	mobj_t *target;	angle_t angle = 0;	boolean newAngle;	if((ball->z <= ball->floorz) && (P_HitFloor(ball) != FLOOR_SOLID))	{ // Landed in some sort of liquid		P_RemoveMobj(ball);		return;	}	if((ball->z <= ball->floorz) && ball->momz)	{ // Bounce		newAngle = false;		target = (mobj_t *)ball->special1;		if(target)		{			if(!(target->flags&MF_SHOOTABLE))			{ // Target died				ball->special1 = 0;			}			else			{ // Seek				angle = R_PointToAngle2(ball->x, ball->y,					target->x, target->y);				newAngle = true;			}		}		else		{ // Find new target			for(i = 0; i < 16; i++)			{				P_AimLineAttack(ball, angle, 10*64*FRACUNIT);				if(linetarget && ball->target != linetarget)				{					ball->special1 = (int)linetarget;					angle = R_PointToAngle2(ball->x, ball->y,						linetarget->x, linetarget->y);					newAngle = true;					break;				}				angle += ANGLE_45/2;			}		}		if(newAngle)		{			ball->angle = angle;			angle >>= ANGLETOFINESHIFT;			ball->momx = FixedMul(ball->info->speed, finecosine[angle]);			ball->momy = FixedMul(ball->info->speed, finesine[angle]);		}		P_SetMobjState(ball, ball->info->spawnstate);		S_StartSound(ball, sfx_pstop);	}	else	{ // Explode		ball->flags |= MF_NOGRAVITY;		ball->flags2 &= ~MF2_LOGRAV;		S_StartSound(ball, sfx_phohit);	}}//----------------------------------------------------------------------------//// PROC A_SpawnRippers////----------------------------------------------------------------------------void A_SpawnRippers(mobj_t *actor){	int i;	angle_t angle;	mobj_t *ripper;	for(i = 0; i < 8; i++)	{

⌨️ 快捷键说明

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