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

📄 p_henemy.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(P_CheckMeleeRange(actor))	{		damage = ((P_Random()%7)+3);		P_DamageMobj(actor->target, actor, actor, damage);	}}//----------------------------------------------------------------------------//// PROC A_GhostOff////----------------------------------------------------------------------------void A_GhostOff(mobj_t *actor){	actor->flags &= ~MF_SHADOW;}//----------------------------------------------------------------------------//// PROC A_WizAtk1////----------------------------------------------------------------------------void A_WizAtk1(mobj_t *actor){	A_FaceTarget(actor);	actor->flags &= ~MF_SHADOW;}//----------------------------------------------------------------------------//// PROC A_WizAtk2////----------------------------------------------------------------------------void A_WizAtk2(mobj_t *actor){	A_FaceTarget(actor);	actor->flags |= MF_SHADOW;}//----------------------------------------------------------------------------//// PROC A_WizAtk3////----------------------------------------------------------------------------void A_WizAtk3(mobj_t *actor){	mobj_t *mo;	angle_t angle;	fixed_t momz;	actor->flags &= ~MF_SHADOW;	if(!actor->target)	{		return;	}	S_StartSound(actor, actor->info->attacksound);	if(P_CheckMeleeRange(actor))	{		P_DamageMobj(actor->target, actor, actor, HITDICE(4));		return;	}	mo = P_SpawnMissile(actor, actor->target, MT_WIZFX1);	if(mo)	{		momz = mo->momz;		angle = mo->angle;		P_SpawnMissileAngle(actor, MT_WIZFX1, angle-(ANG45/8), momz);		P_SpawnMissileAngle(actor, MT_WIZFX1, angle+(ANG45/8), momz);	}}//----------------------------------------------------------------------------//// PROC A_Scream////----------------------------------------------------------------------------void A_HScream(mobj_t *actor){	switch(actor->type)	{		case MT_CHICPLAYER:		case MT_SORCERER1:		case MT_MINOTAUR:			// Make boss death sounds full volume			S_StartSound(NULL, actor->info->deathsound);			break;		case MT_PLAYER:			// Handle the different player death screams			if(actor->special1 < 10)			{ // Wimpy death sound				S_StartSound(actor, sfx_plrwdth);			}			else if(actor->health > -50)			{ // Normal death sound				S_StartSound(actor, actor->info->deathsound);			}			else if(actor->health > -100)			{ // Crazy death sound				S_StartSound(actor, sfx_plrcdth);			}			else			{ // Extreme death sound				S_StartSound(actor, sfx_gibdth);			}			break;		default:			S_StartSound(actor, actor->info->deathsound);			break;	}}//---------------------------------------------------------------------------//// PROC P_DropItem////---------------------------------------------------------------------------void P_DropItem(mobj_t *source, mobjtype_t type, int special, int chance){	mobj_t *mo;	if(P_Random() > chance)	{		return;	}	mo = P_SpawnMobj(source->x, source->y,		         source->z+(source->height>>1), type);	mo->momx = P_SignedRandom()<<8;	mo->momy = P_SignedRandom()<<8;	mo->momz = FRACUNIT*5+(P_Random()<<10);	mo->flags |= MF_DROPPED;	mo->health = special;}//----------------------------------------------------------------------------//// PROC A_NoBlocking////----------------------------------------------------------------------------void A_NoBlocking(mobj_t *actor){    A_Fall(actor);    // Check for monsters dropping things    switch(actor->type)    {        case MT_MUMMY:        case MT_MUMMYLEADER:        case MT_MUMMYGHOST:        case MT_MUMMYLEADERGHOST:            P_DropItem(actor, MT_AMGWNDWIMPY, 3, 84);            break;        case MT_KNIGHT:        case MT_KNIGHTGHOST:            P_DropItem(actor, MT_AMCBOWWIMPY, 5, 84);            break;        case MT_WIZARD:            P_DropItem(actor, MT_AMBLSRWIMPY, 10, 84);            P_DropItem(actor, MT_ARTITOMEOFPOWER, 0, 4);            break;        case MT_HHEAD:            P_DropItem(actor, MT_AMBLSRWIMPY, 10, 84);            P_DropItem(actor, MT_ARTIEGG, 0, 51);            break;        case MT_BEAST:            P_DropItem(actor, MT_AMCBOWWIMPY, 10, 84);            break;        case MT_CLINK:            P_DropItem(actor, MT_AMSKRDWIMPY, 20, 84);            break;        case MT_SNAKE:            P_DropItem(actor, MT_AMPHRDWIMPY, 5, 84);            break;        case MT_MINOTAUR:            P_DropItem(actor, MT_ARTISUPERHEAL, 0, 51);            P_DropItem(actor, MT_AMPHRDWIMPY, 10, 84);            break;        default:            break;    }}//----------------------------------------------------------------------------//// PROC A_PodPain////----------------------------------------------------------------------------void A_PodPain(mobj_t *actor){    int i;    int count;    int chance;    mobj_t *goo;        chance = P_Random();    if(chance < 128)    {        return;    }    count = chance > 240 ? 2 : 1;    for(i = 0; i < count; i++)    {        goo = P_SpawnMobj(actor->x, actor->y,            actor->z+48*FRACUNIT, MT_PODGOO);        goo->target = actor;        goo->momx = P_SignedRandom()<<9;        goo->momy = P_SignedRandom()<<9;        goo->momz = FRACUNIT/2+(P_Random()<<9);    }}//----------------------------------------------------------------------------//// PROC A_RemovePod////----------------------------------------------------------------------------void A_RemovePod(mobj_t *actor){	mobj_t *mo;	if(actor->special2)	{		mo = (mobj_t *)actor->special2;		if(mo->special1 > 0)		{			mo->special1--;		}	}}//----------------------------------------------------------------------------//// PROC A_MakePod////----------------------------------------------------------------------------#define MAX_GEN_PODS 16void A_MakePod(mobj_t *actor){	mobj_t *mo;	fixed_t x;	fixed_t y;	fixed_t z;	if(actor->special1 == MAX_GEN_PODS)	{ // Too many generated pods		return;	}	x = actor->x;	y = actor->y;	z = actor->z;	mo = P_SpawnMobj(x, y, ONFLOORZ, MT_POD);	if(P_CheckPosition(mo, x, y) == false)	{ // Didn't fit		P_RemoveMobj(mo);		return;	}	P_SetMobjState(mo, S_POD_GROW1);	P_ThrustMobj(mo, P_Random()<<24, (fixed_t)(4.5*FRACUNIT));	S_StartSound(mo, sfx_newpod);	actor->special1++; // Increment generated pod count	mo->special2 = (int)actor; // Link the generator to the pod	return;}//----------------------------------------------------------------------------//// PROC P_Massacre//// Kills all monsters.////----------------------------------------------------------------------------void P_Massacre(void){	mobj_t *mo;	thinker_t *think;	for(think = thinkercap.next; think != &thinkercap;		think = think->next)	{		if(think->function.acp1 != (actionf_p1)P_MobjThinker)		{ // Not a mobj thinker			continue;		}		mo = (mobj_t *)think;		if((mo->flags&MF_COUNTKILL) && (mo->health > 0))		{			P_DamageMobj(mo, NULL, NULL, 10000);		}	}}//----------------------------------------------------------------------------//// PROC A_BossDeath//// Trigger special effects if all bosses are dead.////----------------------------------------------------------------------------void A_HBossDeath(mobj_t *actor){	mobj_t *mo;	thinker_t *think;	line_t dummyLine;	static const mobjtype_t bossType[6] =	{		MT_HHEAD,		MT_MINOTAUR,		MT_SORCERER2,		MT_HHEAD,		MT_MINOTAUR,		-1	};	if(gamemap != 8)	{ // Not a boss level		return;	}	if(actor->type != bossType[gameepisode-1])	{ // Not considered a boss in this episode		return;	}	// Make sure all bosses are dead	for(think = thinkercap.next; think != &thinkercap; think = think->next)	{		if(think->function.acp1 != (actionf_p1)P_MobjThinker)		{ // Not a mobj thinker			continue;		}		mo = (mobj_t *)think;		if((mo != actor) && (mo->type == actor->type) && !(mo->flags & MF_CORPSE))		{ // Found a living boss			return;		}	}	if(gameepisode > 1)	{ // Kill any remaining monsters		P_Massacre();	}	dummyLine.tag = 666;	EV_DoFloor(&dummyLine, lowerFloor);}//----------------------------------------------------------------------------//// PROC A_ESound////----------------------------------------------------------------------------void A_ESound(mobj_t *mo){	int sound;	switch(mo->type)	{		case MT_SOUNDWATERFALL:			sound = sfx_waterfl;			break;		case MT_SOUNDWIND:			sound = sfx_wind;			break;		default:                        sound = sfx_None;			break;	}	S_StartSound(mo, sound);}//----------------------------------------------------------------------------//// PROC A_SpawnTeleGlitter////----------------------------------------------------------------------------void A_SpawnTeleGlitter(mobj_t *actor){	mobj_t *mo;        int r,s;        r = P_Random();        s = P_Random();	mo = P_SpawnMobj(actor->x+((r&31)-16)*FRACUNIT,		         actor->y+((s&31)-16)*FRACUNIT,		         actor->subsector->sector->floorheight, MT_TELEGLITTER);	mo->momz = FRACUNIT/4;}//----------------------------------------------------------------------------//// PROC A_SpawnTeleGlitter2////----------------------------------------------------------------------------void A_SpawnTeleGlitter2(mobj_t *actor){	mobj_t *mo;        int r,s;        r = P_Random();        s = P_Random();	mo = P_SpawnMobj(actor->x+((r&31)-16)*FRACUNIT,		         actor->y+((s&31)-16)*FRACUNIT,		         actor->subsector->sector->floorheight, MT_TELEGLITTER2);	mo->momz = FRACUNIT/4;}//----------------------------------------------------------------------------//// PROC A_AccTeleGlitter////----------------------------------------------------------------------------void A_AccTeleGlitter(mobj_t *actor){	if(++actor->health > 35)	{		actor->momz += actor->momz/2;	}}//----------------------------------------------------------------------------//// PROC A_InitKeyGizmo////----------------------------------------------------------------------------void A_InitKeyGizmo(mobj_t *gizmo){	mobj_t *mo;	statenum_t state;	switch(gizmo->type)	{		case MT_KEYGIZMOBLUE:			state = S_KGZ_BLUEFLOAT1;			break;		case MT_KEYGIZMOGREEN:			state = S_KGZ_GREENFLOAT1;			break;		case MT_KEYGIZMOYELLOW:			state = S_KGZ_YELLOWFLOAT1;			break;		default:                        state = S_NULL;			break;	}	mo = P_SpawnMobj(gizmo->x, gizmo->y, gizmo->z+60*FRACUNIT,		MT_KEYGIZMOFLOAT);	P_SetMobjState(mo, state);}//----------------------------------------------------------------------------//// PROC A_VolcanoSet////----------------------------------------------------------------------------void A_VolcanoSet(mobj_t *volcano){	volcano->tics = 105+(P_Random()&127);}//----------------------------------------------------------------------------//// PROC A_VolcanoBlast////----------------------------------------------------------------------------void A_VolcanoBlast(mobj_t *volcano){	int i;	int count;	mobj_t *blast;	angle_t angle;	count = 1+(P_Random()%3);	for(i = 0; i < count; i++)	{		blast = P_SpawnMobj(volcano->x, volcano->y,			volcano->z+44*FRACUNIT, MT_VOLCANOBLAST); // MT_VOLCANOBLAST		blast->target = volcano;		angle = P_Random()<<24;		blast->angle = angle;		angle >>= ANGLETOFINESHIFT;		blast->momx = FixedMul(1*FRACUNIT, finecosine[angle]);		blast->momy = FixedMul(1*FRACUNIT, finesine[angle]);		blast->momz = (2.5*FRACUNIT)+(P_Random()<<10);		S_StartSound(blast, sfx_volsht);		P_CheckMissileSpawn(blast);	}}//----------------------------------------------------------------------------//// PROC A_VolcBallImpact////----------------------------------------------------------------------------void A_VolcBallImpact(mobj_t *ball){	int i;	mobj_t *tiny;	angle_t angle;	if(ball->z <= ball->floorz)	{		ball->flags |= MF_NOGRAVITY;		ball->flags2 &= ~MF2_LOGRAV;		ball->z += 28*FRACUNIT;		//ball->momz = 3*FRACUNIT;	}	P_RadiusAttack(ball, ball->target, 25);	for(i = 0; i < 4; i++)	{		tiny = P_SpawnMobj(ball->x, ball->y, ball->z, MT_VOLCANOTBLAST);		tiny->target = ball;		angle = i*ANG90;		tiny->angle = angle;		angle >>= ANGLETOFINESHIFT;		tiny->momx = FixedMul(FRACUNIT*.7, finecosine[angle]);		tiny->momy = FixedMul(FRACUNIT*.7, finesine[angle]);		tiny->momz = FRACUNIT+(P_Random()<<9);		P_CheckMissileSpawn(tiny);	}}//----------------------------------------------------------------------------//// PROC A_SkullPop////----------------------------------------------------------------------------void A_SkullPop(mobj_t *actor){	mobj_t *mo;	player_t *player;	actor->flags &= ~MF_SOLID;	mo = P_SpawnMobj(actor->x, actor->y, actor->z+48*FRACUNIT,		MT_BLOODYSKULL);	//mo->target = actor;	mo->momx = P_SignedRandom()<<9;	mo->momy = P_SignedRandom()<<9;	mo->momz = FRACUNIT*2+(P_Random()<<6);	// Attach player mobj to bloody skull	player = actor->player;	actor->player = NULL;	mo->player = player;	mo->health = actor->health;	mo->angle = actor->angle;	player->mo = mo;	player->aiming = 0;	player->damagecount = 32;}//----------------------------------------------------------------------------//// PROC A_CheckSkullFloor////----------------------------------------------------------------------------void A_CheckSkullFloor(mobj_t *actor){	if(actor->z <= actor->floorz)	{		P_SetMobjState(actor, S_BLOODYSKULLX1);	}}//----------------------------------------------------------------------------//// PROC A_CheckSkullDone////----------------------------------------------------------------------------void A_CheckSkullDone(mobj_t *actor){	if(actor->special2 == 666)	{		P_SetMobjState(actor, S_BLOODYSKULLX2);	}}//----------------------------------------------------------------------------//// PROC A_CheckBurnGone////----------------------------------------------------------------------------void A_CheckBurnGone(mobj_t *actor){	if(actor->special2 == 666)	{		//P_SetMobjState(actor, S_PLAY_FDTH20);	}}//----------------------------------------------------------------------------//// PROC A_FreeTargMobj////----------------------------------------------------------------------------void A_FreeTargMobj(mobj_t *mo){	mo->momx = mo->momy = mo->momz = 0;	mo->z = mo->ceilingz+4*FRACUNIT;	mo->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY|MF_SOLID);	mo->flags |= MF_CORPSE|MF_DROPOFF|MF_NOGRAVITY;	mo->flags2 &= ~(MF2_PASSMOBJ|MF2_LOGRAV);	mo->player = NULL;}//----------------------------------------------------------------------------//// PROC A_AddPlayerCorpse////----------------------------------------------------------------------------/*#define BODYQUESIZE 32mobj_t *bodyque[BODYQUESIZE];int bodyqueslot;*/void A_AddPlayerCorpse(mobj_t *actor){	if(bodyqueslot >= BODYQUESIZE)	{ // Too many player corpses - remove an old one		P_RemoveMobj(bodyque[bodyqueslot%BODYQUESIZE]);	}	bodyque[bodyqueslot%BODYQUESIZE] = actor;	bodyqueslot++;}//----------------------------------------------------------------------------//// PROC A_FlameSnd////----------------------------------------------------------------------------void A_FlameSnd(mobj_t *actor){	S_StartSound(actor, sfx_hedat1); // Burn sound}

⌨️ 快捷键说明

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