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

📄 tai.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      ret.obey=XIUXI;
      ret.ID=myid;
      ret.pos.x=CBNULL;
      ret.pos.y=CBNULL;
      ret.pos.z=CBNULL;
      return (ret);
	}
	else
	{
		Pobject=MAP_GetUnit(id);
		if (Pobject->nIDAttackMe != MAP_DATA_NONE)
		{
			is=EYE_IfUnitIsInSight( myid,id);
			if (is == -1 )
			{
				ret.done=1;
				ret.obey=JIESHU;
				ret.ID=myid;
				ret.pos.x=CBNULL;
				ret.pos.y=CBNULL;
				ret.pos.z=CBNULL;
				return (ret);
			}
			else
			{
				ret.done=0;
				return (ret);
			}
		}
	}
	ret.done=0;
    ret.obey=QUXIAO;
    ret.ID=CBNULL;
    ret.pos.x=CBNULL;
    ret.pos.y=CBNULL;
    ret.pos.z=CBNULL;
    return (ret);
}

GOP AutoMode(WORD myid)
{  WORD id;
   GOP	ret;

   GetUnitStruct(&SFighter);
   SFighter.automode=1;
   id=GetAttackObject(myid,0);
   if (id == CBNULL)
   {  //ret.done=1;
      //ret.obey=JIESHU;
	  ret.done=0;
      ret.obey=QUXIAO;
      ret.ID=myid;
      ret.pos.x=CBNULL;
      ret.pos.y=CBNULL;
      ret.pos.z=CBNULL;
      return (ret);
   }
   else
   {  ret=FighterAttack(id);
      return (ret);
   }
   ret.done=0;
   ret.obey=QUXIAO;
   ret.ID=CBNULL;
   ret.pos.x=CBNULL;
   ret.pos.y=CBNULL;
   ret.pos.z=CBNULL;
   return (ret);
}

WORD ScanAttackPostion(struct UNIT_STRUCT * Puser)
{  if (Puser->nType == MAP_UNIT_TYPE_WORKER
     ||Puser->nType == MAP_UNIT_TYPE_MAN 
	 ||Puser->nType == MAP_UNIT_TYPE_WGEN)
      return 0;        

   if (Puser->nType == MAP_UNIT_TYPE_SOLDIER
	   ||Puser->nType == MAP_UNIT_TYPE_SHIP
	   ||Puser->nType == MAP_UNIT_TYPE_GEN
	   ||Puser->nType == MAP_UNIT_TYPE_SGEN
	   )
      return 1;

    return 2;
}


GOP ReceiveObey(struct UNIT_STRUCT * Puser)
{  GOP ret;
   BYTE objectid;
   CTRL_TASK obey;
   DWORD object;

   objectid=Puser->nType;
   obey=Puser->Status.nTaskID;
   object=Puser->Status.nTaskIDEx;
   switch(objectid)
   {  case MAP_UNIT_TYPE_WORKER:
		 GetUnitStruct(&SWorker);
		 
		 ret=WorkerAI();
		 //Puser->Status.nPos=SWorker.pos;
		 Puser->nPos=SWorker.pos;
         return (ret);
		 break;
      case MAP_UNIT_TYPE_MAN:
		 GetUnitStruct(&SMan);
		 ret=ManAI();
         return (ret);
		 Puser->nPos=SMan.pos;
		 break;

   };
   ret.done=0;
   ret.obey= QUXIAO;
   ret.ID=CBNULL;
   ret.pos.x=CBNULL;
   ret.pos.y=CBNULL;
   ret.pos.z=CBNULL;
   return (ret);
}

