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