Code:
//! zinc
library LibraryAI requires TimerUtils{
real X;
real Y;
function getRandomMap(){
if (GetRandomInt(0,1)==0){
X=GetRandomReal(GetRectMinX(gg_rct_Map_1),GetRectMaxX(gg_rct_Map_1));
Y=GetRandomReal(GetRectMinY(gg_rct_Map_1),GetRectMaxY(gg_rct_Map_1));
}
else{
X=GetRandomReal(GetRectMinX(gg_rct_Map_2),GetRectMaxX(gg_rct_Map_2));
Y=GetRandomReal(GetRectMinY(gg_rct_Map_2),GetRectMaxY(gg_rct_Map_2));
}
}
struct CarryAI{
static constant integer IDLE=0;
static constant integer FLEE=1;
static constant integer ENGANGE=2;
static constant integer SUPPORT=3;
static constant integer AID=4;
static constant integer HEALING=5;
static constant integer ATTACK=6;
integer status;
unit hero;
hashtable table;
real Vsurrunder=0.3;
static method onLoop(){
CarryAI dat=GetTimerData(GetExpiredTimer());
if (dat.status==IDLE){
dat.status=ATTACK;
debug{
BJDebugMsg(GetPlayerName(GetOwningPlayer(dat.hero))+" is changing state to ATTACK");
}
}
if (dat.status==ATTACK){
if (GetUnitState(dat.hero,UNIT_STATE_LIFE)<GetUnitState(dat.hero,UNIT_STATE_MAX_LIFE)*dat.Vsurrunder){
IssueTargetOrder(dat.hero,"holybolt",dat.hero);
if (GetUnitCurrentOrder(dat.hero)!=OrderId("holybolt")){
dat.status=FLEE;
debug{
BJDebugMsg(GetPlayerName(GetOwningPlayer(dat.hero))+" is changing state to FLEE");
}
}
}
}
if (dat.status==HEALING){
if (GetUnitState(dat.hero,UNIT_STATE_LIFE)>GetUnitState(dat.hero,UNIT_STATE_MAX_LIFE)*0.85){
dat.status=ATTACK;
debug{
BJDebugMsg(GetPlayerName(GetOwningPlayer(dat.hero))+" is changing state to ATTACK");
}
}
}
if (dat.status==ATTACK){
getRandomMap();
if (GetUnitCurrentOrder(dat.hero)==0){
IssuePointOrder(dat.hero,"attack",X,Y);
}
}
else if(dat.status==FLEE){
if(RectContainsCoords(gg_rct_HEALING_GREEN,GetUnitX(dat.hero),GetUnitY(dat.hero))){
dat.status=HEALING;
debug{
BJDebugMsg(GetPlayerName(GetOwningPlayer(dat.hero))+" is changing state to HEALING");
}
}
else{
IssuePointOrder(dat.hero,"move",GetRandomReal(GetRectMinX(gg_rct_HEALING_GREEN),GetRectMaxX(gg_rct_HEALING_GREEN)),GetRandomReal(GetRectMinY(gg_rct_HEALING_GREEN),GetRectMaxY(gg_rct_HEALING_GREEN)));
}
}
}
static method create(unit u) -> thistype{
CarryAI dat=CarryAI.allocate();
timer time=NewTimer();
SetTimerData(time,integer(dat));
dat.table=InitHashtable();
TimerStart(time,.5,true, function CarryAI.onLoop);
dat.hero=u;
time=null;
return dat;
}
}
function onInit(){
trigger q=CreateTrigger();
unit w;
CarryAI dat;
w=CreateUnit(Player(1),'Hpal',GetStartLocationX(GetPlayerStartLocation(Player(1))),GetStartLocationY(GetPlayerStartLocation(Player(1))),0.1);
SelectHeroSkill(w,'AHhb');
dat=CarryAI.create(w);
q=null;
w=null;
}
}
//! endzinc
Share This Thread