GOP TY_BnAi(struct UNIT_STRUCT * Puser)
{  GOP	p;
   //WORD i = 0;
   int nState=0;

   //Nov.25.1997, Liu Gang
/*   if (time_num < 10)//getrandom( 10,15 ))
   {   time_num++;
       p.done=0;
       return (p);
	   
   }
   time_num=0;
*/
   srand(time(NULL));
   // Liu Gang, Nov.8.1997
//   if (Puser->nType == 9)
//		   i++;
   ReceiveData(Puser);
   if (User.alive < 0)
   {  p.done=0;
      return (p);
   }
   if (ScanAttackPostion(Puser)== 1 )
   {   p=Damage();

	   if (User.Bobey == QUXIAO
		||User.Bobey == DUSE
		||User.Bobey == FANGYU		// Nov.24.1997, Liu Gang
		||User.Bobey == GONGJI		// Nov.24.1997, Liu Gang
		||Puser->Status.bDone == 1
		||Puser->Task.nTaskID == JIESHU)
       {
			// Nov.25.1997, Liu Gang
			if( p.obey == GONGJI )
			{
				   p.done=1;
				   p.obey=FANGYU;
				   p.ID=Puser->nID;
				   p.pos.x=CBNULL;
				   p.pos.y=CBNULL;
				   p.pos.z=CBNULL;
			}

			if (p.obey == QUXIAO
				||p.obey == JIESHU
				||p.obey == DUSE
				||p.obey == FANGYU
				||p.obey == MAIFU
				)
			{
				p=AutoMode(Puser->nID);
			}

	      if (p.obey == QUXIAO
			  || p.obey == FANGYU)
	        p=Help(Puser->nID);

		  // 转向
		  if (p.done == 0)
		  {
			  if (p.obey == QUXIAO
				  &&Puser->Status.nTaskID == QUXIAO
				  &&Puser->Task.nTaskID == QUXIAO
				  &&de > 10 )
				  //||p.obey == JIESHU))
				  //&&de > getrandom( 10,20 ))
			  {
				  de=0;
				  srand( (unsigned)time( NULL ) );
				  switch(getrandom( 1,2 ))
				  {
				  case 1:
					  nState = Puser->Draw.nState-Puser->Draw.nDir;
					  Puser->Draw.nDir-=1;
					  if (Puser->Draw.nDir >= 65535)
					  {
						  Puser->Draw.nDir=7;
					  }
					  // set state
					  Puser->Draw.nState=Puser->Draw.nDir+nState;
					  Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
					  break;
				  case 2:
					  nState = Puser->Draw.nState-Puser->Draw.nDir;
					  Puser->Draw.nDir+=1;
					  if (Puser->Draw.nDir > 7)
					  {
						  Puser->Draw.nDir=0;
					  }
					  // set state
					  Puser->Draw.nState=Puser->Draw.nDir+nState;
					  Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
					  break;
				  }
				  
			  }
			  de++;
		  }
       }
//       else
//       {
//	       if (User.Bobey == YIDONG
//			   &&Puser->Task.nTaskID == GONGJI
//			   &&Puser->Draw.nPlayer == GAME.nMe){}
//			  p=StopMode(Puser->nID,Puser->Task.nParam1);
//       }


   }
   else
   {  
	   if (ScanAttackPostion(Puser)== 0 )
       {
		   p=ReceiveObey(Puser);
		   if (p.done == 0)
		  {
			  srand( (unsigned)time( NULL ) );
			  if (p.obey == QUXIAO
				  &&Puser->Status.nTaskID == QUXIAO
				  &&de1 > getrandom( 20,30 ))
			  {
				  de1=0;
				  srand( (unsigned)time( NULL ) );
				  switch(getrandom( 1,2 ))
				  {
				  case 1:
					  nState = Puser->Draw.nState-Puser->Draw.nDir;
					  Puser->Draw.nDir-=1;
					  if (Puser->Draw.nDir >= 65535)
					  {
						  Puser->Draw.nDir=7;
					  }
					  // set state
					  Puser->Draw.nState=Puser->Draw.nDir+nState;
					  Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
					  break;
				  case 2:
					  nState = Puser->Draw.nState-Puser->Draw.nDir;
					  Puser->Draw.nDir+=1;
					  if (Puser->Draw.nDir > 7)
					  {
						  Puser->Draw.nDir=0;
					  }
					  // set state
					  Puser->Draw.nState=Puser->Draw.nDir+nState;
					  Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
					  break;
				  }
				  
			  }
			  de1++;
		  }
       }
		  
       else
       {
		   p.done=0;

	       return (p);
       }
   }
   if (p.done != 1)
   {
	   p.done=0;
	   return (p);
   }	   
   return (p);
}

