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

📄 tai.cpp

📁 赤壁之战(游戏原码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*	      [ AI.C ]
 *    AI.C FOR INSTINCE MODULE .
 *    Chbi Fight interface module.
 *    Programmed By Y.Tian. No#Eye. WayAhead. Co. 1997.
 *    Data 2/21/1997.
 */

#include "stdafx.h"
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include "tbnbase.h"
#include "tgeneral.h"
#include "cbprompt.h"
#include "CBMini.h"	// MINI_SetBlink()

WORD BloodPos=0;

// defined in CBRunOT.cpp
// 受伤音效
// nX, nY	:	位置
// nFile	:	单元文件号
extern void RUN_SOUND_Wounded( int nX, int nY, int nFile );

// defined in CBRunOT.cpp
// 用于音效,每隔一定时间该开关打开,当屏幕以外的我方单元(部队/建筑)
// 受到攻击时,由画外音提醒游戏者We are under attack!
// nX, nY	:	被攻击单元位置坐标
// nFile	:	被攻击单元文件号
extern void RUN_SOUND_UnderAttack( int nX, int nY, int nFile );


#define UNITNUMBER  16

//#define TY1_JIMOU 
#ifdef TNDEBUG

#include <i86.h>
#include <stdio.h>
#include <conio.h>
#include <graph.h>
#include <stdlib.h>
#include <string.h>

#endif

#include "tai.h"

#include "cbeyes.h"
#include "cbmap.h"
#include "cbctrl.h"
#include "Assert.h"

//--- Define Struct.
S_INSTINCE_BASE SWorker;
S_INSTINCE_BASE User;
S_INSTINCE_BASE SMan;
S_INSTINCE_BASE SFighter;

GOP Gop;

#ifdef TNDEBUG

UNIT_STRUCT Te;
CTRL_TASK TASK;
WORD OBJECTX;
WORD OBJECTY;
WORD OBJECTID;
WORD ATTACKID;

#endif

WORD Trx;
WORD Try;

//--- Define Function For Main Module.

extern  GOP TY_BnAi(struct UNIT_STRUCT Puser);


WORD ScanAttackPostion(struct UNIT_STRUCT * Puser);
WORD ScanLevelPostion(struct UNIT_STRUCT  * Puser);
void  GetUnitStruct(S_INSTINCE_BASE * p);
short GetHelpObject(WORD id);	     //who attack my fried and my building?
void  ReceiveData();

//mid mean : master ID.
//oid mean : object ID.
//GOP   ReceiveObey(short mid,short oid);
GOP   ReceiveObey(struct UNIT_STRUCT * Puser);
//obey mean : task.
//oid mean : object ID.
GOP   Damage();
GOP   AutoMode(WORD myid);
GOP   Help(WORD myid);

//--- Define Function For Worker Module.

GOP  WorkerAI();
GOP WorkerDamage();

//--- Define Function For Man Module.

GOP ManAI();
GOP ManDamage();

//--- Define Function For Fighter Module.

extern short GetObjectID();
extern GOP FighterAI(short ID);
extern GOP FighterAttack(WORD OID);  //ID mean:obeject's id.

DWORD time1 = 0; 
DWORD Time = 0;
int time_num=0;
int de=0;
int de1=0;
// 初始化函数
void InstancePosClear()
{
	time1 = 0;
	Time = 0;
	time_num=0;
	de=0;
	de1=0;
}

/*
 *  worker AI start.  *
 */

GOP WorkerAI()
{  GOP ret;

//which pos mean arrive ?
//what clean damage ?
   if (SWorker.damage == 1)
   {   ret=WorkerDamage();
       return (ret);
   }
   else
   {  SWorker.pos=0;
	  ret.done=0;
      ret.obey=SWorker.Bobey;
      SWorker.answer=SWorker.Bobey;
      return (ret);
   }
   ret.done=0;
   ret.obey=QUXIAO;
   ret.pos.x=CBNULL;
   ret.pos.y=CBNULL;
   ret.pos.z=CBNULL;
   ret.ID=CBNULL;
   return (ret);
}
GOP  WorkerDamage()
{  //int p;
   GOP  ret;
   if (SWorker.pos == 1)
   {   ret.done=0;
	   return (ret);
   }
   SWorker.answer= YIDONG;
   SWorker.Bobey=SWorker.answer;
   ret.done=1;
   ret.obey=SWorker.answer;
//?
   ret.ID=CBNULL;

   //ret.pos.x=SWorker.X+(WORD)getrandom( 1,9 );
   //ret.pos.y=SWorker.Y+(WORD)getrandom( 1,9 );
   ret.pos.x=SWorker.X+3;
   ret.pos.y=SWorker.Y+3;
   if (ret.pos.x > MAP_Lib.szNum.cx)
	 ret.pos.x=ret.pos.x-(ret.pos.x-MAP_Lib.szNum.cx)-6;

   if (ret.pos.y > MAP_Lib.szNum.cy)
	 ret.pos.y=ret.pos.y-(ret.pos.y-MAP_Lib.szNum.cy)-6;
   SWorker.pos=1;
   return (ret);
}

/*
 *  worker AI end.    *
 */

/*
 *  man AI start.     *
 */

GOP ManAI()
{  GOP ret;
   WORD delay=0;

   if (SMan.damage == 1)
   {   ret=ManDamage();
       return (ret);
   }
   else
   {
	   if (SMan.Bobey == QUXIAO)
	   {
		   SMan.answer= YIDONG;
		   SMan.Bobey=SMan.answer;
		   ret.done=1;
		   ret.obey=SMan.answer;
		   ret.ID=CBNULL;

		   srand( (unsigned)time( NULL ) );

		   //delay=getrandom( 1,10 );
		   //delay=getrandom( 1,10 );
		   delay=10;
		   

		   if (delay <7
			   ||time1 <3)
		   {
			   time1++;
			  SMan.pos=0;
			  ret.done=0;
			  ret.obey=SMan.Bobey;
			  SMan.answer=SMan.Bobey;
			  return (ret);
		   }

		   time1=0;
		   delay=getrandom( 1,10 );
		   if (delay >5)
		   {
			   if (delay <7)
			   {
				   ret.pos.x=SMan.X+(WORD)getrandom( 0,2 );
			       ret.pos.y=SMan.Y+(WORD)getrandom( 0,3 );
			   }
			   else
			   {
				   ret.pos.x=SMan.X-(WORD)getrandom( 0,4 );
			       ret.pos.y=SMan.Y+(WORD)getrandom( 0,2 );
			   }
			   
		   }
		   else
		   {
			   if (delay >2)
			   {
				   ret.pos.x=SMan.X-(WORD)getrandom( 0,3 );
				   ret.pos.y=SMan.Y-(WORD)getrandom( 0,2 );
			   }
			   else
			   {
				   ret.pos.x=SMan.X+(WORD)getrandom( 0,2 );
			       ret.pos.y=SMan.Y-(WORD)getrandom( 0,5 );
			   }
			   
		   }
		   if (ret.pos.x < 10)
			   ret.pos.x=10;

		   if (ret.pos.y < 10)
			   ret.pos.y=10;

		   if (ret.pos.x > MAP_Lib.szNum.cx)
			 ret.pos.x=ret.pos.x-(ret.pos.x-MAP_Lib.szNum.cx)-10;

		   if (ret.pos.y > MAP_Lib.szNum.cy)
			 ret.pos.y=ret.pos.y-(ret.pos.y-MAP_Lib.szNum.cy)-10;
		//?  
		   SMan.pos=1;
		   return (ret);
	   }
	   else
	   {
	      SMan.pos=0;
		  ret.done=0;
		  ret.obey=SMan.Bobey;
		  SMan.answer=SMan.Bobey;
		  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 ManDamage()
{  GOP ret;
   
   if (SMan.pos == 1)
   {  ret.done=0;
      return (ret);
   }
   SMan.answer= YIDONG;
   SMan.Bobey=SMan.answer;
   ret.done=1;
   ret.obey=SMan.answer;
//?
   ret.ID=CBNULL;
   ret.pos.x=SMan.X+(WORD)getrandom( 0,6 );
   ret.pos.y=SMan.Y+(WORD)getrandom( 0,6 );

   if (ret.pos.x > MAP_Lib.szNum.cx)
	 ret.pos.x=ret.pos.x-(ret.pos.x-MAP_Lib.szNum.cx)-10;

   if (ret.pos.y > MAP_Lib.szNum.cy)
	 ret.pos.y=ret.pos.y-(ret.pos.y-MAP_Lib.szNum.cy)-10;
//?  
   SMan.pos=1;
   return (ret);
}

/*
 *  man AI end.       *
 */

/*
 *  finhter AI start. *
 */

short GetObjectID()
{  return (SFighter.target);
}

GOP FighterAI(short ID)
{  GOP ret;
   ret.done=0;
   ret.obey=SFighter.Bobey;
   SFighter.answer=SFighter.Bobey;
   ret.ID=CBNULL;
   ret.pos.x=CBNULL;
   ret.pos.y=CBNULL;
   ret.pos.z=CBNULL;
   return (ret);
}

GOP FighterAttack(WORD OID)
{  GOP ret;

   SFighter.answer=GONGJI;
   ret.done=1;
   ret.obey=SFighter.answer;
   ret.ID=OID;
   ret.pos.x=CBNULL;
   ret.pos.y=CBNULL;
   ret.pos.z=CBNULL;
   return (ret);
}

/*
 *  finhter AI end.   *
 */

void ReceiveData(struct UNIT_STRUCT * P_user )
{  //** get p->nID's struct turn to my struct.
	UNIT_STRUCT * Pobject;
	UNIT_STRUCT * Pobject1;

     User.alive=P_user->nLife;
     User.attrib=P_user->nType;
     User.Bobey=P_user->Status.nTaskID;
     User.target=P_user->nIDAttackMe;
	 User.pos=P_user->nPos;	 
	 User.finish=0;
     //User.pos=P_user->Status.pos;

//?
     if (P_user->nIDAttackMe != MAP_DATA_NONE)
		//&& Time >19)
	 {
		 Time=0;
		 User.damage=0;
 		 Pobject=MAP_GetUnit(P_user->nIDAttackMe);
		 Pobject1=MAP_GetUnit(P_user->nID);

		 if (Pobject->Draw.nPlayer == Pobject1->Draw.nPlayer)
			User.damage=0;
		 else
			User.damage=1;

	 }
     else
	 {
		 User.damage=0;
		 Time++;

	 }
	 User.X=P_user->Draw.nX;
     User.Y=P_user->Draw.nY;
     User.Z=P_user->Status.nParam1;
}


//turn any pos to my sturct.

void GetUnitStruct(S_INSTINCE_BASE * p)
{   p->alive=User.alive;
    p->Bobey=User.Bobey;
    p->answer=User.answer;
    p->damage=User.damage;
    p->finish=User.finish;
    p->target=User.target;
    p->X=User.X;
    p->Y=User.Y;
    p->Z=User.Z;
	p->pos=User.pos;

}

GOP Damage()
{  GOP ret;
   WORD id;
   GetUnitStruct(&SFighter);

   if (User.damage == 1)
   {   
       id=GetObjectID();
       ret=FighterAttack(id);
       return (ret);
   }

   if (SFighter.Bobey  != QUXIAO
	   &&SFighter.Bobey  != DUSE
	   &&SFighter.Bobey  != FANGYU 
	   &&SFighter.Bobey  != MAIFU
	   &&SFighter.Bobey  != GONGJI )// Nov.25.1997
   {
	   ret.done=0;
	   ret.obey=XIEZAI;
	   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 Help(WORD myid)
{  GOP ret;
   WORD id;
   GetUnitStruct(&SFighter);
   id=GetHelpObject(myid);
   if (id == CBNULL)
   {  ret.done=0;
      ret.obey=QUXIAO;
      ret.ID=CBNULL;
      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);
}

short GetHelpObject(WORD id)
{  //WORD * p;
   WORD  p[UNITNUMBER];
   int	 pnum[1];
   UNIT_STRUCT * Pobject;
   UNIT_STRUCT * Pobject1;

   WORD Rid;
   short i;
   short objectnum=0;

   pnum[0]=(int) UNITNUMBER ;
   EYE_GetUnitInSight( 1,id,p,pnum);
   objectnum=pnum[0];
   for (i=0;i<objectnum;i++)
   {  //Rid= * p;
	  Rid=  p[i];
      Pobject=MAP_GetUnit(Rid);
//?
      if (Pobject->nIDAttackMe != MAP_DATA_NONE)
      {  switch(Pobject->nType)
	     {  case  MAP_UNIT_TYPE_BUILDING:
					Rid=Pobject->nIDAttackMe;
					return (Rid);
					break;
	     }	
      }
   }

   objectnum=0;
   Pobject=MAP_GetUnit(id);
   if (Pobject->Soldier.nGenID == MAP_DATA_NONE)
   {  Rid=CBNULL;
      return (Rid);
   }
   Pobject1=MAP_GetUnit(Pobject->Soldier.nGenID);
   for (i=0;i<GENERAL_TROOP_MAX;i++)
   { if (Pobject1->Gen.wTroop[i] != MAP_DATA_NONE)
     {	objectnum++;
     }
   }
   pnum[0]=objectnum;

   EYE_GetUnitInGroup( 1,id,p,pnum);
   objectnum=pnum[0];
   for (i=0;i<objectnum;i++)
   {  //Rid=* p;
	  Rid= p[i];
      Pobject=MAP_GetUnit(Rid);
      if (Pobject->nIDAttackMe != MAP_DATA_NONE)
      {  switch(Pobject->nType)
	     {  case  MAP_UNIT_TYPE_SOLDIER:
			case  MAP_UNIT_TYPE_GEN:

					Rid=Pobject->nIDAttackMe;
					return (Rid);
					break;
	    }
      }
   }
   Rid=CBNULL;
   return (Rid);
}

short GetAttackObject(WORD id,WORD pos)
{  WORD Rid;
   short i;
   int	Tbacknum;

   WORD  Penemy[UNITNUMBER];
   int   Unum[UNITNUMBER];
   UNIT_STRUCT * Pobject;
   UNIT_STRUCT * Pobject1;
   WORD Level[UNITNUMBER][2];

   
   for (i=0;i<UNITNUMBER;i++)
   {
	   Level[i][1]=CBNULL;
   }
   
	   
   Unum[0]=UNITNUMBER;
   EYE_GetUnitInSight(2,id,Penemy,Unum);
   Tbacknum =  Unum[0];
   for (i=0;i<Tbacknum;i++)
   {  //Rid = * Penemy;
	  Rid =  Penemy[i];
      Pobject=MAP_GetUnit(Rid);       
	  if (Pobject->nType == MAP_UNIT_TYPE_SOLDIER
		  ||Pobject->nType == MAP_UNIT_TYPE_SHIP
		  ||Pobject->nType == MAP_UNIT_TYPE_BUILDING
		  ||Pobject->nType == MAP_UNIT_TYPE_GEN
		  ||Pobject->nType == MAP_UNIT_TYPE_WGEN
		  ||Pobject->nType == MAP_UNIT_TYPE_SGEN
		  ||Pobject->nType == MAP_UNIT_TYPE_SHIPYARD
		  ||Pobject->nType == MAP_UNIT_TYPE_WORKER
		  ||Pobject->nType == MAP_UNIT_TYPE_FLAG)
		  
      {  
		 Pobject1=MAP_GetUnit(id);       
		 if (GAME.Players[Pobject->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER
			 &&GAME.Players[Pobject1->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER)
		 {
			 break;
		 }
		 else
		 {
			 Assert(Pobject->Draw.nPlayer != Pobject1->Draw.nPlayer);
			 Level[i][0]=0;
			 Level[i][1]=Rid;
		 }
         
      }
      else
      {  if (Pobject->nType != MAP_UNIT_TYPE_RESOURCE)
	     {
		    Pobject1=MAP_GetUnit(id);       
		    if (GAME.Players[Pobject->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER 
		      &&GAME.Players[Pobject1->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER )
			{
				break;
			}
			else
			{
				Level[i][0]=1;
				Level[i][1]=Rid;
			}
	     }
      }
   }
   for (i=0;i<Tbacknum;i++)
   {  if (Level[i][0] == 0 
        &&Level[i][1]  != 0)
      {  //free (Penemy);

	     Pobject=MAP_GetUnit(Level[i][0]);       
		 Pobject1=MAP_GetUnit(id);       
		 if (GAME.Players[Pobject->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER 
		    &&GAME.Players[Pobject1->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER )
		 {
			 return (CBNULL);
		 }
	     return (Level[i][1]);
      }
      else
     	 return (CBNULL);

   }
   if (Tbacknum != 0 )
   {   //free (Penemy);
	   Pobject1=MAP_GetUnit(Level[0][1]);
       Pobject1=MAP_GetUnit(id);       
	   if (GAME.Players[Pobject->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER 
		&&GAME.Players[Pobject1->Draw.nPlayer].nType == PLAYER_TYPE_COMPUTER )
	   {
		 return (CBNULL);
	   }
	   return (Level[0][1]);
   }
	   
   return (CBNULL);
}

GOP StopMode(WORD myid,WORD id)
{
	UNIT_STRUCT * Pobject;
	GOP	ret;
	WORD is;

	if (id == CBNULL)
	{
	  ret.done=0;

⌨️ 快捷键说明

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