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

📄 a_action.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 3 页
字号:
	{		for (playnum=0; playnum < MAXPLAYERS; playnum++)		{			player = &players[playnum];			if (!playeringame[playnum]) continue;			victim = player->mo;			dist = P_AproxDistance(actor->x - victim->x,						actor->y - victim->y) >> (FRACBITS+6);			// Tested in tile units (64 pixels)			if (dist < actor->args[3])		// In tremor radius			{				localQuakeHappening[playnum] = richters;			}			// Check if in damage radius			if ((dist < actor->args[2]) &&				(victim->z <= victim->floorz))			{				if (P_Random() < 50)				{					P_DamageMobj(victim, NULL, NULL, HITDICE(1));				}				// Thrust player around				an = victim->angle + ANGLE_1*P_Random();				P_ThrustMobj(victim,an,richters<<(FRACBITS-1));			}		}	}	else	{		for (playnum=0; playnum < MAXPLAYERS; playnum++)		{			localQuakeHappening[playnum] = false;		}		P_SetMobjState(actor, S_NULL);	}}//===========================================================================//// Teleport other stuff////===========================================================================#define TELEPORT_LIFE 1void A_TeloSpawnA(mobj_t *actor){	mobj_t *mo;	mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX2);	if (mo)	{		mo->special1 = TELEPORT_LIFE;			// Lifetime countdown		mo->angle = actor->angle;		mo->target = actor->target;		mo->momx = actor->momx>>1;		mo->momy = actor->momy>>1;		mo->momz = actor->momz>>1;	}}void A_TeloSpawnB(mobj_t *actor){	mobj_t *mo;	mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX3);	if (mo)	{		mo->special1 = TELEPORT_LIFE;			// Lifetime countdown		mo->angle = actor->angle;		mo->target = actor->target;		mo->momx = actor->momx>>1;		mo->momy = actor->momy>>1;		mo->momz = actor->momz>>1;	}}void A_TeloSpawnC(mobj_t *actor){	mobj_t *mo;	mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX4);	if (mo)	{		mo->special1 = TELEPORT_LIFE;			// Lifetime countdown		mo->angle = actor->angle;		mo->target = actor->target;		mo->momx = actor->momx>>1;		mo->momy = actor->momy>>1;		mo->momz = actor->momz>>1;	}}void A_TeloSpawnD(mobj_t *actor){	mobj_t *mo;	mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX5);	if (mo)	{		mo->special1 = TELEPORT_LIFE;			// Lifetime countdown		mo->angle = actor->angle;		mo->target = actor->target;		mo->momx = actor->momx>>1;		mo->momy = actor->momy>>1;		mo->momz = actor->momz>>1;	}}void A_CheckTeleRing(mobj_t *actor){	if (actor->special1-- <= 0)	{		P_SetMobjState(actor, actor->info->deathstate);	}}// Dirt stuffvoid P_SpawnDirt(mobj_t *actor, fixed_t radius){	fixed_t x,y,z;	int dtype=0;	mobj_t *mo;	angle_t angle;	angle = P_Random()<<5;		// <<24 >>19	x = actor->x + FixedMul(radius,finecosine[angle]);	y = actor->y + FixedMul(radius,finesine[angle]);//	x = actor->x + ((P_Random()-P_Random())%radius)<<FRACBITS;//	y = actor->y + ((P_Random()-P_Random()<<FRACBITS)%radius);	z = actor->z + (P_Random()<<9) + FRACUNIT;	switch(P_Random()%6)	{		case 0:			dtype = MT_DIRT1;			break;		case 1:			dtype = MT_DIRT2;			break;		case 2:			dtype = MT_DIRT3;			break;		case 3:			dtype = MT_DIRT4;			break;		case 4:			dtype = MT_DIRT5;			break;		case 5:			dtype = MT_DIRT6;			break;	}	mo = P_SpawnMobj(x,y,z,dtype);	if (mo)	{		mo->momz = P_Random()<<10;	}}//===========================================================================//// Thrust floor stuff//// Thrust Spike Variables//		special1		pointer to dirt clump mobj//		special2		speed of raise//		args[0]		0 = lowered,  1 = raised//		args[1]		0 = normal,   1 = bloody//===========================================================================void A_ThrustInitUp(mobj_t *actor){	actor->special2 = 5;		// Raise speed	actor->args[0] = 1;		// Mark as up	actor->floorclip = 0;	actor->flags = MF_SOLID;	actor->flags2 = MF2_NOTELEPORT|MF2_FLOORCLIP;	actor->special1 = 0L;}void A_ThrustInitDn(mobj_t *actor){	mobj_t *mo;	actor->special2 = 5;		// Raise speed	actor->args[0] = 0;		// Mark as down	actor->floorclip = actor->info->height;	actor->flags = 0;	actor->flags2 = MF2_NOTELEPORT|MF2_FLOORCLIP|MF2_DONTDRAW;	mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_DIRTCLUMP);	actor->special1 = (int)mo;}void A_ThrustRaise(mobj_t *actor){	if (A_RaiseMobj(actor))	{	// Reached it's target height		actor->args[0] = 1;		if (actor->args[1])			P_SetMobjStateNF(actor, S_BTHRUSTINIT2_1);		else			P_SetMobjStateNF(actor, S_THRUSTINIT2_1);	}	// Lose the dirt clump	if ((actor->floorclip < actor->height) && actor->special1)	{		P_RemoveMobj( (mobj_t *)actor->special1 );		actor->special1 = 0;	}	// Spawn some dirt	if (P_Random()<40)		P_SpawnDirt(actor, actor->radius);	actor->special2++;							// Increase raise speed}void A_ThrustLower(mobj_t *actor){	if (A_SinkMobj(actor))	{		actor->args[0] = 0;		if (actor->args[1])			P_SetMobjStateNF(actor, S_BTHRUSTINIT1_1);		else			P_SetMobjStateNF(actor, S_THRUSTINIT1_1);	}}void A_ThrustBlock(mobj_t *actor){	actor->flags |= MF_SOLID;}void A_ThrustImpale(mobj_t *actor){	// Impale all shootables in radius	PIT_ThrustSpike(actor);}//===========================================================================//// A_SoAExplode - Suit of Armor Explode////===========================================================================void A_SoAExplode(mobj_t *actor){	mobj_t *mo;	int i;	for(i = 0; i < 10; i++)	{		mo = P_SpawnMobj(actor->x+((P_Random()-128)<<12), 			actor->y+((P_Random()-128)<<12), 			actor->z+(P_Random()*actor->height/256), MT_ZARMORCHUNK);		P_SetMobjState(mo, mo->info->spawnstate+i);		if(mo)		{			mo->momz = ((P_Random()&7)+5)*FRACUNIT;			mo->momx = (P_Random()-P_Random())<<(FRACBITS-6);			mo->momy = (P_Random()-P_Random())<<(FRACBITS-6);		}	}	if(actor->args[0])	{ // Spawn an item		if(!nomonsters 		|| !(mobjinfo[TranslateThingType[actor->args[0]]].flags&MF_COUNTKILL))		{ // Only spawn monsters if not -nomonsters			P_SpawnMobj(actor->x, actor->y, actor->z,				TranslateThingType[actor->args[0]]);		}	}	S_StartSound(mo, SFX_SUITOFARMOR_BREAK);	P_RemoveMobj(actor);}//===========================================================================//// A_BellReset1////===========================================================================void A_BellReset1(mobj_t *actor){	actor->flags |= MF_NOGRAVITY;	actor->height <<= 2;	}//===========================================================================//// A_BellReset2////===========================================================================void A_BellReset2(mobj_t *actor){	actor->flags |= MF_SHOOTABLE;	actor->flags &= ~MF_CORPSE;	actor->health = 5;}//===========================================================================//// A_FlameCheck////===========================================================================void A_FlameCheck(mobj_t *actor){	if(!actor->args[0]--)		// Called every 8 tics	{		P_SetMobjState(actor, S_NULL);	}}//===========================================================================// Bat Spawner Variables//	special1	frequency counter//	special2	//	args[0]		frequency of spawn (1=fastest, 10=slowest)//	args[1]		spread angle (0..255)//	args[2]		//	args[3]		duration of bats (in octics)//	args[4]		turn amount per move (in degrees)//// Bat Variables//	special2	lifetime counter//	args[4]		turn amount per move (in degrees)//===========================================================================void A_BatSpawnInit(mobj_t *actor){	actor->special1 = 0;	// Frequency count}void A_BatSpawn(mobj_t *actor){	mobj_t *mo;	int delta;	angle_t angle;	// Countdown until next spawn	if (actor->special1-- > 0) return;	actor->special1 = actor->args[0];		// Reset frequency count	delta = actor->args[1];	if (delta==0) delta=1;	angle = actor->angle + (((P_Random()%delta)-(delta>>1))<<24);	mo = P_SpawnMissileAngle(actor, MT_BAT, angle, 0);	if (mo)	{		mo->args[0] = P_Random()&63;			// floatbob index		mo->args[4] = actor->args[4];			// turn degrees		mo->special2 = actor->args[3]<<3;		// Set lifetime		mo->target = actor;	}}void A_BatMove(mobj_t *actor){	angle_t newangle;	fixed_t speed;	if (actor->special2 < 0)	{		P_SetMobjState(actor, actor->info->deathstate);	}	actor->special2 -= 2;		// Called every 2 tics	if (P_Random()<128)	{		newangle = actor->angle + ANGLE_1*actor->args[4];	}	else	{		newangle = actor->angle - ANGLE_1*actor->args[4];	}	// Adjust momentum vector to new direction	newangle >>= ANGLETOFINESHIFT;	speed = FixedMul(actor->info->speed, P_Random()<<10);	actor->momx = FixedMul(speed, finecosine[newangle]);	actor->momy = FixedMul(speed, finesine[newangle]);	if (P_Random()<15)		S_StartSound(actor, SFX_BAT_SCREAM);	// Handle Z movement	actor->z = actor->target->z + 2*FloatBobOffsets[actor->args[0]];	actor->args[0] = (actor->args[0]+3)&63;	}//===========================================================================//// A_TreeDeath////===========================================================================void A_TreeDeath(mobj_t *actor){	if(!(actor->flags2&MF2_FIREDAMAGE))	{		actor->height <<= 2;		actor->flags |= MF_SHOOTABLE;		actor->flags &= ~(MF_CORPSE+MF_DROPOFF);		actor->health = 35;		return;	}	else	{		P_SetMobjState(actor, actor->info->meleestate);	}}//===========================================================================//// A_NoGravity////===========================================================================void A_NoGravity(mobj_t *actor){	actor->flags |= MF_NOGRAVITY;}

⌨️ 快捷键说明

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