亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? p_enemy.c

?? 魔法師傳奇源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
//**************************************************************************//**//** p_enemy.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: p_enemy.c,v $//** $Revision: 1.170 $//** $Date: 96/01/06 03:23:28 $//** $Author: bgokey $//**//**************************************************************************#include "h2def.h"#include "p_local.h"#include "soundst.h"// Macros// Types// Private Data// External Dataextern fixed_t FloatBobOffsets[64];//----------------------------------------------------------------------------//// PROC P_RecursiveSound////----------------------------------------------------------------------------mobj_t *soundtarget;void P_RecursiveSound(sector_t *sec, int soundblocks){	int i;	line_t *check;	sector_t *other;	// Wake up all monsters in this sector	if(sec->validcount == validcount && sec->soundtraversed <= soundblocks+1)	{ // Already flooded		return;	}	sec->validcount = validcount;	sec->soundtraversed = soundblocks+1;	sec->soundtarget = soundtarget;	for(i = 0; i < sec->linecount; i++)	{		check = sec->lines[i];		if(!(check->flags&ML_TWOSIDED))		{			continue;		}		P_LineOpening(check);		if(openrange <= 0)		{ // Closed door			continue;		}		if(sides[check->sidenum[0]].sector == sec)		{			other = sides[check->sidenum[1]].sector;		}		else		{			other = sides[check->sidenum[0]].sector;		}		if(check->flags&ML_SOUNDBLOCK)		{			if(!soundblocks)			{				P_RecursiveSound(other, 1);			}		}		else		{			P_RecursiveSound(other, soundblocks);		}	}}//----------------------------------------------------------------------------//// PROC P_NoiseAlert//// If a monster yells at a player, it will alert other monsters to the// player.////----------------------------------------------------------------------------void P_NoiseAlert(mobj_t *target, mobj_t *emmiter){	soundtarget = target;	validcount++;	P_RecursiveSound(emmiter->subsector->sector, 0);}//----------------------------------------------------------------------------//// FUNC P_CheckMeleeRange////----------------------------------------------------------------------------boolean P_CheckMeleeRange(mobj_t *actor){	mobj_t *mo;	fixed_t dist;	if(!actor->target)	{		return(false);	}	mo = actor->target;	dist = P_AproxDistance(mo->x-actor->x, mo->y-actor->y);	if(dist >= MELEERANGE)	{		return(false);	}	if(!P_CheckSight(actor, mo))	{		return(false);	}	if(mo->z > actor->z+actor->height)	{ // Target is higher than the attacker		return(false);	}	else if(actor->z > mo->z+mo->height)	{ // Attacker is higher		return(false);	}	return(true);}//----------------------------------------------------------------------------//// FUNC P_CheckMeleeRange2////----------------------------------------------------------------------------boolean P_CheckMeleeRange2(mobj_t *actor){	mobj_t *mo;	fixed_t dist;	if(!actor->target)	{		return(false);	}	mo = actor->target;	dist = P_AproxDistance(mo->x-actor->x, mo->y-actor->y);	if(dist >= MELEERANGE*2 || dist < MELEERANGE)	{		return(false);	}	if(!P_CheckSight(actor, mo))	{		return(false);	}	if(mo->z > actor->z+actor->height)	{ // Target is higher than the attacker		return(false);	}	else if(actor->z > mo->z+mo->height)	{ // Attacker is higher		return(false);	}	return(true);}//----------------------------------------------------------------------------//// FUNC P_CheckMissileRange////----------------------------------------------------------------------------boolean P_CheckMissileRange(mobj_t *actor){	fixed_t dist;	if(!P_CheckSight(actor, actor->target))	{		return(false);	}	if(actor->flags&MF_JUSTHIT)	{ // The target just hit the enemy, so fight back!		actor->flags &= ~MF_JUSTHIT;		return(true);	}	if(actor->reactiontime)	{ // Don't attack yet		return(false);	}	dist = (P_AproxDistance(actor->x-actor->target->x,		actor->y-actor->target->y)>>FRACBITS)-64;	if(!actor->info->meleestate)	{ // No melee attack, so fire more frequently		dist -= 128;	}	if(dist > 200)	{		dist = 200;	}	if(P_Random() < dist)	{		return(false);	}	return(true);}/*================== P_Move== Move in the current direction= returns false if the move is blocked================*/fixed_t xspeed[8] = {FRACUNIT,47000,0,-47000,-FRACUNIT,-47000,0,47000};fixed_t yspeed[8] = {0,47000,FRACUNIT,47000,0,-47000,-FRACUNIT,-47000};#define MAXSPECIALCROSS         8extern  line_t  *spechit[MAXSPECIALCROSS];extern  int                      numspechit;boolean P_Move(mobj_t *actor){	fixed_t tryx, tryy;	line_t *ld;	boolean good;	if(actor->flags2&MF2_BLASTED) return(true);	if(actor->movedir == DI_NODIR)	{		return(false);	}	tryx = actor->x+actor->info->speed*xspeed[actor->movedir];	tryy = actor->y+actor->info->speed*yspeed[actor->movedir];	if(!P_TryMove(actor, tryx, tryy))	{ // open any specials		if(actor->flags&MF_FLOAT && floatok)		{ // must adjust height			if(actor->z < tmfloorz)			{				actor->z += FLOATSPEED;			}			else			{				actor->z -= FLOATSPEED;			}			actor->flags |= MF_INFLOAT;			return(true);		}		if(!numspechit)		{			return false;		}		actor->movedir = DI_NODIR;		good = false;		while(numspechit--)		{			ld = spechit[numspechit];			// if the special isn't a door that can be opened, return false			if(P_ActivateLine(ld, actor, 0, SPAC_USE))			{				good = true;			}/* Old version before use/cross/impact specials were combined			if(P_UseSpecialLine(actor, ld))			{				good = true;			}*/		}		return(good);	}	else	{		actor->flags &= ~MF_INFLOAT;	}	if(!(actor->flags&MF_FLOAT))	{		if(actor->z > actor->floorz)		{			P_HitFloor(actor);		}		actor->z = actor->floorz;	}	return(true);}//----------------------------------------------------------------------------//// FUNC P_TryWalk//// Attempts to move actor in its current (ob->moveangle) direction.// If blocked by either a wall or an actor returns FALSE.// If move is either clear of block only by a door, returns TRUE and sets.// If a door is in the way, an OpenDoor call is made to start it opening.////----------------------------------------------------------------------------boolean P_TryWalk(mobj_t *actor){	if(!P_Move(actor))	{		return(false);	}	actor->movecount = P_Random()&15;	return(true);}/*================== P_NewChaseDir=================*/dirtype_t opposite[] ={DI_WEST, DI_SOUTHWEST, DI_SOUTH, DI_SOUTHEAST, DI_EAST, DI_NORTHEAST,DI_NORTH, DI_NORTHWEST, DI_NODIR};dirtype_t diags[] = {DI_NORTHWEST,DI_NORTHEAST,DI_SOUTHWEST,DI_SOUTHEAST};void P_NewChaseDir (mobj_t *actor){	fixed_t         deltax,deltay;	dirtype_t       d[3];	dirtype_t       tdir, olddir, turnaround;	if (!actor->target)		I_Error ("P_NewChaseDir: called with no target");	olddir = actor->movedir;	turnaround=opposite[olddir];	deltax = actor->target->x - actor->x;	deltay = actor->target->y - actor->y;	if (deltax>10*FRACUNIT)		d[1]= DI_EAST;	else if (deltax<-10*FRACUNIT)		d[1]= DI_WEST;	else		d[1]=DI_NODIR;	if (deltay<-10*FRACUNIT)		d[2]= DI_SOUTH;	else if (deltay>10*FRACUNIT)		d[2]= DI_NORTH;	else		d[2]=DI_NODIR;// try direct route	if (d[1] != DI_NODIR && d[2] != DI_NODIR)	{		actor->movedir = diags[((deltay<0)<<1)+(deltax>0)];		if (actor->movedir != turnaround && P_TryWalk(actor))			return;	}// try other directions	if (P_Random() > 200 ||  abs(deltay)>abs(deltax))	{		tdir=d[1];		d[1]=d[2];		d[2]=tdir;	}	if (d[1]==turnaround)		d[1]=DI_NODIR;	if (d[2]==turnaround)		d[2]=DI_NODIR;	if (d[1]!=DI_NODIR)	{		actor->movedir = d[1];		if (P_TryWalk(actor))			return;     /*either moved forward or attacked*/	}	if (d[2]!=DI_NODIR)	{		actor->movedir =d[2];		if (P_TryWalk(actor))			return;	}/* there is no direct path to the player, so pick another direction */	if (olddir!=DI_NODIR)	{		actor->movedir =olddir;		if (P_TryWalk(actor))			return;	}	if (P_Random()&1)       /*randomly determine direction of search*/	{		for (tdir=DI_EAST ; tdir<=DI_SOUTHEAST ; tdir++)		{			if (tdir!=turnaround)			{				actor->movedir =tdir;				if ( P_TryWalk(actor) )					return;			}		}	}	else	{		for (tdir=DI_SOUTHEAST ; tdir >= DI_EAST;tdir--)		{			if (tdir!=turnaround)			{				actor->movedir =tdir;				if ( P_TryWalk(actor) )				return;			}		}	}	if (turnaround !=  DI_NODIR)	{		actor->movedir =turnaround;		if ( P_TryWalk(actor) )			return;	}	actor->movedir = DI_NODIR;              // can't move}//---------------------------------------------------------------------------//// FUNC P_LookForMonsters////---------------------------------------------------------------------------#define MONS_LOOK_RANGE (16*64*FRACUNIT)#define MONS_LOOK_LIMIT 64boolean P_LookForMonsters(mobj_t *actor){	int count;	mobj_t *mo;	thinker_t *think;	if(!P_CheckSight(players[0].mo, actor))	{ // Player can't see monster		return(false);	}	count = 0;	for(think = thinkercap.next; think != &thinkercap; think = think->next)	{		if(think->function != P_MobjThinker)		{ // Not a mobj thinker			continue;		}		mo = (mobj_t *)think;		if(!(mo->flags&MF_COUNTKILL) || (mo == actor) || (mo->health <= 0))		{ // Not a valid monster			continue;		}		if(P_AproxDistance(actor->x-mo->x, actor->y-mo->y)			> MONS_LOOK_RANGE)		{ // Out of range			continue;		}		if(P_Random() < 16)		{ // Skip			continue;		}		if(count++ > MONS_LOOK_LIMIT)		{ // Stop searching			return(false);		}		if(!P_CheckSight(actor, mo))		{ // Out of sight			continue;		}		if (actor->type == MT_MINOTAUR)		{			if ((mo->type == MT_MINOTAUR) && 				 (mo->target != ((player_t *)actor->special1)->mo))			{				continue;			}		}		// Found a target monster		actor->target = mo;		return(true);	}	return(false);}/*================== P_LookForPlayers== If allaround is false, only look 180 degrees in front= returns true if a player is targeted================*/boolean P_LookForPlayers(mobj_t *actor, boolean allaround){	int c;	int stop;	player_t *player;	sector_t *sector;	angle_t an;	fixed_t dist;	if(!netgame && players[0].health <= 0)	{ // Single player game and player is dead, look for monsters		return(P_LookForMonsters(actor));	}	sector = actor->subsector->sector;	c = 0;	stop = (actor->lastlook-1)&3;	for( ; ; actor->lastlook = (actor->lastlook+1)&3 )	{		if (!playeringame[actor->lastlook])			continue;		if (c++ == 2 || actor->lastlook == stop)			return false;           // done looking		player = &players[actor->lastlook];		if (player->health <= 0)			continue;               // dead		if (!P_CheckSight (actor, player->mo))			continue;               // out of sight		if (!allaround)		{			an = R_PointToAngle2 (actor->x, actor->y,			player->mo->x, player->mo->y) - actor->angle;			if (an > ANG90 && an < ANG270)			{				dist = P_AproxDistance (player->mo->x - actor->x,					player->mo->y - actor->y);				// if real close, react anyway				if (dist > MELEERANGE)					continue;               // behind back			}		}		if(player->mo->flags&MF_SHADOW)		{ // Player is invisible			if((P_AproxDistance(player->mo->x-actor->x,				player->mo->y-actor->y) > 2*MELEERANGE)				&& P_AproxDistance(player->mo->momx, player->mo->momy)				< 5*FRACUNIT)			{ // Player is sneaking - can't detect				return(false);			}			if(P_Random() < 225)			{ // Player isn't sneaking, but still didn't detect				return(false);			}		}		if (actor->type == MT_MINOTAUR)		{			if(((player_t *)(actor->special1)) == player)			{				continue;			// Don't target master			}		}		actor->target = player->mo;		return(true);	}	return(false);}/*===============================================================================						ACTION ROUTINES===============================================================================*//*================ A_Look== Stay in state until a player is sighted===============*/void A_Look (mobj_t *actor){	mobj_t          *targ;	actor->threshold = 0;           // any shot will wake up	targ = actor->subsector->sector->soundtarget;	if (targ && (targ->flags & MF_SHOOTABLE) )	{		actor->target = targ;		if ( actor->flags & MF_AMBUSH )		{			if (P_CheckSight (actor, actor->target))				goto seeyou;		}		else			goto seeyou;	}	if (!P_LookForPlayers (actor, false) )		return;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2020日本不卡一区二区视频| 91美女在线看| 亚洲精品福利视频网站| 欧美一区二区三区免费观看视频| 国产乱人伦精品一区二区在线观看| 一区二区三区中文字幕精品精品| 欧美zozozo| 日本乱人伦aⅴ精品| 久久99精品一区二区三区| 中文字幕第一区二区| 678五月天丁香亚洲综合网| 不卡一卡二卡三乱码免费网站| 日本sm残虐另类| 亚洲已满18点击进入久久| 国产女主播一区| 国产亚洲欧美日韩日本| 日韩精品专区在线影院观看 | 91丨九色porny丨蝌蚪| 国产一区欧美日韩| 免费看欧美女人艹b| 日韩二区三区四区| 国产精品久久看| 久久蜜桃av一区精品变态类天堂| 欧美久久久久免费| 欧美色精品在线视频| 99视频超级精品| 成人性生交大片免费看中文| 国产999精品久久久久久绿帽| 激情综合网激情| 男女男精品视频网| 激情欧美一区二区| 久久99精品久久久久婷婷| 色噜噜偷拍精品综合在线| 午夜欧美一区二区三区在线播放| 樱花影视一区二区| 亚洲曰韩产成在线| 琪琪一区二区三区| 欧美一区二区人人喊爽| 日韩一区二区三区在线| 久久久久久免费网| 亚洲婷婷综合久久一本伊一区 | 91久久精品网| 在线成人午夜影院| 久久久久国产精品麻豆| 成人欧美一区二区三区1314 | 中文字幕电影一区| 亚洲精品欧美激情| 精品一区二区免费视频| 不卡一区二区在线| 欧美高清www午色夜在线视频| 精品国产乱码久久久久久久久| 国产精品另类一区| 午夜精品久久久久影视| 国产伦精品一区二区三区视频青涩 | 日本视频一区二区| 岛国一区二区在线观看| 欧美久久久久免费| 国产精品美女久久久久aⅴ| 五月婷婷久久丁香| 成人黄色在线视频| 香蕉成人伊视频在线观看| 成人影视亚洲图片在线| 精品久久久久久久久久久久久久久久久 | 国产精品视频在线看| 国产一区二区三区综合| 日韩精品一区国产麻豆| 久久精品国产99国产| 日韩欧美国产不卡| 国产在线日韩欧美| 国产日韩欧美精品综合| 成人高清免费观看| 亚洲乱码日产精品bd | 99re热这里只有精品免费视频| 国产精品久久久久久久久图文区 | 国产婷婷色一区二区三区四区 | 欧美日韩精品一区二区三区蜜桃| 国产精品久线在线观看| 日韩欧美你懂的| 亚洲尤物在线视频观看| 91丨九色丨黑人外教| 亚洲视频在线一区观看| 成人国产精品免费网站| 日本一区二区免费在线观看视频| 青青草国产成人99久久| 欧美一区二区三区免费大片| 日韩精品一二三四| 91精品国产欧美一区二区18| 亚洲电影视频在线| 欧美日韩激情在线| 蜜桃精品在线观看| 精品999久久久| 国产成人综合在线| 日本一二三四高清不卡| 99re这里只有精品6| 亚洲影视资源网| 日韩三级伦理片妻子的秘密按摩| 美女网站一区二区| 国产色婷婷亚洲99精品小说| 国产不卡免费视频| 亚洲精品国产品国语在线app| 欧美性xxxxx极品少妇| 日韩高清一区二区| 日韩三级中文字幕| 粉嫩高潮美女一区二区三区| 亚洲人成网站影音先锋播放| 欧美日韩一区高清| 精品一区二区三区免费播放| 国产精品毛片无遮挡高清| 久久一区二区三区国产精品| 久久综合视频网| 亚洲一区二区三区自拍| 91麻豆精品国产91久久久久| 午夜精品久久久久久久| 在线看国产一区| 国产三级欧美三级日产三级99| 国产一区欧美一区| 国产一区二区久久| 亚洲色图20p| 欧美mv日韩mv国产网站app| 成熟亚洲日本毛茸茸凸凹| 亚洲精品中文在线观看| 精品国产一区二区三区忘忧草| 成人国产免费视频| 麻豆91精品91久久久的内涵| 中文字幕日韩精品一区| 日韩欧美国产成人一区二区| 色噜噜狠狠成人中文综合| 极品美女销魂一区二区三区免费| 一区二区三区电影在线播| 久久蜜桃一区二区| 制服丝袜在线91| 欧美在线免费播放| 国产成人精品免费在线| 日韩精品电影一区亚洲| 一区二区三区欧美日韩| 国产午夜精品一区二区三区视频 | 色美美综合视频| 国产xxx精品视频大全| 毛片av中文字幕一区二区| 一片黄亚洲嫩模| 亚洲蜜臀av乱码久久精品蜜桃| 久久精品一区二区三区四区| 欧美电影免费观看高清完整版| 欧美日韩在线一区二区| 99久久综合99久久综合网站| 国产风韵犹存在线视精品| 精品一区二区日韩| 国内精品久久久久影院薰衣草| 青青草成人在线观看| 日本网站在线观看一区二区三区| 亚洲国产欧美日韩另类综合 | 欧美一卡二卡三卡四卡| 在线成人av影院| 日韩视频中午一区| 日韩欧美国产一区二区三区| 91精品国产麻豆| 欧美大黄免费观看| 亚洲精品一区二区三区影院| 久久一夜天堂av一区二区三区 | 麻豆精品视频在线| 久久99日本精品| 国产馆精品极品| av在线这里只有精品| 色婷婷精品久久二区二区蜜臂av| 色婷婷综合久久久久中文一区二区 | 亚洲在线中文字幕| 日韩av电影天堂| 国产一区二区三区精品视频| 粉嫩aⅴ一区二区三区四区| 91麻豆高清视频| 欧美精品一二三区| 玖玖九九国产精品| 国产精品自拍三区| 91色porny| 欧美电影免费观看完整版| 国产欧美日韩不卡| 亚洲综合免费观看高清在线观看| 秋霞国产午夜精品免费视频| 粉嫩绯色av一区二区在线观看| 在线观看不卡一区| 国产亚洲综合色| 亚洲曰韩产成在线| 国产成人综合在线观看| 在线日韩国产精品| 国产午夜一区二区三区| 亚洲成a人v欧美综合天堂| 国产大陆亚洲精品国产| 精品视频1区2区3区| 欧美高清在线一区| 裸体歌舞表演一区二区| 91麻豆123| 中文字幕在线播放不卡一区| 蜜臀久久99精品久久久久久9| 91视频在线观看免费| 久久综合九色欧美综合狠狠| 亚洲电影第三页| 91亚洲国产成人精品一区二三 | 老司机精品视频一区二区三区| 91麻豆国产精品久久| 国产日韩欧美综合在线|