void TY_InstanceAI_ForStruct(struct UNIT_STRUCT  * p)
{   TY_InstanceAI(p);
}

void TY_InstanceAI_ForID(WORD ID)
{  UNIT_STRUCT * Puser;
   Puser=MAP_GetUnit(ID);
   TY_InstanceAI(Puser);
}

WORD ScanLevelPostion(struct UNIT_STRUCT  * Puser)
{
	WORD scu=0;
	if (Puser->Status.bDone == 1)
		return (1);

//判级别
	if (Puser->Task.nLevel >= 5
		&& Puser->Task.nTaskID != FANGYU )// Nov.25.1997, Liu Gang
		return (0);

	if (Puser->nType == MAP_UNIT_TYPE_GEN
		&&GAME.Players[Puser->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER )
	{
		if (Puser->nIDAttackMe != MAP_DATA_NONE)
		{
			switch (getrandom( 0,60 ))
			{
			case 25:
				scu=GeneralJiMou(Puser,JIASU);
				break;
			case 30:
				scu=GeneralJiMou(Puser,JIANSU);
				break;
			case 33:
				scu=GeneralJiMou(Puser,HUNLUAN);
				break;
			case 7:
				scu=GeneralJiMou(Puser,JILI);
				break;
			}
			if (scu == 1)
				return (0);
		}
	}

	if (Puser->nType !=MAP_UNIT_TYPE_MAN
     &&Puser->nType !=MAP_UNIT_TYPE_WORKER
     &&Puser->nType !=MAP_UNIT_TYPE_SOLDIER
	 &&Puser->nType !=MAP_UNIT_TYPE_SHIP
	 &&Puser->nType !=MAP_UNIT_TYPE_GEN
	 &&Puser->nType !=MAP_UNIT_TYPE_SGEN
	 &&Puser->nType !=MAP_UNIT_TYPE_WGEN
      )
      return (0);
   if (Puser->Status.nTaskID != QUXIAO
     &&Puser->Status.nTaskID != YIDONG
     &&Puser->Status.nTaskID != GONGJI
     &&Puser->Status.nTaskID != YUNSONG
	 &&Puser->Status.nTaskID != HUISONG
	 &&Puser->Status.nTaskID != DUSE
	 &&Puser->Status.nTaskID != JIESHU
	 &&Puser->Status.nTaskID != HLUAN
	 &&Puser->Status.nTaskID != FANGYU	// Nov.25.1997, Liu Gang
      )
      return (0);
   /*
   if (Puser->nType == MAP_UNIT_TYPE_SOLDIER
	   ||Puser->nType == MAP_UNIT_TYPE_SHIP)
   {   if (Puser->Status.nTaskID == YIDONG
	 ||Puser->Status.nTaskID == GONGJI)
	  return (0);
   }
   */
   if (Puser->nType == MAP_UNIT_TYPE_SOLDIER
	   ||Puser->nType == MAP_UNIT_TYPE_SHIP
	   ||Puser->nType == MAP_UNIT_TYPE_GEN
	   ||Puser->nType == MAP_UNIT_TYPE_SGEN
	   ||Puser->nType == MAP_UNIT_TYPE_WGEN)
   {
	   if (Puser->Draw.nFile == 47)
		   return (0);
   /*
	   if (Puser->Task.nTaskID == GONGJI
		   &&Puser->Status.nTaskID == GONGJI)
		   return (0);
  */

   }
   if ( Puser->nType == MAP_UNIT_TYPE_GEN) 
   {
	   return (1);
   }

   if ( Puser->Status.nTaskID == GONGJI )
   {
		// Nov.25.1997, Liu Gang
	   // 没有人攻击我,则不进入策略
	   if( Puser->nIDAttackMe == MAP_DATA_NONE )
		   return 0;
	   //   我攻击的人就是攻击我的人
		if( Puser->nIDAttackMe == Puser->Status.nParam1 )
			return 0;

		// 我攻击的人是建筑,但不是箭楼,则回头攻击攻击我的人
	   UNIT_STRUCT *pU;
	   if( Puser->nIDAttackMe != MAP_DATA_NONE )
		pU = MAP_GetUnit( Puser->Status.nParam1 );
		if( pU!= NULL )
		{
			if( !EYE_IfUnitIsTower( pU ) 
				&& EYE_IfUnitIsBuild( pU ) )
				return 1;
			else
				return 0;
		}
		return (0);
   }

   return (1);
}
void IsBurned(struct UNIT_STRUCT  * Puser)
{
	struct CTRL_TASK_STRUCT Task;

	CTRL_TASK_Clear( &Task );
    Task.bDone=1;
    Task.nID=Puser->nID;
    Task.nTaskID=YIDONG;
    Task.nTaskIDEx=1;
    Task.nParam1=0;

   switch (getrandom(0,3))
   {
   case 0:
	   Task.nParam2=Puser->Draw.nX+getrandom( 0,4 );
	   Task.nParam3=Puser->Draw.nY+getrandom( 0,4 );
	   break;

   case 1:
	   Task.nParam2=Puser->Draw.nX+getrandom( 0,4 );
	   Task.nParam3=Puser->Draw.nY-getrandom( 0,4 );
	   break;

   case 2:
	   Task.nParam2=Puser->Draw.nX-getrandom( 0,4 );
	   Task.nParam3=Puser->Draw.nY+getrandom( 0,4 );
	   break;

   case 3:
	   Task.nParam2=Puser->Draw.nX-getrandom( 0,4 );
	   Task.nParam3=Puser->Draw.nY-getrandom( 0,4 );
	   break;

   }
   if (Task.nParam2 >= MAP_Lib.szNum.cx-10)
   {
	   Task.nParam2=Puser->Draw.nX-getrandom( 0,4 ); 
   }
   if (Task.nParam3 >= MAP_Lib.szNum.cy-10)
   {
	   Task.nParam3=Puser->Draw.nY-getrandom( 0,4 ); 
   }
   if (Task.nParam2 <= 10)
   {
	   Task.nParam2=Puser->Draw.nX+getrandom( 0,4 ); 
   }
   if (Task.nParam3 <= 10)
   {
	   Task.nParam3=Puser->Draw.nY+getrandom( 0,4 ); 
   }
   CTRL_TASK_DeployByComputer(Puser->Draw.nPlayer,&Task);

}

void TY_InstanceAI(struct UNIT_STRUCT  * Puser)
{  GOP Obey;

   if (time_num < 10)//getrandom( 10,15 ))
   {
		time_num++;
		return;
   }
   time_num=0;

   int nState=0;
   struct CTRL_TASK_STRUCT Task;
   CTRL_TASK_Clear( &Task );

   switch (ScanLevelPostion(Puser))
   { case 0:
	   return;
	   break;
     case 1:
		 //被火烧
	   if (Puser->nType != MAP_UNIT_TYPE_BUILDING
		   &&EYE_IfBurned(Puser->Draw.nX,Puser->Draw.nY)
		   &&Puser->nBloodPos == 1)
	   {
		   IsBurned(Puser);
		   Puser->nBloodPos=0;
		   Obey.done=0; 
	   }
	   else
	   {
		   //被混乱
		   if (CTRL_GetSTG( &Puser->Draw, HUNLUAN)
			   &&Puser->Draw.ptOff.x ==0
			   &&Puser->Draw.ptOff.y ==0)
		   {
			   srand( (unsigned)time( NULL ) );
			   switch (getrandom( 0,6 ))
			   {
			   case 0:
			   case 4:
				   nState = Puser->Draw.nState-Puser->Draw.nDir;
				   Puser->Draw.nDir-=1;
				   if (Puser->Draw.nDir >= 65535)
				   {
					   Puser->Draw.nDir=7;
				   }
				   // set state
				   Puser->Draw.nState=Puser->Draw.nDir+nState;
				   Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
				   break;
			   case 1:
			   case 6:
				   nState = Puser->Draw.nState-Puser->Draw.nDir;
				   Puser->Draw.nDir-=1;
				   if (Puser->Draw.nDir >= 65535)
				   {
					   Puser->Draw.nDir=7;
				   }
				   // set state
				   Puser->Draw.nState=Puser->Draw.nDir+nState;
				   Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
				   break;
			   case 2:
			   case 5:
				   nState = Puser->Draw.nState-Puser->Draw.nDir;
				   Puser->Draw.nDir+=1;
				   if (Puser->Draw.nDir > 7)
				   {
					   Puser->Draw.nDir=0;
				   }
				   // set state
				   Puser->Draw.nState=Puser->Draw.nDir+nState;
				   Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
				   break;

			   case 3:
				   nState = Puser->Draw.nState-Puser->Draw.nDir;
				   Puser->Draw.nDir+=1;
				   if (Puser->Draw.nDir > 7)
				   {
					   Puser->Draw.nDir=0;
				   }
				   // set state
				   Puser->Draw.nState=Puser->Draw.nDir+nState;
				   Puser->Draw.nCol=MAP_Lib.AniSeq[Puser->Draw.nFile].nAniSeq[Puser->Draw.nState][Puser->Draw.nFrame]+MAP_Lib.AniSeq[Puser->Draw.nFile].nOffset;
				   break;
			   }

			   Obey.done=0; 
			   Assert(Puser->Draw.ptOff.x == 0);
			   Assert(Puser->Draw.ptOff.y == 0);
		   }
		   else
		   {
			   Obey=TY_BnAi(Puser);
			   //无任务	
			   if (Obey.done == 0)
			   {
				   if ((Puser->nType == MAP_UNIT_TYPE_GEN
					   ||Puser->nType == MAP_UNIT_TYPE_WGEN
					   ||Puser->nType == MAP_UNIT_TYPE_SGEN)
					   &&Puser->Draw.nPlayer != GAME.nMe)
				   {
#ifdef TY1_JIMOU 

					 switch(getrandom( 0,10))
					 {
					 case 8:
						 GeneralJiMou(Puser,YUANSHI);
						 break;
					 case 9:
						 GeneralJiMou(Puser,HUIFU);
						 break;
					 case 10:
						 GeneralJiMou(Puser,JILI);
						 break;
					 }
#endif
				   }
			   }
		   }
	   }
//when obey is no using done is 0.

	  if (Obey.done == 0)
	    return;
	  else
	  {  Task.nID=Puser->nID;
//?
	     Task.nLevel=0;
	     Task.nTaskID=Obey.obey;
	     Task.bDone=1;
	     switch(Puser->nType)
	     {
		 case  MAP_UNIT_TYPE_SOLDIER:
		 case  MAP_UNIT_TYPE_SHIP:
		 case  MAP_UNIT_TYPE_GEN:
		 case  MAP_UNIT_TYPE_SGEN:
			        if (Puser->Draw.nFile == 47)
					{
						Task.bDone=0;
					}
					else
					{
						Task.nTaskIDEx=2;
						Assert(Obey.ID != 0);
						if (Obey.ID != CBNULL
						 && Obey.ID != MAP_DATA_NONE)
						  Task.nParam1=Obey.ID;
						else
						  Task.bDone=0;
					}
				    
				    break;
		case  MAP_UNIT_TYPE_WORKER:
		case  MAP_UNIT_TYPE_MAN:
		case  MAP_UNIT_TYPE_WGEN:
				    Task.nTaskIDEx=1;
				    if (Obey.pos.x != CBNULL)
				      Task.nParam2=Obey.pos.x;
				    else
				      Task.bDone=0;
				    if (Obey.pos.y != CBNULL)
				      Task.nParam3=Obey.pos.y;
				    else
				      Task.bDone=0;
				    break;
	     }
	     if (Task.bDone == 1)
			{
				CTRL_TASK_DeployByComputer(Puser->Draw.nPlayer,&Task);
			}
	  }
	  break;
   }
}


⌨️ 快捷键说明

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