📄 tai.cpp
字号:
/* [ 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 + -